feat(workspace): configure Skills and MCP per workspace - #317
Conversation
There was a problem hiding this comment.
Pull request overview
This PR introduces reusable Skills preset support across the desktop GUI and Gateway WebUI, so conversations and Cron Prompt tasks persist only a preset ID (plus a per-run disable flag) and resolve the latest preset contents at runtime—reducing unnecessary skill description exposure.
Changes:
- Adds a preset-based Skills data model (migration from legacy
skills.selectedintoDefault, deterministic normalization, missing-preset fallback). - Updates GUI/WebUI UX for Skills Hub, chat composer, and Cron Prompt tasks to select a preset or disable Skills per conversation/task.
- Extends Gateway protocol + adapters and persists per-conversation skills metadata in history (including runtime inheritance for subagents).
Reviewed changes
Copilot reviewed 60 out of 61 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| crates/agent-gui/test/subagents/harness.mjs | Passes resolved skillsPrompt into subagent harness runtime. |
| crates/agent-gui/test/subagents/agent-tool.test.mjs | Verifies subagents inherit parent resolved Skills prompt snapshot. |
| crates/agent-gui/test/settings/normalization.test.mjs | Adds tests for preset normalization, migration, fallback, and cleanup. |
| crates/agent-gui/test/settings/automation-prompt-runner.test.mjs | Ensures Cron preset selectors display names (not internal IDs). |
| crates/agent-gui/test/chat/conversation-state.test.mjs | Updates conversation schema to v4 and tests per-conversation skills metadata retention. |
| crates/agent-gui/test/chat/chat-turn-queue.test.mjs | Ensures queued gateway turns preserve per-request preset/disable overrides. |
| crates/agent-gui/src/pages/skills-hub/SkillsHubPage.tsx | Adds preset CRUD + member selection UI and routes selections through presets. |
| crates/agent-gui/src/pages/settings/CronTaskModal.tsx | Adds preset selection + “disable Skills” toggle for prompt Cron tasks. |
| crates/agent-gui/src/pages/settings/CronSection.tsx | Wires presets into Cron modal props. |
| crates/agent-gui/src/pages/ChatPage.tsx | Uses effective skill selection per conversation; persists per-conversation skills changes. |
| crates/agent-gui/src/pages/chat/turns/runAgentConversationTurn.ts | Threads skillsPrompt into subagent runtime configuration. |
| crates/agent-gui/src/pages/chat/runtime/useSendChatTurn.ts | Resolves effective preset/disable flags per request and snapshots into prompts/tools. |
| crates/agent-gui/src/pages/chat/queue/useChatTurnQueue.ts | Propagates queued gateway preset/disable overrides into send overrides. |
| crates/agent-gui/src/pages/chat/queue/chatTurnQueue.ts | Extends queued gateway request type with preset/disable fields. |
| crates/agent-gui/src/pages/chat/hooks/useChatSkills.ts | Reconciles installed skills against all presets (removes missing skills). |
| crates/agent-gui/src/pages/chat/history/useConversationHistoryActions.ts | Loads per-conversation preset/disable metadata from history records. |
| crates/agent-gui/src/pages/chat/gateway/useGatewayBridgeListeners.ts | Applies gateway-requested preset/disable overrides when sending chat turns. |
| crates/agent-gui/src/pages/chat/gateway/gatewayBridgeTypes.ts | Extends gateway bridge types to carry preset/disable overrides. |
| crates/agent-gui/src/pages/chat/components/ChatComposerBar.tsx | Adds composer control to select preset or disable Skills for the conversation. |
| crates/agent-gui/src/lib/tools/builtinRegistry.ts | Passes skillsPrompt into subagent tool registry; removes forced skillsEnabled: false. |
| crates/agent-gui/src/lib/subagents/run.ts | Appends resolved skillsPrompt into subagent system prompt and context creation. |
| crates/agent-gui/src/lib/subagents/agentTool.ts | Adds skillsPrompt to subagent runtime config plumbing. |
| crates/agent-gui/src/lib/settings/index.ts | Introduces preset model, normalization, resolution helpers, and preset-aware updates. |
| crates/agent-gui/src/lib/chat/history/chatHistory.ts | Persists and parses skillPresetId/skillsDisabled in chat history meta (schema v4). |
| crates/agent-gui/src/lib/chat/conversation/conversationState.ts | Bumps stored meta schema to v4; includes preset/disable fields through transforms. |
| crates/agent-gui/src/lib/automation/types.ts | Adds preset/disable fields to Cron task + prompt run request types. |
| crates/agent-gui/src/i18n/config.ts | Adds i18n strings for preset selection and per-conversation/task disable labels. |
| crates/agent-gui/src/components/cron/CronPromptRunner.tsx | Builds Cron skills context using effective preset/disable selection. |
| crates/agent-gui/src-tauri/src/services/gateway/types.rs | Adds preset/disable fields to gateway chat request event struct. |
| crates/agent-gui/src-tauri/src/services/gateway/tests.rs | Updates gateway chat request test fixtures for new fields. |
| crates/agent-gui/src-tauri/src/services/gateway/envelope_handler.rs | Adds handler arm for history.skills request/response passthrough + sync publish. |
| crates/agent-gui/src-tauri/src/services/gateway/chat.rs | Wires new preset/disable fields through chat request conversion. |
| crates/agent-gui/src-tauri/src/services/gateway_bridge.rs | Adds history skills config extraction + history.skills handler. |
| crates/agent-gui/src-tauri/src/services/automation/validate.rs | Validates/preserves Cron skillPresetId and skillsDisabled fields (defaulting). |
| crates/agent-gui/src-tauri/src/services/automation/types.rs | Adds preset/disable fields and defaults to Cron task + prompt run request structs. |
| crates/agent-gui/src-tauri/src/services/automation/store.rs | Includes preset/disable fields in serialized prompt run request payload. |
| crates/agent-gui/src-tauri/src/services/automation/db.rs | Persists preset/disable fields in Cron task config JSON and row parsing. |
| crates/agent-gui/src-tauri/src/lib.rs | Registers new tauri command chat_history_set_skills. |
| crates/agent-gui/src-tauri/src/commands/history/chat_history/tests.rs | Adds tests for skills metadata patching and schema v4 expectations. |
| crates/agent-gui/src-tauri/src/commands/history/chat_history/segments.rs | Implements DB update for per-conversation preset/disable metadata (no updated_at bump). |
| crates/agent-gui/src-tauri/src/commands/history/chat_history/commands.rs | Adds tauri command + gateway sync publish for history skills updates. |
| crates/agent-gateway/web/test/gateway-v2-adapters.test.mjs | Tests new history.skills envelope encoding and chat command field mapping. |
| crates/agent-gateway/web/test/conversation-skills-state.test.mjs | Tests client-side “dirty override” state machine for skills selections. |
| crates/agent-gateway/web/src/pages/skills-hub/SkillsHubPage.tsx | Mirrors GUI preset management UI and preset-aware skill selection behavior. |
| crates/agent-gateway/web/src/pages/settings/CronTaskModal.tsx | Mirrors GUI Cron preset selection + disable toggle. |
| crates/agent-gateway/web/src/pages/settings/CronSection.tsx | Wires presets into WebUI Cron modal props. |
| crates/agent-gateway/web/src/pages/chat/useChatSkills.ts | Reconciles installed skills against all presets (WebUI). |
| crates/agent-gateway/web/src/pages/chat/ChatComposerBar.tsx | Adds WebUI composer preset selector + per-chat disable option. |
| crates/agent-gateway/web/src/lib/settings/index.ts | Adds WebUI preset model + normalization/resolution helpers mirroring GUI. |
| crates/agent-gateway/web/src/lib/gatewayTypes.ts | Exposes history detail skill preset/disable fields in WebUI types. |
| crates/agent-gateway/web/src/lib/gatewaySocketV2/adapters.ts | Adds history.skills request mapping and response decoding support. |
| crates/agent-gateway/web/src/lib/gatewaySocket.ts | Adds setHistorySkills API and includes preset/disable on chat commands. |
| crates/agent-gateway/web/src/lib/chat/conversationSkillsState.ts | Implements WebUI client-side per-conversation skills override tracking + dirty reconciliation. |
| crates/agent-gateway/web/src/lib/automation/types.ts | Adds preset/disable fields to WebUI Cron task type. |
| crates/agent-gateway/web/src/i18n/config.ts | Adds WebUI i18n strings for preset selection and disable labels. |
| crates/agent-gateway/web/src/app/GatewayApp.tsx | Tracks per-conversation preset/disable state, persists via gateway, uses effective selection. |
| crates/agent-gateway/proto/v2/gateway.proto | Adds proto fields/messages for preset/disable on chat + history get/prefix + history.skills. |
| crates/agent-gateway/internal/protocol/pbws/guard.go | Allows history.skills request through guard. |
| crates/agent-gateway/internal/protocol/pbws/guard_test.go | Tests history.skills is permitted by guard. |
| crates/agent-gateway/internal/proto/v2/gateway.pb.go | Regenerated Go bindings for new proto fields/messages. |
Files not reviewed (1)
- crates/agent-gateway/internal/proto/v2/gateway.pb.go: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
我感觉预设加在斜杠命令中选择会不会好一些,提示词输入框底部已经很挤了 |
|
已按建议调整(099fe8b):会话输入框底部的常驻方案选择器已移除,改为类似 Codex CLI |
# Conflicts: # crates/agent-gateway/internal/proto/v2/gateway.pb.go # crates/agent-gateway/internal/protocol/pbws/guard_test.go # crates/agent-gateway/proto/v2/gateway.proto # crates/agent-gateway/web/src/lib/proto/gen/proto/v2/gateway_pb.ts
# Conflicts: # crates/agent-gateway/internal/proto/v2/gateway.pb.go # crates/agent-gateway/web/src/lib/proto/gen/proto/v2/gateway_pb.ts # crates/agent-gui/src/pages/chat/gateway/gatewayBridgeTypes.ts # crates/agent-gui/src/pages/chat/gateway/useGatewayBridgeListeners.ts # crates/agent-gui/src/pages/chat/queue/useChatTurnQueue.ts # crates/agent-gui/src/pages/chat/runtime/useSendChatTurn.ts # scripts/mirror-manifest.json
|
还没来得及看呢,佬又加了新东西吗 |
看到和基线有冲突就叫ai又解决了一下( |
|
其实我在想,按每个工作空间来预设skills跟mcp会不会好一些?而不是通过斜杠命令。佬你在qq群里吗,可以私信我,我们再聊一下 |
# Conflicts: # crates/agent-gateway/web/src/app/GatewayApp.tsx # crates/agent-gateway/web/src/pages/mcp-hub/McpServersForm.tsx # crates/agent-gateway/web/src/pages/skills-hub/SkillsHubPage.tsx # crates/agent-gui/src/components/chat/ChatHistorySidebar.tsx # crates/agent-gui/src/lib/settings/sync.ts # crates/agent-gui/src/pages/ChatPage.tsx # crates/agent-ui/src/components/chat/ChatHistorySidebar.tsx # crates/agent-ui/src/pages/mcp-hub/McpServersForm.tsx # crates/agent-ui/src/pages/skills-hub/SkillsHubPage.tsx # scripts/mirror-manifest.json
|
PR governance checks passed. Awaiting human review. |
|
天才! |
…pace resource settings (#414) PR #317 added SYSTEM_WORKSPACE_RESOURCE_SETTINGS_KEY writes to save_system but the row_count expectation and keys list in this test were never updated. The test only passes when settings tests actually run, which upstream CI (chat_history/ssh_local_forward/shell_runner/mcp subsets) never does. Co-authored-by: thirsty5034 <thirsty5034@users.noreply.github.com>
关联 Issue
Closes #306
需求说明
不同工作空间往往需要不同的 Skills 与 MCP。全局 Skill Hub 和 MCP Hub 继续负责安装、导入以及默认启用状态;工作空间可以在右侧边栏的三点菜单中覆盖这两类资源。
未配置的工作空间自动跟随全局设置,不增加会话级数据,也不改变公开分享等既有行为。
主要改动
工作空间入口与统一抽屉
运行时语义
/Skill 候选和模型提示词保持一致。inherit模式实时读取 Skill Hub 与 MCP Hub 当前设置。custom模式只加载选定且全局启用的资源,同时允许McpManager管理选定但暂时禁用的 MCP。off模式不向 Agent 暴露 Skills 或 MCP 工具。持久化与同步
system.workspaceResourceSettings,以规范化工作空间路径为键。inherit墓碑,避免旧同步快照恢复已删除覆盖。inherit墓碑过期,custom/off优先保留。代码改动范围
lib/settings、Tauri settingsagent-ui的ChatHistorySidebar、WorkspaceResourceSettingsDrawerChatPage、useSendChatTurnCronPromptRunnerChatPage、GatewayApp及平台 settings当前相对最新
origin/main@b00f8357:35 个代码/测试/配置文件及 8 张公开截图。未修改 Gateway Proto 或会话历史 schema;工作空间 UI 已接入 #399 引入的共享agent-ui架构。Screenshots / preview
工作空间菜单入口(Before / After)
原有移除、归档和文件浏览操作保持不变。
跟随全局
自定义 Skills
自定义 MCP
全部关闭
本机未安装 Skill
缺失项不会阻断运行,可通过开关关闭后保存清理。
移动端
所有截图均由实际组件在隔离 fixture 中生成,只包含示例工作空间和示例资源,不含真实用户数据;Before 图使用基线菜单项,After 图使用当前 PR 菜单项。
验证
1499/1499544/5444/45/5git diff --check兼容性
enabled状态仍具有最高优先级。Review 建议顺序
lib/settings与 Rust settings:数据模型、同步和容量策略。useSendChatTurn与CronPromptRunner:实际运行时资源范围。WorkspaceResourceSettingsDrawer与工作空间菜单:UI 和交互。提交前检查
origin/main@b00f8357,未解决冲突为 0。