Skip to content

fix(web-shell): Load models for fresh standalone sessions - #10719

Open
doudouOUC wants to merge 4 commits into
mainfrom
fix/standalone-initial-model-options
Open

fix(web-shell): Load models for fresh standalone sessions#10719
doudouOUC wants to merge 4 commits into
mainfrom
fix/standalone-initial-model-options

Conversation

@doudouOUC

Copy link
Copy Markdown
Collaborator

What this PR does

This PR lets Web Shell load the configured model catalog before a standalone session exists. It adds a capability-gated, read-only standalone options endpoint backed by the exact internal Conversations runtime, validates the response in the TypeScript SDK, and hydrates the existing Web Shell model and reasoning controls during deferred standalone startup. The endpoint accepts no workspace input and omits the internal Conversations path and ACP state.

When the first standalone prompt creates its session, Web Shell now sends the selected model in the existing standalone create request and skips the later best-effort model switch. A selected reasoning effort is still applied after attachment without persisting it into the internal Conversations workspace. Older daemons or failed option reads continue to create with the daemon default.

Why it's needed

Web Shell intentionally defers standalone session creation until the first prompt, but model data previously arrived only after a session attached. A freshly opened standalone page therefore showed an empty model picker. Applying a preselected model after creation also allowed the first prompt to run with the daemon default if the follow-up switch failed. Loading the model catalog without creating a session and making model selection part of creation fixes both behaviors while preserving standalone isolation and recovery semantics.

Reviewer Test Plan

How to verify

Start the daemon and Web Shell, open /?context=standalone without a session id, and confirm the current model and configured model list are visible before any standalone session is created. Open and close the picker and confirm no POST /standalone/sessions occurs. Select a non-default model and submit the first prompt; the single create request should contain the stable session id, selected modelServiceId, and approval mode, with no cwd or workspaceCwd, and no follow-up model-switch request. The attached session should keep the selected model. Against an older daemon or a failed options response, the empty picker should remain hidden and first-prompt creation should still use the daemon default.

Evidence (Before & After)

Before: a fresh standalone page showed Select Model: with no selected model, and opening the picker rendered No model matching ""; the model catalog appeared only after the first session attached.

After: a fresh standalone page showed moonshot/kimi-k3 immediately and listed 10 configured models while GET /standalone/sessions still returned zero sessions. Isolated browser E2E also selected qwen3.8-coder-plus, observed exactly one POST /standalone/sessions containing that modelServiceId, received the prompt response, and observed no model/config switch request.

Tested on

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

Environment (optional)

Node.js 22.22.3 on macOS; local qwen serve --bare --safe-mode; Web Shell exercised in Chromium through the in-app browser. Unit tests, package builds, the repository build, full typecheck, SDK public-surface check, formatting, ESLint, bundle generation, and isolated browser E2E were run locally. The SDK browser bundle is 224,830 bytes versus an exact-main baseline of 222,324 bytes; both exceed the existing 221,184-byte warning threshold, and this PR adds 2,506 bytes for runtime response validation.

Risk & Scope

  • Main risk or tradeoff: Opening a fresh standalone page now acquires the exact internal Conversations runtime to read provider configuration. The request is read-only, does not create a session or directory, and failures leave prompt creation available with the daemon default.
  • Not validated / out of scope: Windows and Linux browser behavior, Global New Chat, Recents, lifecycle menus, uploads, Live, workspace flows, and daemon lifecycle changes are out of scope. Workspace creation behavior is unchanged.
  • Breaking changes / migration notes: None. The endpoint and SDK method are gated by standalone_session_options_v1, so older daemons retain their existing behavior.

Linked Issues

N/A

中文说明

本 PR 做了什么

本 PR 让 Web Shell 能够在 standalone 会话尚未创建时加载已配置的模型列表。它新增了一个由 capability 控制、只读的 standalone options 接口;该接口只从精确的内部 Conversations runtime 读取数据。TypeScript SDK 会对响应做运行时校验,Web Shell 则在延迟创建 standalone 会话的启动阶段复用现有模型和思考选项状态。接口不接受 workspace 输入,也不会返回内部 Conversations 路径或 ACP 状态。

首次 standalone prompt 创建会话时,Web Shell 现在会把用户选择的模型放进现有 standalone 创建请求,并跳过后续的 best-effort 模型切换。用户选择的思考强度仍会在 attach 后应用,但不会持久化到内部 Conversations workspace。旧 daemon 或 options 请求失败时,仍会使用 daemon 默认模型完成创建。

为什么需要

Web Shell 会刻意将 standalone 会话创建延迟到首次 prompt,但之前模型数据只能在会话 attach 后获得,因此首次打开 standalone 页面会显示空模型选择器。创建后再应用预选模型还存在另一个问题:如果后续切换失败,首次 prompt 可能已经使用 daemon 默认模型运行。现在通过在不创建会话的情况下读取模型列表,并将模型选择原子地放入创建请求,同时修复了这两个问题,并保留 standalone 的隔离和恢复语义。

Reviewer 测试计划

如何验证

启动 daemon 和 Web Shell,不带 session id 打开 /?context=standalone,确认在创建任何 standalone 会话前就能看到当前模型和已配置模型列表。打开并关闭模型选择器,确认不会发送 POST /standalone/sessions。选择一个非默认模型并提交首次 prompt;唯一一次创建请求应包含稳定 session id、所选 modelServiceId 和 approval mode,不包含 cwdworkspaceCwd,并且没有后续模型切换请求。attach 后的会话应保持所选模型。连接旧 daemon 或 options 请求失败时,空模型选择器应保持隐藏,首次 prompt 仍应使用 daemon 默认模型创建会话。

证据(修复前与修复后)

修复前:新打开的 standalone 页面显示 Select Model:,没有选中模型,打开选择器会显示 No model matching "";只有首次会话 attach 后才会出现模型列表。

修复后:新打开的 standalone 页面立即显示 moonshot/kimi-k3 并列出 10 个已配置模型,同时 GET /standalone/sessions 仍返回零个会话。隔离浏览器 E2E 还选择了 qwen3.8-coder-plus,观察到唯一一次 POST /standalone/sessions 携带对应 modelServiceId,成功收到 prompt 响应,并确认没有模型或配置切换请求。

已测试平台

OS 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

macOS,Node.js 22.22.3;本地 qwen serve --bare --safe-mode;通过应用内浏览器中的 Chromium 验证 Web Shell。已在本地运行单元测试、各 package 构建、仓库构建、完整 typecheck、SDK public-surface 检查、格式化检查、ESLint、bundle 生成以及隔离浏览器 E2E。SDK 浏览器 bundle 为 224,830 字节,精确 main 基线为 222,324 字节;两者都超过现有 221,184 字节 warning 阈值,本 PR 为运行时响应校验增加了 2,506 字节。

风险与范围

  • 主要风险或取舍:首次打开 standalone 页面现在会获取精确的内部 Conversations runtime 以读取 provider 配置。请求只读,不会创建会话或目录;请求失败时仍可使用 daemon 默认模型提交 prompt。
  • 未验证或范围外:未验证 Windows 和 Linux 浏览器行为;Global New Chat、Recents、生命周期菜单、上传、Live、workspace 流程和 daemon 生命周期变更均不在范围内。workspace 创建行为保持不变。
  • 破坏性变更或迁移说明:无。接口和 SDK 方法均由 standalone_session_options_v1 控制,因此旧 daemon 保持原有行为。

关联问题

N/A

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

Copy link
Copy Markdown
Collaborator Author

E2E test report

Environment: macOS, Node.js 22.22.3, isolated HOME/QWEN_HOME/runtime/workspace, local daemon and Web Shell, Chromium, and a fake OpenAI-compatible provider.

  • A fresh ?context=standalone page showed qwen3.8-max · Extra High and both configured models before any standalone session existed.
  • Initial traffic included GET /standalone/session-options; there was no POST /standalone/sessions and no session directory.
  • Selecting qwen3.8-coder-plus and sending the first prompt produced exactly one POST /standalone/sessions with a stable UUID, modelServiceId: qwen3.8-coder-plus(openai), and approval mode, with no cwd or workspaceCwd.
  • The only subsequent mutation was the prompt request. No model or config switch request was emitted.
  • The prompt completed with the fake provider response, and the attached UI retained qwen3.8-coder-plus.
  • A recursive response audit found no cwd, workspace, Conversations-path, or ACP fields or values in the standalone options response.
  • All isolated E2E processes, browser tabs, and test data were cleaned up.

An additional smoke test against the current local configuration showed moonshot/kimi-k3 and all 10 configured models on a fresh page while the standalone session list remained empty, with no browser console errors.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

⚠️ Qwen Triage ended earlyview run. It stopped before finishing; check the run log.

⚠️ Qwen Triage 提前结束 —— 查看运行。未跑完,请查看运行日志。

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR — the writeup is thorough and the committed design doc is appreciated.

  • Template: looks good ✓
  • Problem: observed, not theoretical. The baseline deferred-standalone connect path explicitly clears session-scoped model data (models: undefined), so a fresh ?context=standalone page renders an empty picker until the first session attaches — and a preselected model applied best-effort after create can silently run the first prompt on the daemon default if the switch fails. Both halves are visible in the existing code, and the before/after in the description plus the E2E report in this thread document the user-facing effect.
  • Direction: aligned. This repairs the existing standalone model-selection surface rather than changing its direction — the standalone create route already accepted modelServiceId; this makes the selection visible before creation and atomic within it. CHANGELOG has no direct reference (this is a Qwen daemon/Web-Shell-specific surface), but the area is clearly relevant.
  • Size: ~361 production logic lines (+31 lines of design docs) vs. ~466 test lines, spread across cli / sdk-typescript / web-shell. Cross-package, but authored by a maintainer and below the size advisory thresholds.
  • Approach: scope feels right. A capability-gated, read-only endpoint owned by the exact internal runtime; SDK validation that refuses any response leaking workspaceCwd/acpChannelLive; hydrating the existing connection fields via mapProviderStatus instead of a second model state machine; and folding the model into the create request. Each piece is the minimal shape for its part of the problem, and I don't see drive-by changes.
  • Risk: no elevated risk signals — no revert-correlated paths are touched.

Moving on to code review. 🔍

中文说明

感谢贡献!PR 描述详尽,还附带了已提交的设计文档。

  • 模板:完整 ✓
  • 问题:真实存在,不是理论问题。现有代码中,延迟创建 standalone 会话的连接路径会显式清空会话级模型数据(models: undefined),因此新打开的 ?context=standalone 页面在首个会话 attach 前模型选择器为空;而创建后 best-effort 应用预选模型时,若切换失败,首次 prompt 会静默使用守护进程默认模型。这两点在现有代码中都可见,描述中的 before/after 以及本线程的 E2E 报告也证明了用户可见的影响。
  • 方向:对齐。这是修复现有的 standalone 模型选择界面,而非改变其方向——standalone 创建路由本就接受 modelServiceId;本 PR 让选择在创建前可见、在创建中原子化。CHANGELOG 无直接参考(这是 Qwen daemon/Web Shell 特有界面),但该领域显然相关。
  • 规模:约 361 行生产逻辑(另有 31 行设计文档)对约 466 行测试,跨 cli / sdk-typescript / web-shell 三个包。虽为跨包改动,但作者为维护者,且低于规模提示阈值。
  • 方案:范围合理。由精确内部 runtime 拥有、受 capability 控制的只读接口;SDK 校验拒绝任何泄露 workspaceCwd/acpChannelLive 的响应;通过 mapProviderStatus 复用现有连接字段而非引入第二个模型状态机;将模型折叠进创建请求。每一部分都是解决对应问题所需的最小形态,也没有发现顺手改动。
  • 风险:无升级风险信号——未触及与回滚相关的路径。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review — one blocking finding: the new capability is registered in code but missing from the docs its contract test pins, and that test is what just turned CI red.

The implementation review from the previous pass still stands at this commit — the endpoint hygiene, SDK validation, mapper reuse, atomic create, and failure semantics all checked out, and I still don't see a materially simpler path. One update and one addition below.

First, withdrawing the earlier nit: the author's pushback is right — the keyboard-handler site reads the raw connectionRef.current.models ref while the toolbar/StatusBar sites read the memoized, visibility-filtered availableModels, so one shared boolean cannot cover both shapes without extra indirection. Three short repetitions it is.

Blocking — capabilities-docs-contract.test.ts fails on this PR's own CI, and the failure is introduced by this PR. The diff adds standalone_session_options_v1 to both SERVE_CAPABILITY_REGISTRY and CONDITIONAL_SERVE_FEATURES in packages/cli/src/serve/capabilities.ts, but leaves the two doc surfaces that src/serve/capabilities-docs-contract.test.ts pins out of sync:

  • docs/developers/qwen-serve-protocol.md — the conditional-serve-features table (between the conditional-serve-features:start/end markers) needs a row for standalone_session_options_v1; the test found 40 documented keys against 41 registry keys, the missing one being exactly this PR's.
  • docs/developers/daemon/00-index.md — the Capabilities line still reads 147 registered tags; 41 conditional tags while the registry now holds 148. Against current main the fixed line needs 148 registered tags; 42 conditional tags.

This test is green on main (e.g. main run b27deb63: ✓ 2 tests), so the red is this PR's. The fix is the table row plus the count bump; the contract test itself is the oracle — run it locally to confirm.

The deferred-hydration + atomic-create flow (unchanged from last pass):

sequenceDiagram
    participant P1 as Web Shell session provider
    participant P2 as SDK DaemonClient
    participant P3 as Daemon standalone session-options route
    participant P4 as Internal Conversations runtime
    Note over P1: page opens, session creation deferred
    P1->>P2: getStandaloneSessionOptions()
    P2->>P3: capability-gated GET, no query input accepted
    P3->>P4: activity lease, exact-root and currency checks
    P4-->>P3: provider status with workspace path and ACP state redacted
    P3-->>P2: options v 1
    P2-->>P1: validated options
    Note over P1: hydrate models, picker becomes visible
    P1->>P3: first prompt creates session carrying selected modelServiceId
    Note over P1: post-attach model switch skipped
Loading
Files changed (24)
File What changed
docs/design/2026-09-01-standalone-initial-model-options.md New design doc: problem, design, boundaries, verification plan
packages/cli/src/serve/capabilities.ts Registers standalone_session_options_v1, gated on standaloneSessionsAvailable — but the matching docs update is missing (see blocking finding)
packages/cli/src/serve/conversations/standalone-session-service.ts Adds getOptions: runtime lease, exact-root, ownership check, redacted result
packages/cli/src/serve/conversations/standalone-session-service.test.ts Tests options read, redaction, and fail-closed ownership mismatch
packages/cli/src/serve/routes/standalone-sessions.ts Adds GET /standalone/session-options; rejects any query parameters
packages/cli/src/serve/routes/standalone-sessions.test.ts Route tests: returns options, rejects query input
packages/cli/src/serve/server.test.ts Pins capability advertisement for partial vs complete runtimes
packages/sdk-typescript/src/daemon/DaemonClient.ts Adds capability-gated getStandaloneSessionOptions
packages/sdk-typescript/src/daemon/standalone-sessions.ts Options type plus strict runtime response validation
packages/sdk-typescript/src/daemon/index.ts Exports the new capability constant and options type
packages/sdk-typescript/src/index.ts Exports the new public SDK surface
packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts Tests gating, validation, and malformed-response rejection
packages/sdk-typescript/test/unit/daemon-public-surface.test.ts Asserts the new exports on the public surface
packages/web-shell/client/daemon/session/DaemonSessionProvider.tsx Fetches options during deferred standalone connect; modelServiceId override on create
packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx Hydration without creation, failure tolerance, staleness guard, model on create
packages/web-shell/client/daemon/session/actions.ts createSession accepts standalone-only modelServiceId in both create branches
packages/web-shell/client/daemon/session/actions.test.ts createSession passes modelServiceId; workspace path rejects it
packages/web-shell/client/daemon/session/mappers.ts Widens mapProviderStatus input to a subset of the provider status
packages/web-shell/client/daemon/session/types.ts Documents the new createSession option
packages/web-shell/client/utils/sessionPreparation.ts Folds model into standalone create; reasoning effort non-persisting
packages/web-shell/client/utils/sessionPreparation.test.ts Standalone: model at create, no switch, reasoning not persisted
packages/web-shell/client/App.tsx Hides the model action and toasts when standalone options are unavailable
packages/web-shell/client/App.test.tsx Picker hidden until options arrive; create carries the model
packages/web-shell/client/i18n.tsx Adds the model.unavailable string, EN and ZH

Test evidence — the PR's own CI, read via the API (per gate rules this review never builds or executes PR-derived code). CI has now settled on the reviewed commit: one red check, Test (ubuntu-latest, Node 22.x), with two failing suites of very different ownership:

  1. src/serve/capabilities-docs-contract.test.ts (CLI) — caused by this PR (the blocking finding above). From the job log:

    FAIL  src/serve/capabilities-docs-contract.test.ts > documents exactly the conditional feature registry keys
    - Expected / + Received
    -   "standalone_session_options_v1",      ← in the registry, absent from the docs table
    FAIL  src/serve/capabilities-docs-contract.test.ts > keeps the daemon index capability counts in sync
    AssertionError: expected 147 to be 148
    Test Files  1 failed | 985 passed (986);  Tests  2 failed | 27722 passed | 90 skipped
    
  2. components/ChatEditor.test.tsx (web-shell) — pre-existing on main, not caused by this PR. The suite fails to even transform: esbuild rejects a duplicated language = 'en' binding at line 425. Evidence for the pre-existing call: the file is byte-identical on main and this PR head (blob e9e381913f65…), this PR touches none of it; the duplication arrived on main via feat(web-shell): add an experimental session workflow cockpit #8583 (merged today ~13:28 UTC), and main's own CI run b27deb63 fails with the exact same error (while its capabilities-docs-contract.test.ts passes — corroborating the attribution in both directions). This needs a separate fix on main; it cannot be fixed from this PR.

Everything else is green: integration tests (no-AK, no sandbox), Serve A/B (12 scenarios, no response changes vs base), web-shell E2E smoke, web-shell visuals, desktop/Live Host builds, the Java compatibility matrix, dependency CVE audit, and the secret scan. The windows/macos unit-matrix entries report skipped.

CI results for 99736ac — all pull_request workflows have completed:

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

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

Sandboxed verification would settle this: @qwen-code /verify — that a fresh standalone page hydrates the catalog without creating a session, and that the first create request carries the selected model, is a behavioural claim not observable from the diff. This PR's unit tests pin the wiring against a mocked daemon client, and the browser/daemon evidence in this thread is the author's own claim, on macOS only. No verify report has landed in this thread yet.

中文说明

代码审查——发现一个阻塞问题:新能力已在代码中注册,但其契约测试所钉住的两份文档未同步更新,该测试正是 CI 变红的原因。

上一轮的代码审查结论在该提交上依然成立——接口卫生、SDK 校验、mapper 复用、原子创建与失败语义均核实无误,也没有找到更简路径。两点更新如下。

先撤回之前的小建议:作者的反驳是对的——键盘处理处读取的是原始 connectionRef.current.models ref,而工具栏/StatusBar 处读取的是经过可见性过滤、已 memo 化的 availableModels,一个共享布尔无法同时覆盖两种形态。保留三处短重复即可。

阻塞——capabilities-docs-contract.test.ts 在本 PR 自己的 CI 上失败,且失败由本 PR 引入。 diff 在 packages/cli/src/serve/capabilities.ts 中把 standalone_session_options_v1 同时加入了 SERVE_CAPABILITY_REGISTRYCONDITIONAL_SERVE_FEATURES,但契约测试钉住的两份文档没有同步:

  • docs/developers/qwen-serve-protocol.md——conditional-serve-features 表格(位于 conditional-serve-features:start/end 标记之间)需要为 standalone_session_options_v1 增加一行;测试显示文档记录了 40 个键而注册表有 41 个,缺失的正是本 PR 新增的这个。
  • docs/developers/daemon/00-index.md——Capabilities 一行仍写着 147 registered tags; 41 conditional tags,而注册表已有 148 项。以当前 main 为基准,修复后应为 148 registered tags; 42 conditional tags

该测试在 main 上是绿的(例如 main 运行 b27deb63:✓ 2 tests),红色确系本 PR 引入。修复方式就是补表格行并更新计数;契约测试本身即是判据——请本地运行确认。

测试证据来自 PR 自身的 CI(通过 API 读取;按门禁规则,本审查从不构建或执行 PR 代码)。该提交的 CI 已落定:一个红色检查 Test (ubuntu-latest, Node 22.x),其中两个失败的套件归属截然不同:

  1. capabilities-docs-contract.test.ts(CLI)——本 PR 所致(即上述阻塞问题),日志摘录见英文部分。
  2. ChatEditor.test.tsx(web-shell)——main 上的既有问题,与本 PR 无关。 该套件在转换阶段即失败:esbuild 拒绝第 425 行重复声明的 language = 'en' 绑定。判定为既有问题的证据:该文件在 main 与本 PR head 上逐字节相同(blob e9e381913f65…),本 PR 完全未触及它;重复声明是 feat(web-shell): add an experimental session workflow cockpit #8583(今日约 13:28 UTC 合入)带上 main 的,且 main 自己的 CI 运行 b27deb63 以完全相同的错误失败(同时其 capabilities-docs-contract.test.ts 通过——双向印证了归因)。这需要在 main 上另行修复,本 PR 无法修。

其余全部为绿:集成测试(no-AK、无沙箱)、Serve A/B(12 场景、与 base 无响应差异)、web-shell E2E smoke、web-shell visuals、桌面壳/Live Host 构建、Java 兼容矩阵、依赖 CVE 审计与密钥扫描。windows/macos 单元测试矩阵项为 skipped。

沙箱验证可以一锤定音:@qwen-code /verify——新 standalone 页面在不创建会话的情况下水合模型列表、且首次创建请求携带所选模型,这是 diff 无法直接观测的行为性论断。本线程中尚未出现 verify 报告。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

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

Screenshots · before / after

ℹ️ No screenshot changed against the PR base — but this PR edits 3 render-shaping files:

  • packages/web-shell/client/App.tsx
  • packages/web-shell/client/daemon/session/DaemonSessionProvider.tsx
  • packages/web-shell/client/i18n.tsx

Either the change has no visual effect (logic, plumbing, a state the scenarios never reach), or no scenario renders this UI — in which case the preview cannot see it, and an empty result is a coverage gap rather than a clean bill of health. To make it visible, add a scenario to packages/web-shell/client/e2e/visuals/screenshots.spec.ts that seeds whatever state the UI is gated on; it then appears here as a head-only (NEW) capture.

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

Qwen Code · web-shell visuals

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 2/5 — the design and implementation held up again under this re-run, but CI settled red on a failure this PR introduces, so it cannot merge as-is.

Stepping back: nothing changed my read of the code — the problem is real, the approach is the minimal shape for each half of it, the failure semantics match the design doc, and the tests pin what matters. The previous pass deferred approval only on CI; CI has now landed, and it says no.

The blocker is mechanical, and it is this PR's own: standalone_session_options_v1 was registered in capabilities.ts but never added to the two doc surfaces the repo's docs-contract test pins — the conditional-serve-features table in qwen-serve-protocol.md and the capability counts in daemon/00-index.md. That test is green on main, red here. A table row and a count bump fix it; the exact numbers are in my Stage 2 comment.

One caveat so the next CI run doesn't cause confusion: even after the docs fix, the web-shell suite will still fail on ChatEditor.test.tsx until main itself is repaired — that transform error (a duplicated language binding) arrived via #8583, the file is byte-identical on main and this PR head, and main's own CI is red on it too. It is not this PR's to fix, but it means a green re-run needs either the main-side fix first or a reviewer willing to treat that one suite as known-broken.

@doudouOUC requesting changes for the docs sync — everything else from the earlier review stands.

中文说明

回顾整体:代码层面的结论在本次复查中没有变化——问题真实、方案是每一半所需的最小形态、失败语义与设计文档一致、测试钉住了关键行为。上一轮只是等 CI,现在 CI 落定了,结果是红。

阻塞点是机械性的,且由本 PR 自身引入:standalone_session_options_v1 已在 capabilities.ts 中注册,却未加入仓库契约测试所钉住的两份文档——qwen-serve-protocol.md 的 conditional-serve-features 表格与 daemon/00-index.md 的能力计数。该测试在 main 上是绿的,在本 PR 上是红的。补一行表格、更新计数即可修复;具体数字见我的 Stage 2 评论。

一个提醒,避免下一轮 CI 造成困惑:即便修复文档,ChatEditor.test.tsx 仍会让 web-shell 套件失败,直到 main 自身被修复——那个转换错误(重复声明的 language 绑定)由 #8583 引入,该文件在 main 与本 PR head 上逐字节相同,main 自己的 CI 也因此变红。这不是本 PR 该修的,但这意味着一次全绿的重跑需要先有 main 侧修复,或需要评审人愿意把该套件视为已知损坏。

@doudouOUC 因文档同步问题请求修改——此前评审的其他结论保持不变。

Qwen Code · qwen3.8-max

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

@doudouOUC doudouOUC self-assigned this Sep 1, 2026
@doudouOUC
doudouOUC requested a review from yiliang114 September 1, 2026 15:20
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

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

capabilities

field PR base (before) this PR (after)
features[] "standalone_session_options_v1"

Qwen Code · serve A/B

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Thanks — won't take the nit. The standalone/no-session/no-models guard appears three times, but the keyboard-handler site reads connectionRef.current.models (raw list, ref-based to avoid a stale closure) while the toolbar-actions and StatusBar sites read the memoized, isVisibleComposerModel-filtered availableModels. One shared boolean cannot cover both shapes without extra indirection, and at three short repetitions the extraction costs more than it saves.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 660 passed · 0 failed · 660 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 检查

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

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

Verification report

Verification report — PR 10719 fix(web-shell): Load models for fresh standalone sessions

Verdict: merge-ready — 660/660 scripted assertions passed, 0 unexpected failures.
Verified head: 99736acf104f60625247db313219b918c66a30b4 (merge-ref HEAD^2; base tip d6c03908164dcb2704b2252b69b244be9be5c09a).

中文摘要
  • 结论merge-ready。660 条脚本化断言全部通过,0 个意外失败;未发现阻塞性问题。
  • A/B 结论(见 "Central claim" 表):head 守护进程新增能力门控的只读端点 GET /standalone/session-options(14/14:能力已通告、200 返回模型目录、不创建会话、响应省略 workspaceCwd/acpChannelLive、任意 query 参数 400);base 守护进程同请求 404 且能力缺失(4/4),POST /standalone/sessions 携带 modelServiceId 的既有行为两侧一致。真实 SDK 对真实 base 守护进程抛出 DaemonCapabilityMissingError 且不打路由(旧守护进程保持旧行为)。
  • 浏览器 E2E(8/8):新 standalone 页面在创建会话前即显示模型选择器(截图 04/05),开关选择器不产生 POST /standalone/sessions;首个 prompt 恰好一次 create 请求,含稳定 sessionId、所选 modelServiceId、approvalMode,无 cwd/workspaceCwd,且无后续 model-switch 请求;head UI 对 base 守护进程时选择器保持隐藏、create 不带 modelServiceId。
  • 突变矩阵:PR 引入的 10 个守卫逐一回退后其测试均按预期变红(0 存活,见 09-mutation-matrix.png)。
  • Findings:无阻塞项;3 条非阻塞观察(容器默认 provider 仅暴露被 composer 隐藏的模型、上游配额导致 prompt 回复未完成、SDK 浏览器 bundle 超既有软阈值 +2,506 B,均见下文)。
  • 未覆盖:server.test.ts / App.test.tsx 全量套件(仅定向运行,PR 自身 CI 覆盖全量);prompt 回复内容(上游配额,环境因素);Windows/macOS 浏览器与 workspace/Live 流程(作者声明范围外)。

Scope

Central claim: a fresh standalone Web Shell page can load the model catalog before any session exists, via a capability-gated read-only GET /standalone/session-options, and the first standalone prompt sends the selected model atomically in the create request instead of a best-effort post-attach switch.

Secondary claims: (1) the endpoint is read-only, rejects workspace inputs, redacts the internal Conversations path/ACP state, and fails closed on runtime-ownership mismatch; (2) old daemons and failed option reads keep the old behavior (picker hidden, daemon default at create) because the SDK gates on standalone_session_options_v1 before calling the route.

Central claim — A/B against the base build

Real daemons booted from the head build (packages/cli/dist at HEAD) and a base control (worktree at HEAD^1, CLI recompiled there). The base control resolves @qwen-code/qwen-code-core/@qwen-code/acp-bridge from the root node_modules (head tree); git diff HEAD^1..HEAD --stat over those packages is empty, so the shared code is byte-identical on both arms — asserted via readlink -f before trusting the control. Base dist verified pre-PR (grep -c session-options = 0, capability string absent). Raw logs: logs/ab-head.log, logs/ab-base.log; witnesses: 01-ab-head-options-endpoint.png, 02-ab-base-control.png.

cell environment oracle result
head capability daemon @​ head GET /capabilities features standalone_session_options_v1 present
head options daemon @​ head GET /standalone/session-options 200, v=1, initialized=true, providers populated, current.modelId set
head redaction daemon @​ head response body keys/text no workspaceCwd, no acpChannelLive, no Conversations path leak
head no-side-effect daemon @​ head, fresh GET /standalone/sessions before/after options read 0 → 0
head input guard daemon @​ head ?cwd=, ?workspaceCwd=, ?bogus= 400 each
head atomic create daemon @​ head POST /standalone/sessions with modelServiceId 200, sessionId echoed, list 0 → 1
base capability daemon @​ base GET /capabilities feature absent
base options daemon @​ base GET /standalone/session-options 404 (the A/B flip)
base parity daemon @​ base GET /standalone/sessions, create with modelServiceId intact (200; create works)

Parity corroboration: on the head daemon, /standalone/session-options returned the exact GET /workspace/providers payload minus precisely workspaceCwd and acpChannelLive — the endpoint reads the runtime's provider status and redacts only the internals, as designed.

Secondary claim 2, wire oracle (03-sdk-wire-oracle.png, logs/sdk-wire.log): the real built DaemonClient against the real base daemon throws DaemonCapabilityMissingError for standalone_session_options_v1; against a decoy peer that advertises no capability but happily serves the route, the SDK throws with 0 route hits (gate checked before the call). 10 malformed-payload probes (leaked workspaceCwd/acpChannelLive, v:2, null providers, wrong kind, string isCurrent, zero contextLimit, bogus approvalMode, non-array errors, numeric initialized) each reject with the specific DaemonStandaloneProtocolError; the valid payload round-trips. 15/15.

Reviewer Test Plan walk (browser E2E, logs/e2e-webshell.log, screenshots 0408):

plan step result
fresh /?context=standalone shows current model + list before any session PASS — 1× GET /standalone/session-options, 0× POST /standalone/sessions; toolbar chip "Select Model: Qwen 3.8 Max · Extra High"; picker lists the model (04, 05)
open + close picker, no POST /standalone/sessions PASS — 0 creates through the cycle
first prompt: single create with stable id, selected modelServiceId, approval mode, no cwd/workspaceCwd, no follow-up switch PASS — exactly 1 create {"sessionId":"9f6b048f-…","modelServiceId":"qwen3.8-max(openai)","approvalMode":"auto"}; 0× POST /session/:id/model (06)
older daemon: picker hidden, create uses daemon default PASS — head UI vs base daemon: 0 option calls, picker absent (07), create body without modelServiceId (08)

Bundle-size claim: measured head dist/daemon/index.js = 224,830 B; base rebuilt with the identical esbuild step = 222,324 B; Δ = 2,506 B — all three numbers exactly as stated in the PR body (warning threshold 221,184 B is pre-existing and warn-only).

Findings (non-blocking observations)

  1. Environment, not a defect: the container's default catalog is composer-hidden. With no modelProviders settings, the daemon's only listed model is coder-model(qwen-oauth), which the pre-existing HIDDEN_COMPOSER_MODEL_IDS filter removes from the picker — so a fresh page correctly hid the picker (availableModels.length === 0), same as the attached-session flow would. After configuring a visible modelProviders.openai entry, every picker cell passed. The PR's hydration and the pre-existing visibility rule compose correctly; no action needed.
  2. Prompt completion not verified (upstream quota). The shared OpenAI-compatible upstream returned insufficient_quota for chat completions, so the first prompt's response could not complete in E2E. The PR's changed surface — create orchestration, model-at-create, no post-attach switch — was fully observed before any model call; the quota failure is environmental and would affect base and head identically.
  3. SDK browser bundle exceeds the soft warning by design. +2,506 B over the pre-existing 221,184 B warning threshold (warn-only, author-disclosed). Informational; the hard caps (transports 48 KiB, transcript 192 KiB) are untouched and pass.

Mutation matrix (vacuity)

Each guard the PR introduces was reverted in place; its suite must go red with the intended assertion. All 10 killed; 0 survivors; each kill doubles as the positive control proving its suite can fail (09-mutation-matrix.png).

# guard suite result
M1 runtime-ownership check in getOptions() standalone-session-service.test.ts KILLED — "promise resolved … instead of rejecting"
M2 route query-param rejection standalone-sessions.test.ts KILLED — "expected 200 to be 400"
M3 SDK reject of leaked workspaceCwd/acpChannelLive DaemonClientStandalone.test.ts KILLED — only the 2 leak cases red, 3 sibling cases green (exact attribution)
M5 models hydration from options DaemonSessionProvider.test.tsx KILLED — "expected undefined to deeply equal […]"
M6 skip setModel for standalone sessionPreparation.test.ts KILLED — "expected spy to not be called at all"
M7 persist:false reasoning for standalone sessionPreparation.test.ts KILLED — - persist: false / + persist: true
M8 reject per-call modelServiceId for workspace create actions.test.ts KILLED — guard-message assertion fails
M9 hide composer model action when no models App.test.tsx KILLED — "expected [ Array(7) ] to not include 'model'"
M10 stale-options guard after context switch DaemonSessionProvider.test.tsx KILLED — stale publish matched-object failure
M11 capability gate before fetching options DaemonSessionProvider.test.tsx (pre-existing test) KILLED — "expected [] to be undefined"

Redaction is defended in depth (service allowlist M-return shape + SDK reject M3); reverting either end alone is caught at its own layer, so no combination row is needed to prove the set load-bearing.

Targeted gates (PR's own CI covers the full suites)

suite result
cli standalone-session-service.test.ts + routes/standalone-sessions.test.ts 116/116
cli server.test.ts (feature-list order, CONDITIONAL_SERVE_FEATURES drift, live-runtime capability advertisement) 3/3 (1163 skipped by filter)
sdk DaemonClientStandalone + daemon-public-surface 44/44
web-shell DaemonSessionProvider + actions + sessionPreparation 441/441
web-shell App.test.tsx (picker-hide + standalone-draft create) 2/2 (655 skipped by filter)

Not covered

  • Full server.test.ts (1166) and App.test.tsx (657) runs — targeted -t selections only; the PR's CI runs the complete suites.
  • First-prompt response content (upstream quota, see Finding 2) — this E2E reproduces the PR's orchestration end to end but not a successful model completion.
  • Windows/macOS browsers; workspace, Live, Recents, uploads, channel flows (author-declared out of scope).
  • Base worktree typecheck: a fresh worktree cannot resolve per-package nested node_modules/gitignored generated files the CI install provides; the base control was emitted with tsc --build --noCheck (TS emit is independent of type errors) plus the repo's own generate-git-commit-info.js, and verified pre-PR by string checks. Environmental, proven by the identical failure mode being unrelated to any PR-touched file.
  • Per-commit attribution: single commit, reachable locally; not applicable.

Methodology

Environment: CI verify container (node:22-bookworm), builds pre-installed at HEAD; scratch worktree under tmp/ (removed after capture). Head daemon: node packages/cli/dist/index.js serve --bare --safe-mode --port 0 with isolated HOME and loopback OpenAI-compatible proxy env; base daemon: same launcher against the base worktree's rebuilt CLI. Harnesses (harness/*.mjs) are mock-free: real HTTP against real daemons, real built SDK DaemonClient, real Chromium (Playwright, repo-pinned browsers) driving the Web Shell served by each daemon; malformed-payload cells use a loopback fake peer. Every assertion is a scripted comparison in the harnesses; raw per-run logs in logs/, captures in evidence/. Assertion totals count only executed checks; expected reds (mutation kills, base-arm 404) are encoded as passes.

Flakiness gate log

rounds=5 files=9 skipped=0
file packages/cli/src/serve/conversations/standalone-session-service.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/conversations/standalone-session-service.test.ts
file packages/cli/src/serve/routes/standalone-sessions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/routes/standalone-sessions.test.ts
file packages/cli/src/serve/server.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/server.test.ts
file packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/DaemonClientStandalone.test.ts
file packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/daemon-public-surface.test.ts
file packages/web-shell/client/App.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/App.test.tsx
file packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/daemon/session/DaemonSessionProvider.test.tsx
file packages/web-shell/client/daemon/session/actions.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/daemon/session/actions.test.ts
file packages/web-shell/client/utils/sessionPreparation.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/utils/sessionPreparation.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/serve/conversations/standalone-session-service.test.ts: PP
  packages/cli/src/serve/routes/standalone-sessions.test.ts: PP
  packages/cli/src/serve/server.test.ts: PP
  packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: PP
  packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: PP
  packages/web-shell/client/App.test.tsx: PP
  packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: P
  packages/web-shell/client/daemon/session/actions.test.ts: P
  packages/web-shell/client/utils/sessionPreparation.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/serve/conversations/standalone-session-service.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/routes/standalone-sessions.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/daemon/session/actions.test.ts: P (exit 0)
round 1 · packages/web-shell/client/utils/sessionPreparation.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/conversations/standalone-session-service.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/routes/standalone-sessions.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)

Evidence images

01-ab-head-options-endpoint

02-ab-base-control

03-sdk-wire-oracle

04-ui-head-fresh-standalone

05-ui-head-picker-open

06-ui-head-after-first-prompt

07-ui-base-picker-hidden

08-ui-base-after-first-prompt

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

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

Qwen Code · sandboxed verification

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

CI failure breakdown + follow-ups (self-review notes)

The red Test (ubuntu-latest, Node 22.x) on 99736ac decomposes into two unrelated causes:

  1. capabilities-docs-contract.test.ts (2 tests) — this PR's miss, fix incoming. Registering standalone_session_options_v1 as a conditional capability requires two doc updates I skipped: a row in the conditional-serve-features table in docs/developers/qwen-serve-protocol.md (the contract test diffs that table against the CONDITIONAL_SERVE_FEATURES keys) and the tag counts in docs/developers/daemon/00-index.md (147 → 148 registered, 41 → 42 conditional). I will also add GET /standalone/session-options to the standalone route table in the same pass, since that table is the authoritative route list.

  2. ChatEditor.test.tsx transform error — pre-existing on main, not from this PR. language is declared twice in the harness destructure (L422/L425, plus the duplicated interface prop at L403/L407); blame points at feat(web-shell): add an experimental session workflow cockpit #8583, and the duplication is present on main@18046830. This PR does not touch the file. Needs a main-side fix; I will rebase once it lands.

Non-blocking nits from a full read-through, for the record:

  • The "standalone, no session, no models yet" condition is inlined in three places in App.tsx (the toolbar-action filter, the /model keyboard handler, and the StatusBar onSelectModel), and the keyboard handler checks the unfiltered connection.models while the other two check the isVisibleComposerModel-filtered list. Reachable only when the catalog consists solely of the hidden internal model id, but a single derived predicate would keep the three from drifting.
  • StandaloneSessionService.getOptions constructs ConversationRuntimeOwnershipError directly; the conversationRuntimeOwnershipCompromisedError() factory exists and is what the ownership module uses elsewhere.
  • The SDK options validator strict-checks the approvalMode and status-cell enums, so a future daemon that adds an approval mode fails the whole options read on older SDKs. That is the intended fail-closed parser style for the standalone surface, and the Web Shell side fails open (picker hidden, daemon default used), so no change is planned — noting the trade-off explicitly.
中文说明

99736ac 上红色的 Test (ubuntu-latest, Node 22.x) 可拆成两个互不相关的原因:

  1. capabilities-docs-contract.test.ts(2 个用例)——本 PR 的疏漏,马上修。 注册条件 capability standalone_session_options_v1 需要同步两处文档:docs/developers/qwen-serve-protocol.mdconditional-serve-features 表格(契约测试逐项比对 CONDITIONAL_SERVE_FEATURES 键)以及 docs/developers/daemon/00-index.md 的计数(147 → 148 registered,41 → 42 conditional)。同一次提交里还会把 GET /standalone/session-options 补进 standalone 路由表(该表是路由的权威清单)。

  2. ChatEditor.test.tsx 转换报错——main 上既有问题,与本 PR 无关。 harness destructure 里 language 声明了两次(L422/L425,接口属性 L403/L407 也重复);blame 指向 feat(web-shell): add an experimental session workflow cockpit #8583main@18046830 上仍然存在。本 PR 未触碰该文件。等 main 修复后 rebase。

非阻塞记录项见上方英文列表:三处内联条件的漂移风险(其中键盘处理器用了未过滤的模型列表)、getOptions 应改用现有的 conversationRuntimeOwnershipCompromisedError() 工厂、以及 SDK 严格枚举校验的前向兼容取舍(UI 层已 fail-open,不计划改动,仅显式记录)。

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

Needs the docs sync before this can merge — the new standalone_session_options_v1 capability is registered in code but missing from the two doc surfaces capabilities-docs-contract.test.ts pins (the conditional-serve-features table in docs/developers/qwen-serve-protocol.md and the tag counts in docs/developers/daemon/00-index.md), which is what turned CI red. Details and the exact fix are in my Stage 2 comment. Everything else still reads well — this is the only thing standing between this PR and green.

中文说明

合并前需要补齐文档同步——新能力 standalone_session_options_v1 已在代码中注册,但 capabilities-docs-contract.test.ts 钉住的两份文档(docs/developers/qwen-serve-protocol.md 的 conditional-serve-features 表格与 docs/developers/daemon/00-index.md 的计数)未更新,这正是 CI 变红的原因。具体修复方式见我的 Stage 2 评论。其余部分依然没有问题——这是唯一的阻塞项。

Qwen Code · qwen3.8-max

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

CI follow-up on the Test (ubuntu-latest, Node 22.x) failure:

  • capabilities-docs-contract.test.ts (2 cases) — caused by this PR. standalone_session_options_v1 was added to the capability registry/conditional features without syncing the documented contract. Fixed in 41d74d8: added the tag row to the conditional-serve-features table in docs/developers/qwen-serve-protocol.md and bumped the counts in docs/developers/daemon/00-index.md to 148 registered / 42 conditional. Verified locally: vitest run src/serve/capabilities-docs-contract.test.ts passes 2/2.
  • components/ChatEditor.test.tsx transform error — not caused by this PR. main itself has a duplicate language declaration (interface + destructuring), introduced by feat(web-shell): add an experimental session workflow cockpit #8583. The main-side fix is already in flight as fix(web-shell): remove duplicate language declaration in ChatEditor.test.tsx #10729; once it lands, this PR just needs a rebase/merge to pick it up.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

chiga0
chiga0 previously approved these changes Sep 1, 2026

@chiga0 chiga0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM — no blockers.

Reviewed at 41d74d80.

What I checked

Route & service layer (standalone-session-service.ts, standalone-sessions.ts):
GET /standalone/session-options correctly calls ensureRuntime → runRuntimeActivity → assertExactRoot → getWorkspaceProvidersStatus and then strips workspaceCwd/acpChannelLive from the returned object. The ownership sanity check (status.workspaceCwd !== runtime.workspaceCwd) guards against a race where the runtime switches between calls. Query-param rejection (400 on unknown fields) is clean.

Contract symmetry (class 1):
Server emits Omit<ServeWorkspaceProvidersStatus, "workspaceCwd"|"acpChannelLive"> → SDK parseStandaloneSessionOptions accepts exactly Pick<..., "v"|"initialized"|"current"|"approvalMode"|"providers"|"errors"> and throws if workspaceCwd or acpChannelLive appear. Both ends strip the same two fields. Verified in DaemonClientStandalone.test.ts ("rejects malformed standalone options: workspace internals").

Capability gating (class 2):
STANDALONE_SESSION_OPTIONS_CAPABILITY is exported from both barrel files (src/daemon/index.ts and src/index.ts). getStandaloneSessionOptions() calls requireCapability before the HTTP call. The test ("gates standalone options with their dedicated capability") confirms a missing capability produces DaemonCapabilityMissingError without hitting the route. server.test.ts pins the feature under session_export and verifies standaloneSessionsAvailable toggling.

Error handling (class 3):
getStandaloneSessionOptions() failure in the deferred-connect path is caught, logged (console.warn), and standaloneOptions stays undefined; mapProviderStatus(undefined) returns { models: [] }, so models is set to undefined in the connection state — matching the pre-PR behavior for that path. Test "keeps a standalone draft usable when its options request fails" confirms the connection reaches status: connected even on failure.

State race (class 7):
if (disposed || abort.signal.aborted) return is placed immediately after the await getStandaloneSessionOptions() call, before setConnection. Test "does not publish stale standalone options after switching contexts" exercises this guard: options that resolve after the context switches to workspace do not clobber the new connection state.

modelServiceId threading (class 8):
sessionPreparation.ts seeds modelServiceId in the standalone create options and skips the setModel follow-up (if (modelId && sessionContext?.kind !== "standalone")). reasoning effort persist: false for standalone is also correct — ephemeral sessions should not persist effort. actions.ts guards: passing modelServiceId for a non-standalone context throws immediately before any RPC. The App.tsx test at line 25332 confirms setModel is never called after a standalone create with a model.

UX guards (App.tsx):
Model toolbar action is filtered out when !sessionId && kind === "standalone" && availableModels.length === 0. The keyboard shortcut and footer button also show a toast instead of opening an empty picker. Test "hides the empty model picker until standalone options are available" confirms the picker reappears after models is populated.

Bot review cross-check:
qwen-code-ci-bot CHANGES_REQUESTED the missing docs (qwen-serve-protocol.md conditional-serve-features table and 00-index.md tag counts). Both are updated in this head: standalone_session_options_v1 added to the feature block, counts updated 147→148 / 41→42. Issue resolved.

Coverage gaps:
None material. All applicable taxonomy classes were either verified clean or covered by existing tests.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 2537 passed · 0 failed · 2537 total

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

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

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

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

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

Verification report

Verdict: merge-ready — 2,537/2,537 scripted assertions passed, 0 unexpected failures.
Verified head: 41d74d80f96582e3d2244d0348176e7aa295e0c9 (merge-ref HEAD^2; base tip 180468306c3a81ac307203c36e8e47bda3858dc2).

中文摘要
  • 结论merge-ready。2,537 条脚本化断言全部通过,0 个意外失败;本轮为跟进轮(上轮 head 99736ac,新 head 增加一个 docs commit;base 从 d6c0390 前进到 1804683),所有测量均在新 head 重新执行,未沿用上轮数值。
  • A/B 结论(见 "Central claim" 表,见证 01-ab-head-vs-base-daemons.png):head 守护进程通告 standalone_session_options_v1GET /standalone/session-options 返回 200(含已配置模型目录、省略 workspaceCwd/acpChannelLive、任意 query 400、读取不产生任何文件/会话);base 守护进程同请求 404 且能力缺失(32/32)。
  • 浏览器 E2E(17/17,0610):新 standalone 页在创建会话前即显示模型 chip 与完整选择器;选择非默认模型后首个 prompt 恰好一次 POST /standalone/sessions,携带稳定 sessionId、所选 modelServiceId、approvalMode,无 cwd/workspaceCwd,无后续 model-switch,且本轮 prompt 真实完成了助手回复(上轮因配额未能验证);head UI 对 base 守护进程时选择器保持空、create 不带 modelServiceId。
  • 上轮 findings 状态:F1(容器默认目录被 composer 隐藏)— 未复现/被取代(本轮显式配置可见 provider,行为由 App.test.tsx 全量 657 绿 + M10 突变钉住);F2(prompt 回复未验证)— 已解决(真实助手回复);F3(SDK bundle 超软阈值 +2,506 B)— 仍成立,非阻塞、作者已披露,数值与 PR 描述完全一致。
  • 突变矩阵:10 个守卫逐一回退均被其目标测试杀死(0 存活,03-mutation-matrix.png)。
  • Findings:无阻塞项;3 条非阻塞观察(modelProviders 条目需显式 envKey 否则 spawn 报可操作的凭证错误——预置行为、两侧对称;docs feature 列表为既有 curated 列表,PR 增量精确;--bare 跳过 settings.json 的复现注意事项)。
  • 未覆盖:per-commit 归因(浅克隆边界,99736ac 本地不可达);Windows/macOS 浏览器与 workspace/Live 等流程(作者声明范围外)。

Follow-up round: previous-finding status

# finding (round 1) severity status at 41d74d8 note
F1 container default catalog is composer-hidden (env, not defect) non-blocking superseded not re-observed: this round configured visible modelProviders.openai entries; the composer-hidden path is pinned by the full App.test.tsx (657 green) and M10 kill. Agree it was environmental.
F2 first-prompt response unverified (upstream quota) non-blocking fixed this round the first prompt completed with a real assistant response through the lane's loopback backend (NOTE prompt turn outcome: assistant-response, 08-e2e-head-after-first-prompt.png).
F3 SDK browser bundle +2,506 B over pre-existing warn-only threshold non-blocking stands re-measured at the new head/base: 224,830 B / 222,324 B / Δ 2,506 B — identical to the PR body's numbers; threshold pre-existing and warn-only (base build itself warns). Author-disclosed.
flakiness gate timeout (workflow gate, no signal) n/a n/a workflow-owned gate; not re-run here. Matrix controls ran every affected suite green 1–2× this round.

Delta since round 1: one docs-only commit (41d74d8, "docs(serve): document standalone_session_options_v1 capability"; the aggregate diff contains exactly three docs files beyond round 1's code surface). The base also advanced (d6c03901804683); the shallow checkout cannot diff old-base vs new-base, so closure carry-forward is unprovable and every measurement below was re-run at the new head — nothing was carried by hash.

Scope

Central claim: a fresh standalone Web Shell page loads the model catalog before any session exists, via the capability-gated read-only GET /standalone/session-options, and the first standalone prompt sends the selected model atomically in the create request instead of a best-effort post-attach switch.

Secondary claims: (1) the endpoint is read-only, rejects any query input, redacts the internal Conversations path/ACP state, and fails closed on runtime-ownership mismatch; (2) old daemons and failed option reads keep the old behavior (picker empty, daemon default at create) because the SDK gates on standalone_session_options_v1 before calling the route.

Central claim — A/B against the base build (re-run at new base 1804683)

Real daemons: head = packages/cli/dist at the merge HEAD; base = worktree at HEAD^1 rebuilt there (tsc --build --noCheck + copy_files, pre-PR verified: 0 occurrences of the route/capability strings in base dist vs 2/5 in head). Control cleanliness asserted: every @qwen-code/* workspace dep of the CLI is byte-identical HEAD^1..HEAD (PR touches only cli/sdk/web-shell/docs), readlink -f node_modules/@qwen-code/* points into the head tree, root manifests unchanged, and the daemon path never imports @qwen-code/sdk (only channel commands do, dynamically). Witness: 01-ab-head-vs-base-daemons.png; raw logs logs/ab-run-*.log, logs/daemon-*.log.

cell environment oracle result
head capability daemon @​ head GET /capabilities features standalone_session_options_v1 present
head options daemon @​ head GET /standalone/session-options 200, v=1, initialized=true, providers array
head catalog daemon @​ head, configured modelProviders.openai provider cell models verify-model-a(openai), verify-model-b(openai) listed
head redaction daemon @​ head body keys + serialized text no workspaceCwd, no acpChannelLive, no absolute path
head no-side-effect daemon @​ head, fresh HOME tree snapshot + GET /standalone/sessions before/after identical tree; 0 → 0 sessions
head input guard daemon @​ head ?cwd=, ?workspaceCwd=, ?bogus= 400 each
head parity daemon @​ head options vs GET /workspace/providers equal minus exactly {workspaceCwd, acpChannelLive}
head atomic create daemon @​ head POST /standalone/sessions with modelServiceId 200, sessionId echoed, list 0 → 1
base capability daemon @​ base GET /capabilities feature absent
base options daemon @​ base GET /standalone/session-options 404 (the A/B flip)
capability delta both features set diff exactly {standalone_session_options_v1} added, nothing removed
base parity daemon @​ base list + create with modelServiceId intact (200; 0 → 1)

32/32 (run twice, plus the captured run).

Wire oracle — real SDK against real daemons and decoy peers (02-sdk-wire-oracle.png)

Real built DaemonClient (head SDK dist): vs the real base daemon it rejects with DaemonCapabilityMissingError naming standalone_session_options_v1; vs the real head daemon it resolves with v=1 + providers. Against a decoy peer that advertises no capability but happily serves the route, the SDK rejects with 0 route hits (gate checked before the call). Against a decoy advertising the capability, 10 malformed payloads (leaked workspaceCwd/acpChannelLive, v:2, null providers, wrong kind, string isCurrent, zero contextLimit, bogus approvalMode, non-array errors, numeric initialized) each reject with the specific DaemonStandaloneProtocolError, and the valid payload round-trips byte-identical. 18/18.

Reviewer Test Plan walk — browser E2E (0610)

Real Chromium (lane-pinned Playwright) against real daemons serving the built Web Shell; request/response traffic captured per page.

plan step result
fresh /?context=standalone shows current model + list before any session PASS — exactly 1× GET /standalone/session-options (200), 0× POST /standalone/sessions; chip shows qwen3.8-max (06-e2e-head-fresh-standalone.png)
open picker: both configured models listed; selecting creates no session PASS — picker lists Verify Model A/B; selection updates; 0 creates (07-e2e-head-picker-open.png)
first prompt: single create with stable id, selected modelServiceId, approval mode, no cwd/workspaceCwd, no follow-up switch PASS — exactly 1 create {"sessionId":"<uuid>","modelServiceId":"verify-model-b(openai)","approvalMode":"auto"} → 200; 0× POST /session/:id/model; turn completed with a real assistant response (08, 10)
older daemon: picker stays empty, create uses daemon default PASS — head UI @​ base daemon: 0 option calls, no model chip (09-e2e-base-picker-empty.png), create body without modelServiceId

17/17.

Mutation matrix (vacuity) at new head (03-mutation-matrix.png)

Each guard reverted in place; its suite must go red with the intended assertion. Controls (unmutated) green first. 17/17 (7 controls + 10 kills), 0 survivors.

# guard suite result
M1 runtime-ownership check in getOptions() standalone-session-service.test.ts KILLED — "fails closed when provider status belongs to another runtime"
M2 route query-param rejection routes/standalone-sessions.test.ts KILLED — "returns session options without accepting workspace inputs"
M3 SDK reject of leaked workspace internals DaemonClientStandalone.test.ts KILLED — "rejects malformed standalone options" (1 red of 24)
M4 models hydration from options DaemonSessionProvider.test.tsx KILLED — "hydrates models for a deferred standalone session without creating it"
M5 stale/abort guard after options fetch DaemonSessionProvider.test.tsx KILLED — "does not publish stale standalone options after switching contexts"
M6 capability gate before fetching options DaemonSessionProvider.test.tsx KILLED — "updates an empty controlled provider when its session context changes"
M7 skip post-attach setModel for standalone sessionPreparation.test.ts KILLED — "creates standalone sessions without workspace-only fields"
M8 persist:false reasoning for standalone sessionPreparation.test.ts KILLED — same test
M9 reject per-call modelServiceId for workspace create actions.test.ts KILLED — "rejects a per-call model for workspace creation"
M10 hide composer model action when no models App.test.tsx KILLED — "hides the empty model picker until standalone options are available"

Targeted gates (full files; PR's CI covers the rest)

suite result
cli standalone-session-service.test.ts 91/91
cli routes/standalone-sessions.test.ts 25/25
cli server.test.ts (full) 1166/1166
sdk DaemonClientStandalone.test.ts 24/24
sdk daemon-public-surface.test.ts 20/20
web-shell DaemonSessionProvider.test.tsx 276/276
web-shell sessionPreparation.test.ts 21/21
web-shell actions.test.ts 144/144
web-shell App.test.tsx (full) 657/657

Docs delta vs code (04-docs-delta-vs-code.png, 05-bundle-size-head-vs-base.png)

  • 00-index.md claims 148 registered / 42 conditional tags and SERVE_PROTOCOL_VERSION='v1'; compiled registry has exactly 148/42 and base dist has 147 (since: 'v1' count) — the +1/+1 increment is exact.
  • The protocol doc's feature-list block is a pre-existing curated list (106 of 147 base tags; 41 omissions identical on both arms). The PR's delta to it is exact: adds standalone_session_options_v1 immediately after standalone_sessions_v1, removes nothing, every listed tag is a real registry key.
  • Conditional predicate equivalence holds: standalone_session_options_v1 and standalone_sessions_v1 agree on all toggle sets (docs say "same condition as standalone_sessions_v1").
  • Route table row matches observed behavior: any query → 400; response {v, initialized, current?, approvalMode?, providers, errors?} with internals omitted (the A/B cells).
  • Design-doc boundary statements (read-only, no cwd/workspaceCwd, no session/dir creation, fail closed, missing capability doesn't block prompt) all present and each behaviorally proven above. 25/25.
  • Bundle: head dist/daemon/index.js = 224,830 B; base rebuilt = 222,324 B; Δ = 2,506 B — all three numbers exactly as stated in the PR body; the 221,184 B warning threshold is pre-existing (base build warns). 4/4.

Findings (non-blocking)

  1. Pre-existing config behavior, not a PR defect: modelProviders entries need explicit credentials. A settings entry without envKey (e.g. {id:'verify-model-b'}) makes the spawned session fail at generation with the actionable error Missing credentials for modelProviders model 'verify-model-b'. Configure modelProviders.openai[].envKey and set that environment variable. and POST /standalone/sessions returns 500 standalone_creation_outcome_unknown. Reproduced identically on head and base (symmetric), so it predates the PR and the error message already tells the user the fix. Noted because the new options endpoint makes configured-but-credential-less models more visible in the picker.
  2. Docs feature-list block remains curated, not exhaustive — 41 of 148 registry tags are not listed (identical at base). The PR's one-line addition is correct; the pre-existing gap is a docs-maintenance observation, not this PR's debt.
  3. Reproduction note: qwen serve --bare skips settings.json entirely (createMinimalSettings), so any harness verifying the catalog must boot with --safe-mode only and pin QWEN_HOME (the lane exports a QWEN_HOME that otherwise overrides ~/.qwen).

Not covered

  • Per-commit attribution: the shallow checkout reaches only the merge commit, HEAD^1, HEAD^2; git rev-list HEAD^1..HEAD^2 returns 1 while the snapshot lists 2 commits (99736ac unreachable). Verified the aggregate HEAD^1..HEAD diff; per-commit attribution out of reach.
  • Prompt completion with a proxy-unknown model (verify-model-b): the create orchestration and atomic model-at-create were fully observed, but the lane proxy only serves its own model, so a turn completing on a settings-only model id is not reproducible here; the completing turn ran on the env-declared model. The failure mode for an unknown model is the pre-existing actionable credential/model error (Finding 1), not a silent fallback.
  • Windows/macOS browsers; workspace, Live, Recents, uploads, channel flows (author-declared out of scope).
  • Full repo-wide test/lint/typecheck suites (PR's own CI covers them; targeted suites above all green).

Methodology

Environment: CI verify container (node:22-bookworm), builds pre-installed at HEAD; scratch worktree under tmp/ removed after capture; daemons booted with isolated HOME/QWEN_HOME and the lane's loopback OpenAI-compatible backend for session auth. Harnesses (harness/*.mjs) are mock-free: real HTTP against real head/base daemons, real built SDK DaemonClient, real Chromium driving the Web Shell each daemon serves, loopback decoy peers for gate/validation cells. Every assertion is a scripted comparison; expected reds (mutation kills, base-arm 404) are encoded as passes; intermediate harness-locator fixes during this round were harness bugs, not product behavior, and final runs are what the counts report. Raw logs in logs/, captures in evidence/. Assertion totals: harness checks 113 (A/B 32, wire 18, matrix 17, docs 25, bundle 4, E2E 17) + vitest tests 2,424 = 2,537.

Flakiness gate log

rounds=5 files=9 skipped=0
file packages/cli/src/serve/conversations/standalone-session-service.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/conversations/standalone-session-service.test.ts
file packages/cli/src/serve/routes/standalone-sessions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/routes/standalone-sessions.test.ts
file packages/cli/src/serve/server.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/server.test.ts
file packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/DaemonClientStandalone.test.ts
file packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/daemon-public-surface.test.ts
file packages/web-shell/client/App.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/App.test.tsx
file packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/daemon/session/DaemonSessionProvider.test.tsx
file packages/web-shell/client/daemon/session/actions.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/daemon/session/actions.test.ts
file packages/web-shell/client/utils/sessionPreparation.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/utils/sessionPreparation.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/serve/conversations/standalone-session-service.test.ts: PPPPP
  packages/cli/src/serve/routes/standalone-sessions.test.ts: PPPP
  packages/cli/src/serve/server.test.ts: PPPP
  packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: PPPP
  packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: PPPP
  packages/web-shell/client/App.test.tsx: PPPP
  packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: PPPP
  packages/web-shell/client/daemon/session/actions.test.ts: PPPP
  packages/web-shell/client/utils/sessionPreparation.test.ts: PPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/serve/conversations/standalone-session-service.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/routes/standalone-sessions.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/daemon/session/actions.test.ts: P (exit 0)
round 1 · packages/web-shell/client/utils/sessionPreparation.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/conversations/standalone-session-service.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/routes/standalone-sessions.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/daemon/session/actions.test.ts: P (exit 0)
round 2 · packages/web-shell/client/utils/sessionPreparation.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/conversations/standalone-session-service.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/routes/standalone-sessions.test.ts: P (exit 0)
round 3 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 3 · packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: P (exit 0)
round 3 · packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: P (exit 0)
round 3 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/daemon/session/actions.test.ts: P (exit 0)
round 3 · packages/web-shell/client/utils/sessionPreparation.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/conversations/standalone-session-service.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/routes/standalone-sessions.test.ts: P (exit 0)
round 4 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 4 · packages/sdk-typescript/test/unit/DaemonClientStandalone.test.ts: P (exit 0)
round 4 · packages/sdk-typescript/test/unit/daemon-public-surface.test.ts: P (exit 0)
round 4 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/daemon/session/actions.test.ts: P (exit 0)
round 4 · packages/web-shell/client/utils/sessionPreparation.test.ts: P (exit 0)
round 5 · packages/cli/src/serve/conversations/standalone-session-service.test.ts: P (exit 0)

Evidence images

01-ab-head-vs-base-daemons

02-sdk-wire-oracle

03-mutation-matrix

04-docs-delta-vs-code

05-bundle-size-head-vs-base

06-e2e-head-fresh-standalone

07-e2e-head-picker-open

08-e2e-head-after-first-prompt

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

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — packages/cli unit suite did not complete (infrastructure time budget on this machine); packages/web-shell full-suite run failed under an environment load storm with attribution unresolved (175 timeouts across 26 files; the diff-touched DaemonSessionProvider.test.tsx passed 276/276 in isolation; sdk-typescript, qwen-live and webui suites all pass).

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

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

中文说明

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

未审查:build-and-test — packages/cli unit suite did not complete (infrastructure time budget on this machine); packages/web-shell full-suite run failed under an environment load storm with attribution unresolved (175 timeouts across 26 files; the diff-touched DaemonSessionProvider.test.tsx passed 276/276 in isolation; sdk-typescript, qwen-live and webui suites all pass)。

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

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

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

Comment on lines +151 to 152
if (modelId && sessionContext?.kind !== 'standalone') {
preparationStep = 'set model for new session';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R1-1: [certifies-falsely] [new-surface] The first standalone prompt can run on a model the user did not select. The daemon applies the create-time modelServiceId best-effort — applyModelServiceId(...).catch(() => {}) in packages/acp-bridge/src/bridge.ts ("session stays operational on the agent's default model"), while the approvalMode block directly below IS fail-closed — and this diff removes the post-attach setModel for standalone, which was the only step that could observe that failure. A user who picks a model plus a model-bound reasoning effort on a fresh standalone page and submits the first prompt: if the spawn-time switch fails (a setSessionModel timeout, the transport closing mid-switch, or the agent rejecting the id after the catalog drifted), the create still succeeds and carries no model confirmation, setReasoningEffort(..., { persist: false }) is applied on top, and the prompt runs on the daemon default while the composer shows the selection — exactly the outcome this PR's description says it eliminates. The workspace path fails closed in the identical case.

Witness:

npx vitest run src/bridge.test.ts -t "keeps the session alive on model-switch failure" -> 1 passed
(spawn with a rejected modelServiceId resolves successfully; session.attached === false, sessionCount === 1;
 sole signal: model_switch_failed bus event)
sessionPreparation.test.ts -> 21 passed, incl. expect(actions.setModel).not.toHaveBeenCalled()
BASE (merge base 431ff3a11f): standalone ran the post-attach setModel; its catch rethrew when a reasoning
 effort was bound (release + clear) — the observation point this diff removes

Suggested fix: surface the model-apply outcome to the client (e.g. a modelApplied flag or the effective model in the create response / DaemonStandaloneSession) and treat a not-applied model like the workspace setModel failure — throw when a reasoning effort is bound (releasing the session), warn-and-continue otherwise; do not make the daemon tear the session down on a model failure. Also update the new comment above, which asserts a guarantee the create route does not provide.

Note the swallow is deliberate (bridge.ts: "Already published model_switch_failed; session stays operational on the agent's default model") — the fix must keep the session alive and the event on the bus rather than failing the create, and the design doc requires reasoning applied post-attach with persist: false for standalone. Acceptance: add a sessionPreparation.test.ts case where the standalone create succeeds but the session lands on a different model, asserting the prepare rejects and the session is released/cleared — deleting that verification must turn it red.

中文说明

首次 standalone prompt 可能运行在用户未选择的模型上。守护进程对创建请求中的 modelServiceId 只做尽力而为的应用 —— packages/acp-bridge/src/bridge.ts 中的 applyModelServiceId(...).catch(() => {})("会话保持可用,运行在 agent 默认模型上"),而紧随其后的 approvalMode 应用却是失败即关闭的(fail-closed);同时本 diff 移除了 standalone 路径 attach 后的 setModel —— 那是唯一能观察到上述切换失败的步骤。用户在新的空白 standalone 页面选好模型和与模型绑定的思考强度后提交首条 prompt:若 spawn 阶段的切换失败(setSessionModel 超时、切换过程中传输关闭、或目录漂移后 agent 拒绝该模型 id),创建仍然成功且响应中不含模型确认,setReasoningEffort(..., { persist: false }) 照常应用,首条 prompt 运行在守护进程默认模型上,而编辑器仍显示所选模型 —— 这正是本 PR 描述声称要消除的结果。workspace 路径在相同情形下是失败即关闭的。

证据:仓库契约测试 keeps the session alive on model-switch failure 在本提交通过(携带被拒绝 modelServiceId 的 spawn 成功返回,唯一信号是 model_switch_failed 事件);sessionPreparation.test.ts 21 项通过,其中包含 expect(actions.setModel).not.toHaveBeenCalled();merge base 处的旧代码中,standalone 路径在 attach 后会执行 setModel,且绑定了思考强度时其 catch 会重新抛出(释放并清理会话)—— 即本 diff 移除的观察点。

建议:把模型应用结果暴露给客户端(如创建响应中增加 modelApplied 标志或实际生效的模型),对未应用的模型按 workspace 路径 setModel 失败处理 —— 绑定了思考强度时抛出(释放会话),否则警告并继续;不要让守护进程因模型失败而销毁会话。同时更新上方新增注释,它断言了创建路由并不提供的保证。注意该吞错是有意为之(见 bridge.ts 注释),修复应保持会话存活与事件发布,并保留设计文档要求的 persist: false。验收:新增 standalone 创建成功但会话落在不同模型的测试用例,断言准备阶段拒绝并释放/清理会话;移除该验证应使测试变红。

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

Comment on lines +11559 to +11561
!connectionRef.current.sessionId &&
effectiveSessionContext?.kind === 'standalone' &&
(connectionRef.current.models?.length ?? 0) === 0

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-2: The three new "no selectable models" gates use divergent predicates. This /model slash-command guard counts raw connectionRef.current.models, while the composer-toolbar filter (~line 13332) and the StatusBar onSelectModel gate (~line 15876) count availableModels, which is connection.models filtered through isVisibleComposerModel. A deferred standalone draft whose hydrated catalog contains only hidden entries — coder-model(qwen-oauth) (HIDDEN_COMPOSER_MODEL_IDS); the default qwen-oauth-only daemon catalog is exactly that one entry — then hides the model action in the toolbar and toasts model.unavailable from the StatusBar, but /model sees raw length 1 > 0 and opens ModelDialog, which reads connection.models UNFILTERED and lists the hidden internal model; selecting it goes through selectWelcomeModel, so the hidden "must not be user-selectable" entry becomes the modelServiceId of the next standalone create.

Witness:

PROBE-G2 hidden-only {"rawModels":["coder-model(qwen-oauth)"],"toolbarHasModel":false,"slashModelDialogOpen":true}
with the suggested predicate patched in: {"slashModelDialogOpen":false} — flips

Suggested fix: use one predicate at all three gates — e.g. !(connectionRef.current.models ?? []).some(isVisibleComposerModel) here, or extract a single shared helper used by all three sites.

The visibility decision must reuse isVisibleComposerModel (packages/web-shell/client/utils/composerModels.ts:15), the shared predicate already used by the composer pickers — not a second hand-copied ID list. Acceptance: an App.test.tsx case with mockConnection.models = [{ id: 'coder-model(qwen-oauth)' }], no sessionId, standalone context — submitting /model must toast and must not open the model dialog; reverting to the raw-length check makes it red.

中文说明

三个新的"无可选择模型"门禁使用了不一致的判定条件。这个 /model 斜杠命令门禁统计的是原始 connectionRef.current.models,而工具栏过滤器(约 13332 行)与 StatusBar 的 onSelectModel 门禁(约 15876 行)统计的是经过 isVisibleComposerModel 过滤后的 availableModels。当一个延迟创建的 standalone 草稿水合出的模型目录只包含被隐藏的条目 —— coder-model(qwen-oauth)HIDDEN_COMPOSER_MODEL_IDS);默认仅 qwen-oauth 的守护进程目录恰好只有这一个条目 —— 工具栏会隐藏模型入口、StatusBar 会弹出 model.unavailable 提示,但 /model 看到原始列表长度为 1 > 0,会打开未经过滤的 ModelDialog,列出这个被隐藏的内部模型;选择它会经由 selectWelcomeModel 使这个"不可被用户选择"的条目成为下一次 standalone 创建的 modelServiceId

证据:探针(仅隐藏模型的目录)显示工具栏隐藏了模型入口而 /model 打开了对话框;打上建议的判定后翻转为不打开。

建议:三处门禁使用同一判定 —— 例如这里改用 !(connectionRef.current.models ?? []).some(isVisibleComposerModel),或抽取一个三处共用的辅助函数。可见性判定必须复用 isVisibleComposerModelpackages/web-shell/client/utils/composerModels.ts:15),而不是再复制一份隐藏 ID 列表。验收:新增 App.test.tsx 用例(standalone、无 sessionId、models 仅含隐藏条目),提交 /model 应弹出提示且不打开模型对话框;改回原始长度判断应使测试变红。

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

Comment on lines +4008 to +4010
const modelServiceId =
overrides?.modelServiceId ??
createSessionRequestRef.current?.modelServiceId;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-3: The new precedence "per-call override wins over the createSessionRequest default" is not pinned by any test — no existing test sets both operands, so inverting the ?? operands leaves the whole suite green. A host that embeds a default model via the createSessionRequest prop (the hydration path this PR exists for) while the user picks a different model for the first prompt: a future edit inverting the operands silently calls createStandalone with the host default instead of the user's pick — the exact regression this PR fixes.

Witness:

Mutation (operands inverted): DaemonSessionProvider.test.tsx -> 276 passed (276) — ships green
Suggested test as probe: FAILED against the mutant (createStandalone received 'host-default'),
PASSED against intact code

Suggested fix: add a provider-level test — render with createSessionRequest={{ modelServiceId: 'host-default' }}, call actions.createSession({ sessionContext: { kind: 'standalone' }, modelServiceId: 'picked' }), and assert createStandalone received { modelServiceId: 'picked' } (optionally a second assertion that omitting the override sends 'host-default', which is also currently unpinned).

The fallback operand must keep sending the prop default when no override is given (createSessionRequestRef.current = createSessionRequest at line ~1084 tracks the host prop, and the pre-change code sent it whenever defined). Acceptance: the new test must go RED when the ?? operands are inverted.

中文说明

新的优先级"单次调用覆盖优先于 createSessionRequest 默认值"没有任何测试钉住 —— 现有测试没有同时设置两个操作数,因此把 ?? 的两个操作数颠倒,整个测试套件依然是绿的。宿主通过 createSessionRequest 属性内嵌默认模型(正是本 PR 存在的水合路径),而用户为首条 prompt 选择了不同模型时:未来某次编辑若颠倒操作数,会悄悄用宿主默认值而非用户所选调用 createStandalone —— 正是本 PR 要修复的回归。

证据:突变(颠倒操作数)下 DaemonSessionProvider.test.tsx 276/276 全绿;建议的测试作为探针在该突变下失败(createStandalone 收到 'host-default'),在完整代码下通过。

建议:新增 provider 级测试 —— 以 createSessionRequest={{ modelServiceId: 'host-default' }} 渲染,调用 actions.createSession({ sessionContext: { kind: 'standalone' }, modelServiceId: 'picked' }),断言 createStandalone 收到 { modelServiceId: 'picked' }(可再断言不提供覆盖时发送 'host-default',该分支目前同样未被钉住)。回退操作数必须保留"无覆盖时发送属性默认值"的行为。验收:颠倒 ?? 操作数时新测试必须变红。

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

Comment on lines +492 to +494
async getOptions(): Promise<StandaloneSessionOptions> {
const runtime = await this.options.ensureRuntime();
return this.options.runRuntimeActivity(runtime, async () => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-4: getOptions()'s fail-closed guards for runtime quarantine/replacement — the three assertRuntimeCurrent(runtime) checks and the runRuntimeActivity lease — have no test; the design doc's "Runtime replacement, quarantine, or generation changes fail closed" is unpinned for this operation. The harness's assertRuntimeCurrent already throws conversation_runtime_unavailable once quarantineRuntime has run, but no test quarantines and then calls getOptions(); runRuntimeActivity is an inline pass-through in the harness. Deleting all three assertions (or unwrapping the lease) ships green, so a later edit could serve the model catalog from a quarantined or replaced runtime — returning provider status from the wrong runtime generation instead of failing closed. Every other operation in this file has quarantine coverage, so the pattern is established.

Witness:

Mutation (all three assertRuntimeCurrent calls deleted + lease unwrapped):
standalone-session-service.test.ts -> 91 passed (91) — ships green
Suggested quarantine test as probe: FAILED against the mutant, PASSED against intact code

Suggested fix: mirror the existing create-path quarantine test (pattern at standalone-session-service.test.ts:520): await harness.quarantineRuntime(harness.runtime), then await expect(harness.service.getOptions()).rejects.toMatchObject({ code: 'conversation_runtime_unavailable' }).

The harness throws with code 'conversation_runtime_unavailable' when quarantined (test lines 236-240) — the new test must expect that code, not the ownership code. Acceptance: the new test must go RED if the assertRuntimeCurrent calls are removed from getOptions().

中文说明

getOptions() 针对运行时隔离/替换的失败即关闭守卫 —— 三处 assertRuntimeCurrent(runtime) 检查与 runRuntimeActivity 租约 —— 没有测试;设计文档中"运行时替换、隔离或代际变化须失败即关闭"对该操作未被钉住。测试夹具的 assertRuntimeCurrentquarantineRuntime 之后已会抛出 conversation_runtime_unavailable,但没有测试先隔离再调用 getOptions()runRuntimeActivity 在夹具中只是直通。删除全部三处断言(或解开租约)后套件仍然全绿,因此后续编辑可能从被隔离或已替换的运行时提供模型目录 —— 返回错误代际的 provider 状态而不是失败即关闭。该文件中其他所有操作都有隔离覆盖,模式是现成的。

证据:突变(删除三处断言并解开租约)下 91/91 全绿;建议的隔离测试作为探针在该突变下失败、在完整代码下通过。

建议:仿照现有创建路径的隔离测试(standalone-session-service.test.ts:520 处的模式):先 await harness.quarantineRuntime(harness.runtime),再 await expect(harness.service.getOptions()).rejects.toMatchObject({ code: 'conversation_runtime_unavailable' })。夹具有隔离时抛出的错误码是 conversation_runtime_unavailable(而非所有权错误码),新测试须断言该错误码。验收:从 getOptions() 移除这些断言时新测试必须变红。

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

Comment on lines 1576 to +1579
createDetachedStandaloneSession({
...(options?.modelServiceId !== undefined
? { modelServiceId: options.modelServiceId }
: {}),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-5: Of the two createDetachedStandaloneSession call sites that forward the new modelServiceId override, only the no-active-session branch (~line 1613) is tested with a model; this active-session branch is exercised only with approvalMode ('returns a detached standalone result without replacing an active session'). Removing the forwarding here would keep the whole suite green. No production caller passes modelServiceId through this branch today (sessionPreparation is the sole setter and runs only without an active session), so the cost is latent: the first caller that does — e.g. a menu-driven "new standalone session" carrying the selected model — would silently drop the selection and run on the daemon default, with no test going red.

Witness:

Mutation (modelServiceId spread dropped from the active-session branch only):
actions.test.ts -> 144 passed (144)
Extending the active-session test with modelServiceId: FAILED against the mutant, PASSED intact

Suggested fix: extend the active-session test to pass modelServiceId and assert expect(createDetachedStandaloneSession).toHaveBeenCalledWith({ approvalMode: 'yolo', modelServiceId: 'qwen3.8-max(USE_OPENAI)' }).

Acceptance: the extended assertion goes RED if this branch stops forwarding options.modelServiceId while the detached-branch test stays green — proving the two sites are independently pinned.

中文说明

转发新增 modelServiceId 覆盖的两个 createDetachedStandaloneSession 调用点中,只有无活动会话分支(约 1613 行)用模型测试过;这个活动会话分支只用 approvalMode 测试('returns a detached standalone result without replacing an active session')。删除这里的转发,整个套件依然全绿。目前没有生产调用方通过该分支传 modelServiceId(sessionPreparation 是唯一设置者且只在无活动会话时运行),所以代价是潜在的:第一个这样做的调用方 —— 例如携带所选模型的菜单式"新建 standalone 会话" —— 会悄悄丢弃选择、运行在守护进程默认模型上,且没有任何测试变红。

证据:突变(仅删除活动会话分支的展开)下 actions.test.ts 144/144 全绿;为活动会话测试补上 modelServiceId 后,在突变下失败、在完整代码下通过。

建议:扩展活动会话测试传入 modelServiceId,断言 createDetachedStandaloneSession 收到 { approvalMode: 'yolo', modelServiceId: 'qwen3.8-max(USE_OPENAI)' }。验收:该分支停止转发时扩展断言变红,而无活动会话分支的测试保持绿色 —— 证明两个调用点被独立钉住。

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

Comment on lines +1588 to +1590
).toHaveBeenCalledWith(expect.anything(), {
modelServiceId: 'qwen3.8-max(USE_OPENAI)',
});

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-7: 'creates a fresh standalone session without the generic route' previously asserted createStandalone toHaveBeenCalledOnce(); this diff replaced that with an args-only assertion, dropping the call-count pin without needing to (the old count assertion passes equally for the new call shape). A regression that issues createStandalone twice with identical arguments on the direct-create path — e.g. a reintroduced automatic retry, which the design doc explicitly rules out ("no-automatic-retry behavior") — would have failed this test and now passes, because toHaveBeenCalledWith is satisfied by any matching call. Sibling tests (lines 1646, 1685, 1798, 1877, 1911) still assert toHaveBeenCalledOnce(), so this is a one-off loss, not a deliberate rebalancing.

Witness:

Faithful double-create mutation (both calls succeed, identical args):
PROBE-G7 {"createStandaloneCalls":2} — the PR's args-only assertion PASSES
PROBE-G7-OLD-ASSERTION-WOULD-FAIL: called 2 times

Suggested fix: keep the new args assertion and additionally restore expect(sdkMocks.MockDaemonSessionClient.createStandalone).toHaveBeenCalledOnce(). Acceptance: the restored count assertion goes red under a double-create mutation that the current assertion tolerates.

中文说明

'creates a fresh standalone session without the generic route' 原先断言 createStandalone toHaveBeenCalledOnce();本 diff 将其替换为仅断言参数的调用,不必要地丢掉了调用次数钉住(旧的次数断言对新的调用形态同样成立)。若直接创建路径上出现以相同参数发出两次 createStandalone 的回归 —— 例如重新引入自动重试(设计文档明确排除:"no-automatic-retry behavior")—— 旧测试会失败,而现在会通过,因为 toHaveBeenCalledWith 对任何匹配的调用都成立。同组测试(1646、1685、1798、1877、1911 行)仍然断言 toHaveBeenCalledOnce(),因此这是个别丢失,而非有意的再平衡。

证据:忠实的双次创建突变(两次调用都成功、参数相同)下,PR 的参数断言通过,而旧的次数断言失败(called 2 times)。

建议:保留新的参数断言,同时恢复 expect(...createStandalone).toHaveBeenCalledOnce()。验收:当前断言容忍的双次创建突变下,恢复的次数断言变红。

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

Comment on lines +289 to +291
model['contextLimit'] <= 0)
) {
throw new DaemonStandaloneProtocolError(route, 'invalid contextLimit');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-8: The validator rejects the ENTIRE session-options payload when any single model has a non-positive contextLimit, but the daemon's own producer can emit exactly that, so one misconfigured model silently disables the whole pre-session model catalog. The producer computes contextLimit: model.contextWindowSize ?? tokenLimit(effectiveModelId) (packages/cli/src/serve/workspace-providers-status.ts:190) — ?? does not catch 0, and settingsSchema.ts admits contextWindowSize as a plain number with no positivity constraint (core treats non-positive values as reachable: provider-config.ts requires > 0, context-usage sites guard <= 0). A user with one model configured at contextWindowSize: 0: the options response carries contextLimit: 0, parseStandaloneSessionOptions throws, getStandaloneSessionOptions() rejects, and Web Shell's failure-tolerant fetch leaves the model fields empty — the picker stays hidden until the first prompt creates a session. The identical payload is tolerated in workspace mode, where workspaceProviders() casts without validation, so behavior diverges by session kind for identical config.

Witness:

Producer probe (generationConfig { contextWindowSize: 0 }): PROBE-G8-PRODUCER {"contextLimits":[1000000,0]}
SDK probe: zero/negative -> threw "malformed standalone-session response (invalid contextLimit)"; valid -> parsed
With the <= 0 clause removed: zero/negative -> parsed (flip)

Suggested fix: treat a non-positive contextLimit as absent instead of fatal (normalize non-positive values to undefined after validation, or drop the <= 0 clause), so one misconfigured model cannot sink the entire catalog.

The producer passes a user-configured value through verbatim and the SDK type declares contextLimit?: number — the fix must not assume the daemon always sends a positive number. Acceptance: a DaemonClientStandalone.test.ts case asserting getStandaloneSessionOptions() resolves when a model has contextLimit: 0 (it currently rejects).

中文说明

校验器在任一模型的 contextLimit 非正数时拒绝整个 session-options 载荷,但守护进程自己的生产者完全可能产出这种值,因此一个配置错误的模型会悄悄禁掉整个会话前模型目录。生产者计算 contextLimit: model.contextWindowSize ?? tokenLimit(effectiveModelId)packages/cli/src/serve/workspace-providers-status.ts:190)—— ?? 不会捕获 0,而 settingsSchema.ts 允许 contextWindowSize 为任意数字、无正数约束(core 也认为非正数可达:provider-config.ts 要求 > 0、若干上下文用量处守卫 <= 0)。用户把一个模型配置为 contextWindowSize: 0 时:options 响应携带 contextLimit: 0parseStandaloneSessionOptions 抛错,getStandaloneSessionOptions() 拒绝,Web Shell 的容错抓取把模型字段留空 —— 选择器一直隐藏到首条 prompt 创建会话。同样的载荷在 workspace 模式下被容忍(workspaceProviders() 不做校验直接断言),因此相同配置下行为按会话类型分叉。

证据:生产者探针(contextWindowSize: 0)输出 contextLimits:[1000000,0];SDK 探针对 0/负数抛出 'invalid contextLimit'、合法值正常解析;移除 <= 0 子句后 0/负数也能解析(翻转成立)。

建议:把非正 contextLimit 视为缺省而非致命错误(校验后归一化为 undefined,或去掉 <= 0 子句),使单个配置错误的模型不会拖垮整个目录。生产者原样透传用户配置值、SDK 类型声明 contextLimit?: number —— 修复不得假设守护进程总是发送正数。验收:新增 DaemonClientStandalone.test.ts 用例,断言模型 contextLimit: 0getStandaloneSessionOptions() 正常解析(当前会拒绝)。

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

Comment on lines +331 to +334
if (
options['workspaceCwd'] !== undefined ||
options['acpChannelLive'] !== undefined
) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-9: The SDK-side rejection of an acpChannelLive leak is untested: the malformed-option it.each cases in DaemonClientStandalone.test.ts include a workspaceCwd leak but no acpChannelLive case, and both disjuncts throw the identical message, so the workspaceCwd row passes even without the acpChannelLive check. A daemon that omits workspaceCwd but still returns acpChannelLive in the session-options response would pass SDK validation and be handed to Web Shell connection state, even though the protocol table for GET /standalone/session-options declares both internals omitted. The daemon-side redaction IS pinned by this PR's service tests, but the client-side enforcement of the same contract is only half-pinned.

Witness:

Baseline: 24 passed (24)
MUTANT (only the acpChannelLive disjunct deleted): 24 passed (24) — ships green
MUTANT + suggested row: 1 failed | 24 passed (25) — "promise resolved ... instead of rejecting"
Intact + suggested row: 25 passed (25)

Suggested fix: add one it.each row: [{ ...standaloneOptions(), acpChannelLive: false }, 'workspace internals']. Acceptance: that case goes RED if the options['acpChannelLive'] !== undefined disjunct is removed from parseStandaloneSessionOptions.

中文说明

SDK 侧对 acpChannelLive 泄漏的拒绝没有测试:DaemonClientStandalone.test.ts 的畸形载荷 it.each 用例包含 workspaceCwd 泄漏但没有 acpChannelLive 用例,且两个析取条件抛出的错误信息相同,因此即使没有 acpChannelLive 检查,workspaceCwd 用例行也能通过。一个省略了 workspaceCwd 却仍返回 acpChannelLive 的守护进程会通过 SDK 校验、进入 Web Shell 连接状态 —— 尽管 GET /standalone/session-options 的协议表声明两个内部字段都被省略。守护进程侧的脱敏由本 PR 的服务测试钉住,但同一契约在客户端侧的执行只被钉住了一半。

证据:基线 24/24 通过;突变(仅删除 acpChannelLive 析取)24/24 通过(可带病上线);突变 + 建议用例行 → 1 失败;完整代码 + 建议用例行 → 25/25 通过。

建议:新增一行 it.each[{ ...standaloneOptions(), acpChannelLive: false }, 'workspace internals']。验收:从 parseStandaloneSessionOptions 移除 options['acpChannelLive'] !== undefined 析取时该用例变红。

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

Comment on lines +395 to +398
if (options['errors'] !== undefined) {
if (!Array.isArray(options['errors'])) {
throw new DaemonStandaloneProtocolError(route, 'expected errors[]');
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-10: The validator's errors[] path and enum gates (status whitelist, approvalMode, initialized) have zero test coverage — distinct from the acpChannelLive gap. The happy-path fixture standaloneOptions() carries no errors key and no invalid enum value, so a mutant deleting the errors[] loop, flipping the status whitelist, or dropping the approvalMode check ships green. The branch matters exactly in the rare case: the daemon emits errors[] only on degraded paths — config warnings (workspace-providers-status.ts:225, status: 'warning' cells) and the settings-load catch branch (:241, initialized: false) — so a regression there means a misconfigured user's payload is either accepted unvalidated or wholly rejected: Web Shell hides the model picker AND swallows the diagnostic cell that would explain why.

Witness:

MUTANT-A (errors[] block deleted): 24 passed (24) — ships green
MUTANT-B ('warning' dropped from status whitelist): 24 passed (24) — ships green
MUTANT-A + suggested cases: 1 failed | 26 passed (27)
MUTANT-B + suggested cases: 1 failed | 26 passed (27)
Intact + suggested cases: 27 passed (27)

Suggested fix: extend the it.each with one resolve case whose payload includes errors: [{ kind: 'providers', status: 'warning', error: 'boom' }] plus reject cases for invalid cell status and invalid approvalMode (and optionally unknown errorKind / non-boolean initialized).

The resolve-case fixture must match the producer's actual cell shape { kind: 'providers', status: 'warning' | 'error', error: string } (workspace-providers-status.ts:225, :241). Acceptance: removing the errors[] loop or any enum gate must turn the corresponding case red.

中文说明

校验器的 errors[] 路径与枚举门禁(status 白名单、approvalModeinitialized)测试覆盖为零 —— 与 acpChannelLive 缺口相互独立。正常路径夹具 standaloneOptions() 不携带 errors 键、也没有非法枚举值,因此删除 errors[] 循环、翻转 status 白名单或去掉 approvalMode 检查的突变都能带病上线。该分支恰好在少见情形才有意义:守护进程只在降级路径发出 errors[] —— 配置告警(workspace-providers-status.ts:225status: 'warning')与设置加载的 catch 分支(:241initialized: false)—— 一旦回归,配置有误的用户的载荷要么未经校验被接受、要么整体被拒绝:Web Shell 隐藏模型选择器,同时吞掉本可解释原因的诊断单元。

证据:突变 A(删除 errors[] 块)与突变 B(白名单去掉 'warning')均 24/24 通过;分别加上建议用例后各有 1 例失败;完整代码加建议用例 27/27 通过。

建议:为 it.each 增加一个解析成功用例(载荷含 errors: [{ kind: 'providers', status: 'warning', error: 'boom' }])以及非法单元 status、非法 approvalMode 的拒绝用例(可选未知 errorKind / 非布尔 initialized)。解析成功用例的夹具须匹配生产者的实际单元形态 { kind: 'providers', status: 'warning' | 'error', error: string }。验收:移除 errors[] 循环或任一枚举门禁时,对应用例变红。

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

Comment on lines +351 to +357
for (const field of [
'authType',
'modelId',
'baseUrl',
'fastModelId',
'visionModelId',
]) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-11: The new parseStandaloneSessionOptions validates current.visionModelId, and the daemon genuinely emits it (buildCurrent in workspace-providers-status.ts; ServeWorkspaceProviderCurrent declares visionModelId?: string at packages/acp-bridge/src/status.ts:533) — but the published type backing the newly exported DaemonStandaloneSessionOptions, DaemonWorkspaceProviderCurrent (types.ts:1979-1984), declares only authType, modelId, baseUrl, fastModelId. A wire field the SDK vouches for is invisible to every typed consumer of the type this PR adds to the public surface: with visionModel set in workspace settings, an SDK consumer hydrating a standalone draft that wants the configured vision model reads options.current?.visionModelId and gets a TypeScript error — the field exists at runtime but not on the type — and must cast through unknown/any (defeating the validation the SDK just performed) or silently drop the value.

Witness:

tsc probe asserting 'visionModelId' is readable on DaemonStandaloneSessionOptions['current']:
intact PR -> error TS2322 (field absent from DaemonWorkspaceProviderCurrent)
with `visionModelId?: string;` added -> probe compiles clean; tsconfig.public-surface.json fence stays clean

Suggested fix: add visionModelId?: string; to DaemonWorkspaceProviderCurrent in packages/sdk-typescript/src/daemon/types.ts, plus a type-level assertion (expectTypeOf) in daemon-public-surface.test.ts.

The field must match the wire shape acp-bridge already declares (visionModelId?: string at status.ts:533). Acceptance: the type-level assertion fails to compile while the field is absent from the interface.

中文说明

新的 parseStandaloneSessionOptions 校验 current.visionModelId,守护进程也确实会发出该字段(workspace-providers-status.tsbuildCurrentpackages/acp-bridge/src/status.ts:533ServeWorkspaceProviderCurrent 声明 visionModelId?: string)—— 但新导出的 DaemonStandaloneSessionOptions 所依赖的公开类型 DaemonWorkspaceProviderCurrenttypes.ts:1979-1984)只声明了 authTypemodelIdbaseUrlfastModelId。SDK 已为之背书的一个线上字段,对本 PR 加入公开表面的这个类型的每个类型化消费者都不可见:工作区设置中配置了 visionModel 时,水合 standalone 草稿并想读取所配置视觉模型的 SDK 使用者读 options.current?.visionModelId 会得到 TypeScript 错误 —— 字段在运行时存在但类型上没有 —— 只能通过 unknown/any 强转(架空了 SDK 刚做的校验)或悄悄丢弃该值。

证据:tsc 探针断言 DaemonStandaloneSessionOptions['current'] 可读 'visionModelId':完整 PR 下报 TS2322;补上 visionModelId?: string; 后探针编译通过、public-surface 栅栏也保持干净。

建议:在 packages/sdk-typescript/src/daemon/types.tsDaemonWorkspaceProviderCurrent 中加入 visionModelId?: string;,并在 daemon-public-surface.test.ts 增加类型级断言(expectTypeOf)。字段形态须与 acp-bridge 已声明的线上一致(status.ts:533)。验收:接口缺少该字段时,类型级断言无法编译。

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

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

  • packages/web-shell/client/App.test.tsx:11001 — [probe] R2-3 new test assigns undefined to mockConnection.models but MockConnection declares it required (TS2322 under strict; typecheck excludes test files)
中文说明

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

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

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

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

// must never be applied after a failed switch to an unknown model.
if (modelId) {
if (modelId && sessionContext?.kind !== 'standalone') {
preparationStep = 'set model for new session';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R1-1: [certifies-falsely] [new-surface] Still stands at 2ddb0d39 (round 2, re-verified by probe): the first standalone prompt can run on a model the user did not select. The daemon applies the create-time modelServiceId best-effort (applyModelServiceId(...).catch(() => {}) in bridge.ts:5504-5514), and this diff removes the post-attach setModel that was the only step able to observe that failure — so a failed switch silently falls back to the daemon default while the composer shows the selection, and the reasoning effort is applied on top of the wrong model. The workspace path fails closed in the identical case.

Witness (round-2 probe, failing unstable_setSessionModel):

intact PR: spawnStandaloneSession({ modelServiceId: 'probe-model' }) RESOLVED; first replayed event model_switch_failed
mutant (catch removed): StandaloneSessionSpawnError at bridge.ts:9228 — the probe flips

Suggested fix: surface the model-apply outcome to the client (e.g. a modelApplied flag or the effective model in the create response) and treat a not-applied model like the workspace setModel failure — throw when a reasoning effort is bound (releasing the session), warn-and-continue otherwise; also update the new comment above, which asserts a guarantee the create route does not provide. The swallow is a deliberate shared-session contract pinned by bridge.test.ts:21361 (#3889 A05Ym) — the fix must keep the session alive and the event on the bus rather than failing the create. Acceptance: a sessionPreparation.test.ts case where the standalone create succeeds but the session lands on a different model must reject and release the session, and deleting that verification must turn it red.

中文说明

2ddb0d39 上仍然成立(第 2 轮,探针复验):首条 standalone prompt 可能运行在用户未选择的模型上。守护进程对创建请求中的 modelServiceId 只做尽力而为的应用(bridge.ts:5504-5514 中的 applyModelServiceId(...).catch(() => {})),而本 diff 移除了 attach 后的 setModel——那是唯一能观察到切换失败的步骤,因此切换失败时会静默回退到守护进程默认模型,编辑器仍显示所选模型,思考强度还会应用到错误的模型上。workspace 路径在相同情形下是失败即关闭的。建议:把模型应用结果暴露给客户端(如创建响应中的 modelApplied 标志或实际生效模型),对未应用的模型按 workspace setModel 失败处理——绑定思考强度时抛出(释放会话),否则警告并继续;同时更新上方新注释,它断言了创建路由并不提供的保证。注意该吞错是共享会话的有意契约(bridge.test.ts:21361 钉住,#3889 A05Ym)——修复应保持会话存活与事件发布。验收:新增"创建成功但落在不同模型"的用例,断言准备阶段拒绝并释放会话;删除该验证应变红。

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

if (
!connectionRef.current.sessionId &&
effectiveSessionContext?.kind === 'standalone' &&
(connectionRef.current.models?.length ?? 0) === 0

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-2: Still stands at 2ddb0d39 (round 2, re-verified by probe): the three "no selectable models" gates remain divergent — this /model guard counts raw connectionRef.current.models, while the composer-toolbar filter (~13332) and the StatusBar onSelectModel gate (~15872) count the hidden-id-filtered availableModels. With a hidden-id-only catalog, /model opens the dialog while the other two surfaces show "unavailable". A single memoized predicate on the filtered list fixes it — the round-2 probe reproduces the divergence on the intact PR and flips when the guard is unified.

中文说明

2ddb0d39 上仍然成立(第 2 轮,探针复验):三处"无可选择模型"门禁仍然不一致——此 /model 守卫统计原始 connectionRef.current.models,而工具栏过滤(~13332)与 StatusBar onSelectModel 门禁(~15872)统计经隐藏 id 过滤的 availableModels。仅含隐藏 id 的模型列表下,/model 会打开对话框,而另外两处显示"不可用"。用基于过滤列表的单一 memo 谓词即可修复——第 2 轮探针在原始代码上复现了该分歧,统一门禁后翻转。

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

);
const modelServiceId =
overrides?.modelServiceId ??
createSessionRequestRef.current?.modelServiceId;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-3: Still stands at 2ddb0d39 (round 2, re-verified by probe): the override-precedence merge (overrides?.modelServiceId ?? createSessionRequestRef.current?.modelServiceId) still has no test with both sources populated — the operand-swap mutant leaves the whole suite green while the host's model silently wins over the user's selection. The fix is a provider test mirroring the approvalMode harness at :2638 with both operands set; it must go red on operand swap and on ref-only revert.

中文说明

2ddb0d39 上仍然成立(第 2 轮,探针复验):覆盖优先级合并(overrides?.modelServiceId ?? createSessionRequestRef.current?.modelServiceId)仍没有任何同时填充两个来源的测试——交换 ?? 操作数的突变体下整套测试仍为绿,而宿主模型会静默压过用户的选择。修复方式:仿照 :2638 的 approvalMode 用例新增同时设置两个操作数的 provider 测试;该测试在操作数互换或回退到仅读 ref 时应变红。

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


async getOptions(): Promise<StandaloneSessionOptions> {
const runtime = await this.options.ensureRuntime();
return this.options.runRuntimeActivity(runtime, async () => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-4: Still stands at 2ddb0d39 (round 2, re-verified by probe): getOptions()'s fail-closed guards for runtime quarantine/replacement — the three assertRuntimeCurrent(runtime) checks — still have no test. Deleting all three leaves the suite green (91/91); a quarantine probe flips both ways (intact rejects with conversation_runtime_unavailable, mutant resolves with the provider status). The harness already wires the quarantine path (test:235-241) — one test closes this.

中文说明

2ddb0d39 上仍然成立(第 2 轮,探针复验):getOptions() 针对运行时隔离/替换的失败即关闭守卫——三处 assertRuntimeCurrent(runtime)——仍然没有测试。删除全部三处后测试套件仍为绿(91/91);隔离探针双向翻转(原始代码以 conversation_runtime_unavailable 拒绝,突变体直接返回 provider status)。测试桩已接好隔离路径(test:235-241)——补一个用例即可闭合。

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

createDetachedStandaloneSession({
...(options?.modelServiceId !== undefined
? { modelServiceId: options.modelServiceId }
: {}),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-5: Still stands at 2ddb0d39 (round 2, re-verified by probe): of the two createDetachedStandaloneSession call sites forwarding modelServiceId, this active-session branch still has no arg assertion — removing the spread stays green (144/144), and a standalone create made while a session is attached would silently land on the daemon default model. The probe flips with an attached-session harness asserting the received args.

中文说明

2ddb0d39 上仍然成立(第 2 轮,探针复验):转发 modelServiceId 的两处 createDetachedStandaloneSession 调用点中,此活动会话分支仍然没有参数断言——删除该展开后测试仍为绿(144/144),且在已有会话附着时发起的 standalone 创建会静默落到守护进程默认模型。用带附着会话的测试桩断言收到的参数,探针即可翻转。

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

if (
options['workspaceCwd'] !== undefined ||
options['acpChannelLive'] !== undefined
) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-9: Still stands at 2ddb0d39 (round 2, re-verified by inspection): the SDK-side rejection of an acpChannelLive leak remains untested — the malformed-options it.each table covers a workspaceCwd leak but has no acpChannelLive case, so that disjunct of the guard (standalone-sessions.ts:331-334) can regress unseen. One row fixes it: [{ ...standaloneOptions(), acpChannelLive: true }, 'workspace internals'].

中文说明

2ddb0d39 上仍然成立(第 2 轮,检视复验):SDK 侧对 acpChannelLive 泄漏的拒绝仍然没有测试——畸形载荷 it.each 表覆盖了 workspaceCwd 泄漏,但没有 acpChannelLive 用例,因此该守卫(standalone-sessions.ts:331-334)的这一分支回归时不会被发现。补一行即可:[{ ...standaloneOptions(), acpChannelLive: true }, 'workspace internals']

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

if (options['errors'] !== undefined) {
if (!Array.isArray(options['errors'])) {
throw new DaemonStandaloneProtocolError(route, 'expected errors[]');
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-10: Still stands at 2ddb0d39 (round 2, re-verified by probe): the validator's errors[] path and enum gates (initialized boolean, approvalMode) still have zero test coverage — deleting any of these branches leaves the SDK suite green (mutants: 24/24 each; errors-branch deletion: full suite 1731 green). Note 'auto' IS a valid approval mode (PERMISSION_MODES = plan/default/auto-edit/auto/yolo) — the malformed fixture must use a value like 'not-a-mode'.

中文说明

2ddb0d39 上仍然成立(第 2 轮,探针复验):校验器的 errors[] 路径与枚举门禁(initialized 布尔、approvalMode)仍然零测试覆盖——删除任一分支后 SDK 套件仍为绿(各突变体 24/24;删除 errors 分支时全套 1731 为绿)。注意 'auto' 是合法的 approval mode(PERMISSION_MODES = plan/default/auto-edit/auto/yolo)——畸形载荷用例需使用如 'not-a-mode' 的值。

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

'baseUrl',
'fastModelId',
'visionModelId',
]) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-11: Still stands at 2ddb0d39 (round 2, re-verified by probe): parseStandaloneSessionOptions validates current.visionModelId and the daemon genuinely emits it when settings.visionModel is configured, but DaemonWorkspaceProviderCurrent still omits the field — integrators reading it through the public type hit TS2339 (probe reproduced; clean after adding visionModelId?: string).

中文说明

2ddb0d39 上仍然成立(第 2 轮,探针复验):parseStandaloneSessionOptions 校验 current.visionModelId,守护进程在配置了 settings.visionModel 时也确实会发出该字段,但 DaemonWorkspaceProviderCurrent 仍未声明它——集成方通过公共类型读取会得到 TS2339(探针已复现;补上 visionModelId?: string 后消除)。

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

Comment on lines +1550 to +1552
if (disposed || abort.signal.aborted) return;
const providerModelStatus =
mapProviderStatus(standaloneOptions);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R2-1: [certifies-falsely] [new-surface] A session attached while the standalone-options request is in flight is wiped from connection state by this late draft publish. The guard checks only disposed || abort.signal.aborted, never whether a session landed meanwhile.

Standalone draft on a cold runtime: getStandaloneSessionOptions() blocks in the daemon's ensureRuntime() for seconds while status is connecting, and the composer stays usable (shouldBlockComposerSubmit blocks only error/disconnected, composerInputState.ts:50-52). The user submits the first prompt; createSession publishes sessionId (actions.ts:1660-1688). If the options response lands after that publish but before this effect's cleanup aborts, the continuation passes both guards and setConnection spreads clearNonWorkspaceSessionState(current) — which routes a standalone context through getConnectionAfterSessionClear and deletes sessionId/clientId/standaloneSession/context/reasoning (actions.ts:283-297) over the live session. The UI reverts to an empty draft mid-stream and session-scoped consumers drop queued input (e.g. the shell-command drain, App.tsx:8727-8755). The nonce-bumped re-run re-adopts the session afterwards, so the damage is transient but user-visible. Pre-PR this branch had no await between the capabilities guard and setConnection — this diff widens the race window from one capabilities RTT to a runtime-boot-scale options RTT.

Witness:

Probe (DaemonSessionProvider.test.tsx): deferred options promise; createSession publishes sessionId 'standalone-race'; resolve options.
intact PR: AssertionError: expected undefined to be 'standalone-race'   // live sessionId wiped
with session-present guard: Tests 2 passed                              // probe flips

Suggested fix — make the draft publish a no-op when a session landed meanwhile, mirroring the ACP-preheat closure pattern at :1688:

if (disposed || abort.signal.aborted || sessionRef.current) return;

and/or keep current in the functional update when current.sessionId is set (current.status === 'error' || current.sessionId ? current : {...}). Note clearNonWorkspaceSessionState (:728-735) routes every non-workspace context through that delete-set — the fix must preserve the context-switch abort semantics pinned by the existing 'does not publish stale standalone options after switching contexts' test. Please add a test that holds the options promise deferred, creates/attaches a session, then resolves the options and asserts connection.sessionId survives — and confirm it goes red when the session-present check is removed.

中文说明

standalone options 请求在途期间若有会话完成附着,这次迟到的草稿发布会话把该会话从连接状态中抹掉。守卫只检查 disposed || abort.signal.aborted,从不检查期间是否已有会话落地。冷启动场景:getStandaloneSessionOptions() 在守护进程 ensureRuntime() 中阻塞数秒,状态停留在 connecting,而编辑器可用(shouldBlockComposerSubmit 仅拦截 error/disconnected)。用户提交首条 prompt,createSession 发布 sessionId;若 options 响应在该发布之后、本 effect 清理中止之前到达,续体通过两道守卫,setConnection 展开 clearNonWorkspaceSessionState(current)——standalone 上下文会经由 getConnectionAfterSessionClear 删除活跃会话的 sessionId/clientId/standaloneSession/context/reasoning。UI 在流式过程中退回空白草稿,按会话维度消费的逻辑(如 shell 命令队列排空)会丢弃排队输入。nonce 触发的重跑随后会重新收养该会话,因此损害是瞬时但用户可见的。改动前此分支在能力守卫与 setConnection 之间没有 await——本 diff 把竞态窗口从一次能力 RTT 拉宽到一次运行时启动量级的 options RTT。修复建议:会话已落地时让草稿发布成为空操作(if (disposed || abort.signal.aborted || sessionRef.current) return;),或参照 :1688 的 ACP 预热闭包模式在函数式更新中保留 current。请补充测试:挂起 options promise → 创建并附着会话 → 解析 options,断言 connection.sessionId 存活;移除会话存在检查时该测试应变红。

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

Comment on lines +1569 to +1571
currentModel: providerModelStatus.currentModel,
currentMode: providerModelStatus.currentMode,
contextWindow: providerModelStatus.contextWindow,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R2-2: [certifies-falsely] [regression] A late standalone-options hydration overwrites the user's pending model/mode selection, so the first prompt creates the session on the daemon's previous model/mode.

During the connecting window the composer is fully usable, and the /model <name> branch (App.tsx:11542-11546) has no availability gate. The user runs /model qwen3-max and /plan; when the options response lands, this publish writes connection.currentModel/currentMode from the daemon's own values, and the pre-existing sync effects (App.tsx:8957-8963) fire on the undefined→value change, silently clobbering both selections. createSession then carries the daemon's previous model/mode. Pre-PR this publish wrote undefined for both fields, so the effects never re-fired during the draft and the pending selections survived to create — this diff introduces the regression.

Witness:

Probe (App.test.tsx harness): dispatch /model qwen3-max then /plan; late publish currentModel 'qwen-default' / currentMode 'default'; submit first prompt.
intact PR: createSession received { approvalMode: 'default', modelServiceId: 'qwen-default' }   // both selections lost
with prev-preserving guards on both sync effects: received { approvalMode: 'plan', modelServiceId: 'qwen3-max' } — probe flips;
  the PR's own hydration and first-prompt tests still pass

Suggested fix — preserve the pending session-less selection when syncing:

setCurrentModel((prev) =>
  !connection.sessionId && prev && prev !== (connection.currentModel ?? '')
    ? prev
    : (connection.currentModel ?? ''),
);

(and the analogous guard for currentMode), or suppress the hydration's currentModel/currentMode overwrite while a pending selection exists. Initial hydration with no pending selection must still populate the pickers — pinned by 'hydrates models for a deferred standalone session without creating it' and the first-prompt test asserting modelServiceId: 'qwen'; the empty-prev fallthrough keeps both green. Please add an App.test.tsx case that holds the options deferred, selects /model qwen3-max, resolves options with a different current.modelId, and asserts the first prompt carries the user's selection — it is red on the current code and must go red again if the guard is removed.

中文说明

迟到的 standalone options 水合会覆盖用户待定的模型/模式选择,导致首条 prompt 以守护进程先前的模型/模式创建会话。connecting 窗口内编辑器完全可用,/model <name> 分支(App.tsx:11542-11546)也没有可用性门禁。用户执行 /model qwen3-max/plan 后,若 options 响应到达,本次发布会把 connection.currentModel/currentMode 写成守护进程自身的值,既有的同步 effect(App.tsx:8957-8963)因 undefined→有值的变化触发,静默覆盖这两项选择;createSession 随后携带守护进程先前的模型/模式。改动前该发布对两个字段写入 undefined,effect 不会在草稿期间重新触发,待定选择可以保留到创建——本 diff 引入了该回归。修复建议:同步时保留无会话状态下的待定选择(如上 setCurrentModel 函数式守卫,currentMode 同理),或在存在待定选择时抑制水合对这两个字段的覆盖。无待定选择的初始水合仍须填充选择器(现有两个测试钉住);空 prev 兜底可保持两者为绿。请补充用例:挂起 options → /model qwen3-max → 以不同 current.modelId 解析 options,断言首条 prompt 携带用户所选模型;该用例在当前代码上为红,移除守卫后应再次变红。

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

@doudouOUC
doudouOUC requested a review from chiga0 September 2, 2026 00:19
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.

3 participants