Skip to content

feat(workspace): configure Skills and MCP per workspace - #317

Merged
Loosand merged 13 commits into
Stack-Cairn:mainfrom
NotToday1024:feat/skill-presets
Aug 9, 2026
Merged

feat(workspace): configure Skills and MCP per workspace#317
Loosand merged 13 commits into
Stack-Cairn:mainfrom
NotToday1024:feat/skill-presets

Conversation

@NotToday1024

@NotToday1024 NotToday1024 commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

关联 Issue

Closes #306

最终范围已根据维护者讨论调整为“按工作空间配置 Skills 与 MCP”;不再引入 Skill Hub 预设、会话 /skills 命令或会话历史字段。

需求说明

不同工作空间往往需要不同的 Skills 与 MCP。全局 Skill Hub 和 MCP Hub 继续负责安装、导入以及默认启用状态;工作空间可以在右侧边栏的三点菜单中覆盖这两类资源。

未配置的工作空间自动跟随全局设置,不增加会话级数据,也不改变公开分享等既有行为。

主要改动

工作空间入口与统一抽屉

  • 在工作空间三点菜单中增加“配置 Skills 与 MCP”,保留修改标题、移除、归档和文件浏览等原有操作。
  • 使用同一个右侧抽屉配置 Skills 与 MCP,支持“跟随全局”“自定义”“全部关闭”三种模式。
  • Skills 支持名称/描述搜索和类别过滤;MCP 支持配置搜索。
  • 使用与 Hub 页面一致的资源说明、绿色启用开关和移动端布局。
  • 自定义配置引用本机未安装的 Skill 时明确标记,允许关闭并保存清理;不会阻断对话或 Cron。

运行时语义

  • Chat 根据实际发送回合的 workdir 解析工作空间设置,/ Skill 候选和模型提示词保持一致。
  • Cron Prompt 根据任务 workdir 解析相同设置。
  • inherit 模式实时读取 Skill Hub 与 MCP Hub 当前设置。
  • custom 模式只加载选定且全局启用的资源,同时允许 McpManager 管理选定但暂时禁用的 MCP。
  • off 模式不向 Agent 暴露 Skills 或 MCP 工具。

持久化与同步

  • 配置保存于 system.workspaceResourceSettings,以规范化工作空间路径为键。
  • 每个路径带独立版本和 writer ID,Gateway 同步按路径合并并确定性解决并发更新。
  • 删除工作空间写入 inherit 墓碑,避免旧同步快照恢复已删除覆盖。
  • 删除 Skill/MCP 时清理所有自定义工作空间引用,避免同名重装后意外重新启用。
  • 最多保留 256 项;仅 90 天以上的 inherit 墓碑过期,custom/off 优先保留。
  • TypeScript 与 Rust 使用相同的 Unicode code-point 裁剪顺序。

代码改动范围

模块 主要目录 内容
设置模型 GUI/WebUI lib/settings、Tauri settings 工作空间配置、归一化、同步、墓碑与容量策略
工作空间 UI 共享 agent-uiChatHistorySidebarWorkspaceResourceSettingsDrawer 菜单入口、统一抽屉、搜索、过滤和状态展示
Chat 运行时 GUI ChatPageuseSendChatTurn 实际 workdir 解析、Skill prompt 与 MCP 实时视图
Cron CronPromptRunner 按任务 workdir 应用相同资源配置
删除路径 共享 Skills Hub、MCP Hub、管理工具 清理全局选择和工作空间引用
GUI / WebUI 接入 ChatPageGatewayApp 及平台 settings 复用共享 UI,并保持两端一致的配置行为
测试 GUI Node tests、Tauri Rust tests 运行时、同步、删除、过期、容量和跨端顺序

当前相对最新 origin/main@b00f8357:35 个代码/测试/配置文件及 8 张公开截图。未修改 Gateway Proto 或会话历史 schema;工作空间 UI 已接入 #399 引入的共享 agent-ui 架构。

Screenshots / preview

工作空间菜单入口(Before / After)

原有移除、归档和文件浏览操作保持不变。

Before After
Workspace menu before Workspace resource menu

跟随全局

Inherit global resources

自定义 Skills

Custom Skills

自定义 MCP

Custom MCP

全部关闭

Disable workspace resources

本机未安装 Skill

缺失项不会阻断运行,可通过开关关闭后保存清理。

Missing local Skill

移动端

Mobile workspace resources

所有截图均由实际组件在隔离 fixture 中生成,只包含示例工作空间和示例资源,不含真实用户数据;Before 图使用基线菜单项,After 图使用当前 PR 菜单项。

验证

检查 结果
GUI production build 通过
WebUI production build 通过
GUI full frontend tests 1499/1499
WebUI full tests 544/544
Workspace resource end-to-end test 4/4
Tauri workspace-resource tests 5/5
Shared UI boundary check 通过
Rust format / git diff --check 通过
Chromium screenshots 8 个状态;桌面 1440x900、菜单 850x500、移动端 390x844

兼容性

  • 没有工作空间配置时完全继承现有 Skill Hub 与 MCP Hub 设置。
  • 全局 Skills 开关和 MCP server enabled 状态仍具有最高优先级。
  • 不新增会话级预设字段,不修改公开分享、会话历史和 Gateway Proto。
  • 工作空间删除、Skill 删除和 MCP 删除均保留原功能,并补充引用清理。

Review 建议顺序

  1. lib/settings 与 Rust settings:数据模型、同步和容量策略。
  2. useSendChatTurnCronPromptRunner:实际运行时资源范围。
  3. WorkspaceResourceSettingsDrawer 与工作空间菜单:UI 和交互。
  4. Skills/MCP 删除路径及对应测试。

提交前检查

  • Issue skill组合功能 #306 已关联;最终需求说明草稿已准备。
  • 本地合并基线为最新 origin/main@b00f8357,未解决冲突为 0。
  • GUI/WebUI 构建、完整前端测试和 Rust 定向测试通过。
  • 8 张截图覆盖菜单 Before/After、三种模式、缺失 Skill 和移动端。
  • 代码范围、兼容性和 Review 顺序已更新为最终工作空间方案。
  • 已获许可提交、推送并更新 PR 标题、正文和 Issue 说明。

Copilot AI review requested due to automatic review settings July 28, 2026 15:54

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.selected into Default, 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.

Comment thread crates/agent-gui/src/pages/skills-hub/SkillsHubPage.tsx Outdated
Comment thread crates/agent-gateway/web/src/pages/skills-hub/SkillsHubPage.tsx Outdated
Comment thread crates/agent-gui/src/lib/settings/index.ts Outdated
@su-fen

su-fen commented Jul 29, 2026

Copy link
Copy Markdown
Member

我感觉预设加在斜杠命令中选择会不会好一些,提示词输入框底部已经很挤了

@NotToday1024

Copy link
Copy Markdown
Contributor Author

已按建议调整(099fe8b):会话输入框底部的常驻方案选择器已移除,改为类似 Codex CLI /model/skills 斜杠命令。输入 / 可发现该命令,进入后选择 Default、自定义方案或“本会话关闭”;当前项带勾选。选择会立即持久化到当前会话,命令文本随后从编辑器清除,不写入消息历史或发送给模型。GUI/WebUI 对应截图和测试也已更新。

# 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
@su-fen

su-fen commented Jul 30, 2026

Copy link
Copy Markdown
Member

还没来得及看呢,佬又加了新东西吗

@NotToday1024

Copy link
Copy Markdown
Contributor Author

还没来得及看呢,佬又加了新东西吗

看到和基线有冲突就叫ai又解决了一下(

@su-fen

su-fen commented Aug 8, 2026

Copy link
Copy Markdown
Member

其实我在想,按每个工作空间来预设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
@NotToday1024 NotToday1024 mentioned this pull request Aug 9, 2026
@NotToday1024 NotToday1024 changed the title feat(skills): add reusable skill presets feat(workspace): configure Skills and MCP per workspace Aug 9, 2026
@StackCairn
StackCairn marked this pull request as draft August 9, 2026 06:07
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

PR governance checks passed. Awaiting human review.

@NotToday1024
NotToday1024 marked this pull request as ready for review August 9, 2026 06:08
@StackCairn
StackCairn marked this pull request as draft August 9, 2026 06:08
@NotToday1024
NotToday1024 marked this pull request as ready for review August 9, 2026 06:10
@su-fen

su-fen commented Aug 9, 2026

Copy link
Copy Markdown
Member

天才!

@Loosand
Loosand merged commit a2ee9f9 into Stack-Cairn:main Aug 9, 2026
10 of 12 checks passed
su-fen pushed a commit that referenced this pull request Aug 9, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

skill组合功能

4 participants