Skip to content

fix(cli): make the Agent Team teammate tab transcript scrollable in VP mode - #9531

Merged
yiliang114 merged 33 commits into
mainfrom
fix/9507-teammate-tab-scroll
Sep 25, 2026
Merged

yiliang114 merged 33 commits into
mainfrom
fix/9507-teammate-tab-scroll

Conversation

@yiliang114

@yiliang114 yiliang114 commented Aug 20, 2026 •

Copy link
Copy Markdown
Collaborator

What this PR does

When Virtualized History mode is on (ui.useTerminalBuffer, the default), the teammate tab transcript is now rendered through the same ScrollableList virtual viewport the main conversation view uses: header, committed items, live items, and the running spinner all live in one viewport pinned to the tail, so Page Up / Page Down, Shift+arrows, Ctrl+Home/End, and the mouse wheel can reach earlier output. The committed/live split is preserved — items from an executing/confirming tool group onward stay on the interactive render path, so teammate approval dialogs keep receiving input inside the viewport. With useTerminalBuffer: false nothing changes: the transcript keeps flowing through <Static> into the terminal's native scrollback, which already worked there.

Why it's needed

In VP mode the interactive UI takes over the whole terminal screen, so there is no terminal-native scrollback to fall back on. AgentChatContent rendered the teammate tab transcript with ink's <Static> unconditionally, so once a teammate's output scrolled past the visible area it could not be retrieved by any means — Up arrow, Page Up/Page Down, and the mouse wheel all had no effect (#9507). The main conversation view does not have this problem because its transcript already renders in a scrollable virtual viewport; this brings the teammate tab to parity.

Reviewer Test Plan

How to verify

Component-level reproduction and fix verification use the real ScrollableList/VirtualizedList viewport machinery plus the real keypress pipeline (no viewport mocks). Both commands below are run from packages/cli, so the paths are relative to that package: cd packages/cli && npx vitest run src/ui/components/agent-view/AgentChatContent.test.tsx. Before this PR, the VP-mode test fails because the renderer emits all 40 transcript lines at once and Page Up is a no-op; after this PR, the viewport starts pinned to the tail, Page Up reveals earlier output, the tail leaves the visible window, and the legacy (useTerminalBuffer: false) path still emits everything unchanged. Full agent-view regression (those two targets only, not the repo-wide suite): cd packages/cli && npx vitest run src/ui/components/agent-view/ src/ui/components/shared/ScrollableList.test.tsx — 68 tests pass. tsc --noEmit and eslint report nothing new for the changed files (the remaining repo-wide tsc errors are pre-existing on pristine main in this environment: acpAgent.ts, daemon-status.ts, workspace-extensions-controller.ts, native-audio-recorder.ts). Manual check: enable Agent Team (QWEN_CODE_ENABLE_AGENT_TEAM=1), create a team, have a teammate produce more output than fits on one screen, switch to its tab, and scroll back with Page Up.

Evidence (Before & After)

Component-level frames from the reproduction test (VP mode, 40 transcript lines, viewport height 8):

Before (old always-<Static> renderer — every line emitted, Page Up does nothing):

AGENT_HEADER
user-msg-0
user-msg-1
...
user-msg-38
user-msg-39        ← all lines on screen at once; nothing scrolls

After (viewport pinned to the tail on open):

user-msg-32
user-msg-33
...
user-msg-39

After Page Up × N (earlier output is back in view, tail left the window):

user-msg-0
user-msg-1
...
user-msg-7

Tested on

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

Linux ✅ is component-level verification (real viewport + keypress pipeline driven through ink-testing-library, red-before/green-after); a live multi-teammate terminal session was not exercised on this machine.

Environment (optional)

Node v24, npx vitest run in packages/cli on Linux; no sandbox.

Risk & Scope

  • Main risk or tradeoff: the teammate tab in VP mode now renders through the virtual viewport instead of <Static> — scroll behavior matches the main view, but any viewport-specific rendering quirks (height estimation, scrollbar) now apply to teammate transcripts too; the executing/confirming split keeps approval dialogs on the interactive path.
  • Known cost, deliberate: while a teammate tool approval is pending, this tab's transcript is not scrollable at all — Page Up / Page Down, Shift+arrows, Ctrl+Home/End and the mouse wheel are each inert, and there is no timeout that recovers the situation. ScrollableList gates both its keypress subscriber and useMouseEvents on hasFocus, and AgentChatContent feeds !approvalPending into that flag. That is intentional rather than an oversight: the pending ToolConfirmationMessage is rendered as a tail item inside the windowed viewport, so scrolling it out of [renderRangeStart, renderRangeEnd] would unmount the dialog together with its useKeypress subscription, blocking the agent round with nothing on screen left to answer. The viewport is therefore scrolled to the tail once when the approval arrives, and only then are the keys taken away. Accepted for this PR; making the approval dialog independent of scroll position is separate work.
  • Not validated / out of scope: live multi-agent session with real teammates and a model provider; macOS/Windows terminals; the roster-panel gaps noted in the issue are a separate failure mode and untouched; "Copy Selection" does not appear in this tab's right-click menu, because <ContentMouseController> here is mounted without a selectionQueryRef (the main view passes one) — a missing convenience, not a broken one.
  • Breaking changes / migration notes: none; useTerminalBuffer: false rendering is byte-for-byte the previous code path.

Linked Issues

Fixes #9507

中文说明

这个 PR 做了什么

当 Virtualized History 模式开启(ui.useTerminalBuffer,默认开启)时,队友标签页的转录现在通过与主对话视图相同的 ScrollableList 虚拟视口渲染:头部信息、已提交条目、进行中条目和运行中的 spinner 都位于同一个固定在尾部的视口内,因此 Page Up / Page Down、Shift+方向键、Ctrl+Home/End 以及鼠标滚轮都可以回看更早的输出。已提交/进行中的拆分逻辑被保留——从正在执行/等待确认的工具组开始的条目仍走可交互渲染路径,保证队友的审批对话框在视口内仍能接收输入。useTerminalBuffer: false 时完全不变:转录继续通过 <Static> 流入终端原生回滚缓冲区,那条路径本来就没有问题。

为什么需要

VP 模式下交互式界面接管整个终端屏幕,没有终端原生回滚可以兜底。AgentChatContent 无条件用 ink 的 <Static> 渲染队友标签页转录,所以一旦队友的输出滚出可见区域就无法通过任何方式找回——向上箭头、Page Up/Page Down、鼠标滚轮全部无效(#9507)。主对话视图没有这个问题,因为其转录本来就渲染在可滚动的虚拟视口里;本 PR 让队友标签页对齐这一行为。

评审测试计划

如何验证

组件级复现与修复验证使用真实的 ScrollableList/VirtualizedList 视口机制和真实按键管线(不 mock 视口)。下面两条命令都在 packages/cli 下执行,路径相对该 package:cd packages/cli && npx vitest run src/ui/components/agent-view/AgentChatContent.test.tsx。修复前 VP 模式测试失败,因为渲染器一次性输出全部 40 行转录且 Page Up 无效;修复后视口初始固定在尾部,Page Up 可以回看更早输出、尾部离开可见窗口,且 legacy(useTerminalBuffer: false)路径仍原样输出全部内容。完整 agent-view 回归(只跑这两个目标,不是全仓套件):cd packages/cli && npx vitest run src/ui/components/agent-view/ src/ui/components/shared/ScrollableList.test.tsx,68 条测试全部通过。tsc --noEmit 和 eslint 对改动文件无新增报错(本环境下仓库层面剩余的 tsc 错误在纯净 main 上同样存在:acpAgent.ts、daemon-status.ts、workspace-extensions-controller.ts、native-audio-recorder.ts)。手动验证方式:启用 Agent Team(QWEN_CODE_ENABLE_AGENT_TEAM=1),创建团队,让队友产生超过一屏的输出,切换到它的标签页,用 Page Up 回滚。

证据(修复前后)

来自复现测试的组件级帧(VP 模式,40 行转录,视口高度 8):

修复前(旧的纯 <Static> 渲染——所有行一次性输出,Page Up 无效):帧内同时包含 AGENT_HEADER、user-msg-0 到 user-msg-39 全部行,没有任何滚动能力。

修复后(打开时视口固定在尾部):帧内为 user-msg-32 到 user-msg-39。

按若干次 Page Up 后(更早的输出回到视口,尾部离开窗口):帧内为 user-msg-0 到 user-msg-7。

测试平台

Linux ✅ 为组件级验证(真实视口 + 按键管线经 ink-testing-library 驱动,修复前红、修复后绿);本机未跑真实的多队友终端会话。macOS / Windows ⚠️ 未测试。

环境

Node v24,Linux 下 packages/cli 内 npx vitest run;无沙箱。

风险与范围

  • 主要风险/权衡:VP 模式下队友标签页改为走虚拟视口而非 <Static>——滚动行为与主视图对齐,但视口特有的渲染特性(高度估算、滚动条)也会作用于队友转录;执行中/确认中的拆分保证审批对话框仍在可交互路径上。
  • 已知代价(刻意为之):当队友有待处理的工具审批时,该标签页的转录完全不可滚动——Page Up / Page Down、Shift+方向键、Ctrl+Home/End 与鼠标滚轮逐个失效,且没有任何超时可以恢复。ScrollableList 的按键订阅与 useMouseEvents 都以 hasFocus 为门控,而 AgentChatContent 把 !approvalPending 传进了这个标志。这是有意设计而非疏漏:待处理的 ToolConfirmationMessage 是渲染在窗口化视口内部的尾部条目,一旦滚出 [renderRangeStart, renderRangeEnd] 就会连同它的 useKeypress 订阅一起被卸载,屏幕上不再有任何可回答的东西,却把 agent 这一轮阻塞住。因此审批到达时先把视口滚动到尾部一次,然后才收走按键。本 PR 接受这个权衡;让审批对话框不依赖滚动位置属于另一项工作。
  • 未验证/超出范围:带真实队友和模型提供方的多 agent 实时会话;macOS/Windows 终端;issue 中提到的名单面板(roster panel)缺陷属于另一种失败模式,未在本 PR 处理;该标签页的右键菜单里不会出现「Copy Selection」,因为这里的 <ContentMouseController> 没有传 selectionQueryRef(主视图有传)——属于少一个便利项,不是坏了。
  • 破坏性变更/迁移说明:无;useTerminalBuffer: false 的渲染与原代码路径完全一致。

关联 Issue

Fixes #9507

…P mode

In Virtualized History mode (ui.useTerminalBuffer, on by default) the
app owns the whole screen, so there is no terminal-native scrollback.
The main conversation view renders its transcript in a ScrollableList
virtual viewport, but AgentChatContent rendered the teammate tab
transcript through ink's <Static> unconditionally — content that
scrolled off screen could not be reached by Page Up, Page Down, arrow
keys, or the mouse wheel (#9507).

Route the teammate transcript through the same ScrollableList viewport
in VP mode: header + committed + live items + spinner live in one
viewport pinned to the tail, with Page Up/Page Down, Shift+arrows,
Ctrl+Home/End and wheel/scrollbar support. The committed/live split is
preserved (items from an executing/confirming tool group onward stay
on the interactive render path so approval dialogs keep receiving
input). The legacy <Static> path for useTerminalBuffer: false is
unchanged — native terminal scrollback already works there.
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Qwen Triage finished — view run. See the stage comments in this thread for the result.

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Collaborator

Re-running the gate on a5444d10. Two commits since my last pass and neither is behavioural: 229821035c rewords the AppContainer comment so the deps guard's own identifier stays out of the prose it slices (that retires R14-2), and a5444d10 merges main.

Template looks good ✓ — all nine headings present.

Problem: observed, not theoretical. #9507 is still OPEN, filed from a real session with a five-step reproduction, and the PR carries a red-before/green-after component reproduction driven through the real ScrollableList/VirtualizedList viewport and the real keypress pipeline rather than a mocked one.

Direction: aligned. In VP mode the app owns the whole screen, so there is no terminal-native scrollback to fall back on; the main conversation view already renders its transcript in a scrollable virtual viewport, and this brings the teammate tab to parity with a behaviour the product has already decided on.

Size: not applicable for the core gate — all 14 files sit under packages/cli/src/ui/**, single package, no packages/core/src/** and no auth/providers/models/config/tools/services path. Breakdown: 363 production lines (AgentChatContent.tsx 221, AgentComposer.tsx 80, ToolConfirmationMessage.tsx 18, AgentViewContext.tsx 16, use-text-selection.tsx 13, AgentTabBar.tsx 9, AppContainer.tsx 6) vs 1161 test lines, 0 generated/schema. Below both the 500-line escalation and the 1000-line advisory.

Approach: the core of it is what I'd have written — branch on the same useTerminalBuffer flag MainContent uses, route the transcript through the existing ScrollableList, keep the committed/live split, leave the legacy <Static> path alone. The diff is no longer only a scroll fix, though. It also mounts the mouse and text-selection controllers on this tab, adds context-menu gates to five key consumers across four files, plumbs a footer layout key from AgentComposer through AgentViewContext into AppContainer's measure effect, and adds an unmount teardown to the selection hook. I want to be fair about why: ScrollableList arms SGR mouse capture on its own, so putting this tab's transcript in a viewport takes the mouse away from the terminal, and each of those additions is the parity cost of that. The review lane asked for it and it is not scope creep. The consequence is still worth naming plainly — both fixes that remain outstanding live in files this PR does not touch (ScrollableList.tsx and AskUserQuestionDialog.tsx), which is exactly where the author's own size fuse stops.

Risk: no elevated risk signals — Stage 1e matched none of the revert-correlated paths.

One thing the gate cannot score: this is round 15 on a PR AGENTS.md says should have converged at round 5, and the review lane has already approved and then rejected the identical commit 8a9412a8ea. So I am not opening a new round of findings. I re-verified the two Criticals that stand against the code at this head, and I think the call that is left is a human one — Stage 3 says why.

Moving on to code review. 🔍

中文说明

在 a5444d10 上重跑准入门禁。距上次审查有两个提交,且都不是行为性改动:229821035c 改写了 AppContainer 的注释,使 deps 守卫自己的标识符不再出现在它所切片的注释文本里(这就消除了 R14-2),a5444d10 合并了 main。

模板完整 ✓ —— 九个必需标题齐全。

问题:已观测到的真实缺陷,不是理论性加固。#9507 仍处于 OPEN 状态,来自一次真实会话并附带五步复现;PR 里给出了修复前红、修复后绿的组件级复现,走的是真实的 ScrollableList/VirtualizedList 视口机制与真实按键管线,而不是 mock。

方向:对齐。VP 模式下应用接管整个屏幕,没有终端原生回滚可以兜底;主对话视图本来就已经把转录渲染在可滚动的虚拟视口里,本 PR 让队友标签页对齐一个产品已经确立的行为。

规模:核心模块门禁不适用 —— 14 个文件全部位于 packages/cli/src/ui/**,单一 package,未触及 packages/core/src/**,也未触及 auth/providers/models/config/tools/services 路径。明细:生产代码 363 行(AgentChatContent.tsx 221、AgentComposer.tsx 80、ToolConfirmationMessage.tsx 18、AgentViewContext.tsx 16、use-text-selection.tsx 13、AgentTabBar.tsx 9、AppContainer.tsx 6),测试 1161 行,生成/schema 0 行。低于 500 行升级阈值与 1000 行大 PR 建议阈值。

方案:核心部分就是我会写的方案 —— 按 MainContent 使用的同一个 useTerminalBuffer 开关分支,把转录交给已有的 ScrollableList,保留已提交/进行中拆分,不动 legacy <Static> 路径。但这个 diff 已经不只是滚动修复:它还在这个标签页上挂载了鼠标控制器与文本选择控制器,为四个文件里的五个按键消费者加上了右键菜单门控,把 footer 布局 key 从 AgentComposer 经 AgentViewContext 接入 AppContainer 的测量 effect,并给选择 hook 加了卸载清理。这里要说句公道话:ScrollableList 自己就会开启 SGR 鼠标捕获,所以把这个标签页的转录放进视口就等于从终端手里接管了鼠标,上面每一项都是这件事的对齐成本。是评审线要求的,不是范围蔓延。但由此产生的后果仍然要点明 —— 两条尚未落地的修复都位于本 PR 未触及的文件里(ScrollableList.tsx 与 AskUserQuestionDialog.tsx),而这正好是作者自设的行数保险丝停住的地方。

风险:无升级风险信号 —— Stage 1e 未命中任何与 revert 相关的路径。

有一点门禁无法评分:按 AGENTS.md,本 PR 在第 5 轮就该收敛,而这是第 15 轮,并且评审线已经在同一个提交 8a9412a8ea 上先批准后拒绝过。所以这一轮我不再开新的发现。我对照本次 head 的代码重新核实了仍然悬挂的两条 Critical,剩下的那个判断应该由人来做 —— 理由见 Stage 3。

进入代码审查 🔍

— Qwen Code · qwen3.8-max-2026-09-02

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Collaborator

Code review

I wrote my independent proposal before reading the diff: branch AgentChatContent on the same uiState.useTerminalBuffer flag MainContent uses, route the transcript through the existing ScrollableList pinned to the tail, keep the committed/pending split so confirmations stay on the interactive path, leave the <Static> branch byte-identical, and — because the agent footer's height is invisible to AppContainer's controls-height measure — sync a layout key the way getLiveAgentPanelLayoutKey already does. That is what this PR does, including the layout key. On the central question the approach matches my baseline and I have no simpler path to offer for the scroll fix itself.

Where we differ is the tail. My version would have stopped at the viewport and left the mouse alone; this PR also mounts ContentMouseController and TextSelectionController. That is defensible — ScrollableList arms SGR mouse tracking whether or not you want it, so not mounting them would silently cost this tab OSC 8 link clicks and the right-click menu. But it is the reason the diff is 363 production lines rather than ~90, and it is the reason both standing Criticals are in shared files this PR does not otherwise touch.

Two Criticals still stand at a5444d10 — re-verified by reading, not by trusting the thread

I did not take the round-14 findings on faith. I read the cited code at this head; both files are outside the PR diff and byte-identical to main, so the citations are checkable directly.

1. AgentChatContent.tsx:391 (R13-1) — a queued wheel flush can still scroll an answerable dialog off screen, with no recovery. Real, and the mechanism is exactly as described:

  • use-frame-coalesced-flush.ts clears its 16 ms timer in only two places — cancel(), and the unmount effect useEffect(() => cancel, [cancel]).
  • ScrollableList.tsx:144-148 defines cancelPendingScroll(), and its sole caller is the left-press scrollbar branch at :164. No focus transition cancels anything.
  • applyPendingScroll (:121-136) has an empty dep array and reads no focus state, so it applies whatever delta was accumulated before the focus flip.
  • This PR adds !approvalPending to hasFocus (:401-406). That correctly quiets the viewport, but it also disables the keypress subscriber at ScrollableList.tsx:103 and the mouse subscriber at :187 — and approvalScrolledRef.current === true (:378-379) makes the pull-back one-shot, so nothing re-pins.

Net: scroll the wheel to re-read earlier output, an approval lands inside the 16 ms window, the pull-back runs, then the queued flush fires and moves the tail out of [renderRangeStart, renderRangeEnd]. ToolConfirmationMessage unmounts with its useKeypress subscription, pendingApprovals is only cleared by onConfirm/clearPendingApprovals() and has no timeout, and every input that could scroll it back is off. The only residual recovery is switching tabs and back, because AgentChatView.tsx:53 keys the ErrorBoundary by agentId — nothing on screen advertises that. On the legacy <Static> path this cannot happen, which is what makes it a regression rather than a pre-existing gap.

The author's recorded recipe (a hasFocus-loss cancelPendingScroll() in ScrollableList.tsx) is the right shape and also closes the same latent gap on MainContent's VP path. The constraint the thread names is real and must survive the fix: the latch at :378-379 has to stay unset until a scroll actually happens, or the "scrolled up before the approval arrived" case traps the user again.

2. ToolConfirmationMessage.tsx:624 (R14-1) — the menu gate stops one level short, so an Enter aimed at the context menu submits a half-typed answer. Real. This PR computes inputActive = isFocused && contextMenu === null (:71-77) and threads it into three consumers, including isFocused={inputActive} on AskUserQuestionDialog at :624. Inside that dialog, :357 is { isActive: isFocused } — gated — but the nested custom-answer input at AskUserQuestionDialog.tsx:564 is still hard-wired isActive={true}, with onSubmit={handleCustomInputSubmit} directly above it. KeypressContext broadcasts and discards return values, so on the ask_user_question flavour the Enter that picks a menu item also submits the draft as the answer and the teammate round proceeds on something the user never submitted. One line — isActive={isFocused} — in a file this PR does not touch. Do not re-force cursorVisible; TextInput.tsx:190 computes shouldRenderCursor = isActive && cursorVisible, and the cursor going still while the menu is up is the intended signal.

R14-2 is fixed. 229821035c rewords the AppContainer comment to Mirrors the LiveAgentPanel layout key (#5798)., so the identifier the source guard slices for no longer appears in prose, and the new agentViewMemoDeps() helper slices from '\n [' to '\n ],' — deps array only, not the memoized literal above it. That is a genuine improvement over the vacuous-pass shape, and the two new guards (agentComposerLayoutKey in the state memo, setAgentComposerLayoutKey in the actions memo) would each fail on the mutation they name.

Things I checked and am not raising

  • The use-text-selection.tsx unmount teardown is safe. getBuffer is useCallback(..., [stdout]) (:150-155), so useEffect(() => () => getBuffer()?.setSelection(null), [getBuffer]) really does fire once, on unmount, as its comment claims. Scoping it to unmount and not eventsPaused is correct — pausing must keep the selection the open menu's Copy Selection offers.
  • The layout key adds no new per-keystroke churn. AgentComposer.tsx:147 already syncs buffer.text into context on every keystroke, so agentComposerLayoutKey changing at the same cadence costs nothing extra.
  • Parity deltas with MainContent's VP path — the omitted measureAtFullHeight, the unwired selectionQueryRef (so Copy Selection cannot appear on this tab), no <OverflowProvider> wrapper — are all already reported and deferred with reasons on the record. The OverflowProvider one is not a gap at all: the agent view's legacy path never had one either. I am not re-raising any of them.

The ordering that makes R13-1 unrecoverable

sequenceDiagram
    participant P1 as User
    participant P2 as ScrollableList
    participant P3 as Coalesced flush timer
    participant P4 as AgentChatContent
    participant P5 as ToolConfirmationMessage
    P1->>P2: wheel up burst
    P2->>P3: schedule flush in 16ms
    P4->>P4: approvalPending becomes true
    P4->>P2: scrollToEnd pull-back then hasFocus false
    P4->>P5: dialog rendered at the tail
    P3->>P2: queued flush fires and applies the old delta
    P2->>P5: tail leaves the render window and the dialog unmounts
    P1->>P2: Page Down has no effect because hasFocus is false
    P4->>P4: latch already set so no second pull-back
Loading
Files changed (7 production files; 7 test files omitted)
File What changed
packages/cli/src/ui/components/agent-view/AgentChatContent.tsx The fix. New VP branch routing header, committed items, live items and spinner through one ScrollableList pinned to the tail; keeps the committed/pending split, mounts the selection and mouse controllers, gates the viewport on dialogs, shell focus, pending approvals and an open menu, and adds the one-shot pull-back that R13-1 turns into a trap.
packages/cli/src/ui/components/agent-view/AgentComposer.tsx Exports getAgentComposerLayoutKey over streaming state, status row, queue length and input text, syncs it to context so the footer gets re-measured, and quiets Escape plus Shift+Tab while a menu is open. Also gives the tab bar focus handler the click-away fall-through.
packages/cli/src/ui/contexts/AgentViewContext.tsx Carries the new layout key through state, actions and both memo dep arrays. Pure plumbing.
packages/cli/src/ui/AppContainer.tsx Adds the layout key to the controls-height measure effect deps, so a growing agent footer no longer leaves the viewport stale-high. Six lines, one of them the dep.
packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx Computes inputActive from isFocused and the open menu, and threads it into the keypress handler, AskUserQuestionDialog and RadioButtonSelect. Stops one level short of the nested input, which is R14-1.
packages/cli/src/ui/components/agent-view/AgentTabBar.tsx Deactivates the tab-switching keypress subscriber while a menu is open, so arrows aimed at the menu cannot switch away from a teammate awaiting approval.
packages/cli/src/ui/selection/use-text-selection.tsx Clears the painted highlight on controller unmount. Shared with the main view; the painted range outlives the component, so without this a tab switch re-stamps the band over cells nobody selected.

The 7 test files (1161 lines) cover the VP scroll round trip, the layout-key measurement and propagation guards, the context-menu gates, and the selection unmount teardown.

Testing

This is an unattended CI run — I did not build or execute any PR code. The evidence below is the PR's own CI on the reviewed commit, read through the API. No tmux session was driven (that path is local-invocation only).

Nothing is red. Fourteen legs are settled and one is still running, so this is not a complete picture and I am not presenting it as one. The three skipped legs are the ones I would most want for this change: Test (macos-latest) and Test (windows-latest) are skipped, so the suite only ran on Linux for a terminal-mouse and scroll-behaviour change, and Integration Tests (CLI, No Sandbox) is skipped as well.

Check Conclusion
Test (ubuntu-latest, Node 22.x) success
Lint & Static (ubuntu-latest, Node 22.x) success
Integration Tests (no-AK, No Sandbox) success
TUI parity snapshots (ink vs opentui) success
OpenTUI no-flicker gate success
Desktop Shell (ubuntu-22.04) success
Desktop Shell (windows-2022) success
Classify PR success
assign success
label success
Remind on force-push success
Test (macos-latest, Node 22.x) skipped
Test (windows-latest, Node 22.x) skipped
Integration Tests (CLI, No Sandbox) skipped
web-shell E2E Smoke (ubuntu-latest, Node 22.x) in_progress

Green here means the tests pass. It does not mean they pin this change, and for R13-1 they demonstrably cannot: the fix does not exist yet, so the suite is green with the defect in place.

Sandboxed verification would settle both open claims, and I'd ask for it before merging. @qwen-code /verify for R13-1 specifically — whether a wheel burst in flight when an approval lands displaces the dialog is a timing claim about a 16 ms window, and no amount of diff reading settles it; the author has write access, so this is a direct run rather than a sponsored one. @qwen-code /tmux for the headline claim — the PR's own Test Plan concedes "a live multi-teammate terminal session was not exercised on this machine", and the component-level reproduction drives a real viewport but not a real teammate, a real provider, or a real approval arriving mid-scroll. That last one is precisely R13-1's trigger.

Not verified: live multi-agent session with real teammates (author's claim is component-level only, on Linux); macOS and Windows terminals (both suite legs skipped); the second entrance to R13-1's root cause — content growing below a pinned dialog — which round 14 traced end to end but never executed, and which I have not attempted to confirm either. Treat it as unconfirmed and, per the author's own point 4, do not let it justify a larger change here.

中文说明

代码审查

在读 diff 之前我先写了自己的独立方案:让 AgentChatContent 按 MainContent 用的同一个 uiState.useTerminalBuffer 开关分支,把转录交给已有的、钉在尾部的 ScrollableList,保留已提交/进行中拆分以让确认框留在可交互路径上,让 <Static> 分支逐字节不变;并且——因为 agent footer 的高度对 AppContainer 的控件高度测量是不可见的——像 getLiveAgentPanelLayoutKey 那样同步一个布局 key。这个 PR 做的正是这些,布局 key 也包括在内。就核心问题而言,方案与我的基线一致,关于滚动修复本身我没有更简的路可提。

分歧在尾部。我的版本会止步于视口、不去动鼠标;本 PR 还挂载了 ContentMouseController 和 TextSelectionController。这说得通——不管你愿不愿意,ScrollableList 自己就会开启 SGR 鼠标跟踪,所以不挂载它们就会让这个标签页悄悄失去 OSC 8 链接点击和右键菜单。但这正是 diff 从约 90 行生产代码变成 363 行的原因,也正是两条未决 Critical 都落在本 PR 原本不触及的共享文件里的原因。

两条 Critical 在 a5444d10 上依然成立——通过读代码复核,不是照抄线程结论

我没有直接采信第 14 轮的结论,而是在本次 head 上读了被引用的代码;这两个文件都在 PR diff 之外且与 main 逐字节一致,所以引用可以直接核对。

1. AgentChatContent.tsx:391(R13-1)——排队中的滚轮 flush 仍会把可应答的对话框滚出屏幕,且无法恢复。 成立,机制与描述完全一致:use-frame-coalesced-flush.ts 只在 cancel() 和卸载 effect 两处清掉 16 ms 定时器;ScrollableList.tsx:144-148 的 cancelPendingScroll() 唯一调用点是 :164 的 left-press 分支,焦点变化不会取消任何东西;applyPendingScroll(:121-136)依赖数组为空且不读焦点状态。本 PR 给 hasFocus 加了 !approvalPending(:401-406),这确实让视口静默了,但同时也关掉了 ScrollableList.tsx:103 的按键订阅和 :187 的鼠标订阅,而 approvalScrolledRef.current === true(:378-379)让回拉只生效一次,于是没有任何东西会重新钉住尾部。

结果是:滚轮回看前面的输出时审批落在 16 ms 窗口内,回拉先执行,随后排队的 flush 触发并把尾部移出 [renderRangeStart, renderRangeEnd]。ToolConfirmationMessage 连同它的 useKeypress 订阅一起卸载,pendingApprovals 只能由 onConfirm/clearPendingApprovals() 清除且没有超时,而所有能把它滚回来的输入都已关闭。唯一剩下的恢复路径是切走标签页再切回(AgentChatView.tsx:53 用 agentId 作为 ErrorBoundary 的 key),屏幕上没有任何提示。legacy <Static> 路径上不会发生这件事,所以这是回归而不是既有缺口。

作者记录的修法(在 ScrollableList.tsx 里于 hasFocus 丢失时调用 cancelPendingScroll())方向正确,并且同时修掉 MainContent VP 路径上同样的潜在缺口。线程点明的约束必须保留::378-379 的闩锁在真正发生滚动之前不能置位,否则「审批到达之前就已经向上滚动」的情形会重新把用户困住。

2. ToolConfirmationMessage.tsx:624(R14-1)——菜单门控在最后一层之前停住,因此一个本意选择右键菜单项的 Enter 会提交打了一半的答案。 成立。本 PR 计算 inputActive = isFocused && contextMenu === null(:71-77)并接入三个消费者,包括 :624 传给 AskUserQuestionDialog 的 isFocused={inputActive}。在该对话框内部,:357 是 { isActive: isFocused }(已门控),但嵌套的自定义回答输入框在 AskUserQuestionDialog.tsx:564 仍被硬编码为 isActive={true},其正上方就是 onSubmit={handleCustomInputSubmit}。KeypressContext 广播分发并丢弃返回值,所以在 ask_user_question 这一类型上,用于选择菜单项的 Enter 同时会把草稿作为答案提交,teammate 的这一轮就会基于用户从未提交的内容继续。修复是一行 isActive={isFocused},位于本 PR 未触及的文件中。不要重新强制 cursorVisible——TextInput.tsx:190 计算 shouldRenderCursor = isActive && cursorVisible,菜单打开时光标停止闪烁正是预期的可见信号。

R14-2 已修复。 229821035c 把 AppContainer 的注释改写为 Mirrors the LiveAgentPanel layout key (#5798).,源码守卫所切片的标识符不再出现在注释文本里;新的 agentViewMemoDeps() 辅助函数从 '\n [' 切到 '\n ],'——只覆盖依赖数组,不含其上方的对象字面量。相比原先「空过」的形态这是实质改进,两条新守卫(state memo 中的 agentComposerLayoutKey、actions memo 中的 setAgentComposerLayoutKey)在各自点名的突变下都会失败。

我核对过但不提的意见

  • use-text-selection.tsx 的卸载清理是安全的。 getBuffer 是 useCallback(..., [stdout])(:150-155),所以 useEffect(() => () => getBuffer()?.setSelection(null), [getBuffer]) 确实如注释所说只在卸载时执行一次。把它限定在卸载而非 eventsPaused 上是正确的——暂停必须保留打开的菜单所提供的 Copy Selection 所需的选区。
  • 布局 key 没有引入新的每键抖动。 AgentComposer.tsx:147 本来就在每次按键时把 buffer.text 同步进 context,所以 agentComposerLayoutKey 以同样节奏变化不产生额外开销。
  • 与 MainContent VP 路径的对齐差异——省略的 measureAtFullHeight、未接线的 selectionQueryRef(因此这个标签页上不会出现 Copy Selection)、没有 <OverflowProvider> 包裹——都已被报告过并带理由延后在案。其中 OverflowProvider 根本不是缺口:agent 视图的 legacy 路径本来也没有。这些我都不再重提。

测试

这是无人值守的 CI 运行——我没有构建或执行任何 PR 代码。 下面的证据是通过 API 读到的、本 PR 自己在被审查提交上的 CI 结果。没有驱动 tmux 会话(那条路径只适用于本地调用)。

没有红灯。14 条已经出结果,1 条仍在运行,所以这不是一张完整的图,我也不把它当作完整的图来呈现。被跳过的三条恰恰是这个改动最需要的:Test (macos-latest) 和 Test (windows-latest) 都被跳过,因此一个涉及终端鼠标与滚动行为的改动只在 Linux 上跑过测试套件,Integration Tests (CLI, No Sandbox) 同样被跳过。

这里的绿灯只说明测试通过,不说明测试钉住了这个改动。对 R13-1 而言它们显然钉不住:修复还不存在,所以带着缺陷套件也是绿的。

沙箱验证可以判定这两条未决主张,我会要求在合入前先做。 R13-1 用 @qwen-code /verify——审批落在飞行中的滚轮爆发时对话框是否被位移,是一个关于 16 ms 窗口的时序主张,读多少遍 diff 都无法判定;作者有写权限,所以这是直接运行而非 sponsored run。头部主张用 @qwen-code /tmux——PR 自己的测试计划承认「本机上没有实际跑过多 teammate 的终端会话」,而组件级复现驱动的是真实视口,不是真实 teammate、真实 provider,也不是一个在滚动过程中真实到达的审批。最后那一项正是 R13-1 的触发条件。

未验证:带真实 teammate 的实时多 agent 会话(作者的主张仅为 Linux 上的组件级验证);macOS 与 Windows 终端(两条套件 leg 均被跳过);R13-1 根因的第二个入口——内容在已钉住的对话框下方增长——第 14 轮端到端追踪过但从未执行,我也没有尝试确认。请把它当作未确认信息,并按作者自己的第 4 点,不要用它来为这里更大的改动辩护。

— Qwen Code · qwen3.8-max-2026-09-02

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — the scroll fix itself is right and I would merge its core without hesitation; what keeps this at 3 is two Criticals I re-verified as standing at this head, and a scope-and-convergence call that is not mine to make.

Stepping back. The thing I asked myself in Stage 2 was whether I had a simpler path, and for the scroll fix I don't — it branches on the flag MainContent already uses, reuses the viewport that already exists, keeps the committed/live split, and leaves the legacy path alone. That is the whole of #9507 and it is about ninety lines. Six months from now I would thank the author for that part.

The part I'd argue with is what the review lane made this PR become. Mounting the mouse and selection controllers was a defensible answer to ScrollableList arming SGR capture on its own, but each round of parity has pulled in another shared surface, and the diff is now 363 production lines across seven files with five context-menu gates. That is the shape of a PR that has been reviewed fourteen times, not one that was designed at this size. I'm not going to ask for it to be re-shaped now — that ship left several rounds ago, and the gates that exist are, with one exception, correct.

The exception is what blocks me, and I want to be precise about why I'm not approving. Both standing findings are cheap: five lines between them. But they are not cosmetic.

  • R13-1 can wedge a teammate round with nothing on screen to answer and no timeout to recover it, and every input that could scroll the dialog back is deliberately disabled by this PR's own !approvalPending gate. The recovery path — switch tabs and back — is invisible. That is a fails-closed regression against the legacy <Static> behaviour, on a surface this diff creates.
  • R14-1 lets an Enter aimed at a right-click menu submit a half-typed custom answer, and the teammate proceeds on an answer the user never gave. The PR's own comment at :71-76 states the contract that this one flavour breaks, which is what makes it a false certification rather than a missing feature.

Merging those into main and deferring them to a follow-up is the one outcome I'd push back on hardest, because AGENTS.md's five-round rule says to land only Critical fixes at this point — it narrows the PR to Criticals, it does not license shipping them. Both recipes are already written down in their threads and both are small. If the size fuse is the obstacle, my answer is that five lines in two shared files is a much smaller risk than a known wedge, and ScrollableList.tsx's fix closes the same latent gap on MainContent's VP path at the same time.

What I genuinely cannot resolve from the diff, the tests, and the PR description is the convergence question the author raised, and it is a real one rather than a complaint. The lane approved commit 8a9412a8ea at 2026-09-13T09:51:45Z and then submitted CHANGES_REQUESTED on that identical commit at 11:31:11Z, minting two of the three findings with no code change in between. Round 14's own residual-risk note concluded land-with-residual-risk — that the exit is a maintainer risk-acceptance decision, not another review round — and the rate of first-time findings was flat at two for two consecutive rounds. So pushing cannot be assumed to converge this. Someone has to say "these two, then done", or accept the residual risk explicitly, and that someone is not this gate.

I am deferring rather than acting, and I have not submitted a review. The bot's CHANGES_REQUESTED from round 14 already stands and reviewDecision is already CHANGES_REQUESTED, so the PR is gated; a fifteenth request-changes would add a notification and no information. No approval either — I won't attest to a state I just verified is defective. Nothing in this comment asks the finalize job to approve on green, for the same reason, and in any case Qwen Code CI is still in progress on this head with the web-shell E2E Smoke leg running.

On the escalation mention: I could not resolve one, so there is no @mention below and I am not guessing a login. The deterministic resolver came back empty at every step — $QWEN_MAINTAINER_HANDLE is unset; the PR carries no labels, so the label-driven area match finds nothing; .github/issue-owners.json has no paths entry covering packages/cli/, which is also why the assign check completed successfully without assigning anyone; and latestReviews contains only the bot, so the human-reviewer fallback has nothing to fall back to. Two consequences worth a maintainer's attention: the scope call sits with the author, who is themselves a mapped core area owner and can either make it or route it; and if this PR should be escalating to a named person on future runs, an area label (or a packages/cli/ entry in the owners policy) is what would let the resolver pick one.

中文说明

Confidence: 3/5 —— 滚动修复本身是对的,其核心我会毫不犹豫地合入;之所以停在 3 分,是我在本次 head 上复核后确认仍然成立的两条 Critical,以及一个不属于门禁职权范围的范围/收敛判断。

退一步看。Stage 2 里我问自己有没有更简的路,就滚动修复而言没有——它按 MainContent 已在用的开关分支,复用已经存在的视口,保留已提交/进行中拆分,不动 legacy 路径。这就是 #9507 的全部内容,约九十行。六个月后回看,这部分我会感谢作者。

我会争论的是评审线把这个 PR 变成的样子。挂载鼠标与选择控制器是对「ScrollableList 自己就会开启 SGR 捕获」的一个合理回应,但每一轮对齐都又拉进一块共享表面,于是 diff 现在是七个文件、363 行生产代码、五处右键菜单门控。这是一个被评审了十四轮的 PR 的形态,而不是一开始就设计成这个规模的形态。我现在不打算要求重塑它——那个时机在几轮之前就过去了——而且现有的门控除了一处之外都是正确的。

那一处正是拦住我的地方,我想把不批准的理由说准确。两条未决发现都很便宜:加起来五行。但它们不是表面问题。

  • R13-1 会让 teammate 的一轮卡死,屏幕上没有任何可应答的东西,也没有超时能把它救回来,而所有能把对话框滚回来的输入都被本 PR 自己的 !approvalPending 门控刻意关掉了。恢复路径——切走标签页再切回——是不可见的。相对 legacy <Static> 行为这是 fails-closed 回归,且发生在这个 diff 新造的表面上。
  • R14-1 会让一个本意选择右键菜单项的 Enter 提交打了一半的自定义答案,teammate 随即基于用户从未给出的答案继续。PR 自己在 :71-76 写明了这个约定,而恰恰是这一种类型违反了它——这使它属于虚假保证,而不是缺少功能。

把它们合进 main 再推给后续 PR,是我最坚决反对的一种结局,因为 AGENTS.md 的五轮规则说的是此时只落地 Critical 修复——它是把 PR 收窄到 Critical,而不是允许把 Critical 推出去。两条修法都已经写在各自的线程里,而且都很小。如果障碍是行数保险丝,我的看法是:两个共享文件里的五行,比一个已知的卡死风险小得多;而 ScrollableList.tsx 的那个修复同时也会关掉 MainContent VP 路径上同样的潜在缺口。

我确实无法从 diff、测试和 PR 描述中解决的,是作者提出的收敛问题,而它是真问题,不是抱怨。评审线在 2026-09-13T09:51:45Z 批准了提交 8a9412a8ea,随后在 11:31:11Z 对同一个提交提交了 CHANGES_REQUESTED,在中间没有任何代码改动的情况下新造出三条发现中的两条。第 14 轮自己的残余风险结论是 land-with-residual-risk——出口应当是 maintainer 的风险接受决定,而不是再开一轮评审——而首次发现的产出速率连续两轮持平在 2 条。因此不能假设再推一次就会收敛。必须有人说「就这两条,然后结束」,或者显式接受残余风险,而这个人不是本门禁。

我选择延后而不是行动,并且没有提交评审。 机器人第 14 轮的 CHANGES_REQUESTED 仍然有效,reviewDecision 已经是 CHANGES_REQUESTED,PR 已被拦住;第 15 次 request-changes 只会多一条通知,不会多任何信息。也没有批准——我不会为我刚刚核实为有缺陷的状态背书。本评论中也没有任何请求「CI 转绿后自动批准」的指令,理由相同;况且本次 head 上 Qwen Code CI 仍在进行中,web-shell E2E Smoke 这一 leg 还在跑。

关于升级提及:我无法解析出任何人,所以下面没有 @mention,我也不会去猜一个 login。 确定性解析器在每一步都返回空——$QWEN_MAINTAINER_HANDLE 未设置;PR 没有任何标签,因此基于标签的区域匹配一无所获;.github/issue-owners.json 里没有覆盖 packages/cli/ 的 paths 条目,这也是 assign 检查成功完成却没有指派任何人的原因;latestReviews 里只有机器人,所以「最近的人类评审者」这条兜底无底可兜。有两点值得 maintainer 注意:这个范围判断落在作者身上,他本人就是 core 区域的映射 owner,可以自己决定或转交;以及如果希望这个 PR 在后续运行中升级给某个具名的人,需要的正是区域标签(或 owners 策略里的一条 packages/cli/ 条目),这样解析器才选得出人。

— Qwen Code · qwen3.8-max-2026-09-02

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

@github-actions

github-actions Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.9% 84.9% 90.53% 84.73%
Core 89.05% 89.05% 90.71% 87.52%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |    84.9 |    84.73 |   90.53 |    84.9 |                   
 src               |    86.6 |    82.79 |   88.88 |    86.6 |                   
  cli.ts           |   95.94 |    88.38 |     100 |   95.94 | ...12-713,717-718 
  llm.tsx          |   74.19 |    77.51 |   80.76 |   74.19 | ...1426-1430,1557 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   76.17 |    79.09 |   94.03 |   76.17 |                   
  acpAgent.ts      |   75.23 |     78.7 |    93.3 |   75.23 | ...43,14266-14267 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |     95.6 |     100 |     100 | 121,196,242,259   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   76.99 |    71.56 |     100 |   76.99 | ...20-524,533-537 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |   97.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.05 |     86.6 |    95.7 |   91.05 |                   
  Session.ts       |   90.43 |    85.68 |   95.09 |   90.43 | ...21,14248-14252 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.68 |    91.97 |   97.14 |   95.68 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |    85.71 |     100 |     100 | 68,70             
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.65 |    80.81 |   94.01 |   86.65 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.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 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.45 |    78.26 |   65.62 |   90.45 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.94 |      100 |      50 |   98.94 | 106               
  serve.ts         |   89.06 |    75.72 |     100 |   89.06 | ...27-930,942,953 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.51 |    88.75 |   90.73 |   89.51 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.91 |    96.27 |     100 |   96.91 | ...60-265,323-326 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.77 |    85.91 |   94.33 |   93.77 | ...1318,1325-1326 
  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.75 |    83.63 |      88 |   87.75 | ...97,603-606,618 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 22                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   92.08 |    90.61 |   93.59 |   92.08 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.79 |    96.81 |   94.11 |   94.79 | ...1192,1412-1450 
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.38 |    94.08 |    98.8 |   97.38 | ...7376-7420,7691 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.37 |    92.15 |     100 |   97.37 | ...1592,1806-1811 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.42 |    90.38 |   94.11 |   94.42 | ...1240,1275-1306 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.65 |    87.34 |   95.45 |   84.65 | ...43,859-913,927 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.23 |    80.45 |   88.88 |   81.23 | ...82-796,798-820 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.37 |    94.75 |   98.71 |   97.37 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.53 |    89.41 |     100 |   94.53 | ...36,669-670,837 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.24 |    95.31 |     100 |   98.24 | ...,832,1213,1230 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  prebuild.ts      |     100 |    96.15 |     100 |     100 | 248               
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.53 |    90.57 |   95.73 |   94.53 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.92 |    91.37 |   88.63 |   88.92 | ...2485,2487-2495 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.42 |   95.23 |   94.63 | ...24-625,693-694 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   95.65 |    97.36 |     100 |   95.65 | 137-142           
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |   98.91 |    84.61 |     100 |   98.91 | 332-333           
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.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.93 |    93.16 |   91.17 |   91.93 | ...1134,1136-1137 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   81.12 |     89.2 |   85.18 |   81.12 | ...03-621,628-636 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.69 |    88.66 |   93.02 |   89.69 |                   
  index.ts         |   73.58 |    77.77 |      90 |   73.58 | ...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 |   93.73 |    89.21 |   96.55 |   93.73 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   93.51 |       89 |   96.29 |   93.51 | ...08,550,592-597 
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.72 |    95.17 |     100 |   99.72 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.57 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |    96.15 |     100 |     100 | 26                
 src/serve         |   87.75 |    85.49 |   91.45 |   87.75 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.36 |     100 |     100 | 779               
  ...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.27 |    84.91 |     100 |   87.27 | ...22,828-832,850 
  ...er-manager.ts |    88.7 |    83.79 |   93.33 |    88.7 | ...27,755,768-775 
  ...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.02 |    81.25 |   94.73 |   91.02 | ...1121,1142-1147 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |    98.7 |    91.96 |     100 |    98.7 | ...1593,1595-1596 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |    91.4 |       82 |   95.45 |    91.4 | ...47-556,634-635 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...-path-open.ts |   96.12 |       97 |   93.33 |   96.12 | 114-123           
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.94 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.98 |    81.98 |   78.63 |   84.98 | ...9656,9674-9678 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   47.11 |    63.01 |   76.92 |   47.11 | ...1061,1073-1096 
  ...-keepalive.ts |   94.34 |    88.28 |     100 |   94.34 | ...42,546-547,586 
  ...-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.95 |    91.58 |   74.82 |   89.95 | ...3443,3474-3475 
  ...ments-root.ts |     100 |      100 |     100 |     100 |                   
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...ssion-gate.ts |   98.48 |    94.44 |     100 |   98.48 | 70                
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.67 |     81.3 |     100 |   98.67 | 111,139,198,201   
  ...tion-store.ts |    89.9 |    88.88 |   92.59 |    89.9 | ...03-412,423-426 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...93-594,601-602 
  ...e-remember.ts |   98.31 |    93.33 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.69 |     100 |   89.85 | ...06-207,275-296 
  ...oordinator.ts |   91.15 |    86.86 |     100 |   91.15 | ...95,424,455-456 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.91 |    73.04 |   96.29 |   72.91 | ...98-899,906-910 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.68 |    80.23 |   94.53 |   80.68 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.18 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   76.01 |    76.98 |   93.44 |   76.01 | ...5826,5883-5889 
  index.ts         |   83.61 |     80.6 |   91.22 |   83.61 | ...2465,2551-2552 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.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.69 |    78.84 |      93 |   86.69 |                   
  ...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.15 |    75.54 |   88.65 |   84.15 | ...3123,3132-3134 
 src/serve/fs      |   87.77 |    82.37 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.21 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   76.47 |    70.45 |    90.2 |   76.47 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   81.93 |    76.17 |   97.01 |   81.93 | ...1340,1372-1374 
  ...-installer.ts |   63.83 |    82.35 |   80.76 |   63.83 | ...45-446,460-475 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    90.09 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.17 |    81.97 |   95.75 |   86.17 |                   
  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.54 |    83.61 |   95.12 |   87.54 | ...2022,2067-2068 
  ...r-backfill.ts |   98.15 |    94.94 |     100 |   98.15 | ...,706,1011-1012 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.73 |    83.38 |   94.61 |   86.73 | ...7474,7476-7477 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.37 |    81.11 |     100 |   87.37 | ...00-502,505-510 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  user-language.ts |   99.24 |    87.87 |     100 |   99.24 | 167               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.27 |    80.75 |      90 |   83.27 | ...1071,1076,1083 
  ...extensions.ts |   89.92 |     79.5 |   94.36 |   89.92 | ...2588,2633-2634 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   77.42 |    72.78 |     100 |   77.42 | ...49-654,663-670 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...local-open.ts |     100 |    93.75 |     100 |     100 | 54                
  ...management.ts |   87.41 |    84.31 |     100 |   87.41 | ...1847,1857-1862 
  ...mcp-config.ts |   70.78 |    72.15 |   88.88 |   70.78 | ...10-413,432,442 
  ...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 
  ...untime-mcp.ts |   59.52 |    54.54 |   83.33 |   59.52 | ...50-251,265-273 
  ...ce-runtime.ts |     100 |    96.55 |     100 |     100 | 117               
  ...e-settings.ts |      79 |    78.72 |     100 |      79 | ...92-893,919-922 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.78 |    91.69 |   96.69 |   93.78 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.76 |    91.35 |   86.66 |   91.76 | ...35-247,293-294 
  ...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.76 |    82.82 |     100 |   89.76 | ...1015,1042-1051 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |   95.39 |     87.5 |     100 |   95.39 | 200-206           
  ...on-archive.ts |   92.46 |    90.49 |   97.61 |   92.46 | ...1150,1191-1192 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.45 |    93.93 |     100 |   97.45 | ...1240,1449-1453 
  ...pr-refresh.ts |   99.37 |    97.01 |     100 |   99.37 | 69-70             
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.18 |    97.65 |     100 |   99.18 | ...95,882,961-963 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |      90 |    87.33 |   91.66 |      90 |                   
  index.ts         |   89.65 |    86.98 |   90.47 |   89.65 | ...1393,1407,1421 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.73 |     89.8 |   98.13 |   92.73 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 108               
  ...killLoader.ts |   97.19 |    86.48 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.95 |    93.44 |     100 |   97.95 | 186,193-194       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.77 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |   93.03 |    88.57 |      95 |   93.03 |                   
  scheduler.ts     |   93.03 |    88.57 |      95 |   93.03 | ...70-372,424-428 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   89.28 |    84.03 |    90.9 |   89.28 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   81.51 |    76.11 |     100 |   81.51 | ...14,423,429-432 
 src/test-utils    |   94.62 |    77.41 |   81.81 |   94.62 |                   
  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.96 |    79.07 |   73.09 |   71.96 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   77.86 |    75.07 |    77.5 |   77.86 | ...4604,4720-4726 
  ...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.84 |    78.57 |   57.14 |   68.84 | ...65-467,497-502 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   73.75 |    70.24 |   61.22 |   73.75 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |    75.67 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   79.13 |     57.4 |     100 |   79.13 | ...01,424,431-437 
 src/ui/commands   |   84.78 |    84.63 |   91.73 |   84.78 |                   
  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 
  ...le-command.ts |   87.36 |    85.71 |     100 |   87.36 | 44-49,96-101      
  ...tyle-utils.ts |   94.36 |    96.29 |     100 |   94.36 | 53-56             
  peers-command.ts |     100 |    94.59 |     100 |     100 | 59,72,226,231     
  ...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.26 |    80.43 |   79.45 |   74.26 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |    89.2 |    91.13 |     100 |    89.2 | ...92-294,308-310 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.25 |      100 |       0 |   11.25 | 72-609            
  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.15 |   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             
  ...yleDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   84.02 |    74.19 |     100 |   84.02 | ...04,410,452-474 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      96 |    83.33 |     100 |      96 | 27                
  ...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 |      81 |    76.56 |   53.12 |      81 |                   
  ...atContent.tsx |   84.66 |    65.38 |   35.29 |   84.66 | ...21-423,433-435 
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |    82.8 |    81.39 |      75 |    82.8 | ...23,280-288,290 
  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 |    93.87 |     100 |     100 | 103,109,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 |   47.11 |       85 |   58.82 |   47.11 |                   
  ...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-77              
  ...nfirmStep.tsx |   17.39 |      100 |       0 |   17.39 | 28-71             
  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.73 |    87.91 |   86.53 |   90.73 |                   
  ...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.1 |    90.11 |     100 |    95.1 | ...1096,1141-1143 
 ...ponents/shared |   86.36 |    82.31 |    86.6 |   86.36 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.93 |    87.85 |      90 |   84.93 | ...82-583,700-701 
  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.81 |   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 |   18.06 |     62.5 |    8.33 |   18.06 |                   
  ...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 |   72.41 |     62.5 |     100 |   72.41 | ...32-139,163-170 
  ...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.64 |    82.56 |   86.48 |   86.64 |                   
  ...ewContext.tsx |    91.9 |       90 |      75 |    91.9 | ...01-205,291-301 
  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 |   96.42 |    91.66 |     100 |   96.42 | 47-48             
  ...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 | 157-158           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 238-239           
  ...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.6 |    84.51 |   88.91 |    86.6 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.86 |    71.95 |   83.33 |   86.86 | ...1541,1570-1574 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.92 |    85.26 |   85.18 |   88.92 | ...6312,6314,6420 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...le-command.ts |   97.33 |    83.33 |     100 |   97.33 | 49-50             
  ...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 |   39.47 |    41.93 |     100 |   39.47 | ...99-205,212-217 
  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.5 |    98.91 |     100 |    98.5 | 174-177           
  ...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.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.26 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/opentui    |   63.88 |    81.17 |   77.37 |   63.88 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  ...t-tool-run.ts |   97.26 |     62.5 |   66.66 |   97.26 | 116,130           
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...s-dispatch.ts |   80.74 |    84.65 |   74.07 |   80.74 | ...-987,1010-1021 
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  ...s-registry.ts |   98.82 |    89.58 |     100 |   98.82 | 180-182           
  dialog-data.ts   |   82.48 |    72.08 |   89.65 |   82.48 | ...1291,1295-1325 
  ...ogs-arena.tsx |       0 |      100 |     100 |       0 | 3-818             
  dialogs-auth.tsx |   76.17 |    66.85 |      84 |   76.17 | ...41,957,966-982 
  ...s-confirm.tsx |    54.3 |     62.5 |   68.75 |    54.3 | ...77-535,547-592 
  dialogs-core.ts  |     100 |    94.44 |     100 |     100 | 179,190           
  ...xtensions.tsx |   89.06 |     82.7 |   78.57 |   89.06 | ...33-636,659-661 
  dialogs-mcp.tsx  |   29.85 |    98.71 |      90 |   29.85 | 295,320-872       
  ...ry-status.tsx |   22.58 |       80 |   28.57 |   22.58 | ...11-154,159-175 
  dialogs-misc.tsx |   12.02 |      100 |      20 |   12.02 | ...47-655,658-712 
  ...ogs-model.tsx |   45.95 |    96.77 |   76.92 |   45.95 | ...72-173,243-408 
  ...ogs-modes.tsx |   64.62 |    87.87 |   77.77 |   64.62 | 124-164,178-225   
  ...rmissions.tsx |   18.65 |    89.28 |   83.33 |   18.65 | ...58-159,201-734 
  ...-settings.tsx |   20.25 |    84.61 |    90.9 |   20.25 | ...71,239,254-870 
  ...gs-shared.tsx |   84.61 |    80.55 |   53.84 |   84.61 | ...51,453-456,472 
  ...ts-skills.tsx |     5.8 |      100 |       0 |     5.8 | ...04-381,391-458 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  diff-render.ts   |   97.87 |    95.23 |     100 |   97.87 | 89-90             
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |      91 |    74.54 |   88.88 |      91 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  ...rust-gate.tsx |   98.55 |    96.55 |      75 |   98.55 | 190-191           
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  help-overlay.tsx |       0 |      100 |     100 |       0 | 3-281             
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...prompt-key.ts |     100 |      100 |     100 |     100 |                   
  ...ompt-model.ts |   85.41 |    87.81 |   84.09 |   85.41 | ...1127,1130-1140 
  input-prompt.tsx |   82.58 |    70.48 |      28 |   82.58 | ...1076,1090-1092 
  ...projection.ts |   81.16 |    62.66 |   86.66 |   81.16 | ...1077-1082,1084 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  ...sion-model.ts |   85.89 |    85.88 |     100 |   85.89 | ...47,502,602,658 
  live-session.ts  |   89.34 |    84.67 |   72.72 |   89.34 | ...53,555,572-582 
  live-turn.ts     |    78.3 |    73.68 |      75 |    78.3 | ...26,331,335-336 
  markdown-heal.ts |     100 |      100 |     100 |     100 |                   
  ...rogressive.ts |   85.41 |    83.33 |   71.42 |   85.41 | 53,60-62,89-91    
  messages.tsx     |   58.82 |     79.1 |   73.68 |   58.82 | ...93-409,417-474 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  mouse-rows.ts    |     100 |      100 |     100 |     100 |                   
  ...-scrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...app-shell.tsx |   96.41 |    91.08 |   73.33 |   96.41 | ...77-379,444-446 
  ...tui-assets.ts |     100 |      100 |     100 |     100 |                   
  ...log-mount.tsx |   72.48 |    90.76 |   28.57 |   72.48 | ...64,484,559-575 
  ...-boundary.tsx |   95.91 |      100 |   85.71 |   95.91 | 82-83             
  opentui-host.ts  |   97.53 |    94.73 |   97.43 |   97.53 | ...04,216,236-237 
  ...ui-runtime.ts |   93.57 |    80.95 |     100 |   93.57 | 97-101,152,173    
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...-selection.ts |     100 |    96.96 |     100 |     100 | 84                
  ...me-session.ts |   72.34 |    77.77 |   57.14 |   72.34 | 40,44,59-63,76-81 
  ...ompaction.tsx |   76.19 |      100 |   66.66 |   76.19 | 106-130           
  ...wind-model.ts |    94.7 |    87.23 |     100 |    94.7 | 245-252,254       
  ...on-rewind.tsx |       0 |      100 |     100 |       0 | 3-391             
  ...ion-switch.ts |   74.74 |       50 |     100 |   74.74 | ...92-401,411-414 
  ...h-dispatch.ts |   56.86 |    38.88 |      50 |   56.86 | ...13-126,130-137 
  slash-gateway.ts |     100 |    86.36 |    90.9 |     100 | 56,72,100         
  ...pentui-ui.tsx |   35.19 |    61.53 |      50 |   35.19 | ...97,403-409,435 
  sticky-todos.ts  |     100 |      100 |     100 |     100 |                   
  text-batcher.ts  |     100 |      100 |     100 |     100 |                   
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
  ...pt-adapter.ts |   89.56 |       75 |   33.33 |   89.56 | ...50-152,172-173 
  ...ript-view.tsx |       0 |      100 |     100 |       0 | 3-516             
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.14 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   88.07 |    86.06 |   96.15 |   88.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |    97.14 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.73 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.45 |     100 |     100 | 84                
  mouse-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    80.98 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |      90 |     87.5 |     100 |      90 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.75 |    95.96 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.31 |    90.01 |   96.11 |   92.31 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.14 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   96.05 |    93.79 |     100 |   96.05 | ...,85-86,334,443 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.44 |    97.36 |     100 |   99.44 | 121               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   89.05 |    87.52 |   90.71 |   89.05 |                   
 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.4 |    84.86 |   94.02 |    90.4 |                   
  ...transcript.ts |   88.86 |    81.05 |     100 |   88.86 | ...93,701,707-711 
  ...ent-resume.ts |   85.43 |    78.13 |    85.1 |   85.43 | ...1845-1849,1852 
  ...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.78 |    86.68 |   75.86 |   77.78 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.14 |    90.74 |   97.05 |   92.14 | ...38-539,673-679 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.49 |    87.53 |   91.66 |   93.49 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  ...-test-mock.ts |   98.82 |    66.66 |   58.33 |   98.82 | 85                
  agent-core.ts    |   90.33 |    80.45 |   81.25 |   90.33 | ...2628,2674-2676 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.67 |       90 |   83.33 |   93.67 | ...13-514,517-518 
  ...nteractive.ts |   83.48 |    85.13 |      80 |   83.48 | ...35,537,544,549 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.87 |     90.5 |     100 |   93.87 | ...2225,2318-2321 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.08 |     85.4 |   95.65 |   94.08 | ...68,435,455-458 
  ...ow-sandbox.ts |    97.4 |    89.37 |     100 |    97.4 | ...1846,1852-1853 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   86.27 |    86.86 |   91.89 |   86.27 |                   
  TeamManager.ts   |   80.54 |    85.41 |   84.37 |   80.54 | ...2123,2146-2147 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.84 |    84.23 |     100 |   89.84 | ...1013,1057-1058 
  team-events.ts   |   86.84 |      100 |   83.33 |   86.84 | 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.31 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |       85 |     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.63 |    88.95 |   79.11 |   86.63 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   85.28 |     88.3 |    77.2 |   85.28 | ...9865,9869-9871 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...ver-config.ts |   97.29 |      100 |   83.33 |   97.29 | 48-49             
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.79 |    88.68 |   94.05 |   92.79 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.33 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.1 |    88.04 |   92.23 |    92.1 | ...4966,5064-5065 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...09-510,555-561 
  ...lScheduler.ts |   90.22 |    84.89 |   94.78 |   90.22 | ...6545,6573-6589 
  ...entContext.ts |   96.67 |    90.25 |   96.77 |   96.67 | ...48,450-451,518 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  llm-chat.ts      |   95.32 |    90.98 |   96.66 |   95.32 | ...5891,5936-5937 
  llm-request.ts   |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   94.11 |    91.47 |   86.36 |   94.11 | ...1311,1514-1515 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  stream-guards.ts |   91.16 |    93.33 |     100 |   91.16 | ...89,218-229,294 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |     92.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.21 |    94.69 |     100 |   99.21 | 787-788,857       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.62 |    89.21 |   97.43 |   96.62 |                   
  ...tGenerator.ts |   97.71 |    89.13 |   97.43 |   97.71 | ...1539,1568,1579 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.62 |    91.33 |   96.39 |   92.62 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.54 |    90.66 |   96.87 |   91.54 | ...1994,2163-2178 
  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.46 |     91.3 |     100 |   96.46 | ...1236-1237,1368 
  ...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.96 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.25 |    92.07 |   98.64 |   97.25 |                   
  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.9 |    96.29 |     100 |    98.9 | 178,307           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   89.29 |    86.66 |   93.68 |   89.29 |                   
  ...ive-safety.ts |    97.9 |     92.8 |     100 |    97.9 | 235-236,313-316   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   93.05 |    89.59 |   98.36 |   93.05 | ...1694-1700,1744 
  ...ionManager.ts |   85.41 |    84.48 |   83.49 |   85.41 | ...3261,3299-3300 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |   78.91 |    86.04 |   85.71 |   78.91 | ...95,202,214-248 
  github.ts        |   92.61 |    87.44 |     100 |   92.61 | ...1310-1311,1321 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |    93.7 |    90.48 |   95.32 |    93.7 |                   
  ...eGoalStore.ts |   87.61 |    89.28 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.96 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.79 |   97.36 |   95.75 | ...76,666,684-685 
  goal-runtime.ts  |   96.54 |    90.73 |   96.49 |   96.54 | ...1649-1650,1794 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   97.58 |    94.27 |   97.72 |   97.58 | ...96-697,927-928 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.53 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   90.62 |    87.01 |   90.32 |   90.62 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.87 |    94.11 |     100 |   96.87 | 68-69             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.64 |    85.71 |   94.73 |   95.64 | ...1059-1060,1070 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   85.68 |    82.96 |    92.3 |   85.68 | ...1289,1299-1302 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...62-763,769-770 
  ...HookRunner.ts |   79.12 |    66.66 |      80 |   79.12 | ...38-439,457-461 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   82.47 |    84.21 |      75 |   82.47 | 63-67,174-189     
  ...oksManager.ts |   94.89 |    90.47 |     100 |   94.89 | ...97,338,340-342 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ipc           |   94.83 |     94.5 |   96.96 |   94.83 |                   
  inbound-gate.ts  |   99.05 |    90.43 |     100 |   99.05 | 604-606           
  ...-directory.ts |     100 |      100 |     100 |     100 |                   
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.97 |    96.62 |     100 |   97.97 | 277-279           
  peer-routing.ts  |     100 |      100 |     100 |     100 |                   
  peer-send.ts     |   97.22 |    98.41 |   88.88 |   97.22 | 183-187           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   86.92 |    93.33 |   85.71 |   86.92 | 193-209           
  uds-inbox.ts     |   85.85 |    88.13 |     100 |   85.85 | ...90,297-307,371 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   89.47 |    85.73 |    92.1 |   89.47 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.71 |    81.14 |   94.44 |   90.71 | ...17,640,657-663 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |   78.43 |    83.16 |   77.77 |   78.43 | ...1493,1506-1508 
  ...ent-config.ts |   92.22 |    84.78 |      92 |   92.22 | ...64,473-474,478 
  memoryAge.ts     |   90.47 |    84.61 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   97.21 |    95.29 |     100 |   97.21 | ...29,341,345-347 
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   79.76 |    76.84 |      80 |   79.76 | ...69-473,476,482 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   91.82 |    89.71 |   89.15 |   91.82 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   91.11 |    93.02 |     100 |   91.11 | 155,161,164-173   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    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.03 |     100 |     100 | 181,266           
  modelsConfig.ts  |   88.45 |    86.88 |   83.72 |   88.45 | ...1437,1460-1461 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   84.54 |    91.72 |   71.88 |   84.54 |                   
  autoMode.ts      |   97.75 |    93.42 |     100 |   97.75 | ...91-598,644,721 
  ...transcript.ts |   98.51 |    86.11 |     100 |   98.51 | 264-265           
  classifier.ts    |      94 |    94.44 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    90.19 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |    88.4 |    92.27 |   82.85 |    88.4 | ...1408,1514-1518 
  rule-parser.ts   |   94.92 |    92.81 |     100 |   94.92 | ...1555,1589-1591 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.06 |    95.23 |     100 |   99.06 |                   
  system-prompt.ts |   99.06 |    95.23 |     100 |   99.06 | 235               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.86 |    86.65 |   96.52 |   90.86 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.47 |    88.69 |     100 |   98.47 | 85-86,109,473-474 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.82 |    96.77 |     100 |   97.82 | ...1150,1294-1302 
  ...ingService.ts |   92.25 |    87.61 |   94.79 |   92.25 | ...2924,2939-2940 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |   97.85 |    95.23 |     100 |   97.85 | ...64-365,485-488 
  cronScheduler.ts |   94.11 |    89.74 |   98.03 |   94.11 | ...1366,1775-1776 
  cronTasksFile.ts |   96.62 |    92.85 |     100 |   96.62 | ...46,371-372,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 |      75 |       71 |   96.07 |      75 | ...2318,2347-2348 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   97.85 |    94.09 |     100 |   97.85 | ...1217,1240-1241 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   94.28 |     91.8 |   92.59 |   94.28 | ...31-733,864-866 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.82 |    96.81 |     100 |   98.82 | 642,696-697,759   
  ...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.79 |       88 |   92.46 |   89.79 | ...4589-4590,4631 
  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 |   91.89 |    86.15 |     100 |   91.89 | ...52-555,607-608 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.04 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.04 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.95 |     86.4 |   94.73 |   89.95 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   95.02 |    87.87 |     100 |   95.02 | ...19,239,251-253 
  skill-manager.ts |    86.6 |     86.6 |   86.11 |    86.6 | ...1286,1293-1297 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 289-290           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   89.01 |    89.44 |   98.41 |   89.01 |                   
  ...ter-schema.ts |     100 |    98.18 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |    85.9 |    86.56 |   97.67 |    85.9 | ...1682,1759-1760 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   94.14 |    95.23 |     100 |   94.14 | 47-52,65-66,71-76 
 src/telemetry     |   83.24 |    85.31 |   86.51 |   83.24 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.88 |    92.85 |   83.78 |   87.88 | ...55-561,564-568 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.83 |    77.24 |   66.66 |   60.83 | ...1523,1540-1560 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.29 |    95.77 |   86.36 |   83.29 | ...1470,1474-1481 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...ry/qwen-logger |   74.14 |       80 |      70 |   74.14 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.14 |    79.82 |   69.49 |   74.14 | ...1123,1161-1162 
 src/test-utils    |   97.69 |    98.66 |   86.36 |   97.69 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   97.14 |      100 |   82.85 |   97.14 | 85-86,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.92 |    86.54 |   90.47 |   87.92 |                   
  ...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.37 |     83.8 |   94.73 |   83.37 | ...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         |   79.61 |    85.04 |   93.06 |   79.61 | ...5228,5303-5304 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   97.15 |    90.79 |   92.59 |   97.15 | ...43,737-740,744 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   87.57 |    78.94 |     100 |   87.57 | ...71,157,161-168 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   88.67 |     87.5 |   85.71 |   88.67 | ...2-48,72-73,129 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.99 |    91.84 |   93.75 |   95.99 | ...21-625,638-643 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.72 |    82.95 |   86.53 |   80.72 | ...1106,1114-1115 
  ...-finalizer.ts |    98.1 |    92.36 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |    96.2 |    89.79 |   93.75 |    96.2 | ...10,260-265,428 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...67-568,584-590 
  truncation.ts    |   90.72 |    90.51 |     100 |   90.72 | ...65-473,510-516 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   86.69 |    88.65 |   89.71 |   86.69 |                   
  agent.ts         |   85.26 |    87.84 |   87.35 |   85.26 | ...4379,4413-4423 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   89.29 |    86.71 |   83.33 |   89.29 |                   
  workflow.ts      |   89.29 |    86.71 |   83.33 |   89.29 | ...91-892,991-992 
 src/utils         |      93 |    89.94 |   97.03 |      93 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |       90 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   99.49 |    96.25 |     100 |   99.49 | 224               
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.59 |    90.32 |     100 |   94.59 | 40-41,137-138     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    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  |   94.04 |    87.79 |   96.87 |   94.04 | ...1040-1041,1155 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.39 |    81.95 |     100 |   95.39 | ...1075,1421-1422 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  ...-pr-issues.ts |   99.45 |    97.14 |     100 |   99.45 | 182               
  github-prs.ts    |   96.34 |    87.87 |     100 |   96.34 | ...81,586-587,674 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.36 |    91.07 |     100 |   95.36 | ...99-203,275-279 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.75 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.24 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  ...ollow-open.ts |     100 |    93.33 |     100 |     100 | 134,177           
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.42 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  ...load-error.ts |   93.47 |    88.23 |     100 |   93.47 | 64-65,80          
  retry.ts         |   96.09 |    92.23 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.05 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.22 |    98.01 |     100 |   98.22 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.55 |    90.54 |     100 |   96.55 | ...34,650,734,753 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.57 |     100 |    98.3 | ...1340-1342,1352 
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |     86.2 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |    66.66 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.61 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship — CI landed green after the review. ✅

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

Test Plan (not a blocker): src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory.

中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。

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

Test Plan(非阻断):src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory。

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

Comment thread packages/cli/src/ui/components/agent-view/AgentChatContent.tsx
Comment thread packages/cli/src/ui/components/agent-view/AgentChatContent.tsx Outdated
Comment thread packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx
Comment thread packages/cli/src/ui/components/agent-view/AgentChatContent.tsx
Comment thread packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx
Comment thread packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx

@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 reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

Test Plan (not a blocker): src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory; 68 tests pass — this review observed 22032 passed.

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

  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:271 — [review] D2-1 the VP spinner path is untested — deleting the spinner spread survives the whole new suite (mutant verified); deferred by the code-age rule: anchored on code…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:263 — [review] R1-1 still stands — item-identity rebuild defeats memo(HistoryItemDisplay); author declined in round 1 as a separate rendering-performance change
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:346 — [review] R1-3 still stands — the third test does not pin the head-to-tail round trip its comment promises; author declined in round 1 as test-matrix expansion
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:60 — [review] R1-4 still stands — the key-must-not-encode-pending-ness invariant has no test driving a pending-to-committed transition; author declined in round 1
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:342 — [review] R1-5 still stands — the hasFocus/isActive gate is only tested in its all-false default; author declined in round 1 as a separate test-matrix expansion
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:97 — [review] R1-6 still stands — createUIState factory is a near-verbatim copy of MainContent.test.tsx's; author declined in round 1 as unrelated test-infrastructure refac…
中文说明

仅完成部分审查,审查缺口已披露。

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

Test Plan(非阻断):src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory; 68 tests pass — this review observed 22032 passed。

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

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

Comment thread packages/cli/src/ui/components/agent-view/AgentChatContent.tsx
yiliang114 and others added 6 commits August 29, 2026 18:11
Bring in the typecheck:integration and check:tui-dep-direction scripts
added on main so the CI gate steps stop failing with "Missing script".

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
AppContainer's controls-height measure effect tracked only
main-conversation state, so on the agent tab the Completed/Failed
status row, queued messages and input growth never triggered a
re-measure: controlsHeight stayed stale-high and the transcript
viewport pushed the composer and tab bar past the terminal bottom.

AgentComposer now derives a layout key from its height-shifting state
(streaming state, status row, queued messages, input text) and syncs
it to AgentViewContext; the measure effect depends on that key,
mirroring liveAgentPanelLayoutKey from #5798.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Main renamed GeminiRespondingSpinner to RespondingSpinner; the merge
kept the old name at the viewport's spinner item and broke typecheck.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Main renamed GeminiRespondingSpinner to RespondingSpinner; update the
teammate-tab spinner usage and its test mock so the merged tree compiles.

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

Copy link
Copy Markdown
Collaborator Author

CI attribution — Test (ubuntu-latest, Node 22.x) failure on run 33249328264 (head 4da1dae): NOT PR-caused.

  • This PR only touches packages/cli/src/ui/components/agent-view/*, AgentViewContext.tsx, AppContainer.tsx (+ tests). None of the 7 failing suites overlap the diff: commands/channel/memory-intent-classifier.test.ts (1), commands/review/compose-review.test.ts (1), commands/serve.test.ts (1), commands/update.test.ts (2), serve/process-env-guard.test.ts (1), serve/server-default-bridge-wiring.test.ts (3), ui/components/SessionPreview.test.tsx (2).
  • The job died at the 60m cap (orphan-process termination at 12:10:31Z) with suites still running — a runner-stall pattern, not a deterministic test failure.
  • The process-env-guard + update.test.ts failure pair also appears on fix(tools): treat blank task_list filters as absent #10159's ubuntu leg in the same window (different PR, same runner pool), pointing at a fleet-runner environment issue.

Triggering a failed-jobs rerun; leaving the infra attribution to maintainers.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI triage (run 33249328264, head 4da1dae): re-running failed jobs. The web-shell E2E Smoke failures are collapsed-groups-persist and split-persist — this PR touches only packages/cli agent-view/AppContainer (0 web-shell files), and the same run lists 6 flaky specs on the shared runner. Test ubuntu failure attribution (7 suites outside the diff, 60m cap) is in the previous comment; Post Coverage Comment failed in 14s (infrastructure). Triggering --failed rerun.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

  • R1-6 createUIState test-factory duplication (round 3 refiled it with gemini→memory key-drift evidence) — already reported (comment 3818835361), author declined in round 1 as unrelated test-infrastructure refactoring

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

Test Plan (not a blocker): src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory.

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

  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:348 — [probe] D3-1 agent VP path omits measureAtFullHeight — probe shows one clipped confirmation frame that self-heals next frame; deferred by the code-age rule (anchor unchang…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:354 — [probe] D3-2 ScrollableList/TextSelectionController wiring duplicated near-verbatim from MainContent and already drifted; deferred by the code-age rule (anchor unchanged s…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:271 — [review] D3-3 (re-deferral of D2-1) VP spinner branch untested — deleting the spinner spread survives the suite; deferred by the code-age rule

Convergence: round 3 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 1 (1 new). The rate of new findings is not falling. 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.)

中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。

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

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

Test Plan(非阻断):src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory。

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

收敛情况:第 3 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 1 条(其中 1 条首次提出)。新发现的产出速度没有下降。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/cli/src/ui/contexts/AgentViewContext.tsx
)

R3-1: the provider link of the #9507 layout-key chain was the only link
without a source guard. Pin agentComposerLayoutKey in the state memo deps
and setAgentComposerLayoutKey in the actions memo deps of
AgentViewContext.tsx by extending app-container-controls-dep.test.ts in
the PR's established guard style. Mutation-verified: dropping either
entry from its deps array (while the object literal keeps it) turns
exactly the matching new test red, and every pre-existing test stays
green.

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.

⚠️ 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). Partially reviewed — gaps disclosed.

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

Test Plan (not a blocker): src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory.

2 Suggestion(s) were drafted inline past the resolved critical posting floor — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s); the CLI moved them into the deferral list below (floor enforcement).

Deferred under the convergence posture (round 4, not a blocker) — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s) — recorded, not requested in this round:

  • packages/cli/src/ui/app-container-controls-dep.test.ts:110 — [review] R4-2: This guard comment states the staleness direction backwards. If the dep above is dropped and the agent footer grows (status row appears, messages queue, input wraps…
  • packages/cli/src/ui/app-container-controls-dep.test.ts:152 — [review] R4-1: This comment describes a failure mechanism the code cannot have. setAgentComposerLayoutKey is a raw useState setter (AgentViewContext.tsx:165, passed unmodified…
中文说明

⚠️ 已从批准降级为评论:CI failing: Post Coverage Comment (ubuntu-latest, 22.x), web-shell E2E Smoke (ubuntu-latest, Node 22.x), Test (ubuntu-latest, Node 22.x)。 仅完成部分审查,审查缺口已披露。

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

Test Plan(非阻断):src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory。

2 条 Suggestion 在已解析的 critical 发布下限之外被起草为行内评论——发布下限因首次发现速率连续 2 轮未下降而提前生效;CLI 已将其移入下方延后清单(下限强制执行)。

收敛姿态下延后(第 4 轮,非阻断)——发布下限因首次发现速率连续 2 轮未下降而提前生效——已记录,本轮不要求修改:共 2 条(原文未翻译,列表见上方英文部分)。

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI attribution — Test (ubuntu-latest, Node 22.x) (run 33255831712, job 99134475489): NOT PR-caused.

Shape: job-level 1h timeout kill. Every suite that completed before the kill passed:

  • 34 test files / 1795 tests passed
  • 1 file / 2 tests passed; 8 files / 79 tests passed
  • zero failing tests in the log before the The job has exceeded the maximum execution time of 1h0m0s annotation

The runner-health probe also reported its positive control inconclusive ("the injected always-failing test did not turn the run red — a dead runner, a collector that skipped it, or a reporter that dropped the failure"), i.e. the runner itself was sick. Same sick-runner/timeout signature seen repo-wide this window (#10159, #10394, #9260 prior attempts).

web-shell E2E Smoke (job 99141541831) hit its own 20m job cap with zero diff overlap (this PR touches agent-view/AppContainer only); main's E2E leg is also red in the same window ("Main CI failed: E2E Tests" on d3ab6ea).

Triggering a failed-jobs rerun.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI attribution — run 33255831712 latest attempts (head 1576cfd): remaining red legs NOT PR-caused.

  • Test (ubuntu-latest) latest attempt (job 99182509843) again died at the exact 1h job cap (annotation "exceeded the maximum execution time of 1h0m0s") — same shape as job 99134475489 documented above.
  • web-shell E2E Smoke (job 99189453154): killed at its 20m cap; this PR's diff is CLI agent-tab UI only, zero overlap with the timed-out E2E navigation.
  • Self-hosted ECS runner pool saturated ~24h. Rerun triggered.

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

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

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

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

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

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

Verification report

PR #9531 verification — fix(cli): make the Agent Team teammate tab transcript scrollable in VP mode

Verdict: merge-ready — 117/117 scripted assertions passed (0 unexpected failures), verified head 1576cfda32889f411135086f50082f43efc1e17f (base bf054479b1fc59b97cbcd1617a812be14b28e134).

中文摘要
  • 结论: merge-ready。117 条脚本化断言全部符合预期,0 条意外失败。
  • A/B 结论: 核心声明(VP 模式下队友标签页转录进入可滚动虚拟视口)经 A/B 证实:PR 自带测试在 base(bf05447)上 1/3 红(VP 用例红,因 base 无视口)、在 head(1576cfd)上 3/3 绿;独立边界探针 head 5/5 绿、base 2/5 红,翻转的恰为视口专属行为(见 01-ab-pr-harness-base-vs-head.png、03-boundary-probes-head.png)。
  • 变异矩阵: 8 个变异中 7 个被杀(含 3 处 useMemo/effect 依赖数组守卫,各自恰好杀红对应的新守卫测试);唯一存活者 M3(agentVpIsStatic 全置 true)经读 StaticRender 源码判定为仅布局影响(固定宽度 Box 包装),真实交互契约由 isPending 渲染路径承担(M4 钉住),归类为冗余防御,非缺陷。
  • 门: agent-view + ScrollableList + controls-dep 共 9 文件 90 测试全绿;tsc --noEmit(packages/cli)零诊断;eslint 对 4 个改动文件零报告(并植入违规证明门是活的)。
  • 未覆盖: 真实多队友会话(无模型提供方)、macOS/Windows、逐 commit 归因(depth-2 shallow)、roster 面板缺陷(issue 已声明另案)、SessionPreview(/resume 预览)的 <Static> 同族观察(仅静态观察,未实证,且属对话框表面、超出本 PR 范围)。

Central claim and A/B proof

Central claim: with ui.useTerminalBuffer on (default, confirmed: terminal-buffer.ts:51 useTerminalBuffer ?? true), the teammate tab transcript renders in the same ScrollableList virtual viewport as the main view — pinned to the tail, scrollable with Page Up/Page Down/Ctrl+Home/Ctrl+End — while the legacy <Static> path for useTerminalBuffer: false is unchanged.

The PR's own harness (AgentChatContent.test.tsx, real ScrollableList/VirtualizedList + real keypress pipeline, leaf display components mocked) was run on a scratch worktree of the base tip and on head. Base-side control purity: the PR touches only packages/cli; cross-workspace deps (@qwen-code/qwen-code-core etc.) resolve to head-tree dists that are byte-identical at base (realpaths asserted); the worktree's packages/cli/dist (head build) was deliberately not linked so the base cell cannot load head code.

cell VP Page-Up test legacy test pending-split test
base bf05447 ❌ red (no VP path: selection controller never mounts, no viewport) ✅ green ✅ green (trivially: everything always visible)
head 1576cfd ✅ green ✅ green ✅ green (via viewport, TOOLGROUP:20:pending on the interactive path)

Flip: 1/3 → 3/3; the single flip is exactly the central-claim test. Witness: 01-ab-pr-harness-base-vs-head.png.

Independent boundary harness (harnesses/pr9531-boundary.verify.test.tsx, different fixtures; leaf mocks only):

probe head base
P1 empty transcript: header renders, Page Up no crash ✅ ✅
P2 single message: header + message visible ✅ ✅
P3 Ctrl+Home/Ctrl+End + PageUp/PageDown round-trip, tail-pinned on open ✅ ❌ (no viewport: head always visible)
P4 dialog visible → selection inactive, Page Up no-op on a real 25-item transcript ✅ ❌ (no selection controller)
P5 live PTY + Ctrl+F → shell focus takes Page Up away from viewport ✅ ❌

Head 5/5, base 2/5 — the flips are precisely the viewport-specific probes. Witness: 03-boundary-probes-head.png.

Mutation matrix (on head, one hunk reverted at a time, restored after)

# mutation suite result
M1 if (false && useVirtualScroll) (positive control) AgentChatContent.test.tsx killed — VP test red on the behavioral assertion (selection controller never mounted)
M2 initialScrollIndex={0} same killed — 2 red; frame starts at AGENT_HEADER, user-msg-0… instead of tail (witness 02-mutation-initial-scroll-zero-red.png)
M3 agentVpIsStatic → always true same + boundary survived (8/8 green) — see classification below
M4 pending: idx > splitIndex same killed — TOOLGROUP:20:pending missing; executing group fell to the committed path
M5 drop agentViewState.agentComposerLayoutKey from AppContainer measure-effect deps app-container-controls-dep.test.ts killed — exactly the matching guard test red
M6 drop agentComposerLayoutKey from AgentViewContext state-memo deps (literal keeps it) same + measurement killed — exactly 1 red (the new guard); stand-in runtime tests stay green by design (rerender remounts, so only the source guard can pin it)
M7 drop setAgentComposerLayoutKey from actions-memo deps same killed — exactly the matching guard test red
M8 drop parts.inputText from getAgentComposerLayoutKey measurement + AgentComposer.test killed — 2 red (input-growth key test + composer sync test)

M3 classification — redundant defence, not a defect. StaticRender (read at shared/StaticRender.tsx) is a memoized fixed-width <Box> wrapper, explicitly not output caching; interactivity never depended on the static flag (input flows through useKeypress and the isPending/isFocused props, whose boundary M4 pins). Marking pending items static only changes their wrapper box, so nothing observable flips. Completeness note, not a merge condition.

Findings

No blocking findings.

  1. (Informational) SessionPreview (/resume picker) still renders its preview through <Static> and the picker has no preview-scroll offset (list scrolling exists, preview scrolling does not). Same bug class as Agent Team: teammate tab output isn't scrollable — content that scrolls off screen is permanently lost #9507 (VP mode + <Static> = unreachable overflow), on a dialog surface the PR never claimed to touch and which I did not exercise. Out of scope here; worth a maintainer's glance as a possible sibling issue.

  2. (Informational) MaxListenersExceededWarning (11 resize listeners) prints during viewport test runs. Pre-existing: it also prints in the untouched ScrollableList.test.tsx and AgentTabBar.test.tsx suites on head. Not introduced by this PR.

Not covered

  • Live multi-teammate terminal session (real teammates + model provider) — the PR's own manual step; no provider in this environment. The component-level harnesses drive the real viewport + keypress pipeline instead.
  • macOS/Windows terminals — same as the PR.
  • Per-commit attribution — checkout is depth 2 (9 commits in metadata, 1 reachable); the aggregate HEAD^1..HEAD diff was verified instead.
  • Roster-panel gaps from Agent Team: teammate tab output isn't scrollable — content that scrolls off screen is permanently lost #9507 — declared a separate failure mode by the issue and the PR; untouched.
  • SessionPreview overflow — observed statically only (see Finding 1), not driven.
  • Discarded first boundary run — three of my five initial probes failed due to a harness bug of mine (makeCore(25) passed a number where a messages array was expected; the adapter tolerantly yields zero items). Those runs are excluded from the assertion counts; the fixed harness is what the counts and captures reflect.
  • Repo-wide typecheck — only packages/cli was typechecked (clean, 0 diagnostics). The PR's claim of pre-existing errors elsewhere was not re-litigated.

Methodology

Environment: CI merge-ref checkout (depth 2), npm ci + npm run build pre-run at head. Base cell: scratch git worktree at HEAD^1 with symlinks for unchanged workspace dist/ outputs and package-local node_modules (PR touches only packages/cli; internal-dep realpaths asserted to point at head-tree packages that the diff does not modify; head's packages/cli/dist deliberately not linked). Harnesses drove the compiled-from-source components through ink-testing-library with the real ScrollableList/VirtualizedList and real keypress parsing; only leaf display components and the selection controller were mocked. Mutations applied one at a time to a scratch copy of the source and restored via git checkout (tree verified clean afterwards). Gates: npx vitest run over src/ui/components/agent-view/, src/ui/components/shared/ScrollableList.test.tsx, src/ui/app-container-controls-dep.test.ts (90/90); tsc --noEmit in packages/cli (0 diagnostics); eslint on the four changed production files (clean) with a planted unused-variable probe caught (exit 1) to prove the gate live. Raw logs in raw/, harness copy in harnesses/, witnesses in evidence/.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/cli/src/ui/app-container-controls-dep.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/app-container-controls-dep.test.ts
file packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/agent-view/AgentChatContent.test.tsx
file packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/agent-view/AgentComposer.test.tsx
file packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/app-container-controls-dep.test.ts: PPPPP
  packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: PPPPP
  packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: PPPPP
  packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)

Evidence images

01-ab-pr-harness-base-vs-head

02-mutation-initial-scroll-zero-red

03-boundary-probes-head

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

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — non-deterministic tests (flakiness gate); job cancelled before the report - workflow run

Flakiness gate: ❌ 1 of 4 changed test file(s) returned different results across identical re-runs (1 full round(s))

The job was cancelled before producing a report, but the deterministic flakiness gate had already observed run-to-run divergence — the per-round matrix is in the gate step output of the workflow run log.

中文 — 判定:❌ 不通过 · 测试结果不确定(抖动门);作业在报告前被取消

抖动门:❌ 1 of 4 changed test file(s) returned different results across identical re-runs (1 full round(s))

作业在生成报告前被取消,但确定性抖动门已观测到轮间分歧——各轮矩阵见工作流运行日志中 gate step 的输出。

— Qwen Code · sandboxed verification

@qwen-code-ci-bot

qwen-code-ci-bot commented Sep 19, 2026 •

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (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: 57 passed · 0 failed · 57 total

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

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

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

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

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

Verification report

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

Sandboxed verification: ❌ not passed — findings reported (agent verdict) — round 7

Scripted assertions: 57 passed · 0 failed · 57 total

Verified head a5444d10216c7d7847360519555cf7a2b41ff07e (git rev-parse HEAD^2), A/B base 6410171461f00ed2f25d77bcb640b10808ce48a0 (HEAD^1).

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)· 第 7 轮
  • 结论: findings。57 通过 · 0 失败 · 57 总计脚本断言。已验证 head a5444d10,A/B base 64101714(本轮快照的 baseRefOid/headRefOid 与 merge-ref 的 HEAD^1/HEAD^2 完全一致,无漂移)。判定不是中心声明失败、也不是回归:两个中心声明的 A/B 均通过,探针 3 臂变异矩阵证明「两半都必需」,所有门禁皆绿(定向门禁 22 文件 / 358 通过 / 1 跳过 exit 0;tsc --noEmit exit 0 / 0 诊断;eslint 对 7 个改动生产文件 exit 0 且已用植入违规证明门禁是活的)。
  • 本轮唯一实质增量是 F4 的修复(commit 229821035c 把 deps 数组里的注释从 "Mirrors liveAgentPanelLayoutKey." 改写为 "Mirrors the LiveAgentPanel layout key (Scroll-back broken and screen flickers during multi-agent runs in non-VP mode #5798).")。已在终点证明修复成立:删掉真实依赖后,既有的 Scroll-back broken and screen flickers during multi-agent runs in non-VP mode #5798 守卫精确地红 1 条(lists liveAgentPanelLayoutKey in the measurement effect dependencies,expected '}, [\n buffer,\n terminalWidth,…' to contain 'liveAgentPanelLayoutKey'),即守卫重新可以失败 ⇒ F4 已修复。但把 round-6 的注释散文恢复后(依赖仍缺失)守卫又变绿 ⇒ toContain 对「含注释源码切片」做子串匹配这一危害类别仍然潜伏,只是触发点被移除了(新 Informational N7,见下表与 Findings)。
  • 承接项状态(详见 Previous-finding status 表):F1 仍修复(终点重测);F2 仍成立(0 vs 5 处);N5 仍成立(终点重测:审批待处理时 Page Up ×20 / Shift+Up ×12 / Ctrl+Home ×3 / 滚轮 ×10 全部无效,且无超时;PR 描述仍未列名该代价);N6 帧与第 6 轮逐字节相同(prompt=false title=false question=true);N2 不变(门禁日志 3 条 MaxListenersExceededWarning,与第 6 轮相同,未变差);N1 本轮首次在终点直接测得(base 臂 5 条绿的测试名可从日志提取,其中 3 条带 VP mode: 前缀);N3 以重新证明的同一闭包承接(三个文件 blob 与第 6 轮报告所引哈希逐一相同,渲染测试的 import 闭包不含其它生产文件,react 19.2.4 / ink 7.0.3 / frame-controller.js sha256 99dabe29… 均未变),矩阵未重跑。
  • 未覆盖:真实多队友终端会话(容器内无模型提供方);macOS/Windows;逐 commit 归因(depth-2:快照列 27 个 commit,git rev-list HEAD^1..HEAD^2 返回 1,且第 6 轮的 4 个 OID 在本容器均不可达,故本轮增量无法精确 diff,只能以快照 commit 列表 + 有效 diff 重建);repo 级 typecheck/全量套件;flakiness 5 轮门禁(工作流单独跑);N3 的 5 格矩阵与 useLayoutEffect 候选修复;F4 的 round-4 四臂实验(本轮以更强的 4 臂终点矩阵取代)。证据图片 3 张。
Verification report

PR #9531 verification (round 7) — fix(cli): make the Agent Team teammate tab transcript scrollable in VP mode

Verdict: findings — 57 passed · 0 failed · 57 total scripted assertions. Verified head a5444d10216c7d7847360519555cf7a2b41ff07e (git rev-parse HEAD^2), A/B base 6410171461f00ed2f25d77bcb640b10808ce48a0 (HEAD^1). Unlike round 6, this round's snapshot baseRefOid/headRefOid match HEAD^1/HEAD^2 exactly — no drift.

findings is not a failed central claim and not a regression. Both central claims' A/B passed, the approval mechanism's two halves are again proven load-bearing by a 3-arm probe matrix, every gate is green, and this round's only substantive delta — the F4 fix — is proven fixed at the destination. The verdict rests on the carried standing items (F2, N5, N3 Suggestions; N6, N1, N2 Informationals) plus one new Informational (N7: the F4 hazard class is still latent even though its trigger is gone).

⚠️ Both sides moved again, and this round the delta cannot be diffed exactly. Round 6 verified head 8a9412a8ea / base 35a9c5c62d; this round's pair is a5444d10 / 64101714. None of round 6's four OIDs are reachable here (git cat-file -t fails for each), and git rev-list --count HEAD^1..HEAD^2 returns 1 against a snapshot listing 27 commits — the shallow-boundary false negative. So the delta is reconstructed from the snapshot's commit list plus the effective diff, not computed: the new PR commits after round 6's head are 229821035c "keep the deps guard's identifier out of comment prose" and the main merge a5444d10. Corroborating closure fact: AgentChatContent.tsx's head blob is 6955574065148b52… — byte-identical to round 6's quoted head blob — so the central mechanism file did not change; only AppContainer.tsx's comment did. Consequently no closure carry-forward shortcut was available for most measurements and everything was re-run; the one exception (N3) is justified below by a full closure re-proof.

Previous-finding status (follow-up round)

Round 6 verified head 8a9412a8ea / base 35a9c5c62d; this round's pair is a5444d10 / 64101714. Round-6 OIDs are unreachable, so every row below cites a command re-run in this round unless explicitly carried on a proven-identical closure.

# previous finding severity status at head a5444d10
F4 This PR's comment inside the deps array silently unpins the pre-existing #5798 guard Suggestion FIXED — proven at the destination. Commit 229821035c reworded the prose to // (#9507). Mirrors the LiveAgentPanel layout key (#5798). (AppContainer.tsx:4070), which no longer contains the bare identifier. Destination proof, 4-arm matrix (harnesses/f4-matrix.sh, witness 01-f4-deps-guard-mutation-matrix.png): arm B (real liveAgentPanelLayoutKey, dep deleted at :4058) turns exactly one test red — lists liveAgentPanelLayoutKey in the measurement effect dependencies, AssertionError: expected '}, [\n buffer,\n terminalWidth,…' to contain 'liveAgentPanelLayoutKey' — with the other 7 green, i.e. the guard can fail again and the red names the intended assertion. Arm A (head) 8/8 green, arm D (PR comment block deleted, dep kept) green, so the comment is not load-bearing. Census agrees: all four identifiers the guard asserts (terminalHeight, stickyTodosLayoutKey, liveAgentPanelLayoutKey, agentViewState.agentComposerLayoutKey) survive comment-stripping of the slice, and the two AgentViewContext memo slices contain zero comment lines. But the hazard class survives — see N7. raw/08-f4-*.log, raw/07-censuses.txt §A
F1 Viewport keeps focus and scrolls under an open right-click menu Suggestion fixed, still fixed — re-measured at the destination. Probe cell an open context menu over a pending approval…: real menu opened over a real pending approval, real Enter → menu onSelect ran ×1 and the dialog's onConfirm did not fire; Escape closes the menu without answering or cancelling; the dialog is answerable afterwards (onConfirm ×1). raw/05-arm-v-head.log
F2 "Copy Selection" can never appear on the teammate tab Suggestion stands — re-measured. selectionQueryRef occurrences: AgentChatContent.tsx 0 vs MainContent.tsx 5 (round 6: 3; the main view moved with the base, the 0 is what matters); ContentMouseController.tsx builds the item only from selectionQueryRef?.current?.getRange(). Sibling getAdditionalSelectableRects also 0 on the teammate tab. Still a missing convenience, not a broken one. raw/07-censuses.txt §B
N5 Unnamed cost: the teammate transcript is completely unscrollable while any approval is pending, with no timeout Suggestion stands — re-measured at the destination. With one pendingApprovals entry, all four affordances are dead: Page Up ×20, Shift+Up ×12, Ctrl+Home ×3 and wheel-up ×10 each leave the frame byte-identical (and the frame is proven non-blank — it contains the dialog), while the dialog stays answerable. The wheel is dead because ScrollableList gates useMouseEvents on the same hasFocus flag. The PR body's Risk & Scope still says only "the executing/confirming split keeps approval dialogs on the interactive path" — the loss of scrollback is still unnamed. raw/05-arm-v-head.log, witness 03-approval-probe-mutation-matrix.png
N3 Selection teardown runs too late to stop the successor's first frame being stamped (useLayoutEffect candidate) Suggestion stands — carried on a re-proven identical closure; matrix NOT re-run. This round the closure shortcut is fully earned, not assumed: use-text-selection.tsx blob ed55791c2ebd…, use-text-selection.test.tsx 9fece93d4bae…, use-text-selection-render.test.tsx 56d632f100df… are each identical to the hashes round 6's report quoted; the render test's import closure is react, ink, ../utils/mouse.js (type-only) and ./use-text-selection.js — it imports no production caller (MainContent/AgentChatContent count = 0), and the one production caller in the PR's own diff (AgentChatContent.tsx) is byte-identical to round 6's head (6955574065148b52…); dependencies are pinned the same (react 19.2.4, ink 7.0.3, installed ink/build/frame-controller.js sha256 99dabe292b97… = round 6's 99dabe29…). Round 5's harness is not mounted here, so the 5-cell matrix and the useLayoutEffect candidate remain un-re-run.
N6 The approval dialog's own prompt/title are clipped out of an 8-row viewport window Informational stands — frame byte-identical to round 6. At availableTerminalHeight: 8 with a real type:'info' confirmation, the rendered frame is exactly Do you want to proceed? + the 4 option rows; N6-MEASURE prompt=false title=false question=true, same as round 6. Neither improved nor worsened. raw/04-probe-frames.log
N1 Three tests named "VP mode:" do not discriminate the VP render path Informational stands — now directly measured, not inferred. Round 6 could not extract per-test names; this round the base-arm log carries them. The 5 base-side survivors are: legacy mode: transcript still flows…, VP mode: executing tool groups stay on the interactive (pending) render path, VP mode: forwards the Ctrl+O full-detail toggle on both render paths, VP mode: full-detail forwarding tracks the toggle instead of being hardcoded, legacy mode: does not mount ContentMouseController…. The three VP mode: names are exactly round 6's three — they pass with no viewport in the tree at all. Not vacuous; the name buys VP-specific confidence nothing paid for. raw/02-ab-agentchat-base.log, witness 02-central-claim-ab-base-vs-head.png
N2 The PR's new test file leaks renders → MaxListenersExceededWarning Informational stands, unchanged (not worsened this round). renderContent( ×8 + direct render( ×2 = 10 renders (my regex; round 6's instrument counted 11 — instruments differ, so no direction claim), .unmount() ×0, afterEach ×0. Gate log carries 3 MaxListenersExceededWarning lines — the same count as round 6 — surfacing adjacent to AgentTabBar.test.tsx/MainContent.test.tsx, bystanders the PR does not touch. Test-process only; all 358 gate tests pass. raw/03-gate-head.log, raw/07-censuses.txt §C
1 SessionPreview (/resume picker) renders through ink <Static> — same bug class as #9507 Informational not re-measured — out of this PR's declared scope in every round; no budget.
— Test Plan's "remaining repo-wide tsc errors" caveat is stale description confirmed still stale — tsc --noEmit in packages/cli is exit 0 with 0 diagnostics; none of acpAgent.ts / daemon-status.ts / workspace-extensions-controller.ts / native-audio-recorder.ts error here. The Test Plan also still cites "68 tests pass" for agent-view/ + ScrollableList; the affected surface is 22 files / 358 tests in this round's gate. raw/05-tsc-clean.log

Central claim + A/B

Central claim (carried): with ui.useTerminalBuffer on (the default), the teammate tab transcript renders in the same ScrollableList virtual viewport as the main view — pinned to the tail, scrollable with Page Up / Shift+arrows / Ctrl+Home / mouse wheel — while the legacy <Static> path for useTerminalBuffer: false is unchanged.

Central claim (carried, round 6): on that VP path a teammate's pending approval stays mounted and answerable — the tail is pulled back into view when the approval arrives (scrollRef.current?.scrollToEnd()), and the viewport then goes quiet (!approvalPending && in hasFocus) so the dialog cannot be scrolled out of the render window, which would unmount it together with its useKeypress subscription and wedge the agent round.

Central claim (round 7's delta): the pre-existing #5798 deps guard is no longer neutralised by this PR's comment prose — i.e. F4 is fixed.

Control construction. Single-variable by construction and sha256-verified at every swap, restored with git checkout -- and re-hashed after each arm (final git status --porcelain empty). v-base = the head tree with only packages/cli/src/ui/components/agent-view/AgentChatContent.tsx replaced by its HEAD^1 bytes (da13ab5877dc… vs head 6955574065148b52…). The PR touches no manifest or lockfile, and readlink -f node_modules/@qwen-code/qwen-code-core resolves to /__w/qwen-code/qwen-code/packages/core (the head tree), so reusing the root node_modules for both arms is a clean control — the base cell is the head tree minus one file, so no internal workspace link can load head code into it. All arms serialized inside one driver each; no concurrent vitest ever ran against a mutated tree.

(a) The PR's own test file as a non-vacuity A/B

arm oracle result
v-head (unmutated) PR's AgentChatContent.test.tsx 9 passed / 9
v-base (AgentChatContent.tsx at HEAD^1 bytes) same 4 failed / 5 passed of 9

The four base reds, by name this round: VP mode: Page Up scrolls the teammate transcript back to earlier output (expected "spy" to be called with arguments: [ ObjectContaining {"isActive": true} ], 0 calls), VP mode: mounts ContentMouseController… (same), VP mode: an open context menu quiets the viewport and pauses selection (Cannot read properties of undefined (reading '0') — no ScrollableList render exists on base at all), VP mode: a pending teammate approval pulls the tail back and keeps the viewport quiet (same). Counts match round 6 exactly; this round the names are extracted rather than inferred. raw/02-ab-agentchat-{head,base}.log, witness 02-central-claim-ab-base-vs-head.png.

(b) An independent end-to-end probe, and the two-halves matrix

The PR's own approval test mocks HistoryItemDisplay away, so no real dialog is ever rendered and its oracle is a frame substring plus the hasFocus prop. My probe (harnesses/ → dropped in as zz-probe.test.tsx, run, deleted) does not mock it: a real tool_call message plus a real pendingApprovals entry (type:'info', real onConfirm spy) renders a real ToolGroupMessage → real ToolConfirmationMessage → real RadioButtonSelect inside the real ScrollableList/VirtualizedList, driven by real keypress bytes (\x1b[5~, \x1b[1;2A, \x1b[1;5H, \r, \x1b) and real SGR wheel bytes (\x1b[<64;5;3M), with the real ContextMenuProvider and the real ContextMenuOverlay so a consumer owns the menu's Enter. The destination oracle is onConfirm actually firing. Mocks are confined to non-units: geometry, terminal size, ink useStdout (isTTY so SGR mouse arms), the leaf AgentHeader/RespondingSpinner, and the AgentViewContext action sink. Wheel cells wait 150 ms real time because useFrameCoalescedFlush batches behind a timer act() does not advance.

arm what was removed probe result which cell went red
v-head nothing 6 passed / 6 —
v-noGate !approvalPending && dropped from hasFocus (half two) 2 failed / 4 passed while an approval is pending the scroll keys cannot move the tail… and the wheel cannot move the tail… — the dialog is scrolled out of the window
v-noScroll the scrollRef.current?.scrollToEnd() line dropped (half one) 1 failed / 5 passed a user scrolled to the top gets the approval pulled back… — a user who scrolled up before the approval arrived never gets it back

Each half breaks a different shape, which is what the code comment claims ("Two halves, both required") and what a two-cell A/B against base cannot separate. Witness 03-approval-probe-mutation-matrix.png; logs raw/05-arm-v-{head,noGate,noScroll}.log.

Head-arm cells, all as expected (23 scripted expects):

oracle (real dialog, real viewport, real bytes) HEAD
a real pending approval renders a real dialog (Do you want to proceed? + 4 options) true
Enter answers it onConfirm ×1 with ToolConfirmationOutcome.ProceedOnce
frame proven non-blank before equality comparisons contains the dialog
Page Up ×20 / Shift+Up ×12 / Ctrl+Home ×3 cannot move the tail frame byte-identical ×3
dialog still answerable afterwards onConfirm ×1
wheel-up ×10 cannot move the tail / still answerable frame identical / onConfirm ×1
positive control: the same wheel bytes do scroll when nothing is pending frame changed
scrolled to top → approval arrives → dialog visible + answerable true / onConfirm ×1
menu open over a pending approval: Enter runs the menu item ×1, dialog does not fire true / true
Escape closes the menu without answering or cancelling; dialog answerable after true / onConfirm ×1

(c) The F4 fix, at the destination (round 7's delta)

arm real dep at :4058 round-6 prose in slice guard suite (8 tests)
A head, unmutated (control) yes no 8/8 green
B dep deleted no no 1 red / 7 green — the intended assertion, quoted above
C dep deleted + round-6 prose restored no yes 8/8 green ← prose alone satisfies toContain
D PR comment block deleted, dep kept yes no 8/8 green

Arm B is the positive control landed in the same file as the mutant; arm C is the proof that the mechanism of F4 is still live in the guard's design (→ N7). Witness 01-f4-deps-guard-mutation-matrix.png; logs raw/08-f4-arm{A,B,C,D}-*.log.

Vacuity check on the PR's pinned tests (re-run at the new base)

One production file reverted to its HEAD^1 bytes per arm, that file's own suite run, restored and re-hashed (harnesses/vacuity-driver.sh):

arm (file reverted) reds the intended one, with its failure message
AgentTabBar.tsx 1 / 8 goes quiet while the right-click context menu is open — expected true to be false
AgentComposer.tsx 2 / 5 that test plus syncs the footer layout key and updates it when the agent completes (a whole-file revert also removes the layout-key hunk)
ToolConfirmationMessage.tsx 1 / 44 does not act on a key aimed at an open context menu — expected "spy" to not be called at all, but actually been called 2 times, i.e. on base one Enter fires the menu item and approves the tool call

Note the contrast with round 6: the ToolConfirmationMessage arm produced 3 reds there (two unrelated URL tests, which round 6 isolated as same-file cross-test interference under a full-file run); this round it produced exactly 1. The interference artefact did not reproduce at this base, so this round's vacuity signal is cleaner, not weaker. raw/06-vacuity-*.log

Corrections

  • To round 6's F4 line citations, not to the code. Round 6 placed the comment at AppContainer.tsx:4034 and the dep at :4035; at this head the base moved, and the PR's comment block is :4066–4070 sitting above agentViewState.agentComposerLayoutKey at :4071, while the guarded liveAgentPanelLayoutKey dep is at :4058 in code. The mechanism round 6 described is unchanged and now fixed; only the line numbers in its report are stale.
  • The Test Plan's tsc caveat is still stale (carried from rounds 2–6): tsc --noEmit in packages/cli is exit 0 with 0 diagnostics. Its "68 tests pass" figure is also stale (22 files / 358 tests now).
  • No instruction-injection attempt was found in the PR title, body, commit messages or code comments.

Findings

N7 (Informational, NEW evidence on a fixed trigger) — the deps guard still slices comments, so prose can still neutralise it

Reproducing command (arm C of harnesses/f4-matrix.sh):

# in packages/cli/src/ui/AppContainer.tsx: delete `    liveAgentPanelLayoutKey,` (line 4058)
# AND change line 4070 to `    // (#9507). Mirrors liveAgentPanelLayoutKey.`
cd packages/cli && npx --no-install vitest run src/ui/app-container-controls-dep.test.ts
# => 8/8 GREEN with the real dependency absent

Commit 229821035c removed the trigger (F4 fixed, arm B), but controlsHeightEffectDeps() still returns source.slice(depsOpen, depsClose) including line comments, and the assertion is expect(deps).toContain('liveAgentPanelLayoutKey') — a substring match. Arm C proves that with the dependency deleted, restoring identifier-naming prose anywhere in the slice makes the guard green again. The same latent shape applies to the three sibling identifiers asserted on that slice and to the two AgentViewContext memo slices if a comment ever lands inside them (today they contain zero comment lines — census §A2). Not a regression and not blocking: nothing in the tree currently triggers it, and the guard's own doc-comment shows the author understands the class for the memo guards ("the guarded mutation keeps the value in the literal while dropping it from the deps, which must fail the assertion below even though the literal still mentions the identifier"). Cheapest hardening, unprototyped: strip line comments inside controlsHeightEffectDeps()/agentViewMemoDeps() before matching, shipped with arm B as its fixture.

F2 (Suggestion, stands) — "Copy Selection" can never appear on the teammate tab

Re-measured: selectionQueryRef occurs 0 times in AgentChatContent.tsx against 5 in MainContent.tsx, and ContentMouseController.tsx builds the copy-selection item only from propsRef.current.selectionQueryRef?.current?.getRange(). This PR mounts ContentMouseController on the teammate tab — my probe relies on that for the right-click menu — but does not pass the ref, so Copy Selection is unreachable there while working on the main view. Sibling getAdditionalSelectableRects (the main view's footer rect) is also absent. A missing convenience, not a broken one; no crash, no exploit. raw/07-censuses.txt §B

N5 (Suggestion, stands) — the teammate transcript is completely unscrollable while any approval is pending, with no time limit, and the description does not name it

Re-measured at the destination: with one pendingApprovals entry, Page Up ×20, Shift+Up ×12, Ctrl+Home ×3 and wheel-up ×10 each leave the frame byte-identical (frame proven to contain the dialog first), and the dialog stays answerable throughout. The wheel is dead because ScrollableList gates useMouseEvents on the same hasFocus flag the keys use — the gate is complete, which is the good news; the cost is that hasFocus is false for the whole tab, and approvals have no timeout (the code comment says so: "no timeout to recover it"). The state persists for exactly as long as the user takes to decide — precisely when they are most likely to want the scrollback. This is a tradeoff and probably the right one (the v-noGate alternative is a wedged agent round); it is a finding about the description: Risk & Scope names viewport rendering quirks and the executing/confirming split, but not the loss of scrollback. Cheapest resolution is one sentence in the description; the behavioural alternative (keep keys live, clamp the scroll range so the pending tail item cannot leave the render window) is a larger change and I did not prototype it.

N3 (Suggestion, stands on a re-proven closure) — the selection teardown runs too late to stop the successor's first frame being stamped

Carried with the closure evidence in the status table (three blobs identical to round 6's quoted hashes; render-test import closure contains no production caller; react 19.2.4 / ink 7.0.3 / frame-controller.js sha256 99dabe292b97… unchanged). Round 5's measured candidate fix remains one word — useEffect → useLayoutEffect for the teardown — and round 5 measured that the suite pins nothing on that axis, so the fix should ship with a fixture asserting the successor's first frame contains no stale selection highlight. Matrix not re-run this round; recorded in Not covered.

N6 (Informational, stands) — inside the viewport window, the approval dialog's own prompt can be clipped away

Re-measured: at availableTerminalHeight: 8 the real dialog's frame is exactly the generic Do you want to proceed? plus the four option rows; N6-MEASURE prompt=false title=false question=true, byte-identical to round 6's frame. A user can therefore answer an approval without seeing what they are approving. Bounded honestly: 8 rows is my harness's choice, not a real-terminal measurement, and ToolConfirmationMessage receives the same availableTerminalHeight the legacy path gives it; the VP-specific part is that on the legacy <Static> path pending items render outside <Static> and do not compete with 40 windowed transcript items for the same budget. An observation with its frame, not a reproduced defect. raw/04-probe-frames.log

N1 (Informational, stands — now directly measured) — three tests named "VP mode:" do not discriminate the VP path

The base arm's five survivors are named in the status table; three carry the VP mode: prefix and pass with no viewport in the tree at all, because base's <Static> path also splits committed/pending and also forwards fullDetail. They are not vacuous (the base arm has four genuine reds in the same file); the name simply buys VP-specific confidence nothing paid for.

N2 (Informational, stands, unchanged) — the PR's new test file leaks renders

10 renders by my census regex (8 renderContent( + 2 direct render(), .unmount() ×0, no afterEach, so each ink-testing-library render leaves a resize listener on stdout and the count crosses Node's default limit of 10: 3 MaxListenersExceededWarning lines in the gate log — the same count as round 6, surfacing next to AgentTabBar.test.tsx and MainContent.test.tsx, bystanders this PR does not touch. Test-process only; all 358 gate tests pass. One-line fix unchanged: keep the views and add afterEach(() => view?.unmount()).

Not covered

  • Live multi-teammate terminal session — no model provider in this container. This is the PR's own manual step (QWEN_CODE_ENABLE_AGENT_TEAM=1, create a team, overflow a teammate, Page Up, then trigger an approval) and remains unperformed by anyone in CI across all seven rounds. My evidence is component-level: real viewport machinery, real keypress pipeline, real ink frame controller, real serialized bytes, real dialog, real context-menu overlay. It proves the handling, not a live terminal's trigger.
  • Per-commit attribution and an exact delta. git rev-parse --is-shallow-repository is true; the snapshot lists 27 commits but git rev-list HEAD^1..HEAD^2 returns exactly 1, and all four of round 6's OIDs fail git cat-file -t. The delta is therefore reconstructed from the snapshot's commit list (229821035c + the main merge a5444d10) plus the effective diff and the AgentChatContent.tsx blob identity with round 6 — not computed. Only the aggregate HEAD^1..HEAD diff was verified.
  • N3's 5-cell layered-guard matrix and the useLayoutEffect candidate fix — not re-run; closure identity only, as detailed in the status table. Round 5's harness lives in that round's artifacts and is not mounted here.
  • F4's round-4 4-arm experiment — superseded, not re-run: this round's 4-arm destination matrix (A/B/C/D) is strictly stronger, since arm B lands the positive control in the mutated file and arm C isolates the prose mechanism.
  • The scrollbar-drag gesture and real terminal-emitted SGR mouse bytes. Wheel bytes were constructed as \x1b[<64;5;3M from the format the repo's own ScrollableList.test.tsx uses; the drag path shares the same hasFocus gate but was never driven. kitty-protocol interaction untested.
  • macOS / Windows terminals.
  • SessionPreview — not re-measured; out of this PR's scope by its own declaration.
  • Repo-wide typecheck and repo-wide test suite — only packages/cli was typechecked (exit 0, 0 diagnostics); only the affected suites were run. No repo-wide gate claim is made.
  • Flakiness / 5-round gate — the workflow runs that separately.
  • Superseded probe iterations are not counted. One iteration of this round's probe produced no counted assertions: the first probe-matrix.sh run exported PROBE_FRAMES as a repo-relative path while vitest's cwd is packages/cli, so the N6 frame sink threw ENOENT and turned the head arm red for a harness reason (raw/05-arm-v-head.log first run). Fixed to an absolute path and re-run; only the re-run contributes to the tally. The same relative-path trap also cost one tsc invocation its log file; re-run with an absolute path.
  • The two extra reds round 6 saw in the ToolConfirmationMessage vacuity arm did not reproduce this round (1 red of 44), so no isolation experiment was needed; had they appeared, round 6's -t "urls" isolation is the recorded method.

Methodology

Environment: CI merge-ref checkout at depth 2 in a token-free node:22-bookworm container (node v22.23.2), npm ci + npm run build pre-run at head, $QWEN_VERIFY_CONTEXT present with previous-report.md (follow-up round). Identity was established first (git rev-parse HEAD HEAD^1 HEAD^2 → 1bc4ff95 / 64101714 / a5444d10) and matched against the snapshot's OIDs (exact match this round) and against round 6's verdict line, which is what showed both sides had moved; git cat-file -t on round 6's four OIDs then showed the delta could not be diffed exactly. Four harness families, all serialized so no vitest ever ran against a half-mutated tree, every swap sha256-verified at mutation and at restore with git status --porcelain empty at the end: the census (harnesses/census.mjs, which re-implements the guard's own extraction functions verbatim so it measures what the test measures), the F4 matrix (harnesses/f4-matrix.sh, 4 arms on AppContainer.tsx), the central-claim A/B (harnesses/ab-driver.sh, whole-file base swap of AgentChatContent.tsx), the approval probe (harnesses/probe-matrix.sh + the dropped-in zz-probe.test.tsx, real ink through ink-testing-library, real KeypressProvider/ContextMenuProvider/ContextMenuOverlay/ScrollableList/HistoryItemDisplay/ToolConfirmationMessage/RadioButtonSelect, destination oracle onConfirm), and the vacuity driver (harnesses/vacuity-driver.sh). A ProbeBoundary-style frame sink writes frames to raw/04-probe-frames.log because the repo's vitest config sets silent: true. Gates: targeted vitest over src/ui/components/agent-view/, src/ui/components/shared/ScrollableList.test.ts, src/ui/app-container-controls-dep.test.ts, src/ui/selection/, src/ui/context-menu/, src/ui/components/messages/ToolConfirmationMessage.test.tsx, .../AskUserQuestionDialog.test.tsx, src/ui/components/MainContent.test.tsx — 22 files, 358 passed, 1 skipped, exit 0; tsc --noEmit in packages/cli exit 0, 0 diagnostics; eslint on the 7 changed production files exit 0, proven live by planting const zzPlantedUnused = 42; in AgentTabBar.tsx (reported as @typescript-eslint/no-unused-vars, then removed and the file re-hashed). Assertion accounting: 14 (census) + 4 (F4 arms, each expected-red control encoded as an expectation and scored a pass) + 2 (A/B arms) + 23 (probe head cells) + 4 (probe mutation arms) + 3 (vacuity intended reds) + 4 (gate, tsc, eslint clean, eslint liveness) + 1 (N6 frame shape) + 1 (N1 named survivors) + 1 (Shift+Tab sibling census) = 57 passed, 0 failed; fail counts only unexpected outcomes. Raw logs in raw/, harnesses in harnesses/, witnesses in evidence/.

Evidence images

  1. 01-f4-deps-guard-mutation-matrix.png — the F4 fix proven at the destination: arm B red on the intended assertion, arm C green with prose restored.
  2. 02-central-claim-ab-base-vs-head.png — the carried central claim: base 4 red / head 0 red, per test, named.
  3. 03-approval-probe-mutation-matrix.png — the approval probe: each half of the mechanism breaks a different shape.
Flakiness gate log

rounds=5 files=7 skipped=0
file packages/cli/src/ui/app-container-controls-dep.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/app-container-controls-dep.test.ts
file packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/agent-view/AgentChatContent.test.tsx
file packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/agent-view/AgentComposer.test.tsx
file packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/agent-view/AgentTabBar.test.tsx
file packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx
file packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/ToolConfirmationMessage.test.tsx
file packages/cli/src/ui/selection/use-text-selection.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/selection/use-text-selection.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/app-container-controls-dep.test.ts: PPPPP
  packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: PPPPP
  packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: PPPPP
  packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx: PPPPP
  packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: PPPPP
  packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: PPPPP
  packages/cli/src/ui/selection/use-text-selection.test.tsx: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/selection/use-text-selection.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/selection/use-text-selection.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/selection/use-text-selection.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/selection/use-text-selection.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/app-container-controls-dep.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/components/agent-view/AgentComposer.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/selection/use-text-selection.test.tsx: P (exit 0)

Evidence images

01-f4-deps-guard-mutation-matrix

02-central-claim-ab-base-vs-head

03-approval-probe-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.

⚠️ Round 15, and the diff has grown 3.3x since this review first measured it (190 → 634 source diff lines); the reverse audit also stopped at its round cap without converging. The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

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

  • committed-item identity churn defeats memo(HistoryItemDisplay) — AgentChatContent.tsx:282 — already reported (round-1 R1-1; author declined as a separate rendering-performance change)
  • renderVirtualItem's dep array rebuilds the row callback on UI-only state changes — AgentChatContent.tsx:350 — already reported (round-11 deferral D11-2)
  • the VP early return orphans AppContainer's historyRemountKey static-remount effect — AgentChatContent.tsx:383 — already reported (round-7 deferral D7-4, re-listed round 13)
  • committed VP items get no per-item height cap — AgentChatContent.tsx:329 — already reported (round-9 deferral)
  • the dialogsVisible gate's premise is false on the agent tab — AgentChatContent.tsx:388 — already reported (round-7 deferral D7-2, re-listed round 14)
  • getAgentComposerLayoutKey omits both AgentFooter height inputs — AgentComposer.tsx:309 — already reported (round-7 deferral D7-1, re-listed round 14)
  • three new comments invert the controlsHeight staleness direction — app-container-controls-dep.test.ts:109 (+2 locations) — already reported (round-4 R4-2 and round-5 deferral D5-1)
  • the actions-memo guard pins a failure mode React excludes — app-container-controls-dep.test.ts:146 — already reported (round-4 R4-1, re-listed round 14)
  • the HistoryItemDisplay mock records 3 of 9 forwarded props — AgentChatContent.test.tsx:85 — already reported (round-14 deferral)
  • the spinner VP item is never constructed because every fixture returns COMPLETED — AgentChatContent.test.tsx:303 — already reported (round-2 deferral D2-1, re-listed rounds 3, 5, 6, 9 and 13)
  • the mouse-controller isActive assertion is satisfied by the pre-menu render — AgentChatContent.test.tsx:534 — already reported (round-11 deferral D11-3, re-listed round 14)
  • the pending-path test never performs the round trip its comment promises — AgentChatContent.test.tsx:447 — already reported (round-1 R1-3, re-listed round 13)
  • the approval-latch reset has no test — AgentChatContent.tsx:374 — already reported (round-14 deferral)
  • the approval-lockout case's fixture contains no approval item — AgentChatContent.test.tsx:549 — already reported (round-14 deferral)
  • two of the four hasFocus terms are unpinned and getShellPids is stubbed empty — AgentChatContent.tsx:388 — already reported (round-1 R1-5, re-listed round 13)
  • the createUIState fixture carries phantom keys and omits required members — AgentChatContent.test.tsx:202 — already reported (round-1 R1-6, with the same gemini-to-memory key-drift evidence)
  • the fake core's event emitter is inert, so the approval re-render wiring is untested — AgentChatContent.test.tsx:291 — already reported (round-2 deferral D2-1, re-listed round 13)
  • the closeMenu() click-away fall-through branch is untested — AgentComposer.tsx:222 — already reported (round-13 deferral)
  • the Down-arrow control assertion is pre-satisfied by the isInputActive mount effect — AgentComposer.test.tsx:237 — already reported (round-13 deferral, re-listed round 14)
  • the documented menu dismissal is unreachable while input is inactive — AgentComposer.tsx:211 — already reported (round-13 deferral noting this branch is pinned only through a seam production cannot reach)
  • …and 5 more (see the run report)

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

Not reviewed: platform matrix — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; the same suites ran on Linux and locally, so the gap is platform-specific behaviour.

Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.

Test Plan (not a blocker): src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory.

Deferred under the convergence posture (round 15, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:194 — [probe] Critical [fails-closed] [new-surface] Ctrl+F can focus a ShellInputPrompt that scrolled out of the render window, and the new !embeddedShellFocused term then kills…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:97 — [probe] the AGENT_HEADER sentinel is never read by any assertion, so the header virtual item is unpinned
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:401 — [probe] the new showScrollbar pass-through has no read-back assertion; deleting it leaves 9/9 green
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:280 — [probe] both legacy-mode cases render zero pending items, so the live-area-outside-Static invariant is never exercised
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:479 — [probe] the only allExpanded:false case never renders a pending row, so fullDetail forwarding on that branch is unpinned
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:207 — [probe] the Ctrl+F subscriber's new context-menu gate has no test; dropping the term leaves 9/9 green
  • packages/cli/src/ui/components/agent-view/AgentTabBar.tsx:128 — [probe] gating the whole subscription also kills the printable branch that releases tab-bar focus, and its test pins only the going-quiet direction

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had no anchor this round could use either — none at all, one with no certifier, one certified by an identity other than the one this round runs under, or one this round's fetch refused or resolved to the head — so the next review re-reads the whole diff unless recovery grafts an earlier own anchor that the round running it can use onto the complete work list this round leaves behind, and keeps doing so until a round's marker carries an anchor again or a graft lands that the round running it can use. (Stated, not acted on — this changes nothing about what the round posts.)

中文说明

仅完成部分审查,审查缺口已披露。

⚠️ 第 15 轮,且自本审查首次测量以来 diff 已增长 3.3 倍(源码 diff 行数 190 → 634);反向审计也在轮数上限处停止且未收敛。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

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

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

未审查(原文为英文):platform matrix — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; the same suites ran on Linux and locally, so the gap is platform-specific behaviour.

未审查:反向审计——在 5 轮的反审轮数上限内未收敛。

Test Plan(非阻断):src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory。

收敛姿态下延后(第 15 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 7 条(原文未翻译,列表见上方英文部分)。

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有留下本轮可用的锚点——要么完全没有、要么没有认证者、要么由本轮运行身份之外的身份认证、要么被本轮的获取拒绝或解析为头提交——因此下一次评审将重读整个 diff,除非恢复流程把本轮能使用的更早自有锚点嫁接到本轮留下的完整工作清单上;并会一直如此,直到某一轮的标记重新带上锚点,或落地的嫁接能被运行该轮的评审使用。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

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

Comment thread packages/cli/src/ui/components/agent-view/AgentComposer.tsx
yiliang114 and others added 2 commits September 20, 2026 00:25
…d answer input

Two review Criticals on the teammate tab's approval surface:

- ScrollableList left a wheel/drag flush armed across a focus loss, so the
  timer fired after whatever took focus had pulled the tail into view and
  scrolled a pending approval dialog back out of the render window, where
  its keys and this list's were already dead.
- AskUserQuestionDialog hard-wired its nested custom-answer TextInput to
  isActive={true}, so an Enter aimed at an open right-click menu still
  submitted the half-typed draft as the answer to the pending question.
Clear the `Check lint gate freshness` failure: main moved the lint gate in
c56d604 (#12135, .github/workflows/ci.yml) after this branch last
incorporated it, so the required Lint & Static lane exited 1 in ~26s without
running any linter. Merging main re-validates the branch under the current gate.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmu8nqzno6q
@yiliang114

Copy link
Copy Markdown
Collaborator Author

巡检处理了一下这条红的 Lint & Static (ubuntu-latest, Node 22.x):

  1. 不是本 PR 的 lint 问题,是 freshness 门禁。 失败发生在 Check lint gate freshness 这一步,~26s 就退出,根本没跑到 linter。原因是 main 在 c56d60438b61(fix(ci): reclaim Docker cache and clean review scratch directories #12135)动了 .github/workflows/ci.yml,而本分支还没合入该提交,门禁判定 lint gate 已过期。同一个 head 上 Test (ubuntu-latest) 是 22m16s 正常通过的,健康跑完的 Lint & Static 大约要 12 分钟——两者对照可以确认是 stale gate,rerun 也只会同样失败,唯一解是把 main 合进来。

  2. 已合入 origin/main(c1c00cbaab),merge commit 397f3987dfc。 纯合并提交,没有任何源码改动:合并结果的 tree 与 git merge-tree 的输出完全一致,git merge 也没有产生冲突。合入后 freshness 门禁已 exit 0(fresh),CI 正在新 head 上重跑。顺带说明,这次合并只从 main 带进来 workspace 版本号 0.24.0 → 0.24.1,package-lock.json 无新增依赖。

  3. R15-1 那条 thread 保持 open,未做处理。 关于 AgentComposer.tsx 右键菜单 gate 的这个问题上一轮已确认是真实问题,并归到 An open right-click context menu does not consume keys: composer and tool-approval dialog act on the same keystroke #11228 跟进,不在本次合并范围内,所以这里不去 resolve 它。

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

⚠️ Round 16, and the diff has grown 3.6x since this review first measured it (190 → 680 source diff lines); the reverse audit also stopped at its round cap without converging. The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

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

  • AgentTabBar.tsx:128 — printable-character branch loses the tab-bar focus release when the whole subscriber is gated on the open menu — already reported (round-15 deferral list, probe-confirmed)
  • AgentComposer.tsx:309 — getAgentComposerLayoutKey omits both AgentFooter height inputs — already reported (round-7 deferral D7-1, re-listed round 14)
  • AgentChatContent.test.tsx:447 — the pending-path test never performs the round trip its comment promises — already reported (round-1 R1-3, re-listed round 13)
  • AgentChatContent.tsx:207 — the Ctrl+F subscriber's new context-menu gate has no test — already reported (round-15 deferral list, probe-confirmed)
  • AgentChatContent.tsx:389 — two of the four hasFocus terms are unpinned and getShellPids is stubbed empty — already reported (round-1 R1-5, re-listed round 13)
  • AgentComposer.tsx:222 — the closeMenu() click-away fall-through branch is untested — already reported (round-13 deferral)
  • app-container-controls-dep.test.ts:151 — the actions-memo guard pins a failure mode React excludes — already reported (round-4 R4-1, re-listed round 14)
  • app-container-controls-dep.test.ts:109 — three new comments invert the controlsHeight staleness direction — already reported (round-4 R4-2 and round-5 deferral D5-1)
  • AgentChatContent.test.tsx:534 — the mouse-controller isActive assertion is satisfied by the pre-menu render — already reported (round-11 deferral D11-3, re-listed round 14)
  • AgentChatContent.test.tsx:85 — the HistoryItemDisplay mock records 3 of 9 forwarded props — already reported (round-14 deferral)
  • AgentChatContent.tsx:100 — the VP early return orphans AppContainer's historyRemountKey static-remount effect — already reported (round-7 deferral D7-4, re-listed round 13)
  • AgentChatContent.test.tsx:561 — the approval-lockout case's fixture contains no approval item — already reported (round-14 deferral)
  • AgentChatContent.tsx:282 — committed-item identity churn defeats memo(HistoryItemDisplay) — already reported (round-1 R1-1; author declined as a separate rendering-performance change)
  • AgentChatContent.tsx:388 — the dialogsVisible gate's premise is false on the agent tab — already reported (round-7 deferral D7-2, re-listed round 14)
  • AgentComposer.test.tsx:224 — the Down-arrow control assertion is pre-satisfied by the isInputActive mount effect — already reported (round-13 deferral, re-listed round 14)
  • AgentChatContent.test.tsx:287 — the approval-latch reset has no test — already reported (round-14 deferral)
  • AgentChatContent.test.tsx:303 — the spinner VP item is never constructed because every fixture returns COMPLETED — already reported (round-2 deferral D2-1, re-listed rounds 3, 5, 6, 9 and 13)
  • AgentChatContent.tsx:403 — TextSelectionController mounted without getAdditionalSelectableRects — already reported (round-3 deferral D3-2, re-listed R5-3, R6-2 and R9-5)
  • AgentComposer.tsx:209 — the click-away fall-through assumes the tab bar releases focus on the same keypress — already reported (round-15 deferral at AgentTabBar.tsx:128)
  • AgentChatContent.test.tsx:479 — the only allExpanded:false case never renders a pending row — already reported (round-15 deferral list, probe-confirmed)
  • …and 3 more (see the run report)

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

Not explored to full depth (tool budget reached): "agent reverse-audit (round 4)": did not run an ink render of AgentFooter at a narrow width (40-60 columns) to measure the actual wrap threshold and confirm the 1-row growth empirically..

Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.

Test Plan (not a blocker): src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory; 68 tests pass — this review observed 32224 passed.

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

  • packages/cli/src/ui/selection/use-text-selection.tsx:494 — [probe] no test pins that the unmount teardown clears the paint while eventsPaused is true; the conditional variant survives 42/42
  • packages/cli/src/ui/components/agent-view/agentComposerLayout.measurement.test.tsx:26 — [probe] the header's stated reason for not testing the real AppContainer is measurably false, leaving the #9507 measure path with no runtime test
  • packages/cli/src/ui/components/agent-view/AgentTabBar.test.tsx:246 — [probe] the menu gates' close direction is unpinned; a one-way-latch rework survives 289 shipped tests
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:24 — [probe] no fixture renders an item after splitIndex, so the "onward" half of the split contract is unfalsifiable as shipped
  • packages/cli/src/ui/app-container-controls-dep.test.ts:119 — [probe] the composer-key guard's regex is unanchored to the live assignment, unlike its sibling liveAgentPanelLayoutKey guard three tests up
中文说明

仅完成部分审查,审查缺口已披露。

⚠️ 第 16 轮,且自本审查首次测量以来 diff 已增长 3.6 倍(源码 diff 行数 190 → 680);反向审计也在轮数上限处停止且未收敛。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

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

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

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 4)":did not run an ink render of AgentFooter at a narrow width (40-60 columns) to measure the actual wrap threshold and confirm the 1-row growth empirically.。

未审查:反向审计——在 5 轮的反审轮数上限内未收敛。

Test Plan(非阻断):src/ui/components/agent-view/AgentChatContent.test.tsx — no such file or directory; src/ui/components/shared/ScrollableList.test.tsx — no such file or directory; 68 tests pass — this review observed 32224 passed。

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

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

@yiliang114

yiliang114 commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator Author

Latest authorized follow-up: da358660683b fixes Enter being swallowed after a printable key dismisses the menu in the same stdin chunk. AgentComposer remembers only input-initiated dismissal of that menu instance; a fresh menu regains ownership, and overlay activation cannot also submit the draft. Scope: 1 implementation file (+9/-2), 1 test file (+28/-0). Four focused test files passed (74 tests), plus ESLint and diff checks. The new test pins the interceptor with no render between calls; it is not a live-terminal end-to-end test.

R15-1 addressed in eee9e125e0de: opening a nonempty menu updates its synchronous mirror and the app-level guard immediately. The shared keypress hook drops callbacks from the pre-menu render until the menu renders; existing rendered-menu routing and dismissal remain in place.

Validation: 199 tests across 13 files passed (agent-view, context-menu, useKeypress and ToolConfirmationMessage), plus focused ESLint and diff checks. The regression sends right-press + Shift+Tab + Right + Return in one stdin write, checks that no underlying handler or approval runs, then verifies menu activation and approval after dismissal. Empty-item right-clicks remain pass-through. No full build or live-terminal session was run.

Scope: this explicitly authorized round changes 2 implementation files (+26/-4) and 1 test file (+85/-1); no dependencies or packages added. Baseline → current: implementation 1 file (+136/-3) → 11 (+392/-18); tests 1 (+338/-0) → 8 (+1357/-5). Historical growth and deferred suggestions remain recorded below. This pass does not claim to complete the broader input-arbitration work in #11228.

CI follow-up: the first post-push Lint & Static job stopped at check-lint-gate-freshness because main had updated ci.yml (97cd563). Merged main without conflicts in 0f8f90a; the missing gate commit is now an ancestor. Re-ran the 13 focused test files (199 passing), focused ESLint, formatting and diff checks after the merge. Replacement CI is pending; no full build or live-terminal verification was run locally.

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

Scope: full diff reviewed (~2100 lines across 14 files). Cross-file callers of changed surface checked. NOT reviewed: macOS/Windows terminal behaviour (no host); live multi-teammate session (no sandbox); CI legs are outside this review's verdict.


No blocking findings.

Approval blockers: none.


What I checked

  • VP mode rendering path (AgentChatContent): virtualItems / renderVirtualItem / agentVpIsStatic / agentVpKeyExtractor against the ScrollableList contract; committed/pending split boundary; initialScrollIndex pinned to SCROLL_TO_ITEM_END.
  • Approval pending guard: two-halves sequence (scroll-to-tail first, then take focus) via approvalScrolledRef; reset on approvalPending === false.
  • Layout key chain: getAgentComposerLayoutKey → setAgentComposerLayoutKey → AgentViewContext memo deps → AppContainer measurement effect deps — end-to-end.
  • Context menu gating: useKeypress.ts same-tick guard (menu === null && isMenuOpen()); ContextMenuContext.openMenu synchronous ref update before setMenu; gate propagation to AgentComposer, AgentTabBar, ToolConfirmationMessage, AskUserQuestionDialog.
  • ScrollableList focus-loss flush cancel: useEffect on hasFocus dispatches cancelPendingScroll before a pending burst can land after focus is taken.
  • TextSelectionController unmount teardown: getBuffer()?.setSelection(null) — correctly clears the painted range on the per-stdout frame controller so a successor view doesn't inherit a stale highlight.
  • AskUserQuestionDialog isActive={true} → isActive={isFocused}: change is sound; the nested input is now correctly gated along with the rest of the dialog.
  • Test validity: VP / legacy / approval / context-menu test paths; agentComposerLayout.measurement.test.tsx (before/after re-measure); app-container-controls-dep.test.ts (source-level dep guard). One question below.
  • Cross-check: all prior criticals (R13–R15) are addressed at this head. The question below was not previously filed.

Question (unsettled — minor)

See inline comment at ToolConfirmationMessage.test.tsx line 1429.


Reviewed with AI assistance.

{ x: 0, y: 0 },
);
// AppContainer is outside the provider and relies on this callback.
expect(onMenuChange).toHaveBeenLastCalledWith(hasItems);

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.

Question (minor): When hasItems === false, openMenu([], …) returns early without calling onMenuChange. At the point this assertion runs, onMenuChange has never been called — does toHaveBeenLastCalledWith(false) on a never-called mock pass in your vitest version, or would this fail?

If it fails, the assertion for the hasItems === false branch should be expect(onMenuChange).not.toHaveBeenCalled() (capturing the intent that an empty-items openMenu does NOT fire the app-level callback).

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.

Checked on 0f8f90ae70. At the moment that assertion runs, onMenuChange has already been called once with false, so toHaveBeenLastCalledWith(false) passes for a real reason rather than vacuously.

ContextMenuProvider has a mount effect — onMenuChange?.(menu !== null) at ContextMenuContext.tsx:98-100 — which fires on mount with menu === null, before any mouse event. Measured onMenuChange.mock.calls at the assertion: [[false],[true]] when hasItems is true, [[false]] when false. So the suggested expect(onMenuChange).not.toHaveBeenCalled() fails here: expected "spy" to not be called at all, but actually been called 1 times (Number of calls: 1).

The assertion is load-bearing. Mutating only the empty-items branch (ContextMenuContext.tsx:80) to fire onMenuChange?.(true) while keeping the early return — nothing else in the test changes — is caught by exactly this line: AssertionError: expected last "spy" call to have been called with [ false ], exit code 1.

Your instinct that something is off here is right, just not where the question pointed. Because the assertion runs inside a subscribed mouse handler, its failure escapes through KeypressContext.handleKeypress (KeypressContext.tsx:832) into the stdin stream's async emit, so vitest files it under "Unhandled Errors" (Errors 1 error, exit 1) while the case itself still prints a pass — vitest even warns "This might cause false positive tests". CI does go red, so the guardrail works; the failure is just not attributed to the case. Capturing it in the handler and rethrowing after the act() would fix the attribution (~5 lines, this test file only). I have not pushed that: review is at round 16 with the last round explicitly bounded to one, and a push now would invalidate the review run currently in flight on this head. Say the word if you want it in scope.

It has to stay inside the handler either way — it pins the synchronous mirror update within one stdin chunk, which is the point of R15-1. After the chunk the menu is already dismissed, so the last call is false in both branches and the assertion would stop discriminating.

中文

在 0f8f90ae70 上实测:断言执行时 onMenuChange 已被调用过一次(参数 false),所以 toHaveBeenLastCalledWith(false) 是真过而非空过。

原因是 ContextMenuProvider 的 mount effect(ContextMenuContext.tsx:98-100)挂载时就以 menu === null 调了一次 onMenuChange(false),早于任何鼠标事件。实测 onMenuChange.mock.calls:hasItems=true → [[false],[true]],hasItems=false → [[false]]。因此建议的 not.toHaveBeenCalled() 会失败(实际调用 1 次)。

这行断言有判别力:只把空 items 分支(ContextMenuContext.tsx:80)改成 onMenuChange?.(true)、保留 early return,其它都不动,就会被这一行抓到,退出码 1。

真正的小问题在归因:断言在订阅的鼠标 handler 内抛出,异常经 KeypressContext.handleKeypress(:832)落到 stdin 流的异步 emit,vitest 归到 "Unhandled Errors"(Errors 1 error、退出码 1),用例本身仍显示通过,vitest 自己也警告 "This might cause false positive tests"。CI 会红,护栏有效,只是失败没归到用例上。修法是 handler 内捕获、act() 之后重抛(约 5 行,只动这个测试文件)。本轮没推:评审已到第 16 轮、上一轮被明确限定为"仅一轮",且现在推送会让当前 head 上正在跑的 review run 作废。需要纳入范围的话说一声。

无论如何断言都得留在 handler 里——它钉的是同一次 stdin chunk 内的同步镜像更新,这正是 R15-1 的要点;chunk 结束后菜单已关闭,两个分支的最后一次调用都是 false,断言就失去判别力了。

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.

The provider calls onMenuChange(false) from its mount effect before the test writes stdin. The empty-items openMenu adds no notification, so the last call remains that initial false. Both parameterized cases pass in the focused run (Vitest 3.2.7); changing this to not.toHaveBeenCalled() would reject the expected mount notification.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Picks up the current main so the lint-gate freshness check (step 8 of
Lint & Static) passes again; no conflicts.

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

@chiga0 chiga0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Scope

Tier: Standard — UI bug fix + contained feature (VP scroll for agent tabs). 19 files, +1627 −20.

Reviewed: all 19 changed files in the diff. Cross-file context: ScrollableList imperative ref shape (from diff context), AgentViewContext state/actions memo deps, getAgentComposerLayoutKey key contract, ContextMenuContext openMenu/closeMenu ref protocol, TextSelectionController unmount path.

Not reviewed: working tree unavailable — execution rung (Standard tier, rung 2) not run locally. Existing review history (12 rounds, qwen-code-ci-bot) documents 27/27 targeted test passes for this diff's test files.


Findings

No confirmed blockers.

R1-1 minor — confirmed · packages/cli/src/ui/components/messages/AskUserQuestionDialog.tsx:564
The isActive={true} → isActive={isFocused} fix is a genuine standalone bug: the custom-input field in the dialog was always active regardless of focus, accepting keystrokes from unrelated consumers. The fix is correct.

R1-2 minor — supported · packages/cli/src/ui/hooks/useKeypress.ts:26–29
The race guard if (menu === null && isMenuOpen()) return correctly handles the case where a right-click and a keypress share one stdin chunk: openMenu writes menuRef.current synchronously before setMenu, so isMenuOpen() returns true while React state still reads null. Guard fires only in that gap; once state propagates both sides agree and the guard is a no-op. The onMenuChange?.(true) ordering in ContextMenuContext.openMenu makes this safe.

R1-3 minor — confirmed · packages/cli/src/ui/selection/use-text-selection.tsx:495
useEffect(() => () => getBuffer()?.setSelection(null), [getBuffer]) correctly clears the painted selection on unmount. Without this, switching away from a teammate tab left the highlight band over whatever cells the successor tab rendered at those coordinates; no successor could repair it because clearSelection() early-returns on an empty own-selection. Correct fix.


Cross-check against existing reviews

Existing rounds (1–12, qwen-code-ci-bot):

  • D10-1 (Critical, deferred, fails-closed, new-surface) — "VP branch windows the pending region, so scrolling up unmounts a teammate's tool-approval UI." The current code addresses this with a two-part fix: approvalScrolledRef + scrollRef.current?.scrollToEnd() when approvalPending becomes true, followed by hasFocus=false to disable scroll keys. The bot classified this as "no wrong result certified" after 12 rounds including runtime probes. Cannot rule — would require running the approval+scroll interaction in a real terminal. Disclosed below.

  • X12-1 measureAtFullHeight omitted from VP ScrollableList — downgraded from Critical to Suggestion by round-11 probe ("clip self-heals on the next frame"). Confirmed non-blocking.

  • X12-2 allItems rebuilt every tick — author declined. keyExtractor uses stable item.id, so key stability is maintained; the wrapper allocation is a performance cost, not a correctness bug. Confirmed non-blocking.

  • X12-3 historyRemountKey's last VP-mode consumer removed — historyRemountKey is still destructured but unused in the VP path; two AppContainer comments referencing it may be stale. Documentation-only concern, no behavioral impact. Confirmed non-blocking.

  • X12-4 through X12-6 (test coverage concerns, author declined) — excluded per taxonomy: no named reachable wrong behaviour, no named defect the gap hides.

  • X12-7 getAgentComposerLayoutKey omits height-shifting inputs — at the current head the function covers streamingState, statusLabel, queuedMessageCount, inputText; the measurement test (agentComposerLayout.measurement.test.tsx) exercises all four and the comment in AgentComposer.tsx names those four as the height-shifting parts of the footer. Cannot identify a missing input from the diff. Confirmed non-blocking at current head.

  • D11-1 menu quiescence duplicated — duplication has no named cost per the exclusion list. Dropped.

  • D11-2 renderVirtualItem deps include availableTerminalHeight for all items — committed items don't use availableTerminalHeight but the callback memo still lists it, so any terminal resize re-generates the callback for committed items. Performance concern only, not a correctness bug. Confirmed non-blocking.

  • R12-1 (test): AgentChatContent.test.tsx mounts eight ink trees without unmounting — stdout resize listeners accumulate past Node's MaxListeners of 10. Test hygiene issue, no production impact.


Needs a human

D10-1 (unsettled): The approval-pending scroll protection (approvalScrolledRef + scrollToEnd() before disabling hasFocus) relies on the imperative scrollRef.current?.scrollToEnd() call executing AFTER ScrollableList's hasFocus-loss effect cancels any pending scheduled scroll. Whether scrollToEnd() bypasses the pending-scroll queue or goes through it determines whether a user who had scrolled up before an approval arrives will see the dialog scrolled into view. Could not confirm without running the approval + scroll interaction locally. The bot's 12 rounds of testing found no repro but also no proof it works.


Approval blockers

  1. Execution rung not run — working tree unavailable; Standard tier requires rungs through 2. Execution evidence for D10-1 could not be produced.

Verdict

No confirmed blockers. Approval withheld: execution rung required by Standard tier could not be run (no working tree); D10-1 remains an unsettled potential interaction between scrollToEnd() and the pending-scroll cancellation on hasFocus loss.

The overall approach is sound: the composerLayoutKey propagation closes the height-measurement loop correctly, context-menu quiescence is applied consistently across all key subscribers, and the selection unmount teardown is a correct resource-lifecycle fix. The tests in agentComposerLayout.measurement.test.tsx are the strongest piece of this PR — they reproduce the root cause with real ink rendering and prove both the buggy and fixed states.

Reviewed with AI assistance.

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Critical-only review at 5d9425b2, base 64c04538. The head moved twice while this review was in flight; both moves were merges of main, and none of AgentComposer.tsx, ContextMenuContext.tsx, useKeypress.ts or AppContainer.tsx changed between them, so every line reference below was re-read at 5d9425b2 rather than carried over.

Verdict: COMMENT — the blocking finding's provider half is fixed and I verified that in code; I could not confirm its consumer half within budget, and under the standard applied here an unconfirmed historical blocker is not an approve. No new Critical of my own.

What is fixed, verified at this head

The round-16 Critical was that every context-menu gate the diff adds reads the render-time contextMenu snapshot while openMenu wrote only React state and never the provider's synchronous mirror — so in the open direction each gate sat a full render behind the event that opened the menu, while closeMenu and executeIndex already nulled menuRef.current synchronously for exactly this reason.

openMenu in ContextMenuContext.tsx now does the symmetric thing:

if (items.length === 0) return;
menuRef.current = { items, position };
// The app-level key handler sits outside this provider.
onMenuChange?.(true);
setMenu(menuRef.current);
setSelectedIndexState(0);

The mirror is written before the state update, isMenuOpen() is exposed on the context as a synchronous predicate reading that mirror, and onMenuChange fires immediately rather than waiting for the effect at line 99. AppContainer.tsx wires it to handleContextMenuChange. So the provider now offers precisely what the finding said was missing: a way to ask whether the menu is open without waiting for a render.

What I could not confirm

The two gates the finding named as consequential are still reading the render-time snapshot rather than that new predicate. In AgentComposer.tsx:

  • line 142, the Escape subscriber: isActive: streamingState === StreamingState.Responding && !agentShellFocused && contextMenu === null
  • line 171, the Shift+Tab subscriber: isActive: !agentShellFocused && contextMenu === null, with a comment stating that this one "writes straight through to the agent runtime's tool-scheduling policy, so a Shift+Tab aimed at the menu would silently change the approval mode of the very teammate being decided about"

Both take contextMenu from useContextMenu(), which returns the state value, and neither handler body re-checks isMenuOpen() at dispatch time. useKeypress applies isActive through a useEffect keyed on it (lines 40-49), keeping only the handler itself in a ref — so a change to isActive takes effect after a render commits, which is the timing the original finding measured against a single coalesced stdin chunk.

The open question I ran out of budget on is whether handleContextMenuChange in AppContainer.tsx closes that path from above — for example by quieting a handler that would otherwise dispatch into these subscribers. I did not trace it, and I am not asserting either answer. What I can say is that the specific mechanism the finding described is still visible at these two call sites, that the consequences it measured were an approval-mode advance on a teammate awaiting approval, a Return approving a tool call the user never answered, Ctrl+C denying it and Escape cancelling the round, and that the thread being marked resolved does not by itself settle it.

The shape that would close this without depending on the app-level wiring is available now and is small: have those two subscribers consult isMenuOpen() at dispatch time — inside the handler, or through a ref-based predicate — instead of relying on isActive flipping after a render. The provider already exposes the synchronous answer, which is what made this hard before this commit.

Other state

One thread is unresolved and it is not a Critical: a question about whether expect(onMenuChange).toHaveBeenLastCalledWith(false) passes on a never-called mock in ToolConfirmationMessage.test.tsx:1429, where the empty-items branch returns early without invoking the callback. If it does not pass, the assertion for that branch should be not.toHaveBeenCalled(). Either way it is a test-intent point, and it is worth settling because an assertion that passes vacuously would not catch the branch it claims to cover.

reviewDecision still reads CHANGES_REQUESTED from the round-16 review at 397f3987, several heads back, and a maintainer's own review at 0f8f90ae was dismissed — so the decision state does not describe this head and needs a dismissal or re-request.

CI at this head is 11 passed, 19 skipped and 4 pending, with nothing failing. The pending set includes Test (ubuntu-latest, Node 22.x) and Lint & Static, and the first of those is the lane that would run the roughly 1,400 lines of new tests in this diff, so there is no executed signal for them yet. I did not wait on it.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@chiga0 @qqqys — offering this as the missing execution rung for D10-1.

Answer: yes — a user who has scrolled up DOES get the approval tail pulled back into view. The hasFocus-loss cancel effect runs before the scrollToEnd() effect (I measured the order), and it cannot swallow it, because the two operate on disjoint state.

1. An existing test already pins this interaction

packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:541 — "VP mode: a pending teammate approval pulls the tail back and keeps the viewport quiet" — already runs D10-1's exact sequence: Page Up to the top and assert the tail left the window, then set a pending approval and assert the tail is back (:568) and hasFocus === false (:570).

Crucially, the ScrollableList mock is a pass-through spy that renders the real component (AgentChatContent.test.tsx:107-118, createElement(RealList, { ...props, ref })), so the real hasFocus-loss cancel effect is in the tree, not stubbed out.

cd packages/cli && npx vitest run src/ui/components/agent-view/AgentChatContent.test.tsx --reporter=verbose
 ✓ … > VP mode: a pending teammate approval pulls the tail back and keeps the viewport quiet 747ms
 Test Files  1 passed (1)
      Tests  9 passed (9)

2. That test has teeth (mutation)

Commenting out scrollRef.current?.scrollToEnd() (AgentChatContent.tsx:380) makes it fail — the frame stays pinned at the top instead of returning to the tail:

 × … > VP mode: a pending teammate approval pulls the tail back and keeps the viewport quiet 935ms
   → expected 'AGENT_HEADER\nuser-msg-0\nuser-msg-1\…' to contain 'user-msg-39'
+ AGENT_HEADER
+ user-msg-0 … user-msg-6        ❯ AgentChatContent.test.tsx:568:30
 Tests  1 failed | 8 skipped (9)

3. The actual effect ordering (measured, not reasoned)

Temporary appendFileSync markers in both effects, same test run, log in emission order:

1  PROBE-B child-effect hasFocus=true      ← mount
2  PROBE-B child-effect hasFocus=false     ← ScrollableList.tsx:160 cancelPendingScroll()
3  PROBE-A parent-effect scrollToEnd       ← AgentChatContent.tsx:380

So the ordering chiga0 flagged as the risk is real: child cancel fires first, parent scrollToEnd() second — and the tail still lands in view (test green in the same run).

4. Why the order can't matter

  • cancelPendingScroll (ScrollableList.tsx:150-154) only zeroes pendingWheelDelta / pendingDragRow (:124-125) and calls cancelScrollFlush() — the wheel/scrollbar-drag coalescing queue.
  • scrollToEnd (VirtualizedList.tsx:780-789) writes React state directly: setIsStickingToBottom(true), setPendingScrollTop(Number.MAX_SAFE_INTEGER), setScrollAnchor({ index: data.length - 1, offset: SCROLL_TO_ITEM_END }).
  • ScrollableList.tsx:54 forwards the imperative handle straight through to VirtualizedList; there is no shared queue between the two paths.

So the cancel has nothing to cancel on the scrollToEnd path in either order.

All instrumentation was reverted; no commits, no pushes, no product-code change: git rev-parse HEAD = 5d9425b291738794f78c850fb3d66b83af988b8a, git status --porcelain empty, git diff --stat HEAD empty.

What I could not establish

  • This is ink-testing-library, not a real PTY. It proves component-level ordering and final frame content; it does not prove real-terminal pixel geometry.
  • The test's items are uniform one-line mocks. An approval dialog taller than containerHeight is not covered: the anchor is { last, SCROLL_TO_ITEM_END }, i.e. the item's end at the viewport bottom, so an over-tall confirmation would show its bottom (action row) but not its top. I did not measure this — flagging it as uncovered, not as a defect.
  • I did not stage a live Agent Team teammate with a real model call in a real terminal (node scripts/dev.js under tmux); that needs a live model + teammate and I treated it as out of budget.

Not asking for an approval call here — just closing the "could not be produced" gap on D10-1's consumer half.

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

Re-reviewed at 5d9425b2 (delta since 0f8f90ae, which chiga0 approved): one new production commit da358660 plus a merge of main.

da358660 (preserve keys after input dismisses context menu) is small and correct: the inputDismissedMenuRef guard makes only an input-side dismissal release subsequent same-chunk keys, and the new test pins both directions — a fresh menu still owns Enter, and the Enter that executes a menu item cannot also submit the draft. No P0/P1.

Current state for the record: CI green at this head (15 pass, 0 fail, 1 pending = review lane); the only unresolved thread is chiga0's minor question on ToolConfirmationMessage.test.tsx:1429, which was answered with measured evidence (onMenuChange fires false from the provider's mount effect, so toHaveBeenLastCalledWith(false) passes for a real reason and not.toHaveBeenCalled() would fail) — it is his to resolve. His approve at 0f8f90ae was auto-dismissed by the push, so this PR needs one fresh non-author maintainer approve at 5d9425b2 to unblock.

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

Risk-driven review — PR #9531 (round 2)

Tier: Standard — UI bug fix, contained feature (VP scroll for agent tabs, context-menu quiescence, selection teardown)
Head reviewed: 5d9425b291738794f78c850fb3d66b83af988b8a
Base: 64c04538243ac0097f2219e865858cf70f5b03b8

Round-1 findings (R1-1 AskUserQuestionDialog.isActive, R1-2 useKeypress race guard, R1-3 TextSelectionController unmount teardown) and the prior execution-gap disclosure are already on record at this head (review 5314796664). This round resolves both items that blocked round-1 approval and integrates the qqqys cross-check.


Round-2 resolutions

D10-1 resolved — scrollToEnd() is independent of the pending-scroll queue

The round-1 unsettled item was: "does scrollToEnd() go through the pending-scroll queue, and can cancelPendingScroll() suppress it?"

scrollRef.current?.scrollToEnd() delegates through the useImperativeHandle chain to VirtualizedList.scrollToEnd() — a direct scroll-position update. The pending-scroll queue (pendingWheelDelta + pendingDragRow) is managed exclusively by handleMouseEvent and drained by useFrameCoalescedFlush; scrollToEnd() neither reads nor touches either ref. When approvalPending becomes true in one render cycle:

  1. ScrollableList.useEffect([hasFocus]) (child, fires first) cancels any queued wheel/drag intent via cancelPendingScroll().
  2. AgentChatContent.useEffect([approvalPending]) (parent, fires second) calls scrollRef.current?.scrollToEnd() directly.

Step 2 arrives after step 1 and is unaffected by it. The dialog is brought into view regardless of prior scroll state.

qqqys Critical resolved — useKeypress.ts guard covers all subscribers

The concern was that the Shift+Tab approval-mode subscriber in AgentComposer reads contextMenu === null (render-time state) for isActive and so could misfire on a coalesced right-click + Shift+Tab stdin chunk before the render commits.

The useKeypress.ts change in this PR wraps EVERY subscriber's handler in onKeypressRef.current, which checks if (menu === null && isMenuOpen()) return before dispatching. isMenuOpen() reads menuRef.current synchronously — no render needed. Because ContextMenuContext.openMenu now writes menuRef.current before calling setMenu (the fix confirmed in both reviews), isMenuOpen() returns true the moment the menu opens, even before React state propagates. The guard therefore fires in the coalesced-stdin window and suppresses the Shift+Tab before it reaches the approval-mode subscriber. The isActive render-lag is present but irrelevant: the dispatch-time guard in the hook's wrapper layer is what closes the gap.

Minor note (from qqqys — test hygiene): ToolConfirmationMessage.test.tsx:1429 asserts expect(onMenuChange).toHaveBeenLastCalledWith(false) on the empty-items early-return path, where the callback is never called. If the assertion passes today it is vacuous (no last call = anything-or-nothing depending on jest mock state). Recommend replacing with expect(onMenuChange).not.toHaveBeenCalled() to make intent explicit. Non-blocking.


Verdict

Approve. No confirmed blocker. Both round-1 unsettled items are settled by code analysis at this head: scrollToEnd() is queue-independent, and the useKeypress.ts dispatch-time guard covers the approval-mode subscriber. The three round-1 Minors are correct confirmations of good fixes; none blocks. The known limitation — scroll locked during approval-pending — is explicitly documented in the PR description and is an accepted tradeoff.

Reviewed with AI assistance.

@pomelo-nwu pomelo-nwu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed the current head. The teammate transcript now uses one virtual viewport in terminal-buffer mode, retains the legacy Static path, and keeps pending approval dialogs mounted at the tail while suspending viewport keys. Mouse selection, context-menu focus, and composer sizing have focused coverage; available checks are green. APPROVE. Minor follow-up: in the new hasItems === false test case, openMenu([]) returns before onMenuChange, so toHaveBeenLastCalledWith(false) in the mouse handler is not a useful assertion; please adjust that test when convenient.

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

⚠️ Round 17, and the diff has grown 4.2x since this review first measured it (190 → 790 source diff lines). The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

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

  • AgentTabBar.tsx:128 — printable-character branch loses the tab-bar focus release when the whole subscriber is gated on the open menu — already reported (round-15 deferral list, probe-confirmed; re-listed round 16)
  • AgentChatContent.test.tsx:447 — the pending-path test never performs the head-to-tail round trip its comment promises — already reported (round-1 R1-3; re-listed rounds 13 and 16)
  • AgentChatContent.tsx:207 — the Ctrl+F subscriber's new context-menu gate has no test — already reported (round-15 deferral list, probe-confirmed; re-listed round 16)
  • AgentChatContent.test.tsx:287 — the approval-latch reset has no test — already reported (round-14 deferral; re-listed round 16)
  • AgentChatContent.tsx:60 — the key-must-not-encode-pending-ness invariant has no transition test — already reported (round-1 R1-4, author declined; re-listed rounds 9 and 13)
  • app-container-controls-dep.test.ts:151 — the actions-memo guard's stated rationale pins a failure mode React excludes — already reported (round-4 R4-1; re-listed rounds 14 and 16)
  • AgentChatContent.test.tsx:303 — every fixture returns COMPLETED so the VP spinner item is never constructed — already reported (round-2 deferral D2-1; re-listed rounds 3, 5, 6, 9, 13 and 16)
  • AgentChatContent.test.tsx:549 — the approval-lockout fixture registers an approval with no matching tool_call so no dialog ever mounts — already reported (round-14 deferral; re-listed round 16 at :561)
  • agentComposerLayout.measurement.test.tsx:26 — the header's stated reason for not exercising the real AppContainer is measurably false — already reported (round-16 deferral list)
  • AgentComposer.tsx:228 — the dismissal block's closeMenu() side effect has no test witness — already reported (round-13 deferral; re-listed round 16 at :222)
  • AgentChatContent.test.tsx:291 — the fixture's event emitter is inert so the agent-event channel is never driven — already reported (round-2 deferral D2-1; re-listed rounds 3, 5, 6 and 9)
  • AgentChatContent.tsx:398 — measureAtFullHeight omitted from the agent VP ScrollableList — already reported (round-3 deferral D3-1; re-listed rounds 5, 6, 10, 11 and 13; round-11 probe settled its severity)
  • AgentChatContent.tsx:403 — neither selection controller receives a selectionQueryRef, so Copy Selection can never appear on this tab — already reported (rounds 10 and 11 duplicate lists, round-13 deferral D13-13; author answered on the R9-2…

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

Not reviewed: build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; only the Linux unit run was covered locally.

Not explored to full depth (tool budget reached): chunk 7: none — no check was cut short.; "agent reverse-audit (round 4)": did not execute the three new ToolConfirmationMessage cases or the new ScrollableList case under mutation (drop inputActive / drop the focus-loss effect) …; "agent reverse-audit (round 1)": I did not execute AgentChatContent.test.tsx to observe the two findings red/green — both are argued from source ( ink/build/ink.js:341-348 , ink-testing-libr….

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

Test Plan (not a blocker): 68 tests pass — this review observed 33851, 595 passed.

Deferred under the convergence posture (round 17, not a blocker) — recorded, not requested in this round; 2 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:386 — [probe] Critical [fails-closed] [new-surface] A pending teammate approval taller than the viewport is…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:194 — [probe] Critical [fails-closed] [new-surface] Ctrl+F while scrolled up focuses a shell row that is out…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:388 — [probe] The teammate tab still does not scroll on a bare Up arrow,…
  • packages/cli/src/ui/context-menu/ContextMenuContext.tsx:81 — [probe] openMenu notifies the out-of-provider mirror synchronously…
  • packages/cli/src/ui/hooks/useKeypress.ts:26 — [probe] useKeypress now consumes the whole menu context, whose…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:317 — [probe] The nullable menuApi probe with optional chaining at both…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:528 — [probe] Every menu gate this diff adds on the teammate tab is…
  • packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx:63 — [probe] The module-level menu probe is never reset, its guard is…
  • packages/cli/src/ui/app-container-controls-dep.test.ts:111 — [review] The five new guards never pin that AgentComposer renders…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.test.tsx:276 — [probe] The fixture pins showScrollbar false, the opposite of the…
  • packages/cli/src/ui/components/agent-view/AgentChatContent.tsx:332 — [probe] The agent VP path renders committed items with no height…
中文说明

仅完成部分审查,审查缺口已披露。

⚠️ 第 17 轮,且自本审查首次测量以来 diff 已增长 4.2 倍(源码 diff 行数 190 → 790)。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

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

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

未审查(原文为英文):build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; only the Linux unit run was covered locally.

未探索到全部深度(达到工具调用预算):chunk 7:none — no check was cut short.;"agent reverse-audit (round 4)":did not execute the three new ToolConfirmationMessage cases or the new ScrollableList case under mutation (drop inputActive / drop the focus-loss effect) …;"agent reverse-audit (round 1)":I did not execute AgentChatContent.test.tsx to observe the two findings red/green — both are argued from source ( ink/build/ink.js:341-348 , ink-testing-libr…。

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

Test Plan(非阻断):68 tests pass — this review observed 33851, 595 passed。

收敛姿态下延后(第 17 轮,非阻断)——已记录,本轮不要求修改;其中 2 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 11 条(原文未翻译,列表见上方英文部分)。

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

@yiliang114
yiliang114 added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit 58f0c80 Sep 25, 2026
137 of 138 checks passed
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Round at 5d9425b2 — evidence only, no code, no push. Two things settled by running the code rather than arguing from source.

1. @qqqys — your open question on the round-16 Critical's consumer half: the path is closed, and it closes inside useKeypress, not "from above"

You stopped at exactly the right question and declined to assert either answer, so here is the executed rung.

AgentComposer.tsx:129 (Escape → cancelCurrentRound) and :151 (Shift+Tab → approval mode) do read render-time contextMenu === null in isActive, and useKeypress does apply isActive through an effect — your timing analysis is correct. What it misses is that the handler kept in the ref is the wrapped one (useKeypress.ts:29-34):

onKeypressRef.current = (key) => {
  if (menu === null && isMenuOpen()) return;
  onKeypress(key);
};

Three facts make that guard fire in the coalesced window:

  • isMenuOpen is useCallback(() => menuRef.current !== null, []) (ContextMenuContext.tsx:76) — stable identity, so a stale closure still holds the same function object, and it reads a ref, not render state.
  • openMenu writes menuRef.current synchronously before setMenu (:81-84).
  • So with no render committed: menu === null (stale) && isMenuOpen() === true (fresh) → return. The subscriber body never runs. isActive lag is present but irrelevant, because the subscriber is still subscribed and the discard happens at dispatch.

On your "does handleContextMenuChange close it from above" sub-question: it closes a different consumer. AppContainer.tsx:3960-3963 mirrors into contextMenuOpenRef, read at :4777 and :4862 — that is AppContainer's own always-active global handler, which sits outside the provider subtree and therefore cannot use useContextMenu or this guard. Two independent layers, one per consumer class. This is also why the shape you proposed (each subscriber consulting isMenuOpen() at dispatch) would be redundant: it is already implemented once, generically, one level down.

Witness. ToolConfirmationMessage.test.tsx:1403 drives one real stdin chunk '\x1b[<2;10;5M\x1b[Z\x1b[C\r' (SGR right-click + Shift+Tab + Right + Enter) with useKeypress not mocked — only useLaunchEditor and the editor util are. Its consumer is gated isActive: menu === null, structurally identical to the two you named.

  • At head: 2 passed, exit 0.
  • Mutation, guard → if (false) return;: the menu items: true case fails with expected "spy" to not be called at all, but actually been called 3 times, exit 1. All three keys leak. So the guard is load-bearing for precisely this scenario — the witness has teeth.
  • The menu items: false case passes under mutation too, which is the correct control: with empty items openMenu early-returns without touching the mirror, there is no menu, and the keys should reach the consumer.

@chiga0's round-2 approve reached the same conclusion from source; this adds the measurement. Note AgentComposer.test.tsx:246 does not cover this window — that file mocks useKeypress wholesale, so it only asserts the post-render isActive flags.

2. @chiga0 @pomelo-nwu — please do not apply the not.toHaveBeenCalled() change at ToolConfirmationMessage.test.tsx:1429

This was raised three times (chiga0 round 1, chiga0 round-2 minor note, pomelo-nwu follow-up), so it is worth pinning down: the premise that the assertion passes vacuously is false, and the proposed replacement fails.

ContextMenuProvider has a mount effect onMenuChange?.(menu !== null) (ContextMenuContext.tsx:98-100). With menu initialised to null, it fires onMenuChange(false) on mount, before any mouse event. So when the handler asserts, the mock has been called once — toHaveBeenLastCalledWith(false) passes for a real reason.

Measured at 5d9425b2, applying the suggestion to the hasItems === false branch only:

AssertionError: expected "spy" to not be called at all, but actually been called 1 times
Number of calls: 1
Errors  1 error     exit code 1

One caveat that makes this failure mode easy to misread: the assertion lives inside a subscribed mouse handler, so when it throws, vitest reports it as an Unhandled Rejection — the test row still prints 2 passed and only Errors 1 error plus the exit code reveal it. Leaving the assertion as-is.

State

No code pushed. Round 17 with the diff already 4.2x its original size, so this stays evidence-only. The qwen-code-ci-bot CHANGES_REQUESTED from 397f3987 (09-19, two heads back) was left in place deliberately: review lane run 36136223709 is in flight at this head, and a fresh state-bearing vote from that account is the canonical way to clear it — dismissing mid-lane would misrepresent the state, and pushing would dismiss the two approvals just landed at 5d9425b2.

中文说明

本轮在 5d9425b2 上只取证、不改代码、不推送,用实跑代替源码推演敲定两件事。

一、@qqqys 的未决问题(round-16 Critical 的消费端一半):这条路径是封死的,而且封在 useKeypress 里面,不是"从上层"封的。

你对时序的判断没错:AgentComposer.tsx:129(Escape 取消当前轮)和 :151(Shift+Tab 切审批模式)确实读渲染期的 contextMenu === null,isActive 也确实靠 effect 生效。漏掉的一点是:ref 里存的是包过一层的 handler(useKeypress.ts:29-34),派发前先判 if (menu === null && isMenuOpen()) return;。

三个事实让这个守卫在同一个 stdin chunk 内一定生效:isMenuOpen 是 useCallback(() => menuRef.current !== null, [])(ContextMenuContext.tsx:76)——身份稳定,陈旧闭包拿到的是同一个函数对象,且它读 ref 不读渲染状态;openMenu 在 setMenu 之前同步写 menuRef.current(:81-84)。于是在还没提交渲染时:menu === null(陈旧)且 isMenuOpen() === true(新鲜)→ 直接 return,订阅者函数体根本不执行。isActive 的滞后确实存在但无关紧要——订阅还在,丢弃发生在派发时刻。

关于"handleContextMenuChange 是否从上层封住":它封的是另一个消费者。AppContainer.tsx:3960-3963 把状态镜像进 contextMenuOpenRef,在 :4777、:4862 被读——那是 AppContainer 自己常驻的全局 handler,它在 provider 子树之外,用不了 useContextMenu,也就用不了这个守卫。两层各自负责一类消费者。这也是为什么你提议的形状(每个订阅者自己在派发时查 isMenuOpen())会是冗余:下层已经通用实现了一次。

证据:ToolConfirmationMessage.test.tsx:1404 用真实 stdin 一次性写入 '\x1b[<2;10;5M\x1b[Z\x1b[C\r'(右键 SGR + Shift+Tab + 右箭头 + 回车),且没有 mock useKeypress(只 mock 了 useLaunchEditor 和编辑器工具);它的消费者门控是 isActive: menu === null,与你点名的两处结构相同。当前 head:2 passed、退出码 0。把守卫改成 if (false) return; 后:menu items: true 那支失败,报 expected "spy" to not be called at all, but actually been called 3 times、退出码 1,三个按键全部漏下去——说明守卫是承重的、这条用例有判别力。menu items: false 那支在变异下依然通过,这是正确的对照:空 items 时 openMenu 提前 return、不写镜像,本来就没有菜单,按键应该到达消费者。

@chiga0 在 round-2 approve 里已从源码得出同一结论,本轮补上实测。另外 AgentComposer.test.tsx:246 不覆盖这个窗口——那个文件整体 mock 掉了 useKeypress,只断言渲染后的 isActive 值。

二、@chiga0 @pomelo-nwu:ToolConfirmationMessage.test.tsx:1429 那条 not.toHaveBeenCalled() 建议请不要采纳。

这条被提了三次(chiga0 round 1、chiga0 round-2 minor note、pomelo-nwu follow-up),所以值得钉死:"断言空洞通过"这个前提不成立,而建议的改法会失败。

ContextMenuProvider 有一个挂载 effect onMenuChange?.(menu !== null)(ContextMenuContext.tsx:98-100)。menu 初值是 null,所以挂载即调用一次 onMenuChange(false),早于任何鼠标事件。等 handler 断言时 mock 已被调用过一次——toHaveBeenLastCalledWith(false) 是因为真实原因通过的。

在 5d9425b2 上只对 hasItems === false 分支套用该建议,实测:AssertionError: expected "spy" to not be called at all, but actually been called 1 times、Number of calls: 1、Errors 1 error、退出码 1。

有个容易看错的点:这条断言位于订阅的鼠标 handler 内部,抛出时 vitest 归到 Unhandled Rejection——用例行照样打印 2 passed,只有 Errors 1 error 和退出码能暴露它。断言保持原样。

状态:未推送代码。已是第 17 轮、diff 相对初始测量涨了 4.2 倍,所以本轮只做取证。qwen-code-ci-bot 落在 397f3987(09-19,两个 head 之前)的 CHANGES_REQUESTED 刻意没有清:review lane run 36136223709 正在当前 head 上跑,由该账号投出新的带状态票才是清掉它的规范方式——在 lane 跑到一半时 dismiss 会歪曲状态,而推送会连带 dismiss 掉刚落在 5d9425b2 的两张 approve。

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.24.6.

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.

Agent Team: teammate tab output isn't scrollable — content that scrolls off screen is permanently lost

5 participants