- Segment streaming Markdown so completed blocks are reused and only the growing tail is re-parsed; fall back to whole-document parsing for document-wide constructs - Memoize conversation sidebar rows and cache per-conversation derived activity, ordering and pending approvals - Activity page loads on entry, refreshes every 15 s while visible, and has a single header refresh button - Include pending settings, model download source, device sharing and knowledge gateway changes in the working tree - Add Electron streaming input benchmark and regression tests
1839 lines
151 KiB
Markdown
1839 lines
151 KiB
Markdown
# 工作栏实现与验证进度
|
||
|
||
## 2026-10-01:自定义 MCP 失败中断回复
|
||
|
||
已修复共用网关将单个上游发现失败升级为整轮失败的问题,行为见
|
||
[本地 MCP 初始化失败恢复](./runtime-process-reuse-technical-design.md#41-本地-mcp-初始化失败恢复)。
|
||
正常服务的连接继续复用,失败服务不进入工具列表,动态刷新失败也按服务隔离;
|
||
取消和授权撤销继续生效。初次失败的服务在下一请求重试,原有连接超时未改。
|
||
|
||
验证使用真实 HTTP 上游和网关,覆盖部分失败、无可用工具、非法分页和超量目录、
|
||
动态刷新失败后恢复、取消及撤销。Continue 使用真实网关和模拟 Host;新增实际 OpenCode
|
||
二进制用例在自定义 MCP 返回 HTTP 503 后完成 Execute 回复,单次本地合成模型调用,
|
||
外部模型调用 0 次。网关与 Continue 定向测试 65 项通过;OpenCode 生命周期 4 项通过。
|
||
`npm run typecheck`、四个修改源码文件的 ESLint 通过。
|
||
|
||
完整 `npm test`:5,565 通过、89 跳过、4 失败。失败为 Agent 大依赖清单安装超时、
|
||
Magic Notes 采集的 `memo is not defined`,以及终态探针和手动压缩的界面等待超时。
|
||
全仓 lint 在并行修改的 `App.tsx` 性能测量代码处报告渲染纯度及不可变性错误;
|
||
本次未修改这些文件,不将完整验证记为通过。
|
||
远程 Agent 的独立 MCP 实现及 Story Graph 绑定不经过改动方法,本次无需远程 Host 验证。
|
||
尚未发布或替换已安装应用。
|
||
|
||
## 2026-10-01:本地 MCP 晚到初始化覆盖新连接
|
||
|
||
根因修复见[本地 MCP 初始化失败恢复](./runtime-process-reuse-technical-design.md#41-本地-mcp-初始化失败恢复)。
|
||
已核对随包 OpenCode 1.18.29:`MCP.add` 的初始化不随客户端取消而中止,完成后写入同名状态,
|
||
并关闭该名称下已有的连接;`disconnect` 只处理当时已登记的客户端。旧实现在 `mcp.add`
|
||
超时或取消后仍复用同一名称,前一轮的晚到初始化(授权已撤销,结果为 `failed`)会覆盖下一轮
|
||
刚建立的连接。现在响应不确定的名称作废,后续改用唯一替代名称。
|
||
|
||
验证:新增真实 OpenCode+实际网关用例,通过本地代理挂起第一次 MCP `initialize`,
|
||
使第一轮在 3 秒控制超时后结束,第二轮建立连接后再放行挂起的初始化。修复前该用例
|
||
复现为第二轮连接状态从 `connected` 变为 `failed`;修复后第二轮连接保持 `connected`
|
||
且请求完成。`opencode-runtime`、`opencode-runtime-lifecycle`、`knowledge-mcp-gateway`
|
||
三个测试文件 180 项通过;`npm run typecheck` 通过;相关文件 ESLint 通过。模型为本地合成
|
||
服务,外部模型调用 0 次。9 月 30 日那次失败的原始时序没有底层日志,未确认就是这一竞态;
|
||
本次修复的是已复现的同类失败路径。尚未发布或替换已安装应用。
|
||
|
||
|
||
## 2026-09-30:本地 MCP 连接诊断与恢复
|
||
|
||
已实现[本地 MCP 初始化失败恢复](./runtime-process-reuse-technical-design.md#41-本地-mcp-初始化失败恢复)。
|
||
常驻 HTTP 网关和请求级授权保留;内置及自定义 MCP 对明确的暂时性传输故障最多重试一次,
|
||
必须先成功清理失败连接。SDK 返回错误和抛出错误均有覆盖,未知失败、HTTP/API 拒绝和
|
||
鉴权错误不重试。界面保留脱敏错误详情,两端失败诊断通过令牌摘要关联。
|
||
网关初始化异常也会回收未完成会话。
|
||
|
||
最终定向验证:`npx vitest run` 指定 `opencode-runtime`、`opencode-runtime-lifecycle`、
|
||
`opencode-runtime-permissions`、`knowledge-mcp-gateway`、`knowledge-mcp-gateway.obsidian`、
|
||
`create-runtime`、`desktop-diagnostics`、`feedback-service` 八个测试文件,222 项全部通过。
|
||
`npm run typecheck` 和 `npm run lint` 通过。真实 OpenCode 与实际网关的恢复用例在连接成功后
|
||
注入响应丢失,验证断开先于重连、授权不变、请求完成和网关继续监听;该用例每轮产生一次
|
||
本地合成模型请求,外部模型调用为 0。另有真实 HTTP 初始化连续失败后的会话回收测试。
|
||
|
||
全量 `npm test` 在 600 秒后超时,未取得汇总;超时前报告 `SettingsPanel.test.tsx` 中
|
||
中英文磨砂玻璃开关两个用例失败。这些文件存在并行修改,未判定失败归因,全量验证不记为通过。
|
||
本次未发布或替换已安装应用。远程 Agent 的 ACP 和 Agent MCP 连接路径未修改,
|
||
不将本地测试结果作为远程恢复验证。
|
||
|
||
## 2026-09-30:OpenCode 终端启动准备
|
||
|
||
原先每次“在终端中打开” OpenCode 都会把随包插件依赖目录(约 3,600 个文件、52 MB)
|
||
复制到临时目录,Windows 本机每次约 2.2–2.4 秒。现在该目录只复制一次到用户数据下的
|
||
`terminal/opencode-config`,按 `.goodbuddy-ready.json` 判断是否需要刷新;Skills、Ask
|
||
插件和模型配置仍按每次启动单独生成,关闭时清理。
|
||
|
||
Windows 本机实测启动准备:首次 2.9 秒,之后 19–44 ms。OpenCode 自身 TUI 从进程启动
|
||
到显示输入框约 2.9–3.3 秒,由 OpenCode 程序决定,本次未改变。验证:原生终端单元测试
|
||
5 项通过;已安装 OpenCode 的 Ask/Execute 真实 PTY 测试 2 项通过(合成模型,真实模型
|
||
调用 0 次)。远程 Agent 使用独立的 OpenCode 启动路径,不受本次修改影响。
|
||
|
||
## 2026-09-28:消息取消与失败展示
|
||
|
||
消息终态按[Runtime 交互边界](./runtime-interactions.md)保存和展示。取消使用结构化
|
||
`terminalStatus`,保持已有回答;终止提示不再补入正文。“重新编辑”只回填并聚焦输入框,
|
||
没有可回填文字时隐藏入口。旧快照只对精确重复的形态隐藏状态副本,保留原正文。
|
||
深色主题已移除覆盖失败提示颜色的通用规则;检索和压缩记录不再屏蔽终态的无障碍角色。
|
||
|
||
Windows 本地验证:
|
||
|
||
- 本次修复完成时 `npm run typecheck`、`npm run lint`、`git diff --check` 通过。
|
||
后续并行的应用入口修改新增 `App.test.tsx:14430` 的 `getByRole(..., { exact: true })`,
|
||
最后一次类型检查报 TS2769;该选项不属于 `ByRoleOptions`。未修改这处他人新增代码,
|
||
当前组合工作区不能记为类型检查通过。最后一次 lint 和 diff 检查通过。
|
||
- `npm test`:5,367 通过、84 跳过、1 失败。失败项为
|
||
`tests/magic-notes-layout.electron.test.ts` 的原生拖拽测试,90 秒超时;单独复跑仍超时。
|
||
该文件未修改,本次检查不记为全量通过。
|
||
- 相关五文件复跑为 447 通过、14 失败;14 项均在并行入口改名期间查找“应用”按钮失败。
|
||
入口源码更新后,单独复跑 `src/renderer/src/App.test.tsx` 的 304 项全部通过。
|
||
其余四文件(数据库、时间线、清单和终态 Electron 探针)的 157 项在上述复跑中通过。
|
||
- `tests/terminal-status-probe.electron.test.ts` 通过真实 App、Preload、生产 IPC、
|
||
直连 Runtime 和 SQLite 验证空回答取消、部分回答取消、HTTP 400 失败;检查提示唯一性、
|
||
浅深主题 computed style、重新编辑回填与焦点,以及数据库重开和页面恢复。
|
||
每轮使用 3 次本地确定性 HTTP 请求,外部模型调用 0 次。探针在结束时关闭 Runtime、
|
||
HTTP 服务和窗口,并删除本轮独立临时目录。
|
||
- 数据库回归覆盖恢复事件事务回滚、失败与取消重放、空正文和已有回答保留、重开后元数据。
|
||
App 和时间线回归覆盖新事件结构化判定、旧消息精确去重、正常正文保留、无效按钮隐藏、
|
||
活动及工具终态。
|
||
|
||
本次未连接远程主机,未创建远程资源。远端事件仍通过既有公共事件进入桌面的
|
||
`reduceRecoveredAgentEvent`,本次仅修改其消息投影与元数据保存,不改变 Agent、SSH
|
||
传输、取消执行、ACK 或重连控制;本地 SQLite 恢复测试覆盖该修改。未验证 Linux/macOS
|
||
原生界面,不把本地探针记为远端取消生命周期验收。
|
||
|
||
## 2026-09-28:DS Web 资源符号链接与 macOS 发布恢复
|
||
|
||
Desktop `v0.15.0` 原生构建中,两个 macOS 目标均因包外符号链接未通过签名校验。
|
||
Linux Host 隔离 fixture 调用实际 DS 资源准备及 electron-builder 文件复制后,
|
||
确认相对 CLI 链接变成构建目录的绝对路径。复制现使用 `verbatimSymlinks`,
|
||
保留 npm 相对链接;回归移除原始安装和暂存目录后,仍须能读取最终包内链接目标。
|
||
Windows 打包聚焦回归 45 项通过,1 项 POSIX 符号链接测试不适用于 Windows;
|
||
类型、lint 和 0.15.1 双语说明校验通过。完整冻结快照在 Linux Host 全量
|
||
5,372 通过、51 跳过,新增符号链接用例实际执行通过;macOS 原生签名仍待发布 CI。
|
||
这只改变 Desktop 的本地 DS Web 资源准备,不改变 Agent 的独立 Runtime 包装、
|
||
模型桥或启动控制,模型调用 0 次。恢复版本及最终证据见
|
||
[发布恢复记录](../../development/release-preparation-0.15.0.md)。
|
||
|
||
## 2026-09-27:窄栏添加入口
|
||
|
||
“+”已移出页签滚动容器;左右箭头和溢出测量使用扣除添加按钮宽度后的页签区域。
|
||
Windows Electron 回归覆盖 `300px` 工作栏、默认四页签和 16 个含长标题的页签,验证
|
||
原生鼠标打开应用目录、创建浏览器实例、Escape 返回、箭头滚动及 Home/End 激活。
|
||
窄栏扩到 `900px` 后,默认页签的溢出箭头消失,缩回后恢复。
|
||
中英文、浅深主题均通过,模型调用 0 次。范围与命令见
|
||
[窄容器布局修复记录](../../quality/responsive-controls-review-2026-09-27.md)。
|
||
|
||
## 2026-09-27 Continue Update Status
|
||
|
||
The shared Continue adapter now skips the update service before it emits the
|
||
checking state; behavior is specified in the [native client design](./runtime-native-client-proposal.md#62-continue-与-opencode).
|
||
The regression executes the patched method and verifies idle-only state when
|
||
disabled, while retaining the original path when the flag is absent.
|
||
|
||
- Windows production coordinator/PTY and real DS browser validation completed:
|
||
Continue made 2 supplier requests, OpenCode 1, and DS Web 2; all five returned
|
||
HTTP 200 and the clients displayed the expected answers. Captured terminal
|
||
output contained no `Checking for updates`. Original settings stayed byte-identical.
|
||
- Current adapter source was bundled and uploaded through pinned-identity SSH to
|
||
the shared Linux x64 Host, under a dedicated `/root/tmp/gb-update-check-*`
|
||
directory. Continue 1.5.47 reached its initialized Ask TUI and displayed
|
||
`Continue CLI`; 15 seconds of PTY capture contained no update-check text.
|
||
This startup check made zero model calls and did not run the Agent protocol or
|
||
remote model bridge. Agent helper imports this same adapter, but complete
|
||
remote shortcut and real-model acceptance remain unfinished.
|
||
- Adapter tests: 30 passed. Repository typecheck and lint passed. Full `npm test`
|
||
reached the tool's 600-second limit without a final summary; it is not recorded
|
||
as a passing full run.
|
||
|
||
Evidence is in the local temporary `opencode/dsh-017-verify` directory:
|
||
`update-check-evidence.json`, `update-check-main-result.json`, and
|
||
`remote-pty-run.cjs`. The local action/IPC harness uses jsdom and simulated
|
||
Electron transport with real child clients. It does not reproduce or rule out
|
||
full desktop-window freezing. The inherited TLS verification override and lack
|
||
of a complete background-network capture also limit the evidence.
|
||
|
||
### Full production App follow-up
|
||
|
||
A fresh `npm run build` passed. The resulting production Main, Preload and
|
||
Renderer were launched in an isolated Windows Electron profile. Native mouse
|
||
input selected Continue and opened its terminal; native text input and Enter
|
||
submitted a minimal request. The actual Continue output contained the expected
|
||
joined answer and no `Checking for updates`. Main HTTP dispatch instrumentation
|
||
recorded two additional provider requests, both HTTP 200: this fix's validation
|
||
now totals seven external model requests. A subsequent no-submit probe copied
|
||
initialized TUI content and typed input from the active xterm buffer.
|
||
|
||
Early driver attempts targeted a restored inactive terminal, giving an empty
|
||
clipboard; selecting the newly opened terminal resolved this without product
|
||
changes. Another attempt sent Enter before focus/input settled and dispatched
|
||
zero requests. These harness failures are not product freeze fixes. The full App
|
||
remained callable and accepted terminal input in the successful runs; the user's
|
||
original freeze has not been reproduced or uniquely diagnosed. Captured PNGs
|
||
have not been visually reviewed. The production TLS policy still enabled the
|
||
verification override, despite the launcher's strict environment setting.
|
||
|
||
Local evidence: `full-app-model-events.json`, `full-app-calls.json`,
|
||
`full-app-buffer.txt` and the `full-app*.cjs` drivers in the same temporary folder.
|
||
The isolated profile was removed after checking that no probe-owned Electron or
|
||
Node processes remained; the separate diagnostic evidence was retained.
|
||
The full-suite rerun completed in 734 seconds: 5,298 passed,
|
||
86 skipped and 3 failed tests, plus one failed suite setup. Failures were the
|
||
OpenCode isolation fixture (`spawnSync npm.cmd EINVAL`), Magic Notes layout's
|
||
90-second timeout, and two HeartbeatCenter tablist assertions. These files were
|
||
not changed here; this is not an all-green suite. Original runtime settings were
|
||
byte-identical after the full-App probes, and no probe-owned processes remained.
|
||
Remote shortcut integration and full Agent/model acceptance remain outstanding.
|
||
|
||
### Failure triage follow-up
|
||
|
||
The OpenCode isolation and native Magic Notes layout files passed together through
|
||
`npm test` (8 tests). The earlier full-suite supervisor invoked Vitest directly,
|
||
without npm's launcher environment; its OpenCode setup error did not recur through
|
||
the npm entry point. The layout timeout also did not recur. These focused results
|
||
do not replace the failed full-suite result.
|
||
|
||
Both HeartbeatCenter language cases failed independently at that point. Source inspection
|
||
shows the graph contains a separate, named PageTabs for events/entities/relations
|
||
inside the page-level tabs; the older test assumes there can only be one tablist
|
||
anywhere on the page. Neither that feature nor its test was changed for this
|
||
Continue fix. No unrelated UI change or assertion relaxation was made.
|
||
|
||
A separate 2026-09-27 follow-up corrected the navigation scope assertions after
|
||
checking the graph design. HeartbeatCenter, SupervisorWorkspace and shared tab
|
||
tests passed together (96 tests); the full suite was not rerun. See the
|
||
[validation record](../../quality/responsive-controls-review-2026-09-27.md#heartbeatcenter-断言修复).
|
||
|
||
The retained full-App log contains no matching unresponsive, crash, timeout or
|
||
maximum-update-depth errors. This does not establish the cause of the reported
|
||
freeze. This follow-up made zero external model requests (the fix-validation total
|
||
remains seven); the OpenCode regression uses loopback model fixtures.
|
||
|
||
## 2026-09-27 Local Native Client Validation
|
||
|
||
Scope: [native client proposal](./runtime-native-client-proposal.md), FR-2/3/5/6/7/8,
|
||
US-2/4/5/6/8, local portions of P1/P2/P3/P5. Source baseline:
|
||
`55efca3ee1d8a491c4d9709888e302188cd988bd` plus the concurrent working tree.
|
||
|
||
- Fixed the coordinator's browser-open failure path: a ready DS service and its
|
||
gateway remain available for owner-scoped reopen/stop. Startup failures still
|
||
release their gateway. Focused regressions cover current credentials, work mode,
|
||
Node selection, concurrent open, owner isolation and retry.
|
||
The DS service also includes the coordinator configuration key in its own match
|
||
hash; updated skill digests or launch settings cannot reuse an older instance.
|
||
- DS Ask now maps built-in gateway read grants to the official MCP tool names.
|
||
Custom MCP remains Execute-only, following existing Runtime behavior. The real
|
||
DS process test loads an assigned directory containing `SKILL.md`, rather than
|
||
only a synthetic loose Markdown skill file.
|
||
- Custom standard Node uses the current local tool environment selection without
|
||
a separate npm install. The managed Node fallback still has a bespoke pinned npm
|
||
install and remains a delivery gap; it was not exercised by this real-model run.
|
||
- The opt-in IPC integration test uses the production action component, preload
|
||
methods, registered handlers, saved project/model stores, coordinator, official
|
||
DS Web process, and real Continue/OpenCode PTYs. Electron transport is simulated
|
||
by the existing IPC test harness and the action component runs in jsdom; this is
|
||
not a full desktop-window or packaged-app acceptance result. DS Web itself was
|
||
driven in real headless Edge. The hook retains credentials only in process
|
||
memory; the temporary settings file stores opaque test-cipher identifiers.
|
||
|
||
| Client | Configured Model | Supplier HTTP Dispatches | Result |
|
||
| --- | --- | ---: | --- |
|
||
| DS Web 0.1.7-rc.2 | `deepseek-flash` | 2 | Workspace/model selected automatically; Web displayed `NATIVE_WEB_OK` |
|
||
| Continue 1.5.47 | `gpt-6-astra` | 4 | Two prompts and two title requests; second transcript confirms the assistant response, with underscores consumed by Markdown rendering |
|
||
| OpenCode 1.18.29 | `gpt-6-astra` | 1 | Native TUI displayed `NATIVE_OPENCODE_OK`; supplier response also contains it |
|
||
| Total | | 7 | All HTTP 200; no further dispatches needed |
|
||
|
||
The first terminal assertion matched echoed prompt text and was rejected as
|
||
evidence. The second prompt did not contain the expected joined answer. The
|
||
OpenCode probe waits for the rendered TUI and uses bracketed paste before Enter.
|
||
The initial six-dispatch bound was increased to eight to cover the remaining
|
||
OpenCode path; seven were used in total. The host environment supplied
|
||
`NODE_TLS_REJECT_UNAUTHORIZED=0`, so this run does not verify strict TLS.
|
||
|
||
Evidence under the approved temporary `opencode/dsh-017-verify` directory:
|
||
`native-live-evidence.json`, `native-main-result.json`, `native-web.png`, and
|
||
`native-{continue,opencode}-terminal.txt`. `native-live-run.cjs` composes the existing
|
||
encrypted settings snapshot/safeStorage bootstrap with the production IPC test.
|
||
Original `runtime-settings.json` remained byte-identical. The final test verifies
|
||
DS stop/reopen/owner isolation and failed fetch after stop, closes both terminal
|
||
sessions, and removes its temporary workspace/configuration. Owned live client
|
||
processes were absent after completion.
|
||
|
||
Checks: official DS/coordinator focused tests passed (12) under standard Node 24.19.0;
|
||
the opt-in UI/preload/IPC test passed both without provider calls and with the live
|
||
hooks. Four installed Continue/OpenCode Ask/Execute tests passed with real clients
|
||
and deterministic supplier responses; these made zero external supplier calls.
|
||
Repository lint and Agent/Renderer TypeScript checks passed. Main typecheck is
|
||
currently blocked by concurrent SSH
|
||
test doubles missing `forwardLoopback`; no local native-client type errors remain.
|
||
The full `npm test` run finished with 5,285 passed, 79 skipped and one failure:
|
||
the desktop runtime-hook fixture lacked the new DS Web package tree. The fixture
|
||
was corrected and all 44 build-release tests then passed in a focused rerun. The
|
||
full run began before the final configuration-key regression and fixture updates;
|
||
the final DS/coordinator and UI/preload/IPC paths were rerun separately and passed.
|
||
This is not a claim of a subsequent all-green full-suite run. Full output is in
|
||
`native-full-tests.log` beside the live evidence.
|
||
|
||
Remaining at this checkpoint: remote coordinator wiring and real Host acceptance belong to the
|
||
concurrent remote implementation; Continue/OpenCode Ask built-in MCP mappings,
|
||
managed standard Node distribution, full Electron/packaged UI acceptance and other
|
||
platforms are not verified here. `ipc.ts` was not edited in this work.
|
||
|
||
2026-09-28 update: native Continue/OpenCode Ask now pass Main-bound read-tool
|
||
names to native permission flags and execution hooks. The Story Graph work also
|
||
adds Supervisor enablement to native-client reuse keys and gateway checks.
|
||
The OpenCode generated plugin is executed by a focused test; packaged native UI
|
||
acceptance remains separate. See [Story Graph validation](../conversation-supervision/progress.md#2026-09-28-story-graph-只读工具).
|
||
|
||
## 2026-09-26 结构升级与历史回收分离(未发布)
|
||
|
||
- schema 45/46 的回归先复现普通结构升级执行 `VACUUM`,修复后不转换历史、
|
||
不回收正常空闲页,保留聊天、笔记、事件及 SQLite 完整性。
|
||
- 启动决定在内存中分别保留笔记转换与回收需求,Worker 重试复用原决定;
|
||
不增加 schema 或持久标记,不修改正常写入。规则见
|
||
[旧库升级](./execution-history-storage.md#旧库升级)。
|
||
- 真实 Node Worker 验证结构升级、旧笔记转换、取消与重试、文件大小和内容保留;
|
||
启动调度回归验证允许/禁止回收的两种重试,中英文页面区分实际操作。
|
||
六个定向测试文件 **47 项通过**,类型检查、lint 和 `git diff --check` 通过。
|
||
- 完整 `npm test`:**5,138 通过、74 跳过、1 失败**。未修改的
|
||
`tests/magic-notes-layout.electron.test.ts` 原生拖拽断言失败:首次索引列保持 168,
|
||
单独复跑则 AI 列保持 280,均未达到拖动后的预期宽度。该 fixture 直接加载
|
||
Magic Notes 和模拟 API,不运行本次存储升级路径。随后修正测试的原生输入同步:
|
||
等待焦点、拖拽建立、宽度更新及结束,并明确左键按下状态,未弱化断言或改变产品
|
||
布局;独立复跑及随后完整测试中的该用例通过。
|
||
- 最终完整重跑:**5,137 通过、74 跳过、2 失败**,迁移相关及布局拖拽均通过。
|
||
`inline-help.electron.test.ts` 超时,`overlay-layering.electron.test.ts` 子进程退出码
|
||
为 null;这两个未修改的用例随后一起独立复跑 **2 项通过**,未提高超时或修改断言。
|
||
最终 typecheck、lint、`git diff --check` 均通过。独立复跑不替代完整测试结果,
|
||
不宣称本次全量或 CI 全绿。
|
||
- 本机与托管 SSH 历史共用 Desktop 数据库升级路径;Agent、Runtime、模型桥和
|
||
远程协议未变,不需要部署 Host 补丁。本次未调用模型,未改写用户数据库,
|
||
尚无本次修复的 CI 或发布验证。
|
||
|
||
## 2026-09-21 重复历史迁移补修(Desktop 0.13.9 候选)
|
||
|
||
- 0.13.8 的检查仍在已有笔记时把 `freelist_count > 0` 当作迁移依据;正常聊天更新
|
||
也会释放页。此前无笔记的回归提前返回,漏掉这一场景,不能证明该版本已修复。
|
||
- 启动检查现在只依据旧 schema 或旧笔记 payload;空闲页只用于已进入迁移流程的
|
||
压缩步骤。同一启动流程的 Worker 重试显式复用已确认的迁移决定,不持久化额外标记。
|
||
若正文已转换但仅压缩中断,退出后重新启动不因剩余空闲页再次迁移,SQLite 可复用这些页。
|
||
- 新回归先复现旧实现错误,再覆盖真实 SQLite 的旧笔记迁移、新建与编辑笔记、
|
||
聊天释放页、连续三次重开、内容一致性和完整性;断言没有进度回调或 VACUUM。
|
||
- 此次仅修改 Desktop 启动流程;新写入格式、schema、Agent 和远程协议不变。
|
||
- 迁移、Magic Notes、数据库专项复跑 **135 项通过**(30 秒单测上限);此前一个
|
||
listTasks 测试超时,独立复跑通过。加强后的迁移与笔记专项 **32 项通过**。
|
||
全量测试此前被取消,候选全量验证和 CI 尚待完成。
|
||
|
||
## 2026-09-19 问答位置持久化
|
||
|
||
- Main 在收到问题时保存消息位置块,而不是等回答成功才追加;前台及重启恢复的实时待答
|
||
快照、带来源的语义事件投影共用同一去重函数。答案写入不移动位置块,旧消息不补造历史
|
||
顺序;规则见[Runtime 交互边界](./runtime-interactions.md#运行与失败)。未改变 schema。
|
||
- `npm exec -- vitest run src/main/assistant/assistant-database.test.ts src/main/ipc.test.ts`
|
||
通过 227 项,覆盖真实 SQLite 的问题/正文/工具交错、重复和重放、回答/跳过、完成及
|
||
重新打开,以及三个设置重载入口的并行远程问题恢复。
|
||
`npm exec -- tsc --noEmit -p tsconfig.node.json` 通过。
|
||
- 共享 Linux x64 Host 使用已保存凭据与固定 Host Key,经 LAN 路由运行当前源码 Agent、
|
||
Desktop Runtime 适配器和 Main SQLite 投影,使用真实 OpenCode `1.18.29`。首轮暴露实时
|
||
问题没有语义来源的实际分支,使用 1 次真实文本模型请求后停止;补齐 Main 接收入口后,
|
||
最终一轮 2 次请求,验证回答前位置块已经落库,回答后为 `tool → question → text`,
|
||
完成重开后消息完全一致。合计真实文本模型调用 **3 次**,每次最多 1024 输出 token,
|
||
每轮有限调用预算与 120 秒请求超时;图片模型调用 **0 次**。
|
||
- 临时复验脚本为既有批准临时目录中的 `question-order-host-build.cjs`、
|
||
`question-order-host-run.cjs`,最终日志为 `question-order-host-live.log`。
|
||
两轮均停止测试 daemon,所属进程剩余 0,移除本轮专属 Host 目录及上传文件。
|
||
该记录只覆盖 Main/Agent 路径,不代替 Renderer 视觉验收或最终全量验证。
|
||
|
||
## 2026-09-19 远程 CN 完整桌面验证
|
||
|
||
默认联合开发包已包含 OC/CN,并通过桌面导入、验签、传输至共享 Linux x64、安装及
|
||
CN 项目创建。真实输入框发送产生清单更新,顶部和消息保存一致;退出重启后恢复完成
|
||
与待办状态。修复实测发现的 CN 冷会话续发及重复序号问题,复验重启续发、点击停止和
|
||
取消后再次发送通过。证据、调用口径及平台边界见
|
||
[远程记录](../remote-host/runtime-checklist-validation.md#2026-09-19-联合包与完整桌面验收)。
|
||
|
||
任务与清单分别展开,容器高度有界,键盘可进入清单滚动区;状态图标不再影响文字
|
||
基线。此前真实 Electron 视觉矩阵覆盖同时展开、长列表、窄窗口、浅深主题及 200% 缩放。
|
||
本轮实际桌面截图进一步核对真实远程清单和取消状态。开发包未发布,非 x64 平台未实测。
|
||
|
||
远程 CN 真实长清单为 55 项、5,601 字符,展示与落库一致;清空后退出重启仍保持空数组。
|
||
本轮 Agent gateway 账本记录 16 次模型请求,其中 15 次完成、1 次取消结果未确认。
|
||
测试 Host 目录、所属进程及本地隔离 profile 已清理。全量 4707 passed、67 skipped、
|
||
1 failed;本地 OC 压缩失败项与远程 ACP、项目选择、清单组件专项复验共 136 passed。
|
||
最终 typecheck、lint 和差异检查通过。
|
||
|
||
## 2026-09-18 Remote Continue Checklist
|
||
|
||
CL-P1、CL-P3 的远程 CN 源码已接入受管包、HTTP 宿主到 ACP 的适配、模型桥、项目
|
||
校验和聊天选择。CN 原生成功 Checklist 经既有 semantic transcript 传递统一清单,
|
||
不增加数据库或重连协议。修复聊天页把远程 CN 选择恢复为 OC、隐藏 Continue 菜单,
|
||
以及复合包验包默认读取 OC payload 的遗漏。
|
||
|
||
Linux x64 当前源码与开发包通过验包、prepare/commit、Agent bootstrap/health、CN
|
||
激活、真实模型清单新增/清空、未 ACK 断线重放、取消和同对话 Ask 续发。本轮新增
|
||
17 个外部模型 HTTP 请求;精确分项、临时探针、已清理的 Host 目录及剩余验收见
|
||
[远程执行清单验证记录](../remote-host/runtime-checklist-validation.md#cn-部署与生命周期)。
|
||
本阶段使用单 Runtime 开发包;后续联合包与完整桌面验证见上方 2026-09-19 记录。
|
||
|
||
远程相关测试 27 文件、374 项通过;最终项目选择、顶部组件和安装管理 41 项、App
|
||
远程选择与继承 3 项、CN 复合包安装专项通过。typecheck 和 lint 通过。
|
||
全量测试完成一轮:4665 passed、67 skipped、6 failed。其中 CN 新增包测试的文件名
|
||
错误已修正并复验;其余 5 项为 ActivityPanel/activity-store 的引用复用断言,本轮未
|
||
修改这些文件。最终 typecheck、lint 和专项结果见上述远程记录。
|
||
并行工作区更新后,ActivityPanel/activity-store 的 39 项专项复验全部通过。
|
||
|
||
## 2026-09-18 Local Runtime Checklist Backend
|
||
|
||
CL-P1 and the backend portion of CL-P2 are implemented. Shared contracts use
|
||
`runtime-checklist.ts`, `AgentEvent.type = checklist`, and message field
|
||
`runtimeChecklist`. Local OC validates parent Session, submitted message identity,
|
||
assistant parent identity and native tool arguments. CN extracts before truncation,
|
||
commits successful calls once, excludes startup history and retains explicit clears.
|
||
Message metadata serialization, reconstruction, remote replay deduplication and
|
||
terminalization preserve the field without a database migration. Existing IPC
|
||
transport already forwards these events. Renderer and `acp-remote-runtime` were
|
||
outside this backend change; no shared Linux Host acceptance is claimed here.
|
||
|
||
The focused backend suite passed 275 tests across shared checklist, OC/CN Runtime,
|
||
host adapter, permissions, real-binary lifecycle and assistant database tests.
|
||
Coverage includes OC reused Sessions and stale/child updates, native event ordering,
|
||
CN long lists and omitted success arguments, failure preservation, history dedupe,
|
||
empty lists, database reopen and remote event replay/terminalization.
|
||
`npm run typecheck` and `npm run lint` passed on the final validation run.
|
||
The full `npm test` run completed with 4604 passed, 67 skipped and 9 failed:
|
||
one Agent offline-package inventory test exceeded 60 seconds; eight failures were
|
||
in concurrently changing Magic Notes renderer tests (including PDF `DOMMatrix`
|
||
availability and canvas UI expectations). These files were not modified here.
|
||
|
||
Real model evidence on Windows, using production local adapters and isolated
|
||
temporary profiles:
|
||
|
||
| Runtime | Version | Submitted tasks | Actual model HTTP POSTs | Observed result |
|
||
| --- | --- | --- | --- | --- |
|
||
| CN | 1.5.47 | 1 | 3 | Two successful Checklist calls, two structured snapshots; A pending then completed, B pending |
|
||
| OC investigation | 1.18.29 | 2 | 6 | Native tools succeeded; revealed todo.updated precedes running input, initially no projected snapshot |
|
||
| OC corrected ordering | 1.18.29 | 1 | 3 | Two native updates projected; done retained |
|
||
| OC final sortable message ID | 1.18.29 | 1 | 3 | Two native updates projected; assistant parent IDs matched; done retained |
|
||
|
||
Total: **15 actual external model HTTP POSTs**, all HTTP 200, **5 submitted tasks**.
|
||
The unavailable old OC server probe and two isolated startup attempts dispatched
|
||
zero model requests. Startup attempts were blocked by the probe's fetch wrapper
|
||
not accepting Request objects; correcting that wrapper required no product change.
|
||
The proxy allowed only the exact native checklist tool, with a per-run request cap.
|
||
No business-file tools ran. Saved production settings were read through isolated
|
||
credential handling; the existing explicit test connection was used in memory
|
||
because its endpoint/model tuple differed from the saved connection. Credentials
|
||
were not printed, original settings were unchanged, and isolated run data was removed.
|
||
|
||
The real probes verified adapter extraction and OC Runtime events, not desktop
|
||
rendering. CN Runtime event forwarding and persistence were verified by tests.
|
||
Long lists, clears, cancellation boundaries and history replay were tested with
|
||
fixtures/database tests, not exhaustively exercised through real models. Temporary
|
||
probe sources: `cn-todo-probe.ts` / `cn-todo-run.cjs` under the approved OpenCode
|
||
temporary directory; each run printed its dispatch count and structured results.
|
||
|
||
## 2026-09-17 连续请求取消与停止状态
|
||
|
||
- 复现并修复 OpenCode 迟到的会话取消中断下一条请求:同一次运行复用一个有界 abort,
|
||
等待取消结束后释放会话锁;取消失败时移除对应绑定。规则见
|
||
[本机 OpenCode](./runtime-process-reuse-technical-design.md#4-本机-opencode)。
|
||
- 复现并修复旧 streaming 快照覆盖本地终态后停止按钮残留。完成、取消两种回归在
|
||
修复前失败,修复后通过;连续两条消息结束后按钮恢复。规则见
|
||
[消息底部请求状态](./runtime-interactions.md#消息底部请求状态)。
|
||
- App 257 项测试通过;最终 OpenCode Runtime、权限与真实 lifecycle 105 项通过。
|
||
lifecycle 使用真实 OpenCode 二进制与 SDK、本地模型 fixture,验证延迟取消后同会话
|
||
下一条正常完成及 SSE 回收。该轮外部真实模型调用 0 次;后续完整 App 实测见下文。
|
||
- `npm test`:4454 项通过、67 项跳过、2 项失败;失败均为 heartbeat 迁移的
|
||
`duplicate column name: pinned`。`npm run typecheck`、修改文件定向 ESLint、
|
||
`git diff --check` 通过;全库 lint 因范围外 `docs/features/story-graph/demo.js`
|
||
的 22 项 `document` 未定义错误失败。
|
||
- 托管 SSH 经 `ManagedRemoteAcpRuntime` / `AgentOwnedAcpPrompt` 使用独立 ACP
|
||
取消流程,不复用此 HTTP abort 实现;本次未改 Agent 或远程协议,未做共享 Host 实测。
|
||
|
||
### Real-model follow-up
|
||
|
||
Current-source production Main, Preload, and Renderer were built into dedicated
|
||
temporary output and launched in an isolated Electron profile on Windows. Native
|
||
input submitted two queued OpenCode Ask requests, then cancelled another request
|
||
after external HTTP dispatch and clicked resend within 25 ms. Both queued answers
|
||
and the resend completed and were persisted. The cancellation was also persisted.
|
||
After each scenario, the real DOM had no Stop button; Send was enabled after
|
||
entering an unsent readiness probe. Both terminal screenshots were reviewed.
|
||
|
||
The instrumented run dispatched exactly four external text-model HTTP requests:
|
||
three returned HTTP 200 and one was cancelled before response headers. There were
|
||
no observed retries or tool executions. A transparent Main relay forwarded to the
|
||
unchanged configured HTTP upstream to count child-process requests; model answers
|
||
and events were not simulated. An initial driver attempt completed two additional
|
||
real generations before its counting hook was found not to cover child traffic.
|
||
The total external dispatch count across both attempts is therefore unknown.
|
||
|
||
This verifies the observed full-App flows, not deterministic stale-event ordering,
|
||
remote Hosts, or restart behavior. Isolated credentials, profile, build, and owned
|
||
processes were cleaned up; original settings and target source hashes were unchanged.
|
||
The follow-up focused suite passed all 362 tests, and `npm run typecheck` passed.
|
||
Redacted evidence: [real-model report](./consecutive-requests-live-2026-09-17.json).
|
||
|
||
## 2026-09-15 Managed browser popups
|
||
|
||
Implemented [page-created tabs](./browser-tabs-technical-design.md#62-page-created-tabs): native
|
||
Electron popup creation now registers a managed Tab, and click results update direct-tool and MCP
|
||
bindings. Renderer selects a visible opener's popup across chat switches and removes script-closed
|
||
popup instances. Existing worktree changes were retained.
|
||
|
||
Validation against the current source:
|
||
|
||
- `npx vitest run src/main/browser src/main/agent/knowledge-mcp-gateway.test.ts src/main/agent/model-tool-provider.test.ts src/renderer/src/RightAssistantSidebar.resize.test.tsx src/shared/contracts.test.ts`: 10 files, 232 tests passed.
|
||
- `node build/run-browser-tabs-electron-e2e.cjs`: passed twice after making the test wait for the shown
|
||
native view's animation frames before sending mouse input. Real Chromium verified `target=_blank`,
|
||
`window.open(url)`, blank-then-location, script close, opener close, shared partition, unsupported URL
|
||
denial, and subsequent direct/MCP snapshots on the popup. No fixed click delay was added to production.
|
||
- `npm run typecheck` and `npm run lint`: passed. `git diff --check`: no whitespace errors.
|
||
- `npm test`: 4319 passed, 67 skipped, 6 failed across 5 files. Failures were Agent offline dependency
|
||
installation timeout, local Runtime reuse timeout, diagnostic-log writer expectations, two heartbeat
|
||
migration fixtures with `duplicate column name: pinned`, and an App external knowledge binding test
|
||
missing the `Remote handbook` heading. The full suite was not green; none of these failures exercise
|
||
the popup registration or binding path.
|
||
|
||
The Electron test uses production BrowserService, CDP and MCP with a local HTTP fixture; the workbar
|
||
selection/removal path is covered by the actual Renderer component test. A complete installed-App
|
||
visual test and macOS/Linux native popup checks were not run. No external model calls were made for
|
||
the popup validation. Remote ACP exposes only its scoped image MCP server (`imageMcpServers`), so the
|
||
deployed Agent has no separate affected browser implementation and no remote Host change was needed.
|
||
|
||
## 2026-09-15 会话置顶与浮动操作菜单
|
||
|
||
已核对当前源码差异:置顶经专用 IPC 写入 SQLite,schema 36 迁移保留已有会话;会话操作
|
||
改为 body Portal 菜单。规则分别见[会话置顶](./execution-history-storage.md#会话置顶)和
|
||
[菜单界面](../application-tool-navigation/ui-design.md#会话置顶与操作菜单)。
|
||
|
||
本次任务提供的已验证聚焦测试结果为 backend **135 项通过**、renderer **283 项通过**。
|
||
本轮仅更新文档,未重新运行测试;任务未提供这两组的完整命令或原始日志路径。
|
||
已核对 `assistant-database.test.ts` 与 `App.test.tsx` 中相关回归,覆盖持久化与重开、
|
||
schema 35 升级、最近 100 条之外的置顶、自动保存隔离、草稿先保存、通道会话、失败保留
|
||
状态、旧刷新竞态,以及 Portal、窗口边界、键盘与外部关闭。
|
||
|
||
原生 Electron 视觉与完整应用交互尚未验证,不能据组件测试声明实际菜单排版、原生浏览器
|
||
遮挡或跨主题/窗口尺寸视觉验收通过;本轮也未运行全量测试、类型检查、lint 或构建。
|
||
|
||
## 2026-09-15 工作栏标签标题国际化修复
|
||
|
||
实现与兼容规则见[多终端页签 PRD 第 10 节](./terminal-tabs-prd.md#10-实例session-与持久化)。
|
||
任务中心、工作区、成果和带默认编号的终端标题由 Sidebar 按当前语言派生;重命名清除默认
|
||
编号。浏览器标题保持原行为,未修改工作栏壳层。本次只涉及桌面标题显示与布局描述,不改变
|
||
本机或远程 PTY、Runtime、Agent 协议或桌面到 Agent 的执行路径。
|
||
|
||
聚焦验证:
|
||
|
||
- `npx vitest run src/renderer/src/RightAssistantSidebar.resize.test.tsx src/shared/workbar-contracts.test.ts src/renderer/src/WorkbarShell.test.tsx`:3 个文件、74 项通过。
|
||
- Sidebar 新增 6 项行为回归,覆盖中英切换且不改写布局、默认终端编号持久化与跨语言恢复、
|
||
重命名后恢复,以及中文默认名、英文默认名和自定义名三种无标记旧终端。测试使用真实
|
||
Sidebar、WorkbarShell 和布局 Schema,终端面板使用测试替身,未启动 Shell。
|
||
- `npx eslint src/renderer/src/RightAssistantSidebar.tsx src/renderer/src/RightAssistantSidebar.resize.test.tsx src/shared/workbar-contracts.ts`:通过。
|
||
- 首轮测试有一处新增浏览器文案断言错误,修正为现有“未绑定会话”后通过。按用户要求未运行
|
||
全量测试、全量 typecheck、全量 lint 或构建;本轮未进行 Electron 实机验证。
|
||
|
||
## 2026-09-15 Desktop 0.13.6 发布准备
|
||
|
||
用户批准两项性能修复的中英文更新说明,指定 Desktop 0.13.6,不发布 Agent 或
|
||
LoongArch 预览,并明确排除工作区另外四个应用导航设计/演示文件。
|
||
`package.json` 与 lockfile 的两处根版本一致,更新说明校验通过。
|
||
双语功能矩阵已核对并补充按需历史行为;Agent 保持 0.13.0。
|
||
|
||
用户随后要求直接交由 CI 发布,本地独立候选的全量验收命令被取消,未记为通过;
|
||
开发阶段的完整测试及实测结果保留在下一节。候选发布不再进行本地生产构建或
|
||
打包,主分支 CI 与六平台标签工作流仍为发布验收入口。最终提交、标签与公开
|
||
产物状态须以远端实际结果核对,不以版本号变更视为已发布。
|
||
|
||
## 2026-09-15 会话列表与图片合并性能修复
|
||
|
||
本轮针对用户报告的 0.13.5 卡顿与高内存,不修改正在运行的正式应用或数据库。
|
||
只读检查发现最近会话正文约 1.14 MiB,消息 metadata 约 119.3 MiB;`f8d0741`
|
||
的图片合并还会重建无变化消息,使焦点刷新后再次保存历史。实现规则见
|
||
[会话列表读取与前端保留](./execution-history-storage.md#会话列表读取与前端保留)。
|
||
|
||
已实现并验证:
|
||
|
||
- 图片合并的三个分支共用保留引用的函数。1,600 条无图片历史引用不变;App 使用
|
||
JSON 往返形状刷新后,保存的消息数为 0,较新的图片操作、成果关联和流式正文仍保留。
|
||
- 启动、焦点/队列刷新、活动跳转与自定义任务入口均使用摘要或按 ID 读取。
|
||
搜索保留中文、Unicode 大小写和字面 `%_` 匹配,包含仍显示但已落到最近 100 条以外的
|
||
会话;真实 SQLite 中 501 条历史仍可完整取回,header-only 保存不删除消息。
|
||
- 打开、复制、导出、发送及压缩上下文保留完整历史语义。详情读取失败可原地重试;
|
||
旧摘要不能覆盖晚到的后台审批或刚加载的历史。搜索只保存命中 ID,复制/导出不把
|
||
未打开详情留入缓存,空闲详情在已确认保存后随现有 KeepAlive 生命周期释放。
|
||
- 三路 simplify 审查覆盖全部本轮源码,修正了两处残留全量读取、搜索保留大对象、
|
||
较早会话搜索遗漏及后台审批竞态。保留已发布完整列表接口,无 schema/Agent 协议迁移。
|
||
- 定向 App、SQLite、IPC/恢复及图片合并测试:**443 通过**。最终 `npm test`:
|
||
**4,301 通过、67 跳过、0 失败**,约 736.46 秒。`npm run typecheck` 和所有本轮
|
||
源码文件的 ESLint 通过。全仓 `npm run lint` 仍被本轮范围外的
|
||
`application-tool-navigation/navigation-demo.js:360` 的 `no-unused-expressions`
|
||
阻塞,未修改该用户编辑;不能记为全仓 lint 通过。
|
||
- 以 `f47049c40d757a38296d06d281b87fb6a5fe1c8c` 和本轮 14 个源码/测试文件冻结
|
||
before/after,两个生产 Electron 构建均成功;验证后哈希核对无源码漂移。
|
||
- 隔离生产 Electron 的 100 会话/1,600 消息试验:首次摘要读取 0 条消息,仅当前会话
|
||
详情读取 16 条;搜索第 100 个会话的正文不预载其 metadata,点击后再读取完整 16 条。
|
||
已检查实际 UI 截图,不是只调用数据库或 Mock。
|
||
- 另一个隔离 App 正常 UI 打开未加载的旧会话并发送,Main 请求携带原有 2 条历史;
|
||
**1 次真实直连文本调用**,HTTP 200,最终完整保存准确标记 `HISTORY_RENDERER_7391`。
|
||
初始等待使用错误 DOM class 超时,随后以保存结果核对成功,未重复发送。
|
||
- Linux x64 共享 Host 在本轮独立目录构建、安装并激活当前源码 Agent/OpenCode,
|
||
真实 SQLite 摘要测试通过;**2 次真实无工具文本调用**均完成且 delivered=1,
|
||
第二轮复用同一原生 Session 并准确记住首轮标记。测试 Agent 停止后独立 `/proc`
|
||
检查无该目录所属进程。此检查验证当前源码部署与 Session 续接,不冒充远端 UI
|
||
断线恢复全流程;桌面恢复问题投影由本轮真实 SQLite IPC 回归覆盖。
|
||
|
||
本轮真实模型调用共 **3 次文本、0 次图片**,无工具请求,不新增图片生成费用。
|
||
准备阶段的错误 fixture provider/图片默认字段、独立 profile 缺少原安全存储的
|
||
加密上下文、Host 源码包漏带 LICENSE 均只修验证脚本;失败记录保留,不计为产品修复。
|
||
所有脚本与原始证据位于忽略目录
|
||
`.agent-resources/conversation-performance-20260915/run-KX7bIz/`。
|
||
|
||
### 完整 App 配对内存测量
|
||
|
||
最终采用三组顺序执行的 before/after 冷启动,共六个独立 profile。每组使用相同
|
||
100 会话/1,600 消息,正文 1.20 MiB、完整 reasoning metadata 119.69 MiB;
|
||
执行三次焦点刷新、搜索未打开正文并导航 11 次。使用直连 Runtime 的无网络配置,
|
||
不启动 OC/DSH、不调用模型;测试与构建已完成后再开始这组测量。
|
||
|
||
下表是各三次结果的中位数,内存为 Windows Private Commit,单位 MiB:
|
||
|
||
| 指标 | before | after |
|
||
| --- | ---: | ---: |
|
||
| 初次传入 Renderer 的完整消息数 | 1,600 | 16 |
|
||
| 三次无变化刷新保存的消息数 | 4,800 | 0 |
|
||
| Main 焦点列表读取耗时(ms,不是端到端帧延迟) | 207.28 | 8.05 |
|
||
| 启动稳定点 App / Renderer | 803.42 / 284.77 | 682.36 / 155.73 |
|
||
| 三次刷新后 App / Renderer | 1,640.43 / 703.91 | 661.34 / 154.16 |
|
||
| 导航及缓存释放后 App / Renderer | 895.27 / 557.09 | 574.65 / 248.95 |
|
||
| App 采样峰值 | 1,788.71 | 694.35 |
|
||
|
||
每次 10 个进程样本,定时器间隔 5 秒,另有阶段采样,不代表连续峰值。
|
||
本数据集采样峰值中位数下降 **61.18%**;before 三次峰值分别为
|
||
2,506.29 / 1,788.71 / 1,766.39,after 为 694.35 / 693.61 / 719.27。
|
||
它测的是这两项历史读取/重复保存修复,不含重型 Runtime 的原生内存,不能推广为
|
||
正式用户整个 App 必然下降相同比例,也不是长时间空闲泄漏证明。
|
||
|
||
六个最终 profile 都保留 1,600 条消息,按 ID/角色/状态/正文/完整 reasoning
|
||
计算的 SHA-256 一致,`quick_check` 均通过;六个 App 均正常退出(code 0)。
|
||
汇总见 `summary.json`,单轮为 `before-2` 至 `after-4` 的 report/acceptance。
|
||
|
||
保留但不纳入三组对照的早期 `before-1`/`after-1`:after 的驱动在清除搜索后未等待
|
||
延迟筛选收敛,导航失败;退出时还记录 `PostQueuedCompletionStatus` 无效句柄。
|
||
后续为两个版本都补上可见列表等待,并等本轮采样子进程完成后再正常退出;
|
||
未唯一定位早期退出错误,也未据此修改产品代码。最终六轮完成后的监督脚本仍因
|
||
向已退出 CDP 调用 browser close 返回错误;随后不附带 CDP 独立关闭命名浏览器成功。
|
||
OS 按本轮目录核对无遗留 Electron/Node 进程,原始失败日志未覆盖。
|
||
|
||
文档检查覆盖本轮六份文档、81 个相对文件链接,无缺失;未逐一校验所有历史锚点。
|
||
修改未提交、未推送、未发布。
|
||
|
||
## 2026-09-15 Runtime 执行清单设计(未实现)
|
||
|
||
对应 FR-CL1–FR-CL4。用户本轮明确只完善设计与进展文档,不改代码;
|
||
[设计与验收](./runtime-checklist-technical-design.md)不代表功能已经接入或发布。
|
||
|
||
此前调研已通过真实模型完成以下本地测试;本次文档更新未重新运行测试:
|
||
|
||
| Runtime | 已确认的本地研究结果 | 调用口径 |
|
||
| --- | --- | --- |
|
||
| OC 1.18.29 | `todo.updated` 与 `session.todo` 为 `content/status/priority` 完整替换,无 item ID | 3 个真实模型轮次 |
|
||
| CN 1.5.47 | `Checklist.checklist` 为 Markdown `- [ ]` / `- [x]` 完整替换,成功后才提交 | 3 次真实 HTTP 调用 |
|
||
| DS | 真实默认环境无 todo/plan;本次不加工具 | 1 次真实模型 HTTP 调用,返回 200 |
|
||
|
||
上述口径不合并计算为同一种调用次数,也不算 GoodBuddy 顶部清单端到端通过。本轮新增
|
||
模型调用为 0,未运行代码测试或远程部署验证。
|
||
|
||
本轮只读源码检查确认 OC 普通工具输入及 CN 宿主工具输入存在 4,000 字符截断;
|
||
Agent 已传递带 Session、binding/operation 归属的通知,桌面已有 ACP plan/tool 消费,
|
||
但 plan entries 当前降为状态文本。这些链路可供设计复用,尚未验证清单端到端接入。
|
||
|
||
| 部署 | 已有能力与本功能可用程度 | 剩余工作 |
|
||
| --- | --- | --- |
|
||
| 本地 OC/CN | 原生清单格式已有上述实测结论;顶部清单未实现 | CL-P1、CL-P2、CL-P4 待实施及验证 |
|
||
| 远程 OC | 已有托管 Agent 安装与请求路径,其历史验证见远程文档;本功能没有远程实测 | 原生 entries/tool 格式、完整传递及 CL-P3、CL-P4 待验证 |
|
||
| 远程 CN | 当前受管安装、项目校验与 Runtime 创建只支持 OC,不能声明 CN 已可部署使用 | CL-P3 需补齐 CN 真实部署路径,再验收 CL-P4;当前本功能未验证 |
|
||
|
||
未决技术点:远程 OC/CN 实际发送的原生清单格式与等价性、CN 原生清空表示及 Markdown
|
||
接受规则、现有消息/事件字段的最小扩展位置、CN 受管工件与启动/模型桥接入方式。
|
||
产品范围与隔离规则已明确,不因这些待办缩减远程 CN 范围或增加 DS 工具、plan 模式与
|
||
文档功能。共享 Linux Host 的清单及重连验收全部待验证。
|
||
|
||
文档检查:已按 `deai-writing` 审校新增内容;新技术设计扫描为 0 个阻断项、12 个复核项,
|
||
复核项为必要的实现边界和验收枚举,按原意保留。新增相对链接与章节锚点已人工核对。
|
||
`git diff --check` 通过,仅输出工作区 LF/CRLF 提示;未修改本轮范围外的既有改动。
|
||
|
||
## 2026-09-14 Runtime 进程复用(实施中)
|
||
|
||
对应 FR-RR1–FR-RR6,设计及完整验收清单见
|
||
[Runtime 进程复用技术设计](./runtime-process-reuse-technical-design.md)。
|
||
用户已授权实施,本次复用改动尚未整体提交或发布,不包含在正式 Desktop 0.13.2 /
|
||
Agent 0.11.25 中。最终验证结果见本节末尾,早期失败及中间状态按时间保留。
|
||
|
||
- P0–P2:Main 已组合 `LocalRuntimeRegistry`,OpenCode Server 和 DSH Utility 按兼容
|
||
配置共享,工作区通过轻量适配器传入 Session。无会话 owner 空闲 60 秒回收;
|
||
适配器淘汰不结束其他会话。DSH 被动状态不再启动 Host,取消超时先释放目标 Session,
|
||
同时回收对应 Main 工具资源;配置替换期间的原生问题继续交给原请求的 Runtime。
|
||
- 首轮 Windows 完整 UI 使用当时构建的生产 Main/Preload/Renderer 和隔离 profile,
|
||
OpenCode、DSH 各两个项目、四个并行会话,通过输入区和发送按钮完成实际开发。
|
||
OpenCode 工具数为 7、7、6、8;DSH 为 9、13、11、11。独立运行各项目测试合计
|
||
60 项通过。两类 Runtime 分别共用一个重型进程,本轮未使用原生子代理。
|
||
- 首轮 UI 提供方请求共 55 次 HTTP 200:OpenCode 23、DSH 32。其中包含驱动选择器
|
||
失误引发的一条额外默认项目 Ask,工具为 0,不把它计为开发任务验收。
|
||
同轮 OpenCode 单进程 Private Commit 约 882.88 MiB,工作集约 629.51 MiB;
|
||
Electron 自身指标另存,不将两者混为整个 App 的测量结论。后续重复运行和空闲
|
||
证据见下文,不把这一单点与正式用户库直接比较。
|
||
- P3:生产 Agent 已接入单 ACP decoder/握手、Session → binding/operation 路由、
|
||
逐 operation Unix 模型桥及空闲回收。共享 stdio 与 Prompt 输入/期限分离;
|
||
Session 取消结算可如实保留 `processTree: running`。未增加持久进程池账本。
|
||
- 共享 Linux x64 Host 已通过现有加密凭据与固定 Host identity 连接。使用当前源码、
|
||
固定 Node 24.19.0 / OpenCode 1.18.29 构建隔离测试包,走真实 prepare/commit、
|
||
activate、attach 和 Agent-owned Prompt,不改写已有 Host 安装。
|
||
- Linux 首轮五条 Prompt 共 22 次已完成且已交付模型调用;两个 Execute 分别在正确
|
||
项目完成修改,各通过 8 项测试,四个会话只启动一个原生进程。但 Ask 的搜索被原
|
||
`kind === read` 规则误拒,原生子代理工具因权限请求未转发而等待,首轮验收失败。
|
||
修正采用原生 Session 工具规则;原生子代理只继承父拒绝规则、不继承允许规则这一点
|
||
已按固定版本源码核实,子 Session 同样设置当前模式,并保留原生显式限制。
|
||
- 下一轮测试脚本在 transcript 尚有分页时按已完成状态提前结束,误报缺少项目 marker,
|
||
随后 cleanup 中止了其他三个请求。这是验证驱动缺陷,产品自身已有 `hasMore` 处理;
|
||
驱动已修正为读完全部分页、等待全部并行结果。该轮共 14 次 dispatch,
|
||
其中 11 次完成、3 次结果不确定,失败记录保留,不将其计为通过。
|
||
- 重复测试包构建曾遇到 Host ENOSPC。只清理本轮已确认可重建的 bundle、Runtime
|
||
staging 和重复 `.gbagent`,保留测试 home、workspace、SQLite 及报告,继续验证。
|
||
- 后续两轮 Linux 各 7 条 Prompt、35/34 次 dispatch,四个 Ask/Execute 与原生子代理
|
||
续接均通过,分别取得 483/467 条子会话事件;取消没有关闭共享 owner。重连驱动先后
|
||
漏发 `controller/resume`、错读 `agent/capabilities.generation`,导致两次后续验收
|
||
失败;均已修正,保留失败报告。35 次调用一轮包含 1 次结果不确定,34 次一轮全部完成。
|
||
- 最终当前源码 Linux 生命周期复验:2 条 Prompt、5 次完成且已交付调用,共享一个
|
||
owner。目标返回 `cancelled / processTree: running`;另一会话跨真实 SSH 断线、
|
||
controller resume 和重新 attach 继续执行,3 个工具返回正确项目 marker。
|
||
全部 binding 释放后等待 65 秒,owner 数为 0;停止隔离 Agent 后仍为 0。
|
||
- 原生 Compact 单独复验:两项目各先完成 3 工具请求,再并行压缩原生 Session。
|
||
两次压缩分别归到各自的新 operation,各 1 次已交付调用,前后为同一个 owner;
|
||
总计 4 条 Prompt、8 次完成且已交付调用。释放会话并等待 65 秒后 owner 为 0,
|
||
Agent 停止后仍为 0。该结果没有用普通聊天返回“已压缩”代替原生 Compact。
|
||
- 第二轮 Windows 完整 UI 重开同一隔离 profile,四项目八条续接开发请求全部完成,
|
||
OpenCode 包含原生子代理,DSH 使用已有原生工具。独立项目测试合计 77 项通过。
|
||
两个 Runtime 仍各一个重型进程。另有四条实际慢工具请求:前两条 30 秒测试在点击
|
||
停止前已结束,不作为取消通过;后两条 120 秒测试中目标被正常 Stop 取消,另一项目
|
||
的测试继续完成,DSH PID 未变化。第二个 App 共 12 条任务,11 完成、1 取消;
|
||
100 次 HTTP 200(OpenCode 24、DSH 76),无失败请求。
|
||
- 第二轮任务结束后的 631.573 秒采样共 121 点,提供方请求计数始终为 100,
|
||
DB 始终 2,928,640 字节、WAL 始终 4,268,352 字节。期间查看了项目和截图,属于
|
||
**无新任务/模型请求**,不是完全无人操作的 UI。原生 Session 有意保留,不要求其
|
||
Runtime 退出;首个 App 自行退出时的进程消失不计为空闲计时验收。
|
||
|
||
| 进程 | Private Commit 起止(MiB) | 范围(MiB) | 区间 CPU 秒 |
|
||
| --- | ---: | ---: | ---: |
|
||
| OpenCode | 826.34 → 825.05 | 824.36–830.82 | 12.03125 |
|
||
| DSH Utility | 98.73 → 98.73 | 98.73–98.73 | 0 |
|
||
| Main | 184.16 → 185.05 | 182.90–186.77 | 0.953125 |
|
||
| Renderer | 142.80 → 136.22 | 135.00–142.80 | 0.6875 |
|
||
| GPU | 120.48 → 138.88 | 120.48–173.52 | 0.0625 |
|
||
|
||
Private Commit 不是独占物理内存,工作集相加会重复计算共享页。这组测量未发现两个
|
||
Runtime 在该空闲区间持续增长,但不是整个 App 无泄漏证明,也不是旧新版本对照。
|
||
|
||
- 当前 Linux 六个 ACP/bridge/owner 测试文件为 82 通过、0 跳过,包含 Windows 跳过的
|
||
Unix broker 并发及旧路由排队拒绝回归。本机完整回归曾为 4,170 通过、67 跳过;
|
||
首轮唯一失败来自旧测试把 `failed + running` 当成非法,修正后仍保留 `unknown`
|
||
的拒绝断言,并新增共享失败/取消接受用例。
|
||
- 标准 `typecheck` 原先没有把部分 Agent 源码作为检查入口。已增加
|
||
`tsconfig.agent.json`,并修正暴露的 ACP resume capability、spawn stdio 及几个局部
|
||
类型问题;扩展类型检查、26 项受影响 Agent 回归及 lint 通过,之后已再次进行上述
|
||
当前源码 Host 生命周期与压缩验证。
|
||
- 三个只读审查分别检查复用、质量/兼容来源和效率。修复了被动状态刷新不断重置
|
||
60 秒空闲计时的问题;状态检查不取得执行 owner,Native Session 映射成为唯一会话
|
||
保留依据,不再另存重复 conversation Set。最后本机定向回归 98 通过、3 跳过,
|
||
含真实 OpenCode 与 DSH ACP 组合;扩展类型检查通过。该补修仅涉及本机 registry,
|
||
不改变 Agent/远程路径。当时全量 `npm test` 为 **4,171 通过、67 跳过、0 失败**
|
||
(356 文件通过、9 跳过,609.57 秒);`npm run typecheck`、`npm run lint`、
|
||
`npm run build` 均通过。构建仍报告既有 chunk 大小/混合导入警告,不影响成功结果。
|
||
- 保留 exclusive raw ACP 是已有公开字节流路径,不是为本分支中间形态保留的兼容层。
|
||
新的共享取消/失败结果需要配套 Desktop/Agent,不声称旧 Desktop 已支持新结果。
|
||
原生插件两处祖先遍历可局部提取,但没有已证实故障或性能收益,本次不为此扩展改动。
|
||
- 本轮真实模型调用合计 **273 次**:本机两轮 UI 155 次,Linux 六轮
|
||
**118 次 dispatch**(29 条 Prompt,114 次完成、4 次结果不确定)。
|
||
包含所有失败轮次和误发默认 Ask,不重复计算最新报告别名;本机 HTTP 200 不等于
|
||
Agent ledger 的完整交付证明。原生确定性协议测试不计入真实提供方调用。
|
||
|
||
补充的 owner 成本对照使用同一当前源码、同一 Windows 机器、全新空工作区,分别经
|
||
生产 factory 创建两个独占实例或两个共享适配器。每种组合重复 3 轮,每轮显式连接后
|
||
再做 5 次双工作区连接检查;共启动 18 个真实 OpenCode/DSH Utility,全部退出,
|
||
**真实模型和本机合成模型请求均为 0**。测量前全量测试已结束,没有同时运行测试套件。
|
||
|
||
| Runtime / owner 方式 | 进程数 | Private Commit 中位数及范围(MiB) | 双工作区首次 ready 中位数及范围(ms) |
|
||
| --- | ---: | ---: | ---: |
|
||
| OpenCode 两个独占实例 | 2 | 1,401.17(1,396.15–1,517.91) | 1,195.00(1,184.14–1,213.49) |
|
||
| OpenCode 一个共享 owner | 1 | 777.59(667.04–802.78) | 1,135.71(1,130.32–1,140.81) |
|
||
| DSH 两个独占实例 | 2 | 171.62(170.79–173.50) | 167.06(163.36–167.78) |
|
||
| DSH 一个共享 owner | 1 | 86.64(86.18–87.29) | 155.31(155.28–157.79) |
|
||
|
||
这是**进程所有权方式**的对照,不是旧版 App 对新版 App、等规模历史或真实开发负载
|
||
对照;没有测模型首字节。DSH 后续连接检查读取已缓存握手,不能当作热 Prompt 延迟。
|
||
最后一个共享 DSH 在无 Session 时每 5 秒读取状态,持续 65 秒,原 Host 已退出且没有
|
||
重启,证明状态轮询不会续期空闲 owner。探针早期的类型及 CJS/ESM 打包错误均发生在
|
||
模型调用前;改为正确 ESM 依赖解析并加入启动前语法检查后完成测量,未修改产品以适应驱动。
|
||
|
||
清理时,完整 UI 的“关闭窗口”按现有产品行为隐藏到托盘,并不退出 App。随后只对已无
|
||
活动任务且重新核对启动命令的隔离 App 进程树进行清理;这不作为正常托盘退出验收。
|
||
命名浏览器会话已关闭,本机按本轮启动路径筛选的进程数为 0。最终通过固定身份 SSH
|
||
只读核对本轮 Linux 路径下的 `/proc` 进程和各测试安装 owner 数据库,两者均为 0;
|
||
保留测试 profile、工作区、数据库和报告,未删除用户历史或停止用户 Runtime。
|
||
|
||
此时尚未完成的完整 UI、十项目和问答恢复验收,后续结果见以下继续验收记录。
|
||
旧新版本全 App 对照、完整共享能力组合及 Continue/直连资源分解仍需独立完成,
|
||
不能将 P0–P4/V1–V8 整体标为完成。
|
||
|
||
本机证据位于忽略目录 `.agent-resources/runtime-reuse-implementation-20260914/`,
|
||
包括 UI 聚合指标、截图、Host 聚合报告及保留的失败轮次。这些不是 checkout 自带资产,
|
||
不包含可提交的模型或 SSH 凭据。
|
||
|
||
### 继续验收:远端完整 UI 与模式切换
|
||
|
||
- 用户要求继续后,已从完整生产 Electron UI 启用远程项目、保存两个 SSH 项目并在
|
||
各项目创建两条会话。仅在测试 SSH 命令入口将 `HOME` 指向既有隔离安装;项目保存、
|
||
Host/Agent/Runtime 发现、Main Runtime factory、传输、协议、模型和工具均保持生产实现,
|
||
未伪造 capability、Prompt、事件或权限结果。
|
||
- 四条正常开发任务均完成,共用一个原生 owner。分别在各自工作区实现 words/prices,
|
||
独立运行两项目测试为 12 + 13 = **25 项通过**。实际重叠峰值为 2 条请求,
|
||
不是四条同时运行;四个会话完成后,共享的原生 owner 仍然存活。
|
||
- 新增真实模型调用 **21 次**,分别为 5、5、5、6,均 completed 且已交付。
|
||
与上一段 273 次相加,累计 **294 次**;没有把旧 Agent ledger 的 13 次基线重复计入。
|
||
- 随后在原价格会话中从 Execute 切到 Ask 并发送原生业务问答请求,实际失败,UI
|
||
显示“没有可安全附加的远端 Agent 请求,且恢复不会重放任务”。Agent 仍把 workMode
|
||
固定在 binding 首次启动值,拒绝新模式;此次在模型 dispatch 前失败,新增调用为 0。
|
||
此问题不能由先前“不同 binding 使用不同模式”的通过结果排除。
|
||
- 当前修正只允许共享 Session 的后续准备变更模式,独占进程仍保持原契约;
|
||
`AgentOwnedAcpPrompt.start` 显式接收当前请求模式,原生 Session 路由与 ACP 备用权限
|
||
决策均使用该模式,不再捕获构造时模式。48 项定向回归和扩展类型检查、lint 通过,
|
||
包含 Execute → Ask → Execute 保留 Session 与原生父/子问答。
|
||
后续当前源码 Linux 包和完整 UI 复验已通过,见下一节;48 项是当时的定向结果,
|
||
不是后续全部修正后的全量结果。
|
||
- 首轮 UI 通过正常 `app.quit()` 进入生产退出清理,本机测试进程退出;
|
||
隔离 Agent 随后按 installation identity 停止,`/proc` 与 owner 数据库均为 0。
|
||
首轮报告、失败任务和工作区保留。再次构建前 Host 仅余约 251 MiB,已明确限定只回收
|
||
更早停止的测试安装软件及重复测试包,不清理状态、历史或工作区。
|
||
|
||
### 继续验收:断线、取消、模式续接与 Desktop 重启
|
||
|
||
- 四个原生问题同时等待时切断实际 SSH,复现“ACP channel does not exist”,继而出现
|
||
重复注册 binary channel。诊断确认 Agent-owned Prompt 可能没有 raw ACP journal 行,
|
||
replay 却对不存在的行 ACK 0。修正只在已有 raw cursor 时确认 journal,不放宽正序号、
|
||
channel/epoch 或 installation 检查。真实临时 SQLite 回归先失败再通过;94 项后端/
|
||
journal/channel 测试、当前源码 Linux 六文件 86 项通过,失败报告保留。
|
||
- 保留旧 Desktop profile 并更换隔离 Agent 后,旧安装的恢复曾无限重试阻塞项目。
|
||
attach-only 路径现在在打开 channel 前明确报告安装身份不匹配,不重放 Prompt。
|
||
同一 Agent 的新连接则保留 Runtime,对已有 binding 旋转 transport generation,
|
||
新 channel 使用实际连接 generation;不同 daemon 或倒退身份仍按原规则拒绝/替换。
|
||
- 完整生产 Electron UI 再次同时等待四个问题,实际断线重连后原表单和 Session 均保留,
|
||
没有新增模型调用或 owner。四会话尚在等待时,第五个新 Session 可以执行文件读写;
|
||
该 Session 的 Execute → Ask → Execute 三轮均完成,各 2 个工具、3 次模型调用,
|
||
验证实际写入、只读读取、再次写入,不以模型自述代替文件结果。
|
||
- 取消一个 120 秒原生命令时,其余三个待答会话仍可各自回答并完成。取消后立即在原
|
||
对话显式发送新请求也完成,使用新的原生 Session,仍共用原 owner。已确认取消通过
|
||
专用错误进入终态;未确认的 Stop 保留原恢复逻辑,不把网络中断等同于取消成功。
|
||
曾出现 Task 已取消但 assistant message 仍 streaming,改用既有数据库终态事务
|
||
同时更新消息、任务和终态事件。最终真实 UI、Desktop SQLite、Agent 状态一致,
|
||
streaming message 和 active Task 均为 0,共享进程未被误杀。
|
||
- Desktop 重启前的首次尝试因测试观察 SSH 挂起,实际上未退出,已明确作废该证据。
|
||
驱动加有界观察超时和 `finally` 退出后,真实重启复现两个缺陷:live question 没有
|
||
transcript provenance 却被当作持久事件拒绝;同项目串行恢复让第二个待答 Session
|
||
无法附加。现由 Main 并行恢复任务,live question 使用已有待答 Map 和活动请求租约,
|
||
只投影到实时会话快照,不伪造 provenance,不写新的问题日志。
|
||
- 修正后的真实正常退出/重开恢复两个同时待答的 Session,后一个先回答并完成,
|
||
前一个独立 Stop。两端终态分别 completed/cancelled,UI 无残留活动或恢复提示,
|
||
仍为同一个原生 owner。到该轮累计真实提供方调用 **348 次**:
|
||
273 + 首轮远端 UI 21 + 旧隔离安装诊断 6 + 当前隔离安装 48。
|
||
48 次全部完成并交付;更早 273 次中的 4 次不确定仍保留,Prompt 取消不等同于
|
||
模型调用交付不确定。后续审查复验的增量另记,不覆盖这一时间点。
|
||
- 重启修正后的全量回归为 **4,186 通过、67 跳过、1 失败**,唯一失败是
|
||
`ActivityPanel` 的 501 条历史显示测试;该文件单独重跑 **16 项全通过**。
|
||
不将单文件重跑写成全量通过,原全量报告保留。此前 4,171 通过的报告早于这些修正。
|
||
|
||
### 继续验收:共享能力与配置退役审查
|
||
|
||
- OpenCode 生产 factory、真实二进制测试覆盖 2/10 项目,每项目两 Session、两轮原生
|
||
文件读取并逐项目原生 Compact,manager 容量设为 1,仍只启动一个 Server。
|
||
DSH 实际 Host/ACP composition 同样覆盖 2/10 项目、每项目两 Session、两轮原生
|
||
文件读写和平台 Shell,一个 Host。二者使用确定性模型,新增真实提供方调用为 0;
|
||
这是原生组合测试,不是十项目完整 Electron 性能测试。
|
||
- DSH 补充双项目共享组合:原生 Skill、实际 stdio MCP、Host 插件清单、不同尺寸的
|
||
inline 图片和 Execute → Ask 均通过。两项目使用不同 Main ToolProvider 和正确的
|
||
conversation context,Ask 不调用先前 MCP,图片原始字节分别匹配。该文件当前
|
||
**9 通过、3 跳过**;Host 在测试进程内实际运行,不能表述为完整 Utility/UI 能力矩阵。
|
||
- 完整 61 文件复查分别检查复用、质量/兼容来源和效率。没有新增仅服务分支中间形态的
|
||
兼容层;raw ACP 独占和 Continue 单请求 Host 保留其已有契约。
|
||
复查发现重启后的回答/跳过未保存到 remote-authoritative assistant message,以及
|
||
manager reset 后旧 controller 拒绝所属问题的回答。修正复用原消息 `answeredQuestions`
|
||
metadata 和既有 question owner,不新增 schema、恢复日志或重复历史。
|
||
- 真实 UI 复验又确认设置保存入口仍主动取消全部请求,不能以 controller 单测通过
|
||
宣称生产配置切换完整。Runtime 设置、原生定制和能力更新现在只激活/退役配置,
|
||
不批量 abort 或清除待答确认;已接受请求继续使用原配置。用户 Stop、清除数据和
|
||
App 退出的原有取消/分离规则不变。真实 SQLite 的三入口回归覆盖并行恢复、反序回答、
|
||
跳过、重新打开答案和终态;manager reset 回归覆盖旧问题可回答、新工作仍拒绝。
|
||
最新 **152 项 IPC/controller/manager 测试、typecheck、lint 和生产构建通过**;
|
||
这次补修的最终真实 UI 复验及全量回归仍在进行。
|
||
- 后续真实 UI 的设置保存不再取消原生待答 Prompt;一次连接 readiness 超时后,
|
||
重新启动 Desktop 附加同一请求并回答 `KeepYes`,原 owner 未更换,任务 completed,
|
||
原消息的 `answeredQuestions` 已落库。再一次正常退出/重开后,“问题与回答”仍显示
|
||
正确答案和完成状态,截图已检查。该时点累计真实调用 **352 次**,相对 348 新增
|
||
当前 Agent 3 次及误选默认项目的本机 Ask 1 次;后者未使用问题工具,不计问答验收。
|
||
当前 Agent ledger 共 51 次,均 completed 且已交付。正常退出 Desktop 后按已核对的
|
||
隔离 installation 停止 Agent,所属 `/proc` 进程和 active owner 记录均为 0。
|
||
- 复查设置更新的专家团队分支发现,既有调度器会取消剩余专家,但父请求可能用替换后的
|
||
模型继续综合。仅对活动团队父请求保留配置替换取消,普通原生请求不受影响;
|
||
**156 项 IPC/controller/manager/SubagentService 回归通过**。此分支属于 Main 专家
|
||
调度,不是 Agent 原生子代理;远端普通 Prompt 的 `teamMode` 为 false,先前验证的
|
||
SSH 问答路径不改变。
|
||
- 工作区随后出现其他任务的新提交和 Magic Notes API 修改。整仓类型检查曾因其
|
||
`DesktopApi.magicNotes.onChanged` 与 App 测试 mock 不匹配失败,没有覆盖这些并行
|
||
改动。冻结 candidate 的 typecheck、lint、生产构建通过,前后性能对照
|
||
使用该隔离源码,不滚入后来的功能变更;其已带入的按钮位置调整见下节范围说明。
|
||
- 随后完成 baseline/candidate 两个独立生产构建、相同 seed 历史、三次冷启动及
|
||
无新任务十分钟的全 App 对照,结果见下节。驱动校准失败不计性能样本,
|
||
测量期间未并发全量测试;既有 owner-only 数据不替代此结果。
|
||
|
||
### 2026-09-15:前后完整 App 对照与剩余 Runtime 检查
|
||
|
||
对照基线为 `de14a6157a6c34f1e3ef22619eca374a50a83706`。通过隔离源码构建 baseline
|
||
和包含本任务改动的 candidate,使用同一 Windows 机器、同一依赖、同一 seed
|
||
SQLite(四项目、八会话、320 条等量历史消息)和相同工作区 marker。后续其他工作区
|
||
提交不滚入该冻结对照;这里的冷启动是新的 App/profile/Runtime 进程,不清 OS 文件缓存。
|
||
|
||
截图及源码复核发现,candidate 的 `App.tsx` 同时带入了 `fbba2e3` 的工作栏按钮
|
||
移到主题切换按钮旁的调整。用户明确要求保留,工作区及冻结 candidate 均未剔除,
|
||
也不为此补跑。以下结果是**包含该 UI 差异的完整 App 实测对照**,不是严格的
|
||
纯 Runtime 单变量实验;此前“只含本任务改动”的范围描述不准确,现予以更正。
|
||
|
||
- 每组 3 次冷启动,各 55 条请求、110 次确定性 loopback 模型请求。每次冷启动包含
|
||
八会话一轮工具请求和五条热请求,最后一次另加两轮八会话续接。每轮等待八个真实
|
||
Native Prompt 同时到达提供方再释放响应,随后实际原生 `read` 读取各项目 marker。
|
||
全部目录结果正确,无全局 Prompt 串行化。该对照新增真实提供方调用为 **0**;
|
||
自然开发、写入、Shell 和真实模型验收仍以前文证据为准。
|
||
- baseline 稳态为 3 个 OpenCode Server、2 个 DSH Host;三轮分别累计启动 3/3/3 个
|
||
OpenCode 和 4/4/6 个 DSH(包含被动状态临时 Host)。candidate 每轮只启动一个
|
||
OpenCode、一个 DSH;六次 App 正常退出后,本次登记的全部 Runtime 进程均退出。
|
||
- 早期驱动的必填模型字段、Windows 子进程继承输出管道、Runtime 未就绪时点击以及
|
||
读到半份 JSON 报告导致的失败均保留,不纳入以下样本。最终报告原子替换,发送前等待
|
||
实际启用状态并核对 Main 已接收请求;不重放失败/不确定的真实模型请求。
|
||
|
||
| 指标 | baseline,中位数(范围) | candidate,中位数(范围) | 样本口径 |
|
||
| --- | ---: | ---: | --- |
|
||
| 全 App 采样峰值 Private Commit,MiB | 3,543.18(3,485.58–3,589.01) | 2,040.11(1,698.68–2,085.82) | 每组 3 个 App,分别取采样峰值 |
|
||
| Runtime 采样峰值 Private Commit,MiB | 2,843.18(2,831.00–2,854.82) | 1,338.93(1,229.31–1,347.63) | 同上,仅 Runtime 进程 |
|
||
| bootstrap 到首个模型请求到达,ms | 4,519(4,464–4,529) | 3,573(3,519–4,040) | 每组 3 次,包含 UI 启动与操作,不是独立握手计时 |
|
||
| OpenCode 热请求总时长,ms | 225(198–286) | 200(187–308) | 每组 9 次 |
|
||
| OpenCode 首个可见事件,ms | 139(118–201) | 124(102–187) | 文本/推理/工具任一事件,不是模型首字节 |
|
||
| DSH 热请求总时长,ms | 66.5(54–80) | 83(62–104) | 每组 6 次 |
|
||
| DSH 首个可见事件,ms | 32(28–39) | 38(30–45) | 同上 |
|
||
|
||
这批包含上述 UI 差异的样本中,全 App 采样峰值中位数降低 **42.42%**,不能将全部
|
||
差值单独归因于 Runtime 复用。DSH 的热请求中位数反而增加 16.5 ms,
|
||
没有隐去该回退,也没有据此增加未经测量的队列优化。Private Commit 不是独占物理
|
||
RAM,工作集求和会重复统计共享页;5 秒采样不等于捕获了瞬时峰值。两组使用相同
|
||
测试观察代码,数据不是未插桩 App 或生产大库的性能承诺。
|
||
|
||
最后一次各有 **124 个**无新任务空闲样本,覆盖 **610.588 / 610.544 秒**,最大间隔
|
||
5.149 / 5.068 秒。两组模型请求均固定为 58,active Task 为 0,DB 固定
|
||
2,007,040 字节、WAL 固定 4,128,272 字节、事件数固定为 276。
|
||
|
||
| 空闲组 | baseline Private Commit 起止,MiB / CPU 秒 | candidate Private Commit 起止,MiB / CPU 秒 |
|
||
| --- | ---: | ---: |
|
||
| 全部 OpenCode | 2,433.02 → 2,382.73 / 19.359375 | 1,007.88 → 973.12 / 11.609375 |
|
||
| 全部 DSH | 180.00 → 179.19 / 0.09375 | 86.92 → 87.62 / 0 |
|
||
| Main | 211.00 → 200.34 / 4.9375 | 205.33 → 197.70 / 4.4375 |
|
||
| Renderer | 183.32 → 137.40 / 0.265625 | 157.90 → 127.23 / 0.4375 |
|
||
|
||
Session 有意保留;DSH 尾端有 0.70 MiB 增量,不把这一段描述为所有点都下降,
|
||
也不从十分钟数据宣称整个 App 已无泄漏。聚合报告同时保留工作集、堆、句柄和逐进程 CPU。
|
||
原始数据位于忽略目录 `matched-app-WBCdJL/{before,after}-{10,11,12}`,汇总为 `summary.json`;
|
||
这些是本机验证资产,不进入版本库。
|
||
|
||
其后才运行剩余 Runtime 检查,避免干扰对照:
|
||
|
||
- OpenCode 双项目真实 Server 组合通过原生 Skill、真实 stdio MCP 和不同 inline 图片,
|
||
两轮八次 MCP 调用均用请求 ID 核对原 grant 归属,读取结果仍匹配各自目录;十项目
|
||
测试仍通过。DSH 的对应共享组合也通过。四文件合计 **114 通过、4 跳过**,
|
||
跳过的是 3 个显式启用的真实 DSH 模型测试和 1 个真实图像生成测试,不把这些记为通过。
|
||
- 直连模型的会话 release/dispose 与实际 Shell 完整输出分页检查通过:删除目标会话
|
||
缓存并释放对应 ToolProvider;dispose 先释放所有已知会话,再释放 provider。实际命令
|
||
结束后输出可分页,dispose 后句柄失效。没有新增模型进程池、历史字节 LRU 或持久缓存,
|
||
此处也没有做直连模型整体 retained-heap 泄漏证明。
|
||
- Continue 使用实际 1.5.47 包和生产 Utility adapter,3 轮各两个并发请求,另 5 次热请求。
|
||
11 次本机确定性提供方请求全部返回预期内容,11 个请求级 Utility 均退出,真实模型调用
|
||
为 0。准备耗时中位数:冷准备 **333.93 ms**(326.06–381.94),同 adapter 缓存
|
||
**0.0031 ms**(0.0010–0.0054),新 adapter 命中磁盘产物仍 **312.97 ms**
|
||
(276.08–334.63),各 3 次。11 次原生 HTTP ready 中位数 **936.96 ms**
|
||
(925.60–959.27),首个提供方请求从 run 起算 **980 ms**(969–1,013),总时长
|
||
**1,353 ms**(1,314–1,373)。准备在 run 前单独测量,不能把它再说成总时长已包含。
|
||
跨 adapter 重复准备没有消失;本次保留现有检查与缓存,不为约 0.31 秒的准备成本
|
||
修改单 Session Host 或新增常驻池。
|
||
- 最终整仓 `npm test -- --reporter=json --outputFile=<本机证据目录>/full-validation-final.json`
|
||
为 **4,204 通过、67 跳过、0 失败**,耗时约 **733.80 秒**。包括最后加强的
|
||
OpenCode 逐请求图片互斥断言、共享能力组合、设置退役及专家父请求回归;
|
||
先前失败的 `ActivityPanel` 本次在全量中 **16 项通过**。早期失败报告仍保留,
|
||
不将跳过的真实提供方或平台专用测试计为通过。
|
||
- 全量结束后再次运行 `npm run typecheck`、`npm run lint` 和 `git diff --check`,
|
||
全部通过,先前并行 Magic Notes mock 不匹配已不再出现。10 个相关文档的
|
||
**140 个相对文件链接**均可解析,未独立复验标题锚点。全量测试进程及按本次测试
|
||
路径筛选的本机验证进程均已退出;Linux 隔离安装的清理证据见前文。
|
||
- 最终门禁及报告修订没有新增真实提供方调用,累计仍为 **352 次**。按钮位置调整及
|
||
其他并行工作均保留;本次未执行 commit、push、tag 或发布。性能对照仍使用原冻结
|
||
样本,不把整仓后来通过的回归结果描述成已重新测量该版本的性能。
|
||
|
||
验收边界仍需保留:性能对照是 Windows 四项目确定性读取,不是大库自然开发或十项目
|
||
完整 UI 性能报告;十项目为实际 Native composition 测试。未测所有第三方插件的组合,
|
||
未证明整个 App/直连模型无泄漏,macOS/Linux arm64 原生运行仍需可用平台或 CI。
|
||
|
||
### 2026-09-15:追加真实模型复验与资源观察
|
||
|
||
用户要求继续使用真实模型,并监控数据库及内存。此次将 `e1fe1cf` 与当时工作区改动
|
||
冻结到独立源码目录,构建真实 Main/Preload/Renderer,使用新的隔离 profile 和四个专用
|
||
项目,预置 320 条合成历史。按钮位置调整保留;没有把正式用户历史送入测试。
|
||
原始证据位于忽略目录 `.agent-resources/runtime-live-20260915/run-tQ1xtk/`,
|
||
不是 checkout 自带资产。本轮只调整测试驱动,没有修改 Runtime 产品源码。
|
||
|
||
- 独立生产构建通过。冻结快照的类型检查暴露并行附件功能的 App 测试 mock 缺少
|
||
`getFilePath` / `importFiles`,未覆盖或撤销那部分工作;这一失败不被早先整仓通过
|
||
的结果覆盖。初次构建取证脚本误用 Preload 扩展名、同步 esbuild 不支持插件等驱动
|
||
错误均发生在模型调用前,生产构建与 Runtime 未因此修改。
|
||
- 显式启用 DSH 的三个真实模型专项,全部通过:自定义 Header、Ask 下 Main 代理的
|
||
Web Search/Fetch、真实 npm 插件在 Ask 被拒绝且在 Execute 执行。共 **7 次**
|
||
实际模型请求;该次按测试名选择,仅运行这三项,不把其余九项的过滤跳过算作通过。
|
||
- 完整 App 从输入区发出四项目八条开发任务,实际读写模块、添加边界测试并执行
|
||
`node --test`。项目选择器曾因模糊名称匹配到路径中的 `live-2` 而选错项目,
|
||
驱动在发送前被会话身份检查挡住,改用已验证的精确项目文本;没有重复发送已接受任务。
|
||
- 第一轮六条任务完成、两条 DSH 以 `pi-ai stream idle timeout after 300000ms`
|
||
失败。一次未观察到上游响应状态,另一条有 HTTP 200 但任务仍超时,不能把 HTTP 200
|
||
当作交付成功。保留失败与数据库后,正常退出测试 App,将测试转发层改为独立
|
||
`undici.request` 流式转发,再显式重跑这两条,均完成。由于同时重启了 App,
|
||
不能据此断言已经唯一定位到转发器或提供方;本轮未盲目修改 Runtime 来规避失败。
|
||
- 四项目独立执行测试分别 **16、17、18、19 项通过,共 70 项**。每类 Runtime 的
|
||
项目请求存在重叠,使用同组 owner;本轮开发请求重叠峰值为 OpenCode 4、DSH 2。
|
||
两类 Runtime 分批发送,不声称八条同时运行。
|
||
后续真实原生子代理读取模块及测试,父请求执行测试完成;DSH 两个真实慢命令重叠时,
|
||
只 Stop 其中一个,另一项目继续完成,DSH Host PID 未变。
|
||
- 直连与 Continue 从同一完整 App 会话各发出一次无工具短请求,分别持久化
|
||
`LIVE_DIRECT_OK` / `LIVE_CONTINUE_OK`。当前已配置的图像模型另发出一次生成请求,
|
||
实际得到白底蓝色圆形图片并可在生产预览中打开;不是配置检查,也没有读取提供方
|
||
返回的图片 URL。这验证当前配置路径,不冒充运行了绑定指定服务商的可选测试。
|
||
- 此时 App 共 **16 条 Prompt:13 completed、2 failed、1 cancelled**,
|
||
**67 次模型请求**;加上 DSH 专项 7 次,本机新增 **74 次真实调用(73 次文本、
|
||
1 次图像)**。计数包含失败及显式重跑。早期累计 352 次暂增至 426 次,
|
||
后续 Linux 增量另记;本机 HTTP 计数不等于 Agent ledger 的交付证明。
|
||
- 真实子代理的 **153 条事件**,实际保存 **70,668 字节**,等价完整快照
|
||
**495,934 字节**,该事件负载减少 **85.75%**。使用生产 codec 逐条还原及重新编码
|
||
校验通过;6 次工具块 upsert 中无变化重复写入为 **0**,数据库 `quick_check` 为
|
||
`ok`。这是同批事件的编码差额,不是整个数据库文件缩小 85.75%,也没有删历史。
|
||
- 模型结束后连续 **610.857 秒、123 个样本**,最大采样间隔 **5.292 秒**。
|
||
请求数固定为 16,模型调用数固定为 67,活动任务和 streaming 消息为 0;
|
||
DB 固定 **1,765,376 字节**、WAL 固定 **4,140,632 字节**,消息数 355、
|
||
事件数 663、事件 JSON 负载 284,577 字节均不变。
|
||
- 本轮全 App 采样峰值 Private Commit 为 **1,728.79 MiB**,OpenCode + DSH
|
||
合计采样峰值 **997.66 MiB**。没有同负载的旧版真实模型样本,不能把它与前文
|
||
确定性对照相减生成新的“节省百分比”,也不把采样峰值称为瞬时峰值或独占物理 RAM。
|
||
- App 收到正常 quit 后回收了本轮登记的全部 Runtime,OS 核验最终 Main、OpenCode、
|
||
DSH 和 Continue Utility 均已消失。退出探针曾因等待 `will-quit` 误报超时:
|
||
生产实现实际在 `before-quit` 清理后调用 `app.exit(0)`。该驱动失败记录保留,
|
||
后续探针改从独立父进程观察退出,不修改产品退出路径或伪造原始报告中的 phase。
|
||
关闭后 WAL 为 0,DB 为 **3,125,248 字节**,属于正常 checkpoint,不是空闲增长;
|
||
已保存图片内容为 **1,351,526 字节**,不能把图片占用与事件差量节省混为一谈。
|
||
|
||
| 空闲进程 | Private Commit 起止(MiB) | 范围(MiB) | 区间 CPU 秒 | 句柄起止 |
|
||
| --- | ---: | ---: | ---: | ---: |
|
||
| 全 App | 1,345.77 → 1,345.95 | 逐进程样本保留 | 分进程见下 | 分进程见下 |
|
||
| OpenCode | 750.42 → 746.00 | 741.62–750.42 | 5.984375 | 333 → 333 |
|
||
| DSH | 89.86 → 89.86 | 89.86–89.93 | 0.015625 | 364 → 364 |
|
||
| Main | 196.61 → 200.37 | 193.13–205.09 | 5.703125 | 1,137 → 1,137 |
|
||
| Renderer | 120.66 → 121.51 | 120.64–122.67 | 0.15625 | 337 → 335 |
|
||
|
||
Main 堆使用量为 67.27 → 69.44 MiB;Main 与 Renderer 有小幅增量,不能表述为
|
||
“所有进程都下降”。采样包含测试观察器累积记录的分配,这一窗口未见数据库增长或
|
||
Runtime 句柄积累,但不构成整个 App 无泄漏证明。
|
||
|
||
当前源码 Linux 复验使用 `/root/tmp` 下的专用目录。旧 `/tmp` 测试 Node/依赖缓存
|
||
已不存在,初次准备因失效链接失败,未发出模型请求。随后只替换本轮创建的失效链接,
|
||
核验锁定 Node 24.19.0 的 SHA-256,并安装锁定依赖,完成当前源码 Agent/Runtime
|
||
组包、隔离安装及 OpenCode 1.18.29 激活,不修改旧安装或无关 Host 文件。
|
||
|
||
- 两项目各 Ask/Execute 一会话,共四会话使用同一个进程 owner、一个原生 OpenCode PID。
|
||
Ask 实际读取,Execute 实际修改和运行测试,目录 marker 均正确。后续原生子代理
|
||
产生 **497 条**子会话事件,同一 Session 续接完成;两项目独立测试各 **8 项通过**。
|
||
- 两个真实 90 秒慢命令期间,目标 Prompt 明确结算为
|
||
`cancelled / processTree: running`。另一会话经真实 attach 传输断开、
|
||
controller resume 和重新附加后完成,原 Session 与 owner 均保留。
|
||
本轮走生产 SSH/ACP/Agent/模型桥,不是再次运行完整远程 Electron UI 或 Desktop 重启。
|
||
- 共 **7 条 Prompt:6 completed、1 cancelled**,**36 次模型请求全部 completed
|
||
且已交付**,逐 operation 归账。取消 Prompt 不等于模型交付不确定。释放全部 binding,
|
||
等待 65 秒后 owner 为 0;随后停止本轮隔离 Agent,独立 `/proc` 与 owner 表核验均为 0。
|
||
- Host 共 71 次资源快照,未出现采样错误;所属进程私有驻留页合计采样峰值
|
||
**1,033.00 MiB**,其中 OpenCode 峰值 **771.60 MiB**。这是 Linux 私有驻留页,
|
||
不是 Windows Private Commit;也不是 Linux 十分钟空闲或旧新版本对照。
|
||
退出后 semantic-prompts、model-calls、runtime-owners 数据库分别为
|
||
**1,634,304 / 36,864 / 24,576 字节**,WAL 均为 0。
|
||
- 本轮最终新增 **110 次模型请求:109 次文本、1 次图像**,包括本机失败和显式重跑;
|
||
加上此前 352 次,累计 **462 次**。其中本机一次未观察到上游响应状态,不能把全部
|
||
110 次写成成功交付。实际开发项目测试合计 **86 项通过(Windows 70 + Linux 16)**。
|
||
- 收尾时当前工作区 `npm run typecheck`、`npm run lint` 和差异检查通过。
|
||
238 个 Runtime/Agent/远程适配器文件与冻结快照的文本内容一致,原始字节差异来自
|
||
checkout 的 CRLF/LF;Main、Preload、Renderer 入口产物哈希未变化。并行附件测试
|
||
mock 的缺项已在当前工作区消失,不回写冻结快照,也不掩盖其当时的类型检查失败。
|
||
10 个相关文档的 140 个相对文件链接有效,标题锚点未独立复验。
|
||
本轮没有产品源码修复,未再次运行全仓 `npm test`;前文 4,204 项通过的报告
|
||
早于后来的并行附件/窗口改动,不能将其当成这些改动的完整回归结果。
|
||
- 本机命名浏览器会话及所有本轮测试进程均已关闭;保留隔离工作区、数据库、生成图片、
|
||
失败诊断及汇总报告,没有清理正式用户历史,也没有 commit、push、tag 或发布。
|
||
|
||
## 2026-09-14 Runtime 资源调研与方案(未实施)
|
||
|
||
- 按用户要求完成文档与源码调研,方案见
|
||
[Runtime 进程复用技术设计](./runtime-process-reuse-technical-design.md),对应
|
||
FR-RR1–FR-RR6。当前工作仅文档和本机忽略目录内的隔离探针,未修改 Runtime/Agent
|
||
源码、停止用户 Runtime、清理用户数据或准备新发布。
|
||
- 源码基线 `de14a6157a6c34f1e3ef22619eca374a50a83706`,保留此前活动 UI 修复。
|
||
manager/controller、OpenCode、Continue、DeepSeek、直连、远程 ACP、Agent backend /
|
||
owner、模型桥和原生插件均已检查。此前同基线生命周期定向回归为 11 文件、
|
||
346 通过/1 跳过;不是本方案实施后的产品验收。
|
||
- 已安装 0.13.2 的 09:10:12–09:15:12 五分钟只读采样:数据库约增加 2.72 MiB,
|
||
3,367 条新增子代理事件约 1.49 MiB、平均约 465 字节,93 个工具 upsert 中未变化的
|
||
upsert 为 0;App 相关进程 Private Commit 约 3,229–3,866 MiB,CPU 平均约为
|
||
16 核整机的 3.15%。后续一分钟又完成两个任务,不能作为真正空闲或泄漏结论。
|
||
- 两个 OpenCode Server 属于当前 App,启动工作区不同。其中一个原生库 0 Session /
|
||
0 Message、约 527 MiB Private Commit。源码确认按工作区保留实例、清单可启动执行
|
||
Runtime、无时间型空闲回收;没有独立调用轨迹证明该空 Server 最早由清单启动。
|
||
- 首轮两个无真实模型探针中 OpenCode 通过,DSH 驱动误用工具内部 `filePath` 而不是
|
||
原生 schema 的 `file_path`,断言失败。修正驱动参数后两项通过,未调整产品代码。
|
||
- 随后完整三探针最终通过,Vitest 3 passed / 0 failed,39.20 秒:
|
||
- 生产 OpenCode launcher 单次 spawn,两个目录四个原生 Session,文件路由与单会话
|
||
删除后的其他会话存活通过;没有调用生产 `Runtime.run`。
|
||
- 真实 DSH Host composition、Agent factory、文件和 PowerShell 工具,两个不同 cwd
|
||
的 Agent 并行读写各自测试文件;生产控制面拒绝第二工作区也得到断言确认。
|
||
这不是 Electron Utility/ACP 生产多工作区测试。
|
||
- 一个 Windows 原生 `opencode acp`、一条 ACP connection、两个工作区 Session,
|
||
并行完成两个合成 Prompt;`chat.headers` 的 sessionID 与两个 HTTP 请求归属一致。
|
||
尚未经过 Agent backend、生产模型桥、真实工具/子代理或 Linux Host。
|
||
- 本次研究真实模型调用 **0 次**;最终 ACP 探针向本机确定性服务发出 **2 次 HTTP
|
||
请求**。测试服务、原生进程和专用工作区在 finally 中关闭/删除,不操作用户运行中的
|
||
Runtime 或其临时数据库。
|
||
- 复现命令:`npx vitest run --config .agent-resources/runtime-reuse-research-20260914/vitest.config.ts`。
|
||
`probe.test.ts`、`opencode-result.json`、`dsh-result.json`、`acp-result.json` 保留在
|
||
同一忽略目录,仅为本机证据,不作为他人 checkout 后必然存在的测试资产。
|
||
- 未实施项及生产验收见技术设计 P0–P4/V1–V8;本次未进行新的 Linux Host 验证、
|
||
真实模型开发任务或修复前后内存对照,不将原生能力探针描述成修复完成。
|
||
- 文档核验覆盖 10 个改动文档、131 个相对链接和其中 44 个标题锚点,全部通过;
|
||
FR-RR1–FR-RR6 的定义唯一且有验收引用,`git diff --check` 通过。研究用 OpenCode
|
||
二进制剩余进程数为 0。产品源码未改动,因此本轮未重跑全仓 test/typecheck/lint。
|
||
|
||
本页下方 schema 35 段落保留当时的失败与未发布记录。其后已随 Desktop `0.13.2`
|
||
(发布提交 `81ae9e0`)正式交付,Agent `0.11.25` 同期为维护发布;新的进程复用方案
|
||
不包含在这两个已发布版本内。
|
||
|
||
## 2026-09-14 多 Runtime 工具操作摘要
|
||
|
||
显示与事件合并规则见[工具操作摘要](./runtime-interactions.md#工具操作摘要)。Continue、
|
||
DeepSeek Harness 和直连模型已接入共享摘要函数,完成事件缺少输入时保留已有摘要。
|
||
|
||
Windows 完整 App 使用当前生产 Main、Preload、Renderer 和隔离配置,模型为
|
||
`deepseek-v4-flash`。从真实输入区输入并点击发送读取测试文件的请求,校验码只存于
|
||
文件中。三条成功会话都返回正确校验码,工具完成后仍显示路径;原生点击展开可查看
|
||
输入与输出,离开后重新打开会话、重新加载 Renderer 后再次打开均保留摘要和详情。
|
||
六张对话区截图已实际打开审阅。
|
||
|
||
| Runtime | 成功模式 | 提交数(含失败重跑) | 模型 HTTP dispatch | 工具执行 |
|
||
| --- | --- | ---: | ---: | ---: |
|
||
| 直连模型 | Ask | 1 | 3 | 3 |
|
||
| Continue | Execute | 2 | 4 | 3 |
|
||
| DeepSeek Harness | Execute | 3 | 3 | 2 |
|
||
| 合计 | | 6 | 10 | 8 |
|
||
|
||
计数来自 Main 和真实 Utility Host 的 HTTP dispatch,未注入答案或工具事件。Continue
|
||
首轮 Ask 仅提供配置工具,未能读取文件;改用 Execute 成功。DS 前两次因 Windows
|
||
工作区路径写法与 Host `realpath` 比较不一致而返回 ACP `-32602`,均未调用模型;
|
||
同目录改写路径仍复用缓存 Runtime,改用全新规范路径目录后成功。该路径问题随后由
|
||
[DS 工作区路径修复](../deepseek-harness/progress.md#2026-09-14-windows-工作区路径修复)
|
||
单独处理,新增验证计数见该记录,不计入上表。驱动的包解析、
|
||
DOM 定位及卡片比较器失败已记录,修正比较器后的复验没有追加模型请求。
|
||
|
||
本机临时 `runtime-summary-live/report.json` 保留逐次结果和产物哈希;源码基线为
|
||
`c71da4b6ae1d7228ff968d39c63db205caf61339` 加本次工作树改动,Main SHA-256 为
|
||
`2153d72a947ab6f5eab22eab28d7a3f2f86a47740d5223a3e1547f199fa7de84`。
|
||
测试进程、隔离配置、数据库、工作区和构建均已清理,正式配置字节未改变;报告和截图
|
||
保留在本机临时目录,不作为长期可用的仓库资源。请求使用已配置 HTTPS,沿用生产
|
||
证书策略,本轮未验证严格证书校验。未测试 Main 重启或远程 Agent。
|
||
|
||
专项回归 210 项通过、1 项跳过。完整 `npm test` 首轮 4154 项通过、66 项跳过,另有
|
||
6 个 `.agent-resources` 内的本地 `node:test` 文件被 Vitest 误收集导致套件失败。
|
||
使用 `npm test -- --exclude "**/.agent-resources/**"` 完整重跑后,353 个文件通过、
|
||
9 个跳过,4154 项通过、66 项跳过、0 失败,耗时 646.04 秒。`npm run typecheck`、
|
||
`npm run lint` 和 `git diff --check` 通过。
|
||
|
||
## 2026-09-13–14 schema 35 工具重复写入补修(未发布)
|
||
|
||
- 0.13.1 的历史库回收成功,但其真实模型验收限制子代理不使用工具,遗漏了生产工具对象
|
||
的 `undefined` 可选字段。JSON 重读省略这些键,原深比较误判未变化的工具块。正常开发
|
||
任务复现同批 928 条事件的 7,787 次重复工具块写入;仅归一化空字段的对照将负载从
|
||
10,467,622 降为 452,391 字节,逐条还原一致。该对照不是产品修复验收。
|
||
- 当前修复按共享工具 schema 的字段值比较,不序列化整份工具输出进行比较。空字符串、
|
||
输出修订、状态和错误变化仍保留。schema 35 使用同一编码器重整旧完整事件及 schema 34
|
||
已存差量,跳过 JSON 未变化的行;不会删除事件、会话、工具结果或来源字段。
|
||
- 存储缓存仍最多 16 个任务,终态及时移除缓存引用;回滚后按已提交记录重建,其他任务
|
||
不受影响。远程先按来源主键判断是否重放,重复事件不重建已经释放的写入缓存;
|
||
`INSERT OR IGNORE`、冲突校验及消息投影事务仍保留。
|
||
- Windows 当前源码加便携版内置 OpenCode 完成正常 CSV 项目开发,主/子代理实际读取、
|
||
改代码、补测试和执行命令;独立 59 项测试及 CLI 通过。698 条子代理事件共
|
||
368,575 字节,重复工具块为 0,与归一化对照字节数完全相同,每条事件还原一致。
|
||
- 多项目实测使用两个独立 OpenCode 实例、每项目两个会话,两轮共 8 次 Execute。
|
||
第一轮四个开发任务全部完成;第二轮复用会话,主动取消一个正在使用工具的子代理任务,
|
||
其余三个完成并通过测试。2,841 条子代理事件共 1,305,340 字节,重复工具块为 0,
|
||
全部逐条还原一致。每轮结束后缓存任务数、打开的 SSE 响应流均为 0。
|
||
隔离 Main 测试进程在显式 GC 后的堆占用为 12.94 → 12.91 MiB;
|
||
这证明本轮未持续积累,不是整个 Electron UI/Runtime 的 RSS 上限或无限负载保证。
|
||
- 共享 Linux x64 Host 使用当前桌面源码经真实 SSH、Agent、ACP 和模型 gateway 完成
|
||
Ask 与正常工具 Execute。912 条子代理事件共 405,360 字节,重复工具块为 0,
|
||
逐条还原及重复重放通过,远程 Python 项目测试通过。修复位于共享桌面层,不修改 Agent
|
||
或公开事件协议。两次早期测试驱动错误中断操作,修正瞬态事件处理后才完成上述验收;
|
||
不能将早期失败写成产品通过。
|
||
- 本轮实际提供商请求为 121 次:本地开发 26,多会话 79,远程账本 16(成功验收 14,
|
||
早期驱动中断 2 次结果未知、未交付)。本地计数器只记录 HTTP 状态,远程按测试
|
||
request/operation 的 Agent ledger 统计,不记录凭据、正文或请求头。另有先前诊断的
|
||
24 次请求,不计入这 121 次。已核对本轮本机和远程测试工作区无残留 Runtime 进程。
|
||
- 活动 schema 34 库通过 SQLite online backup 取得一致性备份,并校验独立测试副本。
|
||
正常启动升级成功,2,898,984,960 → 607,055,872 字节(2.70 GiB → 578.93 MiB,
|
||
回收 79.06%)。完整比较 424,148 条原事件的内容、ID、时间及来源一致。
|
||
隔离启动未复制模型配置,既有启动修复调整一条项目/会话 Runtime 选择及一个在途任务、
|
||
消息和活动状态,另追加一个状态事件;不是迁移删除或改写历史内容。
|
||
- 同一真实备份的另一个副本直接运行实际构建的升级 Worker,在处理 64 条后取消,
|
||
重启后完成 316,664 条子代理记录;全量事件再次还原一致。全部非事件表逐表内容一致,
|
||
包括 150 个会话、1,915 条消息、914 个任务和 136 个成果;`integrity_check=ok`。
|
||
原运行库和校验备份没有被测试改写。schema 35 副本再次进入实际 Worker 时直接完成,
|
||
进度事件数为 0,不重复整理。
|
||
- 最终专项 99 项、typecheck、lint 及生产开发构建通过。首轮全量产品用例 4,154 通过、
|
||
66 跳过,但 6 个临时 Node 测试项目被 Vitest 错误发现;配置已排除 `.agent-resources/`,
|
||
独立项目仍单独运行自己的 Node 测试。随后显式双 worker 全量为 4,148 通过、66 跳过、
|
||
`App.test.tsx` 6 项时序失败;恢复仓库默认单 worker 后该文件 220 项全部通过,
|
||
未修改 UI 代码。最终默认配置全量为 4,151 通过、66 跳过、3 个问答 UI 测试失败,
|
||
失败项与双 worker 不同;本轮全量回归尚未全绿。随后仅调整测试等待和 mock 隔离的
|
||
尝试仍有不稳定失败,已完整撤回这些额外 UI 测试改动,不把单次重跑通过当作稳定修复。
|
||
存储专项、真实工具任务、并发内存和真实数据迁移证据均通过;UI 测试问题仍需单独处理,
|
||
本次未提交、未发布,也未替换用户正在运行的 0.13.1。
|
||
|
||
## 2026-09-13 Desktop 0.13.1 执行记录去重与大库升级
|
||
|
||
- 实现与兼容边界见[执行记录存储与升级回收](./execution-history-storage.md),通用开发
|
||
要求见[数据库迁移指南](../../development/database-migrations.md)。本机和远程写入共用
|
||
差量编码,不修改 Runtime 公共事件或 Agent 协议;消息投影与来源去重继续保持事务。
|
||
- 真实 portable 旧库先备份并校验 SHA-256,再在独立新版 portable 中启动升级:
|
||
13,094,912 → 12,595,200 字节,schema 33 → 34。659 条消息、52 条会话、133 条成果、
|
||
笔记/待办及模型用量表逐表内容一致,完整性检查通过。
|
||
- 另对真实膨胀库的核验备份副本运行同一 portable 启动入口:
|
||
97,308,667,904 → 594,182,144 字节,即 90.63 GiB → 566.66 MiB,
|
||
实际回收 90.07 GiB(99.39%),freelist 为 0。原库和原 portable 数据库未改写。
|
||
- 全量还原比较 411,981 条事件,所有内容、事件 ID、时间及远程来源字段一致;
|
||
SQLite `integrity_check` 返回 `ok`。1,876 条消息、895 个任务、136 个成果及笔记、
|
||
待办、用量和活动记录等表内容一致。隔离 profile 没有复制模型配置,既有启动修复更新了
|
||
一条项目及一条会话的 Runtime 选择,项目 `updated_at` 随之更新;不是事件迁移修改。
|
||
- 真实升级中通过“退出,稍后继续”停止,再用更新后的 portable 继续并完成。初版 UI
|
||
只按内容高度展开且进度条过窄,用户指出后修复为全高画布和全宽进度条,并显示处理速度;
|
||
实包测得页面高度约 761 CSS px、viewport 761 px,进度条宽约 960 px,截图人工复核通过。
|
||
- 大库采样的读取耗时占约 65%、JSON 解析约 17%。将升级读取缓存由 8 MiB 提至
|
||
64 MiB,保留每批 32 条事务和 SQLite 自动 checkpoint,只在任务结束时截断 WAL。
|
||
相邻 2,048 条转换采样从约 12.0 秒降至 8.8 秒;样本和缓存状态不同,不作为固定加速比。
|
||
未增加同库并行写入,也未关闭事务或同步落盘。
|
||
- 当前源码通过真实本地 OpenCode Execute 和共享 Linux x64 Host 的托管 Ask/Execute。
|
||
本机与远程各观察到 65 条子任务事件,最终过程仍可显示,远程重复事件不重复投影;
|
||
测试资源均位于专用目录。共提交 3 次真实 Prompt,Runtime 上报 4 笔模型用量;
|
||
子代理内部 HTTP 调用未单独计数,不将该上报数称为服务商请求总数。
|
||
- 首轮完整 `npm test` 为 4,114 通过、66 跳过,637.97 秒;后续 8 项新增/修正的专项
|
||
回归通过,`npm run typecheck`、`npm run lint` 通过。生产构建及用户要求的 portable
|
||
实包开发验证通过。0.13.1 版本与发布说明变更后的本地最终验证被用户主动取消,按要求
|
||
不再追加本地测试,候选的最终全量测试、类型、lint 与生产构建由 main CI 判定。
|
||
- 用户批准 0.13.1 中英文说明及仅标准六平台发布;Agent 保持 0.11.24。
|
||
已发布提交 `4937720` 和不可变标签 `v0.13.1`,main CI 与六平台发布通过;
|
||
后续真实工具场景的遗漏及补修见本页 schema 35 记录。
|
||
|
||
## 2026-09-13 原生浏览器与应用浮层修复
|
||
|
||
- 用户在“添加实例”中复现原生网页盖住弹窗。原先只有终端关闭确认释放 viewport,
|
||
现在所有应用 Modal 与相交浮层共用
|
||
[浏览器遮挡机制](./browser-tabs-technical-design.md#4-renderer-与-viewport)。
|
||
新增五个组件回归在修复前全部失败,修复后通过;独立检测器另有十项回归。
|
||
- Windows 当前 Main、Preload、Renderer,通过 `electron-vite dev` 和独立 profile
|
||
启动完整 App,不是旧安装包或仅有 Renderer 的 fixture。浏览器导航到本机合成页后,
|
||
实例管理与项目设置均验证原生视图 `visible → hidden → visible`;视图 ID 不变且未销毁。
|
||
本次不修改 Runtime、Agent、MCP 或远程生产路径。
|
||
- 实例编辑器在浅深主题、目标 1280×800、960×720、720×640、640×420 下完成八组
|
||
几何、关闭按钮命中和原生视图隐藏断言。Windows 缩放产生不足 1 CSS px 的取整差异,
|
||
记录实际尺寸而非把目标尺寸当测量值。PNG 实际审阅包括浅色 1280、720 和深色 640;
|
||
其余尺寸执行程序化检查,不将其描述为全部 PNG 人工审阅。
|
||
- 临时驱动曾出现新浏览器 target 抢占自动化目标、隐藏窗口截图阻塞及严格像素比较
|
||
误判;修正驱动后重新取证,不把这些失败改写为产品修复。最终使用 pinned renderer、
|
||
独立测试窗口和 CDP PNG;原生视图状态单独从 Main 读取,避免网页截图漏掉原生视图。
|
||
- 顺带复现已发布更新说明资源为 136,554 字节,超过原 128 KiB 读取上限。上限提高到
|
||
1 MiB,仍使用有界读取;回归直接读取实际打包资源并确认当前版本可展示、可确认。
|
||
完整 App 已显示并关闭 0.13.0 更新说明,重启后不再次显示。
|
||
- 首轮 `npm test -- --maxWorkers=1`:4,108 通过、66 跳过,608.30 秒;
|
||
`npm run typecheck`、`npm run lint` 通过。补长名称修正后的全量执行为 4,105 通过、
|
||
66 跳过、3 失败,586.51 秒;失败全部位于并行修改中的子代理进度测试。
|
||
未修改这些文件,随后定向重跑 ACP 与 OpenCode 子代理共 66 项全部通过。
|
||
全仓类型与 lint 检查期间先后遇到并行子代理/存储升级改动的缺失字段和未使用导入,
|
||
这些改动不纳入本次提交,不能把早先的通过结果当作当前并行工作区全绿。
|
||
- 两组 Harness 单测补 `onTestFinished` 回收临时目录。最后定向四文件 73 项通过,
|
||
运行前后检查新增残留目录为 0。测试清理不改变 deployed Runtime。
|
||
- 本次修改文档的 66 个相对链接目标存在,暂存差异无空白错误;最终发布仍需对确定的、
|
||
不再变动的候选提交执行发布验证,不能将未提交的并行改动混入候选。
|
||
- 临时脚本、截图和隔离构建按用户要求在提交后清理;这里只保留脱敏结论。知识库布局、
|
||
合成服务保存验证与调用计数见[知识库进度](../knowledge-base/progress.md#2026-09-13-知识库布局与自动名称修复)。
|
||
|
||
## 2026-09-13 OpenCode 事件流关闭顺序修复
|
||
|
||
候选检查中的 lifecycle 失败已稳定复现,4 路并行后 `openEventBodies` 为 3 而不是 0。
|
||
原因与统一修正规则见[复发缺陷记录](../../quality/recurring-defects.md#事件迭代结束前释放底层订阅);
|
||
聊天与 Compact 共用最小迭代器包装,不修改 OpenCode SDK、重试时限或现有断言时限。
|
||
|
||
- 加强既有正常结束与消费方提前返回回归,修复前两项均失败,确认最终 `signal.aborted`
|
||
不能证明关闭顺序正确;修复后通过。
|
||
- `npm test -- src/main/agent/opencode-runtime-lifecycle.test.ts
|
||
src/main/agent/opencode-runtime.test.ts src/main/agent/opencode-runtime-permissions.test.ts
|
||
src/main/agent/opencode-subagent.test.ts`:4 个文件、99 项通过。
|
||
- Windows 当前源码配合真实 OpenCode `1.18.29`、真实 SDK/HTTP MCP 和 loopback 模型通过
|
||
1、4、8 路并行、取消一条而另一条正常结束,以及实际原生 Compact;各阶段打开的 SSE
|
||
响应流均归零。验证是生产 Runtime 入口,不是完整 Electron UI;真实服务商调用 0 次。
|
||
- 已核对远端 `AcpRemoteRuntime` 的 Agent-owned transcript 轮询与
|
||
`AgentOwnedAcpPrompt` 的 ACP stdio 连接,不使用本机 `client.event.subscribe`。本次未改
|
||
Agent、远程桥或协议,不需要远端对应修复,也未将本机测试算作远程 Host 复验。
|
||
- 最终 `npm test`:349 个文件通过、9 个跳过;4,089 项通过、66 项跳过、0 失败,
|
||
耗时 571.43 秒。`npm run release:notes:verify`、`npm run typecheck`、`npm run lint`
|
||
全部通过;下节失败结果保留为修复前记录,不再是当前本地回归结论。
|
||
- 发布说明按 Desktop `v0.12.12`、Agent `agent-v0.11.23` 到最终候选的差异核对,
|
||
不按中间开发提交分别列出修正。用户明确不增加事件流条目,已批准中英文说明保持不变。
|
||
- 本轮未提交、推送或打标签,未运行本地生产构建或打包;远程问答完整生产链路的真实
|
||
服务商验证及候选 CI/原生发布验证仍沿用各自待验收状态,不由本机 SSE 修复代替。
|
||
|
||
## 2026-09-13 Desktop 0.13.0 / Agent 0.11.24 候选检查
|
||
|
||
本轮仅准备本地候选:更新 Desktop 与 Agent 版本、用户批准的中英文发布说明及功能清单,
|
||
远程原生问答按问题修复分类。Agent 发布说明测试允许仅有修复章节,同时检查中英文分类
|
||
一致;未修改 Runtime、Agent 问答或事件流实现。Agent `0.11.24` 需要先升级 Desktop 至
|
||
`0.13.0`,OpenCode 保持 `1.18.29`。
|
||
|
||
- `npm run release:notes:verify`、`npm run typecheck`、`npm run lint`:通过。
|
||
- `npm test`:348 个文件通过、1 个失败、9 个跳过;4,088 项通过、1 项失败、66 项跳过,
|
||
耗时 571.96 秒。唯一失败为 `opencode-runtime-lifecycle.test.ts:120`,并行请求结束后
|
||
`openEventBodies` 期望为 0、实际为 3,轮询未在时限内满足;该现象早已有记录,
|
||
本轮没有完成根因判断,也没有放宽断言或跳过测试。
|
||
- 单独复跑上述 lifecycle 文件及 `agent-release-workflow.test.ts`、
|
||
`release-notes-source.test.ts`、`release-notes-service.test.ts`:发布相关 15 项通过,
|
||
lifecycle 同一断言再次失败。该结果不能替代一次全量通过。
|
||
- 更早的一次全量运行在调整 Agent 发布说明章节断言前主动停止,未取得汇总,不计为通过。
|
||
- 候选版本一致性、历史 Desktop 发布说明未改动、48 个 Markdown 相对链接目标和
|
||
`git diff --check` 已通过。
|
||
- 本轮真实模型验证调用 0 次,未重跑真实 Host;既有 SSH/确定性模型证据见下文,
|
||
不将其扩写为完整生产 Main/Preload 配合真实服务商的验收。
|
||
- 未提交、推送或创建标签,未运行本地生产构建、打包或 LoongArch 预览。
|
||
全量测试失败、完整远程生产链路及候选 CI/原生包验证仍未解决,候选不标记为可发布。
|
||
|
||
## 2026-09-13 SSH 问答 UI 复验与取消后续发
|
||
|
||
在真实 Electron 窗口中使用当前 `App`、入口样式和主题函数,经测试 IPC 接入生产
|
||
`createManagedRemoteAcpRuntime`。远端使用共享 Linux x64 Host、真实 SSH attach、当前源码
|
||
Agent、原生 OpenCode 和生产模型桥;模型响应来自远端 loopback 确定性服务。配置、项目、
|
||
队列和存储 API 复用 App 测试 fixture,因此本次证据范围为 App Renderer 到真实 SSH
|
||
Runtime,未覆盖完整生产 Main/Preload、生产数据库持久化、发布安装或重启恢复。
|
||
|
||
窗口测试发现待答期间取消后,同一对话立即发送会报
|
||
`Active prompt operation identity cannot change before terminalization`。Agent 取消分支
|
||
原先只写语义记录,重复终态写入失败后未留下可核对的操作终态;Desktop 也保留了旧
|
||
binding。修复复用 Agent 的异常终态记录方法,并在 Desktop 显式取消后核对终态、关闭
|
||
已终结 binding 和释放会话通道。新增两项回归验证 Agent 取消核对及同一对话续发。
|
||
|
||
已通过的 UI 场景:父子问题同时待答、重复事件不丢草稿、自由文本回答、选项回答、注入
|
||
一次回复失败后原输入重试、跳过、待答期间取消、取消后在同一对话发出新请求并正常完成。
|
||
鼠标和输入使用 Electron 原生输入 API。重复问题和回复失败由驱动注入,其余问题、工具
|
||
进展及完成事件来自真实远端 Runtime;驱动消费内部 checkpoint,并将取消映射为公开
|
||
`error/status=cancelled` 事件,不把内部 Runtime 事件直接送给 Renderer。
|
||
|
||
浅深主题各检查四组窗口尺寸,问题表单无横向溢出、草稿保留,提交按钮可滚动到可见位置。
|
||
短窗口需纵向滚动查看问题与输入,未宣称整张卡片同时可见。检查目标为 1280×800、
|
||
960×720、720×640、640×420,Windows 175% 缩放下实际 CSS 内容区各多 1 像素。
|
||
临时驱动、JSON 测试报告、各轮日志及 PNG 保留在批准临时目录,使用
|
||
`question-ui-*`、`remote-question-*` 和 `question-validation-*` 文件名前缀;驱动按
|
||
[Electron UI 自动化规范](../../quality/electron-ui-automation.md)的现有启动方法重建,
|
||
不是仓库通用 UI runner。SSH 测试结束后停止专属 daemon 并清理远端专属目录和上传文件。
|
||
|
||
复现时在批准临时目录执行 `node question-ui-build.cjs`、
|
||
`node remote-question-build.cjs`,随后设置 `GOODBUDDY_QUESTION_UI=1` 并执行
|
||
`node remote-question-run.cjs`。脚本依赖本机既有加密 Host 配置和 Host 上的测试 Node
|
||
依赖目录;不得将这些本机条件当作新环境已经满足。早期驱动的内部事件转发、原生输入
|
||
等待和跨轮模型结果判断错误均已修正;它们与实际取消续发缺陷分别记录,未将失败轮次
|
||
改记为通过。首轮窗口退出过早,未取得完整模型夹具计数,历史夹具请求累计数不完整;
|
||
外部模型调用为 0。
|
||
|
||
最终 SSH/UI 一轮完成 4 次输入区提交、2 次回答和 1 次跳过,收到 4 个原生问题,取消
|
||
核对结果为 `terminal/cancelled/processTree=empty`,随后新请求完成。该轮模型夹具请求
|
||
精确为 7 次,外部模型调用 0 次,Renderer 控制台错误 0 条,驱动退出码 0。最终定向
|
||
回归分两条命令执行:`npm exec vitest run src/agent-daemon/runtime-acp-backend.test.ts
|
||
src/main/agent/acp-remote-runtime.test.ts` 为 96 项通过;
|
||
`npm exec vitest run src/agent-daemon/remote-question-binary.test.ts
|
||
src/agent-daemon/opencode-subagent-plugin.test.ts src/agent-daemon/model-bridge.test.ts
|
||
src/main/remote-agent/protocol-remote-runtime-channel.test.ts
|
||
src/agent-daemon/runtime-composition.test.ts src/main/ipc.test.ts` 为 179 项通过、5 项跳过。
|
||
`npm run typecheck`、`npm run lint` 和 `git diff --check` 通过。
|
||
|
||
首轮默认并行 `npm test` 的打包测试超时,整轮随后被 120 秒工具时限中断;单 worker
|
||
重跑为 4,084 项通过、66 项跳过,耗时 626,816 毫秒。此结果早于本节取消修复,
|
||
不作为最终源码全量结果。
|
||
|
||
取消修复后的全量命令为 `node node_modules/vitest/vitest.mjs run --maxWorkers=1
|
||
--reporter=json --outputFile=<批准临时目录>/question-validation-final.json`,覆盖 358 份
|
||
测试文件,结果为 4,087 项通过、1 项失败、66 项跳过,监督进程记录耗时 617,138 毫秒、
|
||
退出码 1。唯一失败是 `tests/agent-package.test.ts:372` 的大清单安装用例,耗时
|
||
63,366 毫秒,超过该用例 60 秒上限。随后
|
||
`npm exec vitest run tests/agent-package.test.ts -- --maxWorkers=1` 单独复跑为
|
||
22 项通过、1 项跳过,整文件耗时 60.08 秒;没有修改该打包测试或放宽超时。
|
||
全量失败记录保留,不能将分次复跑结果写成单轮全绿。
|
||
|
||
最终 UI 原始日志为 `question-ui-1789278503920.log`,8 张待答截图为
|
||
`question-ui-{light,dark}-{1280,960,720,640}.png`,另有完成截图
|
||
`question-ui-success.png`。已逐张打开待答 PNG 审阅字体、字段、按钮、焦点和短窗口
|
||
滚动位置;未发现问题卡片遮挡或按钮不可达。尺寸切换等待 CSS 过渡结束后再截图,
|
||
窗口使用独立临时 session partition。当前证据不覆盖全键盘导航或正式 profile 的清理。
|
||
|
||
## 2026-09-13 托管 SSH 原生问答
|
||
|
||
- 当前源码支持前台托管 SSH OpenCode 的父、子孙会话原生问题、回答和拒答,复用已有
|
||
Renderer 队列与 Task 归属。问题来源为原生 `question.asked`;模型正文和普通工具活动
|
||
不生成问答表单。协议、身份与生命周期规则见
|
||
[远程主机技术设计](../remote-host/technical-design.md#acp-与断线)。
|
||
- 新增 `remote-question-binary.test.ts`,使用真实 OpenCode `1.18.29` ACP 进程、生产插件、
|
||
Agent Prompt owner 和 loopback 模型夹具,覆盖父问题、Task 子问题、拒答、取消、
|
||
跨 binding 回答拒绝、迟到回答拒绝,以及临时回复能力不进入语义记录。
|
||
插件测试另覆盖孙会话归属、并发重复事件、HTTP 路径认证、原生待答列表校验和端口关闭;
|
||
Runtime 测试覆盖已 ACK 记录后的待答补发、回复失败重试与已回答历史去重。
|
||
- 共享 Linux x64 Host 使用既有加密凭据和固定 Host Key,经真实 SSH attach 启动当前源码
|
||
的隔离 Agent。生产 `createManagedRemoteAcpRuntime` 入口完成 Ask、Execute 并行父子
|
||
问答、拒答和待答期间取消;两个并行问题在首次回答前均到达 Desktop Runtime,子问题
|
||
带 Task 归属,回答后原生 Task 和父轮次正常完成。拒答结束原生轮次,取消后迟到回答
|
||
明确失败。最终一轮 7 次确定性模型夹具请求,外部模型调用 0 次;测试 daemon 停止,
|
||
测试目录与上传文件已清理,未修改 Host 原有 Runtime registry。
|
||
- 最终定向回归:11 份测试文件,219 项通过、5 项平台跳过,包含 Agent、模型桥、ACP
|
||
Runtime、认证控制通道及托管入口测试。`npm run typecheck`、`npm run lint` 通过。
|
||
本轮全量 `npm test -- --reporter=json --outputFile=<临时报告>` 为 4,081 项通过、
|
||
0 项失败、66 项跳过;之后的插件身份与并发去重补充由最终定向回归和 Host 复测覆盖。
|
||
- 本节早期验证未操作 Electron 窗口、重装共享 Agent 或模拟整机重启;问答队列的界面行为由
|
||
既有 App/ChatTimeline 测试覆盖。同一存活 Prompt 的待答补发由 Runtime 回归验证,
|
||
不把它描述成 Agent 进程重启后的问题恢复。旧 Agent 和任意第三方 ACP 服务的范围见
|
||
[Runtime 交互边界](./runtime-interactions.md)。
|
||
|
||
## 2026-09-13 并行提问顺序回答
|
||
|
||
- 修复同一前台请求的后续提问覆盖未回答问题:Renderer 按 ID 保存待答队列,逐次显示、
|
||
回答和跳过,保留失败重试输入;运行中快照刷新保留队列,终态清理全部待答项。
|
||
交互和归属限制见 [Runtime 交互边界](./runtime-interactions.md#运行与失败)。
|
||
- 本机 SDK 使用已收到的 Task 子会话元数据传递可选 `childTaskId`;Task 卡片显示待答状态,
|
||
展开后可定位并聚焦队首表单。没有已知 Task 关联的问题仍能回答。
|
||
- 六份相关测试文件共 346 项通过:`App.test.tsx`、`ChatTimeline.test.tsx`、
|
||
`conversation-activity.test.ts`、`opencode-runtime.test.ts`、
|
||
`opencode-runtime-permissions.test.ts`、`opencode-runtime-lifecycle.test.ts`。
|
||
覆盖并发到达、重复 ID、草稿保留、提交失败、队列推进、快照刷新及终态与回复竞态。
|
||
- 真实本机 OpenCode 二进制配合 loopback 模型服务验证两次原生提问均在首次回答前到达,
|
||
随后分别回传并完成请求;同时保留 Task 文件读取和 Ask 工具限制验证。该用例每轮
|
||
6 次 loopback 模型请求,外部模型调用 0 次。完整桌面点击路径由 App 组件测试覆盖,
|
||
本轮未手动操作 Electron 窗口。
|
||
- 首次 `npm test` 达到工具 200 秒上限;后台重跑 `npm test -- --reporter=verbose` 完成,
|
||
348 份测试文件通过、9 份跳过,4,069 项通过、66 项跳过,耗时 572.20 秒。
|
||
随后补充已回答 ID 的去重必须先于任务状态更新,最终 18 项问答及活动相关回归通过。
|
||
- 独立评审补充同一 React 批次首次两次收到相同 ID 的回归:修复前显示两个待答项。
|
||
在消息函数式更新器内复核待答和已回答 ID,重复事件直接返回原消息,保留状态;外层
|
||
去重仍阻止重复事件改写任务状态。修复后 19 项定向回归、typecheck 和完整 lint 通过。
|
||
- 最终 App 全文件复跑为 217 项通过、1 项失败;失败项为并行开发中的外部知识绑定测试
|
||
`adds a new external binding to the current selection without re-enabling an excluded library`,
|
||
“添加知识库”按钮未启用,定向复跑仍失败。本次未修改该测试或知识绑定逻辑。
|
||
`npm run typecheck` 与差异空白检查通过;早期完整 lint 通过,最终完整 lint 扫到并行
|
||
工作新增的 `.kb-app-live` 产物而失败。保持产物原样,使用
|
||
`npm run lint -- --ignore-pattern ".kb-app-live/**" --ignore-pattern ".kb-app-live*.cjs" --ignore-pattern ".kb-app-live*.ts"`
|
||
复跑通过。
|
||
- 远程 `AcpRemoteRuntime` 仅接入权限请求,尚无业务问答桥;本次未修改 Agent、ACP
|
||
传输、共享子任务进度适配器或 SSE 订阅,不将本机问答验证算作远程覆盖。
|
||
|
||
## 2026-09-13 浏览器租用标签页关闭与显式恢复
|
||
|
||
- 更新 `tests/browser-tabs-electron-e2e.ts`,移除两处租用期间拒绝关闭的旧断言。
|
||
当前行为见 [Agent 与 MCP 路由](./browser-tabs-technical-design.md#6-agent-与-mcp-路由)
|
||
和 [浏览器需求](./prd.md#77-浏览器)。同步修改 BrowserService、IPC、Gateway 和直连模型工具。
|
||
- Windows 真实 Electron/Chromium 与 loopback HTTP/MCP 验证通过:关闭已物化的预留页和
|
||
已租用主标签页,等待原 WebContents 的 `destroyed` 事件,确认租约结束而请求信号未取消。
|
||
同一 token 和 MCP session 仍可列出工具;旧目标快照返回关闭提示且不创建页面。
|
||
显式 `browser_navigate` 创建不同身份的专用替代页,后续 MCP 快照读取该页。
|
||
- 同 Conversation 的 sibling 仅在主标签页关闭后取得 `primary` 标记,页面 URL、导航状态、
|
||
时间戳、工作栏身份和 Cookie 内容保持不变;另一 Conversation 的页面与可见 viewport
|
||
保持不变。撤销 capability 后完成替代页、同级页和 Context 清理。
|
||
- 已先检查 runner:esbuild 输出临时 CJS,启动真实 Electron,子进程上限 120 秒,结束后
|
||
删除临时 bundle。`node build/run-browser-tabs-electron-e2e.cjs` 最终退出码 0;
|
||
前三轮分别修正测试对销毁事件时序、服务旧 ID 错误文案和 sibling 主标签标记的假设。
|
||
测试文件 ESLint 与限定文件的 `git diff --check` 通过。
|
||
- 覆盖边界:本轮通过 Main BrowserService 和真实 MCP transport 操作页面,未点击完整
|
||
Renderer/Preload 关闭入口,未注入执行中的工具取消,也未运行直连模型循环或其他共享工具。
|
||
浏览器、Gateway、直连 Provider、Model Runtime 和 IPC 回归共 359 项通过、1 项跳过,
|
||
包括执行中关闭、请求继续完成和其他工具继续可用。全库 typecheck、lint 和 diff 检查通过。
|
||
全量 `npm test` 在 Agent 离线依赖安装用例失败后达到 200 秒执行上限;无外部模型调用。
|
||
- 本轮未修改 Agent、桥接或 Runtime 产品源码,也未连接远程 Host。远程调用若进入同一桌面
|
||
Gateway,会使用上述服务端路由;远端 Runtime 到桌面的实际传输、取消传播及恢复仍需真实
|
||
Host 验证,本记录不将本机 loopback 结果算作远程覆盖。
|
||
|
||
## 2026-09-12 浏览器刷新与关闭后的错误清理
|
||
|
||
- 按 [浏览器工具栏规则](./prd.md#77-浏览器) 修复空白标签页允许刷新的问题;
|
||
刷新需要 Main 的已提交 URL,地址草稿不启用刷新,首次导航仍可停止加载。
|
||
- 侧栏操作错误在切换面板、关闭当前页签或收起工作栏后清除;旧面板的异步失败不再回写。
|
||
作用域实现见 [浏览器多实例技术设计](./browser-tabs-technical-design.md#4-renderer-与-viewport)。
|
||
- Sidebar 回归 38 项、App 浏览器筛选回归 5 项、BrowserService 回归 43 项通过。
|
||
`node build/run-browser-tabs-electron-e2e.cjs` 通过,验证真实空白页、导航、页面隔离和关闭;
|
||
该脚本不覆盖 Renderer 提示显示,提示清理由组件测试验证,本轮未手动操作完整桌面 UI。
|
||
- `npm run typecheck` 和两份修改源码的 ESLint 检查通过。全量 `npm test` 在 Agent
|
||
离线依赖清单用例超时后,整轮达到 200 秒执行上限;包含完整 App 测试的补跑也达到该上限。
|
||
`npm run lint` 被工作区原有未跟踪的 `application-tool-navigation/navigation-demo.js`
|
||
中 27 项浏览器全局变量错误阻断,未修改该文件,不将整库校验记为全绿。
|
||
- 本轮仅修改桌面 Renderer 控件与提示状态,未改 BrowserService、Runtime、Agent 或远程协议;
|
||
不需要单独的远程实现。无外部模型调用。
|
||
|
||
## 2026-09-10 提交后保留问答
|
||
|
||
- 桌面端在提交成功后保留结构化问答回顾,支持多轮回答、跳过及本地会话重新加载;
|
||
交互规则见 [Runtime 交互边界](./runtime-interactions.md#运行与失败)。
|
||
- App 回归覆盖提交与重载、下一轮问题提前到达、终态先于提交返回、提交失败;数据库
|
||
回归覆盖完整替换、增量保存、关闭重开、多选及超过 1,000 字符的自定义答案。
|
||
- `npm test`:3,900 项通过、66 项跳过,Agent 离线依赖清单测试在 60 秒超时;
|
||
该项独立复跑通过(58.33 秒)。`npm run typecheck`、`npm run lint` 与差异空白检查通过。
|
||
- 本轮未手动运行真实 OpenCode 问答会话,外部模型调用 0 次。修改仅涉及桌面端展示与
|
||
本地保存,不改变 Runtime 回传协议或 Agent 路径,不新增远程 ACP 问答能力。
|
||
|
||
## 2026-09-10 Git 历史测试夹具修复
|
||
|
||
- 桌面候选 `877cf58` 的 CI 在四项工作区测试准备 Git 提交时因缺少作者身份失败。
|
||
`c037d7f` 移除测试身份后引入了机器配置依赖;本机已有身份使该问题未在本地暴露。
|
||
- 测试现在把已暂存的 tree 写入固定 Git commit 对象,并仅更新临时仓库的分支引用,
|
||
不调用 `git commit`,不修改或覆盖任何 Git 身份配置。历史、重命名差异、分页和脏文件
|
||
分支冲突仍由真实 Git 与生产 `manageWorkspace` 验证,不用 mock 或跳过用例替代。
|
||
- 新增夹具自检确认 `git fsck --strict` 通过、父提交链有效、未暂存内容保持不变且仓库配置未改。
|
||
聚焦测试 11 项通过、2 项因当前文件系统大小写不敏感而跳过;无身份 Runner 的验证待新候选 CI。
|
||
- 完整 `npm test` 为 3845 项通过、66 项跳过、1 项未修改的活动列表测试超时;
|
||
随后 `ActivityPanel.test.tsx` 的 16 项独立复跑全部通过,未放宽时限或删除断言。
|
||
`npm run release:notes:verify`、`npm run typecheck`、`npm run lint` 通过。
|
||
未将这次本地整库结果记为全绿,发布仍以新候选的 CI 校验和生产构建通过为前提。
|
||
- 本轮只改测试和验证记录,产品功能、Agent 源码及已批准的双语发布说明不变,无外部模型调用。
|
||
|
||
## 2026-09-10 工作区布局与分支输入样式
|
||
|
||
- 按 [FR-W1、FR-W4](./prd.md#76-工作区) 将视图切换和刷新合并到顶部行,
|
||
文件与 Git 工具按视图显示;移除根目录的孤立图标及空导航行,子目录保留文字路径导航。
|
||
分支搜索复用共享 `field`,面板限宽、分支列表限高滚动,创建按钮使用紧凑次操作。
|
||
- 新增布局、子目录返回、焦点恢复、分支搜索/切换/创建回归;工作区、设置界面、设置存储、
|
||
IPC 和 Sidebar 五个测试文件共 354 项通过。另确认安全与数据的默认 `toolApproval` 为
|
||
`always`,对应“Execute 自动授权已启用的工具”;已有明确保存的禁止策略仍保留。
|
||
本轮没有修改授权策略或默认值。
|
||
- 当前构建的 Windows Electron 使用独立 profile 和临时 Git 项目,实际 App → Preload →
|
||
Main 路径通过分支搜索、切换、创建和子目录新建文件;磁盘与 Git 分支结果均确认。
|
||
文件/Git 切换保留浏览目录,返回根目录后导航行移除、焦点回到刷新;Escape 收起分支面板并恢复焦点。
|
||
真实安全与数据页面的默认选中项也确认为自动授权。
|
||
- 浅色与深色下,将实际工作栏布局宽度设为 300、420、650px 后均无工作区横向溢出。
|
||
输入框为共享 13px 正文、标签 11px,分支面板最大 360px;15 个分支时列表可在 240px 内滚动。
|
||
这些是布局检查,不作为分栏拖拽或原生浏览器鼠标交互的验证。
|
||
- `npm run build:bundle`、`npm run typecheck`、`npm run lint` 通过。
|
||
整库 `npm test` 为 3843 项通过、1 项失败、66 项跳过;失败项是未修改的
|
||
`opencode-runtime-lifecycle.test.ts` 事件流关闭时序断言,单独复跑通过。
|
||
未再次运行整库,不将此结果记为整库全绿。
|
||
- 本轮产品改动仅为共享 Renderer 工作区布局,未改 Main/Agent 的工作区命令、
|
||
desktop-to-Agent 协议或 Runtime 执行逻辑;远程项目继续使用同一组件和既有回调,
|
||
本轮未做新的 Host 实测。无外部模型调用,所属测试应用、浏览器会话和调试监听已关闭。
|
||
|
||
## 2026-09-10 提交审查修复
|
||
|
||
- [FR-W3、FR-W6](./prd.md#76-工作区):同一目录项可仅修改大小写,仍拒绝覆盖其他文件、
|
||
目录和硬链接目录项;提交 Diff 同时使用重命名前后路径;分支后台刷新不再使历史请求
|
||
遗留 busy;自动目录刷新包含当前浏览目录并去重。
|
||
- 浏览器请求仅预留目标身份,首次导航才创建实际资源;Main 状态携带工作栏实例身份,
|
||
Renderer 直接绑定同一页面,停止或回收后清除旧绑定。跨会话显式选择不会被应用类型
|
||
同步覆盖,终端关闭确认期间释放原生浏览器 viewport。规则以
|
||
[浏览器多实例技术设计](./browser-tabs-technical-design.md) 为准。
|
||
- 删除普通浏览器操作的自动截图、固定等待、重试及 JPEG 状态缓存/IPC 字段,保留显式截图。
|
||
- 整合复核补齐现有 32 页签容量处理与 Harness 代理的已发现工具复用。新增容量回归验证
|
||
满额时布局仍有效、页面保留,关闭一项后显示原页面;Harness 回归验证发现接口后续失败时
|
||
已知工具调用不再触发发现。相关三文件 66 项通过,最新 typecheck 与 lint 通过。
|
||
- 工作区聚焦测试 43 项通过、2 项需大小写敏感文件系统而跳过;IPC 与 Sidebar 聚焦回归
|
||
132 项通过。随后新增的 Ask 指令、继承 Runtime 用量持久化及计划模式 App 场景,3 项通过。
|
||
- 扩展真实 Electron/MCP E2E 在独立临时 profile 通过:四个未使用的请求预留不创建会话、
|
||
WebContents 或 UI 事件;首次 MCP 导航物化相同 Tab/工作栏身份,恢复不额外创建页面,
|
||
并验证独立页面、共享 Cookie、当时的请求租约关闭保护和清理;关闭保护已于 2026-09-13 移除。
|
||
- 当前源码的共享 Linux x64 Host 验证已通过,覆盖工作区目标保护和重命名/Git Diff,
|
||
并通过桌面托管 ACP → 隔离 Agent → OpenCode 完成 Ask/Execute 和继承 Runtime 指标持久化;
|
||
该组共 3 次真实模型调用,清理后无所属进程残留。完整记录见
|
||
[远程 Host 开发验证](../remote-host/technical-design.md#agent-开发期间的真实-host-验证)。
|
||
- 最终整库 `npm test` 为 341 个文件通过、9 个文件跳过,3839 项通过、66 项按平台或手动
|
||
条件跳过、0 失败;`npm run typecheck`、`npm run lint`、开发期 `npm run build` 和
|
||
`git diff --check` 通过,19 份修改 Markdown 的相对链接目标检查通过。
|
||
先前整合中的一轮为 3823 项通过、6 项失败、66 项跳过,另有被移动的测试路径加载失败,
|
||
不作为最终结果;源码稳定后完整重跑得到上述全绿结果。
|
||
- 原文档解析焦点回归改为等待 Modal 的焦点效果,保留焦点与背景隔离断言,没有改动产品逻辑。
|
||
- Windows 独立 Electron profile 的完整 App → Preload → Main UI 验证通过;最终复测使用
|
||
本轮最终开发构建。启用浏览器后普通 Execute 没有创建原生浏览器视图,工具导航只创建
|
||
一张同时显示在工作栏的页面,跨会话选择保留原页面与 viewport。
|
||
- 实际终端连通后,从浏览器关闭该终端可正常显示确认并操作按钮;原生视图可见性按
|
||
可见 → 确认时隐藏 → 取消后可见变化,终端关闭清理完成。无效地址 `http://` 被拒绝后,
|
||
原控件可重试有效地址并关闭页面;关闭端口返回了过滤代理错误页,因此该 UI 场景不作为
|
||
Chromium `loadURL` 拒绝的实机证据。服务与 Renderer 释放绑定回归另有自动测试覆盖。
|
||
- 桌面使用确定性 loopback 模型服务驱动真实生产路径,共 24 次本地 completion 请求,
|
||
未发出外部模型请求;可选真实 Provider 探针没有找到已加密保存的 OpenAI 兼容文本连接,
|
||
未据此宣称桌面真实模型验收通过。Ask 与编程 Subagent 的桌面结果见
|
||
[直连模型验收记录](../direct-model-agent/progress.md#2026-09-10-提交审查后的桌面-ui-验收)。
|
||
测试应用与具名浏览器会话已退出,所属 Electron/Node 进程及 fixture 监听端口均为 0;
|
||
临时截图和隔离 profile 保留在本机测试目录,不进入仓库。
|
||
|
||
## 2026-09-16 任务卡内审批
|
||
|
||
- 任务中心按 [Task Center 交互规则](../task-and-job/task-center-prd.md#5-交互) 展示卡内审批,
|
||
未关联审批保留处理入口;没有审批时不渲染空审批区域。
|
||
- 当前定时运行从队列 `taskId` 记录到 `ActiveRun`,审批事件再写入消息的临时审批数据;
|
||
历史消息使用明确的 `message.task.id`。Sidebar 按任务 ID 匹配当前范围内顶层任务,
|
||
并核对会话 ID 和项目 ID,不按会话、标题、时间或计划猜测运行归属。
|
||
- `RightAssistantSidebar.resize.test.tsx` 的 54 项测试通过,覆盖项目范围、状态筛选、
|
||
卡内处理、无审批、普通会话审批及关联不一致。App 使用 `-t "approval|scheduled instructions"`
|
||
定向运行的 14 项测试通过,验证历史与当前定时审批的映射、允许/拒绝接口调用及成功移除。
|
||
- `npm run typecheck`、`npm run lint` 通过。本次仅修改 Renderer 展示与临时关联数据,
|
||
本机和远程审批继续使用原有接口;未改 Main、Agent 或存储协议。未进行真实 Electron
|
||
窗口和模型调用验收;按本次要求未运行全量测试及无关数据库迁移测试。
|
||
|
||
## 2026-09-16 任务中心范围简化
|
||
|
||
- 任务中心仅保留“当前项目”和“所有项目”;无项目任务在后者中标注“未绑定项目”。具体规则见
|
||
[Task Center 范围](../task-and-job/task-center-prd.md#4-范围)。
|
||
- Renderer 将旧布局中的 `global` 恢复为 `all-projects` 并保存新值;共享解析契约、后端与任务
|
||
数据不变。App 仍只向任务中心传入 schedule 来源的顶层任务。
|
||
- `npx vitest run src/renderer/src/RightAssistantSidebar.resize.test.tsx src/shared/workbar-contracts.test.ts`
|
||
通过 60 项;`npm run typecheck` 和 `npm run lint` 通过。未进行真实 Electron 窗口验收。
|
||
- `npm test` 在 200 秒后超时,未取得整库结果;单独复跑 `heartbeat-database.test.ts` 为 6 项通过、
|
||
2 项失败,均在未修改的数据库迁移代码中报 `duplicate column name: pinned`。
|
||
|
||
## 2026-09-10 固定基础页签与浏览器多实例
|
||
|
||
- 工作栏注册表已分别声明实例策略、默认上下文、默认打开、必须存在、可关闭和排序属性。
|
||
任务中心与工作区保持默认存在且不可关闭;浏览器改为当前 Conversation 上下文的多实例。
|
||
布局加载按 `required` 补回缺失的基础页签,并修复失效活动实例。
|
||
- 任务中心增加“当前项目”“全局任务”“全部项目”范围,默认跟随活动项目;任务和审批按
|
||
Conversation 所属项目过滤,范围模式随工作栏布局持久化。范围选项已于 2026-09-16 简化,见上方记录。
|
||
- 浏览器服务已拆分 Conversation Context 与 Browser Tab。每个 Tab 拥有独立页面、Driver、
|
||
操作队列、状态和元素引用空间,同一 Conversation 的 Tab 共享 partition、代理和 Cookie。
|
||
- Renderer 使用工作栏实例 UUID 原子创建或恢复 Browser Tab,并以 UUID viewport token 防止
|
||
延迟 cleanup 隐藏新活动 Tab。关闭单个实例只释放对应 Tab。
|
||
- 直连模型和请求级 MCP capability 在请求开始时优先绑定可见 Tab,其次绑定 primary Tab,
|
||
并持有使用租约。当时绑定 Tab 拒绝关闭,该行为已于 2026-09-13 改为允许关闭和显式导航恢复;工具参数未增加模型可见
|
||
`tabId`,已有浏览器工具 schema 保持不变。
|
||
- 聚焦回归命令覆盖 Shared、BrowserService、Electron Session、IPC、Preload、MCP、Renderer
|
||
和 Workbar,13 个测试文件共 453 项通过;`npm run lint` 与 Web TypeScript 检查通过。
|
||
- `node build/run-browser-tabs-electron-e2e.cjs` 通过。该测试启动真实 Electron/Chromium 和本地
|
||
HTTP 页面,创建两个 `WebContentsView`,验证页面隔离、同 Conversation Cookie 共享、真实
|
||
loopback MCP 的固定 Tab 导航与快照、当时的使用租约关闭保护,以及单 Tab 和最终 Context 清理。
|
||
- `npm run typecheck`、`npm run lint`、`npm run build:bundle` 和 `git diff --check` 通过。
|
||
- 本轮整库 `npm test` 为 3686 项通过、61 项跳过、4 项失败。失败位于 portable/release 的
|
||
ASAR 元数据 fixture、Runtime 版本探测和 DeepSeek Harness 的本地 MCP fixture;定向复跑仍
|
||
失败。本次工作栏、浏览器、IPC 和 MCP 聚焦回归均通过,不将整库结果记为通过。
|
||
|
||
## 2026-09-09 移动目录选择与 Git 控件修正
|
||
|
||
- 本轮在已有文件管理改动上修正 [FR-W3、FR-W4、FR-W6](./prd.md#76-工作区):
|
||
本机移动调用创建项目使用的 `settings.selectWorkspace()`;远程移动调用
|
||
`sshHosts.browseDirectories()`,按项目 Host 浏览。所选目录映射为工作区相对目标,
|
||
保留原名;取消不提交移动,外部目录在弹窗内提示限制。
|
||
- 取消、分支、Fetch、历史展开和提交行接入共享控件样式;删除菜单项左对齐。
|
||
远程目录列表限制滚动高度,保留加载、空目录、失败和截断提示。
|
||
- `npm test -- src/renderer/src/WorkspaceFilesPanel.test.tsx src/renderer/src/RightAssistantSidebar.resize.test.tsx src/main/workspace/workspace-management.test.ts src/main/ssh/ssh-host-directory-browser.test.ts`
|
||
通过 56 项,覆盖本机目录选择桥接、Windows 与 POSIX 目标映射、取消与越界选择、
|
||
远程 Host 和目录参数、取消未完成的浏览,以及 Git 控件与真实文件管理服务。
|
||
- `npm test -- src/renderer/src/App.test.tsx -t "workspace|stale Git|opens the global assistant sidebar"`
|
||
通过 12 项。工作栏切换测试改为等待项目目录加载后出现刷新按钮。
|
||
- `npm run typecheck`、`npm run lint` 和 `git diff --check` 通过。
|
||
- 本轮整库 `npm test` 完整运行 944 秒,3642 项通过、61 项跳过、6 项失败。
|
||
工作栏加载时序断言已修正并定向复测通过;其余 5 项涉及 Agent 离线依赖测试超时、
|
||
DeepSeek Harness MCP 加载、Runtime 版本探测,以及 portable/release 打包产物检查。
|
||
未再次运行整库测试,不记为整库通过。
|
||
- 隔离 Electron 窗口加载当前源码组件和 CSS,检查浅色、深色主题下 300px、420px 工作栏:
|
||
无横向溢出,分支与 Fetch 同行,提交行左对齐;移动弹窗没有路径输入框,取消为次按钮,
|
||
删除项计算样式为左对齐。截图保留于本机临时验证目录。此检查使用桥接替身,未自动操作
|
||
系统原生目录对话框,也不替代完整应用中的人工验收。
|
||
- 尝试从隔离 Electron 配置调用真实 SSH 目录浏览服务时,已有凭据在
|
||
`safeStorage.decryptString` 解密失败,尚未建立 Host 连接。真实远程目录选择验收仍受阻;
|
||
未修改用户配置或远端文件,本轮未调用真实模型。
|
||
|
||
## 2026-09-09 文件管理与 Git 工作区扩展
|
||
|
||
- 已只读核对根目录规范、UI 设计系统、目录浏览组件、WorkspaceAccess 与 Agent 协议。
|
||
本轮范围定义于 [PRD 工作区 FR-W1 至 FR-W6](./prd.md#76-工作区)。
|
||
- 当前生产路径具备目录、属性、文本预览和工作树 Diff;Agent 的写入及 Git operation
|
||
仍是只读拒绝接口。文件管理、分支与提交历史尚未实现或验证,不能视为完成。
|
||
- 待完成源码实现、整库 test/typecheck/lint、真实桌面路径与当前源码 Linux Host 验证。
|
||
本轮开始前已有浏览器与工作区未提交改动,保留这些改动;不提交或推送。
|
||
|
||
## 2026-09-09 工作区页签交互
|
||
|
||
- 已核对当前工作树中的 `RightAssistantSidebar.tsx` 和 `WorkspaceFilesPanel.tsx` 差异:
|
||
文件预览期间目录树保持挂载,接入返回位置与焦点恢复、文件与未提交更改分段视图、
|
||
目录就地重试,以及文件预览和 Diff 操作。行为定义见 [PRD 工作区](./prd.md#76-工作区)。
|
||
- `npm test -- src/renderer/src/RightAssistantSidebar.resize.test.tsx src/renderer/src/WorkspaceFilesPanel.test.tsx`
|
||
通过 35 项,覆盖目录展开、返回位置与焦点、视图选择、刷新失败保留内容、Markdown
|
||
源码切换,以及切换项目后丢弃未完成的文件预览。
|
||
- `npm test -- src/renderer/src/App.test.tsx -t "workspace|stale Git"` 通过 11 项,
|
||
覆盖应用中的文件预览、路径复制、默认应用打开、返回和任务结束刷新。
|
||
- 本轮 `npm test` 完整运行结果为 3629 通过、61 跳过、5 失败。失败位于 Agent 离线
|
||
依赖打包超时、DeepSeek Harness MCP 加载、Runtime 版本探测,以及两个打包产物检查,
|
||
不将该结果记为整库回归通过。
|
||
- `npm run lint` 和差异空白检查通过。最新 `npm run typecheck` 被同时进行的浏览器
|
||
接口变更阻塞:测试替身缺少 `hide`、`setBounds`、`setViewport`,部分侧栏测试仍传递
|
||
已移除的浏览器回调。该轮类型检查未通过,未改动另一项任务的接口或测试替身。
|
||
- 尚未进行真实桌面视觉验收;组件测试的滚动断言不代替实际窗口中的布局和滚动检查。
|
||
- 范围仅限工作区页签,不包含项目文件搜索或其他页签改动。
|
||
|
||
## 2026-09-09 托管 Runtime 并行阻塞
|
||
|
||
- Windows 完整隔离测试程序通过界面发送 OpenCode 原生双子代理、直连与 Continue 文件
|
||
任务;随后三路上游请求在 917 ms 内发出并重叠,全部完成。普通并发没有复现全局排队。
|
||
- 在同一程序中,让真实模型执行一次 4,000 行、约 98 KB 文件的 CRLF → LF 转换,
|
||
同时运行另一个会话。原生进程的无凭据存活探针两次延迟 3,301 ms、3,085 ms;
|
||
原生热线程持续使用 CPU,而 Main 没有同步满载。操作不是模拟事件或直接调用
|
||
Runtime 的脚本,模型请求来自实际输入框和发送按钮。
|
||
- 托管 OpenCode 关闭未消费的自动 Git 快照后,完整程序重复相同操作和并行会话,
|
||
90 秒观察中的最大原生探针延迟为 210 ms,没有超过 500 ms 的探针,两条请求均完成。
|
||
该对照验证已复现的快照阻塞得到消除,不声称已经证明历史 90–125 秒事件的唯一原因。
|
||
- Continue 的实际 Electron 原生宿主在不排空 stdout 时被注入的 128 KiB 输出阻塞;
|
||
使用当前生产适配器后,输出在 5 ms 内完成,20 次状态读取全部成功,最大 5 ms。
|
||
这证明管道修复有效,不代表普通启动约 640 字节的输出就是历史卡顿原因。
|
||
- 修复版完整程序再次完成原生双子代理与 Continue 文件任务,实际请求重叠,三个页面
|
||
都通过计数按钮功能检查。Windows 诊断与程序验证合计 40 次成功模型调用;
|
||
另一次 UI 请求返回账户额度不足的 402,用户充值后才继续,没有把失败当成通过。
|
||
- 当前源码 Linux x64 Agent 经桌面生产管理链路完成 Ask 读取和 Execute 换行转换,
|
||
共 4 次成功模型调用;最终原生配置确认 `snapshot: false` 且权限仍为 `ask`/`allow`。
|
||
此验证覆盖实际 Agent、模型桥、工具完成和关闭,不量化 Linux 提速,也未注入取消。
|
||
- 定向回归先验证 7 项失败,再验证 124 项通过、5 项 Windows 平台跳过;
|
||
全项目类型检查和修改文件 lint 已通过。首次全量回归为 3625 通过、1 失败、61 跳过;
|
||
失败来自生命周期测试的包装流在底层 reader 关闭后仍计数为打开,已通过独立流实验
|
||
复现并改为观察 `reader.closed`,没有因此修改生产取消逻辑。最终候选全量回归为
|
||
3626 通过、0 失败、61 跳过,`npm run typecheck`、`npm run lint`、
|
||
`npm run release:notes:verify`、差异空白与文档相对链接检查通过。本机和远端的
|
||
测试进程已回收,安装版和正式 Host 环境未改动;正式发布仍需候选 CI 与资产核实。
|
||
运行策略见
|
||
[托管 Runtime 并行与输出](./runtime-interactions.md#托管-runtime-的并行与输出)。
|
||
|
||
## 2026-09-08 消息底部请求状态
|
||
|
||
- 已接入本机 OpenCode 父会话的原生重试等待及开始事件;直连模型把退避等待与实际发起
|
||
重试分开显示,Continue 初始文案改为中性的请求处理。显示规则和未接入边界见
|
||
[消息底部请求状态](./runtime-interactions.md#消息底部请求状态)。
|
||
- 消息底部按真实事件显示准备、工具、待回答及终态;有新进展时清除旧状态,结束后不
|
||
接受迟到状态覆盖。仅该处状态点改为静态,会话列表闪点、发送和停止按钮未改动。
|
||
- Windows 隔离开发桌面通过实际 UI 发送验证 OpenCode 的 503/Retry-After 等待、
|
||
原生重试开始、真实模型回复与完成;直连模型通过派发前连接拒绝、500 ms 等待、
|
||
重试、真实回复与完成。故障由本机测试代理注入,不冒充服务商实际故障。
|
||
三个隔离测试配置总计 5 次真实文本模型调用;另有一次直连重试被测试代理的调用
|
||
上限明确拒绝,界面正确显示失败,最终单次补测完成。未执行用户命令或修改安装版。
|
||
- DOM 状态记录确认底部无闪烁、完成后无旧重试文案,浅色截图可见原生重试计划与原因;
|
||
底部 WCAG 2 A/AA 定向检查无违规。最小化窗口的补充截图超时,未作为通过证据。
|
||
隔离窗口及测试代理已结束。
|
||
- 最终 `npm test -- --reporter=json --outputFile=<临时报告路径>` 为 3618 项通过、
|
||
0 项失败、61 项按平台或手动条件跳过;首轮的压缩状态旧断言已修正,途中被用户中断
|
||
的运行不计为通过。`npm run typecheck`、`npm run lint`、
|
||
`npm run release:notes:verify`、差异空白与相关文档相对链接检查通过。
|
||
|
||
## 2026-09-08 Desktop 0.12.8 安装包修复
|
||
|
||
- 真实 `0.12.7` 安装目录确认 OpenCode 配置缺少整个 `node_modules`。新增测试调用实际
|
||
electron-builder 资源复制器,复现相同 ENOENT;把复制源上移到 `.runtime-resources`
|
||
后,插件及传递依赖逐文件复制验证通过。
|
||
- 真实安装的 DSH bootstrap 存在 `dsh-session-projection` 外部导入,而 Host 解包目录没有
|
||
对应依赖。将其加入 Vite bundling,配置回归从失败转为通过;最终包会拒绝同类外部导入。
|
||
- Windows x64 CI 已接入包内 OpenCode 插件导入、真实 DSH UtilityProcess 握手及 npm
|
||
探针,位于解包目录清理和发布之前。用户要求不做本地打包;CI 探针结果尚待本候选执行,
|
||
不能把当前源码回归通过当作真实发布包已通过。
|
||
- 本次不改变 Agent `0.11.21` 源码或包。macOS 改为 DMG-only,用户明确接受旧版客户端
|
||
手动升级影响;格式与发布规则见[发布手册](../../development/release-runbook.md)。
|
||
|
||
## 2026-09-08 Execute 目录权限等待修复
|
||
|
||
- 本机 OpenCode 的内部配置显式允许默认工具权限;每次 Ask 仍设置 deny-all 会话规则并
|
||
禁用工具,当前请求精确分配的只读能力例外。Execute 不把 Workspace 当作目录边界。
|
||
- `permission.asked` 不再忽略所有非父会话事件。Main 用 OpenCode Session 的 `parentID`
|
||
确认属于当前请求的子孙会话后按当前模式回复;其他并行会话不受影响,同一请求只回复
|
||
一次。子会话权限不伪装为父会话中的待完成工具。
|
||
- 真实 OpenCode `1.18.9` 和候选 `1.18.29` 均已通过本地确定性模型驱动的原生 Task
|
||
工作区外读取回归;同一 Runtime 的 Ask 仍不暴露文件与命令工具。
|
||
- Continue `1.5.47` 的真实 CLI 已通过 Execute Shell 写入工作区外测试文件;DSH 固定
|
||
Host 已通过 Execute 工作区外写入、随后 Ask 拒绝同一写工具,未增加权限策略或人工审批。
|
||
- 真实 OpenCode `1.18.29` 已完成原生 Task 后的 yes/no 与自由文本问答回传;父、子会话
|
||
提问及后台任务不能交互时的失败路径均有回归测试。Continue 真实 `AskQuestion` 暴露了
|
||
QuizService 扁平数据结构与原适配器不一致的问题,现已按锁定版本修正;真实自由文本
|
||
回传、yes/no、选项及跳过均验证通过,自定义答案不再误标为选项。
|
||
- DSH 活跃 Execute 的 ACP 权限回调不再等待第二次 authorizer,Ask 继续拒绝;未添加
|
||
通用业务问答工具或从终端日志猜测确认意图。完整范围见
|
||
[Runtime 交互边界](./runtime-interactions.md)。
|
||
- 当前源码 Linux x64 Agent 通过签名组包、生产安装、真实 Ask/Execute、原生子代理
|
||
工作区外写入、重连同一 daemon 和 stop/bootstrap。实机回归同时定位并修复了握手
|
||
Base64URL 响应误用 ID 校验及断流未结算等待;13 项 Unix 原生端点测试和连续 20 次
|
||
握手通过。两轮真实模型调用合计 10 次,均 completed;本轮测试 Agent 已停止。
|
||
- 最终完整回归使用 `npm test -- --reporter=json --outputFile=<临时报告路径>`,并通过
|
||
`GOODBUDDY_TEST_OPENCODE_BINARY` 指向已验证版本的候选 OpenCode。结果为 338 个文件、
|
||
3597 项通过、0 项失败、61 项按平台/手动条件跳过,报告 `success=true`、退出码 0;
|
||
Windows 跳过的 Unix 端点场景另在 Linux Host 运行了上述 13 项原生测试。
|
||
- 最终 `npm run typecheck`、`npm run lint`、`npm run release:notes:verify` 和差异空白检查
|
||
通过,相关 Markdown 相对链接有效。此前失败、暂停及控制台截断的回归记录由本次完整
|
||
JSON 报告覆盖,不代表仍有测试失败。未执行系统休眠/唤醒或本地桌面生产构建、打包;
|
||
后续发布仍需对应候选的 CI 构建和跨平台验证。
|
||
|
||
## 2026-09-08 OpenCode 复用与原生控件恢复
|
||
|
||
- `OpenCodeRuntime` 仅在没有活动请求时探测缓存的 embedded server;活动对话或
|
||
Compact 期间直接复用服务,避免新会话的一次短探测失败关闭其他会话正在使用的进程。
|
||
空闲探测失败时仍清除旧 client 和会话映射并重建;并发调用共享检查与重建。
|
||
进程退出或服务关闭会中止绑定它的对话与 Compact,事件流重连等待也可立即取消,
|
||
请求明确报错,不自动重放已执行命令。本次修复后的真实模型验证共 6 次:正常并发、
|
||
已复现场景下的共享服务保护均正常完成;主动结束测试进程后旧请求明确失败,新请求
|
||
在替换服务上完成。此前“新会话完成、旧会话持续等待”的故障不再出现。
|
||
- 请求级 MCP 注册与断开通过实例内 `mutateMcp` 队列串行执行。仅实际发出 `mcp.add`
|
||
的名称进入清理列表;注册尚在排队时取消不追加断开。断开的 1 秒超时从出队后开始。
|
||
- `App` 按本机/远程、连接方式、项目和 Runtime 选择组成 scope 缓存原生清单,用请求
|
||
代次阻止旧 scope 结果回写;同 scope 会话刷新不清空重取,切换会话重置消息级选择,
|
||
Runtime 切换状态也按 generation 隔离。清单请求失败或返回 `unavailable`/`partial`
|
||
时保留已有可用缓存并有界重试;没有可用缓存时保留新返回的部分数据,因此
|
||
`unavailable` 重试为可用 `partial` 后可显示 Agent 和 Command。
|
||
|
||
验证记录:首轮定向测试 273 项通过、5 项跳过;补充修复后的 Runtime 与生命周期测试
|
||
77 项通过,界面定向测试 6 项通过,类型检查通过。修复前的 lint 检查通过。
|
||
全量测试超过 120 秒被终止,期间出现一项 DS 本地 stdio MCP 测试失败,尚待定位。
|
||
这是当次历史结果。后续发布前修复与实机验证见本文上方及
|
||
[远程主机技术设计](../remote-host/technical-design.md);真实系统休眠恢复仍未完成验证。
|
||
|
||
## 2026-09-06 项目工作区
|
||
|
||
范围见 [PRD 工作区](./prd.md#76-工作区)。
|
||
|
||
当前源码已移除重复标题与底部完整 Diff 入口,使用彩色 Git 状态字母,点击更改项读取
|
||
单文件 Diff。已暂存与未暂存差异分开展示;本机 Git 测试覆盖无首次提交、未跟踪、
|
||
暂存后继续修改、重命名、删除及包含方括号的路径。Git 刷新驱动目录树重新读取,保留
|
||
展开状态;SSH 项目不提供本机系统打开按钮。审查后补齐了当前 Diff 随刷新重读、
|
||
旧请求结果失效,以及超过 50 项变更的继续加载入口。
|
||
|
||
验证记录:
|
||
|
||
- 最终 `npm run typecheck`、`npm run lint`、`npm run build` 均通过。
|
||
- 工作区专项 7 个测试文件复跑:317 项通过,3 项 Linux 专用测试在 Windows 跳过。
|
||
任务完成测试同时检查目录树出现新文件。
|
||
- 最终 `npm test`:326 个测试文件、3552 项测试通过,9 个文件、58 项测试按既有条件
|
||
跳过。复核首轮曾有一项浏览器地址草稿测试超时,单独复跑及最终全量复跑均通过;
|
||
更早的超时/失败记录不再作为最终验收结果。
|
||
- 后续复核已通过既有凭据和固定 Host Key 经 VPN 连接共享 Linux x64 Host,使用当前
|
||
源码构建的隔离 Agent 包安装并启动。真实 `RemoteWorkspaceAccess → Agent git/status`
|
||
与 `git/diff` 路径覆盖暂存后继续修改、删除、重命名、未跟踪和方括号路径;均通过。
|
||
Git 验证未调用模型。
|
||
- Windows 隔离桌面实例已通过真实点击验收:当前项目单文件暂存/工作树 Diff 分组与
|
||
增删颜色正确,修改测试文件后点击刷新可更新正在查看的 Diff,53 项变更经加载更多
|
||
全部可访问。截图留在本地验证目录,不纳入产品包。
|
||
|
||
目录分页、任意目录切换和 HTML 预览不在本轮改动范围内。
|