Skip to content

fix(vscode): restore native diff approval after WebShell cutover - #10534

Merged
yiliang114 merged 25 commits into
mainfrom
codex/vscode-webshell-diff-approval
Aug 31, 2026
Merged

fix(vscode): restore native diff approval after WebShell cutover#10534
yiliang114 merged 25 commits into
mainfrom
codex/vscode-webshell-diff-approval

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

What this PR does

This restores the native VS Code Diff approval flow after #9811 moved tool permissions from the legacy ACP-backed UI to WebShell.

When a WebShell Edit permission opens a native VS Code diff, the editor's Accept and Reject commands now resolve the corresponding WebShell permission as allow once or reject. The bridge is active only while an unresolved file-diff permission exists, clears its state across session and panel lifecycle changes, and preserves the legacy ACP fallback.

Pending Edit tools remain as compact transcript rows while approval is required instead of opening a duplicate or empty detail card. Their running timer also pauses while waiting for the user's decision. The WebShell permission card remains available for choices such as Allow All Edits.

Why it's needed

After the WebShell daemon cutover, the native Diff commands still targeted the legacy ACP permission resolver. Accepting or rejecting the editor diff could therefore close the diff without unblocking the WebShell-owned permission request.

Reviewer Test Plan

How to verify

  1. Start the VS Code companion in Ask Approval mode and request an Edit that opens a native diff.
  2. Confirm the transcript shows one compact Edit row and the WebShell permission card, without an empty expanded Edit card or an increasing elapsed timer.
  3. Accept the change from the native Diff editor and confirm the permission resolves, the edit is applied, and the agent continues.
  4. Repeat with Reject and confirm the permission is rejected and the agent continues without applying the edit.
  5. Repeat after switching sessions to confirm a stale permission is not resolved.

Evidence (Before & After)

The final real-host screenshot pass has not been run yet. Evidence will be added after installing a VSIX built from this branch.

Tested on

OS Status
🍏 macOS ⚠️ Not manually tested
🪟 Windows ⚠️ Not manually tested
🐧 Linux ⚠️ Not manually tested

Risk & Scope

  • The WebShell host API is optional, so existing WebShell consumers keep their current behavior.
  • Native commands are forwarded only for unresolved WebShell permissions that contain a file diff.
  • Ask User Question and non-diff permissions are not handled by this bridge.
  • No build or automated test suite was run locally.

Linked Issues

Follow-up to #9811.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-ci-bot

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

Screenshots · before / after

terminal-turn-error-copy-narrow-dark before/after

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 30, 2026

Copy link
Copy Markdown
Collaborator

Re-run on unchanged head 4fee90a — gate results stand; CI has settled since the last pass (details in Stage 2).

  • Template ✓ — all required headings present.
  • Problem: observed, not theoretical — the native VS Code diff Accept/Reject flow stopped resolving WebShell-owned permissions after the refactor(vscode-ide-companion): migrate chat to WebShell and qwen serve #9811 cutover; the author's real-host E2E reports in this thread document both the broken flow and the fix.
  • Direction: aligned — restores a regression in the IDE integration surface qwen-code already ships; no new product surface.
  • Size: cross-package (vscode-ide-companion + web-shell + one cli test file) → the two-tier core gate applies. Breakdown of the 1724 changed lines: 738 production / 986 test (no generated/schema files). fix type → no hard block, but 500+ production lines means maintainer awareness — flagged here, and per policy the final call on this PR defers to a maintainer instead of a bot approval.
  • Approach: scope is wider than a typical fix (host ↔ webview ↔ web-shell bridge), but each review round traded findings for pinned tests, which is why the test side is larger than the production side. The round-3 Critical (R3-1, bound-vote gate rejected non-edit tools with structured diffs) is what 4fee90a addresses. The 15 suggestion-level findings the author deferred under a self-imposed scope fuse are itemized in my Stage 3 comment for the maintainer.
  • Risk: no high-risk path matches (revert-correlation list). CI on this head has now settled: the unit leg, web-shell E2E smoke, and coverage are green; the only non-green leg (Real daemon E2E / Java 11) cancelled inside Install Node.js dependencies — the same infra install-hang pattern seen on earlier heads, not PR-caused.

Moving on to code review. 🔍

中文说明

在相同 head 4fee90a 上重新运行——门禁结论不变;上次通过后 CI 已出结果(详见 Stage 2)。

  • 模板 ✓ —— 必需标题齐全。
  • 问题:真实观测到的回归 —— refactor(vscode-ide-companion): migrate chat to WebShell and qwen serve #9811 切换后,VS Code 原生 diff 的 Accept/Reject 不再解析 WebShell 持有的权限请求;本帖中作者的真机 E2E 报告记录了问题与修复。
  • 方向:对齐 —— 修复 qwen-code 已有 IDE 集成功能的回归,不新增产品面。
  • 规模:跨包(vscode-ide-companion + web-shell + 一个 cli 测试文件)→ 适用两层核心门禁。1724 行改动拆分:738 行生产 / 986 行测试(无生成/schema 文件)。fix 类型 → 不硬拦截,但 500+ 生产行需维护者知悉——在此标记;按策略本 PR 的最终决定转交维护者,而非机器人直接批准。
  • 方案:范围比一般 fix 大(host ↔ webview ↔ web-shell 桥接),但每轮评审都以带固定测试的修复回应,因此测试侧大于生产侧。第三轮 Critical(R3-1:绑定投票门禁误拒带结构化 diff 的非 edit 工具)正是 4fee90a 所修复。作者按自设范围熔断推迟的 15 条建议级发现已在 Stage 3 评论中逐条列出供维护者参考。
  • 风险:未命中高风险路径(revert 相关列表)。该 head 的 CI 已出结果:单测腿、web-shell E2E smoke、覆盖率均绿;唯一非绿腿(Real daemon E2E / Java 11)在 Install Node.js dependencies 步骤被取消——与早前 head 相同的 npm install 卡死基础设施形态,非本 PR 引起。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Independent proposal first: bind each native diff to the pending permission request id that opened it, gate qwen.diff.accept/cancel so a bound diff forwards the decision only to the owning webview (validated at every hop), fail closed everywhere else, and keep the legacy ACP path untouched as fallback.

The PR matches that proposal hop for hop, and adds two things I would have wanted only after being burned once: approval diffs open read-only (the approving tool applies its own content — an editable right side would silently discard user edits), and the read-only/writability bit participates in diff dedupe/focus matching so a writable twin can never be refocused for a read-only approval. I re-read the full diff at this head for this re-run, including the vote fan-out over getPermissionAwareProviders() (only WebViewProvider instances populate that registry, and each one's bound branch early-returns unless it owns the exact request id — no cross-provider or cross-session vote path), and found nothing new.

What I verified at this head:

  • The round-3 Critical (R3-1) is fixed by 4fee90a and the fix is the right shape. The bound-vote gate in respondToPendingPermission no longer requires the request to be edit-kind; it requires the exact pending request id, hostOwnsEditDiffPreview, and hasDiffPreview === true. Diff previews are kind-agnostic (hasPermissionDiffPreview scans for a diff content block on any tool), so the old kind check made structured edits (e.g. a run_shell_command carrying a diff block) fail closed. Exact-id binding is the stronger guarantee anyway. The test was retargeted to a run_shell_command/execute permission with a diff block and still asserts allow_once.
  • No privilege widening in the fix: host-relayed votes can only submit allow_once/reject_once (the bound path has no fallback ladder, never allow_always); ask-user permissions stay excluded; the card path keeps its own ladder. isEditToolPermission is not orphaned — the auto-edit-mode auto-approval path still uses it, which is the one place kind correctly matters.
  • Decision chain: native Accept/Reject → getPermissionRequestId on the managed diff → provider finds the owner webview by exact request id → webShellPermissionDecision → webview re-checks event.source === window.parent and that the id is still the current pending one → web-shell re-checks the id against its own pending state. Every hop validates; dropped votes surface a "vote not applied" notice instead of dying silently. Permission-bound diffs skip the legacy accept/cancel handling; unbound diffs and no-context votes keep legacy behavior and fail closed when only a WebShell permission is pending.
  • Lifecycle: owner entries clear on resolve, session change, re-bootstrap, view dispose, and panel dispose; closeDiff is request-id-scoped with a backward-compatible "match any" when undefined.

Nothing new blocks. The 15 suggestion-level findings from round 3 (test witnesses for the request-id hops, plus three behavioral nits — latch reset across cycles, SplitView pane not receiving the flag which fails closed, and the host file-open handoff skipping the stat() guard which only degrades an error dialog) were deliberately deferred by the author under a scope fuse and are itemized in my Stage 3 comment. One deferred probe still stands at this head: isEditToolName omits notebook_edit, so the transcript row lock never engages for that tool even though its native vote now works — a cosmetic mismatch, not a correctness gap.

sequenceDiagram
    participant U as User
    participant C as qwen.diff.accept command
    participant H as WebViewProvider
    participant W as Webview EmbeddedApp
    participant S as Web Shell App
    U->>C: Accept or Reject in native diff
    C->>H: respondToPendingPermission (fromDiffEditor, requestId)
    H->>H: find owner webview by exact requestId
    H->>W: webShellPermissionDecision
    W->>W: check source is parent and requestId is current
    W->>S: respondToPendingPermission (requestId, decision)
    S->>S: exact-id gate, then submit allow_once or reject_once
Loading
Files changed (23)
File What changed
packages/vscode-ide-companion/src/diff-manager.ts showDiff options carry readOnly plus permissionRequestId; dedupe and focus match on both; writable-in-session unlock skipped for read-only
packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts webview-to-requestId owner map; relays diff-editor votes to the matching webview; hasPendingPermission unions web-shell and legacy state
packages/vscode-ide-companion/src/extension.ts accept and cancel commands resolve the bound request id and route between web-shell relay and legacy paths
packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx posts openDiff, closeDiff and permission-state with requestId; receives host decisions with source and id validation; surfaces unapplied votes
packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.ts openDiff maps web-shell source to readOnly and forwards requestId
packages/vscode-ide-companion/src/commands/index.ts showDiff and closeDiff commands take the options object with the new fields
packages/vscode-ide-companion/src/webview/strings.ts vote-not-applied notice string
packages/web-shell/client/App.tsx bound-vote gate in respondToPendingPermission (the 4fee90a change removes the edit-kind condition)
packages/web-shell/client/adapters/transcriptAdapter.ts computes hasDiffPreview from diff content blocks
packages/web-shell/client/adapters/types.ts hasDiffPreview on the approval type
packages/web-shell/client/components/messages/ToolGroup.tsx pending-edit lock keeps the row compact and pauses the timer
packages/web-shell/client/components/messages/tools/SubAgentPanel.tsx plumbs the approval lock into sub-agent rows
packages/web-shell/client/components/messages/tools/ParallelAgentsGroup.tsx same plumbing for parallel agent rows
packages/web-shell/client/customization.tsx hostOwnsEditDiffPreview customization flag
packages/cli/src/acp-integration/session/permissionUtils.test.ts pins the option ladder used by native votes
…and 8 more test files coverage for each hop of the chain above

Test evidence

CI on 4fee90a has settled since the last pass — this is the same CI run the earlier red legs belonged to; on re-run the unit leg, the web-shell E2E smoke, and coverage all came back green:

  • Test (ubuntu-latest, Node 22.x) — ✅ success (the leg that earlier hit the 90-minute job timeout under runner saturation).
  • web-shell E2E Smoke (ubuntu-latest, Node 22.x) — ✅ success (earlier failed on a runner where no Playwright browser would launch).
  • Post Coverage Comment (ubuntu-latest, 22.x) — ✅ success; Integration Tests (no-AK, No Sandbox) and Capture web-shell visuals also green.
  • Real daemon E2E / Java 11 — 🚫 cancelled, again inside the Install Node.js dependencies step (~31 min hung before cancellation). Same infra install-hang pattern already attributed to the environment on earlier heads; this PR touches no daemon/Java surface, and the main ruleset has no required-status-checks rule, so this leg does not gate merge — re-run it if you want the signal.
  • Skipped legs (macOS/Windows unit, CLI-sandbox integration) are conditional and not required.

Sandboxed verification: round 5 passed on exactly this head — 31/31 scripted assertions, flakiness gate green (9 changed test files × 5 rounds, no divergence), the A/B central claim green at head against a red base (respondToPendingPermission absent pre-PR), and delta-isolation mutants confirming the new structured-content → hasDiffPreview link is load-bearing (M-D1/M-D3/M-C1 all killed). All round-4 blocker findings re-confirmed fixed at the new head; S1/S2 stand as disclosed non-blocking. A fresh round triggered by this re-run is running (run 33378853764) and will post its report here — it re-verifies the same head, so treat it as confirmation rather than a missing piece.

Final CI results for 4fee90a (auto-updated by the triage finalize job after CI completed):

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

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

The central behavioural claim is now substantiated at this exact head by the round-5 verification (A/B flip plus mutant kills), which is stronger evidence than the unit suite alone; the still-running round re-confirms it. The author's real-host E2E reports earlier in this thread remain the author's claim, not independently re-run here.

中文说明

代码审查

独立方案:把每个原生 diff 绑定到打开它的权限请求 id,在 accept/cancel 命令处设门禁,只把决定转发给持有该 id 的 webview,逐跳校验、处处失败即关闭,并保留旧 ACP 路径作为回退。本 PR 与之一致,且额外做对了两件事:审批 diff 以只读打开(审批工具自带内容,可编辑侧会悄悄丢弃用户输入);只读/可写位参与 diff 去重与聚焦匹配,避免只读审批复用可写孪生体。本次重跑重新通读了该 head 的全部 diff(含对 getPermissionAwareProviders() 投票扇出的核查:注册表仅含 WebViewProvider 实例,且各自的绑定分支在 non-exact-id 时提前返回,无跨 provider/跨会话投票路径),无新发现。

第三轮 Critical(R3-1)已由 4fee90a 正确修复且形态正确:绑定投票门禁不再要求 edit 类型,改为精确请求 id + hostOwnsEditDiffPreview + hasDiffPreview === true。修复未放宽权限:绑定路径只能提交 allow_once/reject_once,无回退梯子,绝不 allow_always;ask-user 仍被排除。决定链每一跳都校验,未生效的投票有可见提示;生命周期在各环节(含 view dispose 与面板销毁)清理。无新增阻塞项。15 条建议级发现由作者按范围熔断推迟,详见 Stage 3;isEditToolNamenotebook_edit 的探针在本 head 依然存在(仅表现层不一致)。

测试证据

4fee90a 的 CI 已出结果:单测腿(此前因 runner 饱和触发 90 分钟超时)、web-shell E2E smoke(此前 runner 浏览器全部启动失败)、覆盖率均转绿。唯一非绿腿 Real daemon E2E / Java 11 再次卡在 Install Node.js dependencies(约 31 分钟后取消)——与早前 head 相同的基础设施安装卡死形态;本 PR 不触碰 daemon/Java 面,且 main 规则集无必需状态检查规则,该腿不构成合并门禁,如需信号可重跑。沙箱验证第五轮已在完全相同的 head 通过(31/31 断言、抖动门绿、A/B 中心主张 head 绿 base 红、delta 突变体全部被杀),此前各轮 Blocker 均复证已修复;本次重跑触发的新一轮验证正在运行(run 33378853764),是对同一 head 的复核而非缺失证据。作者的真机 E2E 报告仍为作者自述,未在此独立复跑。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — clean review with no blocking findings at this head; the score is capped by policy, not by doubt — cross-package scope means a maintainer makes the final call, not this bot.

Stepping back: this PR went through three review rounds, three sandboxed verifications, and a real-host regression report from its own author, and came out the other side with every Critical fixed and pinned. The 4fee90a commit is exactly the fix round 3's Critical asked for — one gate condition removed, one test retargeted — and my re-read of the full diff this pass confirms it neither widens privilege nor orphans the helper it stopped calling. The decision chain validates at every hop and fails closed at each one of them. If I had to maintain this in six months, the request-id binding and the read-only-diff invariants are documented where they live; I'd thank the author, not curse them.

What has changed since my last pass — two of the three inputs I asked for are now in:

  1. CI on this head has settled green. The unit leg, web-shell E2E smoke, and coverage all passed in the same run that earlier produced the red infra legs. The only non-green leg (Real daemon E2E / Java 11) cancelled inside npm install — the recurring infra hang — and the main ruleset has no required-status-checks rule, so nothing gates on it.
  2. Sandboxed verification passed on exactly this head (round 5: 31/31 assertions, flakiness gate green, A/B central claim green against a red base, delta mutants killed). A fresh round triggered by this re-run is still running and will post here; it re-verifies the same head.

What keeps this at a defer rather than an approval:

  1. Policy: the change spans three packages with 738 production lines, which the two-tier core gate escalates to maintainer awareness. That cap applies regardless of how clean the stages looked — hence 3/5 without real doubt behind it.
  2. Fifteen suggestion-level findings were deliberately deferred under the author's scope fuse. None has a mis-resolution path and the behavioral ones fail closed or degrade only error UX, but they are the maintainer's to accept as follow-ups or to call back in:
  3. The standing CHANGES_REQUESTED reviews are stale artifacts of the /review rounds on earlier heads (0e1bada, 7ecdea9), not of this gate — triage found no blocking issue at 4fee90a, and the last /review pass explicitly said it downgraded from Approve only because CI was red at that moment; CI is green now. A maintainer will need to dismiss or re-run those reviews to unblock the merge.

Deferring to a maintainer for the merge call: weigh the deferred findings, clear the stale change-requests, and merge when satisfied — the technical evidence (review, CI, sandboxed A/B verification) is all in this thread and all green at 4fee90a.

中文说明

置信度:3/5 —— 本 head 审查干净、无阻塞项;分数是策略封顶而非真实疑虑:跨包规模意味着最终决定由维护者作出。

回顾整个过程:三轮评审、三次沙箱验证、作者本人的真机回归报告,所有 Critical 均已修复并带固定测试。4fee90a 正是第三轮 Critical 所要求的修复——删一个门禁条件、改一个测试目标——本次重跑重新通读全部 diff,确认其不放宽权限、不产生死代码。决定链逐跳校验、处处失败即关闭。

上次通过以来的变化——我要求的三项输入已到位两项:

  1. 本 head 的 CI 已出结果且为绿:单测腿、web-shell E2E smoke、覆盖率在同一次运行中通过;唯一非绿腿(Real daemon E2E / Java 11)再次卡在 npm install(反复出现的基础设施卡死),且 main 规则集无必需状态检查规则,不构成门禁。
  2. 沙箱验证已在完全相同的 head 通过(第五轮:31/31 断言、抖动门绿、A/B 中心主张 head 绿 base 红、delta 突变体被杀);本次重跑触发的新一轮验证正在运行,将发布在本帖,属同 head 复核。

转交维护者而非直接批准的原因:

  1. 策略:改动跨 3 个包、738 行生产代码,两层核心门禁要求维护者知悉并拍板;
  2. 15 条建议级发现按作者范围熔断推迟:均无误决议路径(行为类已验证失败即关闭或仅降级错误提示),由维护者决定随本 PR 处理还是作为后续跟进(明细见上文英文列表,另有跟踪 issue vscode: closing a web-shell permission diff tab leaves the approval row locked without a re-open path #10557refactor(web-shell): detect pending edit approvals via diff content-block signal instead of tool-name enumeration #10544);
  3. 现存的 CHANGES_REQUESTED 评审是早前 head(0e1bada7ecdea9/review 轮次的过期产物,不是本门禁的结论——triage 在 4fee90a 未发现阻塞问题,且最近一次 /review 已明言仅因当时 CI 红而从 Approve 降级;现 CI 已绿。需要维护者驳回或重跑那些评审以解除合并阻塞。

请维护者作出合并决定:权衡推迟的发现、清理过期 change-request,满意即可合并——技术证据(评审、CI、沙箱 A/B 验证)均已在本帖且在 4fee90a 全部为绿。

Qwen Code · qwen3.8-max

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not explored to full depth (tool budget reached): "agent 6c": end-to-end confirmation that a live VS Code daemon session actually reaches two concurrent unresolved permission blocks (workflow/agent-team subagents) — eviden…; "agent 6a": could not verify whether the daemon transcript can hold two concurrently unresolved permission blocks (background/subagent confirmation flow), which determines ….

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

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

Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx Outdated
Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx Outdated
Comment thread packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts Outdated
Comment thread packages/web-shell/client/components/messages/ToolGroup.tsx Outdated
Comment thread packages/web-shell/client/components/messages/ToolGroup.tsx Outdated
Comment thread packages/web-shell/client/components/messages/ToolGroup.tsx Outdated
Comment thread packages/web-shell/client/components/messages/ToolGroup.tsx Outdated
@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI attribution — run 33285925586 (head 0e1bada): all 3 red required legs NOT PR-caused (runner saturation).

  • Test (ubuntu-latest, Node 22.x) (job 99189592930): cancelled at the exact 1h job cap — annotation "exceeded the maximum execution time of 1h0m0s"; no failing test, no junit/coverage produced.
  • Integration Tests (no-AK) (job 99189592957): killed at its 30m cap.
  • web-shell E2E Smoke (job 99196688528): killed at its 20m cap; PR diff (+127/-9) is vscode-companion diff-approval wiring only, zero overlap.
  • Self-hosted ECS runner pool saturated ~24h; identical cap shapes are failing across unrelated PRs. Rerun triggered.

yiliang114 and others added 7 commits August 30, 2026 12:49
Sandboxed iframes inside the panel webview (MCP apps, artifact
previews) can postMessage to the webview window, and the
webShellPermissionDecision handler could not tell them apart from
extension-host messages. Accept only the platform-delivered shape
(event.source === null) so untrusted content cannot vote on pending
approvals, mirroring the existing event.source validation used for
daemon token messages in the web shell.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The web-shell approval bridge resolves the daemon permission with an
option id only; the edited right-hand content of a native diff is
consumed solely by the IDE-mode resolver (IdeClient.diffResponses),
which is not populated when IDE mode is off. An editable right side
therefore silently discarded anything the user typed before pressing
Accept. Diffs opened with source 'web-shell' are now passed through
showDiff with readOnly so the proposed side stays locked, while
IDE-mode diffs keep the existing writeable-in-session behavior.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The two-argument showDiff overload takes options where the
implementation expects the optional old-content string; widen the
implementation parameter and resolve the options object accordingly.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
qwen.diff.isVisible is also true on the user's original file while a
permission diff is open (originalFilePath match), and showDiff opens
with preserveFocus, so Ctrl+S or the check/cross title buttons on the
original file ran qwen.diff.accept/cancel and the vote loop resolved
the pending web-shell approval for an edit the user may never have
looked at. Pass the triggering document context into
respondToPendingPermission and only take the web-shell branch when the
trigger is a qwen-diff document; the legacy pendingPermissionResolve
vote path is unchanged.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
isEditToolName was the only is*ToolName helper that required callers
to pre-lowercase the name; the next caller following the sibling
convention and passing the raw wire name would silently never match,
leaving a pending edit row auto-expanding and expandable while its
native diff approval is outstanding. Normalize internally like the
rest of the family and pass the raw name at the call site.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
…iant comment

The expandability comment above ToolLine's expandable flag claimed content
never controls whether the user can open a row, which the pending-edit-
approval gating introduced in this PR falsifies. Extend the comment with
the exception so the stated invariant matches the code.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Pin the remaining R1-4 coverage: respondToPendingPermission must submit
the allow_once option (never allow_always) when an edit approval carries
both kinds, and toPermissionOptions must keep both kinds on edit
approvals with allow_always first in wire order — the arrangement that
makes the App-side kind preference the only guard against a single
native Accept escalating to "Allow All Edits". Swapping the kind ladder
turns the App test red (mutant-checked).

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

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

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

  • R1-5 duplicated tool-name enumeration — already reported (comment 3888422129); author filed follow-up issue 10544
  • R1-6 hand-enumerated pending-approval detection — already reported (comment 3888422120); author filed follow-up issue 10544

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

Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx Outdated
Comment thread packages/vscode-ide-companion/src/commands/index.ts
Comment thread packages/vscode-ide-companion/src/diff-manager.ts Outdated
Comment thread packages/web-shell/client/components/messages/ToolGroup.tsx Outdated
Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx Outdated
Comment thread packages/vscode-ide-companion/src/extension.ts Outdated
Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx Outdated
Comment thread packages/vscode-ide-companion/src/webview/providers/WebViewProvider.ts Outdated
@yiliang114
yiliang114 enabled auto-merge August 30, 2026 08:47
@yiliang114

yiliang114 commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

VS Code Extension Development Host E2E — FAIL

I ran the same real-host flow against the exact PR base and head. The UI cleanup works, but the core native Diff approval bridge regresses a flow that already succeeds on the base commit, so the current head is not ready to merge.

Test target

Variant Commit Extension bundle SHA-256
Before 74e71c5945428e42207edb3f19485c72a2a030ee 6241d5b22cb0c09a382ad829b28d912b738c5a55c2e7eca91874cf2ea0667665
After eb6ff9218692db1cca0a45818b4f8d369d43ed59 635a2ba9b2737bcb39a93ab255382a8667f6f63708b1175048b9be38093df858
  • VS Code 1.134.0 (110a328ea54b42367b803ec53ee0bf52ef26b419, arm64)
  • macOS 15.1.1
  • Both variants were launched from source with --extensionDevelopmentPath in an Extension Development Host. The normal installed VS Code process was reused; this was not the Marketplace/preview VSIX.
  • The fixture file started with ACCEPT_BEFORE or REJECT_BEFORE. Ask Approval (default) mode was selected in WebShell.
  • No npm ci, broad build, test suite, or check command was run. Only the two already-prepared extension bundles and the real UI flow were exercised.

Before / After: pending Edit presentation

Before (74e71c5) After (eb6ff92)

PASS (visual only): the head keeps the native diff and WebShell permission choices, while removing the duplicate empty expanded Edit detail. The waiting elapsed value is no longer shown on the pending Edit row. I did not treat this as proof that cumulative elapsed time is paused after resolution.

Before / After: native Accept

Before (74e71c5) After (eb6ff92)

FAIL / regression:

  • Before: invoking Qwen Code: Accept Current Diff closes the diff, resolves the WebShell approval, applies ACCEPT_AFTER, and lets the agent finish.
  • After: the native diff closes and the extension logs Diff accepted, but the WebShell approval card remains pending and the file stays at ACCEPT_BEFORE. Clicking Yes, allow once in WebShell still resolves the request, which isolates the failure to the new native-command bridge.

After: native Reject / Close

Pending diff After Qwen Code: Close Diff Editor

FAIL: the native diff closes and REJECT_BEFORE remains unchanged, but the WebShell approval stays locked. Clicking Reject in WebShell resolves the request normally.

Result matrix

Scenario Before After Result
Native diff opens for a pending WebShell Edit Pass Pass No regression
WebShell permission card retains Reject / Allow All Edits / Allow once Pass Pass No regression
Duplicate empty pending Edit detail Present Removed Visual improvement
Native Accept resolves WebShell permission and applies edit Pass Fail Blocking regression
Native Reject/Close resolves WebShell permission without applying edit Not used as the baseline gate Fail Blocking
Direct WebShell Allow once Not rerun Pass Native bridge-specific failure
Direct WebShell Reject Not rerun Pass Native bridge-specific failure
Concurrent provider/request isolation Not encoded in diff ownership Not encoded in diff ownership Blocking design gap

Blocking findings

  1. The new message source guard drops the real VS Code host message. WebViewProvider.respondToPendingPermission() posts webShellPermissionDecision to the active webview. VS Code forwards that through its preload with target.contentWindow.postMessage(...), so the inner page receives event.source === window.parent. EmbeddedApp.tsx#L662-L673 requires event.source === null and returns before voting. The current unit shape uses source: null, so it does not model the real Extension Development Host boundary.

  2. A diff is not bound to its permission owner or request. extension.ts#L251-L285 treats any qwen-diff as authority to iterate every permission-aware provider. DiffInfo stores only file/content URIs, and the forwarded decision contains no provider/session/request ID. With multiple chat surfaces or multiple pending diffs, accepting one diff can vote on the wrong pending request. The diff needs an owner/request identity, and Accept/Reject must dispatch only to that owner.

  3. Closing the native diff can strand the permission UI. This is visible in the Reject screenshots. Besides fixing the command bridge, closing the tab/window outside the command path needs an explicit policy: keep/reopen the diff or return the user to an actionable WebShell approval state.

  4. The changed showDiff call no longer matches the existing assertions. commands/index.ts now passes a fourth { readOnly: ... } argument, while commands/index.test.ts still asserts the original three arguments at lines 172–176 and 242–246. I did not run the test suite per the requested validation constraint, but the exact mock assertion is stale.

  5. The pending-Edit presentation change is global even though its premise is VS Code-specific. ToolGroup now force-collapses and locks every matching pending Edit row because “the native diff editor owns that interaction,” but the shared browser, desktop, split-view, and external WebShellWithProviders surfaces use the same component without a native permission-diff owner. Those consumers lose the inline ExpandedEditContent diff while the ToolApproval card does not render the diff block as a replacement. waitingForApproval also hides elapsed time for every tool/subtool approval, not only the pending Edit described by this PR. This should be an explicit host opt-in (for example hostOwnsEditDiffPreview, default false) exposed through the existing WebShellCustomization context; only the VS Code embed should enable it, and the compact/locked/timer-hidden behavior should be gated on that capability plus the same diff-bearing permission request that the host actually opened, rather than another tool-name list.

Non-blocking follow-ups

Verdict

The visual simplification is an improvement, but the current head breaks the primary Accept path, does not safely associate a native diff with one WebShell permission request, and changes shared WebShell behavior for hosts without a native diff owner. I would keep this PR blocked until those issues are fixed, then rerun this exact base/head matrix plus a two-provider or two-pending-diff isolation case and a default-WebShell control case.

yiliang114 and others added 8 commits August 30, 2026 17:45
…d tests

The read-only permission-diff work added a 4th options argument to
diffManager.showDiff in the qwenCode.showDiff command but left two
pre-existing assertions expecting the old 3-argument call, turning the
package unit suite red. Update both assertions and add a passthrough
test pinning that readOnly: true reaches the diff manager.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
… window

The webShellPermissionDecision source guard introduced for R1-1 checked
for event.source === null, but extension-host messages never arrive that
way: they travel over the webview message port and are relayed into the
content frame by the webview preload, which posts them from the parent
frame. On a real host the guard therefore rejected every Accept/Reject
delivered through the native diff flow. Match the shape the host
actually produces (event.source === window.parent) — the same
convention the web shell already uses for daemon token messages — which
keeps nested sandboxed iframes (MCP apps, artifact previews) out because
they post from their own child windows, and fail closed on synthetic
deliveries with no source.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The fromDiffEditor gate from R1-3 treats any qwen-diff editor as the
pending web-shell approval, so while a permission is pending, accepting
an unrelated qwen-diff (a stacked approval for another file, or a diff
left over from another session) resolved the pending approval for an
edit the user never looked at. Ship the paths the web shell is actually
waiting on with webShellPermissionState, keep them in sync while the
pending flag stays true, resolve them the same way the showDiff command
does, and only take the web-shell vote branch when the triggering
document matches one of them. The legacy pendingPermissionResolve path
is unchanged.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Nothing asserted that handleOpenDiff turns source: 'web-shell' into the
readOnly option on qwenCode.showDiff, so the lock that keeps permission
diffs from silently discarding hand edits could regress unobserved. Pin
both directions through the real command registration.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
showDiff honored the readOnly option only on the fresh-open path; the
reuse paths matched on path+content alone, so a web-shell approval could
be deduped onto (or refocused to) a writable IDE-mode diff for the same
(path, old, new) triple. Hand-edits typed there are silently discarded
when the approving daemon tool applies its own proposed content -- the
exact harm readOnly was added to prevent. Include the writability in
DiffInfo and require it to match in hasExistingDiff/focusExistingDiff.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
webShellPermissionPending was reset on panel dispose, session change and
webShellReady, but not when the view-hosted webview was disposed. With
an edit approval pending, closing the sidebar chat view left
hasPendingPermission() true; an accept from the still-open diff editor
then found no active webview, skipped the vote and fell through to the
absent legacy resolver, so the vote vanished while acceptDiff had already
closed the diff. Reset the flag and paths in webviewView.onDidDispose,
mirroring the panel dispose path. Also pin hasPendingPermission() to the
webview-pushed state so the extension command gate cannot regress to the
legacy-resolver-only check.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Neither the fromDiffEditor derivation from the diff scheme in
qwen.diff.accept nor the hasPendingPermission() precondition in front of
it was asserted, so flipping the scheme comparison or reverting the gate
to the legacy-resolver check shipped green. Drive the registered command
handler with a permission-aware provider stub and assert both links.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The webview->host webShellPermissionState post from
closeOpenPermissionDiffs had no test: deleting that post shipped green
and would leave WebViewProvider.webShellPermissionPending true after the
host unmounts. Assert the teardown posts {pending: false, paths: []} and
closes the tracked diff.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
chiga0
chiga0 previously approved these changes Aug 30, 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.

Review — PR 10534 · fix(vscode): restore native diff approval after WebShell cutover

Verdict: APPROVE — no blocking findings.


Scope

Source code only. Reviewed 23 changed files across vscode-ide-companion and web-shell packages. I did not review the manually-unverified test screenshots or the PR's VSIX build evidence (not yet submitted per PR body).

Not covered: macOS and Windows Test jobs (SKIPPED) · integration test jobs (SKIPPING/PENDING) · runtime execution (no toolchain available).


CI status

Check Result
Test (ubuntu-latest, Node 22.x) PENDING
Test (macos-latest, Node 22.x) SKIPPED
Test (windows-latest, Node 22.x) SKIPPED
Integration Tests (CLI, No Sandbox) SKIPPING
Integration Tests (no-AK, No Sandbox) PENDING
Desktop Shell (ubuntu-22.04 / windows-2022) PASS
Secret scan / Dependency CVE audit PASS
Real daemon E2E / Java 11 PENDING

The key unit test job (ubuntu) is still pending at time of review. macOS and Windows tests are skipped — no evidence from those platforms.


Class 1 — Contract asymmetry (cross-file checks)

openDiff message producer→consumer:
EmbeddedApp.tsx now always includes requestId in openDiff messages. FileMessageHandler.ts reads data.requestId and passes it as permissionRequestId to showDiff. DiffManager stores it and returns it via getPermissionRequestId(). Symmetric.

closeDiff message backward compatibility:
Old format { path } still works — DiffManager.closeDiff treats permissionRequestId === undefined as "match any". New format { path, requestId } scopes the close to the right permission. Backward-compatible.

toPermissionOptions ordering vs respondToPendingPermission selection:
permissionUtils produces allow_always first, allow_once second. App.tsx::respondToPendingPermission selects by kind (allow_once preferred), not by position. The new test in permissionUtils.test.ts asserts both options are present. No silent "Allow All Edits" escalation path.

diffDocuments Map key: Confirmed from the source at head that diffDocuments is keyed by rightDocUri.toString() (via addDiffDocument). Both hasDiff and getPermissionRequestId use the same key. No mismatch.


Class 2 — API / compatibility

WebShellApi.respondToPendingPermission added as an optional member — existing callers of the interface are not broken.

DiffManager.showDiff overloads — the existing two-argument form (filePath, newContent) is preserved. The three-argument form (filePath, old, new) now accepts an optional fourth ShowDiffOptions arg. All pre-existing call sites in commands/index.ts and FileMessageHandler.ts were updated and their tests reflect the new signatures.

DiffManager.closeDiff signature extended with optional permissionRequestId; default undefined preserves old "close by path" behavior.


qwen.diff.accept / qwen.diff.cancel gate

The commands now only vote on web-shell permissions when isManagedDiff = docUri?.scheme === DIFF_SCHEME && diffManager.hasDiff(docUri) is true. A file: URI can no longer accidentally resolve a pending web-shell approval (confirmed by the new test in extension.test.ts). This is an intentional tightening versus the legacy behavior.


Cross-check against existing reviews (qwen-code-ci-bot rounds 1 and 2)

Both prior CHANGES_REQUESTED reviews were against earlier commits (0e1bada and eb6ff92); the current head is 7ecdea9. I checked each finding against current code:

Finding Check at current head Outcome
R1-1 iframe postMessage source (Critical) event.source === window.parent check present; iframe-source test added Confirmed fixed
R1-3 fromDiffEditor gate too broad (Critical) Now also gated by diffManager.hasDiff(docUri) — only registered diffs can trigger vote Appears addressed
R2-1 showDiff 4th arg breaks callers (Critical) Overload resolved correctly; call sites and tests updated Appears addressed
R1-5 duplicated tool-name enumeration (Suggestion) Author filed follow-up issue #10544 Deferred upstream
R1-6 hand-enumerated approval detection (Suggestion) Author filed follow-up issue #10544 Deferred upstream
R2-2 readOnly not applied on focus path (Suggestion) focusExistingDiff now checks diffInfo.readOnly === readOnly Appears addressed
R2-4 webShellPermissionState untested (Suggestion) New tests in WebViewProvider.test.ts cover pending-state tracking and view-dispose clearing Appears addressed
R2-5 command-level gate untested (Suggestion) New test in extension.test.ts diff vote command gate covers the key paths Appears addressed
R2-3 lock stops when user closes read-only diff (Suggestion) Known limitation; no fix at current head Cannot rule — pre-existing gap

R2-3 (the silent lock release when the user manually closes a read-only diff via VS Code's tab UI) remains open. It is suggestion-level and does not block merge: the consequence is that the inline row briefly shows its expand affordance again, not that a permission is silently mis-resolved.


Unreviewable dimensions

  • CONTRIBUTING.md: could not fetch (connection error) — AI-review policy unverified.
  • macOS and Windows unit tests: SKIPPED — no platform evidence.
  • Runtime behavior: no execution environment available.
  • PR body notes no local build or test suite run was performed before submission.

Reviewed with AI assistance.

@github-actions

github-actions Bot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

Sandboxed verification: ✅ passed — merge-ready (agent verdict) — round 3, follow-up

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: 5319 passed · 0 failed · 5319 total

中文 — 判定:✅ 通过 · 可合入(agent 判定,第三轮跟进)
  • 结论:merge-ready,5319 条脚本断言全部符合预期。 本轮为跟进轮:PR head(7ecdea9ca7…)与 base(3aa1b146…)与第二轮完全相同(HEAD^{tree} == HEAD^2^{tree}),因此输入闭包按位一致;所有关键测量仍在新 head 上重新执行,未从旧报告复制数字。
  • 上一轮状态:两个阻塞项(F1a/F1b 红测试)复测全绿且突变可杀(M9/M5);F2 的析取守卫已移除并复测为合取(M6 被杀,M7 由探针裁定为覆盖缺口);S1(堆叠审批静默丢弃)与 S2(requestId 轴无发货测试)复测后维持原状,均非阻塞。
  • 核心 A/B 复测:approval-loop harness head 5/5(allow/reject 精确路由到属主 webview、只读锁、原文件与未受管 diff 永不投票、堆叠丢弃静默 fail-closed);base 5/5(编码预期:0 条决定消息、diff 可写、file: 与未受管 diff 触发 legacy 投票的两个危害在 base 复现)——见 01-…/02-…
  • 翻转表:head 测试字节跑在 base 代码上,companion 99 过 / 22 红、App 584/1、ToolGroup 84/1,与第二轮逐条一致;所有红均为本 PR 新增/修改的测试。
  • 突变矩阵:10 个单点突变 8 杀 2 存活;两个存活者(M7/M10,requestId 校验轴)在 head 行为正确(探针绿)、对突变体红,归类为覆盖缺口(S2),非缺陷。
  • 未覆盖:真实 VS Code 宿主(event.source === window.parent 前提)、逐 commit 归因(浅克隆)、webShellSessionChanged/onWorkspaceFileOpen 等次要新布线的发货测试——详见 Not covered

Previous-finding status (re-measured at the new head)

This is a follow-up round. The input closure is bit-identical to round 2: HEAD^2 = 7ecdea9ca73833c3b7edb3fec7eb91913d2ae6f7 (round 2's verified head), HEAD^1 = 3aa1b14624789797b33bffad3d70190ce41cedce (round 2's base tip), and HEAD^{tree} == HEAD^2^{tree} == 609dd112aebcef2d615ec2ada0ac84038b9ef57a. Even so, every measurement below was re-executed at this head, not copied from the old report.

# Finding (round 2) Severity Status at 7ecdea9ca7
F1a extension.test.ts gate test red at head Blocker fixed — 15/15 green (06-targeted-gates.png); mutant M9 (legacy fallback branch removed) kills it on the intended assertion expected "spy" to be called with arguments: ['allow'], 0 calls
F1b ToolGroup.test.tsx lock test red Blocker fixed — 85/85 green; the shipped mixed-case fixture now kills M5 (locks the row while an approval is pending, even for mixed-case tool names red vs the mutant)
F2 requestId-match disjunct bypassed the decision source check Suggestion fixed — the guard is now the conjunction event.source === window.parent && requestId === pending; removing the source conjunct (M6) turns the nested-iframe + sourceless tests red; the requestId conjunct's coverage gap persists as S2
F3 two shipped tests could not kill mutants along their axis Reporting fixed — both axes are now killed by shipped fixtures (M5, M9)
S1 stacked approvals: vote on a non-front diff dropped without notice Suggestion stands — re-measured by harness cell 5: 0 decision messages and showInformationMessage never called; fails closed, not a regression (base had no bridge)
S2 requestId-validation axis unpinned at both layers Suggestion stands — probes re-run: green at head, red vs mutants M7/M10 (coverage gap, not a defect)

No declined/deferred rows existed; nothing required re-measurement of an accepted tradeoff.

Central claim + A/B

Central claim: while a WebShell edit permission with a file diff is pending, the native diff editor's Accept/Reject commands resolve that exact permission (allow / reject routed to the owner webview as webShellPermissionDecision), and only that permission — the original workspace file, unmanaged/stale diffs, and stacked approvals the owner map does not carry never vote.

Secondary claims: (a) permission diffs open read-only and never dedupe onto a writable twin; (b) a single native Accept submits allow_once, never allow_always; (c) only host-delivered decisions (event.source === window.parent) carrying the pending requestId reach the shell.

The harness (harness/verify-approval-loop.test.ts, copied into packages/vscode-ide-companion/src/ per run) drives the real activate()qwenCode.showDiffDiffManagerqwen.diff.accept/cancelWebViewProvider.respondToPendingPermission → owner-webview postMessage chain in one process; only the vscode platform API and heavyweight provider dependencies are mocked (the same boundary the package's own tests mock). ARM=base runs the identical harness against the base tree with base-encoded expectations.

Cell Production Oracle (scripted) Result
1–5: allow routed / reject routed / original-file never votes / unmanaged diff never votes / stacked drop silent HEAD 7ecdea9c exact webShellPermissionDecision payload on the owner webview; writable-command count; legacy-resolver settlement; info-message count 5/501-ab-approval-loop-head.png
1–5 same harness, base expectations base 3aa1b146 0 decision messages on every cell; diff opened writable (1 writable command); legacy vote fires from file: and unmanaged qwen-diff triggers (the hazards the PR removes) 5/502-ab-approval-loop-base.png
9 changed test files (804 tests) HEAD PR's own suites 804/80406-targeted-gates.png
same test bytes vs base code (flip) base same companion 99 pass / 22 red, App 584 / 1 red, ToolGroup 84 / 1 red; every red is a PR-added/changed test (03-mutation-matrix-and-flips.png)
Companion full suite A/A head vs base failing-name identity head 504 pass / 5 fail / 1 skip; base 482 pass / 5 fail / 1 skip; failing sets byte-identical (the 5 ide-server HOME-path tests, pre-existing, ide-server untouched by the PR); +22 passing delta equals the 22 flipped companion tests

Base-side failure modes are behavioral, not import errors: 0 decision messages on every cell, the diff opened writable, and the legacy resolver settling to allow_once when Accept is pressed on the original file or an unmanaged diff.

Corrections

None new. The round-2 correction (a commit message described a fail-closed source guard while the then-final code carried a requestId-match disjunct) remains obsolete: the shipped guard at this head is the conjunction the message described, verified by reading EmbeddedApp.tsx and by M6/M7.

Findings

S1 — stacked approvals: a vote on a non-front permission diff is dropped without notice (Suggestion, fails closed; carried, re-measured)

Re-measured at this head by harness cell 5: with the owner map holding req-1, Accept on a second stacked permission diff (req-2) produces 0 webShellPermissionDecision messages and no showInformationMessage — silent, fail-closed, and asymmetric with the shell layer's permission.voteNotApplied notice (commit b546b304). Not a regression: base had no bridge at all. Reproduce: copy harness/verify-approval-loop.test.ts into packages/vscode-ide-companion/src/ and run ARM=head npx vitest run src/verify-approval-loop.test.ts — cell 5 asserts both the drop and the absent notice.

S2 — the requestId-validation axis is behaviorally correct but unpinned at both layers (Suggestion / completeness; carried, re-measured)

Mutant M7 (EmbeddedApp source guard reduced to event.source === window.parent) survives the shipped EmbeddedApp suite; mutant M10 (App's request.id !== requestId clause removed) survives the shipped App suite. Both layers proven correct at head by probes, and both probes kill their mutants:

Probe HEAD vs mutant
P1: host-relayed decision with req-evil while req-1 pending (harness/EmbeddedApp.probe.test.tsx) 19/19 green (04-requestid-probe-head.png) red vs M7: expected "spy" to not be called at all, but actually been called 1 times (05-requestid-probe-vs-m7.png)
P2: shellApi.respondToPendingPermission('req-evil','allow') (harness/App.probe.test.tsx) 586/586 green red vs M10: expected true to be false

Classification: coverage gap (behavior right, nothing asserts it), with the two probe files as the fixtures that would pin it. Not a merge condition — a same-source attacker still needs the unguessable requestId, and the second layer catches what the first misses.

Mutation matrix (single-point mutants of PR guards at HEAD)

Mutant Guard Target suite Result
M1 tagged vote requires fromDiffEditor WebViewProvider.test.ts KILLED — 'does not vote when the trigger is the original workspace file'
M2 hasPendingPermission includes webview-pushed owners WebViewProvider.test.ts KILLED — pushed-state + dispose tests
M8 view dispose clears the owner entry WebViewProvider.test.ts KILLED — 'clears the pending flag when the hosting view is disposed'
M3 diff reuse matches writability + requestId (both sites) diff-manager.test.ts KILLED — both reuse tests
M9 legacy fallback branch in the vote gate extension.test.ts KILLED — expected "spy" to be called with arguments: ['allow'], 0 calls (vacuity check: intended assertion)
M6 source guard's window.parent conjunct EmbeddedApp.test.tsx KILLED — nested-iframe + sourceless tests
M7 source guard's requestId conjunct EmbeddedApp.test.tsx SURVIVED → probe P1 kills it (S2)
M5 isEditToolName lowercases internally ToolGroup.test.tsx KILLED — mixed-case lock test
M4 App vote ladder prefers allow_once App.test.tsx KILLED — mutant submitted proceed_always
M10 App request.id !== requestId clause App.test.tsx SURVIVED → probe P2 kills it (S2)

Positive controls: unmutated suites green at head (804/804 gate run; probe files 19/19 and 586/586 at head); M6 killed by the same EmbeddedApp harness M7 survived. Raw logs logs/m1.txtlogs/m10.txt, logs/probe-*.txt; matrix as printed in 03-mutation-matrix-and-flips.png.

Not covered

  • Real VS Code host behavior. The container cannot run VS Code; the vscode API boundary is mocked (package convention). The premise that real host-relayed deliveries always carry event.source === window.parent — which the source guard relies on — remains unverified in-container; the PR states no OS was manually tested.
  • Per-commit attribution. Depth-2 checkout: git rev-list HEAD^1..HEAD^2 yields 1 while the metadata lists 23 commits; only the aggregate HEAD^1..HEAD diff was verified.
  • Reviewer Test Plan steps 1–5 are real-host steps and cannot be performed in-container. Closest in-container equivalents: harness cells 1–2 (accept/reject), 3–4 (original-file/unmanaged), and the shipped WebViewProvider bridge tests; step 5's stale-session aspect (webShellSessionChanged clears owners) has no shipped test — listed as an unpinned surface, not a finding (the handler deletes the owner entry; behavior is fail-closed).
  • Unpinned secondary surfaces: webShellSessionChanged owner cleanup, the new onWorkspaceFileOpen wiring, SubAgentPanel/ParallelAgentsGroup approval pass-through rendering (only the direct ToolLine lock is test-pinned), the closeDiff(path, suppress, requestId) filter branch, and getTargetViewColumn's tab-group match beyond the mocked tabGroups.all = [] fallback. No behavior observed wrong on any of them.
  • Environmental deltas vs round 2: the imageSupport esbuild test that failed on both arms in round 2 passed on both arms this round (failure sets remain byte-identical across arms — the A/A property holds); the 5 ide-server HOME-path failures reproduce identically on both arms and are pre-existing (ide-server untouched by the PR).
  • Playwright e2e, VSIX packaging, real-host screenshots (the PR states none were run).

Methodology

Environment: CI verify container (node:22-bookworm), merge-ref checkout at depth 2; npm ci/npm run build pre-run at HEAD. Verified head git rev-parse HEAD^2 = 7ecdea9ca7…; HEAD^{tree} == HEAD^2^{tree} (conflict-free merge). Scratch worktrees under tmp/ (base at HEAD^1, mutant at HEAD) reused the root node_modules via walk-up resolution; package-local node_modules (packages/web-shell, packages/vscode-ide-companion — third-party only, no internal workspace links) were symlinked into both worktrees. The base tree's @qwen-code/web-shell alias points at the head package solely for entry-id resolution inside the fully-mocked @qwen-code/web-shell module in EmbeddedApp.test.tsx (the mock factory never calls importOriginal, so no head web-shell code executes); the A/B harness chain never imports web-shell, and @qwen-code/qwen-code-core resolves to head bytes that are byte-identical to base (the PR touches no core file — git diff --name-only HEAD^1..HEAD shows only companion, web-shell, and one cli test file). Realpath assertions quoted in logs/. Harnesses drove real source through vitest with only the platform boundary mocked; mutants were applied by exact-string single-hunk edits (harness/apply-mutant.mjs, fails loud unless exactly one occurrence) and restored via git checkout after each run. Every number in this report is a scripted vitest assertion or exit code parsed from the raw logs in logs/ (ANSI-stripped; summary regenerated by node harness/print-summary.mjs); evidence captures in evidence/01–06*.png produced by node scripts/verify-capture.mjs. Worktrees removed after capture.

Flakiness gate log

rounds=5 files=9 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/vscode-ide-companion/src/commands/index.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/commands/index.test.ts
file packages/vscode-ide-companion/src/diff-manager.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/diff-manager.test.ts
file packages/vscode-ide-companion/src/extension.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/extension.test.ts
file packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/EmbeddedApp.test.tsx
file packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/handlers/FileMessageHandler.test.ts
file packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/providers/WebViewProvider.test.ts
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/messages/ToolGroup.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/ToolGroup.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/vscode-ide-companion/src/commands/index.test.ts: PPPPP
  packages/vscode-ide-companion/src/diff-manager.test.ts: PPPPP
  packages/vscode-ide-companion/src/extension.test.ts: PPPPP
  packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: PPPPP
  packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: PPPPP
  packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: PPPPP
  packages/web-shell/client/App.test.tsx: PPPPP
  packages/web-shell/client/components/messages/ToolGroup.test.tsx: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 3 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 4 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 4 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 5 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 5 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)

Evidence images

01-ab-approval-loop-head

02-ab-approval-loop-base

03-mutation-matrix-and-flips

04-requestid-probe-head

05-requestid-probe-vs-m7

06-targeted-gates

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

Qwen Code · sandboxed verification

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI classification (automated sweep): web-shell E2E Smoke (ubuntu-latest, Node 22.x) on head 7ecdea9 failed twice (jobs 99296912908, 99317699396) — both timed out at the Install dependencies step (job exceeded 20m0s) before any test ran. Not PR-caused: this PR touches the vscode diff-approval path only; same failure shape hit #10159 concurrently and its rerun went green. Infra/self-hosted-runner issue; no code change here. review-pr run 33320133808 also stuck in_progress since 15:36Z (~5h). Leaving for maintainer.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Flakiness gate: ⚠️ timeout — the 15-minute budget elapsed before two full rounds completed (0 done) — no flakiness signal either way

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

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

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

抖动门:⚠️ timeout — the 15-minute budget elapsed before two full rounds completed (0 done) — no flakiness signal either way

Verification report

Sandboxed verification: ✅ passed — merge-ready (agent verdict) — round 4, follow-up

Ran the PR in an isolated, token-free container: A/B flip (head test bytes vs base build), mutation checks, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 1741 passed · 0 failed · 1741 total (verified head 7ecdea9ca73833c3b7edb3fec7eb91913d2ae6f7)

中文 — 判定:✅ 通过 · 可合入(agent 判定,第四轮跟进)
  • 结论:merge-ready,1741 条脚本断言全部符合预期。 本轮输入闭包与第二/三轮逐位相同HEAD^2 = 7ecdea9ca7…HEAD^1 = 3aa1b146…HEAD^{tree} = HEAD^2^{tree} = 609dd112…,三个 OID 与第三轮记录逐字一致(提交/树 OID 是整棵文件树的内容寻址哈希,覆盖源码、测试、fixture 与 lockfile)。闭包相同的测量按快捷规则携带并写明比对对象;关键结论均在本轮重新实测。
  • 宿主争用审计(本轮新证据):本容器宿主负载在 40..250 之间振荡(64 核,load1 峰值 249)。最初两次并行运行的 App.test.tsx 出现 5 秒超时→级联(377/470 红);严格串行后第 4 次运行 585/585 全绿。后续各轮中零星复现的超时均在非本 PR 触碰的既有测试中、且失败集合随负载轮换(本次红的下次绿,反之亦然),而本 PR 新增测试在所有运行中从未红过。判定为宿主调度延迟造成的墙钟超时,非代码回归。
  • A/B 翻转表复测:head 测试字节跑在 base 代码上——companion 22 条合法红(与第三轮完全一致)、App allow_once 测试红(respondToPendingPermission is not a function)、ToolGroup 混合大小写锁行测试红;cli 为 A/A 对照(base/head 均 13/13 绿)。每处红均为本 PR 新增/修改的测试。
  • 突变复测:M9(legacy fallback)/M5(isEditToolName 小写化)/M6(source 守卫合取项)/M4(allow_once 阶梯)全部被杀,且以预期断言红(F1a/F1b/F2 的 fixed 状态与 allow_once 主张均活体复证);M7(requestId 合取项)在发货套件中存活(18/18 绿),与 S2 的覆盖缺口分类一致。
  • 上一轮发现状态:F1a/F1b/F2/F3 维持 fixed(突变可杀复证);S1(堆叠审批静默丢弃,fail-closed)与 S2(requestId 轴无发货测试)维持 stands,均非阻塞。详见状态表。
  • 未覆盖:真实 VS Code 宿主(event.source === window.parent 前提)、逐 commit 归因(浅克隆)、第三轮的 approve-loop harness 与探针 P1/P2(按闭包相同携带,未重建)、companion 全套 A/A 与 M10(预算)。

Previous-finding status (re-measured at the new head)

This is a follow-up round. The input closure is bit-identical to rounds 2 and 3 — what was compared, not just "nothing changed": HEAD^2 = 7ecdea9ca73833c3b7edb3fec7eb91913d2ae6f7 (rounds 2/3 verified head), HEAD^1 = 3aa1b14624789797b33bffad3d70190ce41cedce (rounds 2/3 base tip), and HEAD^{tree} == HEAD^2^{tree} == 609dd112aebcef2d615ec2ada0ac84038b9ef57a — all three OIDs byte-equal to the values round 3 recorded. Commit and tree OIDs are content-addressed hashes of the entire tree (sources, tests, fixtures, lockfile), so every input the round-3 measurements consumed is unchanged. Measurements that depend only on the tree are carried forward with that citation; everything below marked re-run was re-executed live this round under the sequential protocol.

# Finding (round 3) Severity Status at 7ecdea9ca7
F1a extension.test.ts gate test red at head Blocker fixed (re-run) — head gate green 15/15 within companion 121/121; mutant M9 re-applied live and killed by the intended assertion expected "spy" to be called with arguments: ['allow'], 0 calls (logs/m9.txt)
F1b ToolGroup.test.tsx lock test red Blocker fixed (re-run) — head gate green 85/85; mutant M5 re-applied live and killed by locks the row while an approval is pending, even for mixed-case tool names (aria-expanded="true" where null expected) (logs/m5.txt)
F2 requestId-match disjunct bypassed the decision source check Suggestion fixed (re-run) — the shipped guard is the conjunction (read at EmbeddedApp.tsx:690-693); mutant M6 (drop window.parent conjunct) re-applied live and killed by both source-guard tests (logs/m6.txt)
F3 two shipped tests could not kill mutants along their axis Reporting fixed (re-run) — both axes killed live this round (M5, M9)
S1 stacked approvals: vote on a non-front diff dropped without notice Suggestion stands — re-verified at this head by code inspection of WebViewProvider.respondToPendingPermission (the fromDiffEditor branch posts only when an owner webview matches the requestId, then returns — no notice, no vote); fails closed, base had no bridge. Round-3 harness cell 5 carried on identical closure
S2 requestId-validation axis unpinned at both layers Suggestion stands (partially re-run) — M7 (drop requestId conjunct) re-applied live and survived the shipped EmbeddedApp suite 18/18 (logs/m7.txt); M10's survival carried on identical closure (budget). Classification unchanged: coverage gap, behavior right (probes P1/P2 carried), not a merge condition

No declined/deferred rows existed in round 3; nothing required re-measurement of an accepted tradeoff.

Central claim + A/B

Central claim: while a WebShell edit permission with a file diff is pending, the native diff editor's Accept/Reject commands resolve that exact permission (allow/reject routed to the owner webview as webShellPermissionDecision), and only that permission — the original workspace file, unmanaged/stale diffs, and stacked approvals the owner map does not carry never vote. Secondary claims: (a) permission diffs open read-only and never dedupe onto a writable twin; (b) a single native Accept submits allow_once, never allow_always; (c) only host-delivered decisions (event.source === window.parent) carrying the pending requestId reach the shell.

Round 4's live A/B is the flip table — head test bytes executed against base code — plus the targeted gates at head. Round 3's end-to-end approval-loop harness (real activate()showDiffaccept/cancel → owner-webview postMessage, cells 1–5) is carried on the bit-identical closure and cited, not rebuilt; the flip table re-proves load-bearing at the suite level this round.

Cell Production Oracle (scripted) Result
Gates: 9 changed test files at head HEAD 7ecdea9c cli 13/13, companion 121/121, App 585/585 (attempt 4, sequential), ToolGroup 85/85 804/804 green01-gates-head.png
Flip: companion x6 files, head tests vs base code base 3aa1b146 PR-touched tests red, others green 98 pass / 22 legitimate reds — byte-identical set to round 3 (02-flip-table.png, logs/flip-companion.txt); +1 load flake of the untouched should show the info message on first activation (5 s timeout at load 249; same test green at head this round)
Flip: App + ToolGroup, head tests vs base code base 3aa1b146 App allow_once test red; ToolGroup mixed-case lock test red 665 pass / 2 legitimate reds (respondToPendingPermission is not a function on base; expandable row on base) — matches round 3's App 584/1, ToolGroup 84/1; +3 load flakes in untouched tests (2 timeouts, 1 timing race; reasons in logs/flip-webshell.txt)
Flip: cli permissionUtils (A/A control) base 3aa1b146 green both arms (cli source identical; test pins pre-existing wire order) 13/13 green at base, 13/13 at head — the flip harness's A/A control (logs/flip-cli.txt)
Round-3 harness cells 1–5 (carried) both arms decision payloads routed/not routed, writability, legacy vote hazards on base carried on bit-identical closure (head OID, base OID, tree OID all byte-equal to round 3)

Base-side reds are behavioral, not import errors: missing respondToPendingPermission on the base shell API, missing hasDiff/getPermissionRequestId on the base DiffManager, openDiff messages without requestId, and the old transition-indicator DOM the base renders.

Load-flake audit of App.test.tsx (new this round). The container's host load oscillated 40..249 (64 cores; base tip #10552 is the lane's own stabilization for this). Early parallel runs cascaded (377/470 red from one 5 s timeout each); strict-sequential runs converged: attempt 3 left 2 red, attempt 4 585/585 green, a later rerun left 3 red. The failing set rotates between runs, is always pure 5 s wall timeouts (or one timing race) in pre-existing describes the PR does not touch (prompt send failure retry, session callbacks, artifact panel fullscreen, task activity key, /goal command), and PR-added tests passed in every run including the all-red ones. Verdict: host-scheduling flake, not code — the same bytes were green in round 3 and in this round's attempt 4. Audit detail: 03-load-flake-audit.png, logs/gate-app-solo*.txt, logs/gate-webshell-clean.txt.

Corrections

None. The round-2 correction (commit message vs shipped guard shape) remains obsolete: the shipped guard is still the conjunction the message described.

Findings

No new findings. Carried, re-verified:

S1 — stacked approvals: a vote on a non-front permission diff is dropped without notice (Suggestion, fails closed; carried, re-verified by inspection)

At this head, WebViewProvider.respondToPendingPermission's fromDiffEditor branch looks up the owner webview by context.permissionRequestId and posts only when one matches, then returns unconditionally (WebViewProvider.ts:2415-2438): a vote carrying a requestId the owner map does not hold produces zero decision messages and no showInformationMessage. Fail-closed and asymmetric with the shell layer's permission.voteNotApplied notice; not a regression (base had no bridge). Round-3 harness cell 5 measured the same behavior end-to-end; carried on the bit-identical closure.

S2 — requestId-validation axis behaviorally correct but unpinned at both layers (Suggestion / completeness; carried, M7 half re-run live)

Mutant M7 (source guard reduced to event.source === window.parent) re-applied live this round and survived the shipped EmbeddedApp suite (18/18 green, logs/m7.txt) — re-confirming the EmbeddedApp layer is unpinned along that axis. M10's survival of the shipped App suite is carried on the identical closure (budget; round 3 logged logs/m10.txt). Round-3 probes P1/P2 (host-relayed decision with req-evil while req-1 pending; shellApi.respondToPendingPermission('req-evil','allow')) proved both layers behaviorally correct at head and killed both mutants; carried, not rebuilt. Not a merge condition: a same-source attacker still needs the unguessable requestId, and the second layer catches what the first misses.

Mutation checks at HEAD (re-run live this round)

Matrix as printed: 04-mutation-matrix.png.

Mutant Guard Target suite Result
M9 legacy hasPendingPermission fallback in qwen.diff.accept extension.test.ts KILLED — 1 red / 14 pass; expected "spy" to be called with arguments: ['allow'], 0 calls
M5 isEditToolName lowercases internally ToolGroup.test.tsx KILLED — 1 red / 84 pass; mixed-case lock test, aria-expanded="true" where null expected
M6 source guard's window.parent conjunct EmbeddedApp.test.tsx KILLED — 2 red / 16 pass; sourceless + nested-iframe decision tests
M4 App vote ladder prefers allow_once (requestId path) App.test.tsx (target test via -t) KILLED — mutant submitted proceed_always instead of proceed_once
M7 source guard's requestId conjunct EmbeddedApp.test.tsx SURVIVED — 18/18 green; S2 coverage gap (behavior right per carried probes)
M1/M2/M3/M8/M10 WebViewProvider routing/owner-map guards, diff reuse writability+requestId, App id clause (round 3) carried on bit-identical closure — all KILLED by shipped suites in round 3 except M10 (S2)

Positive controls this round: unmutated gates green (804/804); unmutated EmbeddedApp suite green inside the M6/M7 runs' passing cells; M4's 584 skipped tests are filtered-out, not executed. The M6 first attempt (hook timeout at load 249, zero tests executed) is discarded and not counted.

Not covered

  • Real VS Code host behavior. The container cannot run VS Code; the vscode API boundary is mocked (package convention). The premise that real host-relayed deliveries always carry event.source === window.parent remains unverified in-container; the PR states no OS was manually tested.
  • Per-commit attribution. Depth-2 checkout: git rev-list --count HEAD^1..HEAD^2 = 1 while the metadata lists 23 commits; only the aggregate HEAD^1..HEAD diff was verified (same as rounds 2/3).
  • Round-3 approval-loop harness cells 1–5 and probes P1/P2 — carried on the proven-identical input closure (head/base/tree OIDs byte-equal), not rebuilt. This round's live A/B is the flip table + gates.
  • Reviewer Test Plan steps 1–5 are real-host steps; closest equivalents are the flip cells and the shipped bridge tests. Step 5's stale-session aspect (webShellSessionChanged clears owners) still has no shipped test — unpinned surface, fail-closed behavior, not a finding.
  • Unpinned secondary surfaces (carried): onWorkspaceFileOpen wiring, SubAgentPanel/ParallelAgentsGroup approval pass-through rendering, the closeDiff(path, suppress, requestId) filter branch, getTargetViewColumn's tab-group match beyond mocked tabGroups.all = []. Wiring was re-grepped this round: every added field/option (hostOwnsEditDiffPreview, hasDiffPreview, onWorkspaceFileOpen, permissionRequestId, readOnly) has live read sites — no dead switches.
  • Companion full-suite A/A (round 3: head 504 pass / 5 fail / 1 skip, failing sets byte-identical across arms, the 5 pre-existing ide-server HOME-path tests) — carried on identical closure; an early contaminated parallel attempt this round (7 fail / 19 skip) was discarded as load damage, not re-run solo for budget.
  • M10 live re-run (budget) — carried on identical closure.
  • Environmental noise, disclosed: (1) tinypool "Failed to terminate worker" teardown crashes after completed green summaries (companion gate, ToolGroup control, flip-cli) — test results unaffected; (2) base-tree cli flip needed packages/cli/packages/core/channels/acp-bridge/web-templates node_modules+dist symlinks (all PR-untouched packages, head bytes byte-equal to base builds) plus the generated git-commit.ts; (3) four load-flaked cells excluded from the assertion count with reasons (above), and two invalidated runs (first M6 attempt; both early parallel gates) not counted.
  • Playwright e2e, VSIX packaging, real-host screenshots (the PR states none were run).

Methodology

Environment: CI verify container (node:22-bookworm, node v22.23.2), merge-ref checkout at depth 2; npm ci/npm run build pre-run at HEAD. Verified head git rev-parse HEAD^2 = 7ecdea9ca7…; HEAD^{tree} == HEAD^2^{tree} (conflict-free merge). Host contention was the round's dominant variable: load 40..249 on 64 cores; after the first two parallel runs contaminated each other, every subsequent vitest invocation ran strict-sequential. Base worktree at HEAD^1 under tmp/base-tree reused the root node_modules via walk-up resolution; package-local node_modules (web-shell, vscode-ide-companion, cli, core — third-party only, no @qwen-code/* entries) were symlinked in, as were PR-untouched built dist/s (acp-bridge, web-templates, channels/*, verified git diff HEAD^1..HEAD -- <pkg> empty) and the generated git-commit.ts. Internal @qwen-code/* imports from the base tree resolve to head bytes that are byte-identical to base for every PR-untouched package (core, sdk-typescript, cli source — verified by diff); the one PR-changed internal package (@qwen-code/web-shell) is fully mocked in EmbeddedApp.test.tsx with an importOriginal-free factory. Flips copied the 9 head test bytes into the base tree (8 modified + 1 new file, confirmed by git status there). Mutants were applied by exact-string single-hunk replacement (harness/apply-mutant.mjs + harness/mutants.json, fails loud unless exactly one occurrence) and restored via git checkout after each run (working tree confirmed clean at the end). All numbers are vitest summaries parsed from the raw ANSI-stripped logs in logs/; tables rendered by harness/print-summary.mjs; evidence captures produced by node scripts/verify-capture.mjs. The base worktree was removed after capture (git worktree remove --force); the head working tree was confirmed clean at the end.

Flakiness gate log

rounds=5 files=9 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/vscode-ide-companion/src/commands/index.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/commands/index.test.ts
file packages/vscode-ide-companion/src/diff-manager.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/diff-manager.test.ts
file packages/vscode-ide-companion/src/extension.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/extension.test.ts
file packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/EmbeddedApp.test.tsx
file packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/handlers/FileMessageHandler.test.ts
file packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/providers/WebViewProvider.test.ts
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/messages/ToolGroup.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/ToolGroup.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: P
  packages/vscode-ide-companion/src/commands/index.test.ts: P
  packages/vscode-ide-companion/src/diff-manager.test.ts: P
  packages/vscode-ide-companion/src/extension.test.ts: P
  packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: F
  packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P
  packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: F
  packages/web-shell/client/App.test.tsx: F
  packages/web-shell/client/components/messages/ToolGroup.test.tsx: 

verdict: timeout
summary: the 15-minute budget elapsed before two full rounds completed (0 done) — no flakiness signal either way

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: F (exit 1)
--- output tail · round 1 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx ---

�[1m�[46m RUN �[49m�[22m �[36mv3.2.7 �[39m�[90m/__w/qwen-code/qwen-code/packages/vscode-ide-companion�[39m

 �[31m❯�[39m src/webview/EmbeddedApp.test.tsx �[2m(�[22m�[2m18 tests�[22m�[2m | �[22m�[33m18 skipped�[39m�[2m)�[22m�[33m 10610�[2mms�[22m�[39m
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mattributes its sessions to the VS Code channel
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22minjects the active editor reference into prepared submissions
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mkeeps an authenticated session visible when auth is cancelled
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mstill shows onboarding when an unauthenticated flow is cancelled
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mkeeps an explicit active-file exclusion across same-file editor changes
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mtreats a workspace-relative mention annotation as already included
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mmatches typed active-file references on a whole-reference boundary
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mopens permission diffs only from authoritative tool-call content
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mkeeps host permission ownership in sync while pending stays true
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mposts pending: false when pending permission diffs are torn down
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mroutes auth and session-change host actions to the extension
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mnotifies once when a connection error persists instead of looping
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mdoes not report or stamp an error while no onError handler is attached
   �[2m�[90m↓�[39m�[22m EmbeddedApp host wiring�[2m > �[22mreleases the panel when a session switch times out
   �[2m�[90m↓�[39m�[22m web shell permission decision messages�[2m > �[22mforwards host-relayed decisions to the web shell
   �[2m�[90m↓�[39m�[22m web shell permission decision messages�[2m > �[22mignores decisions posted by a nested iframe window
   �[2m�[90m↓�[39m�[22m web shell permission decision messages�[2m > �[22mignores decisions delivered without a source window
   �[2m�[90m↓�[39m�[22m web shell permission decision messages�[2m > �[22msurfaces a notice when the shell resolves the vote to false

�[31m⎯⎯⎯⎯⎯⎯�[39m�[1m�[41m Failed Suites 1 �[49m�[22m�[31m⎯⎯⎯⎯⎯⎯⎯�[39m

�[41m�[1m FAIL �[22m�[49m src/webview/EmbeddedApp.test.tsx�[2m [ src/webview/EmbeddedApp.test.tsx ]�[22m
�[31m�[1mError�[22m: Hook timed out in 10000ms.
If this is a long-running hook, pass a timeout value as the last argument or configure it globally with "hookTimeout".�[39m
�[36m �[2m❯�[22m src/webview/EmbeddedApp.test.tsx:�[2m148:1�[22m�[39m
    �[90m146| �[39m}
    �[90m147| �[39m
    �[90m148| �[39m�[34mbeforeAll�[39m(�[35masync�[39m () �[33m=>�[39m {
    �[90m   | �[39m�[31m^�[39m
    �[90m149| �[39m  document�[33m.�[39mbody�[33m.�[39mdataset�[33m.�[39mqwenDaemonBaseUrl �[33m=�[39m �[32m'http://localhost:4141'�[39m�[33m;�[39m
    �[90m150| �[39m  document�[33m.�[39mbody�[33m.�[39mdataset�[33m.�[39mqwenWorkspaceCwd �[33m=�[39m �[32m'/workspace'�[39m�[33m;�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯�[22m�[39m


�[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[33m18 skipped�[39m�[90m (18)�[39m
�[2m   Start at �[22m 22:35:58
�[2m   Duration �[22m 89.48s�[2m (transform 16.06s, setup 0ms, collect 6.12s, tests 10.61s, environment 5.72s, prepare 2.48s)�[22m

file:///__w/qwen-code/qwen-code/node_modules/tinypool/dist/index.js:427
		const timer = timeout ? setTimeout(() => reject(new Error("Failed to terminate worker")), timeout) : null;
		                                                ^

Error: Failed to terminate worker
    at Timeout._onTimeout (file:///__w/qwen-code/qwen-code/node_modules/tinypool/dist/index.js:427:51)
    at listOnTimeout (node:internal/timers:585:17)
    at process.processTimers (node:internal/timers:521:7)

Node.js v22.23.2

round 1 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: F (exit 1)
--- output tail · round 1 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts ---
2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell daemon bootstrap�[2m > �[22m�[2mdoes not notify a host about a workspace switch it triggers itself
�[22m�[39m[WebViewProvider] Attaching to WebviewView (viewType=qwen-code.chatView.sidebar)
[WebViewProvider] Syncing ~/.qwen/settings.json → VSCode settings

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell daemon bootstrap�[2m > �[22m�[2mdoes not notify a host about a workspace switch it triggers itself
�[22m�[39m[WebViewProvider] Attempting connection...

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell daemon bootstrap�[2m > �[22m�[2mkeeps notifying live hosts after another host disposes
�[22m�[39m[WebViewProvider] Attaching to WebviewView (viewType=qwen-code.chatView.sidebar)
[WebViewProvider] Syncing ~/.qwen/settings.json → VSCode settings

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell daemon bootstrap�[2m > �[22m�[2mkeeps notifying live hosts after another host disposes
�[22m�[39m[WebViewProvider] Attempting connection...

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell daemon bootstrap�[2m > �[22m�[2mkeeps notifying live hosts after another host disposes
�[22m�[39m[WebViewProvider] Attaching to WebviewView (viewType=qwen-code.chatView.sidebar)
[WebViewProvider] Syncing ~/.qwen/settings.json → VSCode settings

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell daemon bootstrap�[2m > �[22m�[2mkeeps notifying live hosts after another host disposes
�[22m�[39m[WebViewProvider] Attempting connection...

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell permission bridge�[2m > �[22m�[2mroutes accept to the request-owner webview
�[22m�[39m[WebViewProvider] Attaching to WebviewView (viewType=qwen-code.chatView.sidebar)
[WebViewProvider] Syncing ~/.qwen/settings.json → VSCode settings

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > �[22m�[2mWebViewProvider web-shell permission bridge�[2m > �[22m�[2mroutes accept to the request-owner webview
�[22m�[39m[WebViewProvider] Attempting connection...

�[90mstdout�[2m | src/webview/providers/WebViewProvider.test.ts�[2m > 

...truncated -- full content in the run artifacts.

Evidence images

01-gates-head

02-flip-table

03-load-flake-audit

04-mutation-matrix

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.

Partially reviewed — gaps disclosed.

Not explored to full depth (tool budget reached): "agent reverse-audit (round 2)": executing the new case in packages/cli/src/acp-integration/session/permissionUtils.test.ts — vitest globalSetup guard stopped on unbuilt workspace dist (web-tem…; chunk 4: could not execute EmbeddedApp.test.tsx to confirm green at the reviewed commit — the worktree has no built dist/ and npm run build -w @qwen-code/sdk -w @qw….

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

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

  • packages/web-shell/client/components/messages/ToolGroup.test.tsx:2241 — [probe] D3-1 lock test pins only the no-expand-affordance half of the pending-edit lock; the no-auto-expand half has no witness — deferred by the rounds-2-5 code-age ru…
  • packages/vscode-ide-companion/src/diff-manager.test.ts:42 — [probe] D3-2 Uri.with() mock closes over the original uri so derived URIs collide in diffDocuments keying — deferred by the rounds-2-5 code-age rule (mock factory unchanged since t…
  • packages/web-shell/client/components/messages/ToolGroup.tsx:142 — [probe] D3-3 isEditToolName omits notebook_edit, so the row lock never engages for a tool whose bound vote passes the toolKind gate — deferred by the rounds-2-5 code-age rule…

Convergence: round 3 posted 17 inline comment(s), 16 of them reported for the first time; the previous round posted 10 (10 new). Findings keep coming back to the same files: packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx (findings in rounds 1, 2; 3 more now); packages/vscode-ide-companion/src/commands/index.ts (findings in round 2; 2 more now); packages/web-shell/client/components/messages/ToolGroup.tsx (findings in round 2; 2 more now), and 2 more file(s). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. (Observation only — nothing was withheld from this review because of this observation.)

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

Comment thread packages/web-shell/client/App.tsx
Comment thread packages/vscode-ide-companion/src/commands/index.ts
Comment thread packages/vscode-ide-companion/src/commands/index.ts
Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx
Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx
Comment thread packages/web-shell/client/App.tsx
Comment thread packages/web-shell/client/App.tsx
Comment thread packages/web-shell/client/App.tsx
Comment thread packages/vscode-ide-companion/src/webview/EmbeddedApp.tsx
Comment thread packages/web-shell/client/components/messages/ToolGroup.tsx
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Round-3 bot sweep on unchanged head 7ecdea9c — disposition of the remaining 15 findings

Context: this head had already cleared the round-1/2 findings (fixes in 258acf95 / 7ecdea9c, see earlier notes) and sat at 0 unresolved before this re-scan minted 17 new findings. The PR is past the +1.5k-line scope fuse, so no code changes this round — only triage. Disposition:

  • R2-3 (ToolGroup lock premise): pure re-post of the round-2 thread already replied and tracked in vscode: closing a web-shell permission diff tab leaves the approval row locked without a re-open path #10557 — replied in-thread and resolved.
  • R3-1 (Critical, bound-vote gate vs kind-agnostic diff preview): verified structurally real in-tree — replied in-thread, kept unresolved, human-gated. Fails closed (no mis-resolution), candidate fix noted in the reply.
  • R3-2…R3-9, R3-11, R3-13, R3-15, R3-16 (12 findings): all "missing test witness" suggestions for the new request-id binding hops (open/close hops, DiffManager store/lookup, cancel handler, sub-agent plumbing, host file-open routing, exact-id gate, first-diff-only change). Valid hardening, but each fix is test additions — deferred with the fuse to the human-review round; no code changes this round.
  • R3-10, R3-12, R3-14 (behavioral suggestions): latch reset across approval cycles; SplitView pane not receiving hostOwnsEditDiffPreview; host hand-off bypassing the pre-existing stat() guard (error dialog for deleted/directory paths). Recorded, not independently verified this round; all suggestion-level with no mis-resolution path — human-gated for the next round.

Net: 1 thread resolved (re-post), 1 Critical confirmed and left open for human decision, 15 findings deferred under the scope fuse. No /triage re-request from this comment.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

Sandboxed verification: ✅ passed — merge-ready (agent verdict) — round 5, follow-up

Ran the PR in an isolated, token-free container: A/B flip against the new base, delta-isolation mutants, predicate-divergence wire oracle, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 31 passed · 0 failed · 31 total (verified head 4fee90a68b583392ae058a53ade8cc93515a19a9)

中文 — 判定:✅ 通过 · 可合入(agent 判定,第五轮跟进)
  • 结论:merge-ready,31 条脚本断言全部符合预期(0 失败)。 本轮输入闭包与第四轮不同:PR 新增一个提交 4fee90a6("accept native votes for structured edits"),base 从 3aa1b146 前进到 fca2acd5ci: serialize E2E tests on shared ECS runners #10567 及 workspace-overview 等)。因此所有关键测量均在新 head 重新实测,未携带旧数字。
  • 中心主张 A/B:结构化编辑审批(tool call content 携带 {type:'diff', path, oldText, newText} 块)的原生 Accept 投票——head 绿(resolved=true,提交 proceed_once 而非 proceed_always);base 红(TypeError: shellApi?.respondToPendingPermission is not a function,base 根本没有投票端点)。见 01-ab-structured-vote-head-vs-base.png
  • delta 隔离突变:M-D1 切断"结构化内容 → hasDiffPreview"链接后新测试以行为断言红(expected false to be true)——证明该提交新增的链接是 load-bearing 且测试非空;M-D3 交换 allow_once 优先级后突变体提交 proceed_always(单次 Accept 升级为 Allow All Edits 的场景被测试钉住);M-C1 从 cli 线序中删除 allow_once 同样被杀——梯子两端(cli 线序 + web-shell 优先级)都有活体钉扎。
  • 宿主/壳双谓词一致性:17/17 形状格一致(含 ACP 嵌套包装、仅 newText、仅 oldText、空串、非字符串 path 等),故 M-D2(删除 hasDiffPreview !== true 子句)在 592/592 全绿下存活被归类为冗余防御而非行为缺口。
  • 上一轮发现:F1a/F1b/F2/F3 在新 head 以活体突变复证 fixed(M9/M5/M6 均被预期断言杀);S1(堆叠审批静默丢弃,fail-closed)与 S2(requestId 轴无发货测试)维持 stands,均非阻塞。新增 S3 观察(workflow 编辑审批把 diff 包成文本块,不进原生 diff 桥),非阻塞。
  • 门禁:App 592/592、ToolGroup 85/85、companion 六文件 121/121、cli 13/13,共 811/811 全绿(低负载窗口,无抖动)。合并健全性:merged App.tsx 同时含 base 侧(gitModeIntent/workspaceOverview)与 PR 侧 hunk,base 新增的 workspace-overview 测试在 592 全绿中通过。
  • 未覆盖:真实 VS Code 宿主(event.source === window.parent 前提)、逐 commit 归因(浅克隆)、Reviewer Test Plan 第 5 步的 stale-session 轴仍无发货测试、第三/四轮的端到端审批环 harness 与探针 P1/P2 本轮未重建(以本轮 A/B+突变替代中心主张证明;S2 行为正确性以两层校验点代码阅读佐证)。

Previous-finding status (re-measured at the new head 4fee90a6)

This is a follow-up round and the input closure changed (new PR commit 4fee90a6 on top of round-4 head 7ecdea9ca7; base moved 3aa1b146fca2acd5), so nothing was carried on closure identity — every row below was re-measured live at the new head.

# Finding (round 4) Severity Status at 4fee90a6
F1a extension.test.ts gate test red at head Blocker fixed (re-run) — gate green 15/15; mutant M9 (legacy fallback dropped) killed live by expected "spy" to be called with arguments: ['allow'], 0 calls (logs/m9-legacy-fallback.txt)
F1b ToolGroup.test.tsx lock test red Blocker fixed (re-run) — gate green 85/85; mutant M5 (no lowercase in isEditToolName) killed live by the mixed-case lock row (lineExpandable present where absent expected) (logs/m5-lowercase.txt)
F2 requestId-match disjunct bypassed the decision source check Suggestion fixed (re-run) — shipped guard is still the conjunction at EmbeddedApp.tsx:691-693; mutant M6 (drop window.parent conjunct) killed live by both source-guard tests, 2 red / 16 pass (logs/m6-source-guard.txt)
F3 two shipped tests could not kill mutants along their axis Reporting fixed (re-run) — both axes killed live (M5, M9); the delta's new structured test additionally kills M-D1 and M-D3 along its own axes
S1 stacked approvals: vote on a non-front permission diff dropped without notice Suggestion stands — re-inspected at new head: WebViewProvider.ts:2415-2436 posts only when an owner webview matches the requestId, then returns unconditionally; a vote for an unowned requestId produces zero messages and no notice. Fail-closed (the stacked diff stays open, nothing resolves); base had no bridge. The shell-layer voteNotApplied notice added by this PR fires only after a vote reaches the shell, so the host-layer drop remains silent
S2 requestId-validation axis unpinned at both layers Suggestion stands — mutant M7 (drop requestId conjunct) re-applied live and survived the shipped EmbeddedApp suite 18/18 (logs/m7-requestid-conjunct.txt). Behavior correct by inspection at the new head: the conjunct is present at EmbeddedApp.tsx:691-693 and the shell re-validates request.id !== requestId at App.tsx:9166. Coverage gap, not a merge condition

Central claim + A/B

Central claim (round 5, the delta commit): a native Accept/Reject vote on a structured edit approval — a pending permission whose tool-call content carries a {type: 'diff', path, oldText|newText} block — resolves that exact request through the shell's respondToPendingPermission(requestId, decision), submitting allow_once (never allow_always) even though the wire order puts allow_always first. Secondary claims: (a) the rest of the bridge (source guard, owner map, read-only diffs, legacy fallback) still holds at the new head after the base move; (b) the merge preserved both sides' hunks in the co-touched App.tsx.

The wire shape is not a fixture invention: the producer is buildPermissionRequestContent (packages/cli/src/acp-integration/session/permissionUtils.ts:155-162), called unconditionally by the main approval path (Session.ts:11660) and the sub-agent path (SubAgentTracker.ts:245) — exactly one top-level diff block per edit approval, warnings wrapped as {type:'content', content:{type:'text'}} (which both diff predicates correctly ignore).

Cell Production Oracle (scripted) Result
A/B head: structured-edit vote HEAD 4fee90a6 App structured test: resolved === true, submitPermission('req-1','proceed_once') 1/1 green (logs/ab-head-cell.txt, 01-ab-structured-vote-head-vs-base.png)
A/B base: same test bytes base fca2acd5 (HEAD^1) predicted red: no vote endpoint 1/1 red as predictedTypeError: shellApi?.respondToPendingPermission is not a function (logs/ab-base-cell.txt)
M-D1: structured detection severed (hasPermissionDiffPreview → false) at head head + mutant delta-isolation: vote must be declined KILLEDexpected false to be true on resolved: the pre-delta decline reproduced behaviorally (logs/md1-structured-test.txt)
M-D3: allow_once-first ladder swapped on requestId path head + mutant escalation guard KILLED — mutant submitted proceed_always (single Accept → "Allow All Edits") (logs/md3-ladder-swap.txt)
M-C1: allow_once removed from edit wire options (cli) head + mutant wire-order pin KILLEDexpect(options).toEqual([...]) mismatch (logs/mc1-wire-order.txt)
M-D2: hasDiffPreview !== true clause dropped from requestId gate head + mutant full App suite SURVIVED 592/592 — classified redundant defence, see Findings (logs/md2-guard-drop-full-app.txt)
Gates at head HEAD 4fee90a6 App 592 + ToolGroup 85 + companion 121 + cli 13 811/811 green (04-gates-head-all-green.png, logs/gate-*.txt)

Base-side red is behavioral (missing API), not an import error. The flip control is clean: the PR leaves every package.json/package-lock.json untouched (0-line diff), and the only internal dependency the flipped test resolves (@qwen-code/sdk, realpath packages/sdk-typescript) is byte-identical between base and head (0-line diff on both the PR side and the base-move side).

Corrections

None.

Findings

No new blocking findings. One new non-blocking observation, plus the two carried Suggestions (status table above).

S3 — workflow edit approvals wrap their diff as text, so they never reach the native diff bridge (Suggestion, non-blocking)

The main approval path emits the structured diff block (Session.ts:11660permissionUtils.ts:155-162), but the workflow-approval path builds its content with a ternary that wraps fileDiff as a text block instead (Session.ts:2597-2609). Both client predicates (transcriptAdapter.ts:60-73, EmbeddedApp.tsx:271-293) therefore see no diff for workflow edit approvals: no native diff opens and the approval is handled by the permission card only. This is fail-safe (the card flow resolves the permission correctly) and outside the PR's stated scope, but it means the same edit renders through two different approval UXes depending on the path. If the native diff flow is meant to cover workflow edits too, the producer should reuse buildPermissionRequestContent; if not, the asymmetry is worth a comment. Not a merge condition.

M-D2 survival classification — redundant defence, not a coverage gap with behavioral exposure

Dropping request.hasDiffPreview !== true from the shell's requestId gate (App.tsx:9167) survived the full 592-test App suite. The clause is the shell-side backstop against the host and shell diff predicates disagreeing; the divergence probe (below) shows they agree on 17/17 shapes, and the host only mints votes for requestIds it registered from its own predicate, so the clause cannot fire while both predicates match. Classification per the mutation matrix rules: redundant defence — correct as it stands; the shipped suite pinning nothing along this axis is expected, not a defect. The fixture that would pin it is a content shape the two predicates judge differently, and the probe shows none exists among the shapes the producer can emit.

Predicate-divergence wire oracle (new this round)

03-predicate-divergence-17of17.png: the host predicate was sliced verbatim out of the shipped EmbeddedApp.tsx and the shell predicate exercised through the real exported extractPendingPermission; 17 corpus cells (full diff, creation, deletion, no-texts, non-string path, missing path, empty-string texts, case-flipped type, ACP content_block wrapper, nested content key, text block, null/string items, empty/absent/non-array content, missing toolCall) — 17 agree / 0 diverge (harness/divergence-probe.mjs, logs/divergence-probe.txt).

Mutation matrix at HEAD

As printed: 02-mutation-matrix-round5.png.

Mutant Guard Suite Result
M-D1 delta: structured content → hasDiffPreview App structured test KILLED — expected false to be true
M-D3 delta: allow_once-first ladder (requestId path) App structured test KILLED — submitted proceed_always
M-D2 delta: hasDiffPreview clause in requestId gate full App 592 SURVIVED — redundant defence (17/17 agreement)
M9 legacy fallback in qwen.diff.accept extension.test.ts KILLED — 1 red / 14 pass (F1a)
M5 isEditToolName lowercases internally ToolGroup.test.tsx KILLED — 1 red / 84 pass (F1b)
M6 source guard window.parent conjunct EmbeddedApp.test.tsx KILLED — 2 red / 16 pass (F2)
M7 source guard requestId conjunct EmbeddedApp.test.tsx SURVIVED — 18/18 (S2)
M-C1 allow_once present in edit wire options permissionUtils.test.ts KILLED — 1 red / 12 pass

Positive controls: unmutated head gates 811/811 green; the M-D2 and M7 survival runs are green suites under the mutant (592/592, 18/18), proving the harness executed the suites.

Not covered

  • Real VS Code host behavior. The container cannot run VS Code; the vscode API boundary is mocked (package convention). The premise that real host-relayed deliveries always carry event.source === window.parent remains unverified in-container; the PR states no OS was manually tested.
  • Per-commit attribution. Depth-2 checkout: the delta's parent (7ecdea9ca7) is unreachable; only the aggregate HEAD^1..HEAD diff was verified. The delta's file scope is inferred from its message, the new test, and the structured-detection chain it adds; the mutation cells (M-D1/M-D3) isolate its behavioral contribution regardless.
  • Round-3/4 end-to-end approval-loop harness and probes P1/P2 were not rebuilt this round (closure changed, so they could not be carried). The central claim's load-bearing proof is this round's A/B flip + M-D1/M-D3 instead; S2's behavior-correct half is inspection of both validation sites (EmbeddedApp.tsx:691-693, App.tsx:9166).
  • Reviewer Test Plan steps 1–5 are real-host steps. Step 5's stale-session aspect (webShellSessionChanged clears webShellPermissionOwners, WebViewProvider.ts:1949) still has no shipped test (grep of WebViewProvider.test.ts finds no webShellSessionChanged case) — fail-closed behavior, carried note, not a finding.
  • Web-shell suites beyond App/ToolGroup (sidebar workspace-overview tests added by the base move): the PR does not touch those sources; the merged App.tsx was verified to contain both sides' hunks (gitModeIntentMustReset ×2 base-side, respondToPendingPermission ×4 PR-side) and the base-side App tests pass inside the 592/592 gate.
  • Workflow approval native-diff coverage — see S3.
  • Playwright e2e, VSIX packaging, real-host screenshots (the PR states none were run).

Methodology

Environment: CI verify container (node:22-bookworm, node v22.23.2), merge-ref checkout at depth 2; npm ci/npm run build pre-run at HEAD (the pre-run build is the typecheck gate). Verified head git rev-parse HEAD^2 = 4fee90a68b583392ae058a53ade8cc93515a19a9. Host load was low this round (load1 ≈ 1 on 64 cores), unlike round 4's contention; all vitest runs were sequential regardless. Base worktree at HEAD^1 (fca2acd5) under tmp/base-tree, reusing the root node_modules via walk-up plus a symlink of the package-local (third-party-only) node_modules; the PR leaves all manifests untouched and the one internal dependency resolves to bytes identical on both arms (diffs cited above). The flip copied the head App.test.tsx bytes into the base tree. Mutants applied by exact-string single-hunk replacement (harness/apply-mutant.mjs, fails loud unless exactly one occurrence) and restored via git checkout after each run (working tree confirmed clean after every restore and at the end). The divergence probe transpiles the shipped transcriptAdapter.ts with esbuild and slices the host predicate verbatim out of the shipped EmbeddedApp.tsx source, so both predicates under test are the shipped bytes. Assertion counts come from harness/summary-assertions.mjs (14 log-parsed checks, ANSI-stripped) plus the probe's 17 cell comparisons = 31. Evidence captures produced by node scripts/verify-capture.mjs. The base worktree is removed after this round (git worktree remove --force).

Evidence images

  • 01-ab-structured-vote-head-vs-base.png — A/B cells: green at head, TypeError on base.
  • 02-mutation-matrix-round5.png — the matrix as printed.
  • 03-predicate-divergence-17of17.png — host vs shell predicates, 17/17 agree.
  • 04-gates-head-all-green.png — 811/811 head gates.

Harness scripts and raw logs live beside this report in tmp/pr10534-verify-20260831-045645/.

Qwen Code · sandboxed verification

Flakiness gate log

rounds=5 files=9 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/vscode-ide-companion/src/commands/index.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/commands/index.test.ts
file packages/vscode-ide-companion/src/diff-manager.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/diff-manager.test.ts
file packages/vscode-ide-companion/src/extension.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/extension.test.ts
file packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/EmbeddedApp.test.tsx
file packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/handlers/FileMessageHandler.test.ts
file packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/providers/WebViewProvider.test.ts
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/messages/ToolGroup.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/ToolGroup.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/vscode-ide-companion/src/commands/index.test.ts: PPPPP
  packages/vscode-ide-companion/src/diff-manager.test.ts: PPPPP
  packages/vscode-ide-companion/src/extension.test.ts: PPPPP
  packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: PPPPP
  packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: PPPPP
  packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: PPPPP
  packages/web-shell/client/App.test.tsx: PPPPP
  packages/web-shell/client/components/messages/ToolGroup.test.tsx: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 3 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 4 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 4 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 4 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 5 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 5 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 5 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)

Evidence images

01-ab-structured-vote-head-vs-base

02-mutation-matrix-round5

03-predicate-divergence-17of17

04-gates-head-all-green

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.

⚠️ Downgraded from Approve to Comment: CI failing: Post Coverage Comment (ubuntu-latest, 22.x), web-shell E2E Smoke (ubuntu-latest, Node 22.x), Test (ubuntu-latest, Node 22.x), Real daemon E2E / Java 11. Reviewed.

Not explored to full depth (tool budget reached): "agent 6a": run App.test.tsx "submits allow_once for a native structured edit approval accept" at HEAD (blocked by absent node_modules, not by the call ceiling — environm…; "agent 3c": run the new test submits allow_once for a native structured edit approval accept (packages/web-shell) — the review worktree has no node_modules (vitest cannot….

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

  • packages/web-shell/client/App.tsx:9118 — [review] the unbound respondToPendingPermission overload (allow_always kind fallback, option-id substring heuristic, the whole reject mapping, and the isAskUserPermission guard) has no test anywhere …

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

⏸️ Deferring to @chiga0 — triage remains clean on 4fee90a (no blocking findings; the round-3 Critical is fixed), but this PR is escalated by the cross-package core gate, so the merge call belongs to a maintainer. Since my last pass, two of the three inputs I asked for have landed: CI on this head settled green (unit leg, web-shell E2E smoke, coverage — the only non-green leg is the recurring npm-install hang in Real daemon E2E / Java 11, which the main ruleset does not require) and sandboxed verification passed on exactly this head (round 5, 31/31 assertions; a fresh re-confirmation round is running and will post here). What remains is human: decide whether the 15 deferred suggestion-level findings from round 3 ride along or follow up (itemized in my Stage 3 comment; none has a mis-resolution path), and clear or re-run the stale CHANGES_REQUESTED reviews from the earlier /review rounds — they predate 4fee90a, and the last /review pass downgraded from Approve only because CI was red at that moment. Needs a human call on this one.

中文说明

⏸️ 转交 @chiga0 —— triage 对 4fee90a 依然无阻塞发现(第三轮 Critical 已修复),但本 PR 因跨包触发核心门禁升级,合并决定权在维护者。上次通过以来,我要求的三项输入已到位两项:本 head 的 CI 已出结果且为绿(单测腿、web-shell E2E smoke、覆盖率;唯一非绿腿是 Real daemon E2E / Java 11 反复出现的 npm install 卡死,main 规则集未将其设为必需),沙箱验证已在完全相同的 head 通过(第五轮,31/31 断言;新一轮复核正在运行,将发布在本帖)。剩下需要人工处理:决定第三轮 15 条推迟的建议级发现随本 PR 处理还是后续跟进(明细见 Stage 3 评论,均无误决议路径),以及驳回或重跑早前 /review 轮次的过期 CHANGES_REQUESTED 评审——它们早于 4fee90a,且最近一次 /review 仅因当时 CI 红而从 Approve 降级。需要人工拍板。

Qwen Code · qwen3.8-max

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Flakiness gate: ⚠️ timeout — 1 invocation(s) ended in a timeout/signal exit — infrastructure, not test nondeterminism, so these rounds carry no flakiness signal

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

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

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

抖动门:⚠️ timeout — 1 invocation(s) ended in a timeout/signal exit — infrastructure, not test nondeterminism, so these rounds carry no flakiness signal

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

Sandboxed verification: ✅ passed — merge-ready (agent verdict) — round 6, follow-up

Ran the PR in an isolated, token-free container: A/B flip against the base build, full live mutation matrix, predicate-divergence wire oracle, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 36 passed · 0 failed · 36 total (verified head 4fee90a68b583392ae058a53ade8cc93515a19a9)

中文 — 判定:✅ 通过 · 可合入(agent 判定,第六轮跟进)
  • 结论:merge-ready,36 条脚本断言全部符合预期(0 失败)。 本轮输入闭包与第五轮逐字节相同HEAD^2 = 第五轮验证的 head 4fee90a6HEAD^1 = 第五轮 base fca2acd5(commit OID 相同 ⇒ 树相同;manifest 0 行 diff;packages/sdk-typescriptpackages/acp-bridgepackages/web-shell/srcgit diff HEAD^1..HEAD 均为空)。即便如此,本轮未携带任何旧数字——A/B、全部 8 个突变、门禁、17 格谓词探针均在新容器内重新实测。
  • 中心主张 A/B(结构化编辑审批的原生 Accept 投票):head 绿(resolved=true,提交 proceed_once);base 红(TypeError: shellApi?.respondToPendingPermission is not a function,base 无投票端点)。见 01-ab-head-cell-green.png / 02-ab-base-cell-typeerror.png
  • 突变矩阵全活体:6 杀 2 存活。M-D1(切断结构化检测)以行为断言红(expected false to be true);M-D3(requestId 路径梯子交换)提交 proceed_always(单次 Accept 升级 Allow All Edits 被钉住);M-C1/M5/M9/M6 各杀 1–2 条;M7(requestId 合取项)按预期存活 18/18(S2 覆盖缺口,fail-closed);M-D2(shell 门 hasDiffPreview 子句)存活 592/592,17/17 谓词探针佐证为冗余防御。
  • 上一轮发现:F1a/F1b/F2/F3 以活体突变复证 fixed;S1(堆叠审批静默丢弃,fail-closed)、S2(requestId 轴无发货测试)、S3(workflow 编辑审批 diff 包成文本块)维持 stands,均非阻塞。
  • 门禁:App 592/592、ToolGroup 85/85、companion 六文件 121/121、cli 13/13,共 811/811 全绿。
  • 未覆盖:真实 VS Code 宿主(event.source === window.parent 前提)、逐 commit 归因(浅克隆 graft)、Reviewer Test Plan 第 5 步 stale-session 轴仍无发货测试、Playwright/VSIX/实机截图。

Previous-finding status (re-measured at head 4fee90a6, base fca2acd5)

This is a follow-up round whose input closure is provably identical to round 5: git rev-parse HEAD^1 / HEAD^2 return exactly the OIDs round 5 verified (fca2acd5… / 4fee90a6…), so both trees, the lockfile, and every fixture are byte-identical to what round 5 measured; all manifests have a 0-line diff and packages/sdk-typescript, packages/acp-bridge, packages/web-shell/src show empty git diff HEAD^1..HEAD. Even so, nothing was carried on closure identity — every measurement below was re-executed live in this container (node v22.23.2, same as round 5).

# Finding (round 5) Severity Status at 4fee90a6
F1a extension.test.ts gate test red at head Blocker fixed (re-run) — gate green 15/15; mutant M9 (legacy fallback dropped) re-killed live by expected "spy" to be called with arguments: [ 'allow' ], 1 red / 14 pass (logs/m9-legacy-fallback.txt)
F1b ToolGroup.test.tsx lock test red Blocker fixed (re-run) — gate green 85/85; mutant M5 (no lowercase in isEditToolName) re-killed live by the mixed-case lock row, 1 red / 84 pass (logs/m5-lowercase.txt)
F2 requestId-match disjunct bypassed the decision source check Suggestion fixed (re-run) — shipped conjunction still at EmbeddedApp.tsx:691-693; mutant M6 (drop window.parent conjunct) re-killed live by both source-guard tests, 2 red / 16 pass (logs/m6-source-guard.txt)
F3 two shipped tests could not kill mutants along their axis Reporting fixed (re-run) — both axes re-killed live (M5, M9); the delta's structured test additionally re-kills M-D1 and M-D3 along its own axes
S1 stacked approvals: vote on a non-front permission diff dropped without notice Suggestion stands — re-inspected at this head: WebViewProvider.ts:2415-2436 posts only when an owner webview matches the requestId, then returns unconditionally; a vote for an unowned requestId produces zero messages and no notice. Fail-closed (nothing resolves, the stacked diff stays open); the shell-layer voteNotApplied notice fires only after a vote reaches the shell
S2 requestId-validation axis unpinned at both layers Suggestion stands — mutant M7 (drop requestId conjunct) re-applied live and survived the shipped EmbeddedApp suite 18/18 (logs/m7-requestid-conjunct.txt). Behavior correct by inspection: conjunct present at EmbeddedApp.tsx:691-693 and the shell re-validates request.id !== requestId at App.tsx:9166. Coverage gap, not a merge condition
S3 workflow edit approvals wrap their diff as text, never reach the native diff bridge Suggestion stands — re-inspected: the workflow path's ternary (Session.ts:2597-2613) wraps fileDiff as {type:'content', content:{type:'text'}}; probe cells 09/10 show both predicates judge that shape false, so workflow edits resolve via the permission card only. Fail-safe, outside the PR's stated scope

Central claim + A/B

Central claim: a native Accept/Reject vote on a structured edit approval — a pending permission whose tool-call content carries a {type: 'diff', path, oldText|newText} block — resolves that exact request through the shell's respondToPendingPermission(requestId, decision), submitting allow_once (never allow_always) even though the wire order puts allow_always first. Secondary claims: (a) the rest of the bridge (source guard, owner map, read-only diffs, legacy fallback) holds; (b) the host and shell diff predicates agree on every shape the producers can emit.

The wire shape is not a fixture invention: the producer is buildPermissionRequestContent (packages/cli/src/acp-integration/session/permissionUtils.ts:130), called by the main approval path (Session.ts:11660) and the sub-agent path (SubAgentTracker.ts:245); the workflow path (Session.ts:2613) is the S3 exception.

Cell Production Oracle (scripted) Result
A/B head: structured-edit vote HEAD 4fee90a6 App structured test: resolved === true, submitPermission('req-1','proceed_once') green (logs/ab-head-cell.txt, 01-ab-head-cell-green.png)
A/B base: same test bytes base fca2acd5 (HEAD^1) predicted red: no vote endpoint red as predictedTypeError: shellApi?.respondToPendingPermission is not a function (logs/ab-base-cell.txt, 02-ab-base-cell-typeerror.png)
M-D1: structured detection severed ('diff''diffx') head + mutant delta-isolation: vote must be declined KILLEDexpected false to be true on resolved (logs/md1-structured-test.txt)
M-D3: allow_once ladder swapped on requestId path head + mutant escalation guard KILLED — mutant submitted proceed_always (logs/md3-ladder-swap.txt)
M-C1: allow_once removed from edit wire options (cli) head + mutant wire-order pin KILLED — 1 red / 12 pass, toEqual mismatch (logs/mc1-wire-order.txt)
M5: isEditToolName lowercase removed head + mutant mixed-case lock row KILLED — 1 red / 84 pass (logs/m5-lowercase.txt)
M9: legacy fallback dropped in qwen.diff.accept head + mutant extension gate KILLED — 1 red / 14 pass, spy 0 calls (logs/m9-legacy-fallback.txt)
M6: window.parent conjunct dropped head + mutant source-guard tests KILLED — 2 red / 16 pass (logs/m6-source-guard.txt)
M7: requestId conjunct dropped head + mutant EmbeddedApp suite SURVIVED 18/18 — S2 coverage gap, fail-closed (logs/m7-requestid-conjunct.txt)
M-D2: hasDiffPreview clause dropped from shell gate head + mutant full App suite SURVIVED 592/592 — redundant defence, see Findings (logs/md2-guard-drop-full-app.txt)
Gates at head HEAD 4fee90a6 App 592 + ToolGroup 85 + companion 121 + cli 13 811/811 green (04-gates-head-all-green.png, logs/gate-*.txt)

Matrix as printed: 03-mutation-matrix-round6.png.

The flip control is clean: the PR leaves every package.json/package-lock.json untouched (0-line diff); the base worktree's internal @qwen-code/* links were re-pointed into the base tree and asserted by realpath (readlink -f …/node_modules/@qwen-code/sdktmp/base-tree/packages/sdk-typescript); the two dists carried into the base tree (sdk-typescript, acp-bridge) come from packages with an empty git diff HEAD^1..HEAD, so head-built dist is behaviorally identical to base-built dist; the web-shell lib entry (daemon-react-sdk.js) was rebuilt in the base tree from base sources.

Corrections

None.

Findings

No new blocking findings. The three carried Suggestions stand (status table above); none regressed at this head.

M-D2 survival classification — redundant defence, not a coverage gap with behavioral exposure

Dropping request.hasDiffPreview !== true from the shell's requestId gate (App.tsx:9167) survived the full 592-test App suite, exactly as in round 5. The clause is the shell-side backstop against the host and shell diff predicates disagreeing; the divergence probe (below) shows they agree on 17/17 shapes, and the host only mints votes for requestIds it registered from its own predicate, so the clause cannot fire while both predicates match. Classification: redundant defence — correct as it stands; the fixture that would pin it is a content shape the two predicates judge differently, and the probe shows none exists among the shapes the producers emit.

Predicate-divergence wire oracle

05-predicate-divergence-17of17.png: the host predicate was sliced verbatim out of the shipped EmbeddedApp.tsx (permissionDiffPreview) and the shell predicate exercised through the real exported extractPendingPermission (harness/divergence-probe.mjs); 17 corpus cells (full diff, creation, deletion, no-texts, non-string path, missing path, empty-string texts, case-flipped type, ACP content_block wrapper, nested content key, text block, null/string items, empty/absent/non-array content, missing toolCall) — 17 agree / 0 diverge (logs/divergence-probe.txt).

Not covered

  • Real VS Code host behavior. The container cannot run VS Code; the vscode API boundary is mocked (package convention). The premise that real host-relayed deliveries always carry event.source === window.parent remains unverified in-container; the PR states no OS was manually tested.
  • Per-commit attribution. Depth-2 checkout (grafted at 4fee90a6): only the aggregate HEAD^1..HEAD diff was verified; git rev-list HEAD^1..HEAD^2 returns 1 at the shallow boundary while the metadata lists 23 commits.
  • Reviewer Test Plan steps 1–5 are real-host steps. Step 5's stale-session aspect (webShellSessionChanged clears webShellPermissionOwners) still has no shipped test — fail-closed behavior, carried note, not a finding.
  • Round-3/4 end-to-end approval-loop harness was not rebuilt; the central claim's load-bearing proof is this round's A/B flip plus the live M-D1/M-D3 cells.
  • Playwright e2e, VSIX packaging, real-host screenshots (the PR states none were run).
  • Flakiness gate (9 changed test files × 5 rounds) is run by the workflow separately; this round's gates are single runs.

Methodology

Environment: CI verify container (node:22-bookworm, node v22.23.2), merge-ref checkout at depth 2; npm ci/npm run build pre-run at HEAD (the pre-run build is the typecheck gate). Verified head git rev-parse HEAD^2 = 4fee90a68b583392ae058a53ade8cc93515a19a9. Base worktree at HEAD^1 (fca2acd5) under tmp/base-tree, internal @qwen-code/* links re-pointed into the base tree (realpath asserted), package-local third-party node_modules symlinked, sdk-typescript/acp-bridge dists carried from head (empty-diff proof cited), web-shell lib rebuilt in the base tree. The flip copied the head App.test.tsx bytes into the base tree and ran the single structured test by name filter on both arms. Mutants applied by exact-string single-hunk replacement (harness/apply-mutant.mjs, fails loud unless exactly one occurrence) and restored via git checkout after each run (working tree confirmed clean after every restore and at the end). The divergence probe transpiles the shipped transcriptAdapter.ts with esbuild and slices the host predicate verbatim out of the shipped EmbeddedApp.tsx source, so both predicates under test are the shipped bytes. Assertion counts come from harness/summary-assertions.mjs (18 log/git-parsed checks, ANSI-stripped) plus the probe's 17 cell comparisons and 1 probe summary check = 36. Evidence captures produced by node scripts/verify-capture.mjs. The base worktree is removed after this round (git worktree remove --force).

Evidence images

  • 01-ab-head-cell-green.png — A/B head cell: structured vote green, proceed_once submitted.
  • 02-ab-base-cell-typeerror.png — A/B base cell: same test bytes, TypeError … is not a function.
  • 03-mutation-matrix-round6.png — the matrix as printed (6 killed, 2 classified survivors).
  • 04-gates-head-all-green.png — 811/811 head gates.
  • 05-predicate-divergence-17of17.png — host vs shell predicates, 17/17 agree.

Harness scripts and raw logs live beside this report in tmp/pr10534-verify-20260831-101544/.

Qwen Code · sandboxed verification

Flakiness gate log

rounds=5 files=9 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/vscode-ide-companion/src/commands/index.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/commands/index.test.ts
file packages/vscode-ide-companion/src/diff-manager.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/diff-manager.test.ts
file packages/vscode-ide-companion/src/extension.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/extension.test.ts
file packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/EmbeddedApp.test.tsx
file packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/handlers/FileMessageHandler.test.ts
file packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: (cd packages/vscode-ide-companion) npx --no-install vitest run ./src/webview/providers/WebViewProvider.test.ts
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/messages/ToolGroup.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/ToolGroup.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPP
  packages/vscode-ide-companion/src/commands/index.test.ts: PPI
  packages/vscode-ide-companion/src/diff-manager.test.ts: PPP
  packages/vscode-ide-companion/src/extension.test.ts: PPP
  packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: PPP
  packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: PPP
  packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: PPP
  packages/web-shell/client/App.test.tsx: PPP
  packages/web-shell/client/components/messages/ToolGroup.test.tsx: PP

verdict: timeout
summary: 1 invocation(s) ended in a timeout/signal exit — infrastructure, not test nondeterminism, so these rounds carry no flakiness signal

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 1 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/commands/index.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 2 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/messages/ToolGroup.test.tsx: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/commands/index.test.ts: I (exit 124)
--- output tail · round 3 · packages/vscode-ide-companion/src/commands/index.test.ts ---

�[1m�[46m RUN �[49m�[22m �[36mv3.2.7 �[39m�[90m/__w/qwen-code/qwen-code/packages/vscode-ide-companion�[39m

 �[32m✓�[39m src/commands/index.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m8 passed�[39m�[22m�[90m (8)�[39m
�[2m   Start at �[22m 09:56:13
�[2m   Duration �[22m 848ms�[2m (transform 246ms, setup 0ms, collect 219ms, tests 11ms, environment 0ms, prepare 198ms)�[22m


Session terminated, killing shell... ...killed.

round 3 · packages/vscode-ide-companion/src/diff-manager.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/extension.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/EmbeddedApp.test.tsx: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts: P (exit 0)
round 3 · packages/vscode-ide-companion/src/webview/providers/WebViewProvider.test.ts: P (exit 0)
round 3 · packages/web-shell/client/App.test.tsx: P (exit 0)

Evidence images

01-ab-head-cell-green

02-ab-base-cell-typeerror

03-mutation-matrix-round6

04-gates-head-all-green

05-predicate-divergence-17of17

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot's only review on 4fee90a68b583392ae058a53ade8cc93515a19a9 is a COMMENTED one, which carries no vote — so it has no verdict of its own on this commit, and main needs two approving reviews: an approval left by another account is a separate vote and does not count as the bot's own. Two different things look like this, and the stage-3 comment above says which: the triage skill deferring on purpose at 3/5 — a fork refactor hitting the approval guardrail, or a core change escalated for maintainer awareness, both normal outcomes — or an earlier approval that a push dismissed, leaving only the comment behind, which needs a fresh review.

⚠️ 机器人在 4fee90a68b583392ae058a53ade8cc93515a19a9 上唯一的评审是 COMMENTED不带票 —— 因此它在该 commit 上没有自己的裁决,而 main 需要两个批准(其他账号的批准是另一张票)。有两种情况长这样,上方的 stage-3 评论会说明是哪一种:triage skill 在 3/5 时有意 defer(fork refactor 命中审批护栏,或核心改动被升级交由维护者把关,两者都是正常结果);或者更早的批准被一次推送作废、只剩下这条评论,此时需要重新评审。

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

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

@yiliang114
yiliang114 dismissed qwen-code-ci-bot’s stale review August 31, 2026 13:07

Dismissing: all 35 review threads are resolved, and two commits (4fee90a and the main merge 427dc2e) landed after this review was submitted. The approval-chain rewrite was verified end to end at the current head.

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

Full review at 427dc2e — no findings. The stale bot CHANGES_REQUESTED (predating 4fee90a and the main merge) was dismissed; all 35 threads are resolved.

Verified the approval chain end to end:

  • DiffManager now keys dedupe/focus/reuse on writability AND permissionRequestId, so a read-only approval diff can never be deduped onto or refocused as a writable twin, and two permission requests never share a diff; readOnly diffs skip setActiveEditorWriteableInSession since web-shell approvals cannot round-trip edits.
  • Votes from the diff editor are triple-bound by request id: WebViewProvider routes only to the webview owning that exact requestId (webShellPermissionOwners), the embedded shell accepts the message only from window.parent with a requestId matching its managed diff, and App.respondToPendingPermission re-validates request.id plus hasDiffPreview/hostOwnsEditDiffPreview before submitting — with the exact-binding path using only allow_once/reject_once (no fuzzy fallback), and a visible host notice when the shell isn't mounted so the vote cannot die silently.
  • closeDiff is scoped per permissionRequestId; getTargetViewColumn reuses the existing diff's tab group with sane fallbacks.

CI: 21 checks pass; only the bot review-pr job still pending. Self-PR: GitHub blocks self-approval, so this needs another maintainer's approve to merge.

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

No blocking findings. Approved.

Reviewed with AI assistance.


What I checked

Diff scope: 23 files, +1571/-142. Three subsystems: vscode-ide-companion (DiffManager, commands, extension, EmbeddedApp, WebViewProvider, FileMessageHandler), web-shell (App, ToolGroup, SubAgentPanel, transcriptAdapter, types, customization), and cli (permissionUtils).

Core flow (end-to-end verified against the code path):

  1. Web shell sees a pending edit permission with a diff → updateTranscript posts openDiff { source: 'web-shell', requestId } + webShellPermissionState { pending: true, requestId }
  2. FileMessageHandler opens the diff with readOnly: true + permissionRequestId via the showDiffCommand
  3. DiffManager.showDiff records readOnly=true, permissionRequestId in DiffInfo; skips setActiveEditorWriteableInSession so the user can't silently lose edits
  4. VS Code user presses Ctrl+S / Accept → qwen.diff.accept fires with the qwen-diff-scheme URI → getPermissionRequestId(docUri) returns req-Xprovider.respondToPendingPermission('allow', { fromDiffEditor: true, permissionRequestId: 'req-X' })
  5. WebViewProvider.respondToPendingPermission looks up the owning webview in webShellPermissionOwners and posts webShellPermissionDecision { decision: 'allow', requestId: 'req-X' }
  6. EmbeddedApp message handler validates event.source === window.parent + requestId === webShellPermissionRequestIdRef.current → calls shellRef.current.respondToPendingPermission(requestId, 'allow')
  7. App.tsx respondToPendingPermission validates request.id === requestId && hostOwnsEditDiffPreview && request.hasDiffPreview === true → submits via sessionActions.submitPermission

Security design — two independent validation layers:

  • Layer 1 (EmbeddedApp): event.source === window.parent blocks nested iframes; requestId === webShellPermissionRequestIdRef.current blocks stale/crafted IDs. Tests "ignores decisions posted by a nested iframe window" and "ignores decisions delivered without a source window" both pin these gates. CI green.
  • Layer 2 (App.tsx respondToPendingPermission): request.id !== requestId rejects wrong-request; hostOwnsEditDiffPreview must be true; request.hasDiffPreview !== true rejects non-diff permissions. This second layer ensures the shell side can't be tricked even if the host message were spoofed.

readOnly + dedup consistency:
hasExistingDiff and focusExistingDiff both check readOnly (and permissionRequestId), so a writable IDE-mode diff and a read-only web-shell diff for the same content never share a slot. recentlyShown key is (path, old, new) without readOnly — harmless because recentlyShown is only consulted after hasExistingDiff matches, and mismatched-readOnly diffs don't match. DiffManager tests ("opens a fresh diff instead of reusing a writable twin for a read-only request" and vice versa) cover this. CI green.

Single-permission-at-a-time (intentional behavior change):
updateTranscript now uses blocks.find(...) (first pending) rather than iterating all pending. This keeps webShellPermissionRequestIdRef unambiguous — only one native diff is open at a time, ownership is clear, and stacking is handled by rotating as each resolves. Test "keeps host permission ownership in sync while pending stays true" confirms the rotation.

ToolLine locking is safe under hasDiffPreview=false:
locksPendingEditApproval requires approval.hasDiffPreview === true. When hasDiffPreview is false (daemon didn't include a diff content block), the lock doesn't activate, the tool line stays expandable, and the user can vote via the in-line web-shell UI. No stuck state possible.

Backward compatibility:

  • respondToPendingPermission(choice, context?)context is optional; existing callers without it still hit the legacy pendingPermissionResolve path. When webShellPermissionOwners.size > 0 but pendingPermissionResolve is null, calling without context returns early — no spurious web-shell vote.
  • hasPendingPermission() broadened: returns true when webShellPermissionOwners.size > 0. The accept/cancel handler guards with if (!isManagedDiff) continue so non-diff keystrokes can't trigger respondToPendingPermission.
  • permissionUtils.ts — no implementation change, only a regression test pinning the option order.

WebViewProvider ownership cleanup verified complete:

  • View dispose: webShellPermissionOwners.delete(webview) at line 951
  • Panel dispose: clears all non-attachedWebview entries at lines 209-212
  • webShellSessionChanged: delete at line 1954
  • webShellReady: delete at line 1969
  • webShellPermissionState { pending: false }: delete at line 1949
    All five paths covered, test "clears the pending flag when the hosting view is disposed" passes. CI green.

Cross-check against existing review comments

R1-1 (original + fix-induced): The current code uses event.source === window.parent (positive equality check, not !== null). The test suite covers both the iframe and null-source gates. Cannot reproduce the reviewer's claimed vulnerability at this head.

R1-2 (edits silently discarded): Addressed by readOnly: truesetActiveEditorWriteableInSession is NOT called for web-shell diffs. The right side stays locked in VS Code's session.

R1-3 (fix-induced: uncontexted vote resolves web-shell approval): Analyzed the path: respondToPendingPermission('allow') without context skips the web-shell route (needs context?.fromDiffEditor && context.permissionRequestId), then checks pendingPermissionResolve. When only web-shell owners exist and no ACP promise is pending, pendingPermissionResolve is null → the call is a no-op. No web-shell vote fires. Cannot confirm this is a real bug at this head.

Critical "4th argument breaks tests" (commands/index.test.ts): Fixed — the tests were updated to pass { readOnly: false, permissionRequestId: undefined } and a new readOnly: true test was added.

R3-1 (hasDiffPreview gate): The gate is intentional: only approvals with a known diff preview get the native-diff path. When hasDiffPreview is false, ToolLine stays expandable and web-shell UI remains the interaction surface — no stuck state.

Suggestion-level coverage gaps (R3-2, R3-3, R3-4 etc.): Valid observations — defined permissionRequestId through the showDiff/closeDiff command hops lacks a dedicated end-to-end test. Not blocking; the individual unit tests for showDiff and closeDiff cover the parameter forwarding.

R1-4 (no test coverage for the permission bridge): Refuted. WebViewProvider.test.ts adds 170 lines of bridge tests covering: routing to request owner, cancel as reject, unknown request ID, fromDiffEditor=false gate, pre-ownership state, view-dispose cleanup, hasPendingPermission tracking. EmbeddedApp.test.tsx adds 150 lines covering: host-relayed decisions, nested iframe isolation, null source, handleShellError on resolved-false. These shipped in the current head.


CI

All substantive checks pass: ubuntu unit tests (25m), Integration Tests, web-shell E2E Smoke, Real daemon E2E, Desktop Shell (ubuntu + windows).
macOS/Windows unit tests: SKIPPED — no platform-specific logic in this change.

@qwen-code-dev-bot qwen-code-dev-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.

Gate APPROVE at head 427dc2e6 on the review conclusion. Verified in the diff: (1) the native-diff bridge is id-bound end to end — WebViewProvider routes accept/reject only through webShellPermissionOwners keyed by the exact requestId, the web-shell side re-validates the id before voting, and the owner map is cleared on session change, webview ready, and panel/view dispose, so a stale or stacked diff cannot resolve another session's approval; (2) diff reuse now matches on (path, old, new, readOnly, permissionRequestId), preventing a writable twin being refocused for a read-only approval; (3) the accept/cancel command narrowing (only managed diffs auto-resolve permissions) removes a pre-existing accidental-approve path rather than adding one; (4) compact pending-Edit rows are host-flag-gated (hostOwnsEditDiffPreview, default false) so non-VS Code surfaces are unchanged. All 35 threads resolved, both earlier CHANGES_REQUESTED rounds fixed and dismissed, CI 22 green with only the review-pr pipeline running. Note for follow-up: the PR's own manual VSIX screenshot pass is still pending — worth completing before the next vscode release cut, not a merge blocker given the unit coverage of the state machine (session-switch, stale-diff, read-only, and timer-pause cases are all pinned).

中文:在 head 427dc2e6 按 Review 结论通过。四点已核:桥接全链路按 requestId 精确绑定并在会话切换/webview 释放时清账,陈旧 diff 无法误批他人审批;diff 复用五元组匹配(含 readOnly 与 requestId),不会把只读批复成可写;accept/cancel 命令收窄为仅托管 diff 才自动投票,反而消除了旧的误批路径;紧凑行由宿主开关控制、默认关,不影响非 VS Code 面。35 条线程全关闭、两轮 RC 均修复后 dismiss,CI 22 绿仅 review-pr 流水线在跑。备注:作者自述手工 VSIX 截图验证未跑,建议在下次扩展发版前补上——状态机分支均有单测钉住,不阻塞合入。

@yiliang114
yiliang114 added this pull request to the merge queue Aug 31, 2026
Merged via the queue into main with commit 3a0c4c6 Aug 31, 2026
87 of 88 checks passed
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.

4 participants