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:
@@ -189,7 +189,7 @@ warming/loading/live/partial/error -> inactive
|
||||
| 工具打开决策表 | FR-6 至 FR-10 | US-C1 至 US-C7 |
|
||||
| 资源采样状态 | FR-9 | US-C6 |
|
||||
| 无障碍与窄窗口 | FR-13 | US-D1、US-D2 |
|
||||
| 活动聚合、完成通知与查看清除 | FR-14 | US-E1、US-E2、US-E3 |
|
||||
| 活动聚合、完成通知、查看清除与归档恢复 | FR-14 | US-E1、US-E2、US-E3、US-E4 |
|
||||
| 后续私有市场与 YAML | FR-15 | US-F1、US-F2 |
|
||||
| 服务状态、资源可用性、服务生命周期 | FR-16 | US-F3、US-F5;US-F4 入口已移除 |
|
||||
|
||||
@@ -267,8 +267,14 @@ ASR 按请求加载与释放,支持独立取消;TTS 尚无执行服务。具
|
||||
|
||||
默认筛选依次列待处理、运行中、最近会话。前两组不限条数且不重复列入最近;组内排序时间取最新消息创建时间与本次应用会话内访问/状态变化时间的最大值,无消息时用会话更新时间参与比较,同时间按 ID 排序,不按置顶优先排序。最近组最多 10 条,已完成未查看会话归入最近组并标注状态;“已完成”筛选列出全部完成未查看会话,不受 10 条限制。
|
||||
|
||||
行内显示时间只取会话 `updatedAt`,不使用上述排序时间、访问时间或任务状态变化时间。只有活动而没有会话摘要时不显示时间,也不构造日期或读取详情补齐。流式输出可以更新行内时间,但不因此改变原有排序规则。
|
||||
|
||||
首次活动状态快照只建立基线,不更新最近时间;后续状态变化更新时间,唯独从已完成变为无活动的提醒清除不更新时间。实际打开会话仍记录访问时间;悬停预览不记录。访问与状态时间仅保留在当前 Store 内存中,不跨重载或重启恢复。
|
||||
|
||||
点击项目经离开检查进入聊天,优先恢复本次应用会话内为该项目记住的有效 Conversation ID,否则按最新消息时间从候选会话中选最近一条,无消息时取会话更新时间。普通项目无会话时创建;通道项目只选通道会话,无会话时显示空态。记忆不跨重载或重启保存。点击会话仍按确切 ID 导航;设置按钮独立,不触发项目切换。“新建会话”使用预览项目,全部项目范围使用当前项目;目标缺失或为消息通道时禁用。
|
||||
|
||||
全局无活动时第二行显示“暂无活动”,按钮仍可打开菜单并预览当前项目的最近会话或空态,也可在菜单内切换全部项目范围。活动归零不改变控件高度,也不关闭已打开的菜单。点击外部、焦点离开、Escape 或隐藏侧栏关闭菜单,后台活动不自动打开。查看预览不清除完成通知,实际进入可见聊天才按上述规则清除。
|
||||
|
||||
归档视图是左栏列表的临时模式,不新增顶部分类,不改变右栏预览范围。它只列已归档用户项目,保留本地/SSH Host 分组、搜索和远程能力过滤;归档行只有恢复操作,不作为可进入或可预览项目。恢复先同步会话摘要,再让项目回到活动项目集合,保持当前项目、会话和页面。成功后从归档列表移除;失败保留操作入口,可重复提交同一恢复动作。恢复不修改 Task 状态,不重放任务或启动远程连接。
|
||||
|
||||
右下角“进入项目”与点击普通项目行共用导航规则,目标为预览项目,全部项目范围回退到当前项目;目标不可用时禁用。归档视图中按钮仍对应右栏原预览,不能直接进入未恢复项目。
|
||||
|
||||
@@ -155,6 +155,10 @@ Renderer 内存中最多保留最近 5 分钟。任一条件不满足时停止
|
||||
活动计数、待处理、运行中及已完成筛选不受最近 10 条限制;菜单不继承侧栏会话搜索条件。计数与排除规则见
|
||||
[活动逻辑](./logic-design.md#9-项目活动汇总),交互见[活动界面](./ui-design.md#10-项目活动汇总)。
|
||||
|
||||
右栏会话显示与侧栏一致的实际更新时间;缺少会话摘要的任务活动不显示时间。菜单从完整入口下方展开,短窗口内缩小高度并保持内部可滚动,入口不被菜单覆盖。
|
||||
|
||||
左栏底部“新建项目”旁提供低强调的“已归档”入口,支持搜索和逐项恢复。恢复保留项目数据与原本地/远程分类,不自动进入项目;通道项目及关闭远程能力时的 SSH 项目不提供恢复操作。右下角固定“进入项目”按钮,进入预览项目;全部项目范围使用当前项目,与“新建会话”的目标规则一致。进入仍经过未保存修改检查。
|
||||
|
||||
验收覆盖跨项目后台运行、同会话多任务去重、提问与审批优先、较早的仍在运行或等待处理的
|
||||
会话可见,以及从带搜索条件的页面或有未保存修改的设置页跳转。成功完成后保留“已完成”
|
||||
通知,直到用户实际查看该会话;从活动菜单或普通侧栏进入均可清除。设置覆盖下的聊天及
|
||||
@@ -164,7 +168,7 @@ Renderer 内存中最多保留最近 5 分钟。任一条件不满足时停止
|
||||
## 6. 权限与安全
|
||||
|
||||
- 快捷入口不授予新的文件、命令、网络或浏览器权限。
|
||||
- 系统工具继续使用 Main、Preload、执行空间 Grant、Ask/Execute 和现有审批边界。
|
||||
- 系统工具继续使用 Main、Preload、执行空间 Grant 和既有能力范围,不恢复产品工作模式或一般工具审批。
|
||||
- Renderer 不因新增入口获得任意文件系统、PTY、进程或 Electron API。
|
||||
- 资源指标由 Main 采集并以有界结构返回;Renderer 不接收进程命令行、环境变量或任意 PID。
|
||||
- 资源样本只保存在当前 Renderer 内存中,不写入运行记录、SQLite 或遥测服务。
|
||||
|
||||
@@ -10,6 +10,29 @@
|
||||
|
||||
本次未运行完整测试集或原生 Electron 目录选择器验收,未修改远程主机文档、Agent 或远程连接流程;模型调用 0 次。
|
||||
|
||||
## 2026-10-04:归档恢复与右下角进入项目
|
||||
|
||||
对应 FR-14、US-E4。生产菜单左栏底部已接入按需归档列表、搜索和逐项恢复,右下角已接入“进入项目”。恢复复用既有归档 IPC,并在项目重新可选前合并目标项目会话摘要;不自动切换当前项目,不改变 Task 状态或启动远程连接。进入按钮复用带离开检查的选择回调。规则见[活动逻辑](./logic-design.md#9-项目活动汇总)和[界面设计](./ui-design.md#10-项目活动汇总)。
|
||||
|
||||
本次验证:
|
||||
|
||||
- `npx vitest run --project unit src/renderer/src/WorkspaceMenu.test.tsx src/renderer/src/ProjectSwitcher.test.tsx src/renderer/src/workspace-menu-selectors.test.ts src/renderer/src/WorkspacePrimitives.test.tsx`:90 项通过。包含按需 `list(true)`、分类及远程开关、搜索、加载/恢复失败重试、重复提交锁定、预览不导航及全部项目进入目标。
|
||||
- App 项目/通道相关筛选首次运行 83 项通过,1 条旧断言未包含此前新增的更新时间。修正该断言后运行 `npx vitest run --project unit src/renderer/src/App.test.tsx -t "keeps cross-project counts independent|restores archived|single guarded Magic Notes discard"`,7 项通过,覆盖本地/远程恢复、真实 `setArchived(id, false)` 接线、摘要读取失败重试、原会话恢复和未保存草稿离开检查。
|
||||
- `npx vitest run tests/overlay-layering.electron.test.ts -t "keeps nested previews"`:真实 Electron App 用例通过。生产 Preload、IPC、SQLite 验证归档恢复、保留历史正文、恢复不切换及进入不新建替代会话;浅深主题分别覆盖 `1280×800`、`1280×480`、`560×640`、`375×480` 的右下角位置、边界和内部滚动,并保留原生浏览器相交遮挡及同页面恢复检查。模型调用 0 次。
|
||||
- `npm run typecheck`、`npm run lint`、`git diff --check` 通过。未运行全量测试或实机 SSH 连接;本次没有修改 Agent、SSH 协议或 Runtime 路径。Demo 未修改,生产菜单为本次交付对象。
|
||||
|
||||
## 2026-10-04:会话更新时间与菜单下方定位
|
||||
|
||||
对应 FR-14、US-E1、US-E2。右栏时间按会话 ID 局部订阅,使用实际 `updatedAt` 及侧栏共用格式;仅有活动而无摘要时省略时间。显示文字与提示未变的流式更新不触发 React 提交,跨显示精度更新只提交时间子组件。菜单按完整按钮底边定位,剩余视口高度限制菜单高度,保留内部滚动。规则见[活动界面](./ui-design.md#10-项目活动汇总)及[技术设计](./technical-design.md#12-项目活动汇总)。
|
||||
|
||||
本次实际验证:
|
||||
|
||||
- `npx vitest run --project unit src/renderer/src/WorkspaceMenu.test.tsx src/renderer/src/workspace-menu-selectors.test.ts src/renderer/src/ProjectSwitcher.test.tsx src/renderer/src/time-format.test.ts`:4 个文件、52 项通过。覆盖中英文当天/当年/跨年格式、提示和 ISO 时间、访问时间不替代更新时间、缺少摘要不读取详情、局部提交与未变化时零提交。
|
||||
- `npm run typecheck`:Node、Agent、Web 全部通过。`npx eslint src/renderer/src/WorkspaceMenu.tsx src/renderer/src/workspace-menu-selectors.ts src/renderer/src/WorkspaceMenu.test.tsx tests/support/overlay-paths-main.ts` 通过。
|
||||
- `npx vitest run --project integration tests/overlay-layering.electron.test.ts -t 'keeps nested previews'`:选中的真实 Electron App 用例通过,其余 3 项未选中。浅深主题分别覆盖 `1280×800`、`1280×480`、`560×640`、`375×480`,验证 `8px` 间隔、按钮两行命中、视口边界、时间与状态位置、原生滚轮内部滚动、End 到末行和 Escape 焦点恢复;连续 12 帧几何一致,并检查菜单打开时缩短及恢复窗口。
|
||||
- 原生浏览器与菜单相交时隐藏、不相交时保持显示;菜单关闭后恢复同一页面及标记。模型调用 0 次。截图和 JSON 保存在临时 `workspace-menu-validation` 目录,已查看桌面、短窗口深色和窄窗口浅色截图。
|
||||
- 临时换回旧的按菜单高度上移公式后,Electron 用例在首个桌面场景的间隔断言失败(实际 `6px`,要求 `8px`);恢复最终代码后复跑通过。未运行全量测试,未修改监督者代码。
|
||||
|
||||
## 2026-10-04:双行入口合并为单个按钮
|
||||
|
||||
对应 FR-14、US-E1 至 US-E3。项目名和活动摘要现在属于同一个 `60px` 按钮,共用键盘焦点、展开状态和菜单关联。点击任一行默认预览当前项目,全部项目范围在菜单内切换;活动描述和按钮外的恢复反馈通过 `aria-describedby` 关联。移除了独立摘要触发引用与入口范围状态,保留最近 10 条及现有活动计数,没有新增轮询。
|
||||
|
||||
@@ -482,11 +482,14 @@ OCR 模型可用性由 Main 校验,Worker 运行状态由实际持有它的 Re
|
||||
- 本地创建使用共享 `projectCreateSchema`,`rootPath` 经 trim 后要求 1 至 4096 个字符,`projectsCreate` IPC 在写库前校验。`projectUpdateSchema` 保留原有空目录兼容性,`projectsUpdate` 请求显式使用该 schema;持久化执行空间、默认项目和通道初始化不增加目录限制。`ProjectSwitcher` 在创建按钮和保存入口检查空目录,设置保存沿用原规则。
|
||||
- `workspace-menu-selectors.ts` 订阅会话 Store,投影 ID、项目、标题、排序时间及通道标记,以字段相等比较保留未变化结果;排序时间为 `Math.max(conversationActivityTime(conversation), activityTimes.get(conversation.id) ?? 0)`。与活动行按 ID 合并后派生分组和最近 10 条;仅有活动、尚无摘要的行使用 Store 时间,缺失时取 0。悬停只改变 Renderer 预览范围,不发 IPC、不加载详情或请求模型。打开菜单所需的既有主机快照读取与悬停预览分开。
|
||||
- Store 的 `activityTimes` 保存本次应用会话内的访问/状态变化时间,更新时间为 `Math.max(Date.now(), lastActivityTime + 1)`。`ProjectSwitcher` 调用 `recordActivityStatuses`:首次快照只建立基线,后续状态变化触发更新,但 `completed` 变为无状态的完成提醒清除不触发更新。`WorkspaceMenu` 经 `useSyncExternalStore` 订阅该时间映射;时间不持久化,悬停不更新,普通侧栏原有消息排序规则不变。
|
||||
- 可见会话行的 `WorkspaceConversationTime` 通过 `useWorkspaceConversationTime` 按 ID 订阅 Store,使用 `formatConversationListTime(updatedAt, locale)` 和 `formatMediumDateTime`,`time.dateTime` 保留对应快照的实际 ISO 时间。选择器按显示文字及提示相等复用结果,忽略显示精度以下的流式变化;时间变化只重渲染该子组件,不向整菜单投影加入原始 `updatedAt`。缺少摘要时返回空值,不读取详情。
|
||||
- 项目、会话列表均使用共享 `useListWindow`,分别估算 `64px`、`56px` 行高并测量实际高度,保留键盘目标行;范围改变时重置滚动。窗口化仅限制挂载行数,不截断活动集合,不代表已有性能基准结果。
|
||||
- 菜单通过 `FloatingPortal` 显示同一双栏表面,定位和焦点恢复共用项目按钮的引用;尺寸、窗口和滚动变化时重算位置。非模态 `dialog` 不调用焦点隔离,Escape 关闭整个菜单,Tab 可访问内部控件,焦点离开后关闭。窄窗口仍为双栏,侧栏隐藏时卸载菜单。
|
||||
- 菜单通过 `FloatingPortal` 显示同一双栏表面,定位和焦点恢复共用项目按钮的引用;按钮尺寸、窗口和滚动变化时重算位置。顶部由按钮底边加 `8px` 决定,最大高度为视口底边减顶部及 `16px` 边距,不读取菜单高度参与定位。`ResizeObserver` 只观察按钮,避免菜单收缩后反复改变自身位置。非模态 `dialog` 不调用焦点隔离,Escape 关闭整个菜单,Tab 可访问内部控件,焦点离开后关闭。窄窗口仍为双栏,侧栏隐藏时卸载菜单。
|
||||
- 浮层沿用共享 `browser-viewport-occlusion.ts` 相交检测,不增加浏览器实例的特殊隐藏条件,也不关闭或重建浏览器会话。
|
||||
- `conversationStore.rememberOpened` 在 `App.setActiveId` 时为存在的会话记录访问时间,并记住其项目最后打开的 ID。`projectConversation` 优先返回仍在候选集合中的记忆 ID,否则按 `conversationActivityTime` 选择最近会话,不使用菜单的访问/状态时间;通道项目只选带 `remote` 的会话。记忆仅存在当前 Store 的 Map 中,不持久化、不跨重载恢复。普通项目无会话时创建,通道无会话时清空活动 ID。
|
||||
- 项目进入、新建会话及创建项目后的导航均经过 `requestWorkspaceLeave`。获准后的 `commitProjectSelection` 与新建会话 `ready` 回调直接调用 `commitView('chat')`,避免经 `setView` 再次触发离开检查;新建会话就绪后才提交项目、会话及输入框焦点。
|
||||
- `WorkspaceMenu.onEnterProject` 接到 `ProjectSwitcher.onSelect`,与项目行共用 App 的离开检查及会话恢复。归档入口首次点击才调用 `projects.list(true)` 并筛选 `status === 'archived'`,当前菜单内缓存结果,重新打开菜单后按需重读;不新增启动读取、轮询或逐项目请求。
|
||||
- `restore-project.ts` 调用既有 `projects.setArchived(id, false)`,成功后并行读取活动项目和会话摘要,只合并目标项目摘要,以 `mergePersistedConversations` 保留本地未保存正文及需要保留的详情,再发布 App 项目列表。恢复不调用选择、新建或任务执行路径;摘要读取失败时保留重试入口,重复设置活动状态可安全重试。归档预览不读会话详情,正常进入才按原路径加载历史。后端通道限制、远程功能检查及删除保护不变。
|
||||
- 持久化快照刷新时,同一条仍在流式输出的消息保留本地待审批、待回答信息,持久化终态
|
||||
则清除这些信息。响应成功后对应 Task 立即退出等待状态;响应期间到达的新问题、审批或
|
||||
终态不能被旧响应覆盖。
|
||||
|
||||
@@ -313,16 +313,22 @@ OCR 忙碌或模型不可用时禁用加载与释放,并在执行模块再次
|
||||
|
||||
新建本地项目的根目录字段常显“根目录为必填项,请选择目录后创建项目。”,英文为“Required: select a root folder to create the project.”。只读路径框声明 `aria-required`,通过 `aria-describedby` 关联提示;沿用目录选择按钮。名称或目录去除首尾空白后为空时禁用“创建”。取消目录选择保留原选择和其他草稿;项目设置不显示创建专用提示,也不要求历史空目录项目补选目录。
|
||||
|
||||
底部“新建项目”旁放低强调的“已归档”按钮。点击后左栏保留搜索框,以“已归档”和“返回”替代顶部分类,列表显示名称、目录与独立“恢复”按钮,继续按本地和 SSH Host 分组。加载、空列表、搜索无结果和加载失败重试分别呈现;异步错误与恢复成功使用共享应用通知。恢复期间禁用重复操作,完成后移除该行,键盘焦点仍在该行时移到“已归档”按钮;“返回”恢复选中分类的焦点。
|
||||
|
||||
左栏使用 `--surface-subtle`,与右栏之间以 `1px` 的 `--border-control` 竖线分隔。搜索框使用 `border-box`,宽度包含边框和内边距,并扣除左右外边距,避免越过分隔线。全部项目及搜索结果按实际存在的本地、远程、消息通道显示分组标题,组间用横线和留白区分;远程组内保留 Host 标题。
|
||||
|
||||
项目行显示名称、活动数量、目录三行,无活动时省略数量行,高度随内容增长;恢复状态继续显示在目录下方。当前项目以勾选和 `aria-checked` 标识,预览使用单独背景。设置按钮独立,桌面悬停或聚焦显示,窄窗口及粗指针设备可直接访问;打开既有真实项目设置,保留目录选择、Runtime、模式、删除及远程恢复等适用操作,不触发项目切换。悬停或聚焦项目只预览右栏,点击项目直接进入;通道无会话时保留空态。
|
||||
|
||||
右栏顶部用共享 `SegmentedControl` 显示“全部、待处理、运行中、已完成”,采用辅助字号和紧凑内边距,与靠右的“新建会话”同排。新建使用预览项目,全部项目范围使用当前项目;消息通道禁用并显示自动创建说明。默认会话列表按待处理、运行中、最近会话分组,最近最多 10 条,完成未查看在行内标注;“已完成”筛选不受此上限限制。会话标题单行截断,全部项目范围补充项目名,不展开 Task、Job 或 Run。无活动仍显示最近会话,无匹配会话时显示空态。
|
||||
|
||||
会话行右侧显示实际更新时间,格式与普通会话侧栏一致:当天显示时分,当年显示月日,跨年带年份,随界面中英文切换;悬停提供完整日期与时分。时间使用弱文本色,状态放在其下方并右对齐。窄窗口优先截断标题,保留时间;仅有任务活动、尚无会话摘要的行省略时间,预览不为补时间读取详情。显示时间与最近排序时间的区别见[活动逻辑](./logic-design.md#9-项目活动汇总)。
|
||||
|
||||
右栏底部固定右对齐的主按钮“进入项目”,英文为“Enter project”,工具提示和可访问名称包含目标项目名。目标与顶部“新建会话”一致,但消息通道允许进入;目标缺失时禁用。打开归档视图保持右栏原预览及该目标。按钮不随会话列表滚动,短窗口仍保留底部操作区。
|
||||
|
||||
点击会话关闭菜单并请求确切 ID 导航;通过既有未保存离开检查后,选择所属项目、清除侧栏搜索、未读标记、任务选择和会话菜单,窄窗口关闭侧栏。取消离开保留原页面和完成通知。完成通知仅在目标聊天实际可见后清除,预览、设置覆盖或隐藏文档不触发清除。
|
||||
|
||||
菜单使用共享 `FloatingPortal`,外层为非模态 `dialog`,入口提供 `aria-haspopup="dialog"`、展开状态及控制关系,不增加遮罩或背景隔离。项目列表使用 `menu`/`menuitemradio`,独立操作使用 `menuitem`;会话列表使用 `list`/`listitem` 和按钮。原生浏览器相交遮挡沿用共享机制。
|
||||
|
||||
打开后聚焦选中分类。列表内上下方向键循环移动,Home、End 到首尾;右方向键进入会话列表,左方向键返回预览项目,项目不可见时回到选中分类。Enter、Space 激活按钮;Tab 在控件间正常移动,焦点离开后关闭。Escape 关闭整个菜单并恢复仍可用的触发入口焦点,触发入口已卸载时回到项目入口,不继续关闭窄侧栏。点击外部、再次点击入口或隐藏侧栏也关闭。
|
||||
|
||||
菜单最大宽度 `920px`,高度 `640px` 且受视口限制,距窗口边缘至少 `16px`,锚点下方间隔 `8px`。桌面左栏为 `240px` 至 `360px`,窄窗口仍保留双栏并各自滚动,不使用旧级联返回页。状态筛选可横向滚动,新建按钮保持可见。项目和会话列表均采用共享窗口化渲染,键盘可到达完整列表首尾。
|
||||
菜单最大宽度 `920px`,目标高度 `640px`,顶部始终位于完整双行按钮底边下方 `8px`。最大高度按该位置到视口底部的剩余空间计算,并留出 `16px` 底边距;短窗口缩小菜单、让列表内部滚动,不向上移动覆盖入口或翻转到上方。左右距窗口边缘至少 `16px`。桌面左栏为 `240px` 至 `360px`,窄窗口仍保留双栏并各自滚动,不使用旧级联返回页。状态筛选可横向滚动,新建按钮保持可见。项目和会话列表均采用共享窗口化渲染,键盘可到达完整列表首尾。
|
||||
|
||||
@@ -380,6 +380,7 @@
|
||||
- Then 默认预览当前项目;点击“全部项目”恢复全局范围,“已完成”筛选列出全部完成未查看会话,不受最近 10 条限制
|
||||
- When 实际打开会话、产生新消息或活动状态变化
|
||||
- Then 菜单按最新消息与本次应用会话内访问/状态变化时间中的较晚者排序;首次状态载入和仅清除完成提醒不更新时间,悬停不改变排序
|
||||
- And 行右侧显示会话实际更新时间,中英文格式与会话侧栏一致;访问或任务状态变化不冒充会话更新时间,没有会话摘要时省略时间且不请求详情
|
||||
- When 点击与状态筛选同排的“新建会话”
|
||||
- Then 在预览项目创建,全部项目范围使用当前项目;消息通道禁用手动新建并说明自动创建规则
|
||||
- When 点击项目行独立设置按钮或左栏底部“新建项目”
|
||||
@@ -390,6 +391,7 @@
|
||||
|
||||
- Given 菜单已打开
|
||||
- Then 初始焦点进入选中分类,上下方向键与 Home、End 移动列表焦点,右方向键进入会话列表,左方向键返回预览项目或选中分类;Enter、Space 激活按钮
|
||||
- And 菜单顶部距完整入口底边 `8px`,短窗口内保留底部 `16px` 边距,列表内部滚动;入口两行仍可点击,时间与标题不重叠
|
||||
- When 按 Escape
|
||||
- Then 关闭整个工作空间菜单并恢复可用触发入口焦点,窄侧栏保持打开
|
||||
- Given 窄窗口或长列表
|
||||
@@ -421,6 +423,23 @@
|
||||
- Given 同一会话仍有待处理或运行中工作
|
||||
- Then 按实时状态优先展示,只计入一个类别
|
||||
|
||||
### US-E4 恢复归档项目并显式进入
|
||||
|
||||
对应 FR-14。
|
||||
|
||||
- Given 用户打开项目菜单
|
||||
- When 点击左下角“已归档”
|
||||
- Then 在左栏查看和搜索已归档用户项目,右栏保持原预览;首次加载显示进度,失败提供重试及应用通知
|
||||
- When 点击某个项目的“恢复”
|
||||
- Then 项目回到原本地/远程分类,当前项目和聊天保持不变;失败保留该行并允许重试,提交期间禁止重复恢复
|
||||
- Given 恢复后的项目已有会话
|
||||
- When 返回项目列表,预览该项目并点击右下角“进入项目”
|
||||
- Then 通过离开检查后按既有规则恢复会话,不因摘要尚未刷新创建替代会话
|
||||
- Given 范围为全部项目
|
||||
- Then “进入项目”目标为当前项目,按钮提示及可访问名称包含项目名;悬停和键盘预览不导航
|
||||
- Given 远程项目功能关闭,或项目属于系统消息通道
|
||||
- Then 归档列表不提供对应恢复操作,正常消息通道分类继续可用
|
||||
|
||||
## 7. 后续需求场景
|
||||
|
||||
US-F1、US-F2 为后续市场计划;US-F3 至 US-F5 的本机推理监控已接入源码,当前支持边界见技术设计,验证范围见实施进度。
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# 助手工作栏
|
||||
|
||||
助手工作栏统一承载本机与远程执行空间、Task、成果、文件、浏览器、终端和笔记等持续工作界面。
|
||||
助手工作栏统一承载本机与远程执行空间、Task、文件、浏览器、终端和笔记等持续工作界面。
|
||||
成果页已移除;项目文件统一在工作区查看和导入,会话图片继续由消息引用读取。
|
||||
|
||||
“笔记”为应用级、可关闭的单实例 Tab,新布局默认不打开。它提供搜索、浏览和快速追加文字,
|
||||
与主页面魔法笔记共用存储;会话采集、来源跳转与草稿规则由
|
||||
@@ -16,10 +17,12 @@
|
||||
| [浏览器多实例技术设计](./browser-tabs-technical-design.md) | 浏览器 Tab 身份、Conversation 绑定、IPC、BrowserService 和 MCP 路由 |
|
||||
| [实现与验证进度](./progress.md) | 工作区与 Runtime 相关改动的实现事实、验证证据与剩余阻塞 |
|
||||
| [执行记录存储与升级回收](./execution-history-storage.md) | 子任务差量存储、远程去重、旧库转换、会话置顶、摘要与完整历史按需读取、内存引用释放 |
|
||||
| [工作区文件导入与时间](./workspace-files.md) | 真实文件来源、导入操作、排序、图片存储边界及本机和远程实现 |
|
||||
| [Runtime 交互边界](./runtime-interactions.md) | 原生权限、结构化问答、后台拒绝、终端交互、并行与输出、消息请求状态及资源生命周期规则 |
|
||||
| [Runtime 进程复用技术设计](./runtime-process-reuse-technical-design.md) | 跨 Runtime 资源调研、锁定协议证据、进程与会话拆分、远端模型桥、实施顺序和性能验收 |
|
||||
| [Runtime 原生客户端启动方案](./runtime-native-client-proposal.md) | Local terminal/DS Web shortcut requirements, startup rules, current integration, validation boundaries and remaining remote/resource work |
|
||||
| [Runtime 执行清单技术设计](./runtime-checklist-technical-design.md) | OC/CN 原生清单提取、远程 Agent 传递复用、消息恢复与真实部署验收;尚未实现 |
|
||||
| [移除 Ask / Execute 工作模式](../unified-execution/README.md) | 跨入口统一执行、历史字段迁移及清除数据入口;主要源码已落地,定向 UI/Host 通过,完整验收待完成 |
|
||||
|
||||
当前尚未拆出独立 User Stories、功能逻辑和 UI 设计文档;产品场景与验收保留在现有 PRD,
|
||||
Runtime 资源状态规则由交互边界文档维护。浏览器多实例和 Runtime 进程复用涉及不同的
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
子任务仍实时显示完整的文字、思考、工具过程和最终结果。运行时间较长、工具输出较多时,
|
||||
数据库不再为每个流式更新重复保存此前的整份过程;本机和托管 SSH OpenCode 使用相同
|
||||
的桌面存储机制。此修复不关闭子任务、不截短已有过程,也不增加 Execute 权限门槛。
|
||||
的桌面存储机制。此修复不关闭子任务、不截短已有过程,也不增加工具审批。
|
||||
|
||||
已有数据库在首次升级时自动处理。启动页铺满窗口,显示处理数量、全宽进度条和近期
|
||||
处理速度;处理时间取决于历史数据量与磁盘速度,不承诺固定几分钟。用户可以退出,
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
## 1. 背景
|
||||
|
||||
GoodBuddy 已经在聊天右侧提供任务中心、工作区、浏览器和成果面板,也已经具备
|
||||
GoodBuddy 已经在聊天右侧提供任务中心、工作区和浏览器面板,也已经具备
|
||||
Runtime 事件、Git 变更、文件预览、成果存储、受控浏览器和专家执行等基础能力。后续还
|
||||
计划增加:
|
||||
|
||||
@@ -37,14 +37,14 @@ Runtime 统一抽象为“执行空间”。
|
||||
|
||||
助手工作栏是 GoodBuddy 中始终可访问的应用级工具容器。它提供稳定能力目录,用户从中
|
||||
查看任务中心,并按需打开一个或多个监督、Runtime、终端、进程、工作区、浏览器、资源监控、
|
||||
成果和文档面板实例。稳定的是能力的可发现性,不是十个同时占据界面的固定面板。
|
||||
文档面板实例。成果页已移除,项目文件由工作区统一展示;会话图片保留在消息中。
|
||||
|
||||
工作栏不是:
|
||||
|
||||
- 只在编程项目中出现的 IDE 面板。
|
||||
- 当前聊天消息的附属详情框。
|
||||
- 根据能力探测结果自动增删入口的动态菜单。
|
||||
- 绕过 Main、Preload、Ask/Execute 或审批边界的控制台。
|
||||
- 绕过 Main、Preload、能力范围或用户数据边界的控制台。
|
||||
- 全系统进程管理器、任意文件浏览器或无边界远程管理工具。
|
||||
|
||||
### 2.2 执行空间
|
||||
@@ -84,7 +84,6 @@ Runtime
|
||||
工作区
|
||||
浏览器
|
||||
资源监控
|
||||
成果
|
||||
文档
|
||||
笔记
|
||||
```
|
||||
@@ -115,7 +114,7 @@ Runtime
|
||||
- 终端创建时固定到当前项目执行空间,由项目配置自动决定本机或托管 SSH;没有当前项目时
|
||||
使用本机 Home。
|
||||
- 工作区默认显示当前项目目录,用户可以打开其他本机目录或远程目录。
|
||||
- 成果默认使用当前范围,用户可以切换到项目、全局或其他允许范围。
|
||||
- 项目文件统一使用工作区范围,会话图片按原消息引用读取。
|
||||
- 文档创建时固定到用户明确打开的文件和 ShareServer 编辑会话,不提供跟随模式。
|
||||
- 下一次请求的附件和知识库由当前 Composer 展示与管理,不作为工作栏能力。历史执行上下文
|
||||
随关联 Task 查看;记忆功能实现后也归入任务中心,而不是新增独立上下文面板。
|
||||
@@ -177,7 +176,7 @@ Runtime
|
||||
- 建立统一范围、执行空间、生命周期、成果和控制契约。
|
||||
- 复用现有 Project、Conversation、Task、Artifact、Activity 和 Approval 数据。
|
||||
- 保持 Renderer 无任意文件、进程、PTY、SSH 或 Electron API 能力。
|
||||
- 保持 Ask 只读、Execute 账号完整授权、取消、超时、输出边界和活动审计。
|
||||
- 使用当前账号权限,保留能力范围、取消、超时、输出边界和活动审计。
|
||||
- 为本机与远程能力提供一致 UI,同时准确表达能力差异。
|
||||
|
||||
## 5. 非目标
|
||||
@@ -232,8 +231,8 @@ Runtime
|
||||
- 每个实例显示稳定实例 ID、能力名称、跟随或固定状态与当前目标;同能力多实例不能只靠位置区分。
|
||||
|
||||
从当前聊天右栏迁移时,Task Center 和工作区作为默认打开、单实例且不可关闭的基础应用保留;
|
||||
浏览器保留一个默认打开实例,但注册为可关闭的多实例应用;成果保持默认打开、单实例且可
|
||||
关闭;终端不默认打开,由用户通过“+”创建,并从首期开始支持多实例。Tab 必须单行横向滚动,
|
||||
浏览器保留一个默认打开实例,但注册为可关闭的多实例应用;成果入口移除;
|
||||
终端不默认打开,由用户通过“+”创建,并从首期开始支持多实例。Tab 必须单行横向滚动,
|
||||
不能自动隐藏或缩写到不可辨认。“+”固定在滚动区外的行末,溢出时页签区两端提供固定滚动箭头,箭头不覆盖“+”。Task Center 继续作为 Task 的现有
|
||||
入口;审批定位到所属 Task 或 Runtime。智能心跳不作为工作栏页签,其报告、建议、历史和
|
||||
完整配置统一归属“智能心跳”菜单入口。当前阶段不新增独立自动化中心。
|
||||
@@ -265,10 +264,10 @@ Task Center 保留为工作栏中的稳定入口,并在现有基础上适度
|
||||
|
||||
- 只索引 Task;每个 Task 只关联一条 Conversation,一条 Conversation 可以关联多个 Task。
|
||||
- 顶部显示当前会话消息总数和 Agent 累计回复时间;列表显示本项目任务的名称、关联 Conversation、
|
||||
所属项目、Ask/Execute、状态、最近进展、真实活动时间、累计执行时间和需要关注信息。
|
||||
所属项目、状态、最近进展、真实活动时间、累计执行时间和需要关注信息。
|
||||
- 点击 Task 打开其关联 Conversation 并定位 Task。
|
||||
- 完整消息留在 Conversation;工具、Subagent、审批、错误和成果按 Task 关联到 Runtime、
|
||||
活动记录和成果查看器中,不在窄栏复制,也不呈现 Job/Run 树。
|
||||
活动记录、会话消息和工作区中,不在窄栏复制,也不呈现 Job/Run 树。
|
||||
- 智能心跳的报告、建议、历史和配置不进入任务中心。
|
||||
|
||||
任务中心是应用级单例,默认存在且不可关闭。当前项目是唯一范围,标题明确显示项目;切换
|
||||
@@ -282,8 +281,8 @@ Task Center 保留为工作栏中的稳定入口,并在现有基础上适度
|
||||
主侧栏最近会话为关联 Task 提供轻量入口:父会话行只显示行首展开按钮,Task 子项使用
|
||||
任务图标和本地化摘要,展开层级只到 Task;点击 Task 子项打开同一 Conversation 并定位。
|
||||
新建定制任务使用共享 Modal,默认立即执行和当前 Conversation,可选本项目其他可用会话或
|
||||
新会话,以及单次定时、每日或每周。内容必填,名称可留空从内容生成;工作模式使用关联
|
||||
会话的执行时配置,未设置时使用项目默认值,不在创建表单另设模式。
|
||||
新会话,以及单次定时、每日或每周。内容必填,名称可留空从内容生成;使用关联
|
||||
会话的执行时配置,不在项目、会话或创建表单保存工作模式。
|
||||
|
||||
详细产品边界以 [Task Center PRD](../task-and-job/task-center-prd.md) 和
|
||||
[Task 与 Job 统一领域模型](../task-and-job/task-and-job-model.md) 为准。
|
||||
@@ -308,7 +307,7 @@ Task Center 保留为工作栏中的稳定入口,并在现有基础上适度
|
||||
- 未解决、已查看、已解决、忽略和误报状态。
|
||||
- “带入输入框”“查看证据”“追问”“停止当前回复”等用户介入操作。
|
||||
|
||||
“采纳”只生成可编辑草稿或显式会话操作,不自动发送、执行、切换 Execute 或批准工具。
|
||||
“采纳”只生成可编辑草稿或显式会话操作,不自动发送、执行或批准工具。
|
||||
|
||||
### 7.3 Runtime
|
||||
|
||||
@@ -543,37 +542,16 @@ type BrowserToolbarState = {
|
||||
指标缺失时保留面板入口并显示不可用原因。资源监控入口、采样频率、数据契约与验收由
|
||||
[应用导航与系统工具入口](../application-tool-navigation/README.md)定义。
|
||||
|
||||
### 7.9 成果
|
||||
### 7.9 工作区文件与会话图片
|
||||
|
||||
成果面板统一显示全局、项目、Conversation、Task 执行和监督显式产生的独立成果:
|
||||
|
||||
- Markdown、纯文本和 JSON。
|
||||
- 图片和图表。
|
||||
- HTML 安全预览。
|
||||
- 后续的 PDF、Office、表格和其他受支持格式。
|
||||
|
||||
普通聊天回复只保留在会话消息流中,不自动复制为成果。只有 Runtime 或受管工具显式声明的
|
||||
Artifact、自动化和监督生成的独立输出,以及用户手动导入或明确保存的内容进入成果面板。
|
||||
升级前已经自动保存的普通对话 Markdown 可以从成果列表中隐藏,但不应通过升级迁移物理
|
||||
删除用户数据库内容。
|
||||
|
||||
用户可以切换范围、搜索、预览、查看来源、导出或打开关联对象。成果必须保留项目、
|
||||
Conversation、Task、内部 Run、创建者、MIME、大小、校验值和时间等可用归属;界面按
|
||||
Task 呈现来源,不把 Run 作为导航对象。
|
||||
|
||||
#### HTML 即时预览
|
||||
|
||||
- Runtime 或受管工具通过显式 Artifact 事件声明成果,不能让 Renderer 猜测任意路径。
|
||||
- Main 验证成果属于当前授权执行空间,限制大小、类型和读取范围后再持久化。
|
||||
- HTML 使用 `iframe sandbox=""` 和严格 CSP 进行脚本关闭、网络关闭的静态预览。
|
||||
- 清理脚本、事件属性、嵌套 frame、object、embed、base、link、meta refresh、表单和活动 URL。
|
||||
- 提供“预览 / 源码”切换,并持续标注“静态安全预览,脚本和网络已禁用”。
|
||||
- 不使用 `dangerouslySetInnerHTML`,不启用 Electron `webviewTag`。
|
||||
- 外部打开是明确的用户操作,并说明外部浏览器可能执行脚本或联网。
|
||||
成果页面已移除。FR-WF1~FR-WF3、导入与排序场景以及图片保留边界统一见
|
||||
[工作区文件导入与时间](./workspace-files.md)。实际文件使用项目目录作为唯一来源;会话图片
|
||||
继续使用已有消息引用和 artifact 存储。HTML 会话预览由
|
||||
[会话 HTML 渲染](../conversation-html-rendering/README.md)维护。
|
||||
|
||||
### 7.10 文档
|
||||
|
||||
文档是可创建多个实例的工作栏应用。用户从工作区、成果或会话文件引用打开受支持的 Office
|
||||
文档是可创建多个实例的工作栏应用。用户从工作区或会话文件引用打开受支持的 Office
|
||||
文件时新增文档 Tab;每个实例固定到一个 ShareServer 编辑会话,不随当前 Conversation 或
|
||||
Project 切换。Tab 使用文档文件名,同名实例增加序号,完整来源通过 Tooltip 和页签内信息
|
||||
显示。编辑器、保存、冲突、AI 选区修改和关闭行为以
|
||||
@@ -686,7 +664,7 @@ SSH/远程项目操作;已有 Host、项目和凭据保持不变。若当前
|
||||
连接信息、认证前 Host Key 核对、密码/系统 SSH Agent 认证和平台/架构/Shell/Home 有界
|
||||
探针,全部成功后才原子保存主机、加密凭据和完整 Host Key。认证失败可在弹窗内修改凭据
|
||||
重试;取消或失败不保留新主机。Key 变化显示旧/新指纹并要求显式高风险确认。项目创建和
|
||||
设置现可选择托管 SSH、已保存 Host、远端工作目录、OpenCode 和 Ask/Execute,不要求
|
||||
设置现可选择托管 SSH、已保存 Host、远端工作目录和 Runtime,不要求
|
||||
额外 trust tier 或 consent checklist。候选完成签名 Agent/Runtime、Workspace、ACP、模型桥
|
||||
和文本模型 profile 验证后原子提交。私钥导入仍未开放。旧流程已保存但
|
||||
没有成功探针记录的主机继续读取,但在完成新向导前显示为“需要重新验证”。
|
||||
@@ -727,7 +705,7 @@ digest。当前 registry、连接或 capability 无效时项目保持未切换
|
||||
匹配 manifest 元数据,不重新验签或哈希完整 Agent payload。项目切换器立即提交本地选择,
|
||||
不展示远程激活进度;完整进度和取消只属于新建或显式保存项目。
|
||||
|
||||
项目只持久化 Host ID、规范远端路径、Runtime 选择和默认工作模式。新建和保存验证当前
|
||||
项目只持久化 Host ID、规范远端路径和 Runtime 选择。新建和保存验证当前
|
||||
Workspace/Runtime,但不写入组件 identity;普通切换不做远程验证。未就绪或版本过旧时,
|
||||
实际 Workspace/Runtime 操作显示错误。桌面更新造成组件版本变化时,用户先在 Host 管理中
|
||||
准备环境;项目切换本身不连接、不下载、不扫描、不安装,也不改写项目。
|
||||
@@ -802,8 +780,8 @@ Runtime 会话失效。产品不维护 T1/T2/T3 等附加信任层级。
|
||||
- Main 保持可信控制面,远程 GoodBuddy Agent 只接受有范围、有期限的请求。
|
||||
- GoodBuddy 控制协议负责 Agent、Workspace、Git、Process、Blob 和 Runtime supervision;
|
||||
Runtime Session、stream、tool、permission、usage 和取消优先复用 ACP。
|
||||
- Ask 的只读限制在远程 GoodBuddy Agent 和 Runtime 适配层共同强制。
|
||||
- Execute 是用户对所选 SSH 账号完整权限的授权,直接以该账号可用的文件、进程、网络和
|
||||
- GoodBuddy Agent 与 Runtime 适配层均不保留产品模式字段或只读名单。
|
||||
- 请求直接以所选 SSH 账号可用的文件、进程、网络和
|
||||
工具能力运行,不要求逐工具审批或第二个“受控执行”模式。取消、超时、输出上限和活动
|
||||
记录继续保留。
|
||||
- GoodBuddy 模型凭据和 Provider URL 必须留在 Main。远程 Runtime 只获得不含凭据的模型
|
||||
@@ -901,7 +879,7 @@ remote_operations
|
||||
- 应用重启后先通过远程 Daemon 的 journal、lease、boot identity 和 event cursor 核对活动
|
||||
终端、进程与 Runtime;无法确认时标记 `interrupted` 或 `outcome_unknown`。
|
||||
- 日志使用有界环形缓冲或分页持久化,不能无限写入 SQLite。
|
||||
- Artifact 继续作为成果的权威实体,不把完整成果复制进工作栏状态。
|
||||
- 工作区目录是文件的权威来源;会话图片继续使用 Artifact 引用,不复制进工作栏状态。
|
||||
- 运行记录由 Main SQLite 持久化,Renderer 只保留当前内存视图。升级时迁移旧
|
||||
`localStorage` 记录;若旧缓存达到原数量、详情或总大小边界,页面持续说明更早记录或
|
||||
部分详情可能已经丢失。新记录不再按固定活动数或详情字符数丢弃,长列表只做可继续展开的
|
||||
@@ -916,7 +894,7 @@ Renderer 只通过显式方法访问:
|
||||
- 终端创建、输入、调整大小、关闭和有界输出订阅。
|
||||
- 受管进程列表、日志和允许的控制动作。
|
||||
- Runtime Inspector 快照、事件和允许的控制动作。
|
||||
- 工作区、成果、浏览器和监督的既有或扩展服务,以及有界的本机资源快照。
|
||||
- 工作区、会话图片、浏览器和监督的既有或扩展服务,以及有界的本机资源快照。
|
||||
|
||||
每个 Main Handler 都必须验证可信发送者、Zod 输入、对象归属和当前状态。不得暴露 raw
|
||||
Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。
|
||||
@@ -924,8 +902,8 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。
|
||||
## 12. 安全边界
|
||||
|
||||
1. 工作栏能力目录项和面板实例不授予任何能力;权限只由 Main 中的范围和控制契约产生。
|
||||
2. Ask 在本机和远程 Runtime 边界保持只读。
|
||||
3. Execute 使用当前执行账号的完整权限,不另加目录或逐工具审批;工作栏不能绕过 Main、Preload 与用户数据边界。
|
||||
2. 本机和远程 Runtime 按实际注册目录、启用与分配设置提供能力。
|
||||
3. 使用当前执行账号权限,不另加目录或逐工具审批;工作栏不能绕过 Main、Preload 与用户数据边界。
|
||||
4. 用户终端和 Agent 工具执行使用不同身份和事件来源。
|
||||
5. 进程面板只控制 GoodBuddy 受管对象,不接受任意 PID。
|
||||
6. 本机和远程路径分别在对应文件系统上 canonicalize 并验证符号链接边界。
|
||||
@@ -1030,7 +1008,7 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
- **FR-RR2**:仅查看被动状态不启动重型 Runtime。显式连接测试、原生清单和执行请求
|
||||
复用兼容的已启动实例;尚未握手时不能显示为已经验证连接。
|
||||
- **FR-RR3**:共享进程仍保持各会话的目录、历史、模型用量、工具、权限和业务问答归属。
|
||||
同一会话顺序执行,不同会话并行;Ask 保持只读,Execute 不增加第二层审批。
|
||||
同一会话顺序执行,不同会话并行;统一执行不增加一般工具审批。
|
||||
- **FR-RR4**:请求结束、会话释放与进程退出分别处理。取消一个普通请求、关闭工作栏
|
||||
或释放一个会话不得误停其他健康会话;无会话的空闲重型实例及时释放。正常续聊保留
|
||||
原生上下文,应用退出、配置替换和真实进程故障仍有明确的终态与有界回收。
|
||||
@@ -1067,7 +1045,7 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
## 16. 分阶段实施
|
||||
|
||||
本节只表示内部依赖顺序,不表示可以发布临时架构。SSH 远程执行只使用用户级 Daemon,
|
||||
不发布连接期 stdio Agent。OpenCode Ask、OpenCode Execute 和后续 Runtime 分别通过自身的
|
||||
不发布连接期 stdio Agent。OpenCode、Continue 和后续 Runtime 分别通过自身的
|
||||
安装、权限、取消和重连门槛后开放,未完成的能力继续显示不可用。
|
||||
|
||||
### 阶段 0:应用级工作栏壳层
|
||||
@@ -1075,7 +1053,7 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
- 将当前聊天专属右栏提升为应用级壳层。
|
||||
- 建立稳定能力目录和用户打开、关闭、排序、停靠的面板实例模型。
|
||||
- 建立实例级跟随、固定和失效目标语义。
|
||||
- 保留现有任务中心、工作区、浏览器和成果行为;附件与知识库继续由 Composer 管理。
|
||||
- 保留现有任务中心、工作区和浏览器行为;成果页移除,附件与知识库继续由 Composer 管理。
|
||||
- 将 Task Center 明确为 Task 的单例索引,并补齐范围、状态、最近进展、需要关注和直接打开 Conversation。
|
||||
- 审批在所属任务或 Runtime 中持续可见;任务中心只为未关联任务的审批保留按需显示的处理
|
||||
区域,具体规则见 [Task Center 交互](../task-and-job/task-center-prd.md#5-交互)。
|
||||
@@ -1085,7 +1063,7 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
|
||||
- 本机 CPU、内存、磁盘 IO 和 GoodBuddy 桌面进程摘要的按需资源监控。
|
||||
- 通用 Artifact Event。
|
||||
- HTML 工作区和成果的静态即时预览。
|
||||
- HTML 工作区和会话内容的静态即时预览。
|
||||
- Runtime Inspector Snapshot 与事件。
|
||||
- OpenCode 会话、子会话、Todo、工具、用量和取消;本地与托管 SSH 的原生 Task 调用在
|
||||
Conversation 中统一显示为可追踪的 Subagent 状态,而不是普通工具参数卡。
|
||||
@@ -1115,8 +1093,8 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
- 签名、side-by-side GoodBuddy Agent 安装和按需 detached Daemon。
|
||||
- SSH connection pool、固定 attach relay、Agent 控制协议、Agent 本地 ACP 日志和断线重连同步。
|
||||
- 远程工作区、Git、终端和受管进程。
|
||||
- 当前签名 OpenCode bundle 的 Ask/Execute 均直接启动,Ask 在工具边界保持只读,
|
||||
Execute 使用账号完整权限;官方 ACP channel、Agent 本地模型网关、取消、超时和活动记录
|
||||
- 当前源码直接启动 OpenCode bundle,使用账号权限和已接入能力;配套签名包须按 runtime/acp 6 重建。
|
||||
官方 ACP channel、Agent 本地模型网关、取消、超时和活动记录
|
||||
以[远程主机技术设计](../remote-host/technical-design.md)为准。
|
||||
- OpenCode 闭环稳定后,Continue 与 DeepSeek Harness 复用相同面板和通道契约逐个接入。
|
||||
- 新增或重新验证 Host 时只保存并探测 Agent/Runtime,不自动安装。用户在 Host 卡片用
|
||||
@@ -1132,7 +1110,7 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
Workspace/Runtime 时直接使用新的 current 环境,无需刷新项目绑定。应用启动和项目切换
|
||||
本身都不连接 Host,也不下载或安装组件。
|
||||
- SSH、Main、Daemon、Runtime 和远端重启后的核对、恢复与 `outcome_unknown`。
|
||||
- 支持平台的安装、Ask、Execute、取消和重连冒烟测试通过后开放对应 OpenCode 能力。
|
||||
- 支持平台的安装、无模式工具执行、取消和重连冒烟测试通过后开放对应 OpenCode 能力。
|
||||
|
||||
### 阶段 5:开放后的扩展
|
||||
|
||||
@@ -1156,7 +1134,7 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
|
||||
### 17.2 通用使用
|
||||
|
||||
- [ ] 没有项目时仍可创建终端、选择工作区、打开浏览器和查看成果。
|
||||
- [ ] 没有项目时仍可创建终端、选择工作区和打开浏览器。
|
||||
- [ ] 监督可以作用于普通 Conversation、Task 和后续实验对象,不假设编程语境。
|
||||
- [ ] 工作区不是 Git 仓库时仍可浏览文件。
|
||||
- [ ] Runtime 不支持某项原生能力时仍可从目录打开面板并获得准确说明。
|
||||
@@ -1168,9 +1146,9 @@ Escape 收起并返回按钮;点击外部或焦点移出也收起。实时区
|
||||
- [ ] Renderer 没有任意文件、Shell、进程、PTY、SSH 或 Electron API。
|
||||
- [ ] Agent 不能未经授权向用户终端注入命令。
|
||||
- [ ] 进程面板不能枚举或终止任意系统进程。
|
||||
- [ ] Ask 在本机和远程执行空间均无法调用写入或外部副作用工具。
|
||||
- [ ] 本机和远程按已启用能力执行,不保留模式限制或一般工具审批。
|
||||
- [ ] HTML 预览无法执行脚本、联网、打开窗口、提交表单或访问 Electron API。
|
||||
- [ ] Supervisor 不能自动发送消息、批准工具、切换工作模式或扩大范围。
|
||||
- [ ] Supervisor 不能自动发送消息、批准工具或扩大范围。
|
||||
- [ ] SSH 首次连接和 Host Key 变化均经过明确验证流程。
|
||||
- [ ] 凭据不进入 Renderer、日志、SQLite 明文或命令参数。
|
||||
- [ ] Host 地址、用户或 Host Key 变化会关闭旧连接,并使旧 Workspace 和 Runtime 会话失效。
|
||||
|
||||
@@ -1,5 +1,50 @@
|
||||
# 工作栏实现与验证进度
|
||||
|
||||
## 2026-10-04:移除成果页,工作区导入与文件时间
|
||||
|
||||
对应 [FR-WF1~FR-WF3、US-WF1~US-WF3](./workspace-files.md)。成果 Tab、目录注册及独立导入
|
||||
界面已移除,旧布局过滤成果实例。工作区显示实际文件的修改时间与可用创建时间,支持同级排序,
|
||||
向所选目录导入原件。本机及远程共用分块管理动作,同名文件不覆盖,失败项独立反馈并清理部分文件。
|
||||
|
||||
来源检查确认:`AssistantDatabase.createImageArtifact` 把图片保存为 `artifacts.inline_content`
|
||||
数据 URL,消息通过 `artifactIds` 引用;上传源图还可通过 `imageSourceArtifactIds` 引用。
|
||||
这些数据不是工作区文件。本次未改数据库 schema、删除或迁移 artifact,也未自动复制附件。
|
||||
生成图片继续保留在消息,需要项目文件时由既有 `save_image` 显式保存。
|
||||
|
||||
验证证据:
|
||||
|
||||
- 最终定向验证:16 个文件,252 项通过、2 项跳过。覆盖 WorkspaceAccess、导入服务、文件管理、
|
||||
时间传递、布局恢复、工作区排序和虚拟列表、Sidebar、WorkbarShell、ChatTimeline、图片服务及
|
||||
ProtocolRemoteWorkspaceTransport。命令使用 `npm test --` 加对应文件;新测试入口为
|
||||
`src/main/workspace/workspace-import.test.ts` 和 `tests/workspace-import.electron.test.ts`。
|
||||
- `src/main/ipc.test.ts -t "resolves the project root and validates file requests"`:1 项通过,验证
|
||||
原生选择取消、真实文件导入、路径校验以及已有目录读取。
|
||||
- App 的成果入口相关测试修正后复跑:2 项通过。真实 Electron 从完整 App 的工作区按钮进入
|
||||
生产 preload、IPC 和本机文件系统,导入 700,001 字节二进制文件,逐字节核对,同名项不覆盖,
|
||||
取消无写入;原生文件选择器以固定路径替代人工操作。历史会话图片在 Renderer 重载后仍能解码,
|
||||
SQLite artifact 数量保持 1,项目根目录只有显式创建的 `selected` 目录。
|
||||
- `tests/workspace-files-layout.electron.test.ts`:16 个场景通过,包含 Git/非 Git、浅深主题、
|
||||
四种窗口尺寸、原生滚轮与点击、隐藏/恢复位置,窄栏横向滚动不撑宽 Sidebar。
|
||||
`tests/workbar-settings-layout.electron.test.ts`:80 项工作栏观察及 12 项设置观察通过,
|
||||
中英文、浅深主题及原生键盘操作继续可用。
|
||||
- Linux x64 共享 Host:`scripts/workspace-import-host-probe.ts` 将当前源码打包后,通过现有
|
||||
pinned SSH 连接运行。Desktop `RemoteWorkspaceAccess` 经 SSH stdio 测试桥调用真实
|
||||
`createWorkspaceProtocolMethods`、`WorkspaceRegistry` 和 `manageWorkspace`;上传二进制
|
||||
700,001 字节及空文件成功,Host 核对每个字节、目录归属、mtime/birthtime,同名重传失败且
|
||||
原文件不变。临时工作区在 `/root/tmp` 下并在结束时清理。模型调用 0 次。
|
||||
此探针未经过安装版 daemon 的完整二进制帧/attach 路径;该传输契约的本地回归通过,未替换
|
||||
已安装 Agent。生产远程导入需要部署包含新增 `importFile` 动作的 Agent,旧 Agent 不支持。
|
||||
- `npm run typecheck`、`npm run lint` 通过。新工作区文档经 `deai-writing` 扫描无阻断项;
|
||||
两个复核项属于布局偏好字段列举及明确的旧 Agent 支持边界,保留事实说明。
|
||||
|
||||
全仓 `npm test` 运行 852.36 秒:505 文件通过、6 文件失败、14 文件跳过;5,974 项通过、
|
||||
8 项失败、86 项跳过。此次改动对应的 4 项旧断言(App 2 项、虚拟列表缩进 1 项、工作栏
|
||||
默认 Tab 数量 1 项)已修正,定向复跑通过。其余失败为 `assistant-storage-worker.test.ts`
|
||||
2 项升级失败、`supervisor-layout.electron.test.ts` 等待 inline error 超时、
|
||||
`opencode-runtime.test.ts` 的 cleanup-timeout 断言失败。存储升级 2 项单独复跑仍失败;
|
||||
OpenCode 用例单独复跑通过;监督者布局未重复运行。未改动这些非本次范围的实现,未将
|
||||
全仓测试记为通过。未提交、发布或打发行包。
|
||||
|
||||
## 2026-10-01:自定义 MCP 失败中断回复
|
||||
|
||||
已修复共用网关将单个上游发现失败升级为整轮失败的问题,行为见
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# Runtime 交互边界
|
||||
|
||||
本文定义当前原生交互的适配范围,不增加工作模式或第二层 Execute 审批。
|
||||
本文定义当前原生交互的适配范围,不增加产品工作模式或一般工具审批。
|
||||
|
||||
| Runtime | 权限确认 | 业务问答 |
|
||||
| --- | --- | --- |
|
||||
| 本机 GoodBuddy 管理的 OpenCode | 内部默认配置允许权限;每个 Ask 请求仍使用 deny-all 与显式只读能力。Execute 自动回复属于当前请求的父、子孙会话权限事件,不处理其他并行请求 | 通过 `question.asked` 转交父、子孙会话问题,支持原生单选、多选、yes/no、自由文本及跳过;使用公开 ID 回传 `question.reply/reject` |
|
||||
| 托管 SSH OpenCode | Agent 按已接受 Prompt 的 Ask/Execute 模式处理 ACP 权限,规则见远程主机技术设计 | 当前 Agent 插件转交原生父、子孙会话 `question.asked`;前台使用同一问答队列,回答和跳过经认证 Agent 控制通道回传,已知 Task 关联显示子任务归属 |
|
||||
| Continue | Execute 启动传入 `--auto`,剩余原生权限请求按当前模式自动答复 | 对接 `1.5.47` QuizService 的扁平 `pendingQuestion`,其中 `question` 是字符串。选项回答与自定义文本分别回传正确的 `isCustomAnswer`;跳过发送拒绝回答的文本 |
|
||||
| DeepSeek Harness | 固定 Host 的 Execute 文件与命令工具不询问目录权限;若收到 ACP 权限请求,活跃 Execute 直接选一次性允许,缺少该选项时使用 Runtime 提供的允许选项,Ask 拒绝,不等待额外 authorizer | 固定 Host 当前未提供通用原生业务问答服务,不把普通模型正文误识别成待答协议。模型以普通回复提问时,用户通过下一条消息回答 |
|
||||
| 本机 GoodBuddy 管理的 OpenCode | 自动回复属于当前请求的父、子孙会话权限事件,不处理其他并行请求;无产品模式名单 | 通过 `question.asked` 转交父、子孙会话问题,支持原生单选、多选、yes/no、自由文本及跳过;使用公开 ID 回传 `question.reply/reject` |
|
||||
| 托管 SSH OpenCode | Agent 按已接受 Prompt 的归属和实际能力处理 ACP 权限,规则见远程主机技术设计 | 当前 Agent 插件转交原生父、子孙会话 `question.asked`;前台使用同一问答队列,回答和跳过经认证 Agent 控制通道回传,已知 Task 关联显示子任务归属 |
|
||||
| Continue | 启动使用原生 agent 与 `--auto`,剩余原生权限请求自动答复 | 对接 `1.5.47` QuizService 的扁平 `pendingQuestion`,其中 `question` 是字符串。选项回答与自定义文本分别回传正确的 `isCustomAnswer`;跳过发送拒绝回答的文本 |
|
||||
| DeepSeek Harness | 固定 Host 文件与命令工具不询问目录权限;活跃请求优先选择一次性允许,缺少时使用 Runtime 提供的允许选项,保留取消和未知请求拒绝 | 固定 Host 当前未提供通用原生业务问答服务,不把普通模型正文误识别成待答协议。模型以普通回复提问时,用户通过下一条消息回答 |
|
||||
|
||||
托管 SSH OpenCode 的权限、原生问题事件与回复链路由
|
||||
[远程主机技术设计](../remote-host/technical-design.md)定义。该远端业务问答基线需要
|
||||
@@ -177,10 +177,10 @@ Markdown 或名称含 `list` 的工具。子会话清单不覆盖父请求顶部
|
||||
|
||||
不变量:
|
||||
|
||||
1. 一条请求始终使用接受时的 execution space、工作模式、配置和归属;不能读取后来
|
||||
1. 一条请求始终使用接受时的 execution space、配置和归属;不能读取后来
|
||||
切换的 UI 选择,也不以进程 cwd 表示所有会话的 cwd。
|
||||
2. 同一会话串行,跨会话不增加全局 Prompt 队列。权限、子代理、问题、用量和最终清理
|
||||
必须沿同一 Session/请求归属,不因共享进程放宽 Ask 或限制 Execute。
|
||||
必须沿同一 Session/请求归属,不因共享进程改变能力范围。
|
||||
3. owner 的退出条件依据所有使用者,不依据某个 adapter 的空闲状态。
|
||||
未启动对象的 dispose 不产生冷启动;一个等待者取消不取消其他等待者的初始化。
|
||||
4. 正常会话仍持有原生上下文时,不用任意 TTL 清掉它来声称“空闲内存已回收”。
|
||||
|
||||
@@ -94,7 +94,7 @@ Skills/MCP 承接、取消和产品生命周期仍待实现与验证。此次可
|
||||
| FR-2 | 按项目执行空间启动 | 本地使用本地目录,SSH 使用绑定 Host 与远端目录;目录失效时说明原因 |
|
||||
| FR-3 | 注入点击时选定模型 | 客户端首轮直接使用该模型,无需重复输入供应商密钥 |
|
||||
| FR-4 | 创建独立客户端会话 | 不修改原聊天历史,不把打开操作伪装成当前聊天的续接 |
|
||||
| FR-5 | 保持所选工作模式的执行边界 | Ask 的 AI 工具路径只读;Execute 使用相应账号已有权限 |
|
||||
| FR-5 | 沿用统一执行与能力范围 | AI 工具路径使用已接入能力和相应账号已有权限,无产品模式 |
|
||||
| FR-6 | 管理启动、重开和关闭 | 不因收起工作栏或切换项目中断;关闭对应客户端资源时释放其桥接 |
|
||||
| FR-7 | 保留可处理的失败信息 | 启动、模型和远程错误可区分,允许修正后重试,不清空聊天草稿 |
|
||||
| FR-8 | 明确原生能力与 GoodBuddy 能力差异 | 已分配的 Skills、MCP 等逐项接入并验证;未接入项有明确说明 |
|
||||
@@ -105,7 +105,7 @@ Task 关联恢复或客户端历史导入。原生客户端产生的历史由对
|
||||
活动记录中显示为已经同步的聊天内容。
|
||||
|
||||
FR-8 的实施清单须区分原生工具、GoodBuddy 分配的 Skills、自定义 MCP、内置 MCP、知识工具
|
||||
以及遵循当前工作模式授权的配置工具。配置应用不再额外要求 GoodBuddy 原生确认,Ask 仍只读。
|
||||
以及按当前请求资源范围提供的配置工具。配置应用不再额外要求 GoodBuddy 原生确认。
|
||||
支持情况以真实调用为准;现有 DS 宿主插件能力不能
|
||||
直接算作 DS Web 能力。发现现有分配无法承接时,在实施评审中明确差异和处理方式,不能默默忽略。
|
||||
|
||||
@@ -121,18 +121,18 @@ FR-8 的实施清单须区分原生工具、GoodBuddy 分配的 Skills、自定
|
||||
| US-4 | 启动期间连续点击 | 同一启动只创建一次;按钮显示启动中 | FR-6 |
|
||||
| US-5 | 已打开客户端后切换项目或模式 | 旧客户端保持原项目和启动模式;新操作使用新选择 | FR-5、6 |
|
||||
| US-6 | 启动失败或模型请求失败 | 保留原因与可操作的重试方式;聊天内容和草稿不变 | FR-7 |
|
||||
| US-7 | Ask 下从原生界面请求写文件、执行写命令或使用写入 MCP | AI 执行边界拒绝写入,不能通过客户端模式开关绕过 | FR-5、8 |
|
||||
| US-7 | 从原生界面请求写测试文件、执行命令或使用已分配 MCP | 工具正常执行,无产品模式拒绝;未启用能力不可调用 | FR-5、8 |
|
||||
| US-8 | 关闭终端、停止 DS 服务或退出 GoodBuddy | 对应进程和桥接释放,其他会话不受影响;原生历史保留 | FR-4、6 |
|
||||
|
||||
### 4.2 行为决策
|
||||
|
||||
启动参数按点击时的项目、执行空间、Runtime、模型和工作模式确定。界面后续切换不修改已运行
|
||||
启动参数按点击时的项目、执行空间、Runtime、模型和能力配置确定。界面后续切换不修改已运行
|
||||
客户端。这里只需保留进程运行所需的内存记录,不增加持久启动快照、恢复日志或数据库迁移。
|
||||
|
||||
Continue 和 OpenCode 启动成功后,每次新的点击创建独立终端。启动中的重复点击合并到同一
|
||||
进行中操作。终端会话数量沿用现有管理器规则,不新增一套数量控制。
|
||||
|
||||
DS 按项目、模型配置及工作模式匹配运行服务。配置相同且服务可用时重新打开原服务;配置变更后
|
||||
DS 按项目、模型及能力配置匹配运行服务。配置相同且服务可用时重新打开原服务;配置变更后
|
||||
新建匹配实例,保留原实例直到用户停止或应用退出,避免在已有页面中静默改变模型和权限。
|
||||
同一匹配项并发启动只执行一次。服务已退出则清除内存记录,下一次点击重新启动。
|
||||
|
||||
@@ -148,16 +148,13 @@ DS 按项目、模型配置及工作模式匹配运行服务。配置相同且
|
||||
| 系统浏览器打开失败 | 保留可重开的就绪服务,通知用户重试;不复制含令牌地址到普通日志 | US-6 |
|
||||
| 服务启动失败 | 清理本次创建的临时资源,再允许重试;不删除用户原生历史 | US-6 |
|
||||
|
||||
Ask 沿用现有 Runtime 按工具命令名判断的只读规则,不改变用户手动终端的已有权限。
|
||||
DS 后台的 `read` 和原生 `skill` 可在 Ask 执行;`write`、`edit`、`pwsh`/`bash`
|
||||
在 Ask 拒绝,在 Execute 放行,代理工具沿用现有分类。工具出现在模型请求目录中不等于
|
||||
获准执行,判断仍在 `tools/execute` 路径。Web 接入复用这些规则,不增加 Shell 文本分析、
|
||||
目录围栏、逐工具二次确认或新的权限等级。Execute 使用当前账号已有的文件、进程和网络权限。
|
||||
原生客户端使用实际注册工具和已分配能力,不注入产品模式插件、只读名单或逐工具确认。
|
||||
Main 代理保留请求身份、启用与分配和参数校验。工具使用当前账号已有的文件、进程和网络权限,
|
||||
用户手动终端的 OS 权限不变。
|
||||
|
||||
官方 `dsh-plan-mode@0.1.7-rc.2` 的 Plan 只改变规划提示和状态,工具目录不随之变化;
|
||||
权限预设由另外的 sandbox/approval 组件处理。因此不能把 Plan 名称当成 Ask 实现,
|
||||
也不能把官方默认“工作区内修改”当成 GoodBuddy Execute。接入时将启动模式接到现有
|
||||
工具名规则,原生页面的模式选择保持同一语义。
|
||||
权限预设由另外的 sandbox/approval 组件处理,不能与已移除的 GoodBuddy 工作模式混同。
|
||||
保留原生 full-access/approval 适配,不恢复 GoodBuddy 模式钩子。
|
||||
|
||||
这些规则覆盖普通启动、使用、关闭和已知失败。尚需技术验证的项目见第 7 节;它们不构成新增
|
||||
授权层级或通用恢复框架的理由。
|
||||
@@ -184,7 +181,7 @@ DS 服务运行后,打开入口仍显示“打开DSH Web”,旁边显示“
|
||||
|
||||
### 6.1 进程职责
|
||||
|
||||
Renderer 仅提交当前会话或项目标识及选择标识。Main 重新解析项目、模型配置、工作模式与
|
||||
Renderer 仅提交当前会话或项目标识及选择标识。Main 重新解析项目、模型配置与
|
||||
程序路径,通过共享 Zod 契约和显式 preload 方法完成调用。保留已有可信发送方校验,供应商
|
||||
密钥留在 Main 加密设置和模型请求路径中。
|
||||
|
||||
@@ -282,7 +279,7 @@ Runtime。远端配置与模型桥需要客户端生命周期,不能直接复
|
||||
| 阶段 | 工作与应提交证据 | 通过条件 |
|
||||
| --- | --- | --- |
|
||||
| P1 原生配置验证 | 固定三个客户端版本;保存脱敏命令、环境与程序路径;隔离已有全局配置 | Continue/OpenCode 使用指定模型;DS 自动选中目标项目 |
|
||||
| P2 模型与模式 | 每个客户端发送最小真实请求;验证流式、取消、Ask 写入拒绝及 Execute 专用目录写入 | 请求确实经过 GoodBuddy 模型桥;客户端模式切换不能破坏 Ask 边界 |
|
||||
| P2 模型与工具 | 每个客户端发送最小真实请求;验证流式、取消及专用目录写入 | 请求确实经过 GoodBuddy 模型桥,工具沿用已接入能力 |
|
||||
| P3 生命周期接入 | 配置、PTY、DS 进程和模型桥接入现有管理路径 | 重开、失败重试、关闭及退出能释放对应资源,原生历史保留 |
|
||||
| P4 远程验证 | 在共享 Host 部署当前代码,验证 Continue/OpenCode 的 SSH PTY 与模型桥 | 启动、请求、取消、断开和重试均有真实 Host 证据 |
|
||||
| P5 UI 与交付资源 | 接入按钮、通知、停止 DS 服务;完善平台资源与文档 | 从真实按钮到客户端完成对话,无手动补依赖步骤 |
|
||||
@@ -290,7 +287,7 @@ Runtime。远端配置与模型桥需要客户端生命周期,不能直接复
|
||||
P1、P2 是实施前段的实验任务,完成后继续交付完整入口,不将实验程序或不可用按钮作为最终功能。
|
||||
|
||||
DS 单项目工作区选中和当前模型桥协议已通过本轮验证。后续优先接入三个客户端的既有
|
||||
Ask/Execute 工具规则、Skills/MCP 配置及客户端生命周期,再完成快捷入口和交付资源。
|
||||
统一执行规则、Skills/MCP 配置及客户端生命周期,再完成快捷入口和交付资源。
|
||||
官方 DS 首次预览声明保留原生“继续”流程,模型配置提前准备。
|
||||
|
||||
## 8. 验收计划
|
||||
@@ -299,11 +296,11 @@ Ask/Execute 工具规则、Skills/MCP 配置及客户端生命周期,再完成
|
||||
| --- | --- | --- |
|
||||
| 实际使用 | 每个本地客户端从 GoodBuddy 按钮进入当前项目,使用当前模型完成一轮真实对话 | FR-1~4、US-1、2 |
|
||||
| 配置隔离 | 预置另一套全局模型后,仍使用当前选择;两个项目不串目录或配置 | FR-2、3、US-5 |
|
||||
| 工作模式 | Ask 尝试文件写入、Shell 写入和 MCP 写入均不执行;Execute 在专用测试目录成功写入 | FR-5、8、US-7 |
|
||||
| 工具能力 | 在专用测试目录验证文件、Shell 和已分配 MCP 写入;关闭能力后不可调用,无模式限制 | FR-5、8、US-7 |
|
||||
| 能力复用 | 为声明支持的 Skills、MCP 各验证实际加载及最小调用;列出未承接能力 | FR-8 |
|
||||
| 生命周期 | 连点启动、切项目、隐藏工作栏、关闭页签、重开 DS、停止服务及退出 | FR-6、US-4、5、8 |
|
||||
| 已知失败 | Node/原生依赖缺失、失效目录、模型错误、浏览器打开失败、SSH 中断 | FR-7、9、US-6 |
|
||||
| 远程 | 当前源码在共享 Linux x64 Host 上完成 Continue/OpenCode 的 Ask/Execute、模型和断开场景 | FR-2、3、5、US-3 |
|
||||
| 远程 | 快捷入口接通后,须在共享 Linux x64 Host 验证 Continue/OpenCode 工具、模型和断开场景;普通远程 Runtime 验证不替代原生客户端入口 | FR-2、3、5、US-3 |
|
||||
| UI | 浅深色、键盘操作、窄输入区、无压缩按钮、空对话、200% 文字缩放 | FR-1、US-1、2 |
|
||||
| 平台资源 | 对实际交付的 Windows、macOS、Linux 架构逐项验证 Node、PTY、CLI 和 DS 原生依赖 | FR-9 |
|
||||
|
||||
@@ -325,6 +322,9 @@ The DS Web backend implementation and its focused validation are recorded below.
|
||||
|
||||
### 9.1 DS Web Backend, 2026-09-26
|
||||
|
||||
本节保留 2026-09-26 的接口与测试记录,其中 `workMode` 和 Ask/Execute 限制已由
|
||||
[统一执行](../unified-execution/README.md)替代;不作为当前接口或工具权限规范。
|
||||
|
||||
`src/main/agent/native-dsh-web-client.ts` exports `NativeDshWebClientService`.
|
||||
Construct it with `rootDirectory`, an async `resolveLaunchEnvironment` returning
|
||||
`{ nodeExecutablePath, environment }`, and `resourcesPath` in packaged builds.
|
||||
@@ -380,20 +380,20 @@ launch paths are unchanged because this service supports local DS Web only.
|
||||
|
||||
The production coordinator resolves the saved conversation/project and current
|
||||
settings for both `get` and `open`. Matching includes the selected model profile
|
||||
and credentials, work mode, capability assignments, knowledge scope, Obsidian
|
||||
and credentials, capability assignments, knowledge scope, Obsidian
|
||||
settings and local Node selection. Ready services keep their MCP gateway after an
|
||||
OS browser-open error and can be reopened or explicitly stopped by their owner.
|
||||
The coordinator passes its configuration key into the service's existing match
|
||||
hash, so the inner DS reuse decision also observes updated skill digests and
|
||||
launch settings even when directory paths are unchanged.
|
||||
|
||||
For DS Ask, the built-in gateway's existing read grant supplies the allowed raw
|
||||
tool names; the Web adapter maps these through the official MCP naming contract.
|
||||
Custom MCP is exposed in Execute, matching the existing Runtime behavior; custom
|
||||
`readOnlyHint` annotations do not introduce a separate Ask permission rule.
|
||||
The gateway supplies enabled and assigned tools; the Web adapter maps these
|
||||
through the official MCP naming contract. Custom MCP follows the same assignment
|
||||
rules, without product-mode filtering or approval policy. `readOnlyHint` describes
|
||||
tool behavior and does not filter the catalog.
|
||||
Assigned skill directories containing `SKILL.md` load through the official skill
|
||||
plugin. Continue/OpenCode native Ask now retain Main-bound endpoints and map the
|
||||
granted read-tool names through both native permissions and execution hooks.
|
||||
plugin. Continue/OpenCode retain Main-bound endpoints and map the registered
|
||||
tool names through native configuration without GoodBuddy mode hooks.
|
||||
OpenCode prefixes names with the bound MCP server name; Continue uses raw names.
|
||||
Story Graph additionally rechecks Supervisor enablement on every call.
|
||||
|
||||
|
||||
@@ -145,9 +145,9 @@ SelectedRuntimeManager
|
||||
混用会引入另一项真实风险。不同 profile ID 不通过比较或序列化明文 API Key 来合并;
|
||||
密钥、Header 和插件配置更新通过现有设置失效路径使旧 owner 退役。
|
||||
|
||||
调研基线的 SSH launch profile 把 workMode 写入原生启动配置。当前实现把工作模式
|
||||
放入 Session/当前 Prompt 路由,并设置原生 Session 工具规则,详见 §6.1;
|
||||
不能仅从兼容键中删除 workMode,也不向用户增加逐工具审批。
|
||||
调研基线的 SSH launch profile 曾把 workMode 写入原生启动配置。当前源码已从启动、
|
||||
Session 和 Prompt 路由删除产品模式,按实际能力和请求归属接入工具,详见 §6.1;
|
||||
不向用户增加逐工具审批。
|
||||
|
||||
## 4. 本机 OpenCode
|
||||
|
||||
@@ -220,7 +220,7 @@ OpenCode 1.18.x 的 `mcp.add` 在服务端独立执行:客户端超时或取
|
||||
不依赖 Windows 大小写字符串猜测,也不取消路径存在性校验。
|
||||
- 保留一个本地 Filesystem、Subprocess 和平台 Shell Provider。Session 使用原生 cwd
|
||||
路由;非 Session 的清单查询显式传入查询工作区,不能回退到第一个项目。
|
||||
- 保留 `setup(agentCtx)` 注册 Skill 和工具视图、每 Session 的 Ask definition 身份校验、
|
||||
- 保留 `setup(agentCtx)` 注册 Skill 和工具视图、每 Session 的请求归属校验、
|
||||
`sessionId + requestId` 准备及事件路由。Main 的 Web/MCP callback 按对应请求找
|
||||
ToolProvider,不挂到某个最先创建的 adapter 上。
|
||||
- 第一轮保持同 profile、图片能力和插件组合共享,`queueUsage` 的模型配置因此仍一致。
|
||||
@@ -229,7 +229,7 @@ OpenCode 1.18.x 的 `mcp.add` 在服务端独立执行:客户端超时或取
|
||||
第三方插件的初始化可能依赖配置中的路径,不能因为内置工具支持 cwd 就声称所有插件
|
||||
天然多工作区安全。已启用插件组合属于进程配置;对实际产品支持的插件验证它使用
|
||||
Agent scope/Session cwd。若某插件确实有项目级初始化状态,将该状态显式作为不兼容
|
||||
启动配置,而不是默认给所有工作区各起一套 Provider 或禁止 Execute 工具。
|
||||
启动配置,不默认给所有工作区各起一套 Provider 或禁用工具。
|
||||
|
||||
### 5.2 状态与取消
|
||||
|
||||
@@ -282,8 +282,8 @@ Agent 当前 Runtime installation + 兼容配置
|
||||
- 同一 PID 的多个 binding 不代表同一权限或同一 operation。Host/installation identity
|
||||
变化仍使用已有失效和退役规则,不把不同 Host、账号或 Runtime generation 合并。
|
||||
|
||||
原生 `chat.message` 在模型请求前设置该 Session 的工具规则:Execute 允许工具;
|
||||
Ask 只开放原生只读、搜索和读取网络内容的工具,不开放 Shell/编辑/写入。
|
||||
原生 `chat.message` 在模型请求前设置该 Session 的工具与模型路由,不再按产品模式
|
||||
过滤 Shell、编辑或写入;请求级端点与子会话归属仍独立。
|
||||
OpenCode 1.18.29 的 ACP 不转发未注册子 Session 的权限请求,且原生子代理只继承父
|
||||
Session 的拒绝规则、不继承允许规则,因此子 Session 也按根 Prompt 设置规则,再
|
||||
保留原生子代理的显式限制。不能只把进程启动配置统一设成 `ask`,否则子代理工具会等待。
|
||||
@@ -382,7 +382,7 @@ token、global dir、活动 Session 或权限/问题队列。设置替换及窗
|
||||
| --- | --- | --- |
|
||||
| V1 | FR-RR1、FR-RR2 | 全新 profile 仅查看状态、切换设置,OpenCode/DSH 重型启动次数为 0;已有 Host 时刷新不新建;清单与首个真实请求并发只有一次初始化 |
|
||||
| V2 | FR-RR1、FR-RR3 | 同一有效模型连接,两个独立项目各两会话同时自然开发,OpenCode/DSH 各一重型进程;各项目同名不同内容文件、命令 cwd、Git/测试结果都正确 |
|
||||
| V3 | FR-RR3 | 第二轮复用同一批会话;Ask/Execute 混合,Ask 写入被边界拒绝,Execute 不增审批;Skill、MCP、图片能力、用量和业务问答不串归属 |
|
||||
| V3 | FR-RR3 | 第二轮复用同一批会话;不同能力分配不串用,无产品模式或一般审批;Skill、MCP、图片能力、用量和业务问答不串归属 |
|
||||
| V4 | FR-RR3、FR-RR4 | 一会话取消真实长工具/子代理时另外三会话完成并通过独立项目测试;分别检查请求 abort、SSE、问题映射和工具句柄释放 |
|
||||
| V5 | FR-RR4 | 关闭面板不取消工作;释放一个会话不关闭共享进程;无会话 owner 空闲后退出;App 退出后本机受管进程无残留,远端按已有 detach 规则保留 Agent-owned 工作 |
|
||||
| V6 | FR-RR1、FR-RR4 | 等价默认/显式选择复用;不同实际连接/插件配置不串用;配置更新期间旧请求完成,旧 generation 不永久积累;超过八个项目不因轻量 adapter 报重型容量满 |
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
|
||||
[通用助手工作栏与执行空间 PRD](./prd.md)
|
||||
继续负责工作栏的应用级位置、稳定能力目录、执行空间、范围绑定和总体产品边界。本文不重新
|
||||
定义 Host Key、凭据、Agent 安装、Ask/Execute Runtime 或项目持久化契约。
|
||||
定义 Host Key、凭据、Agent 安装、Runtime 执行或项目持久化契约。
|
||||
|
||||
## 2. 背景与当前问题
|
||||
|
||||
当前工作栏在聊天页面右侧固定显示“任务中心、工作区、浏览器、成果”四个 Tab。用户不能:
|
||||
最初的聊天右栏固定显示“任务中心、工作区、浏览器、成果”四个 Tab。当时用户不能:
|
||||
|
||||
- 通过统一入口按需打开新的工作栏应用。
|
||||
- 按应用策略关闭并重新打开可关闭的工作栏应用。
|
||||
@@ -43,7 +43,7 @@ SSH 连接池,但尚不存在工作栏应用实例模型、终端 IPC、终端
|
||||
|
||||
### 3.1 工作栏应用
|
||||
|
||||
工作栏应用是可以在助手工作栏中打开的一个能力,例如任务中心、工作区、浏览器、成果或
|
||||
工作栏应用是可以在助手工作栏中打开的一个能力,例如任务中心、工作区、浏览器或
|
||||
终端、笔记。每项应用通过统一注册表声明:
|
||||
|
||||
- 稳定应用 ID。
|
||||
@@ -77,14 +77,14 @@ SSH 连接池,但尚不存在工作栏应用实例模型、终端 IPC、终端
|
||||
`defaultOpen`、`required` 和 `closable` 不互相推导。例如浏览器默认打开但不是必需实例;任务
|
||||
中心和工作区既默认打开又必须存在。`required` 不表示锁定顺序,顺序只由 `reorderable` 控制。
|
||||
|
||||
当前六个应用的 `visibleAcrossContextSwitches` 均为 `true`。该属性记录应用目录的显示策略,
|
||||
当前五个应用的 `visibleAcrossContextSwitches` 均为 `true`。该属性记录应用目录的显示策略,
|
||||
不改变内容归属,也不授予其他会话的 MCP 访问权限;当前没有使用 `false` 的应用,尚未实现
|
||||
按上下文隐藏 Tab 的策略。
|
||||
|
||||
浏览器在创建时绑定当前 Conversation;切换会话后仍保留原 Tab、选中状态和页面,导航操作
|
||||
继续使用原 `targetRef.conversationId`。此时新建浏览器才绑定新会话。默认或旧布局中尚未绑定
|
||||
的浏览器在首次使用时绑定活动会话,此后不再随会话切换改绑。终端同样保留创建时执行目标;
|
||||
任务中心、工作区和成果的内容继续跟随当前项目。笔记使用应用级范围,选择与草稿不随项目或
|
||||
任务中心和工作区的内容继续跟随当前项目。笔记使用应用级范围,选择与草稿不随项目或
|
||||
会话切换,不接受 `targetRef`;重启仅恢复工作栏 Tab 描述,不恢复笔记选择和草稿。
|
||||
|
||||
### 3.2 工作栏 Tab 实例
|
||||
@@ -119,8 +119,8 @@ stdio fallback。首期远程终端随 SSH Channel 结束,不提供跨 SSH 或
|
||||
6. 多实例应用每次选择都创建新实例。
|
||||
7. 终端从首期开始就是多实例应用。
|
||||
8. 任务中心和工作区保持单实例、默认打开且不可关闭,分别固定在第一、第二位,`reorderable` 为 `false`。恢复旧布局时也按此规则修正顺序,其余 Tab 保持相对顺序。
|
||||
9. 浏览器注册为可关闭的多实例应用,升级后保留一个默认实例;成果保持单实例、默认打开且
|
||||
可关闭。
|
||||
9. 浏览器注册为可关闭的多实例应用,升级后保留一个默认实例。成果应用已移除,旧布局过滤
|
||||
其实例,其他 Tab 及偏好保留。
|
||||
10. 用户关闭可关闭实例、切换或重排应用 Tab 后,“+”仍保持可见。
|
||||
11. 选择“终端”后不再显示第二层目标选择器。存在当前项目时直接绑定该项目,由 Main
|
||||
根据项目执行空间自动打开本机或托管 SSH Shell;没有当前项目时打开本机 Home Shell。
|
||||
@@ -128,7 +128,7 @@ stdio fallback。首期远程终端随 SSH Channel 结束,不提供跨 SSH 或
|
||||
Shell,不伪装为恢复旧进程。
|
||||
13. 工作栏收起、切换主页面或切换 Tab 不终止终端;显式关闭终端 Tab 才终止对应 Shell。
|
||||
14. 应用重启不自动启动 Shell。恢复的终端 Tab 显示“会话已结束”,由用户显式重新连接。
|
||||
15. 终端是用户交互表面。Ask/Execute 继续约束 Agent Runtime,不把用户键盘操作误判为
|
||||
15. 终端是用户交互表面。Agent Runtime 沿用能力与资源范围,不把用户键盘操作误判为
|
||||
Agent 工具调用;Agent、自动化和模型不得未经明确用户操作向终端注入输入。
|
||||
16. 工作栏继续按上位 PRD 提升为应用级容器;切换聊天、知识、魔法笔记或活动记录等主页面
|
||||
不销毁 Tab 实例或终端 Session。
|
||||
@@ -185,7 +185,7 @@ stdio fallback。首期远程终端随 SSH Channel 结束,不提供跨 SSH 或
|
||||
- 标签全部可见时移除左右滚动按钮及其占位;溢出时左右箭头在滚动视口两侧各占独立的 28px 宽度,不覆盖标签、关闭按钮或“+”。鼠标移入标签栏时显示可滚动方向的箭头,移出后隐藏;键盘聚焦箭头时显示,无悬停能力的设备保持可滚动方向的箭头可见。悬停箭头时显示轻微底色。点击滚动约一屏,边界方向禁用并隐藏;溢出期间隐藏和禁用均保留占位,避免布局跳动。切换或新增激活标签时将整个标签(含关闭按钮)滚入可见区域。未激活标签使用低对比度灰蓝底色和细边框,激活标签保留亮底与强调色顶线。
|
||||
- 终端 Tab 默认使用递增标题,例如“终端 1”“终端 2”;状态栏持续显示项目、Host、
|
||||
工作目录和 Shell。用户可以重命名终端。
|
||||
- 任务中心、工作区、成果及新建终端的默认标题随界面语言切换,恢复布局时也使用当前语言。
|
||||
- 任务中心、工作区及新建终端的默认标题随界面语言切换,恢复布局时也使用当前语言。
|
||||
终端自定义名称保持原文;旧布局中的终端名称保持原值,即使看起来像“终端 1”。浏览器
|
||||
标题沿用现有行为,不在本次标题国际化范围内。
|
||||
- 当前 Tab 同时使用连续内容表面、选中边框、顶部强调线、图标和较高字重,不能只靠文字颜色。
|
||||
@@ -218,7 +218,6 @@ stdio fallback。首期远程终端随 SSH Channel 结束,不提供跨 SSH 或
|
||||
| 任务中心 | `single` | 当前项目 | 是 | 是 | 否 | 否 | 聚焦已有 Tab |
|
||||
| 工作区 | `single` | 当前项目 | 是 | 是 | 否 | 否 | 聚焦已有 Tab |
|
||||
| 浏览器 | `multiple` | 当前 Conversation | 是,一个实例 | 否 | 是 | 是 | 每次创建新 Tab |
|
||||
| 成果 | `single` | 当前项目 | 是 | 否 | 是 | 是 | 聚焦已有 Tab |
|
||||
| 终端 | `multiple` | 当前项目 | 否 | 否 | 是 | 是 | 每次创建新 Tab |
|
||||
| 笔记 | `single` | 应用级 | 否 | 否 | 是 | 是 | 聚焦已有 Tab |
|
||||
|
||||
@@ -334,7 +333,7 @@ type TerminalSessionState =
|
||||
|
||||
```ts
|
||||
type WorkbarAppDefinition = {
|
||||
id: 'tasks' | 'workspace' | 'browser' | 'results' | 'terminal'
|
||||
id: 'tasks' | 'workspace' | 'browser' | 'notes' | 'terminal'
|
||||
label: string
|
||||
icon: WorkbarAppDefinition['id']
|
||||
description: string
|
||||
@@ -463,8 +462,8 @@ Sidebar 在渲染时按当前语言派生应用和默认终端标题,再交给
|
||||
## 13. 权限与边界
|
||||
|
||||
- 用户终端以当前本机账号或所选 SSH 账号的正常权限运行,不增加额外虚构的 trust tier。
|
||||
- Ask/Execute 是 Agent Runtime 模式,不自动改变用户直接操作终端的 OS 权限。
|
||||
- UI 必须持续将其标注为“用户终端”,避免被理解为 Ask Runtime 的只读输出。
|
||||
- Agent Runtime 配置不自动改变用户直接操作终端的 OS 权限。
|
||||
- UI 必须持续将其标注为“用户终端”,避免被理解为 Runtime 的只读输出。
|
||||
- Agent、模型、监督器和自动化不能调用终端 write,也不能把指令注入已有 Session。
|
||||
- 终端输出不会自动进入对话上下文、模型 Prompt、成果或活动记录。
|
||||
- Renderer 只能引用项目和 Session 的公开 ID;Main 从权威 store 解析目录、Host、凭据和
|
||||
@@ -569,7 +568,7 @@ Schema、假数据终端或不可用入口的中间产品。
|
||||
- [x] 关闭可关闭的活动 Tab 后激活正确的相邻 Tab 并恢复焦点。
|
||||
- [x] 当前 Tab 的背景、边框、顶部指示和字重清晰可辨;关闭按钮仅在悬停、焦点或无悬停
|
||||
设备上出现,且不引发布局位移。
|
||||
- [x] 升级后任务中心、工作区、一个浏览器实例和成果按默认布局打开;布局恢复会补回缺失的
|
||||
- [x] 升级后任务中心、工作区和一个浏览器实例按默认布局打开;布局恢复会补回缺失的
|
||||
任务中心与工作区。
|
||||
- [ ] 在所有主要页面都能打开工作栏;切换主要页面不会销毁 Tab 实例或终端 Session。
|
||||
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# 工作区文件导入与时间
|
||||
|
||||
## 产品与交互
|
||||
|
||||
FR-WF1:工作区展示当前项目执行目录内的实际文件。成果页、工作栏注册项和独立成果导入入口
|
||||
已移除。旧布局只过滤 `results` 实例,保留其他实例、目标、展开状态和宽度;若活动实例被移除,
|
||||
按现有布局规则选择第一个保留实例。
|
||||
|
||||
FR-WF2:文件页提供“导入文件”。初始目标为项目根目录;点击树中的目录后以该目录为目标,
|
||||
点击文件后以其父目录为目标,“浏览此目录”同时更新目标。目标路径常显,打开选择器后固定
|
||||
本次项目与目标,不因切换会话或项目改变写入位置。本机从选定文件复制字节,远程上传到所选
|
||||
Host 的项目目录。支持二进制和空文件,不调用文档解析器,也不创建 artifact 数据库记录。
|
||||
|
||||
同名文件不覆盖。批次逐项处理,失败后继续其余文件;成功数量、目标和失败原因通过应用通知
|
||||
显示。写入失败时尝试移除本次新建的部分文件,清理失败则报告残留路径。取消文件选择不写入,
|
||||
导入期间禁用重复提交。完成后刷新目录。当前不提供传输中取消或进度百分比。
|
||||
|
||||
FR-WF3:名称默认升序。名称、修改时间和有可用数据时的创建时间列均可点击切换排序;首次
|
||||
选择时间列按最新优先。每一级目录独立排序且目录优先,缺失时间放在同类条目末尾,显示 `-`。
|
||||
每目录沿用最多 500 条的读取上限,排序只覆盖已读取条目,截断提示保留。窄栏横向滚动仅发生在
|
||||
文件视口,工具栏保持可见。
|
||||
|
||||
US-WF1:选中子目录后导入二进制及空文件,目录刷新后可见,原文件不变。同名项失败而已有
|
||||
内容保留;成功项仍落在所选目录。
|
||||
|
||||
US-WF2:切换排序后文件按真实文件系统时间显示;不支持创建时间的文件系统不显示创建时间列,
|
||||
混合数据中缺失值保留为空。Linux 的 inode 状态变更时间不冒充创建时间。
|
||||
|
||||
US-WF3:升级前会话图片在聊天和重新打开应用后仍可读取;打开工作区不会把会话图片或附件复制
|
||||
到项目目录。生成的普通文件由 Runtime 文件工具写入工作区并出现在同一目录列表。
|
||||
|
||||
## 存储与实现
|
||||
|
||||
`WorkspaceFilesPanel` → preload `workspace.importFiles(projectId, path)` → Main
|
||||
`workspace:import-files` 验证发送方与共享路径契约,固定项目执行空间并打开原生文件选择器。
|
||||
`importWorkspaceFiles` 使用已有 `WorkspaceAccess.manage`,先独占创建目标,再以 256 KiB
|
||||
块读取和写入;每次写入检查目标大小与偏移。内存不随文件总大小增长。文件大小受磁盘和权限
|
||||
约束,不沿用旧成果导入的预览类型与大小限制。
|
||||
|
||||
远程复用 `RemoteWorkspaceAccess`、`ProtocolRemoteWorkspaceTransport` 和 Agent
|
||||
`workspace/manage`。新增 `importFile` 动作的 Base64 块受共享 schema 限制,完整请求低于
|
||||
1 MiB 控制帧上限。该动作需要含本次源码的新 Agent;旧 Agent 会拒绝新动作并报告失败,
|
||||
不能声称旧版已支持上传。文件读取和既有管理操作仍走原通路。
|
||||
|
||||
本机目录按条目读取 `lstat`,远程复用 Agent 已有目录元数据;两端传递 `mtime` 和有效正值
|
||||
`birthtime`。缺失 birthtime 时省略 `createdAt`,从不回退为 `ctime`。Renderer 不逐文件发 IPC。
|
||||
|
||||
现有 `artifacts` 表包含 `createImageArtifact` 保存的内联图片、会话上传源图引用以及旧导入
|
||||
内容,并非项目文件索引。移除成果页不迁移、不删除这些记录;`artifacts.get/list`、消息
|
||||
`artifactIds`、图片恢复与编辑读取保留。图片生成结果继续作为会话图片保存;需要实际图片文件
|
||||
时由 `save_image` 使用会话图片 ID 显式保存到 Runtime 主机的指定路径,远程项目写到远程 Host,
|
||||
不需要成果页。引用发现与保存契约见[图片保存工具](../conversation-media-generation/technical-design.md#图片保存工具)。
|
||||
不会自动给旧图片批量创建文件,也不会把聊天附件
|
||||
复制到项目。图片工具仍接受其既有路径契约,本次未修改生成或保存工具的运行权限。
|
||||
|
||||
验收命令与实际验证边界记录在[进度](./progress.md)。
|
||||
@@ -43,7 +43,7 @@ Observe
|
||||
2. 新候选默认 `candidate`,通过离线评估后先进入 `shadow`。
|
||||
3. 第一阶段只允许人工晋升。
|
||||
4. 每次晋升必须记录 Baseline、候选、评估结果、作用域和回滚版本。
|
||||
5. 学习不能修改安全边界、工具审批、目录权限、沙箱或 Electron 配置。
|
||||
5. 学习不能修改能力分配、目录权限、沙箱或 Electron 配置。
|
||||
6. 失败案例和用户负反馈只作为评估数据,不直接成为新规则。
|
||||
7. 回放案例必须脱敏、版本化,并得到用户明确选择或来自仓库公开样例。
|
||||
8. 模型评估不是唯一真值,优先使用确定性验收和人工反馈。
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## 能力与调用时点
|
||||
|
||||
L-1(FR-1、FR-3、FR-7、FR-9;US-01、US-08、US-11、US-15 至 US-19):自动生成与编辑要求图片连接允许会话调用、协议支持所需操作、聊天模型支持工具调用且当前请求处于 Execute。直连文本 Model Runtime、本地 OpenCode、Continue、DeepSeek Harness 及 GoodBuddy Agent 远程适用 Runtime 均须接入同一图片能力,内部工具或 MCP 注入由 GoodBuddy 管理。
|
||||
L-1(FR-1、FR-3、FR-7、FR-9;US-01、US-08、US-11、US-15 至 US-19):自动生成与编辑要求图片连接允许会话调用、协议支持所需操作、聊天模型支持工具调用。直连文本 Model Runtime、本地 OpenCode、Continue、DeepSeek Harness 及 GoodBuddy Agent 远程适用 Runtime 均须接入同一图片能力,内部工具或 MCP 注入由 GoodBuddy 管理。
|
||||
|
||||
允许调用的模型目录取自已保存且“允许 AI 在会话中调用”开启的图片模型配置。目录非空时,图片生成与编辑能力的全部支持 Runtime 分配自动勾选;目录为空时全部取消勾选。模型配置是唯一事实来源,不保存独立可变的能力启用或分配设置,用户不能操作分配复选框。
|
||||
|
||||
@@ -13,11 +13,11 @@ L-1(FR-1、FR-3、FR-7、FR-9;US-01、US-08、US-11、US-15 至 US-19):
|
||||
| 首次开启或重新开启一个图片模型 | 自动勾选全部支持 Runtime,目录包含该模型 |
|
||||
| 关闭或删除一个模型,仍有其他开启模型 | 分配保持勾选,从目录移除该模型 |
|
||||
| 最后一个开启模型被关闭或删除,或从未开启任何模型 | 全部分配取消勾选,目录为空;能力行、说明和模型设置入口仍可见 |
|
||||
| Runtime 离线、聊天模型无工具能力、Ask、配置或执行错误 | 保持按模型开关推导的勾选和目录,另行显示调用限制或错误 |
|
||||
| Runtime 离线、聊天模型无工具能力、配置或执行错误 | 保持按模型开关推导的勾选和目录,另行显示调用限制或错误 |
|
||||
|
||||
配置保存成功后同步刷新分配展示和允许模型目录;保存失败时保留最后已保存配置推导的状态。分配不表示运行就绪,也不保证每个图片模型支持编辑;协议及实际提交校验仍适用。
|
||||
|
||||
请求开始和聊天模型、Runtime、配置切换后刷新可用能力;进程复用也须刷新。运行中的聊天回合保留原工具协议,Main 在实际提交前检查最新配置及工作模式,已关闭的连接不能接受新操作。无工具模型说明限制并提示已有直连图片工作流;Ask 不提交生成或编辑,不自动切换模式。Runtime 接入尚未完成属于实施缺口,不能作为减少支持范围的规则。
|
||||
请求开始和聊天模型、Runtime、配置切换后刷新可用能力;进程复用也须刷新。运行中的聊天回合保留原工具协议,Main 在实际提交前检查最新配置,已关闭的连接不能接受新操作。无工具模型说明限制并提示已有直连图片工作流。Runtime 接入尚未完成属于实施缺口,不能作为减少支持范围的规则。
|
||||
|
||||
## 模型和素材选择
|
||||
|
||||
@@ -47,7 +47,7 @@ L-3(FR-4;US-03 至 US-07、US-11、US-15):Main 接受提交时固定原
|
||||
| 离开或重开会话 | 使用当前请求及全局配置 | 只更新原会话,历史成果仍可引用 |
|
||||
| 远程断连 | 未被 Main 接收的请求不能声称已提交 | 桌面仍运行时由 Main 继续管理已接收操作 |
|
||||
|
||||
“停止回复”只结束文字回合;“取消生成”单独处理图片操作。切到 Ask 不撤销先前 Execute 已提交的操作,也不允许新增生成。运行时切换不自动唤起新的 LLM 请求。
|
||||
“停止回复”只结束文字回合;“取消生成”单独处理图片操作。关闭会话调用后不接受新操作,已提交操作沿用原有取消流程。运行时切换不自动唤起新的 LLM 请求。
|
||||
|
||||
## 操作状态
|
||||
|
||||
@@ -75,4 +75,4 @@ L-5(FR-5、FR-8;US-07、US-12、US-14、US-15):历史上下文提供成
|
||||
|
||||
## 完整性与实施验证
|
||||
|
||||
规则覆盖配置、新建、上传图与历史图编辑、模型与 Runtime 切换、Ask、无工具或无视觉模型、取消、失败、重启和会话归属。没有待定产品范围;各 Runtime 工具注入、远程往返及取消传播的具体接法需在实施时核验,按[技术设计](./technical-design.md)完成真实路径验收。视频、跨设备同步和应用退出后的本地执行不在范围内。
|
||||
规则覆盖配置、新建、上传图与历史图编辑、模型与 Runtime 切换、无工具或无视觉模型、取消、失败、重启和会话归属。没有待定产品范围;各 Runtime 工具注入、远程往返及取消传播按[技术设计](./technical-design.md)完成真实路径验收。视频、跨设备同步和应用退出后的本地执行不在范围内。
|
||||
|
||||
@@ -24,11 +24,11 @@ GoodBuddy 自动管理内部工具或 MCP 注入,复用模型连接与凭据
|
||||
| FR-4 | 支持聊天模型、Runtime 及生成模型切换 | 切换后可发起新的生成和编辑;已提交操作固定原模型和原会话,不重复提交 |
|
||||
| FR-5 | 支持上传素材、历史成果引用与连续编辑 | 重开会话及切换 Runtime 后可引用已保存原图;缺失素材或能力不足时保留输入并提示处理方式 |
|
||||
| FR-6 | 生成操作独立显示状态,支持取消及人工重新生成 | 离开会话不取消;保存成功才完成;不虚构进度,不自动重试收费请求;重启后未完成操作显示结果未确认 |
|
||||
| FR-7 | 遵循工作模式及模型能力边界 | Ask 不提交生成或编辑;无工具模型说明限制,可使用已有直连图片工作流,无需新增表单 |
|
||||
| FR-7 | 遵循模型与能力配置 | 已允许会话调用的连接可生成或编辑;无工具模型说明限制,可使用已有直连图片工作流,无需新增表单 |
|
||||
| FR-8 | 图片作为会话成果保存 | 可预览、导出和重新打开,来源模型可追溯;无视觉聊天模型只接收文字事实及引用,不编造观察 |
|
||||
| FR-9 | 本地及 GoodBuddy Agent 远程适用 Runtime 均支持图片工具;GoodBuddy 管理的图片生成与编辑能力及 Runtime 分配持续可见 | 分别完成真实生成、编辑、切换验收;分配复选框只读,不可手动切换;无开启模型时仍显示该行、未勾选状态、自动管理说明及模型设置入口;无独立能力启停、分配、移除或凭据编辑设置,用户无需维护 Skill 或 MCP server |
|
||||
|
||||
分配表示模型配置允许的调用范围。聊天模型不支持工具、Ask、Runtime 离线、配置错误或执行失败均单独说明,不取消配置分配的勾选;不保存可独立修改的能力启用或 Runtime 分配状态。具体推导与刷新规则由 L-1 定义。
|
||||
分配表示模型配置允许的调用范围。聊天模型不支持工具、Runtime 离线、配置错误或执行失败均单独说明,不取消配置分配的勾选;不保存可独立修改的能力启用或 Runtime 分配状态。具体推导与刷新规则由 L-1 定义。
|
||||
|
||||
## 产品验收
|
||||
|
||||
|
||||
@@ -81,3 +81,34 @@
|
||||
- `deai-writing` 扫描:阻断项为 0;人工复核保留设计状态、能力边界和禁止行为等必要限定,以及真实并列的验收项。
|
||||
- 独立一致性审阅发现“重新生成”与“重试保存”的操作身份表述不一致,已在 L-4 和 US-09 中统一:前者创建新操作,后者更新原操作。
|
||||
- `git diff --check` 通过。上述检查只验证文档,不构成功能验收。
|
||||
## 2026-10-04:会话图片保存工具发现修复
|
||||
|
||||
`save_image` 现在也列出仅由消息 `artifactIds` 引用的图片,过滤缺失及非图片记录,
|
||||
按最近引用去重后取最近 32 张。已发布字段、图片记录及普通消息 metadata 保留。
|
||||
共享参数说明明确 ID 来自会话图片、上传图片或 `generate_image`,无需成果页,
|
||||
保存会在 Runtime 主机写入实际文件。契约见[图片保存工具](./technical-design.md#图片保存工具)。
|
||||
|
||||
验证:四个专项文件 `image-generation-service.test.ts`、`image-tool-mcp.test.ts`、
|
||||
`protocol-remote-runtime-channel.test.ts`、`image-runtime-integration.test.ts` 共 70 项通过;
|
||||
覆盖关闭图片生成后的保存发现、SQLite 重新打开后的字节保存、混合引用过滤与去重、
|
||||
数据库错误传播、远程 save-only 描述及 MCP 参数说明。`npm run typecheck` 和
|
||||
`npm run lint` 通过。
|
||||
|
||||
[源码 Host 探针](../../../scripts/image-save-host-probe.ts)沿用现有 pinned SSH/stdin 工具消息传输,
|
||||
桌面运行当前 `ImageGenerationService` 与 `MainImageToolSession`,共享 Linux x64 Host
|
||||
运行当前 `AgentImageToolMcp`。实测从重新打开的桌面 SQLite 发现单独 `artifactIds` 图片,
|
||||
远程 MCP 仅列出 `save_image`,分三块读取后写入 307268 字节 PNG,SHA-256 与桌面一致:
|
||||
`5beca5523d8adbb5eb9719b692f9c9c0ccc06efd05d770a5e8a541fece4c1aa3`。
|
||||
图片包含用于分块验证的尾随字节。模型调用为 0,测试目录内的数据库与图片在结束时清理。
|
||||
|
||||
复跑时用 esbuild 将探针打包为 Node CJS,`electron` 和 `*.node` 保持 external,
|
||||
`zod`、`zod/v4`、`zod/v3`、`zod/v4-mini` 分别 alias 到各自包内的 `index.cjs`,
|
||||
避免当前 Zod ESM bundle 初始化错误。将 bundle 传至 Host 专用 `/root/tmp` 目录,
|
||||
桌面设置 `NODE_PATH` 指向仓库 `node_modules` 后运行:
|
||||
|
||||
```text
|
||||
node <local-probe.cjs> <ssh-host> <remote-probe.cjs>
|
||||
```
|
||||
|
||||
本次真实验证覆盖 MCP 发现及同格式文件保存;生产 `preparePrompt` 描述传递由协议测试覆盖。
|
||||
没有执行完整桌面 UI、Agent 安装/升级、生产二进制帧传输或真实模型选工具,也未验证远程格式转换。
|
||||
|
||||
@@ -25,7 +25,7 @@ Main 持有图片请求、取消句柄及结果保存职责,生命周期独立
|
||||
|
||||
稳定图片工具 `generate_image` 同时负责生成和编辑。当前输入为 `prompt`、可选 `modelProfileId`、`intent`(`create` 或 `edit`)、`sourceArtifactIds` 和可选 `quality`;类型及编辑素材约束由 `src/shared/image-generation-contracts.ts` 校验。每次请求沿用已有协议的单图生成和尺寸行为,没有新增数量或尺寸参数。原会话、触发消息和工具调用关联由运行上下文绑定,LLM 不能自由指定结果写入位置或任意文件路径。
|
||||
|
||||
每个新回合提供可调用图片模型的脱敏 ID、名称及生成、编辑能力,模型切换、配置变化或进程复用时刷新。Main 提交前重新校验工作模式、连接开关、所需能力及素材。优先由工具描述承载模型选择、图片引用和结果使用说明,不把 Skill 管理作为依赖。
|
||||
每个新回合提供可调用图片模型的脱敏 ID、名称及生成、编辑能力,模型切换、配置变化或进程复用时刷新。Main 提交前重新校验连接开关、所需能力及素材。优先由工具描述承载模型选择、图片引用和结果使用说明,不把 Skill 管理作为依赖。
|
||||
|
||||
直连文本 Model Runtime 使用内置工具契约及分发;外部 Runtime 复用内部 MCP 注入,由 GoodBuddy 自动注册、配置和管理生命周期,远程路径经现有 Agent 工具桥接调用同一服务。内置 MCP 列表中的图片行只展示这项受管能力,不代表直连 Model 也通过 MCP 调用。无需用户创建 Skill、另建 MCP server 或复制凭据,不按模型连接复制工具或 Skill。
|
||||
|
||||
@@ -35,6 +35,19 @@ Main 从已保存图片 profile 的会话调用开关推导允许模型目录,
|
||||
|
||||
工具等待遵循现有超时约束,返回操作 ID、实际模型、真实状态及完成后的成果 ID,不把 Base64 塞入工具历史。原回合仍有效时通过合法工具响应返回结果;回合结束或 Runtime 切换后,Main 继续写原会话,下一回合读取操作摘要及成果引用,不补发旧响应、不自动唤起 LLM 或重发图片请求。
|
||||
|
||||
## 图片保存工具
|
||||
|
||||
`save_image` 的 `artifactId` 沿用已发布的会话图片引用,来自上传图片、消息 `artifactIds`
|
||||
或 `generate_image` 返回的图片 ID,不是已移除成果页的入口要求。图片字节仍保存在
|
||||
会话图片存储中;保存工具按 `path` 将实际文件写入 Runtime 主机,远程项目写到远程 Host。
|
||||
|
||||
`ImageGenerationService.describeSave` 从 `imageSourceArtifactIds`、消息 `artifactIds`
|
||||
及 `imageOperations[].artifactIds` 收集引用,过滤不存在及非图片记录,按最近出现位置去重后
|
||||
保留最近 32 张,并按从旧到新排列。读取中的数据库错误继续上抛。即使没有启用图片生成模型,
|
||||
已有会话图片仍会启用保存工具;没有图片且不能生成时不提供该工具。
|
||||
远程 `preparePrompt` 转发同一保存说明,Agent MCP 使用共享输入契约并从 Desktop 分块读取
|
||||
图片后写文件。无需改名、数据库迁移或重新生成历史图片。
|
||||
|
||||
## 配置与持久化
|
||||
|
||||
| 对象 | 最小数据与职责 |
|
||||
@@ -69,9 +82,9 @@ Main 仅在图片和会话引用持久化成功后发布完成事件。素材必
|
||||
| 本地 Continue | 现有内部 MCP 注入转入同一服务 | 实际工具往返、能力刷新、生成编辑及切换 |
|
||||
| 本地 DeepSeek Harness | 现有内部 MCP 注入转入同一服务 | 实际工具往返、能力刷新、生成编辑及切换 |
|
||||
| GoodBuddy Agent 远程适用 Runtime | 复用桌面与 Agent 通信及工具桥接,将请求绑定原会话,由 Main 调用图片模型 | 逐一验证实际支持的远程 Runtime,覆盖真实 Host 工具往返、生成编辑、本地与远程双向切换、断连及成果归属 |
|
||||
| 无工具能力的聊天模型 | 说明自动调用限制,可使用已有直连图片工作流 | 不解析普通文字伪装工具调用,不新增表单;Ask 不提交 |
|
||||
| 无工具能力的聊天模型 | 说明自动调用限制,可使用已有直连图片工作流 | 不解析普通文字伪装工具调用,不新增表单 |
|
||||
|
||||
本地 OpenCode、Continue 和 DeepSeek Harness 经内部 MCP gateway 注入;直连 Model 使用内置工具分发。远程通过 `main-image-tool-session.ts`、Agent 协议和 `image-tool-mcp.ts` 回到同一 Main 服务。当前受管远程 Runtime 包括 OpenCode 和 Continue;Continue 模型桥的会话 MCP 交付及 Ask 边界见[远程 Runtime](../remote-host/technical-design.md#runtime)。保留会话在目录清空时也刷新 MCP,Continue 准备失败时释放本次分配的令牌。工具发现、无计费测试接收端往返或 Skill 注入成功不能代替真实生成与编辑。
|
||||
本地 OpenCode、Continue 和 DeepSeek Harness 经内部 MCP gateway 注入;直连 Model 使用内置工具分发。远程通过 `main-image-tool-session.ts`、Agent 协议和 `image-tool-mcp.ts` 回到同一 Main 服务。当前受管远程 Runtime 包括 OpenCode 和 Continue;Continue 模型桥的会话 MCP 交付见[远程 Runtime](../remote-host/technical-design.md#runtime)。保留会话在目录清空时也刷新 MCP,Continue 准备失败时释放本次分配的令牌。工具发现、无计费测试接收端往返或 Skill 注入成功不能代替真实生成与编辑。
|
||||
|
||||
Main 已接收的请求在桌面仍运行时独立于远程连接继续;未确认是否接收的请求不自动重放。聊天回合停止等待与用户取消图片是不同动作,须验证现有取消传播不会误杀 Main 图片请求。
|
||||
|
||||
@@ -79,7 +92,7 @@ Main 已接收的请求在桌面仍运行时独立于远程连接继续;未确
|
||||
|
||||
实施工作包括配置与选择、Main 图片服务提取、各本地及远程 Runtime 工具适配、成果与状态 UI。它们共同完成本图片功能,不按 Runtime 划分交付范围。
|
||||
|
||||
针对 L-1 至 L-5 验证选择优先级、失效配置、上传与历史素材、无视觉模型、Ask、会话归属、重复通知、取消及晚到结果。检查切换聊天模型、图片默认模型、本地与远程 Runtime 后的新生成和编辑,以及旧操作不重复提交。回归已有直连图片工作流。
|
||||
针对 L-1 至 L-5 验证选择优先级、失效配置、上传与历史素材、无视觉模型、会话归属、重复通知、取消及晚到结果。检查切换聊天模型、图片默认模型、本地与远程 Runtime 后的新生成和编辑,以及旧操作不重复提交。回归已有直连图片工作流。
|
||||
|
||||
按 US-16 至 US-19 验证从零到一个开启模型、多个中关闭或删除一个、最后一个关闭或删除、重新开启,以及配置错误和 Runtime 离线时的派生分配、目录刷新、行可见性与只读交互。重开设置和应用后均从模型配置推导,不恢复独立分配值;辅助技术可读取标签、勾选状态和说明,键盘可到达模型设置导航。
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
直连文本、本地各 Runtime 和 GoodBuddy Agent 远程适用 Runtime 使用一致的图片操作与成果反馈。切换后可继续生成及编辑历史图;工具调用异常时显示具体原因,不宣称已提交。接入未完成的开发状态记录在进度文档,不能作为产品支持范围。
|
||||
|
||||
不支持工具调用时提示“当前聊天模型无法自动调用图片工具,可使用已有直连图片工作流”。Ask 下提示“生成或编辑图片需要 Execute 模式”,由用户切换,不自动切换。无视觉能力时说明无法直接查看图片,不妨碍按用户文字调用编辑工具。
|
||||
不支持工具调用时提示“当前聊天模型无法自动调用图片工具,可使用已有直连图片工作流”。不显示工作模式切换提示。无视觉能力时说明无法直接查看图片,不妨碍按用户文字调用编辑工具。
|
||||
|
||||
## 图片卡片
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## 场景验收
|
||||
|
||||
适用的自动调用场景须在直连文本 Model Runtime、本地 OpenCode、Continue、DeepSeek Harness 和 GoodBuddy Agent 远程适用 Runtime 分别验证,前提为 Execute 且聊天模型支持工具调用。切换验收同时检查原操作归属和目标 Runtime 的新生成、编辑能力。
|
||||
适用的自动调用场景须在直连文本 Model Runtime、本地 OpenCode、Continue、DeepSeek Harness 和 GoodBuddy Agent 远程适用 Runtime 分别验证,前提为图片连接允许会话调用且聊天模型支持工具调用。切换验收同时检查原操作归属和目标 Runtime 的新生成、编辑能力。
|
||||
|
||||
| 编号 | 需求 | Given | When | Then |
|
||||
| --- | --- | --- | --- | --- |
|
||||
@@ -15,7 +15,7 @@
|
||||
| US-05 | FR-2、FR-4 | 当前操作使用图片模型 X | 将全局默认改为 Y,再请求新建图片 | 旧操作仍用 X,新操作用 Y;本次明确指定可覆盖默认 |
|
||||
| US-06 | FR-1、FR-2、FR-4 | 默认或本次指定模型为 X | X 被关闭或删除后请求生成 | 显示 X 不可用并提示改选,历史图仍可打开,不静默换模型 |
|
||||
| US-07 | FR-5、FR-8 | 已保存图片并重新打开会话或切换 Runtime | 引用原图,指定另一个支持编辑的模型 | 新模型接收原图;素材缺失时要求重新选择,不能假装已编辑 |
|
||||
| US-08 | FR-7 | 当前聊天模型不支持工具调用,或处于 Ask | 请求生成或编辑 | 无工具能力时说明可使用已有直连图片工作流;Ask 下不提交并提示需要 Execute,不自动切换模式 |
|
||||
| US-08 | FR-7 | 当前聊天模型不支持工具调用 | 请求生成或编辑 | 说明可使用已有直连图片工作流,不显示模式切换提示 |
|
||||
| US-09 | FR-6 | 操作正在生成或保存,或已经失败 | 取消,或明确要求重新生成 | 如实显示取消结果;人工重新生成创建新操作,不自动重复收费请求,不提供独立保存重试入口 |
|
||||
| US-11 | FR-4、FR-9 | 使用 GoodBuddy Agent 远程适用 Runtime | 生成及编辑图片,切换本地后继续编辑,再切回远程生成 | 工具往返可用,成果可继续引用;活动归原会话,凭据留在 Main;远程断连不取消 Main 已接收的操作 |
|
||||
| US-12 | FR-5、FR-7、FR-8 | 聊天模型无视觉能力但支持工具 | 请求分析图片或根据文字修改图片 | 说明无法直接查看图片;可传原图给编辑工具,不编造视觉观察 |
|
||||
@@ -25,10 +25,10 @@
|
||||
| US-16 | FR-1、FR-9 | 尚无开启会话调用的图片模型 | 查看内置 MCP 列表,再开启一个图片模型并保存 | 图片生成与编辑行一直可见且标记“内置 · 自动管理”;全部支持 Runtime 从未勾选变为勾选,目录包含该模型;重开设置或应用仍按模型配置显示 |
|
||||
| US-17 | FR-1、FR-9 | 至少两个图片模型开启会话调用 | 关闭或删除其中一个并保存 | 全部支持 Runtime 保持勾选,允许目录移除该模型、保留其他开启模型;新操作不能调用已关闭或删除模型 |
|
||||
| US-18 | FR-1、FR-9 | 仅剩一个开启会话调用的图片模型 | 关闭或删除该模型,再重新开启或添加并开启一个模型 | 目录为空时全部取消勾选,整行和说明、模型设置导航仍可见;再次开启后自动恢复全部勾选,无需另行分配 |
|
||||
| US-19 | FR-1、FR-7、FR-9 | 至少一个图片模型开启会话调用 | 尝试用鼠标或键盘切换分配,或切换到无工具聊天模型、Ask、离线 Runtime,或遇到配置或执行错误 | 分配不可手动修改,运行限制与错误不取消勾选;无独立启用、分配保存、移除或凭据编辑操作;自动管理说明持续可读,辅助技术可识别勾选和禁用状态,键盘可通过“前往图片模型设置”导航修改源配置 |
|
||||
| US-19 | FR-1、FR-7、FR-9 | 至少一个图片模型开启会话调用 | 尝试用鼠标或键盘切换分配,或切换到无工具聊天模型、离线 Runtime,或遇到配置或执行错误 | 分配不可手动修改,运行限制与错误不取消勾选;无独立启用、分配保存、移除或凭据编辑操作;自动管理说明持续可读,辅助技术可识别勾选和禁用状态,键盘可通过“前往图片模型设置”导航修改源配置 |
|
||||
|
||||
## 编号变更
|
||||
|
||||
US-10(图生视频)移出本图片设计范围,编号保留,不安排实施。US-02、US-05、US-06 的会话选择预期由全局默认和本次指定替代;US-08 使用已有直连图片工作流;US-09 取消独立保存重试要求;US-13 的视频查询恢复由图片中断状态说明替代。其余编号保持,US-15 补充上传图片编辑的显式验收。
|
||||
|
||||
US-16 至 US-19 补充自动管理分配验收,设置展示不依赖 Execute 或当前聊天模型支持工具;自动生成与编辑仍遵循本节的调用前提。
|
||||
US-16 至 US-19 补充自动管理分配验收,设置展示不依赖当前聊天模型支持工具;自动生成与编辑仍遵循本节的调用前提。
|
||||
|
||||
@@ -224,7 +224,7 @@ type SupervisorDecision = {
|
||||
|
||||
以下检查由代码执行:
|
||||
|
||||
- Ask 出现写工具请求。
|
||||
- 明确要求只分析的任务偏离用户意图,尝试写入。
|
||||
- 工具或路径超出计划快照。
|
||||
- 未经批准的跨项目或跨分区读取。
|
||||
- Token、时间、工具、Job/Subjob 和成果预算。
|
||||
|
||||
@@ -4,6 +4,50 @@
|
||||
|
||||
当前记录以已验证生产行为为准。监督者尚未覆盖全部 user stories。
|
||||
|
||||
## 2026-10-04 回顾初始化阻塞修复
|
||||
|
||||
对应 FR-S4、FR-S6、FR-S10、US-S12、US-S26、US-S27。原全局七天回顾在 Main 的一个 `BEGIN IMMEDIATE` 内扫描 25 页来源,首次 Electron 复现初始化 16.208 秒,IPC 等待 16.221 秒,阻塞发生在模型调用前。初始化现由现有 Worker 入口的独立连接执行,单次扫描后按 200 条写入;取消、未完成清单重建及发布事务的合同见[调度与存储](./review-scheduling-design.md#已接入的调度与存储)。继续前的全清单版本检查同样移出 Main;单批片段读取约 2 ms,保留原路径。候选、摘要和背景复用既有只读查询 Worker。
|
||||
|
||||
数据沿用此前 SQLite online backup 得到的 2,429,247,488 字节安全快照,输入 schema 58。所有写入只发生在临时副本;当前工作树含并行 schema 59 执行统计改动,副本初始化会应用该升级。本次未修改迁移、原库、设置或自动计划。周范围为 UTC+08:00 的 2026-09-27 13:58:52 至 2026-10-04 13:58:52,包含 1,167 条消息、68 个会话;五分钟控制范围包含 9 条消息、4 个会话。
|
||||
|
||||
Electron 44.5.1,复用原生产服务探针、最小隔离 Renderer、10 ms Main 定时器、20 ms Renderer 定时器及 IPC ping。本地确定性 Runtime 首次响应后请求暂停,来源收集、SQL、提示组装、状态和取消处理使用生产代码。原复现 bundle 与修复版交替测量各三轮:
|
||||
|
||||
| 场景/指标 | 原版三轮范围 | 修复版三轮范围 | 最终版本复核 |
|
||||
| --- | --- | --- | --- |
|
||||
| 周范围初始化 | 16.641–17.911 s | 1.099–1.146 s | 1.122 s |
|
||||
| 周范围 Main 定时器最大延迟 | 16.663–17.939 s | 21.96–36.37 ms | 17.17 ms |
|
||||
| 周范围最慢 IPC | 16.642–17.928 s | 8.1–14.7 ms | 4.7 ms |
|
||||
| 小范围初始化 | 1.404–1.468 s | 0.588–0.872 s | 0.832 s |
|
||||
| 小范围 Main 定时器最大延迟 | 1.430–1.476 s | 18.37–29.69 ms | 14.51 ms |
|
||||
| 小范围最慢 IPC | 1.417–1.485 s | 0.6–25.3 ms | 1.3 ms |
|
||||
|
||||
三轮测量后在来源哈希回调增加取消检查,再复核上表最后一列及初始化中暂停/取消。周范围到本地 Runtime 首次调用 1.260 秒,到暂停返回 1.314 秒;小范围分别为 0.956、1.004 秒。全部完成初始化的运行与原清单逐行比较来源键、版本、项目、会话、顺序、码点长度及起始/已处理位置,哈希一致;周范围 1,167 条、小范围 9 条均未截断。Renderer 最大定时器间隔约 21–23 ms。计时包含 Main 调度和系统定时器误差,不等同于每次同步调用耗时;有一轮 Main 最大延迟 36.37 ms,未宣称达到全部性能预算。
|
||||
|
||||
初始化启动约 210 ms 时发出暂停,调用受理耗时 0.37 ms,约 310 ms 时完全返回;取消受理耗时 3.41 ms,约 312 ms 时完全返回。两个场景都保留停止中的执行位置,到 Worker 结束才释放;模型调用、清单来源和新 checkpoint 均为零。同时每 25 ms 执行一次数据库点查和生产任务状态写入:点查最大 0.55 ms、写入最大 7.26 ms,IPC 最大 10.8 ms。此前完整初始化并发写入轮的 43 次写入最大 21.65 ms。该探针验证数据库竞争和 Main 响应,未模拟完整聊天流或打开正式监督者页面。
|
||||
|
||||
验证:
|
||||
|
||||
- `npx vitest run src/main/assistant/supervision-worker.test.ts src/main/assistant/supervision-review.test.ts src/main/assistant/supervision-production.test.ts src/main/assistant/supervisor-service.test.ts src/main/readonly-query-reader.test.ts src/main/assistant/supervision-timeline.test.ts`:最终 6 个文件、74 项通过。真实 Worker 用例覆盖项目/全局/重分析、消息/任务/知识引用、Unicode 长度、旧 checkpoint、初始化暂停和取消、200 条后写入失败及重启重建、旧完整清单版本变化、缺失 Worker 不回退、Worker 异常/关闭后的请求结束、完整发布和下一次无变化。
|
||||
- 最终 `npm run typecheck` 通过 Main、Agent、Web;`npm run lint`、`git diff --check` 通过。源码没有新增 Worker 打包入口,真实 Worker 测试和 Electron 探针使用 esbuild 编译当前入口;未运行整包构建。中文文档扫描只复核本次新增和修改段落,既有历史段落不作无关改写。
|
||||
- 原报告和本次 JSON 保存在系统临时 `opencode/supervisor-freeze-compare-*` 目录。`supervisor-compare.cjs` 交替运行保留的原 bundle 与 `supervisor-fix-probe.cjs`,后者使用 `supervisor-fix-worker.cjs`。第三轮小范围在备份时曾因临时盘满失败;清理本次已完成运行的重复数据库、保留报告与原安全快照后,以 `4retry` 完成补测。失败尝试未进入回顾计时。
|
||||
|
||||
外部模型调用为 0 次。未运行全量测试、便携版打包或全局完整模型回顾;未提交或推送。监督取数及模型调度属于桌面服务,Agent 和远程模型桥未改变。最终发布大事务的 Main 延迟仍需另测,本次没有迁移该事务。
|
||||
|
||||
## 2026-10-04 工作回顾 Toast 反馈
|
||||
|
||||
对应 FR-S4、FR-S6、FR-S10、US-S24。`SupervisorWorkspace` 经 `HeartbeatCenter` 使用 App 的既有通知回调,移除工作区操作状态条和错误横幅。开始、完成、暂停、取消、无变化及失败的展示规则见 [UI 设计](./ui-design.md#应用入口)。发起前占用检查、本地请求锁和 Main 的最终准入保留;后台执行、活动持久化和活动页轮询未修改。刷新期间的结束反馈与卸载后的迟到响应分别处理,见 [技术设计](./technical-design.md#单次执行与取消)。未修改搜索范围。
|
||||
|
||||
验证记录:
|
||||
|
||||
- `npx vitest run src/renderer/src/SupervisorWorkspace.test.tsx src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisorActivity.test.tsx`:102 项通过。随后补充来源读取失败重试,单独复跑 `SupervisorWorkspace.test.tsx`,35 项通过;三个组件文件合计覆盖 103 项。
|
||||
- `npx vitest run src/renderer/src/App.test.tsx -t "routes Supervisor review feedback|shows retryable page-local Supervisor errors|graph navigation opens the pinned"`:3 项通过,其余 349 项未运行。覆盖真实 App 通知接线、关闭、同键替换、跨页签失败、页面内加载重试及历史图谱跳转。
|
||||
- `GOODBUDDY_SUPERVISOR_RECAP=1` 下执行 `npx vitest run tests/supervisor-layout.electron.test.ts`:1 项通过。使用生产 React 组件和模拟数据验证工作回顾布局、历史阅读、重新整理确认及活动页签访问;未调用真实模型。布局 fixture 只记录通知回调的语义,Toast DOM 由上述 App 测试验证。
|
||||
- `npx vitest run src/main/assistant/supervision-review.test.ts src/main/assistant/supervision-activity.test.ts`:30 项通过、1 项失败。失败为 schema 44 重开测试遇到 `table execution_timing already exists`,来自工作区并行新增的执行统计迁移,本次未修改该迁移。
|
||||
- 修改的 TypeScript/TSX 和布局 driver 定向 ESLint 通过,`git diff --check` 通过。`npm run typecheck` 被并行执行统计改动阻塞:Node 检查报告 `execution-timing.ts` SQL 参数可能为 undefined、IPC 的 `getExecutionStatsAsync` 不存在;末次 Web 检查报告 App 的 `statsMessageCount` 未定义及 `use-execution-stats.test.tsx` 的字段、参数不匹配。未更改这些并行代码。
|
||||
- 中文文档扫描后人工复核新增段落。新增内容无阻断项;全文件扫描的 4 个阻断项均在既有用户故事段落,未作无关改写。技术段落的否定句提示用于说明历史通知和卸载边界,按实际行为保留。
|
||||
|
||||
没有运行全量测试、其余 Electron 布局分支或生产构建,真实模型请求为 0 次。此次仅调整桌面 Renderer 反馈,未修改 Agent、远程 Runtime 或传输路径;未提交、推送或覆盖已有无关改动。
|
||||
|
||||
## 2026-10-03 会话故事图谱开关
|
||||
|
||||
FR-S11、US-S30 的“使用故事图谱”已接通 Composer、生产 Preload/IPC、SQLite 和工具网关。会话默认开启,仅在监督者应用启用时显示,位置在知识库之前。存储和执行合同见 [MCP 接入](./story-graph-mcp-design.md#6-内置-mcp-与-runtime-接入),没有数据库版本升级或迁移。另保留本轮开始前已有的监督者独立模型选择及并行性能改动。
|
||||
|
||||
@@ -10,11 +10,19 @@
|
||||
|
||||
## 0. 生产接线与剩余边界
|
||||
|
||||
Main 的手动 IPC 和心跳完成回调均使用 `createProductionSupervisorService`,该工厂连接 `SupervisorService`、`SupervisionReviewStore`、共享模型池及实际 ask Runtime。生产路径不再调用旧的 20 会话 × 20 消息 collector,也不使用旧服务分支的 100 条 / 48,000 字符裁剪。旧的有界服务注入方式仍供原有测试和实验脚本使用;心跳报告本身继续使用原报告预算。
|
||||
Main 的手动 IPC 和心跳完成回调均使用 `createProductionSupervisorService`,该工厂连接 `SupervisorService`、`SupervisionReviewStore`、共享模型池及无工具 Runtime。生产路径不再调用旧的 20 会话 × 20 消息 collector,也不使用旧服务分支的 100 条 / 48,000 字符裁剪。旧的有界服务注入方式仍供原有测试和实验脚本使用;心跳报告本身继续使用原报告预算。
|
||||
|
||||
### 已接入的调度与存储
|
||||
|
||||
schema 47 增加运行配置、来源清单、成功批次、导航节点四张表和一个实时来源视图。迁移只创建新结构,保留此前迁移、结果及用户数据。来源清单通过 `(project_id, conversation_id, sequence, source)` 稳定键分页,SQL 事务冻结范围内的来源身份、版本、长度及自动起点;清单不保存正文。项目和会话由来源页共同枚举,不另设全量 JavaScript 目录数组。正文随后按主键和有界 `substr` 读取。
|
||||
schema 47 增加运行配置、来源清单、成功批次、导航节点四张表和一个实时来源视图。迁移只创建新结构,保留此前迁移、结果及用户数据。清单只保存来源身份、版本、长度及增量起点;正文随后按主键和有界 `substr` 读取,派发顺序仍由 `(project_id, conversation_id, sequence, source)` 决定。
|
||||
|
||||
2026-10-04 起,生产初始化和继续前的逐来源版本检查通过已有 `readonly-query-reader.ts` 通信,使用同一打包入口 `readonly-query-worker.ts` 的独立 `supervision` Worker。它自行打开可写连接,不执行数据库迁移或启动恢复。Main 先保存配置、`collecting` 阶段和 `initializing: true`,然后等待 Worker。Worker 在一个读事务内单次扫描来源视图,将元数据保存到连接内的临时表,结束读事务后每次最多写入 200 条清单记录;扫描期间不持有主数据库写锁,不把来源正文或全量清单传回 Main。
|
||||
|
||||
清单全部写入后移除 `initializing`。暂停、失败或退出留下的未完成清单在继续时按原时间范围、配置重新收集,再分批替换;初始化完成前不进入模型提取,发布检查也拒绝未完成清单。旧运行没有该标记,继续时仍校验原清单的来源版本,保留已成功批次。仅在既有运行 JSON 内增加可选字段,无 schema 升级。
|
||||
|
||||
取消复用共享原子标志,版本哈希回调和写入批次之间检查 signal。Main 可在收集期间响应暂停、取消和活动查询;执行位置保持到 Worker 确认停止,或异常 Worker 确认退出。SQLite 在没有进入哈希回调的扫描片段、文件 I/O 或锁等待内仍不能立即中断。活动显示 `collecting`,写入期间可见的来源数是已保存数量,尚非最终总数。数据库关闭时终止该 Worker;临时表随连接消失,未完成标记供下次继续使用。
|
||||
|
||||
候选实体、旧摘要及记忆背景复用已有只读查询 Worker,仍按批次读取当前背景。这几项及初始化的 Worker 故障均明确失败,不在生产磁盘数据库上同步回退;内存测试库保留同步路径。来源片段按主键读取,实测约 2 ms,仍在 Main;最终结果、图谱、运行完成状态和 checkpoint 保持原有同一发布事务。初始化和版本检查使用独立 Worker,避免长扫描占住普通会话的只读查询队列。入口已由现有 Vite Worker entry 和 `out/main/**/*` 打包规则覆盖。
|
||||
|
||||
派发按项目及项目内会话轮转,每个会话同一轮至多一个批次,会话内按 sequence/source 排序。批次跨数据库页累计;长消息未装入部分保留待处理。每片最多 8,000 UTF-16 单元、每批最多 50 片,均为封块条件,不是范围上限。位置采用零基、左闭右开的 Unicode 码点;消息 locator 保存 messageId、conversationId、projectId、role、sequence、source、revision、start、end、length。知识引用另保留原 locator 及所属消息,任务使用当前状态和区间内创建/完成时间。
|
||||
|
||||
@@ -30,7 +38,7 @@ schema 47 增加运行配置、来源清单、成功批次、导航节点四张
|
||||
|
||||
2026-09-26 已接入整次回顾 single-flight、`supervision:cancel` 及实时 `supervision:execution`。手动重复请求不排队,自动请求等待;已取消运行从自动未完成查询中排除,也不能手动继续。持久取消与实际停止分开呈现,准入保留至 Runtime 清理结束。完整生命周期见[单次执行与取消](./technical-design.md#单次执行与取消),第 1 节关于 `pending` 队列和缺少取消入口的描述仅为改造前基线。
|
||||
|
||||
当前阶段以 `phase` 写入既有 `supervision_review_runs.state_json`,取值为 `collecting / extracting / summarizing / saving`;无新表或迁移。它记录服务最后进入的阶段,失败和重启后保留;完成仍由 `supervision_runs.status` 的发布事务决定。活动的 `navigationNodes` 从已保存导航表计数,`inFlight` 仍来自进程内计数。旧运行没有 phase 时不回填推测值。清单和最终发布为同步事务,短阶段不保证被轮询看到,清单事务失败也不会留下部分阶段记录。批次接口只有成功记录,没有逐个失败/在途任务或项目、会话聚合状态;界面仅按分页返回的真实归属组织详情。
|
||||
当前阶段以 `phase` 写入既有 `supervision_review_runs.state_json`,取值为 `collecting / extracting / summarizing / saving`;无新表或迁移。它记录服务最后进入的阶段,失败和重启后保留;完成仍由 `supervision_runs.status` 的发布事务决定。活动的 `navigationNodes` 从已保存导航表计数,`inFlight` 仍来自进程内计数。旧运行没有 phase 时不回填推测值。初始化异步执行并保留未完成标记,短阶段仍不保证被轮询看到;最终发布是 Main 内同步事务。批次接口只有成功记录,没有逐个失败/在途任务或项目、会话聚合状态;界面仅按分页返回的真实归属组织详情。
|
||||
|
||||
### 当前设置合同
|
||||
|
||||
@@ -53,7 +61,7 @@ schema 47 增加运行配置、来源清单、成功批次、导航节点四张
|
||||
- 真实验证覆盖一个 27 条消息的完整会话;较早的 129 条消息实验在第二次输出 JSON 无效后停止。两实验合计 5 次付费请求,没有重复付费或回退。范围及缓存复核说明见[进度](./progress.md#2026-09-24-完整会话生产验证与收尾)。
|
||||
- 来源被修改或删除时保留旧批次并明确失败,标记需要新建回顾,活动页停止提供无效的继续按钮;下一次自动检查可创建新 run,不会永久重复该失败。尚未实现仅使受影响叶子和父节点失效后重算。清单记录冻结版本,不保存全库正文快照。
|
||||
- 分块配置、超时、接纳并发及算法版本已保存。监督者模型连接在每次执行开始时解析,同次回顾复用;继续或重试读取当前选择,规则见[监督者模型选择](./logic-design.md#监督者模型选择)。候选背景仍在执行时读取;未实现跨重启模型/提示词版本固定,也未实现共享池排空后切换冻结并发的目标规则。
|
||||
- 元数据清单和最终发布仍是同步 SQLite 事务,缺少大库延迟验证及可中断来源读取。批次详情已分页,既有历史图谱查询仍返回整份结果;大图谱的响应大小尚未改造。
|
||||
- 元数据初始化已移到 Worker,并通过 2.43 GB 隔离副本验证;[测量记录](./progress.md#2026-10-04-回顾初始化阻塞修复)包括取消与来源一致性。最终发布仍在 Main 同步提交,未完成同等规模的全局发布延迟验收。批次详情已分页,既有历史图谱查询仍返回整份结果;大图谱的响应大小尚未改造。
|
||||
- 没有 token/费用预算、提供商 RPM/TPM、Retry-After 冷却、执行硬期限、独立清理期限或逐层可配置超时。默认正文预算不保证任意模型上下文容量;超长输出、非法 JSON 和引用错误会失败,保留已成功批次。
|
||||
- 片段以码点边界切分,尚未增加句界优先和重叠背景。事实保留指保留模型已产出的结构化记录,不证明语义无遗漏;生产契约校验引用 token,不要求原型的逐字引文和 reviewedTokens 回执。提供过的 locator.source 仅在本节点唯一对应一个片段时可作为引用别名;歧义及未知来源拒绝。
|
||||
|
||||
|
||||
@@ -118,15 +118,15 @@ D1 来源页默认 4,000、上限 8,000 码点。`current` 通过既有 locator
|
||||
| 监督整理参数 | 超时、并发、来源页与批次设置已存在 | 控制后台整理;不让一次 MCP 查询启动整理,也不以正文批次预算截断检索结果 |
|
||||
| 计划 `enabled` | 决定自动回顾是否到期执行 | 不决定已有图谱能否读取;应用开启且能力可用时,无计划也能查已有结果 |
|
||||
|
||||
Main 在工具发现和调用分发时共同检查应用启用、会话开关、能力启用、Runtime 分配和 scope;只隐藏菜单不足以阻止旧会话调用。关闭后拒绝新的读取请求,已在途响应交付前复核状态,避免旧绑定继续返回数据。启用工具本身不产生回顾或图谱写入。Ask 与 Execute 均可读取,同样没有写工具,也不借此扩大 Execute 权限。
|
||||
Main 在工具发现和调用分发时共同检查应用启用、会话开关、能力启用、Runtime 分配和 scope;只隐藏菜单不足以阻止旧会话调用。关闭后拒绝新的读取请求,已在途响应交付前复核状态,避免旧绑定继续返回数据。启用工具本身不产生回顾或图谱写入。工具本身只读,不依赖产品工作模式,也不增加写工具。
|
||||
|
||||
会话开关只决定 Agent 能否按需使用这三个 MCP 工具,不自动查询或注入图谱上下文,也不触发回顾。监督者应用关闭时,输入区完全隐藏开关并保留会话选择;再次启用应用后恢复该选择。后台回顾和计划仍由各自设置控制。
|
||||
|
||||
开关复用已发布的 `conversations.context_state_json`,字段为可选布尔值,不增加数据库版本或迁移。Renderer 经串行会话保存队列与 `conversations:set-story-graph` IPC 保存,成功后更新显示,失败保留原值并通知。Main 按会话主键只读设置,不加载消息历史;显式设置写入后,旧的自动保存快照不能覆盖它。新会话及新建分支使用默认开启。
|
||||
|
||||
本地 OpenCode、Continue 和原生客户端复用 [KnowledgeMcpGateway](../../../src/main/agent/knowledge-mcp-gateway.ts) 的 MCP 注册和分发;直连 Model 与 DeepSeek Harness Main 代理调用同一服务。远程 OpenCode/Continue 复用现有图像工具的受管 HTTP MCP 和二进制通道,`storyGraph` 描述独立于图像生成描述,Ask 可只携带图谱读取。请求仍由桌面 Main 解析范围和读取 SQLite,不把数据库、正文库或凭据复制到 Host。
|
||||
本地 OpenCode、Continue 和原生客户端复用 [KnowledgeMcpGateway](../../../src/main/agent/knowledge-mcp-gateway.ts) 的 MCP 注册和分发;直连 Model 与 DeepSeek Harness Main 代理调用同一服务。远程 OpenCode/Continue 复用现有图像工具的受管 HTTP MCP 和二进制通道,`storyGraph` 描述独立于图像生成描述,可只携带图谱读取。请求仍由桌面 Main 解析范围和读取 SQLite,不把数据库、正文库或凭据复制到 Host。
|
||||
|
||||
远程发现每次向 Main 复核启用状态;调用复用同一个范围、分页及版本读取入口。OpenCode 根会话和子会话精确放行当前受管端点的图谱工具;Continue Ask 保留 Main 绑定的会话端点并只允许共享只读工具名。DeepSeek Harness 的 Main 目录、参数转换和 Host 执行钩子均接入这三个工具;其他普通内置 MCP 的 Harness 限制保留。当前远程 Runtime 支持 OpenCode/Continue,不新增远程 Harness。桥接不可用时明确失败。
|
||||
远程发现每次向 Main 复核启用状态;调用复用同一个范围、分页及版本读取入口。OpenCode 根会话和子会话精确接入当前受管端点的图谱工具;Continue 保留 Main 绑定的会话端点,不按产品模式过滤工具。DeepSeek Harness 的 Main 目录、参数转换和 Host 执行路径均接入这三个工具;其他普通内置 MCP 的 Harness 限制保留。当前远程 Runtime 支持 OpenCode/Continue,不新增远程 Harness。桥接不可用时明确失败。
|
||||
|
||||
远程使用须配套部署含此接线的 Desktop 与 Agent;旧 Agent 不识别新增的工具描述字段。本次没有发布或更新受管包,源码验证不代表已发布客户端具备该能力。
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
FR-S11 的读取架构见[时态 Story Graph 内置 MCP 设计](./story-graph-mcp-design.md)。三个只读工具通过 `readStoryGraph` 投影现有 SQLite,Main 在发现、调用和返回前检查监督者启用、会话开关及 Runtime 分配。绑定携带会话 ID,按主键读取当前设置;原生客户端的复用键包含会话 ID 和开关值。本地 MCP、Model、Harness Main 代理和远程受管工具通道共用此入口;会话开关复用 `context_state_json`,无 schema 迁移。该文独立定义对象/版本合同、时间语义、配置映射及后续跨 scope 复用和记忆过渡。当前 memory 背景读取、精确 scope checkpoint 与候选身份保留;结果快照不支持 `as_of` 历史重建。
|
||||
|
||||
生产入口由 `supervision-production.ts` 组装服务、SQLite、共享池和 ask Runtime。`supervision-review-store.ts` 保存冻结来源清单,按有界页和片段供 `SupervisorService` 派发;叶子及连续位置先提交,导航和完整结果之后发布。消息已有知识引用保留本地或外部 locator,已确认记忆通过独立背景输入提供。不会检索外部全库。详细存储、调度及当前限制统一见[分块调度第 0 节](./review-scheduling-design.md#0-生产接线与剩余边界)。
|
||||
生产入口由 `supervision-production.ts` 组装服务、SQLite、共享池和无工具 Runtime。`supervision-review-store.ts` 保存冻结来源清单,按有界页和片段供 `SupervisorService` 派发;叶子及连续位置先提交,导航和完整结果之后发布。消息已有知识引用保留本地或外部 locator,已确认记忆通过独立背景输入提供。不会检索外部全库。详细存储、调度及当前限制统一见[分块调度第 0 节](./review-scheduling-design.md#0-生产接线与剩余边界)。
|
||||
|
||||
模型实体 `id` 只在单次输出内有效。Main 从同一 scope 的故事线提供最多 100 个未撤销实体候选,生产提示只暴露 `candidateRef`(如 `known_1`)、名称和说明。模型显式选择候选后,Main 转换为严格 UUID 类型的内部 `persistedId`。服务校验候选集成员和重复映射,保存事务再次按实体主键校验故事线归属及撤销状态。没有有效候选引用时分配新 UUID,不按名称或裸模型 ID 合并。来源仍按每次结果分配 UUID,保留原始 `source_id` 和 locator。
|
||||
|
||||
@@ -37,7 +37,7 @@ schema 43 在结果上增加 `graph_snapshot_json`,保存当次实体名称、
|
||||
|
||||
继续讨论预览将 `supervision:continue-context` 返回的 `prompt` 直接作为可编辑草稿。侧栏与图谱入口发送当前草稿,不重新拼接原始上下文。`supervision:continue` 沿用现有正文校验(去除首尾空白,最多 12,000 字符),使用空 `attachments` 入队,无附件请求省略 `serializedContexts`;请求未指定 Runtime 时使用会话保存的选择。会话已有的记忆和知识库配置仍按普通会话发送规则处理。知识库预览与提交均检查目标库存在且为本地可写库,更新实体还检查其实际所属库。侧栏确认框展示 Main 返回的实体字段、目标库和来源正文,取消或写入失败后可以重新预览。
|
||||
|
||||
监督来源清单将 UI 时间区间归一化为 UTC,先筛选再按稳定键分页。项目必须存在且 active;消息按闭区间筛选,任务按区间内创建或完成时间筛选。手动和自动监督共用该路径,自动清单另读取 supervisor checkpoint;手动心跳报告保留原有 collector。
|
||||
监督来源清单将 UI 时间区间归一化为 UTC,在 Worker 读快照内按范围筛选,元数据按小批次写入;后续片段按稳定键分页。项目必须存在且 active;消息按闭区间筛选,任务按区间内创建或完成时间筛选。手动和自动监督共用该路径,增量清单另读取 supervisor checkpoint;手动心跳报告保留原有 collector。Worker 连接、未完成初始化重建、取消确认和打包规则见[调度与存储](./review-scheduling-design.md#已接入的调度与存储)。
|
||||
|
||||
已确认记忆作为当前背景,不参与新增正文覆盖。最多四条、每条 500 字符,时间来自真实更新时间;模型不能把背景引用为本批新增证据。旧结果继续保留原来源类型和 locator。监督正文上限现用于分批,余段继续处理;心跳报告的有界输入语义没有改变。
|
||||
|
||||
@@ -51,7 +51,7 @@ schema 43 在结果上增加 `graph_snapshot_json`,保存当次实体名称、
|
||||
|
||||
监督整理超时由 run 创建时冻结;共享模型池仍采用实时设置上限。`supervision:pause` 取消该 run 的排队和在途工作,`supervision:resume` 继续已保存批次;监督整理输出在流中按 `supervisionReview.responseKiB` 检查响应容量,默认 1024 KiB,可在设置页调整为 100 至 16384 KiB。该容量每次请求读取当前设置,继续旧运行也采用新值;超限保留成功批次并提示调高后继续。生成摘要及事实内容不设独立短字符限制,监督旧摘要读取保留全文,具体边界见[生产接线](./review-scheduling-design.md#0-生产接线与剩余边界)。以下报告领取和租约规则继续适用。
|
||||
|
||||
手动和自动监督均在桌面 Main 调用生产工厂,Runtime 解析请求只有 `workMode: ask`,不携带项目、Runtime 选择或执行空间。`resolveRequestRuntime` 因而返回桌面默认 Runtime,不进入 SSH 项目或 `selectedRuntimes.getRuntime` 分支;回顾 scope 只筛选证据。摘要校验、合并和持久化在 Main 完成,single-flight、取消及 UI 控制不改变 `gbagent`、远端 Runtime 启动或桌面到 Agent 协议。
|
||||
手动和自动监督均在桌面 Main 调用生产工厂,Runtime 解析请求不携带项目、Runtime 选择或执行空间,也不再注入 `workMode`。`resolveRequestRuntime` 返回桌面默认 Runtime,不进入 SSH 项目或 `selectedRuntimes.getRuntime` 分支;内部分析使用无工具构造,回顾 scope 只筛选证据。摘要校验、合并和持久化在 Main 完成,single-flight、取消及 UI 控制不改变 `gbagent`、远端 Runtime 启动或桌面到 Agent 协议。
|
||||
|
||||
`ApplicationSettingsStore` 持久化报告和整理模型超时,均为 30..600 整数秒,默认 240。报告排队前冻结,监督创建 run 时冻结;计时从获槽及 Runtime 解析后开始,覆盖模型执行及其内部重试。流结束校验 signal 和完成事件,finally 释放临时会话,心跳报告保持原有 100KB 上限,监督整理使用上文的可调响应容量。采集、排队、保存和清理不计入模型超时。
|
||||
|
||||
@@ -69,7 +69,9 @@ schema 47 的四张批次相关表使用外键随监督运行清理,未完成
|
||||
|
||||
`supervision:execution` 返回进程内 `{ active, runId?, stopping? }`,配置读取期间可有 `active: true` 而尚无 runId。`supervision:cancel({ runId })` 先在既有 `supervision_runs` 写入 `cancelled`、清除错误并保存取消时间,再向父 controller 传播 abort;重复取消保留原时间。该接口等待执行 Promise 结束,包含并行批次的 `allSettled` 和 Runtime `releaseConversation`,之后才释放准入。暂停只请求 abort,执行停止后保存 `paused`;取消优先于暂停。迟到模型输出不得保存叶子、导航或完整结果,成功批次保留,自动 checkpoint 不推进。发布是同步 SQLite 事务,已完成或无变化的运行拒绝取消,不撤销已发布结果;本次无 schema 迁移。
|
||||
|
||||
Preload 暴露类型化 `execution`、`cancel`,取消输入使用 UUID schema 并校验可信 sender。活动 UI 用实时执行状态覆盖持久记录的停止显示;工作回顾挂载期间每两秒读取执行状态,发起前再次查询,Main 仍作最终准入判断。`resume` IPC 直到运行结束才返回,Renderer 发出请求后释放提交锁并独立处理结果,确保继续中的回顾仍可暂停或取消。状态条 X 仅修改本地显示状态。
|
||||
Preload 暴露类型化 `execution`、`cancel`,取消输入使用 UUID schema 并校验可信 sender。活动 UI 用实时执行状态覆盖持久记录的停止显示;工作回顾只在发起前查询执行状态,Main 仍作最终准入判断。`resume` IPC 直到运行结束才返回,Renderer 发出请求后释放提交锁并独立处理结果,确保继续中的回顾仍可暂停或取消。
|
||||
|
||||
`App` 将既有通知回调经 `HeartbeatCenter` 传给 `SupervisorWorkspace`。回顾操作用 `supervisor-review` 去重键发送本地化 Toast,结果读取失败仍写入 `loadError` 并就地重试;实体、关系操作和来源读取失败也使用通知。工作回顾不再为状态条轮询执行状态,历史读取不发送操作通知。请求锁覆盖发起前检查和整次运行;页面刷新只使旧结果选择失效,不丢弃运行结束反馈。卸载后忽略迟到响应,检查阶段尚未提交的回顾不再发起,已提交的后台运行不取消。活动查询、原始错误持久化和 Main 生命周期保持原路径。
|
||||
|
||||
### 心跳触发与建议(2026-09-30)
|
||||
|
||||
@@ -255,7 +257,7 @@ IPC 返回图谱查询结果时使用分页和有界字段;详情中的来源
|
||||
|
||||
## 5. 安全与一致性
|
||||
|
||||
- 监督者模型调用固定为 `ask` 语义,输入来自 `EvidenceCollector` 的有界快照,工具授权始终拒绝。
|
||||
- 监督者模型调用使用无工具构造,不依赖产品模式或提示词限制;生产输入来自冻结来源的分页读取,见分块调度设计。
|
||||
- `Global`、Project、多项目和固定 Conversation/Task/Experiment 目标在 Main 冻结;模型不能生成或改变范围。
|
||||
- 每个来源引用必须属于本次冻结范围,跨范围引用、伪造项目 ID 和不存在的来源 ID 直接使结果失败。
|
||||
- 心跳运行沿用现有 `heartbeat_runs` 的领取、租约和重试机制;监督运行按心跳运行 ID 关联,活动据此合并阶段。监督取消不撤销已保存的心跳报告,合并活动优先显示监督已取消状态。
|
||||
|
||||
@@ -12,7 +12,11 @@
|
||||
|
||||
工作回顾只读取统一监督结果。顶部紧凑排列范围、时间、发起与刷新控件,不重复显示“新回顾”标题和来源说明,不新增 Modal。历史结果选择与图谱入口位于正文之前,即使只有一条结果也显示选择器。新回顾工具栏、状态、历史选择和结果面板铺满监督者页面壳层的可用内容宽度,与页签左右对齐,不另设阅读宽度上限;结果内部按面板内边距排版,不再单独居中窄正文。正文使用“监督结果”标题,常显生成日期、真实范围和覆盖区间,历史结果不标为最新。工作总结按原有空行分段并保留换行;本次变化和未解决事项直接使用已有字段,不补写结论或截断正文。390px 下新请求字段与操作各占两列,结果元数据可换行。
|
||||
|
||||
新回顾运行中保留已显示结果及其日期、范围,范围、时间、发起和刷新控件保持可用;重复点击发起只重新显示当前运行提示,不排入新回顾。状态条提供活动记录入口,清除计划筛选并聚焦活动页签;右侧 X 只关闭提示,不暂停或取消执行,同一次运行的轮询不重新打开已关闭提示。范围、时间和活动计划筛选保留可访问名称,不再重复显示字段标题。工作回顾不读取历史心跳报告,也不显示自动报告空态、记忆与行动建议或第二行全局范围与刷新。无监督结果时,空态独占工具栏下方整行,标题与手动回顾入口水平居中;自动报告是否为空不影响此判断。运行中和暂停后使用独立状态条,提示当前状态及活动记录入口。
|
||||
新回顾运行中保留已显示结果及其日期、范围,范围、时间、发起和刷新控件保持可用。手动发起、完成、暂停、取消、无变化和失败统一使用应用 Toast;重复点击发起提示已有运行,不新建或排队。同一回顾操作的通知互相替换,关闭通知不暂停或取消执行。成功和信息沿用共享自动消失时间,错误由用户关闭。页面不保留操作状态条或错误横幅,加载历史结果、切换页签和重新进入页面不触发回顾通知。
|
||||
|
||||
通知使用中英文可理解的状态及下一步说明,失败时引导到活动记录查看原因、继续已保存进度或重新发起。原始技术错误仍保留在活动详情。共享通知当前只提供关闭按钮,查看进度使用既有“活动记录”页签。内容加载失败继续在页面内显示本地化说明和重试,操作反馈不会清空范围、时间或已有结果;运行中刷新不丢弃随后到达的结束通知。
|
||||
|
||||
范围、时间和活动计划筛选保留可访问名称,不再重复显示字段标题。工作回顾不读取历史心跳报告,也不显示自动报告空态、记忆与行动建议或第二行全局范围与刷新。无监督结果时,空态独占工具栏下方整行,标题与手动回顾入口水平居中;自动报告是否为空不影响此判断。
|
||||
|
||||
## 会话故事图谱开关
|
||||
|
||||
|
||||
@@ -163,16 +163,19 @@
|
||||
|
||||
| Given | When | Then |
|
||||
| --- | --- | --- |
|
||||
| 范围有效且有来源 | 点击“回顾当前进展” | 页面显示整理中状态和活动入口,活动页提供暂停与取消 |
|
||||
| 范围有效且有来源 | 点击“回顾” | 应用 Toast 提示已开始,可从活动记录查看进度、暂停与取消 |
|
||||
| 整理完成并有新变化 | 返回结果 | 工作回顾、监督反馈和图谱引用同一次结果 |
|
||||
| 没有有效新变化 | 整理完成 | 显示检查时间和“暂无新进展”,不重复推送旧内容 |
|
||||
| 用户点击取消 | 整理仍在运行 | 清理期间显示正在取消,停止后显示已取消,保留上一次成功结果和成功批次 |
|
||||
| 回顾正在执行或停止清理 | 再次点击手动发起 | 显示当前运行提示,不新建或排队;关闭提示不取消执行 |
|
||||
| 回顾运行中刷新或切换页签 | 本次请求随后失败 | 显示本地化错误 Toast,技术详情留在活动记录,工作区不增加错误横幅 |
|
||||
| 已有历史结果或运行记录 | 加载页面或选择历史 | 只读取内容,不补发开始或结束通知;读取失败就地重试 |
|
||||
|
||||
**界面行为**
|
||||
|
||||
- 运行按钮在整理期间保持可用,重复点击按上表提示;取消停止后可以新建,已取消运行不能继续。
|
||||
- “无新进展”与“失败”使用不同状态和文案。
|
||||
- 手动操作的开始、结束和失败反馈遵守 [Toast 规则](./ui-design.md#应用入口),关闭通知后可继续阅读已有结果。
|
||||
- 结果必须显示本次冻结的范围,不能因用户后来切换项目而改变解释。
|
||||
|
||||
### US-S03 自动检查不过度打扰
|
||||
@@ -518,7 +521,7 @@
|
||||
|
||||
- 页面显示本次运行的冻结范围。
|
||||
- 权限不足、来源不可用和没有新内容使用不同状态。
|
||||
- 监督者的 Agent 身份不自动获得工具执行、批准或切换 Execute 的能力。
|
||||
- 监督者的内部评审保持无工具,不因 Agent 身份获得工具执行或批准能力。
|
||||
|
||||
## 活动记录
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
未发布实现的验收状态见[工作栏进度](../assistant-workbar/progress.md#2026-09-14-runtime-进程复用实施中)。
|
||||
|
||||
The separate official Web client is pinned to `@deepseek-ai/dsh@0.1.7-rc.2`.
|
||||
Its Main service API, Ask/Execute policy, capability adapters, packaged resource
|
||||
Its Main service API, unified execution rules, capability adapters, packaged resource
|
||||
layout, and Windows validation are documented in
|
||||
[Native Client Proposal, section 9.1](../assistant-workbar/runtime-native-client-proposal.md#91-ds-web-backend-2026-09-26).
|
||||
This Web resource tree is prepared separately from the background Harness Host.
|
||||
|
||||
@@ -13,19 +13,19 @@
|
||||
| GoodBuddy 目标平台 | Windows、macOS、Linux,x64 与 arm64 |
|
||||
| 本文性质 | 设计与发布验收约定 |
|
||||
|
||||
本文定义 DeepSeek Harness 在 GoodBuddy 中的架构边界、协议、执行策略、插件市场、界面、打包和验收要求。实现必须继续遵守 GoodBuddy 已有的 Main 进程安全边界、Ask/Execute 语义、取消、超时、有界输出和资源回收约定。
|
||||
本文定义 DeepSeek Harness 在 GoodBuddy 中的架构边界、协议、执行策略、插件市场、界面、打包和验收要求。实现遵守 Main 进程边界、能力范围、取消、超时、有界输出和资源回收约定;当前执行规则见[统一执行](../unified-execution/logic-design.md)。
|
||||
|
||||
## 2. 摘要
|
||||
|
||||
DeepSeek Harness 的底层库使用 Cordis 组合服务。GoodBuddy 不采用官方产品 profile,也不允许用户配置覆盖内部 Host 或控制服务;GoodBuddy 自行维护 Host、控制协议和生命周期,同时提供一个由 Main 管理、默认关闭的 npm 插件市场。用户显式开启后,市场只搜索带精确 `dsh-plugin` 关键字的公共 npm 包,不代表 GoodBuddy 审核、推荐或承诺兼容这些包。
|
||||
|
||||
用户明确安装并启用的插件以当前用户权限运行。Ask/Execute 只控制模型经过 `tools/execute` 发起的工具调用:Ask 只允许 Host 中真实注册的 `read`、`skill` 和 Main 管理的 Web Search/Fetch、Story Graph 只读代理,Execute 放行 Host 中全部已注册工具。插件不能用同名工具冒充 Ask 允许项。插件安装脚本和初始化代码不属于模型工具调用,不能由 Ask 限制,因此界面在安装前必须明确确认这一边界。
|
||||
用户明确安装并启用的插件以当前用户权限运行。模型可调用 Host 注册的内置及已启用插件工具,不维护产品只读名单。Main 代理工具仍校验请求、分配及资源归属。插件安装脚本和初始化代码也以当前用户权限运行,安装前保留既有确认。
|
||||
|
||||
整体分成两个互相约束的部分:
|
||||
|
||||
1. **GoodBuddy Main Control Plane**
|
||||
- 运行在 Electron Main 进程。
|
||||
- 持有加密设置、模型连接选择、Ask 只读策略、Runtime 生命周期、插件市场状态和审计归属。
|
||||
- 持有加密设置、模型连接选择、能力配置、Runtime 生命周期、插件市场状态和审计归属。
|
||||
- 通过 Electron `utilityProcess` 启动受控 Harness 子进程。
|
||||
- 对环境、输入、输出、超时、取消和进程树执行强制限制,并只把已启用插件的受管入口传给 Host。
|
||||
|
||||
@@ -67,7 +67,7 @@ Filesystem Provider,以 GoodBuddy 客户端进程的当前用户权限运行
|
||||
|
||||
### 3.3 自维护边界
|
||||
|
||||
GoodBuddy 自己的 Runtime 和控制面不包装成标准 DSH 插件,也不加载用户 profile 或自定义 Host。只有 GoodBuddy Main 可以启动内部 Host、选择受管插件入口并处理启动失败。公共 npm 市场是第三方扩展来源,不改变 GoodBuddy 对内部 Host、Ask/Execute 语义和协议版本的控制。
|
||||
GoodBuddy 自己的 Runtime 和控制面不包装成标准 DSH 插件,也不加载用户 profile 或自定义 Host。只有 GoodBuddy Main 可以启动内部 Host、选择受管插件入口并处理启动失败。公共 npm 市场是第三方扩展来源,不改变 GoodBuddy 对内部 Host、能力接入和协议版本的控制。
|
||||
|
||||
## 4. 目标与非目标
|
||||
|
||||
@@ -76,13 +76,13 @@ GoodBuddy 自己的 Runtime 和控制面不包装成标准 DSH 插件,也不
|
||||
- 增加 `deepseek-harness` Runtime,并在设置、聊天和消息通道中可选择。
|
||||
- 使用 GoodBuddy 管理的模型连接,不在 Renderer 或持久化 Harness 配置中写入 API Key。
|
||||
- 当所选模型连接明确声明支持图像输入时,允许向 DeepSeek Harness 发送有界的 JPEG/PNG;文本模型在启动 Host 或调用模型前拒绝图片。
|
||||
- Ask 模式在 Runtime 工具分发边界强制只读,阻止 Shell、写入和编辑工具。
|
||||
- 在 Web Search 能力启用时,通过 Main 代理向 Ask 与 Execute 提供有界的 `web_search` 和 `web_fetch`,Harness Utility 不持有服务凭据。
|
||||
- Execute 模式使用 DSH 本地 Provider,以当前用户权限执行文件与命令工具;工作区是默认工作目录,不是 OS 权限边界。
|
||||
- 正常请求使用实际注册工具,不保留工作模式或一般审批策略。
|
||||
- 在 Web Search 能力启用时,通过 Main 代理提供有界的 `web_search` 和 `web_fetch`,Harness Utility 不持有服务凭据。
|
||||
- 使用 DSH 本地 Provider,以当前用户权限执行文件与命令工具;工作区是默认工作目录,不是 OS 权限边界。
|
||||
- 提供默认关闭的公共 npm DSH 插件市场总开关;用户显式开启后可搜索、查看详情、精确版本安装、启用、停用、配置和移除,首次安装前明确确认当前用户权限。
|
||||
- 只加载 Main 明确传入的已启用插件;单个插件启动失败不得阻止 Host,并自动停用失败插件。
|
||||
- 允许 Skills 和自定义 MCP 显式分配给 DeepSeek Harness;自定义 MCP 只在 Execute 中通过 Main 代理。
|
||||
- 设置页可读取有界的 Host/插件原生 Tool 与 Skill 清单;Tool 元数据显示类型、来源及 Ask/Execute 可用性,并明确排除 GoodBuddy 分配的 Skills、Web/MCP 请求代理。
|
||||
- 允许 Skills 和自定义 MCP 显式分配给 DeepSeek Harness;自定义 MCP 通过 Main 代理。
|
||||
- 设置页可读取有界的 Host/插件原生 Tool 与 Skill 清单;Tool 元数据显示类型、来源及描述,不提供统一逐工具开关,并明确排除 GoodBuddy 分配的 Skills、Web/MCP 请求代理。
|
||||
- 支持多会话、同会话串行、跨会话并行。
|
||||
- 支持按请求取消、超时、会话释放和应用退出时完整回收。
|
||||
- 输出文本、推理、工具参数、工具结果、stderr 和协议队列全部有界。
|
||||
@@ -130,7 +130,7 @@ Main 在创建 Session 前解析该请求工作区的 `realpath`,把绝对路
|
||||
|
||||
Harness 子进程内控制面不能取代 Main 控制面,Main 控制面也不能代替进程内的 Session/Tool 适配层:
|
||||
|
||||
- Harness Control Plane 最接近 Session、Agent、Tool 和 Usage seam,适合做内部协议转换与 Ask 工具拦截。
|
||||
- Harness Control Plane 在 Session、Agent、Tool 和 Usage 接口处处理内部协议转换与请求归属。
|
||||
- Main 控制面是可信安全边界,适合持有模式授权策略、加密设置、进程控制和 IPC。
|
||||
|
||||
任何一侧缺失能力握手时,Runtime 必须报告不可用,不能降级为不受控执行。
|
||||
@@ -160,7 +160,7 @@ Electron Main
|
||||
├─ RuntimeSettingsStore
|
||||
├─ RuntimeExtensionStore / npm Marketplace
|
||||
├─ AgentRuntimeController
|
||||
├─ RuntimeAuthorizer(Ask 拒绝 / Main 代理工具授权)
|
||||
├─ Main 代理工具能力与请求归属校验
|
||||
└─ DeepSeekHarnessRuntime / Main Control Plane
|
||||
│ ACP + goodbuddy/* 扩展,stdin/stdout
|
||||
▼
|
||||
@@ -199,7 +199,7 @@ Harness 子进程崩溃、输出异常、拒绝协议或加载错误时,Main
|
||||
|
||||
- 启动 ACP 兼容的 JSON-RPC stdio 服务。
|
||||
- 创建、查找和释放 Harness Agent。
|
||||
- 在 Prompt 前应用 GoodBuddy 指定的 Ask/Execute 权限。
|
||||
- 在 Prompt 前绑定请求标识与能力上下文。
|
||||
- 将 DSH Session 事件转换为有界的 GoodBuddy 事件。
|
||||
- 将 LLM 用量转换为稳定的模型用量事件。
|
||||
- 根据 Main 传入的模型能力声明 ACP 图片能力,验证内联图片并转换为 DSH 的不可变 Attachment 引用。
|
||||
@@ -226,7 +226,7 @@ GoodBuddy 控制面自身不导出 `apply(ctx, config)`,也不提供默认 std
|
||||
- 插件按清单依次加载;导入、导出形态或激活失败只记录该插件,不阻止其他插件和 Host 启动。失败 Fiber 的清理同样有界。
|
||||
- 有限但超过预算的同步导入或同步 `apply` 在返回后按超时失败并继续加载后续插件;JavaScript 不能在同一事件循环内抢占永不返回的同步第三方代码,此时由 Main 的独立启动截止时间终止整个 Utility。
|
||||
- 失败 ID 在 ready 握手中返回 Main;Main 原子写入停用状态和启动错误。
|
||||
- 插件成功激活后可注册工具或后台生命周期逻辑。Ask 只能拦截模型工具调用,不能撤销初始化阶段已经发生的副作用。
|
||||
- 插件成功激活后可注册工具或后台生命周期逻辑;初始化阶段使用当前用户权限。
|
||||
|
||||
GoodBuddy 不扫描任意目录、不读取用户 profile 插件清单,也不接受 Renderer 直接提供文件路径。
|
||||
插件安装、升级和移除在目录重命名前写入受管变更日志。Main 下次初始化时以持久
|
||||
@@ -246,7 +246,7 @@ Store 是否已经提交为准,确定性完成新目录或恢复旧目录,
|
||||
|
||||
### 8.2 标准 ACP 方法
|
||||
|
||||
首版保留 ACP 的初始化、`session/new`、`session/prompt` 和 `session/cancel` 语义。`promptCapabilities.image` 必须与所选模型连接的 `supportsImageInput` 完全一致,不能仅根据 Provider 或模型名称猜测。标准 ACP 客户端可以使用只读默认行为,但只有完成 GoodBuddy 能力握手的客户端才能启用 Execute。
|
||||
保留 ACP 的初始化、`session/new`、`session/prompt` 和 `session/cancel` 语义。`promptCapabilities.image` 必须与所选模型连接的 `supportsImageInput` 完全一致,不能仅根据 Provider 或模型名称猜测。GoodBuddy 请求须完成能力握手和逐轮 prepare,不宣告产品工作模式。
|
||||
|
||||
### 8.3 GoodBuddy 扩展
|
||||
|
||||
@@ -255,12 +255,12 @@ Store 是否已经提交为准,确定性完成新目录或恢复旧目录,
|
||||
| 方法或事件 | 方向 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `goodbuddy/handshake` | Main → Control Plane | 交换控制协议、Harness、ACP 版本和能力 |
|
||||
| `goodbuddy/session/prepare` | Main → Control Plane | 在下一次 Prompt 前设置工作模式和请求标识 |
|
||||
| `goodbuddy/session/prepare` | Main → Control Plane | 在下一次 Prompt 前设置请求标识 |
|
||||
| `goodbuddy/session/release` | Main → Control Plane | 取消并释放指定 Session |
|
||||
| `goodbuddy/session/event` | Control Plane → Main | 文本、推理、工具、状态和用量事件 |
|
||||
| `goodbuddy/credential/resolve` | Control Plane → Main | 按已登记引用请求当前 Runtime 的临时凭据 |
|
||||
| `goodbuddy/tools/list` | Control Plane → Main | 取得 Main 管理的有界 Web 工具与当前 Execute 请求的 MCP 工具 schema |
|
||||
| `goodbuddy/tools/call` | Control Plane → Main | 校验活动请求、工作模式、参数和精确注册代理身份后调用 Main Web/MCP 工具 |
|
||||
| `goodbuddy/tools/list` | Control Plane → Main | 取得 Main 管理的有界 Web 工具与当前请求的 MCP 工具 schema |
|
||||
| `goodbuddy/tools/call` | Control Plane → Main | 校验活动请求、参数和精确注册代理身份后调用 Main Web/MCP 工具 |
|
||||
| `goodbuddy/native/snapshot` | Main → Control Plane | 从无 Agent scope 的 Host Registry 读取有界的原生 Tool/Skill 元数据,排除 GoodBuddy 分配项与请求级代理 |
|
||||
| `goodbuddy/shutdown` | Main → Control Plane | 停止接收新请求并有序清理 |
|
||||
|
||||
@@ -270,7 +270,7 @@ Header 与固定 8 MiB 帧上限;旧版本或缺少必需字段的启动消息
|
||||
|
||||
```ts
|
||||
type GoodBuddyHarnessCapabilities = {
|
||||
controlProtocolVersion: 1
|
||||
controlProtocolVersion: 2
|
||||
harnessVersion: string
|
||||
acpProtocolVersion: number
|
||||
supports: {
|
||||
@@ -291,18 +291,18 @@ type GoodBuddyHarnessCapabilities = {
|
||||
|
||||
### 8.4 每轮权限准备
|
||||
|
||||
GoodBuddy 的工作模式属于每个请求,不属于 Runtime 进程全局状态。同一对话可以在 Ask 和 Execute 之间切换。因此:
|
||||
每个请求准备状态绑定到独立 Session,不含工作模式:
|
||||
|
||||
1. `session/new` 后默认是 Ask。
|
||||
1. `session/new` 建立会话,不设置默认产品模式。
|
||||
2. 每个 Prompt 前,Main 发送一次 `goodbuddy/session/prepare`。
|
||||
3. Harness Control Plane 将准备状态绑定到 `sessionId + requestId`。
|
||||
4. `session/prompt` 只能消费匹配且尚未使用的准备状态。
|
||||
5. 缺少准备状态、重复使用、请求标识不匹配时,Control Plane 直接拒绝请求。
|
||||
6. 同一 Session 只允许一个 Prompt 在途。
|
||||
|
||||
若 Runtime 回传 ACP 权限请求,Main 只按活跃 Session 的当前模式答复:Execute 优先选择
|
||||
`allow_once`,缺少时使用提供的 `allow_always`,不调用第二次人工 authorizer;
|
||||
Ask、已关闭或未知 Session 拒绝。这里不写入永久授权规则,也不把业务问答当作权限确认。
|
||||
若 Runtime 回传 ACP 权限请求,Main 对活跃 Session 优先选择 `allow_once`,缺少时使用
|
||||
提供的 `allow_always`,不调用第二次人工 authorizer;已取消、已关闭或未知 Session 拒绝。
|
||||
这里不写入永久授权规则,也不把业务问答当作权限确认。
|
||||
|
||||
### 8.5 事件模型
|
||||
|
||||
@@ -379,12 +379,10 @@ Main 的 Web/MCP ToolProvider 按工作区保存,最后一个对应 Session
|
||||
|
||||
## 10. 权限与主机执行
|
||||
|
||||
### 10.1 模式映射
|
||||
### 10.1 工具接入
|
||||
|
||||
| GoodBuddy 模式 | Host 内置与插件工具 | Main Web Search/Fetch | GoodBuddy 自定义 MCP | 行为 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Ask | 只允许 Host Registry 中真实注册的 `read` 与 `skill`;其他 Host/插件工具一律拒绝 | 能力启用时注册 Main 的精确代理对象,无逐次审批 | 不注册 | 模型工具调用保持只读 |
|
||||
| Execute | 放行 Host 中全部已注册的内置与插件工具 | 能力启用时注册 Main 代理 | 按分配注册并经过既有 RuntimeAuthorizer | 不增加插件权限层,以当前用户权限运行 |
|
||||
Host 提供实际注册的内置及已启用插件工具;Main Web Search/Fetch 在能力启用时注册,
|
||||
自定义 MCP 按启用与 Runtime 分配注册。不增加产品审批或插件权限层。
|
||||
|
||||
2026-09-28:内置 Story Graph 的三个读取工具在 Ask/Execute 均通过 Main 代理提供,
|
||||
Host 只接受 Main 注册的具体工具对象。Main 逐次检查监督者启用、Harness 分配及请求项目范围,
|
||||
@@ -392,31 +390,31 @@ Host 只接受 Main 注册的具体工具对象。Main 逐次检查监督者启
|
||||
[Story Graph 设计](../conversation-supervision/story-graph-mcp-design.md)和
|
||||
[验证进度](../conversation-supervision/progress.md#2026-09-28-story-graph-只读工具)。
|
||||
|
||||
### 10.2 Ask 模式
|
||||
### 10.2 Main 代理
|
||||
|
||||
- Harness Control Plane 在 `tools/execute` 分发边界识别当前 Session 和在途请求。
|
||||
- 采用所有权感知的只读允许列表,只接受 Registry 中真实的 `read`、`skill` 和 Main 注册的 Web/Story Graph 代理对象;`write`、`edit`、Shell、自定义 MCP 及任意新插件工具默认拒绝。只比较工具名不足以授权,插件注册同名工具仍会被拒绝。
|
||||
- Ask 不注册 Main 代理的自定义 MCP;Story Graph 使用共享只读合同,scope 的互斥分支转换为 Harness 支持的 `oneOf`,完整参数仍由 Main 的 Zod schema 校验。
|
||||
- Main 代理按实际注册身份与请求上下文调用,不维护原生工具只读允许列表。
|
||||
- Story Graph 使用共享只读合同,scope 的互斥分支转换为 Harness 支持的 `oneOf`,完整参数仍由 Main 的 Zod schema 校验。
|
||||
- Web Search/Fetch 的凭据、传输与结果限制保留在 Main;Utility 只看到有界 schema 和结果。
|
||||
- 只读不等于无限输出,读取仍受字节和工具结果上限控制。
|
||||
- 插件安装脚本和 Cordis 初始化生命周期不经过 `tools/execute`。Ask 不能把已启用第三方代码变成沙箱,也不能保证第三方代码没有启动副作用。
|
||||
- 插件安装脚本和 Cordis 初始化生命周期不经过模型工具调用,不属于 OS 沙箱。
|
||||
|
||||
### 10.3 Execute 模式
|
||||
### 10.3 主机工具
|
||||
|
||||
- 工作区来自 Session 创建时的规范化绝对路径,并作为文件与命令工具的默认工作目录。
|
||||
- DSH 本地 Filesystem、Bash 或 PowerShell Provider 直接使用 GoodBuddy 客户端当前用户的 OS 权限。
|
||||
- 工作区不是 containment 边界;绝对路径和命令可访问当前用户本来有权访问的主机资源。
|
||||
- 已启用插件注册的工具与内置工具使用同一分发路径;GoodBuddy 不增加插件权限矩阵或逐工具确认。
|
||||
- Main 代理的 MCP 工具继续执行分配、schema、活动请求、模式和 RuntimeAuthorizer 校验。
|
||||
- Main 代理的 MCP 工具继续执行分配、schema、活动请求和资源范围校验。
|
||||
`goodbuddy/tools/list` 按 Session 保存本次发现的工具定义;`goodbuddy/tools/call` 复用该定义
|
||||
校验参数与授权,不因调用健康工具而重新等待故障 MCP 的发现。发现重试留在清单刷新,
|
||||
Session 释放及 Runtime dispose 清除内存定义,不持久化第二份能力状态。
|
||||
- 所有工具调用仍作为活动事件记录;自定义 MCP 的 Ask 和 delegation 路径继续固定拒绝。
|
||||
- 所有工具调用仍作为活动事件记录;委派沿用已接入能力与请求资源范围。
|
||||
|
||||
### 10.4 Runtime OS 沙箱
|
||||
|
||||
- GoodBuddy 不加载 DSH 平台 Sandbox Provider,也不执行启动沙箱探测。
|
||||
- “安全与数据”不提供 Runtime OS 沙箱开关。
|
||||
- 不提供 Runtime OS 沙箱开关;“安全”设置分类已移除。
|
||||
- 握手明确报告 `execution.mode = 'host'`,状态文案明确说明工具使用当前用户权限。
|
||||
- Electron Renderer、Preload、Browser Session 等应用安全沙箱不在本设计变更范围内。
|
||||
|
||||
@@ -567,7 +565,7 @@ Host 始终由当前 GoodBuddy 版本提供,不存在自定义 Host 入口。
|
||||
- 高级设置默认收起。
|
||||
- DSH 插件市场提供共享 Switch 样式的总开关并默认关闭。关闭时不请求公共 npm 目录且隐藏市场管理界面,但不修改已有插件的逐项启停状态;因此已启用插件继续随 Host 加载,重新开启后恢复原有管理状态。
|
||||
- 同一 Runtime 页面提供紧凑的 DSH 插件市场:客户端筛选名称、包名、描述和许可证,已安装插件优先显示。
|
||||
- 安装前使用一个明确 Checkbox 确认 npm 安装脚本、插件初始化和 Execute 工具均使用当前用户权限;不展示权限矩阵或逐工具审批。
|
||||
- 安装前使用一个明确 Checkbox 确认 npm 安装脚本、插件初始化和工具均使用当前用户权限;不展示权限矩阵或逐工具审批。
|
||||
- 已安装插件使用共享 Switch 启停,并提供 JSON 配置、明确移除确认和启动失败信息。
|
||||
- npm 目录离线时仍显示并允许管理已安装插件;目录错误就地显示并可重试。
|
||||
- 安装、启停、配置和移除的短期结果通过应用通知显示,不重复保留页内成功提示。
|
||||
@@ -581,7 +579,7 @@ OpenCode、Continue 和 DeepSeek Harness 的后续能力按操作生命周期放
|
||||
|
||||
| 表面 | 负责内容 | 不负责内容 |
|
||||
| --- | --- | --- |
|
||||
| Composer 通用行 | 附件、语音、知识范围、专家、Ask/Execute、Runtime 和发送 | Session 监督、后台进度、历史任务管理 |
|
||||
| Composer 通用行 | 附件、语音、知识范围、专家、Runtime 和发送 | Session 监督、后台进度、历史任务管理 |
|
||||
| Composer Runtime 专属行 | 仅对当前消息生效且需要高频选择的 Agent、预设、Prompt/Command 快捷操作 | Task 级委派、后台执行、Workflow/Hook 生命周期 |
|
||||
| 助手工作栏固定“Runtime”栏目 | 用户所选 Conversation 或 Task 的 Runtime 状态、Task 级委派与取消、后台执行进度/结果、Workflow/Hook 运行、长任务暂停/恢复/终止和会话监督;不显示 Job/Run 树 | 持久模型、程序路径、默认 Agent/预设配置 |
|
||||
| 设置 > Agent Runtime | 持久 Runtime 配置、默认值、插件管理、能力清单和连接诊断 | 某次活动会话的实时控制 |
|
||||
@@ -695,11 +693,11 @@ Renderer 只接收公开 npm 元数据和受管插件状态。任何凭据、完
|
||||
- 二进制检测、版本解析和路径规范化。
|
||||
- ACP 握手、事件转换和请求关联。
|
||||
- 每个会话单请求、跨会话并行。
|
||||
- Ask 在工具分发边界只允许真实注册的 `read`、`skill` 与 Main Web/Story Graph 代理,并拒绝同名冒充和任意新插件工具;Execute 放行插件工具。
|
||||
- 原生及已启用插件工具可调用;Main 代理保留注册身份与请求范围校验。
|
||||
- 握手只接受明确的 `execution.mode = 'host'`。
|
||||
- 未分配 Skill/MCP 不可见;分配后的 Skill catalog 可调用 `skill` 加载。
|
||||
- 原生能力快照只包含 Host/插件原生 Skills,不包含 GoodBuddy 分配的 Skills 或 MCP。
|
||||
- Ask 不注册自定义 MCP 工具;Web 和 Story Graph 代理可用于 Ask 与 Execute;Execute 每轮刷新有界自定义 MCP schema,并在调用前再次校验活动请求、模式、参数和 RuntimeAuthorizer 结果。
|
||||
- 按设置注册 Web、Story Graph 与自定义 MCP;每轮刷新有界 MCP schema,调用前再次校验活动请求、参数和资源范围。
|
||||
- MCP URL、启动命令和凭据不进入 Utility 启动配置或协议结果。
|
||||
- 未知授权结果失败关闭。
|
||||
- 超时、取消、迟到帧和进程意外退出。
|
||||
@@ -732,18 +730,18 @@ Renderer 只接收公开 npm 元数据和受管插件状态。任何凭据、完
|
||||
真实测试已经获得用户授权,但必须由显式环境门禁启用。Web3D Skill 和 MCP 仅作为 `tests/fixtures` 下的测试资产使用,不属于内置发布能力。至少验证:
|
||||
|
||||
1. 文本问答成功,并记录正确 Runtime 和模型用量。
|
||||
2. Ask 可以读取工作区,但写入被拒绝,且不会弹出权限对话框。
|
||||
3. 启用 Web Search 后,Ask 可以调用 Main 管理的 `web_search` 与 `web_fetch`,插件同名工具仍被拒绝。
|
||||
4. Execute 可以在工作区创建测试文件。
|
||||
5. Execute 工具确实以当前用户权限运行,且状态和握手不宣称 OS 隔离。
|
||||
6. Ask、delegation 和无活动请求不能绕过工具分发检查。
|
||||
2. 正常请求可以读取工作区,无产品模式或一般审批等待。
|
||||
3. 启用 Web Search 后,可调用 Main 管理的 `web_search` 与 `web_fetch`,保留代理归属检查。
|
||||
4. 可以在工作区创建测试文件。
|
||||
5. 工具确实以当前用户权限运行,且状态和握手不宣称 OS 隔离。
|
||||
6. 无活动请求或未分配能力的调用不能绕过工具分发检查。
|
||||
7. 取消长请求后不再产生文本,并可继续使用其他 Session。
|
||||
8. 两个 Session 可并行,事件不会串线。
|
||||
9. 释放会话和关闭应用后没有残留 Harness 或工具进程。
|
||||
10. 从全新用户设置流程启用一个 3D 游戏 Skill 和实际本地或开放 MCP,工具事件能够证明二者确实被调用。
|
||||
11. Harness 生成的 3D 游戏项目可以安装、启动和实际游玩,包含 3D 渲染、玩家控制、目标和反馈,浏览器无关键错误。
|
||||
12. 使用公共 npm 搜索,通过 GoodBuddy 捆绑的 npm 安装经审查的最小第三方插件,Host 成功加载并执行其真实工具。
|
||||
13. 实际 ACP 路径中 Ask 拒绝该插件工具,Execute 允许该工具,不出现 GoodBuddy 逐工具确认。
|
||||
13. 实际 ACP 路径可调用已启用插件工具,不出现 GoodBuddy 逐工具确认。
|
||||
|
||||
测试不得打印、快照或提交 API Key。测试创建的文件只能位于专用临时工作区,并在确认可再现后清理。
|
||||
|
||||
@@ -768,11 +766,11 @@ npm run build
|
||||
- Runtime 详情卡内显示状态、路径、版本和当前用户执行权限。
|
||||
- 该阶段的 Skills 与自定义 MCP 设置可把能力分配给 DeepSeek Harness;当时请求级 GoodBuddy 内置 MCP 不支持分配,并在卡片中置灰。布局、键盘语义、文案和保存回显通过真机检查。2026-09-28 的 Story Graph 源码另接入 Harness 分配与 Main 只读代理,验证证据见上文专项记录。
|
||||
- DSH 市场初始关闭且不加载 npm 目录;显式开启后可以搜索、安装、启停、配置和移除插件,安装前只出现一次准确的当前用户权限确认。关闭市场后已有启用插件继续运行,重新开启后管理状态不变。
|
||||
- Ask 写入测试在 Runtime 边界失败。
|
||||
- Ask 可使用已启用的 Main Web Search/Fetch,且插件无法通过同名工具绕过所有权校验。
|
||||
- Ask 拒绝任意插件工具,Execute 可调用全部已启用插件工具。
|
||||
- 无模式请求可以执行测试目录写入,不保留只读名单。
|
||||
- 可使用已启用的 Main Web Search/Fetch,代理调用保留所有权校验。
|
||||
- 可调用全部已启用插件工具。
|
||||
- Runtime 原生清单只显示 Host/插件原生 Skills,不显示 GoodBuddy 分配项。
|
||||
- Execute 工作区内写入成功。
|
||||
- 工作区内写入成功。
|
||||
- Runtime OS 沙箱设置、平台 Runner、启动探测和原生沙箱打包产物均不存在。
|
||||
- 取消、超时、切换 Runtime 和退出应用均能回收进程。
|
||||
- 多会话不串流、不串权限请求、不串用量。
|
||||
@@ -790,11 +788,11 @@ npm run build
|
||||
- DeepSeek Harness 底层库当前是 RC,但 GoodBuddy 不自动跟随升级;每次升级都可能要求同步修改内部控制面。
|
||||
- Harness 文件和命令工具没有 Runtime OS 隔离,会继承 GoodBuddy 客户端当前用户能够访问的主机资源。
|
||||
- 首版不恢复 Harness 原生 Session,Runtime 重启后由 GoodBuddy 历史重建。
|
||||
- 图片输入仅在所选模型连接明确声明支持时可用;首版仍不支持知识库、浏览器控制和 Harness Subagent。Web Search/Fetch 仅使用 Main 代理,MCP 仅支持用户分配、Main 代理和 Execute 自动单次授权路径。
|
||||
- 图片输入仅在所选模型连接明确声明支持时可用;首版仍不支持知识库、浏览器控制和 Harness Subagent。Web Search/Fetch 仅使用 Main 代理,MCP 仅支持用户分配和 Main 代理路径。
|
||||
- Harness Subagent、后台 Job、Workflow、Hook 和原生会话监督尚未实现;未来按 Task 聚合到右侧 Runtime 监督栏,不扩张 Composer 工具栏或暴露 Job/Run 层级。
|
||||
- 推理、工具和用量扩展属于 GoodBuddy 协议,不是标准 ACP 保证。
|
||||
- 市场来自公共 npm 关键字搜索,不是精选目录;包的质量、兼容性和维护状态由发布者负责。
|
||||
- 插件安装、初始化、后台生命周期和 Execute 工具使用当前用户权限,不受 Runtime OS 沙箱保护;Ask 只控制模型工具调用。
|
||||
- 插件安装、初始化、后台生命周期和工具使用当前用户权限,不受 Runtime OS 沙箱保护。
|
||||
- 不支持用户 profile、自定义 Host、任意本地插件路径或 profile patch。
|
||||
|
||||
## 20. 自维护与升级策略
|
||||
|
||||
@@ -6,7 +6,7 @@ Task 和 Runtime 能力的一个轻量触发面和状态镜面。
|
||||
|
||||
## 核心边界
|
||||
|
||||
- 桌面宠物**不**新增 Ask/Execute 执行通道,也不在自身窗口内直接展示模型回复。快速发起
|
||||
- 桌面宠物**不**新增工具执行通道,也不在自身窗口内直接展示模型回复。快速发起
|
||||
和拖放暂存的内容始终交给主窗口现有输入区确认后发送,从不自动发送或自动执行。
|
||||
- 桌面宠物**不**持续读取屏幕内容、剪贴板或全局选中文本。
|
||||
- 桌面宠物显示的任务状态、通知和历史记录均来自现有 Task/Conversation 数据,不建立第二套
|
||||
@@ -41,7 +41,7 @@ Task 和 Runtime 能力的一个轻量触发面和状态镜面。
|
||||
- [助手工作栏](../assistant-workbar/README.md):主窗口执行空间和输入区的权威定义,宠物的
|
||||
快速发起和拖放暂存最终落地到该输入区,不复制其行为。
|
||||
- [直连模型 Agent 能力](../direct-model-agent/README.md)、[远程主机与远程执行](../remote-host/README.md):
|
||||
Ask/Execute 授权边界的权威定义,宠物不扩大或绕过该边界。
|
||||
统一执行与能力范围的权威定义,宠物不扩大或绕过该边界。
|
||||
- [文档处理](../document-processing/README.md):拖放文件解析和格式支持的权威定义,宠物拖放
|
||||
暂存复用同一处理管线,不重新定义支持类型。
|
||||
- 根 [`UI-DESIGN.md`](../../../UI-DESIGN.md):全局视觉、通知视口、Switch/Checkbox 语义和
|
||||
|
||||
@@ -11,15 +11,15 @@
|
||||
| User Stories | [桌面宠物 User Stories](./user-stories.md) |
|
||||
| 任务模型 | [Task 与 Job 统一领域模型](../task-and-job/task-and-job-model.md) |
|
||||
|
||||
本文负责桌面宠物自身的状态、不变量和决策规则,不重新定义 Task、Conversation、Ask/
|
||||
Execute 或附件的既有语义;这些语义以各自权威文档为准。
|
||||
本文负责桌面宠物自身的状态、不变量和决策规则,不重新定义 Task、Conversation、工具执行
|
||||
或附件的既有语义;这些语义以各自权威文档为准。
|
||||
|
||||
## 1. 核心不变量
|
||||
|
||||
### INV-1 宠物不是第二条执行通道
|
||||
|
||||
快速起草和拖放暂存只产生主窗口会话输入区的草稿数据(文本、附件引用),不产生消息、
|
||||
不产生 Task、不触发模型调用。发送、模式选择和 Runtime 选择继续完全由主窗口既有流程
|
||||
不产生 Task、不触发模型调用。发送和 Runtime 选择继续完全由主窗口既有流程
|
||||
拥有。
|
||||
|
||||
### INV-2 状态镜面是既有状态的投影
|
||||
|
||||
@@ -27,7 +27,7 @@ Conversation、Task 和 Runtime 能力上的一层轻量触发面和状态镜面
|
||||
3. 桌面宠物默认不产生新的干扰:不主动弹窗抢焦点,不重复现有原生通知。
|
||||
4. 桌面宠物的开关、位置、外观和提示强度完全由用户控制,且可随时完全关闭并恢复到没有该
|
||||
功能之前的界面状态。
|
||||
5. 桌面宠物不新增或绕过 Ask/Execute 授权边界,也不建立第二条消息发送或任务执行路径。
|
||||
5. 桌面宠物不新增或绕过既有能力范围,也不建立第二条消息发送或任务执行路径。
|
||||
|
||||
## 3. 功能范围
|
||||
|
||||
@@ -45,7 +45,7 @@ Conversation、Task 和 Runtime 能力上的一层轻量触发面和状态镜面
|
||||
|
||||
### 3.2 不包含
|
||||
|
||||
- 在宠物窗口内直接展示模型回复、执行工具调用或建立第二条 Ask/Execute 通道。
|
||||
- 在宠物窗口内直接展示模型回复、执行工具调用或建立第二条执行通道。
|
||||
- 未经用户确认自动发送消息或自动执行任务。
|
||||
- 持续读取屏幕内容、剪贴板或系统级选中文本。
|
||||
- 用户上传任意自定义头像图片、养成机制、货币或每日签到。
|
||||
@@ -74,7 +74,7 @@ Conversation、Task 和 Runtime 能力上的一层轻量触发面和状态镜面
|
||||
- 点击宠物打开一个紧邻宠物的小型弹出框,包含文本输入和“附加文件”按钮。
|
||||
- 文本输入支持多行、粘贴图片;附加文件复用现有附件类型、数量和大小限制。
|
||||
- 弹出框显示将要进入的目标:当前活跃会话,或“新建对话”。用户可在弹出框内切换目标,
|
||||
但不能在弹出框内选择模型、Runtime 或 Ask/Execute 模式。
|
||||
但不能在弹出框内选择模型或 Runtime。
|
||||
- 提交后主窗口被显示或聚焦,目标会话被激活,文字和附件作为草稿填入该会话的输入区,
|
||||
输入焦点落在该输入区。提交动作本身不发送消息、不创建任务。
|
||||
- 取消或关闭弹出框放弃当前草稿,不影响主窗口任何已有草稿。
|
||||
@@ -131,7 +131,7 @@ Conversation、Task 和 Runtime 能力上的一层轻量触发面和状态镜面
|
||||
|
||||
### FR-11 与现有能力的边界
|
||||
|
||||
- 快速起草和拖放暂存最终使用主窗口现有的会话、附件、模型和 Ask/Execute 选择逻辑,不
|
||||
- 快速起草和拖放暂存最终使用主窗口现有的会话、附件、模型和能力配置逻辑,不
|
||||
新增第二套发送或授权路径。
|
||||
- 状态镜面和气泡的任务状态数据来自现有 Task 与 Conversation 记录,不建立独立存储、不
|
||||
与 Task Center 的状态定义产生分歧。
|
||||
|
||||
@@ -270,7 +270,7 @@ function shouldSuppressBecauseMainWindowVisible(mainWindow: BrowserWindow): bool
|
||||
## 11. 与既有模块集成
|
||||
|
||||
- 快速起草和拖放最终只调用主窗口渲染进程已有的“设置输入框文本”“追加附件”“激活
|
||||
会话”“创建新会话”状态更新函数,不新建与 Ask/Execute、模型选择、Runtime 选择相关
|
||||
会话”“创建新会话”状态更新函数,不新建与模型选择、Runtime 选择相关
|
||||
的任何路径。
|
||||
- 点击状态镜面/气泡打开 Task Center 复用现有 Task Center 导航(既有 IPC/路由,与托盘
|
||||
“新建对话”发送 `conversation:new` 事件属于同一类模式:Main 发送一个事件,主窗口
|
||||
|
||||
@@ -170,7 +170,7 @@ GoodBuddy 的能力当前主要在本机执行,SSH 远程项目则要求用户
|
||||
|
||||
### FR-14 与现有能力的边界
|
||||
|
||||
- 远端调用不能扩大 Ask/Execute、Workspace、MCP、Skill 和知识库现有权限。
|
||||
- 远端调用不能扩大 Workspace、MCP、Skill 和知识库既有能力范围,沿用统一执行规则。
|
||||
- 本机提供任务时使用能力声明对应的 Runtime 边界。
|
||||
- SSH 远程项目、本机工具环境和模型配置默认不向 Peer 或网关传播。
|
||||
|
||||
|
||||
@@ -41,11 +41,10 @@ Task、Job、Subjob、Run 和 Subagent 的对象关系以
|
||||
- 直连文本模型的普通问答、工具轮次和上下文摘要会在尚无可见输出时,对瞬时网络错误或
|
||||
单次请求超时最多自动重试 3 次。
|
||||
- OpenCode、Continue 和 DeepSeek Harness 继续使用各自原生执行与委派能力。
|
||||
- Ask 可搜索和分页读取工作区,但不允许补丁写入或进程执行;Subagent 若在 Ask 中使用,
|
||||
只能继承 Ask 的只读能力。
|
||||
- 正常请求可使用已注册的搜索、读取、补丁与进程工具;Subagent 继承父请求能力范围。
|
||||
- 搜索、进程和 Subagent 的长输出返回预览与续读位置,完整内容保留到所属会话或 Runtime 释放。
|
||||
Ask 和 Execute 均可续读当前会话已取得的输出,详见 [输出契约](./technical-design.md#43-输出边界)。
|
||||
- Execute 表示用户授权当前执行空间账号的完整能力,不增加第二套工具审批或权限档位。
|
||||
可续读当前会话已取得的输出,详见 [输出契约](./technical-design.md#43-输出边界)。
|
||||
- 使用当前执行空间账号权限,不增加第二套工具审批或权限档位。
|
||||
- 首版跨平台指桌面本机 Windows、macOS 和 Linux。托管 SSH 项目当前继续使用远端
|
||||
OpenCode;未来若向远端直连模型开放本工具,命令必须由 Host Agent 执行,绝不能回退到
|
||||
桌面本机。
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
## 1. 权威不变量
|
||||
|
||||
1. `process_execute` 和 `subagent_delegate` 只属于直连文本模型。
|
||||
2. Ask 永远不能启动命令、写入工作区或创建 Execute Subagent。
|
||||
3. 子级的项目、执行空间、工作模式、模型连接和能力范围只能继承或缩小。
|
||||
2. 正常请求按已注册工具和当前账号权限执行,不含产品工作模式或一般工具审批策略。
|
||||
3. 子级的项目、执行空间、模型连接和能力范围只能继承或缩小。
|
||||
4. 子级工具清单不包含 `subagent_delegate`,最大深度固定为 1。
|
||||
5. 命令必须在父请求绑定的执行空间运行,禁止跨设备静默回退。
|
||||
6. 一个 `process_execute` 调用只拥有自己创建的前台进程树,不能管理无关进程。
|
||||
@@ -24,9 +24,8 @@
|
||||
10. OpenCode、Continue 和 DeepSeek Harness 的原生能力不被本功能替换或包装。
|
||||
11. 直连模型只在尚未显示文本或推理内容时自动重试瞬时网络错误或请求超时,最多重试
|
||||
3 次;用户取消和已显示的部分输出禁止重放。
|
||||
12. Ask 可调用 `workspace_rg` 和 `workspace_read_text`,但不能调用
|
||||
`workspace_apply_patch`;Execute 可调用三者。
|
||||
13. 搜索直接使用随包 rg 的原生参数和输出;Ask 的参数检查保持工作区内只读,Execute 使用账号权限。
|
||||
12. 本机正常工具请求可调用 `workspace_rg`、`workspace_read_text` 和 `workspace_apply_patch`。
|
||||
13. 搜索直接使用随包 rg 的原生参数和输出,使用当前账号权限;读取和补丁保留工作区 API 语义。
|
||||
14. FR-7 / US-A6:预览之外的搜索、进程和 Subagent 输出保留在所属会话下,分页续读不启动新命令。
|
||||
会话释放先停止活动工作,再删除输出;子会话结束不删除父会话拥有的 Subagent 结果。
|
||||
|
||||
@@ -35,7 +34,6 @@
|
||||
| 维度 | 值 |
|
||||
| --- | --- |
|
||||
| Runtime | `model`、`opencode`、`continue`、`deepseek-harness` |
|
||||
| 工作模式 | `ask`、`execute` |
|
||||
| 执行空间 | `local`、`ssh` |
|
||||
| 本机 Shell | `available`、`unavailable` |
|
||||
| Subagent 深度 | `0`、`1` |
|
||||
@@ -44,21 +42,20 @@
|
||||
|
||||
## 3. 工具可见性决策表
|
||||
|
||||
| Runtime | 模式 | 工作区读/搜索 | 补丁 | `process_execute` | `subagent_delegate` |
|
||||
| Runtime | 执行条件 | 工作区读/搜索 | 补丁 | `process_execute` | `subagent_delegate` |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `model` | Ask | 提供 | 隐藏 | 隐藏 | 提供,只读继承 |
|
||||
| `model` | Execute,本机 Shell 可用 | 提供 | 提供 | 提供 | 提供,Execute 继承 |
|
||||
| `model` | Execute,本机 Shell 不可用 | 提供 | 提供 | 隐藏并报告诊断 | 提供 |
|
||||
| `model` | 本机 Shell 可用 | 提供 | 提供 | 提供 | 按既有委派设置提供 |
|
||||
| `model` | 本机 Shell 不可用 | 提供 | 提供 | 隐藏并报告诊断 | 按既有委派设置提供 |
|
||||
| `model` | SSH,远端后端未实现 | 当前入口不开放 | 当前入口不开放 | 隐藏 | 隐藏 |
|
||||
| 其他 Runtime | 任意 | 不注入本功能工具 | 不注入 | 不注入 | 不注入 |
|
||||
|
||||
工具清单隐藏不是最终授权边界。`callTool` 仍须重新验证 Runtime、工作模式、执行空间和父请求
|
||||
工具清单隐藏不是最终授权边界。`callTool` 仍须重新验证 Runtime、执行空间和父请求
|
||||
是否活动,以拒绝旧快照或伪造调用。
|
||||
|
||||
FR-4 / FR-12 / US-B0:Ask 工作区搜索和读取不依赖知识库、联网搜索或委派开关,不需要
|
||||
切到 Execute 或额外批准。MCP 服务器失败也不改变本机只读工具的可用性。
|
||||
FR-4 / FR-12 / US-B0:工作区搜索和读取不依赖知识库、联网搜索或委派开关,不需要
|
||||
额外批准。MCP 服务器失败也不改变本机工具的可用性。
|
||||
|
||||
`output_read` 在直连模型拥有搜索、进程或 Subagent 服务时提供,Ask/Execute 均可用,不取决于
|
||||
`output_read` 在直连模型拥有搜索、进程或 Subagent 服务时提供,不取决于
|
||||
本轮 Shell 可用性、是否允许再次委派或委派深度。读取只接受当前会话的句柄;其他 Runtime
|
||||
不注册该工具,调用边界同样拒绝。
|
||||
|
||||
@@ -96,7 +93,7 @@ validating
|
||||
| 不存在或不是目录 | 拒绝 |
|
||||
| 当前工作区身份在验证期间变化 | 拒绝本次调用 |
|
||||
|
||||
工作区提供默认目录和相对路径基准,不是 Execute 命令的文件系统边界。单次命令选择其他
|
||||
工作区提供默认目录和相对路径基准,不是命令的文件系统边界。单次命令选择其他
|
||||
工作目录不会修改父请求绑定的项目或工作区,也不会影响后续未指定 `cwd` 的命令。
|
||||
|
||||
## 6. Shell 选择
|
||||
@@ -143,23 +140,18 @@ type SubagentDelegateResult = {
|
||||
|
||||
## 8. 权限与能力继承
|
||||
|
||||
| 父请求 | 子级模式 | 子级能力 |
|
||||
| --- | --- | --- |
|
||||
| Ask | Ask | 父级只读工具的子集,不含进程、写入和再次委派 |
|
||||
| Execute | Execute | 父级已启用工具的子集,包含本机进程能力,不含再次委派 |
|
||||
|
||||
- 子级不能请求更高模式。
|
||||
子级继承父级已启用工具的子集,包含可用的本机进程能力,不含再次委派;不保存模式字段。
|
||||
- 子级使用父请求开始时的工具与能力快照;运行中设置变化不重写快照。
|
||||
- 子级调用 MCP、浏览器或知识能力时继续经过这些能力已有的作用域和生命周期边界。
|
||||
- FR-5 / FR-7 / US-C1:Execute 子级使用父请求的浏览器标签页,不另开标签页或改变所有权;
|
||||
- FR-5 / FR-7 / US-C1:子级使用父请求的浏览器标签页,不另开标签页或改变所有权;
|
||||
子级结束后父模型仍可继续操作该页,父请求继续负责其使用租约。
|
||||
- Execute 子级不弹出额外的“Subagent 执行授权”,也不获得父级没有的 MCP 分配。
|
||||
- 子级不弹出额外的“Subagent 执行授权”,也不获得父级没有的 MCP 分配。
|
||||
|
||||
## 9. 并发和顺序
|
||||
|
||||
- 全局编程 Subagent 最大并发为 3,额外请求进入有界队列。
|
||||
- 单个父模型的工具调用仍按直连模型现有顺序结算,不为本功能改写全部工具并发语义。
|
||||
- 不同父请求的 Subagent 可以并发;共享工作区的并发写入属于用户已授权的 Execute 行为,
|
||||
- 不同父请求的 Subagent 可以并发;共享工作区的并发写入使用当前账号权限,
|
||||
活动记录必须保留实际顺序和结果。
|
||||
- 首版不自动创建工作树、锁文件或回滚层。出现真实冲突时由父模型读取当前工作区事实并处理。
|
||||
|
||||
@@ -198,7 +190,7 @@ attempt
|
||||
| 领域 | 结论 |
|
||||
| --- | --- |
|
||||
| Runtime 隔离 | 完整,工具只注入 `model` |
|
||||
| Ask/Execute | 完整,清单过滤和调用边界双重检查 |
|
||||
| 统一执行 | 清单与调用均校验实际能力、资源归属和生命周期,无产品模式 |
|
||||
| 本机三平台 | 完整,统一契约和平台 Shell 决策已定义 |
|
||||
| Subagent 递归 | 完整,深度固定为 1 |
|
||||
| 取消与失败 | 完整,父子和进程传播及优先级已定义 |
|
||||
|
||||
@@ -18,7 +18,7 @@ GoodBuddy 直连模型已经可以读取、列出和写入工作区文本,使
|
||||
Git 或项目脚本,因此无法独立验证结果。
|
||||
|
||||
本功能设计时,GoodBuddy 已有面向用户专家协作的只读 Subagent,但直连模型尚不能在工具
|
||||
循环中主动委派编程子任务。当前专家协作已继承父请求 Ask/Execute 模式并使用本机直连模型
|
||||
循环中主动委派编程子任务。当前专家协作继承父请求能力范围并使用本机直连模型
|
||||
工具,与本功能的 `subagent_delegate` 仍为不同入口。OpenCode、Continue 和 DeepSeek Harness 一般已经提供
|
||||
Shell、Agent 或 Task 能力,再向它们注入 GoodBuddy 同名工具只会造成重复入口和语义冲突。
|
||||
|
||||
@@ -30,10 +30,10 @@ Shell、Agent 或 Task 能力,再向它们注入 GoodBuddy 同名工具只会
|
||||
|
||||
## 2. 产品目标
|
||||
|
||||
1. 让直连模型在 Execute 模式完成“读取代码 → 修改 → 运行 → 根据结果修正”的闭环。
|
||||
1. 让直连模型完成“读取代码 → 修改 → 运行 → 根据结果修正”的流程。
|
||||
2. 在 Windows、macOS 和 Linux 使用同一个模型工具契约,不要求模型调用平台专属工具名。
|
||||
3. 让直连模型可以把独立工作委派给临时 Subagent,并取得有界、可核验的结果。
|
||||
4. 保持 Ask 只读、Execute 完整授权、执行空间、取消、有界输出和进程回收语义不变。
|
||||
4. 使用当前账号权限,保留执行空间、取消、有界输出和进程回收语义。
|
||||
5. 不向已有原生执行能力的 Agent Runtime 重复注入 GoodBuddy 进程或 Subagent 工具。
|
||||
6. 使用安装包内置 ripgrep 提供跨平台一致的快速代码搜索,不依赖用户预装命令。
|
||||
|
||||
@@ -54,7 +54,7 @@ macOS/Linux 改用 `bash_execute`。
|
||||
|
||||
| Runtime | GoodBuddy `process_execute` | GoodBuddy `subagent_delegate` |
|
||||
| --- | --- | --- |
|
||||
| 直连模型 `model` | Execute 提供 | Ask/Execute 提供 |
|
||||
| 直连模型 `model` | 本机 Shell 可用时提供 | 按既有委派设置提供 |
|
||||
| OpenCode | 不提供 | 不提供 |
|
||||
| Continue | 不提供 | 不提供 |
|
||||
| DeepSeek Harness | 不提供 | 不提供 |
|
||||
@@ -64,25 +64,23 @@ Agent 或插件能力。
|
||||
|
||||
### 3.4 Subagent 继承,不扩权
|
||||
|
||||
Subagent 使用父请求的项目、执行空间、工作模式、直连模型连接和已启用能力快照:
|
||||
Subagent 使用父请求的项目、执行空间、直连模型连接和已启用能力快照:
|
||||
|
||||
- Ask 父请求只能创建 Ask Subagent。
|
||||
- Execute 父请求创建 Execute Subagent。
|
||||
- 子级不能切换父请求绑定的项目、工作区、Runtime、模型连接或工作模式;Execute 命令的
|
||||
- 子级不能切换父请求绑定的项目、工作区、Runtime 或模型连接;命令的
|
||||
单次工作目录选择遵循 FR-3。
|
||||
- 子级不再看到 `subagent_delegate`,首版最大委派深度固定为 1。
|
||||
- 子任务不是新的顶层 Task 或 Conversation,结果先返回父模型。
|
||||
|
||||
### 3.5 不新增权限档位
|
||||
|
||||
Ask 禁止命令和写入。Execute 是用户对当前执行空间账号的完整授权。进程和 Subagent 不增加
|
||||
工具使用当前执行空间账号权限。进程和 Subagent 不增加
|
||||
“受控执行”“仅测试”“可信命令”或逐命令风险等级,也不重复弹出第二套确认。
|
||||
|
||||
### 3.6 精简工作区工具
|
||||
|
||||
直连模型使用 `workspace_rg` 发现文件和搜索内容,使用 `workspace_read_text` 按行分页读取,
|
||||
使用 `workspace_apply_patch` 新增、修改或删除文本文件。新请求不再注入低效的单层目录列表和
|
||||
整文件覆盖工具。Ask 提供前两个只读工具;Execute 额外提供补丁工具。
|
||||
整文件覆盖工具。正常本机工具请求提供这三个工具。
|
||||
|
||||
## 4. 功能范围
|
||||
|
||||
@@ -107,7 +105,7 @@ Ask 禁止命令和写入。Execute 是用户对当前执行空间账号的完
|
||||
- 向 OpenCode、Continue 或 DeepSeek Harness 注入本功能工具。
|
||||
- 递归 Subagent、长期运行的自治 Agent、Workflow、Hook 或恢复未完成子任务。
|
||||
- 新的权限矩阵、逐命令批准、沙箱档位或命令白名单。
|
||||
- 自动安装项目依赖;模型可以在 Execute 中显式运行项目已有的安装命令。
|
||||
- 自动安装项目依赖;模型可以按用户请求显式运行项目已有的安装命令。
|
||||
|
||||
## 5. 功能需求
|
||||
|
||||
@@ -134,18 +132,18 @@ Ask 禁止命令和写入。Execute 是用户对当前执行空间账号的完
|
||||
- 本机执行只能发生在当前桌面执行空间。
|
||||
- 当前请求绑定 SSH 执行空间且没有远端进程后端时不注册工具,绝不在桌面目录回退执行。
|
||||
|
||||
### FR-4 Ask/Execute
|
||||
### FR-4 统一执行
|
||||
|
||||
- Ask 工具清单不包含 `process_execute`。
|
||||
- Runtime 边界必须再次拒绝 Ask 发起的伪造命令调用。
|
||||
- Execute 命令使用 GoodBuddy 客户端当前用户权限,不声称 Runtime OS 沙箱。
|
||||
- 消息通道的直连模型 Execute 继续服从该通道既有工具策略。
|
||||
- `process_execute` 按本机 Shell 与执行空间可用性提供,不依赖产品模式。
|
||||
- Runtime 边界拒绝未注册工具或失效请求的伪造调用。
|
||||
- 命令使用 GoodBuddy 客户端当前用户权限,不声称 Runtime OS 沙箱。
|
||||
- 消息通道沿用已启用能力和资源范围,不保留 `toolApproval` 策略。
|
||||
|
||||
### FR-5 Subagent 委派
|
||||
|
||||
- `subagent_delegate` 接受一个清晰的任务说明,不要求用户预先创建专家。
|
||||
- 子级默认使用父请求选择的直连模型连接。
|
||||
- 子级继承父请求的工作模式和能力上限,但不获得再次委派能力。
|
||||
- 子级继承父请求的能力上限,但不获得再次委派能力。
|
||||
- 子级最终输出、部分输出、错误、用量和状态返回父请求。
|
||||
- 父模型负责综合结果并向用户作最终回答。
|
||||
|
||||
@@ -162,7 +160,7 @@ Ask 禁止命令和写入。Execute 是用户对当前执行空间账号的完
|
||||
- 命令、Subagent 提示、单次返回的输出预览、队列和并发有界;完整输出不因超过预览容量而丢弃。
|
||||
- 预览省略内容时明确标记并提供续读位置。模型可用 `output_read` 逐页取得完整日志及
|
||||
Subagent 结果,包括失败或取消前已取得的部分输出。
|
||||
- Ask 和 Execute 均可续读当前会话的输出。会话或 Runtime 释放后,临时输出删除,旧句柄失效。
|
||||
- 可续读当前会话的输出。会话或 Runtime 释放后,临时输出删除,旧句柄失效。
|
||||
|
||||
### FR-8 环境和凭据
|
||||
|
||||
@@ -199,19 +197,19 @@ Ask 禁止命令和写入。Execute 是用户对当前执行空间账号的完
|
||||
完全不可读;超长单行可使用返回的字节位置继续读取。
|
||||
- `workspace_apply_patch` 支持一个补丁新增、修改和删除多个 UTF-8 文件;执行前验证全部
|
||||
路径和 hunk,执行失败时准确报告已完成文件。
|
||||
- 搜索和读取在 Ask/Execute 均可用;补丁只在 Execute 可用,Main 调用边界再次检查模式。
|
||||
- `workspace_rg` 直接调用随包 ripgrep;Ask 限于工作区内只读搜索,Execute 使用当前账号权限。
|
||||
- 搜索、读取与补丁按已注册目录提供,Main 调用边界检查资源与请求归属。
|
||||
- `workspace_rg` 直接调用随包 ripgrep,使用当前账号权限。
|
||||
具体参数与模式边界见[工具契约](./technical-design.md#工具输入与执行)。
|
||||
- 工作区工具不限制文件总大小、补丁总大小、搜索表达式长度、glob 数量或模型请求的结果
|
||||
数量。单次返回按上下文容量截断或分页;读取结果提供续读位置,搜索完整输出通过 `output_read` 续读。
|
||||
|
||||
## 6. 产品验收
|
||||
|
||||
- [ ] Windows 直连模型 Execute 使用 PowerShell 创建文件、运行测试并读取退出码。
|
||||
- [ ] macOS/Linux 直连模型 Execute 使用 Bash/Sh 完成同一工作流。
|
||||
- [ ] Ask 中模型看不到进程工具,伪造调用也在 Main 边界失败。
|
||||
- [ ] Windows 直连模型使用 PowerShell 创建文件、运行测试并读取退出码。
|
||||
- [ ] macOS/Linux 直连模型使用 Bash/Sh 完成同一工作流。
|
||||
- [ ] 未注册工具的伪造调用在 Main 边界失败。
|
||||
- [ ] 直连模型可以委派编程子任务,子级运行命令并把结果返回父模型。
|
||||
- [ ] Ask Subagent 保持只读;Execute Subagent 不增加第二套批准。
|
||||
- [ ] Subagent 继承能力范围,不增加第二套批准。
|
||||
- [ ] Subagent 不能递归委派,不能切换父请求工作区、模式或模型。
|
||||
- [ ] 切换到 OpenCode、Continue 或 DeepSeek Harness 后不出现本功能工具。
|
||||
- [ ] 非零退出、超时、取消和输出截断均准确展示。
|
||||
@@ -221,7 +219,7 @@ Ask 禁止命令和写入。Execute 是用户对当前执行空间账号的完
|
||||
- [ ] 子任务不进入 Task Center,不创建独立可导航 Conversation。
|
||||
- [ ] TLS 建连重置和请求超时在未输出内容时最多自动重试 3 次,成功后继续原请求。
|
||||
- [ ] 重试等待可取消,已显示部分内容的失败不自动重放。
|
||||
- [ ] Ask 可使用 ripgrep 搜索和分页读取,但不能应用补丁。
|
||||
- [ ] Execute 可通过一个补丁新增、修改和删除多个工作区文件,并运行测试验证。
|
||||
- [ ] 可使用 ripgrep 搜索和分页读取,无模式限制。
|
||||
- [ ] 可通过一个补丁新增、修改和删除多个工作区文件,并运行测试验证。
|
||||
- [ ] Windows、macOS、Linux 的 x64/arm64 安装包均携带对应 ripgrep,且无需系统预装。
|
||||
- [ ] 全量测试、类型检查、Lint 和生产构建通过。
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
- `WorkspaceAccess` 的本机和远端工作区抽象。
|
||||
- 跨平台子进程树终止辅助函数。
|
||||
- 面向用户专家协作的 `SubagentScheduler` 和状态事件。专家使用具备已启用本机能力的
|
||||
直连模型 Runtime,继承父请求 Ask/Execute 及 authorizer,工具事件记入子任务;
|
||||
Ask 保持只读,不把这些本机工具表述为远程 OpenCode 子会话。
|
||||
直连模型 Runtime,继承父请求执行空间与能力范围,工具事件记入子任务;
|
||||
不把这些本机工具表述为远程 OpenCode 子会话。
|
||||
- OpenCode、Continue 和 DeepSeek Harness 各自的 Shell/Agent 能力。
|
||||
- 直连模型 `process_execute`、`subagent_delegate` 和 `output_read`。
|
||||
- 不创建顶层 Task/Conversation 的编程 Subagent actor 与活动归并。
|
||||
@@ -66,11 +66,8 @@ type BuiltinModelToolSummary = {
|
||||
}
|
||||
```
|
||||
|
||||
`process_execute` 标记为 `write`,只在 Execute 清单中出现。
|
||||
`subagent_delegate` 的实际访问级别由父模式决定:
|
||||
|
||||
- Ask 清单中提供只读委派定义。
|
||||
- Execute 清单中提供继承 Execute 的定义。
|
||||
`process_execute` 标记为 `write`,按本机进程能力提供。
|
||||
`subagent_delegate` 继承父请求实际能力,不按读写属性过滤:
|
||||
- `callTool` 不依赖静态 `access` 单独授权,必须检查父请求上下文。
|
||||
|
||||
工具总数和 schema 总字节继续计入直连模型现有 100 个工具与 512 KiB 上限。
|
||||
@@ -88,7 +85,7 @@ type BuiltinModelToolSummary = {
|
||||
覆盖跨多个页面的超长单行。
|
||||
- `workspace_apply_patch` 接受一个 `*** Begin Patch` 文本,支持 `Add File`、`Update File`
|
||||
和 `Delete File`。全部操作先解析并验证;更新文件保留原换行和权限位,单文件原子替换。
|
||||
- Ask 只注册前两个只读工具;Execute 注册全部三个工具。旧的目录列表和整文件覆盖不再进入
|
||||
- 本机正常工具请求注册全部三个工具。旧的目录列表和整文件覆盖不再进入
|
||||
新工具清单。
|
||||
- 输入和目标文件不设固定总量上限。单次工具结果仍遵守直连模型上下文边界;读取返回续读
|
||||
位置,搜索预览省略的内容通过 `output_read` 续读。
|
||||
@@ -104,10 +101,8 @@ Runtime 向模型返回 `{ ok: false, recoverable: true, error, nextAction }`
|
||||
提示不得原样重复失败参数。取消、远端断线、失效工作区、缺失 rg 可执行文件及未分类的内部
|
||||
错误继续向外传播,不转为可恢复结果。
|
||||
|
||||
`workspace_read_text` 仍只接受工作区内相对路径。搜索在 Ask 中检查 cwd、搜索路径、模式文件
|
||||
和忽略文件位于工作区内,并阻止 `--pre`、`--hostname-bin`、`--follow/-L`、`--search-zip/-z`,
|
||||
避免只读调用启动外部命令或跟随链接越界。Execute 原样接受 rg 参数及账号可访问的路径,
|
||||
不增加逐工具授权。两种模式均禁用外部 rg 配置,不提升系统权限。
|
||||
`workspace_read_text` 仍只接受工作区内相对路径。搜索原样接受 rg 参数及账号可访问的路径,
|
||||
不增加逐工具授权;保留 `--no-config` 默认参数、原生退出码、取消和分页,不提升系统权限。
|
||||
|
||||
ripgrep 结果按退出状态处理:
|
||||
|
||||
@@ -157,7 +152,7 @@ const processExecuteInputSchema = z.object({
|
||||
`..` 和符号链接,不限制目标位于工作区内。工具 schema 向模型明确这一规则。
|
||||
- 首版不接受 `env`、`stdin`、`background`、`pty`、`shell` 或任意 executable 参数。
|
||||
- Shell 选择由执行后端决定,防止模型绕过平台契约启动另一套受管接口。
|
||||
- 命令字符串仍可以调用当前账号本来有权运行的程序;Execute 不增加命令白名单。
|
||||
- 命令字符串仍可以调用当前账号本来有权运行的程序,不增加命令白名单。
|
||||
|
||||
### 4.2 结果
|
||||
|
||||
@@ -203,7 +198,7 @@ type ProcessExecuteResult = {
|
||||
位于 UTF-8 延续字节的输入 cursor、负数、越界和未知字段均拒绝。
|
||||
|
||||
Provider 根据 `rg:`、`process:` 或 `subagent:` 前缀选择服务,以当前 `conversationId` 校验所有者,
|
||||
不接受模型另传 owner。Ask/Execute 均可用,工具总数为此预留一个槽位;不要求本轮能够启动
|
||||
不接受模型另传 owner。工具总数为此预留一个槽位;不要求本轮能够启动
|
||||
命令或再次委派。分页结果直接 JSON 序列化,不进行二次文本裁剪,以免 cursor 与内容不一致。
|
||||
32 KiB 的页面即使全部需要 JSON 转义,也能保留在现有工具结果容量内。
|
||||
|
||||
@@ -306,7 +301,6 @@ type DirectModelSubagentContext = {
|
||||
childRunId: string
|
||||
projectId?: string
|
||||
conversationId: string
|
||||
workMode: 'ask' | 'execute'
|
||||
}
|
||||
```
|
||||
|
||||
@@ -317,8 +311,8 @@ type DirectModelSubagentContext = {
|
||||
- 子级复用父请求已授权能力快照和知识范围。
|
||||
- 子级复用父 Provider;Main 写入的 `delegationDepth=1` 同时在清单和调用边界过滤
|
||||
`subagent_delegate`。
|
||||
- Ask 子级使用 Ask 清单;Execute 子级使用 Execute 清单。
|
||||
- Execute 子级经 `ModelSubagentRequestContext` 继承父 `browserTabId` 和浏览器所属
|
||||
- 子级使用父请求已启用的工具清单,不注册再次委派。
|
||||
- 子级经 `ModelSubagentRequestContext` 继承父 `browserTabId` 和浏览器所属
|
||||
`browserConversationId`。后者只在 Main 内部请求与工具上下文中传递:浏览器操作使用父
|
||||
Conversation,历史与分页输出仍使用子 Conversation。子级不新建标签页或申请使用租约,
|
||||
结束时只释放自己的临时会话,父标签页和租约仍由父请求生命周期管理。
|
||||
@@ -354,7 +348,6 @@ type ModelToolCallContext = {
|
||||
conversationId: string
|
||||
requestId: string
|
||||
runtimeTarget: 'model'
|
||||
workMode: 'ask' | 'execute'
|
||||
executionSpaceIdentity: string
|
||||
delegationDepth: 0 | 1
|
||||
knowledgeCapabilityToken?: string
|
||||
@@ -363,19 +356,17 @@ type ModelToolCallContext = {
|
||||
|
||||
要求:
|
||||
|
||||
- `listTools` 根据模式、执行空间能力和深度生成快照。
|
||||
- `getApproval` 不为两个工具创建第二套逐次确认;沿用父 Execute 授权和现有通道工具策略。
|
||||
- `callTool` 再次检查 `runtimeTarget`、模式、执行空间 identity、深度和请求是否活动。
|
||||
- `listTools` 根据执行空间能力和深度生成快照。
|
||||
- 工具调用不进入一般审批等待,通道也不保留 `toolApproval` 策略。
|
||||
- `callTool` 再次检查 `runtimeTarget`、执行空间 identity、深度和请求是否活动。
|
||||
- `releaseConversation` 取消并释放该会话拥有的浏览器、Subagent 和进程。
|
||||
- `dispose` 等待有界清理,不因模型或子进程不响应而阻塞应用退出。
|
||||
|
||||
### 8.1 Ask 工具循环
|
||||
### 8.1 工具循环
|
||||
|
||||
普通 Ask 请求进入工具循环,不再依赖知识、联网搜索或 Subagent 是否启用。Runtime 对
|
||||
`workspace_rg`、`workspace_read_text`、`output_read` 三个明确只读工具免去 Ask authorizer
|
||||
调用,避免生产 authorizer 的默认拒绝使已列出的只读工具无法执行。Execute 仍沿用既有
|
||||
authorizer;补丁、进程和其他写入不因此获准。Provider 按清单和调用边界继续校验模式,
|
||||
浏览器工具不加入 Ask 免审批集合。内部上下文摘要使用 `noModelTools`,保留无工具问答路径。
|
||||
正常工具请求不依赖知识、联网搜索或 Subagent 开关来进入工具循环。Provider 按实际注册
|
||||
目录和调用边界检查能力与资源,不保留模式判断或只读免审批名单。内部上下文摘要使用
|
||||
`noModelTools`,保留无工具问答路径;模型不支持工具时仍可普通文本回答。
|
||||
|
||||
### 8.2 MCP 发现与调用
|
||||
|
||||
@@ -476,7 +467,7 @@ Runtime;GoodBuddy 不再额外保留最后 20 条或限制为 128,000 字符
|
||||
### 12.1 单元测试
|
||||
|
||||
- 工具可见性矩阵和 Runtime target 过滤。
|
||||
- Ask 伪造进程调用拒绝。
|
||||
- 未注册或无对应执行空间的伪造进程调用拒绝。
|
||||
- Windows PowerShell、POSIX Bash/Sh 选择和参数。
|
||||
- cwd 默认、相对子目录、绝对路径、工作区外目录、指向外部的符号链接和不存在的目录。
|
||||
- exit 0、非零退出、spawn 失败、超时、取消和输出截断。
|
||||
@@ -505,7 +496,7 @@ Runtime;GoodBuddy 不再额外保留最后 20 条或限制为 128,000 字符
|
||||
|
||||
使用一个最小真实直连文本模型请求:
|
||||
|
||||
1. Execute 创建一段有缺陷的小程序。
|
||||
1. 在专用测试目录创建一段有缺陷的小程序。
|
||||
2. 调用进程工具运行聚焦测试并观察失败。
|
||||
3. 修改程序并再次运行到通过。
|
||||
4. 委派一个 Subagent 检查实现或补充测试。
|
||||
@@ -537,7 +528,7 @@ GoodBuddy Agent 或桌面到 Agent 生产路径,因此不要求远端 Host 验
|
||||
|
||||
1. Shared 工具摘要、schema 和 Runtime target 过滤。
|
||||
2. 本机 Shell 探测、进程执行、输出边界和进程树取消。
|
||||
3. `ModelToolProvider` Execute 接入及 UI 活动。
|
||||
3. `ModelToolProvider` 工具接入及 UI 活动。
|
||||
4. 编程 Subagent 服务、过滤 Provider、事件和用量。
|
||||
5. 设置能力目录与状态诊断。
|
||||
6. 三平台真实命令、真实模型和完整项目验证。
|
||||
|
||||
@@ -40,7 +40,7 @@ Job、Subjob 和 Run 继续是内部对象,不创建树形 UI、独立路由
|
||||
进程执行
|
||||
使用当前用户权限运行 PowerShell、Bash 或 Sh 命令,默认在工作区执行,也可指定其他工作目录。
|
||||
编程 Subagent
|
||||
将聚焦任务委派给同一模型连接;继承当前工作模式和工作区。
|
||||
将聚焦任务委派给同一模型连接;继承当前能力范围和工作区。
|
||||
```
|
||||
|
||||
要求:
|
||||
@@ -107,7 +107,7 @@ GoodBuddy 服务崩溃。
|
||||
```text
|
||||
编程 Subagent
|
||||
检查认证模块的测试失败并提出修复
|
||||
正在运行 · 直连模型 · Execute
|
||||
正在运行 · 直连模型
|
||||
```
|
||||
|
||||
终态:
|
||||
@@ -119,12 +119,11 @@ GoodBuddy 服务崩溃。
|
||||
|
||||
活动块不提供单独的“批准”“提高权限”或“继续递归”按钮。用户取消父请求即可取消子级。
|
||||
|
||||
## 5. Ask/Execute 表达
|
||||
## 5. 执行能力表达
|
||||
|
||||
- Ask 中不显示不可用的进程按钮,因为模型工具没有手动调用入口。
|
||||
- Ask Subagent 活动明确显示“只读”。
|
||||
- Execute 活动显示“当前用户权限”,不声称 OS 沙箱或工作区隔离。
|
||||
- 如果用户从 Ask 切到 Execute,只有下一条请求使用新模式;运行中的 Subagent 不切换。
|
||||
- 模型工具没有手动调用入口,不显示模式按钮或子代理模式徽标。
|
||||
- 工具使用当前用户权限,不声称 OS 沙箱或工作区隔离。
|
||||
- 能力配置变更按既有生命周期作用于后续请求,运行中的 Subagent 保留请求归属。
|
||||
|
||||
## 6. 错误与通知
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
关联:FR-2、FR-3、FR-4。
|
||||
|
||||
Given 当前项目位于 Windows 本机且选择直连模型 Execute,When 模型调用
|
||||
Given 当前项目位于 Windows 本机且选择直连模型,When 模型调用
|
||||
`process_execute`,Then GoodBuddy 使用可用 PowerShell 在项目目录运行命令,并返回
|
||||
Shell、目录、退出码、输出和耗时。
|
||||
|
||||
@@ -46,7 +46,7 @@ Bash,Bash 不可用时使用 Sh,工具契约保持不变且实际 Shell 明
|
||||
|
||||
关联:FR-3。
|
||||
|
||||
Given 当前请求为本机 Execute,When 模型传入绝对路径或相对工作区路径,Then 命令在
|
||||
Given 当前请求在本机运行,When 模型传入绝对路径或相对工作区路径,Then 命令在
|
||||
解析后的目录执行,包括工作区外目录和符号链接目标,And 后续省略 `cwd` 时仍使用原工作区。
|
||||
When 目标不是目录或不存在,Then 命令不启动并返回准确错误。
|
||||
|
||||
@@ -86,15 +86,15 @@ Given 直连模型在 TLS 建连、网络传输或单次请求超时时失败且
|
||||
|
||||
关联:FR-4、FR-12。
|
||||
|
||||
Given 用户在 Ask 或 Execute 中处理本机项目,When 模型需要定位代码或读取大文件,Then
|
||||
Given 用户处理本机项目,When 模型需要定位代码或读取大文件,Then
|
||||
它可以使用随包 ripgrep 搜索内容或列出文件,并按行分页读取命中位置,不要求用户预装 `rg`。
|
||||
Given Ask 未启用知识库、联网搜索或编程委派,Then 工作区搜索和读取仍可使用,不要求额外批准。
|
||||
Given 未启用知识库、联网搜索或编程委派,Then 工作区搜索和读取仍可使用,不要求额外批准。
|
||||
|
||||
### US-B1 修改后运行验证
|
||||
|
||||
关联:FR-2、FR-4。
|
||||
|
||||
Given 用户选择 Execute 并要求修复代码,When 直连模型修改文件,Then 它可以运行聚焦测试
|
||||
Given 用户要求修复代码,When 直连模型修改文件,Then 它可以运行聚焦测试
|
||||
或检查命令,并根据真实结果继续修改,直到给出完成或阻塞结论。
|
||||
|
||||
### US-B2 使用本机工具环境
|
||||
@@ -109,15 +109,15 @@ Given 用户选择了 GoodBuddy 托管或自定义 Node/Python,When 新命令
|
||||
关联:FR-2、FR-9。
|
||||
|
||||
Given 项目缺少所需命令或依赖,When Shell 返回错误,Then 工具保留退出码和错误文本,
|
||||
And 模型说明缺失项或在 Execute 中采取用户要求的安装步骤,不把环境缺失报告为模型故障。
|
||||
And 模型说明缺失项或采取用户要求的安装步骤,不把环境缺失报告为模型故障。
|
||||
|
||||
### US-B4 使用补丁修改文件
|
||||
|
||||
关联:FR-4、FR-12。
|
||||
|
||||
Given 用户选择 Execute,When 模型提交包含新增、修改或删除操作的工作区补丁,Then
|
||||
Given 用户要求修改文件,When 模型提交包含新增、修改或删除操作的工作区补丁,Then
|
||||
GoodBuddy 在写入前验证全部路径和上下文,逐文件原子写入,并返回实际修改的文件列表。
|
||||
Given 用户选择 Ask,Then 补丁工具不出现在清单中且伪造调用会被拒绝。
|
||||
Given 请求的执行空间不支持补丁,Then 工具不出现在清单中且伪造调用会被拒绝。
|
||||
|
||||
## 4. Epic C:Subagent 委派
|
||||
|
||||
@@ -126,16 +126,16 @@ Given 用户选择 Ask,Then 补丁工具不出现在清单中且伪造调用
|
||||
关联:FR-5、FR-6。
|
||||
|
||||
Given 父直连模型正在处理复杂请求,When 它调用 `subagent_delegate` 并给出独立任务,
|
||||
Then 子级使用同一项目、模型连接和 Execute 能力完成工作,And 最终结果返回父模型综合。
|
||||
Then 子级使用同一项目、模型连接和已启用能力完成工作,And 最终结果返回父模型综合。
|
||||
Given 父请求已有浏览器标签页,When 委派任务需要浏览器,Then 子级使用同一页;子级完成后,
|
||||
父模型仍可继续操作该页,不因子会话清理而关闭父页。
|
||||
|
||||
### US-C2 Ask 中只读委派
|
||||
### US-C2 委派能力继承
|
||||
|
||||
关联:FR-4、FR-5。
|
||||
|
||||
Given 父请求为 Ask,When 模型委派分析任务,Then 子级保持 Ask,不能写文件或运行命令,
|
||||
And 不因 Subagent 存在而扩大权限。
|
||||
Given 父请求已有能力范围,When 模型委派分析任务,Then 子级不获得未启用能力,
|
||||
And 遵循用户明确的仅分析要求,不引入产品只读模式。
|
||||
|
||||
### US-C3 禁止递归委派
|
||||
|
||||
@@ -179,7 +179,7 @@ GoodBuddy 不注入 `process_execute` 或 `subagent_delegate`,And Runtime 原
|
||||
关联:FR-1。
|
||||
|
||||
Given 会话从直连模型切换为 Agent Runtime,When 下一次请求开始,Then 新请求只使用目标
|
||||
Runtime 的能力;切回直连模型时重新获得符合工作模式的直连工具。
|
||||
Runtime 的能力;切回直连模型时重新获得已注册的直连工具。
|
||||
|
||||
### US-D3 不在错误设备执行
|
||||
|
||||
@@ -192,5 +192,5 @@ Given 当前执行空间是 SSH 且远端进程后端尚不可用,When 解析
|
||||
|
||||
关联:FR-1、FR-4。
|
||||
|
||||
Given 消息通道项目选择直连模型,When 合法消息触发 Ask 或 Execute,Then 使用与桌面会话
|
||||
相同的工具矩阵和通道既有工具策略,不维护第二套 Shell 能力配置。
|
||||
Given 消息通道项目选择直连模型,When 合法消息触发请求,Then 使用与桌面会话
|
||||
相同的工具矩阵和能力分配,不维护第二套 Shell 能力配置或通道审批策略。
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
|
||||
## 解析与设置
|
||||
|
||||
`DocumentParsingService` 统一服务聊天文档、知识库、成果导入和设置测试。`HttpDocumentOcr`
|
||||
`DocumentParsingService` 统一服务聊天文档、知识库、旧成果导入 API 和设置测试。成果导入界面
|
||||
已移除;工作区“导入文件”只复制或上传原件,不解析、不自动加入消息。会话附件仍由下述会话
|
||||
资产存储管理,不自动复制到项目目录。`HttpDocumentOcr`
|
||||
在 Main 调用 PaddleOCR-VL,`render-ocr-pdf.ts` 使用 PDF.js 和本机 Canvas 渲染选中页,
|
||||
不需要本地 OCR 权重。来源未配置时继续原有本地行为;产品没有测试地址默认值。
|
||||
|
||||
@@ -66,6 +68,9 @@ Main 先保存资产,再保存草稿或接受队列;消息、分支建立独
|
||||
会话删除、项目删除及清空数据均核对引用,启动回收已无归属的记录和孤立 UUID 目录。
|
||||
清理失败保留无引用数据库记录供下次重试,不回滚已接受的草稿。
|
||||
|
||||
Renderer 仅在活动会话 ID 非空时读取附件草稿;切换到尚无会话的消息通道项目时不发出
|
||||
`context:get-draft` 请求。切回本地会话后照常恢复附件,Main 继续校验会话 ID 的 UUID 格式。
|
||||
|
||||
引用保存按输入顺序去重并查询资产。已有引用的顺序、会话归属均相同,且资产无需从临时目录
|
||||
转存时,直接返回,不重复开启写事务或删除、插入引用。空引用同样适用;顺序、归属或附件
|
||||
发生变化时仍按原事务更新,临时资产仍须转存。
|
||||
|
||||
@@ -103,7 +103,7 @@ PDF、DOCX、PPTX 和 XLSX 的解析结果保留章节定位及全文,不在
|
||||
### 3.3 本地优先
|
||||
|
||||
- 文本层和本地 OCR 均在设备上处理;
|
||||
- 本地处理不因 Ask 或 Execute 模式改变;
|
||||
- 本地处理遵循解析配置,不依赖产品工作模式;
|
||||
- OCR 来源必须在“本地模型 / 远程服务”之间明确选择;
|
||||
- 配置并保存远程服务即表示用户选择该处理路径,不再增加逐场景授权;
|
||||
- API 密钥只能保存在主进程加密设置中;
|
||||
@@ -451,7 +451,7 @@ FR-H8 至 FR-H12 的资源与预览要求针对已解析文档及其产物,也
|
||||
|
||||
不接入 MinerU、旧 Office 转换、
|
||||
DOCX/XLSX 图片 OCR、图片向量检索、服务安装管理或 DOCX 导出。服务接受 PNG 的探测结果
|
||||
也不改变聊天截图目前作为图片附件的行为。HTTP 上传路径不因 Ask/Execute 模式改变;
|
||||
也不改变聊天截图目前作为图片附件的行为。HTTP 上传路径沿用独立上传许可;
|
||||
沿用第 3.3 节的来源选择与 Main 凭据边界,不增加逐文档授权。
|
||||
不增加完整配置快照、结果版本历史或通用恢复系统;仅记录本次结果需要的来源、选项和资源关系。
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
| 相关基线 | [长期助手路线图](../../roadmap/long-term-assistant-roadmap.md)、[统一界面设计系统](../../../UI-DESIGN.md) |
|
||||
|
||||
本文定义 GoodBuddy 中类似自然通话的全双工实时语音能力,包括本地与云端语音引擎、
|
||||
音频平面、会话状态、打断语义、工具审批、数据留存、失败恢复、跨平台交付和验收指标。
|
||||
音频平面、会话状态、打断语义、工具与结构化提问、数据留存、失败恢复、跨平台交付和验收指标。
|
||||
|
||||
本文所称“支持本地与云端”是指用户可以显式配置并选择不同语音引擎,不代表系统可以在
|
||||
它们之间自动切换。**GoodBuddy 不设计静默降级。**
|
||||
@@ -38,7 +38,7 @@
|
||||
控制、Provider Adapter、工具权限、持久化和资源回收。
|
||||
7. 音频帧不进入普通 `AgentEvent` 和聊天消息持久化通道。默认只保存最终文本、会话状态和
|
||||
有界诊断,不保存原始录音。
|
||||
8. 语音不能成为新的授权通道。Ask 继续只读,Execute 的工具调用继续经过现有审批控件。
|
||||
8. 语音沿用文本请求的统一执行规则与能力范围,不引入产品工作模式或一般工具审批。
|
||||
|
||||
---
|
||||
|
||||
@@ -51,7 +51,7 @@ GoodBuddy 当前已经具备:
|
||||
- 将完整录音重采样为 16 kHz PCM 的能力。
|
||||
- 基于 `sherpa-onnx` 的本地离线识别、模型下载、ZIP 迁移、选择和删除。
|
||||
- Main 中受信任发送者校验、Zod IPC 输入校验、超时、取消和应用关闭回收。
|
||||
- `AgentRuntime.run()` 的流式文本、工具事件、审批、取消和会话持久化。
|
||||
- `AgentRuntime.run()` 的流式文本、工具事件、结构化提问、取消和会话持久化。
|
||||
- Renderer 中的流式聊天时间线、全局通知和可访问的输入控件。
|
||||
|
||||
当前链路仍是:
|
||||
@@ -89,7 +89,7 @@ GoodBuddy 当前已经具备:
|
||||
- 用户开口时可以自然打断,助手在很短时间内停止出声并开始听取新内容。
|
||||
- 用户始终知道当前使用本地还是云端、具体引擎是什么、音频或转写文本会去哪里。
|
||||
- 本地或云端引擎失败时,用户能看到准确状态并决定下一步,不被系统暗中换模型。
|
||||
- 语音对话继续拥有文本聊天中的项目、知识库、角色、Ask/Execute、工具审批和历史能力。
|
||||
- 语音对话继续拥有文本聊天中的项目、知识库、角色、工具、结构化提问和历史能力。
|
||||
|
||||
### 3.2 产品目标
|
||||
|
||||
@@ -113,7 +113,7 @@ GoodBuddy 当前已经具备:
|
||||
- 在实时语音失败后自动改成一次性听写、纯文本发送或系统 TTS。
|
||||
- 默认保存、上传或训练用户原始音频。
|
||||
- 声音克隆、未成年人声音模仿、电话呼入或多人会议。
|
||||
- 使用口头“同意”替代工具审批按钮或键盘确认。
|
||||
- 使用口头“同意”替代必须明确操作的业务确认按钮或键盘确认。
|
||||
- 绕过当前 Agent Runtime 和权限边界的 Provider 直连工具、MCP 或 Connector。
|
||||
- 保证所有本地原生语音模型都能在 CPU 或全部六个发布目标上运行。
|
||||
|
||||
@@ -151,7 +151,7 @@ GoodBuddy 当前已经具备:
|
||||
- 原生全双工与模块化全双工之间切换。
|
||||
- ASR、LLM 或 TTS 组件切换。
|
||||
- 从音频输入改成仅文本输入,或从语音输出改成仅文本输出。
|
||||
- 禁用原本声明可用的工具、知识库、角色或 Execute 能力后继续运行。
|
||||
- 禁用原本声明可用的工具、知识库或角色后继续运行。
|
||||
- 把原始音频改为上传,或改变云端数据地域和保留策略。
|
||||
- 采用明显更慢、更低质量或成本不同的路径。
|
||||
|
||||
@@ -183,7 +183,7 @@ GoodBuddy 当前已经具备:
|
||||
|
||||
### 6.4 产品级适用范围
|
||||
|
||||
本契约不仅适用于语音。GoodBuddy 中 Provider、模型、Runtime、数据处理位置、工作模式、
|
||||
本契约也适用于 GoodBuddy 中 Provider、模型、Runtime、数据处理位置、
|
||||
权限范围和质量档位等影响隐私、成本或能力的用户选择,都不得被静默替换。
|
||||
|
||||
用户明确选择名为“自动”的策略时,系统可以在该策略事先声明的范围内选择,但实际结果和
|
||||
@@ -204,13 +204,13 @@ GoodBuddy 当前已经具备:
|
||||
- 当前平台满足该引擎能力要求。
|
||||
- 麦克风权限可申请。
|
||||
- 当前 Conversation 没有冲突的活动请求。
|
||||
- 当前工作模式和引擎能力兼容。
|
||||
- 当前请求所需能力与引擎能力兼容。
|
||||
|
||||
### 7.2 会话界面
|
||||
|
||||
活动会话显示一个持续可见的语音控制区:
|
||||
|
||||
- 当前状态:准备中、正在听、用户说话、正在思考、助手说话、正在打断、等待审批、
|
||||
- 当前状态:准备中、正在听、用户说话、正在思考、助手说话、正在打断、等待回答、
|
||||
正在重连、失败。
|
||||
- 本地/云端徽标、引擎名称和数据去向。
|
||||
- 实时用户转写和与播放同步的助手文本。
|
||||
@@ -234,12 +234,12 @@ GoodBuddy 当前已经具备:
|
||||
|
||||
键盘点击“停止说话”与语音 Barge-in 使用相同取消和提交语义。
|
||||
|
||||
### 7.4 工具和审批
|
||||
### 7.4 工具和提问
|
||||
|
||||
- Ask 模式继续在 Runtime 边界保持只读。
|
||||
- Execute 模式的工具调用进入现有 Approval Broker。
|
||||
- 等待审批时暂停新的助手音频,可播放一次确定性的短提示,例如“需要你确认一个操作”。
|
||||
- 工具参数、风险、范围和确认操作使用现有可访问审批控件。
|
||||
- 工具调用由实际注册目录、启用与分配和资源范围决定,无产品模式。
|
||||
- 不调用已移除的一般工具 Approval Broker。
|
||||
- 等待结构化回答时暂停新的助手音频,可播放一次确定性的短提示,例如“有一个问题需要你回答”。
|
||||
- 结构化提问与独立业务确认复用现有可访问控件。
|
||||
- 麦克风中的“同意”“确认”或相似内容只作为普通用户文本,不构成授权。
|
||||
- 用户拒绝或取消后,结果作为结构化工具事件返回当前引擎,不私自换模型继续。
|
||||
|
||||
@@ -263,7 +263,7 @@ GoodBuddy 当前已经具备:
|
||||
- Provider、模型和版本。
|
||||
- 支持的语言。
|
||||
- 系统级或原生模型全双工。
|
||||
- 是否支持工具、图像和当前 Ask/Execute 模式。
|
||||
- 是否支持工具、图像和当前请求所需能力。
|
||||
- 所需硬件或云端地域。
|
||||
- 音频和文本的数据去向。
|
||||
- 安装、已验证、不可用或需要凭据状态。
|
||||
@@ -322,7 +322,7 @@ Renderer 不持有长期 API Key、不创建本地模型目录、不决定工具
|
||||
- `voice.stopSession(sessionId)`
|
||||
- `voice.setMuted(input)`
|
||||
- `voice.interrupt(input)`
|
||||
- `voice.respondApproval(...)` 继续复用现有审批接口
|
||||
- 结构化问题回答复用现有问题接口,不新增 `voice.respondApproval(...)`
|
||||
- `voice.onEvent(listener)`
|
||||
|
||||
音频帧不使用逐帧 `ipcRenderer.invoke`、JSON 或 Base64。Main 通过
|
||||
@@ -338,7 +338,7 @@ Renderer 不持有长期 API Key、不创建本地模型目录、不决定工具
|
||||
- 建立所选 Adapter,不执行自动 Adapter 选择。
|
||||
- 维护输入、输出和生命周期状态。
|
||||
- 将 Barge-in 传播到 Provider、Agent Runtime、TTS 和播放队列。
|
||||
- 桥接工具调用、审批、问题和取消。
|
||||
- 桥接工具调用、问题和取消。
|
||||
- 只提交已经确认或实际播放的文本。
|
||||
- 处理超时、重连预算、应用退出、系统休眠和窗口销毁。
|
||||
- 对错误和诊断执行脱敏与边界限制。
|
||||
@@ -426,8 +426,6 @@ type VoiceEngineProfile = {
|
||||
capabilities: {
|
||||
nativeDuplex: boolean
|
||||
supportsTools: boolean
|
||||
supportsAsk: boolean
|
||||
supportsExecute: boolean
|
||||
inputLanguages: string[]
|
||||
outputLanguages: string[]
|
||||
}
|
||||
@@ -447,7 +445,6 @@ type VoiceSessionSnapshot = {
|
||||
profileRevision: string
|
||||
engineConfigurationDigest: string
|
||||
runtime?: VoiceRuntimeSnapshot
|
||||
workMode: 'ask' | 'execute'
|
||||
inputFormat: VoiceAudioFormat
|
||||
outputFormat: VoiceAudioFormat
|
||||
turnDetection: VoiceTurnDetectionConfig
|
||||
@@ -633,7 +630,7 @@ AudioWorklet
|
||||
- 权重下载、ZIP 迁移、校验和、磁盘占用和卸载。
|
||||
|
||||
本地原生模型不作为六平台默认能力。只有能力检测和一次真实会话测试通过后才允许选择。
|
||||
缺少结构化工具能力的模型可以声明为 Ask-only;Execute 入口必须阻塞并说明原因,不能暗中
|
||||
缺少结构化工具能力的模型须明确标为不支持工具,普通问答仍可用;工具需求须说明限制,不能暗中
|
||||
调用另一个文本模型补齐工具。
|
||||
|
||||
### 12.3 云端原生全双工
|
||||
@@ -696,7 +693,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
- 最终用户文本、已展示的助手消息、`visual-only` Block、实际播放边界和中断状态。
|
||||
- 中断、失败、取消和完成状态。
|
||||
- 有界延迟、音频中断和用量指标。
|
||||
- 工具与审批事件继续进入现有任务和活动记录。
|
||||
- 工具与问题事件继续进入现有任务和活动记录。
|
||||
|
||||
### 14.2 默认不保存
|
||||
|
||||
@@ -730,7 +727,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
| Provider 限流或余额不足 | 结束生成并显示原因,不切本地模型 |
|
||||
| Agent Runtime 失败 | 终止当前轮次,允许重试同一 Runtime,不换连接 |
|
||||
| TTS 失败 | 当前轮次失败,不静默改成系统 TTS 或仅文本成功 |
|
||||
| 工具等待审批 | 暂停响应,保留会话;拒绝后把结果返回当前引擎 |
|
||||
| 等待结构化回答 | 暂停响应,保留会话;回答或跳过后把结果返回当前引擎 |
|
||||
| 应用退出/窗口销毁 | 取消请求、停止 Track、关闭 Port/PeerConnection、终止 Sidecar |
|
||||
| 系统休眠/锁屏 | 停止采集和上传;恢复后要求用户显式继续 |
|
||||
|
||||
@@ -747,7 +744,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
4. 云端会话在开始前显示 Provider、地域、发送内容和可能费用。
|
||||
5. API Key 只在 Main 的加密设置或受控环境变量中使用。
|
||||
6. 临时 Provider 凭据具有最短可行期限、最小能力和单会话作用域。
|
||||
7. Provider 工具调用必须回到 Main 的白名单、Schema、Ask/Execute 和审批边界。
|
||||
7. Provider 工具调用必须回到 Main 的注册目录、Schema、能力与资源范围校验。
|
||||
8. 本地 Sidecar 只监听 loopback,使用短期认证,不开放外部端口。
|
||||
9. 模型权重按受信任目录、固定来源、大小和 SHA-256 校验,导入 ZIP 防止路径穿越和压缩炸弹。
|
||||
10. 日志只记录状态、耗时、错误分类和匿名引擎 ID,不记录语音正文和音频。
|
||||
@@ -797,7 +794,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
- 临时文本、已提交文本和播放位置对齐测试。
|
||||
- 同一引擎重连预算与超时测试。
|
||||
- “禁止静默降级”矩阵测试:任何 Adapter、Provider、模型、地域或 Runtime 变化都必须失败。
|
||||
- Ask 只读和 Execute 审批测试。
|
||||
- 无模式工具调用、已关闭能力拒绝和内部无工具调用测试。
|
||||
- 窗口销毁、应用退出、休眠和设备丢失的资源释放测试。
|
||||
- 不持久化音频、临时 Token 和 Provider 原始正文的数据库测试。
|
||||
|
||||
@@ -809,7 +806,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
- 网络抖动、丢包、重复和断开。
|
||||
- 超前文本、迟到音频和错误播放位置。
|
||||
- 用户抢话、回声、短噪音和长停顿。
|
||||
- 工具调用、审批、拒绝和取消。
|
||||
- 工具调用、结构化问题、跳过和取消。
|
||||
|
||||
真实声学测试使用预录双声道夹具,一路作为助手扬声器参考,一路作为用户麦克风输入。
|
||||
不能只通过静态单段 WAV 验证全双工。
|
||||
@@ -819,7 +816,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
- 六个发布目标分别验证麦克风权限、采集、播放、设备拔插和应用退出。
|
||||
- 本地模型在声明的最低硬件上完成 30 分钟稳定性和实时系数测试。
|
||||
- 云端 Provider 测试会产生外部调用和费用,只在明确授权的 gated 测试中运行。
|
||||
- 每个云端 Adapter 至少验证一次真实音频输入、真实音频输出、打断和工具审批。
|
||||
- 每个云端 Adapter 至少验证一次真实音频输入、真实音频输出、打断和工具调用。
|
||||
- 真实测试失败时不使用配置握手成功替代生成验证。
|
||||
|
||||
---
|
||||
@@ -870,7 +867,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
- 在线 ASR 和 VAD 模型管理。
|
||||
- Agent Runtime 流式文本桥。
|
||||
- 本地 TTS 模型管理、短语规划、音频回调和取消。
|
||||
- 最终文本持久化与工具审批。
|
||||
- 最终文本持久化与工具调用。
|
||||
- 六个平台/架构验证。
|
||||
|
||||
### 阶段 3:首个云端原生 Adapter
|
||||
@@ -878,7 +875,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
- Main-only 凭据和引擎 Profile。
|
||||
- WebRTC 或 WebSocket 会话。
|
||||
- 转写、音频、截断、用量和 Provider 错误。
|
||||
- sideband 工具与审批。
|
||||
- sideband 工具与结构化提问。
|
||||
- 真实有费用的 gated 验证。
|
||||
|
||||
### 阶段 4:本地原生全双工 Adapter
|
||||
@@ -906,7 +903,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
4. 用户开口触发 150 ms 内静音和响应取消。
|
||||
5. 持久化已提交用户文本、已展示助手内容、`visual-only` Block 和实际播放边界;下一轮
|
||||
模型上下文只使用已播放文本与完整显示的 `visual-only` Block。
|
||||
6. 模拟工具审批时暂停语音,拒绝口头授权。
|
||||
6. 模拟结构化问题时暂停语音,验证回答、跳过和取消。
|
||||
7. 注入 Adapter 失败后明确结束,不切换任何引擎。
|
||||
8. 关闭窗口后所有 Track、Port、计时器和模拟任务归零。
|
||||
|
||||
@@ -921,7 +918,7 @@ Endpoint 不能因为 URL 相似就被标记为实时语音。
|
||||
- 任何引擎、Provider、模型、地域、Runtime 或模式变化都不能在测试中静默发生。
|
||||
- 助手播放期间继续采集麦克风,用户可在 P95 150 ms 内打断。
|
||||
- 中断后未播放音频与文本不进入下一轮上下文。
|
||||
- Ask 和 Execute 在语音中与文本中使用同一权限和审批边界。
|
||||
- 语音与文本使用同一能力与资源范围,不保留产品模式或一般工具审批。
|
||||
- 语音口令不能批准工具。
|
||||
- 云端长期凭据不进入 Renderer,本地 Sidecar 不监听外部地址。
|
||||
- 默认数据库、日志和 Artifact 中没有原始音频。
|
||||
|
||||
@@ -17,6 +17,14 @@ Main 仅在 `capability === 'image-generation'` 时调用 `withImageConversation
|
||||
公开成果事件和消息 metadata 保存,不新增表、迁移、服务端 ID 或 Runtime 会话缓存。
|
||||
它是该回复的展示事实,不进入下一轮提示词。
|
||||
|
||||
成果页移除后,这条会话图片存储和读取链路继续保留;没有批量迁移或删除 artifact。
|
||||
需要项目图片文件时使用 `save_image` 显式保存。其 `artifactId` 是会话图片、上传图片或
|
||||
`generate_image` 返回的图片 ID,不依赖成果页;旧消息中的 `artifactIds` 继续有效。
|
||||
工具将实际图片文件写入 Runtime 所在主机的绝对路径,远程项目写到远程 Host。
|
||||
工作区导入不会创建会话图片记录。工具发现规则见
|
||||
[会话图片工具](../conversation-media-generation/technical-design.md#图片保存工具)。
|
||||
文件与会话数据的边界见[工作区文件](../assistant-workbar/workspace-files.md#存储与实现)。
|
||||
|
||||
## 上游请求
|
||||
|
||||
`ModelAgentRuntime` 将已有文字历史作为会话数据加入提示词,并把本轮要求放在末尾。
|
||||
|
||||
@@ -65,7 +65,7 @@ OpenAI 兼容向量模型、RRF 混合检索、知识图谱、任务状态和来
|
||||
UI 必须在修改前持续说明该行为。
|
||||
13. 第一阶段和第二阶段均不新增付费或外部模型调用。现有 Embeddings 调用仍由
|
||||
用户配置决定。
|
||||
14. Ask 的运行时边界保持只读。知识库内容始终被标记为不可信证据,
|
||||
14. 知识检索工具保持只读。知识库内容始终被标记为不可信证据,
|
||||
不能成为系统指令。
|
||||
15. 向量连接是 GoodBuddy Main 管理的知识服务依赖,不是 Agent Runtime 模型。它不进入
|
||||
直连模型、OpenCode、Continue、DeepSeek Harness、远程 Runtime 或项目 Runtime 的
|
||||
@@ -231,7 +231,7 @@ Tokenizer、原始向量或索引访问能力传入 Runtime。切换 Runtime 不
|
||||
- 预检索零结果不阻止回答,但必须显示“已检索,未找到相关内容”。
|
||||
- 预检索失败不得自动扩大范围或访问未选知识库。
|
||||
- 图片生成能力不执行知识预检索。
|
||||
- Ask 和 Execute 使用相同的只读检索范围。
|
||||
- 普通请求使用相同的只读检索范围,不依赖产品工作模式。
|
||||
|
||||
### 7.2 中文全文检索
|
||||
|
||||
|
||||
@@ -503,7 +503,7 @@
|
||||
- Main 重新检查知识库、文档、分块和来源归属
|
||||
- Renderer 不访问 SQLite、文件系统、Electron shell 或凭据
|
||||
- 知识内容标记为不可信证据
|
||||
- Ask 不获得写工具
|
||||
- 只读检索工具不因检索内容获得写入能力
|
||||
- 错误和日志不包含密钥、授权头和未限制正文
|
||||
|
||||
### US-I3 取消和关闭
|
||||
|
||||
@@ -339,13 +339,13 @@ MCP 的连接、凭据、启用或 Runtime 分配状态。
|
||||
|
||||
“依赖未验证”不是错误,也不能显示为“已就绪”。
|
||||
|
||||
## 10. Ask、Execute 与 MCP
|
||||
## 10. Runtime 与 MCP
|
||||
|
||||
| 场景 | 解释器是否可见 | 是否允许执行 |
|
||||
| --- | --- | --- |
|
||||
| 本机 Execute Runtime | 是 | 按现有 Execute 权限 |
|
||||
| 本机 Ask Runtime | 可以存在于进程环境 | 仍由 Runtime Ask 边界决定,不能因此获得命令权限 |
|
||||
| Main 启动的已启用 stdio MCP | 是 | 按当前 MCP 分配和模式规则 |
|
||||
| 本机 Runtime | 是 | 按实际注册能力和当前账号权限 |
|
||||
| 内部无工具文本调用 | 可以存在于进程环境 | 不注入工具,解释器不改变调用用途 |
|
||||
| Main 启动的已启用 stdio MCP | 是 | 按当前 MCP 分配和资源范围 |
|
||||
| HTTP/SSE MCP | 不适用 | 按当前网络 MCP 规则 |
|
||||
| 远程 Runtime | 否 | 使用远程 Host 自身环境 |
|
||||
|
||||
@@ -392,7 +392,7 @@ MCP 的连接、凭据、启用或 Runtime 分配状态。
|
||||
| 新托管版本 vs 健康旧版本 | 候选完整通过后才发布 |
|
||||
| 系统发现新版本 vs 已保存自定义路径 | 不自动切换 |
|
||||
| 解释器成功 vs 缺少第三方包 | 工具 ready,能力 missing/unknown |
|
||||
| Ask 环境包含解释器 vs Ask 只读 | Ask 权限边界优先 |
|
||||
| 内部文本调用环境包含解释器 | 保持无工具构造 |
|
||||
| 本机设置 vs 远程项目 | 远程隔离优先 |
|
||||
| 镜像不可达 vs 其他来源可用 | 不在同一次操作中静默切换来源 |
|
||||
| 工具下载源 vs 模型/更新下载源 | 各自独立,工具执行环境设置不覆盖其他功能 |
|
||||
@@ -415,7 +415,7 @@ MCP 的连接、凭据、启用或 Runtime 分配状态。
|
||||
| 删除生命周期 | 通过 | 使用中进程先停止,失败不删除 |
|
||||
| 设置生效 | 通过 | 进程启动快照不可变,新进程使用新设置 |
|
||||
| 升级兼容 | 通过 | 旧系统解释器一次性固化为自定义路径 |
|
||||
| Ask/Execute | 通过 | 工具环境不扩大工具集合或权限 |
|
||||
| 执行范围 | 通过 | 工具环境不扩大工具集合或权限 |
|
||||
| 远程边界 | 通过 | 本机配置不进入 Host |
|
||||
| 受限网络 | 通过 | 来源失败可见,不在同次操作静默切换 |
|
||||
| 完全离线 | 有明确限制 | Node 可用;Python 首期要求已有自定义环境 |
|
||||
@@ -454,7 +454,7 @@ MCP 的连接、凭据、启用或 Runtime 分配状态。
|
||||
| SKILL 命令解析 | FR-4 | US-A1、US-A3 |
|
||||
| MCP 命令解析 | FR-5 | US-B1、US-B2、US-B3 |
|
||||
| 生效时机 | FR-7 | US-C3、US-C4 |
|
||||
| Ask/Execute | FR-10 | US-D6 |
|
||||
| 执行范围 | FR-10 | US-D6 |
|
||||
| 远程隔离 | FR-7、FR-9 | US-D1 |
|
||||
| 受限网络与离线 | FR-2、FR-11 | US-E1、US-E2、US-E3 |
|
||||
| 统一设置入口 | FR-12 | US-F1、US-F2 |
|
||||
|
||||
@@ -27,7 +27,7 @@ Python、虚拟环境或 Conda 环境时,也不能被 GoodBuddy 静默替换
|
||||
3. 专业用户可以选择检测到的解释器或指定其他可执行文件。
|
||||
4. 设置始终展示实际来源、版本、路径、工具状态和能力依赖状态。
|
||||
5. 工具执行环境不修改系统环境,也不传播到远程主机。
|
||||
6. 保持 Ask/Execute、Runtime、MCP、取消和进程清理的现有边界。
|
||||
6. 保持 Runtime、MCP 能力范围、取消和进程清理的现有边界。
|
||||
7. 用户可以在“工具执行环境”Tab 中明确选择受管工具工件使用原生地址还是 OSS 镜像。
|
||||
8. Skills、MCP 和工具执行环境通过一个“能力与工具”设置入口形成清晰的能力配置链路。
|
||||
|
||||
@@ -159,8 +159,8 @@ Python、虚拟环境或 Conda 环境时,也不能被 GoodBuddy 静默替换
|
||||
|
||||
### FR-10 权限模式
|
||||
|
||||
- Ask 不因解释器可用而获得额外命令或写入权限。
|
||||
- Execute 继续使用当前本机账号的完整授权。
|
||||
- 解释器可用不改变工具的注册、分配与资源范围。
|
||||
- 工具使用当前本机账号权限,无产品工作模式。
|
||||
- 不为工具环境增加第二套批准流程。
|
||||
|
||||
### FR-11 工具下载源
|
||||
|
||||
@@ -316,7 +316,7 @@ Renderer 不能提交 PATH、环境变量、下载 URL、摘要、安装目录
|
||||
|
||||
## 13. 权限与远程边界
|
||||
|
||||
- Ask/Execute 语义不变。
|
||||
- 统一执行规则不因工具环境变化而改变。
|
||||
- 不新增解释器批准流程。
|
||||
- 不上传 shim、Python、pip 包或自定义路径。
|
||||
- 不修改 Host PATH。
|
||||
@@ -350,7 +350,7 @@ Renderer 不能提交 PATH、环境变量、下载 URL、摘要、安装目录
|
||||
- Node SKILL 与 MCP。
|
||||
- Python SKILL 与 MCP。
|
||||
- 自定义解释器。
|
||||
- Ask/Execute、重建、取消和退出。
|
||||
- 无模式工具执行、内部无工具调用、重建、取消和退出。
|
||||
- 六平台打包。
|
||||
|
||||
这些阶段是开发顺序,不是可长期发布的残缺功能。合并能力前完成普通用户和专业用户的完整
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
验收:
|
||||
|
||||
- Given 系统 PATH 没有 Node.js
|
||||
- When 本机 Execute 请求运行普通 JavaScript SKILL
|
||||
- When 本机请求运行普通 JavaScript SKILL
|
||||
- Then `node` 使用 GoodBuddy 托管来源
|
||||
- And `npm`、`npx` 与该 Node 来源一致
|
||||
- And 设置显示实际 Node 版本
|
||||
@@ -234,16 +234,16 @@
|
||||
- 候选完整诊断成功后才发布
|
||||
- 更新失败继续使用健康旧版本
|
||||
|
||||
### US-D6 安装解释器不扩大 Ask 权限
|
||||
### US-D6 安装解释器不改变能力范围
|
||||
|
||||
作为 Ask 用户,我希望安装 Node/Python 后仍保持原有只读边界,以免环境准备改变授权范围。
|
||||
作为用户,我希望安装 Node/Python 后仍按已启用能力运行,内部文本调用保持无工具。
|
||||
|
||||
验收:
|
||||
|
||||
- 工具环境不新增 Runtime 工具
|
||||
- Ask 是否允许命令仍由当前 Runtime 边界决定
|
||||
- Ask 中禁止的写入和执行不会因解释器存在而放行
|
||||
- Execute 继续使用用户已授权的本机账号权限
|
||||
- 命令可用性由当前 Runtime 的实际注册能力决定
|
||||
- 内部文本调用不因解释器存在而获得工具
|
||||
- 工具继续使用本机账号权限
|
||||
|
||||
## 6. Epic E:受限网络与离线行为明确
|
||||
|
||||
|
||||
@@ -462,8 +462,8 @@ Project 记忆与 Global 偏好冲突时:
|
||||
5. Embedding 只能发送用户已配置允许的记忆,Restricted 默认不发送外部服务。
|
||||
6. 记忆内容和来源不出现在普通日志与通知。
|
||||
7. 跨分区晋升需要明确操作和审计。
|
||||
8. Ask 和 Execute 使用同一只读记忆检索边界。
|
||||
9. 记忆不能绕过系统指令、工具审批和工作区权限。
|
||||
8. 普通请求使用同一只读记忆检索边界,不依赖产品工作模式。
|
||||
9. 记忆不能绕过系统指令、能力范围和工作区权限。
|
||||
|
||||
## 18. 实施顺序
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
| LR-1 | 仅启用操作改变启用状态;仅保存操作改变持久化范围;测试不改变二者。 | FR-1、FR-7;US-1~US-3 |
|
||||
| LR-2 | 非空指定路径优先,完全绕过注册信息;空路径读取全部注册条目,忽略条目的打开状态。 | FR-2、FR-6;US-1、US-2、US-6 |
|
||||
| LR-3 | 先解析当前范围,再校验 `vaultId`,成功后才启动目标仓库的工具进程。 | FR-3;US-5 |
|
||||
| LR-4 | 上游能力完整保留;启用、分配和应用现有工作模式由既有会话入口执行,不另加 Obsidian 权限层。 | FR-4、FR-9;US-4、US-9~US-11 |
|
||||
| LR-4 | 上游能力完整保留;启用、分配和资源范围由既有会话入口执行,不另加 Obsidian 权限层。 | FR-4、FR-9;US-4、US-9~US-11 |
|
||||
| LR-5 | 范围解析失败使本次请求失败,不跳过失效注册条目,不选择替代仓库。 | FR-8;US-7 |
|
||||
| LR-6 | 测试仅发现仓库并列举工具,逐仓库连接;工具数按上游名称去重,不按仓库数相乘。 | FR-7;US-1、US-2 |
|
||||
| LR-7 | 操作结束或取消后关闭本次 MCP 连接和子进程;取消不承诺撤销已落盘写入。 | FR-8;US-8 |
|
||||
@@ -51,10 +51,10 @@
|
||||
|
||||
Main 对范围保存、开关和分配请求先验证来源及输入,再撤销现存的含 Obsidian 授权,随后保存设置。提交相同值也触发撤销。输入无效时在撤销前返回错误;持久化失败时原设置保留,但旧授权已经失效。草稿编辑、文件夹选择和连接测试均不触发此撤销。
|
||||
|
||||
撤销按整个请求授权执行。若同一个授权同时含 Obsidian 和知识库等能力,该授权整体失效;独立的不含 Obsidian 授权保留。后续请求按当前保存的范围、开关、分配和工作模式重新取得授权;关闭后不再签发 Obsidian 能力。
|
||||
撤销按整个请求授权执行。若同一个授权同时含 Obsidian 和知识库等能力,该授权整体失效;独立的不含 Obsidian 授权保留。后续请求按当前保存的范围、开关和分配重新取得授权;关闭后不再签发 Obsidian 能力。
|
||||
|
||||
撤销会立即移除旧授权并发出取消信号,设置响应不等待子进程完全退出。工具调用负责在结束路径关闭 transport 和 client;网关销毁则等待活动调用完成清理,包含先前已撤销但仍在关闭的调用。取消过程中已落盘的内容保留。
|
||||
|
||||
## 完整性检查
|
||||
|
||||
规则已覆盖首次使用、草稿测试、保存、范围恢复、单仓库、多仓库、失效路径、旧配置、工作模式,以及设置变更对旧授权和在途调用的影响。当前没有待定的产品决策。实现及各层自动化、Electron 与安装包验证状态见[进度](./progress.md)。
|
||||
规则已覆盖首次使用、草稿测试、保存、范围恢复、单仓库、多仓库、失效路径、旧配置,以及设置变更对旧授权和在途调用的影响。当前没有待定的产品决策。实现及各层自动化、Electron 与安装包验证状态见[进度](./progress.md)。
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
| FR-1 | 首次使用及旧设置缺少 Obsidian 字段时默认关闭。保存范围、测试连接和启用是独立操作,不互相隐式触发。 |
|
||||
| FR-2 | 默认 `vaultPath` 为空,访问本机已注册的全部仓库,包含未打开的仓库。用户可改选一个本机文件夹,也可恢复默认范围。 |
|
||||
| FR-3 | 工具调用使用仓库 ID 定位。可用仓库超过一个时必须明确指定 `vaultId`;缺失或无效时返回错误,不按顺序、名称或最近使用情况选择写入目标。 |
|
||||
| FR-4 | 提供 MCPVault 0.16.0 的全部 18 个上游工具及其参数能力。不得增加 Obsidian 专用只读设置、工具过滤或额外审批;应用现有 Ask/Execute 工作模式照常生效。 |
|
||||
| FR-4 | 提供 MCPVault 0.16.0 的全部 18 个上游工具及其参数能力。不得增加 Obsidian 专用只读设置、工具过滤或额外审批;按启用、分配和资源范围执行。 |
|
||||
| FR-5 | MCPVault 及完整运行依赖随安装包交付,使用现有托管 Node,首次调用无需联网安装 npm 包,也无需用户安装系统 Node。 |
|
||||
| FR-6 | 不依赖正在运行的 Obsidian、社区插件、REST 服务或 API 密钥。指定文件夹可绕过注册信息,不要求该文件夹已在 Obsidian 注册。 |
|
||||
| FR-7 | 功能关闭时也可测试未保存的草稿。测试返回仓库名称、路径和上游工具数,不修改笔记、不保存范围、不启用功能。 |
|
||||
| FR-8 | 范围无效、仓库不可访问、内置依赖缺失或工具执行失败时说明原因并保留草稿。取消文件夹选择不清空输入;会话调用取消后释放对应子进程。 |
|
||||
| FR-9 | 沿用内置 MCP 的启用与 Runtime 分配方式。设置范围属于桌面端全局配置,具体会话仍受既有能力分配和工作模式约束。 |
|
||||
| FR-9 | 沿用内置 MCP 的启用与 Runtime 分配方式。设置范围属于桌面端全局配置,具体会话仍受既有能力分配和资源范围约束。 |
|
||||
| FR-10 | 提交保存范围、切换 Obsidian 开关或修改分配时,撤销此前含 Obsidian 的请求授权并取消其在途调用,避免继续使用旧范围或旧分配。应用关闭须等待活动工具清理;不回滚已经落盘的修改。 |
|
||||
|
||||
“离线”指本地 MCP 服务的启动和文件操作不需要下载依赖;模型服务是否联网由模型配置决定。工具返回的笔记内容会进入当前会话处理流程,不能将本地接入描述为模型推理也完全离线。
|
||||
@@ -31,6 +31,6 @@
|
||||
|
||||
## 产品验收
|
||||
|
||||
发布前须完成[技术设计中的验证矩阵](./technical-design.md#验证与实施顺序),并在[进度](./progress.md)记录真实结果。验收至少覆盖:关闭状态测试草稿、保存后重新进入设置、恢复全部仓库、多仓库明确选择、实际读取和写回、工作模式约束,以及安装包断网启动。
|
||||
发布前须完成[技术设计中的验证矩阵](./technical-design.md#验证与实施顺序),并在[进度](./progress.md)记录真实结果。验收至少覆盖:关闭状态测试草稿、保存后重新进入设置、恢复全部仓库、多仓库明确选择、实际读取和写回、能力分配与范围,以及安装包断网启动。
|
||||
|
||||
18 个上游工具按名称和参数契约逐项比对;加上仓库发现,共有 19 个共享工具。自动化验证分别覆盖注册 IPC、HTTP 网关和直连工具提供器,安装包及完整 Electron 界面仍单独验收。配置提交时还须验证旧授权立即失效、在途调用收到取消,以及网关销毁等待子进程清理完成。
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
| 共享目录与直连 | [obsidian-tools.ts](../../../src/shared/obsidian-tools.ts) 定义 19 个工具;[model-tool-provider.ts](../../../src/main/agent/model-tool-provider.ts) 发现并调用同一目录,保留上游错误详情 |
|
||||
| 构建 | [package-mcpvault.ts](../../../src/main/obsidian/package-mcpvault.ts) 复制依赖树,[electron.vite.config.ts](../../../electron.vite.config.ts) 调用打包函数,[package.json](../../../package.json) 配置版本及解包资源 |
|
||||
|
||||
正式链路为设置页面经 Preload、受信任的 Main IPC 处理器到配置服务或 ObsidianService;会话经既有能力入口到 ObsidianService,再通过 stdio 到 MCPVault。[index.ts](../../../src/main/index.ts) 创建服务并注入工具启动环境、网关及 IPC;[capability-ipc.ts](../../../src/main/capabilities/capability-ipc.ts) 注册设置、测试和目录选择处理器,接收 [ipc.ts](../../../src/main/ipc.ts) 的注册及刷新回调。`ipc.ts` 保留处理器跟踪、Runtime 重载和生命周期管理,并在会话入口按保存设置及工作模式签发请求授权。
|
||||
正式链路为设置页面经 Preload、受信任的 Main IPC 处理器到配置服务或 ObsidianService;会话经既有能力入口到 ObsidianService,再通过 stdio 到 MCPVault。[index.ts](../../../src/main/index.ts) 创建服务并注入工具启动环境、网关及 IPC;[capability-ipc.ts](../../../src/main/capabilities/capability-ipc.ts) 注册设置、测试和目录选择处理器,接收 [ipc.ts](../../../src/main/ipc.ts) 的注册及刷新回调。`ipc.ts` 保留处理器跟踪、Runtime 重载和生命周期管理,并在会话入口按保存设置与资源范围签发请求授权。
|
||||
|
||||
## 配置与 IPC
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
| `get_note_outline` | 获取笔记大纲 |
|
||||
| `read_note_lines` | 按行读取笔记 |
|
||||
|
||||
服务分页读取上游工具,不设置功能白名单。读写属性供应用既有工作模式使用,不能据此增加 Obsidian 专用过滤。保留上游的错误结果与参数规则,例如删除参数 `confirmPath`;不把参数要求改造成额外确认弹窗。
|
||||
服务分页读取上游工具,不设置功能白名单。读写属性用于说明,不据此过滤工具。保留上游的错误结果与参数规则,例如删除参数 `confirmPath`;不把参数要求改造成额外确认弹窗。
|
||||
|
||||
## 离线打包与生命周期
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
| --- | --- | --- |
|
||||
| TS-1 配置与服务 | 缺省字段、持久化独立性、各平台注册路径、ID 路由、真实上游读写、取消清理 | LR-1~LR-3、LR-5~LR-7 |
|
||||
| TS-2 设置 UI | 草稿测试不保存不启用、切换范围、取消选择、失败保留输入、键盘与窄窗口 | US-1~US-3、US-7、US-8 |
|
||||
| TS-3 网关与 IPC | 正式 Main 处理器、19 个共享工具、分配、Ask/Execute、配置提交撤销旧授权、在途取消与销毁等待;核对 DeepSeek Harness 和远程执行不可用边界 | LR-3、LR-4、LR-7、LR-8;US-4、US-5、US-9~US-12 |
|
||||
| TS-3 网关与 IPC | 正式 Main 处理器、19 个共享工具、分配、无模式读写、配置提交撤销旧授权、在途取消与销毁等待;核对 DeepSeek Harness 和远程执行不可用边界 | LR-3、LR-4、LR-7、LR-8;US-4、US-5、US-9~US-12 |
|
||||
| TS-4 安装包与端到端 | 在实际支持系统上断网且无系统 Node 测试;Obsidian 关闭;许可证及原生资源完整;从设置到真实会话读写 | FR-5、FR-6;US-6 |
|
||||
|
||||
当前分配目标为 `model`、`opencode`、`continue`;[DeepSeek Harness](../../../src/main/agent/deepseek-harness-runtime.ts)和[远程 ACP Runtime](../../../src/main/agent/acp-remote-runtime.ts)的 `supportsScopedDataTools` 为 `false`,沿用既有不可用边界。已通过的生产组件自动化包含设置组件到注册 IPC、HTTP 网关,以及直连工具提供器全部 19 个工具的实际执行。真实聊天会话、Electron 托管 Node、Windows 解包应用及网络限制的不同验证范围见[进度](./progress.md)。
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
| US-1 | 首次检查,FR-1、FR-2、FR-7 | 本机有已注册仓库,功能尚未启用 | 用户进入 MCP 设置并测试默认范围 | 开关保持关闭;返回注册仓库列表和工具数;未保存配置,也未改动笔记 |
|
||||
| US-2 | 指定草稿范围,FR-2、FR-6、FR-7 | 用户选择一个未注册文件夹,尚未保存 | 用户测试该草稿 | 仅探测此文件夹;已保存范围及启用状态不变 |
|
||||
| US-3 | 保存与恢复默认,FR-1、FR-2 | 用户已测试指定文件夹 | 保存后重新进入设置,再切换为全部仓库并保存 | 保存结果可重新加载;恢复默认时保存空 `vaultPath`;两次保存均不自动启用 |
|
||||
| US-4 | 单仓库日常操作,FR-4、FR-9 | 功能已启用并分配给当前会话,范围只有一个仓库 | 助手在允许写入的既有工作模式下读取、修改并再次读取笔记 | 写回当前唯一仓库,结果可从文件核验;无需额外 Obsidian 审批 |
|
||||
| US-4 | 单仓库日常操作,FR-4、FR-9 | 功能已启用并分配给当前会话,范围只有一个仓库 | 助手读取、修改并再次读取笔记 | 写回当前唯一仓库,结果可从文件核验;无需额外 Obsidian 审批 |
|
||||
| US-5 | 多仓库同名文件,FR-3 | 有两个仓库,都包含 `daily.md` | 助手先取得仓库 ID,再指定其中一个修改;另行尝试省略 ID 或传入无效 ID | 明确 ID 的请求仅作用于对应仓库;另两次调用返回错误,两个仓库均不因失败请求改变 |
|
||||
| US-6 | 离线与关闭 Obsidian,FR-5、FR-6 | 安装包已有依赖,Obsidian 未运行,系统未安装 Node,网络断开 | 使用内置服务测试、读取和写入测试仓库 | 本地操作通过现有托管 Node 完成,不请求 npm,也不要求插件;模型联网另行验证 |
|
||||
| US-7 | 范围失败恢复,FR-8 | 注册文件缺失或含失效路径,或者草稿路径不可访问 | 用户测试后改为有效文件夹并重试 | 显示具体原因,保留输入;重试使用新草稿,不偷偷跳过坏仓库或切换目标 |
|
||||
| US-8 | 取消与失败保留,FR-8 | 用户正在编辑草稿或执行会话工具 | 取消文件夹选择、遇到保存失败,或取消会话工具 | 选择取消和保存失败均保留草稿;工具取消关闭对应进程,不报告成功,也不宣称回滚已发生的写入 |
|
||||
| US-9 | 既有权限规则,FR-4、FR-9 | 功能启用且已分配,用户分别使用 Ask 和 Execute | 助手请求写入 | Ask 按应用现有规则保持只读;Execute 沿用正常执行规则,不增加 Obsidian 专用开关、过滤或审批 |
|
||||
| US-9 | 既有能力规则,FR-4、FR-9 | 功能启用且已分配 | 助手请求写入,再关闭能力后请求写入 | 启用时正常执行,关闭后不能绕过设置;不增加 Obsidian 专用开关、过滤或审批 |
|
||||
| US-10 | 旧配置与分配,FR-1、FR-9 | 旧配置没有 Obsidian 字段,已有其他 MCP 配置 | 加载设置并修改 Obsidian 分配 | Obsidian 默认关闭,其他配置保留;修改分配不改写仓库范围;未分配的会话不可调用 |
|
||||
| US-11 | 上游能力完整,FR-4 | 在允许完整调用的工作模式下启用接入 | 获取工具集合并对照 MCPVault 0.16.0 | 18 个上游工具均有可调用映射,参数能力保留;仓库发现辅助工具不计入这 18 个 |
|
||||
| US-11 | 上游能力完整,FR-4 | 启用接入并分配给受支持 Runtime | 获取工具集合并对照 MCPVault 0.16.0 | 18 个上游工具均有可调用映射,参数能力保留;仓库发现辅助工具不计入这 18 个 |
|
||||
| US-12 | 设置变更与旧调用,FR-10 | 有含 Obsidian 的旧请求授权和正在执行的工具 | 提交保存范围、切换开关或修改分配,随后关闭网关 | 旧授权失效,在途调用收到取消;网关等待工具关闭。保存失败也不恢复旧授权;后续请求按实际保存状态重新取得授权 |
|
||||
|
||||
跨平台注册路径和安装包测试分别取证。通过模拟平台字符串测试注册路径,不等于在对应操作系统上完成安装包验收。
|
||||
|
||||
@@ -83,7 +83,7 @@ type DocumentEditState = {
|
||||
6. ONLYOFFICE 插件在一个撤销上下文中执行全部操作。
|
||||
7. 任一操作失败则回滚整个事务;成功后高亮修改并使检查点变为 `dirty`。
|
||||
|
||||
AI 编辑继承发起请求的 Ask/Execute 模式。Ask 只生成建议,不调用编辑器写入;Execute 才能
|
||||
AI 编辑沿用发起请求的能力范围。用户明确只要建议时不调用编辑器写入;要求修改时可
|
||||
应用结构化修改。用户在编辑器中发起操作只授权当前文档和冻结选区,不授予 Agent 其他文件或
|
||||
系统能力。
|
||||
|
||||
|
||||
@@ -69,8 +69,8 @@ ONLYOFFICE 保存先形成 ShareServer 保存检查点。Desktop 下载并验证
|
||||
|
||||
用户在编辑器中明确选择文字、单元格、对象、页面或幻灯片后,可以发起 AI 编辑。编辑器提供
|
||||
当前会话内本次选区的最新内容、有界结构和必要上下文,包括尚未保存到源文件的人工修改。
|
||||
Agent 通过当前编辑会话应用受支持的结构化操作;一次请求形成一个撤销事务。只有 Execute
|
||||
模式可以应用修改;Ask 模式可以生成建议,但不得调用编辑器写入。
|
||||
Agent 通过当前编辑会话应用受支持的结构化操作;一次请求形成一个撤销事务。
|
||||
沿用统一执行规则与当前文档范围;用户明确只要建议时不调用编辑器写入。
|
||||
|
||||
首期有界操作至少覆盖选区读取、指定文本替换、单元格区域公式与数字格式设置,以及指定幻灯片
|
||||
文本和对象属性修改。操作前明确目标文件与范围,完成后返回实际修改结果;不支持的操作说明
|
||||
|
||||
@@ -164,9 +164,9 @@ ShareServer 托管固定版本的 GoodBuddy ONLYOFFICE 插件。插件只能:
|
||||
|
||||
首期优先让插件通过 ShareServer 会话通道与 Desktop 交换事件,不给远端编辑页面添加通用
|
||||
Electron preload。ShareServer 只中继有界事件;Agent 请求仍由 Desktop 创建并经过现有
|
||||
Conversation、模型、Ask/Execute、取消和活动记录边界。
|
||||
Conversation、模型、能力范围、取消和活动记录边界。
|
||||
|
||||
Ask 请求可以返回可复制的修改建议,但 Main 拒绝向插件下发写操作。只有 Execute 请求能够
|
||||
仅要建议的请求返回可复制文本,不下发编辑操作。修改请求
|
||||
取得绑定当前文档会话、revision 和选区的短期编辑 Grant;该 Grant 不包含源文件路径,也不能
|
||||
用于其他文档、文件工具或系统能力。
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
关联:`FR-6`、`FR-13`。
|
||||
|
||||
**Given** 当前 Conversation 使用 Execute,用户在编辑器中选择受支持内容
|
||||
**Given** 用户在编辑器中选择受支持内容
|
||||
|
||||
**When** 用户提交 AI 修改要求
|
||||
|
||||
@@ -59,14 +59,13 @@
|
||||
确认后原位更新、临时高亮并支持定位修改范围,无需重载。完整结果作为一个事务应用,可以
|
||||
单次撤销和重做;高亮不进入正文,完成状态不表示已写回源文件。
|
||||
|
||||
## US-C2 Ask 模式请求修改
|
||||
## US-C2 仅请求修改建议
|
||||
|
||||
**Given** 当前 Conversation 使用 Ask
|
||||
**Given** 用户明确要求只提供建议
|
||||
|
||||
**When** 用户请求 AI 修改当前选区
|
||||
**When** 用户请求 AI 分析当前选区的修改方式
|
||||
|
||||
**Then** GoodBuddy 可以生成修改建议,但不会调用编辑器写入;界面提供切换 Execute 后重新应用
|
||||
的明确入口。
|
||||
**Then** GoodBuddy 生成修改建议,不调用编辑器写入;用户后续明确要求应用时,沿用正常编辑流程。
|
||||
|
||||
## US-C3 读取尚未保存的人工修改
|
||||
|
||||
@@ -93,7 +92,7 @@
|
||||
|
||||
关联:`FR-3`、`FR-6`、`FR-13`。
|
||||
|
||||
**Given** 已分别准备 DOCX、XLSX 和 PPTX 样本,当前 Conversation 使用 Execute
|
||||
**Given** 已分别准备 DOCX、XLSX 和 PPTX 样本,当前 Conversation 可使用编辑能力
|
||||
|
||||
**When** 用户分别请求改写选中段落、修改选区公式及两位小数格式、修改指定幻灯片文本和对象属性
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
|
||||
## 1. 背景
|
||||
|
||||
GoodBuddy 已能把一个请求并行委派给最多三个专家,再综合结果;专家继承 Ask/Execute
|
||||
并使用本机直连模型工具,Ask 仍只读。这适合“一次请求,
|
||||
GoodBuddy 已能把一个请求并行委派给最多三个专家,再综合结果;专家继承父请求能力范围
|
||||
并使用本机直连模型工具。这适合“一次请求,
|
||||
多种专业视角”,但不等同于实验:当前没有结构化变量、重复运行、统一指标、结果晋升和
|
||||
Run 级记忆隔离。
|
||||
|
||||
@@ -43,7 +43,7 @@ Experiment
|
||||
|
||||
1. 实验 Run 复用现有 Task、Runtime、Artifact 和审批机制。
|
||||
2. 每个 Run 有独立变量、会话、运行记忆、任务和成果。
|
||||
3. 默认实验是只读 Ask;写工作区的实验后续使用每 Run 独立沙箱。
|
||||
3. 默认实验不修改用户工作区;写工作区的实验后续单独设计每 Run 隔离,不恢复产品工作模式。
|
||||
4. 多个 Run 不能并发修改同一个用户工作区。
|
||||
5. 失败、取消、预算耗尽或结果不完整的 Run 不参与最佳结果选择。
|
||||
6. 没有成功 Run 时实验为失败或无结论,不能报告成功。
|
||||
@@ -106,7 +106,6 @@ Experiment
|
||||
- 变量与候选。
|
||||
- Runtime、模型和专家。
|
||||
- 工具、知识库和记忆范围。
|
||||
- 工作模式。
|
||||
- 每 Run 预算。
|
||||
- 指标、评估器和停止条件。
|
||||
- 重复次数。
|
||||
@@ -171,7 +170,7 @@ Token 和耗时范围,以及最大并发。超过上限时要求缩小变量
|
||||
|
||||
### 8.2 工作区隔离
|
||||
|
||||
阶段 1 只支持 Ask 和只读工具。阶段 2 的 Execute Run 使用独立临时沙箱或版本化工作树,
|
||||
阶段 1 只比较结果和使用只读实验能力。阶段 2 的写入 Run 使用独立临时沙箱或版本化工作树,
|
||||
结果以 Patch 或成果展示,用户选择候选后再进入单独应用流程。
|
||||
|
||||
### 8.3 记忆隔离
|
||||
@@ -368,12 +367,12 @@ type ExperimentRun = {
|
||||
|
||||
## 18. 实施顺序
|
||||
|
||||
1. 建立 Experiment、Variant、Run 聚合实体和只读 Ask Run。
|
||||
1. 建立 Experiment、Variant、Run 聚合实体和只读实验 Run。
|
||||
2. 实现有限组合、预算估算、并发调度和运行监控。
|
||||
3. 增加确定性指标、失败结算和结果比较。
|
||||
4. 增加模型 Rubric、人工评分和证据工作台。
|
||||
5. 增加重复运行和回放评估。
|
||||
6. 最后评估独立工作树中的 Execute 实验。
|
||||
6. 最后评估独立工作树中的写入实验。
|
||||
|
||||
## 19. 验收标准
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# 远程主机与远程执行
|
||||
|
||||
本功能负责 SSH Host 管理、Host Key、远程环境安装、GoodBuddy Agent、签名 Runtime、
|
||||
远程 Workspace 和 Ask/Execute 生产路径。
|
||||
远程 Workspace 和无模式工具执行生产路径。
|
||||
|
||||
2026-09-28 新增待实现方向:主机管理迁入应用中心,与“云环境管理”成为同级应用;
|
||||
云平台发现已有实例,接入执行时复用 SSH 主机。产品范围见 [PRD](./prd.md)。
|
||||
|
||||
@@ -29,7 +29,7 @@ bootstrap 能力元数据。公开直连能力仍须完成本文末尾 GitHub/
|
||||
- 大文件传输发生在项目切换时会阻塞导航,也把 Host 级故障误显示成项目故障。
|
||||
- Host Key、认证、平台和架构本来就在新增 Host 时验证,此时继续只读探测并在 Host 卡片
|
||||
提供手动准备入口最容易理解。
|
||||
- 项目只保存 Host ID、远端路径、Runtime 选择和默认工作模式。Agent installation、
|
||||
- 项目只保存 Host ID、远端路径和 Runtime 选择。Agent installation、
|
||||
Runtime digest、Workspace identity 和 Host revision 都从当次连接取得,不写入项目;
|
||||
“移出安装”不等于“跳过当前环境检查”。
|
||||
|
||||
@@ -237,8 +237,7 @@ cleanup 失败不回滚环境,也不阻塞下一次更新。
|
||||
已完成本地验证的 Host 可选;浏览目录或保存时才连接所选 Host,并由保存流程完整检查
|
||||
Agent、Workspace 和 Runtime,但不隐式安装。
|
||||
- 项目保存验证 Host 当前 revision 与 Host Key generation、当前 Agent、Workspace、
|
||||
Runtime、模型 profile 和 Ask/Execute 配置;SQLite 事务只写入 Host ID、规范远端路径、
|
||||
Runtime 选择和默认工作模式。
|
||||
Runtime 和模型 profile;SQLite 事务只写入 Host ID、规范远端路径和 Runtime 选择。
|
||||
- 打开或切换已有项目只提交本地项目选择,不执行 SSH、registry、Workspace 或 Runtime
|
||||
检查。首次实际使用远程 Workspace 或 Runtime 时才解析 Host 管理的当前 Agent/Runtime,
|
||||
并建立或复用当前 Agent 连接。已安装 Agent 暂未运行时,
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# SSH 远程主机与 GoodBuddy Agent 实现说明
|
||||
|
||||
## 工作区文件上传
|
||||
|
||||
工作区“导入文件”复用 `workspace/manage`,由 Desktop 分块读取本机原件并通过新
|
||||
`importFile` 动作写入所选远程目录。需要包含该动作的新 Agent;已有版本不支持时报告失败,
|
||||
不回退为桌面 artifact。文件时间同时保留 Agent 的 `mtime` 与可用 `birthtime`,不使用
|
||||
Linux `ctime` 作为创建时间。实现及验证边界见
|
||||
[工作区文件](../assistant-workbar/workspace-files.md)和[工作栏进度](../assistant-workbar/progress.md)。
|
||||
|
||||
## 状态
|
||||
|
||||
下述状态段保留 2026-09-10 的实现与验证截面,不定义额外的信任框架。“新增 Host 只探测、Host 卡片手动准备
|
||||
@@ -64,12 +72,12 @@ Agent `0.11.23` 提供,显式请求期限与取消仍有效。当前问答源
|
||||
项目或凭据;当前远程项目切回第一个普通本地项目。应用启动仍固定
|
||||
选择普通本地项目,不会因为保存了远程项目而自动连接 Host。
|
||||
|
||||
远程项目只有两种工作模式:
|
||||
远程项目不保存产品工作模式。Runtime 使用所选 SSH 账号可访问的文件、进程、网络和已接入工具,
|
||||
不要求额外 trust tier、consent checklist、一般工具审批或“受控执行”授权。
|
||||
当前源码要求 `runtime/acp` capability 6,旧版本在精确协商处提示更新,不补 `execute` 重试。
|
||||
2026-10-04 的源码 Host 验证与配套签名包验收分开,见[统一执行进度](../unified-execution/progress.md)。
|
||||
|
||||
- **Ask**:Runtime 在原生工具权限边界只读访问项目 Workspace,不声称操作系统级只读隔离。
|
||||
- **Execute**:用户已授权使用所选 SSH 账号的完整权限。Runtime 可以使用该账号可访问的文件、进程、网络和工具,不再要求额外 trust tier、consent checklist、逐工具审批或“受控执行”授权。
|
||||
|
||||
Execute 不获得 root 或 SSH 账号本身没有的权限。托管 SSH Prompt 会把当前选中的文本模型
|
||||
Runtime 不获得 root 或 SSH 账号本身没有的权限。托管 SSH Prompt 会把当前选中的文本模型
|
||||
profile 和凭据作为有界、逐 Prompt 的控制消息交给 Agent;该凭据不进入命令参数、环境变量、
|
||||
语义日志或模型调用账本,并在 Prompt 终态清除。此行为只适用于用户已明确启用的可信组织
|
||||
网络和已认证 SSH Host。
|
||||
@@ -167,7 +175,7 @@ Detached GoodBuddy Agent
|
||||
完整验签、payload 扫描和 registry 写入仍只发生在显式 Host 准备/更新流程。
|
||||
- 项目切换不执行远程核对,立即选择本地项目配置。Workspace 或 Runtime 首次实际使用时
|
||||
才通过当前 Agent 连接核对所需能力;失败只影响该操作。新建或显式保存项目仍执行完整
|
||||
准备,并只事务写入 Host、路径、Runtime 选择和工作模式。
|
||||
准备,并只事务写入 Host、路径和 Runtime 选择。
|
||||
- SSH 连接先尝试 attach;Agent 不存在或未运行时执行幂等 bootstrap,然后重新 attach。
|
||||
- Agent 是按需启动的 detached process,不注册开机服务,不依赖 systemd、D-Bus 或 Linger。
|
||||
- 每个模型桥 helper 都为 loopback HTTP 入口生成一次性随机路径 capability;只有写入当前 OpenCode 子进程配置的 URL 可以访问该入口,其他本机用户即使发现临时端口也不能提交模型请求。
|
||||
@@ -257,7 +265,7 @@ Agent adoption 和所有 Runtime 激活成功后,Main 调用新安装的
|
||||
- Host 可以按签名目录固定的 URL、大小和 SHA-256 直接从当前 GitHub/北京镜像来源下载
|
||||
完整 `.gbagent`,也可使用 GoodBuddy 本机下载、流式 SFTP 传输和离线导入。自动模式只在
|
||||
操作开始时择一;执行失败不会在同一次操作中切换 acquisition。
|
||||
- 项目只保存 Host ID、远端路径、Runtime 选择和默认模式。创建或保存时验证 Host current
|
||||
- 项目只保存 Host ID、远端路径和 Runtime 选择。创建或保存时验证 Host current
|
||||
环境;打开或切换只读取本地配置。Workspace/Runtime 实际使用时从 Host current registry
|
||||
和当前 Agent 连接取得 live identity,不再扫描、下载、上传或发布 Agent/Runtime。完整
|
||||
事务、兼容边界和验收要求以
|
||||
@@ -283,8 +291,7 @@ Main 传入已规范化的绝对 POSIX root。Agent 返回 Workspace identity、
|
||||
- 浏览从 SSH 账号 Home 或当前有效绝对路径开始,限制扫描次数、返回条目和总时限;取消、Host 变化、超时或连接失败时关闭 SFTP 并保留用户原先输入。
|
||||
- 每次浏览最多扫描 2,000 项、读取 64 批、返回 500 个目录,总时限 30 秒。链接检查逐项执行,计入同一次浏览的扫描及时间限制;检查期间取消、超时或通道报错仍关闭目录句柄和 SFTP 通道,忽略迟到的结果。
|
||||
- 选择目录只更新项目草稿,仍需通过正常的 Agent、Workspace、Runtime 验证和项目保存事务才会持久化。
|
||||
- Ask Workspace handle 不暴露写入方法。
|
||||
- Execute Workspace handle 可读写,但这不是 Execute 的唯一权限面;Execute Runtime 本身使用 SSH 账号的正常权限。
|
||||
- Workspace handle 按后端实际支持的方法提供能力;Runtime 本身使用 SSH 账号的正常权限,移除模式不补齐尚未实现的 Workspace API。
|
||||
- 文件预览按有界页面传输并保持 UTF-8 字符边界;超过单页大小时先返回当前页,用户可继续加载,不把单页传输上限误作文件总预览上限。搜索、Git diff、目录项和显式文件传输继续保持各自的字节、条目数和路径长度上限。
|
||||
|
||||
## Runtime
|
||||
@@ -294,34 +301,20 @@ Composer Runtime 菜单显示 OpenCode、Continue 和管理入口,不显示直
|
||||
DeepSeek Harness。项目与历史会话保留 OC/CN 选择;不支持的旧 selection 恢复为项目
|
||||
默认值。Main 校验已安装 Runtime 身份与选择一致,按相应 CN/OC 模型 profile 建立模型桥。
|
||||
本机配置的 SKILL 包和 stdio MCP Server 不上传或分配给远程 Runtime;远程 ACP Session
|
||||
仅接收当前请求由 Agent 管理的 HTTP MCP 能力(例如 Execute 图片工具),不继承本机原生
|
||||
仅接收当前请求由 Agent 管理的 HTTP MCP 能力(例如图片工具),不继承本机原生
|
||||
MCP 配置。Continue helper 将 ACP Session 的服务器作为显式 `sessionMcpServers` 交给
|
||||
共享 `ContinueHostAdapter`,与模型桥配置一起生成最终配置;不先写入会被独立模型分支
|
||||
丢弃的原生配置。新建、加载和续接 Session 使用当前列表,空列表清除旧能力;Ask 在 helper
|
||||
和 adapter 两层均不注入这些 Execute 能力。本机独立模型 profile 仍不继承原生 MCP,
|
||||
丢弃的原生配置。新建、加载和续接 Session 使用当前列表,空列表清除旧能力;Continue helper
|
||||
使用原生 agent 模式提供工具。本机独立模型 profile 仍不继承原生 MCP,
|
||||
既有知识库和自定义 MCP 的显式分配规则不变。
|
||||
Node.js、Python 等工具执行环境同样不修改或同步到 Host,
|
||||
完整边界见[工具执行环境](../local-tool-environment/README.md)。
|
||||
|
||||
### Ask
|
||||
### 统一执行
|
||||
|
||||
Ask 与 Execute 一样直接启动已签名 Runtime,不要求 Host 安装额外的进程隔离命令:
|
||||
|
||||
- `cwd` 为项目 Workspace,并继承 SSH 账号的正常环境;
|
||||
- Agent-owned ACP 的备用权限分派允许原生 `read`/`search`,优先选择 `allow_once`;
|
||||
写入、执行和未知工具仍拒绝。独占 raw ACP 保留其原有的读取权限分派。
|
||||
- 未发布的共享路径以中性的 `permission: "ask"` 启动一个进程,再于每个 Session 的
|
||||
`chat.message` 按已登记 workMode 设置原生工具规则。Ask 默认拒绝,放行已支持的
|
||||
读取、搜索和业务问答;子 Session 同步根会话模式并保留原生显式限制,避免固定版本
|
||||
ACP 不转发子 Session 权限请求而永远等待。
|
||||
- Execute Session 放行工具,不再被另一个 Ask Session 的进程级默认值限制。项目目录
|
||||
是默认 cwd,原生子代理仍使用所选 SSH 账号可访问的路径;不增加 Desktop 人工审批。
|
||||
规则及模型路由的唯一实现说明见
|
||||
[共享 Agent Session 设计](../assistant-workbar/runtime-process-reuse-technical-design.md#6-ssh-opencode-与-agent)。
|
||||
|
||||
### Execute
|
||||
|
||||
Execute 直接启动已签名 Runtime:
|
||||
请求直接启动已签名 Runtime,不要求额外的进程隔离命令。ACP 权限回应保留活动请求归属、
|
||||
合法允许选项与取消处理,不再维护产品只读名单。模型路由仍按独立 Session 隔离,见
|
||||
[共享 Agent Session 设计](../assistant-workbar/runtime-process-reuse-technical-design.md#6-ssh-opencode-与-agent)。
|
||||
|
||||
- 直接启动已签名 Runtime entrypoint;
|
||||
- 使用 Agent 本地模型 gateway 时,签名 Agent launcher 会 `exec` 候选 manifest 锁定的
|
||||
@@ -329,10 +322,10 @@ Execute 直接启动已签名 Runtime:
|
||||
launcher 路径;
|
||||
- `cwd` 为项目 Workspace;
|
||||
- 继承 SSH 账号的正常环境、文件系统、进程和网络能力;
|
||||
- 独占启动使用 Execute 配置;共享启动由 Session 规则应用 Execute,不修改其他会话模式;
|
||||
- 独占和共享启动均不携带产品模式,工具和模型按请求归属路由;
|
||||
- 不进行 T2/T3、confinement attestation、approval bridge 或逐工具批准。
|
||||
|
||||
两种模式都保留输入字节上限、用户取消和进程组清理;输出只用有界内存队列与 journal
|
||||
保留输入字节上限、用户取消和进程组清理;输出只用有界内存队列与 journal
|
||||
配合背压,不按 Prompt 累计输出量停止 Runtime。生产 Prompt 不设置固定墙钟总时限;
|
||||
只要 Runtime 尚未按自身协议结束,Main 和 Agent 就允许其持续运行。启动、握手、单个
|
||||
控制 RPC、重连尝试和关闭清理仍使用独立的有界超时,测试可以显式注入短 Prompt 时限
|
||||
@@ -642,8 +635,8 @@ model bridge,以及生命周期和恢复逻辑。单元测试、mock、fixture
|
||||
|
||||
1. Agent 组包、安装或升级:验证当前候选的 attach-or-bootstrap、安装/更新、版本切换及
|
||||
随后的连接。
|
||||
2. Runtime profile、进程启动/归属或 Ask/Execute 边界:通过桌面生产入口启动真实 Runtime,
|
||||
验证受影响模式;Ask 权限改动必须验证只读边界,Execute 权限改动必须验证所需写入、
|
||||
2. Runtime profile、进程启动/归属或工具能力边界:通过桌面生产入口启动真实 Runtime,
|
||||
验证受影响入口、启用与分配以及所需写入、
|
||||
进程和网络能力。
|
||||
3. Agent protocol、RPC、stream、model bridge 或模型消息链路:执行最小有界真实模型调用,
|
||||
禁用非必要工具和附件,并记录实际调用次数;大消息或工具链路改动还应覆盖对应的真实
|
||||
@@ -830,8 +823,7 @@ bundle 构建通过;这组历史结果不替代完整 Host 支持改动后的
|
||||
|
||||
- Host ID;
|
||||
- 规范远端工作目录;
|
||||
- Runtime selection;
|
||||
- `ask | execute` 默认模式。
|
||||
- Runtime selection。
|
||||
|
||||
Agent installation、Host revision/Host Key generation、Workspace identity、Runtime
|
||||
bundle/adapter digest 和 capability generation 都属于 live connection/lease,不进入项目
|
||||
@@ -843,8 +835,8 @@ registry identity,再用同一个 Agent 连接验证 Workspace 路径和 Runti
|
||||
实时 Runtime 创建只接受 OpenCode,使用当前解析后的模型 profile 准备 Agent 本地 gateway,
|
||||
从当前 Agent 连接和 Runtime registry 取得会话 identity,并在该连接上打开 Workspace 和
|
||||
ACP channel。Host 编辑或环境更新会定向失效 Agent 连接与 Runtime 缓存,下一次请求自然
|
||||
重新取得 current 环境;无需修改项目。Ask/Execute 权限继续由每次 Prompt 的 ACP Runtime
|
||||
边界执行。
|
||||
重新取得 current 环境;无需修改项目。每次 Prompt 沿用 ACP Runtime 的能力范围和请求归属,
|
||||
不恢复产品模式。
|
||||
|
||||
Renderer 在用户主动打开已有托管 SSH 项目时立即切换,不显示远程激活状态。Host、Agent、
|
||||
Workspace、Runtime 和 Saving 进度仅用于新建或显式保存项目;进行中可显式取消并禁用会
|
||||
@@ -857,7 +849,7 @@ Renderer 暴露固定方法名、数字 RPC code 和有界 service code,不转
|
||||
identity 已变化且旧 authority 无法恢复,或原 binding 已有 `outcome-unknown` 终态时,显式
|
||||
新 Prompt 才替换旧 binding。新 ACP session 的首次 Prompt 会把 Desktop 已持久化的有界
|
||||
会话历史作为不可信数据一并发送;成功加载或恢复原 ACP session 时不会重复注入历史。
|
||||
Ask 和 Execute 的 Linux Runtime 进程都直接启动已签名 Runtime 或 Agent model bridge
|
||||
Linux Runtime 进程直接启动已签名 Runtime 或 Agent model bridge
|
||||
helper;监督器核对启动后的最终 executable,再登记为运行中进程。
|
||||
|
||||
不持久化 T2/T3、consent、approval bridge、confinement 或组件验证结果。数据库 schema
|
||||
@@ -871,7 +863,8 @@ Detached Agent 不依赖 stdio 留存故障证据。每个 installation 在固
|
||||
`~/.goodbuddy/state/<installationId>/diagnostics/` 中维护
|
||||
`agent-diagnostics.jsonl`、`.1` 和 `.2`,每个文件不超过 64 KiB,目录权限为 `0700`,
|
||||
文件权限为 `0600`。记录覆盖 daemon 启停、detached 启动、连接、恢复和 Runtime
|
||||
启动/退出;每条只包含固定事件、时间、PID、可选工作模式、固定原因和白名单错误码。
|
||||
启动/退出;每条只包含固定事件、时间、PID、固定原因和白名单错误码。当前写入不含模式;
|
||||
启动清理在既有日志锁内仅删除已验证 formatVersion 1 的顶层 `workMode`,保留嵌套内容与损坏行。
|
||||
|
||||
诊断写入使用最多 64 条的有界异步队列。连接、恢复和 Runtime 回调只把已经归一化的固定
|
||||
记录入队,不等待磁盘;原始 `Error` 不进入队列。队列满、目录不可写或轮转失败只丢弃诊断,
|
||||
@@ -1021,8 +1014,8 @@ UI 更新或签名复合包安装流程通过;真实模型调用为 0 次。
|
||||
5. 用测试签名复合包验证在线下载源选择和离线导入/导出;正式 Agent 候选还需公开校验
|
||||
双架构 production 包与签名目录。
|
||||
6. 在已固定 Host Key 的 Linux x64 测试 Host 上验证 attach-or-bootstrap。
|
||||
7. 在 GoodBuddy 专用测试目录验证 Ask 无法修改文件。
|
||||
8. 验证 Execute 可以写文件、启动进程和访问网络,同时不触碰无关 Host 文件。
|
||||
7. 在 GoodBuddy 专用测试目录验证无模式请求与能力分配,不保留产品只读名单。
|
||||
8. 验证可以写文件、启动进程和访问网络,同时不触碰无关 Host 文件。
|
||||
9. 运行一次有界的真实模型调用,确认凭据不进入 Renderer、SSH 参数、远端环境或磁盘,
|
||||
只在当前 accepted operation 生命周期内进入 Agent 内存。
|
||||
10. 中断并恢复 SSH,确认活动 Runtime 不被网络抖动终止。
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
- 不修改 Task、Job 或 Task Center 模型。
|
||||
- 不新增独立 Automation Center。
|
||||
- 不移除定时任务现有入口。
|
||||
- 不扩大智能心跳的工具、目录、网络或 Execute 权限。
|
||||
- 不扩大智能心跳的工具、目录或网络权限,内部文本分析保持无工具。
|
||||
- 不让智能心跳跨越配置范围读取数据。
|
||||
- 不将现有心跳建议静默转换成 Task。
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ Observe Job
|
||||
- 模型声明不能单独证明目标完成。
|
||||
- 成功标准必须可计算或可人工审查。
|
||||
- 连续两轮没有指标改善、重复下一步、连续失败、权限不可用或预算不足时暂停。
|
||||
- 修改范围、预算、Runtime、工作模式或权限必须用户确认。
|
||||
- 修改范围、预算、Runtime 或能力范围必须用户确认。
|
||||
|
||||
## 5. 验收原则
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ Scheduled Task 是带时间或事件触发器的 Task。每个 Scheduled Task
|
||||
一条 Conversation 可以同时承载多个 Task。
|
||||
|
||||
当前时间触发的含义是向关联的普通 Conversation 发送一条任务要求。执行时读取该会话的
|
||||
最新历史、Runtime、工作模式和知识范围,工具配置使用普通发送的同一规则。任务不保存
|
||||
最新历史、Runtime 和知识范围,工具配置使用普通发送的同一规则。任务不保存
|
||||
创建时的上下文或权限快照。新建会话按普通会话规则初始化,不复制来源会话的历史和配置。
|
||||
|
||||
创建 Scheduled Task 时:
|
||||
@@ -38,7 +38,7 @@ GoodBuddy 当前已实现首期统一生命周期:
|
||||
Conversation 的标题和既有消息。
|
||||
- 每个 Schedule 绑定一个稳定产品级 Task 和 Conversation;重复触发复用同一身份,不再
|
||||
为每次触发创建新的顶层 Task。
|
||||
- 创建表单设置任务要求、可选名称、关联会话和执行时间,默认立即执行;工作模式在关联会话中设置,未设置时使用项目默认值。
|
||||
- 创建表单设置任务要求、可选名称、关联会话和执行时间,默认立即执行;不提供工作模式。
|
||||
- 单次、每日和每周计划支持暂停、恢复、立即运行和应用重启恢复。
|
||||
- 到期和手动运行先进入关联 Conversation 的持久输入队列,与回复期间继续发送的普通消息
|
||||
顺序仲裁;默认不打断当前回复,也不与其并发写入时间线。
|
||||
@@ -59,7 +59,7 @@ Job/Subjob/Run 的统一持久化抽象。当前每日和每周按既有 UTC 间
|
||||
- 支持单次、每日、每周、每月、工作日和受限 Cron。
|
||||
- 支持 Task 完成、失败、Conversation 完成等内部事件触发。
|
||||
- 创建时明确选择当前、本项目其他可用或新 Conversation。
|
||||
- 使用关联会话当前的工作模式;新会话使用普通项目默认值。
|
||||
- 使用关联会话当前的 Runtime 与能力配置;新会话沿用普通项目配置。
|
||||
- 在实际发送时解析上下文和执行配置,与手动发送共用执行流程。
|
||||
- 提供时区、错过执行、幂等、租约、重试、恢复、取消、预算和审计。
|
||||
- 让所有重复触发复用同一 Task 和 Conversation 关联。
|
||||
@@ -133,7 +133,7 @@ GoodBuddy Desktop · 项目工作目录
|
||||
```text
|
||||
✓ 为当前 Conversation 新增一个 Task
|
||||
✓ 在左侧会话列表显示“任务 3”
|
||||
✓ 使用关联会话运行时的工作模式
|
||||
✓ 使用关联会话运行时的能力配置
|
||||
✓ 每周五 17:00 自动执行此 Task
|
||||
✓ 文本结果写入当前 Conversation
|
||||
✓ 独立交付物保存到成果
|
||||
@@ -155,13 +155,12 @@ GoodBuddy Desktop · 项目工作目录
|
||||
- 窄窗口使用接近全宽布局,保留 `16px` 外边距。
|
||||
- 字段错误靠近字段;非字段异步错误保留在 Modal 内并提供重试。
|
||||
|
||||
## 6. 工作模式、Runtime 与工具
|
||||
## 6. Runtime 与工具
|
||||
|
||||
### 6.1 会话工作模式
|
||||
### 6.1 统一执行
|
||||
|
||||
创建 Modal 不单独设置工作模式。关联已有会话时,使用该会话实际发送时的工作模式;
|
||||
新会话未单独设置时使用项目默认模式。Ask 在 Runtime 边界保持只读,Execute 使用普通
|
||||
会话的工具授权规则。
|
||||
创建 Modal、会话和项目均无工作模式。执行采用普通会话的 Runtime、已启用能力和资源范围,
|
||||
不保存固定模式或替代审批策略。
|
||||
|
||||
### 6.2 执行时配置
|
||||
|
||||
@@ -171,15 +170,13 @@ GoodBuddy Desktop · 项目工作目录
|
||||
|
||||
已保存计划中的旧工作模式和 Runtime 字段不再控制执行;用户在关联会话或项目中调整配置。
|
||||
|
||||
会话任务详情中的模式与执行来源保持一致:从未运行的计划显示关联会话当前有效模式;
|
||||
已开始或已结束的 Task 显示该次执行记录的实际模式,不被计划旧字段或会话后续切换覆盖。
|
||||
缺少实际模式记录时明确显示不可用,不从旧计划字段推断。
|
||||
会话任务详情保留状态、日程和 Runtime,不显示或推断历史模式。
|
||||
|
||||
### 6.3 审批
|
||||
### 6.3 工具与提问
|
||||
|
||||
- 使用普通会话的授权和提问流程。Agent Runtime 的 Execute 工具调用无需通用 GoodBuddy 审批,工具活动仍显示在会话中。
|
||||
- GoodBuddy 配置修改遵循工作模式和通用工具授权,不另设原生确认;定时执行当前不授予配置工具访问权限。需要用户回答的问题显示在关联会话中,不因定时触发直接判为失败。
|
||||
- Ask 在 Runtime 边界保持只读;计划不增加另一层工具限制。
|
||||
- 使用普通会话的工具和提问流程,不进入一般工具审批等待,工具活动仍显示在会话中。
|
||||
- GoodBuddy 配置修改遵循能力分配、计划有效性和单次应用规则,不另设原生确认。结构化提问按现有入口支持范围处理。
|
||||
- 计划不增加另一层工具限制,保留取消和超时。
|
||||
- `outcome_unknown` 等高级执行治理尚未实现,见第 2 节的范围说明。
|
||||
|
||||
## 7. 触发器
|
||||
@@ -361,7 +358,7 @@ Task Center 显示 Scheduled Task 的范围、关联 Conversation、状态、最
|
||||
- [ ] 立即创建原子提交且只入队一次,定时器不重复触发;入队失败回滚创建,刷新或执行失败不重复创建。
|
||||
- [x] 关联当前 Conversation 不修改其标题、类型或既有消息。
|
||||
- [x] 一条 Conversation 可以在左侧展开一个或多个 Task。
|
||||
- [x] 工作模式使用关联会话当前设置,未设置时使用项目默认值。
|
||||
- [x] 执行使用关联会话当前 Runtime 与能力配置,无工作模式。
|
||||
- [x] 使用普通发送的 Runtime 和工具执行流程,不保存任务上下文快照。
|
||||
- [x] 新会话不复制来源会话历史;重复执行读取关联会话最新消息。
|
||||
- [x] 重复触发始终复用同一 Task 和 Conversation 关联。
|
||||
|
||||
@@ -233,7 +233,7 @@ waiting_approval > failed > running > paused > idle
|
||||
- Task 只能关联同一 Project 范围内允许使用的 Conversation。
|
||||
- Renderer 不能把任意 Task 或 Job 绑定到其他 Project 的 Conversation。
|
||||
- Job/Subjob 继承 Task 的能力上限,只能缩小,不能扩大。
|
||||
- Execute Task 冻结 Runtime、工作目录、工具和审批策略;后台触发不能扩大权限。
|
||||
- Task 请求冻结 Runtime、工作目录和能力范围;后台触发不增加未启用能力,不保存模式或一般审批策略。
|
||||
- 并行输出先有界持久化,再按确定顺序汇总到 Conversation。
|
||||
- 取消、超时、审批和应用退出必须沿 Task → Job / Subjob → Run → Runtime 传播。
|
||||
- 删除 Task 默认保留 Conversation 和消息;删除 Conversation 必须处理其全部关联 Task。
|
||||
|
||||
@@ -46,7 +46,6 @@ Job/Subjob/Run 树、独立详情或路由。
|
||||
- 名称和所属项目。
|
||||
- 关联 Conversation 标题。
|
||||
- Task 类型和触发来源。
|
||||
- Ask / Execute 模式。
|
||||
- 当前聚合状态。
|
||||
- 最近一次面向用户的进展。
|
||||
- 最近活动时间。
|
||||
@@ -105,8 +104,8 @@ FR-TC3:任务累计执行时间按其历次执行请求汇总,周期触发
|
||||
```text
|
||||
▾ 产品发布讨论 10:24
|
||||
|
||||
每周进度总结 每周 · Execute · 等待中 ●
|
||||
发布前检查 单次 · Execute ✓
|
||||
每周进度总结 每周 · 等待中 ●
|
||||
发布前检查 单次 ✓
|
||||
```
|
||||
|
||||
- 无 Task 的 Conversation 保持现有单行样式。
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Telegram 消息通道
|
||||
|
||||
Telegram 消息通道计划通过用户自行创建的 Bot,将 Telegram 私聊接入 GoodBuddy 通道项目,支持文字问答和执行任务。首版采用长轮询,运行 GoodBuddy 的电脑需要在线并能访问 Telegram。
|
||||
|
||||
## 文档导航
|
||||
|
||||
| 文档 | 权威职责 |
|
||||
| --- | --- |
|
||||
| [Telegram 通道 PRD](./prd.md) | 产品目标、首版范围、配置流程、功能要求、限制与验收标准 |
|
||||
|
||||
当前处于 PRD 草案阶段,尚未实现 Telegram 通道。详细逻辑、UI 和技术设计在实现前按需补充,不以本目录的建立作为功能完成证据。
|
||||
|
||||
## 术语与依赖
|
||||
|
||||
- BotFather:Telegram 官方的 Bot 创建和管理入口。
|
||||
- Bot Token:GoodBuddy 调用 Bot API 的凭据,由用户从 BotFather 获取。
|
||||
- 通道项目:GoodBuddy 中承载该渠道默认工作目录和处理后端的系统管理项目。
|
||||
- 远程会话:某个 Bot 下一个私聊对应的连续对话。
|
||||
|
||||
现有通道项目约定参见[远程消息通道项目 PRD](../wechat-channel/prd.md)。[远程主机](../remote-host/README.md)负责远端工作区执行,[设备共享](../device-sharing/README.md)负责设备共享能力;Telegram 接入不扩展这两项功能的范围。
|
||||
@@ -0,0 +1,217 @@
|
||||
# Telegram 远程消息通道 PRD
|
||||
|
||||
## 文档信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 草案,待评审;Telegram 通道尚未实现 |
|
||||
| 版本 | 0.1 |
|
||||
| 日期 | 2026-10-04 |
|
||||
| 适用产品 | GoodBuddy 桌面端 |
|
||||
| 首版范围 | 单 Bot、普通私聊、文字问答与工具任务、最终结果回复 |
|
||||
| 接入方式 | 用户通过 BotFather 创建 Bot,GoodBuddy 使用 Bot API 长轮询 |
|
||||
|
||||
本文定义拟交付的产品行为。验收表描述未来交付标准,不代表已经通过测试。BotFather 接入方向来自本次讨论;范围取舍和异常行为是本草案提出的方案。
|
||||
|
||||
## 1. 用户问题与目标
|
||||
|
||||
用户离开电脑后,希望通过 Telegram 向 GoodBuddy 提问或发起任务,并在手机上收到结果。任务应使用桌面端已经配置的模型、Runtime 和工作目录,执行过程与对话历史仍可在 GoodBuddy 查看。
|
||||
|
||||
当前远程消息通道已有微信 ClawBot、企业微信和钉钉,尚无 Telegram 入口。新增通道应沿用现有“通道项目 + 远程会话”结构,让用户通过创建 Bot、填写凭据和配置允许访问的用户完成接入,无需自行部署消息中转服务。
|
||||
|
||||
首版完成以下使用流程:
|
||||
|
||||
1. 用户从 BotFather 获取 Token,在 GoodBuddy 完成连接配置。
|
||||
2. 用户在 Telegram 私聊 Bot,连续问答或发起工具任务。
|
||||
3. 用户收到结果,在桌面端查看相应会话与执行记录。
|
||||
4. 连接中断、凭据失效或结果发送失败时,用户能够识别原因并恢复使用。
|
||||
|
||||
## 2. 范围与前提
|
||||
|
||||
### 2.1 首版范围
|
||||
|
||||
| 能力 | 首版要求 |
|
||||
| --- | --- |
|
||||
| Bot 数量 | 每个 GoodBuddy 用户配置一个 Telegram Bot |
|
||||
| 会话类型 | 普通私聊;不同用户的会话相互隔离 |
|
||||
| 输入 | 文字消息和受支持的命令 |
|
||||
| 执行 | 复用渠道项目的处理后端和统一执行规则,无产品模式 |
|
||||
| 输出 | 任务进行提示、最终文字结果、长回复分段 |
|
||||
| 管理 | Token 保存和替换、用户 ID 白名单、连接测试、启停和状态展示 |
|
||||
| 故障处理 | 临时断网重连、平台限流等待、已保存结果的有限重试 |
|
||||
|
||||
### 2.2 使用前提
|
||||
|
||||
用户拥有 Telegram 账号,并能通过官方 [BotFather](https://t.me/BotFather) 创建 Bot。运行 GoodBuddy 的电脑需要保持应用运行,并能访问 Telegram Bot API;休眠、退出和关机期间不处理新任务。
|
||||
|
||||
长轮询不要求公网 IP、域名或入站端口。同一 Bot 应专用于当前 GoodBuddy 实例;已有 webhook 或另一个程序持续轮询时,需要用户解决占用问题。
|
||||
|
||||
连接测试验证主进程实际使用的网络路径。若现有网络配置不能让通道访问 Telegram,应明确显示失败原因;浏览器能够访问 Telegram 不作为通道可用的证据。
|
||||
|
||||
### 2.3 非目标
|
||||
|
||||
- 群聊、超级群、频道、私聊话题及论坛话题。
|
||||
- 多 Bot 同时运行、个人账号登录及聊天记录批量导入。
|
||||
- 图片、文件、语音、视频、贴纸和媒体相册处理。
|
||||
- webhook、自建 Bot API 服务和云端常驻中转服务。
|
||||
- 逐 Token 流式展示、富消息排版和 Telegram 按钮审批。
|
||||
- 主动群发、营销推送和联系人发现。
|
||||
- 新增远程主机执行能力或修改现有 Runtime 权限模型。
|
||||
- 崩溃后自动续跑执行任务,以及消息“恰好执行一次”的保证。
|
||||
|
||||
## 3. 首次配置流程
|
||||
|
||||
1. 用户在 GoodBuddy 远程通道设置中打开 Telegram 卡片,点击官方 BotFather 链接。
|
||||
2. 用户在 BotFather 发送 `/newbot`,设置显示名称和符合 Telegram 要求的用户名,获得 Token。
|
||||
3. 用户回到 GoodBuddy 填写 Token,执行“测试连接”。成功后显示 Bot 名称、用户名和打开 Bot 的链接。
|
||||
4. 用户先保存凭据并以空白名单启用连接,卡片显示“尚未授权用户”。此时仅提供私聊帮助,不接受业务请求。
|
||||
5. 用户在 Telegram 打开该 Bot,发送 `/start`,再发送 `/whoami` 获取自己的数字用户 ID。卡片说明必须由用户先发起私聊。
|
||||
6. 用户将该 ID 填入 GoodBuddy 白名单并保存,随后发送普通文本,收到回复,并在 Telegram 项目中看到对应会话。
|
||||
|
||||
为避免要求用户把身份信息交给第三方查询 Bot,首版提供 `/whoami`:凭据有效、通道已启用时,私聊用户可查询自己的数字用户 ID。空白名单允许启动连接,但拒绝业务任务;设置页应显示“尚未授权用户”,并引导先启用、查询 ID,再填写白名单。
|
||||
|
||||
`/start` 和 `/whoami` 是通道内置帮助命令,不调用模型、不读取项目内容、不获得任务执行权限。未授权用户只能获得配置所需的有限帮助。
|
||||
|
||||
## 4. 功能需求
|
||||
|
||||
### FR-1 通道入口与项目
|
||||
|
||||
远程通道设置和项目选择器增加 Telegram,使用现有通道项目的创建与保留约定。未完成配置时仍可打开对应项目及设置,状态显示“未配置”。
|
||||
|
||||
用户可以从现有项目设置修改工作目录和处理后端。从通道卡片与项目入口查看同一配置时,内容保持一致。首次创建使用现有默认直连文本模型,不保存工作模式。
|
||||
|
||||
### FR-2 凭据管理
|
||||
|
||||
Token 使用现有加密凭据存储,保存后不在普通设置快照中返回明文。用户可以保留、替换或清除凭据。日志、连接错误和会话内容不得包含 Token 或含 Token 的完整请求地址。
|
||||
|
||||
替换 Token 前验证 Bot 身份。若仍为同一个 Bot,继续使用原会话;若为另一个 Bot,新会话与旧 Bot 隔离,旧 Bot 的待发结果不得经新 Bot 发送。清除凭据停止连接,保留项目与历史。
|
||||
|
||||
### FR-3 连接测试
|
||||
|
||||
测试连接检查凭据、Bot 身份和已有 webhook,返回可理解的结果。测试操作不接收业务消息、不创建任务、不改变启用状态,也不启动第二个长轮询。
|
||||
|
||||
凭据有效不等于通道已经开始接收消息。界面区分“验证成功”和“已连接”。检测到 webhook 时,提示用户解除原有接入后重试,不自动删除第三方配置。
|
||||
|
||||
### FR-4 访问范围
|
||||
|
||||
以 Telegram 数字用户 ID 校验发送者,不以可修改的用户名或显示名授权。仅允许白名单内用户提交业务请求。空白名单拒绝业务请求,未授权消息不进入模型、Runtime 或业务会话上下文。
|
||||
|
||||
首版只处理普通私聊。群组、频道、话题消息以及缺少可识别发送者的消息不得触发任务。帮助查询仅限私聊,并作有限频率控制,避免无效请求持续产生回复。
|
||||
|
||||
白名单变更对后续任务接收生效;撤销用户不会自动撤销此前已授权运行的任务。需要停止正在运行的任务时,用户使用现有桌面取消入口或停用通道。
|
||||
|
||||
### FR-5 会话与连续上下文
|
||||
|
||||
同一 Bot 下同一普通私聊复用远程会话,不同用户和不同 Bot 的上下文隔离。会话显示来源和发送者名称;名称不可用时使用用户 ID 作为可识别的回退信息。名称变化不产生新身份。
|
||||
|
||||
同一会话按接收顺序处理业务消息。用户连续发送消息时,不得使后发请求抢用尚未完成的上一轮上下文。不同会话沿用现有通道并发限制。
|
||||
|
||||
### FR-6 执行范围
|
||||
|
||||
普通文本使用项目后端与能力配置;`/ask`、`/execute` 和 `/exec` 沿用现有渠道的退役规则,
|
||||
作为普通正文保留,不切换权限。仅含旧命令的非空消息也按普通消息处理。
|
||||
|
||||
按[统一执行规则](../unified-execution/logic-design.md)使用已启用工具,不增加 Telegram 专属
|
||||
逐工具审批。设置页显示默认工作目录和后端,并说明允许访问的用户可发起操作。
|
||||
需要交互提问而当前后台 Runtime 无法继续的任务,应返回明确失败原因,不无限等待。
|
||||
|
||||
### FR-7 帮助与不支持的消息
|
||||
|
||||
`/start` 返回 Bot 用途、授权配置说明和基础用法;`/whoami` 仅返回当前发送者的数字用户 ID。上述命令不写入业务上下文。
|
||||
|
||||
授权用户发送未知斜杠命令时,返回支持的命令列表,不将其当成执行请求。编辑历史消息不自动重新执行任务。
|
||||
|
||||
授权用户发送媒体时,提示“当前仅支持文字消息,请改用文字描述”。带说明文字的媒体首版同样提示不支持,不丢弃媒体后擅自执行说明文字。未授权媒体不触发处理。
|
||||
|
||||
### FR-8 任务反馈与回复
|
||||
|
||||
请求进入处理后,Telegram 侧显示输入状态或简短进行提示。该提示不表示任务完成,也不表示任务可以在应用崩溃后恢复。
|
||||
|
||||
任务完成后发送最终文字;失败时发送脱敏原因及必要的恢复建议。回复尽量关联原始消息;原消息不可引用时仍应尝试发送结果。长文本按平台上限顺序分段,不破坏 Unicode 字符,不因 Markdown 转义问题造成整条回复失败。
|
||||
|
||||
首版不发送附件。若任务产生图片或文件,文字回复说明成果可在 GoodBuddy 中查看,不宣称附件已发送,也不向用户发送仅本机可访问的路径作为下载链接。
|
||||
|
||||
### FR-9 网络与发送失败
|
||||
|
||||
临时网络错误自动退避重连;平台限流按服务端要求等待,不忙循环请求。凭据失效、Bot 被封禁或持续轮询冲突显示明确状态与操作建议。
|
||||
|
||||
已生成并保存的结果沿用现有发件箱有限重试,发送失败与任务执行失败分别记录。补发回复不重新调用模型或重跑任务。用户阻止 Bot 等不可恢复错误应停止无效重试。
|
||||
|
||||
多段回复部分成功后,应尽量从未发送部分继续。网络中断导致无法确定平台是否收到某段时,允许重试出现重复段落,首版不承诺平台级发送幂等。
|
||||
|
||||
### FR-10 启停与历史保留
|
||||
|
||||
启用后建立连接;停用后停止拉取新消息,取消该通道正在处理和排队的任务,并停止活动发送重试。取消已产生的外部修改不自动回滚。
|
||||
|
||||
停用、清除凭据及连接失败不删除项目、会话、任务和已有成果。桌面端保留可查询的状态;停用期间不要求通过已关闭通道发送取消通知。
|
||||
|
||||
重新启用恢复收消息及符合当前 Bot 身份的结果补发,不自动重跑此前已取消或中断的业务任务。
|
||||
|
||||
### FR-11 离线消息与恢复边界
|
||||
|
||||
重新连接时处理 Telegram 仍保留、尚未确认的普通私聊消息,并重新执行白名单检查。正常重投的同一平台事件不得重复启动任务;用户主动重发文本属于新请求。
|
||||
|
||||
Telegram 待接收更新最多保留 24 小时,超过平台保留期的离线消息无法由 GoodBuddy 补回。首版不主动清空积压消息;因此重新启用后可能处理离线期间发送的工具请求,帮助说明中必须提示这一行为。
|
||||
|
||||
现有渠道在消息进入内存队列后确认接收,应用异常退出存在已确认消息未完成的窗口。首版沿用这一边界,不宣称崩溃后零丢失或自动续跑。用户应先在桌面查看任务记录与实际结果,再决定是否重新发送任务请求。
|
||||
|
||||
### FR-12 状态与诊断
|
||||
|
||||
设置页区分未配置、已停用、正在连接、已连接、正在重连和连接失败。空白名单作为“尚未授权用户”的配置提示展示,不与网络状态混为一谈。
|
||||
|
||||
状态通过文字表达,不能只靠颜色。错误保留可操作原因,如 Token 无效、网络不可达、webhook 占用或另一实例正在轮询。测试成功、发送失败和模型失败使用各自准确文案,避免统一显示“连接失败”。
|
||||
|
||||
界面沿用 [UI-DESIGN.md](../../../UI-DESIGN.md) 的控件、通知、键盘和可访问性规则,不新增独立视觉体系。
|
||||
|
||||
## 5. 产品验收
|
||||
|
||||
以下场景均需记录实际结果。自动化验证可覆盖解析和异常分支;首用配置、真实手机收发及 Runtime 执行需要真实 Bot 联调,不能用模拟响应代替。
|
||||
|
||||
| 编号 | 关联需求 | 场景与通过标准 |
|
||||
| --- | --- | --- |
|
||||
| AC-01 | FR-1~3 | 新用户从官方 BotFather 创建 Bot,完成 Token 测试与保存;界面显示正确 Bot 身份,项目入口可用 |
|
||||
| AC-02 | FR-4、7 | 空白名单启用后,私聊 `/whoami` 可获取本人 ID;普通文本不调用模型;加入白名单后可正常问答 |
|
||||
| AC-03 | FR-2、3 | 通道运行时连续测试连接,不争抢轮询、不消费业务消息;无效 Token 与 webhook 占用分别提示 |
|
||||
| AC-04 | FR-5 | 同一用户连续两轮对话保留上下文;两名授权用户的内容不相互进入上下文 |
|
||||
| AC-05 | FR-6 | 普通请求可在专用测试目录完成一次无害工具任务;旧模式前缀作为正文保留,结果和活动可在桌面核对,无默认模式字段 |
|
||||
| AC-06 | FR-4、7 | 未授权用户、群消息、话题消息和媒体不触发任务;授权媒体、未知命令和空命令获得准确提示 |
|
||||
| AC-07 | FR-8 | 超过单条平台上限的回复按序完整展示,中文和表情字符完整;任务失败返回脱敏原因 |
|
||||
| AC-08 | FR-8 | 生成文件的任务在 Telegram 中提示桌面查看成果,不出现“附件已发送”的错误表述 |
|
||||
| AC-09 | FR-9、12 | 模拟短暂断网、429 和永久发送错误,分别重连、等待和停止无效重试;任务执行结果不被误记为执行失败 |
|
||||
| AC-10 | FR-9 | 已保存结果发送失败后恢复连接可补发,补发不增加模型调用或再次执行任务;验证部分分段成功情形 |
|
||||
| AC-11 | FR-10 | 停用通道后新消息不启动任务,当前与排队任务取消;历史与成果保留;重新启用不重跑取消任务 |
|
||||
| AC-12 | FR-2、5 | 同一 Bot 换 Token 保留会话;更换 Bot 后上下文隔离,旧待发结果不会由新 Bot 发出 |
|
||||
| AC-13 | FR-4、11 | 重投同一更新不重复执行;离线后恢复可接收平台保留消息;已撤销用户的积压消息不执行 |
|
||||
| AC-14 | FR-2、12 | 设置快照、日志及错误不泄漏 Token;凭据轮换、网络错误和 Runtime 错误均可定位 |
|
||||
| AC-15 | FR-1、10 | 新增 Telegram 后微信、企业微信和钉钉的设置、启停与历史读取保持原行为 |
|
||||
| AC-16 | FR-9、10 | 有已保存回复等待重试时停用通道,确认重试停止;重新启用后补发该 Bot 的结果,任务执行次数不增加 |
|
||||
| AC-17 | FR-11 | 在专用测试任务执行期间异常退出应用,重启后不自动重跑该中断任务;已有任务记录可查询,不把未取得的完成结果显示为成功;帮助说明保留人工核对后重发的限制 |
|
||||
|
||||
功能完成以设置页到真实 Telegram 回复的生产路径可用为准。联调记录包含应用版本、操作系统、Runtime 类型、场景编号、预期与实际结果;不记录 Token。首版不设未经测量的响应时间指标,联调记录消息接收至首次反馈的耗时,并将平台网络延迟与模型执行耗时分开。
|
||||
|
||||
## 6. 依赖、限制与后续评估
|
||||
|
||||
通道项目、工作目录、Runtime 选择和授权语义复用[现有远程消息通道约定](../wechat-channel/prd.md)。Telegram 的外部网络可达性、Bot 状态和平台限额影响收发,连接测试无法证明后续每次任务或文件生成都能成功。
|
||||
|
||||
开发前需核对主进程网络与代理路径,以及现有通道停用、去重和发件箱行为是否满足本文要求。差异应在对应技术设计中解决并关联 FR 编号,不能只增加设置入口后宣称完成。本文不规定新增 SDK、数据库表或通用恢复框架。
|
||||
|
||||
前期讨论提出过“持久化入站后再确认”的方案。本草案将其列为后续可靠性评估,首版采用 FR-11 的明确限制;若后续要求已接收任务跨崩溃恢复,再依据实际故障与业务需求评估存储和执行恢复成本。
|
||||
|
||||
| 后续方向 | 进入设计前需明确的内容 |
|
||||
| --- | --- |
|
||||
| 图片和文件 | 支持格式、大小、说明文字与附件组合、上传下载失败反馈 |
|
||||
| 群组与话题 | 提及规则、会话隔离、结果可见范围以及话题内回复 |
|
||||
| 流式与富消息 | Telegram 展示能力、更新频率、限流与最终消息一致性 |
|
||||
| 多 Bot | 设置入口、项目归属与账号级结果发送 |
|
||||
| 远程交互提问 | 当前 Runtime 如何暂停、恢复和取消,与现有授权语义如何一致 |
|
||||
|
||||
## 7. 参考资料
|
||||
|
||||
- [Telegram BotFather 创建与管理文档](https://core.telegram.org/bots/features#botfather)
|
||||
- [Telegram Bot API:getUpdates](https://core.telegram.org/bots/api#getupdates)
|
||||
- [Telegram Bot API:getMe](https://core.telegram.org/bots/api#getme)
|
||||
- [Telegram Bot API:getWebhookInfo](https://core.telegram.org/bots/api#getwebhookinfo)
|
||||
- [Telegram Bot API:sendMessage](https://core.telegram.org/bots/api#sendmessage)
|
||||
- [Telegram Bot API:ResponseParameters](https://core.telegram.org/bots/api#responseparameters)
|
||||
|
||||
平台接口依据 2026-10-04 查阅的官方文档;实现与联调时需再次核对限制。
|
||||
@@ -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、顺序、时间及远程来源字段做比较。真实图片生成另行记录提供商调用次数;配置检查不能替代生成验收。
|
||||
|
||||
设置变更的生效时点沿用各能力已有生命周期,至少验证下一轮请求和重新启动客户端。当前已接受的任务不得因本次改造被重复提交。
|
||||
@@ -1,6 +1,6 @@
|
||||
# 微信消息通道
|
||||
|
||||
微信消息通道负责将微信连接、项目、工作目录、Runtime 和工作模式接入 GoodBuddy。
|
||||
微信消息通道负责将微信连接、项目、工作目录和 Runtime 接入 GoodBuddy。
|
||||
|
||||
## 文档导航
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
| 版本 | 1.4 |
|
||||
| 日期 | 2026-08-09 |
|
||||
| 适用产品 | GoodBuddy 桌面端 |
|
||||
| 首期范围 | 微信 ClawBot、企业微信、钉钉的通道项目;微信文字、图片和文件 Ask 与 Execute |
|
||||
| 首期范围 | 微信 ClawBot、企业微信、钉钉的通道项目;微信文字、图片和文件请求 |
|
||||
|
||||
## 1. 背景
|
||||
|
||||
@@ -19,13 +19,13 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
3. 远程执行任务使用哪个工作目录。
|
||||
4. 执行请求、处理后端、工具调用和结果归属于哪个范围。
|
||||
|
||||
腾讯官方微信 ClawBot 使用扫码授权,不使用 App ID 或 Secret,并由本机独立 Sidecar 持续运行通信服务。文字、图片和文件收发、Ask 只读对话与 Execute 完整授权已经实现;真实微信账号的认证媒体端到端联调仍作为发布前手动验收。
|
||||
腾讯官方微信 ClawBot 使用扫码授权,不使用 App ID 或 Secret,并由本机独立 Sidecar 持续运行通信服务。文字、图片和文件收发及工具任务已接入统一执行;真实微信账号的认证媒体端到端联调仍作为发布前手动验收。
|
||||
|
||||
为避免把通道来源、发送者身份和执行范围混在一起,本功能使用“通道项目 + 远程会话”的两级结构:
|
||||
|
||||
- 通道项目标识平台并确定默认工作目录、处理后端和默认模式。
|
||||
- 通道项目标识平台并确定默认工作目录和处理后端。
|
||||
- 远程会话标识具体发送者或群聊。
|
||||
- 消息记录具体发送者和本次实际使用的模式。
|
||||
- 消息记录具体发送者和本次执行状态。
|
||||
- 运行记录覆盖任务执行、工具调用和结果。
|
||||
|
||||
## 2. 已确认的产品决策
|
||||
@@ -36,13 +36,13 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
4. 通道项目默认根目录为当前操作系统用户目录。
|
||||
5. 同一通道中的不同私聊用户或群聊分别建立独立远程会话。
|
||||
6. 微信 ClawBot 首期支持个人微信私聊中的文字、图片和文件;语音和视频后续支持。
|
||||
7. 微信卡片可以配置默认“对话”或“执行”模式。
|
||||
8. “对话”映射为 GoodBuddy `Ask`;“执行”映射为 `Execute`。
|
||||
7. 微信卡片配置后端和工作目录,不提供“对话 / 执行”模式。
|
||||
8. 普通问答和工具任务使用同一请求流程,不选择产品模式。
|
||||
9. 每个通道项目默认使用“模型连接”中的默认直连文本模型,也可以显式选择其他直连文本模型、OpenCode 或 Continue。选择 OpenCode/Continue 时,通道只保存 Runtime 类型,并在每次远程请求开始时动态跟随“Agent Runtime”中的对应全局配置,不维护第二套模型来源或 Runtime 配置。
|
||||
10. 远程 Execute 不显示通道专属请求级或逐工具确认;收到合法消息后立即按所选后端运行。
|
||||
11. 任务仍受工作目录上下文、Runtime 能力、Ask/Execute 边界、能力开关、直连模型工具安全策略和活动审计约束;Agent Runtime 工具使用当前用户权限。
|
||||
10. 通道请求不显示通道专属请求级或逐工具确认;收到合法消息后立即按所选后端运行。
|
||||
11. 任务仍受工作目录上下文、Runtime 能力、能力开关、资源范围和活动审计约束;Agent Runtime 工具使用当前用户权限。
|
||||
12. 停用或断开通道不得删除通道项目、远程会话、任务、活动或成果历史。
|
||||
13. 通道项目由系统管理,用户不能永久删除;用户可以修改其工作目录、处理后端和默认模式。
|
||||
13. 通道项目由系统管理,用户不能永久删除;用户可以修改其工作目录和处理后端。
|
||||
|
||||
## 3. 目标
|
||||
|
||||
@@ -50,8 +50,8 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
|
||||
- 在项目切换器中一眼识别微信、企业微信和钉钉来源。
|
||||
- 在通道项目中区分不同发送者和群聊。
|
||||
- 在设置卡片中完成连接、启停、处理后端、模式和工作目录配置。
|
||||
- 通过微信进行 Ask 只读问答或发起 Execute 任务。
|
||||
- 在设置卡片中完成连接、启停、处理后端和工作目录配置。
|
||||
- 通过微信问答或发起工具任务。
|
||||
- 选择可信的执行后端,并查看完整执行记录。
|
||||
- 保留通道关闭前后的历史上下文和审计记录。
|
||||
|
||||
@@ -118,9 +118,9 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
|
||||
| 层级 | 负责内容 |
|
||||
| --- | --- |
|
||||
| 通道项目 | 平台、连接状态、默认根目录、处理后端、默认模式 |
|
||||
| 通道项目 | 平台、连接状态、默认根目录、处理后端 |
|
||||
| 远程会话 | 平台账号、私聊用户或群聊、连续上下文 |
|
||||
| 消息 | 具体发送者、本次实际模式、正文、时间和处理状态 |
|
||||
| 消息 | 具体发送者、正文、时间和处理状态 |
|
||||
| 运行记录 | Runtime、工具调用、执行结果和错误 |
|
||||
|
||||
### 5.3 会话命名
|
||||
@@ -145,11 +145,11 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
|
||||
默认值:
|
||||
|
||||
| 通道 | 项目名称 | 根目录 | 处理后端 | 默认模式 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `weixin` | 微信 ClawBot | 用户目录 | 默认直连文本模型 | Ask |
|
||||
| `wecom` | 企业微信 | 用户目录 | 默认直连文本模型 | Ask |
|
||||
| `dingtalk` | 钉钉 | 用户目录 | 默认直连文本模型 | Ask |
|
||||
| 通道 | 项目名称 | 根目录 | 处理后端 |
|
||||
| --- | --- | --- | --- |
|
||||
| `weixin` | 微信 ClawBot | 用户目录 | 默认直连文本模型 |
|
||||
| `wecom` | 企业微信 | 用户目录 | 默认直连文本模型 |
|
||||
| `dingtalk` | 钉钉 | 用户目录 | 默认直连文本模型 |
|
||||
|
||||
### 6.2 系统管理约束
|
||||
|
||||
@@ -157,17 +157,16 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
- 停用通道不归档项目。
|
||||
- 断开微信不删除项目和历史。
|
||||
- 数据迁移或异常导致项目缺失时,下次初始化自动修复。
|
||||
- 用户可以修改项目根目录、描述、处理后端和默认模式。
|
||||
- 用户可以修改项目根目录、描述和处理后端。
|
||||
- 项目名称首期由系统管理,避免来源名称被改到不可识别;后续如允许自定义,必须持续显示通道徽标。
|
||||
|
||||
### 6.3 默认用户目录
|
||||
|
||||
通道项目默认使用操作系统用户目录。设置卡片必须显示完整目录,并在首次启用 Execute 时明确说明该范围可能包含桌面、下载、文档和其他私人文件。
|
||||
通道项目默认使用操作系统用户目录。设置卡片必须显示完整目录,并说明该范围可能包含桌面、下载、文档和其他私人文件。
|
||||
|
||||
如果根目录不存在、不可访问或不是目录:
|
||||
|
||||
- Ask 仍可在不读取本地文件的边界内工作。
|
||||
- Execute 不得启动。
|
||||
- 请求按现有工作区验证返回目录错误,不回退隐藏只读模式。
|
||||
- 设置卡片显示就近错误和“选择目录”操作。
|
||||
|
||||
## 7. 设置页产品需求
|
||||
@@ -191,10 +190,9 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
2. 启用开关。
|
||||
3. 默认工作目录。
|
||||
4. 消息处理后端。
|
||||
5. 默认处理模式。
|
||||
6. 对应通道项目。
|
||||
7. 平台特有的连接配置。
|
||||
8. 最近错误或连接状态。
|
||||
5. 对应通道项目。
|
||||
6. 平台特有的连接配置。
|
||||
7. 最近错误或连接状态。
|
||||
|
||||
示意:
|
||||
|
||||
@@ -206,9 +204,6 @@ GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入
|
||||
|
||||
启用微信通道 [开关]
|
||||
|
||||
默认处理模式
|
||||
[ 对话 ] [ 执行 ]
|
||||
|
||||
默认工作目录
|
||||
C:\Users\用户名 [选择目录]
|
||||
|
||||
@@ -221,15 +216,13 @@ C:\Users\用户名 [选择目录]
|
||||
[断开本机绑定(危险操作)]
|
||||
```
|
||||
|
||||
“对话 / 执行”是互斥状态,应使用语义化分段控件,不使用两个独立复选框。
|
||||
不显示“对话 / 执行”模式控件。
|
||||
|
||||
### 7.3 模式说明
|
||||
### 7.3 执行范围说明
|
||||
|
||||
- 对话:只读回答,不调用工具或修改内容。
|
||||
- 执行:收到合法消息后立即交给所选后端,可在工作目录内调用已启用工具。
|
||||
- 收到合法消息后交给所选后端,可按请求使用已启用工具。
|
||||
|
||||
每个通道面板持续显示风险说明,不弹出一次性确认。默认 Ask 时也要说明白名单
|
||||
发送者仍可通过 `/execute` 临时执行:
|
||||
每个通道面板持续显示执行范围说明,不弹出一次性确认,也不要求模式前缀:
|
||||
|
||||
```text
|
||||
远程消息可能要求 GoodBuddy 读取或修改默认工作目录中的内容。
|
||||
@@ -254,7 +247,7 @@ C:\Users\用户名
|
||||
Agent Runtime。OpenCode/Continue 的通道项目只持久化 `provider`,旧版残留的
|
||||
通道级 `profileId` 在修复时移除;全局 Agent Runtime 配置变更从下一条远程
|
||||
请求开始生效。远程会话记录通道项目的逻辑后端选择,不复制全局配置或凭据。
|
||||
Execute 启动前检查解析后的后端是否支持工具执行,并返回可处理的配置错误。
|
||||
请求按解析后的后端能力运行;无工具模型仍可回答文本,工具能力缺失返回具体说明。
|
||||
|
||||
通道面板的后端说明必须明确显示“跟随 Agent Runtime 全局配置”,不得在消息
|
||||
通道设置中重复展示 OpenCode/Continue 的模型来源、自有配置文件或程序路径。
|
||||
@@ -296,7 +289,6 @@ Execute 启动前检查解析后的后端是否支持工具执行,并返回可
|
||||
|
||||
- 通道项目显示。
|
||||
- 消息处理后端。
|
||||
- 默认处理模式。
|
||||
- 默认工作目录。
|
||||
- 打开通道项目。
|
||||
|
||||
@@ -332,50 +324,39 @@ channel + accountId + externalConversationId
|
||||
- 通道图标和名称。
|
||||
- 私聊用户或群聊名称。
|
||||
- 当前连接状态。
|
||||
- 默认模式。
|
||||
- 未读状态。
|
||||
|
||||
每条远程消息记录实际模式:
|
||||
|
||||
- Ask
|
||||
- Execute
|
||||
每条远程消息记录执行状态:
|
||||
- 执行中
|
||||
- 已完成
|
||||
- 失败
|
||||
|
||||
收到普通远程消息时不得强制切换当前页面。应增加未读标记和全局通知。
|
||||
|
||||
## 9. Ask 与 Execute
|
||||
## 9. 统一执行
|
||||
|
||||
### 9.1 模式解析
|
||||
### 9.1 消息正文
|
||||
|
||||
每条消息的模式按以下优先级确定:
|
||||
`/ask`、`/execute`、`/exec` 及旧中文模式前缀不再特殊解析,原样作为普通正文处理。
|
||||
仅含旧命令的非空消息也按普通消息处理;历史正文不改写。
|
||||
|
||||
1. 显式 `/ask` 或“对话:”前缀使用 Ask。
|
||||
2. 显式 `/execute`、`/exec` 或“执行:”前缀使用 Execute。
|
||||
3. 没有前缀时使用通道项目的默认模式。
|
||||
### 9.2 问答与工具
|
||||
|
||||
前缀仅用于选择模式,不进入发送给模型的正文。
|
||||
请求按后端实际能力回答问题或使用已接入工具,结果返回原通道并写入远程会话。
|
||||
用户明确要求只解释时遵循其意图,不转换为产品级只读模式。
|
||||
|
||||
### 9.2 Ask
|
||||
### 9.3 请求启动
|
||||
|
||||
- 在 Runtime 边界保持只读。
|
||||
- 不提供工具授权回调,或所有工具请求返回拒绝。
|
||||
- 不修改文件、数据库、系统状态或远程状态。
|
||||
- 结果以有界文字返回原通道并写入远程会话。
|
||||
|
||||
### 9.3 Execute
|
||||
|
||||
Execute 消息通过身份、长度、去重和并发检查后:
|
||||
消息通过身份、长度、去重和并发检查后:
|
||||
|
||||
1. 创建并立即启动远程执行任务。
|
||||
2. 使用通道项目当前保存的逻辑处理后端;OpenCode/Continue 在此时解析“Agent Runtime”中的对应全局配置。
|
||||
3. 将项目根目录作为本次 Runtime 工作目录。
|
||||
4. 所选后端不支持工具执行时,不启动任务,并返回设置修复说明。
|
||||
4. 所选后端不支持工具时仍可处理文本,工具需求返回具体能力说明。
|
||||
|
||||
远程 Execute 不创建 GoodBuddy 通道专属请求确认或逐工具确认。安全边界由
|
||||
发送者白名单、私聊限制、项目根目录上下文、所选 Runtime、工作模式边界、能力开关和工具
|
||||
安全策略共同提供。UI 必须持续说明该行为,不能让用户误以为仍会弹窗确认。
|
||||
通道请求不创建 GoodBuddy 专属请求确认或一般工具审批等待。继续检查发送者白名单、
|
||||
私聊限制、项目根目录上下文、所选 Runtime、能力开关与资源范围。
|
||||
UI 必须持续说明该行为,不能让用户误以为仍会弹窗确认。
|
||||
通道只回传最终结果或可操作的失败信息,不发送“执行已开始”等无操作价值的
|
||||
中间状态消息。
|
||||
|
||||
@@ -385,8 +366,8 @@ Execute 消息通过身份、长度、去重和并发检查后:
|
||||
|
||||
- OpenCode 和 Continue 使用各自的工具系统与能力检查,并以 GoodBuddy 客户端当前用户权限运行。
|
||||
- 直连模型只可调用已启用的内置工作区工具及已分配 MCP 工具。
|
||||
- “Execute 自动授权已启用的工具”策略无需逐次确认;“禁止所有工具执行”策略拒绝所有直连模型工具调用。
|
||||
- 平台不提供 Runtime OS 沙箱模式;Ask 的只读边界和各 Runtime 工具策略继续有效。
|
||||
- 已移除 `toolApproval` 自动授权/禁止工具策略,不保留替代开关。
|
||||
- 平台不提供 Runtime OS 沙箱模式,各 Runtime 的真实能力限制继续有效。
|
||||
- 任何工具结果都进入现有任务和活动审计。
|
||||
|
||||
### 9.5 结果回传
|
||||
@@ -555,7 +536,6 @@ channel + accountId + externalConversationId
|
||||
通道公开设置增加:
|
||||
|
||||
- `projectId`
|
||||
- `defaultWorkMode`
|
||||
- `runtimeSelection`
|
||||
- `rootPath`
|
||||
- `status`
|
||||
@@ -577,7 +557,6 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
- 远程会话 ID。
|
||||
- 通道。
|
||||
- 脱敏发送者。
|
||||
- 实际工作模式。
|
||||
- 实际消息处理后端。
|
||||
|
||||
任务队列可以复用 delegation 调度分类,但 UI 和活动审计必须依据通道项目与
|
||||
@@ -622,7 +601,7 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
|
||||
### 14.4 执行期间断线
|
||||
|
||||
通道断开后不得启动新的 Execute。已开始的任务按现有取消策略处理,结果进入本地审计;恢复连接后不得自动重复执行。
|
||||
通道断开后不得启动新的请求。已开始的任务按现有取消策略处理,结果进入本地审计;恢复连接后不得自动重复执行。
|
||||
|
||||
### 14.5 重复消息
|
||||
|
||||
@@ -632,7 +611,7 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
|
||||
- 通道状态同时使用文字和图标。
|
||||
- 三个通道使用共享 `PageTabs` 的 `segmented` 外观,保留页签语义和方向键切换。
|
||||
- 模式选择使用语义化单选/分段控件和方向键。
|
||||
- 后端选择保留语义化控件和键盘操作,不留已删除模式控件的焦点目标。
|
||||
- 消息处理后端使用持久标签和分组选项,并说明当前选择的实际行为。
|
||||
- 二维码提供状态文字和备用刷新操作,但不把敏感二维码链接作为可复制文本。
|
||||
- 验证码错误与输入框建立 `aria-describedby` 关联。
|
||||
@@ -647,7 +626,7 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
- [ ] 新安装首次启动后存在微信 ClawBot、企业微信和钉钉三个通道项目。
|
||||
- [ ] 重启应用不会重复创建通道项目。
|
||||
- [ ] 同名普通项目不会被占用或修改。
|
||||
- [ ] 通道项目默认根目录为当前用户目录,默认模式为 Ask。
|
||||
- [ ] 通道项目默认根目录为当前用户目录,不保存默认模式。
|
||||
- [ ] 通道项目在项目选择器的“远程通道”分组中显示。
|
||||
- [ ] 项目选择器使用富信息单选菜单;每项显示项目名称和类型,本地项目显示目录摘要,远程通道显示平台来源与默认目录,并在可复用状态数据接入后显示文字连接状态。
|
||||
- [ ] 项目选择器的信息结构可扩展为“本地 / 远程”分组,不以图标或颜色作为项目来源和状态的唯一表达。
|
||||
@@ -658,14 +637,14 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
|
||||
- [ ] 设置标签显示为“消息通道”。
|
||||
- [ ] 三个通道使用与模型设置一致的分段外观页签,并保留完整页签键盘语义。
|
||||
- [ ] 三个面板均显示项目、根目录、消息处理后端、默认模式和连接状态。
|
||||
- [ ] 三个面板均显示项目、根目录、消息处理后端和连接状态。
|
||||
- [ ] 微信卡片可以完成扫码、过期刷新、验证码和连接状态展示。
|
||||
- [ ] “断开本机绑定”使用共享红色危险操作样式,并明确说明只清除本机凭据、不删除历史或承诺服务端解绑。
|
||||
- [ ] 不显示“自动”后端;首次创建和旧版 `auto` 配置均落到默认直连文本模型。
|
||||
- [ ] 直连模型只列出文本连接,OpenCode 与 Continue 可直接选择。
|
||||
- [ ] 选择 OpenCode/Continue 时只保存 Runtime 类型,每次远程请求动态跟随“Agent Runtime”中的对应全局配置,通道页不出现第二套 Runtime 配置。
|
||||
- [ ] Agent Runtime 高级设置的来源选项、条件配置卡和路径字段之间保持 `12px` 间距且无横向溢出。
|
||||
- [ ] 默认 Execute 时持续显示目录范围和无逐次确认的风险说明。
|
||||
- [ ] 持续显示目录范围和无逐次确认的说明。
|
||||
- [ ] Renderer 无法读取任何微信 Token 或上下文令牌。
|
||||
|
||||
### 16.3 会话
|
||||
@@ -682,20 +661,20 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
- [ ] 微信图片和文件显示在对应远程消息中,附件消息无需附带文字。
|
||||
- [ ] 支持的附件进入所选后端现有图片或文档上下文;不支持和超限附件返回明确提示。
|
||||
|
||||
### 16.4 Ask
|
||||
### 16.4 普通消息
|
||||
|
||||
- [ ] 普通消息默认按卡片配置进入 Ask。
|
||||
- [ ] Ask 在 Runtime 边界拒绝所有工具。
|
||||
- [ ] 普通消息按项目后端与能力配置执行。
|
||||
- [ ] 旧模式前缀保留正文,不改变权限。
|
||||
- [ ] 有界结果回传原通道并写入远程会话。
|
||||
|
||||
### 16.5 Execute
|
||||
### 16.5 工具任务
|
||||
|
||||
- [ ] 默认 Execute 或显式执行前缀会立即使用通道项目所选后端。
|
||||
- [ ] 合法任务使用通道项目所选后端,无模式字段。
|
||||
- [ ] 不显示通道专属请求级或逐工具确认。
|
||||
- [ ] 直连模型、OpenCode 和 Continue 均按各自能力正确路由。
|
||||
- [ ] 通道不发送“执行已开始”等中间占位消息,只发送最终结果或可操作失败。
|
||||
- [ ] 任务使用对应通道项目根目录。
|
||||
- [ ] Runtime、工作模式边界、能力和直连模型工具安全策略继续生效。
|
||||
- [ ] Runtime 能力、启用与分配和资源归属校验继续生效。
|
||||
- [ ] 任务、活动、工具、成果和最终结果关联到通道项目与远程会话。
|
||||
|
||||
### 16.6 生命周期与安全
|
||||
@@ -716,7 +695,7 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
- Project 数据迁移与通道类型。
|
||||
- 三个通道项目幂等创建。
|
||||
- 项目选择器“远程通道”分组。
|
||||
- 三张设置卡片接入项目、目录和模式配置。
|
||||
- 三张设置卡片接入项目、目录和后端配置。
|
||||
- 企业微信、钉钉消息建立独立远程会话。
|
||||
|
||||
### 阶段二:微信文字通道
|
||||
@@ -725,14 +704,14 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
- 扫码、验证码、加密凭据和生命周期。
|
||||
- 微信文字收发与稳定去重。
|
||||
- 微信远程会话。
|
||||
- Ask 模式。
|
||||
- 普通消息问答。
|
||||
|
||||
### 阶段三:受控 Execute
|
||||
### 阶段三:工具执行
|
||||
|
||||
- 通道项目处理后端选择与失效修复。
|
||||
- OpenCode/Continue 通道后端动态跟随全局 Agent Runtime 配置。
|
||||
- Execute Runtime 接入。
|
||||
- 直连模型工具安全策略和活动关联。
|
||||
- Runtime 工具接入。
|
||||
- 直连模型能力范围和活动关联。
|
||||
- 结果回传、取消、超时和失败恢复。
|
||||
|
||||
### 阶段四:微信媒体
|
||||
@@ -761,10 +740,10 @@ Renderer 快照只返回是否已配置和脱敏标识。
|
||||
- CDN 媒体 AES 加解密、流式大小限制、声明大小校验和恶意重定向拒绝。
|
||||
- 附件持久化展示、现有上下文接入、生成图片回传和任务成果目录隔离。
|
||||
- 消息去重、会话映射、并发和取消。
|
||||
- Ask 工具拒绝。
|
||||
- Execute 使用直连模型、OpenCode 和 Continue 的路由。
|
||||
- OpenCode/Continue 通道只保存 Runtime 类型,并在 Ask 与 Execute 开始时解析当前全局 Agent Runtime 配置。
|
||||
- Execute 不创建通道专属审批,直连模型禁止工具策略仍然生效。
|
||||
- 旧模式前缀按普通正文处理。
|
||||
- 工具请求使用直连模型、OpenCode 和 Continue 的路由。
|
||||
- OpenCode/Continue 通道只保存 Runtime 类型,并在请求开始时解析当前全局 Agent Runtime 配置。
|
||||
- 不创建通道专属审批或一般工具策略,已关闭能力不可调用。
|
||||
- 模型连接删除后的通道后端选择修复。
|
||||
- 发件箱投递失败不重复执行。
|
||||
- 项目选择器、分段页签、后端选择、设置面板和扫码对话框的键盘与无障碍行为。
|
||||
@@ -782,13 +761,13 @@ npm run build
|
||||
|
||||
## 19. 发布条件
|
||||
|
||||
满足以下条件后才可默认向用户提供微信 Execute:
|
||||
满足以下条件后才可默认向用户提供微信工具任务:
|
||||
|
||||
1. 微信文字 Ask 全流程稳定。
|
||||
2. UI 明确说明远程 Execute 会立即运行,且默认工作目录和处理后端始终可见。
|
||||
1. 微信文字问答全流程稳定。
|
||||
2. UI 明确说明合法请求会运行,且默认工作目录和处理后端始终可见。
|
||||
3. 凭据不会进入 Renderer、日志或普通子进程参数。
|
||||
4. Sidecar 网络目标和重定向已实施严格允许列表。
|
||||
5. 通道项目和远程会话的来源标识在所有入口持续可见。
|
||||
6. 任务重复投递不会导致重复执行。
|
||||
7. 应用退出、断线和更新过程中不会留下失控执行,直连模型禁止工具策略不能被远程来源绕过。
|
||||
7. 应用退出、断线和更新过程中不会留下失控执行,已关闭能力不能被远程来源绕过。
|
||||
8. 腾讯 iLink 独立宿主使用范围和本地断开语义已完成发布前确认。
|
||||
|
||||
Reference in New Issue
Block a user