Files
goodbuddy/docs/features/unified-execution/source-audit.md
T
mesalogo 56ebd40bd8 feat: unify execution and add workspace file imports
Remove Ask/Execute modes and general product tool approvals so requests use the selected runtime, enabled capabilities, and execution account permissions. Migrate retired application metadata while preserving user content.

Retire the Results page while retaining conversation images and stored artifacts. Add local and remote workspace file imports, timestamps and sorting, improve image discovery and saving, and refine workspace navigation and supervision responsiveness. Include the accompanying web-search changes, tests, probes, and product documentation.

Remote imports require an updated Agent. Existing artifacts are not automatically copied into project directories. Validation evidence and outstanding failures remain documented in feature progress files; no full test suite or real-model calls were rerun for this commit.

Release note: Run requests without switching work modes, import files into a selected local or remote workspace folder, sort workspace files by date, and keep using conversation images after removal of the Results page.
2026-10-04 20:02:59 +08:00

24 KiB
Raw Blame History

统一执行:Ask/Execute 源码审计

研究日期:2026-10-04。研究对象:当前含未提交修改的工作树。

研究范围与证据

本文记录产品工作模式的源码落点、移除时必须联动的接口,以及尚未解决的支持缺口。 审计覆盖 Main、Renderer、共享合同、受管 Runtime、原生客户端、Agent daemon、启动器与模型桥。 依据为调研时的源码阅读、符号搜索、依赖版本及已有测试文件;调研阶段未实施模式移除,未运行产品测试、真实模型请求或远程 Host 验证。后续实施已启动,下文源码行为是调研基线,不能当作最终实现或验证结论。 工作树中的既有修改属于本次研究基线,不能将本文描述直接归属于某个发布版本或干净提交。 文件链接用于定位实现;函数名和行为比易变的行号更适合作为后续核对依据。

目标是移除 GoodBuddy 自有 Ask/Execute 及其隐含工具限制,由已启用、已分配的能力设置决定工具接入。 不得用固定 Execute、改名后的工作模式或另一份硬编码工具白名单代替移除。 用户已追加授权删除“安全”设置分类和 toolApproval 策略,包括一般工具审批等待;清除本地数据移到通用设置并保留确认。上传许可、覆盖选项和原生结构化提问仍按业务合同处理,现有不支持的 Runtime 能力不因此补齐。 本报告不提出新权限框架,不承诺新增原生逐工具开关。

文档分工:prd.md 定义范围,technical-design.md 定义方案,progress.md 记录实施证据。 UI 细节归 ui-design.md,主数据迁移归 data-migration.md;本文仅给出源码交接点。 下文保留移除前的源码调研基线;当前主要改造、schema 60、设置 22、runtime/acp 6 和 Harness 协议 2 的实现及验证证据见进度,不能把旧符号或版本当作现行合同。

设置覆盖与未决问题

入口 已有源码行为 审计判断
CapabilityService getResolvedMcpServers 按 enabled、assignments 取自定义 MCP;getEnabledBuiltinMcpServerIds 处理内置服务 服务启用及 Runtime 分配是现有接入依据
capability-contracts 内置服务、Skills、自定义 MCP 有开关或分配合同 不等价于每个原生工具都有设置
McpSettingsSection Web 有开关;filesystem/programming 分组主要展示工具说明 展示清单不能算原生逐工具控制
CapabilitiesAndToolsSettingsSection tools 页签进入工具环境配置 环境选择不构成工具授权开关
builtin-mcp-servers knowledge、notes、config、browser、Obsidian、Story Graph 声明支持的 Runtime 必须保留真实支持范围,不能统一标成可用

原生工具没有统一逐项设置映射,这是当前设置粒度。此次沿用 Runtime 正常能力,不新增逐工具开关,也不以其作为移除模式的前置条件。 实现评审需要区分已有服务开关、Runtime 自带工具和动态扩展工具,不能声称 MCP 设置已经覆盖后两类。 工具目录是否展示、调用是否执行是两个检查点;只改变模型可见目录会遗漏直接调用及旧会话路径。 能力 token、请求归属和当前设置检查各有职责,源码中存在这些机制不证明跨路径设置行为已经验证。

本机受管 Runtime 与原生工具

公共包装层

runtime.ts 的 AgentExecutionRequest 携带 workMode;RuntimeAuthorizer 是另一个合同。 runtime-controller.ts 的 run 用 Execute 计算 toolsAllowed,Ask 注入固定拒绝的 authorizer。 同一函数还有 requiresToolApproval 的整轮审批和 supportsToolExecution 检查;应分别辨认模式依赖与真实能力限制。 create-runtime.ts 构造各 Runtime、工具提供者及无工具模型实例,是能力来源的核对入口。

OpenCode

opencode-runtime.ts 同时处理受管本机实例和配置的外部 Server。 readOnlyPermissionRules 默认拒绝;executePermissionRules 默认允许,随后叠加 Skills 与请求级 MCP 规则。 Ask 路径调用 client.tool.ids,将原生工具逐项设为 false,仅恢复指定代理和 Skills;因此限制覆盖全部返回的原生工具。 这包含文件读写、搜索、Shell、Web、问题交互、任务委派及上游或插件新增工具,不能只核对 MCP。 图片绑定、自定义 MCP 注册、permission.asked 回复和原生工具 inventory 还各有模式分支。 移除目标包括模式选择的权限集合、工具 overrides 和可用性标签;临时 MCP 名称隔离、会话归属及清理仍有独立用途。 外部 Server 的配置、工具目录和权限 API 也需核对;本机受管路径的源码行为不能证明任意外部版本兼容。

Continue

continue-runtime.ts 的 run 计算 execute,据此绑定图片、自定义 MCP,并选择 adapter 的 agent/chat。 其 authorizer 允许 Execute,或 Ask 中特定 scoped read 工具;这与工具目录过滤是两层限制。 continue-host-adapter.ts 的 createRunConfig 拒绝 Ask 自定义 MCP,并在部分 Ask 场景丢弃原生配置中的 MCP。 run 使用 --allow <scoped tool> --exclude '*'、--auto 或 --readonly,会影响 CLI 原生工具整体。 核对范围包括原生 Read/List/Search/Fetch/Diff、文件修改、Bash、后台任务、Skills、AskQuestion 和动态工具。 源码内的固定只读名称并非上游完整目录;验收需检查所用版本实际注册的工具,不能将该名称集合变成新白名单。 adapter 还修补上游 bundle 的权限参数初始化、优先级和 /permission 处理;其中协议及 Windows 修复不能随模式分支整段删除。

DeepSeek Harness

deepseek-harness-host.ts 注册 LocalSubprocess、LocalFileSystem、ToolFs、LocalBash/LocalPwsh、ToolBash/ToolPwsh 与扩展。 所用 DSH 包包含 read、write、edit、read_image、bash、pwsh;Host 还接入原生 skill 及启用插件注册的工具。 trustedAskToolDefinitions 只收集受信任 read 定义,不能据此推断其他原生工具不存在。 goodbuddy-harness-control-plane.ts 的 observeSessions 在 tools/execute 比对 Ask 工具定义身份。 askToolDefinitions、inflight.mode、preparation.mode、模式提示词和 GOODBUDDY_PREPARE 参数均是移除目标。 控制面还主动返回 currentModeId: 'ask' 及 Ask availableModes,这是 GoodBuddy 自有字段使用。 deepseek-harness-runtime.ts 的 boundedProxyToolCatalog、handlePermission、GOODBUDDY_TOOLS_LIST/CALL 有额外模式限制。 Main 代理中的 Web/Story Graph、自定义 MCP 和图片需分别核对,保留活动请求及参数校验。 插件初始化和安装脚本不经过模型 tools/execute;模式移除不能被描述成新增或取消 OS 沙箱。

直连模型工具提供者

builtin-model-tools.ts 定义以下目录;它包含原生实现和由 Main 代理的能力。

类别 工具
文件与搜索 workspace_rg、workspace_read_text、workspace_apply_patch
进程与子任务 process_execute、output_read、subagent_delegate
Web web_search、web_fetch
浏览器 browser_navigate、browser_snapshot、browser_click、browser_type、browser_select、browser_back、browser_screenshot
图片 generate_image、save_image

model-tool-provider.ts 的 assertToolAuthorizedForWorkMode 同时被 getApproval 与 callTool 调用。 getScopedTools、getProcessTool、listTools 按模式过滤写入、进程、浏览器、自定义 MCP 和图片;进程调用分支另查 Execute。 model-runtime.ts 的工具循环对 Ask 文件读取、scoped read、Web、委派有免 authorizer 分支,其他调用走审批回调。 run 还根据 mode 选择工具循环或普通文本请求;应保留由 noModelTools 表达的内部无工具用途。 direct-model-ripgrep.ts 的 checkAskArguments 限制 cwd、路径、模式文件及符号链接访问。 Ask 禁止 --pre、--hostname-bin、--follow、--search-zip、-L、-z;这些检查与 workMode 参数需作为一组审查。 searchWorkspaceWithRipgrep 的原生 argv、--no-config、退出码、取消和分页输出不依赖产品模式语义。 provider 的 rgModeError 与“切换 Execute”恢复建议也需清理。 direct-model-process-service.ts 管理进程、cwd、输出保留和退出清理,不是工作模式入口。 workspace_read_text 与 workspace_apply_patch 的工作区相对路径合同仍是这些 API 的语义,不能因移除 Ask 自动扩大范围。 远程 workspace 下 provider 当前只保留文件读取;本机进程检查 execution identity。移除模式不会补出远程直连 Shell 或 patch。

MCP、应用配置与图片

ipc.ts 的 grantScopedDataCapability 按 enabledServers 授予知识、笔记、配置、浏览器、Obsidian 和 Story Graph。 交互与调度调用者仍按 workMode 生成 configAccess、magicNotesAccess、browserAccess、Obsidian access,需一起审查。 knowledge-mcp-gateway.ts 维护请求能力与调用范围;不能把移除模式理解成取消知识库选择或会话归属。 goodbuddy-config-tools.ts 有 Execute 专用描述;goodbuddy-config-service.ts 的计划有效期、单次应用及部分失败语义独立保留。 自定义 MCP 的 enabled/assignments、服务实际工具目录与动态工具选项仍需按原合同处理,readOnlyHint 不应成为新模式替代物。 Web 的 Exa 工具绑定检查及 MCP annotations 属于提供者合同,不能全局删除包含 readOnly 的字段。

image-generation-service.ts 的 bind、describe、save、regenerate、submit 检查绑定 mode 和实时 mode 回调。 image-tool-binding.ts 与 image-generation-contracts.ts 也携带模式依赖。 protocol-remote-runtime-channel.ts 仅为 Execute 发送图片说明。 main-image-tool-session.ts 在远程生成和保存请求再次检查模式,Agent backend 与 OpenCode 插件还有下游检查。 移除时仍需保留图片模型会话访问设置、输入能力、制品归属、内联数据限额、覆盖文件规则及 Host 写入位置。 配置检测成功不能证明生成成功;本报告未执行图片生成。

原生客户端与生成包装代码

native-client-coordinator.ts 从项目/会话推导 mode,将其计入配置身份,并改变能力读写范围及自定义 MCP 接入。 其 launch 明确要求 local execution space;不能将远程 Runtime 支持表述成远程原生客户端已可启动。 native-terminal-client.ts 内有 OpenCode/Continue 固定只读工具集合。 该文件给 Continue bundle 注入执行拦截,并选择 --auto 或 --readonly --allow ... --exclude '*'。 OpenCode 路径生成 tool.execute.before 插件及 build/plan permission 配置;原生终端不经过聊天页的全部包装逻辑。 native-dsh-web-policy.ts 生成 goodbuddy-native-mode,在 tools/execute 检查 mode 和 readOnlyTools,覆盖委派 agent。 native-dsh-web-client.ts 写入并加载该插件;配置身份、插件文件生成和 readOnlyTools 传递需同时核对。 DSH patch 另设 sandbox-policy: danger-full-access、approval: never、禁用 ui-permission。 这些上游配置与 GoodBuddy mode hook 不同;整段删除可能恢复上游默认审批或工作区限制,必须单独确定保留行为。 Electron renderer sandbox、Main 凭据存储、IPC 校验和取消清理不属于产品模式移除目标。

远程 Agent 链路

层次与源码 模式落点
acp-remote-runtime ActivePrompt、prepare 输入、handlePermission、按 Execute 传 authorizer
remote-agent-contracts preparation/acceptance 必填 workMode,assertRemotePromptAcceptanceMatchesPreparation 比对模式
remote-runtime-launch-contracts Runtime 启动合同携带 workMode
runtime-acp-backend binding mode、图片限制、独占进程模式不可变检查、prepare/acceptance、启动传递
agent-owned-acp-prompt start、prepareSession、活动 mode、#handlePermission
agent-acp-connection setModelRoute 传 session/operation/mode
model-bridge-helper session route mode 校验、共享会话 Ask 默认值、OpenCode provider permission
opencode-runtime-profile mode 生成 permission、Continue helper 的 --work-mode
continue-acp-helper 路由或默认 mode、Execute/Story Graph 放行;下层仍复用 ContinueHostAdapter
opencode-subagent-plugin chat.message 设置父子 Session 权限、原生只读列表与图片模式限制
cli 必填 --work-mode 参数及 ask/execute 值校验
runtime-composition、process owner 将 launch/profile mode 传到真实启动路径

桌面 ACP Ask 回调仅放行 read;Agent-owned 回调放行 read/search,说明两处已有不同规则。 OpenCode 插件注明原生 ACP 仅转发已注册根 Session 的权限;子代理必须检查原生 Session 规则,不能只改根回调。 请求级图片端点隔离、子会话归属和撤销清理有独立用途,不能连同模式条件删除。 远程通用自定义/内置 MCP 分配尚未与本机路径等价;图片和 Story Graph 专门通道不能证明任意 MCP 可用。 remote-runtime-lock.json 仅列 OpenCode、Continue;远程 DSH 和远程原生客户端缺口不会随模式移除解决。 workspace-protocol-methods.ts 的部分写入 API 当前返回只读服务不可用,这是服务支持限制。

工具审批移除与子任务

ipc.ts 交互直连 authorizer 对 toolApproval === 'policy' 拒绝,其他值自动允许;普通 Agent 路径不传通用 authorizer。 调度路径另有 Ask 拒绝、delegation 拒绝、Harness 自动允许、channel 策略,以及进入 ToolApprovalBroker 的分支。 调研时的 src/main/tool-approval-broker.ts 管理等待、session grant、超时和事件;该文件现已删除。用户追加授权后,一般工具审批的等待、授权状态、事件和回应入口均纳入删除范围。任务取消、超时和原生结构化问题仍需保留。 contracts.ts 的 toolApproval 值为 always/session/workspace/policy;runtime-settings-store.ts 单独持久化。 该持久化需从审计版本 21 升至下一可用版本并删除顶层字段,规则见数据迁移。不能保留为独立策略或固定自动允许值。 直连读取、Web 和委派存在绕过通用 authorizer 的分支,因此现有 policy 也不能直接称为全工具关闭开关。 continue-permissions.ts 的 ask 是上游 YAML 权限字段;审计未找到生产导入,需按真实引用判断。 computer-control/broker.ts 与 risk-policy 是另一套机制;搜索未发现生产构造调用,不能据此认定浏览器有同样审批。

direct-model-subagent-service.ts 与 provider/model-runtime 传播父 mode;应检查能力继承、输出归属和取消。 subagent-service.ts 专家/团队继承 mode 和 authorizer;synthesize 明确为无工具综合用途。 App 的 supportsSubagentSmartRouting 与 IPC 的路由分支仅允许 Ask,属于产品模式耦合。 supervision-production.ts、magic-note-analyzer.ts 等内部请求写死 Ask。 删除这些字段时,应核对其无工具 provider 和用途限制;不能把内部摘要、监督、笔记分析默认升级为通用工具任务。

外部合同与版本

合同 当前证据 兼容性关注
Desktop / Agent package.json 0.15.10;agent-runtime-lock Agent 0.15.3 发布号不等于每个未提交实现已经发布
Agent wire agent-protocol/contracts 2.0 与 Runtime capability 版本分开处理
Runtime ACP capability control-contracts RUNTIME_ACP_CAPABILITY_VERSION = 5 managed-remote-acp-runtime 使用 exactVersion;旧 schema 必填模式
远程 Runtime profile remote-runtime-lock 中 protocol 1.0 argv/helper/profile 必须配套
OpenCode / Continue 1.18.29 / 1.5.47 SDK/plugin、Session PATCH、动态 MCP 名称、bundle patch marker 和 CLI flag
DSH / Cordis 0.1.7-rc.2 / 4.0.4 原生工具 hook、插件装载、Web patch、MCP 名称归一化
ACP SDK 0.25.1,安装包协议常量 1 保留初始化、权限答复、问题交互、取消的上游语义
Harness 扩展 deepseek-harness-protocol 1 goodbuddy/session/prepare 当前必需 mode;握手精确校验
Harness utility 控制 deepseek-harness-control-protocol 3 与 ACP 扩展版本不同,按实际变更合同判断
模型桥 model-bridge-contracts goodbuddy-model-bridge-v1 helper route payload 与模型 HTTP 转发合同需区分
MCP 安装 SDK 1.30.0;最新协议 2025-11-25,默认协商 2025-03-26 另支持 2025-06-18、2024-11-05、2024-10-07;保留协商与工具结果合同

删除必填 preparation/acceptance 字段会破坏旧 Agent 调用,不能只改桌面类型或永久发送 execute 掩盖差异。 兼容处理应由技术设计明确更新双方 API、能力版本及最低可用组合;此处没有已验证的旧端兼容结论。 Continue 的 mode: 'agent'/'chat'、OpenCode primary/subagent/all 与 build/plan、DSH Plan 均属上游概念。 上游 permission 的 ask,以及 ACP allow_once/allow_always/reject/cancelled 答复,也不是产品 Ask。 文件权限 mode、TypeScript readonly、MCP readOnlyHint 不可全局替换;自有 workMode 和 GoodBuddy 注入模式需逐符号处理。

UI、存储与 daemon 保留状态交接

UI 交接点包括 App/Composer、ProjectWorkModeFields/ProjectSwitcher、ChannelProjectSettingsFields、会话历史、任务条、子代理标签和 ImageCapabilityNotice。 assistant-contracts.ts 的 WorkMode 系列、项目默认值、请求/任务/调度字段,以及 channel-contracts.ts 的 literal ask 需同步处理。 remote-channel-routing.ts 识别 /ask、/execute、/exec 和中文前缀;WeChat/WeCom/DingTalk driver 也注入 Ask。 context-manager.ts 和 runtime-conversation-history.ts 传播或剥离历史模式指令。 主存储交接为 assistant-database.ts、conversation-persistence、conversation-selectors:SQL 列、模板 JSON、导入导出和旧值归一化另行审计。 Agent 的 BindingState、活动 prompt、model route 在内存保留 mode;生成配置、启动参数和 diagnostic-log.ts 也承载它。 semantic-prompt-store.ts 没有专用 work_mode 列,但 preparation digest 间接包含模式,permission-decision 写入 transcript。 runtime-owner-registry.ts 持久化进程身份及归属,没有独立产品模式字段;不应据此新增 daemon 持久模式设置。

回归核对清单

以下为已有测试落点和待验证目标,均不表示本次执行通过。

测试文件所在目录与名称 后续核对内容
src/main/agent:runtime-controller.test、model-runtime.test、model-tool-provider.test 缺省字段、目录与真实调用一致、旧策略及一般工具审批移除、内部无工具任务
同目录:direct-model-ripgrep.test、direct-model-process-service.test 原生参数、cwd、退出码、分页、取消、进程回收
同目录:opencode-runtime.test、opencode-runtime-permissions.test 全部实际原生目录、写入/Shell/Web/Skills/子代理/动态插件,外部 Server API
同目录:continue-runtime.test、continue-host-adapter.test、continue-runtime-permissions.test 实际 argv、配置合并、bundle patch、原生问题交互
src/main 及 agent:deepseek-harness-acp-e2e.test、goodbuddy-harness-control-plane.test、deepseek-harness-third-party-plugin.e2e.test Host 原生及扩展工具、prepare 握手、Main 代理
src/agent-daemon:runtime-acp-backend.test、agent-owned-acp-prompt.test、continue-acp-helper.test、opencode-subagent-plugin.test、cli.test 协议 5 变更、共享/独占进程、子会话、旧端不兼容、重连
src/main/agent:native-terminal-client.e2e.test、native-dsh-web-client.test、native-client-coordinator.test 生成包装代码、上游 sandbox/approval 配置、复用实例设置
agent、agent-daemon、assistant:image-runtime-integration.test、image-generation-service.test、image-tool-mcp.test、subagent-service.test、direct-model-subagent-service.test 图片本机/Host 保存、模型开关、子任务能力继承与无工具综合

验收应按 Runtime、入口、已有能力启用/分配状态组织,覆盖交互、调度、通道、子代理和原生客户端;不能仅测试 MCP。 涉及 Agent 的实现需按仓库规则以当前源码验证真实 Host 链路;源码搜索、token 校验和模拟测试均不能证明全部生产路径可用。 根 AGENTS.md 按用户授权更新目标规则;各 Runtime 技术文档、README/FEATURES、模式和安全设置文案及验证脚本需按最终实现与验证更新。跨功能入口暂以目标设计标注;历史发布记录保留其当时语义。