Skip to content

feat(web-shell): declutter the workspace sidebar and add loopback open actions - #10606

Merged
wenshao merged 17 commits into
mainfrom
feat/webshell-workspace-hover-details
Sep 1, 2026
Merged

feat(web-shell): declutter the workspace sidebar and add loopback open actions#10606
wenshao merged 17 commits into
mainfrom
feat/webshell-workspace-hover-details

Conversation

@wenshao

@wenshao wenshao commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Reworks the sidebar's workspace area in the Web Shell and adds host-local open actions for loopback deployments.

The expanded workspace row no longer spends its width on a path line and a block of facet chips (MCP / Skills / Extensions / Channels / Context) that were usually all zeros. The row now shows just the workspace name with the git chip directly after it, and the session list gains a subtle tree indent guide. Everything that was removed — full path, git branch, session counts, and the facet counts — moved into a hover popover on the workspace header, where known facets show even when their count is zero and facets with an issue (e.g. a failed MCP server) are highlighted. The hover action buttons overlay the row instead of reserving permanent space, and the name is capped by the rendered action count so the interactive git chip is never covered. Session rows pick up a pulsing green dot for running sessions and an accent bar marking the current session; the precise session date (yyyy-MM-dd) lives in the session's own hover popover instead of crowding the row.

When the browser reaches the daemon over loopback, the popover's path row and the workspace menu offer "Open folder" and "Open terminal". The daemon opens the resolved, registered workspace path — never a client-supplied one — in the host's file manager (Finder / Explorer / xdg-open) or a new terminal window (Terminal.app / Windows Terminal with cmd fallback / gnome-terminal / konsole / xterm). Availability is advertised through two new capability tags so headless hosts and remote (LAN-paired) clients never see the buttons.

Why it's needed

Workspace names in the sidebar were truncated to a handful of characters because hidden hover actions reserved space and five usually-zero facet chips consumed three rows of height. The diagnostic information is useful, but it belongs on demand, not permanently in the layout — and in the popover it can finally be complete, zeros included. Separately, opening the project folder or a terminal at a workspace was impossible from the web UI even when browser and daemon sit on the same machine (the codebase explicitly called this unsupported); on loopback it is the most natural action in the world.

Reviewer Test Plan

How to verify

Open the Web Shell against a local daemon with at least one git workspace that has sessions. Confirm: the workspace row shows the full name with the git chip right after it and no counts; session rows stay text-only with a pulsing green dot for running sessions, and hovering a session shows its timestamp in the popover (HH:mm:ss within the last 24 hours, yyyy-MM-dd beyond); hovering the workspace row opens a popover with the full path, branch, a Sessions row (running/attention/total), and every known facet including zeros; the path row's folder and terminal buttons open Finder/Terminal at the workspace path; the same two entries appear in the workspace menu after "Copy path". Accessing the same daemon over a LAN address (or running it headless) must hide both buttons. Facet fetching is unchanged: workspaces are polled only while expanded, and collapsed rows retain their last snapshot.

Automated coverage: daemon unit tests for the launcher and route (packages/cli/src/serve/local-path-open.test.ts, routes/workspace-local-open.test.ts), capability toggle tests, an SDK client test, 319 web-shell sidebar unit tests including the new popover suite, and the web-shell.workspace-overview e2e spec which now drives the hover popover and the loopback open actions end to end.

Evidence (Before & After)

Before — the workspace name is cut to qwen-we... under five always-zero facet chips, and hidden hover actions still reserve space:

before

After — full workspace name with the git chip right after it, no counts in the row, and session rows back to text-only; on hover the action buttons overlay the row without ever covering the chip:

after

after-hover

Workspace hover popover — full path with the folder and terminal buttons, branch, Sessions row, and every known facet including zeros:

hover-popover

Session hover popover — the precise timestamp lives here (HH:mm:ss within the last 24 hours, yyyy-MM-dd beyond) instead of in the row:

session-popover

Tested on

OS Status
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

Windows and Linux launch commands are unit-tested with mocked spawns but were not manually verified on those platforms.

Environment (optional)

Local dev server with the Playwright mock daemon; daemon-side launch verified on macOS (Finder + Terminal.app).

Risk & Scope

  • Main risk or tradeoff: the daemon gains a host-GUI action route. It is scoped to the resolved cwd of a registered, trusted workspace (no arbitrary client paths), both capability tags are omitted on headless hosts, and the UI additionally gates on the client reaching the daemon over loopback. Linux terminal launching resolves on spawn because a terminal window is long-lived.
  • Not validated / out of scope: Windows and Linux manual verification; the terminal app is the OS default (no iTerm/custom-terminal preference yet); SSH-tunnelled access looks like loopback to the browser and would open the folder on the daemon host.
  • Breaking changes / migration notes: none. The new request-body field is optional, the feature tags are additive, and the sidebar's facet fetch/poll semantics are unchanged — only presentation moved.

Linked Issues

中文说明

本 PR 做了什么

重做 Web Shell 侧栏的工作区区域,并为 loopback 部署场景添加本地打开操作。

展开的工作区行不再把宽度浪费在路径行和一排通常为 0 的 facet 芯片(MCP / Skills / Extensions / Channels / Context)上。现在该行只显示工作区名,git 图标紧跟其后,会话列表增加了细长的树形缩进引导线。被移除的所有信息——完整路径、git 分支、会话计数和 facet 计数——都移入了工作区标题的悬浮弹层:已知的 facet 即使计数为 0 也会展示,有异常的 facet(如 MCP 服务器失败)会以警告色标出。hover 操作按钮改为浮层覆盖而非预留常驻空间,并按实际渲染的按钮数量限制名字宽度,保证可点击的 git 图标永不被遮挡。会话行新增运行中会话的绿色脉冲圆点和当前会话的左侧高亮条;精确的会话时间戳(24 小时内为 HH:mm:ss,更早为 yyyy-MM-dd)不再占用行内空间,改为在会话自身的悬浮弹层中展示。

当浏览器通过 loopback 访问 daemon 时,弹层的路径行和工作区菜单会提供"打开文件夹"和"打开终端"。daemon 打开的是解析后的、已注册的工作区路径——绝不接受客户端任意路径——在主机的文件管理器(Finder / Explorer / xdg-open)或新的终端窗口(Terminal.app / Windows Terminal(带 cmd 回退)/ gnome-terminal / konsole / xterm)中打开。可用性通过两个新的 capability 标签宣告,因此 headless 主机和远程(LAN 配对)客户端永远不会看到这些按钮。

为什么需要

侧栏中的工作区名之前被截断到只剩几个字符,因为隐藏的 hover 操作按钮预留了空间,而五个通常为 0 的 facet 芯片又占了三行高度。这些诊断信息很有用,但应该按需出现而不是常驻布局——而且在弹层里它终于可以完整展示(包括零值)。另外,即使浏览器和 daemon 在同一台机器上,之前也无法从 Web 界面打开项目文件夹或终端(代码中明确标注为不支持);而在 loopback 场景下,这是最自然不过的操作。

评审测试计划

如何验证

对着一个本地 daemon 打开 Web Shell,至少有一个带会话的 git 工作区。确认:工作区行显示完整名称,git 图标紧跟其后,没有计数;会话行保持纯文本,运行中的会话有绿色脉冲点,悬浮会话行可在弹层中看到时间戳(24 小时内为 HH:mm:ss,更早为 yyyy-MM-dd);悬浮工作区行会弹出包含完整路径、分支、Sessions 行(运行中/待处理/总数)以及全部已知 facet(含零值)的弹层;路径行的文件夹和终端按钮会在工作区路径打开 Finder/终端;工作区菜单中"复制路径"之后也有这两项。通过 LAN 地址访问同一个 daemon(或 headless 运行)时两个按钮必须隐藏。facet 拉取语义不变:仅在展开时轮询,折叠的行保留最近快照。

自动化覆盖:启动器与路由的 daemon 单测(packages/cli/src/serve/local-path-open.test.tsroutes/workspace-local-open.test.ts)、capability 开关测试、SDK 客户端测试、319 个 web-shell 侧栏单测(含新弹层套件),以及端到端驱动悬浮弹层和 loopback 打开操作的 web-shell.workspace-overview e2e 用例。

证据(前后对比)

修改前——工作区名被五个恒为 0 的 facet 芯片挤成 qwen-we...,隐藏的 hover 操作按钮仍预留空间:

修改前

修改后——工作区名完整显示,git 图标紧跟其后,行内没有计数,会话行恢复纯文本;hover 时操作按钮浮于行上且永不遮挡图标:

修改后

修改后-hover

工作区悬浮弹层——完整路径(带文件夹和终端按钮)、分支、Sessions 行、以及全部已知 facet(含零值):

悬浮弹层

会话悬浮弹层——精确时间戳在这里展示(24 小时内为 HH:mm:ss,更早为 yyyy-MM-dd),不再占用行内空间:

会话弹层

测试平台

macOS ✅(单测 + e2e);Windows / Linux ⚠️ 未实测(启动命令以 mock spawn 的单测覆盖)。

风险与范围

  • 主要风险或取舍:daemon 新增了一个主机 GUI 操作路由。它被限制在已注册、已信任工作区解析后的 cwd(不接受任意客户端路径),两个 capability 标签在 headless 主机上不会宣告,UI 还额外要求客户端通过 loopback 访问。Linux 终端启动在 spawn 时即返回,因为终端窗口是长驻进程。
  • 未验证 / 范围外:Windows 和 Linux 的人工验证;终端应用使用系统默认(暂不支持 iTerm/自定义终端偏好);SSH 隧道访问在浏览器看来是 loopback,会在 daemon 主机上打开文件夹。
  • 破坏性变更 / 迁移说明:无。新请求体字段是可选的,capability 标签是纯增量的,侧栏 facet 的拉取/轮询语义未变——只是展示位置移动了。

@wenshao

wenshao commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator Author

E2E test report (mock-daemon Playwright harness, web-shell.workspace-overview spec, 4/4 passing on macOS Chromium):

  • Hover popover contents — two workspaces with divergent facet data: each row's popover shows its own path/branch/Sessions row/facets; known-zero facets render as 0 rows; unavailable facets render no row. Cross-workspace data bleed is asserted (secondary row never shows the primary's counts).
  • Fetch semantics — facets are requested only while a workspace is expanded and trusted (exactly the default facet set, hooks stay opt-in); collapsing stops fetching and re-expanding refetches; the 30 s poll cadence is pinned with a fake clock.
  • Loopback local open — with workspace_local_open / workspace_local_terminal advertised, the popover's folder and terminal buttons POST /workspaces/:cwd/open (folder without a body, terminal with { target: 'terminal' }), and the workspace menu lists both entries; without the tags no buttons render anywhere.
  • Session counts — the header carries no counts; the popover's Sessions row shows total (4+ when the daemon caps its scan) with running/attention dot counts, retained across collapse and cleared on a source switch until the new source's page lands.

Daemon-side: 42 launcher unit tests (local-path-open.test.ts, per-platform args incl. the wtcmd fallback and terminal preference order), 12 route tests (dispatch, 501/500 shapes, trust gating), capability toggle tests in server.test.ts / run-qwen-serve.test.ts, SDK DaemonClient test for openTerminalLocally. Web-shell: 319 sidebar unit tests including the WorkspaceDetailsTooltip and WorkspaceMenu suites.

Not covered by automation: actual window spawning on Windows/Linux (spawn calls are mocked); manual verification done on macOS only.

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finishedview run. See the stage comments in this thread for the result.

Qwen Triage 已完成 —— 查看运行。结果见本线程中的各阶段评论。

wenshao added a commit to wenshao/qwen-code that referenced this pull request Aug 31, 2026
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: observed, not theoretical — unchanged from prior passes. The sidebar really does truncate workspace names today, the codebase itself marked opening a folder/terminal from the Web Shell as unsupported, and the before/after captures back the pain.

Direction: aligned — unchanged. Diagnostics on demand in the sidebar, and loopback open actions following the existing native_directory_picker capability pattern (probe at boot, omit tags on headless hosts, client hides the affordance). The coordination note still stands: #10589 (Workspaces overview panel) is open in the same area — worth keeping the two coherent at merge time.

Size: at this head the PR is ≈2,180 production lines vs ≈2,690 test lines (0 generated/schema), 39 files — up ~210 production lines since the last pass, all in the three fix commits reviewed below. As a feat this is not size-blocked, and maintainer-authored PRs are exempt from the two-tier core gate; the 1000+ advisory stands. One PR remains defensible for the same reason as before — the popover is the glue between the declutter and the open actions.

Approach: unchanged and still the right structure — registry + trust gate + mutation gate + capability advertisement on the daemon, capability tags + loopback double-gate on the client. The new delta since the last pass is three fix commits: a spawned-but-stalled wt.exe no longer falls back (dedicated SpawnHangError), the workspace menu can no longer re-latch the details popover on close, and the bootstrap envelope now advertises the five runtime-only capability tags. One hygiene note: the lockfile delta drops npm's libc metadata fields (~130 lines) — harmless and unrelated to the feature; worth restoring next time the lockfile is legitimately touched.

Risk: no elevated-risk paths matched the revert-history signal.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:真实存在,不是理论问题——与前几轮判断一致。侧栏确实会截断工作区名,代码里也明确标注过 Web Shell 无法打开文件夹/终端,前后对比截图支撑这个痛点。

方向:对齐——判断不变。诊断信息按需展示,loopback 打开操作沿用现有 native_directory_picker 的 capability 模式(启动时探测、headless 主机不宣告标签、客户端据此隐藏按钮)。协调提醒仍然有效:#10589(Workspaces 概览面板)仍在同一区域 open 着,合并时值得保持两者一致。

规模:当前 head 上生产代码约 2,180 行,测试约 2,690 行(生成/schema 0 行),共 39 个文件——比上一轮多约 210 行生产代码,全部来自下面审查的三个修复提交。作为 feat 不会因规模被阻断,维护者自己的 PR 豁免双层核心门禁;1000+ 大 PR 提示仍然适用。合在一个 PR 依然自洽,理由同前——弹层是精简侧栏与打开操作的粘合点。

方案:结构不变且仍然正确——daemon 侧 registry + trust gate + mutation gate + capability 宣告,客户端 capability 标签 + loopback 双重门控。上一轮之后的新增量是三个修复提交:已启动但卡住的 wt.exe 不再触发回退(引入专用 SpawnHangError)、工作区菜单关闭时不再把详情弹层重新锁开、bootstrap 包络补齐五个 runtime-only 能力标签。一条卫生提示:lockfile 差异丢掉了 npm 的 libc 元数据字段(约 130 行)——无害且与本功能无关,下次正常改动 lockfile 时建议一并恢复。

风险:未命中回滚历史高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at e5398dcec84af3c243176fb0fecc0a0f113c3d28 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Code review

Re-run scope: everything since the last pass at ab48b2106 — three PR commits (bea3818e2 re-review fixes, b2fe0ab4 bootstrap capability tags, 7e7e2508 test dedup) and three merges of main (0120f704, f25d0d37, e5398dc), the merges verified by effective diff rather than trusted.

Both round-2 blockers are fixed at this head — verified by reading the head tree, not the fix-commit message:

  • wt.exe hang no longer double-opens. The hang guards in spawnAndIgnoreExitCode/spawnLongLived now reject with a dedicated SpawnHangError; spawnWindowsTerminal re-throws it, so the PowerShell/cmd fallback fires only on a spawn-level failure (wt.exe absent). openTerminalLocally wraps it into LocalPathOpenUnavailableError and the route still answers an honest 501. The regression test pins exactly one spawn with the injected 5 ms timeout and asserts powershell.exe is never launched — widening the catch again turns it red.
  • Menu close can no longer re-latch the details popover. The workspace menu's onCloseAutoFocus now unconditionally preventDefaults, so Radix stops restoring focus into the popover's focus-open anchor. The session menus keep the original handler (still used, not dead code), and the keyboard 300 ms open path is untouched. The real-timer regression test drives the full sequence — hover-open → menu select → 450 ms later still closed — and removing the suppression turns it red.

The bootstrap-envelope commit mirrors the five runtime-only capability tags (dynamic_workspace_registration, scratch_workspace_registration, standalone_sessions_v1, workspace_trust_hot_reload, web_terminal) so the boot window stops under-reporting them. Verified at head: web_terminal resolves through the same shared resolveAcpHttpEnabled + env on both the bootstrap and runtime paths, the flag→tag mapping in capabilities.ts exists for all five, and the integration expectation list gained the matching five entries. The one known divergence — scratch_workspace_registration over-reported in the boot window if prepareManagedScratchRoot fails closed — is cosmetic in an already-degraded daemon; recorded, not gating. The final commit is a test-only duplicate-declaration cleanup, already overtaken by the now-merged #10729 (harmless no-op against main).

The merges disturbed nothing: the effective diff against the merged main parent is exactly the same 39-file set, and the one conflict resolution follows main's explicit wsCwd = ws.cwd (the old ws.primary ? undefined : ws.cwd ternary is gone, matching what the worktree-task tests pin). Non-blocking residue carried from earlier rounds, unchanged: the author-deferred coverage pins, and isRuntimeDiscoveredFacet still exported with test-only consumers. One new hygiene note — the lockfile delta strips npm's libc metadata fields; unrelated to the feature, worth restoring next time the lockfile is legitimately touched. No new Critical findings in the incremental range.

Testing evidence

Unattended CI run — no PR code is built or executed here; the evidence is the PR's own CI fetched via the API. On this head the main Test (ubuntu-latest, Node 22.x) lane is green for the first time across this whole review sequence, and integration, real-daemon E2E, Serve A/B, web-shell visuals, both desktop shells, the Java matrix and the security lanes are all green. The one non-green check is web-shell E2E Smoke (ubuntu-latest, Node 22.x), cancelled mid-suite — classified environmental, not PR-caused, on three pieces of evidence: (1) this exact PR code — 7e7e25083, which already contains every PR-authored commit — passed this same lane green at 16:29–16:37Z (~7½ minutes start to finish); the only change since is the merge of main. (2) The cancelled run spent ~15 minutes in checkout/install/build before the suite even started, then hit "The operation was canceled" — a load-starved self-hosted runner running out of budget, on the same fleet that produced the earlier 2710 s vitest collect phase. (3) The failure signature is broad, not surgical: 14+ specs across unrelated surfaces (github-prs, standalone sessions, goal queue, split-persist…) all dying on SSE-connect waits and [data-web-shell-root] never appearing — app-boot-level timeouts, not a sidebar regression — while this head's visuals lane (which renders the very same web shell against a mock daemon) is green. A re-run of the failed job clears the lane; nothing in the log points at PR code.

Check Conclusion
web-shell E2E Smoke (ubuntu-latest, Node 22.x) 🚫 cancelled
Test (ubuntu-latest, Node 22.x) ✅ success
Integration Tests (no-AK, No Sandbox) ✅ success
Real daemon E2E / Java 11 ✅ success
Serve A/B (ubuntu-latest, Node 22.x) ✅ success
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Classify PR ✅ success
Dependency CVE audit ✅ success
Secret scan (TruffleHog) ✅ success
macos-latest / Java 21 ✅ success
ubuntu-latest / Java 11 ✅ success
ubuntu-latest / Java 17 ✅ success
ubuntu-latest / Java 21 ✅ success
windows-latest / Java 21 ✅ success

One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。

Sandboxed verification was triggered alongside this re-run and is still in flight in this thread (@qwen-code /verify); the earlier run of the same lane passed merge-ready on ab48b2106. The one claim no lane here can settle: Windows and Linux launcher behaviour on real platforms (mocked spawns; manually verified on macOS only). It is guarded by assertPathExists pre-checks, the SpawnHangError distinction, and the env-var directory handoff, all unit-pinned — but author's claim on those two platforms it remains.

Real-scenario testing: N/A on the CI path — no local product run; the CI evidence above is what this comment carries.

中文说明

代码审查(本轮增量:上一轮 ab48b2106 之后的全部内容——三个 PR 提交 bea3818e2(复审修复)、b2fe0ab4(bootstrap 能力标签)、7e7e2508(测试去重),以及三次 main 合并 0120f704f25d0d37e5398dc;合并均按有效 diff 核验,不直接信任)。

第二轮的两个阻塞项均已在当前 head 核实修复——读的是 head 代码,不是修复提交说明:wt.exe 挂起不再双开(挂起守卫改抛专用 SpawnHangErrorspawnWindowsTerminal 对其直接重抛,回退只在 wt.exe 缺失时触发;openTerminalLocally 包装为 LocalPathOpenUnavailableError,路由仍诚实返回 501;回归测试钉住恰一次 spawn 且不启动 powershell,恢复兜底 catch 即打红);菜单关闭不再把详情弹层重新锁开(工作区菜单 onCloseAutoFocus 无条件 preventDefault,Radix 不再把焦点还原到弹层的焦点开启锚点内;会话菜单保留原处理器、键盘 300ms 开启路径不受影响;真实计时器测试走完整链路,移除抑制即打红)。

bootstrap 包络提交补齐五个 runtime-only 能力标签,消除启动窗口的少报。已在 head 核验:web_terminal 在 bootstrap 与运行时两侧共用同一 resolveAcpHttpEnabled 与同一 env,capabilities.ts 五个标签的映射齐全,集成测试期望清单同步 +5。唯一已知偏差——prepareManagedScratchRoot 失败关闭时启动窗口内多报 scratch_workspace_registration——对本已降级的 daemon 只是表观问题,记录在案、不构成门禁。最后一个提交是纯测试去重,已被合入的 #10729 抢先(对 main 无害空操作)。

合并未扰动任何东西:对合并进来的 main 父提交的有效 diff 仍是同一 39 文件集,唯一的冲突解决跟随 main 的显式 wsCwd = ws.cwd(旧的 ws.primary ? undefined : ws.cwd 三元式已移除,与 worktree-task 测试钉住的形态一致)。早前轮次遗留的非阻塞项不变:作者明确延后的覆盖钉子、仍只有测试消费的 isRuntimeDiscoveredFacet 导出。新增一条卫生提示:lockfile 差异剥掉了 npm 的 libc 元数据字段,与功能无关,下次正常改动 lockfile 时建议恢复。增量范围内没有新的 Critical。

测试证据:无人值守 CI 运行,不构建、不执行任何 PR 代码;证据来自 API 拉取的 PR 自身 CI。当前 head 上主单测通道 Test (ubuntu-latest, Node 22.x) 在整个审查序列中首次转绿,集成、real-daemon E2E、Serve A/B、web-shell 视觉、双桌面壳、Java 矩阵与安全通道均绿。唯一非绿项 web-shell E2E Smoke 在套件中途被取消——判定为环境性、非 PR 引入,三条证据:(1) 完全相同的 PR 代码(7e7e25083,已含全部 PR 自写提交)在 16:29–16:37 通过同一通道全绿(全程约 7 分半),其后唯一变化是合入 main;(2) 被取消的这次运行在 checkout/安装/构建上耗掉约 15 分钟才开始跑套件,随后 "The operation was canceled"——负载过载的自托管 runner 耗尽预算,与此前出现 2710 秒 vitest collect 的是同一套 runner;(3) 失败面宽而非点状:14+ 个互不相关的 spec(github-prs、standalone、goal queue、split-persist……)全部死于 SSE 连接等待与 [data-web-shell-root] 始终不出现——应用启动级超时,不是侧栏回归;且本 head 的视觉通道(用 mock daemon 渲染同一 web shell)是绿的。重跑失败任务即可清除该通道,日志中没有任何指向 PR 代码的证据。

沙箱验证已与本次重跑一同触发、仍在线程内运行(@qwen-code /verify);同一通道的上一次运行在 ab48b2106 上已通过并给出 merge-ready 结论。本线程没有能覆盖的声明:Windows/Linux 真机上的启动器行为(mock spawn、仅 macOS 人工实测)。它有 assertPathExists 前置检查、SpawnHangError 区分与环境变量传目录守卫,且均有单测钉住——但在这两个平台上仍属作者声明。

真实场景测试:CI 路径不适用——无本地产品运行;本评论携带的证据即上述 CI 信号。

Qwen Code · qwen3.8-max

Reviewed at e5398dcec84af3c243176fb0fecc0a0f113c3d28 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — four rounds of review have converged on a clean head: every historical blocker is verified fixed at this exact commit, the three-commit delta adds no new findings, and the unit lane is finally green; the remaining items are non-blocking nits, named below.

Stepping back: this run re-reviewed the delta since ab48b2106 — the wt.exe hang distinction, the menu focus latch, the bootstrap capability tags — by reading the head tree, and each fix carries the test that would catch its regression. The effective diff after three merges of main is still exactly the 39-file set, so the review surface is the one three rounds of human and bot review have already converged on; a maintainer approval also stands at this very head, and my independent read of the delta lands in the same place. The one genuinely new signal is that Test (ubuntu-latest) went green on this head for the first time in the whole sequence, which clears the standing doubt about the earlier environmental-failure call. I'd maintain this without cursing anyone.

The non-blocking nits, for the record: the cancelled web-shell E2E Smoke lane (classified environmental in Stage 2 — same code green ~40 minutes earlier; a re-run clears it); the lockfile stripping npm's libc metadata fields; the carried residue (author-deferred coverage pins, isRuntimeDiscoveredFacet with test-only consumers); and Windows/Linux launcher behaviour remaining the author's claim. None of these gate the merge.

Approval posts pinned to the reviewed commit and supersedes the round-2 request-changes review, which was gating on findings now verified fixed. The sandboxed /verify run triggered alongside this re-run is still in flight; if it surfaces anything, it will land in the thread on its own. If the head moves, this approval does not carry over.

中文说明

置信度:4/5 —— 四轮审查已在干净的 head 上收敛:全部历史阻塞项均已在当前这个提交上核实修复,三个提交的增量没有新发现,主单测通道也终于转绿;剩余事项都是非阻塞的小项,列在下面。

退一步看:本轮重新审查了 ab48b2106 之后的增量——wt.exe 挂起区分、菜单焦点门闩、bootstrap 能力标签——读的是 head 代码,每一项修复都带着能捕获回归的测试。三次合入 main 之后有效 diff 仍是同一 39 文件集,审查面就是三轮人工与机器人审查已经收敛的那个面;当前这个 head 上也已有一份维护者批准,我对增量的独立复读结论相同。真正的新信号是 Test (ubuntu-latest) 在整个序列中首次在本 head 转绿,清除了对此前"环境性失败"判断的最后一丝疑虑。这份代码维护起来不会让人骂人。

非阻塞小项,记录在案:被取消的 web-shell E2E Smoke 通道(Stage 2 已判定为环境性——同一代码约 40 分钟前全绿,重跑即可清除);lockfile 剥掉 npm libc 元数据字段;遗留项(作者延后的覆盖钉子、只有测试消费的 isRuntimeDiscoveredFacet);以及 Windows/Linux 启动器行为仍属作者声明。这些都不构成合并门禁。

批准锚定在已审查的提交上发布,并取代第二轮的 request-changes 审查——当时作为门禁的发现均已核实修复。与本次重跑一同触发的沙箱 /verify 仍在运行,若有发现会自行落到线程里。如果 head 移动,本批准不随之转移。

Qwen Code · qwen3.8-max

Reviewed at e5398dcec84af3c243176fb0fecc0a0f113c3d28 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

Built the PR base vs this PR head e5398dc, drove a fixed endpoint set against each, and diffed the JSON responses. Only fields that changed are shown.

capabilities

field PR base (before) this PR (after)
features[] "standalone_sessions_v1"
features[] "workspace_trust_hot_reload"
features[] "dynamic_workspace_registration"
features[] "scratch_workspace_registration"
features[] "web_terminal"

Qwen Code · serve A/B

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

Rendered against a mock daemon (no real backend): the PR base vs this PR head e5398dc. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

channel-editor-dark before/after

channel-editor-existing-dark before/after

channel-editor-existing-light before/after

channel-editor-light before/after

channel-manager-dark before/after

channel-manager-light before/after

code-review-artifact-dark before/after

code-review-artifact-light before/after

extensions-manager-dark before/after

extensions-manager-light before/after

git-mode-branch-dark before/after

git-mode-branch-light before/after

git-mode-chip-dark before/after

git-mode-chip-light before/after

git-mode-popover-dark before/after

git-mode-popover-light before/after

github-channel-editor-credential-dark before/after

github-channel-editor-credential-light before/after

github-channel-editor-dark before/after

github-channel-editor-light before/after

Full-resolution recordings (.webm) are attached to the workflow run.

Qwen Code · web-shell visuals

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.97% 84.97% 90.56% 84.72%
Core 89.01% 89.01% 90.69% 87.45%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.97 |    84.72 |   90.56 |   84.97 |                   
 src               |   86.57 |    82.86 |   88.88 |   86.57 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.59 |    77.73 |   80.76 |   73.59 | ...1367-1371,1498 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   76.13 |    79.02 |   94.03 |   76.13 |                   
  acpAgent.ts      |   75.19 |    78.62 |    93.3 |   75.19 | ...18,14241-14242 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |     95.6 |     100 |     100 | 121,196,242,259   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   76.99 |    71.56 |     100 |   76.99 | ...20-524,533-537 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |   97.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.09 |    86.58 |    95.7 |   91.09 |                   
  Session.ts       |   90.47 |    85.65 |   95.09 |   90.47 | ...84,14211-14215 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.68 |    91.97 |   97.14 |   95.68 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |    85.71 |     100 |     100 | 68,70             
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.65 |    80.81 |   94.01 |   86.65 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.54 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.67 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.45 |    78.26 |   65.62 |   90.45 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.94 |      100 |      50 |   98.94 | 106               
  serve.ts         |   89.06 |    75.72 |     100 |   89.06 | ...27-930,942,953 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.49 |    88.74 |   90.73 |   89.49 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.91 |    96.27 |     100 |   96.91 | ...60-265,323-326 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.72 |    85.81 |   94.33 |   93.72 | ...1305,1312-1313 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   92.07 |    90.61 |   93.59 |   92.07 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.79 |    96.81 |   94.11 |   94.79 | ...1192,1412-1450 
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.38 |    94.08 |    98.8 |   97.38 | ...7376-7420,7691 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.42 |    90.38 |   94.11 |   94.42 | ...1240,1275-1306 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.65 |    87.34 |   95.45 |   84.65 | ...43,859-913,927 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.23 |    80.45 |   88.88 |   81.23 | ...82-796,798-820 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.35 |    94.74 |    98.7 |   97.35 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.53 |    89.41 |     100 |   94.53 | ...36,669-670,837 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.53 |    90.56 |   95.73 |   94.53 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.92 |    91.37 |   88.63 |   88.92 | ...2485,2487-2495 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   95.65 |    97.36 |     100 |   95.65 | 137-142           
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |   98.91 |    84.61 |     100 |   98.91 | 332-333           
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.93 |    93.16 |   91.17 |   91.93 | ...1134,1136-1137 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   81.12 |     89.2 |   85.18 |   81.12 | ...03-621,628-636 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.72 |    95.17 |     100 |   99.72 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.57 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |    96.15 |     100 |     100 | 26                
 src/serve         |   87.75 |    85.47 |   91.37 |   87.75 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.33 |     100 |     100 | 774               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |    98.7 |    91.96 |     100 |    98.7 | ...1593,1595-1596 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |    91.4 |       82 |   95.45 |    91.4 | ...47-556,634-635 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...-path-open.ts |   96.12 |       97 |   93.33 |   96.12 | 114-123           
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.94 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   85.05 |    81.91 |    78.5 |   85.05 | ...9619,9637-9641 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   47.11 |    63.01 |   76.92 |   47.11 | ...1061,1073-1096 
  ...-keepalive.ts |   94.31 |    88.18 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.68 |     91.5 |   74.26 |   89.68 | ...3368,3399-3400 
  ...ments-root.ts |     100 |      100 |     100 |     100 |                   
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...ssion-gate.ts |   98.48 |    94.44 |     100 |   98.48 | 70                
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.65 |    80.18 |     100 |   98.65 | 111,139,193,196   
  ...tion-store.ts |    89.9 |    88.88 |   92.59 |    89.9 | ...03-412,423-426 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...93-594,601-602 
  ...e-remember.ts |   98.31 |    93.33 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.69 |     100 |   89.85 | ...06-207,275-296 
  ...oordinator.ts |   98.27 |    96.87 |     100 |   98.27 | 147-148           
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.91 |    73.04 |   96.29 |   72.91 | ...98-899,906-910 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.67 |    80.24 |   94.53 |   80.67 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.18 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |      76 |    76.98 |   93.44 |      76 | ...5819,5876-5882 
  index.ts         |   83.61 |     80.6 |   91.22 |   83.61 | ...2465,2551-2552 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.88 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   86.63 |    79.06 |   92.96 |   86.63 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.37 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.21 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   76.57 |    70.53 |    90.2 |   76.57 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   63.83 |    82.35 |   80.76 |   63.83 | ...45-446,460-475 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    90.09 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.64 |    82.04 |   95.95 |   86.64 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.96 |    95.12 |     100 |   98.96 | 102               
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |   98.49 |    93.56 |     100 |   98.49 | ...99,601,821-822 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.69 |     83.3 |   94.61 |   86.69 | ...7436,7438-7439 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.13 |    80.79 |     100 |   87.13 | ...90-492,495-500 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  user-language.ts |   99.24 |    87.87 |     100 |   99.24 | 167               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.27 |    80.75 |      90 |   83.27 | ...1071,1076,1083 
  ...extensions.ts |   89.92 |     79.5 |   94.36 |   89.92 | ...2588,2633-2634 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   77.16 |    72.02 |     100 |   77.16 | ...42-647,656-663 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...local-open.ts |     100 |    93.75 |     100 |     100 | 54                
  ...management.ts |   87.22 |    84.17 |     100 |   87.22 | ...1823,1833-1838 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...ce-runtime.ts |     100 |    96.55 |     100 |     100 | 117               
  ...e-settings.ts |      79 |    78.49 |     100 |      79 | ...92-893,919-922 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.73 |    91.63 |   96.24 |   93.73 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   89.67 |    82.69 |     100 |   89.67 | ...1007,1034-1043 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |   95.39 |     87.5 |     100 |   95.39 | 200-206           
  ...on-archive.ts |   92.46 |    90.49 |   97.61 |   92.46 | ...1150,1191-1192 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |    97.4 |    93.75 |     100 |    97.4 | ...1192,1401-1405 
  ...pr-refresh.ts |   99.37 |    97.01 |     100 |   99.37 | 69-70             
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.18 |    97.65 |     100 |   99.18 | ...95,882,961-963 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |      90 |    87.33 |   91.66 |      90 |                   
  index.ts         |   89.65 |    86.98 |   90.47 |   89.65 | ...1393,1407,1421 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.72 |     89.8 |   98.13 |   92.72 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    86.48 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.95 |    93.44 |     100 |   97.95 | 186,193-194       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.77 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |   93.03 |    88.57 |      95 |   93.03 |                   
  scheduler.ts     |   93.03 |    88.57 |      95 |   93.03 | ...70-372,424-428 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.68 |    78.68 |   72.18 |   71.68 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   73.75 |    70.24 |   61.22 |   73.75 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |    75.67 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   79.13 |     57.4 |     100 |   79.13 | ...01,424,431-437 
 src/ui/commands   |   84.71 |     84.5 |   91.66 |   84.71 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.72 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.96 |    74.68 |   83.33 |   73.96 | ...76-609,620-621 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.31 |    81.81 |     100 |   78.31 | 37-52,73,92       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   74.09 |    80.37 |   78.96 |   74.09 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |    89.2 |    91.13 |     100 |    89.2 | ...92-294,308-310 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   84.02 |    74.19 |     100 |   84.02 | ...04,410,452-474 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.71 |    87.78 |   86.53 |   90.71 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |    96.07 |   76.92 |   92.35 | ...59-361,364-367 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |   86.34 |    82.18 |    86.6 |   86.34 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    4.07 |      100 |       0 |    4.07 |                   
  ...gerDialog.tsx |    4.07 |      100 |       0 |    4.07 | 78-136,139-667    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   69.22 |    71.81 |   61.11 |   69.22 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.27 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |    86.5 |    84.46 |   88.88 |    86.5 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.87 |    85.13 |   85.18 |   88.87 | ...6265,6267,6372 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |    97.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.64 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.26 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/opentui    |   64.46 |     80.8 |   76.82 |   64.46 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  ...t-tool-run.ts |   97.26 |     62.5 |   66.66 |   97.26 | 116,130           
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...s-dispatch.ts |   80.59 |    84.02 |   73.07 |   80.59 | ...6-970,993-1004 
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  ...s-registry.ts |    98.8 |    89.36 |     100 |    98.8 | 177-179           
  dialog-data.ts   |   82.48 |    72.08 |   89.65 |   82.48 | ...1291,1295-1325 
  ...ogs-arena.tsx |       0 |      100 |     100 |       0 | 3-818             
  dialogs-auth.tsx |   76.17 |    66.85 |      84 |   76.17 | ...41,957,966-982 
  dialogs-core.ts  |     100 |    94.44 |     100 |     100 | 179,190           
  ...xtensions.tsx |   89.06 |     82.7 |   78.57 |   89.06 | ...33-636,659-661 
  dialogs-mcp.tsx  |   29.85 |    98.71 |      90 |   29.85 | 295,320-872       
  ...ry-status.tsx |   22.58 |       80 |   28.57 |   22.58 | ...11-154,159-175 
  dialogs-misc.tsx |   12.02 |      100 |      20 |   12.02 | ...47-655,658-712 
  ...ogs-model.tsx |   45.95 |    96.77 |   76.92 |   45.95 | ...72-173,243-408 
  ...ogs-modes.tsx |       0 |      100 |     100 |       0 | 3-222             
  ...rmissions.tsx |   18.65 |    89.28 |   83.33 |   18.65 | ...58-159,201-734 
  ...-settings.tsx |   20.25 |    84.61 |    90.9 |   20.25 | ...71,239,254-870 
  ...gs-shared.tsx |   82.86 |    80.28 |   46.15 |   82.86 | ...51,453-456,472 
  ...ts-skills.tsx |     5.8 |      100 |       0 |     5.8 | ...04-381,391-458 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  diff-render.ts   |   97.87 |    95.23 |     100 |   97.87 | 89-90             
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |      91 |    74.54 |   88.88 |      91 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  ...rust-gate.tsx |   98.55 |    96.55 |      75 |   98.55 | 190-191           
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  help-overlay.tsx |       0 |      100 |     100 |       0 | 3-281             
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...prompt-key.ts |     100 |      100 |     100 |     100 |                   
  ...ompt-model.ts |   85.41 |    87.81 |   84.09 |   85.41 | ...1127,1130-1140 
  input-prompt.tsx |   81.95 |    68.01 |      28 |   81.95 | ...1071,1085-1087 
  ...projection.ts |   81.16 |    62.66 |   86.66 |   81.16 | ...1077-1082,1084 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  ...sion-model.ts |   83.77 |       85 |   85.71 |   83.77 | ...40-550,623,679 
  live-session.ts  |   87.37 |    83.17 |   73.68 |   87.37 | ...60,462,479-489 
  markdown-heal.ts |     100 |      100 |     100 |     100 |                   
  ...rogressive.ts |   85.41 |    83.33 |   71.42 |   85.41 | 53,60-62,89-91    
  messages.tsx     |   58.82 |     79.1 |   73.68 |   58.82 | ...93-409,417-474 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  mouse-rows.ts    |     100 |      100 |     100 |     100 |                   
  ...-scrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...app-shell.tsx |   94.94 |    90.19 |   63.63 |   94.94 | ...45-246,251-253 
  ...log-mount.tsx |   71.92 |    90.62 |   28.57 |   71.92 | ...53,473,548-564 
  ...-boundary.tsx |   95.91 |      100 |   85.71 |   95.91 | 82-83             
  opentui-host.ts  |   97.53 |    94.73 |   97.43 |   97.53 | ...04,216,236-237 
  ...ui-runtime.ts |   93.57 |    80.95 |     100 |   93.57 | 97-101,152,173    
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...me-session.ts |   72.34 |    77.77 |   57.14 |   72.34 | 40,44,59-63,76-81 
  ...ompaction.tsx |   76.19 |      100 |   66.66 |   76.19 | 106-130           
  ...wind-model.ts |    94.7 |    87.23 |     100 |    94.7 | 245-252,254       
  ...on-rewind.tsx |       0 |      100 |     100 |       0 | 3-391             
  ...ion-switch.ts |   74.74 |       50 |     100 |   74.74 | ...92-401,411-414 
  ...h-dispatch.ts |   56.86 |    38.88 |      50 |   56.86 | ...13-126,130-137 
  slash-gateway.ts |   96.82 |       90 |   81.81 |   96.82 | 70-71             
  sticky-todos.ts  |     100 |      100 |     100 |     100 |                   
  text-batcher.ts  |     100 |      100 |     100 |     100 |                   
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
  ...pt-adapter.ts |   89.56 |       75 |   33.33 |   89.56 | ...50-152,172-173 
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.14 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   88.07 |    86.06 |   96.15 |   88.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.73 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.45 |     100 |     100 | 84                
  mouse-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |      90 |     87.5 |     100 |      90 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.75 |    95.96 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.31 |    90.01 |   96.11 |   92.31 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.14 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   96.05 |    93.79 |     100 |   96.05 | ...,85-86,334,443 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.44 |    97.36 |     100 |   99.44 | 121               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   89.01 |    87.45 |   90.69 |   89.01 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.41 |    85.01 |   94.02 |   90.41 |                   
  ...transcript.ts |   89.09 |    84.15 |     100 |   89.09 | ...93,701,707-711 
  ...ent-resume.ts |    85.4 |    78.02 |    85.1 |    85.4 | ...1842-1846,1849 
  ...ound-tasks.ts |   95.19 |    90.72 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   95.91 |    87.12 |   94.44 |   95.91 | ...76-478,601,728 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.64 |    88.67 |   95.71 |   94.64 | ...1676,1690-1692 
  ...w-snapshot.ts |   75.58 |    72.47 |    87.5 |   75.58 | ...24,448,455-457 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.87 |    68.43 |   78.94 |   76.87 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    75.8 |    65.46 |   78.57 |    75.8 | ...1879,1885-1886 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   77.78 |    86.68 |   75.86 |   77.78 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.14 |    90.74 |   97.05 |   92.14 | ...38-539,673-679 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.49 |    87.53 |   91.66 |   93.49 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  ...-test-mock.ts |   98.82 |    66.66 |   58.33 |   98.82 | 85                
  agent-core.ts    |   90.33 |    80.45 |   81.25 |   90.33 | ...2628,2674-2676 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.67 |       90 |   83.33 |   93.67 | ...13-514,517-518 
  ...nteractive.ts |   83.48 |    85.13 |      80 |   83.48 | ...35,537,544,549 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.87 |     90.5 |     100 |   93.87 | ...2225,2318-2321 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.08 |     85.4 |   95.65 |   94.08 | ...68,435,455-458 
  ...ow-sandbox.ts |    97.4 |    89.37 |     100 |    97.4 | ...1846,1852-1853 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   86.16 |    87.04 |   91.21 |   86.16 |                   
  TeamManager.ts   |   80.68 |    85.84 |   84.37 |   80.68 | ...2123,2146-2147 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.84 |    84.23 |     100 |   89.84 | ...1013,1057-1058 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |   92.99 |    94.52 |      95 |   92.99 | ...29-330,415-425 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.28 |    95.34 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |    85.71 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.96 |     100 |     100 | 189,198           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   86.62 |    88.94 |   79.11 |   86.62 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   85.26 |    88.29 |    77.2 |   85.26 | ...9854,9858-9860 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...ver-config.ts |   97.29 |      100 |   83.33 |   97.29 | 48-49             
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.79 |    88.67 |   94.05 |   92.79 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.33 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.1 |    88.04 |   92.23 |    92.1 | ...4966,5064-5065 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...09-510,555-561 
  ...lScheduler.ts |   90.22 |    84.87 |   94.78 |   90.22 | ...6545,6573-6589 
  ...entContext.ts |   96.67 |    90.25 |   96.77 |   96.67 | ...48,450-451,518 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  llm-chat.ts      |   95.32 |    90.98 |   96.66 |   95.32 | ...5891,5936-5937 
  llm-request.ts   |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   94.11 |    91.47 |   86.36 |   94.11 | ...1311,1514-1515 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  stream-guards.ts |   91.16 |    93.18 |     100 |   91.16 | ...89,218-229,294 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |     92.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.21 |    94.69 |     100 |   99.21 | 787-788,857       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.62 |    89.21 |   97.43 |   96.62 |                   
  ...tGenerator.ts |   97.71 |    89.13 |   97.43 |   97.71 | ...1539,1568,1579 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.41 |    90.88 |   96.33 |   92.41 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.25 |    89.67 |   96.87 |   91.25 | ...1946,2115-2130 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |    96.3 |    91.36 |     100 |    96.3 | ...1204-1205,1312 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.24 |    92.01 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.27 |    90.56 |     100 |   95.27 | ...52-153,166-167 
  default.ts       |   98.87 |    96.07 |     100 |   98.87 | 178,304           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   89.29 |    86.66 |   93.68 |   89.29 |                   
  ...ive-safety.ts |    97.9 |     92.8 |     100 |    97.9 | 235-236,313-316   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   93.05 |    89.59 |   98.36 |   93.05 | ...1694-1700,1744 
  ...ionManager.ts |   85.41 |    84.48 |   83.49 |   85.41 | ...3261,3299-3300 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |   78.91 |    86.04 |   85.71 |   78.91 | ...95,202,214-248 
  github.ts        |   92.61 |    87.44 |     100 |   92.61 | ...1310-1311,1321 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |    93.7 |    90.48 |   95.32 |    93.7 |                   
  ...eGoalStore.ts |   87.61 |    89.28 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.96 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.79 |   97.36 |   95.75 | ...76,666,684-685 
  goal-runtime.ts  |   96.54 |    90.73 |   96.49 |   96.54 | ...1649-1650,1794 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   97.58 |    94.27 |   97.72 |   97.58 | ...96-697,915-916 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.53 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   90.62 |    87.01 |   90.32 |   90.62 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.87 |    94.11 |     100 |   96.87 | 68-69             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.64 |    85.71 |   94.73 |   95.64 | ...1059-1060,1070 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   85.68 |    82.96 |    92.3 |   85.68 | ...1289,1299-1302 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...62-763,769-770 
  ...HookRunner.ts |   79.12 |    66.66 |      80 |   79.12 | ...38-439,457-461 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   82.47 |    84.21 |      75 |   82.47 | 63-67,174-189     
  ...oksManager.ts |   94.89 |    90.47 |     100 |   94.89 | ...97,338,340-342 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ipc           |   94.64 |    94.01 |   96.72 |   94.64 |                   
  inbound-gate.ts  |   98.99 |    89.71 |     100 |   98.99 | 557-559           
  ...-directory.ts |     100 |      100 |     100 |     100 |                   
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.61 |    97.22 |     100 |   97.61 | 262-264           
  peer-routing.ts  |     100 |      100 |     100 |     100 |                   
  peer-send.ts     |   97.17 |     98.3 |   88.88 |   97.17 | 183-187           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   88.52 |    92.59 |   85.71 |   88.52 | 172-185           
  uds-inbox.ts     |   82.42 |    84.09 |     100 |   82.42 | ...33,240-250,282 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   89.47 |    85.73 |    92.1 |   89.47 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.71 |    81.14 |   94.44 |   90.71 | ...17,640,657-663 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |   78.43 |    83.16 |   77.77 |   78.43 | ...1493,1506-1508 
  ...ent-config.ts |   92.22 |    84.78 |      92 |   92.22 | ...64,473-474,478 
  memoryAge.ts     |   90.47 |    84.61 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   97.21 |    95.29 |     100 |   97.21 | ...29,341,345-347 
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   79.76 |    76.84 |      80 |   79.76 | ...69-473,476,482 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   91.82 |    89.35 |   89.15 |   91.82 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   91.11 |    93.02 |     100 |   91.11 | 155,161,164-173   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    64.51 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.03 |     100 |     100 | 181,266           
  modelsConfig.ts  |   88.45 |    86.88 |   83.72 |   88.45 | ...1437,1460-1461 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   84.54 |    91.72 |   71.88 |   84.54 |                   
  autoMode.ts      |   97.75 |    93.42 |     100 |   97.75 | ...91-598,644,721 
  ...transcript.ts |   98.51 |    86.11 |     100 |   98.51 | 264-265           
  classifier.ts    |      94 |    94.44 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    90.19 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |    88.4 |    92.27 |   82.85 |    88.4 | ...1408,1514-1518 
  rule-parser.ts   |   94.92 |    92.81 |     100 |   94.92 | ...1555,1589-1591 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.06 |    95.23 |     100 |   99.06 |                   
  system-prompt.ts |   99.06 |    95.23 |     100 |   99.06 | 235               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.79 |    86.51 |   96.56 |   90.79 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.47 |    88.69 |     100 |   98.47 | 85-86,109,473-474 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.82 |    96.77 |     100 |   97.82 | ...1150,1294-1302 
  ...ingService.ts |   92.25 |    87.61 |   94.79 |   92.25 | ...2924,2939-2940 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |   97.85 |    95.23 |     100 |   97.85 | ...64-365,485-488 
  cronScheduler.ts |   94.11 |    89.74 |   98.03 |   94.11 | ...1366,1775-1776 
  cronTasksFile.ts |   95.88 |       92 |     100 |   95.88 | ...72,381-382,520 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   97.85 |    94.07 |     100 |   97.85 | ...1217,1240-1241 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |    92.3 |    91.08 |   93.75 |    92.3 | ...77-188,250-251 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |    98.8 |    96.73 |     100 |    98.8 | 630,684-685,743   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   84.56 |       75 |    97.8 |   84.56 | ...2666,2688,2702 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.91 |    87.93 |   92.36 |   89.91 | ...4590-4591,4632 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    95.83 |     100 |     100 | 139               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.06 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.06 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.95 |     86.4 |   94.73 |   89.95 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   95.02 |    87.87 |     100 |   95.02 | ...19,239,251-253 
  skill-manager.ts |    86.6 |     86.6 |   86.11 |    86.6 | ...1286,1293-1297 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 289-290           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   89.01 |    89.44 |   98.41 |   89.01 |                   
  ...ter-schema.ts |     100 |    98.18 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |    85.9 |    86.56 |   97.67 |    85.9 | ...1682,1759-1760 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   94.14 |    95.23 |     100 |   94.14 | 47-52,65-66,71-76 
 src/telemetry     |   83.24 |    84.96 |   86.51 |   83.24 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.88 |    92.85 |   83.78 |   87.88 | ...55-561,564-568 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.83 |    77.24 |   66.66 |   60.83 | ...1523,1540-1560 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.29 |    88.88 |   86.36 |   83.29 | ...1470,1474-1481 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...ry/qwen-logger |   74.14 |       80 |      70 |   74.14 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.14 |    79.82 |   69.49 |   74.14 | ...1123,1161-1162 
 src/test-utils    |   97.69 |    98.66 |   86.36 |   97.69 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   97.14 |      100 |   82.85 |   97.14 | 85-86,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.88 |    86.45 |   90.46 |   87.88 |                   
  ...erQuestion.ts |      90 |    82.75 |   92.85 |      90 | ...01-402,409-410 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   96.52 |    95.55 |    87.5 |   96.52 | 37-38,53-54       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...fier-input.ts |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.55 |    88.01 |   94.02 |   86.55 | ...2581,2585-2588 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1342,1350-1351 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.14 |     93.2 |     100 |   98.14 | ...1269,1324-1325 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |      96 |       85 |     100 |      96 | ...42,595,605-609 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.13 |    93.93 |    92.3 |   99.13 | 255-257           
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   86.86 |    93.18 |      75 |   86.86 | ...20-426,568-575 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   97.15 |    90.79 |   92.59 |   97.15 | ...43,737-740,744 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   87.57 |    78.94 |     100 |   87.57 | ...71,157,161-168 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   88.67 |     87.5 |   85.71 |   88.67 | ...2-48,72-73,129 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.99 |    91.84 |   93.75 |   95.99 | ...21-625,638-643 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.72 |    82.95 |   86.53 |   80.72 | ...1106,1114-1115 
  ...-finalizer.ts |    98.1 |    92.36 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |    96.2 |    89.79 |   93.75 |    96.2 | ...10,260-265,428 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...67-568,584-590 
  truncation.ts    |   90.72 |    90.51 |     100 |   90.72 | ...65-473,510-516 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   86.69 |    88.65 |   89.71 |   86.69 |                   
  agent.ts         |   85.26 |    87.84 |   87.35 |   85.26 | ...4379,4413-4423 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   89.29 |    86.71 |   83.33 |   89.29 |                   
  workflow.ts      |   89.29 |    86.71 |   83.33 |   89.29 | ...91-892,991-992 
 src/utils         |   92.96 |     89.9 |   97.02 |   92.96 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |       90 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   99.49 |    96.25 |     100 |   99.49 | 224               
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.59 |    90.32 |     100 |   94.59 | 40-41,137-138     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    92.99 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |   93.77 |     87.2 |   96.96 |   93.77 | ...1038-1039,1147 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.39 |    81.95 |     100 |   95.39 | ...1075,1421-1422 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  ...-pr-issues.ts |   99.45 |    97.14 |     100 |   99.45 | 182               
  github-prs.ts    |   96.06 |    84.09 |     100 |   96.06 | 252,351-359       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.36 |    91.07 |     100 |   95.36 | ...99-203,275-279 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.75 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.24 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  ...ollow-open.ts |     100 |    93.33 |     100 |     100 | 134,177           
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.42 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  ...load-error.ts |   93.47 |    88.23 |     100 |   93.47 | 64-65,80          
  retry.ts         |   96.09 |    92.23 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.05 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.22 |    98.01 |     100 |   98.22 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.55 |    90.54 |     100 |   96.55 | ...34,650,734,753 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.57 |     100 |    98.3 | ...1340-1342,1352 
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |     86.2 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |     62.5 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.61 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run.

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Static review — feat(web-shell): declutter the workspace sidebar and add loopback open actions

Reviewed statically against head ad677a3 (the full feature at dbe608f plus the one-commit env-guard registration delta). All claims below were verified by reading the head tree; no tests were executed.

CI at posting: on head ad677a3, Test (ubuntu) is still running (its pre-test lint/schema steps are all green; only the test step is pending), and every other substantive lane is green — Serve A/B, Desktop Shell (both OSes), Integration (no-AK), Real daemon E2E, security scans, and the web-shell visual capture (whose lane carries continue-on-error, so the artifact's render-status.txt = success was checked directly). The earlier Test red on the previous head was the env-guard registration, fixed by the delta commit.

What holds up well

  • The daemon route fails closed in the right order: workspace_mismatch (400) → runtime unavailable (503 + Retry-After) → untrusted (403), all before anything is launched; the opened path is always the registry-resolved runtime.workspaceCwd, and the request body is whitelist-mapped to folder/terminal via safeBody — there is no client-supplied path surface.
  • All launchers are argv-array spawns with no shell interpolation; the xterm fallback passes the path positionally (-e sh -c 'cd "$1" && exec …' sh <path>); the availability probes fail closed across SSH markers, uid 0, missing display variables, and the "xdg-open is a directory" trap.
  • Capability wiring mirrors native_directory_picker end to end: the probes are evaluated once at startup, pinned by deps overrides in tests, advertised through both bootstrap envelopes, and the client double-gates on the advertised tags plus isLocalDaemon() (which can only under-report, never over-report).
  • The name-width cap math is precise (headerActionCount only overestimates, and the three CSS tiers leave a constant 3px margin), and the deletion audit is clean: the removed WorkspaceOverview leaves no orphaned references, formatOverviewValue was relocated rather than duplicated, and the facet-poll semantics (poll only while expanded, retain snapshots when collapsed) are preserved.
  • The follow-up delta commit registering the env-guard allowance is exact: local-path-open.ts reads the whole process.env exactly three times (two probe default arguments plus the Linux terminal spawn), matching accesses: { whole: 3 }. This also explains the earlier Test (ubuntu) red on the previous head — it was the env-guard test failing, not a product bug.

Findings

🟡 Important — diagnostic info moved behind a pointer-only surface (keyboard/screen-reader regression)

Locations: WorkspaceDetailsTooltip.tsx (anchor wiring at :194-217 binds onPointerEnter/onPointerLeave only — no onFocus/onBlur), WorkspaceSection.tsx :726-749, WebShellSidebar.tsx :5776-5779.

Before this change the full path, branch, session counts and facet chips were permanent inline DOM text on every expanded workspace. They now live exclusively in a popover that opens after 300ms of pointer hover. The one keyboard-reachable surface that still shows facet counts is the "Manage workspace" section of WorkspaceMenu, but that section is gated by canManage = ws.primary && ws.trusted && … — so on any non-primary workspace, keyboard-only and assistive-tech users have no remaining access to the session breakdown (e.g. how many sessions need attention) or the facet counts, including the failed-MCP highlight. Concrete cost: information that was accessible before this PR is now pointer-exclusive for a real user population.

Suggested fix: mirror the pointer handlers with onFocus={openAfterDelay} and a delayed onBlur close on the tooltip anchor (reusing the existing timers), or surface the counts in the per-workspace menu regardless of canManage.

🟢 Minor — win32 folder open on a deleted directory reports opened: true

local-path-open.ts :128-130 with :223-225 (explorer exit codes are intentionally ignored) and routes/workspace-local-open.ts :48-52. If a registered workspace directory is renamed or deleted externally while its runtime stays active, explorer.exe opens Quick Access/This PC and the route still answers 200 opened: true. darwin/linux fail the same case with 501 (open/xdg-open reject missing paths), so the platforms disagree. Suggested fix: an fs.statSync existence pre-check on the win32 branch that throws LocalPathOpenUnavailableError (→ 501).

🟢 Minor — formatDateTime cross-midnight ambiguity

utils/formatDateTime.ts :11-15. The branch decision uses absolute elapsed milliseconds while the display is wall-clock: at 08:00 today, a session from yesterday 08:01 renders 08:01:00, visually indistinguishable from a session one minute old. Suggested fix: compare calendar days instead of elapsed time (or prefix a date for non-today timestamps).

🟢 Minor — orphaned i18n key sidebar.overview.label

Defined at i18n.tsx :1408 (EN) and :4613 (ZH) but its only consumer (the removed chip list) is gone in this PR; a full-tree grep finds no remaining reference. Delete both definitions.

💡 Suggestion — two tautological assertions in WorkspaceDetailsTooltip.test.tsx

The success case asserts querySelector('svg') != null (:191), but both FolderOpenIcon and CheckIcon are svgs, so the icon swap is not actually pinned; the failure case asserts disabled === false (:218), but the implementation never sets disabled. If either behavior regresses the tests stay green. Consider asserting the concrete icon or markup change instead.

Cross-check of the earlier triage thread's two suggestions (independently verified)

  • Windows cmd.exe fallback quoting: confirmed real, with one addition — because Node's CreateProcess backslash-escaping and cmd.exe's quote-toggling disagree, paths containing merely spaces also mis-parse on the fallback, silently opening the terminal in the wrong directory while the route reports success; names with quotes/ampersands are worse. Exposure stays bounded (fallback only when wt.exe is absent; the path is a trusted, server-resolved workspace cwd), and the fix directions suggested in the thread (PowerShell Start-Process, or rejecting shell-active characters, or verbatim arguments) remain the right options.
  • Protocol doc table pipe: confirmed — the workspace_local_open row contains an unescaped | inside its description, so that row renders three columns and the separator row grew an extra segment; the capabilities-docs contract test extracts tags by line-start regex only, so it cannot catch this.

Verdict

💬 Comment. No correctness, security, or data-integrity blockers were found; the daemon side fails closed everywhere probed and the deletion audit is clean. The one 🟡 (accessibility of the moved diagnostics) is what keeps this from an approve; the three 🟢 are cheap follow-ups.


中文摘要

针对 head ad677a3(dbe608ff2 的完整功能 + 一个 env-guard 注册增量提交)完成纯静态审查,所有结论均通过在 head tree 读码核实,未运行任何测试。

发布时 CI:head ad677a3 上 Test (ubuntu) 仍在运行(其测试前的 lint/schema 步骤已全部为绿,仅剩测试本体一步),其余实质车道全部为绿——Serve A/B、Desktop Shell(双平台)、集成(no-AK)、真实 daemon E2E、安全扫描,以及 web-shell 视觉捕获(该车道带 continue-on-error,已直接核对 artifact 内的 render-status.txt = success)。上一个 head 的 Test 红灯是 env-guard 注册问题,已由增量提交修复。

做得好的地方

  • 守护进程路由的失败关闭顺序正确:workspace_mismatch(400) → runtime 不可用(503+Retry-After) → 未信任(403),全部先于任何启动动作;打开的路径恒为注册表解析的 runtime.workspaceCwd,请求体经 safeBody 白名单映射为 folder/terminal,无客户端可控路径面。
  • 所有启动器均为 argv 数组 spawn、无 shell 插值;xterm 回退以位置参数传路径;可用性探测在 SSH 标记、uid 0、缺失显示变量、"xdg-open 是目录"等场景全部失败关闭。
  • 能力接线与 native_directory_picker 端到端同构:探测仅启动期求值一次、测试以 deps 覆盖锁定、两个引导包络都宣告、客户端在能力标签之外叠加 isLocalDaemon() 双门槛(只会漏报不会误报)。
  • 名字宽度封顶计算精确(headerActionCount 只会高估,CSS 三档恒留 3px),删除审计干净:被移除的 WorkspaceOverview 无孤儿引用,formatOverviewValue 是迁移而非复制,facet 轮询语义(仅展开时轮询、折叠保留快照)保持不变。
  • 增量提交注册的 env-guard 允许项精确:local-path-open.ts 恰好三处读取整个 process.env(两处探测默认参数 + Linux 终端 spawn),与 accesses: { whole: 3 } 吻合。这也解释了上一个 head 的 Test (ubuntu) 红灯——是 env-guard 测试失败,不是产品 bug。

发现

🟡 Important —— 诊断信息移入纯指针触发的弹层(键盘/读屏可达性回退):改动前完整路径、分支、会话计数、facet 芯片是常驻行内文本;现在只存在于 hover 300ms 打开的弹层,锚点只有 onPointerEnter/onPointerLeave,无 onFocus 路径。唯一能展示 facet 计数的键盘可达面是工作区菜单的"管理"区,但它仅主工作区可见(canManage 要求 ws.primary)。非主工作区的会话明细与 facet 计数(含 MCP 失败高亮)对纯键盘用户彻底不可达。建议:锚点补 onFocus/延迟 onBlur(复用现有定时器),或让菜单对所有工作区展示计数。

🟢 Minor —— win32 下目录已删除时打开文件夹仍返回 opened: truelocal-path-open.ts :128-130/:223-225 + 路由 :48-52):explorer 退出码被有意忽略,注册目录被外部删除/改名后资源管理器打开"此电脑"而路由报成功;darwin/linux 同场景返回 501,平台不一致。建议 win32 分支加存在性预检。

🟢 Minor —— formatDateTime 跨午夜歧义formatDateTime.ts :11-15):判定用绝对毫秒差、显示用墙钟——今天 08:00 时昨天 08:01 的会话显示 08:01:00,与一分钟前的会话无法区分。建议按日历日判定。

🟢 Minor —— 孤儿 i18n 键 sidebar.overview.labeli18n.tsx :1408/:4613):唯一消费者已随本 PR 移除,全树无引用,建议两处定义一并删除。

💡 建议 —— WorkspaceDetailsTooltip.test.tsx 两处恒真断言:成功用例只断言存在任意 svg(两个图标都是 svg,切换未被锁定);失败用例断言 disabled === false 但实现从不设置 disabled。建议改为断言具体图标或标记变化。

对早前分诊线程两条建议的独立复核

  • Windows cmd.exe 回退引号问题:属实且补充一点——Node CreateProcess 的反斜杠转义与 cmd.exe 的引号翻转解析不一致,仅含空格的路径在回退路径上也会断词,终端静默开在错误目录而路由报成功;含引号/& 的目录名更糟。暴露面仍然受限(仅无 wt.exe 时走回退、路径为受信的服务端解析工作区路径),线程中给出的修复方向(PowerShell Start-Process / 拒绝 shell 活性字符 / verbatim 参数)依然成立。
  • 协议文档表格竖线:属实——该行描述内未转义的 | 使其渲染为三列、分隔行多出一段;能力文档契约测试只按行首正则提取标签名,无法发现此损坏。

结论

💬 评论。未发现正确性、安全或数据完整性阻塞项;守护进程侧处处失败关闭,删除审计干净。唯一的 🟡(诊断信息可达性)是不给批准的原因,三个 🟢 均为低成本跟进项。

…ce-hover-details

# Conflicts:
#	docs/developers/qwen-serve-protocol.md
#	integration-tests/cli/qwen-serve-routes.test.ts
#	packages/cli/src/serve/capabilities.ts
#	packages/cli/src/serve/run-qwen-serve.ts
#	packages/cli/src/serve/server.test.ts
#	packages/cli/src/serve/server.ts
#	packages/cli/src/serve/server/serve-features.ts
@wenshao

wenshao commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator Author

All findings addressed in c98701ab28 (plus the 0731457d3f merge that resolved the protocol-doc table pipe as part of the conflict resolution):

🟡 Accessibility of the moved diagnostics — the tooltip anchor now mirrors the pointer handlers with onFocus (same 300 ms open delay) and a delayed onBlur close, so keyboard and assistive-tech users reach the popover through the header button. Because the content is portaled, the close logic checks both trees (anchor + content ref), so Tab into the popover's folder/terminal buttons no longer dismisses it. Pinned by a new focus-open test.

🟢 win32 folder open on a deleted directory — both win32 branches now stat the target first and throw LocalPathOpenUnavailableError (→ 501), matching darwin/linux. Test: a missing directory rejects before any spawn for both folder and terminal.

🟢 formatDateTime cross-midnight ambiguity — the branch now compares local calendar days (toDateString) instead of elapsed milliseconds; yesterday 08:01 renders 2026-…-…, never a misleading 08:01:00. Boundary tests updated.

🟢 Orphaned i18n keysidebar.overview.label deleted from both locales (verified no remaining reference).

💡 Tautological test assertions — the success case now pins the concrete icon swap (lucide-check appears, lucide-folder-open disappears); the failure case pins the inverse.

Windows cmd.exe fallback quoting — the fallback no longer routes the path through cmd.exe start's re-parsed command line at all: PowerShell expands it from an injected environment variable (Start-Process cmd.exe -ArgumentList "/k cd /d \"$env:QWEN_LOCAL_OPEN_DIR\""), so spaces and shell-active characters cannot mis-parse. The env-guard allowance was updated (whole: 3 → 4) with the handoff documented.

Protocol doc table pipe — fixed during the main-merge conflict resolution: the row now says `target` set to `folder` or `terminal` with no unescaped pipe (row verified at exactly 3 pipes).

Verification: 324 web-shell sidebar/util unit tests, 46 daemon local-open/guard tests, the filtered serve capability suites, the 4-spec web-shell.workspace-overview e2e, and a root npm run typecheck — all green on macOS.

ytahdn
ytahdn previously approved these changes Aug 31, 2026

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review — fix commit for the accessibility and platform edge-case findings

Re-reviewed statically against head c98701a (the author fix commit on top of the origin/main merge). The merge brought ~2,900 lines of main-forwarding; the substantive author delta is the single fix commit (440 lines across 8 files), whose scope maps exactly onto my round-1 findings. Every resolution below was verified by reading the new head tree, not taken from the commit message. No tests were executed.

CI at posting: on head c98701a only the automated labeling/review lanes have reported so far; the primary test suite (Test ubuntu, Serve A/B, Desktop Shell, Integration, E2E) has not yet reported at the time of this review. The merge queue still requires those green before merge regardless.

Round-1 findings — resolution verified

🟡→✅ Accessibility (the only round-1 Important). The pointer-only popover is now keyboard-reachable. WorkspaceDetailsTooltip.tsx :207-243 wires onFocus/onBlur on the anchor (open after the same 300 ms delay as hover) and onFocus={cancelClose}/onBlur on the portaled content, with a containsFocusTarget helper (:170-173) that spans both the anchor and the portal tree via anchorRef/contentRef so focus moving between the header button and the popover does not close it. onOpenAutoFocus is still preventDefault, so focus is not stolen off the header. A new test (WorkspaceDetailsTooltip.test.tsx :296-322) pins keyboard-focus open via a bubbling focusin + 300 ms, asserting the [role="dialog"] renders the cwd; the file already restores real timers in afterEach. Resolved.

🟢→✅ win32 deleted-directory honesty. local-path-open.ts :133 and :173 call a new assertPathExists (:153-159, statSync → throw LocalPathOpenUnavailableError) before launching explorer.exe / wt.exe. The route (routes/workspace-local-open.ts :53-61) maps that error to 501 and only answers opened: true when no throw, so a deleted/renamed workspace dir now fails on win32 exactly like darwin/linux instead of silently opening Quick Access. New test pins rejection-without-spawn. Resolved.

🟢→✅ formatDateTime cross-midnight. formatDateTime.ts :10 now branches on calendar-day equality (date.toDateString() === new Date(now).toDateString()) instead of elapsed milliseconds, so yesterday 08:01 can no longer masquerade as today 08:01. Tests updated to pin the across-midnight case. Resolved.

🟢→✅ orphaned i18n key. sidebar.overview.label removed from both EN and ZH; a tree-wide grep finds no remaining reference. Resolved.

💡→✅ tautological assertions. The icon-swap tests now assert the concrete svg.lucide-check / svg.lucide-folder-open selectors (WorkspaceDetailsTooltip.test.tsx :190-191, :217-219), matching the lucide-* class convention already used elsewhere (e.g. ArtifactPanel.test.tsx), so an icon regression can no longer stay green. Resolved.

Cross-check item from round 1 — also addressed

Windows cmd.exe start fallback quoting. The fallback in spawnWindowsTerminal (:194-215) no longer threads the path through a re-parsed cmd.exe start command line. It now spawns powershell.exe -NoProfile -STA -Command 'Start-Process cmd.exe -ArgumentList "/k cd /d $env:QWEN_LOCAL_OPEN_DIR""' and hands the directory via a new QWEN_LOCAL_OPEN_DIR env var (spawnAndIgnoreExitCode :246-255 spreads process.env only when extraEnv is passed). This is one of the fix directions from the earlier triage thread, and space-containing paths no longer mis-parse. The added whole-process.env read is reflected in the env-guard allowance bump whole: 3 → 4 (process-env-guard.test.ts :225-235), which matches the actual four accesses in local-path-open.ts (:75, :88, :218, :254).

Separately, the protocol-doc capability table row for workspace_local_open that round 1 flagged for an unescaped pipe is now clean at this head (each row is a well-formed 2-column row), so no doc follow-up remains.

Merge-drift check (not re-reviewed as author content)

The origin/main merge touched several files this PR also changes (run-qwen-serve.ts, server.ts, serve-features.ts, capabilities.ts, DaemonClient.ts). I did not re-review main's own evolution, but I confirmed the merge preserved this PR's wiring rather than clobbering it: registerWorkspaceLocalOpenRoutes is still registered (server.ts :2319), the startup capability probes are intact (run-qwen-serve.ts :2572-2573, server.ts :1077-1079), the workspace_local_open / workspace_local_terminal capability tags are present, and DaemonClient.openLocally/openTerminalLocally still target POST /workspaces/:workspace/open.

Verdict

✅ Approve. All round-1 findings — the one accessibility Important and the three Minors plus the tautological-assertion suggestion — are resolved and verified at this head, the cmd.exe fallback cross-check is fixed via the environment-variable route, and the merge did not disturb the feature wiring. The only remaining note is that the primary CI suite hasn't reported yet on this head; the merge queue will gate on that.


中文摘要

针对 head c98701a(基于 origin/main 合并之上的作者修复提交)完成复审。合并带入约 2900 行 main 前移内容,实质作者增量是单个修复提交(440 行、8 个文件),其范围与我上一轮的 findings 一一对应。以下每条结论均通过在新 head tree 读码核实,未采信提交信息,也未运行任何测试。

发布时 CI:head c98701a 上目前只有自动打标签/审查车道有结果;主测试套件(Test ubuntu、Serve A/B、Desktop Shell、集成、E2E)在本复审发布时尚未出结果。无论如何,合并队列在合并前仍要求这些为绿。

上一轮 findings 复核

🟡→✅ 可达性(上一轮唯一 Important):纯指针触发的弹层现在键盘可达。WorkspaceDetailsTooltip.tsx :207-243 为锚点接上 onFocus/onBlur(与 hover 相同的 300ms 延迟打开),并为门户化内容接 onFocus={cancelClose}/onBlurcontainsFocusTarget(:170-173)借助 anchorRef/contentRef 横跨锚点与门户两棵树,焦点在表头按钮与弹层间移动不会误关。onOpenAutoFocuspreventDefault,不会把焦点从表头夺走。新增测试用冒泡 focusin + 300ms 锁定键盘打开并断言 [role="dialog"] 渲染出 cwd;该文件已在 afterEach 恢复真实计时器。已解决。

🟢→✅ win32 删除目录误报成功local-path-open.ts :133/:173 在启动 explorer.exe/wt.exe 前调用新增 assertPathExists(:153-159,statSync→抛 LocalPathOpenUnavailableError);路由(:53-61)将该错误映射为 501、仅在不抛错时返回 opened: true,因此目录被删/改名时 win32 与 darwin/linux 一致失败,而不再静默打开"快速访问"。新测试锁定"不 spawn 即拒绝"。已解决。

🟢→✅ formatDateTime 跨午夜歧义formatDateTime.ts :10 改为按日历日相等判定而非流逝毫秒,昨天 08:01 不会再伪装成今天 08:01;测试已更新锁定跨午夜场景。已解决。

🟢→✅ 孤儿 i18n 键sidebar.overview.label 已从 EN/ZH 两处移除,全树无残留引用。已解决。

💡→✅ 恒真断言:图标切换测试改断言具体 svg.lucide-check/svg.lucide-folder-open(:190-191/:217-219),与代码库既有 lucide-* 约定一致(如 ArtifactPanel.test.tsx),图标回归不再能保持绿灯。已解决。

上一轮交叉核验项——也已处理

Windows cmd.exe start 回退引号spawnWindowsTerminal(:194-215)不再把路径塞进被重新解析的 cmd.exe start 命令行,改为 powershell.exe ... Start-Process cmd.exe 并经新增环境变量 QWEN_LOCAL_OPEN_DIR 传目录(spawnAndIgnoreExitCode :246-255 仅在传入 extraEnv 时展开 process.env)。这是早前分诊线程给出的修复方向之一,含空格路径不再断词。新增的一次整 process.env 读取已在 env-guard 允许项 whole: 3→4(:225-235)中体现,且与 local-path-open.ts 实际四处访问(:75/:88/:218/:254)吻合。

另外,上一轮指出的协议文档能力表 workspace_local_open 行未转义竖线,在当前 head 已是规范的 2 列行,无文档遗留项。

合并漂移核查(不作为作者内容复审)

origin/main 合并触及了本 PR 同样修改的多个文件(run-qwen-serve.tsserver.tsserve-features.tscapabilities.tsDaemonClient.ts)。我未复审 main 自身的演进,但确认合并保留了本 PR 接线而非覆盖:registerWorkspaceLocalOpenRoutes 仍被注册(server.ts :2319),启动期能力探测完好(run-qwen-serve.ts :2572-2573、server.ts :1077-1079),workspace_local_open/workspace_local_terminal 能力标签在场,DaemonClient.openLocally/openTerminalLocally 仍指向 POST /workspaces/:workspace/open

结论

✅ 批准。上一轮全部 findings——唯一的可达性 Important、三个 Minor 及恒真断言建议——均在本 head 解决并经核实;cmd.exe 回退交叉项以环境变量方式修复;合并未扰动功能接线。唯一遗留提示是该 head 的主测试套件尚未出结果,合并队列会据此把关。

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not explored to full depth (tool budget reached): "agent reverse-audit (round 1)": none — nothing was cut short; the only discarded candidates were duplicates of R1-1/R1-8 already on the list.; chunk 5: running the new vitest cases (worktree has no node_modules or built dist; install+build exceeds the tool budget) — static verification of the wiring was complet….

Test Plan (not a blocker): routes/workspace-local-open.test.tsno such file or directory.

中文说明

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 1)"none — nothing was cut short; the only discarded candidates were duplicates of R1-1/R1-8 already on the list.;chunk 5:running the new vitest cases (worktree has no node_modules or built dist; install+build exceeds the tool budget) — static verification of the wiring was complet…

Test Plan(非阻断):routes/workspace-local-open.test.tsno such file or directory

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +178 to +181
if (process.platform === 'linux') {
await spawnLinuxTerminal(path);
return;
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Critical] R1-17: [certifies-falsely] [new-surface] The Linux branch of openTerminalLocally skips the assertPathExists check that the win32 branches apply (added by this PR's own deleted-directory fix round) and that darwin gets via the launcher's non-zero exit. If a registered workspace directory is deleted (or made unreadable) while the daemon runs, Open-terminal still answers 200 opened: true: spawnLongLived resolves the moment the OS accepts the emulator's fork/exec, before the emulator ever looks at the directory — with the xterm fallback sh -c 'cd "$1" && exec …' sh <path> the cd fails, && short-circuits, and the window exits in a flash; gnome-terminal/konsole open in a fallback directory. The client shows the success check for an open that never happened, while win32 answers 501 for the same state.

Witness:

[probe] intact: openTerminalLocally(missingDir) → resolved (spawn called)
with assertPathExists added to the Linux branch: rejected with LocalPathOpenUnavailableError, no spawn

Add assertPathExists(path); at the top of the Linux branch (mirroring win32), so a missing target throws LocalPathOpenUnavailableError and the route answers 501. A Linux mirror of the existing "rejects a deleted directory on Windows without spawning" test — setPlatform('linux'), stub PATH, expect rejection with LocalPathOpenUnavailableError and no spawn — must go red when the added guard is removed.

中文说明

openTerminalLocally 的 Linux 分支跳过了 assertPathExists 检查——win32 分支有该检查(本 PR 自己的修复轮次为"目录已删除"场景添加),darwin 则通过启动器非零退出码兜底。若已注册的工作区目录在 daemon 运行期间被删除(或变为不可读),"打开终端"仍会返回 200 opened: truespawnLongLived 在操作系统接受模拟器 fork/exec 的瞬间即 resolve,此时模拟器尚未查看目录——xterm 回退执行 sh -c 'cd "$1" && exec …' sh <path>cd 失败、&& 短路,窗口一闪即退;gnome-terminal/konsole 则打开在回退目录。客户端为一次从未发生的打开显示成功勾选,而 win32 在相同状态下返回 501。

修复:在 Linux 分支开头加 assertPathExists(path);(与 win32 保持一致),使缺失目标抛出 LocalPathOpenUnavailableError、路由返回 501。请补一个与现有 "rejects a deleted directory on Windows without spawning" 对称的 Linux 测试——setPlatform('linux')、stub PATH、断言抛出 LocalPathOpenUnavailableError 且未 spawn——并确认移除新增守卫后该测试变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +217 to +218
async function spawnLinuxTerminal(path: string): Promise<void> {
const terminal = findExecutableOnPath(process.env, LINUX_TERMINAL_NAMES);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Critical] R1-27: [certifies-falsely] [new-surface] The Linux terminal-open path applies no DISPLAY/WAYLAND_DISPLAY precondition at spawn time — the very predicate isLocalTerminalAvailable() checks — and the capability is probed once at startup, so the tag stays advertised after the display goes away. On a host whose GUI session ended (an SSH-forwarded display that died, or a direct integrator POST on a headless host with a terminal binary on PATH — the protocol doc documents this route for integrators), spawnLinuxTerminal finds the binary, spawnLongLived resolves on exec acceptance, and the route answers 200 opened: true while xterm/gnome-terminal exits instantly with "cannot open display" and the daemon never observes it. Probed against the production route: isLocalTerminalAvailable=false at that same instant, yet POST /workspaces/:workspace/open returned {"opened":true,"target":"terminal"}.

Witness:

[probe] intact: isLocalTerminalAvailable=false; openTerminalLocally → RESOLVED;
route POST → status=200 body={"kind":"workspace-local-open","opened":true,"target":"terminal"}
with display gate: REJECTED(LocalPathOpenUnavailableError); route → 501 local_path_open_unavailable

Reject the same state the availability probe rejects, at the top of spawnLinuxTerminal: if (!process.env['DISPLAY'] && !process.env['WAYLAND_DISPLAY']) throw new LocalPathOpenUnavailableError('No display server available'); — the route already maps that error to 501. Note the existing Linux success tests stub only PATH, never DISPLAY (local-path-open.test.ts:320+), so this gate turns them red unless they also stub DISPLAY/WAYLAND_DISPLAY. Add a case that stubs PATH with a terminal dir and unsets both display variables, expecting LocalPathOpenUnavailableError and no spawn; removing the gate must turn it red.

中文说明

Linux 的终端打开路径在 spawn 时没有 DISPLAY/WAYLAND_DISPLAY 前置检查——而这正是 isLocalTerminalAvailable() 所用的判定条件——且能力只在启动时探测一次,显示器消失后标签仍会持续宣告。在 GUI 会话已结束的主机上(SSH 转发的显示断开,或无头主机上装有终端二进制时收到集成方的直接 POST——协议文档明确该路由面向集成方),spawnLinuxTerminal 能找到二进制,spawnLongLived 在 exec 被接受时即 resolve,路由返回 200 opened: true,而 xterm/gnome-terminal 立刻以 "cannot open display" 退出,daemon 完全观察不到。已对生产路由实测:同一时刻 isLocalTerminalAvailable=false,但 POST /workspaces/:workspace/open 返回了 {"opened":true,"target":"terminal"}

修复:在 spawnLinuxTerminal 开头拒绝与可用性探测相同的状态:if (!process.env['DISPLAY'] && !process.env['WAYLAND_DISPLAY']) throw new LocalPathOpenUnavailableError('No display server available');——路由已将该错误映射为 501。注意现有 Linux 成功用例只 stub 了 PATH、从未 stub DISPLAY(local-path-open.test.ts:320+),该守卫会使它们变红,需同步补 stub DISPLAY/WAYLAND_DISPLAY。另加一个用例:stub PATH 指向终端目录、清空两个显示变量,断言抛出 LocalPathOpenUnavailableError 且未 spawn;移除守卫后该用例必须变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +461 to +466
expect(
isLocalTerminalAvailable({
WAYLAND_DISPLAY: 'wayland-0',
PATH: xtermDir,
}),
).toBe(true);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Critical] R1-30: [certifies-falsely] [new-surface] The Linux availability probe accepts WAYLAND_DISPLAY as sufficient evidence for xterm, but xterm is X11-only (Xt/Xaw, no Wayland backend). On a pure-Wayland compositor with XWayland disabled (sway xwayland disable, river, cage) where xterm is the only installed emulator of the supported set, isLocalTerminalAvailable() returns true, the capability is advertised, and Open-terminal answers opened: true while xterm exits immediately with "cannot open display" — the exact failure the probe's own comment says it exists to filter out, and this new assertion pins the false positive. Note that re-checking the env at spawn time (the R1-27 direction) does not close this trigger: WAYLAND_DISPLAY is set, so such a check passes while xterm still cannot run.

Witness:

[probe] intact: availability(WAYLAND-only, xterm-only)=true; openTerminalLocally resolved=true;
terminal exited immediately=true
with xterm filtered under Wayland-only: availability=false; availability(DISPLAY+xterm-only)=true (control unchanged)

Drop the X11-only emulator when only a Wayland display is present: const names = env['DISPLAY'] ? LINUX_TERMINAL_NAMES : LINUX_TERMINAL_NAMES.filter((n) => n !== 'xterm'); in isLocalTerminalAvailable, and mirror the same filter at the spawn site — spawnLinuxTerminal picks from the same list against live env (local-path-open.ts:218), so probe and spawner must not diverge or a direct POST re-creates the false success. Flip this assertion to .toBe(false) (removing the filter must turn it red) and stub DISPLAY in the existing xterm spawn test, which currently stubs only PATH.

中文说明

Linux 可用性探测把 WAYLAND_DISPLAY 当作 xterm 的充分证据,但 xterm 是纯 X11 程序(Xt/Xaw,无 Wayland 后端)。在禁用 XWayland 的纯 Wayland 合成器上(sway xwayland disable、river、cage),若受支持集合中只安装了 xterm,isLocalTerminalAvailable() 返回 true、能力被宣告,"打开终端"返回 opened: true,而 xterm 立即以 "cannot open display" 退出——这正是探测自身注释声称要过滤掉的失败,且这条新断言把该误报固化了下来。注意:spawn 时重查环境变量(R1-27 的方向)无法覆盖此触发条件——WAYLAND_DISPLAY 存在,该检查会通过,但 xterm 依然无法运行。

修复:仅有 Wayland 显示器时剔除 X11-only 模拟器:在 isLocalTerminalAvailable 中用 const names = env['DISPLAY'] ? LINUX_TERMINAL_NAMES : LINUX_TERMINAL_NAMES.filter((n) => n !== 'xterm');,并在 spawn 端镜像同样的过滤——spawnLinuxTerminal 用同一份列表对实时环境取值(local-path-open.ts:218),探测与启动器不能分歧,否则直接 POST 会重新造成假成功。把此断言翻转为 .toBe(false)(移除过滤后必须变红),并给现有 xterm spawn 测试补 stub DISPLAY(目前只 stub 了 PATH)。

— qwen3.8-max via Qwen Code /review (v0.22.3)

'-NoProfile',
'-STA',
'-Command',
'Start-Process cmd.exe -ArgumentList "/k cd /d `"$env:QWEN_LOCAL_OPEN_DIR`""',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-1: The win32 cmd.exe fallback embeds the PowerShell-expanded directory in cmd's own command line, where cmd performs its immediate %VAR% expansion: a workspace directory containing a defined variable name between percent signs (e.g. C:\dev\old%TEMP%files% is NTFS-legal) expands to garbage, cd /d targets a nonsense path, and the window stays in its default directory while the route still answers opened: true. This is the residual hole after the quoting fix moved the path into an environment variable — PowerShell expands $env:QWEN_LOCAL_OPEN_DIR into the ArgumentList before cmd starts, so the value re-enters a parsed command line.

Witness:

[probe] mocked win32 spawn: cmd.exe command line = /k cd /d "/tmp/probe/old%TEMP%files"
— %TEMP% reaches cmd's command line verbatim (cmd.exe %VAR% expansion is documented Windows behavior)

Hand the directory to cmd as the process working directory instead of embedding it in the command line: Start-Process cmd.exe -WorkingDirectory "$env:QWEN_LOCAL_OPEN_DIR". Keep the existing assertPathExists pre-check (local-path-open.ts:172-173) — Start-Process -WorkingDirectory throws on a missing directory, so without the pre-check a deleted directory would surface a raw PowerShell error instead of LocalPathOpenUnavailableError (501). Extend the fallback test to assert -WorkingDirectory (and no cd /d embedding); reverting to the cd /d form must turn it red.

中文说明

win32 的 cmd.exe 回退把 PowerShell 展开后的目录嵌入了 cmd 自己的命令行,而 cmd 会对其执行即时的 %VAR% 展开:目录名含百分号包裹的已定义变量名时(如 C:\dev\old%TEMP%files——% 在 NTFS 中合法),会被展开成无意义的路径,cd /d 指向错误位置,窗口停在默认目录,而路由仍返回 opened: true。这是把路径移入环境变量之后的残留漏洞——PowerShell 在 cmd 启动前就把 $env:QWEN_LOCAL_OPEN_DIR 展开进了 ArgumentList,该值重新进入了被解析的命令行。

修复:改为把目录作为进程工作目录交给 cmd:Start-Process cmd.exe -WorkingDirectory "$env:QWEN_LOCAL_OPEN_DIR"。保留现有 assertPathExists 前置检查(local-path-open.ts:172-173)——Start-Process -WorkingDirectory 对缺失目录会抛错,若没有该检查,已删除的目录会暴露原始 PowerShell 错误而非 LocalPathOpenUnavailableError(501)。请扩展回退测试断言 -WorkingDirectory(且不再嵌入 cd /d);回退到 cd /d 形式必须使测试变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

).toBeUndefined();
});

it('shows the active/total split only when they differ', () => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-2: The hooks facet's display path lost its only tests in the chip→popover swap. The migrated formatOverviewValue tests cover mcp/skills/extensions/channels/context but not the hooks case, overviewDetail has no direct test anywhere, and WorkspaceDetailsTooltip.test.tsx never renders a hooks row — while hooks stays in WORKSPACE_OVERVIEW_ITEMS (workspaceOverviewModel.ts:31) and is fetched by useWorkspaceOverview, so both arms render in production for embedders opting in.

Witness:

[probe] hooks arms mutated → 112 passed, 0 failed (suite blind)
control: same mutation on the mcp arm → 3 tests failed in the same files

Restore the dropped pins next to the migrated cases: hooks cases for formatOverviewValue (initialized count, uninitialized → undefined) and overviewDetail tests for the hooks disabled/enabled branches plus at least one non-MCP facet. Removing the case 'hooks' arm or swapping hooksDisabled/hooksDetail must turn the new tests red.

中文说明

芯片→悬浮弹层的迁移让 hooks facet 的展示路径失去了唯一测试。迁移后的 formatOverviewValue 测试覆盖 mcp/skills/extensions/channels/context,唯独没有 hooks;overviewDetail 在任何地方都没有直接测试;WorkspaceDetailsTooltip.test.tsx 也从不渲染 hooks 行——而 hooks 仍在 WORKSPACE_OVERVIEW_ITEMS(workspaceOverviewModel.ts:31)中、useWorkspaceOverview 会拉取它,对选择启用该项的嵌入方来说这两条分支在生产中真实渲染。

修复:在迁移后的用例旁补回缺失的钉子:formatOverviewValue 的 hooks 用例(已初始化的计数、未初始化 → undefined),以及 overviewDetail 的 hooks 禁用/启用分支和至少一个非 MCP facet。移除 case 'hooks' 分支或互换 hooksDisabled/hooksDetail 必须使新测试变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +264 to +266
it('spawns wt.exe at the path on Windows and ignores its exit code', async () => {
setPlatform('win32');
spawnMock.mockReturnValue(fakeChild('close'));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-25: The "ignores its exit code" contract — the stated reason spawnAndIgnoreExitCode exists ("explorer.exe / wt.exe commonly exit 1 even when they did open the folder") — is pinned by no test: fakeChild('close') invokes the close callback with undefined and can never deliver an exit code. The explorer.exe twin test (~line 111) has the identical hole. A maintainer "tightening" the helper to reject on a truthy close code keeps every test green (undefined is falsy), but on a real Windows host where wt.exe exits 1 after opening the window, openTerminalLocally rejects, the route wraps it in LocalPathOpenUnavailableError, and the client gets a failure toast for an open that succeeded.

Witness:

[probe] mutant rejecting on truthy close code → 43/43 green
probe delivering close code 1: mutant REJECTED('explorer.exe exited with code 1') /
REJECTED('powershell.exe exited with code 1'); intact RESOLVED both

Make the fake deliver a nonzero close code (emit close with code 1) and assert openTerminalLocally/openPathLocally still resolve; the updated tests must go red if the close handler is mutated to reject on a truthy exit code.

中文说明

"忽略退出码" 这一契约——spawnAndIgnoreExitCode 存在的明示理由("explorer.exe / wt.exe 即使成功打开了文件夹也常以 1 退出")——没有任何测试钉住:fakeChild('close')undefined 调用 close 回调,永远无法送出退出码。explorer.exe 的姊妹测试(约 111 行)有同样的漏洞。若有人 "收紧" 该辅助函数、在退出码为真值时 reject,所有测试照绿(undefined 为假值),但在真实 Windows 主机上,wt.exe 打开窗口后以 1 退出时 openTerminalLocally 会 reject,路由将其包成 LocalPathOpenUnavailableError,客户端为一次成功的打开弹出失败提示。

修复:让 fake 送出非零退出码(以码 1 触发 close),断言 openTerminalLocally/openPathLocally 仍然 resolve;把 close 处理器突变为真值退出码即 reject 时,更新后的测试必须变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +358 to +361
'-e',
'sh',
'-c',
'cd "$1" && exec "${SHELL:-/bin/sh}"',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-26: spawnLongLived's child.unref() (local-path-open.ts:293) — the only line keeping a long-lived terminal window from holding the daemon's event loop, per its own comment — is pinned by no test. The fixture even exposes unref: vi.fn() (line 76) but nothing inspects it. Dropping the unref() (e.g. unifying spawnLongLived with spawnAndIgnoreExitCode, which does not unref) keeps the whole suite green; afterwards every opened terminal window remains a referenced child handle, and once the HTTP server closes on graceful shutdown the daemon process cannot exit until every user-opened terminal window is closed — qwen serve hangs indefinitely. The repo already pins this exact property elsewhere (external-tool-guard-provider.test.ts:399).

Witness:

[probe] unref removed → 43/43 green
expect(child.unref).toHaveBeenCalled(): FAILED on the mutant, PASSED intact

In the gnome-terminal/konsole/xterm tests capture the spawned child (spawnMock.mock.results[0].value) and assert expect(child.unref).toHaveBeenCalled(); removing child.unref() from spawnLongLived must turn it red.

中文说明

spawnLongLivedchild.unref()(local-path-open.ts:293)——按其自身注释,是让长驻终端窗口不挂住 daemon 事件循环的唯一一行——没有任何测试钉住。fixture 甚至暴露了 unref: vi.fn()(76 行)却无人检查。删除 unref()(例如把 spawnLongLived 与不 unref 的 spawnAndIgnoreExitCode 统一)时整个套件全绿;此后每个打开的终端窗口都是被引用的子进程句柄,优雅关停时 HTTP 服务器关闭后,daemon 进程要等所有用户打开的终端窗口都关闭才能退出——qwen serve 无限挂起。仓库其他地方已钉过同样的属性(external-tool-guard-provider.test.ts:399)。

修复:在 gnome-terminal/konsole/xterm 测试中捕获 spawn 出的子进程(spawnMock.mock.results[0].value),断言 expect(child.unref).toHaveBeenCalled();移除 spawnLongLived 中的 child.unref() 必须使其变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +54 to +56
await act(async () => {
trigger.dispatchEvent(new Event('pointerover', { bubbles: true }));
vi.advanceTimersByTime(300);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-28: The hover-intent cancel — closeAfterDelay clearing the pending 300 ms open timer when the pointer leaves the anchor before the popover opens (window.clearTimeout(openTimerRef.current) at WorkspaceDetailsTooltip.tsx:164) — is pinned by no test at any level: this file dispatches only open-side events, the only pointerout dispatches in the client tree target a different component, and every leave in the e2e happens after the dialog is visible. Dropping the clearTimeout line ships green (measured: 192/192 across the four suites); the verifier-corrected harm is a bounded ≤100 ms popover flash for hovers of 200–300 ms (the scheduled close() then clears the open timer and closes), not a stuck popover.

Witness:

[probe] mutant (clearTimeout dropped): 192/192 green; leave@250ms → t=300:OPEN, auto-closed ~t=350
intact: leave@100ms/leave@250ms → never opened

Add a unit test: dispatch pointerover, advance 100 ms (inside the 300 ms window), dispatch pointerout, advance ≥500 ms, and assert [role="dialog"] is null; deleting window.clearTimeout(openTimerRef.current) from closeAfterDelay must turn it red.

中文说明

悬浮意图取消——指针在弹层打开前离开锚点时,closeAfterDelay 清除待执行的 300ms 打开定时器(WorkspaceDetailsTooltip.tsx:164 的 window.clearTimeout(openTimerRef.current))——在任何层级都没有测试钉住:本文件只派发打开侧事件,客户端代码树中仅有的 pointerout 派发指向另一个组件,e2e 中所有离开都发生在 dialog 可见之后。删除该 clearTimeout 行可以全绿上线(实测四个套件 192/192);经验证者修正后的影响是 200–300ms 悬浮时一个不超过 100ms 的弹层闪现(随后预定的 close() 会清掉打开定时器并关闭),而不是弹层卡住。

修复:补一个单测:派发 pointerover,推进 100ms(在 300ms 窗口内),派发 pointerout,推进 ≥500ms,断言 [role="dialog"] 为 null;删除 closeAfterDelay 中的 window.clearTimeout(openTimerRef.current) 必须使其变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +228 to +229
onOpenPathLocally,
onOpenTerminalLocally,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-29: The section-level && gitPollCwd && workspace.trusted gate on the two new local-open props is verified by no test: this file's tests never wire onOpenPathLocally/onOpenTerminalLocally (the renderSection overrides don't accept them), and the e2e never renders an untrusted workspace (13/13 fixtures are trusted: true) — so dropping the conjuncts ships green (measured: 18/18 test files). The hover popover would then offer Open folder/Open terminal on untrusted workspaces and on synthetic workspaces with a relative cwd; clicking fires POST /open, which resolveTrustedRuntime rejects server-side — the user is handed an affordance that can never succeed (a failure toast on click). The server-side trust check is what keeps this at Suggestion rather than a host-side exposure.

Witness:

[probe] gate-dropped mutant: full sidebar directory 18/18 files green
untrusted workspace probe: folderButton=PRESENT terminalButton=PRESENT; intact: both absent

Wire the two handlers through renderSection and assert: untrusted workspace → both buttons absent in the portaled dialog; trusted with a relative cwd → absent; trusted + absolute cwd → present. Removing && gitPollCwd && workspace.trusted from the wiring (lines ~734-742) must turn the new tests red. The server route enforces trust (routes/workspace-local-open.ts:38), so these tests assert button absence as UI policy mirroring the server rejection.

中文说明

两个新的本地打开属性上的节级 && gitPollCwd && workspace.trusted 门没有任何测试验证:本文件的测试从不接线 onOpenPathLocally/onOpenTerminalLocallyrenderSection 的覆盖参数不接受它们),e2e 也从不渲染不可信工作区(13/13 的 fixture 都是 trusted: true)——因此删除这两个条件可以全绿上线(实测 18/18 个测试文件)。届时悬浮弹层会在不可信工作区和相对 cwd 的合成工作区上提供打开文件夹/终端;点击会触发 POST /open,被 resolveTrustedRuntime 在服务端拒绝——用户拿到一个永远不会成功的入口(点击即失败提示)。正是服务端信任检查把此问题留在建议级而非主机侧暴露。

修复:把两个处理器接入 renderSection 并断言:不可信工作区 → portal dialog 中两个按钮都不存在;可信但相对 cwd → 不存在;可信 + 绝对 cwd → 存在。移除接线处(约 734-742 行)的 && gitPollCwd && workspace.trusted 必须使新测试变红。服务端路由强制信任(routes/workspace-local-open.ts:38),这些测试断言的是与服务端拒绝保持一致的 UI 策略。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +349 to +351
title={title}
aria-label={title}
data-web-shell-workspace-overview={item}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-32: The facet row's accessible name (aria-label={title}) lost its only pin when WorkspaceOverview.test.tsx was deleted — that file asserted the chip aria-label 'MCP: 3 of 4 connected, 1 failed'. No remaining unit or e2e test asserts a facet row's aria-label (this file asserts only the mcp row's title and textContent; the sessions row is the only row whose aria-label is pinned; the e2e asserts none). Dropping the attribute ships green (measured: 200/200 across the five tooltip-rendering suites), and screen-reader users then get the row's bare text content ("MCP1/2", icon aria-hidden) instead of the full detail "MCP: 1 of 3 connected, 1 failed, 1 disabled" — the failure count that makes the row actionable is silently lost from the accessible name.

Witness:

[probe] aria-label dropped: 200/200 green across the five suites
control (title mutated): FAILED — Expected "MCP: 1 of 3 connected, 1 failed, 1 disabled", Received "…disabled!"

Add one aria-label assertion to an existing popover test, e.g. expect(facetRow(details, 'mcp')?.getAttribute('aria-label')).toBe('MCP: 1 of 3 connected, 1 failed, 1 disabled'); — removing aria-label={title} from the facet row must turn it red.

中文说明

facet 行的可读名称(aria-label={title})在 WorkspaceOverview.test.tsx 被删除时失去了唯一的钉子——该文件曾断言芯片的 aria-label 'MCP: 3 of 4 connected, 1 failed'。现存的单测和 e2e 都不再断言 facet 行的 aria-label(本文件只断言 mcp 行的 title 和 textContent;sessions 行是唯一钉了 aria-label 的行;e2e 不断言任何 aria-label)。删除该属性可以全绿上线(实测五个渲染 tooltip 的套件 200/200),屏幕阅读器用户此后只能听到行的裸文本内容("MCP1/2",图标 aria-hidden),而不是完整明细 "MCP: 1 of 3 connected, 1 failed, 1 disabled"——让该行可行动的失败计数从可读名称中静默消失。

修复:在现有弹层测试中补一条 aria-label 断言,例如 expect(facetRow(details, 'mcp')?.getAttribute('aria-label')).toBe('MCP: 1 of 3 connected, 1 failed, 1 disabled');——移除 facet 行的 aria-label={title} 必须使其变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

…ce-hover-details

# Conflicts:
#	packages/sdk-typescript/scripts/build.js
@wenshao

wenshao commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator Author

Round-2 review addressed in 9338a61ca6 (on top of the 4936045606 main merge, which adopted main's warning-based SDK bundle budget):

Criticals

  • R1-17 (Linux deleted-directory false success) — the Linux branch of openTerminalLocally now runs the same assertPathExists pre-check as win32; a missing target throws LocalPathOpenUnavailableError (→ 501). Pinned by a Linux mirror of the win32 deleted-directory test.
  • R1-27 (display gate at spawn time)spawnLinuxTerminal rejects when neither DISPLAY nor WAYLAND_DISPLAY is set, closing the stale-boot-probe window where the capability outlives the GUI session. The existing Linux success tests now stub DISPLAY, and a no-display case asserts rejection with no spawn.
  • R1-30 (xterm on pure Wayland) — probe and spawner now share linuxTerminalCandidates(env), which drops X11-only xterm when no DISPLAY is present, so the two can never diverge. The Wayland-only/xterm-only probe assertion flips to false with a DISPLAY control, and a matching spawn test asserts rejection.

Notable suggestions

  • R1-1 (cmd %VAR% residual) — the fallback no longer embeds the directory in any parsed command line: Start-Process cmd.exe -WorkingDirectory "$env:QWEN_LOCAL_OPEN_DIR" hands it over as the child process's working directory. The fallback test asserts this form and rejects the old cd /d embedding.
  • R1-23 / R1-24 (OpenLocallyButton) — success is now announced through an sr-only aria-live="polite" region (new bilingual …FolderOpened / …TerminalOpened keys, mirroring the session-details copy pattern), and the button is inert while a request is in flight, so a double-click can no longer spawn two host windows. The pending flag releases on rejection too; both behaviors are tested.
  • R1-13 (focus-blind pointer close) — pointer-leave no longer dismisses the popover while keyboard focus lives inside the anchor or the portaled content.
  • R1-19headerActionCount no longer counts the menu trigger under a workspace lock (where it doesn't render).
  • R1-4 / R1-14 — the overviewEnabled doc no longer claims counts render in the header; orphaned sidebar.overview.unknown / sidebar.overview.unavailable keys deleted from both locales.
  • Test pins added: 10 s hang guards (both spawn helpers), exit-code-ignored contract, child.unref() detachment, env inheritance alongside the injected variable, SSH_TTY probe arm, hooks facet formatting, facet-row aria-label, hover-intent cancel, 300 ms lower bound, 2 s check reset, focus retention on open, the section-level trust gate for the open buttons, and the e2e header no-count assertion. The two vacuous negative assertions now query the document (the popover is portaled).

Deferred to a follow-up (recording per review-round policy; none blocks behavior):

  • R1-6isLocalDaemon() unit tests need window.location mocking infra the suite doesn't have today; the function can only under-report (hides buttons), never over-report.
  • R1-7 — the createServeApp mount of the route is wired one line away from the fully tested registerWorkspaceLocalOpenRoutes; a mount assertion fits better in the server bootstrap test suite than here.
  • R1-9 — the running dot's scheduled/unread exclusion matrix needs the heavy sidebar fixtures; the precedence order matches the existing unread-dot logic.

Verification: 332 web-shell sidebar/util tests, 55 daemon local-open/guard tests, the 4-spec workspace-overview e2e, filtered serve capability suites, and a root npm run typecheck — all green.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on ab48b2106b5710c50cd4938970db5570408e0bd7 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 ab48b2106b5710c50cd4938970db5570408e0bd7既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partially reviewed — gaps disclosed. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

3 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • R1-4 vacuous synthetic-workspace negative assertions (WorkspaceSection.test.tsx) — already reported (comment 3896577987)
  • R1-7 isLocalDaemon zero test coverage (config/daemon.ts) — already reported (comment 3896578001)
  • R1-10 running-dot exclusion conditions unwitnessed (WebShellSidebar.tsx) — already reported (comment 3896578020)

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

Not explored to full depth (tool budget reached): chunk 3: executing local-path-open.test.ts under vitest (worktree has no node_modules ; install + build exceeds remaining budget), so assertions were verified by cros…; "agent reverse-audit (round 4)": (none — no check was cut short); chunk 9: none — all checks I started completed; the only unperformed check (running the suite) was infeasible due to the missing dependency install, reported above..

Not reviewed: reverse audit — stopped before round 5 by the review time budget.

Test Plan (not a blocker): routes/workspace-local-open.test.tsno such file or directory.

Deferred under the convergence posture (round 2, not a blocker) — recorded, not requested in this round:

  • packages/cli/src/serve/local-path-open.ts:139 — [probe] timeoutMs test hook ignored on the three execFileAsync branches (darwin/linux folder, darwin terminal hard-code OPEN_TIMEOUT_MS)
  • packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx:271 — [probe] terminal-button announcement/label unpinned; wiring the terminal to the folder's strings ships green
  • packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx:221 — [probe] OpenLocallyButton re-enable on failure (.finally setPending(false)) unpinned; moving it into the success branch wedges the button
  • packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.tsx:293 — [probe] popover Open folder/Open terminal buttons unreachable by keyboard (portal tab order + 100 ms blur-close); menu path is the keyboard alternative
  • packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts:438 — [probe] e2e menu path visibility-only; swapping the two menu handlers ships green
  • packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx:192 — [probe] terminal-button absence unasserted in folder-only configs; dropping the guard yields a phantom button with onOpen=undefined
  • packages/cli/src/serve/local-path-open.test.ts:180 — [probe] darwin GUI-evidence guards have only an overdetermined negative fixture {0,501}; removing either conjunct ships green
  • packages/cli/src/serve/local-path-open.test.ts:40 — [probe] isExecutableFile's accessSync(X_OK) has no negative fixture; removing the probe ships green
  • packages/cli/src/serve/routes/workspace-local-open.ts:61 — [probe] early return after the 501 branch unwitnessed; deletion ships green and causes ERR_HTTP_HEADERS_SENT + misleading stderr per 501
  • packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx:317 — [probe] keyboard focus-open test pins only an upper bound; instant-open mutation ships green
  • packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx:299 — [probe] keyboard blur-close half has zero coverage; removing the anchor onBlur ships green
  • packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts:195 — [probe] popover capability gate has no negative pin; dropping the gate ships green and phantom buttons still act
  • packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts:416 — [probe] folder button's request body never pinned in e2e; folder→openTerminalLocally mix-up ships green
中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。

本轮确认的 3 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

未探索到全部深度(达到工具调用预算):chunk 3:executing local-path-open.test.ts under vitest (worktree has no node_modules ; install + build exceeds remaining budget), so assertions were verified by cros…"agent reverse-audit (round 4)"(none — no check was cut short);chunk 9:none — all checks I started completed; the only unperformed check (running the suite) was infeasible due to the missing dependency install, reported above.

未审查:反向审计——评审时间预算不足,未能开始第 5 轮。

Test Plan(非阻断):routes/workspace-local-open.test.tsno such file or directory

收敛姿态下延后(第 2 轮,非阻断)——已记录,本轮不要求修改:共 13 条(原文未翻译,列表见上方英文部分)。

— qwen3.8-max via Qwen Code /review (v0.22.3)

}

/** The long form of a facet's value, used as the tooltip row's title. */
export function overviewDetail(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-2: overviewDetail's per-facet tooltip strings lost their witnesses in the chip→popover swap — only the mcp branch's title is pinned by any test. Swapping the total/enabled variables in the skills branch, or renaming any sidebar.overview.*Detail i18n key (the translator falls back to the raw key), ships green across the unit and e2e suites and renders wrong user-visible tooltip text.

Witness:

mutant: total/enabled swapped in the skills branch → sidebar suites `Tests 189 passed`
flip probe asserting the skills title → AssertionError: expected 'Skills: 2 of 1 enabled' to be 'Skills: 1 of 2 enabled'

Extend WorkspaceDetailsTooltip.test.tsx (or workspaceOverviewModel.test.ts) to assert the detail title string for each facet branch, including the hooks disabled/enabled variants. The new per-facet title assertions must turn red if a variable pair is swapped in any overviewDetail branch — please prove it by running that mutation.

中文说明

芯片→弹层改造后,overviewDetail 的各 facet 详情字符串失去了测试钉子——目前只有 mcp 分支的 title 被断言。把 skills 分支里的 total/enabled 变量对调,或者重命名任意 sidebar.overview.*Detail i18n 键(翻译器会回退为原始键名),单测与 e2e 全部绿灯,但用户看到的悬浮提示文案是错的。

修复:在 WorkspaceDetailsTooltip.test.tsx(或 workspaceOverviewModel.test.ts)中为每个 facet 分支(含 hooks 的禁用/启用变体)断言详情 title。新增断言必须在对调任一 overviewDetail 分支的变量对后变红——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines 3560 to 3561
it('keeps plain folder headers when the overview is switched off', () => {
renderSidebar({ workspaceOverview: false });

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-3: Still standing from round 1. The negative assertions in 'keeps plain folder headers when the overview is switched off' can never fail: the path/overview/sessions rows now render only inside a Radix-ported popover that mounts while open, and this test never opens it — the assertions run against a DOM that cannot contain the rows under any wiring. Force-mounting the tooltip with a bogus path row for a workspace that should have none ships green.

Witness:

mutant force-mounting the tooltip when the overview is off → test stays green (9/9)
flip: forcing the popover open under the same mutant → expected <span data-web-shell-workspace-path="true" title="/tmp/project">/tmp/project</span> to be null

Open the workspace details popover (hover/focus plus the 300 ms delay) before asserting the rows are absent, so the assertions reach the portal content. The updated test must go red if the popover is wired to render a path row while the overview is off.

中文说明

第一轮遗留未解决。'keeps plain folder headers when the overview is switched off' 中的否定断言永远不会失败:path/overview/sessions 行现在只渲染在打开时才挂载的 Radix portal 弹层里,而该测试从未打开弹层——断言面对的 DOM 在任何接线下都不可能出现这些行。把弹层强制挂载并为不该显示路径的工作区渲染假路径行,测试照样绿灯。

修复:在断言这些行不存在之前先打开工作区详情弹层(hover/focus + 300ms 延迟),让断言能到达 portal 内容。若弹层被接线为在 overview 关闭时仍渲染路径行,更新后的测试必须变红。

— qwen3.8-max via Qwen Code /review (v0.22.3)

gitState: workspaceGitState,
sendBridgeError,
});
registerWorkspaceLocalOpenRoutes(app, {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-8: Still standing from round 1. The production mount of POST /workspaces/:workspace/open in createServeApp is verified by no test — every existing POST to the route runs against the route test's own express app. Capability advertising is wired independently, so dropping this registration call in a future refactor keeps the whole suite green while clients still see the buttons and get 404 on click.

Witness:

witness: not run — the flip is a supertest POST against createServeApp, i.e. the missing test itself; all 13 POSTs to /workspaces/.../open live in routes/workspace-local-open.test.ts's own app, zero in server.test.ts, and no route-inventory guard exists.

Add a wiring test in server.test.ts that POSTs /workspaces/:workspace/open against createServeApp (mock ../local-path-open.js, or assert the headless 501 arm). Deleting the registration call must turn the new test red — please prove it by running that mutation.

中文说明

第一轮遗留未解决。createServeAppPOST /workspaces/:workspace/open 的生产挂载没有任何测试覆盖——现有对该路由的 13 处 POST 全部跑在路由测试自建的 express app 上。能力宣告(capability)的接线是独立的,因此未来重构删掉这行挂载,整个测试套件仍全绿,而客户端依旧显示按钮、点击却得到 404。

修复:在 server.test.ts 中新增接线测试,对 createServeApp 发起 POST /workspaces/:workspace/open(mock ../local-path-open.js,或断言 headless 501 分支)。删除该挂载调用必须使新测试变红——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

const child = { once: vi.fn(), kill: vi.fn(), unref: vi.fn() };
spawnMock.mockReturnValue(child);

await expect(openPathLocally(existingDir, 5)).rejects.toBeInstanceOf(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-9: (fix-induced) The round-1 fix that pinned the hang guards rewrote both witnesses to pass an explicit timeoutMs=5, deleting the only instrument that observed the spawn-side OPEN_TIMEOUT_MS default bindings (local-path-open.ts:283 destructure and :310 parameter default). Removing both defaults ships the whole suite green — success paths resolve via queueMicrotask before any timer, and the hang tests pass 5 explicitly. In production the route calls openLocally(runtime.workspaceCwd) with no second argument, so setTimeout(..., undefined) arms a ~1 ms timer: explorer.exe/wt.exe/the terminal are killed before they can launch and every win32/linux local-open request answers 501.

Witness:

baseline `Tests 41 passed (41)` → mutant (both defaults removed) `Tests 52 passed (52)`
setTimeout(cb, undefined) measured firing after 3 ms (node -e)

Keep the explicit-timeout tests and add one default-path witness per spawn helper: call openPathLocally(existingDir) / openTerminalLocally(existingDir) with no timeoutMs against a never-firing child and assert the arm delay is 10 000 (e.g. a setTimeout spy) and that kill+reject follow on expiry. Note const OPEN_TIMEOUT_MS = 10_000; (local-path-open.ts:16) is the single source of the default, and the deferred round-2 finding on the three execFileAsync branches still requires timeoutMs threaded there — a fix must not re-hardcode the constant in one branch only. The new default-delay assertion must go red under the default-removal mutant, which the entire current suite ships green — please prove it by running that mutation.

中文说明

(修复引入)第一轮为挂起守卫补测试的修复把两个见证用例都改写为显式传入 timeoutMs=5,删掉了唯一能观测 spawn 侧 OPEN_TIMEOUT_MS 默认绑定(local-path-open.ts:283 解构与 :310 参数默认值)的仪器。移除这两个默认值后整个套件依旧全绿——成功路径在任何计时器之前经 queueMicrotask resolve,挂起测试又显式传 5。而生产环境里路由以 openLocally(runtime.workspaceCwd) 调用、不带第二个参数,于是 setTimeout(..., undefined) 会布下一个约 1ms 的计时器:explorer.exe/wt.exe/终端在来得及启动前就被 kill,win32/linux 的每次本地打开请求都返回 501。

修复:保留显式超时测试,并为每个 spawn 辅助各补一个默认路径见证——不带 timeoutMs 调用 openPathLocally(existingDir) / openTerminalLocally(existingDir),对永不触发事件的 child 断言布防延迟为 10 000(如用 setTimeout spy),且到期后 kill+reject。注意 const OPEN_TIMEOUT_MS = 10_000;(local-path-open.ts:16)是默认值的唯一来源,且第二轮被推迟的关于三个 execFileAsync 分支的发现仍要求把 timeoutMs 穿透到那里——修复时不要在某个分支重新硬编码该常量。新增的默认延迟断言必须在移除默认值的变异下变红(当前整个套件对该变异全绿)——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +55 to +56
trigger.dispatchEvent(new Event('pointerover', { bubbles: true }));
vi.advanceTimersByTime(300);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R1-28: Still standing from round 1. The hover-intent cancel — closeAfterDelay clearing the pending 300 ms open timer when the pointer leaves before the popover opens — remains effectively unpinned: removing the window.clearTimeout(openTimerRef.current) line ships green across all three sidebar suites. Under fake timers the stale open callback and the close callback expire in the same tick and React batches setOpen(true)/setOpen(false), masking it; in real time the two are separate tasks, so after a pre-delay pointer-exit the popover mounts momentarily — a one-flash open/close — before the delayed close lands.

Witness:

mutant removing clearTimeout(openTimerRef.current) from closeAfterDelay → Test Files 3 passed (3) / Tests 166 passed (166)

Add a test that can see the flash: pointerover then pointerout before 300 ms under real timers (or tick-separated fake timers), verifying no dialog commit occurs at any point (e.g. MutationObserver or per-tick polling), not just absence at the end. It must go red if the clearTimeout(openTimerRef.current) line is removed — please prove it by running that mutation.

中文说明

第一轮遗留未解决。hover 意图取消——指针在弹层打开前离开时 closeAfterDelay 清除待执行的 300ms 打开计时器——实际上仍未被钉住:删掉 window.clearTimeout(openTimerRef.current) 这一行,三个侧栏套件全绿。在 fake timers 下,过期的打开回调与关闭回调同一 tick 到期、React 批处理 setOpen(true)/setOpen(false) 而掩盖了问题;真实时间下二者是独立任务,指针在延迟前离开后弹层会瞬间挂载又关闭——一闪而过。

修复:补一个能捕获该闪烁的测试——真实计时器(或逐 tick 分离的 fake timers)下先 pointerover 再在 300ms 前 pointerout,验证全程任何时刻都无 dialog 提交(如 MutationObserver 或逐 tick 轮询),而不只是最终不存在。移除 clearTimeout(openTimerRef.current) 行后该测试必须变红——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +222 to +223
await spawnAndIgnoreExitCode('wt.exe', ['-d', path], { timeoutMs });
} catch {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R2-1: spawnWindowsTerminal's blanket catch also falls back when the wt.exe hang guard fires — not only on a spawn-level error — conflating 'wt.exe absent' with 'wt.exe slow', and no test pins which behavior is intended on a hang. On a host where wt.exe spawns but does not exit within the 10 s window (a PATH shim, a stalled first-run launch), spawnAndIgnoreExitCode kills it and rejects; the catch then launches the PowerShell/cmd fallback anyway — one click opens two terminal windows after >=10 s of request latency. The fallback test triggers via fakeChild('error') only, so narrowing or widening the catch ships green.

Witness:

probe, hung wt.exe child + 5 ms timeout:
intact: outcome=resolved, spawn count=2 (wt.exe killed, then powershell.exe)
candidate fix (fall back only on spawn-level error): outcome=rejected:Unavailable, spawn count=1

Decide the hang semantics explicitly: if a hang should not double-open, make spawnAndIgnoreExitCode reject with a distinguishable timeout error and re-throw it from spawnWindowsTerminal without falling back; keep the fallback for spawn-level error events. If the double-open on hang is intended, pin it with a test instead. The new 'does not fall back when wt.exe hangs' test (never-firing child, openTerminalLocally(existingDir, 5) rejects, spawn called exactly once) must go red when the blanket catch is restored — please prove it by running that mutation.

中文说明

spawnWindowsTerminal 的兜底 catch 在 wt.exe 挂起守卫触发时也会回退——而不仅是 spawn 级错误——把「wt.exe 不存在」与「wt.exe 慢」混为一谈,且没有测试钉住挂起时应是哪种行为。在 wt.exe 能 spawn 但 10 秒窗口内不退出(PATH 上的 shim、首次启动卡住)的主机上,spawnAndIgnoreExitCode 会将其 kill 并 reject,catch 随后仍然启动 PowerShell/cmd 回退——一次点击打开两个终端窗口,且请求延迟 >=10 秒。回退测试只用 fakeChild('error') 触发,因此收窄或放宽这个 catch 都照样全绿。

修复:显式决定挂起语义:若挂起不应双开,让 spawnAndIgnoreExitCode 以可区分的超时错误 reject,并在 spawnWindowsTerminal 中直接重抛、不回退;回退只保留给 spawn 级 error 事件。若确实希望挂起时双开,则用测试钉住。新增的「wt.exe 挂起时不回退」测试(永不触发事件的 child、openTerminalLocally(existingDir, 5) reject、spawn 恰好调用一次)必须在恢复兜底 catch 后变红——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +226 to +230
onPointerLeave={() => {
if (!containsFocusTarget(document.activeElement)) {
closeAfterDelay();
}
}}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R2-2: After any WorkspaceMenu action, Radix restores focus to the menu trigger — which renders inside this popover's anchor — and the anchor onFocus then reopens the details popover, which latches open with no path left to close it. Mouse user: hover the row (popover opens), click the ⋯ menu, pick Open folder; on menu unmount Radix's FocusScope restores focus to the trigger (handleSessionMenuCloseAutoFocus only suppresses the rename/pointer-dismiss paths, and an item selection is neither). The focusin bubbles to the anchor → openAfterDelay → the popover reopens 300 ms later. Focus stays on the trigger (no onBlur) and the pointer sits where the portaled menu item was (no onPointerLeave transition), so the tooltip stays latched; hovering another workspace row stacks a second popover.

Witness:

jsdom probe, real Radix, production-shaped wiring:
default arm: focusins=["BUTTON"] dialogAfter=true (popover reopened after selecting Open folder)
candidate fix (onCloseAutoFocus prevented): focusins=[] dialogAfter=false

The fix belongs at the menu content — pass onCloseAutoFocus={(event) => event.preventDefault()} on the workspace DropdownMenuContent (or suppress the focus-open path via a ref set in onPointerDownCapture, cleared on anchor blur/pointer-enter). Keyboard parity must survive: genuine keyboard focus must still open the popover after the same 300 ms delay (the lower-bound pin from R1-18's fix must not regress), which is the constraint this fix must not violate. A new test — open via pointer-enter, pointerdown+click an anchor child, .focus() it to simulate Radix's restore, advance past 300 ms, assert the popover stays closed — must go red when the suppression is removed — please prove it by running that mutation.

中文说明

在 WorkspaceMenu 执行任意操作后,Radix 会把焦点还给菜单触发按钮——它就渲染在本弹层的 anchor 内部——随后 anchor 的 onFocus 会重新打开详情弹层,且弹层卡死在打开状态、没有任何路径能关闭它。鼠标用户:悬停行(弹层打开)→ 点 ⋯ 菜单 → 选「打开文件夹」;菜单卸载时 Radix FocusScope 把焦点还给触发按钮(handleSessionMenuCloseAutoFocus 只抑制改名/指针关闭两条路径,菜单项选择两者都不是),focusin 冒泡到 anchor → openAfterDelay → 300ms 后弹层重开。焦点停在触发按钮上(无 onBlur),指针停在已卸载的菜单项原处(无 onPointerLeave 过渡),于是弹层一直挂着;再悬停另一个工作区会叠出第二个弹层。

修复:在菜单内容上处理——给工作区 DropdownMenuContentonCloseAutoFocus={(event) => event.preventDefault()}(或用 onPointerDownCapture 中设置、anchor blur/pointer-enter 时清除的 ref 来抑制 focus 打开路径)。键盘对等必须保留:真正的键盘聚焦仍应在同样的 300ms 延迟后打开弹层(R1-18 修复钉住的下界不能回退),这是本修复不得违反的约束。新增测试——指针进入打开、对 anchor 子元素 pointerdown+click、再 .focus() 模拟 Radix 焦点还原、推进超过 300ms、断言弹层保持关闭——必须在移除抑制逻辑后变红——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

folderButton!.dispatchEvent(new MouseEvent('click', { bubbles: true }));
await Promise.resolve();
});
expect(onOpenPathLocally).toHaveBeenCalledWith('/tmp/project');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R2-3: This gates test pins the folder lambda's argument but only pins the terminal button's existence — the adjacent onOpenTerminalLocally lambda's workspace.cwd argument is asserted by no test anywhere. The two wiring lambdas in WorkspaceSection.tsx are copy-paste-shaped; corrupting the terminal one — e.g. swapping in workspaceLabel(workspace), which appears two lines up — ships green: this unit test never clicks the terminal button, the tooltip test takes an argument-less prop, and the e2e filters the request path with a regex matching any selector while the mock daemon answers any POST /workspaces/*/open unconditionally. 'Open terminal' would then silently spawn at a nonexistent or wrong path (daemon 400 workspace_mismatch, or a wrong workspace on a basename collision).

Witness:

mutant onOpenTerminalLocally(workspaceLabel(workspace)) → Test Files 2 passed (2), Tests 63 passed (63) — identical to baseline
Suggested change
expect(onOpenPathLocally).toHaveBeenCalledWith('/tmp/project');
expect(onOpenPathLocally).toHaveBeenCalledWith('/tmp/project');
await act(async () => {
details
.querySelector('[data-web-shell-open-workspace-terminal]')!
.dispatchEvent(new MouseEvent('click', { bubbles: true }));
await Promise.resolve();
});
expect(onOpenTerminalLocally).toHaveBeenCalledWith('/tmp/project');

Click the terminal button in the same test and pin the argument, mirroring the folder arm. The added assertion must go red when the terminal lambda's argument is mutated — please prove it by running that mutation.

中文说明

该 gates 测试钉住了 folder lambda 的参数,却只钉住终端按钮的存在性——相邻 onOpenTerminalLocally lambda 的 workspace.cwd 参数在任何测试中都未被断言。WorkspaceSection.tsx 中两个接线 lambda 是复制粘贴形态;破坏终端那个——例如换成上方两行就出现的 workspaceLabel(workspace)——全套件依旧绿灯:本单测从未点击终端按钮,tooltip 测试接收无参 prop,e2e 用匹配任意选择器的正则过滤请求路径且 mock daemon 对任何 POST /workspaces/*/open 无条件应答。「打开终端」将静默在不存在或错误的路径上 spawn(daemon 400 workspace_mismatch,或 basename 碰撞时打开错误的工作区)。

修复:在同一测试中点击终端按钮并钉住参数(如上建议块),与 folder 分支对称。新增断言必须在终端 lambda 参数被变异后变红——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

Comment on lines +504 to +510
// xterm is X11-only: a pure-Wayland session must not count it.
expect(
isLocalTerminalAvailable({
WAYLAND_DISPLAY: 'wayland-0',
PATH: xtermDir,
}),
).toBe(false);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] R2-4: linuxTerminalCandidates' pure-Wayland arm is only witnessed in the negative — xterm excluded under WAYLAND_DISPLAY. The positive half, gnome-terminal/konsole still counting when only WAYLAND_DISPLAY is set, has no witness (every Wayland fixture uses xtermDir; every positive emulator fixture sets DISPLAY). Simplifying the helper to env['DISPLAY'] ? LINUX_TERMINAL_NAMES : [] ships green — the Wayland+xterm arm still returns false either way and the integration boot oracle recomputes from the same function, flipping along. Because probe and spawner share the helper, the local-terminal capability would then silently disappear from /capabilities on pure-Wayland sessions (the GNOME/KDE default on current distros) and the client hides the button.

Witness:

mutant `return env['DISPLAY'] ? LINUX_TERMINAL_NAMES : [];` → Tests 41 passed (41)

Add positive arms: expect(isLocalTerminalAvailable({ WAYLAND_DISPLAY: 'wayland-0', PATH: gnomeTerminalDir })).toBe(true) (and the konsoleDir variant), plus a spawner arm asserting openTerminalLocally under WAYLAND_DISPLAY-only spawns gnome-terminal. Both consumers share the helper — isLocalTerminalAvailable (local-path-open.ts:106) and spawnLinuxTerminal (local-path-open.ts:253) — so pin both the probe and the spawn path; a future split of the helper must not regress one side only. The new arms must go red under the empty-set mutant, which the whole current suite ships green — please prove it by running that mutation.

中文说明

linuxTerminalCandidates 的纯 Wayland 分支只有负向见证——仅有 WAYLAND_DISPLAY 时排除 xterm。正向的一半(只有 WAYLAND_DISPLAY 时 gnome-terminal/konsole 仍应计入)没有任何见证(所有 Wayland 用例都用 xtermDir,所有正向模拟器用例都设了 DISPLAY)。把辅助函数简化为 env['DISPLAY'] ? LINUX_TERMINAL_NAMES : [] 全套件全绿——Wayland+xterm 分支两种写法都返回 false,集成启动预言又从同一函数重算、随之一起翻转。由于探测器与启动器共用该辅助函数,本地终端能力会在纯 Wayland 会话(当前发行版 GNOME/KDE 的默认形态)上从 /capabilities 静默消失,客户端随之隐藏按钮。

修复:补正向分支:expect(isLocalTerminalAvailable({ WAYLAND_DISPLAY: 'wayland-0', PATH: gnomeTerminalDir })).toBe(true)(及 konsoleDir 变体),再补一个启动器分支,断言仅 WAYLAND_DISPLAYopenTerminalLocally 会 spawn gnome-terminal。两个消费者共用辅助函数——isLocalTerminalAvailable(local-path-open.ts:106)与 spawnLinuxTerminal(local-path-open.ts:253)——请同时钉住探测与 spawn 两条路径,避免未来拆分辅助函数时只回退一侧。新增分支必须在空集合变异下变红(当前整个套件对该变异全绿)——请以该变异验证。

— qwen3.8-max via Qwen Code /review (v0.22.3)

ytahdn
ytahdn previously approved these changes Sep 1, 2026

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What this PR does / PR 主旨

EN: This PR declutters the web-shell workspace sidebar (session counts, path, git branch and facet stats move from inline chips into a hover details popover with keyboard parity) and adds loopback-only local-open actions: two daemon capabilities (workspace_local_open, workspace_local_terminal) probed once at boot from host GUI-session evidence, served by POST /workspaces/:workspace/open, handing off to the OS and answering 501 honestly when the directory is gone or no display/terminal exists.

中文:本 PR 整理 web-shell 工作区侧栏(计数、路径、分支与 facet 统计从内联芯片移入支持键盘对等的悬浮详情弹层),并新增仅回环可见的本地打开能力:两个启动时按宿主 GUI 会话证据探测一次的 daemon 能力,经 POST /workspaces/:workspace/open 交接给操作系统,目录缺失或无显示器/终端时诚实返回 501。

Round-4 scope / 第四轮范围

EN: Purely static re-review at head ab48b2106b5710c50cd4938970db5570408e0bd7 (no tests/builds executed). The increment since the round-3 verification (650d2f3) is a single commit — "make the spawn hang guards testable without fake timers" — plus the bot's newest review at this head. My round-3 APPROVE was auto-dismissed by the push, exactly as this branch's earlier approvals were; nothing in the new commit invalidated the previously verified state (checked below rather than assumed).

中文:本轮为纯静态复审,基线 ab48b2106。相对第三轮验证点(650d2f31d1)的增量只有一个提交——"让 spawn 挂起守卫不依赖 fake timers 也可测"——外加机器人在本 head 的最新审查。我第三轮的 APPROVE 因新推送被自动 dismiss(与本分支此前所有批准同款);新提交并未使已验证状态失效,以下逐项核实而非想当然。

The increment, verified / 增量逐项核实

The change adds an optional timeoutMs parameter to openPathLocally/openTerminalLocally ("exists for tests; production callers use the default") and threads it through the spawn helpers; the private spawnAndIgnoreExitCode moves from a positional extraEnv to an options object { extraEnv, timeoutMs = OPEN_TIMEOUT_MS }, and the two rejection messages interpolate the actual timeout instead of hard-coding "10s". I checked: production behavior is byte-for-byte the same for every real path (the route at routes/workspace-local-open.ts:31-32 calls both with one argument, so the default applies; the win32 PowerShell fallback correctly migrates to { extraEnv: { QWEN_LOCAL_OPEN_DIR: path }, timeoutMs } — the env-carrying directory never enters a parsed command line, preserving the round-2 hardening); spawnLinuxTerminal's two shared invariants are alive (DISPLAY/WAYLAND_DISPLAY gate at :250-252, and probe/spawner both consuming linuxTerminalCandidates(env) — the R1-27/R1-30 fixes are untouched); the deleted-directory assertPathExists pre-checks on both win32 branches (:149, :192) and the Linux mirror (:197) are all intact; the process-env guard still holds — exactly 4 process.env sites in the file (:86/:99/:247/:287) against the declared whole: 4. The test rewrite replaces fake-timer advancement with a real 5 ms timeout against a stubbed child, asserting the same contract (kill + LocalPathOpenUnavailableError) with fewer moving parts — a strict improvement. One known trade-off stays: the three execFileAsync branches still hard-code OPEN_TIMEOUT_MS (the bot recorded this as a deferred probe) — test-hook inconsistency only, no production impact.

The three Criticals from the earlier CHANGES_REQUESTED (Linux deleted-directory false success, spawn-time display gate, pure-Wayland xterm) were verified fixed at 650d2f3 in round 3 and I re-confirmed each anchor at this head; the review bot's own newest pass at ab48b2106 posted zero Criticals — nine inline Suggestions, thirteen probes deferred as non-blockers, three duplicates of already-reported test-gap notes. Nothing in this round's new surface changes my read.

CI / 持续集成

EN: At publish time on ab48b2106: 21 checks pass, Test (ubuntu-latest) is still pending, remaining lanes skipped. Stated as-is; I do not wait on CI.

中文:发布时刻 21 项通过,Test (ubuntu-latest) 仍在运行,其余为 skip。如实记录,不等待。

Verdict / 结论

EN: APPROVE. Fourth pass over this PR, second over its current shape; the increment is a testability refactor that provably preserves every hardened behavior, the three previously filed Criticals remain fixed at this head, and the only open observations on both sides are Suggestion-level test-gap notes (legitimate follow-ups, none blocking). The stale CHANGES_REQUESTED state on this PR reflects commits that no longer exist on the branch — at ab48b2106 I find no Critical or Important finding, verified statically.

中文:批准(APPROVE)。 这是对该 PR 的第四轮、对其当前形态的第二轮审查;增量是一次可证不破坏任何加固行为的可测性重构,三条历史 Critical 在本 head 仍为修复态,双方剩余意见均为建议级测试缺口备忘(合理跟进项,不阻塞)。本 PR 上挂着的 CHANGES_REQUESTED 状态反映的是已被 rebase 移出分支的提交——在 ab48b2106 上,我未发现任何 Critical 或 Important 级发现。本轮为纯静态审查,未运行任何测试。

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent re-review at ab48b2106 — Critical-only / 独立复审

Re-verified statically against the exact head ab48b2106b5710c50cd4938970db5570408e0bd7 (head tree + CI API reads; no tests executed here). Line numbers below are at this head. / 以下为针对该精确 head 的读码复核结论,行号均以本 head 为准。

1. 历史问题复核 / Historical issues — resolution verified

  • Bot Criticals R1-17 / R1-27 / R1-30 — 已修复 (verified fixed). packages/cli/src/serve/local-path-open.ts: the Linux terminal branch runs assertPathExists(path) before spawning (:199); spawnLinuxTerminal throws LocalPathOpenUnavailableError('No display server available') when neither DISPLAY nor WAYLAND_DISPLAY is set (:250-252); probe (:106) and spawner (:253) share linuxTerminalCandidates(env), which drops the X11-only xterm on pure-Wayland sessions. The route maps the error to 501 and answers opened: true only on no-throw.
  • Round-1 human findings — 已修复. Keyboard parity on the details popover (anchor onFocus/onBlur with the same 300 ms delay, WorkspaceDetailsTooltip.tsx :235-241; focus-aware pointer-leave via containsFocusTarget on anchor and portaled content); win32 assertPathExists pre-checks on both branches (:148, :192); formatDateTime compares calendar days (toDateString); sidebar.overview.label / …unknown / …unavailable removed from both locales; icon-swap tests pin concrete svg.lucide-* selectors; the cmd fallback is %VAR%-free (Start-Process cmd.exe -WorkingDirectory "$env:QWEN_LOCAL_OPEN_DIR", :236); the workspace_local_open protocol-doc row is a well-formed 2-column row (qwen-serve-protocol.md:543, exactly 3 pipes); OpenLocallyButton has the sr-only aria-live success announcement + in-flight pending guard released via .finally; headerActionCount excludes the menu trigger when locked (WebShellSidebar.tsx :5859-5862).
  • Daemon surface re-audited at this head: the route fails closed in order (mutate gate → 400/503/403 by resolveTrustedRuntime → whitelist-mapped folder/terminal → registry-resolved runtime.workspaceCwd is the only path ever opened); env-guard allowance whole: 4 matches exactly four process.env reads (:86/:99/:247/:287); docs count 149 registered tags matches the registry; capability probes flow through both bootstrap envelopes; registerWorkspaceLocalOpenRoutes is mounted (server.ts :2320). 本轮扫描未发现新的 Critical。

2. 仍存在的实质性历史问题 / Substantive items still standing at this head

  1. R2-1 — spawnWindowsTerminal's blanket catch also falls back when the wt.exe hang guard fires (local-path-open.ts :217-241). spawnAndIgnoreExitCode rejects both on a spawn-level error and on the hang timeout (${command} did not exit within ${timeoutMs}ms, :291); the untyped catch { at :223 launches the PowerShell/cmd fallback for either. A wt.exe that spawns but stalls ≥10 s is killed, then double-opened one click later with ≥10 s request latency. Actionable: reject the hang with a distinguishable error type and re-throw it from spawnWindowsTerminal (fallback only on spawn-level errors), or pin the intended double-open with a test that goes red when the catch is narrowed/widened.
  2. R2-2 — selecting a workspace-menu item reopens and latches the details popover (WorkspaceDetailsTooltip.tsx anchor onFocusopenAfterDelay :172/:233-237; WebShellSidebar.tsx handleSessionMenuCloseAutoFocus :1362-1371 wired at :5962). The WorkspaceMenu trigger renders inside the popover's anchor; after an item selection Radix restores focus to the trigger and the handler only preventDefault()s the rename and pointer-dismiss arms — an item selection is neither — so the focusin bubbles to the anchor and the popover reopens 300 ms later with no blur/pointer-leave to close it; hovering another row stacks a second popover. Actionable: suppress the focus-restore for the workspace menu's item-selection close (onCloseAutoFocus preventDefault) or gate the focus-open path behind a pointer-driven flag — without regressing the keyboard-parity open (the 300 ms-delayed genuine focus must still open it).

(记录但不作为本次发现门禁 / recorded, not re-derived as new findings: the remaining Suggestion-level test-pinning gaps on the round-2 ledger — R1-2/R1-3/R1-8/R1-9/R1-28/R2-3/R2-4, the 13 deferred probes, and the author-deferred isLocalDaemon() unit tests and createServeApp mount assertion. Each was re-read at head: the production logic behind them is sound.)

3. CI 阻塞 / CI blockers on this exact head

  • Test (ubuntu-latest, Node 22.x) has no green completion at ab48b21 and nothing is currently in flight (run 33461820573): attempt 4 ❌ — single failure packages/core src/utils/shellAstParser.test.ts > classifies adversarial rule inputs within the CPU budget (1630.8 ms against a 1000 ms budget with vitest collect at 1735 s — a load-sensitive timing guard in a package whose only PR touch is a Prettier reflow of an unrelated test file, so not PR-caused); attempt 5 cancelled; attempt 6 ❌ "The self-hosted runner lost communication with the server" (infra); attempt 7 cancelled by @wenshao at 08:54Z. A main unit lane that ends cancelled is not a healthy completion — please re-run the suite to green on this head.
  • web-shell E2E Smoke was cancelled with attempt 7 (needs the same re-run).
  • All other reported lanes are green at this head: Serve A/B (no response changes), Desktop Shell (ubuntu/windows), Integration (no-AK), Real daemon E2E, Dependency CVE audit, Secret scan, web-shell visuals, Classify PR, Java matrix.

结论 / Verdict

💬 COMMENT — 当前 head 无新的 Critical;不批准的原因是 §2 两项仍存在的实质性历史问题(R2-1、R2-2)与 §3 主测试车道在本 head 上没有绿色完成。修掉或钉住这两项、且 Test (ubuntu-latest) 在本 head 重跑转绿后,以本 head 的形态可以直接批准。/ No new Critical defects at this head; approval is held back by the two still-standing substantive items (R2-1, R2-2) and the absence of a green completion of the main unit lane on this head. With those resolved (fix or explicit test pin) and CI green on this head, this is approvable as-is.

— 衍星 · read-only PR review (posted as qqqys)

…ce-hover-details

# Conflicts:
#	packages/web-shell/client/components/sidebar/WebShellSidebar.tsx
@wenshao

wenshao commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

Re-review items addressed in bea3818e21 (on top of the 0120f70457 main merge, which brings in the ECS Vitest concurrency tuning from #10667):

R2-1 (wt.exe hang also triggered the fallback) — the spawn hang guards now reject with a dedicated SpawnHangError, and spawnWindowsTerminal re-throws it instead of falling back: only a genuine spawn-level failure (wt.exe absent) launches the PowerShell/cmd window, so a spawned-but-stalled wt.exe can no longer double-open with a ≥10 s stall. Regression test: a stalled wt.exe rejects and powershell.exe is never spawned (goes red when the catch is widened again).

R2-2 (menu selection re-latched the details popover) — the workspace menu's onCloseAutoFocus now preventDefaults: Radix no longer restores focus to the trigger that lives inside the popover's focus-open anchor, so a menu close can't reopen-and-latch the details popover. The keyboard-parity open is unaffected (a genuine 300 ms focus still opens it). Regression test drives the full path with real timers — hover-open popover → open menu → select item → advance past the open delay → popover stays closed — and goes red when the suppression is removed (verified by mutation).

Conflict-resolution correction: the merge briefly kept the pre-existing ws.primary ? undefined : ws.cwd for header actions; main has since moved to the explicit cwd (pinned by the worktree-task tests), so the merged file now follows main (const wsCwd = ws.cwd;). All 345 sidebar tests pass.

Verification: 345 web-shell sidebar tests, 58 daemon local-open/guard/docs tests, the 4-spec workspace-overview e2e, root npm run typecheck — all green.

On CI: the last ubuntu Test failures on the previous head were all infrastructure (serve-test daemon-boot hangs, the shellAstParser CPU budget under fleet load, one runner communication loss); #10667's concurrency tuning is in this merge, so this head should have a materially better shot.

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review at bea3818e21 — 上轮阻塞项全部核实修复,唯一未完成门禁为运行中的主测试车道

本轮针对新 head bea3818e21c0673d2d29afe792c59d4b653c0311(原评审锚点 ab48b2106 之后的变化 = 合入 main 的 0120f704 + 修复提交 bea3818e21)。

上轮 COMMENT 两项阻塞问题的处置 — 均已修复并钉住

  1. wt.exe 挂起回退双开 — 已修复。新增 SpawnHangError 把「spawn 成功但超时被 kill」与「spawn 级失败」分开:spawnWindowsTerminal 对前者直接重抛,回退只在 wt.exe 缺失(ENOENT)时触发;openTerminalLocally 的 catch 将其包装为 LocalPathOpenUnavailableError,路由仍诚实返回 501(local-path-open.ts :34-37/:225-232/:297-302)。测试 does not fall back when a spawned wt.exe stalls and is killed by the hang guard 钉住恰一次 spawn、不启动 powershell、5ms 注入超时——恢复兜底 catch 会打红它,符合上轮要求的变异见证。
  2. 菜单项选择后弹层焦点卡死 — 已修复。工作区 DropdownMenuContent 现无条件 onCloseAutoFocus={(event) => event.preventDefault()}(WebShellSidebar.tsx :6016-6027),Radix 不再把焦点还原到位于 hover-open 锚点内的触发器,focusin → openAfterDelay 的重开路径被切断。真实计时器测试 does not reopen the details popover after a workspace menu selection 复现「hover 开 → 菜单选择 → 450ms 后仍关」,抑制被移除即打红;键盘聚焦仍按同一 300ms 延迟打开(锚点 onFocus 未受影响,R1-18 的下界钉定不回退)。

其余门禁复核 / Remaining gates at this head

  • 历史 Critical 与行为修复锚点在本 head 逐条在场:Linux/win32 三分支 assertPathExists(:153/:197/:204)、spawn 时显示门控与共享候选表(:260/:262/:111)、日历日时间戳、键盘对等/焦点感知关闭、aria-live 播报与 in-flight 守卫;route 仍按 400/503/403 → 白名单 target → 注册表 cwd 失败封闭。
  • 合入 main 未扰动本 PR 接线;对本 upstream/main 的有效 diff 仍为同一 38 文件集。
  • 本轮修复范围内未发现新的阻塞性正确性/安全/回归问题。

CI — 唯一未完成门禁 / The one outstanding gate

  • Test (ubuntu-latest, Node 22.x) 在本 head 上自 11:23:40Z 起 仍在运行(run 33502227645 / job 99838034697),review-pr 元检查同样在跑;其余 19 项 success、9 项路径性 skip。按流程 Pending 不计健康、也不等待轮询。

结论 / Verdict

💬 COMMENT — 代码门禁全部通过:两项上轮阻塞问题已在 bea3818 修复且各有会因回退而打红的测试;历史全部问题在本 head 复核为已修复态。唯一缺的是本 head 上 Test (ubuntu-latest) 的一次绿色完成(该车道正是此前连续多轮未能跑绿的主因,本轮重跑正在途中)。该车道在本 head 转绿后即可批准,无其他保留意见。 / All code gates pass at bea3818 — both previously-standing blockers are fixed with mutation-pinned tests, and every historical item re-verified in place. The only outstanding gate is one green completion of Test (ubuntu-latest) on this head (currently running); approve-ready as soon as it lands, no other reservations.

— 衍星 · read-only PR review (posted as qqqys)

ytahdn
ytahdn previously approved these changes Sep 1, 2026

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE —— 已核对到最新 head bea3818

What this PR does / PR 主旨

EN: This PR declutters the web-shell workspace sidebar (session counts, path, git branch and facet stats move from inline chips into a hover details popover with keyboard parity) and adds loopback-only local-open actions: two daemon capabilities (workspace_local_open, workspace_local_terminal) probed once at boot from host GUI-session evidence, served by POST /workspaces/:workspace/open, handing off to the OS and answering 501 honestly when the directory is gone or no display/terminal exists.

中文:本 PR 整理 web-shell 工作区侧栏(计数、路径、分支与 facet 统计从内联芯片移入支持键盘对等的悬浮详情弹层),并新增仅回环可见的本地打开能力:两个启动时按宿主 GUI 会话证据探测一次的 daemon 能力,经 POST /workspaces/:workspace/open 交接给操作系统,目录缺失或无显示器/终端时诚实返回 501。

Round-5 scope / 第五轮范围

EN: Purely static re-review at head bea3818 (no tests/builds executed). My prior analysis head ab48b21 is a strict ancestor of this head — no rebase — so the earlier verified state carries. The increment is (1) a merge of main and (2) one author commit, "address re-review — wt hang fallback guard, menu-close focus latch". Attribution is isolated to the author's own commit (a two-dot diff across the merge would miscount main's churn as PR changes).

中文:本轮为纯静态复审,基线 bea3818。我上轮分析点 ab48b21 是本 head 的严格祖先(无 rebase),先前已验证状态沿用。增量由 (1) 合并 main 与 (2) 作者一个提交(处理复审:wt 挂起回退守卫、菜单关闭焦点卡死)组成。归属按作者自有提交隔离(跨 merge 的两点 diff 会把 main 的改动误算成本 PR 变更)。

The increment, verified / 增量逐项核实

Merge drift: the effective three-dot diff is still exactly the same 38-file set; the two capability strings remain registered in the capabilities table and consumed by DaemonClient and the sidebar, and the route is still imported and mounted (server.ts:282 / :2323). The merge did not disturb this PR's wiring. / 合并未扰动本 PR 接线:有效 diff 仍是同一 38 文件集,两个能力字符串仍在注册表并被 DaemonClient 与侧栏消费,路由仍被导入并挂载(server.ts:282 / :2323)。

Author commit bea3818 — three production edits, each re-verified in the head tree with a mutation-pinned test: / 作者提交三处生产改动,均在 head tree 复核并各有回退即打红的测试:

  1. wt.exe hang no longer double-opens. A new SpawnHangError separates "spawned but never exited within the timeout (killed by the hang guard)" from a spawn-level failure (wt.exe absent / ENOENT). spawnWindowsTerminal re-throws a hang instead of falling through, so the PowerShell/cmd fallback only runs when wt.exe is genuinely missing — a stalled-but-running terminal no longer opens a second window; it propagates to openTerminalLocally and still returns an honest 501 (local-path-open.ts :34-37 / :228-232 / :296-306; test "does not fall back when a spawned wt.exe stalls"). This is exactly the fix requested last round. / 新增 SpawnHangError 区分「起了但超时被 kill」与「wt.exe 缺失」,回退只在后者触发,杜绝卡死终端的双开;挂起仍诚实返回 501。

  2. Primary-row New session targets the right workspace after the standalone merge. wsCwd changed from ws.primary ? undefined : ws.cwd to always ws.cwd. Once PR 10514 landed (undefined cwd now means a standalone/global session), passing undefined for the primary row would have opened a standalone chat instead of a session in the bound workspace; always using ws.cwd keeps the primary row consistent with secondary rows (WebShellSidebar.tsx:5813 → handleNewSession / handleNewWorktreeSession). / 合入 10514 后 undefined cwd 语义变为 standalone,primary 行原来传 undefined 会误开独立会话;恒取 ws.cwd 修正了这一跨 PR 语义漂移。

  3. Menu selection no longer re-opens the details popover. The workspace-details dropdown's onCloseAutoFocus is now an unconditional preventDefault, because its trigger always lives inside the hover-open popover anchor — Radix restoring focus there re-triggers the 300 ms focus-open and the popover never closes. The shared conditional handler is still used by the two session menus, so nothing went dead, and keyboard focus-open is unaffected. / 工作区详情弹层内的菜单 trigger 恒在 hover-open 锚点内,Radix 还原焦点会重触发 300ms 打开致弹层永不关闭,故改为无条件抑制;两个 session 菜单仍用原条件处理器,无死码,键盘打开不受影响。

No Critical and no Important finding at this head. The stale CHANGES_REQUESTED on the PR reflects a bot review pinned to c98701a, a commit that no longer exists on the branch. / 本 head 无 Critical 亦无 Important;PR 上挂着的 CHANGES_REQUESTED 是钉在 c98701a(已不在分支上)的陈旧机器人评审。

CI / 持续集成

EN: At publish time on bea3818, Web-shell Visuals is green; Qwen Code CI (which runs Test (ubuntu-latest)) and the review-bot pass are still in_progress — I state this as observed and do not poll. Approving on maintainer judgment, consistent with my prior pass at ab48b21 which was on the same footing. This agrees with the independent re-review already on this head, which found both prior blockers fixed with mutation-pinned tests and no other reservations. / 发布时刻 Web-shell Visuals 已绿,Qwen Code CI(含 Test ubuntu)与机器人审查仍 in_progress;如实记录、不轮询。凭 maintainer 判断放行,与上轮同基准;与本 head 上已有的独立复审一致。

Verdict / 结论

EN: APPROVE. Fifth pass overall, third over the current shape. The increment is a correct merge plus three well-tested fixes that each close a previously-raised concern; every historical Critical remains fixed at this head and the effective diff is unchanged. No blocking findings remain from my side. / 批准。总体第五轮、当前形态第三轮;增量是一次正确合并加三处有测试钉住的修复,各闭合一个此前提出的问题,历史 Critical 在本 head 仍为修复态,有效 diff 未变。我方无阻塞项。

中文:APPROVE。纯静态审查,未运行任何测试;建议在 Qwen Code CI 于本 head 转绿后合并。

…ce-hover-details

# Conflicts:
#	packages/web-shell/client/components/sidebar/WebShellSidebar.tsx
#	packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx
@qqqys

qqqys commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

E2E verification report @ head f25d0d37 — tmux serve + bundle smoke / 端到端验证

Head f25d0d37362d = bea3818e21(上轮复审已通过)+ 一个 main 合并提交,无新的 PR 自写代码。本轮在该 head 上补做此前未做的运行态 e2e。

Build / 构建: codeload tarball → npm ci + npm run bundle 全程通过(prepare 构建全部 workspace,bundle 落盘无告警)。

Units at head / 单测(均在 head 树上运行):

  • packages/cli: local-path-open 42 + workspace-local-open 路由 11 + process-env-guard 3 = 56/56;server + run-qwen-serve = 1545/1545
  • packages/web-shell: WorkspaceSection / WorkspaceMenu / WorkspaceDetailsTooltip / workspaceOverviewModel / WebShellSidebar.workspace-removal / formatDateTime = 214/214
  • packages/sdk-typescript: DaemonClient = 406/406(含 openLocally/openTerminalLocally 新客户端方法)

Live serve e2e(tmux,env -i 无 DISPLAY/WAYLAND_DISPLAY 的纯 headless 环境,loopback --workspace 绑定 fixture 工作区):

  • GET /capabilitiesworkspace_local_open / workspace_local_terminal 两个 tag 均正确缺席(headless 主机按设计省略,客户端据此隐藏 Open-locally 入口)。
  • POST /workspaces/<ws>/open {"target":"folder"}501 local_path_open_unavailable,耗时 12.7ms —— 诚实失败,无挂起。
  • POST {"target":"terminal"}501 同码,1.7ms(No display server available,display 在 boot 探测后消失也不会误报成功)。
  • POST 未注册工作区 → 400 workspace_mismatch(fail-closed,不会退化到主工作区)。
  • 空 body → 默认按 folder 处理 → 501,无 400/500 崩溃。
  • 路由只打开注册解析出的 workspace cwd,客户端除路由参数外无法供路 —— 与实现注释一致。

Bundle TUI smoke(tmux,hermetic HOME): dist/cli.js 正常启动渲染(v0.22.3 banner、模型栏、工作区路径),真实模型回合按指令精确回复 E2E10606-OK,/quit 干净退出,无残留进程。

未发现 Critical。/ No Critical found. (本 PR 的 approve 门禁仍差:head 被 main 合并推新后 ytahdn 的 approval 被 dismiss,且 Test/Integration 等 CI 车道在新 head 上仍在跑。)

@qqqys

qqqys commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Delta review addendum — head moved f25d0d37e7e2508 (2 commits: b2fe0ab4 serve bootstrap capability tags, 7e7e2508 ChatEditor test duplicate language). Prior full review + live e2e report (f25d0d3, above) stands; this covers only the delta.

Verification (static, at head 7e7e2508):

  • b2fe0ab4 hard-codes 4 bootstrap-envelope flags to true + resolves acpHttpEnabled from env, claiming "production wiring always registers these". Verified against server.ts runtime wiring and capabilities.ts flag→tag mapping:
    • dynamic_workspace_registration ← production always passes createWorkspaceRuntime: createDynamicWorkspaceRuntime
    • standalone_sessions_v1StandaloneSessionService is constructed unconditionally when liveConversationWorkspace is provided, which the production path always passes ✓
    • workspace_trust_hot_reload ← computed true in the real daemon (the deps.trustedWorkspace/bridge/fsFactory escape hatches are test-injection only) ✓
    • web_terminalacpHttpEnabled, resolved via the same resolveAcpHttpEnabled + same env on both bootstrap and runtime paths ✓ (this is why the test gains web_terminal without a new flag)
    • scratch_workspace_registration — one narrow divergence: if prepareManagedScratchRoot throws (fail-closed, stderr warning), runtime advertises false while bootstrap reports true. Boot-window-only over-report in an already-degraded daemon; not merge-blocking.
    • Head CI: Integration lanes green, so the updated qwen-serve-routes capability expectation list matches actual served envelopes. The red web-shell E2E Smoke job never ran tests — its log shows actions/checkout failing 3× with Failed to connect to github.com port 443 (runner infra), unrelated to this diff.
  • 7e7e2508 removes the duplicate language interface field + destructure in ChatEditor.test.tsx (test-only; identical in intent to the standalone fix(web-shell): remove duplicate language declaration in ChatEditor.test.tsx #10729 — whichever lands first makes the other a no-op).

Verdict: no Critical in the delta. ci-bot's standing CHANGES_REQUESTED (local-path-open Linux terminal findings) is on the old head c98701ab and remains the active gate; no maintainer/bot approval stands at the current head.


增量复审补充 — head 从 f25d0d3 移到 7e7e2508(2 个提交)。此前完整 review + e2e 报告仍然有效,本补充仅覆盖增量。

  • b2fe0ab4 将 5 个运行时恒定开启的能力标签同步到 bootstrap envelope。逐项核对 server.ts 生产装配与 capabilities.ts 映射:4 个硬编码 true 在真实 daemon 中均无条件成立;web_terminalacpHttpEnabled 两侧用同一解析函数同一 env,一致。唯一偏差:prepareManagedScratchRoot 失败(已 fail-closed 并告警)时 bootstrap 窗口内会多报 scratch_workspace_registration,非阻断。head 的 Integration 绿灯证明能力清单与实际 envelope 一致;web-shell E2E Smoke 红色是 runner 连不上 github.com 的基础设施问题(checkout 三次超时),与本 PR 无关。
  • 7e7e2508 纯测试去重(与 fix(web-shell): remove duplicate language declaration in ChatEditor.test.tsx #10729 重复,先到先得)。

结论:增量无 Critical。 ci-bot 在旧 head 的 CHANGES_REQUESTED 仍是活跃门禁;当前 head 无任何 approval。

@wenshao

wenshao commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 44 passed · 0 failed · 44 total

Flakiness gate: ⚠️ timeout — only 4 of 5 rounds fit the 15-minute budget; the completed rounds agreed

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:44 通过 · 0 失败 · 44 总计

抖动门:⚠️ timeout — only 4 of 5 rounds fit the 15-minute budget; the completed rounds agreed

Verification report

PR 10606 — feat(web-shell): declutter the workspace sidebar and add loopback open actions (follow-up round)

Verdict: merge-ready — 44/44 scripted assertions passed (0 unexpected failures), verified head e5398dcec84af3c243176fb0fecc0a0f113c3d28 (merge-ref HEAD^2; base tip 180468306c3a81ac307203c36e8e47bda3858dc2).

中文摘要
  • 结论merge-ready。44/44 脚本断言通过,0 个意外失败。这是跟进轮:上一轮在 head ab48b210 判定 merge-ready,此后 PR 新增 3 个修复提交(bootstrap capability 镜像、wt 挂起回退守卫 + 菜单焦点闩、ChatEditor 测试去重)并三次合并 main。
  • 上轮发现状态:F1(服务端无 loopback 强制,客户端门控)仍成立——设计如此且已在 PR 风险段落披露;F2(folder/terminal 的 DISPLAY 预检不对称)仍成立——headless 单元格复测为一次失败的 xdg-open 尝试 + 诚实 501;F3(两个无关文件的 prettier 噪声)已修复——两个文件已不在有效 diff 中;更正 C1("24 小时内"描述与日历日代码不符)仍成立。
  • A/B 结论:对真实 daemon 进程的线级验证:base(HEAD^1 完整重建)上 POST /workspaces/:workspace/open 为 404、两个新 capability 标签缺失(8/8);head 上全部门控正确(25/25):bootstrap 阶段(/health 之前)与 runtime 阶段的 /capabilities 都宣告 workspace_local_open/workspace_local_terminal 及五个镜像的 runtime-only 标签(新提交 b2fe0ab 的修复点);打开路径恒为已注册工作区 cwd(客户端注入的 path 字段被忽略);未知工作区 400;无/错 token 401;含 shell 元字符的工作区目录以字面 argv 传给 xdg-open(无命令替换);headless 省略标签且调用返回 501。
  • 变异矩阵:7 个变异全部被杀(含两个新守卫:删除 wt 挂起回退守卫 → 挂起测试变红;删除 bootstrap 镜像 → 镜像测试变红),阳性对照成立,回放后工作树干净;见 03-mutation-matrix.png
  • 门控:server.test.ts 1168/1168;cli serve 四套件 433/433;web-shell 侧栏 + formatDateTime 382/382(21 文件);ChatEditor 107/107;SDK DaemonClient 406/406;集成 qwen-serve-routes 37/37;Playwright e2e workspace-overview 4/4(上轮因环境失败的轮询用例本轮通过);cli + web-shell tsc --noEmit 干净;文档 capability 计数与注册表实测 149/43 精确一致。
  • 未覆盖:逐 commit 归因(浅克隆,上一轮 head 不可达);macOS/Windows 启动分支(仅 mock spawn 单测覆盖);Playwright mobile/visuals;仓库级 lint/format 依赖 PR 自身 CI。

Previous-finding status (follow-up round)

# Previous finding Severity Status at new head
F1 Host-open routes have no server-side loopback enforcement; the loopback gate is client-side (capability advertisement + UI isLocalDaemon()), with auth/trust as the server layers Suggestion Stands — re-verified at the new head: registerWorkspaceLocalOpenRoutes is mounted unconditionally in server.ts and the delta added no listener-identity check. Blast radius remains bounded (opened path is only a registered workspace cwd); the PR's Risk & Scope discloses the SSH-tunnel/LAN behavior; matches the pre-existing directory-picker precedent.
F2 Folder vs terminal display pre-check asymmetry (openTerminalLocally re-checks DISPLAY; openPathLocally relies on xdg-open failing) Nice to have Stands — re-measured in headless cells C3–C5: exactly one xdg-open attempt that exits 3, then an honest 501 local_path_open_unavailable. Consistency note, not a behavioral gap.
F3 Unrelated Prettier churn in packages/vscode-ide-companion/src/diff-manager.ts and packages/core/src/tools/tool-registry.test.ts Nice to have Fixed — neither file is in the effective HEAD^1..HEAD diff anymore (the effective diff touches no packages/core or vscode-companion file at all).
C1 Description says "HH:mm:ss within the last 24 hours"; code compares calendar days Correction StandsformatDateTime.ts still compares toDateString() with a deliberate code comment; the PR body (EN+ZH) still says "last 24 hours". The description is stale, not the code; the suite pins the calendar-day behavior.

Carried-over measurements were re-run at the new head, not diffed against the old report: the previous head ab48b210 is not present in this depth-2 checkout, so the input-closure shortcut was unavailable and everything was rebuilt and re-measured.

Delta since the previous round

Commit messages after the previously verified head: 0120f704 / f25d0d37 / e5398dce (merges of main, with conflict resolutions in WebShellSidebar.tsx and WorkspaceSection.test.tsx), bea3818e (wt hang fallback guard + menu-close focus latch), b2fe0ab4 (mirror runtime-only capability tags in the bootstrap envelope), 7e7e2508 (drop duplicate language declarations in ChatEditor test). Per-commit diffs could not be isolated (see Not covered); the aggregate diff was verified and each delta area got a targeted probe:

  • b2fe0ab (bootstrap mirror): wire cells A2–A4 prove the bootstrap envelope (served before /health starts the runtime, deterministic because qwen serve defers the runtime until first health) carries both local-open tags plus dynamic_workspace_registration, scratch_workspace_registration, standalone_sessions_v1, workspace_trust_hot_reload, web_terminal, workspace_runtime; cell A15/A16 proves runtime-envelope parity. Mutant M6 (drop the two toggles from currentServeFeaturesForRunQwenServe) is killed by the PR's own new mirror tests (2 red: the available: true parameterizations; the available: false ones correctly stay green).
  • bea3818 (wt hang fallback guard): mutant M5 (remove the SpawnHangError rethrow in spawnWindowsTerminal, letting a stalled wt.exe fall back to PowerShell and double-open) is killed by does not fall back when a spawned wt.exe stalls and is killed by the hang guard. The menu-close focus latch (Radix onCloseAutoFocus handling) is exercised by the sidebar suites (382/382, including the new "keeps focus on the anchor when the popover opens" and focus-parity tests) and by the 4/4 e2e run.
  • 7e7e250 (ChatEditor dedupe): ChatEditor.test.tsx 107/107.

Central claim + A/B table (real daemon builds, wire-level)

Base arm = full packages/cli build at HEAD^1 in a scratch worktree (control purity in Methodology). Head arm = the CI-built dist. Fake xdg-open/gnome-terminal on PATH reproduce the real binaries' no-display exit semantics and log their argv. Witnesses: 01-head-wire-cells.png, 02-base-ab-cells.png.

Cell (oracle) base head
GET /capabilities served; workspace_runtime present (positive control) ✅ D1 ✅ A1
Bootstrap envelope (before /health) advertises workspace_local_open / workspace_local_terminal ❌ absent (as designed) D2–D3 ✅ both present A2–A3
Bootstrap mirrors runtime-only tags (5 + workspace_runtime) n/a ✅ A4
POST /workspaces/:ws/open folder 404, nothing spawned D6/D8 200 {opened:true,target:'folder'}, xdg-open argv = [registered cwd] A6–A7
target:'terminal' 404 D7 200, gnome-terminal --working-directory=<cwd> A8–A9
Body carrying client paths (path,cwd,dir,workspace = /etc) ignored; registered cwd opened A10–A11
Unknown workspace 400 workspace_mismatch A12
No token / wrong token (--token daemon) 401 / 401 A13–A14
Workspace dir named inj;$(touch PWNED) 'echo PWNED' & argv is the literal path; no substitution executed B1–B3
Headless boot: tags / open calls runtime envelope lacks tags D5 bootstrap+runtime omit tags C1–C2/C6; folder+terminal → 501, one honest failing xdg-open attempt C3–C5
Runtime envelope (after ready) lacks both tags D5 still advertises both A15–A16

Base harness 8/8, head harness 25/25 (raw logs: harness-base-final.log, harness-head-final.log). The feature is load-bearing and every gate observed on the wire behaves as the description claims.

Mutation matrix (witness 03-mutation-matrix.png)

# Mutation Suite Result
ctrl unmutated head launcher (42) + route (11) + server probe test (1) + bootstrap mirror tests (4) all green
M0 drop path arg from xdg-open (positive control) launcher killed: opens the path with xdg-open on Linux red with expected-vs-actual argv
M1 resolveTrustedRuntimeresolveWorkspaceRuntimeFromParam route killed: rejects an untrusted workspace without opening anything
M2 default target flipped folder→terminal route killed: 5 red
M3 remove assertPathExists from linux terminal path launcher killed: rejects a deleted directory on Linux without spawning
M4 remove workspace_local_open conditional capability entry server.test.ts killed: forwards the local path open probe result to capabilities
M5 remove SpawnHangError rethrow in wt.exe fallback (delta bea3818e) launcher killed: does not fall back when a spawned wt.exe stalls and is killed by the hang guard
M6 drop local-open toggles from the bootstrap envelope (delta b2fe0ab4) run-qwen-serve.test.ts killed: mirrors the local path open probe on the bootstrap envelopes (available: true) (2 red)

No survivors. M0 proves the harness can make the suites fail; M6's available: false parameterizations staying green under the mutation is the expected direction. Worktree verified clean after the replay.

Targeted gates

Gate Result
packages/cli server.test.ts 1168/1168
packages/cli serve suites (local-path-open, workspace-local-open, process-env-guard, run-qwen-serve) 433/433
packages/web-shell sidebar + formatDateTime (21 files) 382/382
packages/web-shell ChatEditor.test.tsx 107/107
packages/sdk-typescript DaemonClient.test.ts 406/406
integration-tests/cli/qwen-serve-routes.test.ts (real daemon, capability baseline incl. new tags) 37/37
Playwright web-shell.workspace-overview.spec.ts (chromium) 4/4 — including the polling-cadence test that failed environmentally in the previous round; it passes at the new head
tsc --noEmit packages/cli + packages/web-shell clean
Docs counts vs registry 149 registered / 43 conditional — exact match, re-measured from the compiled registry

Findings (non-blocking)

No new findings this round. F1 and F2 from the previous round stand as non-blocking (status table above); F3 is fixed. No correction to the corrections: C1 (calendar-day vs "last 24 hours" prose) remains a description staleness only.

Not covered

  • Per-commit attribution: the checkout is depth-2 (merge, base tip, PR head only) and the previously verified head ab48b210 is not present locally, so the delta commits could not be diffed or exercised individually; the aggregate HEAD^1..HEAD diff was verified and each delta area was probed by behavior (section above).
  • macOS/Windows launcher branches: container is Linux; those branches are covered only by the PR's mocked-spawn unit tests (the new wt-hang guard test is proven load-bearing by M5, but the win32/macOS spawn paths were not executed end-to-end).
  • Playwright mobile/visuals projects not run; only chromium desktop for the workspace-overview spec.
  • Repo-wide lint/format gates rely on the PR's own CI; targeted tsc --noEmit on both affected packages is clean.
  • One harness-side repair during the round, for transparency: the first base-arm run produced 503-then-connection-refused instead of 404 because the base rebuild was missing src/generated/git-commit.ts (produced by npm run generate, which a per-package build skips). After running the base tree's own generator and an incremental rebuild, the base cells behaved as designed. This was a control-build issue, not PR or base behavior.

Methodology

Environment: node:22-bookworm CI verify container, merge-ref checkout (HEAD merge 6262a577, HEAD^1 base 18046830, HEAD^2 head e5398dce). Harness harness-local-open.mjs boots real daemon processes (node dist/index.js serve --port 0 --hostname 127.0.0.1 --token … --workspace …) with a temp HOME, fake xdg-open/gnome-terminal binaries that reproduce the real no-display exit semantics and log argv, and stripped session env (DISPLAY/SSH_*/SESSIONNAME) so the GUI-vs-headless probe is deterministic; the bootstrap-vs-runtime envelope phases are deterministic because qwen serve defers runtime startup until the first /health (fast-path.ts). Base arm: full packages/cli compile at HEAD^1 in tmp/base-tree (worktree removed after capture). Control purity: readlink -f from the base worktree shows the internal @qwen-code/* links resolve into the head tree; this is clean because git diff HEAD^1..HEAD -- packages/core is empty (byte-identical source), the serve code imports no SDK, and the lockfile delta is metadata-only churn (libc arrays, a moved qwen-live workspace entry) with no third-party version change; the base dist was additionally confirmed to lack both new modules. Mutation matrix: mutation-matrix.sh replays seven single-point source mutations with per-mutation vitest runs and git checkout restores, NO_COLOR=1 for parseable output. Raw logs in logs/ (gate-*.log, tsc-*.log, base-build outputs were superseded by the successful rebuild), harness logs harness-{head,base}-final.log, matrix log mutation-matrix.log. Assertion totals (44) = head wire 25 + base wire 8 + matrix mutants 7 + matrix controls 4.

Flakiness gate log

integration test, out of gate scope: integration-tests/cli/qwen-serve-routes.test.ts
e2e suite, out of gate scope: packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts
rounds=5 files=13 skipped=2
file packages/cli/src/serve/local-path-open.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/local-path-open.test.ts
file packages/cli/src/serve/process-env-guard.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/process-env-guard.test.ts
file packages/cli/src/serve/routes/workspace-local-open.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/routes/workspace-local-open.test.ts
file packages/cli/src/serve/run-qwen-serve.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/run-qwen-serve.test.ts
file packages/cli/src/serve/server.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/server.test.ts
file packages/sdk-typescript/test/unit/DaemonClient.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/DaemonClient.test.ts
file packages/web-shell/client/components/ChatEditor.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/ChatEditor.test.tsx
file packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceDetailsTooltip.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceMenu.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceSection.test.tsx
file packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/workspaceOverviewModel.test.ts
file packages/web-shell/client/utils/formatDateTime.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/utils/formatDateTime.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/serve/local-path-open.test.ts: PPPPP
  packages/cli/src/serve/process-env-guard.test.ts: PPPPP
  packages/cli/src/serve/routes/workspace-local-open.test.ts: PPPPP
  packages/cli/src/serve/run-qwen-serve.test.ts: PPPPP
  packages/cli/src/serve/server.test.ts: PPPPP
  packages/sdk-typescript/test/unit/DaemonClient.test.ts: PPPPP
  packages/web-shell/client/components/ChatEditor.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: PPPP
  packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx: PPPP
  packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: PPPP
  packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: PPPP
  packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: PPPP
  packages/web-shell/client/utils/formatDateTime.test.ts: PPPP

verdict: timeout
summary: only 4 of 5 rounds fit the 15-minute budget; the completed rounds agreed

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/serve/local-path-open.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/process-env-guard.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/routes/workspace-local-open.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 1 · packages/web-shell/client/components/ChatEditor.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 1 · packages/web-shell/client/utils/formatDateTime.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/local-path-open.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/process-env-guard.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/routes/workspace-local-open.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 2 · packages/web-shell/client/components/ChatEditor.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 2 · packages/web-shell/client/utils/formatDateTime.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/local-path-open.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/process-env-guard.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/routes/workspace-local-open.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 3 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 3 · packages/web-shell/client/components/ChatEditor.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 3 · packages/web-shell/client/utils/formatDateTime.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/local-path-open.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/process-env-guard.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/routes/workspace-local-open.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 4 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 4 · packages/web-shell/client/components/ChatEditor.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WorkspaceDetailsTooltip.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 4 · packages/web-shell/client/utils/formatDateTime.test.ts: P (exit 0)
round 5 · packages/cli/src/serve/local-path-open.test.ts: P (exit 0)
round 5 · packages/cli/src/serve/process-env-guard.test.ts: P (exit 0)
round 5 · packages/cli/src/serve/routes/workspace-local-open.test.ts: P (exit 0)
round 5 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 5 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 5 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 5 · packages/web-shell/client/components/ChatEditor.test.tsx: P (exit 0)

Evidence images

01-head-wire-cells

02-base-ab-cells

03-mutation-matrix

1 additional image(s) did not pass the hosting checks (PNG magic, unique sanitized name, ≤2 MB, max 8) and remain in the run artifacts.

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE — third pass at the new head e5398dce

Re-reviewed from scratch against e5398dcec84af3c243176fb0fecc0a0f113c3d28(上次评审 head 为 bea3818e;其间两次合入 main + 两个分支自有提交 b2fe0ab4/7e7e2508)。

历史阻塞项复核(在当前精确 head 逐锚读码,不采信线程状态)

  • 上轮两修复仍在场:SpawnHangError 挂起类区分与 instanceof SpawnHangError 重抛(wt.exe 挂起不再双开回退)、三处 assertPathExists、spawn 时 DISPLAY/WAYLAND_DISPLAY 门与共享 linuxTerminalCandidates、菜单焦点卡死修复(WebShellSidebar.tsx :6132 工作区菜单 onCloseAutoFocus preventDefault)及 formatDateTime 日历日判定——与 bea3818e 上逐行验证过的实现一致,两次 main 合并未扰动接线(有效 diff 仍是同一文件集)。
  • 更早的三个 Critical(Linux 删目录假成功、显示门、纯 Wayland xterm)与各行为修复锚点全部复验在场。

新面扫描(本 head 独有增量)

  • b2fe0ab4:bootstrap 包络补齐五个 runtime-only 标签(acpHttpEnabledresolveAcpHttpEnabled(env) 与运行时同源,其余四项与生产接线"始终注册"的事实对齐),并有集成断言(+5)。启动期多报的标签在运行时必然服务,消除的是 under-report 分歧;未发现可证明的阻塞缺陷。
  • 7e7e2508:仅测试文件内重复声明清理。

CI(一句话,不构成门禁):本 head 21 success / 8 path-skip / 1 in-progress(review-pr)/ 1 cancelled(web-shell E2E Smoke,无失败证据指向本 PR 引入的阻塞性缺陷)。

✅ APPROVE — 三轮评审至此:全部历史阻塞项已在当前 head 核实修复,当前扫描无新 Critical,批准不再新增门禁。

— 衍星 · read-only PR review (posted as qqqys)

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

@wenshao
wenshao added this pull request to the merge queue Sep 1, 2026
Merged via the queue into main with commit 431ff3a Sep 1, 2026
67 of 69 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.23.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants