Skip to content

fix(web-shell): route goal messages by session activity - #9667

Merged
ytahdn merged 8 commits into
mainfrom
codex/goal-message-routing
Aug 22, 2026
Merged

fix(web-shell): route goal messages by session activity#9667
ytahdn merged 8 commits into
mainfrom
codex/goal-message-routing

Conversation

@ytahdn

@ytahdn ytahdn commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Ordinary Web Shell messages now follow session activity instead of Goal hydration or Goal status: an idle session submits immediately, while a running session uses mid-turn insertion. Goal state remains a fail-closed guard for slash commands and scheduled/manual run controls, and failed-message retry is unavailable while another turn is running.

This does not change Goal ownership in the runtime. An ordinary submission made while an active Goal is between turns becomes a user-origin Goal turn; a submission made during a running Goal turn is drained into that turn when possible, and a late undrained insert is promoted to the next Goal turn. Supported images and attachments follow the same runtime paths.

Why it's needed

Opening an old idle session creates a window where the transcript is usable but the separate Goal read has not settled. The previous client-side Goal hold treated that unknown state as active ownership, so a normal message appeared queued even though no turn was running. Message admission should not wait for an auxiliary Goal read.

Reviewer Test Plan

How to verify

Open an idle session with Goal state still loading and send an ordinary message; it should submit immediately without a queued badge. Repeat with an active Goal between turns and confirm the message starts a Goal turn. While a turn is responding, send another ordinary message and confirm it is inserted into the running turn. Confirm forwarded slash commands remain blocked while Goal state is unknown or active. Create a retryable send failure, start another turn, and confirm retry is hidden and a stale retry callback cannot submit again.

Evidence (Before & After)

Before: an idle session could show a newly submitted ordinary message as queued solely because Goal state was unresolved or active. After: ordinary messages are direct when idle and inserted when running; Goal state no longer changes ordinary-message admission.

Tested on

OS Status
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

Environment (optional)

Web Shell and ACP bridge unit tests on Node.js 22 workspace dependencies.

Risk & Scope

  • Main risk or tradeoff: failed-message retry waits until the session is idle instead of attempting a direct submission during another turn.
  • Not validated / out of scope: the existing fallback that promotes attachments when mid-turn media insertion is unavailable is unchanged; no browser recording was captured.
  • Breaking changes / migration notes: none.

Linked Issues

Related PR: #9393

中文说明

此 PR 做了什么

Web Shell 的普通消息现在只根据会话活动状态路由,不再依赖 Goal 是否加载完成或 Goal 状态:会话空闲时立即提交,会话运行中时使用中途插入。Goal 状态仍然以 fail-closed 方式限制斜杠命令以及定时/手动运行控制;当另一个 turn 正在运行时,失败消息的重试入口不可用。

这不会改变运行时对 Goal 的归属处理。active Goal 处于两个 turn 之间时,普通提交会成为用户触发的 Goal turn;Goal turn 正在运行时,提交会在可行时被 drain 到当前 turn;太晚而未被当前 turn 消费的插入会提升为下一个 Goal turn。受支持的图片和附件遵循相同的运行时路径。

为什么需要

打开一个很久未使用的空闲会话时,会出现 transcript 已可用但独立 Goal 查询尚未结束的窗口。之前前端的 Goal hold 会把未知状态当作 Goal 正在占用,因此即使没有 turn 在运行,普通消息也会显示为排队中。消息准入不应该等待辅助的 Goal 查询。

Reviewer 测试计划

如何验证

打开一个 Goal 状态仍在加载的空闲会话并发送普通消息,消息应立即提交且不出现排队标识。对处于两个 turn 之间的 active Goal 重复操作,确认消息会启动 Goal turn。在 turn 正在响应时发送另一条普通消息,确认它被插入当前 turn。确认 Goal 状态未知或 active 时,转发的斜杠命令仍被阻止。制造可重试的发送失败,再启动另一个 turn,确认重试入口隐藏且旧重试回调不会重复提交。

证据(修改前后)

修改前:空闲会话可能仅因 Goal 状态未知或 active,就把新提交的普通消息显示为排队中。修改后:普通消息空闲时直接发送、运行中中途插入,Goal 状态不再改变普通消息准入。

测试环境

OS 状态
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

环境(可选)

使用 Node.js 22 工作区依赖运行 Web Shell 和 ACP bridge 单元测试。

风险与范围

  • 主要风险或权衡:当另一个 turn 正在运行时,失败消息重试会等待会话恢复空闲,而不是尝试直接提交。
  • 未验证或不在范围内:mid-turn 媒体插入不可用时,附件提升执行的既有 fallback 保持不变;未录制浏览器操作视频。
  • 破坏性变更或迁移说明:无。

关联 Issue

关联 PR:#9393

@ytahdn

ytahdn commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator Author

E2E / verification report

Independent pre-PR verification passed with no source changes and no blocking findings.

  • Active Goal + idle: text, image, and attachment submissions go through the normal direct-send path and are claimed by the runtime as a user-origin Goal turn.
  • Running Goal turn: text uses mid-turn insertion; supported images and attachments are uploaded and inserted as content blocks into the current turn.
  • Goal hydration: ordinary input is not blocked; idle sessions send directly and responding sessions insert mid-turn.
  • Slash commands and manual/bound run controls remain fail-closed while Goal state is unknown or active.
  • Failed-message retry is hidden while a turn is running, stale callbacks cannot submit, and retry works again when idle.

Automated evidence: Web Shell focused tests 17 passed; image direct-send and attachment retry tests 2 passed; Goal gate suite 10 passed; ACP active-Goal admission test 1 passed; git diff --check passed. Browser recording was not captured.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Re-run (@qwen-code /triage) — this pass reviews the current head, which adds five commits since the first pass: the E2E spec alignment, two rounds of review responses, and the two fixes that followed the maintainer's local A/B report.

Template: complete ✓ — all required sections present, bilingual body included.

Problem: observed and measured, not theoretical. The session load clears loadingTranscript before the separate Goal read settles, and the old fail-closed hold treated that unknown window as active Goal ownership — an ordinary message in a genuinely idle session showed as queued with nothing running. The maintainer's local A/B run measured it: on main the submission waited out the whole 12 s Goal read; with this PR it went out in ~336 ms. The follow-up zero-token window (an ordinary submit between turn-start and the first streamed token preempting the in-flight Goal turn) was surfaced by that same A/B run and is addressed by the daemon active-prompt routing added in 54a075faf8.

Direction: aligned. Routing ordinary-message admission by session activity instead of an auxiliary Goal read is the right instinct; slash commands and run controls keep the fail-closed Goal gate. The load-bearing premise was checked in the first pass and re-confirmed since: the runtime's permit machinery (permitForTurn/beginTurn in the goal runtime, admission in client.ts) means a submission against an active Goal is admitted as a user-origin turn, queued behind an in-flight turn, or rejected visibly — never silently bypassed.

Size: not applicable — no core paths touched (all seven files under packages/web-shell/client/). ~209 production lines + ~510 test lines.

Approach: focused, and it actively removes special-casing. Every edit serves the stated goal; the post-first-review commits respond point-for-point to review feedback (E2E spec rewritten to the new contract, Goal-specific rejection toasts) and to the A/B report's §5 (daemon hasActivePrompt signal folded into the routing composite, then extended to the language and fast-model guards).

Risk: no high-risk-path matches; no elevated risk signals.

Moving on to code review. 🔍

中文说明

感谢贡献!

Re-run(@qwen-code /triage)——本轮审查当前 head;相比首轮新增了五个提交:E2E spec 对齐、两轮 review 响应,以及 maintainer 本地 A/B 报告之后的两处修复。

模板:完整 ✓,包含双语正文。

问题:已观测且有测量数据,不是理论问题。会话加载会先清掉 loadingTranscript,随后独立的 Goal 查询才结束;旧的 fail-closed hold 把这个未知窗口当作 Goal 正在占用,导致真正空闲的会话里普通消息显示为排队。maintainer 的本地 A/B 实测:main 上提交要等完整个 12 秒 Goal 查询,本 PR 约 336 ms 即发出。同一 A/B 还暴露了零 token 窗口(turn 开始到首个流式 token 之间的普通提交会抢占在途 Goal turn),54a075faf8 引入 daemon active-prompt 路由修复了它。

方向:对齐。普通消息准入按会话活动状态路由、而不是等辅助的 Goal 查询,方向正确;斜杠命令和运行控制保留 fail-closed Goal 门。关键前提在首轮已核实、本轮再次确认:goal runtime 的 permit 机制(permitForTurn/beginTurnclient.ts 准入)保证 active Goal 下的提交要么作为用户触发的 turn 被接受,要么排在在途 turn 之后,要么被可见拒绝——不会被静默绕过。

规模:不适用——未触及核心路径(七个文件全部在 packages/web-shell/client/ 下)。约 209 行生产代码 + 510 行测试。

方案:聚焦,且在主动移除特判。每处改动都服务于目标;首轮之后的提交逐条响应了 review 反馈(E2E spec 按新契约重写、Goal 专属拒绝提示)和 A/B 报告 §5(把 daemon hasActivePrompt 信号并入路由组合判定,随后扩展到语言与快模型守卫)。

风险:未命中高风险路径,无升级风险信号。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@ytahdn
ytahdn requested a review from wenshao August 21, 2026 12:56
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-run — this pass covers the full diff at the current head, with focus on the five commits since the first pass. The load-bearing premise still holds (verified in the first pass, and independently re-verified by two reviewers with file:line citations since): the goal runtime's permit machinery gates ordinary submissions server-side, so routing ordinary messages purely by session activity is safe, and the Goal gate correctly stays in place for slash commands and the run controls.

The routing contract at this head:

Submission idle turn streaming pre-first-token window Goal gate
Ordinary message direct send mid-turn insertion mid-turn insertion (new: daemon hasActivePrompt) not consulted
Slash command direct queued queued fail-closed → queue.commandGoalBlocked toast
Failed-prompt retry available hidden, stale callback inert hidden, stale callback inert not consulted
! shell immediate queued immediate (raw streaming state only) not consulted

What I checked in the new commits:

  • 54a075faf8 (zero-token window): reuses the existing daemon-authoritative useSessionHasActivePrompt hook (Web shell: conversation and session loading indicators drop mid-turn on long tasks while the To Do spinner keeps spinning #9487 — live-state subscription with a catalog fallback; no new plumbing). The composite is applied consistently to the ordinary path, the command gate, both retry gates, the retry affordance, and canInsertMidTurn in both App and ChatPane, with render-time ref mirrors matching the codebase's existing pattern. The fix is exactly the option the A/B report recommended (route on the daemon's turn status), and the new tests pin send-vs-insert across the window in both surfaces. When the signal is absent (daemon without live-state), routing falls back to streaming state and server-side admission remains the backstop.
  • c5573a97f7: the language-change sync and fast-model picker get the same composite, with a test each. One asymmetry is deliberate and harmless: handleFastModelSelect reads the render-time streamingState value while the language path reads the ref — the ref half is always at least as fresh, and the direction is fail-closed.
  • The round-1 blocker (E2E smoke asserting the removed hold UX) is resolved: the spec now exercises the new contract (submit during an active turn → auto mid-turn insertion; submit after the turn → direct prompt request), and it is green at this head.

No correctness blockers found. Four suggestions from the fourth /review round remain open and are recorded inline in this thread — nothing dropped silently: the ChatPane command gate rejects a Goal-blocked slash command silently where the main composer toasts (a three-line reportError fix is proposed inline); the ! shell path is the one submission path not moved onto the composite (its gate and drain read raw streaming state — behavior identical to the merge base, so a pre-existing gap rather than a regression, and the author states shell behavior is intentionally unchanged); the streaming-state half of the new retry gate has no dedicated test; and the enqueue branch of enqueueBlockedCommand is pinned only at the generic forwarded-command site. Plus the standing cleanup: holdQueuedPromptsLocally has no production caller left but the hook still carries it and its reconcile tests.

Test evidence (this PR's own CI)

Unattended run — I do not execute PR code; this quotes the PR's CI via the API at the reviewed commit.

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (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
Dependency CVE audit ✅ success
Secret scan (TruffleHog) ✅ success
Classify PR ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success

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

Everything green on the reviewed commit — notably the web-shell E2E smoke, which was the round-1 blocker. Test (macos-latest / windows-latest, Node 22.x) and Integration Tests (CLI, No Sandbox) are conditional skips on this event, not failures. The Dependency CVE audit the author flagged as pre-existing on main is green here too.

Beyond CI: a maintainer ran a real-daemon + real-browser A/B (PR arm vs merge base against one daemon, request-by-request ledger) at the earlier head d72a093 — the hydration-window fix, the stricter slash-command refusal with composer text preserved, mid-turn insertion during streaming, and the withdrawn retry affordance all verified with measurements, and the new tests were shown non-vacuous (19 failures when run against main source). That report's one open behavior question (§5, the pre-first-token window) is what 54a075faf8 addresses; the two commits after the A/B head are pinned by the new unit tests and the green smoke, but were not themselves A/B'd live. Sandboxed verification would settle the remaining end-to-end gap: @qwen-code /verify — that at the current head a prompt submitted in the pre-first-token window reaches the daemon as a mid-turn insertion instead of preempting the in-flight Goal turn, and that the hasActivePrompt routing survives a daemon without live-state support. (Author has write access, so a sponsored run isn't needed.)

Not verified: real browser behavior on Windows/Linux (author marked N/A); images/attachments through the new routing (parity claimed in the description, not exercised by the A/B); live behavior at the exact reviewed head (A/B was at d72a093, two functional commits earlier).

中文说明

代码审查

Re-run——本轮覆盖当前 head 的完整 diff,重点是首轮之后的五个提交。关键前提依然成立(首轮已核实,此后两位审查者又独立复核并给出文件:行号引用):goal runtime 的 permit 机制在服务端拦截普通提交,因此普通消息完全可以只按会话活动状态路由,Goal 门也正确地保留给了斜杠命令和运行控制。

当前 head 的路由契约:普通消息——空闲直发、流式中中途插入、首 token 前窗口也中途插入(新:daemon hasActivePrompt),不查 Goal 门;斜杠命令——空闲直发、运行中入队、首 token 前入队,Goal 门 fail-closed 并弹 queue.commandGoalBlocked;失败重试——运行中(含首 token 前)隐藏且过期回调失效;! shell——只读原始 streaming state(首 token 前窗口仍立即执行,与 merge base 完全一致,作者明确 shell 行为不在本次范围内)。

新提交核实情况:54a075faf8(零 token 窗口)复用既有的 daemon 权威 useSessionHasActivePrompt hook(#9487,live-state 订阅 + catalog fallback,无新管道),组合判定一致地应用到普通路径、命令门、两处重试门、重试入口与 canInsertMidTurn(App 和 ChatPane 皆是),渲染期 ref 镜像沿用既有模式;修复方向正是 A/B 报告建议的方案,新测试在两个界面钉住了窗口内 send/insert 翻转;信号缺失时(daemon 不支持 live-state)回退到 streaming state,服务端准入兜底。c5573a97f7 给语言切换和快模型选择器加了同一组合判定并各配测试;handleFastModelSelect 读渲染期值而语言路径读 ref 的不对称是有意的、无害的。首轮阻塞项(E2E smoke 断言已移除的 hold 行为)已解决:spec 重写为新契约且在本 head 上通过。

未发现正确性阻塞问题。第四轮 /review 的四条建议仍开放且已记录在行内(不会静默丢失):ChatPane 命令门对 Goal 拦截静默而主输入框有 toast(行内已给出三行 reportError 修复);! shell 是唯一未迁移到组合判定的提交路径(其行为与 merge base 一致,属既有缺口而非回归);新重试门的 streaming-state 一半缺专项测试;enqueueBlockedCommand 的入队分支只在通用转发命令点被钉住。另有常设清理项:holdQueuedPromptsLocally 已无生产调用方,但 hook 仍保留该参数及其 reconcile 测试。

测试证据(本 PR 自己的 CI)

无人值守运行——不执行 PR 代码;以上为 API 读取的该 commit 的 CI 结果。本 commit 全绿——尤其是 round-1 的阻塞项 web-shell E2E smoke。macOS/Windows 测试矩阵与 CLI 集成测试在该事件下为条件性跳过。作者此前提到的 main 上失败的 Dependency CVE audit 在此也是绿的。

此外:一位 maintainer 在较早的 head d72a093 上做了真实 daemon + 真实浏览器的 A/B(两条腿共用一个 daemon、逐请求台账)——hydration 窗口修复、更严格的斜杠命令拒绝(输入框文本保留)、流式中中途插入、重试入口收回均实测通过,且新测试被证明非空洞(对 main 源码跑有 19 处失败)。该报告唯一开放的行为问题(§5 首 token 前窗口)正是 54a075faf8 修复的内容;A/B 之后的两个提交由新单测和绿色 smoke 钉住,但未再做实测 A/B。沙盒验证可以补上剩余的端到端缺口:@qwen-code /verify——验证当前 head 上首 token 前窗口提交的普通消息以中途插入到达 daemon、而不是抢占在途 Goal turn,以及 hasActivePrompt 路由在不支持 live-state 的 daemon 上的表现。(作者有写权限,无需 sponsored run。)

未验证:Windows/Linux 真实浏览器行为(作者标记 N/A);图片/附件走新路由(描述声称一致,A/B 未实测);精确审查 head 上的实运行(A/B 在 d72a093,早于其后两个功能提交)。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 21, 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 2bf1f50. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

⚠️ No preview: one or more scenarios failed to render on this head — see the workflow run. This is not "no visual change" — a scenario that times out or throws produces no image. Fix the failing scenario (or a genuine regression it caught) and the preview returns on the next push.

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

Qwen Code · web-shell visuals

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean re-review at the new head: the risky premise verified, CI fully green, the maintainer's A/B concern addressed by design; four recorded non-blocking follow-ups named below.

Stepping back: this PR still matches what I would have proposed — route ordinary messages by session activity alone, keep the Goal gate only where ownership genuinely matters, and let retry wait for idle. What changed since the first pass is that the one real behavioral gap found along the way (the A/B report's §5: an ordinary submit in the pre-first-token window preempting the in-flight Goal turn at zero tokens) was answered the right way — not with documentation, but by folding the daemon-authoritative hasActivePrompt signal into the routing composite, reusing the existing #9487 hook rather than adding new machinery. The follow-up commits respond point-for-point to review feedback without scope creep, and the diff still removes more special-casing than it adds.

Reservations, all non-blocking and all already recorded inline by the fourth review round: ChatPane rejects a Goal-blocked slash command silently where the main composer toasts (three-line fix proposed inline — cheapest of the four if the author wants it in before merge); the ! shell path stays on raw streaming state — identical to the merge base, so a pre-existing gap now standing alone rather than a regression; the streaming-state half of the new retry gate and the per-site enqueue branches would benefit from dedicated tests; and the dead holdQueuedPromptsLocally flag is still waiting for its cleanup. None of these block merge; they are recorded in the thread so nothing is dropped.

Verdict: approve. All checks are green on the reviewed commit, so the approval is posted immediately, pinned to it.

中文说明

置信度:4/5 —— 新 head 上的复审干净:关键前提已核实、CI 全绿、maintainer A/B 的疑虑已从设计上解决;四个不阻塞的后续项见下。

退一步看:这个 PR 仍然与我的独立方案一致——普通消息只按会话活动状态路由,Goal 门只保留在归属真正重要的地方,重试等待空闲。首轮之后真正的变化是:过程中发现的唯一真实行为缺口(A/B 报告 §5:首 token 前窗口的普通提交在零 token 处抢占在途 Goal turn)得到了正确方式的回应——不是改文档,而是把 daemon 权威的 hasActivePrompt 信号并入路由组合判定,复用既有的 #9487 hook 而不是新增机制。后续提交逐条响应 review 反馈且无范围蔓延,diff 整体上移除的特判仍多于新增。

保留意见,均不阻塞且均已由第四轮 review 记录在行内:ChatPane 对 Goal 拦截的斜杠命令静默而主输入框有 toast(行内已给出三行修复,若想合并前带上它,这是四条中成本最低的);! shell 路径仍按原始 streaming state——与 merge base 一致,是既有缺口如今单独凸显,而非回归;新重试门的 streaming-state 一半与各调用点的入队分支值得补专项测试;已死的 holdQueuedPromptsLocally 标志仍待清理。这些都不阻塞合并;均已记录在帖子中,不会被静默丢弃。

结论:批准。该 commit 的所有检查均为绿色,批准立即发出并固定于该 commit。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.12% 85.12% 90.52% 84.15%
Core 88.18% 88.18% 89.8% 86.76%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.12 |    84.15 |   90.52 |   85.12 |                   
 src               |   85.83 |    81.72 |   88.13 |   85.83 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    73.4 |    78.04 |   80.76 |    73.4 | ...1338-1342,1469 
  ...ractiveCli.ts |   88.25 |    82.33 |   89.06 |   88.25 | ...3147,3153,3219 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   72.61 |    75.19 |    91.9 |   72.61 |                   
  acpAgent.ts      |   71.75 |     74.8 |   91.25 |   71.75 | ...76,13181-13183 
  ...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 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...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.2 |     86.5 |   95.96 |    91.2 |                   
  Session.ts       |   90.56 |    85.19 |   95.41 |   90.56 | ...69,12296-12300 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...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.18 |     86.3 |     100 |   94.18 | ...15,319,399,403 
  ...y-replayer.ts |   83.17 |    92.98 |   94.11 |   83.17 | ...24-142,260-262 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...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 |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  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 |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  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    |      89 |    81.59 |   91.53 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |     77.6 |   94.28 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |    85.04 |   90.69 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   95.37 |    86.44 |     100 |   95.37 | 203-204,228-233   
 src/commands      |   90.38 |    77.48 |   65.62 |   90.38 |                   
  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.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   88.95 |    74.52 |     100 |   88.95 | ...74,877-880,892 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.08 |    88.57 |   90.64 |   89.08 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.88 |    96.35 |     100 |   95.88 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  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         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...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.73 |   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 |     87.5 |     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 |    55.55 |     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  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  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          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   90.41 |    89.47 |   91.37 |   90.41 |                   
  agent-prompt.ts  |   94.83 |    92.85 |   97.91 |   94.83 | ...3192,3512-3592 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.18 |    89.69 |    90.9 |   92.18 | ...1061,1063-1064 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   93.19 |    84.61 |   83.33 |   93.19 | 302,442,573-593   
  ...ose-review.ts |   96.89 |    93.17 |    98.3 |   96.89 | ...4723-4767,4982 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  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.25 |    92.05 |     100 |   97.25 | ...1548,1705-1710 
  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.63 |     100 |   99.48 | 553,824,880       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  pr-context.ts    |   95.67 |    87.25 |     100 |   95.67 | ...1926,2015-2031 
  presubmit.ts     |   91.94 |    90.05 |   91.66 |   91.94 | ...-842,1057-1088 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...79-483,510-556 
  ...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 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...19,635-689,703 
  save-artifact.ts |   93.09 |    90.75 |   94.11 |   93.09 | ...98-501,594-597 
  scratch-tree.ts  |   90.06 |     85.1 |    90.9 |   90.06 | ...51-454,656-674 
  script-lint.ts   |   81.27 |    79.38 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   92.25 |    88.17 |   91.66 |   92.25 | ...1210,1238-1275 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   85.62 |    81.26 |      96 |   85.62 | ...3120,3128-3148 
  test-plan.ts     |   91.36 |    91.35 |   89.47 |   91.36 | ...35-836,900-917 
 ...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.28 |     94.6 |   98.73 |   97.28 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 757-758           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    96.42 |     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 |   93.42 |    93.33 |     100 |   93.42 | ...61-367,558-559 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.37 |    96.52 |   88.88 |   99.37 | 559,777           
  coverage.ts      |   98.71 |    94.77 |     100 |   98.71 | ...1097,1642-1643 
  deadline.ts      |   98.03 |    91.73 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.74 |    93.12 |     100 |   98.74 | ...48,271,297-298 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.09 |    95.38 |   77.77 |   89.09 | ...29,366-367,394 
  git.ts           |   96.77 |    93.93 |     100 |   96.77 | 234-235,272-273   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.4 |     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 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...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 | ...,819,1200,1217 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  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.85 |    86.66 |     100 |   92.85 | 204-205,207-211   
  ...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.12 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    95.52 |     100 |     100 | 136,154,199       
  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 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.21 |    94.11 |     100 |   98.21 | 433,474,514-515   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  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      |   87.96 |    79.92 |     100 |   87.96 | ...1552-1553,1566 
 ...w/lib/platform |   90.17 |    84.71 |   95.91 |   90.17 |                   
  aone-client.ts   |   79.66 |       80 |     100 |   79.66 | ...31-132,165-197 
  aone.ts          |    90.3 |     85.5 |      92 |    90.3 | ...60,524-529,581 
  github.ts        |   96.05 |    75.67 |     100 |   96.05 | 26-29,213-214     
  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.97 |    89.91 |   96.31 |   94.97 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.17 |    88.78 |   83.78 |   89.17 | ...2512,2514-2522 
  ...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 |                   
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  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.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.65 |     100 |   96.55 | 223-224,229-231   
  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.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...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 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     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          |   86.22 |    81.92 |   89.65 |   86.22 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  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 |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...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 |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.16 |    94.22 |   95.29 |   98.16 |                   
  ...putAdapter.ts |   98.02 |     93.3 |   98.07 |   98.02 | ...1433,1449-1450 
  ...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/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.61 |    95.07 |     100 |   99.61 |                   
  ...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 |                   
  ...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.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   88.25 |    84.77 |   90.91 |   88.25 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |    91.58 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 702               
  ...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.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...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.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...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 |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  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.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  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.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...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 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |     85.1 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.08 |    80.94 |   75.98 |   84.08 | ...7966,7984-7988 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.27 |    88.18 |     100 |   94.27 | ...34,538-539,578 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  server.ts        |   91.16 |     90.6 |   72.03 |   91.16 | ...2973,3003-3004 
  ...-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 |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...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.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.47 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...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.38 |    80.23 |    94.5 |   80.38 |                   
  ...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.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.61 |    77.24 |   93.33 |   75.61 | ...5538,5595-5601 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  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 |   91.33 |    87.66 |   95.58 |   91.33 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.33 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |    88.8 |    77.77 |     100 |    88.8 | ...81-282,329-330 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
 src/serve/fs      |   87.77 |    82.34 |     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.01 |     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.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   78.18 |    70.42 |   90.61 |   78.18 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  discovery.ts     |   85.89 |    82.01 |    91.3 |   85.89 | ...73-579,592-593 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   76.69 |    67.47 |   85.71 |   76.69 | ...1884,1975-1976 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...sk-service.ts |   87.29 |    62.24 |   95.55 |   87.29 | ...1174,1176-1177 
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
  ...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 |    86.13 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |       75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.88 |    80.82 |   95.06 |   85.88 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...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.17 |     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    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.53 |    84.26 |   93.33 |   87.53 | ...1389,1432-1433 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.46 |     82.1 |   92.52 |   86.46 | ...6719,6721-6722 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...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.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-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 |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...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 |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...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  |   92.57 |    89.93 |   97.19 |   92.57 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...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 |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  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   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   90.22 |    86.52 |   97.43 |   90.22 | ...05,932,960-961 
  ...ion-export.ts |     100 |    94.73 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 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.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.57 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |    89.47 |     100 |     100 | 106-120           
  ...killLoader.ts |   97.19 |    85.71 |     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.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...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.72 |     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 | ...99-901,904-906 
 ...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.09 |    79.16 |   77.77 |   94.09 |                   
  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 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   74.57 |    75.47 |   68.47 |   74.57 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.06 |       72 |   69.44 |   76.06 | ...4292,4408-4414 
  ...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 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   71.42 |     74.5 |    62.5 |   71.42 | ...10,337,404-409 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |    84.2 |    83.81 |   90.25 |    84.2 |                   
  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 
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   75.05 |    74.39 |   84.61 |   75.05 | ...95-628,639-640 
  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                
  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.48 |       75 |     100 |   80.48 | 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 | 96,147            
  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 |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  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.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  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  |   85.02 |    82.53 |     100 |   85.02 | ...1089,1123-1128 
  ...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.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  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 |   93.06 |       85 |   66.66 |   93.06 | ...78-183,282-287 
 src/ui/components |   72.84 |    79.91 |   77.58 |   72.84 |                   
  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 |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...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          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  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  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...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 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...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 |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...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           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...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.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...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-172             
  ...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 |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...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 |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  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.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...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.35 |    86.92 |   85.71 |   90.35 |                   
  ...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 |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  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.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.41 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    87.05 |      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 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      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.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...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 |    70.1 |    72.89 |   61.11 |    70.1 |                   
  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    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.62 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  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 |       80 |    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 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 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      |   85.97 |    83.91 |   87.81 |   85.97 |                   
  ...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.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...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 |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...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.67 |     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       
  ...miniStream.ts |   87.41 |    84.11 |   78.26 |   87.41 | ...5812-5814,5816 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...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    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  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 |     97.4 |     100 |     100 | 175,262           
  ...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 |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  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 |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...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.35 |     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/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/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.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     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.52 |     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      |   87.72 |    85.81 |   96.06 |   87.72 |                   
  ...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   
  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 
  formatters.ts    |   94.87 |    98.21 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 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.59 |     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.23 |     100 |     100 | 84                
  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 |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 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.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...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.27 |    79.64 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |        0 |       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         |   83.09 |     87.8 |   93.19 |   83.09 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     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       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  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        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...y-identity.ts |   86.11 |    81.72 |     100 |   86.11 | ...70-371,378-379 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  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 
  findings.ts      |   96.01 |    92.08 |     100 |   96.01 | ...1227,1236-1237 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  ...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 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  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 |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.14 |    91.79 |     100 |   95.14 | ...54-455,553,566 
  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 |                   
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  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.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1045,1057-1080 
  ...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 
  settingsUtils.ts |   79.62 |     88.8 |   85.18 |   79.62 | ...47-565,572-580 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  ...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 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...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 |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  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          |   88.18 |    86.76 |    89.8 |   88.18 |                   
 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        |   89.63 |    83.96 |   94.11 |   89.63 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.59 |    77.75 |   83.33 |   85.59 | ...1794-1798,1801 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.86 |    87.26 |    98.3 |   94.86 | ...1463,1477-1479 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.94 |    68.22 |   78.94 |   76.94 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.89 |     65.2 |   78.57 |   75.89 | ...1887,1893-1894 
  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 |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  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 |   91.36 |    86.55 |   90.29 |   91.36 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.54 |    76.42 |   77.58 |   84.54 | ...2365,2411-2413 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...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 
  ...chestrator.ts |   93.87 |    90.47 |   91.48 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.47 |    83.47 |   94.44 |   95.47 | ...44,312,332-335 
  ...ow-sandbox.ts |   96.88 |    91.16 |     100 |   96.88 | ...1768,1774-1775 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.97 |    84.58 |   89.28 |   82.97 |                   
  TeamManager.ts   |   74.33 |    81.09 |    80.7 |   74.33 | ...1707,1730-1731 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |    83.08 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   91.71 |    94.54 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.33 |    86.96 |   75.77 |   84.33 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.65 |    86.69 |   74.31 |   83.65 | ...8942,8946-8947 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...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.46 |    88.25 |   93.05 |   92.46 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.58 |    88.04 |   91.01 |   92.58 | ...4310,4408-4409 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |    89.8 |    84.77 |   94.73 |    89.8 | ...6449,6477-6493 
  geminiChat.ts    |   94.91 |     90.1 |   95.72 |   94.91 | ...5208,5256-5257 
  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 |                   
  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 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...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   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...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.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 698-699,768       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   96.12 |     91.3 |    90.9 |   96.12 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.06 |    90.75 |   90.47 |   96.06 | ...1309-1310,1338 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |    91.9 |    90.55 |   95.79 |    91.9 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.27 |     90.9 |     100 |   95.27 | ...1434,1442,1541 
  ...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.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.39 |    92.28 |    98.5 |   97.39 |                   
  dashscope.ts     |   98.36 |    95.08 |   96.42 |   98.36 | ...08-709,851-852 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  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 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   88.48 |    85.65 |   93.22 |   88.48 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-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 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.08 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.45 |    83.47 |      83 |   84.45 | ...3126,3164-3165 
  ...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 |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   91.85 |    84.88 |     100 |   91.85 | ...1032-1033,1043 
  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 |     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.58 |    81.04 |   86.84 |   84.58 |                   
  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   |   75.98 |    67.22 |   58.33 |   75.98 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.27 |    87.65 |     100 |   86.27 | ...42-247,359-361 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.01 |    89.19 |   94.56 |   93.01 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |    91.17 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.34 |    87.13 |   97.61 |   88.34 | ...1162,1185-1188 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.29 |    85.71 |    87.5 |   87.29 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 207-208           
  goal-reducer.ts  |    95.2 |    92.59 |   97.29 |    95.2 | ...66,543,561-562 
  goal-runtime.ts  |   96.91 |       90 |   95.74 |   96.91 | ...1315-1316,1446 
  goal-tools.ts    |   98.38 |    94.17 |   95.83 |   98.38 | ...98-199,300-301 
  ...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.42 |     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         |   88.07 |    86.35 |   88.54 |   88.07 |                   
  ...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.66 |    93.33 |     100 |   96.66 | 66-67             
  ...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.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  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    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  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 |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  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/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        |   88.07 |     84.5 |   90.62 |   88.07 |                   
  ...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 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  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       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,114-117,292 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  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.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  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.36 |   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      |   98.88 |    90.19 |     100 |   98.88 | 50,70             
  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 |   76.89 |    74.07 |   72.22 |   76.89 | ...47-451,454,460 
  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 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.62 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  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   |   83.79 |    91.16 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     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 |   86.63 |    88.88 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |    92.72 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 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     |   83.71 |     78.6 |   81.25 |   83.71 |                   
  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 
  ...der-config.ts |   75.85 |    74.04 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.85 |    91.66 |   63.63 |   97.85 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...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 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.88 |      96 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.91 |    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.47 |    86.18 |   96.61 |   90.47 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |    97.7 |    96.44 |     100 |    97.7 | ...1069,1212-1220 
  ...ingService.ts |   91.36 |    86.98 |   93.25 |   91.36 | ...2685,2700-2701 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  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 |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.21 |    97.25 |     100 |   98.21 | ...81-682,729-730 
  ...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 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.67 |    80.58 |     100 |   91.67 | ...1062-1063,1091 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |     92.3 |   97.22 |   94.49 | ...98-600,656-664 
  ...pr-service.ts |   96.22 |    89.13 |     100 |   96.22 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |   93.63 |    90.93 |    97.8 |   93.63 | ...2755-2756,2833 
  ...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 |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.61 |    86.97 |    93.4 |   89.61 | ...3013,3027-3047 
  sessionTitle.ts  |   95.75 |    77.41 |     100 |   95.75 | ...53-256,287-288 
  ...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 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...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.76 |    84.07 |     100 |   90.76 | ...10-513,565-566 
  ...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.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...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             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.94 |   93.68 |   89.29 |                   
  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    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  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 | 277-278           
 ...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     |   87.71 |    89.04 |   96.61 |   87.71 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.52 |     84.8 |   85.71 |   82.52 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...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 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  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.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  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      |   93.95 |    86.44 |      75 |   93.95 | ...41,483-484,500 
  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.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...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.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  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     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.19 |    85.08 |   89.45 |   86.19 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-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 | ...00-301,312-319 
  cron-create.ts   |   90.64 |     93.1 |      75 |   90.64 | ...,73-74,223-231 
  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   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  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 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...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 | ...1341,1349-1350 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...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.35 |    93.75 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...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             
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  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  |   81.13 |       90 |   66.66 |   81.13 | ...80-286,363-371 
  ...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         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-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     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  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.22 |    86.36 |   85.71 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.86 |   83.33 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.75 |    92.3 |   93.11 | ...77-578,594-600 
  ...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.06 |    85.71 |   89.47 |   87.06 | ...29-832,869-904 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   86.97 |    87.71 |   88.49 |   86.97 |                   
  agent.ts         |   85.56 |    86.65 |   86.02 |   85.56 | ...4274,4308-4318 
  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.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-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 |                   
 ...s/computer-use |   90.21 |     82.3 |   78.66 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    86.11 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |    86.9 |    85.36 |   78.94 |    86.9 |                   
  workflow.ts      |    86.9 |    85.36 |   78.94 |    86.9 | ...08,553,555-556 
 src/utils         |   93.07 |     89.8 |    96.8 |   93.07 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     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 |    89.47 |     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   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  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.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.03 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   95.05 |    92.71 |   96.15 |   95.05 | ...1988,1996-1997 
  forkedAgent.ts   |   92.98 |    83.78 |   94.44 |   92.98 | ...77,685,690-697 
  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  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  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 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     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                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  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.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     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 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...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.03 |    97.75 |     100 |   98.03 | 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.21 |    85.21 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.26 |    88.58 |     100 |   86.26 | ...2295,2302-2306 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     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 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  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             
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |     97.7 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    59.09 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.39 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   87.58 |    86.23 |     100 |   87.58 | ...79-483,513-528 
  truncation.ts    |   90.61 |    90.51 |     100 |   90.61 | ...53-461,498-504 
  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.47 |     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 |   71.04 |    75.92 |   91.17 |   71.04 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |     100 |      100 |     100 |     100 |                   
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

Comment thread packages/web-shell/client/components/ChatPane.tsx

@chiga0 chiga0 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.

E2E Smoke CI: ❌ FAIL — blocker present.

Scope

Reviewed: App.tsx (ordinary-message routing, slash-command enqueueBlockedCommand, handleRetry guard, streamingStateRef synchronization), ChatPane.tsx (submission gate refactor), goalGate.ts (docblock), App.test.tsx + ChatPane.test.tsx (updated unit tests).

Checked: blockLocalCommandDuringTurn definition (toast + return false — correct for fail-closed Goal block); holdQueuedPromptsLocally fully removed from both App.tsx and ChatPane.tsx at head; streamingStateRef.current = streamingState during render is the standard latest-ref pattern in React (correct); enqueueBlockedCommand branching logic (goal-blocked → toast; streaming-blocked, no goal → enqueue); retry guard drop (button hidden via streamingState !== 'idle' when session is active — stale-callback test confirms no double-send).

Not reviewed: macOS/Windows CI (SKIPPED); integration tests (SKIPPED).


F1 — Blocker: E2E smoke fails because holdQueuedPromptsLocally removal drops the explicit local-queue UX path

CI witness (3/3 retries, all identical):

web-shell.goal.spec.ts:48  runs the canonical Goal and explicit queue interaction chain @smoke

Error: expect(locator).toContainText(expected) failed
Locator: locator('[data-web-shell-queued-prompts]')
Expected substring: "stay queued until I choose"
Timeout: 10000ms — element(s) not found
     93 |   await submitComposer(page, 'stay queued until I choose');
     94 |   const queue = page.locator('[data-web-shell-queued-prompts]');
  >  95 |   await expect(queue).toContainText('stay queued until I choose');

Mechanism: The test submits a message while a Goal is active (session is idle, between turns). Under the old code, holdQueuedPromptsLocally was true (Goal state active → hold), so the message went into the local queue and appeared in [data-web-shell-queued-prompts]. Under the new code the hold is removed: for non-command text at streamingStateRef.current === 'idle', the submission goes directly to sendPrompt, the queue element never renders, and daemon.promptRequests() would show 1 request rather than 0.

The test then uses the queued message to exercise the explicit "Insert" button (mid-turn insertion with user choice). That full E2E flow — submit while Goal-idle → see in queue → click Insert during turn → verify mid-turn request — is the explicit local-queue UX path. The Reviewer Test Plan covers "send while a turn is responding → inserted automatically" but does not cover the "queue for manual insertion" path this smoke test exercises.

What to check: Was the explicit local-queue affordance (queue while idle, Insert during turn) intentionally removed by this PR? If yes, the E2E spec needs to be updated or replaced with a test that validates the new direct-send path. If not, the holdQueuedPromptsLocally removal needs to be scoped so Goal-active-between-turns still populates the queue.

Reviewed with AI assistance.

Comment thread packages/web-shell/client/components/ChatPane.tsx

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Review of PR 9667 — fix(web-shell): route goal messages by session activity

Verdict: 💬 COMMENT — one blocking item: the canonical Goal E2E smoke spec still encodes the removed local-hold UX, and CI is red on exactly that assertion.

Head reviewed: 66aadc4e. Scope: 5 files, +208/−125. Unit suite green on CI; web-shell E2E Smoke failed (details in F1).

Load-bearing premise — verified ✅

This PR deliberately reverses the earlier fail-closed client-side Goal hold, so I verified the server-side admission machinery first, at source level:

  • goalRequiresExactPermit (packages/core/src/goals/goal-protocol.ts:146-151): an active Goal (or running activity) requires an exact turn permit.
  • UserQuery admission (packages/core/src/core/client.ts:2749-2775): an ordinary submission under an active Goal takes goalOrigin = 'user' and obtains permitForTurn(goalTurnKey) ?? beginTurn(goalTurnKey); if neither is available it throws, surfacing "Goal turn admission failed" — a visible error, not a silent drop.
  • beginTurn (packages/core/src/goals/goal-runtime.ts:1101-1133): between turns it grants the permit immediately; while another turn runs (or verifying/proposal/checkpoint is pending) it queues the turn key and returns undefined.
  • releaseTurn (goal-runtime.ts:1134-1180) promotes the queued turn key on release, and claimGoalTurn (packages/cli/src/acp-integration/session/Session.ts:570-614) waits on the runtime subscription until promotion or abort.

So a direct send from an idle session is admitted as a user-origin Goal turn, a send during a running turn is enqueued/promoted by the runtime, and neither path can silently bypass the Goal. The premise holds; the client no longer needs to fail closed for ordinary messages.

Client-side changes — verified ✅

  • streamingStateRef is now assigned during render (App.tsx:4244-4245) instead of in a passive effect. This closes the real race where a child layout-effect submit during the transition render read the stale 'idle' value; the new test harness (onChatEditorLayout in the ChatEditor mock) pins exactly that window. The pattern matches existing code (e.g. writeBlockedRef in useQueuedPrompts.ts:413-414).
  • Ordinary path routes by streaming state only (App.tsx:9958-9968); slash commands keep the fail-closed Goal gate and are deduped through enqueueBlockedCommand (App.tsx:8915-8925), with blockLocalCommandDuringTurn still toasting (App.tsx:6661-6664).
  • All remaining isGoalGateBlocked call sites are command/run guards: /language sync (App.tsx:7082), manual run enqueue (App.tsx:8466), composer commands (App.tsx:8915), fast-model picker (App.tsx:10743). goalGate.ts body unchanged, doc narrowed to the new convention.
  • Retry hardening is consistent on both layers: the retry affordance is hidden while a turn runs (App.tsx:12402-12406), handleFailedPromptRetry guards on streamingStateRef.current !== 'idle' (App.tsx:6129-6136), and the stale-retry test proves a captured callback cannot resubmit once the session becomes active. handleRetry keeps its own idle guard, so removing the Goal gate there is safe.
  • ChatPane.tsx:791-798 gates only /-prefixed submissions on the Goal gate; ordinary submissions route by streaming state, mirroring App.

Findings

🔴 F1 — web-shell.goal.spec.ts @smoke still asserts the removed hold UX; CI fails on it (blocking)

Witness: web-shell E2E Smoke (ubuntu-latest, Node 22.x) on 66aadc4e (run 32483364983) failed on all 3 attempts with expect(locator).toContainText('stay queued until I choose') — element not found — at client/e2e/web-shell.goal.spec.ts:95.

The spec "runs the canonical Goal and explicit queue interaction chain" encodes the old contract this PR removes:

  • lines 93-97: with an active Goal and no turn running, an ordinary submission must land in the local queue ([data-web-shell-queued-prompts]) with zero daemon prompt requests and zero mid-turn requests;
  • lines 105-117: the explicit Insert button moves that held prompt into a running turn;
  • lines 126-130: a second prompt is held locally and flushed only when the Goal is paused.

Because the PR removes holdQueuedPromptsLocally from production (the useQueuedPrompts call in App.tsx no longer passes it; the hook default is false, useQueuedPrompts.ts:406), the line-93 submission is now a direct sendPrompt against the idle session — the queue strip never renders the text and a prompt request reaches the daemon, so the assertion fails deterministically (3/3 retries, not flaky). The unit suite was updated for the new contract; this spec was not, and it is the only remaining consumer of [data-web-shell-queued-prompts] in the e2e tree.

Suggested fix direction: rewrite the interaction chain to the new contract — idle + active Goal → expect the daemon prompt request (user-origin Goal turn); running turn → submission becomes a mid-turn insertion request; rework or drop the explicit-Insert segment accordingly, and update the 02-goal-with-local-queue.png capture stage. Until then this check blocks merge (and ci-bot's deferred approval is gated on it too).

Not re-raised (already discussed)

  • holdQueuedPromptsLocally remains in the useQueuedPrompts signature and hook tests while dead in production — ci-bot stage 3 already named this as a non-blocking cleanup follow-up.
  • ChatPane's slash-command block returns false without a toast while App toasts — pre-existing asymmetry, also already noted by ci-bot.

🎉 What stands out

The reversal is justified at the right layer: admission semantics move to the runtime's permit machinery, which is strictly stronger than a client-side hold (a held prompt could be stranded by a client reload; a permitted/queued turn survives because the runtime owns ordering). The render-phase ref fix and the stale-retry hardening each come with a test that reproduces the exact race window. Net −65 lines of gate logic replaced by a single routing predicate.


中文说明

结论:💬 COMMENT — 一个阻塞项:canonical Goal E2E smoke spec 仍在断言已被移除的本地 hold 行为,CI 正是断在这一条上。

审查 head:66aadc4e。范围:5 个文件,+208/−125。单元测试在 CI 上通过;web-shell E2E Smoke 失败(见 F1)。

关键前提 — 已验证 ✅

本 PR 有意反转了早先 fail-closed 的前端 Goal hold,因此先逐层核实了服务端准入机制:goalRequiresExactPermit(goal-protocol.ts:146-151)要求 active Goal 下的提交必须持有精确 turn permit;UserQuery 准入(client.ts:2749-2775)把普通提交标记为 goalOrigin = 'user' 并走 permitForTurn ?? beginTurn,拿不到 permit 时抛错并显示 "Goal turn admission failed",是可见错误而非静默丢弃;beginTurn(goal-runtime.ts:1101-1133)在两个 turn 之间立即发放 permit,运行中则排队;releaseTurn(1134-1180)释放时提升排队者,claimGoalTurn(Session.ts:570-614)通过订阅等待提升或中止。结论:空闲会话的直接发送会作为用户触发的 Goal turn 被准入,运行中的发送由运行时排队/提升,任何路径都不会静默绕过 Goal。前提成立,前端不再需要对普通消息 fail-closed。

前端改动 — 已验证 ✅

streamingStateRef 改为渲染期赋值(App.tsx:4244-4245),修复了过渡渲染中子组件 layout effect 提交读到过期 'idle' 的真实竞态,新测试夹具(ChatEditor mock 的 onChatEditorLayout)正好钉住该窗口;模式与既有代码一致(useQueuedPrompts.ts:413-414 的 writeBlockedRef)。普通消息路径只按 streaming state 路由(App.tsx:9958-9968);斜杠命令保留 fail-closed Goal 门并经 enqueueBlockedCommand 去重(App.tsx:8915-8925),blockLocalCommandDuringTurn 仍弹 toast(App.tsx:6661-6664)。剩余所有 isGoalGateBlocked 调用点都是命令/运行守卫(App.tsx:7082 /language、8466 手动运行、8915 命令、10743 fast-model 选择器);goalGate.ts 函数体未变,仅收窄文档。重试加固两层一致:运行中隐藏重试入口(App.tsx:12402-12406)、handleFailedPromptRetry 增加 streamingStateRef.current !== 'idle' 守卫(App.tsx:6129-6136),stale-retry 测试证明已捕获的旧回调在会话转为活跃后无法重复提交;handleRetry 自身仍保留 idle 守卫,移除其中的 Goal 门是安全的。ChatPane.tsx:791-798 仅对 / 前缀提交启用 Goal 门,与 App 保持一致。

发现

🔴 F1 — web-shell.goal.spec.ts @smoke 仍断言已移除的 hold 行为,CI 因此失败(阻塞)

见证:66aadc4e 上的 web-shell E2E Smoke (ubuntu-latest, Node 22.x)(run 32483364983)三次重试全部失败于 expect(locator).toContainText('stay queued until I choose') — element not found — 位置 client/e2e/web-shell.goal.spec.ts:95

spec "runs the canonical Goal and explicit queue interaction chain" 编码的正是本 PR 移除的旧契约:93-97 行要求 active Goal 且无 turn 运行时,普通提交进入本地队列([data-web-shell-queued-prompts])且不产生任何 daemon prompt/mid-turn 请求;105-117 行通过显式 Insert 按钮把排队消息插入运行中的 turn;126-130 行要求第二条消息本地保留、直到 Goal 被暂停才冲刷。由于 PR 在生产路径移除了 holdQueuedPromptsLocally(App.tsx 调用 useQueuedPrompts 不再传参,hook 默认 false,useQueuedPrompts.ts:406),第 93 行的提交现在是对空闲会话的直接 sendPrompt —— 队列条不会出现该文本,prompt 请求会到达 daemon,断言确定性失败(3/3 次重试,非偶发)。单元测试已按新契约更新,此 spec 未更新,且它是 e2e 树中 [data-web-shell-queued-prompts] 的唯一消费者。

建议修复方向:把该交互链改写为新契约 —— 空闲 + active Goal → 断言 daemon prompt 请求(用户触发的 Goal turn);运行中的 turn → 提交变为 mid-turn 插入请求;相应重写或删除显式 Insert 段落,并更新 02-goal-with-local-queue.png 截图阶段。修复前该检查阻塞合并(ci-bot 的延迟批准也以它为门槛)。

不再重复提出(已有讨论)

holdQueuedPromptsLocally 仍留在 useQueuedPrompts 签名与 hook 测试中但生产已不使用 —— ci-bot stage 3 已将其列为非阻塞清理项;ChatPane 对斜杠命令的阻止返回 false 而不弹 toast,与 App 不一致 —— 既有差异,ci-bot 亦已提及。

🎉 亮点

反转发生在正确的层:准入语义移交给运行时 permit 机制,严格强于前端 hold(被 hold 的提示可能因客户端刷新而滞留,而 permit/排队由运行时持有排序,不受前端状态影响)。渲染期 ref 修复与 stale-retry 加固各自配备了能复现精确竞态窗口的测试。净 −65 行门控逻辑被单一按活动状态路由的判定取代。

chiga0
chiga0 previously approved these changes Aug 21, 2026

@chiga0 chiga0 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.

F1 fixed — E2E smoke now passes on all checks.

What the fix commit does: test(web-shell): align goal smoke with message routing rewrites the Goal E2E spec to match the new routing semantics. The old test submitted while Goal was active + session idle and expected a local queue; the new test submits during an active turn (after assistantTextEvent) and verifies the message is auto-inserted mid-turn. The after-turn submission ('run while the goal stays active') now correctly expects daemon.promptRequests().length === 1 (direct send, not queued), which is the intent described in the PR.

CI (new head 4fc8f0d6):

  • web-shell E2E Smoke (ubuntu)
  • Test (ubuntu, Node 22.x)
  • Capture web-shell visuals
  • macos / windows / integration: SKIPPED (not gated on this change)

Reviewed with AI assistance.

@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.

Reviewed — no blockers. Suggestions are inline.

中文说明

已审查——无阻断问题。 建议见行内评论。

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

Comment thread packages/web-shell/client/App.tsx Outdated
Comment thread packages/web-shell/client/App.tsx
Comment thread packages/web-shell/client/App.tsx
Comment thread packages/web-shell/client/components/ChatPane.tsx

@wenshao wenshao 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.

Reviewed. Suggestions are inline.

中文说明

已审查。 建议见行内评论。

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

Comment thread packages/web-shell/client/App.tsx Outdated
Comment thread packages/web-shell/client/App.tsx Outdated
}),
);
await queue.getByRole('button', { name: 'Insert' }).click();
await submitComposer(page, 'stay queued until I choose');

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] The rewrite drops the only E2E click of the queued-prompts Insert button (the removed queue.getByRole('button', { name: 'Insert' }).click()). The button still ships — QueuedPromptDisplay renders it and the App wires canInsertMidTurn/onInsert — but nothing in client/e2e/ exercises manual mid-turn insertion anymore: the ChatPane tests only assert the data-can-insert-mid-turn dataset, and hook-level tests call insertQueuedPrompt directly, bypassing the button and the App-level gating. A regression breaking the manual Insert wiring would ship with the smoke suite green. Consider keeping one E2E step that holds a queued prompt while a turn runs and clicks Insert, asserting the resulting mid-turn request.

中文说明

重写移除了 E2E 中唯一一次点击队列 Insert 按钮的操作。该按钮仍在线上提供(QueuedPromptDisplay 渲染、App 连接 canInsertMidTurn/onInsert),但 client/e2e/ 中不再有任何用例验证手动中途插入:ChatPane 测试只断言 data-can-insert-mid-turn 数据集,hook 层测试直接调用 insertQueuedPrompt,绕过了按钮和 App 层的门控。若手动 Insert 接线出现回归,smoke 套件仍会绿灯通过。建议保留一个 E2E 步骤:turn 运行时让一条消息留在队列中并点击 Insert,断言产生的 mid-turn 请求。

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

Comment thread packages/web-shell/client/App.tsx
Comment thread packages/web-shell/client/components/ChatPane.test.tsx Outdated
Comment thread packages/web-shell/client/App.tsx
@ytahdn

ytahdn commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator Author

CI note: the new Dependency CVE audit failure is unrelated to this PR. This branch changes no dependency manifest or lockfile, and the current origin/main has no dependency-file delta relative to this head. The audit began failing on newly reported upstream advisories (tar is the single high-severity entry; the remaining findings are low/moderate). I am leaving dependency upgrades out of this focused Web Shell routing PR rather than widening its scope.

@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.

Reviewed. Suggestions are inline.

Not explored to full depth (tool budget reached): "agent reverse-audit (round 1)": running the web-shell unit tests (App.test.tsx / ChatPane.test.tsx) to confirm the diff's tests execute green; "agent 1a": typecheck/unit-test run for packages/web-shell (no node_modules installed in the worktree or parent checkout; full install exceeded the tool budget).

中文说明

已审查。 建议见行内评论。

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 1)"running the web-shell unit tests (App.test.tsx / ChatPane.test.tsx) to confirm the diff's tests execute green"agent 1a"typecheck/unit-test run for packages/web-shell (no node_modules installed in the worktree or parent checkout; full install exceeded the tool budget)

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

Comment thread packages/web-shell/client/App.tsx
Comment thread packages/web-shell/client/App.tsx
@wenshao

wenshao commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

Local verification report — real daemon + real browser, A/B against main

I built a full local stack and exercised this PR head (d72a093) side by side with its merge base (04886c4) under identical backend conditions, then compared the client behaviour request-by-request. Summary: the change does what the description says, the new tests are non-vacuous, and I found no correctness regression. Two behaviours are worth a conscious decision before merge — both are described below with evidence.

Rig

Piece What it was
Daemon real qwen serve started from the PR source tree (scripts/dev.js serve, one instance, :5323), real ACP child, isolated QWEN_HOME, real workspace
Front ends two Vite dev servers against the same daemon — PR head on :5324, merge base main on :5325
Model local OpenAI-compatible provider with controllable time-to-first-token and streaming cadence, plus a per-request ledger that records whether the request socket was aborted and how many chunks it delivered
Driver Playwright Chromium, full request ledger per page (POST /prompt, POST /mid-turn-message, GET /goal, …)
Platform macOS 26.6.2, Node v24.18.1

Because both arms talk to one daemon and one model, every difference below is attributable to the client diff.

Static / test gates on PR head

Gate Result
packages/web-shell full vitest suite 4043 passed, 0 failed
App.test.tsx + ChatPane.test.tsx + goalGate 622 passed
tsc --noEmit (packages/web-shell) clean
eslint on the 4 changed source files clean
web-shell.goal.spec.ts (Playwright, PR head) 2 passed
Non-vacuity: PR test files run against main source 19 failed / 612
Non-vacuity: PR e2e spec run against main source fails at midTurnRequests(daemon).length → 1

1. Idle session, Goal read still in flight — the case the PR is about ✅

Reopened an existing idle session with GET /session/:id/goal delayed by 12 s, then typed an ordinary message.

main PR #9667
POST /prompt timing after reopen +12 149 ms (waits out the whole Goal read) +336 ms
Queued badge shown yes no

hydration window, ordinary message

2. Forwarded slash command in the same window ✅ (stricter — see note)

main PR #9667
Behaviour queued, then forwarded to the daemon once the Goal read landed (POST /prompt with /deploy production) refused immediately with the new queue.commandGoalBlocked toast; 0 POST /prompt, ever
Composer cleared text preserved — re-submitting after hydration succeeds (verified)

hydration window, slash command

Note: on main a slash command typed in the unknown window eventually ran; on this PR it is dropped and the user must press send again. That is the intended fail-closed trade, and it costs one keypress because the composer keeps the text — flagging it only so the choice is explicit.

3. Ordinary message during a streaming Goal turn ✅

Goal turn streaming line-1…line-40 at 1.5 s intervals; composer correctly reads esc to cancel on both arms.

main PR #9667
Requests none — held locally behind an explicit “Insert” 1 × POST /mid-turn-message, badge reads “Queued…”
Reached the model? not until the user clicks Insert yes — provider ledger shows the Goal continuation context and the user text in the same model request

ordinary message during a streaming goal turn

4. Failed-send retry while a Goal turn runs ✅

Produced a genuinely rejected send (413, the isDefinitelyRejectedPromptAdmission path), then resumed a parked Goal so a turn starts without a new user message.

main PR #9667
While the Goal turn streams “Failed to send / Try again” still rendered; clicking it produced 0 requests, 0 mid-turn messages, no toast — a dead affordance blocked by the Goal gate affordance withdrawn
After the session goes idle again affordance returns, message still marked failed (verified)

failed prompt retry during a goal turn


5. ⚠️ Worth a decision: the pre-first-token window of a Goal turn

streamingState only becomes responding once the turn produces output. Between “Goal turn started” and “first streamed token” the client still reads idle, so this PR takes the direct submit path there rather than mid-turn insertion.

I forced a 40 s time-to-first-token to make the window observable. Provider ledger for the PR arm:

02:57:18.296 → 02:57:27.655   aborted=true   chunks=0   [Goal turn]
02:57:27.654                  POST /session/:id/prompt → 202      ← user message lands
02:57:27.685 → 02:58:11.692   aborted=false  chunks=6   [Goal turn + user message]

The in-flight Goal turn is preempted with zero tokens delivered and immediately restarted as a Goal turn that carries the user's text. On main the same message was held locally and the in-flight Goal turn ran undisturbed.

pre-first-token window

Assessment: not data loss — the message reaches the model, the Goal stays active (status: active, activity: running), nothing is dropped or duplicated. But it does discard the in-flight turn's work, and it is not the "drained into that turn" path the PR description promises for a running Goal turn. In practice the window is the provider's TTFT, so it is small but non-zero. Two options if you want it closed: route ordinary messages on the daemon's turn status rather than on client streamingState, or state the preemption explicitly in the PR description.

6. Minor: dead option left behind

holdQueuedPromptsLocally no longer has any production caller — both call sites are removed by this PR, yet packages/web-shell/client/hooks/useQueuedPrompts.ts still carries the option and 13 references whose branches are now only reachable from the hook's own tests. Worth removing in a follow-up, or keeping with a comment saying why.

Not covered

  • Images / attachments through the same routing (the description claims parity; I did not exercise it).
  • Multi-client and channel-origin sessions.
  • Windows / Linux — macOS only.
中文版报告

本地真实环境验证报告 —— 真实 daemon + 真实浏览器,与 main 做 A/B

我在本地搭了完整栈,把本 PR 的 head(d72a093)与它的 merge base(04886c4)放在完全相同的后端条件下并排跑,逐个请求比对前端行为。结论:改动与描述一致,新增测试非空洞,未发现正确性回归。 有两点建议在合并前明确决策,证据见下。

验证栈

组件 说明
daemon 用 PR 源码起的真实 qwen servescripts/dev.js serve,单实例,:5323),真实 ACP 子进程,隔离的 QWEN_HOME,真实 workspace
前端 两个 Vite dev server 指向同一个 daemon —— PR head 在 :5324,merge base main:5325
模型 本地 OpenAI 兼容假服务,可控首 token 延迟与流式节奏,并逐请求记录 socket 是否被 abort、发出了多少 chunk
驱动 Playwright Chromium,逐页记录完整请求台账(POST /promptPOST /mid-turn-messageGET /goal 等)
平台 macOS 26.6.2,Node v24.18.1

两条腿共用一个 daemon 和一个模型,因此下面所有差异都可归因于前端 diff。

PR head 上的静态与测试门

结果
packages/web-shell 全量 vitest 4043 通过,0 失败
App.test.tsx + ChatPane.test.tsx + goalGate 622 通过
tsc --noEmitpackages/web-shell 干净
4 个改动源文件的 eslint 干净
web-shell.goal.spec.ts(Playwright,PR head) 2 通过
非空洞验证: 把 PR 的测试文件拿到 main 源码上跑 19 失败 / 612
非空洞验证: 把 PR 的 e2e spec 拿到 main 源码上跑 midTurnRequests(daemon).length → 1 处失败

1. 空闲会话、Goal 查询仍在途 —— 本 PR 要解决的场景 ✅

重开一个已有的空闲会话,把 GET /session/:id/goal 延迟 12 秒,然后输入一条普通消息。

main PR #9667
重开后 POST /prompt 的时刻 +12 149 ms(要等完整个 Goal 查询) +336 ms
是否出现排队标识

2. 同一窗口内的转发型 Slash 命令 ✅(更严格 —— 见备注)

main PR #9667
行为 先排队,Goal 查询返回后转发给 daemonPOST /prompt,内容 /deploy production 立刻用新的 queue.commandGoalBlocked toast 拒绝;始终 0 次 POST /prompt
输入框 被清空 文本保留 —— 等 hydration 结束后再次提交可成功(已验证)

备注:在 main 上,未知窗口里输入的 slash 命令最终仍会执行;本 PR 会丢弃它,用户需要再按一次发送。这是刻意的 fail-closed 取舍,因为输入框保留了文本,代价只是一次按键 —— 列出来只是让这个取舍被明确知晓。

3. Goal turn 正在流式输出时发普通消息 ✅

Goal turn 以 1.5 秒间隔流式输出 line-1…line-40;两条腿的输入框都正确显示 esc to cancel

main PR #9667
请求 无 —— 本地扣留,需要用户显式点 “Insert” 1 次 POST /mid-turn-message,标识显示 “Queued…”
是否到达模型 用户点 Insert 之前不会 —— provider 台账显示同一次模型请求里同时含 Goal continuation context 与用户文本

4. Goal turn 运行期间的失败重发入口 ✅

先制造一次明确被拒的发送(413,走 isDefinitelyRejectedPromptAdmission 分支),再 resume 一个已 park 的 Goal,让 turn 在没有新用户消息的情况下启动。

main PR #9667
Goal turn 流式期间 仍然渲染 “Failed to send / Try again”;点击后 0 请求、0 mid-turn、无 toast —— 被 Goal 门挡住的死按钮 入口被收起
会话恢复空闲之后 入口重新出现,消息仍标记为失败(已验证)

5. ⚠️ 建议明确决策:Goal turn 的「首 token 之前」窗口

streamingState 只有在 turn 产生输出后才变成 responding。在「Goal turn 已开始」到「第一个流式 token」之间,前端读到的仍是 idle,因此本 PR 在这个窗口里走的是直接提交路径,而不是中途插入。

我把首 token 延迟强制拉到 40 秒以便观测。PR 这条腿的 provider 台账:

02:57:18.296 → 02:57:27.655   aborted=true   chunks=0   [Goal turn]
02:57:27.654                  POST /session/:id/prompt → 202      ← 用户消息到达
02:57:27.685 → 02:58:11.692   aborted=false  chunks=6   [Goal turn + 用户消息]

在途的 Goal turn 被在零 token 情况下抢占,随即以携带用户文本的新 Goal turn 重启。在 main 上,同一条消息被本地扣留,在途的 Goal turn 不受干扰。

评估:不是数据丢失 —— 消息到达了模型,Goal 保持 active(status: activeactivity: running),既没丢也没重复。但它确实丢弃了在途 turn 已做的工作,也不是 PR 描述里承诺的「drain 到当前 turn」路径。实际窗口约等于供应商的首 token 延迟,很小但不为零。若要封掉,有两条路:普通消息按 daemon 侧 turn 状态而不是前端 streamingState 来路由;或者在 PR 描述里把这种抢占写清楚。

6. 次要:留下了一个已无调用方的选项

holdQueuedPromptsLocally 已经没有任何生产调用方 —— 两处调用点都被本 PR 删掉了,但 packages/web-shell/client/hooks/useQueuedPrompts.ts 里仍保留该选项及 13 处引用,其分支现在只能被该 hook 自己的测试触达。建议后续 PR 清理,或保留并注明原因。

未覆盖

  • 图片 / 附件走同一路由(描述里声称一致,我没有实测)。
  • 多客户端与 channel 来源的会话。
  • Windows / Linux —— 只在 macOS 上验证。

@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.

Reviewed — no blockers. Suggestions are inline.

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

  • packages/web-shell/client/App.tsx:8925 — [probe] enqueueBlockedCommand's forwarded images/files/inputAnnotations are pinned by no test
中文说明

已审查——无阻断问题。 建议见行内评论。

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

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

Comment on lines 9442 to +9444
const skillPrompt = `/${skillArg}`;
if (promptBlocked) {
return enqueuePrompt(
skillPrompt,
images,
files,
undefined,
commitComposerAccepted,
metadata?.inputAnnotations,
);
if (commandBlocked) {
return enqueueBlockedCommand(skillPrompt);

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: Round-2 ledger entry, still standing in reduced scope after re-checking at d72a093f. The Goal-blocked half is now fixed — the final commit's it.each exercises all four enqueue-style sites (hidden command via the wired hiddenSlashCommands, /model --fast, /skills, /rename --auto) with an active Goal + idle streaming, asserting refusal and the new queue.commandGoalBlocked toast. Residual gap: none of these four sites has a test submitting the command with streamingState === 'responding' and a Goal-idle session, so the enqueue branch of enqueueBlockedCommand is pinned only at the generic forwarded-command site. Concretely, replacing enqueueBlockedCommand(...) with blockCommand() at any one of the four sites leaves the whole suite green while a user who submits e.g. /skills deployer mid-turn with no Goal gets it refused with a toast instead of queued. Dropping the if (commandBlocked) guard entirely IS caught by the new Goal-active it.each; only the enqueue→block substitution survives.

Witness: probe — mutant enqueueBlockedCommandblockCommand() at the /skills site and at all four sites simultaneously: App.test.tsx 503/503 pass (mutant survives).

Consider adding one running-turn, Goal-idle case per enqueue-style site asserting rawEnqueuePrompt is called with the command text.

中文说明

[Suggestion](建议)R2-2:第二轮台账条目,在 d72a093f 复查后仍以缩小后的范围成立。Goal 拦截的一半已修复——最后一个提交的 it.each 已覆盖全部四个入队式命令点(通过接入的 hiddenSlashCommands 覆盖隐藏命令、/model --fast/skills/rename --auto),在 active Goal + streaming 空闲下断言拒绝并弹出新的 queue.commandGoalBlocked 提示。剩余缺口:这四个调用点没有任何测试在 streamingState === 'responding' 且 Goal 空闲的会话下提交命令,因此 enqueueBlockedCommand 的入队分支只在通用转发命令点被钉住。具体而言,把任一调用点的 enqueueBlockedCommand(...) 替换为 blockCommand(),整套测试依旧全绿,而用户在无 Goal 的 turn 运行中提交例如 /skills deployer 时,会收到一个 toast 拒绝而不是入队。完全删掉 if (commandBlocked) 守卫的变异会被新增的 Goal-active it.each 捕获;只有入队→拦截的替换变异能够存活。

见证:探针——在 /skills 调用点及四处调用点同时将 enqueueBlockedCommand 变异为 blockCommand():App.test.tsx 503/503 通过(变异存活)。

建议为每个入队式调用点补一个「turn 运行中 + Goal 空闲」的用例,断言 rawEnqueuePrompt 以该命令文本被调用。

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

Comment on lines +6661 to +6667
const blockCommand = useCallback((): false => {
pushToast(
'error',
t(
isGoalGateBlocked()
? 'queue.commandGoalBlocked'
: 'queue.commandBlocked',

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] The non-Goal branch of this new toast ternary (queue.commandBlocked, "Slash commands can't be queued while a turn is running.") is asserted by no test: the string appears only in i18n.tsx, and no test blocks a command mid-turn without a Goal via any blockCommand call site (/language, /branch, /fork, /plan, /mcp install, the language picker, the fast-model picker). Emitting queue.commandGoalBlocked unconditionally instead leaves the suite green, and every command blocked during an ordinary running turn — no Goal anywhere — would show "Slash commands are unavailable while a Goal owns the session or its state is loading.", naming a Goal that does not exist.

Witness: probe — mutant blockCommand pushing queue.commandGoalBlocked unconditionally (ternary removed): App.test.tsx 503/503 pass (mutant survives); the commandBlocked string appears in no test file.

Consider one mid-turn, Goal-idle refusal test (e.g. a language-picker change or /branch with streamingState === 'responding' and a known-inactive Goal) asserting accepted === false and the queue.commandBlocked toast.

中文说明

[Suggestion](建议)这个新 toast 三元表达式的非 Goal 分支(queue.commandBlocked,即 "Slash commands can't be queued while a turn is running.")没有任何测试断言:该字符串只出现在 i18n.tsx 中,也没有测试在无 Goal 的 turn 运行中通过任何 blockCommand 调用点(/language/branch/fork/plan/mcp install、语言选择器、fast-model 选择器)拦截过命令。若改为无条件弹 queue.commandGoalBlocked,整套测试依旧全绿,而普通运行中(完全没有 Goal)被拦截的每个命令都会显示 "Slash commands are unavailable while a Goal owns the session or its state is loading."——指向一个并不存在的 Goal。

见证:探针——将 blockCommand 变异为无条件推送 queue.commandGoalBlocked(删除三元判断):App.test.tsx 503/503 通过(变异存活);commandBlocked 文案未出现在任何测试文件中。

建议补一个「turn 运行中 + Goal 空闲」的拒绝用例(例如在 streamingState === 'responding' 且 Goal 已知非 active 时切换语言选择器或执行 /branch),断言 accepted === false 且弹出 queue.commandBlocked 提示。

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

@ytahdn

ytahdn commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator Author

Addressed the zero-token in-flight gap in 54a075f. The main and split-pane composers now treat the daemon-authoritative current-session hasActivePrompt signal as active even while the client streaming state is still idle. That effective active state is also passed into the prompt queue hook, so an ordinary message reaches the real mid-turn insertion path instead of being reclassified as a direct prompt inside the hook. When hasActivePrompt returns false, routing falls back to idle/direct send as before. Retry actions are hidden and fail closed through the same active window. Goal ownership still does not affect ordinary-message routing, and shell-command behavior is unchanged. Regression coverage pins App, ChatPane, queue-hook state, state rollback, and both retry entry points; App 506/506 and ChatPane 112/112 pass.

@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.

Reviewed — no blockers. Suggestions are inline.

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

  • packages/web-shell/client/App.test.tsx:11069 — [probe] hydrating-window command tests do not assert the refusal toast
  • packages/web-shell/client/e2e/web-shell.goal.spec.ts:121 — [review] rewritten E2E smoke request-count oracles no longer catch a double-send regression
中文说明

已审查——无阻断问题。 建议见行内评论。

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

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

goalState: connection.goalState,
})
});
if (commandBlockedByGoal) return 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] ChatPane's rewritten command gate rejects a Goal-blocked slash command with a bare return false and no feedback, while the equivalent main-composer path (enqueueBlockedCommandblockCommand in App.tsx) shows the queue.commandGoalBlocked toast, and every other refusal in this same callback calls reportError. Before this PR the same submission was visibly held in the local queue through the removed holdQueuedPromptsLocally gate, so the diff turns a visible queue entry into a silent no-op: type a slash command into a split-view/side-task pane while a Goal is active or its state is still hydrating, press Enter, and nothing happens — the text stays in the composer with no toast, no hint, no queue entry, while the identical submission in the main composer explains itself.

Witness: probe — submitting /deploy production with an active Goal and an onError spy fails against the PR code (the error callback is never called: Number of calls: 0) and passes once the reportError wiring below is applied; ChatPane.test.tsx stays 113/113 green with the fix.

Suggested change
if (commandBlockedByGoal) return false;
if (commandBlockedByGoal) {
reportError(
new Error(t('queue.commandGoalBlocked')),
t('queue.commandGoalBlocked'),
);
return false;
}
中文说明

[Suggestion](建议)ChatPane 重写后的命令门在斜杠命令被 Goal 拦截时只返回 return false,没有任何反馈;而主输入框的等价路径(App.tsx 中的 enqueueBlockedCommandblockCommand)会弹出 queue.commandGoalBlocked 提示,且本回调中其他所有拒绝分支都会调用 reportError。在本 PR 之前,同样的提交会通过已被移除的 holdQueuedPromptsLocally 门可见地进入本地队列,因此本 diff 把一个可见的队列条目变成了静默无操作:在 Goal active 或其状态仍在加载时,于 split-view/侧边任务面板中输入斜杠命令并回车,什么都不会发生——文本留在输入框中,没有提示、没有队列条目;而同样的提交在主输入框中会得到解释性提示。

见证:探针——在 active Goal 下提交 /deploy production 并挂 onError 监听:对 PR 代码探针失败(错误回调从未被调用:Number of calls: 0);应用下方的 reportError 修复后探针通过,且 ChatPane.test.tsx 保持 113/113 全绿。

(修复代码见上方英文部分的 ```suggestion 块。)

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

Comment on lines +8945 to +8947
const sessionActive =
streamingStateRef.current !== 'idle' ||
sessionHasActivePromptRef.current;

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] This diff routes every submission path through the new composite sessionActive — ordinary prompts (~9986), slash commands via commandBlocked (8948), both retry gates (6151, 10195), the language picker (7109) and the fast-model picker (10781) — but not the ! shell path: the shell gate (App.tsx:9930) and the shell-queue drain trigger (App.tsx:7251) still read only raw streamingState. At the merge base nothing read sessionHasActivePrompt, so every path was consistently ungated for the silent mid-turn gap; this diff moves every sibling to the composite and leaves shell out, newly creating the inconsistency.

The concrete shape: in the pre-first-stream-event window your own tests construct ('inserts a prompt before the first stream event reaches the client' — streamingState idle while the daemon still reports the in-flight prompt), submit !ls. Every other submission is held or enqueued and the UI renders the session as running, but the shell branch sees raw idle and fires sendShellCommand immediately — bridge.executeShellCommand has no turn-active check, so the output interleaves with the active turn, the exact harm the /extensions install block comment cites ("block it mid-turn so it can't split the active turn"). Queued shell commands can likewise drain the moment raw streamingState flips idle even while sessionHasActivePrompt is still true.

Witness: probe — with sessionHasActivePrompt = true and streamingState = 'idle', submitting !ls calls sendShellCommand once with ["ls"] against the PR code; with the one-line composite-gate fix below the probe passes (the command is queued instead) — a clean flip, and all 29 'App shell command queueing' tests still pass with the fix, including 'runs an idle shell command immediately while a Goal is active' (the deliberate Goal bypass is preserved).

Suggested fix (at the two read sites):

// App.tsx:9930 (the `!` gate)
if (streamingStateRef.current !== 'idle' || sessionHasActivePromptRef.current) {
// App.tsx:7251 — key the drain-start effect on queuedPromptStreamingState
// (or the same composite) instead of raw streamingState

plus a silent-gap test mirroring the prompt-enqueue one.

中文说明

[Suggestion](建议)本 diff 把所有提交路径都改走新的组合判定 sessionActive——普通消息(约 9986 行)、经 commandBlocked 的斜杠命令(8948)、两处重试门(6151、10195)、语言选择器(7109)、快模型选择器(10781)——唯独没有包括 ! shell 路径:shell 门(App.tsx:9930)与 shell 队列 drain 触发(App.tsx:7251)仍然只读原始 streamingState。在 merge base 上没有任何代码读 sessionHasActivePrompt,所有路径对这个「静默 mid-turn 窗口」的处理是一致的(都不设防);本 diff 把其他所有兄弟路径迁移到组合判定,唯独落下 shell,从而新制造了这个不一致。

具体场景:在本 PR 自己的测试所构造的首个流事件之前的窗口('inserts a prompt before the first stream event reaches the client'——streamingState 为 idle 而 daemon 仍报告有在途 prompt)提交 !ls:其他所有提交都会被暂留或入队、UI 显示会话运行中,但 shell 分支看到原始 idle 就会立即触发 sendShellCommand——bridge.executeShellCommand 没有 turn-active 检查,输出会与活跃 turn 交错,正是 /extensions install 拦截注释所引用的危害("mid-turn 拦截,避免其割裂活跃 turn")。同样,排队的 shell 命令也会在原始 streamingState 翻回 idle 的瞬间被 drain,即使 sessionHasActivePrompt 仍为 true。

见证:探针——sessionHasActivePrompt = truestreamingState = 'idle' 时提交 !ls:对 PR 代码,sendShellCommand 被以 ["ls"] 调用一次;应用下面的一行组合门修复后探针通过(命令改为入队)——翻转干净,且修复后全部 29 个 'App shell command queueing' 测试依旧通过,包括 'runs an idle shell command immediately while a Goal is active'(有意保留的 Goal 旁路不受影响)。

建议修复(两处读取点):App.tsx:9930 的 ! 门改为 if (streamingStateRef.current !== 'idle' || sessionHasActivePromptRef.current);App.tsx:7251 的 drain 启动 effect 改挂 queuedPromptStreamingState(或同一组合判定),并补一个与 prompt 入队用例对应的静默窗口测试。

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

Comment on lines +12448 to +12450
isPreparingPrompt ||
streamingState !== 'idle' ||
sessionHasActivePrompt

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] The streaming-state half of this new retry gate is untested. The stale-retry tests this diff adds flip only sessionHasActivePrompt; nothing asserts retry visibility/inertness with streamingState = 'responding' while sessionHasActivePrompt is false. That matters because sessionHasActivePrompt comes from the session-catalog live-state subscription, which can lag the stream or be absent on daemons without workspace_session_live_state, while streamingState is already 'responding' — in that window this half is the only thing hiding the retry, and a failed-prompt retry clicked there would fire sendPrompt into the running turn.

Witness: probe — deleting streamingState !== 'idle' from both this gate and the matching handleFailedPromptRetry guard (~6150) keeps the whole suite green (App.test.tsx 508/508, main.test.tsx 1/1 — the mutant survives); the discriminator probe fails against the mutant (<button data-testid="failed-prompt-retry"> still rendered during streamingState = 'responding') and passes against the PR code.

Consider extending a retry test (e.g. a sibling of 'marks and retries a failed prompt while an active Goal is known') to set testState.streamingState = 'responding' with sessionHasActivePrompt false and assert the retry affordance is hidden and the captured stale onRetryFailedPrompt does not re-send.

中文说明

[Suggestion](建议)这个新重试门的 streaming-state 一半没有任何测试覆盖。本 diff 新增的过期重试测试只翻转 sessionHasActivePrompt;没有测试断言在 streamingState = 'responding'sessionHasActivePrompt 为 false 时重试入口的可见/失效。这一点要紧,因为 sessionHasActivePrompt 来自 session-catalog 的 live-state 订阅,它可能滞后于流,也可能在不支持 workspace_session_live_state 的 daemon 上缺失,而 streamingState 此时已经是 'responding'——在那个窗口里,这半个条件是唯一隐藏重试入口的东西,此时点击失败消息重试会向正在运行的 turn 触发 sendPrompt

见证:探针——把 streamingState !== 'idle' 从本门和对应的 handleFailedPromptRetry 守卫(约 6150 行)中同时删掉,整套测试依旧全绿(App.test.tsx 508/508、main.test.tsx 1/1——变异存活);判别探针对变异体失败(streamingState = 'responding' 期间 <button data-testid="failed-prompt-retry"> 仍然渲染),对 PR 代码通过。

建议扩展一个重试测试(例如 'marks and retries a failed prompt while an active Goal is known' 的兄弟用例):置 testState.streamingState = 'responding'sessionHasActivePrompt 为 false,断言重试入口隐藏、已捕获的过期 onRetryFailedPrompt 不会重发。

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

metadata?.inputAnnotations,
);
if (commandBlocked) {
return enqueueBlockedCommand(skillPrompt);

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: Round-2 ledger entry, still standing at this round's head. The Goal-blocked half is fixed — the it.each now exercises all four enqueue-style sites (hidden command via the wired hiddenSlashCommands, /model --fast, /skills, /rename --auto) with an active Goal + idle streaming, asserting refusal and the queue.commandGoalBlocked toast. Residual gap: none of these four sites has a test submitting the command with streamingState === 'responding' and a Goal-idle session, so the enqueue branch of enqueueBlockedCommand is pinned only at the generic forwarded-command site ('enqueues a forwarded command while the session is active and Goal is idle'). Concretely, replacing enqueueBlockedCommand(...) with blockCommand() at any one of the four sites leaves the whole suite green while a user who submits e.g. /skills deployer mid-turn with no Goal gets it refused with a toast instead of queued; dropping the if (commandBlocked) guard entirely IS caught by the Goal-active it.each, only the enqueue→block substitution survives.

Witness: probe (round 3) — mutant enqueueBlockedCommandblockCommand() at the /skills site and at all four sites simultaneously: App.test.tsx 503/503 pass (mutant survives). Re-checked at this round's head: no responding-state test exists at the four enqueue-style sites.

Consider adding one running-turn, Goal-idle case per enqueue-style site asserting rawEnqueuePrompt is called with the command text.

中文说明

[Suggestion](建议)R2-2:第二轮台账条目,在本轮 head 上仍然成立。Goal 拦截的一半已修复——it.each 现已覆盖全部四个入队式调用点(通过接入的 hiddenSlashCommands 覆盖隐藏命令、/model --fast/skills/rename --auto),在 active Goal + streaming 空闲下断言拒绝并弹出 queue.commandGoalBlocked 提示。剩余缺口:这四个调用点仍没有任何测试在 streamingState === 'responding' 且 Goal 空闲的会话下提交命令,因此 enqueueBlockedCommand 的入队分支只在通用转发命令点('enqueues a forwarded command while the session is active and Goal is idle')被钉住。具体而言,把任一调用点的 enqueueBlockedCommand(...) 替换为 blockCommand(),整套测试依旧全绿,而用户在无 Goal 的 turn 运行中提交例如 /skills deployer 时会收到 toast 拒绝而不是入队;完全删掉 if (commandBlocked) 守卫的变异会被 Goal-active 的 it.each 捕获,只有入队→拦截的替换变异能够存活。

见证:探针(第三轮)——在 /skills 调用点及四处调用点同时将 enqueueBlockedCommand 变异为 blockCommand():App.test.tsx 503/503 通过(变异存活)。本轮 head 复查:四个入队式调用点仍无 responding 状态测试。

建议为每个入队式调用点补一个「turn 运行中 + Goal 空闲」的用例,断言 rawEnqueuePrompt 以该命令文本被调用。

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

@wenshao

wenshao commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 22, 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: 763 passed · 0 failed · 763 total

Flakiness gate: ✅ 2 changed test file(s) x 5 identical rounds, no divergence

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

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

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

抖动门:✅ 2 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR #9667 Deep Verification — fix(web-shell): route goal messages by session activity

Verdict: merge-ready — 763/763 scripted assertions passed, 0 unexpected failures. One non-blocking Suggestion (a new test that passes for the wrong reason; the production guard it targets is itself proven correct and load-bearing).
Verified head: 2bf1f5050205b11d82f2b6f80358d28b948a597f (merge-ref c8922c9333, base tip 6bbb273a86c6e9087aeb98aa6c5a65bcbbc0fa47).

中文摘要

结论:merge-ready。全部脚本化断言通过(计数见 assertions.json),无意外失败;仅一条非阻塞建议(见 Findings,属测试有效性问题,生产代码本身正确)。

  • A/B 结论:见下方 Central claim and A/B proof 表及截图 01030507——同一套新测试在 head 全绿、在 base 恰好红于本 PR 声称改变的行为(均为 sendPrompt 调用与否、accepted 真假、toast 文案等行为断言不符);e2e 层面 base 的 midTurnRequests 恒为 0 而 head 恰好投递 1 条。改动是行为差异的唯一来源。
  • 变异矩阵:见 Mutation matrix 表及 04-mutation-matrix.png——守卫级变异几乎全部被对应测试杀死且归因精确,正向对照成立。唯一幸存者 M11 经裁决:守卫本身不可或缺,是测试断言跑在异步重发链路落定之前,没有钉住它(详见 Finding 1)。
  • Findings:1 条建议级——上述测试断言竞态,修复为测试一行(已双向度量验证)。
  • 未覆盖:见 Not covered 节(逐提交归因、运行时 Goal 归属语义、真实浏览器手工复现 hydration 窗口、其余未触及套件等)。

Central claim and A/B proof

Central claim: ordinary chat messages are admitted purely by session activity (streamingState + daemon-reported sessionHasActivePrompt), not by Goal hydration/state: an idle session submits immediately even while goalState is still hydrating (undefined) or an active Goal is known; a running session enqueues with mid-turn insertion. Base held/enqueued ordinary messages whenever the Goal gate was blocked.

Secondary claims (verified, see matrix rows): (1) slash commands and local run controls (fast-model select, settings language change, manual/bound runs) stay fail-closed via isGoalGateBlocked, with a Goal-specific toast queue.commandGoalBlocked (EN+i18n ZH both present; typecheck clean); commands merely enqueue when only the session is active. (2) retry surfaces hide and stale retry callbacks go inert while the daemon reports an active prompt (the pre-first-stream-event window).

Cell Environment Oracle Result
head unit HEAD worktree, vitest (mocked catalog hooks) App.test.tsx + ChatPane.test.tsx + goalGate.test.ts pass counts 630/630 green (01-head-unit-green.png)
base unit HEAD^1 worktree + head test files copied in same suites 18 red / 490 green (App), 6 red / 106 green (ChatPane) (02-ab-chatpane-base-red.png, 03-ab-app-base-red.png)
head e2e real chromium + vite dev server + scripted daemon harness web-shell.goal.spec.ts 2/2 pass; mid-turn insert reaches daemon with exact body (05-e2e-head-green.png)
base e2e base tree, same spec copied in same 1 red: midTurnRequests stays 0 where head delivers 1 (06-ab-e2e-base-red.png, 07-base-e2e-failure-screenshot.png)
adjacent gate head useQueuedPrompts.midTurnReconcile.test.tsx 88/88 green
typecheck head tsc -p tsconfig.json --noEmit clean

All 24 base reds are behavioral assertion mismatches in exactly the tests this PR adds/rewrites (names listed in logs/base-app-junit.xml and the captures) — e.g. base sends nothing where head sends 'hello during hydration', base forwards a slash command during hydration (accepted === true) where head blocks it, base emits the old toast string. The control cell in the other direction also holds: inserts a hydrating composer prompt while the session is active (mid-turn enqueue) passes on both arms — pre-existing behavior preserved.

Control purity: the base worktree has no node_modules of its own (resolution walks to the root install); the only internal packages the suites load are @qwen-code/sdk and @qwen-code/webui (realpath-verified), both untouched by the diff — the PR changes nothing outside packages/web-shell/client/, no package.json/lockfile changes. The one nested node_modules inside packages/web-shell was symlinked into the base tree (identical content, lockfile unchanged).

Corrections

None — first verification round for this PR; no earlier report or bot comment to correct.

Reviewer Test Plan, per step

  1. Idle session, Goal still loading → immediate submit, no queued badge — ✅ unit level, both App and ChatPane (sends an idle composer prompt while Goal state is still hydrating and pane twin; green on head, red on base). Not reproduced in a real browser (see Not covered).
  2. Active Goal between turns → message starts a Goal turn — ✅ client side proven (sends an idle composer prompt when an active Goal is known); the Goal-turn ownership itself is runtime behavior, out of this PR's diff (see Not covered).
  3. Turn responding → next ordinary message inserted into the running turn — ✅ wire-proven end to end: head delivers exactly 1 mid-turn request with the message body to the scripted daemon; base delivers 0.
  4. Forwarded slash commands blocked while Goal unknown/active — ✅ ChatPane blocks a forwarded slash command while Goal state is hydrating (idle|responding) + App does not enqueue a forwarded command while Goal state is hydrating + 4× refuses an enqueue-style … while a Goal owns the session. /goal itself stays usable while blocked (handled before the gate in both App and ChatPane — the user can still pause/clear).
  5. Retry hidden during another turn; stale retry callback cannot re-submit⚠️ partially pinned: visibility is pinned (matrix rows M4/M5/M6), but the failed-prompt stale-callback assertion races its own async chain — see Finding 1.

Mutation matrix (vacuity check, head tree)

12 surgical guard reverts plus one positive control, each run against its targeted tests (harness/mutate.mjs, logs in logs/, 04-mutation-matrix.png):

Mutant Guard reverted Result Tests turned red
M1 App: ordinary messages consult goalBlocked again killed 3 (idle-hydration send, active-Goal send, allocated-session Goal window)
M2 ChatPane: coarse gate reverted to base shape killed 4 (2 ordinary sends + 2 slash blocks)
M3 ChatPane: only the slash-command Goal early return removed killed 2 slash-block cases — clean attribution within M2's set
M4 handleRetry stale-callback guard removed killed turn-error retry test
M5 retry-hint visibility (!sessionHasActivePrompt) removed killed turn-error retry test
M6 failedPromptMessageId visibility condition removed killed failed-prompt retry test
M7a/M7b queuedPromptStreamingState promotion removed (App / ChatPane) killed first-stream-event test / Insert-affordance + pane twin
M8 streamingStateRef assignment moved back to useEffect killed inserts a prompt when the session becomes active before effects run
M9 Goal-specific toast ternary removed killed 7 toast tests
M10 enqueueBlockedCommand Goal guard removed killed 6 refuse-enqueue tests
M11 handleFailedPromptRetry activity guard removed SURVIVED shipped test (508/508 green) — adjudicated below
C1 positive control: mid-turn enqueue disabled killed proves the harness catches regressions on long-pinned behavior

No vacuous new tests: every guard except M11's is pinned by the test the commit says pins it, and M11's guard is pinned once the test oracle is fixed (Finding 1). The layered retry guards (M4/M5/M6) each fail the shared target test on their own assertion (callback no-op / hint hidden / failed-prompt button hidden), so no layer masks another — no combination row needed.

Findings

1. [Suggestion] The failed-prompt stale-retry assertion races its async chain — it pins nothing today; one-line test fix (verified)

App.test.tsxmarks and retries a failed prompt while an active Goal is known captures onRetryFailedPrompt, flips sessionHasActivePrompt = true, asserts the button disappears (pinned, M6), then invokes the stale callback and asserts no second send:

act(() => staleRetry?.());
expect(mockSessionActions.sendPrompt).toHaveBeenCalledTimes(1);

Measurement:

  • Removing the guard this assertion exists to protect (handleFailedPromptRetry's streamingStateRef.current !== 'idle' || sessionHasActivePromptRef.current, mutant M11) leaves the entire 508-test suite green — the shipped assertion never observes the resend, because handleFailedPromptRetry is synchronous but the resend runs through the async sendPrompt chain, and the assertion lands before it reaches sessionActions.sendPrompt.
  • Same mutant + strengthened oracle → red: expected "spy" to be called 1 times, but got 2 times — i.e. without the guard the stale callback genuinely re-submits the failed prompt into a session whose daemon prompt is active (a duplicate send).
  • Unmutated head + strengthened oracle → green. The fix is proven behavior-preserving and pins the axis:
await act(async () => {
  staleRetry?.();
  await flush();
});

The production guard is correct and load-bearing; only the test is defective. Contrast: the sibling handleRetry guard (M4) is properly pinned by its test. Severity is Suggestion rather than blocker because the shipping code is right; the risk is a future regression silently passing this suite. Suggested location: packages/web-shell/client/App.test.tsx (the stale-retry block of that one test).

Observation (no action requested)

useQueuedPrompts's holdQueuedPromptsLocally machinery now has no production caller passing true (both App and ChatPane stopped passing it; only the hook's own midTurnReconcile tests exercise it, 88/88 green). This reads as deliberate API retention — flagging only so the author can confirm whether a follow-up cleanup is intended.

Not covered

  • Per-commit attribution: depth-2 checkout; git rev-list HEAD^1..HEAD^2 returns 1 (graft boundary) vs 8 commits in the metadata snapshot — only the aggregate HEAD^1..HEAD diff was exercised.
  • Runtime Goal-ownership semantics ("submission during a running Goal turn is drained", "late insert promoted to the next Goal turn", "idle submission under an active Goal becomes a user-origin Goal turn"): daemon/runtime behavior, untouched by this PR's diff; the e2e harness's scripted daemon verifies the client's wire shape only.
  • Manual-browser hydration window (Reviewer Test Plan step 1 in a literal browser): covered at unit level with mocked catalog hooks; the e2e spec has no hydrating-goalState scenario, so no browser-level witness of the original bug's exact window was produced.
  • Base A/A for the dev harness: not needed — both arms boot the identical vite+daemon stack and the first e2e test passes on both; the base red is a wire-shape reproduction through the real loopback path, not an environment artifact.
  • Remaining web-shell suites beyond the touched files (full-workspace run not performed — targeted gates per the affected files plus the adjacent hook suite); visuals/mobile playwright projects; the PR's macOS-only manual testing.
  • No injection-style instructions were present in the PR metadata; none to report.

Methodology

Single container (node v22.23.2), merge-ref checkout of refs/pull/9667/merge with npm ci + npm run build pre-run. A/B: git worktree add tmp/base-tree HEAD^1, head test files copied in, nested node_modules symlinked (lockfile untouched by the PR); internal dependency realpaths verified (@qwen-code/sdk, @qwen-code/webui → unchanged packages). Mutation matrix in a second HEAD worktree (harness/mutate.mjs): each mutant applied by exact unique-string replacement, targeted vitest run, file restored, git diff --stat confirmed clean after every run; full-suite adjudication for the M11 survivor and a flush-strengthened oracle probe in both directions. E2e: playwright 1.61.1 with chromium headless shell installed in-container, vite dev server + the repo's scripted-daemon harness (createWebShellDaemonScenario), asserting both wire sides (promptRequests, midTurnRequests bodies). Image evidence via scripts/verify-capture.mjs. Raw logs: logs/*.log (per-mutant), logs/base-app-run.log, logs/base-app-junit.xml, logs/mutation-results.json; harnesses in harness/.

Flakiness gate log

e2e suite, out of gate scope: packages/web-shell/client/e2e/web-shell.goal.spec.ts
rounds=5 files=2 skipped=1
file packages/web-shell/client/App.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/App.test.tsx
file packages/web-shell/client/components/ChatPane.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/ChatPane.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/web-shell/client/App.test.tsx: PPPPP
  packages/web-shell/client/components/ChatPane.test.tsx: PPPPP

verdict: pass
summary: 2 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/ChatPane.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/ChatPane.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/ChatPane.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/ChatPane.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/ChatPane.test.tsx: P (exit 0)

Evidence images

01-head-unit-green

02-ab-chatpane-base-red

03-ab-app-base-red

04-mutation-matrix

05-e2e-head-green

06-ab-e2e-base-red

07-base-e2e-failure-screenshot

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

Qwen Code · sandboxed verification

@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. ✅

@chiga0 chiga0 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.

Scope: Ordinary-message routing + Goal gate separation in App.tsx and ChatPane.tsx.

CI: ubuntu-latest Test ✅ · E2E Smoke ✅ · Visual regression ✅. Windows/macOS tests not run; no platform-dependent code in this diff.

Core logic checked:

  • Ordinary messages now gate on sessionActive = streamingState !== 'idle' || sessionHasActivePromptRef.current — Goal state is no longer a barrier. Verified both App.tsx (~line 9986) and ChatPane.tsx (~line 815) follow this consistently.
  • Slash commands gate on commandBlocked = sessionActive || goalBlocked in App.tsx; ChatPane gates them with a direct isGoalGateBlocked check and returns false silently (confirmed R4-1 — not a regression; old ChatPane behavior was also silent for this case).
  • holdQueuedPromptsLocally fully removed from App.tsx at head; replaced by queuedPromptStreamingState synthesizing 'responding' during Goal-active/session-idle window. Queued prompts now show Insert rather than a local hold.
  • streamingStateRef update moved from useEffect to synchronous render assignment — correct pattern for a ref that mirrors state.
  • Retry UI (showCurrentRetryHint, failedPromptMessageId) hidden when sessionHasActivePrompt — matches PR description's stated intent.
  • E2E smoke test rewritten to match new routing semantics: submit after assistantTextEvent fires (turn actually running) and assert mid-turn insertion.

No blockers. Existing CI bot round-4 suggestions (R4-1/R4-2/R4-3/R2-2) are all test-coverage improvements, none structural.

Reviewed with AI assistance.

@doudouOUC doudouOUC 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.

审查结果:无新阻塞项

对 PR #9667 的完整审查已完成。该 PR 已通过多个审查轮次,最新的 qwen-code-ci-bot 已 APPROVE。

验证结果

  • 现有 3 个 blocker 线程

    1. isGoalGateBlocked() 从 retry 路径移除 — 已在 71056e284a 补充 active Goal 覆盖测试(thread 3831225116,作者已回复)
    2. ChatPane 命令门仅测试 hydrating 场景 — 已在 71056e284a 扩展为 idle/responding 两种 streaming state(thread 3831179663,作者已回复)
    3. commandBlocked 分支测试覆盖不全 — 已在 d72a093f 补充四个 enqueue 站点的 it.each 测试(thread 3834665229,未回复但已修复)
  • 代码审查要点

    • queuedPromptStreamingState 公式正确:streamingState === 'idle' && sessionHasActivePrompt ? 'responding' : streamingState
    • sessionHasActivePromptRef 同步更新(非 useEffect),避免回调闭包过期
    • enqueueBlockedCommand 正确区分 Goal 阻塞(toast)与会话活跃(入队)
    • blockCommand 根据 isGoalGateBlocked() 显示差异化 toast
    • handleRetry 移除 isGoalGateBlocked(),改用 sessionHasActivePromptRef.current — 设计正确
    • goalGate.ts JSDoc 准确反映收窄后的作用域
  • 未发现新 Critical 问题。代码变更设计合理,测试覆盖充分。

仍需跟踪的已记录建议(非阻塞)

  • ChatPane 命令门在 Goal 阻塞时无 toast 提示(thread 3835642174)
  • commandBlocked 测试仅在 2/5+ 命令站点覆盖(thread 3834665229)
  • retry 门的 streaming state 半分支未测试(thread 3835642183)
  • queue.commandBlocked toast 字符串未被任何测试断言(thread 3834950588)

Reviewed by Qwen Code

@ytahdn
ytahdn added this pull request to the merge queue Aug 22, 2026
@wenshao

wenshao commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

Re-verification of 2bf1f50 (adds 54a075f + c5573a9)

Same rig as before, rebuilt on the new SHAs: one real qwen serve daemon from the PR tree, two Vite arms against it (PR head 2bf1f50 on :5324, merge base main 6bbb273 on :5325), a local provider with controllable time-to-first-token and abort accounting, Playwright driving both.

Result: the gap I reported is genuinely closed for the wide case, and items 1–4 reproduce unchanged. I did find one new way to lose a user message, and one residual window.

# Item Status on 2bf1f50
1 Idle session, Goal read in flight ✅ unchanged (+336 ms vs main +12 149 ms)
2 Slash command in the hydration window ✅ unchanged (toast, text preserved, 0 × POST /prompt)
3 Ordinary message during a streaming Goal turn ✅ unchanged (1 × POST /mid-turn-message)
4 Failed-send retry during a Goal turn ✅ unchanged (withdrawn while busy, restored when idle)
5 Pre-first-token preemption fixed
6 Dead holdQueuedPromptsLocally option ➖ still there
7 Message dropped when the live-state read is stale at turn end ⚠️ new
8 Residual preemption window ≈ one live-state poll at turn start ⚠️ new (narrowed, not closed)

Gates on 2bf1f50

packages/web-shell vitest 4097 passed / 195 files, 0 failed · tsc --noEmit clean · eslint clean on the changed files · web-shell.goal.spec.ts 2 passed · PR test files against main source: 24 failed / 620 (was 19 — the new active-prompt cases are non-vacuous too).


5. Fixed ✅

Same probe as before: a Goal turn that emits no token for 40 s. The composer now reads esc to cancel in that window, the message takes POST /mid-turn-message, and the provider ledger shows the in-flight Goal turn is not aborted.

pre-first-token window, fixed


7. ⚠️ New: a message can be dropped when the live-state read is stale at turn end

Repro. Delay GET /workspaces/:cwd/sessions/live-state by 5 s (models a slow or queued live-state read), run a turn, poll GET /session/:id/status until the daemon reports hasActivePrompt: false, then submit an ordinary message ~0.26 s later.

main PR 2bf1f50
Route POST /prompt POST /mid-turn-message
Daemon answer 202 HTTP 200 {"accepted": false}
Reached the model yes no
In the transcript yes no
Left in the queue / composer no — gone
User sees nothing toast: “Daemon rejected mid-turn message”

message dropped at turn end

Cause. useQueuedPrompts already has the right fallback for a rejected insert:

if (!result.accepted) {
  
  // "If the turn has meanwhile ended, send the message through the ordinary
  //  path … instead of dropping it."
  if (targetIsCurrent() && latestStreamingStateRef.current === 'idle') {  re-send  }
  // else: drop the row, reconcile, reportError('Daemon rejected mid-turn message')
}

latestStreamingStateRef is fed by the hook's streamingState option, and 54a075f now supplies the inflated queuedPromptStreamingState. Inside the stale window it reads 'responding', so the fallback is skipped and the else branch discards the message. Suggested fix: hand the hook the raw streamingState for that fallback (or pass raw and effective separately) so accepted:false still falls back to a direct send when the session is genuinely idle.

Reachability. With a local daemon answering live-state in <1 ms I could not hit it naturally — 5/5 attempts submitting 108–328 ms after the daemon reported turn end routed correctly, because turnCompletedrecordSessionActivity settles fast. It needs a slow/queued live-state response. Worth noting though that when live-state is enabled turnCompleted deliberately does not patch hasActivePrompt: false (only recordSessionActivity), so there is no optimistic clear — a slow read is the only ingredient needed, and the drop is silent apart from an error toast.

8. ⚠️ Residual: the turn-start window is now one live-state poll, not zero

SESSION_LIVE_STATE_POLL_MS = 2000, and the optimistic hasActivePrompt: true patch in promptAdmitted only fires for client-initiated prompts — a Goal turn gets no such patch, so at Goal-turn start the client depends entirely on the next poll. With a Goal turn that emits no token for 20 s, resuming a parked Goal and submitting after N ms:

submit at route in-flight Goal turn
+0.50 s POST /prompt aborted, 0 tokens delivered
+1.20 s POST /prompt aborted, 0 tokens delivered
+2.04 s POST /mid-turn-message intact
+3.15 s POST /mid-turn-message intact

So the exposure went from “the whole time-to-first-token” to “up to one 2 s poll after a Goal turn starts”. Much better; your call whether that is small enough to leave, or whether the Goal runtime should publish turn start the way promptAdmitted does.

c5573a9 (settings commands during active prompts)

Its two new cases (blocks fast-model selection / settings language change before the first stream event reaches the client) both fail against main source, so they are non-vacuous. I did not drive the Settings panel's fast-model and language pickers in the real browser — that path is unit-test-only in this report.

Not covered

Images/attachments through the same routing · multi-client and channel-origin sessions · Windows/Linux.

中文版报告

2bf1f50 的复验(新增 54a075f + c5573a9

沿用同一套栈并在新 SHA 上重建:一个从 PR 源码起的真实 qwen serve daemon,两个 Vite 前端指向它(PR head 2bf1f50:5324,merge base main 6bbb273:5325),本地 provider 可控首 token 延迟并记录请求是否被 abort,Playwright 同时驱动两条腿。

结论:我上次报的缺口在主要场景下确实已修复,1–4 项复现一致无回归。但发现了一条新的消息丢失路径,以及一个残留窗口。

# 项目 2bf1f50 上的状态
1 空闲会话、Goal 查询在途 ✅ 一致(+336 msmain+12 149 ms
2 hydration 窗口内的 slash 命令 ✅ 一致(toast、文本保留、0 次 POST /prompt
3 Goal turn 流式期间的普通消息 ✅ 一致(1 次 POST /mid-turn-message
4 Goal turn 期间的失败重发入口 ✅ 一致(忙时收起,空闲后恢复)
5 首 token 之前的抢占 已修复
6 无调用方的 holdQueuedPromptsLocally ➖ 仍在
7 turn 结束时 live-state 陈旧会丢消息 ⚠️ 新增
8 turn 开始处残留约一个 live-state 轮询的抢占窗口 ⚠️ 新增(收窄但未关闭)

2bf1f50 上的各项门

packages/web-shell vitest 4097 通过 / 195 个文件,0 失败 · tsc --noEmit 干净 · 改动文件 eslint 干净 · web-shell.goal.spec.ts 2 通过 · 把 PR 的测试文件放到 main 源码上跑:24 失败 / 620(此前为 19,说明新增的 active-prompt 用例同样非空洞)。


5. 已修复 ✅

同一个探针:Goal turn 在 40 秒内不产出任何 token。现在这个窗口里输入框显示 esc to cancel,消息走 POST /mid-turn-message,provider 台账显示在途的 Goal turn 没有被 abort。

7. ⚠️ 新增:turn 结束时 live-state 陈旧会导致消息被丢弃

复现:把 GET /workspaces/:cwd/sessions/live-state 延迟 5 秒(模拟一次缓慢或排队的 live-state 读),跑一个 turn,轮询 GET /session/:id/status 直到 daemon 报 hasActivePrompt: false,随后约 0.26 秒提交一条普通消息。

main PR 2bf1f50
路由 POST /prompt POST /mid-turn-message
daemon 应答 202 HTTP 200 {"accepted": false}
是否到达模型
是否进入转录
是否留在队列/输入框 —— 已消失
用户看到 toast:“Daemon rejected mid-turn message”

成因useQueuedPrompts 本来就有针对插入被拒的兜底:

if (!result.accepted) {
  
  // “若此时 turn 已结束,就改走普通发送路径……而不是丢弃它。”
  if (targetIsCurrent() && latestStreamingStateRef.current === 'idle') {  重发  }
  // 否则:删掉该行、reconcile、reportError('Daemon rejected mid-turn message')
}

latestStreamingStateRef 来自该 hook 的 streamingState 入参,而 54a075f 现在传入的是被抬高的 queuedPromptStreamingState。在陈旧窗口里它读到 'responding',于是兜底被跳过,走到 else 分支把消息丢掉。建议修法:这条兜底改用原始 streamingState(或把 raw 与 effective 分别传入),使得会话真正空闲时 accepted:false 仍能回落到直接发送。

可达性:本地 daemon 的 live-state 响应不到 1 ms,自然情况下我复现不出来 —— 在 daemon 报 turn 结束后 108–328 ms 提交的 5 次尝试全部路由正确,因为 turnCompletedrecordSessionActivity 收敛很快。它需要一次缓慢/排队的 live-state 响应。但要注意:启用 live-state 时 turnCompleted 刻意不hasActivePrompt: false 的乐观补丁(只做 recordSessionActivity),所以客户端没有乐观清零,只要读变慢就足以触发,而丢弃过程除了一条错误 toast 之外是无声的。

8. ⚠️ 残留:turn 开始处的窗口变成了一个 live-state 轮询周期

SESSION_LIVE_STATE_POLL_MS = 2000,而 promptAdmitted 里那次 hasActivePrompt: true 的乐观补丁只对客户端发起的 prompt 生效 —— Goal turn 没有这个补丁,因此 Goal turn 启动时客户端完全依赖下一次轮询。让 Goal turn 在 20 秒内不产出 token,resume 一个已 park 的 Goal,然后在 N 毫秒后提交:

提交时刻 路由 在途 Goal turn
+0.50 s POST /prompt 被 abort,0 token
+1.20 s POST /prompt 被 abort,0 token
+2.04 s POST /mid-turn-message 完好
+3.15 s POST /mid-turn-message 完好

也就是说暴露面从「整个首 token 延迟」缩到了「Goal turn 启动后最多一个 2 秒轮询」。改善很大;是否可以就这样保留,还是应当让 Goal 运行时像 promptAdmitted 那样主动发布 turn 启动,由你判断。

c5573a9(活跃 prompt 期间拦截设置类命令)

它新增的两个用例(blocks fast-model selection / settings language change before the first stream event reaches the client)在 main 源码上都会失败,因此非空洞。我没有在真实浏览器里驱动设置面板的 fast-model 与语言选择器 —— 这条路径在本报告中仅由单测覆盖。

未覆盖

图片/附件走同一路由 · 多客户端与 channel 来源的会话 · Windows / Linux。

Merged via the queue into main with commit 3260890 Aug 22, 2026
134 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.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