diff --git a/FEATURES.md b/FEATURES.md index c2cad21..f3f9c1c 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -64,7 +64,8 @@ ### 浏览器、通信、语音与应用维护 -- [x] **浏览器和桌面受控工具**:保留范围、取消、超时、输出边界和执行记录。 +- [x] **直连模型内置浏览器**:使用 GoodBuddy 内置的隔离 Chromium,不控制客户端已安装的浏览器;用户通过独立总开关决定是否提供给 Execute,开启后不逐次询问。 +- [x] **客户端电脑控制工具**:与内置浏览器分开管理,并保留范围、取消、超时、输出边界和执行记录。 - [x] **远程消息通道项目**:微信 ClawBot、企业微信和钉钉分别拥有系统管理的项目、独立远程会话、工作目录、处理后端、默认 Ask/Execute 模式及任务活动归属。 - [x] **微信 ClawBot 扫码与媒体**:通过独立 Sidecar 完成本机扫码、验证码、加密凭据和文字收发;支持个人微信私聊图片与文件,单条消息最多 4 个附件、解密后合计不超过 12MB。 - [x] **微信安全回传**:支持返回当前任务生成的图片,或在用户明确要求时将本次最终文本生成为 Markdown 附件;不自动读取或发送已有工作区文件。 diff --git a/UI-DESIGN.md b/UI-DESIGN.md index e7f81d1..709634b 100644 --- a/UI-DESIGN.md +++ b/UI-DESIGN.md @@ -539,7 +539,7 @@ GoodBuddy 是可调整窗口大小的桌面应用。响应式设计优先保证 - Agent Runtime 页面在低层程序与配置覆盖之外提供“能力与默认配置”区域。能力清单使用共享 `PageTabs`,按 Agents、Tools、Commands、Skills、MCP、Rules、Prompts、Resources、LSP、Formatters 和上下文 11 类单行滚动展示,一次只呈现当前分类的 `tabpanel`;清单只显示 Runtime 自有能力,不混入 GoodBuddy 分配的 Skills、临时 MCP 或 Continue 预设。Tools 必须独立于 Commands、LSP 和 Formatters,显示工具类型、来源及 Ask/Execute 可用性;清单状态必须区分完整、部分、不可用、仅连接和不支持,不能用进程连通性冒充清单可读。 - “能力与默认配置”只显示一个模块标题,刷新入口位于该标题右侧,能力状态压缩为一行并排在默认 Agent 或 Continue 预设编辑器之前;不得再复制“Runtime 原生能力”等同义标题、说明或状态结论。刷新只更新能力快照,不覆盖未保存的原生定制草稿。 - OpenCode 的默认 Agent 使用原生下拉选择;Continue 预设编辑器允许管理名称、说明、启用的 Rules 以及 Prompt 名称、说明和正文,并可展开查看原生 Rules 与启用预设 Rules 的最终合并顺序。持久启停仍使用共享 Switch,添加与删除使用明确按钮和可访问名称。 -- MCP 设置按“内置 MCP / 直连模型 / 自定义 MCP / 电脑控制”四个同级 `PageTabs` 组织。直连模型中的联网搜索与其他内置工具组使用一致的折叠卡片,展开后显示开关、测试状态、隐私说明和工具列表。内置 MCP 卡片与 Skills 一样提供持久启停和 Runtime 分配;直连模型、GoodBuddy 管理的 OpenCode 与 Continue 默认选中且可调整,DeepSeek Harness 必须以置灰、未选择和“暂不支持”文案持续显示,不能呈现为可保存的分配。魔法笔记 MCP 的自身启停与平台功能依赖分别显示,依赖未开启时保留用户配置并说明当前不会加载。 +- MCP 设置按“内置 MCP / 直连模型 / 自定义 MCP / 电脑控制”四个同级 `PageTabs` 组织。直连模型中的联网搜索与内置浏览器使用一致的折叠卡片和独立总开关;内置浏览器必须明确说明其操作 GoodBuddy 隔离浏览器,不控制客户端已安装的浏览器,开启后可由 Execute 直接使用,不逐次询问。托管浏览器配置归入直连模型,“电脑控制”只显示实际操作客户端电脑的能力。内置 MCP 卡片与 Skills 一样提供持久启停和 Runtime 分配;直连模型、GoodBuddy 管理的 OpenCode 与 Continue 默认选中且可调整,DeepSeek Harness 必须以置灰、未选择和“暂不支持”文案持续显示,不能呈现为可保存的分配。魔法笔记 MCP 的自身启停与平台功能依赖分别显示,依赖未开启时保留用户配置并说明当前不会加载。 - MCP Server 测试结果在同一展开卡片中分组显示 Tools、Prompts 和 Resources 的支持状态、数量与有界元数据;Prompt 参数标明必填项,Resource 只显示 URI、名称、类型和说明,不读取或渲染 Resource 内容。 ### 13.8 文档解析设置 diff --git a/docs/computer-control-implementation-status.md b/docs/computer-control-implementation-status.md index df0279f..692043c 100644 --- a/docs/computer-control-implementation-status.md +++ b/docs/computer-control-implementation-status.md @@ -6,9 +6,9 @@ | --- | --- | | 文档类型 | 实施进度 | | 状态 | 持续更新 | -| 版本 | 0.1 | -| 日期 | 2026-08-07 | -| 适用能力 | 电脑控制与托管浏览器 | +| 版本 | 0.2 | +| 日期 | 2026-08-18 | +| 适用能力 | 内置浏览器与客户端电脑控制 | ## 范围 @@ -60,10 +60,12 @@ Linux x64 和 Linux arm64。 ### 设置与安全边界 - 能力存储已迁移到版本 2。 -- 已增加电脑控制能力卡片、诊断、托管浏览器配置元数据、IPC 和 preload - 契约。 -- 电脑控制能力默认关闭;启用、配置变更和本地数据清除会替换或清理相关 - Runtime 和会话。 +- 内置浏览器已归入“直连模型”工具,与联网搜索并列,并明确说明不会控制 + 客户端已安装的浏览器;原有开关和配置 ID 保持不变,用户状态无需迁移。 +- 用户通过内置浏览器总开关决定是否向直连模型提供工具;开启后可在 Execute + 模式直接使用,不逐次询问。托管浏览器配置和诊断也位于同一分类。 +- “电脑控制”只显示实际操作客户端电脑的能力。能力启用、配置变更和本地 + 数据清除仍会替换或清理相关 Runtime 和会话。 ## 本轮已修复缺陷 diff --git a/src/main/capabilities/computer-capability-catalog.test.ts b/src/main/capabilities/computer-capability-catalog.test.ts index b7fe3cb..31ac63e 100644 --- a/src/main/capabilities/computer-capability-catalog.test.ts +++ b/src/main/capabilities/computer-capability-catalog.test.ts @@ -41,6 +41,9 @@ describe('computer capability catalog', () => { new Set(['managed-linux-desktop-driver']) ) ).toBe(true) + expect(browser.name).toBe('内置浏览器') + expect(browser.description).toContain('不会控制客户端已安装的浏览器') + expect(browser.riskSummary).toContain('不再逐次询问') expect(desktop.description).toContain('技术预览') expect(desktop.riskSummary).toContain('尚未') }) diff --git a/src/main/capabilities/computer-capability-catalog.ts b/src/main/capabilities/computer-capability-catalog.ts index 91eb4a7..34dfd12 100644 --- a/src/main/capabilities/computer-capability-catalog.ts +++ b/src/main/capabilities/computer-capability-catalog.ts @@ -34,9 +34,9 @@ export const computerCapabilityCatalog: readonly ComputerCapabilityCatalogEntry[ Object.freeze([ Object.freeze({ id: 'host-browser-control', - name: '浏览器控制', + name: '内置浏览器', description: - '使用临时隔离会话执行网页操作;命名配置当前仅保存未来托管隔离所需的元数据。', + '使用 GoodBuddy 内置的临时隔离浏览器执行网页操作,不会控制客户端已安装的浏览器;命名配置当前仅保存未来托管隔离所需的元数据。', enabledByDefault: false, implementationKind: 'managed-browser-driver', supportedTargets: Object.freeze([ @@ -54,7 +54,7 @@ export const computerCapabilityCatalog: readonly ComputerCapabilityCatalogEntry[ }) ]), riskSummary: - '可读取网页内容并代表用户操作网站;当前执行不会复用命名配置,仍必须保持临时隔离和审批策略。', + '总开关关闭时不会向直连模型提供浏览器工具;开启后可在 Execute 模式直接读取网页并操作网站,不再逐次询问。', requiredDiagnostics: Object.freeze([ 'browser-executable', 'managed-profile-root' diff --git a/src/renderer/src/McpSettingsSection.tsx b/src/renderer/src/McpSettingsSection.tsx index 355d8d8..7ad698e 100644 --- a/src/renderer/src/McpSettingsSection.tsx +++ b/src/renderer/src/McpSettingsSection.tsx @@ -396,6 +396,12 @@ export function McpSettingsSection({ } const computerCapabilities = snapshot?.computerCapabilities ?? [] + const browserCapability = computerCapabilities.find( + (capability) => capability.id === 'host-browser-control' + ) + const desktopCapabilities = computerCapabilities.filter( + (capability) => capability.id !== 'host-browser-control' + ) const builtinMcpStates = new Map( snapshot?.builtinMcpServers?.map((server) => [server.id, server]) ) @@ -501,7 +507,7 @@ export function McpSettingsSection({
- {computerCapabilities.map((capability) => { + {desktopCapabilities.map((capability) => { const report = diagnostics[capability.id] return (
@@ -553,38 +559,6 @@ export function McpSettingsSection({