Skip to content

feat(cli): OpenTUI migration batch 4 — dialogs, commands, and session-rewind - #10383

Merged
chiga0 merged 54 commits into
mainfrom
feat/tui-dialogs-batch
Sep 1, 2026
Merged

feat(cli): OpenTUI migration batch 4 — dialogs, commands, and session-rewind#10383
chiga0 merged 54 commits into
mainfrom
feat/tui-dialogs-batch

Conversation

@chiga0

@chiga0 chiga0 commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Fourth batch of the OpenTUI migration landing plan (#8662), stacked on the live-session & input batch (#10368): the dialog layer and command-routing infrastructure for the OpenTUI renderer.

Dialogs (19 modules): auth, extensions, MCP, memory-status, misc (effort/delete/resume/branch/rewind/diff/stats), model family (primary/fast/voice/vision/compaction/image), modes (approval-mode), permissions, settings (full settings + system-info panels), stats/skills, help overlay, the dialog arena host, and the folder-trust gate.

Command layer: the commands registry mapping every slash command to its result kinds and dialog targets, with routeDialogToOpenTui translating the ink dialog-switch enum into typed OpenTUI dialog requests; the commands dispatcher (action interpreter connecting the slash gateway to the session and dialog layer); and the slash gateway routing raw user input through stacked-skills parsing and extension resolution.

Session rewind: the history-folding model (session-rewind-model.ts) that groups conversation turns into rewind checkpoints, plus the rewind viewer component. isUserTextContent in historyMapping.ts is exported so the rewind model can classify user turns without duplicating the predicate.

33 new files, ~16 500 lines including tests; 56 test files / 887 tests, all green.

Everything is additive: no reachable ink code path is touched, nothing imports these modules yet, and the default renderer stays ink. The batch is self-contained on top of the live-session batch and adds no dependency on the backend or renderer-activation batches that follow. The dep-direction gate passes.

Why it's needed

The migration lands batch by batch so each unit is reviewable on its own merits. This batch brings the complete dialog surface and slash-command routing into the OpenTUI tree, leaving backend composition and renderer activation to complete the path to a flag-reachable renderer.

Reviewer Test Plan

All new code is unreachable from the running CLI (no wiring yet), so there is no user-visible behavior change to exercise; verification is build, types, and the test suite.

How to verify

Build all workspaces and run the typecheck — both are clean. Run the dependency-direction gate (npm run check:tui-dep-direction): it passes. Run the CLI test suite: cd packages/cli && npx vitest run src/ui/opentui/ — 56 files / 887 tests, all green. To confirm the ink path is untouched, note the diff adds files only under packages/cli/src/ui/opentui/ plus the one-line isUserTextContent export in historyMapping.ts.

Evidence (Before & After)

N/A — no user-visible change; modules are not yet wired into the renderer dispatch.

Tested on

macOS (darwin arm64), Node.js v24, vitest v3.2.7. Full opentui subset: 56 files / 887 tests green. Typecheck (tsc --noEmit) clean. Dependency-direction gate passes.

Risk & Scope

Risk: Low. All 33 new files are under packages/cli/src/ui/opentui/ — an isolated namespace with no callers yet. The only changes outside that directory are: (1) a one-line export addition to historyMapping.ts (additive, no behaviour change); (2) a method-rename fix in input-prompt.tsx (setGeminiMdFileCountsetMemoryFileCount, aligning with upstream #9900). No ink code paths are touched.

Scope: CLI package only. No changes to packages/core, auth, providers, models, config, tools, or services.

Linked Issues

Part of #8662 (OpenTUI migration, batch 4 of 7). Stacked on #10368.

Checklist


中文说明:OpenTUI 迁移第四批(Dialogs & commands)——19 个对话框模块(auth、extensions、MCP、memory-status、misc、模型族、modes、permissions、settings、stats/skills、帮助覆盖层、对话框 arena 宿主、文件夹信任门禁),命令注册表(slash 命令→对话框路由),命令分发器,slash 网关,以及会话 rewind 查看器与历史折叠模型。全部为增量代码,不触碰 ink 可达路径,默认渲染器仍为 ink。stacked 在 live-session 批(#10368)之上。构建、类型检查、依赖方向门禁全过,56 文件 / 887 用例全绿。

chiga0 added 6 commits August 28, 2026 10:50
… dialogs scaffolding

Foundation batch of the OpenTUI migration tracked in #8662. Adds the renderer-neutral foundation modules under ui/opentui: theme family, a11y (plain-text, screen-reader), clipboard, key-map, mouse hit/caret, link-click + osc8 parity, early-input, exit guard/lifecycle, kitty negotiation, event-adapter, item-projection, slash dispatch (+ command parsing), commands context/output, help content, input history, and the dialog scaffolding primitives (core/shared) with the theme dialog. Two helpers land inside ui/opentui rather than utils/ to respect the utils leaf-layer rule (#9737). Stacked on the infra batch: consumes ui/model streaming model and @OpenTui deps. No reachable ink code changes beyond a one-line export addition in the shared osc8 module.
Upstream renamed setGeminiMdFileCount to setMemoryFileCount in the command
UI contract; the rebase onto main surfaced the mismatch at build. Rename
the host interface member, the bridge wiring, the dispatch stub, and the
test mock to match.
Third landing batch of the OpenTUI migration (#8662): live-session stream
fold and model, message rendering (markdown heal, MCP progressive, client
tool runs, text batching), transcript adapter with resume/session-switch,
sticky todos, the composer (input-prompt view/key/model), mouse rows and
scrollbar, unified-diff rendering, and session-compaction notice. All
additive — no reachable ink code path is touched, ink remains the default.

Carries the first consumer of the remend dependency deferred from the
infra batch, placed in devDependencies per the renderer-deps convention.
The stacked-skill completion helpers import from the relocated
ui/commands module following the upstream rename.
…-rewind

Adds the dialog layer and command-routing infrastructure for the OpenTUI
renderer: 19 dialog modules (auth, extensions, MCP, memory-status, misc,
model family, modes, permissions, settings, stats/skills, help overlay,
arena host, folder-trust gate), the commands registry with slash-to-dialog
routing, the commands dispatcher (action interpreter connecting the slash
gateway to the session and dialog layer), and the session-rewind viewer
with its history-folding model.

Also exports `isUserTextContent` from historyMapping so the rewind model
can classify user turns without duplicating the predicate.

Everything is additive: no reachable ink code path is touched, the default
renderer stays ink, and the dep-direction gate passes. Stacked on the
live-session batch.

56 test files / 886 tests, all green.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Round-2 review fixes (17 Critical + 10 Suggestion resolved in code):

- dialogs-shared: move number-select flush out of the setState updater
  (StrictMode double-fires onSelect); split setActiveIndex (ink
  SET_ACTIVE_INDEX, lands on any in-range row) from highlightIndex
  (arrow keys skip disabled rows) so wheel navigation never sticks
- event-adapter: chat_compressed notice mirrors ink formatCount ('~'
  prefix for estimated counts); vision_bridge_notice renders
  summary\nnotice; explicit projections for task_execution /
  findings_list / terminal_image keep multi-MB payloads off the
  transcript; retry-countdown-clear forwards isContinuation
- slash-dispatch: isSlashCommandInput drops the '?' branch (ink gate
  routes ? input to the model); executeSlashCommand races the action
  against the abort signal; dialog effects carry the
  OpenDialogActionReturn payload; projected added-item text surfaces
  alongside non-handled effects (notice); message-shaped items project
  to their text; ui.history comes from env; absent sessionStats stamp
  now, not epoch; telemetry parity (recordSkillInvocation /
  recordAutoSkillCommandUsage / makeSlashCommandEvent)
- item-projection: model stats render per-(model,source) sections with
  N/A for unpriced entries; Tool Calls line uses ASCII x like ink;
  redactProxy deduplicated via systemInfoFields export
- theme: palette/syntax colors resolve through color-utils toHex before
  parseColor (ink CSS names / *bright names no longer degrade to
  magenta); unresolvable values stay unset
- key-map: kitty 'kpenter' normalizes to 'return'; resolveCommands
  exposes ink's key fan-out (Ctrl+C fires QUIT + CLEAR_INPUT)
- a11y: hardWrap delegates to wrap-ansi (word-boundary parity with
  ink's screen-reader path); markdown reducer tracks fence length,
  keeps fence-like lines literal inside fences and inner backticks in
  multi-backtick spans; stripAnsi delegates to strip-ansi plus a
  private-parameter CSI pass (SGR mouse, DEC save/restore)
- clipboard: OSC 52 write gated on a TTY (stderr preferred), tests spy
  the stream instead of writing real sequences to the runner's terminal
- exit-guard: independent per-key arm windows like ink
- dialogs-theme: diff preview pane receives syntaxStyle/filetype

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

@chiga0 Thanks for the fourth batch. This one stops at the template gate — the body is missing three sections the PR template asks for:

  • Tested on — the OS table. The test-suite claim (56 files / 886 tests) has no environment annotation, and CI here runs on macOS, Windows, and Linux.
  • Risk & Scope — main risk or tradeoff, what is not validated / out of scope, breaking changes. The prose in "What this PR does" covers part of it ("everything is additive…"), but the sibling batches (#10134, #10146, #10368) all carry this section explicitly — for a ~16.5k-line batch it is the section reviewers reach for first.
  • Linked Issues#8662 and #10368 are referenced in prose, but the formal section (without a closing keyword, since the tracking issue stays open) is what lets reviewers and gates follow the stack.

The template's bilingual <details> block is also expected — the current Chinese paragraph is a condensed summary rather than the per-section translation the template asks for.

Fill those in (no code changes needed) and re-trigger with @qwen-code /triage; the gate picks it up from there.

中文说明

@chiga0 感谢提交第四批。本次在模板门禁处停下——PR 正文缺少 PR 模板 要求的三个小节:

  • Tested on——操作系统表格。测试套件的声明(56 文件 / 886 用例)没有环境标注,而 CI 会在 macOS、Windows、Linux 上运行。
  • Risk & Scope——主要风险或权衡、未验证/超出范围的部分、破坏性变更。"What this PR does" 的正文覆盖了一部分("全部为增量……"),但同系列批次(#10134#10146#10368)都显式包含该小节——对一个约 1.65 万行的批次,它是评审者最先看的小节。
  • Linked Issues——#8662#10368 目前只在正文中提及,正式小节(因跟踪 issue 保持开启,不使用 closing keyword)才能让评审者和门禁跟踪这个 stacked 依赖链。

此外,模板要求双语 <details> 块——目前的中文段落是浓缩摘要,而非模板要求的逐节对应翻译。

补齐以上小节(无需改代码)后,用 @qwen-code /triage 重新触发,门禁会从模板检查继续。

Qwen Code · qwen3.8-max

…review

- kitty-negotiation: KITTY_REPLY_RE requires at least one flag digit
  (\d+), so an echoed bare query \x1b[?u in PTY/CI environments no
  longer resolves true and locks the renderer into kitty mode on a
  terminal that never answers queries; the accumulation buffer keeps
  only a 256-byte tail (bounded memory, bounded rescan under byte
  floods); the settle-window drain is removed — an EventEmitter data
  listener cannot consume chunks from other listeners, so late replies
  flow to the renderer's input parser like any other terminal noise
- a11y-screen-reader: ScreenReaderOutputWriter sanitizes written
  content (stripAnsi + drop bare C0/C1 controls, keep newlines) so the
  plain-text-only contract is enforced at the writer instead of
  trusting every future caller — smuggled OSC 52 clipboard writes or
  title/cursor sequences cannot execute on the main screen

@chiga0 chiga0 left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Review — batch 4 (dialogs, commands, session-rewind)

Deep tier on the routing/contract surfaces (a parity reimplementation whose counterpart is not in the diff), scope-limited on the presentational dialog bodies. No blockers. One test-validity finding worth fixing before this lands, plus three contract/docs nits.

Disclosure first — CI provides no code evidence on this PR

The check set is authorize, label, triage, precheck-pr, publish-*, ack-review-request, resolve-pr, review-config, tmux-testing, verify9 of them SKIPPED, 2 pending, and not one of them builds, typechecks, lints, or tests the changed files. A rollup of green review-automation checks is an absence of evidence, not a pass. So rungs 1-2 were run locally instead:

  • npx vitest run src/ui/opentui/56 files / 886 tests pass
  • npx tsc --noEmit -p packages/cli/tsconfig.jsonexit 0
  • 18-mutation matrix across commands-registry.ts, commands-dispatch.ts, slash-gateway.ts, session-rewind-model.ts, dialog-data.ts, folder-trust-gate.tsx15 killed, 3 survived

Environment for every witness above: darwin 25.5, APFS case-insensitive, node ≥22, local worktree. Windows and Linux are unreviewed dimensions — which is the same gap the triage bot's Tested on request is pointing at.

What I verified clean (naming the side I inspected)

  • routeDialogToOpenTui is genuinely exhaustive. All 33 members of OpenDialogActionReturn['dialog'] are covered, with a never check that makes a new kind a compile error. I compared it arm-by-arm against the ink original at ui/hooks/slashCommandProcessor.ts:1190-1313 — the six model-family kinds collapse to {dialog:'model', mode} with the mode ink's boolean flags imply, persistScope is forwarded on all six, the four arena_* modes match, and both await sites correspond.
  • sessionId / name interception matches ink. commands-dispatch.ts:736-744 intercepts resume-with-sessionId and all branch results before routing, exactly as ink does. I checked this because dropping sessionId in the router looked like a contract asymmetry; it is not — the field is consumed upstream.
  • The 69-entry route table matches its source of truth. Against services/BuiltinCommandLoader.ts:112-186: 69/69 canonical names, zero missing, zero extra. All 11 altNames sets match the real command objects, and all four gates (workflows, managed-memory, folder-trust, lsp) sit on exactly the right five entries.
  • commands-registry.test.ts is not a circular fixture. It imports loadInteractiveCommands and compares against real command objects — proven empirically, since dropping 'connect' from the auth aliases is killed.
  • The isUserTextContent export is the right predicate. I specifically checked whether the new consumer needed isRealUserTurn semantics instead. It does not: the two take disjoint types (Content vs HistoryItem) and sit on opposite sides of the same walk. rewindApiCutPoint (session-rewind-model.ts:49) is the API-side half and mirrors computeApiTruncationIndex's API-side logic — same start index, same predicate, same -1 on underflow.
  • setMemoryFileCount rename is correct — matches ui/commands/types.ts:114; setGeminiMdFileCount no longer exists anywhere in the tree.
  • House style: no cross-package relative imports, no any, no non-kebab-case .ts filenames in the new set.

Deferred, recorded rather than threaded

Three further mutation survivors, all low-value, none worth a thread:

  • folder-trust-gate.tsx:117-119 — dropping TRUST_PARENT from the trusted set survives. The test at folder-trust-gate.test.tsx:222-230 selects TRUST_PARENT but asserts only that setValue was called, never the resulting restart state. With that mutation, "trust parent folder" would spuriously relaunch the CLI.
  • dialog-data.ts:629 — swapping ['user','workspace'] to ['workspace','user'] survives. The break makes the order load-bearing for a rule present in both scopes; nothing pins which scope wins.
  • slash-gateway.ts:70?? false?? true survives. The docblock's own "false before the dispatcher attaches" contract has zero coverage; canRunDuringStreaming is never called in slash-gateway.test.ts.

Forward-looking note on rewindApiCutPoint

It has no non-test caller yet, so nothing below is a defect at this commit. But it deliberately omits two guards that ink's computeApiTruncationIndex enforces — the findLastSuccessfulCompressionIndex early return (historyMapping.ts:153-155) and the marker-less auto-compaction fail-loud (historyMapping.ts:176-182, which returns -1 rather than truncating to [prelude, summary, ack] and dropping every real turn). Both live on the UI-history side that rewindApiCutPoint's signature does not receive. Whoever wires this up must supply them, or rewind will target the wrong turn on a compressed session.

Unreviewed dimensions

  • The presentational dialog bodies (dialogs-auth/mcp/settings/arena/permissions/extensions/stats-skills, ~5.5k lines) were read at the routing and contract level only, not line-by-line for render correctness.
  • No rung-3 terminal run: these components are not mounted on any reachable path in this batch, so there is no runtime to exercise.
  • Windows / Linux behaviour — witness is darwin only.
  • Base is feat/tui-live-session-batch, not main; I reviewed the batch-4 delta only.

Cross-checked against the existing qwen-code-ci-bot CHANGES_REQUESTED: it is a PR-template gate (missing Tested on, Risk & Scope, Linked Issues) with no code findings, so there was nothing to confirm or refute on the code side.

Reviewed with AI assistance.

Comment thread packages/cli/src/ui/opentui/commands-dispatch.test.ts Outdated
Comment thread packages/cli/src/ui/opentui/commands-registry.ts Outdated
Comment thread packages/cli/src/ui/opentui/commands-registry.ts Outdated
Comment thread packages/cli/src/ui/opentui/commands-registry.ts Outdated
Comment thread packages/cli/src/ui/opentui/commands-registry.test.ts Outdated
chiga0 added 2 commits August 28, 2026 17:02
…ferred race

The previous test asserted branchNames was populated after dispatch, but a
fire-and-forget void call passed because microtasks drained before the check.
Replace with a Promise.race that proves dispatch was still pending (blocked on
the closed gate) before the gate was resolved — a void call resolves dispatch
immediately, making the race return 'resolved' instead of the sentinel.
@chiga0

chiga0 commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 36 passed · 0 failed · 36 total

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

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

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

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

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

Verification report

PR 10383 Deep Verification — OpenTUI migration batch 4 (dialogs, commands, session-rewind)

Verdict: merge-ready — 36/36 scripted assertions passed (0 fail). Verified head: f35afd87e6a1bdd503cc00319f73ddd608ad1df1 (merge commit 79ff4dae6c, base tip 81f13f4ae4).

中文摘要

结论:merge-ready,36/36 脚本化断言通过,0 失败。

  • A/B 结论:中心主张("全部增量、无 ink 可达路径被触碰、尚无任何模块导入这批代码")经负载性证明成立。用仓库自己的 esbuild 配置分别在 base 与 head 上打包:两侧输入图完全相同(5117 = 5117 个模块,对称差为空);PR 触碰的文件中只有 historyMapping.ts(一行 export 添加)出现在打包图中,33 个新文件在两侧均不可达;dist/cli.js + fzfWorker.js + 461 个 chunk 在归一化每臂固有噪声(提交哈希、路径注释、chunk 哈希引用)后逐字节一致。
  • 门禁:opentui 子集 56 文件 / 887 用例全绿(与 PR 声明完全一致);tsc --noEmit 干净;依赖方向门禁通过,并用 5 个植入违规的合成夹具证明该门禁"活的"(6/6);变异矩阵 3 个变异全部被预期测试以断言不匹配杀死(含 commit 2 强化的 /branch 竞态断言,12/12)。
  • Findings:无(无阻塞、无建议级问题)。
  • 未覆盖:逐提交归属(浅克隆只有 3 个提交,中间提交 3827da7 不在本地);与当前 main 的试合并(本地无 main 引用);新模块在未来批次接线后的运行时行为;逐行 ink 对齐审查(依赖测试+变异证据);仓库级全量测试与 lint。

Central claim and A/B proof

Central claim (from the PR body): "Everything is additive: no reachable ink code path is touched, nothing imports these modules yet, and the default renderer stays ink."

This is falsifiable: the shipped artifact is the esbuild bundle from packages/cli/src/cli.ts, and esbuild's metafile enumerates every input file the entry consumes. If any new module were wired, it would appear in the input graph and change the shipped bytes.

Cell Environment Oracle Result
base (HEAD^1 = 81f13f4ae4, scratch worktree) DEV=true node esbuild.config.js (repo's own config) metafile input graph ∩ PR files exactly {historyMapping.ts}
head (merge 79ff4dae, verified head f35afd87) identical command identical exactly {historyMapping.ts}
graph comparison paths normalized to a common root symmetric difference of inputs onlyHead=[] onlyBase=[], 5117 = 5117
shipped bytes dist/cli.js, dist/fzfWorker.js, 461 chunks byte-compare after N1-N3 noise normalization identical (461/461 chunks paired)

Residual after normalization was zero bytes — even the export addition to isUserTextContent produced no observable bundle change (the symbol was already reachable internally; the export is tree-shaken). The normalization rules are named and bounded: N1 per-arm commit-info strings, N2 arm-geometry path comments/wrapper keys (the base arm resolves shared deps through symlinks), N3 content-hash chunk references cascading from N1/N2. Anything else would have failed the check.

Witness: 01-ab-bundle-reachability-base-vs-head.png (11/11 harness run).

Control purity. node_modules/@qwen-code/qwen-code-core is a symlink into the head tree; this is not a confound because git diff HEAD^1..HEAD -- ':!packages/cli' is empty (core sources identical). package.json/package-lock.json are unchanged by the PR, so the base arm reusing the head tree's dependency directories keeps the dependency closure constant. Base-side census of "nothing imports opentui": zero files outside packages/cli/src/ui/opentui/ reference it (the two ui/model matches are rule-documenting comments; no test file outside opentui imports it either). None of the new files import ink.

Findings

None. No blocking and no suggestion-level issues found. Two verified micro-observations, reported for completeness rather than as findings:

  1. The input-prompt.tsx rename (setGeminiMdFileCountsetMemoryFileCount) is correct and matches all three consumers/declarations (ui/commands/types.ts:114, opentui/commands-context.ts, opentui/slash-dispatch.ts); the surviving setGeminiMdFileCount in packages/core/src/config/config.ts is the unrelated Config-class method. Note the object it lives in is double-cast (as unknown as CommandContext), so field drift there is compile-invisible — the rename fixes a dead-key drift that typecheck could not see. Pre-existing cast, out of this PR's scope.
  2. The dependency-direction gate checks framework-neutrality of packages/core/src and packages/cli/src/ui/model by design; it does not (and does not claim to) police what opentui imports. The census above covers that direction for this batch.

Gates

All scripted; witness 02-targeted-gates-all-green.png.

Gate Result
vitest run src/ui/opentui/ (packages/cli) 56 files / 887 tests, 0 failures, 0 errors, 0 skipped — matches the PR's claim exactly (junit-parsed, twice)
tsc --noEmit in packages/cli clean, exit 0
node scripts/check-tui-dep-direction.mjs at HEAD PASS (1302 core files / 9560 specifiers, 4 ui/model files scanned)
dep-direction gate live-proof (synthetic fixtures) 6/6: clean fixture passes; ink import, relative escape, react-in-core, bare cli import, and vi.mock('@opentui/core') each flip exit 0→1 with the violation named (03-dep-direction-gate-live-proof.png)
scope: diff outside packages/cli empty
working tree after all verification clean

Vacuity / mutation matrix

Three mutants on the central modules; each unmutated control green, each mutant killed by its intended test with a real assertion mismatch (not a collection error), each file restored (git diff --exit-code clean). Witness 04-mutation-matrix-all-killed.png; raw logs mutant-M{1,2,3}.log.

Mutant Production change Killing test Failure observed
M1 commands-dispatch.ts: await this.host.handleBranch(…)void (fire-and-forget) /branch awaits handleBranch AssertionError: expected 'resolved' to be Symbol(pending)
M2 commands-registry.ts: case 'mcp' routes to { dialog: 'hooks' } maps each dialog kind onto its exact OpenTUI target expected { dialog: 'hooks' } to deeply equal { dialog: 'mcp' }
M3 session-rewind-model.ts: cut-point seen === occurrenceoccurrence + 1 rewindApiCutPoint (positional, text-independent) (2 tests) expected 2 to be 0, expected 3 to be 1

M1 directly verifies the second commit's claim: the strengthened deferred-race assertion catches the fire-and-forget regression it was written for. M3 exercises the one new cross-module consumer of the exported isUserTextContent, proving the export wiring under mutation.

Not covered

  • Per-commit verification. Depth-2 checkout: only the merge commit, base tip, and PR head exist locally. The metadata snapshot lists 2 commits but git rev-list HEAD^1..HEAD^2 reaches 1 (intermediate 3827da73 absent — asserted by the gates harness). The aggregate diff was verified; per-commit attribution was not.
  • Trial merge against current main. The base is the stacked branch feat/tui-live-session-batch; no main ref exists in this checkout, so mergeability and main-side drift could not be measured.
  • Runtime behavior of the new modules in a live renderer. They are unreachable by design; evidence of correctness is the test suite plus the mutation matrix, not end-to-end execution. This reproduces the shape coverage (routing tables, state machines), not a wired-renderer scenario.
  • Line-by-line parity with the ink originals (the registry/dispatch/rewind modules are documented as ink-parity ports): relied on the suites + mutants rather than diffing against slashCommandProcessor.ts/RewindSelector by hand.
  • Repo-wide test suite, lint/format gates, and integration tests — not affected by an additive-only, bundle-unreachable batch.

Methodology

Environment: the CI verify container (node:22-bookworm), working tree at refs/pull/10383/merge (depth 2); npm ci + npm run build completed before the round. The A/B drove the repository's own esbuild.config.js verbatim in both arms (DEV=true for the metafile), the base arm in a scratch worktree under tmp/ wired to the root node_modules (per-package dep dirs symlinked; legitimated by the unchanged lockfile assertion), with metafile inputs normalized across the symlink geometry before comparison. The dep-direction gate was live-proven via synthetic repo-root fixtures so neither tree was touched. Mutations were exact-string edits applied, run, and restored by mutation-runner.mjs (each run re-verified git diff --exit-code). All harnesses live in this directory (ab-harness.mjs, gates-harness.mjs, gate-live-harness.mjs, mutation-runner.mjs); raw logs: ab-final.log, gates-run.log, gate-live.log, mutation-run.log, mutant-M*.log, plus junit.xml copies.

Flakiness gate log

rounds=5 files=14 skipped=0
file packages/cli/src/ui/opentui/commands-dispatch.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/commands-dispatch.test.ts
file packages/cli/src/ui/opentui/commands-registry.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/commands-registry.test.ts
file packages/cli/src/ui/opentui/dialog-data.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialog-data.test.ts
file packages/cli/src/ui/opentui/dialogs-auth.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-auth.test.tsx
file packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-extensions.test.tsx
file packages/cli/src/ui/opentui/dialogs-mcp.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-mcp.test.ts
file packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-memory-status.test.ts
file packages/cli/src/ui/opentui/dialogs-misc.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-misc.test.tsx
file packages/cli/src/ui/opentui/dialogs-model.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-model.test.ts
file packages/cli/src/ui/opentui/dialogs-permissions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-permissions.test.ts
file packages/cli/src/ui/opentui/dialogs-settings.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-settings.test.ts
file packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/folder-trust-gate.test.tsx
file packages/cli/src/ui/opentui/session-rewind.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/session-rewind.test.ts
file packages/cli/src/ui/opentui/slash-gateway.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/slash-gateway.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/opentui/commands-dispatch.test.ts: PPPP
  packages/cli/src/ui/opentui/commands-registry.test.ts: PPPP
  packages/cli/src/ui/opentui/dialog-data.test.ts: PPPP
  packages/cli/src/ui/opentui/dialogs-auth.test.tsx: PPPP
  packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: PPPP
  packages/cli/src/ui/opentui/dialogs-mcp.test.ts: PPPP
  packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: PPPP
  packages/cli/src/ui/opentui/dialogs-misc.test.tsx: PPPP
  packages/cli/src/ui/opentui/dialogs-model.test.ts: PPPP
  packages/cli/src/ui/opentui/dialogs-permissions.test.ts: PPP
  packages/cli/src/ui/opentui/dialogs-settings.test.ts: PPP
  packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: PPP
  packages/cli/src/ui/opentui/session-rewind.test.ts: PPP
  packages/cli/src/ui/opentui/slash-gateway.test.ts: PPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/opentui/commands-dispatch.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/commands-registry.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialog-data.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-auth.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-mcp.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-misc.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-model.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-permissions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-settings.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/session-rewind.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/slash-gateway.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/commands-dispatch.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/commands-registry.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialog-data.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-auth.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-mcp.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-misc.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-model.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-permissions.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-settings.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/opentui/session-rewind.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/slash-gateway.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/commands-dispatch.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/commands-registry.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialog-data.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-auth.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-mcp.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-misc.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-model.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-permissions.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/dialogs-settings.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/opentui/session-rewind.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/opentui/slash-gateway.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/opentui/commands-dispatch.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/opentui/commands-registry.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/opentui/dialog-data.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/opentui/dialogs-auth.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/opentui/dialogs-mcp.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/opentui/dialogs-misc.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/opentui/dialogs-model.test.ts: P (exit 0)

Evidence images

01-ab-bundle-reachability-base-vs-head

02-targeted-gates-all-green

03-dep-direction-gate-live-proof

04-mutation-matrix-all-killed

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

Qwen Code · sandboxed verification

chiga0 added 5 commits August 28, 2026 17:13
…larify gate test

Two docblock comments said "67 modules" but the table has 69 entries (verified
against BuiltinCommandLoader.ts). Fixed to 69.

The gated-commands test comment now explains that TypeScript enforces the
CommandGate type at compile time, so the runtime loop is unnecessary — the
literal name list is the intentional guard for a bogus gatedBy on an ungated
command.
- /theme route results include 'message': themeCommand returns a
  MessageActionReturn under NO_COLOR, so the declared results were
  incomplete
- drop the unreachable 'branch' member from OpenTuiDialogRequest and
  make routeDialogToOpenTui throw on dialog-branch instead: /branch is
  a host action intercepted unconditionally by the dispatcher (ink
  parity), and a compile-time exclusion is not expressible because
  OpenDialogActionReturn is a single interface with a union dialog
  field — the loud throw guards against a future refactor dropping the
  interception; the branch route no longer advertises a dialogs entry
  no renderer opens
- derive gate coverage from the loader instead of a hardcoded name
  list: the coverage test loads with every gate ON (plus the
  checkpointing flag the /restore factory needs) and asserts set
  equality between route names and registered built-ins — no escape
  hatches — and a new test proves every gatedBy route is genuinely
  absent from a gates-off load, so a bogus gate on an always-registered
  command fails
chiga0 added 3 commits August 28, 2026 19:18
…ation

All 15 findings from the independent static review verified in source and
fixed (no false positives; none deferred):

- quit effect carries QuitActionReturn.messages projected to text on a
  notice field — ink renders them via QuittingDisplay and the payload was
  permanently lost (Important #1)
- error and finished branches emit retry-countdown-clear like ink's
  handleErrorEvent/handleFinishedEvent, so a terminal event inside the
  countdown window no longer leaves a stale retry row (#2)
- projectContextUsage renders the compaction-threshold ladder and the
  per-item detail sections (tools/memory/skills, ink's sort order) when
  showDetails is on — /context detail transcripts no longer show strictly
  less than the compact view (#3)
- projectMcpStatus honors showSchema (parameter JSON under each tool) and
  showTips, so /mcp schema is distinguishable from /mcp (#4)
- SlashDispatchEnv.settings is required: the real
  CommandContext.services.settings is non-null and a null surfaced as a
  generic command failure on first .merged read (#5)
- dead singleColumn flag removed from the help width layout (clamp makes
  it always false; ink has no single-column mode) (#6)
- truncated SS3 tail (bare ESC O) is stripped like the truncated CSI
  tail, so a captured half F1-F4 no longer leaks 'O' into the composer (#7)
- readBufferRow trims cellColumns alongside text, so URLs ending at
  end-of-row on a wide character hit-test on both halves of the cell (#8)
- kitty probe writes guarded: a synchronous stream throw settles the
  probe (restores raw mode, removes the listener) instead of leaking (#9)
- eraseLines reuses the ansi-escapes helper (already a repo dependency)
  instead of a byte-identical hand-rolled copy (#10)
- truncateText passthrough wrapper dropped; callers use the exported
  truncateHelpText directly (#11)
- SkillsList truncate keeps total length n like ink, so the description
  column no longer shifts by one cell when a name truncates (#12)
- model_fallback names pass through sanitizeDisplayText like ink (#13)
- selectIndex fires onHighlight before onSelect (ink dispatches
  SET_ACTIVE_INDEX then SELECT_CURRENT), keeping highlight-driven
  stay-open dialogs synced on mouse input (#14)
- mcp_app without fallbackText renders empty instead of JSON-dumping the
  embedded HTML; projectAbout hides Base URL when selectedAuthType is
  empty, matching ink's formatBaseUrl (#15)
@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.91% 84.91% 90.54% 84.59%
Core N/A% N/A% N/A% N/A%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.91 |    84.59 |   90.54 |   84.91 |                   
 src               |   86.55 |    82.86 |   88.88 |   86.55 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.43 |    77.73 |   80.76 |   73.43 | ...1354-1358,1485 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   75.57 |     78.1 |   93.85 |   75.57 |                   
  acpAgent.ts      |   74.73 |    77.95 |   93.18 |   74.73 | ...08,13886-13887 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   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.04 |    86.22 |   95.86 |   91.04 |                   
  Session.ts       |   90.39 |    85.17 |    95.3 |   90.39 | ...96,13823-13827 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.65 |    80.81 |   94.01 |   86.65 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.54 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.67 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.45 |    78.26 |   65.62 |   90.45 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.94 |      100 |      50 |   98.94 | 106               
  serve.ts         |   89.06 |    75.72 |     100 |   89.06 | ...27-930,942,953 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.49 |    88.74 |   90.73 |   89.49 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.91 |    96.27 |     100 |   96.91 | ...60-265,323-326 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.72 |    85.81 |   94.33 |   93.72 | ...1305,1312-1313 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.97 |    90.52 |   93.54 |   91.97 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.68 |     97.6 |   94.11 |   94.68 | 269,1334-1372     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.41 |    93.99 |   98.73 |   97.41 | ...6588-6632,6892 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.42 |    90.38 |   94.11 |   94.42 | ...1240,1275-1306 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.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.34 |    94.74 |    98.7 |   97.34 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.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.36 |    89.24 |     100 |   94.36 | ...36,669-670,818 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.46 |    90.53 |   95.64 |   94.46 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.34 |    90.87 |   86.84 |   88.34 | ...2335,2337-2345 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   95.65 |    97.36 |     100 |   95.65 | 137-142           
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.93 |    93.16 |   91.17 |   91.93 | ...1134,1136-1137 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   81.07 |     89.2 |   85.18 |   81.07 | ...02-620,627-635 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.72 |    95.15 |     100 |   99.72 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.53 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |    96.15 |     100 |     100 | 26                
 src/serve         |   87.68 |    85.38 |   91.21 |   87.68 |                   
  ...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.27 |     100 |     100 | 752               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |    98.7 |    91.96 |     100 |    98.7 | ...1593,1595-1596 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |    91.4 |       82 |   95.45 |    91.4 | ...47-556,634-635 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.94 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   85.03 |    82.03 |    78.5 |   85.03 | ...9593,9611-9615 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   47.11 |    63.01 |   76.92 |   47.11 | ...1061,1073-1096 
  ...-keepalive.ts |   94.31 |    88.18 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.63 |    91.52 |   72.38 |   89.63 | ...3304,3335-3336 
  ...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.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |    89.9 |    88.88 |   92.59 |    89.9 | ...03-412,423-426 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...93-594,601-602 
  ...e-remember.ts |   98.31 |    93.29 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.69 |     100 |   89.85 | ...06-207,275-296 
  ...oordinator.ts |   98.27 |    96.87 |     100 |   98.27 | 147-148           
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.91 |    73.04 |   96.29 |   72.91 | ...98-899,906-910 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.67 |    80.24 |   94.53 |   80.67 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |      76 |    76.98 |   93.44 |      76 | ...5819,5876-5882 
  index.ts         |   83.61 |    80.67 |   91.22 |   83.61 | ...2465,2551-2552 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   86.63 |    79.05 |   92.96 |   86.63 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.35 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.53 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    90.09 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.59 |    81.96 |   95.89 |   86.59 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.96 |    95.12 |     100 |   98.96 | 102               
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |   98.49 |    93.56 |     100 |   98.49 | ...99,601,821-822 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.74 |     83.3 |   94.44 |   86.74 | ...7278,7280-7281 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.13 |    80.79 |     100 |   87.13 | ...90-492,495-500 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  user-language.ts |   99.24 |    87.87 |     100 |   99.24 | 167               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.27 |    80.75 |      90 |   83.27 | ...1071,1076,1083 
  ...extensions.ts |   89.92 |     79.5 |   94.36 |   89.92 | ...2588,2633-2634 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   77.16 |    72.02 |     100 |   77.16 | ...42-647,656-663 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...management.ts |   87.22 |    84.17 |     100 |   87.22 | ...1823,1833-1838 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...ce-runtime.ts |     100 |    96.55 |     100 |     100 | 117               
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.66 |    91.59 |   96.22 |   93.66 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   89.67 |    82.69 |     100 |   89.67 | ...1007,1034-1043 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |   95.27 |     87.5 |     100 |   95.27 | 194-200           
  ...on-archive.ts |   92.46 |    90.42 |   97.61 |   92.46 | ...1150,1191-1192 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.88 |     100 |   97.27 | ...1192,1401-1405 
  ...pr-refresh.ts |   99.37 |    97.01 |     100 |   99.37 | 69-70             
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.07 |    97.31 |     100 |   99.07 | ...13,882,961-963 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |      90 |    87.33 |   91.66 |      90 |                   
  index.ts         |   89.65 |    86.98 |   90.47 |   89.65 | ...1393,1407,1421 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.72 |    89.81 |   98.13 |   92.72 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    86.84 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.95 |    93.44 |     100 |   97.95 | 186,193-194       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.77 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |   93.03 |    88.57 |      95 |   93.03 |                   
  scheduler.ts     |   93.03 |    88.57 |      95 |   93.03 | ...70-372,424-428 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.68 |    78.68 |   72.18 |   71.68 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   73.75 |    70.24 |   61.22 |   73.75 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |    75.67 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   79.13 |     57.4 |     100 |   79.13 | ...01,424,431-437 
 src/ui/commands   |   84.71 |     84.5 |   91.66 |   84.71 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.77 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.96 |    74.68 |   83.33 |   73.96 | ...76-609,620-621 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.31 |    81.81 |     100 |   78.31 | 37-52,73,92       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   74.08 |    80.35 |   78.81 |   74.08 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   84.02 |    74.19 |     100 |   84.02 | ...04,410,452-474 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.71 |    87.78 |   86.53 |   90.71 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |    96.07 |   76.92 |   92.35 | ...59-361,364-367 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |   86.34 |    82.18 |    86.6 |   86.34 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    4.07 |      100 |       0 |    4.07 |                   
  ...gerDialog.tsx |    4.07 |      100 |       0 |    4.07 | 78-136,139-667    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   69.22 |    71.81 |   61.11 |   69.22 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.27 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |    86.5 |    84.46 |   88.88 |    86.5 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.86 |     85.1 |   85.18 |   88.86 | ...6262,6264,6369 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |    97.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.64 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.26 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |    72.72 |     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.76 |     79.8 |   76.12 |   63.76 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  ...t-tool-run.ts |   97.26 |     62.5 |   66.66 |   97.26 | 116,130           
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...s-dispatch.ts |   80.59 |    84.02 |   73.07 |   80.59 | ...6-970,993-1004 
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  ...s-registry.ts |    98.8 |    89.36 |     100 |    98.8 | 177-179           
  dialog-data.ts   |   85.29 |    72.08 |   96.29 |   85.29 | ...1248,1252-1282 
  ...ogs-arena.tsx |       0 |      100 |     100 |       0 | 3-818             
  dialogs-auth.tsx |   76.17 |    66.85 |      84 |   76.17 | ...41,957,966-982 
  dialogs-core.ts  |     100 |    94.44 |     100 |     100 | 179,190           
  ...xtensions.tsx |   89.06 |     82.7 |   78.57 |   89.06 | ...33-636,659-661 
  dialogs-mcp.tsx  |   29.85 |    98.71 |      90 |   29.85 | 295,320-872       
  ...ry-status.tsx |   22.58 |       80 |   28.57 |   22.58 | ...11-154,159-175 
  dialogs-misc.tsx |   12.02 |      100 |      20 |   12.02 | ...47-655,658-712 
  ...ogs-model.tsx |   45.95 |    96.77 |   76.92 |   45.95 | ...72-173,243-408 
  ...ogs-modes.tsx |       0 |      100 |     100 |       0 | 3-222             
  ...rmissions.tsx |   18.65 |    89.28 |   83.33 |   18.65 | ...58-159,201-734 
  ...-settings.tsx |   20.25 |    84.61 |    90.9 |   20.25 | ...71,239,254-870 
  ...gs-shared.tsx |   82.86 |    80.28 |   46.15 |   82.86 | ...51,453-456,472 
  ...ts-skills.tsx |     5.8 |      100 |       0 |     5.8 | ...04-381,391-458 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  diff-render.ts   |   97.87 |    95.23 |     100 |   97.87 | 89-90             
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |      91 |    74.54 |   88.88 |      91 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  ...rust-gate.tsx |   98.55 |    96.55 |      75 |   98.55 | 190-191           
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  help-overlay.tsx |       0 |      100 |     100 |       0 | 3-281             
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...prompt-key.ts |     100 |      100 |     100 |     100 |                   
  ...ompt-model.ts |   85.41 |    87.81 |   84.09 |   85.41 | ...1127,1130-1140 
  input-prompt.tsx |   81.95 |    68.01 |      28 |   81.95 | ...1071,1085-1087 
  ...projection.ts |    83.6 |    63.26 |   86.66 |    83.6 | ...1069,1074,1079 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  ...sion-model.ts |   83.77 |       85 |   85.71 |   83.77 | ...40-550,623,679 
  live-session.ts  |   87.37 |    83.17 |   73.68 |   87.37 | ...60,462,479-489 
  markdown-heal.ts |     100 |      100 |     100 |     100 |                   
  ...rogressive.ts |   85.41 |    83.33 |   71.42 |   85.41 | 53,60-62,89-91    
  messages.tsx     |   58.82 |     79.1 |   73.68 |   58.82 | ...93-409,417-474 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  mouse-rows.ts    |     100 |      100 |     100 |     100 |                   
  ...-scrollbar.ts |     100 |      100 |     100 |     100 |                   
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...me-session.ts |   72.34 |    77.77 |   57.14 |   72.34 | 40,44,59-63,76-81 
  ...ompaction.tsx |   76.19 |      100 |   66.66 |   76.19 | 106-130           
  ...wind-model.ts |    94.7 |    87.23 |     100 |    94.7 | 245-252,254       
  ...on-rewind.tsx |       0 |      100 |     100 |       0 | 3-391             
  ...ion-switch.ts |   74.74 |       50 |     100 |   74.74 | ...92-401,411-414 
  ...h-dispatch.ts |   75.24 |     63.1 |      50 |   75.24 | ...73,592-593,636 
  slash-gateway.ts |   96.82 |    89.47 |   81.81 |   96.82 | 70-71             
  sticky-todos.ts  |     100 |      100 |     100 |     100 |                   
  text-batcher.ts  |     100 |      100 |     100 |     100 |                   
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
  ...pt-adapter.ts |   89.56 |       75 |   33.33 |   89.56 | ...50-152,172-173 
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.14 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   88.07 |    86.06 |   96.15 |   88.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.33 |     100 |   98.61 | 189,217-218,424   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.73 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.45 |     100 |     100 | 84                
  mouse-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |      90 |     87.5 |     100 |      90 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.75 |    95.96 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.37 |    89.82 |   96.11 |   92.37 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.31 |    91.36 |     100 |   94.31 | ...34,440,443-447 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.44 |    97.36 |     100 |   99.44 | 121               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
Core full-text-summary.txt not found at: coverage_artifact/core/coverage/full-text-summary.txt

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

wenshao
wenshao previously approved these changes Aug 31, 2026
water-in-stone pushed a commit to water-in-stone/qwen-code that referenced this pull request Sep 1, 2026
* feat(cli): OpenTUI foundation modules — theme, a11y, clipboard, keys, dialogs scaffolding

Foundation batch of the OpenTUI migration tracked in QwenLM#8662. Adds the renderer-neutral foundation modules under ui/opentui: theme family, a11y (plain-text, screen-reader), clipboard, key-map, mouse hit/caret, link-click + osc8 parity, early-input, exit guard/lifecycle, kitty negotiation, event-adapter, item-projection, slash dispatch (+ command parsing), commands context/output, help content, input history, and the dialog scaffolding primitives (core/shared) with the theme dialog. Two helpers land inside ui/opentui rather than utils/ to respect the utils leaf-layer rule (QwenLM#9737). Stacked on the infra batch: consumes ui/model streaming model and @OpenTui deps. No reachable ink code changes beyond a one-line export addition in the shared osc8 module.

* fix(cli): import originals instead of forking slash parser and dialog scope utils

* fix(cli): address R1 review findings in OpenTUI foundation modules

* fix(cli): align OpenTUI command host with the memory-file-count rename

Upstream renamed setGeminiMdFileCount to setMemoryFileCount in the command
UI contract; the rebase onto main surfaced the mismatch at build. Rename
the host interface member, the bridge wiring, the dispatch stub, and the
test mock to match.

* feat(cli): OpenTUI migration live-session and input batch

Third landing batch of the OpenTUI migration (QwenLM#8662): live-session stream
fold and model, message rendering (markdown heal, MCP progressive, client
tool runs, text batching), transcript adapter with resume/session-switch,
sticky todos, the composer (input-prompt view/key/model), mouse rows and
scrollbar, unified-diff rendering, and session-compaction notice. All
additive — no reachable ink code path is touched, ink remains the default.

Carries the first consumer of the remend dependency deferred from the
infra batch, placed in devDependencies per the renderer-deps convention.
The stacked-skill completion helpers import from the relocated
ui/commands module following the upstream rename.

* fix(cli): address R2 review findings in OpenTUI foundation modules

Round-2 review fixes (17 Critical + 10 Suggestion resolved in code):

- dialogs-shared: move number-select flush out of the setState updater
  (StrictMode double-fires onSelect); split setActiveIndex (ink
  SET_ACTIVE_INDEX, lands on any in-range row) from highlightIndex
  (arrow keys skip disabled rows) so wheel navigation never sticks
- event-adapter: chat_compressed notice mirrors ink formatCount ('~'
  prefix for estimated counts); vision_bridge_notice renders
  summary\nnotice; explicit projections for task_execution /
  findings_list / terminal_image keep multi-MB payloads off the
  transcript; retry-countdown-clear forwards isContinuation
- slash-dispatch: isSlashCommandInput drops the '?' branch (ink gate
  routes ? input to the model); executeSlashCommand races the action
  against the abort signal; dialog effects carry the
  OpenDialogActionReturn payload; projected added-item text surfaces
  alongside non-handled effects (notice); message-shaped items project
  to their text; ui.history comes from env; absent sessionStats stamp
  now, not epoch; telemetry parity (recordSkillInvocation /
  recordAutoSkillCommandUsage / makeSlashCommandEvent)
- item-projection: model stats render per-(model,source) sections with
  N/A for unpriced entries; Tool Calls line uses ASCII x like ink;
  redactProxy deduplicated via systemInfoFields export
- theme: palette/syntax colors resolve through color-utils toHex before
  parseColor (ink CSS names / *bright names no longer degrade to
  magenta); unresolvable values stay unset
- key-map: kitty 'kpenter' normalizes to 'return'; resolveCommands
  exposes ink's key fan-out (Ctrl+C fires QUIT + CLEAR_INPUT)
- a11y: hardWrap delegates to wrap-ansi (word-boundary parity with
  ink's screen-reader path); markdown reducer tracks fence length,
  keeps fence-like lines literal inside fences and inner backticks in
  multi-backtick spans; stripAnsi delegates to strip-ansi plus a
  private-parameter CSI pass (SGR mouse, DEC save/restore)
- clipboard: OSC 52 write gated on a TTY (stderr preferred), tests spy
  the stream instead of writing real sequences to the runner's terminal
- exit-guard: independent per-key arm windows like ink
- dialogs-theme: diff preview pane receives syntaxStyle/filetype

* fix(cli): harden kitty probe and screen-reader writer per maintainer review

- kitty-negotiation: KITTY_REPLY_RE requires at least one flag digit
  (\d+), so an echoed bare query \x1b[?u in PTY/CI environments no
  longer resolves true and locks the renderer into kitty mode on a
  terminal that never answers queries; the accumulation buffer keeps
  only a 256-byte tail (bounded memory, bounded rescan under byte
  floods); the settle-window drain is removed — an EventEmitter data
  listener cannot consume chunks from other listeners, so late replies
  flow to the renderer's input parser like any other terminal noise
- a11y-screen-reader: ScreenReaderOutputWriter sanitizes written
  content (stripAnsi + drop bare C0/C1 controls, keep newlines) so the
  plain-text-only contract is enforced at the writer instead of
  trusting every future caller — smuggled OSC 52 clipboard writes or
  title/cursor sequences cannot execute on the main screen

* fix(cli): address ytahdn independent review findings in OpenTUI foundation

All 15 findings from the independent static review verified in source and
fixed (no false positives; none deferred):

- quit effect carries QuitActionReturn.messages projected to text on a
  notice field — ink renders them via QuittingDisplay and the payload was
  permanently lost (Important QwenLM#1)
- error and finished branches emit retry-countdown-clear like ink's
  handleErrorEvent/handleFinishedEvent, so a terminal event inside the
  countdown window no longer leaves a stale retry row (QwenLM#2)
- projectContextUsage renders the compaction-threshold ladder and the
  per-item detail sections (tools/memory/skills, ink's sort order) when
  showDetails is on — /context detail transcripts no longer show strictly
  less than the compact view (QwenLM#3)
- projectMcpStatus honors showSchema (parameter JSON under each tool) and
  showTips, so /mcp schema is distinguishable from /mcp (QwenLM#4)
- SlashDispatchEnv.settings is required: the real
  CommandContext.services.settings is non-null and a null surfaced as a
  generic command failure on first .merged read (QwenLM#5)
- dead singleColumn flag removed from the help width layout (clamp makes
  it always false; ink has no single-column mode) (QwenLM#6)
- truncated SS3 tail (bare ESC O) is stripped like the truncated CSI
  tail, so a captured half F1-F4 no longer leaks 'O' into the composer (QwenLM#7)
- readBufferRow trims cellColumns alongside text, so URLs ending at
  end-of-row on a wide character hit-test on both halves of the cell (QwenLM#8)
- kitty probe writes guarded: a synchronous stream throw settles the
  probe (restores raw mode, removes the listener) instead of leaking (QwenLM#9)
- eraseLines reuses the ansi-escapes helper (already a repo dependency)
  instead of a byte-identical hand-rolled copy (QwenLM#10)
- truncateText passthrough wrapper dropped; callers use the exported
  truncateHelpText directly (QwenLM#11)
- SkillsList truncate keeps total length n like ink, so the description
  column no longer shifts by one cell when a name truncates (QwenLM#12)
- model_fallback names pass through sanitizeDisplayText like ink (QwenLM#13)
- selectIndex fires onHighlight before onSelect (ink dispatches
  SET_ACTIVE_INDEX then SELECT_CURRENT), keeping highlight-driven
  stay-open dialogs synced on mouse input (QwenLM#14)
- mcp_app without fallbackText renders empty instead of JSON-dumping the
  embedded HTML; projectAbout hides Base URL when selectedAuthType is
  empty, matching ink's formatBaseUrl (QwenLM#15)

* fix(cli): address R3 review findings in OpenTUI foundation modules

- executeSlashCommand catch checks the abort signal first: an ESC-
  cancelled command (action rejects AbortError) returns handled with no
  failure telemetry or error message, mirroring ink's processor — the
  race promise never resolves when the signal is already aborted at
  addEventListener time
- submit effect carries the full SubmitPromptActionReturn contract
  (modelOverride, onComplete, refreshContextFilesOnWrite) so the
  backend can honor /model <id> <prompt>, /dream's manual-run record,
  and /remember's context refresh like ink instead of silently
  degrading them
- closing fences cannot carry info text (CommonMark): a ```js line
  inside an open block is literal body, not an early close that drops
  the block and inverts parse state for the rest of the document
- info items append their linkUrl/linkText footer (ink's InfoMessage
  renders it; headless/SSH users need the printed URL, e.g. /bug)
- the screen-reader sanitize keeps TAB: it separates words in
  tool/model output and deleting it fused adjacent tokens

* fix(cli): address R4 review findings in OpenTUI foundation modules

- a11y-plain-text: split on all CommonMark line endings so CRLF
  markdown opens/closes fences correctly; private-param CSI regex
  covers ECMA-48 intermediate bytes; DCS/SOS/PM/APC and unterminated
  OSC sequences consumed before strip-ansi; code-span pattern mirrors
  ink's INLINE_CODE_SPAN_PATTERN (non-empty content, closing-run
  lookbehind)
- dialogs-shared: clearNumberBuffer called from setActiveIndex,
  selectIndex, and resyncKey block so wheel/hover/click/resync can't
  commit a stale numeric-flush selection the user never made
- event-adapter: tool_call_response carries visionBridgeNotice on the
  tool-result event (ink ToolMessage renders the egress disclosure)
- item-projection: projectContextUsage reads memoryFiles as { path,
  tokens } (ContextMemoryDetail), not { name, tokens }
- key-map: 10 kp* keypad-navigation aliases (kpleft→left, …) and
  super flag folded into meta (ink Cmd+Enter = newline, not submit)
- link-click: cellColumns no longer truncated to trimmed text length
  (preserves the wide-glyph right-half boundary); findUrlAtRow end
  boundary is width-aware (stringWidth of the last glyph)
- slash-dispatch: submit effect carries PartListUnion content + a
  textContent string for text-only consumers (image parts survive);
  toggleVimEnabled and startNewSession seams wired from env; abort
  race resolves immediately for an already-aborted signal
- clipboard: OSC 52 self-write removed — copyToClipboard's existing
  fallback (writeOsc52 / wrapForMultiplexer) is the single source
- a11y-screen-reader: appendStatic skips clean === '\n' (ink's
  hasStaticOutput guard)

* fix(cli): address QwenLM#10383 R1 findings in foundation modules

- event-adapter: finished branch emits retry-countdown-clear BEFORE the
  info notice so the countdown row is actually cleared (the fold only
  pops when the last item is the retry row)
- item-projection: /mcp tips now include all 5 lines ink renders (added
  OAuth auth tip and Ctrl+T toggle tip)
- link-click: wide-glyph end boundary uses the last code point (not
  UTF-16 code unit) so non-BMP emoji are measured correctly by
  stringWidth
- a11y-plain-text: CSI_SEQUENCE replaces PRIVATE_PARAM_CSI — drops the
  marker requirement so any CSI (with or without private parameter
  marker, with or without intermediate bytes) is fully consumed

* fix(cli): address QwenLM#10383 R2 Critical findings in slash-dispatch

- abort race: already-aborted signal now skips command.action entirely
  (result = undefined) instead of eagerly evaluating it as a Promise.race
  argument — the action's side effects (clear, persist, addItem) must not
  run on a cancelled submission
- parent command telemetry: logEvent (slash_command SUCCESS) is now
  called before the early return for parent commands with subCommands
  (help listing) and bare handled — matching ink's finally-block logging

* fix(cli): address QwenLM#10368 R2 review findings in live-session batch

- input-prompt: convert OpenTUI display-width cursor coordinates to
  code-point positions at the component boundary — the pinned
  @opentui/core reports logicalCursor.col/offset and el.cursorOffset in
  terminal-cell units (edit-buffer.zig), while the ported ink helpers
  work in code points; wide characters previously shifted placeholder
  backspace, the backslash continuation check, completion targeting,
  and history edge compares
- input-prompt: bump both search sequence refs when Esc dismisses the
  completion dropdown so an in-flight search resolving afterwards cannot
  re-open it and hijack Enter
- live-session-model: carry the vision-bridge egress disclosure through
  the tool-result fold (ink ToolMessage renders it under the result)
- messages: recognize the producers' two-L 'cancelled' summary spelling
  so canceled tools get the CANCELED glyph with strikethrough instead of
  the red ERROR glyph
- session-switch: wrap /resume and /branch in the telemetry swap
  transaction (begin before the outgoing-session capture, commit at the
  UI re-key, abort after a rolled-back swap) — restores the usage
  aggregate on failed swaps and rejects concurrent switches
- tests: display-width fake editor, wide-char placeholder/continuation
  witnesses, Esc invalidation, fold notice, cancelled spelling, and the
  three swap-transaction lifecycle cases

* fix(cli): declare cursorOffset on the FakeEditor test interface

The display-width fake added in 656e996 implements a cursorOffset
getter/setter but the interface it is cast through never declared the
member, so tsc --build fails with TS2339 at the two reads in the
wide-char placeholder test. Typecheck ran before that commit's files
were staged and missed it.

* test(cli): stub listStartingRunIds in the session-switch fake registry

The workflow-run registry gained listStartingRunIds with the workflow
tasks feature on main; backgroundWorkUtils iterates it when describing
blocking work, so the fake registry in session-switch.test.ts now
implements it (empty) to match the interface the merged code expects.

* fix(opentui): address yiliang114 review findings (4 P2 + 1 P3)

- transcript-adapter: FIFO queue for id-less tool call pairing so
  tool-start and tool_result share the same minted id
- session-switch: move uiSwapped=true to right after startNewSession
  (the first irreversible host mutation) preventing core/UI divergence
  on mid-sequence throw; same fix for branch handler
- session-switch: add error item when /resume targets an unloadable
  session instead of returning silently
- diff-render: run diff content through escapeAnsiCtrlCodes matching
  the ink text-boundary convention (useTurnDiffs.ts)
- package.json: move remend from devDependencies to dependencies
  (imported from production source markdown-heal.ts)

* fix(transcript): address R6 review — thinking latch, cancelled status, text join

- Replace one-shot `closed` latch with `thinkingOpen` state so
  [thought, text, thought, ...] patterns emit matching thinking-end
  for each burst (P2)
- Mirror live path: treat cancelled tool status as failed, not ok (P3)
- Join user text parts with newline instead of empty string (P3)
- Regenerate package-lock.json so remend is in dependencies (P2)

* fix(opentui): address review-pr bot R3 critical findings

- session-compaction: add missing COMPRESSION_FAILED_EMPTY_SUMMARY,
  OUTPUT_TRUNCATED, and API_ERROR cases to match ink compression-text.ts
- live-session: distinguish cancelled from error in tool-end summary
  so toolStatusMeta renders strikethrough instead of red X
- transcript-adapter: gate slash_command replay on phase=invocation to
  prevent double-replay (recorder writes both invocation and result)
- input-prompt: add key.meta/key.option to DELETE_WORD_BACKWARD branch
  to match the guard condition that intercepts Alt+Backspace

* fix(opentui): address round-5 review findings R2-5 R3-2 R3-12 R4-1

R2-5: update session-compaction.test.ts to assert the three new
parity texts (EMPTY_SUMMARY, OUTPUT_TRUNCATED, API_ERROR) added in
63a7f3c; the old assertion that EMPTY_SUMMARY returned '' is stale.

R3-2: transcript-adapter replay producer folded cancelled tool status
into summary 'error' (red ✕) instead of 'cancelled' (strikethrough).
Add the cancelled branch to match live-session.ts.

R3-12: hidden slash-command invocations (hiddenInvocation: true for
/auth, /help, /settings, /status, bare /effort, /btw) replayed as
visible user rows and entered composer history. Gate them on the
hiddenInvocation flag in the invocation filter.

R4-1: modelOverride was only carried on the first UserQuery send;
ToolResult continuation sends omitted it, so a per-turn model override
silently reverted to the session default after the first tool batch.
Propagate modelOverride into every continuation send.
Reconcile stack after #10368 merged. Shared live-session modules
(diff-render, input-prompt, live-session, session-compaction,
transcript-adapter) taken from main's finalized #10368 content;
session-switch keeps this branch's R4-4 review fixes.
@chiga0

chiga0 commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ 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: 34 passed · 0 failed · 34 total

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

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

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

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

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

Verification report

PR 10383 Deep Verification — Round 2 (follow-up): OpenTUI migration batch 4 (dialogs, commands, session-rewind)

Verdict: findings — 34/34 scripted assertions passed (0 unexpected failures). One concrete finding worth a reviewer's attention: the uiSwapped commit point in session-switch.ts moved past the UI re-key, opening the split-brain window the ink original explicitly documents and forbids (latent — the modules are provably unwired). Verified head: aa0fdd64f6a4686e866d2fa89817e3146278cb46 (merge commit 399f1a997b, base tip 2b8f73c1e9 = current main).

中文摘要

结论:findings,34/34 脚本化断言全部通过(0 个意外失败)。本轮为跟进轮(上一轮验证的 head 为 f35afd87,现已推进到 aa0fdd64,base 从堆叠分支切换到 main 2b8f73c1,期间新增 R1–R4 评审修复与多次 main 合并)。

  • A/B 结论(在新 base=main 与新 head 上重新测量):中心主张("全部增量、无 ink 可达路径被触碰、尚无任何模块导入这批代码")继续成立。两侧用仓库自己的 esbuild 配置打包:输入图完全相同(5147 = 5147 个模块,对称差为空);PR 文件中仅 historyMapping.ts(一行 export)出现在打包图中且两臂一致;33 个新文件与全部 opentui 模块在两侧均不可达(0 = 0);475 个产物文件在归一化三类已命名的每臂噪声(提交哈希、arm 几何路径前缀、chunk 哈希级联)后逐一相等(104 同名逐字节一致、2 同名归一化一致、369 个改名 chunk 按归一化内容 1:1 精确配对、0 剩余)。
  • 门禁:opentui 子集 56 文件 / 949 用例全绿(跑了两遍,一致;PR 正文写的 887 已过时);tsc --noEmit(cli)干净;依赖方向门禁 PASS 且用 6 个合成夹具证明"活的"(6/6);被 prettier 重排的两个文件(core 测试、vscode 伴侣包)分别以 60/60 用例通过与类型检查通过证明无语义变化。
  • 变异矩阵:M1–M3(上一轮携带)+ M4–M5(针对本轮增量修复)共 5 个变异全部被预期测试以真实断言不匹配杀死;M6(把 uiSwapped 还原到 base/ink 位置)在整套 session-switch 测试下存活——测试套件无法区分两种位置。
  • Findings:1 项主要(session-switch.tsuiSwapped 提交点被移到 UI re-key 之后,打开了 ink 明确记载并禁止的 split-brain 窗口;当前代码未接线,属潜伏问题,附已测量的修复)、1 项卫生级(remend 重复列入 devDependencies 且 lockfile 节点带 dev: true,与生产导入并存;已验证在当前所有安装路径下无实际影响)。另有 4 处 PR 正文描述与当前 head 不符(见 Corrections)。
  • 未覆盖:逐提交归属(浅克隆仅 3 个提交,元数据 53 个);与更新的 main 的试合并(base 即 main tip,merge ref 已无冲突合成);未接线模块在真实渲染器中的运行时行为;5 轮抖动协议(本轮以两遍全子集绿替代);仓库级全量测试与 lint。

Previous-round finding status (follow-up round)

Round 1 (verified head f35afd87, base tip 81f13f4a) shipped merge-ready with no findings and two verified micro-observations. Both re-measured at the new head — never diffed from the old report:

# Round-1 item Severity Status at new head aa0fdd64
1 input-prompt.tsx rename setGeminiMdFileCountsetMemoryFileCount correct; fixes a dead-key drift invisible through the double cast micro-observation superseded — the rename is no longer in the effective diff (lost in the rebase onto main). opentui/input-prompt.tsx:129 retains the old key, byte-identical to base (git show HEAD^1:… | grep -c = 1). The drift remains pre-existing and unobservable: no completion reads either key, and the dispatcher's context supplies the declared key (slash-dispatch.ts:512 setMemoryFileCount: () => {} vs types.ts:114 declaration). See Findings F-note.
2 dep-direction gate does not police what opentui imports; the import census covers that direction micro-observation stands — census re-measured at the new head: zero imports of …/opentui outside packages/cli/src/ui/opentui/ in production and test files; gate re-run PASS (1331 core files / 9857 specifiers) + 6/6 live proof.

Round-1 central measurements re-run at the new head (not carried forward): the bundle A/B (new base = main), the opentui suite (twice), tsc --noEmit, the dep-direction gate + live proof, and mutants M1–M3. The opentui suite count moved 887 → 949 (+62 tests added by the delta's R-fix commits); both full runs green.

Central claim and A/B proof

Central claim (PR body): "Everything is additive: no reachable ink code path is touched, nothing imports these modules yet, and the default renderer stays ink."

Falsifiable exactly as in round 1: the shipped artifact is the esbuild bundle from packages/cli/src/cli.ts, and the metafile enumerates every input the entry consumes. The base changed since round 1 (now main 2b8f73c1, which already contains the foundation and live-session batches), so the claim was re-proven against the new base.

Cell Environment Oracle Result
base (HEAD^1 = 2b8f73c1, scratch worktree, repo's own esbuild.config.js, DEV=true) metafile input graph, canonicalized per-arm 5147 inputs; opentui inputs = 0 witness 01-ab-reachability-graph-base-vs-head.png
head (merge 399f1a99, verified head aa0fdd64) identical command 5147 inputs; opentui inputs = 0 same witness
graph comparison realpath-canonicalized to the repo root symmetric difference onlyHead=[] onlyBase=[]; PR files ∩ graph = exactly {historyMapping.ts} on both arms
shipped bytes 475 files per arm (cli.js, fzfWorker.js, 473 chunks) N1–N3 normalization + name-pairing + content-hash bijection identical: 104 byte-equal, 2 equal after commit-token norm, 369 renamed chunks paired 1:1 on normalized content, 0 residue (02-ab-bytes-normalized-equal.png)

Noise normalization, named and bounded: N1 per-arm GIT_COMMIT_INFO token (399f1a9/2b8f73c); N2 arm-geometry path prefixes in esbuild wrapper comments/keys (the base arm escapes the worktree into the shared root node_modules, printing ../../node_modules/… instead of node_modules/…) plus the absolute wasm-binary: prefix, plus the two byte-identical @opentelemetry/resources@2.10.0 copies whose dedupe-selection swaps with build-dir geometry (copies verified byte-identical, detector file diff clean); N3 content-hash chunk references cascading from N1/N2. The one chunk-grouping divergence (tree-sitter wasm payload living in a same-named chunk on both arms plus a per-arm wrapper chunk) resolved under a merged line-multiset comparison during development and did not survive into the final harness's residue.

Control purity. From inside the base worktree, workspace dependencies resolve through the root node_modules symlinks into the head tree (there is no per-worktree install): e.g. core's modules load from the head tree's packages/core/src. That is a clean control because git diff HEAD^1..HEAD -- packages/core/src is exactly one file — tools/tool-registry.test.ts, a prettier reflow that never enters the bundle — and package.json/package-lock.json changes are limited to the remend devDependency flag (see F2), so the dependency closure is constant. packages/vscode-ide-companion's diff is likewise formatting-only and not a bundle input of cli.js. Base-side census of "nothing imports opentui": zero matches outside packages/cli/src/ui/opentui/ for production and test files.

Corrections (description vs current head)

These are corrections to the PR description, not requests to change code. The branch moved a long way since the body was written (R1–R4 fix rounds, a rebase onto main):

  1. "the diff adds files only under packages/cli/src/ui/opentui/ plus the one-line isUserTextContent export" — no longer true at this head. The diff also modifies session-switch.ts and dialogs-shared.tsx (behavior changes, both opentui; see Findings), adds remend to cli devDependencies (+lockfile), and reformats packages/core/src/tools/tool-registry.test.ts and packages/vscode-ide-companion/src/diff-manager.ts. Both reformats verified semantically inert: token reflows (trailing-comma position / leading union |) with the core test passing 60/60 and the companion package typechecking clean.
  2. "a method-rename fix in input-prompt.tsx (setGeminiMdFileCountsetMemoryFileCount)" — not present in the effective diff; the file retains the old key, identical to base. See the status table, row 1.
  3. "56 test files / 887 tests" — measured 56 files / 949 tests at this head (twice).
  4. "No changes to packages/core" — a core test file is touched (formatting-only; production core untouched).

Findings

F1 — uiSwapped commit point moved past the UI re-key in session-switch.ts, opening the split-brain window ink explicitly forbids (latent until wiring)

The delta moves uiSwapped = true in both handleResumeSession and handleBranchSession from immediately after host.startNewSession(…) (the UI-side session re-key) to after the display-state steps (setSessionName, clearPendingState, clearItems, loadHistory, resetTranscript, plus the recovered-agents notice):

     host.startNewSession(sessionId);
-    uiSwapped = true;
     host.setSessionName(customTitle ?? null);
     ...
     host.resetTranscript(resumeEventsFromSession(sessionData, config));
     ...
+    uiSwapped = true;
     config.getLlmClient()?.commitTelemetrySwap?.();

The ink originals set the flag immediately after the re-key and document why this is load-bearing — useResumeCommand.ts:226-236: "The commit point is the stats-provider re-key itself: from here on a failure must not roll core back OR undo the telemetry replay — the re-keyed display would read the abandoned session's dropped bucket as zeros, and core would be split-brained against the UI key. The remaining steps (name, history items, notice) are display state for a swap that has already committed" — and useBranchCommand.ts:257-277 ("post-commit failures … are non-fatal and surfaced as an error item").

With the flag moved, a throw from any post-re-key step — host.resetTranscript's argument is resumeEventsFromSession, a real sessionToJsonltranscribeSession round-trip over persisted session data — lands in the catch with coreSwapped && !uiSwapped, which rolls core back to the old session and aborts the telemetry swap while the UI stays re-keyed on the new one: exactly the split-brain the ink comment names. handleBranchSession has one sharper consequence: forkCreated && !uiSwapped also deletes the fork session (removeSession(newSessionId)) that the already-re-keyed UI is sitting on.

Evidence (all scripted): a probe harness drives handleResumeSession with a host whose resetTranscript throws after the re-key, against both orderings:

arm probe expects rollback probe expects commit (ink)
head (moved flag) P1 PASS — coreIds [target, old], swapAbort=1, swapCommit=0, UI re-keyed P2: correctly FAILs
base/ink ordering (M6) P3: correctly FAILs P4 PASS — coreIds [target], swapCommit=1

Witness 03-split-brain-probe-matrix.png (5/5 cells incl. tree-restore). Additionally: the full session-switch.test.ts suite is green under the base ordering too (M6 survival, exit 0) — the suite pins neither placement, so this moved silently; the stale in-file comments still assert the old invariant (session-switch.ts:187-188 "The commit point is the UI-side session re-key: from here on a failure must not roll core back…" and the branch-side session-switch.ts:367 "The UI re-key commits the swap"), now contradicting the code; and the file's own header promises "the SAME rollback semantics" as ink.

Bounds: the opentui tree is unreachable from the shipped bundle (A/B above: 0 inputs both arms), so there is zero user-visible impact today; this activates when the renderer is wired in a later batch. If every host display method provably cannot throw the window is theoretical, but the transcribe seam is genuine parsing of on-disk session shapes.

Suggested fix (measured): restore the base/ink placement — uiSwapped = true immediately after host.startNewSession(…) in both functions (and drop or move the now-stale commit-point comments). Measured results, same harnesses: the commit-probe passes under it (P4), the rollback-probe fails under it (P3 — the bad shape disappears), and the entire session-switch suite stays green (M6 run, exit 0). Since the suite pins nothing along this axis, the fix should land with the probe scenario as a regression test (host replay step throws after the re-key ⇒ assert no core rollback, telemetry committed, error item surfaced) — otherwise the next refactor can move the flag back with every test still green.

F2 — remend added as a duplicate devDependency while staying a production import; lockfile node carries dev: true (hygiene, no observable impact)

Base had remend ^1.3.1 in packages/cli dependencies only (it is imported by production code, opentui/markdown-heal.ts:17). The delta adds it to devDependencies as well, and the lockfile node gained "dev": true. Measured: regenerating the lockfile in a scratch worktree with npm 10.9.8 (npm install --package-lock-only) leaves the remend state unchanged (committed == regenerated; the only diffs are unrelated musl-libc/peer metadata churn), so the committed lockfile is not stale — but the combination is misleading: a production import whose node is marked dev: true, plus a redundant duplicate entry. No install path in the repo uses --omit=dev/--production (grep of Dockerfile/Makefile/workflows: none), the module is bundle-unreachable (0 remend inputs in both arms' bundle graphs — consumers are vitest-only), and the published npm package's manifest lists remend in dependencies, so end users are unaffected. Direction: drop the redundant devDependencies entry and regenerate the lockfile so the node loses dev: true.

F-note — buildCompletionContext still supplies the dead setGeminiMdFileCount key (pre-existing, carried on base)

opentui/input-prompt.tsx:129 builds its completion context with setGeminiMdFileCount: () => {} while CommandContext declares setMemoryFileCount (types.ts:114); the double cast (as unknown as CommandContext) hides the drift. Unobservable today — completion functions read services.config only, and the one runtime reader (directoryCommand.tsx:266) runs through the dispatcher's context, which supplies the declared key — but it is precisely the dead-key drift the round-1 rename had fixed and the rebase dropped. Not introduced by this PR's effective diff (byte-identical to base); noted so it is not silently re-lost.

Gates

All scripted; counts are exact.

Gate Result
vitest run src/ui/opentui/ (packages/cli), run twice 56 files / 949 tests, 0 failures, exit 0 both runs (console-summary oracle; PR body's 887 is stale)
tsc --noEmit in packages/cli clean, exit 0
node scripts/check-tui-dep-direction.mjs at HEAD PASS — 1331 core files / 9857 specifiers, 4 ui/model files
dep-direction gate live proof (6 synthetic fixtures) 6/6: clean fixture passes; ink-import, react-in-core, bare-cli-import, relative-escape from ui/model, and vi.mock('@opentui/core') each flip exit 0→1 with the violating file named (05-dep-direction-gate-live-proof.png)
reformatted core test compiles+passes packages/core tool-registry.test.ts: 1 file / 60 tests, 0 failures
reformatted companion file typechecks vscode-ide-companion tsc --noEmit exit 0
mutation matrix M1–M5 5/5 killed with real assertion mismatches, every unmutated control green, every file restored (git diff --exit-code clean) (04-mutation-matrix-5-of-5-killed.png)
M6 (base ordering) suite survival exit 0 — suite pins neither flag placement
working tree after all verification clean

Mutation matrix detail

Mutant Production change Killing test Failure observed
M1 (carried) commands-dispatch.ts: await this.host.handleBranch(…)void /branch awaits handleBranch expected 'resolved' to be Symbol(pending)
M2 (carried) commands-registry.ts: case 'mcp'{ dialog: 'hooks' } maps each dialog kind… expected { dialog: 'hooks' } to deeply equal { dialog: 'mcp' }
M3 (carried) session-rewind-model.ts: cut-point seen === occurrence + 1 rewindApiCutPoint (2 tests) expected 2 to be +0, expected 3 to be 1
M4 (new) dialogs-shared.tsx: delete the items re-sync block (ink INITIALIZE parity) 3 new useDialogSelect items re-sync tests expected 2 to be +0, expected 1 to be +0
M5 (new) slash-dispatch.ts: remove the pre-abort skip (action runs on an aborted signal) strengthened R3-1 (expect(action).not.toHaveBeenCalled()) expected "spy" to not be called at all, but actually been called 1 times
M6 (reverse) session-switch.ts: restore base/ink flag ordering (expected survivor) suite exit 0 — survived, classified: coverage gap along the commit-point axis; the discriminating fixture is the split-brain probe (see F1)

Positive control: M1–M5 each turned their suite red with the intended assertion mismatch; collection-error shapes were screened out by the classifier. M4/M5 additionally prove the two delta fixes (items re-sync; pre-abort skip) are load-bearing — the tests added with them pin exactly the changed behavior.

Not covered

  • Per-commit verification. Depth-2 checkout: only the merge commit, base tip, and PR head exist locally. The metadata snapshot lists 53 commits; git rev-list HEAD^1..HEAD^2 reaches 1 — the known shallow-boundary artifact, so the gap is real, not a small PR. The old round-1 head f35afd87 is not object-reachable either, so the delta since round 1 could not be diffed directly; new probing was steered by the delta commit subjects in the metadata (R1–R4 fixes, the R2 Critical fixes) and by re-verifying the aggregate diff. Per-commit attribution remains out of reach.
  • Trial merge against a newer main. The base IS the main tip (2b8f73c1) and the merge ref composed without conflict, so mergeability into that main is established by construction; drift against a newer main cannot be measured in this checkout.
  • Runtime behavior of the new modules in a live renderer. Unreachable by design (proven above); evidence of correctness is the suite + mutation matrix + probes. This is shape coverage (routing tables, state machines, swap protocols), not a wired-renderer scenario.
  • Line-by-line ink parity beyond the measured seams. The session-switch commit-point seam, the useDialogSelect INITIALIZE seam, and the slash-dispatch abort race were checked against ink directly; the remaining parity surface relies on the suites.
  • Full flakiness protocol. Round 1 ran 5 rounds × 14 files (3 completed, timeout; agreed). This round re-ran the whole 56-file subset twice, both green; the 5-round protocol was not repeated on budget grounds.
  • Repo-wide test suite, lint/format gates, integration tests — unaffected surfaces for an additive-only, bundle-unreachable batch (the two out-of-tree formatting touches verified individually above).

Methodology

Environment: the CI verify container (node:22-bookworm), working tree at refs/pull/10383/merge (depth 2); npm ci + npm run build completed before the round. The A/B drove the repository's own esbuild.config.js verbatim in both arms (DEV=true for the metafile); the base arm ran in a scratch worktree under tmp/ with per-package node_modules directories symlinked from the root tree and per-arm generated files regenerated in-arm (generate-git-commit-info.js, web-templates/build.mjs), legitimated by the unchanged dependency closure and the test-only core diff; metafile inputs were canonicalized via realpath before comparison, and shipped bytes compared under the N1–N3 normalization named above. The dep-direction gate was live-proven via six synthetic repo-root fixtures so neither tree was touched. Mutations were exact-string edits applied by mutation-runner.mjs (single-occurrence asserted, unmutated control green first, file restored and git diff --exit-code re-verified after each run). The split-brain probe (probe-split-brain.mjs) wrote a scratch vitest file into packages/cli/src/ui/opentui/ only while no other vitest run was in flight and deleted it in a finally; all five probe cells were re-captured live. All harnesses live in this directory (ab-compare.mjs, ab-bytes.mjs, gate-live.mjs + gate-fixtures/, mutation-runner.mjs, probe-split-brain.mjs); raw logs: build-base.log, build-head.log, ab-compare.log, ab-bytes.log, gate-suite.log, gate-suite-run2.log, gate-tsc.log, gate-live.log, mutation-run.log, m6-suite.log, probe-split-brain.log.

Flakiness gate log

rounds=5 files=18 skipped=0
file packages/cli/src/ui/opentui/commands-dispatch.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/commands-dispatch.test.ts
file packages/cli/src/ui/opentui/commands-registry.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/commands-registry.test.ts
file packages/cli/src/ui/opentui/dialog-data.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialog-data.test.ts
file packages/cli/src/ui/opentui/dialogs-auth.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-auth.test.tsx
file packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-extensions.test.tsx
file packages/cli/src/ui/opentui/dialogs-mcp.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-mcp.test.ts
file packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-memory-status.test.ts
file packages/cli/src/ui/opentui/dialogs-misc.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-misc.test.tsx
file packages/cli/src/ui/opentui/dialogs-model.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-model.test.ts
file packages/cli/src/ui/opentui/dialogs-permissions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-permissions.test.ts
file packages/cli/src/ui/opentui/dialogs-settings.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-settings.test.ts
file packages/cli/src/ui/opentui/dialogs-shared.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/dialogs-shared.test.tsx
file packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/folder-trust-gate.test.tsx
file packages/cli/src/ui/opentui/session-rewind.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/session-rewind.test.ts
file packages/cli/src/ui/opentui/session-switch.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/session-switch.test.ts
file packages/cli/src/ui/opentui/slash-dispatch.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/slash-dispatch.test.ts
file packages/cli/src/ui/opentui/slash-gateway.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/opentui/slash-gateway.test.ts
file packages/core/src/tools/tool-registry.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/tool-registry.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/opentui/commands-dispatch.test.ts: PP
  packages/cli/src/ui/opentui/commands-registry.test.ts: PP
  packages/cli/src/ui/opentui/dialog-data.test.ts: PP
  packages/cli/src/ui/opentui/dialogs-auth.test.tsx: PP
  packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: PP
  packages/cli/src/ui/opentui/dialogs-mcp.test.ts: P
  packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: P
  packages/cli/src/ui/opentui/dialogs-misc.test.tsx: P
  packages/cli/src/ui/opentui/dialogs-model.test.ts: P
  packages/cli/src/ui/opentui/dialogs-permissions.test.ts: P
  packages/cli/src/ui/opentui/dialogs-settings.test.ts: P
  packages/cli/src/ui/opentui/dialogs-shared.test.tsx: P
  packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: P
  packages/cli/src/ui/opentui/session-rewind.test.ts: P
  packages/cli/src/ui/opentui/session-switch.test.ts: P
  packages/cli/src/ui/opentui/slash-dispatch.test.ts: P
  packages/cli/src/ui/opentui/slash-gateway.test.ts: P
  packages/core/src/tools/tool-registry.test.ts: P

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/opentui/commands-dispatch.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/commands-registry.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialog-data.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-auth.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-mcp.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-memory-status.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-misc.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-model.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-permissions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-settings.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/dialogs-shared.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/folder-trust-gate.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/opentui/session-rewind.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/session-switch.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/slash-dispatch.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/opentui/slash-gateway.test.ts: P (exit 0)
round 1 · packages/core/src/tools/tool-registry.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/commands-dispatch.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/commands-registry.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialog-data.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-auth.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/opentui/dialogs-extensions.test.tsx: P (exit 0)

Evidence images

01-ab-reachability-graph-base-vs-head

02-ab-bytes-normalized-equal

03-split-brain-probe-matrix

04-mutation-matrix-5-of-5-killed

05-dep-direction-gate-live-proof

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed at head aa0fdd64.

  • Prior review rounds are dismissed and 78/78 threads are resolved; the batch is dominated by new, not-yet-wired OpenTUI modules (dialogs, commands dispatcher, gateway, trust gate, session-rewind), so the merge-time blast radius on the live renderers is minimal.
  • Checked the few edits that do touch shared code: dialogs-shared cursor key-follow resync is an ink-parity fix for shrinking lists and is covered by new tests; historyMapping only widens an export; session-switch keeps the telemetry transaction committed on the not-found path (test-pinned).
  • The folder-trust gate is a faithful port of the ink flow (decision persisted via trustedFolders, restart on flip, write failure aborts silently to stderr rather than half-applying).
  • No new Critical issues found. Code CI on this head has no failures so far (review-pr/Test still running).

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Independent pass at aa0fdd6. Local verification: opentui subset 56 files / 949 tests all green, packages/cli tsc clean. Security dimension is clean — folder-trust-gate keys trust correctly and Esc fails safe, dialogs-permissions matches ink parity, and no untrusted content reaches command dispatch. Three correctness findings inline, all in the new batch-4 modules; they're edge cases the suite doesn't cover yet, so worth addressing before this batch wires into a reachable path. Not approving this round; happy to re-check once they land.

Comment thread packages/cli/src/ui/opentui/session-rewind.tsx
Comment thread packages/cli/src/ui/opentui/session-rewind.tsx
Comment thread packages/cli/src/ui/opentui/commands-dispatch.ts Outdated
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the clean retarget onto main after #10368 landed.

Template: complete ✓ — all required sections are present, so the earlier template-gate request is resolved. (Minor: the Chinese block is a condensed summary rather than the per-section translation the template asks for; not worth another round-trip.)

Problem: this is batch 4 of the planned OpenTUI migration, so the "problem" is the agreed plan itself, not a bug claim: tracking issue #8662 is open, the migration design doc is on main, and batches 1–3 (#10134, #10146, #10368) are merged. No reproduction is expected for a batch like this. Its verifiable claims are structural — additive-only, unreachable from the running CLI — and those were substantiated on the pre-retarget head by the sandboxed /verify run (36/36 assertions, including an A/B bundle-graph identity proof) and by @wenshao's real-renderer verification.

Direction: aligned — the migration is maintainer-directed and lands batch by batch so each unit stays reviewable, exactly as this one does.

Size: ~10,950 production lines vs ~5,930 test lines vs 3 manifest/lockfile lines. That is far past the 1,000-line advisory threshold; normally I'd suggest splitting, but the #8662 batch plan deliberately defines these units, so this is advisory only. Core-path exposure: one test file (packages/core/src/tools/tool-registry.test.ts, formatting-only rewrap — 0 production core lines). The cross-package footprint (vscode-ide-companion, root lockfile) is taken up under Approach.

Approach: the shape is right — 33 new files in the isolated src/ui/opentui/ namespace, one added export in historyMapping.ts to reuse an existing predicate instead of duplicating it, registry → dispatcher → gateway layering, and no ink path touched. However, the retarget onto main carried in a few hunks the body doesn't account for: a duplicate remend devDependency plus its lockfile entry (my one substantive finding — detailed in the review comment), two Prettier rewraps (tool-registry.test.ts, diff-manager.ts, semantically identical to main, verified), and stale claims (the suite has grown past the stated 887 tests; the input-prompt.tsx rename is already on main and no longer part of this diff).

Risk: no high-risk path matches; no elevated risk signals beyond the items above.

Moving on to code review. 🔍

中文说明

感谢在 #10368 合入后干净地重新基于 main。

模板:完整 ✓——所有必需小节齐全,此前的模板门禁请求已解决。(小问题:中文块是浓缩摘要而非模板要求的逐段翻译,不值得再走一轮。)

问题:这是 OpenTUI 迁移计划的第 4 批,"问题"即已达成共识的计划本身,而非 bug 声明:跟踪 issue #8662 开启中,迁移设计文档已在 main 上,第 1–3 批(#10134#10146#10368)已合入。这类批次不需要复现。其可验证的声明是结构性的——纯增量、运行中的 CLI 不可达——这些已在 retarget 之前的 head 上由沙箱 /verify(36/36 断言,含 A/B 打包图同一性证明)和 @wenshao 的真实渲染器验证所证实。

方向:对齐——迁移由维护者主导,按批落地以保证每个单元可独立评审,本批正是如此。

规模:生产代码约 10,950 行、测试约 5,930 行、清单/锁文件 3 行。远超 1,000 行建议阈值;通常应建议拆分,但 #8662 的批次计划刻意定义了这些单元,故仅作提示。核心路径暴露:仅一个测试文件(packages/core/src/tools/tool-registry.test.ts,纯格式化重排——生产核心行数为 0)。跨包足迹(vscode-ide-companion、根锁文件)在"方案"部分讨论。

方案:形态正确——33 个新文件位于隔离的 src/ui/opentui/ 命名空间,historyMapping.ts 只新增一个 export 以复用现有谓词而非复制,注册表 → 分发器 → 网关的分层,未触碰 ink 路径。但 retarget 到 main 时带入了几处正文未说明的改动:重复的 remend devDependency 及其锁文件条目(我唯一的实质发现——详见评审评论)、两处 Prettier 重排(tool-registry.test.tsdiff-manager.ts,已验证与 main 语义一致)、以及过时的声明(测试套件已超过所述的 887 例;input-prompt.tsx 改名已在 main 上,不再是本 diff 的一部分)。

风险:无高风险路径命中;除上述事项外无升级风险信号。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

Independent baseline first: for a dialogs + command-routing batch stacked on the live-session batch, I'd want exactly what this PR does — new files only in an isolated namespace, one exported predicate reused instead of duplicated (isUserTextContent), a registry → dispatcher → gateway layering, and zero ink changes. The diff matches that shape.

One item needs a fix before merge — the remend manifest state introduced by the retarget:

  • packages/cli/package.json gains "remend": "^1.3.1" in devDependencies (line 129) while main — and this head — already declares it in dependencies (line 87), where it landed together with its consumer: src/ui/opentui/markdown-heal.ts imports it from production code. Post-merge, remend would be declared twice.
  • The package-lock.json hunks mark the node_modules/remend entry "dev": true — the state npm writes when remend is dev-only, contradicting the production declaration. npm ci tolerates it, but a fresh npm install rewrites it (dirtying the tree), and it mislabels a production dependency on a migration whose prod-vs-dev classification is tracked in the design doc ("lands with the first batch that carries its consumer" — it did, as a dependency).
  • Nothing in this batch imports remend, so the devDependency entry is gratuitous here.
  • Mechanical fix: drop the devDependencies line and the two lockfile hunks, then regenerate the lockfile.

Non-blocking:

  • The Prettier rewraps in packages/core/src/tools/tool-registry.test.ts and packages/vscode-ide-companion/src/diff-manager.ts are semantically identical to main (verified token-for-token) — pure formatting churn outside the stated "CLI package only" scope. Either name them in the body or drop them.
  • Body staleness: the opentui suite is ~932 tests now, not 887 (887 matched the pre-R3/R4 head); the "only changes outside src/ui/opentui/" list should mention the manifest/format hunks above, and the input-prompt.tsx rename entry is already on main and gone from this diff.
  • The known carry-forwards from @wenshao's real-renderer run — F1 (help overlay overflows below 74 columns), F3 (skills dialog column layout), F4 (approval-mode scope picker dropped; confirmed still present on this head — dialogs-modes.tsx:136 hard-codes SettingScope.User), and F2 (the ~2,162 zero-test lines across five modules) — remain agreed as fix-before-the-activation-batch. Carrying them is fine; they need to be honored.

Everything else holds up. The review-fix delta since the last verification passes is careful and tested: the session-switch unarmed-transaction settlement on missing sessions, the useDialogSelect items re-sync / numeric-flush disarm (ink INITIALIZE parity), and the slash-dispatch pre-aborted-signal skip each land with a regression test. Spot-checked imports on the largest new modules (commands-dispatch.ts, dialogs-arena.tsx, dialogs-modes.tsx): no ink imports — core package, @opentui/react, and opentui siblings only. Prior evidence, on earlier heads: sandboxed /verify 36/36 (A/B bundle-graph identity: 5,117 modules both sides, empty symmetric difference) at f35afd87; maintainer real-renderer run — 33 scenarios, zero crashes, 15/15 mutants killed on tested logic — at eb63b2b3.

sequenceDiagram
    participant P1 as User input
    participant P2 as OpenTuiSlashGateway
    participant P3 as OpenTuiSlashDispatcher
    participant P4 as commands registry
    participant P5 as routeDialogToOpenTui
    participant P6 as Dialog component
    P1->>P2: raw slash input
    P2->>P2: stacked-skills parse, extension resolution
    P2->>P3: parsed command
    P3->>P4: look up command
    P4-->>P3: entry with result kinds
    P3->>P5: ink dialog-switch enum
    P5-->>P6: typed OpenTUI dialog request
    P6-->>P1: rendered dialog
Loading

Testing

This is a CI-path run — no PR code was built or executed here. The evidence below is the PR's own CI on the reviewed head, plus the two isolated verification runs cited above (both on pre-retarget heads). Nothing in this batch is user-visible yet — no caller imports it — so there is no terminal behavior to drive even on a local run: N/A.

Check Conclusion
Test (ubuntu-latest, Node 22.x) ⏳ in progress
Integration Tests (no-AK, No Sandbox) ⏳ in progress
Real daemon E2E / Java 11 ⏳ in progress
SDK Java (macOS · ubuntu Java 11/17/21 · windows) ✅ success
Desktop Shell (ubuntu-22.04 · windows-2022) ✅ success
Dependency CVE audit ✅ success
Secret scan (TruffleHog) ✅ success
Security Checks ✅ success
Test (macos-latest / windows-latest, Node 22.x) ⏭️ skipped — by design: these jobs run on merge_group/schedule, not pull_request

The main unit suite was still in flight at review time; the finalize pass updates the table once CI settles. The earlier "Browser daemon SDK bundle" red was a main-branch regression fixed by #10602, and this head merges main after that fix.

Sandboxed verification would settle the one open evidentiary gap: a fresh @qwen-code /verify on the retargeted head — the 36/36 A/B run above attests f35afd87, and while the retarget only merged main (which contains no importer of these modules), a new run would make "additive and unreachable" a statement about aa0fdd64 instead of an inference from it.

中文说明

代码审查:独立基线与 PR 方案一致——新文件全部位于隔离命名空间,复用一个已导出的谓词而非复制,注册表→分发器→网关分层,零 ink 改动。

合入前需修一项——retarget 引入的 remend 清单状态packages/cli/package.json 在 devDependencies 又加了一次 remend(第 129 行),而 main(及本 head)的 dependencies(第 87 行)早已声明它——它随消费者 markdown-heal.ts(生产代码 import)一起落地。合入后 remend 将被重复声明。锁文件两处改动还把 node_modules/remend 标成 "dev": true——这是 remend 仅为 dev 依赖时 npm 才会写入的状态,与生产声明矛盾:npm ci 能容忍,但一次 npm install 就会改写它(弄脏工作树),而且在一份把 prod/dev 分类写进设计文档的迁移里给生产依赖打上错误标签。本批没有任何文件 import remend,该 devDependency 条目纯属多余。机械修复:删掉 devDependencies 行与两处锁文件改动,重新生成锁文件。

非阻塞tool-registry.test.tsdiff-manager.ts 的 Prettier 重排与 main 语义完全一致(逐 token 验证),但属于所述"仅 CLI 包"范围之外的格式化扰动——要么在正文中说明,要么去掉。正文数字过时:套件现约 932 例而非 887;"src/ui/opentui/ 之外的改动"清单应提及上述清单/格式化改动,且 input-prompt.tsx 改名已在 main、不再属于本 diff。@wenshao 真实渲染器验证的已知遗留(F1 帮助覆盖层 <74 列溢出、F3 技能对话框列布局、F4 审批模式 scope 选择器——本 head 确认仍在,dialogs-modes.tsx:136 写死 SettingScope.User、F2 约 2,162 行零测试)维持"激活批之前修复"的共识即可,但需要兑现。

其余站得住:自上一轮验证以来的评审修复增量谨慎且有测试——session-switch 未武装事务在会话缺失时的结算、useDialogSelect 条目重同步/数字快刷解除(ink INITIALIZE 对齐)、slash 预中止信号跳过,均带回归测试。抽查最大新模块的 import:无 ink。早期证据(较早 head):沙箱 /verify 36/36(A/B 打包图同一性:两侧 5,117 模块、对称差为空)于 f35afd87;维护者真实渲染器 33 场景零崩溃、有测试逻辑 15/15 变异全杀于 eb63b2b3

测试:本次为 CI 路径——未构建、未执行任何 PR 代码。上表为被审 head 上 PR 自己的 CI;主单元测试套件评审时仍在运行,收尾工作流会在 CI 落定后更新表格。此前 "Browser daemon SDK bundle" 红是 main 回归,已由 #10602 修复,本 head 已合入该修复。本批尚无任何调用方,无用户可见行为,真实场景终端证据不适用(N/A)。补一句:对 retarget 后的 head 重新跑一次 @qwen-code /verify,可把"纯增量且不可达"从对 f35afd87 的外推变成对 aa0fdd64 的直接证明。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 2/5 — the batch itself is among the best-verified PRs this stack has seen (sandboxed A/B, real-renderer harness, mutation matrix, four review rounds), but the retarget introduced one objective defect — the duplicate remend classification — and that is a five-minute fix worth requesting instead of merging it in on the hope someone cleans it up later.

Stepping back: the implementation matches my independent proposal almost exactly, the additive-and-unreachable claim survived an A/B bundle proof and a real-renderer run, and the R3/R4 delta since those verifications is careful, tested work. I looked hard for a reason to approve as-is — the retarget was "just merges of main," after all — and the manifest state is the one place the premise "everything is additive, nothing outside the batch changes" does not hold: this diff, and not main, adds the duplicate devDependency and the "dev": true lock entry for a production-imported package. It cannot regress a user today, but it is exactly the kind of quiet rot a migration built on byte-identical bundle proofs should not ship.

So: request changes, narrowly. @chiga0 — drop the remend devDependencies line and the two lockfile hunks, regenerate the lockfile, and re-trigger; optionally name (or drop) the two formatting-only hunks and refresh the test count in the body while you're at it. Everything else stands as agreed with @wenshao: land the batch, then fix F1/F3/F4 and the F2 coverage gap before the renderer-activation batch makes those modules reachable.

(Note: the earlier template-gate request-changes from the first triage run is resolved by the updated PR body. The standing request-changes gate on this PR is left in place — re-runs update comments, not reviews — and the single open item is the remend manifest fix described above.)

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

…istory

- session-rewind: add useRef re-entrancy guard to prevent double onRewind
  from batched key events in single stdin chunk
- session-rewind: dispatch restore-error on onRewind rejection so the
  dialog recovers from dead 'restoring' phase back to 'pick'
- commands-dispatch: pass Date.now()-based timestamps to addItem instead
  of array indices in load_history branch

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-reviewed at head e3ab6017 (my earlier approval on aa0fdd64 was auto-dismissed by the push).

  • The net increment since that head is three files, all in the not-yet-wired OpenTUI modules, and all clear improvements from the latest review round: the command dispatcher's history replay no longer collides with existing item ids (now + index), and the rewind selector gains a restore-error transition plus a re-entry guard so a failed restore returns the user to the picker instead of swallowing the error or double-firing.
  • 81/81 review threads are resolved; no open findings.
  • No new Critical issues in the increment or the surrounding code. CI on this head is still settling (Test and review-pr running, no failures so far); per the channel convention the call is on the review itself.

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

The three P2 findings from my earlier review are all addressed in e3ab601:

  1. startRestore now dispatches restore-error on onRewind rejection and the reducer returns the dialog from the dead 'restoring' phase back to 'pick' with clean selection state.
  2. A useRef re-entrancy guard prevents a double onRewind from batched key events in a single stdin chunk.
  3. load_history passes Date.now() + index timestamps to addItem instead of array indices.

Verified locally on the new head: session-rewind + commands-dispatch tests 79/79 pass. The rest of the batch was reviewed earlier with no other blocking findings.

@chiga0
chiga0 added this pull request to the merge queue Sep 1, 2026
Merged via the queue into main with commit 8096ece Sep 1, 2026
170 of 186 checks passed

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

Round 4 — cross-check + minor finding

Scope: packages/cli/src/ui/opentui/ new files (dialogs, commands-dispatch, commands-registry, slash-gateway, session-rewind-model); plus side-effect changes outside opentui (historyMapping.ts export, tool-registry.test.ts reformat, diff-manager.ts reformat, package.json devDep). Not reviewed: design doc under docs/design/.

CI (disclosure):

  • Test (ubuntu-latest, Node 22.x)pending at review time.
  • Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x)SKIPPED (fork authorization gate). PR claims macOS arm64 Node v24 vitest green; CI has not verified it.
  • Integration Tests (CLI, No Sandbox)SKIPPED.
  • Integration Tests (no-AK, No Sandbox)PASS.
  • Desktop Shell (ubuntu + windows) — PASS.

Cross-check against prior rounds:
All critical findings from R1 and R2 rounds verified at current head:

  • R1-1 (MCP dialog indexes raw servers) — FIXED: flatServers now derived from groupedServers.flatMap().
  • R1-2 (editor dialog scope highlight) — FIXED: applyScope() and highlightScope() both call setScope(item.value).
  • R1-3 (settings dialog missing excludeWorkspaceRestricted) — FIXED: excludeWorkspaceRestricted: selectedScope === SettingScope.Workspace on line 323.
  • R1-4 (retry-countdown-clear drops isContinuation) — FIXED: test event-adapter.test.ts:357 ("forwards isContinuation on the countdown clear") verifies the emitter.
  • R1-6 (stats dialog reads process-global telemetry) — FIXED: uiTelemetryService.getMetricsForSession(sessionId) when session ID available.
  • R1-12 (MODE_DESC uses auto_edit key vs auto-edit enum) — FIXED: MODE_DESC now keyed "auto-edit".
  • R2-1 (buildModelEntries for image mode gates on imageOnly only) — FIXED: now uses isImageGenerationCapable(model).
  • session-rewind restore-error / double-invoke / load_history timestamp — confirmed FIXED (verified 2026-09-01 earlier today).

Minor finding — trivially actionable:
See inline comment on commands-dispatch.ts:398.

No blocking findings. The PR is the author's own, so APPROVE is not available here — reporting clean via COMMENT instead.

Checked: routeDialogToOpenTui switch exhaustiveness (compile-time never guard, clean); historyMapping.ts export additivity (pure additive, no behavior change); rewindApiCutPoint positional logic (correct); OpenTuiSlashGateway concurrency guard (correct). Ran: CI rung 0 checked above. Execution rungs 1-3 not run (working tree not available; PR code not yet wired to any execution path).

Reviewed with AI assistance.

Comment thread packages/cli/src/ui/opentui/commands-dispatch.ts
@chiga0

chiga0 commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

已确认 wenshao 的 maintainer verification 报告中的 7 项 findings。计划按建议执行:本批先行合入(当前代码不可达、无用户影响),F1(HelpOverlay 74col 溢出)/F3(SkillsDialog 列布局)/F4(ApprovalModeDialog scope picker)在后续 batch 6/7 激活前修复,F2 测试覆盖同步补充。F5/F6/F7 作为迁移计划上下文记录。感谢详细的 real-renderer 验证和 mutation matrix!

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

R5 review — 1 blocker + 3 execution-witnessed test holes

Note: this PR was merged (07:41Z) while this review was in flight, and the blocker below is now on main via 8096ece889. Posting here for the record on this diff; tracking should move to a follow-up.

Scope of this pass. Executed on linux / node v24.20.0 / vitest 3.2.7 against e3ab6017: full src/ui/opentui/ suite (56 files / 949 tests, green after installing remend), plus A/B probes and a 6-mutation matrix on session-switch.ts, dialogs-shared.tsx, commands-registry.ts. Four parallel read-lenses covered commands-registry/slash-gateway, session-rewind-*, dialogs-{auth,permissions,mcp,extensions}, dialog-data/commands-dispatch, each against its ink counterpart as oracle.

Not verified, stated so it isn't mistaken for a pass:

  • CI: Test (ubuntu-latest, Node 22.x) was still in_progress at review time; Test (macos), Test (windows), Integration Tests (CLI), build-cli all SKIPPED. No completed full-test check exists for this head. My green run is linux/node24 only — no Windows/macOS evidence on either side.
  • Root tsc --noEmit OOM'd in my environment (node heap limit), so "typecheck clean" is not something I confirmed.
  • dialog-data.ts / commands-dispatch.ts internals and the settings/arena/misc/model/modes/stats renderers are read-lens only, not executed.

Cross-check against R1–R4

Every R5 finding below is new: no prior comment touches the uiSwapped commit point, the two surviving mutants in the R4 useDialogSelect re-sync, the route-table truthiness assertion, /goal's submit_prompt, or rewindApiCutPoint's missing guards.

Confirmed already filed (not re-reported here, just verified still standing at head): MCP AUTHENTICATE step unreachable = R2-24 · extensions async rejections swallowed = R1-5 · "Tab to complete" not implemented = R2-31 · /restore missing gate = R2-12 · Shell ignores onClose = R2-27.

Verified and correctly dropped as non-issues: removing the Session … could not be loaded. line matches ink (useResumeCommand.ts:161-167 returns silently) · the remend devDependency + lock "dev": true state is pre-existing on origin/main, not authored by this PR.

Deferred to the body as one-liners (round ≥5 posting floor — no new threads)

  • dialogs-auth.tsx:801-830 drops ink's isAuthenticating latch (useAuth.ts:96-101): Enter repeat fires N concurrent applyProviderInstallPlan read-modify-writes on settings.json.
  • dialogs-auth.tsx:771-781 the !props.config early return registers no key handler, so its own "esc to close" is false (only exit is quit). Consequence of R2-27, not previously enumerated.
  • dialog-data.ts:513-517 settings.setValue after a committed config.switchModel is unwrapped, so it rejects and loses ink's distinct "switched, but could not save" signal (ModelDialog.tsx:1026-1050); no re-entrancy latch on applyModelSelection either.
  • commands-dispatch.ts:281,301 no mountedRef guard post-dispose() (slashCommandProcessor.ts:319-321), so a late host.addItem inside a catch can surface as an unhandled rejection.
  • session-rewind.tsx:71-75 turnCount is fixed at mount by useReducer's initialArg and no action updates it, while userTurns recomputes every render — restore-error returns to pick with stale bounds. Latent until a caller exists.
  • slash-gateway.ts:56-60 attach() never clears initError.

Reviewed with AI assistance.

Date.now(),
);
}
uiSwapped = true;

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.

[R5-1 · Critical] Moving uiSwapped = true past the display steps reopens the rollback window this batch had closed, and on /branch it deletes the session it just created.

witness: executed — A/B on the same probe, only the flag placement differing.

The commit point is still documented as the re-key — :187-188 says "The commit point is the UI-side session re-key: from here on a failure must not roll core back OR undo the telemetry replay", and commit 656e996c9a that moved it says "commit at the UI re-key". The code now commits only after setSessionName / clearPendingState / clearItems / loadHistory / resetTranscript. ink sets it one line after startNewSession() and names the reason (hooks/useResumeCommand.ts:230-236): rolling core back after the re-key leaves "UI on the resumed session but recorder writing into the old JSONL (split-brain)".

Trigger: any display step throws after host.startNewSession()host is caller-supplied, so this is live the moment the batch is wired.

  • /resume: UI shows the new session, core rolls back to old-session, telemetry swap is aborted. The transcript on screen is the new session's; the user's next message is recorded into the abandoned session.
  • /branch (same move at :365): worse, because :407 if (forkCreated && !uiSwapped) then calls sessionService.removeSession(newSessionId) — the branch the UI is currently displaying is deleted from disk, while core returns to the original.

Probe results (linux, node v24.20.0, vitest 3.2.7):

probe at head with uiSwapped back at the re-key
/resume, loadHistory throws FAIL expected 'old-session' to be 'new-sess' PASS
/branch, loadHistory throws FAIL expected 'old-session' to be '48b3d1fa-9016-…' PASS
/branch, fork deletion FAIL removeSession was called with the UI-keyed branch id PASS

And nothing pins it either way: with the flag restored, the whole directory is still green — 58 files / 951 tests pass under both placements. The R4-4 test added here covers the swap-slot settlement, not the commit point; the only failure seam in the harness is failClientInitialize, which fires before the re-key and therefore cannot see this window.

Suggested fix: move both assignments back to immediately after host.startNewSession(...) (before the display steps), and add a test whose display step throws after the re-key asserting core is not rolled back and removeSession is not called — that test fails at head and passes after the fix.

if (followed !== activeIndex) {
const next =
followed >= 0
? followed

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.

[R5-2 · Major] Two mutants of this new re-sync survive the suite, including the one the follows the active item by key test is named for.

witness: executed — mutation matrix, both mutants leave dialogs-shared.test.tsx at 10/10 green.

  1. Key-following can be deleted outright. Replace the ternary with const next = computeInitialActiveIndex(initialIndex, items); — i.e. never follow the key, always reset — and all 10 tests pass. The reason is that initialIndex defaults to 0 (:164), and in the reorder test the key-follow also yields 0, so follows the active item by key when the list is reordered cannot distinguish the two branches it claims to separate. To kill it, a fixture needs the surviving key to land at a non-initial index.
  2. :207 itemsRef.current = items; in the resyncKey branch is untested. Delete it and the suite stays green — even though its comment states the exact hazard it prevents ("the key-follow below must not override it with the previous view's key"). That is the R1-10 / R2-18 stranded-cursor path: on a view swap the hook gets a new resyncKey and a fresh items identity in the same render, so without this line the key-follow runs against the previous view's array. It is load-bearing, not dead — consumers pass non-memoized arrays (dialogs-permissions.tsx:235,244,289, dialogs-settings.tsx:425, dialogs-theme.tsx:166), so both changes co-occur.

The re-sync block as a whole is not vacuous — deleting it entirely (if (false && …)) fails 2 tests. It is specifically the branch selection and the view-swap interaction that are unpinned.

dialog,
} as OpenDialogActionReturn);
expect(request).toBeTruthy();
expect(request.dialog).toBeTruthy();

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.

[R5-3 · Major] This assertion pins the 33-member route table only by truthiness, so any wrong-but-present dialog target survives.

witness: executed. Mutating commands-registry.ts case 'subagent_list': return { dialog: 'subagent_create' }; — i.e. /agents list opens the create dialog — leaves commands-registry.test.ts at 15/15 green. The test title advertises "routes every dialog kind" parity with the ink switch, but nothing asserts the routed kind equals the input kind.

One line closes it: expect(request.dialog).toBe(dialog) inside the loop (the arena modes are the known exception — they map onto one dialog with a mode, so those cases need the mode asserted instead).

{ name: 'forget', results: ['message'], gatedBy: 'managed-memory' },
{
name: 'goal',
results: ['goal_control', 'message', 'submit_prompt'],

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.

[R5-4 · Minor] /goal declares submit_prompt, which goalCommand cannot return.

witness: read-verified at head, not executed. The only return sites in ui/commands/goalCommand.ts are :74 { type: 'message', messageType: 'error', … } and :83 type: 'goal_control'; the substring submit does not occur in that file. The table's header states it was "checked against the ORIGINAL sources", so this row is the claim being wrong rather than a runtime hazard — nothing consumes results yet.

Worth fixing while the table is still the only audit handle: an over-declared kind is how a later consumer ends up offering a path the command never produces.

* Returns -1 when the history holds fewer real user prompts than
* requested (e.g. the turn was absorbed by chat compression).
*/
export function rewindApiCutPoint(

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.

[R5-5 · Major] The docblock claims ink computeApiTruncationIndex parity, but this drops all three guards that make that function safe — including the case its own parenthetical says it returns -1 for.

witness: read-verified at head against utils/historyMapping.ts:118-198; no production caller exists yet, so latent.

Missing versus computeApiTruncationIndex:

  1. Compression refusal (:146-147): compressionIndex !== -1 && targetIndex <= compressionIndex → -1. Without it, in a session that has been compacted the pick list still shows pre-compaction turns, occurrence counts only the surviving API prompts, and the function returns a valid-but-wrong index → truncateHistory silently deletes the wrong span. ink returns -1 and AppContainer.tsx:3896-3911 surfaces "Cannot rewind to a turn that was compressed".
  2. First-turn shortcut (:170-177): uiUserTurnCount === 0 → return startIndex.
  3. Marker-less auto-compaction fail-loud (:171-181): the startIndex > getStartupContextLength(apiHistory) check that refuses to truncate to [prelude, summary, ack].

The position arithmetic itself is equivalent (occurrence = uiUserTurnCount + 1 yields the same index), so this is purely the guards. The docblock's own closing line — "Returns -1 when … the turn was absorbed by chat compression" — describes the case it structurally cannot detect. Also note nothing maps selectedTurnIndex → occurrence anywhere in the tree yet (git grep rewindApiCutPoint → this file plus its test), and the function is not in the re-export block at session-rewind.tsx:31-45, so whoever wires the caller has no signal that the ordinal must be computed against a compression-aware boundary.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants