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:
@@ -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 身份获得工具执行或批准能力。
|
||||
|
||||
## 活动记录
|
||||
|
||||
|
||||
Reference in New Issue
Block a user