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.
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
# 移除 Ask / Execute 工作模式
|
||||
|
||||
状态:主要源码改造已落地,定向 UI 与真实 Host 验证已有证据;全量验证和发布包验收待完成。更新日期:2026-10-04。
|
||||
|
||||
本功能从 GoodBuddy 产品中移除 Ask / Execute,包括界面选择、请求字段、原生工具与 MCP 的模式判断、提示词、任务继承,以及历史持久化字段。升级后的正常请求直接使用所选 Runtime 和已启用能力;不保留固定为 Execute 的隐藏字段,也不引入替代工作模式。
|
||||
|
||||
当前源码已移除产品模式、“安全”设置分类和 `toolApproval` 策略,数据库 schema 60 与 Runtime 设置 22 清理旧字段。“清除本地数据”位于“通用 > 平台功能”并保留二次确认。Agent 要求 runtime/acp 6,本地 Harness 控制协议为 2;配套工件尚待发布验证。具体证据见[进度与证据](./progress.md)。
|
||||
|
||||
## 文档导航
|
||||
|
||||
| 文档 | 权威职责 |
|
||||
| --- | --- |
|
||||
| [产品需求](./prd.md) | 已确认范围、功能要求、设置粒度和产品验收 |
|
||||
| [用户故事](./user-stories.md) | 新用户、升级、任务、通道、原生客户端和远程场景验收 |
|
||||
| [执行规则](./logic-design.md) | 无工作模式时的工具使用、内部文本任务、旧前缀和失败行为 |
|
||||
| [界面设计](./ui-design.md) | 控件、状态、徽标、文案与无障碍清理清单 |
|
||||
| [技术设计](./technical-design.md) | 实施顺序、进程边界、协议兼容、文档同步和验证矩阵 |
|
||||
| [数据迁移](./data-migration.md) | SQL、JSON、Runtime 设置、导入与重放中的历史字段清理及数据保留 |
|
||||
| [源码调研](./source-audit.md) | 已查明的代码依赖、各 Runtime 差异与现存能力缺口 |
|
||||
| [进度与证据](./progress.md) | 已完成的调研、未完成实现、验证记录与证据限制 |
|
||||
|
||||
## 术语与边界
|
||||
|
||||
“工作模式”特指 GoodBuddy 的 Ask / Execute 及历史 Plan 值。“Runtime 原生工具”包括文件、命令、检索、任务及插件提供的工具;“MCP”包括设置管理的内置服务和自定义服务。图片工具虽由图片模型配置管理,也属于本次移除范围。
|
||||
|
||||
“无工具内部任务”指摘要、魔法笔记分析、监督者评审等专用文本调用。它们保持无工具配置,不作为可供用户选择的另一种工作模式。
|
||||
|
||||
“设置控制”沿用现有启用、分配、模型和执行空间配置。MCP 目前按服务控制;原生工具清单没有通用的逐工具开关。本功能不新增逐工具管理系统。
|
||||
|
||||
## 相关功能
|
||||
|
||||
- [助手工作栏](../assistant-workbar/README.md):执行空间、Runtime 交互和原生客户端生命周期。
|
||||
- [Model Agent](../direct-model-agent/README.md)、[DeepSeek Harness](../deepseek-harness/README.md):各自工具执行实现。
|
||||
- [远程主机](../remote-host/README.md):Agent 协议、部署与真实 Host 验证。
|
||||
- [Task 与 Job](../task-and-job/README.md)、[消息通道](../wechat-channel/README.md):后台入口与任务恢复。
|
||||
- [会话图片](../conversation-media-generation/README.md)、[Obsidian](../obsidian/README.md):工具业务条件。
|
||||
- [数据库迁移指南](../../development/database-migrations.md):已发布数据的升级规则。
|
||||
|
||||
本目录定义当前源码行为与验收要求;已发布能力以各版本的实现证据为准,不将旧版验证记录改写为新版已通过的证据。
|
||||
@@ -0,0 +1,240 @@
|
||||
# 统一执行的数据迁移设计
|
||||
|
||||
状态:桌面主库 schema 60 与 Runtime 设置版本 22 已实现并通过合成回归;真实旧库验证尚未开展。更新日期:2026-10-04。
|
||||
本文负责旧工作模式与 `toolApproval` 数据的删除规则、升级入口、内容保留和迁移验证。
|
||||
执行行为见[逻辑设计](./logic-design.md),模块改造见[技术设计](./technical-design.md),
|
||||
用户验收见[用户故事](./user-stories.md),实施与验证证据见[进度](./progress.md)。
|
||||
数据库操作遵循[数据库迁移与大数据升级指南](../../development/database-migrations.md)。
|
||||
|
||||
## 1. 范围与审计基线
|
||||
|
||||
用户已批准全局移除 Ask/Execute、“安全”设置分类及 `toolApproval` 策略,包括界面、运行逻辑、原生工具清单和历史字段。
|
||||
升级后的业务合同与持久化数据不保留固定 `execute`、默认模式或等价占位字段。
|
||||
迁移删除工作模式元数据,保留消息、任务、成果、附件、执行记录及其引用关系。
|
||||
旧记录所表示的执行事实不得因删除模式字段而被改写为一次新的执行。
|
||||
|
||||
审计对象为存在并发修改的工作树,数据库、IPC、Runtime 和 Renderer 文件均有未提交变化。
|
||||
下列链接定位源码文件和函数职责,不代表冻结提交;实施前须复核最终合并后的定义。
|
||||
审计与本次验证未打开用户生产数据库;转换证据来自合成夹具,未统计真实历史记录中各形状的数量。
|
||||
|
||||
[共享合同](../../../src/shared/assistant-contracts.ts)已删除工作模式类型与 schema。
|
||||
历史数据可能包含 `ask`、`plan`、`execute`;迁移按字段归属删除,不按属性值筛选。
|
||||
不得把历史 `plan` 转成 `ask` 或 `execute` 后永久保留。
|
||||
`continueMode` 的 `chat/agent`、子代理 `routingMode`、知识检索模式、知识图谱策略中的
|
||||
`ask` 和文档云解析许可均有独立含义,不按名称或字符串批量删除。
|
||||
`toolApproval` 虽不属于工作模式字段,已由用户明确纳入移除范围,按第 5 节定向迁移。
|
||||
|
||||
## 2. 已核实的桌面持久化路径
|
||||
|
||||
桌面主库为 `userData/assistant.sqlite`,路径由 [Main 入口](../../../src/main/index.ts)装配。
|
||||
下表引用的 `DB` 指 [AssistantDatabase](../../../src/main/assistant/assistant-database.ts)。
|
||||
JSON 路径只表示已核实的应用自有字段,不授权递归删除同名用户数据。
|
||||
|
||||
| 表、列或 JSON 路径 | 写入、读取入口 | 设计转换 |
|
||||
| --- | --- | --- |
|
||||
| `projects.default_work_mode` | DB 项目创建、更新、通道项目与远程项目保存;项目行投影 | 删除列及其约束,覆盖归档、默认、通道和 SSH 项目 |
|
||||
| `conversations.work_mode` | 旧版 DB 对话替换、局部保存、分支、通道及定时对话创建 | schema 60 删除列及其约束,新写入不再携带模式 |
|
||||
| `conversations.context_state_json` 的 `$.workMode` | DB `serializeConversationContextState`、`parseConversationContextState`、`toConversationSnapshot` | 仅删除该属性,保留知识范围、检索设置、图谱开关、指标与压缩状态 |
|
||||
| `tasks.work_mode` | DB `createTask`、任务投影、定时任务、内部任务与 `listRecoverableRemoteTasks` | 删除列;同步取消远程恢复对模式值的要求 |
|
||||
| `schedules.task_template_json` 的 `$.workMode` | DB 定时任务创建、`toSchedule`;IPC 定时派发 | 删除属性,保留提示词、标题、历史 Runtime 选择和调度配置 |
|
||||
| `conversation_queue_items.payload_json` 的 `$.input.workMode` | IPC 入队写入 `{input, serializedContexts}`;DB 保存和领取 | 删除请求属性,保留队列状态、顺序与附件上下文 |
|
||||
| 同列旧格式的 `$.workMode` | IPC `parseConversationQueueUserPayload` 兼容裸请求 | 在严格合同校验前转换旧格式,不能漏掉未包装请求 |
|
||||
| `task_events.payload_json` 的 `$.workMode` | DB 初始任务事件、`appendTaskEvent`、远程事件插入 | 删除生命周期和子代理事件自有属性,保留事件行 |
|
||||
| `messages.metadata_json` 的 `$.subagents[*].workMode` | Renderer 子代理事件投影、消息保存;DB 恢复投影和读取 | 删除数组成员的模式属性,保留身份、路由、过程、输出和错误 |
|
||||
| `activity_history_records.record_json` 的 `$.detail` | Renderer 生成子代理活动说明;ActivityHistoryRepository 保存和分页读取 | 仅处理可确认来源的生成式模式标签,规则见第 6 节 |
|
||||
|
||||
旧版对话模式存在 SQL 列和上下文 JSON 两份表示;schema 60 同时删除两处字段。
|
||||
定时执行的任务列和模板 JSON 也分别清理。
|
||||
`schedule_runs` 保留触发时间、任务引用与执行状态,不因本次转换重建发生记录。
|
||||
定时队列当前保存 `{}` 并引用任务和计划,不需要为其新增请求快照。
|
||||
|
||||
具体写入边界包括 [IPC](../../../src/main/ipc.ts) 的 `parseConversationQueueUserPayload`
|
||||
及入队处理、[对话保存](../../../src/renderer/src/conversation-persistence.ts) 的
|
||||
`toLocalConversationHeader`、`toConversationMessage`,以及
|
||||
[事件处理](../../../src/renderer/src/agent-event-handler.ts)中的子代理投影。
|
||||
[附件上下文](../../../src/main/context-manager.ts)的 `serializeForQueue` 保存附件内容;
|
||||
`serializedContexts` 不属于模式字段,须原样保留其语义和附件引用。
|
||||
|
||||
## 3. Schema 与启动升级顺序
|
||||
|
||||
实施前确认 `ASSISTANT_DATABASE_SCHEMA_VERSION = 59`,末次迁移增加执行计时结构。
|
||||
本次新增 schema 60,覆盖 schema 59 的已升级用户与通过历史迁移链升级的旧库。
|
||||
DB `migrate` 已拒绝高于客户端支持版本的数据库;保留此行为,不回写版本号支持降级。
|
||||
|
||||
升级复用 [prepareAssistantStorage](../../../src/main/assistant-storage-startup.ts)、
|
||||
[assistant-storage-worker](../../../src/main/assistant-storage-worker.ts)和
|
||||
[assistant-storage-upgrade](../../../src/main/assistant/assistant-storage-upgrade.ts)。
|
||||
启动顺序要求如下;主库转换由 `AssistantDatabase.migrate` 的版本 60 分支执行:
|
||||
|
||||
1. 先修改新写入、读取、IPC 和 Runtime 合同,使新请求不生成工作模式字段。
|
||||
2. 启动时只读检查 schema 和待转换内容,确认升级需求后进入现有升级页面与 Worker。
|
||||
3. 在业务连接、恢复处理、队列消费和调度启动之前,完成必要的既有版本迁移。
|
||||
4. 按已核实路径分批转换历史 JSON,提交一批后报告进度;同一转换规则用于导入与重放。
|
||||
5. 在 SQLite 事务中删除模式列及约束;全部所需转换完成后提交目标 `user_version`。
|
||||
6. 通过完整性检查和目标内容检查后,开放正常业务入口;失败则保持升级失败页面。
|
||||
|
||||
旧迁移 22、25 等仍读取或写入模式字段,须在最终删除之前完成。
|
||||
实现保留历史迁移链,仅将历史模式类型与归一化表达式留在旧迁移内部。
|
||||
schema 60 在启动恢复解析消息之前完成,避免严格子代理合同拒绝尚未转换的旧对象。
|
||||
|
||||
转换依次扫描对话上下文、计划模板、队列、任务事件、消息元数据,每批最多 32 行,
|
||||
按 `rowid` 有界读取。每批独立提交后报告进度;没有目标字段的 JSON 保留原始字符串。
|
||||
只删除表中列明的路径,保留相邻未知属性和嵌套工具参数。无效 JSON、非对象元数据、
|
||||
非对象队列 `input` 或无效子代理数组使当前批次回滚;错误只包含表、列和行号。
|
||||
先前批次可以保留,重试重新扫描并跳过已清理数据,不需要额外进度表。
|
||||
|
||||
最后在同一事务内执行三个 `ALTER TABLE ... DROP COLUMN` 并提交 `user_version = 60`。
|
||||
取消或转换失败时仍保留旧版本和模式列,业务恢复不会提前开始。本次迁移不请求空间回收。
|
||||
|
||||
优先使用 SQLite 支持的删除列操作,并核对约束、索引和依赖。
|
||||
确有依赖阻止删除时,仅重建受影响表,保留外键、索引及业务使用的行顺序。
|
||||
不重建全部用户数据,不通过导出当前 DTO 再导入的方式替换原库。
|
||||
迁移不新增通用框架、持久化阶段日志、收据、影子快照或回滚引擎。
|
||||
重试根据已提交数据和缺省字段继续;退出或失败至少回滚未提交批次。
|
||||
|
||||
大表转换使用有界批次和缓存,不在 Main 或 Renderer 同步扫描全库。
|
||||
保留事务、同步落盘与 checkpoint;不为提速关闭约束。
|
||||
模式字段删除不自动触发 `VACUUM`,空间回收须另有实际旧内容转换与测量依据。
|
||||
重启后不能仅凭空闲页再次整理或回收,也不承诺磁盘上旧字节的取证级擦除。
|
||||
|
||||
## 4. 旧版导入、事件重放与内容保留
|
||||
|
||||
[App](../../../src/renderer/src/App.tsx)仍读取 `goodbuddy.conversations.v1`,
|
||||
其已核实目标为 `$[*].workMode` 和 `$[*].messages[*].subagents[*].workMode`。
|
||||
在快照校验和写入前应用转换,仅在内容成功持久化后移除该 localStorage 项。
|
||||
不得清空全部 localStorage;布局、主题、语言和其他草稿不属于本次迁移。
|
||||
现有导入具有长度、数量及重复 ID 处理规则,验收须核对被跳过的数据,不能只比成功行数。
|
||||
|
||||
[activity-store](../../../src/renderer/src/activity-store.ts)读取
|
||||
`goodbuddy.activity-records.v1`,通过 `queueLegacyMigration` 写回 SQLite。
|
||||
该入口也须采用第 6 节标签规则,防止升级后导入重新带回旧标签。
|
||||
从旧活动 schema 升级时,先完成既有记录格式转换,再处理目标字段。
|
||||
|
||||
[子代理过程存储](../../../src/main/assistant/subagent-progress-storage.ts)保存累计或差量过程。
|
||||
`compactSubagentPayload` 和 `restoreSubagentPayload` 会保留其他事件属性,
|
||||
因此差量压缩不会自动删除 `workMode`;转换须保持过程可还原,不丢块、不重排。
|
||||
DB `insertRemoteTaskEventOnce` 比较原 JSON 或还原后的子代理载荷。
|
||||
历史删除和新到达的旧格式事件须采用相同定向规范化,再进行去重、比较和插入。
|
||||
已实现的 DB 事件写入在序列化、子代理压缩和远程去重比较前删除顶层 `workMode`,
|
||||
与版本 60 的清理范围一致。正文、过程块及其嵌套属性不参与字段删除。
|
||||
保留 `remote_binding_id`、`remote_operation_id`、`remote_semantic_sequence`、
|
||||
`remote_event_index`,不能将合法重放误判为冲突或再次生成任务与消息。
|
||||
|
||||
转换保留稳定 ID、顺序、创建及完成时间、任务父子关系、状态、错误和恢复游标。
|
||||
提示词、正文、推理、工具参数与输出、成果、附件及未知相邻属性不因清理模式而删除。
|
||||
对于应由应用解析的 JSON,若语法或必要结构损坏,须停止相关迁移并显示可重试的失败。
|
||||
保留损坏源记录,日志仅记录定位信息和统计,不输出正文;不得统一替换为 `{}` 或删行。
|
||||
仅含合法模式属性的事件在删除属性后可以成为 `{}`,此情况与损坏数据恢复必须区分。
|
||||
|
||||
## 5. Agent、协议和设置
|
||||
|
||||
以下为已核实的 Agent 存储结构,实际旧载荷形状仍按第 7 节补证据。
|
||||
[runtime-composition](../../../src/agent-daemon/runtime-composition.ts)装配运行与语义库,
|
||||
[daemon](../../../src/agent-daemon/daemon.ts)装配 `journal/events.sqlite`。
|
||||
|
||||
| 文件或表 | 已核实表示、写读与现有入口 | 设计要求 |
|
||||
| --- | --- | --- |
|
||||
| `semantic-prompts.sqlite` 的 `semantic_prompt_operations` | `prepare` 保存并比较 `preparation_digest`,未存完整准备请求 | 保留摘要和操作身份,不能从缺失的准备信息重算历史摘要 |
|
||||
| 同库 `semantic_prompt_events.payload_json` | `append`、`page` 保存与读取通用语义事件 | 只转换经证明属于模式元数据的路径,保持序号与 ACK,字节变化时同步计数 |
|
||||
| `journal/events.sqlite` 的 `journal_events.payload`、`acp_frames.payload` | BLOB 原始载荷;追加按字节比较,重放读取原字节;有 usage 修复入口 | 不当作普通 JSON 递归清理,保持流、epoch、序号、终态与字节统计一致 |
|
||||
| `runtime-owners.sqlite` 的 `active_runtime_owners.process_identity_json` | RuntimeOwnerRegistry 保存进程身份并有旧记录修复入口 | 未发现模式字段,保留归属和进程清理依据 |
|
||||
| `model-calls.sqlite` 的 `agent_model_calls` | AgentModelCallLedger 保存调用摘要、派发与交付状态 | 未发现模式列,不清空防重复派发记录 |
|
||||
| 桌面 `runtime_session_bindings.binding_json` | SqliteRuntimeSessionBindingStore 按严格合同写读完整 binding | 合同未含 `workMode`,保留会话身份与恢复游标 |
|
||||
| `agent-diagnostics.jsonl` 及轮转文件 | formatVersion 1 的每行顶层 `$.workMode`;日志写入、读取与轮转 | 停止新增字段,在无并发写入和轮转时定向删除历史顶层属性 |
|
||||
|
||||
源码分别见 [SemanticPromptStore](../../../src/agent-daemon/semantic-prompt-store.ts)、
|
||||
[EventJournal](../../../src/agent-daemon/event-journal.ts)、
|
||||
[RuntimeOwnerRegistry](../../../src/agent-daemon/runtime-owner-registry.ts)、
|
||||
[AgentModelCallLedger](../../../src/agent-daemon/agent-model-gateway.ts)、
|
||||
[binding 存储](../../../src/main/agent/runtime-session-binding-store.ts)和
|
||||
[诊断日志](../../../src/agent-daemon/diagnostic-log.ts)。诊断记录的时间、事件、结果和错误码须保留。
|
||||
这些 SQLite 存储当前未设置 `user_version`,新库保持默认 0;实际旧文件版本尚未读取。
|
||||
不能假定桌面 schema 升级覆盖 Agent,也不能直接套用桌面版本号。
|
||||
确需转换已发布 Agent 数据时,在现有构造或启动入口安排事务与版本检查,避免旧进程并发打开。
|
||||
仅分支内未发布、可重建的内部记录可按既有清理逻辑处理,不据此删除用户历史或未确认结果。
|
||||
|
||||
[Agent 协议](../../../src/shared/agent-protocol/contracts.ts)观察版本为 2.0。
|
||||
[远程合同](../../../src/shared/remote-agent-contracts.ts)的 preparation、acceptance 必填 `workMode`,
|
||||
[启动合同](../../../src/shared/remote-runtime-launch-contracts.ts)也携带该字段。
|
||||
[runtime-acp-backend](../../../src/agent-daemon/runtime-acp-backend.ts)对准备请求求摘要并检查重复操作。
|
||||
删除字段改变严格合同和摘要输入,桌面、Agent、helper 与运行包必须按现有兼容机制协同升级。
|
||||
旧操作保留原摘要用于身份判断,不把新请求套入旧 operation ID,也不伪造摘要迁移。
|
||||
新旧协议组合的拒绝或升级路径须明确,不能靠永久发送 `execute` 维持假兼容。
|
||||
[远程委派](../../../src/main/assistant/remote-delegation-service.ts)另有必填 `workMode: ask` 外部合同,
|
||||
须协调服务端;其结果 outbox 不等于输入任务快照,不能混同迁移。
|
||||
|
||||
设置审计版本为 Runtime 21、应用 12、通道 3、Runtime 扩展状态 2。
|
||||
见 [Runtime 设置](../../../src/main/runtime-settings-store.ts)、[应用设置](../../../src/main/application-settings-store.ts)、
|
||||
[通道设置](../../../src/main/channels/channel-settings-store.ts)和[扩展存储](../../../src/main/agent/runtime-extension-store.ts)。
|
||||
这些已声明结构及凭据载荷未发现工作模式字段;项目默认模式实际位于主库。
|
||||
但 Runtime 设置明确持久化顶层 `toolApproval`,本次必须升级其设置版本并清理磁盘文件,不能仅在读取时忽略字段。
|
||||
|
||||
Runtime 设置已升级到版本 22。版本 1 至 21 的历史 schema 继续读取旧策略,迁移终点删除顶层 `toolApproval`,覆盖 `always/session/workspace/policy`。这些历史 schema 原本要求该属性存在,本次不新增缺省策略。新默认值、读取投影、更新合同及保存路径均不再生成该字段;`getPolicySettings` 仅保留智能路由开关。
|
||||
|
||||
复用现有设置加载与保存入口,保留其他设置及加密凭据的原字节,不为删除策略解密再加密凭据。验证旧版本加载、新版本落盘、再次保存和重启均不会恢复字段;失败沿用既有可见错误与重试机制,不重置整份设置。应用、通道与 Runtime 扩展设置未发现本次目标字段,不因此提升它们的版本。“清除本地数据”仅移动界面入口,不在升级中触发数据清除。
|
||||
加载旧版本后通过现有原子写入保存版本 22,不等待用户再次保存设置。写入失败向调用方报告,
|
||||
落盘成功后才发布内存缓存,以便下次读取重试,不把写入故障当作文件损坏而隔离原件。
|
||||
已为版本 22 的文件不会仅因读取而重写。
|
||||
用户自定义请求体、MCP 配置中的同名字段不属于应用模式元数据。
|
||||
|
||||
## 6. 原生工具、生成文件与历史标签
|
||||
|
||||
[原生工具合同](../../../src/shared/runtime-customization-contracts.ts)已删除 `tools[*].ask/execute`,
|
||||
能力合同也已删除 `availableIn` 模式列表。Runtime 清单生成与
|
||||
[清单 UI](../../../src/renderer/src/RuntimeCustomizationSection.tsx)的配套改造由各模块负责。
|
||||
[native-terminal-client](../../../src/main/agent/native-terminal-client.ts)生成模式插件和启动权限参数,
|
||||
[DS Web 策略](../../../src/main/agent/native-dsh-web-policy.ts)生成 `config.workMode`,
|
||||
[DS Web 启动器](../../../src/main/agent/native-dsh-web-client.ts)写入 `goodbuddy-mode.mjs`、`cordis.patch.yml`。
|
||||
删除或重生成应用自有启动材料,保留原生历史、用户 profile 和工作区文件。
|
||||
Harness 的 `params.mode`、ACP 模式列表和注入提示词属于同一旧概念,不能因字段名不同遗漏;
|
||||
见 [Harness 控制面](../../../src/main/agent/goodbuddy-harness-control-plane.ts)。
|
||||
通道 `/ask`、`/execute` 等前缀的行为改造见逻辑设计,历史消息正文不回写。
|
||||
|
||||
活动 `detail` 将来源、模式、原因和错误拼成文本,缺少独立模式槽位。
|
||||
只在记录种类、关联子任务和已知生成格式足以确认时删除对应标签片段。
|
||||
不得全局替换正文中的 Ask、Execute 或 plan,不得删除用户原因、错误原文及工具输出。
|
||||
无法区分生成标签与用户内容的旧记录须保留源文本并列入待核验项,不能宣称已清除。
|
||||
|
||||
## 7. 历史证据缺口与待验收项
|
||||
|
||||
`runs.execution_snapshot_json`、`runs.checkpoint_json` 已确认建表,未找到当前生产写读函数。
|
||||
其历史 JSON 路径须从已发布夹具或真实旧行核实,不预设 `$.request.workMode` 等嵌套结构。
|
||||
源码未发现独立 `jobs` 模式表,现有后台执行使用 tasks、schedules、runs 和队列表示。
|
||||
Agent 不透明载荷、原生 Runtime 自有历史中的模式表示及已发布协议组合仍待取样验证。
|
||||
摘要本身无法反推出原字段;没有证据时不新增“兼容快照”补造历史。
|
||||
|
||||
真实旧库验证尚未开展,以下要求仍须在真实样本和完整产品路径中验收:
|
||||
|
||||
- 在应用关闭或 SQLite 一致性备份条件下制作独立副本,记录 WAL、大小、源版本和校验值。
|
||||
- 覆盖新库、观察版本 59、旧版 `plan`、schema 34/35 子代理过程及活动记录旧结构。
|
||||
- 覆盖归档对话、内部任务、禁用计划、队列两种格式、附件、localStorage 导入及重复 ID。
|
||||
- 比较迁移前后用户内容、稳定 ID、顺序、时间、引用和远程来源;差异仅限确认的模式元数据。
|
||||
- 覆盖 Runtime 设置版本 21 及更早支持版本的旧策略值;版本 21 的差异仅限设置版本和顶层 `toolApproval`,其他设置及加密凭据字节保持不变。更早版本仍执行各自已有迁移。
|
||||
- 验证损坏 JSON 可见失败、事务回滚、退出续跑、同次启动重试、再次启动和旧客户端拒绝打开。
|
||||
- 验证远程未 ACK 重放不冲突、不重复执行;原生工具界面和新生成文件不再携带模式。
|
||||
- 运行完整性检查并记录耗时、内存、主库与 WAL 大小;不要以行数相同替代内容核对。
|
||||
- 实施后执行仓库要求的测试、类型检查、lint 与受影响的真实 Agent 路径验证。
|
||||
|
||||
测试命令、样本版本、失败记录及未解决的数据形状写入进度文档;设计审查通过不等于迁移完成。
|
||||
|
||||
## 8. 本地存储验证
|
||||
|
||||
2026-10-04,Windows 本地执行:
|
||||
|
||||
```text
|
||||
npx vitest run src/shared src/main/assistant/assistant-database.test.ts src/main/assistant/assistant-storage-upgrade.test.ts src/main/assistant/assistant-execution-stats.test.ts src/main/assistant/heartbeat-database.test.ts src/main/runtime-settings-store.test.ts
|
||||
```
|
||||
|
||||
44 个文件、538 项通过。新增 schema 59 夹具覆盖 `ask`、`execute`、`plan` 和缺省 JSON 字段,
|
||||
检查三列删除、队列两种格式、子代理消息、计划时间、用户文本及嵌套同名字段保留。
|
||||
远程事件的行号、来源身份和序号保持不变,旧格式重放返回已存在而不重复插入。
|
||||
另有 70 行事件夹具验证已提交批次的取消续跑、损坏 JSON 的批次回滚、源记录保留和修复后重试。
|
||||
迁移后执行 `integrity_check` 与 `foreign_key_check`;重复打开不再触发升级。
|
||||
|
||||
版本 21 设置的四种策略夹具检查迁移前后完整对象,仅允许版本号和顶层策略变化。
|
||||
通过加解密调用监测确认读取智能路由设置并落盘升级时没有处理凭据明文,
|
||||
请求体内的同名用户字段保持原样。写入失败夹具确认源文件保留,下一次读取重新升级。
|
||||
历史版本的既有回归继续执行,执行计时与心跳持久化夹具也已适配无模式合同。
|
||||
本次修改文件的 ESLint 与 `git diff --check` 通过;Node 类型检查仍有其他模块的旧字段调用错误,
|
||||
本次负责的共享合同、主库与设置文件没有类型诊断。完整应用类型检查仍待并发改造合并后验收。
|
||||
这些证据不覆盖用户生产库、Renderer 导入、活动标签清理或真实 Agent Host。
|
||||
@@ -0,0 +1,63 @@
|
||||
# 执行规则
|
||||
|
||||
状态:当前源码规则;主要改造已落地,完整验收状态见[进度](./progress.md)。
|
||||
|
||||
## 请求与工具
|
||||
|
||||
L-1(FR-1、FR-2;US-01、US-04):正常请求不存在工作模式维度。请求选择 Runtime、模型、执行空间和上下文后进入该 Runtime 的正常执行流程。工具支持不足不再映射为 Ask;纯文本请求仍可以完成。
|
||||
|
||||
L-2(FR-3;US-03):工具由实际注册目录和已有能力配置提供。MCP 根据服务启用和 Runtime 分配接入,不按工具的读写标记筛选。读写标记仅用于说明。调用时检查工具确实来自已接入的服务,保留参数、会话资源和连接状态校验。
|
||||
|
||||
L-3(FR-2、FR-6;US-04、US-05、US-11):原生工具不再使用 Ask 名单。上游需要 permission 配置或 ACP 回应时,由现有能力配置和真实调用身份生成;不使用全局 `workMode` 分支,也不把旧名单改名后保留。
|
||||
|
||||
| 条件 | 结果 |
|
||||
| --- | --- |
|
||||
| MCP 已启用、已分配,连接及资源可用 | 提供其已发现工具并按正常流程执行 |
|
||||
| MCP 未启用或未分配 | 不注册该服务,调用不能绕过该状态 |
|
||||
| 原生工具正常注册且无既有配置禁用 | 使用 Runtime 的正常执行能力 |
|
||||
| 图片模型未允许会话调用或不可用 | 返回具体配置或可用性原因 |
|
||||
| 所需知识库、图片引用、浏览器 Tab 不属于请求范围 | 返回业务范围错误 |
|
||||
| 专用内部文本调用 | 不注入工具提供者或工具目录 |
|
||||
| 请求已取消、超时或服务关闭 | 沿用对应生命周期处理 |
|
||||
|
||||
## 授权策略与内部任务
|
||||
|
||||
L-4(FR-7;US-10):笔记分析、摘要、监督者和子代理综合结果使用其已有无工具构造路径。删除硬编码 `ask` 后仍须在执行边界保持无工具,不能只靠“不要调用工具”的提示词。该能力不向用户暴露为新模式。
|
||||
|
||||
L-5(FR-2、FR-7;US-17):用户进一步确认删除“安全”设置分类及 `toolApproval` 策略。交互、通道、调度和委派不再通过该策略或产品工作模式阻止已启用工具;清除本地数据移到通用设置并保留确认。上传许可、覆盖选项和原生结构化提问按各自业务契约处理。
|
||||
|
||||
执行路径采用以下规则,不新增工具总开关或替代权限模式。
|
||||
|
||||
| 当前分支 | 本次处理与验收结果 |
|
||||
| --- | --- |
|
||||
| Controller / IPC 根据非 Execute 固定拒绝 | 删除该条件,无模式请求不再被此处拒绝 |
|
||||
| 交互 Model 的 `toolApproval` | 删除字段、设置持久化及拒绝分支;启用工具正常执行 |
|
||||
| 通道 Model 的工具策略 | 删除同一策略控制,不增加无人能响应的审批窗口 |
|
||||
| 调度任务进入 ApprovalBroker | 删除一般工具审批等待;保留任务取消、超时和结构化问题处理 |
|
||||
| 后台 Harness 自动允许 | 保留已有适配行为,仍需检查注册能力与参数 |
|
||||
| 外部委派来源的固定拒绝 | 删除沿用只读委派的工具拒绝,仍使用已有能力、执行空间与资源范围 |
|
||||
| 原生 Runtime 权限事件与问题 | 保持合法协议回应;删除产品模式拒绝,保留结构化问题与明确取消 |
|
||||
|
||||
原生协议需要权限答复时,对实际可用工具正常回应;该协议适配不恢复产品审批开关。远程通用 MCP 等缺失的传输能力仍不属于本次新增功能。
|
||||
|
||||
## 路由、队列与通道
|
||||
|
||||
L-6(FR-5;US-06、US-09):任务、子代理和队列不再继承模式。智能路由保留开关、专家选择、团队选择和图片请求等已有条件,删除 Ask 条件。子任务继承真实执行空间与已授权上下文,不因删除模式获得未启用能力。
|
||||
|
||||
L-7(FR-8;US-07):删除 `/ask`、`/execute`、`/exec` 及“对话/问答/执行”前缀的特殊解析。新消息按普通正文处理,保留文字,不剥离前缀,也不改变权限。仅含旧命令的非空消息按普通消息处理;空白消息仍按既有输入规则拒绝。通道帮助移除旧命令说明。
|
||||
|
||||
选择按正文处理可避免长期保留另一套命令兼容逻辑。历史存储正文不修改,用户明确要求“只解释、不修改”仍是应遵循的请求意图,但产品不再将其解释为系统级只读模式。
|
||||
|
||||
## 升级与恢复
|
||||
|
||||
L-8(FR-4、FR-9;US-02、US-13、US-16):旧模式值不映射为常驻的新值;从指定结构中直接移除。SQL、JSON、导入、事件重放必须遵循同一转换规则。迁移只改应用拥有的模式元数据,不递归删除用户工具参数中的同名字段。
|
||||
|
||||
L-9(FR-6;US-11、US-12):新请求使用无模式协议。旧 Agent 在现有版本协商处提示更新,不静默补 `execute`。已接受远程任务继续按操作身份恢复或明确报告无法恢复;不得为解决协议不匹配自动创建新操作或重新调用模型。
|
||||
|
||||
L-10(FR-9):模式移除不重算已保存的操作摘要,不改远程序号、ACK、去重身份或计划执行时间。既有退出、停止、恢复和升级流程仍由所属功能管理。
|
||||
|
||||
## 完整性与未决事项
|
||||
|
||||
选择器、请求、执行、子代理、历史存储和远程链路均已纳入设计,无需再决定是否保留 Ask。MCP 的服务级设置沿用现状,不将逐工具开关作为本次前置条件。
|
||||
|
||||
剩余技术取证包括真实旧库中未声明 JSON 的形状、配套发布包升级与旧操作恢复、外部委派服务对无模式请求的兼容情况,以及旧工具策略在各生产入口的移除覆盖。真实 Host 的源码恢复证据与发布包升级验收分开记录,详见[迁移](./data-migration.md)与[进度](./progress.md)。
|
||||
@@ -0,0 +1,50 @@
|
||||
# 产品需求
|
||||
|
||||
状态:主要源码改造已落地,完整验收待完成,见[进度](./progress.md)。需求依据:用户确认完全移除 Ask / Execute、安全分类及 `toolApproval`,并清理历史字段。
|
||||
|
||||
## 用户问题
|
||||
|
||||
旧实现中,用户已启用工具,调用仍可能被工作模式拒绝。图片生成同时检查请求绑定的模式和调用时的模式;多个 Runtime 又分别控制工具注册与执行,导致界面、工具目录和执行结果不一致。模式还增加了项目、通道、任务和子代理中的配置与解释成本。
|
||||
|
||||
目标是让用户直接提出问题或要求执行任务,由所选 Runtime 和已配置能力完成请求,不需要先切换工作模式。
|
||||
|
||||
## 范围
|
||||
|
||||
覆盖 Model、OpenCode、Continue、DeepSeek Harness 的已实现产品入口,本地和远程执行、原生客户端、原生工具、MCP、图片、子代理、队列、定时任务、消息通道和内部文本任务。历史数据和中英文文案同步处理。
|
||||
|
||||
远程通用 MCP、远程 DSH、远程原生客户端等尚未实现的路径,不因移除模式自动获得支持。其现状由[源码调研](./source-audit.md)记录。
|
||||
|
||||
## 功能要求
|
||||
|
||||
| 编号 | 要求 | 产品验收 |
|
||||
| --- | --- | --- |
|
||||
| FR-1 | 移除工作模式选择和展示 | 输入区、项目、通道、任务、历史子代理和原生工具页均无 Ask / Execute 选择、徽标或默认值 |
|
||||
| FR-2 | 移除运行时模式判断 | 已支持入口不再根据旧模式筛选、拒绝或要求重新授权工具;原生文件和命令工具一并覆盖 |
|
||||
| FR-3 | 沿用设置控制能力 | 已启用且已分配的 MCP 服务提供其工具;关闭或未分配的服务不可调用;只读标记只描述行为 |
|
||||
| FR-4 | 删除历史模式字段 | 新写入无模式字段;升级清理旧 SQL 列和已确认的应用元数据路径;Ask、Execute、Plan 与缺省数据适用同一执行规则 |
|
||||
| FR-5 | 覆盖全部请求来源 | 对话、队列、定时任务、通道、外部委派和子代理不再附带或继承模式 |
|
||||
| FR-6 | 覆盖远程与原生客户端 | 配套 Agent、桥接程序、启动参数和生成配置均不保留产品模式;版本不匹配时明确提示升级 |
|
||||
| FR-7 | 保留任务性质与业务条件 | 摘要和内部分析仍无工具;资源范围、输入校验、取消、超时和进程清理保持有效 |
|
||||
| FR-8 | 清理提示词与命令语义 | 不再注入工作模式说明或“切换 Execute”建议;旧通道模式前缀不再改变权限 |
|
||||
| FR-9 | 保留用户数据与任务身份 | 模式迁移不修改正文、工具输入输出、附件、成果、任务顺序、调度时间或远程去重身份 |
|
||||
| FR-10 | 同步产品说明 | 中英文界面、当前功能文档及发布升级说明准确反映新行为;历史版本证据保持原状 |
|
||||
|
||||
## 设置粒度
|
||||
|
||||
MCP 当前按服务启用和分配,展开的工具列表用于说明。启用服务意味着使用该服务实际提供的工具;不再按工作模式维护第二份读写名单。
|
||||
|
||||
Runtime 原生工具沿用其现有注册与配置机制,没有开关的工具按 Runtime 正常能力提供。本次不承诺新增文件、命令或插件的通用逐工具开关。图片继续使用图片模型的会话调用设置,浏览器继续使用已有能力开关,知识库继续使用用户选定范围。
|
||||
|
||||
用户进一步确认删除“安全”设置分类和 `toolApproval` 自动授权/禁止工具策略,并迁移清理其历史配置。“清除本地数据”移到通用设置,保留二次确认。覆盖文件选项、上传许可和原生结构化提问保留,具体处理见[执行规则](./logic-design.md)。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不新增权限档位、模式别名、固定安全工具列表或额外确认流程。
|
||||
- 不因删除模式实现尚不支持的 Runtime、远程工具或 MCP 传输。
|
||||
- 不删除 OS 账户权限、Electron 隔离、凭据保护、协议校验或资源归属校验。
|
||||
- 不删除用户保存的文字,也不承诺擦除备份、已导出的日志或数据库空闲页中的字节。
|
||||
- 不将第三方协议的 `ask` 权限值、原生计划代理或 `chat/agent` 名称当作产品模式批量替换。
|
||||
|
||||
## 完成条件
|
||||
|
||||
FR-1 至 FR-10 的实现与[用户故事](./user-stories.md)验收均有证据后才可标记完成。仅隐藏选择器、统一传入 `execute`、修改工具说明或通过隔离单元测试,不满足完整交付要求。
|
||||
@@ -0,0 +1,75 @@
|
||||
# 进度与证据
|
||||
|
||||
## 2026-10-04 调研与设计
|
||||
|
||||
用户确认彻底移除 Ask / Execute,包括界面、原生工具与 MCP 限制,并允许升级清理历史模式字段。本轮交付文档,不实施运行时或数据库改造。
|
||||
|
||||
已完成只读源码调研:共享合同、Renderer、Main IPC、Model/OpenCode/Continue/Harness、原生客户端、Agent/桥接/辅助程序、图片工具、子代理、通道、队列、日程和数据库迁移入口。具体路径见[源码调研](./source-audit.md)与[数据迁移](./data-migration.md)。历史检索未返回相关存储决策,设计依据为当前会话要求与源码。
|
||||
|
||||
调研基于有未提交改动的工作树,不对应冻结的发布提交。记录到 Desktop 版本 0.15.10、数据库 schema 59、Agent wire 2.0 和 runtime/acp capability 5;实施前须重新检查并发变更。
|
||||
|
||||
## 已知工作树改动
|
||||
|
||||
本会话较早阶段按“Ask 仅提供只读工具”的旧方向修改了浏览器权限、网关分类、IPC 发放及相关测试。那部分改动仍未提交,方向已被本次完全移除模式的需求替代。后续实施需收敛这些改动,不能在此基础上继续扩展只读名单。
|
||||
|
||||
旧方向的聚焦测试曾报告 280 通过、1 跳过,类型检查与 lint 通过;这不构成本功能的验收证据。后续源码调研还发现 Model/Continue 上层授权分支未贯通。图片服务原始模式检查仍存在。
|
||||
|
||||
工作树另有并发的任务统计、监督者、界面和文档改动,均不属于本次移除实现。未对其回退或覆盖。
|
||||
|
||||
## 2026-10-04 当前实现与定向验证
|
||||
|
||||
主要源码改造已落地。以下按组件区分实现与验收,不把定向通过记为全量验证通过;全量测试仍在运行,最终结果由主实施记录汇总。
|
||||
|
||||
| 技术设计阶段 | 状态 | 剩余工作 |
|
||||
| --- | --- | --- |
|
||||
| P1 合同与迁移 | schema 60、Runtime 设置 22 及无模式合同已实现;合成回归 44 个文件、538 项通过,见[迁移记录](./data-migration.md#8-本地存储验证) | 真实旧库与未声明历史形状取证 |
|
||||
| P2 本地执行 | Model、OpenCode、Continue、Harness 模式分支及一般工具审批已移除;内部无工具构造保留 | 全量测试及各平台最终验收汇总 |
|
||||
| P3 各入口与原生客户端 | 队列、日程、通道、委派、子任务及原生配置已改为无模式 | 外部委派服务、原生客户端发布包矩阵 |
|
||||
| P4 远程协议 | runtime/acp 6 与当前源码真实 Linux Host 定向验证通过 | 配套签名包重建、升级与发布矩阵 |
|
||||
| P5 界面与文档落地 | 模式与安全分类已删除;清除数据搬迁后的 Electron 定向验证通过 | 中英文、主题、键盘完整矩阵及最终文档汇总 |
|
||||
|
||||
### 真实 Host
|
||||
|
||||
原始证据:`C:/Users/jiang/AppData/Local/Temp/opencode/unified-execution-host/validation.md`。基于并发工作树,用 esbuild 重建 Desktop driver、Agent daemon 与 CLI/helper,连接共享 Linux x64 Host,在专用目录测试;上游 OpenCode/Continue 工件使用 Host 已安装版本。这是源码开发验证,不是签名包或发布验证。
|
||||
|
||||
| 场景 | 真实模型调用 | 实际结果 |
|
||||
| --- | ---: | --- |
|
||||
| OpenCode 无模式请求及进程重建后的原生历史 | 2 | 通过 |
|
||||
| Continue 无模式请求及进程重建后的历史 | 2 | helper 原生模式修正前通过 |
|
||||
| OpenCode 原生工具、detach、controller 恢复、测试 Agent 提升及重放 | 2 | 通过 |
|
||||
| Continue 取消及新请求 | 2 | helper 原生模式修正前通过 |
|
||||
| Continue 原生工具/detach 首次尝试 | 1 | 失败:没有 running tool 事件,helper 选择了原生 chat/`--readonly` |
|
||||
| Continue 原生工具、detach、controller 恢复、测试 Agent 提升及重放 | 2 | helper 改为原生 agent 后通过 |
|
||||
| Continue 取消及新请求 | 2 | helper 改为原生 agent 后通过 |
|
||||
|
||||
共 13 次真实模型调用,每次运行关闭后所属残留进程均为 0。真实图片提供商调用为 0;图片绑定、生成与保存仅由受控提供商测试覆盖。结构化提问由远程测试及既有原生二进制探针覆盖,没有真实 Host 提供商提问场景的结论。
|
||||
|
||||
最终远程回归命令:
|
||||
|
||||
```text
|
||||
npx vitest run src/agent-daemon src/main/remote-agent src/main/agent/acp-remote-runtime.test.ts src/shared/remote-agent-contracts.test.ts src/shared/remote-runtime-launch-contracts.test.ts src/shared/agent-protocol --testTimeout=30000 --hookTimeout=60000
|
||||
```
|
||||
|
||||
66 个文件通过、2 个跳过;723 项通过、33 项跳过。helper 最终修改后的局部 ESLint 通过。原始记录当时报告全仓 lint 通过,但 typecheck 仍被并发调用方和夹具阻塞,Agent-only 检查剩余 `DirectModelSubagentParent.workMode` 错误;这保留为当时结果,不作为最终聚合检查结论。
|
||||
|
||||
### 真实 Electron
|
||||
|
||||
实施方提供的通过结果与 [unified-execution-main.ts](../../../tests/support/unified-execution-main.ts) 对应:生产 App、preload、IPC、设置和 SQLite,隔离无关启动服务。种子消息证明首次点击不删除、取消保留、确认经生产 IPC 删除且重载后仍删除;同时检查输入区及项目表单无模式控件、安全分类消失、入口属于 General / Platform Features,模型请求为 0。该证据不等于完整启动服务或全部 UI 场景验收。
|
||||
|
||||
### 现行文档
|
||||
|
||||
根 README、双语 FEATURES、BUILD、UI-DESIGN、运行时约定与受影响功能 Markdown 已同步无模式规则。规划功能仍保持规划状态;历史发布、原型及日期明确的验证段保留当时结果。`sites/index.html` 和 `sites/en.html` 仍有双模式产品文案与示意,属于本轮未修改的站点源码,发布前需同步。
|
||||
|
||||
## 调研阶段验证边界
|
||||
|
||||
本轮没有执行产品迁移,没有读取真实用户数据库或 Agent 日志,没有启动 Runtime、调用模型/图片提供商,也没有连接测试 Host。调用次数为 0。源码阅读证明依赖存在,不证明升级或执行已通过。
|
||||
|
||||
仍需实际取证:旧 `runs` JSON 形状、Agent 不透明事件中的应用自有字段、旧远程操作跨升级恢复,以及外部委派服务兼容性。不得用递归删字段或清空日志回避这些问题。
|
||||
|
||||
## 调研阶段文档检查记录
|
||||
|
||||
已对九份文档进行交叉审查,核对范围、需求与故事映射、源码引用、相对链接和当前状态表述。审查发现的独立授权验收缺项、原生设置范围歧义和起草阶段备注已修正。
|
||||
|
||||
`deai-writing` 扫描九份文档,阻断项为 0。复核项主要为未验证状态、数据保留条件和字段枚举;结合技术文档语境保留这些限定,不将迁移计划改写为已完成事实。
|
||||
|
||||
`git diff --check -- docs/features/unified-execution docs/features/assistant-workbar/README.md` 通过已跟踪改动的空白检查。新建文档另经内容与链接核对;该命令不会把未跟踪文件当作已验证差异。文档检查不替代运行时验收,后者按用户故事与技术设计执行。
|
||||
@@ -0,0 +1,222 @@
|
||||
# 统一执行:Ask/Execute 源码审计
|
||||
|
||||
研究日期:2026-10-04。研究对象:当前含未提交修改的工作树。
|
||||
|
||||
## 研究范围与证据
|
||||
|
||||
本文记录产品工作模式的源码落点、移除时必须联动的接口,以及尚未解决的支持缺口。
|
||||
审计覆盖 Main、Renderer、共享合同、受管 Runtime、原生客户端、Agent daemon、启动器与模型桥。
|
||||
依据为调研时的源码阅读、符号搜索、依赖版本及已有测试文件;调研阶段未实施模式移除,未运行产品测试、真实模型请求或远程 Host 验证。后续实施已启动,下文源码行为是调研基线,不能当作最终实现或验证结论。
|
||||
工作树中的既有修改属于本次研究基线,不能将本文描述直接归属于某个发布版本或干净提交。
|
||||
文件链接用于定位实现;函数名和行为比易变的行号更适合作为后续核对依据。
|
||||
|
||||
目标是移除 GoodBuddy 自有 Ask/Execute 及其隐含工具限制,由已启用、已分配的能力设置决定工具接入。
|
||||
不得用固定 Execute、改名后的工作模式或另一份硬编码工具白名单代替移除。
|
||||
用户已追加授权删除“安全”设置分类和 `toolApproval` 策略,包括一般工具审批等待;清除本地数据移到通用设置并保留确认。上传许可、覆盖选项和原生结构化提问仍按业务合同处理,现有不支持的 Runtime 能力不因此补齐。
|
||||
本报告不提出新权限框架,不承诺新增原生逐工具开关。
|
||||
|
||||
文档分工:[prd.md](./prd.md) 定义范围,[technical-design.md](./technical-design.md) 定义方案,[progress.md](./progress.md) 记录实施证据。
|
||||
UI 细节归 [ui-design.md](./ui-design.md),主数据迁移归 [data-migration.md](./data-migration.md);本文仅给出源码交接点。
|
||||
下文保留移除前的源码调研基线;当前主要改造、schema 60、设置 22、runtime/acp 6 和 Harness 协议 2 的实现及验证证据见进度,不能把旧符号或版本当作现行合同。
|
||||
|
||||
## 设置覆盖与未决问题
|
||||
|
||||
| 入口 | 已有源码行为 | 审计判断 |
|
||||
| --- | --- | --- |
|
||||
| [CapabilityService](../../../src/main/capabilities/capability-service.ts) | `getResolvedMcpServers` 按 enabled、assignments 取自定义 MCP;`getEnabledBuiltinMcpServerIds` 处理内置服务 | 服务启用及 Runtime 分配是现有接入依据 |
|
||||
| [capability-contracts](../../../src/shared/capability-contracts.ts) | 内置服务、Skills、自定义 MCP 有开关或分配合同 | 不等价于每个原生工具都有设置 |
|
||||
| [McpSettingsSection](../../../src/renderer/src/McpSettingsSection.tsx) | Web 有开关;filesystem/programming 分组主要展示工具说明 | 展示清单不能算原生逐工具控制 |
|
||||
| [CapabilitiesAndToolsSettingsSection](../../../src/renderer/src/CapabilitiesAndToolsSettingsSection.tsx) | tools 页签进入工具环境配置 | 环境选择不构成工具授权开关 |
|
||||
| [builtin-mcp-servers](../../../src/shared/builtin-mcp-servers.ts) | knowledge、notes、config、browser、Obsidian、Story Graph 声明支持的 Runtime | 必须保留真实支持范围,不能统一标成可用 |
|
||||
|
||||
原生工具没有统一逐项设置映射,这是当前设置粒度。此次沿用 Runtime 正常能力,不新增逐工具开关,也不以其作为移除模式的前置条件。
|
||||
实现评审需要区分已有服务开关、Runtime 自带工具和动态扩展工具,不能声称 MCP 设置已经覆盖后两类。
|
||||
工具目录是否展示、调用是否执行是两个检查点;只改变模型可见目录会遗漏直接调用及旧会话路径。
|
||||
能力 token、请求归属和当前设置检查各有职责,源码中存在这些机制不证明跨路径设置行为已经验证。
|
||||
|
||||
## 本机受管 Runtime 与原生工具
|
||||
|
||||
### 公共包装层
|
||||
|
||||
[runtime.ts](../../../src/main/agent/runtime.ts) 的 `AgentExecutionRequest` 携带 `workMode`;`RuntimeAuthorizer` 是另一个合同。
|
||||
[runtime-controller.ts](../../../src/main/agent/runtime-controller.ts) 的 `run` 用 Execute 计算 `toolsAllowed`,Ask 注入固定拒绝的 authorizer。
|
||||
同一函数还有 `requiresToolApproval` 的整轮审批和 `supportsToolExecution` 检查;应分别辨认模式依赖与真实能力限制。
|
||||
[create-runtime.ts](../../../src/main/agent/create-runtime.ts) 构造各 Runtime、工具提供者及无工具模型实例,是能力来源的核对入口。
|
||||
|
||||
### OpenCode
|
||||
|
||||
[opencode-runtime.ts](../../../src/main/agent/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](../../../src/main/agent/continue-runtime.ts) 的 `run` 计算 `execute`,据此绑定图片、自定义 MCP,并选择 adapter 的 agent/chat。
|
||||
其 authorizer 允许 Execute,或 Ask 中特定 scoped read 工具;这与工具目录过滤是两层限制。
|
||||
[continue-host-adapter.ts](../../../src/main/agent/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](../../../src/main/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](../../../src/main/agent/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](../../../src/main/agent/deepseek-harness-runtime.ts) 的 `boundedProxyToolCatalog`、`handlePermission`、`GOODBUDDY_TOOLS_LIST/CALL` 有额外模式限制。
|
||||
Main 代理中的 Web/Story Graph、自定义 MCP 和图片需分别核对,保留活动请求及参数校验。
|
||||
插件初始化和安装脚本不经过模型 `tools/execute`;模式移除不能被描述成新增或取消 OS 沙箱。
|
||||
|
||||
## 直连模型工具提供者
|
||||
|
||||
[builtin-model-tools.ts](../../../src/shared/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](../../../src/main/agent/model-tool-provider.ts) 的 `assertToolAuthorizedForWorkMode` 同时被 `getApproval` 与 `callTool` 调用。
|
||||
`getScopedTools`、`getProcessTool`、`listTools` 按模式过滤写入、进程、浏览器、自定义 MCP 和图片;进程调用分支另查 Execute。
|
||||
[model-runtime.ts](../../../src/main/agent/model-runtime.ts) 的工具循环对 Ask 文件读取、scoped read、Web、委派有免 authorizer 分支,其他调用走审批回调。
|
||||
`run` 还根据 mode 选择工具循环或普通文本请求;应保留由 `noModelTools` 表达的内部无工具用途。
|
||||
[direct-model-ripgrep.ts](../../../src/main/agent/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](../../../src/main/agent/direct-model-process-service.ts) 管理进程、cwd、输出保留和退出清理,不是工作模式入口。
|
||||
`workspace_read_text` 与 `workspace_apply_patch` 的工作区相对路径合同仍是这些 API 的语义,不能因移除 Ask 自动扩大范围。
|
||||
远程 workspace 下 provider 当前只保留文件读取;本机进程检查 execution identity。移除模式不会补出远程直连 Shell 或 patch。
|
||||
|
||||
## MCP、应用配置与图片
|
||||
|
||||
[ipc.ts](../../../src/main/ipc.ts) 的 `grantScopedDataCapability` 按 enabledServers 授予知识、笔记、配置、浏览器、Obsidian 和 Story Graph。
|
||||
交互与调度调用者仍按 workMode 生成 configAccess、magicNotesAccess、browserAccess、Obsidian access,需一起审查。
|
||||
[knowledge-mcp-gateway.ts](../../../src/main/agent/knowledge-mcp-gateway.ts) 维护请求能力与调用范围;不能把移除模式理解成取消知识库选择或会话归属。
|
||||
[goodbuddy-config-tools.ts](../../../src/shared/goodbuddy-config-tools.ts) 有 Execute 专用描述;[goodbuddy-config-service.ts](../../../src/main/goodbuddy-config-service.ts) 的计划有效期、单次应用及部分失败语义独立保留。
|
||||
自定义 MCP 的 enabled/assignments、服务实际工具目录与动态工具选项仍需按原合同处理,`readOnlyHint` 不应成为新模式替代物。
|
||||
Web 的 Exa 工具绑定检查及 MCP annotations 属于提供者合同,不能全局删除包含 readOnly 的字段。
|
||||
|
||||
[image-generation-service.ts](../../../src/main/agent/image-generation-service.ts) 的 `bind`、describe、save、`regenerate`、`submit` 检查绑定 mode 和实时 mode 回调。
|
||||
[image-tool-binding.ts](../../../src/main/agent/image-tool-binding.ts) 与 [image-generation-contracts.ts](../../../src/shared/image-generation-contracts.ts) 也携带模式依赖。
|
||||
[protocol-remote-runtime-channel.ts](../../../src/main/remote-agent/protocol-remote-runtime-channel.ts) 仅为 Execute 发送图片说明。
|
||||
[main-image-tool-session.ts](../../../src/main/remote-agent/main-image-tool-session.ts) 在远程生成和保存请求再次检查模式,Agent backend 与 OpenCode 插件还有下游检查。
|
||||
移除时仍需保留图片模型会话访问设置、输入能力、制品归属、内联数据限额、覆盖文件规则及 Host 写入位置。
|
||||
配置检测成功不能证明生成成功;本报告未执行图片生成。
|
||||
|
||||
## 原生客户端与生成包装代码
|
||||
|
||||
[native-client-coordinator.ts](../../../src/main/agent/native-client-coordinator.ts) 从项目/会话推导 mode,将其计入配置身份,并改变能力读写范围及自定义 MCP 接入。
|
||||
其 `launch` 明确要求 local execution space;不能将远程 Runtime 支持表述成远程原生客户端已可启动。
|
||||
[native-terminal-client.ts](../../../src/main/agent/native-terminal-client.ts) 内有 OpenCode/Continue 固定只读工具集合。
|
||||
该文件给 Continue bundle 注入执行拦截,并选择 `--auto` 或 `--readonly --allow ... --exclude '*'`。
|
||||
OpenCode 路径生成 `tool.execute.before` 插件及 build/plan permission 配置;原生终端不经过聊天页的全部包装逻辑。
|
||||
[native-dsh-web-policy.ts](../../../src/main/agent/native-dsh-web-policy.ts) 生成 `goodbuddy-native-mode`,在 `tools/execute` 检查 mode 和 readOnlyTools,覆盖委派 agent。
|
||||
[native-dsh-web-client.ts](../../../src/main/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](../../../src/main/agent/acp-remote-runtime.ts) | ActivePrompt、prepare 输入、`handlePermission`、按 Execute 传 authorizer |
|
||||
| [remote-agent-contracts](../../../src/shared/remote-agent-contracts.ts) | preparation/acceptance 必填 workMode,`assertRemotePromptAcceptanceMatchesPreparation` 比对模式 |
|
||||
| [remote-runtime-launch-contracts](../../../src/shared/remote-runtime-launch-contracts.ts) | Runtime 启动合同携带 workMode |
|
||||
| [runtime-acp-backend](../../../src/agent-daemon/runtime-acp-backend.ts) | binding mode、图片限制、独占进程模式不可变检查、prepare/acceptance、启动传递 |
|
||||
| [agent-owned-acp-prompt](../../../src/agent-daemon/agent-owned-acp-prompt.ts) | `start`、`prepareSession`、活动 mode、`#handlePermission` |
|
||||
| [agent-acp-connection](../../../src/agent-daemon/agent-acp-connection.ts) | `setModelRoute` 传 session/operation/mode |
|
||||
| [model-bridge-helper](../../../src/agent-daemon/model-bridge-helper.ts) | session route mode 校验、共享会话 Ask 默认值、OpenCode provider permission |
|
||||
| [opencode-runtime-profile](../../../src/agent-daemon/opencode-runtime-profile.ts) | mode 生成 permission、Continue helper 的 `--work-mode` |
|
||||
| [continue-acp-helper](../../../src/agent-daemon/continue-acp-helper.ts) | 路由或默认 mode、Execute/Story Graph 放行;下层仍复用 ContinueHostAdapter |
|
||||
| [opencode-subagent-plugin](../../../src/agent-daemon/opencode-subagent-plugin.ts) | `chat.message` 设置父子 Session 权限、原生只读列表与图片模式限制 |
|
||||
| [cli](../../../src/agent-daemon/cli.ts) | 必填 `--work-mode` 参数及 ask/execute 值校验 |
|
||||
| [runtime-composition](../../../src/agent-daemon/runtime-composition.ts)、[process owner](../../../src/agent-daemon/direct-linux-stdio-process-owner.ts) | 将 launch/profile mode 传到真实启动路径 |
|
||||
|
||||
桌面 ACP Ask 回调仅放行 read;Agent-owned 回调放行 read/search,说明两处已有不同规则。
|
||||
OpenCode 插件注明原生 ACP 仅转发已注册根 Session 的权限;子代理必须检查原生 Session 规则,不能只改根回调。
|
||||
请求级图片端点隔离、子会话归属和撤销清理有独立用途,不能连同模式条件删除。
|
||||
远程通用自定义/内置 MCP 分配尚未与本机路径等价;图片和 Story Graph 专门通道不能证明任意 MCP 可用。
|
||||
[remote-runtime-lock.json](../../../remote-runtime-lock.json) 仅列 OpenCode、Continue;远程 DSH 和远程原生客户端缺口不会随模式移除解决。
|
||||
[workspace-protocol-methods.ts](../../../src/agent-daemon/workspace-protocol-methods.ts) 的部分写入 API 当前返回只读服务不可用,这是服务支持限制。
|
||||
|
||||
## 工具审批移除与子任务
|
||||
|
||||
[ipc.ts](../../../src/main/ipc.ts) 交互直连 authorizer 对 `toolApproval === 'policy'` 拒绝,其他值自动允许;普通 Agent 路径不传通用 authorizer。
|
||||
调度路径另有 Ask 拒绝、delegation 拒绝、Harness 自动允许、channel 策略,以及进入 `ToolApprovalBroker` 的分支。
|
||||
调研时的 `src/main/tool-approval-broker.ts` 管理等待、session grant、超时和事件;该文件现已删除。用户追加授权后,一般工具审批的等待、授权状态、事件和回应入口均纳入删除范围。任务取消、超时和原生结构化问题仍需保留。
|
||||
[contracts.ts](../../../src/shared/contracts.ts) 的 toolApproval 值为 always/session/workspace/policy;[runtime-settings-store.ts](../../../src/main/runtime-settings-store.ts) 单独持久化。
|
||||
该持久化需从审计版本 21 升至下一可用版本并删除顶层字段,规则见[数据迁移](./data-migration.md#5-agent协议和设置)。不能保留为独立策略或固定自动允许值。
|
||||
直连读取、Web 和委派存在绕过通用 authorizer 的分支,因此现有 policy 也不能直接称为全工具关闭开关。
|
||||
[continue-permissions.ts](../../../src/main/agent/continue-permissions.ts) 的 ask 是上游 YAML 权限字段;审计未找到生产导入,需按真实引用判断。
|
||||
[computer-control/broker.ts](../../../src/main/computer-control/broker.ts) 与 risk-policy 是另一套机制;搜索未发现生产构造调用,不能据此认定浏览器有同样审批。
|
||||
|
||||
[direct-model-subagent-service.ts](../../../src/main/assistant/direct-model-subagent-service.ts) 与 provider/model-runtime 传播父 mode;应检查能力继承、输出归属和取消。
|
||||
[subagent-service.ts](../../../src/main/assistant/subagent-service.ts) 专家/团队继承 mode 和 authorizer;`synthesize` 明确为无工具综合用途。
|
||||
App 的 `supportsSubagentSmartRouting` 与 IPC 的路由分支仅允许 Ask,属于产品模式耦合。
|
||||
[supervision-production.ts](../../../src/main/assistant/supervision-production.ts)、[magic-note-analyzer.ts](../../../src/main/magic-notes/magic-note-analyzer.ts) 等内部请求写死 Ask。
|
||||
删除这些字段时,应核对其无工具 provider 和用途限制;不能把内部摘要、监督、笔记分析默认升级为通用工具任务。
|
||||
|
||||
## 外部合同与版本
|
||||
|
||||
| 合同 | 当前证据 | 兼容性关注 |
|
||||
| --- | --- | --- |
|
||||
| Desktop / Agent | [package.json](../../../package.json) 0.15.10;[agent-runtime-lock](../../../agent-runtime-lock.json) Agent 0.15.3 | 发布号不等于每个未提交实现已经发布 |
|
||||
| Agent wire | [agent-protocol/contracts](../../../src/shared/agent-protocol/contracts.ts) 2.0 | 与 Runtime capability 版本分开处理 |
|
||||
| Runtime ACP capability | [control-contracts](../../../src/shared/agent-protocol/control-contracts.ts) `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](../../../src/main/agent/deepseek-harness-protocol.ts) 1 | `goodbuddy/session/prepare` 当前必需 mode;握手精确校验 |
|
||||
| Harness utility 控制 | [deepseek-harness-control-protocol](../../../src/main/agent/deepseek-harness-control-protocol.ts) 3 | 与 ACP 扩展版本不同,按实际变更合同判断 |
|
||||
| 模型桥 | [model-bridge-contracts](../../../src/shared/model-bridge-contracts.ts) 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](../../../src/shared/assistant-contracts.ts) 的 WorkMode 系列、项目默认值、请求/任务/调度字段,以及 [channel-contracts.ts](../../../src/shared/channel-contracts.ts) 的 literal ask 需同步处理。
|
||||
[remote-channel-routing.ts](../../../src/main/channels/remote-channel-routing.ts) 识别 /ask、/execute、/exec 和中文前缀;WeChat/WeCom/DingTalk driver 也注入 Ask。
|
||||
[context-manager.ts](../../../src/main/context-manager.ts) 和 [runtime-conversation-history.ts](../../../src/main/agent/runtime-conversation-history.ts) 传播或剥离历史模式指令。
|
||||
主存储交接为 [assistant-database.ts](../../../src/main/assistant/assistant-database.ts)、conversation-persistence、conversation-selectors:SQL 列、模板 JSON、导入导出和旧值归一化另行审计。
|
||||
Agent 的 BindingState、活动 prompt、model route 在内存保留 mode;生成配置、启动参数和 [diagnostic-log.ts](../../../src/agent-daemon/diagnostic-log.ts) 也承载它。
|
||||
[semantic-prompt-store.ts](../../../src/agent-daemon/semantic-prompt-store.ts) 没有专用 work_mode 列,但 preparation digest 间接包含模式,permission-decision 写入 transcript。
|
||||
[runtime-owner-registry.ts](../../../src/agent-daemon/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、模式和安全设置文案及验证脚本需按最终实现与验证更新。跨功能入口暂以目标设计标注;历史发布记录保留其当时语义。
|
||||
@@ -0,0 +1,113 @@
|
||||
# 技术设计
|
||||
|
||||
状态:主要源码改造已落地,完整验证待完成。规则见[PRD](./prd.md)与[执行规则](./logic-design.md),调研基线见[源码调研](./source-audit.md),字段级转换见[数据迁移](./data-migration.md),实际证据见[进度](./progress.md)。
|
||||
|
||||
## 结构调整
|
||||
|
||||
正常调用保留现有 Renderer → IPC → Runtime → 工具执行链路,删除各层携带的产品工作模式。无需新增权限服务、策略框架或持久化状态。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[对话、队列、日程、通道] --> B[Runtime、模型、执行空间与上下文]
|
||||
C[已启用能力与 Runtime 分配] --> D[实际工具目录]
|
||||
B --> E[Runtime 执行]
|
||||
D --> E
|
||||
E --> F[原生工具、MCP、图片与子代理]
|
||||
G[专用内部文本调用] --> H[无工具模型实例]
|
||||
```
|
||||
|
||||
图中表示当前源码结构。模型和 Runtime 的真实能力限制、能力启用与分配、工具业务校验仍在原有实现中处理;产品 `toolApproval` 策略与一般工具审批等待已移除。
|
||||
|
||||
## 合同与调用边界
|
||||
|
||||
删除 `WorkMode`、`InteractiveWorkMode`、生产使用的 `LegacyWorkMode`、`normalizeInteractiveWorkMode` 及请求/结果中的模式字段。迁移模块可以识别历史键和值,但不得让兼容类型继续进入新执行请求。
|
||||
|
||||
同步修改 `assistant-contracts`、`contracts`、`runtime`、`image-generation-contracts`、`channel-contracts`、`remote-project-candidate-contracts`、`remote-runtime-launch-contracts` 和 `remote-agent-contracts`。原生清单的 `ask/execute` 属性以及能力说明中的 `availableIn` 模式数组一并删除。
|
||||
|
||||
IPC、preload 类型、Renderer 事件、任务投影、队列输入、子代理活动和恢复入口必须使用同一无模式形状。不能依赖 Zod 自动剥离字段代替实际持久化清理;严格 schema 的切换顺序须配合升级。
|
||||
|
||||
按 L-5 和 US-17 删除 `toolApproval` 的共享合同、默认值、设置读写、IPC 更新字段和各来源拒绝分支。移除一般工具审批的 Broker 等待、事件、回应入口与界面引用;保留原生权限协议的合法回应、结构化提问、取消和超时。不得把旧策略改成常驻的自动允许字段。
|
||||
|
||||
`stripWorkModeInstruction` 已删除,新请求不注入模式提示词。历史回放保留用户正文,不以任意正文以 `Work mode:` 开头为依据删除内容;既有不可信历史信封仍按完整格式解析。
|
||||
|
||||
## Runtime 实施清单
|
||||
|
||||
| 模块 | 必做调整 | 需保留的机制 |
|
||||
| --- | --- | --- |
|
||||
| Controller / Model | 删除 Ask deny authorizer、工具循环模式条件、目录和调用双重检查;删除 `rg` 的 Ask 参数解析 | 纯文本实例、工具注册身份、输出分页、取消、进程清理、工作区 API 语义 |
|
||||
| OpenCode | 删除模式权限模板、Ask tool override、MCP/图片注册模式条件和 Ask 回应分支 | 运行时会话隔离、临时 MCP 生命周期、问题与权限协议的合法回应 |
|
||||
| Continue | 删除产品模式参数、只读名单、模式选择 argv 和 MCP 拒绝分支;核对原生配置合并 | 与固定上游版本有关的其他补丁、Windows 处理、结构化问题、工具配置 |
|
||||
| Harness | 删除 host 的 trusted Ask 定义、控制面的 Ask 工具钩子、prepare 模式及 ACP 模式宣告 | 工具实际注册、插件、请求归属、工具事件与输出回传 |
|
||||
| 原生客户端 | 删除模式参与的启动身份、Continue 注入限制、OpenCode/DS Web 模式插件 | 用户历史目录、资源回收、独立上游配置和必要启动适配 |
|
||||
| 内置 MCP / 图片 | 调整权限发放入口;移除图片服务及绑定的模式字段、回调、拒绝和描述隐藏 | 启用和分配、资源范围、模型配置、计划有效性、图片引用与保存语义 |
|
||||
| 子代理与内部任务 | 删除继承及 Ask-only 智能路由条件;内部分析使用无工具实例 | 已有路由开关、能力上下文、专家/团队、摘要和监督者无工具性质 |
|
||||
| 调度 / 通道 / 委派 | 删除模式、`toolApproval` 策略、一般工具审批等待及委派固定拒绝,不再识别模式前缀 | 时间计划、来源身份、队列顺序、业务许可和结果投递 |
|
||||
|
||||
原生工具没有通用逐工具开关,不能把新增设置系统作为移除前提。Continue `chat/agent`、OpenCode 原生 agent 类型、上游权限 `ask` 和文件权限 `mode` 按各自含义保留;仅删除它们与 GoodBuddy 工作模式的耦合。
|
||||
|
||||
## 远程协议与升级
|
||||
|
||||
Agent wire 保持 2.0,`runtime/acp` capability 已从 5 升至 6;prepare、acceptance 和 launch 不再含 `workMode`,使用既有精确版本协商拒绝旧端。本地 Harness 控制扩展由 1 升至 2,Utility 启动控制协议仍为 3,两者不混用。
|
||||
|
||||
Desktop、Agent、CLI、runtime profile、model bridge 路由、Continue helper、OpenCode 子会话插件必须同批更新。删除 `--work-mode`、模式相关进程冲突与路由字段,并重建受影响的受管包。当前源码版本与包锁版本不可混用作为验收证据。
|
||||
|
||||
旧 Agent 必须在提交新任务前被识别并提示更新,不能失败后补 `execute` 再投递。对于旧版已接受任务,保持 operation ID、prepare/start digest、事件序号和 ACK;使用已有状态查询、恢复与升级流程,不自动重发请求。若新合同不能恢复某种旧会话,必须报告明确状态,并在发布前给出已验证的处理路径。
|
||||
|
||||
远程 `semantic-prompt` 存储没有完整 preparation 对象,无法根据删字段后的请求重建旧摘要。字段迁移与摘要比较的关系见数据迁移。当前通用远程 MCP 转发缺口独立记录,不将模式删除描述为新增远程支持。
|
||||
|
||||
外部 `/goodbuddy/tasks/next` 委派入口接受无模式形状,也接受并丢弃旧 `ask/plan/execute` 字段;向内部只传无模式对象。新输出不发送模式,外部服务兼容性仍需验收。这个兼容入口不决定工具权限。
|
||||
|
||||
## 历史升级执行顺序
|
||||
|
||||
1. 先修改新写入形状与读取投影,建立旧字段转换测试。
|
||||
2. 在现有启动 Worker 中执行版本升级;业务连接、恢复、队列和日程不得先读取未转换记录。
|
||||
3. 保留已发布迁移链,schema 60 追加字段移除迁移。Runtime 设置 22 定向删除顶层 `toolApproval`,两类升级各自执行。
|
||||
4. 清理 localStorage 导入、旧队列解析和远程事件归一化,避免升级后写回旧字段。
|
||||
5. 新库和真实旧库副本走同一产品启动路径验收;不默认执行全库 `VACUUM`。
|
||||
|
||||
迁移不能通过重新序列化为窄 schema 丢弃其他元数据;不新增迁移日志框架或持久化恢复凭证。
|
||||
|
||||
## 实施阶段
|
||||
|
||||
| 阶段 | 内容 | 进入下一阶段的证据 |
|
||||
| --- | --- | --- |
|
||||
| P1 | 合同、状态、数据库与 Runtime 设置迁移 | 新写入无模式及 `toolApproval`,旧数据转换可重复,字段外内容与身份不变 |
|
||||
| P2 | Controller、各本地 Runtime、工具与内部任务 | 生产调用链不依赖模式;正常工具任务与内部无工具任务均通过 |
|
||||
| P3 | 原生客户端、子代理、队列、日程、通道和委派 | 启动配置及各来源实际可用,取消/恢复不回退旧逻辑 |
|
||||
| P4 | Desktop-Agent 协议、辅助程序与受管包 | 兼容性协商及真实 Host 的当前源码路径通过 |
|
||||
| P5 | UI、文案、当前规范及发布说明 | 无模式和安全分类,通用设置可确认或取消清除数据,中英文界面与迁移验收完成 |
|
||||
|
||||
阶段可在开发中交叉推进,最终必须一起交付;不能发布仅删除界面而后端仍依赖模式的中间状态。
|
||||
|
||||
## 验证矩阵
|
||||
|
||||
| 层次 | 验证内容 | 证据形式 |
|
||||
| --- | --- | --- |
|
||||
| 静态清点 | 字段、模式分支、默认值、CLI、生成插件、提示词与 i18n | 对每个剩余搜索命中说明其为历史迁移或无关语义 |
|
||||
| 存储 | 新库、schema 59、较早已发布库、重复启动、失败与恢复、远程重放 | 产品 Worker 升级、内容比较、完整性检查与计时 |
|
||||
| 设置 | Runtime 设置 21 及更早支持版本、全部旧策略值、保存与重启 | 新版本落盘无 `toolApproval`,其他设置及加密凭据字节保留;历史必填字段不新增缺省策略 |
|
||||
| 工具 | 原生各工具组、启用/关闭 MCP、图片生成保存、业务错误 | 真实入口调用结果;关闭服务不能被伪造调用绕过 |
|
||||
| Runtime | Model、OC、CN、DSH、各原生客户端及其子任务 | 聚焦测试加生产路径验证,包含动态插件工具 |
|
||||
| 请求来源 | 对话、恢复队列、定时、通道、委派、内部分析 | 无旧策略拒绝或一般审批等待,任务身份与结果一致,内部分析没有工具 |
|
||||
| 远程 | 兼容/不兼容版本、OpenCode/Continue、断开恢复、停止与重启 | 共享 Linux x64 Host 上的当前源码或开发包验证 |
|
||||
| UI | 各删除面、键盘、窄窗口、浅深主题和中英文 | 真实 Electron 验收及组件回归 |
|
||||
|
||||
完成代码改造后运行 `npm test`、`npm run typecheck`、`npm run lint`。构建、真实模型和 Agent 验证遵循仓库开发规则;记录实际请求数,不把已有单测或配置检查写成端到端通过。图片提供商调用与纯文本模型验证分开记录。
|
||||
|
||||
## 文档同步清单
|
||||
|
||||
根运行时约定及下列 Markdown 现行规范已按无模式源码更新。日期明确的历史记录保留原状;尚未实现的功能仍标为规划,完整测试与发布包验证不因文档同步而视为通过。站点 HTML 不属于本次文档修改范围,其中旧模式文案仍需源码维护方同步。
|
||||
|
||||
| 文档范围 | 更新内容 |
|
||||
| --- | --- |
|
||||
| 根 `AGENTS.md`、`UI-DESIGN.md` | 删除 Ask 只读、Execute 授权与选择器规范;删除安全分类,将清除数据放入通用设置;保留 OS、生命周期和发布规则 |
|
||||
| 根 README、FEATURES 中英文、`BUILD.md`、站点 | 能力介绍、启动与升级说明 |
|
||||
| assistant-workbar、direct-model-agent、deepseek-harness、remote-host | 执行、原生客户端、合同、权限协议和真实验证 |
|
||||
| task-and-job、wechat-channel、telegram-channel | 任务字段、日程继承、旧命令和未来通道需求 |
|
||||
| conversation-media-generation、computer-control、obsidian、magic-notes、conversation-supervision | 模式依赖、业务范围与内部无工具任务 |
|
||||
| device-sharing 与跨功能架构 | 已有委派合同;不扩大设备共享的当前实现范围 |
|
||||
| local-tool-environment、application-tool-navigation、知识与文档类功能 | 引用旧模式的设置说明与功能条件 |
|
||||
| desktop-pet、office-document-editing、full-duplex-voice、路线图 | 尚未实施方案中的旧模式依赖 |
|
||||
| 开发验证脚本与发布手册 | 模式参数、旧验收场景和 Agent 兼容步骤 |
|
||||
|
||||
旧发布说明、日期明确的测试记录和审查报告保留当时事实,通过新版说明建立替代关系,不伪造过去的验证结果。
|
||||
@@ -0,0 +1,56 @@
|
||||
# 界面设计
|
||||
|
||||
状态:源码已落地,真实 Electron 定向验收通过;其余界面矩阵见[进度](./progress.md)。对应 FR-1、FR-2、FR-7、FR-8、FR-10,验收 US-01、US-02、US-07、US-14、US-17。
|
||||
|
||||
遵循根目录 [UI-DESIGN.md](../../../UI-DESIGN.md) 的布局、令牌、共享控件、主题和无障碍规则,不另建视觉体系。
|
||||
|
||||
## 删除清单
|
||||
|
||||
| 界面 | 当前来源 | 调整 |
|
||||
| --- | --- | --- |
|
||||
| 会话输入区 | [Composer](../../../src/renderer/src/Composer.tsx)、[App](../../../src/renderer/src/App.tsx) | 删除模式选择器、图标、菜单状态、选项和事件;剩余控件自然排列 |
|
||||
| 本地及 SSH 项目表单 | [ProjectSwitcher](../../../src/renderer/src/ProjectSwitcher.tsx);原 `ProjectWorkModeFields` 已删除 | 删除模式字段、分段控件、草稿默认值和说明;保留 Runtime 与执行空间 |
|
||||
| 通道项目设置 | [ChannelProjectSettingsFields](../../../src/renderer/src/ChannelProjectSettingsFields.tsx)、[ChannelSettingsSection](../../../src/renderer/src/ChannelSettingsSection.tsx) | 删除默认模式、前缀覆盖帮助及模式相关说明 |
|
||||
| 会话任务与任务详情 | [ConversationTaskStrip](../../../src/renderer/src/ConversationTaskStrip.tsx)、[RightAssistantSidebar](../../../src/renderer/src/RightAssistantSidebar.tsx)、[ConversationHistorySlot](../../../src/renderer/src/ConversationHistorySlot.tsx) | 删除模式字段与继承/不可用兜底,保留状态、日程、运行时间和 Runtime |
|
||||
| 子代理消息与活动 | [ChatTimeline](../../../src/renderer/src/ChatTimeline.tsx)、[agent-event-handler](../../../src/renderer/src/agent-event-handler.ts) | 不再展示或生成 Ask / Execute 标签;保留专家、路由原因与运行状态 |
|
||||
| 图片能力提示 | [ImageCapabilityNotice](../../../src/renderer/src/ImageCapabilityNotice.tsx) | 删除“切换 Execute”;保留模型未配置、未允许调用、输入不支持等真实原因 |
|
||||
| MCP 设置 | [McpSettingsSection](../../../src/renderer/src/McpSettingsSection.tsx) | 删除 Execute-only 和模式适用范围;只读/写入描述继续作为工具说明 |
|
||||
| 原生工具清单 | [RuntimeCustomizationSection](../../../src/renderer/src/RuntimeCustomizationSection.tsx) | 删除 Ask/Execute 可用性列,保留工具名、来源、描述和真实可用状态 |
|
||||
| 自定义任务 | [CustomTaskDialog](../../../src/renderer/src/CustomTaskDialog.tsx) | 当前已无独立模式选择器;仅需清理“采用会话模式”帮助及关联数据 |
|
||||
| 安全设置与一般工具审批 | 设置中心及工具审批界面 | 删除“安全”分类、`toolApproval` 自动授权/禁止工具选项、说明及一般工具审批等待界面;保留原生结构化提问 |
|
||||
|
||||
辅助清理包括 `composer-menu-store` 的 `mode` 项、`use-composer-actions` 的 `setWorkMode`、会话投影与持久化字段,以及 `.composer-picker--mode/--ask/--execute` 和 `.project-work-mode` 样式。移除整个专用组件前检查其全部引用。
|
||||
|
||||
## 清除本地数据
|
||||
|
||||
按 L-5、US-17,“清除本地数据”位于“通用 > 平台功能”,复用现有卡片、危险操作按钮和二次确认。保留原有清除范围、进行中状态、错误反馈和确认内容;取消确认不清除数据。删除安全分类后,设置导航不得保留空入口或失效焦点。已通过生产 App、preload、IPC 与 SQLite 的种子数据清除、取消及重载定向验证;中英文、键盘和主题完整矩阵仍须按证据记录。
|
||||
|
||||
## 信息与文案
|
||||
|
||||
不保留永久“Execute”徽标,不以“完整权限”“只读聊天”等新选项替代旧选择器。执行空间、所选模型与 Runtime 继续可见。
|
||||
|
||||
推荐基础文案:
|
||||
|
||||
| 场景 | 中文 | English |
|
||||
| --- | --- | --- |
|
||||
| 初次欢迎 | 可以直接提问或交给我任务。可用工具由所选 Runtime 和设置决定。 | Ask a question or give me a task. Available tools depend on the selected Runtime and settings. |
|
||||
| MCP 说明 | 启用并分配后,该服务提供的工具可供对应 Runtime 使用。 | Once enabled and assigned, this server's tools are available to the selected Runtime. |
|
||||
| 旧 Agent | 当前 Agent 版本不兼容,请更新后重试。 | This Agent version is incompatible. Update it and try again. |
|
||||
|
||||
工具结果中保留真实错误,不将权限不足、文件冲突或模型不支持一律改成配置提示。更换文案时同步检查 `app`、`workspace`、`settings`、`integrations` 两种语言以及 Main 中的能力目录说明。
|
||||
|
||||
历史用户消息中出现 Ask / Execute 不隐藏;历史应用徽标按迁移和渲染规则清除。旧发布说明保留版本语境。
|
||||
|
||||
## 键盘与布局
|
||||
|
||||
- 删除模式菜单的焦点目标、快捷引用、ARIA 文本和菜单互斥项,不留空按钮。
|
||||
- Runtime、模型、知识库等剩余菜单继续支持键盘移动、Escape 和关闭后焦点恢复。
|
||||
- 输入区在宽窄窗口和浅深主题下自然回收空间;不增加占位元素维持旧按钮宽度。
|
||||
- 项目和通道表单按既有栅格布局收拢,提交按钮和错误提示位置保持合理。
|
||||
- 设置开关继续使用共享 Switch,删除字段不改变启用或分配的保存行为。
|
||||
|
||||
当前未发现专用 Ask/Execute 键盘快捷键;实施仍应检查引用与原生客户端入口,不能据此略过键盘验收。
|
||||
|
||||
## 设计系统同步
|
||||
|
||||
根 UI 规范已同步任务元数据、菜单互斥、输入区、侧栏任务、任务中心、原生工具清单和清除数据入口。定向 Electron 结果只覆盖已记录场景,完整界面矩阵仍按进度验收。
|
||||
@@ -0,0 +1,31 @@
|
||||
# 用户故事与验收
|
||||
|
||||
以下均为待执行验收,当前状态见[进度](./progress.md)。需求编号对应[产品需求](./prd.md)。
|
||||
|
||||
| 编号 | 场景与前提 | 操作 | 预期结果 | 需求 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| US-01 | 新安装用户已选择可用 Runtime | 创建项目并发送问题,然后要求在测试目录写文件 | 两次请求均无需选择模式;问题正常回答,受支持的工具任务实际完成 | FR-1、FR-2 |
|
||||
| US-02 | 旧项目和会话分别保存 Ask、Execute、Plan 或缺省值 | 升级、打开、继续、分支并重启 | 不出现旧模式;操作行为不随历史值变化;消息和分支关系保留 | FR-4、FR-9 |
|
||||
| US-03 | 用户启用并分配一个有写工具的 MCP 服务 | 调用其读写工具,再关闭或取消分配并发起新请求 | 启用时两类工具可用;关闭后目录不暴露,伪造调用也不能绕过设置 | FR-2、FR-3 |
|
||||
| US-04 | 用户使用 Model 或本地 Agent Runtime | 检索、读文件、修改测试文件、运行有界命令并取消长任务 | 无模式拒绝;执行路径、输出、取消和清理符合对应 Runtime 能力 | FR-2、FR-7 |
|
||||
| US-05 | 已有原生客户端历史和配置 | 从产品入口启动 OpenCode、Continue 或 DS Web,执行一次工具任务,再关闭重开 | 无旧模式插件或只读名单拦截;用户原生历史保留;能力设置变更不会复用过期配置 | FR-6、FR-9 |
|
||||
| US-06 | 本地队列含旧格式待执行消息,日程包含旧模式 | 升级后恢复队列、运行一次定时任务和“立即运行” | 顺序、提示词、附件和任务身份不变;每个计划实例只执行一次 | FR-4、FR-5、FR-9 |
|
||||
| US-07 | 通道项目已绑定账户且发送者符合原有规则 | 发送普通任务和带 `/ask`、`/execute`、中文旧前缀的消息 | 遵循执行规则中的前缀退役方案;不切换权限;正文完整进入正常处理 | FR-5、FR-8 |
|
||||
| US-08 | 图片模型允许会话调用 | 生成、编辑、重新生成并保存到本地或远程测试目录 | 不要求 Execute;目标位置、图片引用、覆盖选项和失败信息仍正确 | FR-2、FR-7 |
|
||||
| US-09 | 启用智能路由或手动选择专家 | 请求适合委派的任务并观察子代理 | 路由由已有设置和任务条件决定;子代理不继承模式,已关闭能力不因委派重新启用 | FR-5、FR-7 |
|
||||
| US-10 | 魔法笔记分析、监督者评审、摘要调用已配置 | 输入会诱导工具调用的测试文本 | 这些内部调用仍不获得工具;正常输出与取消流程可用 | FR-7 |
|
||||
| US-11 | Desktop 与 Agent 均为兼容版本 | 在真实 Linux Host 运行工具任务,并经历断开、恢复和 Agent 重启场景 | 无模式参数;已接受请求不会被静默重发;身份、结果和恢复顺序正确 | FR-6、FR-9 |
|
||||
| US-12 | Desktop 对接旧 Agent 或旧外部委派服务 | 发起新请求或读取待恢复任务 | 兼容性处理符合技术设计;不因缺失模式丢任务,也不偷偷补 `execute` 重试 | FR-5、FR-6 |
|
||||
| US-13 | 旧库包含消息、子代理差量事件和远程事件重复投递 | 在副本执行迁移、模拟失败、再次启动及重复重放 | 仅指定元数据改变;去重比较一致,无冲突误报、重复任务或丢失结果 | FR-4、FR-9 |
|
||||
| US-14 | 中英文、浅深主题及窄窗口 | 使用输入区、项目表单、通道设置、任务详情及原生工具清单 | 无残留选择器、模式文案、空白占位或失效焦点;键盘菜单正常 | FR-1、FR-10 |
|
||||
| US-15 | 所选模型不支持工具,或远程路径没有某项能力 | 发送普通文本请求并检查能力反馈 | 普通文本仍可用;真实能力缺失明确呈现,不退回一个隐藏 Ask 模式 | FR-2、FR-7 |
|
||||
| US-16 | 历史正文、工具 JSON 含业务字段 `mode/workMode` 或单词 Ask/Execute | 升级并导出对比 | 用户内容逐项保留;只删除已确认由产品写入的模式元数据 | FR-4、FR-9 |
|
||||
| US-17 | 旧配置含任意 `toolApproval` 值,且存在交互、通道、调度和外部委派入口 | 升级后执行启用工具,查看通用设置并取消一次数据清除 | 旧策略字段移除且不再拒绝工具;无一般工具审批等待;“安全”分类消失,数据清除及其确认保留;任务取消和超时正常 | FR-2、FR-4、FR-7 |
|
||||
|
||||
## 验收执行要求
|
||||
|
||||
工具调用至少覆盖生产入口到结果保存的链路。原生客户端必须检查实际生成文件与启动行为;远程场景须使用开发中的源码或包,不以已发布 Agent 的成功替代当前实现验证。
|
||||
|
||||
数据库验收使用一致性备份后的副本,并对原始内容、稳定 ID、顺序、时间及远程来源字段做比较。真实图片生成另行记录提供商调用次数;配置检查不能替代生成验收。
|
||||
|
||||
设置变更的生效时点沿用各能力已有生命周期,至少验证下一轮请求和重新启动客户端。当前已接受的任务不得因本次改造被重复提交。
|
||||
Reference in New Issue
Block a user