Skip to content

feat(web-shell): support workspace file uploads - #8874

Merged
wenshao merged 23 commits into
mainfrom
feat/web-shell-file-upload
Aug 13, 2026
Merged

feat(web-shell): support workspace file uploads#8874
wenshao merged 23 commits into
mainfrom
feat/web-shell-file-upload

Conversation

@ytahdn

@ytahdn ytahdn commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds direct workspace file uploads to the Web Shell composer. Users can drop ordinary files onto the composer or choose “Upload file” while browsing the @ file panel; multiple files upload sequentially with progress, cancellation, automatic conflict renaming, and inline file tags using the server-confirmed paths. Pure supported-image drops continue to use the existing image attachment flow.

Adds capability-gated legacy-primary and workspace-qualified binary upload routes, a 50 MiB binary policy distinct from text-write limits, a shared four-request admission gate, atomic no-clobber publication, and deterministic numbered filenames for occupied targets. The TypeScript SDK exposes the same upload operation with browser progress, abort, and timeout support.

Why it's needed

The Web Shell could reference workspace files but could not bring local files into the workspace. Users had to copy files through another tool before mentioning them, and naïvely extending the text-write route would corrupt binary data or weaken existing text-write limits.

Reviewer Test Plan

How to verify

  1. Open the Web Shell against a trusted workspace whose daemon advertises file upload, enter the @ file panel, and confirm “Upload file” has an upload icon and opens a multi-file picker without leaving the trigger @ in the composer.
  2. Upload files with spaces, non-ASCII characters, %, and an occupied filename. Confirm uploads are byte-identical, occupied names become name (1).ext, progress appears above the input surface, successful rows disappear after three seconds, and each result becomes a removable inline file tag.
  3. Drop an ordinary file and a mixed batch onto the composer and confirm they upload in selection order without leaving drag styling active. Drop a batch containing only supported images and confirm it stays on the image attachment path.
  4. Exercise an oversized file, cancellation, an untrusted workspace, and a missing or draining qualified workspace. Confirm requests fail without partial files or fallback to the primary runtime.
  5. Confirm older daemons without the upload capability hide both upload entry points.

Automated verification: npm run build, npm run typecheck, and npm run lint; 244 relevant CLI tests, 11 SDK upload tests, and 231 Web Shell composer/upload tests passed locally.

Evidence (Before & After)

Before: local files had to be copied into the workspace outside the Web Shell before they could be referenced. After: the composer and @ file browser upload local files directly, show bounded progress state, and insert the confirmed path as an inline file tag.

Tested on

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

Environment (optional)

Local Web Shell and daemon development environment on macOS; Node.js 22 workspace tests.

Risk & Scope

  • Main risk or tradeoff: request bodies are buffered in memory; admission is capped at four concurrent uploads, bounding upload buffers to about 200 MiB plus framework overhead.
  • Not validated / out of scope: resumable or chunked uploads, folder uploads, overwrite-in-place, ACP-HTTP parity, and Windows/Linux manual UI validation.
  • Breaking changes / migration notes: none. The routes and UI are capability-gated, and existing text-write limits remain unchanged.

Linked Issues

N/A

中文说明

本 PR 的改动

为 Web Shell 输入框增加工作区文件直传能力。用户可以把普通文件拖入输入框,或在 @ 文件面板浏览目录时选择“上传文件”;多文件按顺序上传,支持进度、取消、重名自动改名,并使用服务端确认的路径生成行内文件标签。仅包含受支持图片的拖放仍使用现有图片附件流程。

新增由能力标签控制的主工作区和 qualified workspace 二进制上传路由;二进制上限为 50 MiB,与文本写入上限相互独立;两个路由共享四请求准入门,使用原子且不覆盖已有文件的发布方式,并为被占用的目标生成确定性的编号文件名。TypeScript SDK 同步提供上传接口,支持浏览器进度、取消和超时。

为什么需要

Web Shell 原本只能引用工作区里已经存在的文件,无法把本地文件带入工作区。用户必须先通过其他工具复制文件才能在输入框中引用;直接扩展文本写入路由则可能破坏二进制内容,或削弱现有文本写入限制。

Reviewer 测试计划

验证方法

  1. 使用声明文件上传能力的 daemon 打开可信工作区,在 @ 文件面板中确认“上传文件”带有上传图标、可打开多文件选择器,并且输入框中不会残留触发面板的 @
  2. 上传包含空格、非 ASCII 字符、% 和重名情况的文件。确认字节完全一致,重名文件变为 name (1).ext,进度显示在输入框上方,成功状态三秒后消失,并且每个结果都成为可移除的行内文件标签。
  3. 将普通文件和混合批次拖入输入框,确认它们按选择顺序上传且不会残留拖拽高亮。拖入仅包含受支持图片的批次,确认继续走图片附件流程。
  4. 验证超限文件、取消上传、未信任工作区,以及缺失或 draining 的 qualified workspace。确认请求失败时没有部分文件,也不会回退到主工作区。
  5. 确认不声明上传能力的旧 daemon 会隐藏两个上传入口。

自动化验证:本地通过 npm run buildnpm run typechecknpm run lint;通过 244 个相关 CLI 测试、11 个 SDK 上传测试和 231 个 Web Shell 输入框/上传测试。

前后对比证据

改动前:本地文件必须先在 Web Shell 之外复制进工作区,之后才能引用。改动后:输入框和 @ 文件浏览器可以直接上传本地文件,显示有界的进度状态,并将服务端确认的路径插入为行内文件标签。

测试平台

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

环境(可选)

macOS 本地 Web Shell 与 daemon 开发环境;Node.js 22 工作区测试。

风险与范围

  • 主要风险或权衡:请求体会缓存在内存中;准入限制为最多四个并发上传,因此上传缓冲区上限约为 200 MiB,另加框架开销。
  • 未验证或不在范围内:断点续传或分块上传、文件夹上传、原地覆盖、ACP-HTTP 对等支持,以及 Windows/Linux 手动 UI 验证。
  • 破坏性变更或迁移说明:无。路由和 UI 都由能力标签控制,现有文本写入上限保持不变。

关联 Issue

N/A

@ytahdn

ytahdn commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

E2E / Interactive Test Report

Environment: macOS, local Web Shell + daemon development setup.

Interactive development validation covered the @ panel upload entry, upload icon/copy, removal of the trigger @, progress placement and dismissal, inline file-tag insertion/removal, placeholder restoration, multi-file behavior, conflict-renamed paths, ordinary-file drag/drop, and coexistence with the image attachment drop path.

Automated regression evidence:

  • CLI filesystem and REST upload coverage: 244 passed
  • TypeScript SDK upload coverage: 11 passed
  • Web Shell upload/composer/image interaction coverage: 231 passed
  • Full repository build, typecheck, and lint passed

Not yet manually validated: real model consumption of uploaded text/image content, Windows UI behavior, and Linux UI behavior. These remain explicit reviewer checks rather than being inferred from file creation and composer insertion alone.

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

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

Copy link
Copy Markdown
Collaborator

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

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

@ytahdn ytahdn added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 10, 2026
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: this is a feature, not a bug fix, and the capability gap is real and observable: the Web Shell can reference workspace files via @ mentions but has no way to bring a local file into the workspace — users must copy files in through another tool first. Not theoretical; it's a missing capability users hit directly.

Direction: aligned. The Web Shell is a first-class surface in this repo, and letting a browser-based client place files into the workspace is table stakes for that surface. Claude Code's CHANGELOG has no direct match, but adjacent products do attach client-side files/photos into remote coding sessions, so the area is clearly relevant.

Size: this is a cross-package change (cli/serve daemon routes + sdk-typescript + web-shell), so the core-infrastructure gate applies. Breakdown: ~1,455 production logic lines (607 in cli/serve, 188 in the SDK, 660 in web-shell TS; plus 112 CSS and 4 build-script), 1,635 test lines, 304 docs. As a feat there is no size hard block, but 500+ production lines means a maintainer should be aware of this one, and at 1,000+ it's a large PR — if any part is splittable (e.g. the daemon/SDK route from the composer UI), that's worth considering, though I can see the halves are tightly coupled.

Approach: the structure reads as focused — a separate binary upload route rather than extending the text-write route is the right call (binary safety and an independent 50 MiB limit), and the admission gate, no-clobber publish, deterministic conflict renaming, SDK parity, and composer UI each map to a stated requirement. No unrelated changes or drive-by refactors spotted in the file list. The web shell consumes @qwen-code/sdk, so the SDK operation is load-bearing, not extra scope.

Risk: no elevated risk signals from the revert-history path check. The daemon-route surface (workspace trust boundary, qualified-workspace scoping) is where this PR needs the most careful eyes in code review, and that's where I'll focus.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:这是一个功能(feature)而非 bug 修复,能力缺口真实可见:Web Shell 可以通过 @ 引用工作区文件,但没有任何方式把本地文件放进工作区——用户必须先用别的工具把文件复制进去。这不是理论问题,而是用户会直接遇到的能力缺失。

方向:对齐。Web Shell 是本仓库的一等界面,让浏览器端客户端把文件放入工作区是该界面的基本能力。Claude Code 的 CHANGELOG 没有直接对应条目,但同类产品确实支持把客户端文件/照片附加到远程编码会话,说明这个方向明确相关。

规模:这是跨包改动(cli/serve daemon 路由 + sdk-typescript + web-shell),适用核心基础设施门禁。明细:约 1,455 行生产逻辑(cli/serve 607、SDK 188、web-shell TS 660;另有 CSS 112、构建脚本 4),测试 1,635 行,文档 304 行。作为 feat 没有规模硬阻断,但生产行数超过 500 意味着需要维护者知悉;超过 1,000 属于大 PR——如果有可拆分部分(例如 daemon/SDK 路由与输入框 UI 分开),值得考虑,尽管两半耦合确实紧密。

方案:结构上很聚焦——用独立的二进制上传路由而不是扩展文本写入路由是正确的选择(二进制安全 + 独立的 50 MiB 上限),准入门、不覆盖已有文件的原子发布、确定性重名编号、SDK 对齐和输入框 UI 每一项都对应一个已声明的需求。文件列表中未发现无关改动或顺手重构。web shell 依赖 @qwen-code/sdk,所以 SDK 操作是承重部分,不是额外范围。

风险:回滚历史路径检查无升级风险信号。daemon 路由面(工作区信任边界、qualified workspace 作用域)是本 PR 在代码审查中最需要仔细的部分,我会重点看那里。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

I wrote my independent proposal before reading the diff — separate binary route with its own size policy, content-length pre-check, bounded concurrency, atomic no-clobber publish with deterministic numbering, capability advertisement, SDK method with progress/abort, composer hook — and this PR matches or exceeds it everywhere. The places it goes beyond my sketch are all justified: temp-name ENAMETOOLONG handling for 255-byte basenames, UTF-8-safe stem trimming for numbered candidates, generation-guard checkpoints at entry/lock/publish, and 0o600 creation mode.

What I verified against the base tree, per the daemon-route rules:

  • Route ownership: two routes — legacy-primary POST /file/upload and workspace-qualified POST /workspaces/:workspace/file/upload — both behind mutate({ strict: true }), one shared four-slot gate bounding body buffering across both.
  • No fallback to primary: the qualified route reuses the existing resolveWorkspaceRuntimeFromParam / requireTrustedWorkspaceRuntime helpers (unknown → 400 workspace_mismatch, draining → 503 workspace_runtime_unavailable, untrusted → 403), and the new tests pin every one of those states including "nothing lands in the primary workspace".
  • Trust: the legacy route only wires isWorkspaceTrusted when primaryRuntimeTrustAuthoritative, same pattern as the sibling write routes; the fs layer re-checks trust inside writeBytesAtomic.
  • Size policy stays split: text writes keep MAX_WRITE_BYTES (5 MiB); uploads get MAX_UPLOAD_BYTES (50 MiB) enforced once in the admission gate's Content-Length pre-check, once by the express.raw limit, and once in the fs layer — all three on the same constant.
  • No-clobber: the fs primitive is create-only; the numbered-candidate loop lives in the route; concurrent same-name uploads land on distinct candidates (race test included); in-workspace symlinks are numbered past, boundary escapes fail closed, and the publisher refuses to publish through a link even if one appears mid-flight.
  • Client side: the upload hook aborts in-flight work on workspace switch (generation guard), the picker re-checks the target key before uploading, and pure-image drops still route to the existing image-attachment flow. All new fields and options (maxWorkspaceFileUploadBytes, fileUploadEnabled, onFileUploadRequest, onProgress/timeoutMs) have real read sites — I grepped each one.

No critical blockers found. One honest caveat: this is ~1,450 production lines reviewed statically; the behavioral surface is only as proven as the test suite and the live lanes below.

sequenceDiagram
    participant P1 as Composer (web-shell)
    participant P2 as SDK DaemonClient
    participant P3 as Upload route (daemon)
    participant P4 as WorkspaceFileSystem
    P1->>P2: uploadWorkspaceFile with file and path
    P2->>P3: POST octet-stream with progress events
    P3->>P3: trust, content-type, size, dir admission
    P3->>P4: writeBytesAtomic on a free candidate
    P4-->>P3: size and hash, confirmed path
    P3-->>P2: 201 with server-confirmed path
    P2-->>P1: result fires inline file tag insert
Loading
Files changed (30 of 35 shown)
File What changed
docs/design/web-shell-file-upload.md Design doc covering routes, limits, and naming policy
packages/cli/src/serve/capabilities.ts New workspace_file_upload capability tag plus registry notes
packages/cli/src/serve/fs/index.ts Re-exports MAX_UPLOAD_BYTES
packages/cli/src/serve/fs/policy.ts Adds the 50 MiB MAX_UPLOAD_BYTES binary-ingress policy
packages/cli/src/serve/fs/workspace-file-system.test.ts writeBytesAtomic tests: byte round-trip, caps, symlinks, trust, generation
packages/cli/src/serve/fs/workspace-file-system.ts writeBytesAtomic plus shared atomic publisher split from the text path
packages/cli/src/serve/routes/capabilities.ts Advertises maxWorkspaceFileUploadBytes with the capability
packages/cli/src/serve/routes/workspace-file-write.test.ts POST /file/upload route suite: limits, numbering, races, symlinks
packages/cli/src/serve/routes/workspace-file-write.ts Upload routes: admission, concurrency gate, parser, numbered publish
packages/cli/src/serve/server.ts Registers legacy and qualified upload routes behind one shared gate
packages/cli/src/serve/server/telemetry.ts Classifies the upload route for daemon telemetry
packages/cli/src/serve/types.ts maxWorkspaceFileUploadBytes on the capabilities envelope
packages/cli/src/serve/workspace-qualified-rest.test.ts Qualified uploads route per workspace; unknown, draining, removed, untrusted all fail without primary fallback
packages/sdk-typescript/scripts/build.js Browser bundle budget bumped 185 KB to 187 KB
packages/sdk-typescript/src/daemon/DaemonClient.ts uploadWorkspaceFile on both client classes; XHR progress core
packages/sdk-typescript/src/daemon/index.ts Exports the new upload types
packages/sdk-typescript/src/daemon/types.ts Upload request and result types plus limits field
packages/sdk-typescript/test/unit/DaemonClient.upload.test.ts SDK upload tests: progress, abort, timeout, errors
packages/web-shell/client/App.tsx Threads the fileUploadEnabled prop into customization
packages/web-shell/client/components/AtMentionPanel.tsx Renders the upload icon for the upload-kind panel row
packages/web-shell/client/components/ChatEditor.module.css Upload strip, row, and drop-overlay styles
packages/web-shell/client/components/ChatEditor.test.tsx Capability gating, drag-and-drop, and image-path tests
packages/web-shell/client/components/ChatEditor.tsx Target resolution, drop handling, hidden picker, progress strip
packages/web-shell/client/customization.tsx fileUploadEnabled customization field
packages/web-shell/client/hooks/useAtMentionMenu.ts Synthetic Upload file item and shared file-reference insert text
packages/web-shell/client/hooks/useComposerCore.ts Wires onFileUploadRequest; clears the doc when the last inline tag is removed
packages/web-shell/client/hooks/useFileUpload.test.tsx Hook tests: sequential queue, abort, target-switch cancellation
packages/web-shell/client/hooks/useFileUpload.ts Sequential upload queue with progress, cancel, and generation guard
packages/web-shell/client/i18n.tsx EN and ZH strings for the upload UI
…and 5 more test files Small coverage additions for the surfaces above

Testing evidence — the PR's own CI (unattended run; PR code is never executed here)

The decisive suites for this commit were still running at review time — the unit suite Test (ubuntu-latest, Node 22.x), Serve A/B (ubuntu-latest, Node 22.x), and Capture web-shell visuals (ubuntu-latest, Node 22.x). I don't poll; the table below is refreshed in place by the finalize job once CI settles. Completed green so far: Desktop Shell (ubuntu-22.04 and windows-2022), Live Host (macos-latest), the Java matrix (ubuntu 11/17/21, macOS 21, Windows 21), Real daemon E2E / Java 11, route, Classify PR, review-scan. The macOS/Windows Node test runs are skipped on this commit; Linux covers the suite.

The one red check, takeover-ack, is bot orchestration noise, not a PR signal: its log shows the takeover-workflow's ack-comment step dying on GraphQL: was submitted too quickly (addComment) — GitHub API throttling on a comment post. Nothing in that job builds or runs PR code.

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

Check Conclusion
takeover-ack ❌ failure
Test (ubuntu-latest, Node 22.x) ❌ failure
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Live Host (macos-latest) ✅ success
macos-latest / Java 21 ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Real daemon E2E / Java 11 ✅ success
review-scan ✅ success
route ✅ success
Serve A/B (ubuntu-latest, Node 22.x) ✅ success
ubuntu-latest / Java 11 ✅ success
ubuntu-latest / Java 17 ✅ success
ubuntu-latest / Java 21 ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
windows-latest / Java 21 ✅ success

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

Not verified here: live upload behavior through a running daemon and the composer UI — unattended review is static; the author's manual testing (macOS only, per the PR body) is their claim, not evidence.

Sandboxed verification would settle this: @qwen-code /verify — that a real daemon serves byte-identical uploads, auto-numbers occupied names end-to-end, and rejects qualified-workspace uploads without any primary fallback are behavioral claims the diff alone cannot prove, and the author's manual UI validation covers macOS only.

中文说明

代码审查:我在读 diff 之前先独立写下了自己的方案——独立二进制路由(独立大小策略)、Content-Length 预检、有界并发、原子不覆盖发布 + 确定性编号、能力声明、带进度/取消的 SDK 方法、输入框 hook——本 PR 处处达到或超过该方案。超出部分的细节也都有正当理由:255 字节文件名的临时文件 ENAMETOOLONG 处理、编号候选的 UTF-8 安全截断、入口/锁内/发布前的 generation 检查点、0o600 创建模式。

按 daemon 路由审查规则逐项核对:两条路由(legacy-primary 与 workspace-qualified)都在 strict 变更门禁之后,共享一个四槽准入门约束缓冲;qualified 路由复用现有 runtime 解析/信任助手,unknown/draining/untrusted 分别 400/503/403,且新测试逐状态钉死"绝不落回主工作区";legacy 路由仅在主工作区信任权威时接入信任判断,与相邻写入路由一致;大小策略保持分离(文本 5 MiB 不变,上传 50 MiB,三处校验同一常量);不覆盖语义由 fs 原语保证,编号策略在路由层,同名并发上传落在不同候选(含竞态测试),工作区内符号链接被编号绕过、越界链接直接失败,发布阶段即使中途出现符号链接也会拒绝;客户端 hook 在切换工作区时中止在传任务,选择器打开后重新校验目标,纯图片拖放仍走原图片附件流程。所有新增字段/选项我都 grep 了读取点,无死开关。未发现关键阻塞问题。

测试证据(无人值守运行,绝不执行 PR 代码):本 commit 的关键套件(ubuntu 单元测试、Serve A/B、web-shell 视觉捕获)在审查时仍在运行,下表由 finalize 任务在 CI 落定后原地刷新。已完成且通过:Desktop Shell(ubuntu/windows)、Live Host(macOS)、Java 矩阵(ubuntu 11/17/21、macOS 21、Windows 21)、Real daemon E2E / Java 11、route、Classify PR、review-scan;macOS/Windows 的 Node 测试本轮被跳过,由 Linux 覆盖。唯一红色检查 takeover-ack 是 bot 编排噪音:日志显示其 ack 评论步骤因 GitHub API 限流(submitted too quickly)失败,该任务不构建也不运行 PR 代码。

此处未验证:真实 daemon 上的上传行为与输入框 UI(无人值守审查为静态审查;作者自述仅在 macOS 上手工验证,属作者声明而非证据)。沙箱验证可以补足:@qwen-code /verify——真实 daemon 字节一致上传、重名自动编号、qualified 路由绝不回退主工作区等行为声明无法仅凭 diff 证明。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 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 015f1b0. 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 6 render-shaping files:

  • packages/web-shell/client/App.tsx
  • packages/web-shell/client/components/AtMentionPanel.tsx
  • packages/web-shell/client/components/ChatEditor.module.css
  • packages/web-shell/client/components/ChatEditor.tsx
  • packages/web-shell/client/customization.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

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.12% 84.12% 89.99% 83.33%
Core 87.9% 87.9% 89.45% 86.45%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.12 |    83.33 |   89.99 |   84.12 |                   
 src               |   85.27 |    81.44 |   87.61 |   85.27 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.75 |    79.33 |   80.76 |   73.75 | ...1319-1323,1450 
  ...ractiveCli.ts |   87.19 |    81.33 |   88.13 |   87.19 | ...2972,2978,3043 
  ...liCommands.ts |   88.64 |    82.83 |      80 |   88.64 | ...77-579,593,692 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   71.65 |    73.85 |   91.22 |   71.65 |                   
  acpAgent.ts      |   71.02 |    73.64 |   90.74 |   71.02 | ...20,12325-12327 
  ...k-reporter.ts |     100 |    80.95 |     100 |     100 | 77,80,115,135     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |    97.1 |    95.83 |   93.33 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.83 |   93.33 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.23 |    86.48 |   96.48 |   91.23 |                   
  Session.ts       |   90.35 |    84.88 |   95.79 |   90.35 | ...81,11408-11412 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...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 |   93.38 |    91.74 |     100 |   93.38 | 74,85-88,115-125  
  ...y-replayer.ts |   98.22 |    98.14 |     100 |   98.22 | 195-197           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...lure-guard.ts |   98.32 |    97.75 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   96.04 |    93.93 |   96.87 |   96.04 |                   
  ...ageEmitter.ts |   96.03 |    95.08 |     100 |   96.03 | 71,108-115        
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   90.81 |    79.61 |   66.66 |   90.81 |                   
  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.66 |      100 |      50 |   98.66 | 86                
  serve.ts         |   89.84 |    77.32 |     100 |   89.84 | ...52,855-858,870 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.95 |    88.54 |   90.59 |   88.95 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.11 |    95.45 |   88.88 |   94.11 | ...54-257,302-305 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |     85.5 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.73 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    55.55 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   87.64 |    88.29 |   88.45 |   87.64 |                   
  agent-prompt.ts  |   93.73 |     92.4 |   97.22 |   93.73 | ...2524,2649-2729 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.99 |    93.17 |   96.66 |   96.99 | ...2203,2231-2253 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.18 |    82.14 |   71.42 |   77.18 | ...85-531,533-544 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   83.77 |    83.95 |      90 |   83.77 | ...55,544,571-607 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...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.46 |    95.03 |   98.32 |   97.46 |                   
  agent-briefs.ts  |   98.98 |      100 |      50 |   98.98 | 735-736           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   99.04 |    97.36 |     100 |   99.04 | 223-224           
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    97.14 |     100 |     100 | 513,553           
  coverage.ts      |   96.81 |    94.42 |     100 |   96.81 | ...85-486,526-537 
  deadline.ts      |   98.33 |    93.61 |     100 |   98.33 | ...88,237,629,661 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   87.07 |    92.45 |   76.47 |   87.07 | ...72,309-310,337 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |    96.15 |     100 |     100 | 107               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.19 |    94.93 |     100 |   96.19 | ...90-491,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   97.36 |    95.37 |     100 |   97.36 | ...86,409,770,787 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |    92.39 |     100 |     100 | ...28,308-309,449 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |    96.77 |     100 |     100 | 222,452,499,512   
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |    94.9 |    89.83 |   96.27 |    94.9 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.93 |    88.59 |   83.33 |   88.93 | ...2451,2453-2461 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |    96.5 |    93.47 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     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          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.12 |    94.18 |   95.29 |   98.12 |                   
  ...putAdapter.ts |   97.98 |    93.23 |   98.07 |   97.98 | ...1416,1432-1433 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.58 |    83.86 |   90.51 |   87.58 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    92.95 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 685               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    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.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.65 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...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.57 |     90.8 |     100 |   98.57 | ...1411,1413-1414 
  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 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-144             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.06 |    80.14 |   75.43 |   84.06 | ...7481,7487-7488 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.22 |    88.99 |     100 |   94.22 | ...27,531-532,572 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.67 |    91.22 |   71.81 |   90.67 | ...2744,2758-2762 
  ...-admission.ts |   98.24 |    94.73 |     100 |   98.24 | 79-80,303-304     
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.26 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   78.26 |    80.02 |    93.1 |   78.26 |                   
  ...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 |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   73.87 |    77.71 |   94.23 |   73.87 | ...5240,5288-5294 
  index.ts         |   82.23 |    80.11 |   91.07 |   82.23 | ...2341,2425-2426 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 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             
 src/serve/fs      |   87.27 |    82.01 |     100 |   87.27 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   87.37 |    81.39 |     100 |   87.37 | ...2811,2821-2822 
 src/serve/live    |   78.01 |    69.54 |   90.61 |   78.01 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |     76.8 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   75.99 |    65.18 |   85.71 |   75.99 | ...1883,1974-1975 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |    86.3 |    59.78 |   93.33 |    86.3 | ...1160,1184-1191 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...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.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.78 |    80.36 |    94.9 |   85.78 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.63 |    95.65 |     100 |   98.63 | 76                
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...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.92 |     90.9 |     100 |   98.92 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.84 |    82.35 |   91.54 |   85.84 | ...4938,4940-4941 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.11 |    79.31 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.15 |    74.95 |   92.98 |   88.15 | ...2027,2072-2073 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.58 |    79.16 |     100 |   89.58 | ...84,698-705,786 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   91.75 |    89.37 |   96.95 |   91.75 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   86.54 |    72.48 |     100 |   86.54 | ...49,766,829-838 
  fs-factory.ts    |     100 |    94.54 |     100 |     100 | 42,103,159        
  ...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 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.72 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   95.86 |    93.37 |     100 |   95.86 | ...-848,1026-1030 
  telemetry.ts     |   99.04 |    97.45 |     100 |   99.04 | ...37,652,794-796 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    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.21 |     100 |     100 | 176               
 ...kspace-service |   90.65 |    87.73 |   91.11 |   90.65 |                   
  index.ts         |   90.13 |    87.04 |   89.74 |   90.13 | ...1464-1468,1471 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.49 |    89.25 |      98 |   92.49 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     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.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...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.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   73.24 |    75.55 |   67.03 |   73.24 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.45 |    72.09 |   68.57 |   74.45 | ...4188,4304-4310 
  ...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        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   70.51 |       74 |    62.5 |   70.51 | ...12,339,392-397 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   83.35 |    83.55 |   89.88 |   83.35 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  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 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  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 |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   85.02 |    82.53 |     100 |   85.02 | ...1089,1123-1128 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...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    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   71.96 |    79.54 |   79.56 |   71.96 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.99 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.58 |    95.06 |   46.15 |   95.58 | ...79,482-486,489 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-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 |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-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 |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  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 |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.26 |    86.89 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.41 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    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 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.16 |    81.83 |   85.13 |   84.16 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   85.64 |    83.19 |   87.86 |   85.64 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.86 |    71.67 |   83.33 |   86.86 | ...1540,1562-1566 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.08 |    81.23 |   76.92 |   86.08 | ...5198-5200,5202 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.34 |    77.14 |     100 |   95.34 | 124-125,227-232   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.26 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    64.28 |     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.54 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.57 |    85.61 |   95.76 |   87.57 |                   
  ...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.46 |     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.38 |    92.38 |     100 |   98.38 | 108,136-137,343   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   82.86 |    79.48 |     100 |   82.86 | ...88-610,741-742 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.49 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...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         |   81.63 |    87.34 |   92.75 |   81.63 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.85 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    57.35 |   76.92 |   45.52 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |    87.9 |    86.45 |   89.45 |    87.9 |                   
 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.38 |    84.54 |   94.85 |   90.38 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   91.11 |    86.68 |   89.23 |   91.11 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |    92.4 |       90 |   83.78 |    92.4 | ...1862,1911-1914 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1705,1711-1712 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.72 |    84.65 |   89.05 |   82.72 |                   
  TeamManager.ts   |    73.6 |    80.82 |   79.62 |    73.6 | ...1706,1729-1730 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.35 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.16 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.81 |    87.18 |   75.53 |   84.81 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.13 |    86.91 |   73.98 |   84.13 | ...8535,8539-8540 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.37 |    88.08 |   93.29 |   92.37 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.05 |     87.4 |   91.66 |   92.05 | ...3987,4085-4086 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.67 |   96.15 |   90.04 | ...6216,6244-6260 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.12 |     100 |   98.67 | ...79,707-708,755 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   95.88 |    90.34 |    92.3 |   95.88 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.81 |    89.63 |   91.89 |   95.81 | ...1221-1222,1250 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.71 |    90.53 |   95.61 |   91.71 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.48 |    91.27 |     100 |   95.48 | ...1309,1317,1416 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.36 |    92.19 |    98.5 |   97.36 |                   
  dashscope.ts     |   98.33 |    94.97 |   96.42 |   98.33 | ...91-692,834-835 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   87.71 |    84.62 |   92.57 |   87.71 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.94 |    86.26 |   97.91 |   90.94 | ...1230-1236,1280 
  ...ionManager.ts |   83.89 |    82.86 |   81.72 |   83.89 | ...2832,2861-2862 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   90.48 |    82.71 |     100 |   90.48 | ...4,994-995,1005 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     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.14 |     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      |    79.9 |    78.92 |    90.9 |    79.9 |                   
  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   |   71.76 |    64.76 |   71.42 |   71.76 | ...53-654,661-662 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.25 |    88.99 |   93.68 |   93.25 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.79 |     88.5 |   96.42 |   88.79 | ...04-805,828-831 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |      92 |    93.33 |      80 |      92 | 102-103,167-168   
  goal-reducer.ts  |    93.4 |    90.65 |   96.96 |    93.4 | ...27,501,519-520 
  goal-runtime.ts  |   97.44 |    89.68 |   97.67 |   97.44 | ...1216-1217,1338 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.35 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   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 |       80 |   16.66 |   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.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   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        |   87.83 |    83.82 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.17 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.6 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    74.04 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.82 |    84.82 |   96.92 |   89.82 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.46 |    87.17 |     100 |   98.46 | 81-82,105,468-469 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |    91.6 |    85.47 |   95.77 |    91.6 | ...2155,2182-2183 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.17 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...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.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...ipt-reader.ts |   94.55 |    89.78 |   96.66 |   94.55 | ...1353-1354,1422 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.26 |    85.35 |   97.22 |   89.26 | ...2537,2613-2633 
  sessionTitle.ts  |   95.75 |    77.41 |     100 |   95.75 | ...53-256,287-288 
  ...ionService.ts |    84.4 |    78.45 |   97.18 |    84.4 | ...2493,2499-2504 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...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.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |    98.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.89 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.83 |    84.11 |   84.92 |   81.83 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...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.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |    99.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.25 |    77.03 |   66.66 |   60.25 | ...1492,1509-1529 
  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      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,482-483,499 
  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.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.61 |   83.33 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.27 |    85.09 |   88.72 |   86.27 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.77 |   81.25 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   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.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.08 |   81.25 |   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.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.81 |    84.22 |   91.91 |   78.81 | ...5036,5099-5100 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   78.22 |    84.21 |   83.33 |   78.22 | ...66,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...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    |   86.72 |    84.92 |   88.88 |   86.72 | ...25-828,865-900 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.02 |    87.31 |   88.69 |   87.02 |                   
  agent.ts         |   85.64 |    86.19 |   86.31 |   85.64 | ...4366,4400-4410 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.51 |    84.81 |      75 |   86.51 |                   
  workflow.ts      |   86.51 |    84.81 |      75 |   86.51 | ...67,512,514-515 
 src/utils         |   92.91 |    89.65 |   96.89 |   92.91 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   83.39 |    95.17 |    61.9 |   83.39 | ...81-397,401-407 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.41 |    93.54 |     100 |   95.41 | ...27-328,370-373 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.11 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.33 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.27 |    91.38 |     100 |   98.27 | ...1321-1323,1333 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |    87.5 |    86.13 |     100 |    87.5 | ...76-480,510-525 
  truncation.ts    |   90.61 |    90.43 |     100 |   90.61 | ...53-461,498-504 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   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.43 |   89.47 |   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 |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the shipped code matches two green sandboxed verifications, a maintainer real-stack verification, and a clean post-merge fidelity check; the missing point is the five inline findings that merged as follow-ups.

Status: merged. @wenshao squash-merged this PR as a8bcaefea on 2026-08-13 06:42 UTC, minutes after triggering this re-run — so there is no approval for this run to issue. This update replaces the August 10 deferral: the condition that deferral set (maintainer sign-off on a ~1,900-production-line, three-package feature) was discharged by the maintainer it was addressed to — real-stack verification report (no mocked daemon, A/B against a merge-base build, Playwright-driven UI), an APPROVED review pinned to the exact merged head, then the merge.

What this re-run still checked after the merge:

  • Squash fidelity: every PR-owned file on main is byte-identical to the reviewed branch head 015f1b09. The only tree delta vs the branch head is 27 main-side files that landed after the branch's last sync (version bumps, CHANGELOG, the #9038 web-shell files, lint scripts) — nothing PR-owned was re-merged or altered by the squash.
  • Final merge of main: exactly one conflict, in the ChatEditor import list, resolved as the union of both sides' imports — no logic touched. Branch CI on 015f1b09 was green where it counts: Test (ubuntu-latest, Node 22.x), Serve A/B, Capture web-shell visuals, Desktop Shell (ubuntu/windows), Live Host (macOS), Real daemon E2E.
  • The odd file: use-effort-command.ts appearing in this PR's file list is a pure Prettier reflow of one assignment (identical code), not a revert of the main-side #8365 fix.

Shipped unresolved — now follow-ups on main, @wenshao: your five inline findings from this morning landed without code changes after them (the final branch commit predates them). In short: render-phase abort of live uploads in the upload hook; the file-picker target-change branch silently no-ops; the SDK's inherited 30 s default timeout vs this route's 50 MiB cap; the qualified-vs-primary trust gates failing open vs closed on a missing trusted field; and the batch-overflow notice borrowing the first rejected file's name. The autofix takeover was engaged at merge time if you want those routed through it.

Housekeeping note: the CHANGES_REQUESTED state this PR carried at merge time came from stale review-bot reviews pinned to superseded commits — no human review was outstanding.

中文说明

置信度:4/5 —— 已合入的代码与两次绿色沙箱验证、一次维护者真实栈验证、以及本次合并后一致性检查全部吻合;扣掉的一分是五条 inline 意见以"后续跟进"状态合入。

状态:已合并。 @wenshao 已于 2026-08-13 06:42 UTC 将本 PR 以 squash 方式合入(a8bcaefea),就在他触发本次 re-run 几分钟之后——因此本次运行没有批准动作可做。本条更新替代 8 月 10 日的暂缓决定:当时暂缓所设条件(约 1,900 行生产代码、跨三个包的功能需维护者签核)由被点名的维护者本人完成——真实栈验证报告(无 mock daemon、与 merge-base 构建 A/B 对照、Playwright 驱动 UI)、钉在完全相同的被合入 head 上的 APPROVED 评审,随后合并。

本次 re-run 在合并后仍核查了以下内容:

  • Squash 一致性main 上所有本 PR 的文件与被审查的分支 head 015f1b09 逐字节一致。相对分支 head 的唯一差异是分支最后一次同步之后 main 侧落地的 27 个文件(版本号、CHANGELOG、#9038 的 web-shell 文件、lint 脚本)——squash 没有重新合并或改动任何 PR 文件。
  • 最后一次合并 main:唯一一处冲突在 ChatEditor 的 import 列表,解决方式为两边 import 的并集——未触及任何逻辑。015f1b09 上的分支 CI 在关键项全绿:Test (ubuntu-latest, Node 22.x)Serve A/BCapture web-shell visuals、Desktop Shell(ubuntu/windows)、Live Host(macOS)、Real daemon E2E。
  • 异常文件use-effort-command.ts 出现在本 PR 文件列表中只是一处 Prettier 重排(同一行赋值,代码完全相同),并非回退 main 侧 #8365 的修复。

已合入但未解决——现在成为 main 上的后续事项,@wenshao:你今天上午的五条 inline 意见在之后没有任何代码改动(分支最后一个提交早于这些意见)。简述:上传 hook 在渲染阶段中止进行中的上传;文件选择器目标切换分支静默空操作;SDK 继承的 30 秒默认超时与本路由 50 MiB 上限的矛盾;qualified 与 primary 信任门在缺失 trusted 字段时一个失败开放、一个失败关闭;批量超限提示行借用了第一个被拒绝文件的文件名。合并时 autofix takeover 仍处于接管状态,如需要可交由它处理。

备注:合并时本 PR 携带的 CHANGES_REQUESTED 状态来自钉在已被取代提交上的过期 review-bot 评审——没有任何未处理的人工评审。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

Built the PR base vs this PR head 015f1b0, 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[] "workspace_file_upload"

Qwen Code · serve A/B

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@qwen-code-dev-bot

qwen-code-dev-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

AutoFix round 2 finishedview run. See this round's report below.

中文说明

AutoFix 第 2 轮已完成 —— 查看运行。本轮报告见下方。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (idle-timeout (no output for 1200000ms — the sandbox likely hung at startup)) (attempt 1/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: idle-timeout (no output for 1200000ms — the sandbox likely hung at startup).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31391895896


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix updated a stale base — the fix did not pass verification, but this PR was behind main, so it merged current main in via update-branch and will retry on the next scan. A stale base (a dependency or symbol main already changed) can fail the build without being the fix's fault; if it still fails once current, it hands off to a human.

What I found before stopping:
Qwen failed during address-review: status 125.

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31394772225


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (idle-timeout (no output for 1200000ms — the sandbox likely hung at startup)) (attempt 3/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: idle-timeout (no output for 1200000ms — the sandbox likely hung at startup).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31397491013


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x), web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment (ubuntu-latest, 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x), web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment (ubuntu-latest, 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 4/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 4/100 轮)。改动内容与我反驳保留之处如下:

Autofix address-review summary — PR #8874

Feedback triage

  1. Failed CI checks (Serve A/B, Capture web-shell visuals, Test, Real daemon E2E / Java 11, web-shell E2E Smoke, Post Coverage Comment) — Addressed. Reproduced locally: npm run build failed at HEAD with exactly one TypeScript error, packages/cli/src/serve/fs/workspace-file-system.ts(2244,5): error TS2322: Type 'string' is not assignable to type 'ResolvedPath'. Root cause: the latest merge from main combined two designs — main's fix(serve): Allow approved external built-in text writes #8852 widened the atomic text writer's target to plain string so approved same-host tool writes can land outside the workspace, while this PR's extracted shared temp+publish core (atomicPublishResolvedFile) still required the branded ResolvedPath. Every listed check builds the repository or runs tests that depend on that build, so this single compile error is the evidence-backed failure cause for all six. CI logs are not readable from this runner (no GitHub credentials); the diagnosis comes from exact local reproduction, and all build/test gates pass after the fix.
  2. @ytahdn E2E / interactive test report — Informational; no action required. It reports the upload entry, progress UI, file-tag insertion, multi-file and conflict-renamed paths validated manually, plus 244 + 11 + 231 automated tests and full build/typecheck/lint green.
  3. web-shell visual preview bot comment — Informational; deferred (nice-to-have, budget warning). The preview correctly reports no screenshot changed because no visual scenario seeds the upload UI state. Adding a scenario to screenshots.spec.ts is worthwhile but not blocking; under this round's budget warning ("address and verify the smallest blocking subset, decline nice-to-haves") it is declined for now and recorded here so it is not silently dropped.
  4. serve daemon A/B bot comment — Informational; no action required. The only response diff is the new workspace_file_upload capability feature flag, which is this PR's intended surface.

Changes

  • packages/cli/src/serve/fs/workspace-file-system.ts (commit b01325f422, +3/−3): widened atomicPublishResolvedFile's target parameter from ResolvedPath to string and dropped the two as string casts that became redundant. The shared temp+publish mechanics do not depend on workspace containment — callers own resolution/validation: the workspace write methods and the new writeBytesAtomic upload path pass ResolvedPath (assignable to string), and main's same-host tool write path passes a validated external absolute path. Type-level only; no runtime behavior change.

Conflict notes

--conflict false; no base merge performed. The change above repairs a bad interaction introduced by the main merge already on this branch, not a conflict with the current base.

Deferred / remaining

  • A web-shell visual-preview scenario that seeds the upload UI (triage item 3) — deferred as a non-blocking nice-to-have. No inline findings existed this round, so there is no inline thread to attach a comment-replies.json entry to; the deferral is recorded here instead.

Verification

Commands actually run this round, in order:

  • npm run buildfailed before the fix with TS2322 at workspace-file-system.ts:2244 (exact CI-equivalent reproduction); re-run after the fix, passed (exit 0)
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest packages/cli focused: serve/fs/workspace-file-system.test.ts, serve/routes/workspace-file-write.test.ts, serve/routes/workspace-file-read.test.ts, serve/workspace-qualified-rest.test.ts, serve/server.test.ts, serve/bridge-file-system-adapter.test.ts — 1188 passed | 1 skipped
  • vitest packages/sdk-typescript: test/unit/DaemonClient.upload.test.ts — 11 passed
  • vitest packages/web-shell: useFileUpload.test.tsx, ChatEditor.test.tsx, AtMentionPanel.test.tsx, useAtMentionMenu.test.tsx, useComposerCore.dom.test.tsx — 198 passed

Not run (with reason): integration tests after npm run bundle — the change is type-level inside the serve fs module and is fully covered by the unit suites above; npm run generate:settings-schema — no settings source was touched.

中文说明

Autofix address-review 摘要 — PR #8874

反馈分类

  1. 失败的 CI 检查(Serve A/B、Capture web-shell visuals、Test、Real daemon E2E / Java 11、web-shell E2E Smoke、Post Coverage Comment)— 已处理。 本地精确复现:npm run build 在 HEAD 上失败,只有一个 TypeScript 错误:packages/cli/src/serve/fs/workspace-file-system.ts(2244,5): error TS2322: Type 'string' is not assignable to type 'ResolvedPath'。根因:最近一次从 main 的合并把两套设计拼在了一起 —— main 的 fix(serve): Allow approved external built-in text writes #8852 把原子文本写入器的 target 放宽为普通 string,以便经批准的宿主机内置工具写入可以落在工作区之外;而本 PR 抽取出的共享"临时文件+发布"核心(atomicPublishResolvedFile)仍然要求品牌类型 ResolvedPath。上述每个检查都要构建仓库、或运行依赖该构建的测试,因此这一个编译错误就是全部六个检查失败的有证据支持的根因。本 runner 没有 GitHub 凭据、无法读取 CI 日志;诊断来自本地精确复现,修复后所有构建/测试门禁均已通过。
  2. @ytahdn 的 E2E / 交互式测试报告 — 信息性内容;无需处理。报告显示上传入口、进度 UI、文件标签插入、多文件及冲突重命名路径均已手工验证,另有 244 + 11 + 231 个自动化测试以及完整的 build/typecheck/lint 全绿。
  3. web-shell 视觉预览机器人评论 — 信息性内容;暂缓(锦上添花项,受预算警告约束)。 预览正确地报告"没有截图变化",因为目前没有任何视觉场景构造出上传 UI 的状态。给 screenshots.spec.ts 增加一个场景是值得做的,但并非阻塞项;按照本轮预算警告("处理并验证最小阻塞子集,拒绝锦上添花项"),本轮暂不实施,并在此记录以免被静默丢弃。
  4. serve daemon A/B 机器人评论 — 信息性内容;无需处理。响应中唯一的差异是新增的 workspace_file_upload capability 特性标志,这正是本 PR 预期的对外接口变化。

变更内容

  • packages/cli/src/serve/fs/workspace-file-system.ts(提交 b01325f422,+3/−3):把 atomicPublishResolvedFiletarget 参数从 ResolvedPath 放宽为 string,并删除因此变得冗余的两处 as string 强制转换。共享的"临时文件+发布"机制与工作区包含关系无关 —— 解析/校验由调用方负责:工作区写入方法和新增的 writeBytesAtomic 上传路径传入 ResolvedPath(可赋值给 string),main 的宿主机工具写入路径传入已校验的外部绝对路径。纯类型层修改;运行时无行为变化。

冲突说明

--conflict false;未执行 base 合并。上述修改修复的是本分支上已有的 main 合并引入的不良交互,而不是与当前 base 的冲突。

暂缓 / 遗留

  • 为上传 UI 构造状态的 web-shell 视觉预览场景(分类第 3 项)— 作为非阻塞的锦上添花项暂缓。本轮没有任何行内(inline)发现,因此没有可挂载 comment-replies.json 回复的行内线程;该暂缓事项记录于此。

验证

本轮实际执行的命令(按顺序):

  • npm run build修复前失败,错误为 workspace-file-system.ts:2244 处的 TS2322(与 CI 等价的精确复现);修复后重跑,通过(exit 0)
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest packages/cli 定向:serve/fs/workspace-file-system.test.tsserve/routes/workspace-file-write.test.tsserve/routes/workspace-file-read.test.tsserve/workspace-qualified-rest.test.tsserve/server.test.tsserve/bridge-file-system-adapter.test.ts — 1188 通过 | 1 跳过
  • vitest packages/sdk-typescript:test/unit/DaemonClient.upload.test.ts — 11 通过
  • vitest packages/web-shell:useFileUpload.test.tsxChatEditor.test.tsxAtMentionPanel.test.tsxuseAtMentionMenu.test.tsxuseComposerCore.dom.test.tsx — 198 通过

未执行的命令(附原因):npm run bundle 之后的集成测试 — 本次改动是 serve fs 模块内的纯类型层修改,上述单元测试已完整覆盖;npm run generate:settings-schema — 未改动任何 settings 源文件。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix stopped: this counting window now contains 3 time-budget exhaustions (pushed rounds in between included; this round itself may have failed differently). That is 3 full agent runs that pushed nothing. 3 of those were silent-sandbox (idle) timeouts that no budget increase can cure — investigate the sandbox image and runner docker daemon for those. A human should investigate the sandbox image and runner docker daemon, then comment @qwen-code /retry to re-arm. Until then future scans will skip this PR.

What I found before stopping:
Qwen failed during address-review: idle-timeout (no output for 1200000ms — the sandbox likely hung at startup).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31408890753


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

⏸️ Takeover paused: this PR reached its round cap (100/100). Comment @qwen-code /takeover to re-arm a fresh window and continue management, or @qwen-code /takeover stop to release.

中文说明

⏸️ 托管已暂停:本 PR 达到轮次上限(100/100)。评论 @qwen-code /takeover 可重新武装、开启新窗口继续托管;或评论 @qwen-code /takeover stop 释放。

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

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

Not explored to full depth (tool budget reached): You are review agent reverse-audit — Reverse audit agen...: none — all checks above completed within budget.; You are review agent reverse-audit — Reverse audit agen...: none — all checks above completed within budget.; You are review agent reverse-audit — Reverse audit agen...: none — all checks above completed within budget.; chunk 3: could not execute workspace-file-system.test.ts -t "writeBytesAtomic" — worktree dependency install is incomplete (missing lowlight , @vitest/coverage-v8 ),…; You are review agent reverse-audit — Reverse audit agen...: none — all checks I started completed within budget., and 6 more.

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

中文说明

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

未探索到全部深度(达到工具调用预算):You are review agent reverse-audit — Reverse audit agen...:none — all checks above completed within budget.;You are review agent reverse-audit — Reverse audit agen...:none — all checks above completed within budget.;You are review agent reverse-audit — Reverse audit agen...:none — all checks above completed within budget.;chunk 3:could not execute workspace-file-system.test.ts -t "writeBytesAtomic" — worktree dependency install is incomplete (missing lowlight , @vitest/coverage-v8 ),…;You are review agent reverse-audit — Reverse audit agen...:none — all checks I started completed within budget.,另有 6 条。

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

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

Comment thread packages/web-shell/client/hooks/useFileUpload.ts
Comment thread packages/web-shell/client/components/ChatEditor.tsx
Comment thread packages/web-shell/client/hooks/useAtMentionMenu.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-file-write.test.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-file-write.ts
Comment thread packages/web-shell/client/components/ChatEditor.module.css
Comment thread packages/web-shell/client/components/ChatEditor.module.css
Comment thread packages/web-shell/client/components/ChatEditor.tsx
Comment thread packages/sdk-typescript/src/daemon/DaemonClient.ts Outdated
Comment thread packages/web-shell/client/components/ChatEditor.tsx
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Round-6 review findings — all 17 addressed

Commit: fix(review): address round-6 web shell file upload review findings (#8874) (12 files, +536/−102). No base-conflict merge was needed (--conflict false).

Critical findings

  • R6-8 — generation/client race on target switch (useFileUpload) — FIXED. The generation is now invalidated synchronously during render when targetKey changes (bumping the generation and aborting active/queued controllers) before clientRef.current is reassigned, closing the commit↔passive-effect window where a stale completion could pass the old-generation guard while already holding the new target's client. Added a regression test that renders the switch outside act, lands the in-flight completion inside the commit/effect window via chained-macrotask polling, and asserts neither the stale onUploaded fires nor the queued file uploads through the new client. Mutation-verified: removing the render-phase guard makes the test fail with the exact probed symptom.
  • R6-16 — session switch with the picker open loses the @query — FIXED (two cooperating parts). (1) ChatEditor now flushes a pending picker restore in a useLayoutEffect keyed on the upload target key; layout effects run before the composer's passive session-swap effect persists the outgoing draft, so the query is re-inserted into the OWNING session's draft before the swap. (2) The session-switch picker test now pins this ordering: the restore must already have run immediately after the re-render, and the later picker event finds nothing left to restore.
  • R6-17 — all files rejected locally never restores the query — FIXED. uploadFiles now returns how many files were actually queued; handleUploadPickerChange invokes the captured restore when that count is zero. Added a regression test (all-oversized picker selection → no HTTP request, restore called once). Mutation-verified.
  • R6-19 — async trailing tag insertion defeats the restore guard — FIXED. The restore guard now tolerates a pure end-append (the upload flow's own completed @file tags) by checking that the doc still starts with the captured post-removal text instead of requiring strict doc identity, while whole-doc session swaps are consumed by the flush above. Added a regression test. Mutation-verified.

Suggestions

  • R6-1 — fire-and-forget waitFor — FIXED. The disconnect test now awaits vi.waitFor (5s timeout) instead of void waitFor(...).then(...), so a timeout fails that test rather than escaping as an unhandled rejection into a later test.
  • R6-2 — ELOOP symlink cycle aborts the upload — FIXED. The candidate loop treats a symlink_escape whose cause is ELOOP as merely an occupied name and numbers on; genuine escapes still stop the loop. Two regression tests (self-cycle, two-hop cycle). Mutation-verified.
  • R6-3 — picker teardown while the OS dialog is open — FIXED via the same flush mechanism as R6-16: any upload-target change (session switch, capability flip tearing down the input, workspace swap) consumes the pending restore synchronously, so the query is handed back even though no cancel/change event will ever arrive.
  • R6-5 — untested busy gates — FIXED. Added a DOM test proving workspaceUploadBusy blocks retryLast() and searchState.submitSearchMatch(), with positive controls (history seeded and visible in search matches).
  • R6-10 — benign client disconnects logged as unhandled errors — FIXED. The upload body parser now recognizes ECONNABORTED / req.aborted during body buffering and returns without next(err); the gate slot is already released by the pre-handler response-close listener.
  • R6-12 — canonicalized admission dir rejects symlinked directories — FIXED. Candidates are re-resolved from the literal request directory (which admission validated) instead of the canonicalized one, so docs -> aux no longer trips the DOS-device pattern check on a segment the client never wrote. The workspace-root case stays covered. Regression test included; mutation-verified.
  • R6-13 — live regions announce every progress tick — FIXED. Per-row role="status"/aria-live removed; the strip now has a single visually hidden live region fed only by terminal transitions (name: status for done/error rows). Status text is computed by one shared helper.
  • R6-14 — NUL byte reaches fs and 500s — FIXED. Admission now rejects any path containing \0 with the 400 parse_error envelope before gate/buffering (covers both basename and dir components); regression test asserts no fs.denied event is emitted.
  • R6-15 — inflate decodes bodies the client never sent as-is — FIXED. The raw parser sets inflate: false; encoded bodies get the exact 415 unsupported_media_type envelope instead of being silently decoded (or a misleading 400). Regression test included.
  • R6-18 — one fs.denied per occupied candidate during auto-numbering — FIXED. writeBytesAtomic no longer audits the expected no-clobber file_already_exists collision (upload-route control flow) as fs.denied; all other failures still audit. Two regression tests (fs layer + a route-level three-collision upload asserting zero new denied events).
  • R6-23 / R6-7 — design doc drift — FIXED. The hook API block now matches the implementation (FileUploadClient | undefined, errorCode, skippedCount, isBusy, optional onUploaded, numeric uploadFiles return), the MAX_FILES_PER_BATCH cap and overflow row are documented (including a test-plan item), and the stale writeEncodedTextTemp reference now names the real atomicWriteTextResolvedFile.
  • R6-27 — trailing-slash path writes a file beside the directory — FIXED. Admission rejects directory-shaped paths (queryPath.endsWith('/')) with 400 parse_error even when a same-named directory exists; regression tests assert no numbered file appears.

Every new behavioral fix is covered by a focused Vitest regression test; the five highest-risk fixes (R6-8, R6-17, R6-19, R6-12, R6-2) were additionally mutation-verified (the fix temporarily removed → the new test fails; fix restored → green).

Verification

Commands actually run on the final committed tree (all required gates re-run after every mutation restore):

  • npm run build — passed (exit 0, no TS errors)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0; eslint . --ext .ts,.tsx + eslint integration-tests)
  • npx prettier --check on the 12 changed files — passed ("All matched files use Prettier code style")
  • Focused Vitest, packages/cli: npx vitest run src/serve/fs src/serve/routes/workspace-file-write.test.ts src/serve/routes/workspace-qualified-rest.test.ts — 7 files, 295 passed
  • Focused Vitest, packages/web-shell: npx vitest run (whole package) — 179 files, 3187 passed
  • Mutation checks (temporary, all reverted afterwards): removing the R6-8 render-phase guard, the R6-17 zero-queued restore, the R6-19 append-tolerant guard, the R6-12 literal-dir resolution, or the R6-2 ELOOP continue each made the corresponding new test fail; restored fixes leave all suites green.

Not run (not applicable): integration tests after npm run bundle (the touched behavior is fully exercised by the unit/route suites above, not only through the bundled CLI) and npm run generate:settings-schema (no settings source changed).

中文说明

第 6 轮评审发现 — 全部 17 项已处理

提交:fix(review): address round-6 web shell file upload review findings (#8874)(12 个文件,+536/−102)。无需合并基分支(--conflict false)。

Critical 发现

  • R6-8 — 目标切换时 generation/client 竞态(useFileUpload) — 已修复。当 targetKey 变化时,现在在渲染阶段同步作废 generation(递增 generation 并中止进行中/排队的上传控制器),然后才重新赋值 clientRef.current,从而关闭了"提交↔被动 effect"窗口——此前陈旧的完成回调可能通过旧 generation 守卫、却已持有新目标的 client。新增回归测试:在 act 之外渲染切换、用链式宏任务轮询把进行中完成回调落在 commit/effect 窗口内,断言陈旧的 onUploaded 不触发、排队文件也不会通过新 client 上传。已做变异验证:移除渲染阶段守卫后该测试以探针观测到的原始症状失败。
  • R6-16 — 文件选择器打开时切换会话导致 @query 丢失 — 已修复(两部分协同)。(1)ChatEditor 现在用以上传目标 key 为依赖的 useLayoutEffect 冲刷待执行的 picker restore;layout effect 先于 composer 的被动会话切换 effect 持久化旧草稿之前运行,因此查询文本会在切换前被重新插回所属会话的草稿。(2)会话切换 picker 测试现在钉住该顺序:re-render 之后 restore 必须已经执行过,之后的 picker 事件找不到可 restore 的内容。
  • R6-17 — 所有文件被本地拒绝时从不恢复查询文本 — 已修复。uploadFiles 现在返回实际入队数量;handleUploadPickerChange 在该数量为 0 时调用捕获的 restore。新增回归测试(全部超大的 picker 选择 → 无 HTTP 请求、restore 恰好调用一次)。已做变异验证。
  • R6-19 — 异步尾部 tag 插入破坏 restore 守卫 — 已修复。restore 守卫现在容忍纯尾部追加(上传流程自身完成的 @file tag):校验文档仍以删除后捕获的文本开头,而不再要求严格的文档同一性;整文档会话切换则由上述冲刷机制消费。新增回归测试。已做变异验证。

Suggestion 发现

  • R6-1 — 发后不管的 waitFor — 已修复。断连测试现在 await vi.waitFor(5 秒超时),不再是 void waitFor(...).then(...),超时会让测试失败,而不是以未处理 rejection 的形式归因到后续测试。
  • R6-2 — ELOOP 符号链接循环中止上传 — 已修复。候选名循环现在把 cause 为 ELOOPsymlink_escape 视为"名字被占用"并继续自动编号;真正的边界逃逸仍会终止循环。两个回归测试(自循环、双跳循环)。已做变异验证。
  • R6-3 — OS 对话框打开期间 picker 被拆除 — 通过与 R6-16 相同的冲刷机制修复:任何上传目标变化(会话切换、能力翻转导致 input 拆除、工作区切换)都会同步消费待执行的 restore,即使 cancel/change 事件永远不会到达,查询文本也会被归还。
  • R6-5 — 未测试的 busy 门控 — 已修复。新增 DOM 测试证明 workspaceUploadBusy 会阻止 retryLast()searchState.submitSearchMatch(),并带正向对照(历史已注入且能在搜索匹配中看到)。
  • R6-10 — 良性客户端断连被记为未处理错误 — 已修复。上传 body 解析器现在识别 body 缓冲期间的 ECONNABORTED / req.aborted,直接返回而不 next(err);gate 槽位已由 handler 前的 response-close 监听器释放。
  • R6-12 — 规范化后的 admission 目录拒绝符号链接目录 — 已修复。候选名现在从字面请求目录(admission 已验证)重新解析,而不是从规范化目录解析,因此 docs -> aux 不会再因客户端从未写过的 aux 段触发 DOS 设备名模式检查。工作区根路径的既有场景仍被覆盖。含回归测试;已做变异验证。
  • R6-13 — live region 播报每一次进度 tick — 已修复。移除每行的 role="status"/aria-live;strip 现在只有一个视觉隐藏的 live region,仅由终态变化(done/error 行的 文件名: 状态)驱动。状态文本由同一个共享辅助函数计算。
  • R6-14 — NUL 字节穿透到 fs 层返回 500 — 已修复。admission 现在在 gate/缓冲之前拒绝任何含 \0path,返回 400 parse_error 信封(同时覆盖 basename 与目录分量);回归测试断言不产生 fs.denied 事件。
  • R6-15 — inflate 静默解码破坏字节保真 — 已修复。raw 解析器设置 inflate: false;带编码的 body 返回精确的 415 unsupported_media_type 信封,而不是被静默解码(或误导性的 400)。含回归测试。
  • R6-18 — 自动编号时每个被占用候选名产生一条 fs.denied — 已修复。writeBytesAtomic 不再把预期内的 no-clobber file_already_exists 碰撞(上传路由的控制流)审计为 fs.denied;其他失败仍照常审计。两个回归测试(fs 层 + 路由层三次碰撞上传断言零新增 denied 事件)。
  • R6-23 / R6-7 — 设计文档漂移 — 已修复。hook API 代码块已与实现对齐(FileUploadClient | undefinederrorCodeskippedCountisBusy、可选 onUploadeduploadFiles 返回数字),补充了 MAX_FILES_PER_BATCH 上限与溢出行的说明(含测试计划条目),失效的 writeEncodedTextTemp 引用改为真实的 atomicWriteTextResolvedFile
  • R6-27 — 尾斜杠 path 在目录旁写出文件 — 已修复。admission 拒绝目录形态的路径(queryPath.endsWith('/')),返回 400 parse_error,即使存在同名目录;回归测试断言不会出现编号文件。

每个新的行为修复都有聚焦的 Vitest 回归测试覆盖;风险最高的五项修复(R6-8、R6-17、R6-19、R6-12、R6-2)还做了变异验证(临时移除修复 → 新测试失败;恢复修复 → 全部通过)。

验证

在最终提交的代码树上实际执行的命令(每次变异恢复后均重新执行所有必需门禁):

  • npm run build — 通过(exit 0,无 TS 错误)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0;eslint . --ext .ts,.tsx + eslint integration-tests
  • 对 12 个变更文件执行 npx prettier --check — 通过("All matched files use Prettier code style")
  • 聚焦 Vitest(packages/cli):npx vitest run src/serve/fs src/serve/routes/workspace-file-write.test.ts src/serve/routes/workspace-qualified-rest.test.ts — 7 个文件,295 通过
  • 聚焦 Vitest(packages/web-shell):npx vitest run(整包)— 179 个文件,3187 通过
  • 变异检查(临时变更,均已还原):分别移除 R6-8 渲染阶段守卫、R6-17 零入队 restore、R6-19 容忍追加的守卫、R6-12 字面目录解析、R6-2 ELOOP continue 后,对应的新测试均失败;恢复修复后所有套件保持绿色。

未执行(不适用):npm run bundle 后的集成测试(本次触及的行为已由上述单元/路由套件完整覆盖,并非只能通过打包 CLI 验证);npm run generate:settings-schema(未改动任何 settings 源)。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

…/pr-8874-review-fixes

# Conflicts:
#	.qwen/review-context.json
#	packages/cli/src/commands/review/lib/manifest-repository-context.committed.test.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

🤖 Autofix review round: no action taken

The feedback collected for this round contains nothing new to address:

  • Reviews: none newer than the last evaluation (2026-08-12T11:53:04Z).
  • Inline comments: none newer than the last evaluation.
  • Issue-level comments: only the workflow bot's own status announcements (takeover notice and previous-round summary) — not review feedback.
  • Failed checks: none. All 27 checks on the current head are green.
  • Base conflicts: none reported (--conflict false), so no merge of main was performed.

No code changes were made and no commit was created. The PR head remains at the last reviewed commit.

中文说明

🤖 Autofix 评审轮次:未采取任何操作

本轮收集到的反馈中没有需要处理的新内容:

  • 评审(Reviews): 上次评估(2026-08-12T11:53:04Z)之后没有新的评审。
  • 行内评论(Inline comments): 上次评估之后没有新的行内评论。
  • Issue 级评论: 仅有工作流机器人自身的状态通告(接管通知与上一轮总结),不属于评审反馈。
  • 失败的检查: 无。当前 head 上的全部 27 项检查均为绿色通过。
  • 与基分支的冲突: 未报告冲突(--conflict false),因此没有执行对 main 的合并。

未做任何代码改动,也没有创建新的提交。PR 的 head 仍停留在上一次已评审的提交上。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

yiliang114
yiliang114 previously approved these changes Aug 13, 2026

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approved after a security-focused pass over the daemon ingress path at head 2bf40fa.

Security boundary (verified in code, not just tests)

  • Auth: both /file/upload and /workspaces/:workspace/file/upload register AFTER the global bearerAuth (server.ts:1699) and behind mutate({ strict: true }), which requires a token even on loopback defaults; untrusted workspaces get 403. No new unauthenticated surface in LAN mode. Covered by the requires a token (401) and untrusted_workspace (403) tests.
  • Containment: admission resolves the parent with fs.resolve(dir, 'write') and re-resolves every numbered candidate from the literal query dir through the pre-existing resolveWithinWorkspace (same boundary as the reviewed read/write routes). Null bytes, ./.. basenames, trailing slashes, and suspicious patterns (UNC/device/8.3/drive-colon) are rejected before buffering; ../ escape returns path_outside_workspace with nothing written.
  • Symlinks: never writes through in-workspace links (numbers on), rejects escaping links and symlinked parents, treats ELOOP cycles as occupied names, and assertCreateTargetAbsent refuses link targets. The documented residual parent-symlink-swap TOCTOU is defense-in-depth guarded and identical to the existing text-write path — not new exposure.
  • Limits before buffering: 50 MiB cap shared by one constant across the Content-Length pre-check, express.raw({ limit, inflate: false }) (encoded bodies rejected, chunked can't bypass), and enforceWriteSize in the fs layer; 4-slot concurrency gate bounds worst-case memory and releases on finish/close/abort (tested end-to-end).
  • Overwrite semantics are explicit: uploads NEVER clobber. Publish uses link() (atomic EEXIST guarantee closing the POSIX rename-overwrite race), O_EXCL temp reservation, temp-identity re-checks, and temp cleanup on failure; occupied names auto-number with a 1000-candidate cap → 409.

Correctness: no phantom 0-byte file on mid-admission disconnect (req.aborted || res.closed guard + test); distinct errorKind envelopes (413/415/400/403/409/429); client hook aborts in-flight + queued uploads on workspace/session switch with synchronous generation invalidation during render (addresses the round-6 R6-8 race); batch capped at 100 files; SDK transports (fetch/XHR) share one auth/timeout/error path. Capability workspace_file_upload + limits.maxWorkspaceFileUploadBytes plumbed through daemon → SDK → hook; all 15 i18n keys registered in EN and ZH.

Test coverage: ~1150 lines of route tests hit exactly the security boundaries (traversal, symlink escape/cycle/dangling, oversize declared + buffered + exact-limit, 401/403/415, 255/256-byte names, candidate exhaustion, gate slot leak scenarios, concurrent same-name landing on distinct candidates), plus 722 lines of SDK upload tests.

Round-6 findings: addressed by 72a89c1, merged into this head; remaining bot items are Suggestion-level test-pinning nits (R3-*), fine as follow-ups, none blocking.

Nits (non-blocking)

  • P3: worst-case 4 × 50 MiB in-memory buffering is fine for a token-gated daemon; a streaming-to-temp variant would be the future direction if the cap grows.
  • P3: a few R3-* suggestions about assertion pinning (e.g. abort-listener identity, xhr.timeout inheritance) could harden the suite later.

CI on head: 27 check runs all success/skipped except review-pr (the bot review workflow itself, still running) — no test failures, no known flakes.

@ytahdn

ytahdn commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /verify

@qwen-code-ci-bot

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

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

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

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

Verification report

PR 8874 Deep Verification (follow-up round) — feat(web-shell): support workspace file uploads

Verdict: merge-ready — 2166/2166 scripted assertions passed (pass=2166 fail=0), verified head 2bf40faf1c47787ea1d8d92b30085b6ceabea717, base 02f1e90a0afa0f163119ad64ad357a1db03ae58e (merge ed9fd301ff). Follow-up round: previous head was 59d8d4dd; delta = round-6 review fixes (72a89c1f) + a merge of main (2bf40faf, new base). All carried-forward measurements re-run at the new head; no regressions, one previous finding partially fixed on the PR's own surface.

中文 — 判定:✅ 通过 · 可合入(agent 判定)
  • 结论merge-ready。本轮为跟进轮:上轮 head 59d8d4dd 之后仅新增 round-6 评审修复(12 文件)与一次 main 合并(新 base 02f1e90a)。中心声明(daemon 二进制上传路由端到端可用且安全)在新 head 上重新全量实测成立。
  • A/B 结论:head 侧真实 daemon 79/79 断言通过(字节一致、不覆盖自动编号、50 MiB 边界、四槽准入门 429、信任门 403、qualified 不回落主工作区,以及 round-6 新行为:symlinked 父目录 docs→aux 上传成功、NUL 字节 400 不再 500、尾斜杠拒绝、gzip 编码体 415、中途断连槽位释放、ELOOP 符号链接循环按占用编号、no-clobber 冲突不再产生 fs.denied 审计);base 侧 11/11(路由 404、能力未声明、文本写限制两侧一致、NUL 在共享层两侧同为 500)。见 01-head-upload-matrix.png / 02-base-upload-matrix.png
  • 变异矩阵:9 个变异全部击杀(4 个上轮携带 + 4 个 round-6 守卫 + 1 个 queryDir 修复回退),无幸存者;未变异对照 198+28 全绿。见 03-mutation-matrix.png
  • 门禁:CLI 7 个变更测试文件 1302 通过;manifest 测试 5/5 恢复绿(上轮环境红已被合并解决);integration serve 路由 36/36;SDK 上传 28/28;Web Shell 6 个变更文件 689/689;SDK 浏览器包 192,252 B ≤ 188 KB 预算(余量 260 B,门禁活性经植入违规证明);web-shell typecheck 绿。
  • 上轮 findings 状态:F1(NUL 路径 500+路径泄露,预存)在上传路由面已修(round-6 新增 400 parse_error),共享 /file/write 层仍存在(两侧 A/A 实证,非本 PR 引入);F2(控制/RTL 字符文件名按 POSIX 合法落盘)与 F3(SDK 包余量 260 B)复测维持,均非阻塞。
  • 未覆盖:浏览器真实 UI E2E 与 XHR 进度事件(容器无浏览器)、逐 commit 归因(depth-2 浅克隆)、fs.denied 的活体 SSE 观察(单元层事件列表已证)、仓库级 lint(以各工作区 build/typecheck 代替)。

Previous-finding status (follow-up round)

# Finding (previous round) Severity Status at new head 2bf40faf
F1 NUL byte in any path → 500 internal_error echoing a daemon-internal absolute path (shared fs layer) note, pre-existing Partially fixed. The round-6 commit added a pre-buffer NUL reject to the upload admission: live cells C6e–C6g → 400 parse_error "path must not contain null bytes", no path echo, nothing written; mutant R1 (guard removed) is killed by the round-6 test rejects the NUL-bearing path with parse_error and no denied event (expected 500 to be 400). The shared layer still 500s elsewhere: /file/write NUL → 500 + absolute-path echo on both head (cell N2) and base (cell B6) — A/A attribution unchanged; the residual gap is not caused by this PR and lives outside its surface.
F2 Control/RTL characters in filenames accepted as literal POSIX names nit Stands. Re-measured at the new head (04-hostile-names-probe.png): bad\nname.bin, bad\rname.bin, bad\tname.bin, \u202edoc.bin (RTL override), ZWJ name — 5/5 accepted, 201, byte-identical on disk. Daemon-side correct; the Web Shell tag renderer should remain aware of deceptive RTL-override display. No action required for merge.
F3 SDK browser-bundle headroom ~0.3 KB under the budget the PR bumps observation Stands. Re-measured: dist/daemon/index.js = 192,252 B (187.7 KB) vs the 188 KB budget → 260 B headroom. Gate proven live this round: real budget passes, a planted 180 KB budget throws Browser daemon SDK bundle is 192252 bytes; expected <= 184320.
F4 2 reds in manifest-repository-context.committed.test.ts from a root-owned dirty .qwen/review-context.json in the verify container environmental Resolved. The merge of main took the new-base versions of both .qwen/review-context.json and the test (PR diff against HEAD^1 is empty for those paths); the file on disk now matches HEAD (git status clean) and the suite runs 5/5 green at HEAD in this same container.
note PR description says "11 SDK upload tests"; the suite contains 28 nit Stands (harmless undercount) — suite still 28 tests, all green.

Delta since the previous round

  • 72a89c1f round-6 review fixes (12 files, the only PR-side code delta): (1) no-clobber collisions in writeBytesAtomic no longer emit fs.denied audit events (expected control flow of the candidate loop); (2) candidates re-resolve from the literal request directory (queryDir) instead of the canonicalized one — uploads through symlinked parents whose target name trips the suspicious-pattern check (e.g. docs -> aux) now succeed; (3) express.raw gets inflate: false plus an explicit 415 unsupported_media_type envelope for encoded bodies; (4) ECONNABORTED/aborted mid-body parses are swallowed (routine for large uploads); (5) trailing-slash paths rejected before dirname/basename normalization; (6) NUL-byte paths rejected pre-buffer with 400 parse_error (the F1 fix on this route's surface); (7) ELOOP symlink cycles occupying a candidate are treated as occupancy (number on) instead of symlink_escape errors.
  • 2bf40faf merge of main → new base 02f1e90a. Conflict surfaces .qwen/review-context.json and manifest-repository-context.committed.test.ts resolved identically to the new base (zero PR diff on those paths). One stray artifact: packages/cli/src/ui/hooks/use-effort-command.ts differs from base by a single whitespace-only hunk (re-wrapped const declaration, 1 @@ hunk, no token-level behavior change) — a merge-resolution formatting remnant, noted, not a finding.

Central claim and A/B proof

Central claim (carried, re-measured): the daemon exposes capability-gated binary upload ingress (POST /file/upload, POST /workspaces/:workspace/file/upload) that publishes bytes byte-identically, never overwrites (deterministic name (n).ext numbering), enforces a 50 MiB binary policy distinct from the 5 MiB text policy, bounds concurrency at 4 shared slots, and honors trust + workspace-qualification semantics without fallback to the primary runtime — while leaving existing text-write behavior unchanged.

Round-6 sub-claims (new this round): symlinked-parent resolution fix, NUL pre-buffer reject, trailing-slash reject, encoded-body 415, abort tolerance, ELOOP-as-occupancy, audit suppression for collisions.

Driven against a real qwen serve daemon (compiled dist/, bearer token, folder trust enabled via settings.json + trustedFolders.json source file) with raw HTTP/chunked-socket requests — no stubs of the unit under test. Harness: upload-matrix.mjs (this dir); raw logs head-run/matrix-head.log, base-run/matrix-base.log.

Cell group Observable oracle HEAD (79) BASE (11)
C1 capability features array contains workspace_file_upload; limits.maxWorkspaceFileUploadBytes = 52428800 ✅ both ✅ absent tag + absent limit key
C1.0 / B2 trust control GET /workspace/trusteffective {state: trusted, source: file}, folderTrustEnabled: true ✅ (symmetric control)
C2 byte identity, mode 1 MiB → 201, confirmed path, sha256 on disk, mode 0o600 ✅ 4/4 route 404, no file (B3)
C3 unicode/%/space names exact-name round-trip + bytes ✅ 6/6 n/a
C4 no-clobber numbering dup.txt(1)(2); dir occupancy; .env (1) + original untouched; 255-byte fit ≤255 chars ✅ 8/8 n/a
C5 traversal/absolute ../, /etc/…, sub/../../, x/../../y → 4×400 path_outside_workspace; nothing outside; no .tmp litter ✅ 6/6 n/a
C6 suspicious + NUL (round-6) CON, CON.txt, photo., trail → 400 parse_error; bad\0name.txt → 400 parse_error naming null bytes, no absolute-path echo ✅ 7/7 n/a (base has no route; B6 covers shared layer)
C7 byte cap exactly 50 MiB → 201 identical (236 ms); 50 MiB+1 → 413 file_too_large + maxBytes; no partial ✅ 5/5 n/a
C8 chunked oversize no Content-Length, 51 MiB streamed → 413 envelope; slot released (next 201) ✅ 2/2 n/a
C9 admission gate 4 held chunked uploads → 5th 429 upload_busy + Retry-After: 1; all 4 complete 201; retry 201 ✅ 7/7 n/a
C10 symlinks in-workspace symlink → alias (1).txt, target untouched; escaping symlink → 400 symlink_escape, nothing written ✅ 4/4 n/a
C11 content-type / missing path JSON body → 415; no ?path → 400 ✅ 2/2 n/a
N1 queryDir (round-6) upload through docs -> aux (DOS-name target) → 201, bytes land via symlink, confirmed path canonical (aux/probe.bin); two-hop chain also 201 ✅ 3/3 n/a (no route on base)
N3 trailing slash (round-6) sub2/dir/ → 400 parse_error even though the dir exists n/a
N4 encoded body (round-6) Content-Encoding: gzip → 415 unsupported_media_type; nothing written ✅ 2/2 n/a
N5 mid-body abort (round-6) headers + partial body + socket destroy → daemon healthy, next upload 201 (slot freed), stderr clean, no partial file ✅ 4/4 n/a
N6 ELOOP cycles (round-6) self-cycle cyc.txt -> cyc.txtcyc (1).txt, symlink untouched; two-hop ca<->cbca (1) ✅ 3/3 n/a
N2 / B6 F1 attribution /file/write NUL → 500 + path echo ✅ (persists, shared layer) identical (A/A)
C12 text-write control (both arms) create 201 + content intact; >5 MiB replace (with expectedHash) → 413 file_too_large ✅ 3/3 ✅ 3/3 identical
C13 qualified semantics unknown id → 400 workspace_mismatch, no fallback write; by-path selector → 201 into that workspace ✅ 4/4 qualified route 404 (B4)
C14 untrusted daemon legacy + qualified upload → 403 untrusted_workspace; nothing written ✅ 3/3 n/a

Totals: HEAD 79/79, BASE 11/11. Witness: 01-head-upload-matrix.png, 02-base-upload-matrix.png.

Contract clarifications observed (not defects): the confirmed path is the canonical workspace-relative form — uploading through docs -> aux confirms aux/probe.bin (the client tag inserts the canonical path); and the daemon serves a bootstrap /capabilities envelope for ~1 s after listening (features present, runtime-derived limits keys absent until the workspace runtime is up) — the harness polls /workspace/trust to 200 before asserting, as SDK clients do with Retry-After.

Corrections

None this round (no inaccurate prior review/bot claims to correct).

Findings (new this round)

No blocking findings. All 79 head cells and every gate green; 9/9 mutants killed. Two informational notes are folded into the table above (canonical confirmed path; bootstrap capabilities window) — both are documented contracts, not requested changes.

Gate and vacuity results

Gate Result
CLI changed test files (7): workspace-file-write.test.ts + fs/workspace-file-system.test.ts (198), bridge-file-system-adapter, workspace-file-read, server.test.ts, server/telemetry, workspace-qualified-rest (1104) 1302 passed / 0 failed
manifest-repository-context.committed.test.ts (prev-round environmental red) 5/5 passed at HEAD (see status table F4)
Integration cli/qwen-serve-routes.test.ts (real daemon, incl. capabilities baseline with workspace_file_upload) 36/36 passed (05-integration-serve-routes.png)
SDK test/unit/DaemonClient.upload.test.ts 28/28 passed
Web Shell changed test files (6): App, AtMentionPanel, ChatEditor, useAtMentionMenu, useComposerCore.dom, useFileUpload 689 passed / 0 failed
SDK build incl. 188 KB browser budget exit 0; bundle 192,252 B; gate liveness proven (planted 180 KB budget → throws)
Typecheck/build cli+core tsc --build on both arms (base rebuilt from HEAD^1 sources), SDK build (tsc), web-shell tsc -p tsconfig.json --noEmit — all green

Mutation matrix — 9/9 killed, zero survivors. Positive controls: the unmutated suites above (198 CLI + 28 web-shell green). Every mutant failed the intended behavioral assertion, not an import/compile break (witness 03-mutation-matrix.png, per-mutant logs mutant-*-killed.log):

Mutant Change Killed by Verdict
M1 writeBytesAtomic: MAX_UPLOAD_BYTESMAX_WRITE_BYTES (5 MiB text cap) 3 tests: fs-layer accepts a payload above the 5 MiB text cap (binary policy applies) + HTTP accepts an upload above the 5 MiB text cap (binary policy at HTTP) + accepts an upload of exactly MAX_UPLOAD_BYTES: expected 413 to be 201 killed
M2 route: no-clobber continue → surface error 11 numbering-family tests (.env (1) dotfiles, taken candidates, 255-byte trims incl. multi-byte boundary, concurrency race, dir occupancy, suspicious-root, 1000-candidate cap, no-fs.denied audit): expected 409 to be 201 killed
M3 web-shell hook: resultPath: result.pathtargetPath invokes onUploaded exactly once with the server-confirmed path: expected 'report.pdf' to be 'report (1).pdf' killed
G4 admission: remove declared-Content-Length pre-check rejects an oversized declared Content-Length with the upload 413 envelope (hangs/timeout without the guard) killed
R1 round-6: remove NUL-byte admission check rejects the NUL-bearing path with parse_error and no denied event (×2 shapes): expected 500 to be 400 — the mutant reproduces the exact pre-fix F1 behavior killed
R2 round-6: remove inflate: false rejects an encoded request body instead of silently decoding it: expected 201 to be 415 — without the guard the gzip body is silently decoded and published killed
R3 round-6: remove ELOOP-cycle continue numbers past a symlink cycle… + …two-hop symlink cycle…: expected 400 to be 201 killed
R4 round-6: revert audit suppression (collisions audit again) does not audit a no-clobber collision as fs.denied (got 1) + emits no fs.denied events for a successful auto-numbered upload (got 3, expected 0) killed
R5 round-6: revert queryDir: dir → canonicalized workspaceRelative(req, resolvedDir) uploads through a symlinked directory whose target trips the pattern check: expected 400 to be 201 — exactly one test, the one added for this fix killed

R2's surviving form is the dangerous one (silent publication of bytes the client never sent); the mutant proves the guard is load-bearing, not cosmetic.

Not covered

  • Browser-rendered Web Shell UI (drag styling, progress strip cadence, tag insertion): container has no browser; covered by the jsdom suites (689 green) and code reading only. XHR upload progress events are browser-only by design (SDK throws pre-send where XMLHttpRequest is undefined) — real progress cadence unmeasured.
  • Per-commit attribution: depth-2 shallow checkout; the two delta commit objects (72a89c1f, 2bf40faf) are present and their diffs verified directly, but git rev-list across the shallow boundary is unreliable, so the 22-commit metadata list was not individually exercised. Verified the aggregate HEAD^1..HEAD diff.
  • Live fs.denied observation: audit suppression is proven at the unit layer via captured bridge-event lists (R4's kill shows the events that would appear); no live SSE sink was subscribed.
  • Draining/removed qualified workspaces (503 workspace_runtime_unavailable): pinned by the executed workspace-qualified-rest.test.ts suite; the live matrix covered the unknown-workspace cell only.
  • Repo-wide lint: not run; per-workspace builds/typechecks above stand in. Repo-wide typecheck replaced by the same.
  • A/B of the queryDir fix against round-5 head (59d8d4dd): not rebuilt as a third daemon arm; proven instead by mutant R5 + live N1 cells.
  • PR-declared out-of-scope surfaces: resumable/chunked uploads, folder uploads, overwrite-in-place, ACP-HTTP parity, Windows/Linux manual UI.

Methodology

Linux container (Node v22.23.2), merge-ref checkout at depth 2 (HEAD merge ed9fd301ff, HEAD^1 base 02f1e90a, HEAD^2 head 2bf40faf). Base arm: git worktree at HEAD^1 with root + per-package node_modules symlinked from the already-installed head tree, scripts/generate-git-commit-info.js run for the gitignored generated file, then npm run build of packages/cli only (base dist stamped 02f1e90a0a; workspace_file_upload absent from its capabilities — verified by grep). Control cleanliness: PR diff empty for packages/core, package.json, package-lock.json (so reusing the head node_modules is a clean control); @qwen-code/qwen-code-core realpath resolves into the head tree whose core sources are byte-identical to base; packages/cli/src/serve/** contains zero @qwen-code/sdk imports (grep), so the changed SDK cannot leak into either arm. Harnesses booted real daemons (dist/index.js serve --port 0 --token … --workspace <mkdtemp>) with scratch HOME/QWEN_HOME, security.folderTrust.enabled=true in settings.json, trust granted/withheld via QWEN_CODE_TRUSTED_FOLDERS_PATH; waited past the bootstrap envelope by polling /workspace/trust to 200; drove them with fetch + raw http chunked sockets (gate holds, oversize streams, mid-body aborts) and asserted on bytes-on-disk + response envelopes. Mutants applied by exact single-occurrence string replacement, run through vitest, restored via git checkout -- with clean-status verification after each (worktree ended clean). Evidence images produced with scripts/verify-capture.mjs; raw logs and harness scripts live alongside this report. Base worktree removed after the A/B cells were captured.

Evidence images

01-head-upload-matrix

02-base-upload-matrix

03-mutation-matrix

04-hostile-names-probe

05-integration-serve-routes

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

Qwen Code · sandboxed verification

…pload

# Conflicts:
#	packages/web-shell/client/components/ChatEditor.tsx
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下:

Autofix round summary — PR #8874 (address-review, conflict resolution)

Feedback triage

No actionable review feedback arrived since the last evaluation:

  • Reviews: none new. The latest review on record is an approval (security-focused pass over the daemon ingress path at the previous head).
  • Inline comments: none new. The latest entries are the /verify trigger and bot status messages.
  • Failed / still-red checks: none reported.

Conflict resolution (--conflict true)

Merged origin/main (3 new commits: Qwen 3.8 reasoning config, localized background task notifications, selective-session-restore design docs) into the PR branch. One content conflict and one resulting build failure were fixed:

  1. packages/web-shell/client/components/ChatEditor.tsx — the lucide-react import list conflicted: this PR added LoaderCircleIcon, UploadIcon, XIcon (file-upload UI) while main added ChevronRightIcon (reasoning-effort popover). Resolved as the union of both sides; every icon's usage was verified present in the merged file, and both parents' feature code was confirmed intact on each side of the merge.
  2. packages/sdk-typescript/scripts/build.js — the merged daemon SDK browser bundle (192,550 bytes) exceeded the 188 KiB budget this PR had set, because main's session reasoning-effort config option APIs (setSessionConfigOption / setConfigOption + result types) added to the same bundle. Verified the merge seam introduced no duplicated SDK symbols, then raised the budget 188 → 189 KiB following the file's existing per-bump comment convention.

No other files conflicted; all remaining changes are the unmodified main-side commits. No behavior beyond the two parents' already-CI-green features was introduced.

Dispositions

  • No findings to act on, decline, or escalate this round.

Verification

Commands actually run on the merged tree (after conflict resolution and the budget bump):

  • npm run build — initially failed on the SDK bundle-size guard (192,550 > 192,512 bytes); passed after the 188 → 189 KiB budget bump
  • npm run typecheck — passed
  • npm run lint — passed
  • Vitest packages/web-shell (touched, conflict file) — 184 files, 3484 passed
  • Vitest packages/sdk-typescript (touched) — 33 files, 1539 passed
  • Vitest packages/cli src/serve (touched: server/telemetry seams + upload routes) — 148 files, 4420 passed, 1 skipped
  • Vitest packages/cli src/acp-integration — 30 files, 1434 passed
  • Vitest packages/acp-bridge — 26 files, 1285 passed
  • Vitest packages/webui — 34 files, 559 passed
  • Vitest packages/core focused (terminalSafe, monitorRegistry, chatRecordingService) — 3 files, 146 passed
  • Vitest packages/core src/services/backgroundShellRegistry.test.ts — 1 file, 60 passed

Integration tests were not re-run this round: the only code changes beyond the merged parents are an import-list union (client component) and a build-time size constant, both fully covered by the checks above; the branch's existing integration baseline (including the pinned workspace_file_upload capability) remains unchanged and runs in CI.

中文说明

Autofix 轮次总结 — PR #8874(address-review,冲突解决)

反馈分类

自上次评估以来没有收到需要处理的审查反馈:

  • Reviews:无新增。记录中最新的一次审查为批准(针对上一个 head 的 daemon ingress 路径所做的安全专项审查)。
  • Inline comments:无新增。最新条目为 /verify 触发指令和机器人状态消息。
  • 失败 / 持续失败的检查:无报告。

冲突解决(--conflict true

已将 origin/main(3 个新提交:Qwen 3.8 reasoning 配置、本地化后台任务通知、selective-session-restore 设计文档)合并进 PR 分支。修复了一处内容冲突和由此引发的一处构建失败:

  1. packages/web-shell/client/components/ChatEditor.tsxlucide-react 导入列表发生冲突:本 PR 新增了 LoaderCircleIconUploadIconXIcon(文件上传 UI),而 main 新增了 ChevronRightIcon(reasoning-effort 弹层)。解决方式为取双方并集;已验证合并后文件中每个图标的使用均存在,且合并两侧均完整保留了各自父提交的功能代码。
  2. packages/sdk-typescript/scripts/build.js — 合并后的 daemon SDK 浏览器 bundle(192,550 字节)超出了本 PR 此前设定的 188 KiB 预算,原因是 main 的会话 reasoning-effort 配置项 API(setSessionConfigOption / setConfigOption 及结果类型)同样加入了该 bundle。已验证合并接缝处没有引入重复的 SDK 符号,随后按照该文件现有的逐次 bump 注释惯例,将预算从 188 KiB 提升至 189 KiB。

其余文件均无冲突;所有剩余改动都是 main 侧未经修改的提交。除两个父分支各自已通过 CI 的功能外,未引入任何新行为。

处理结论

  • 本轮没有需要处理、拒绝或升级的审查发现。

验证

在合并后的代码树上(冲突解决和预算提升之后)实际执行的命令:

  • npm run build — 最初因 SDK bundle 体积守卫失败(192,550 > 192,512 字节);在 188 → 189 KiB 预算提升后通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • Vitest packages/web-shell(受影响,含冲突文件)— 184 个文件,3484 通过
  • Vitest packages/sdk-typescript(受影响)— 33 个文件,1539 通过
  • Vitest packages/cli src/serve(受影响:server/telemetry 接缝 + 上传路由)— 148 个文件,4420 通过,1 跳过
  • Vitest packages/cli src/acp-integration — 30 个文件,1434 通过
  • Vitest packages/acp-bridge — 26 个文件,1285 通过
  • Vitest packages/webui — 34 个文件,559 通过
  • Vitest packages/core 定向(terminalSafemonitorRegistrychatRecordingService)— 3 个文件,146 通过
  • Vitest packages/core src/services/backgroundShellRegistry.test.ts — 1 个文件,60 通过

本轮未重新运行集成测试:除合并的父提交外,唯一的代码改动是一处导入列表并集(客户端组件)和一个构建期体积常量,上述检查已完全覆盖;分支现有的集成基线(包括已固定的 workspace_file_upload 能力)保持不变,并将在 CI 中运行。

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 main 有冲突——已在本次推送中解决。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

// `clientRef` is reassigned during render, so an in-flight completion
// landing between commit and the reset effect below would otherwise pass
// the old-generation guard while already holding the NEW target's client.
if (prevTargetKeyRef.current !== targetKey) {

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.

Aborting live uploads from the render phase is unsafe. controller.abort() and the generationRef bump are side effects executed while rendering, and React does not guarantee that a render commits. Under concurrent rendering, a transition that renders ChatEditor with a new sessionId/workspace and is then interrupted (higher-priority update rebases it away) will have already aborted the in-flight XHR and every queued controller, even though the committed tree still shows the old targetKey — the user's uploads disappear with no visible cause and the rows only clear when the (never-run) effect for that key would have fired.

The stated motivation (a completion landing between commit and the reset effect while clientRef already holds the new client) can be handled without render-phase mutation, e.g. by capturing the client alongside the generation when the item is dequeued (const activeClient = clientRef.current is already read per item) and comparing that captured client on completion, or by moving the invalidation into useLayoutEffect.

// the picker closed without any upload, so give the query back.
restore?.();
}
} else {

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.

When the picker resolves after the target changed, the selected files are dropped with no user-visible trace. capturedKey !== uploadTargetKey takes the else branch and calls restore?.() — but restore is already undefined here: the useLayoutEffect keyed on uploadTargetKey (line ~1585) fired at the moment of the change and consumed/cleared uploadPickerRestoreRef, and this handler re-reads that ref. So the branch is a no-op.

Scenario: user opens the @ panel, picks "Upload file", and while the OS dialog is open the session id changes or the daemon capabilities refresh flips uploadTarget (e.g. workspaces[].trusted briefly re-reported). The user selects three files, the dialog closes, and nothing happens at all — no upload, no error row, no restored query. Consider pushing an error row (a new errorCode, e.g. targetChanged) instead of silently returning.

);
if (req.onProgress) {
return await this.uploadWithProgress(url, label, req, headers);
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The non-progress path inherits the client-wide 30 s DEFAULT_FETCH_TIMEOUT_MS, which is far too short for the 50 MiB cap this route advertises. fetchWithTimeout keeps the abort signal armed for the whole request+consume window, so an SDK caller doing client.uploadWorkspaceFile({ path, data }) with a 40 MiB file on anything slower than ~12 Mbps uplink gets a TimeoutError mid-body and the daemon sees an aborted request (gate slot freed, no file published). The Web Shell only escapes this because it explicitly passes timeoutMs: 0.

Since MAX_UPLOAD_BYTES is 10x MAX_WRITE_BYTES, this operation should not silently take the generic REST default. Either default req.timeoutMs to 0 here (cancellation is already available via signal), or scale it off the payload size, and make the JSDoc on DaemonWorkspaceFileUploadRequest.timeoutMs say what the inherited default actually is.

@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification report (local real-stack run)

I verified this PR end-to-end on a real local stack — no mocked daemon: qwen serve daemon started from the PR source (head 015f1b09ef, merged with latest main), web-shell served by Vite dev, driven in Chromium via Playwright, plus a second full stack built from the merge-base (d912f4c6a8) for cross-version capability-gating checks. macOS, Node 24, isolated worktrees and isolated QWEN_HOMEs.

Verdict: everything in the reviewer test plan checks out. No blocking issues found.

1. HTTP route contract (curl against the PR daemon)

Check Result
POST /file/upload roundtrip (128 KiB binary, all 256 byte values) ✅ 201, on-disk file byte-identical, response returns sha256 hash
Occupied filename, twice binary-blob (1).bin, then binary-blob (2).bin; original untouched
Filename with spaces / non-ASCII / % (数据 100%.csv) ✅ stored under the exact name, byte-identical
51 MiB body 413 file_too_large, maxBytes: 52428800, no partial file
Content-Type: text/plain 415 unsupported_media_type
path=../escape.txt 400 path_outside_workspace, nothing written outside
Missing qualified workspace workspace_mismatch error, no fallback to primary
No auth token ✅ 401
6 parallel 40 MiB uploads ✅ exactly 4 admitted (201), 2 rejected 429 upload_busy with retryAfterSeconds: 1 — shared four-slot gate works
Untrusted workspace (folderTrust enabled, workspace not trusted) 403 untrusted_workspace, nothing written
Same route on merge-base daemon ✅ 404 (route is new)

2. Web Shell UI (Chromium via Playwright, real daemon behind it)

Test-plan item Result
@ file panel shows “Upload file” with upload icon; opens a multi-file picker; no trigger @ left in the composer
Batch of 3 files (my report v2.pdf, 数据 100%.csv, conflicting notes.txt) ✅ progress rows appear above the input surface; conflict row reads “Saved as notes (1).txt”
Success rows disappear after ~3 s; each result becomes a removable inline file tag with the server-confirmed path (notes (1).txt)
All uploads byte-identical on disk; pre-existing notes.txt untouched
Drop of an ordinary file ✅ uploads; drag styling activates on dragover and is fully cleared after drop
Mixed batch (png + txt) dropped ✅ both upload as workspace files, selection order preserved (verified from the request log)
Image-only drop ✅ stays on the image attachment path: zero upload requests, no workspace file, image chip attached
Oversized file via picker ✅ inline error row “File exceeds the 50 MiB upload limit”, no partial file
Cancel mid-flight (40 MiB, throttled to 2 MB/s, canceled at “Uploading 10%”) ✅ row removed, no partial file, no tag inserted
Old daemon (merge-base, no workspace_file_upload tag) with PR frontend ✅ “Upload file” entry hidden, hidden <input type=file> not rendered, dropping a file fires zero upload requests
Untrusted workspace ✅ upload entry hidden in the UI as well (server 403 independently verified above)

3. Automated tests (PR head, local)

  • packages/cliworkspace-file-write.test.ts + workspace-file-system.test.ts + workspace-qualified-rest.test.ts: 236 passed
  • packages/sdk-typescriptDaemonClient.upload.test.ts: 28 passed
  • packages/web-shell — ChatEditor / useFileUpload / useAtMentionMenu / useComposerCore / AtMentionPanel / App suites: 689 passed

Evidence

“Upload file” entry in the @ Files panel (icon, description, no leftover @ after picking):

at-panel

Batch done: conflict renamed to notes (1).txt, inline tags carry server-confirmed paths, progress rows above the input surface:

done-tags

Bounded progress with cancel affordance (throttled upload, “Uploading 10%”):

uploading

Image-only drop stays on the image attachment path (thumbnail chip, no upload):

image-path

Oversized file rejected inline, 50 MiB policy:

oversized

Old daemon (no workspace_file_upload): entry hidden while file browsing still works:

old-daemon

Untrusted workspace: upload entry hidden (server also rejects with 403 untrusted_workspace):

untrusted

中文版本

维护者验证报告(本地真实栈)

在本地搭建了完全真实的环境验证本 PR——没有 mock daemon:daemon 直接从 PR 源码启动(head 015f1b09ef,已合入最新 main),web-shell 由 Vite dev 提供,Playwright 驱动 Chromium 真实浏览器;另从 merge-base(d912f4c6a8)构建了第二套完整栈用于跨版本能力门控验证。macOS,Node 24,隔离 worktree 与隔离 QWEN_HOME

结论:Reviewer 测试计划中的各项全部通过,未发现阻塞问题。

1. HTTP 路由合约(curl 直连 PR daemon)

检查项 结果
POST /file/upload 往返(128 KiB 二进制,覆盖全部 256 个字节值) ✅ 201,落盘文件逐字节一致,响应含 sha256 哈希
重名上传两次 ✅ 依次生成 binary-blob (1).bin(2).bin,原文件不受影响
含空格 / 非 ASCII / % 的文件名(数据 100%.csv ✅ 按原名保存,字节一致
51 MiB 请求体 413 file_too_largemaxBytes: 52428800无残留部分文件
Content-Type: text/plain 415 unsupported_media_type
path=../escape.txt 路径穿越 400 path_outside_workspace,工作区外无写入
不存在的 qualified workspace ✅ 返回 workspace_mismatch不回退主工作区
无鉴权 token ✅ 401
6 个 40 MiB 并发上传 ✅ 恰好 4 个放行(201),2 个 429 upload_busyretryAfterSeconds: 1)——共享四槽准入门生效
未信任工作区(开启 folderTrust 且未信任) 403 untrusted_workspace,无写入
merge-base daemon 上同一路由 ✅ 404(新路由)

2. Web Shell UI(Playwright 驱动 Chromium,背后是真实 daemon)

测试计划项 结果
@ 文件面板显示带上传图标的“Upload file”,打开多文件选择器,输入框不残留触发 @
3 文件批量上传(my report v2.pdf数据 100%.csv、重名 notes.txt ✅ 进度行显示在输入框上方;重名行显示 “Saved as notes (1).txt”
成功行约 3 秒后消失;每个结果成为可移除的行内文件标签,路径为服务端确认值notes (1).txt
全部上传逐字节一致;工作区原有 notes.txt 未被覆盖
拖放普通文件 ✅ 正常上传;dragover 时拖拽高亮出现,drop 后完全清除
混合批次(png + txt)拖放 ✅ 两个都按工作区文件上传,选择顺序保持(请求日志佐证)
仅图片拖放 ✅ 保持图片附件路径:零上传请求、无工作区文件、出现图片缩略图
选择器选择超限文件 ✅ 行内报错 “File exceeds the 50 MiB upload limit”,无部分文件
传输中取消(40 MiB,限速 2 MB/s,在 “Uploading 10%” 时取消) ✅ 行移除、无部分文件、不插入标签
旧 daemon(merge-base,无 workspace_file_upload 标签)+ PR 前端 ✅ “Upload file”入口隐藏,隐藏 <input type=file> 不渲染,拖放不发出任何上传请求
未信任工作区 ✅ UI 同样隐藏上传入口(服务端 403 已在上面独立验证)

3. 自动化测试(PR head,本地)

  • packages/cli(workspace-file-write / workspace-file-system / workspace-qualified-rest):236 通过
  • packages/sdk-typescript(DaemonClient.upload):28 通过
  • packages/web-shell(ChatEditor / useFileUpload / useAtMentionMenu / useComposerCore / AtMentionPanel / App):689 通过

截图见上方英文部分(同一组证据,托管于 pr-assets/8874-verify 分支,URL 锚定 commit)。

const matches = (uploadWorkspace.capabilities?.workspaces ?? []).filter(
(w) => w.cwd === atWorkspaceCwd,
);
if (matches.length !== 1 || matches[0].trusted === false)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The two trust gates disagree on how to treat a missing trusted field. The qualified branch fails open (matches[0].trusted === false), the primary branch a few lines below fails closed (primaryMatches[0].trusted !== true). DaemonWorkspaceCapability.trusted is optional in the SDK type, so a daemon (or a proxy/older build) that omits it enables the upload entry points for a qualified workspace while disabling them for the primary one — the more permissive half being the one that can target an arbitrary registered workspace. Uploads would then 403 at requireTrustedWorkspaceRuntime, but only after the whole body has been sent. Suggest making both !== true.

...uploadsRef.current,
{
id: `upload-${uploadIdCounter}`,
file: files[accepted.length] as File,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The overflow notice row borrows files[accepted.length] — the first rejected file — as its file, and ChatEditor's strip renders {upload.file.name} next to the status text. Dropping 105 files therefore renders a row reading photo101.jpg — 5 more files were not added (limit per batch), which reads as if that specific file failed while the other four unnamed ones are unaccounted for. The row is synthetic; consider making file optional on FileUploadItem (or adding a notice status) and having the strip render only the message for it.

@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@wenshao
wenshao enabled auto-merge August 13, 2026 06:38
@qwen-code-ci-bot

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

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

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

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

Verification report

PR 8874 Deep Verification (follow-up round 2) — feat(web-shell): support workspace file uploads

Verdict: merge-ready — 2172/2172 scripted assertions passed (pass=2172 fail=0), verified head 015f1b09ef6c9c2990743529d12b57191c5cde06, base 5af31316aa33a690efbecf7d43c7c71855728f7b (v0.21.11), merge e108d5b1. Follow-up round: previous head was 2bf40faf; the only PR-side delta since is merge 015f1b09 (origin/main, conflict surface ChatEditor.tsx), plus the new base. All carried-forward measurements re-run at the new head; no regressions, no new findings.

中文 — 判定:✅ 通过 · 可合入(agent 判定)
  • 结论merge-ready。本轮为第二次跟进轮:上轮 head 2bf40faf 之后,PR 侧仅新增一次 main 合并(015f1b09,冲突面为 ChatEditor.tsx,已核验两侧改动均完整保留),base 前进到 v0.21.11(5af31316)。中心声明(daemon 二进制上传路由端到端可用且安全)在新 head 上重新全量实测成立。
  • A/B 结论:head 侧真实 daemon 87/87 断言通过(字节一致、不覆盖自动编号、50 MiB 边界(含声明 CL 与 chunked 两条超量路径)、四槽准入门 429、信任门 403、qualified 不回落主工作区、symlinked 父目录 docs→aux 上传成功、NUL 400、尾斜杠拒绝、gzip 体 415、中途断连槽位释放、ELOOP 循环按占用编号);base 侧 11/11(路由 404、能力未声明、文本写限制两侧一致、/file/write NUL 两侧同为 500+路径回显 A/A)。见 01-head-upload-matrix.png / 02-base-upload-matrix.png
  • 变异矩阵:9/9 击杀(M1–M3、G4 + round-6 守卫 R1–R5),全部死于预定断言,无幸存者;未变异对照(CLI 1303 / web-shell 689 / SDK 28)全绿。见 03-mutation-matrix.png
  • 门禁:CLI 7 个变更测试文件 1303 通过;SDK 上传 28/28;Web Shell 6 个变更文件 689/689;integration serve 路由 36/36;manifest 测试 5/5(上上轮环境红已持续解决);SDK 浏览器包 192,550 B ≤ 189 KB 新预算(余量 986 B,较上轮 260 B 改善;门禁活性经植入 180 KB 预算证明);web-shell typecheck 绿。
  • 上轮 findings 状态:F1 上传面修复维持(R1 变异回退即复现修复前 500 行为);F2(控制/RTL 字符文件名按 POSIX 合法落盘,5/5 接受)维持;F3 余量改善至 986 B;F4 维持绿;"11 个 SDK 测试"描述仍为 28 个。均非阻塞。
  • 新观察(非 PR 引入):声明超大 Content-Length 但只发短体后复用 keep-alive 连接,会在该连接上产生解析错位——base 的 express.json 路径行为同类甚至更差(不提前响应直接挂起),诚实客户端不复用此类连接;记录在案,不作 finding。
  • 未覆盖:浏览器真实 UI E2E 与 XHR 进度事件(容器无浏览器)、逐 commit 归因(depth-2 浅克隆,rev-list 静默截断为 1/23)、fs.denied 活体 SSE 观察(单元层事件列表已证)、仓库级 lint(以各工作区门禁代替)。

Previous-finding status (follow-up round)

# Finding (previous round) Severity Status at new head 015f1b09
F1 NUL byte in any path → 500 internal_error echoing a daemon-internal absolute path (shared fs layer) note, pre-existing Partially fixed — holds. Re-measured live: upload admission cells C6e–C6h → 400 parse_error "path must not contain null bytes", no path echo, nothing written (4/4 pass). Mutant R1 (guard removed) killed by rejects the NUL-bearing path with parse_error and no denied event ×2 with expected 500 to be 400 — the mutant reproduces the exact pre-fix F1 behavior. The shared layer still 500s elsewhere: /file/write NUL → 500 + absolute-path echo on both head (cell N2) and base (cell B6) — A/A attribution unchanged; residual gap is not caused by this PR.
F2 Control/RTL characters in filenames accepted as literal POSIX names nit Stands. Re-measured at the new head (cells in 01-head-upload-matrix.png): bad\nname.bin, bad\rname.bin, bad\tname.bin, \u202edoc.bin (RTL override), ZWJ name — 5/5 accepted, 201, byte-identical on disk. Daemon-side correct; the Web Shell tag renderer should remain aware of deceptive RTL-override display. No action required for merge.
F3 SDK browser-bundle headroom under the budget the PR bumps observation Stands, improved. Re-measured: dist/daemon/index.js = 192,550 B (was 192,252 B; +298 B from main-merge SDK growth) vs the budget the PR now sets at 189 KB (193,536 B, bumped 186→188→189) → 986 B headroom (was 260 B). Gate liveness proven: planted 180 KB budget → build fails with Browser daemon SDK bundle is 192550 bytes; expected <= 184320; real budget passes.
F4 reds in manifest-repository-context.committed.test.ts from a root-owned dirty .qwen/review-context.json in the verify container environmental Resolved — holds. PR diff against the new base is empty for both .qwen/review-context.json and the test file; the suite runs 5/5 green at HEAD in this same container.
note PR description says "11 SDK upload tests"; the suite contains 28 nit Stands (harmless undercount) — suite still 28 tests, all green.

Delta since the previous round

  • 015f1b09 merge of origin/main (the only PR-side commit since head 2bf40faf, per the metadata snapshot — its parents are unreachable in the depth-2 clone, so the delta is attributed from commit metadata + the aggregate diff, not from a direct three-way): conflict surface was packages/web-shell/client/components/ChatEditor.tsx. Verified the resolution kept both sides: the effective diff HEAD^1..HEAD still carries the full upload wiring (useFileUpload integration, capability gate on workspace_file_upload, drop/picker plumbing, maxWorkspaceFileUploadBytes read from capabilities.limits), and only two removed lines exist outside upload code — two import lines that reappear in the restructured import block with all three symbols (ReactNode, RefObject, DAEMON_APPROVAL_MODES) still imported and used. No conflict markers anywhere under packages/web-shell/client/. The 689-test Web Shell suite (including the 1174-line ChatEditor.test.tsx delta) pins this surface and is green.
  • New base 5af31316 (v0.21.11). The merge also moved the SDK budget comment trail (186→188 for the upload surface, 188→189 for session reasoning-effort APIs merged in from main) — the live bundle measurement above (192,550 B) confirms the 189 KB budget is correct at the new head.
  • Carried: packages/cli/src/ui/hooks/use-effort-command.ts still differs from base by a single whitespace-only hunk (re-wrapped const declaration, no token-level change) — merge-resolution formatting remnant, noted, not a finding.

Central claim and A/B proof

Central claim (carried, re-measured): the daemon exposes capability-gated binary upload ingress (POST /file/upload, POST /workspaces/:workspace/file/upload) that publishes bytes byte-identically, never overwrites (deterministic name (n).ext numbering), enforces a 50 MiB binary policy distinct from the 5 MiB text policy, bounds concurrency at 4 shared slots, and honors trust + workspace-qualification semantics without fallback to the primary runtime — while leaving existing text-write behavior unchanged.

Driven against a real qwen serve daemon (compiled dist/, bearer token, folder trust enabled via settings.json + trustedFolders.json source file) with fetch + raw chunked-socket requests — no stubs of the unit under test. Harness: upload-matrix.mjs; raw logs head-run/matrix-head.log, base-run/matrix-base.log.

Cell group Observable oracle HEAD (87) BASE (11)
C1 capability features contains workspace_file_upload; limits.maxWorkspaceFileUploadBytes = 52428800 ✅ 2/2 ✅ tag absent + limit key absent (B1)
C1.0 / B2 trust control GET /workspace/trustfolderTrustEnabled: true, effective {state: trusted, source: file} ✅ 3/3 ✅ symmetric (B2)
C2 byte identity, mode 1 MiB → 201, confirmed path, sha256 on disk, mode 0o600 ✅ 4/4 route 404, no file (B3)
C3 unicode/%/space names exact-name round-trip + bytes (6 names) ✅ 6/6 n/a
C4 no-clobber numbering dup.txt(1)(2); dir occupancy; .env (1) + original untouched; 255-byte fit exactly 255 B; multi-byte code-point-boundary trim ✅ 8/8 n/a
C5 traversal/absolute ../, /etc/…, sub/../../, x/../../y → 4×400 path_outside_workspace; nothing outside; no .tmp litter ✅ 6/6 n/a
C6 suspicious + NUL CON, CON.txt, photo., trail → 400 parse_error; bad\0name.txt → 400 naming null bytes, no absolute-path echo, nothing written ✅ 8/8 n/a (base has no route; B6 covers shared layer)
C7 byte cap exactly 50 MiB → 201 identical (264 ms); declared CL 50 MiB+1 → 413 file_too_large + maxBytes; no partial ✅ 5/5 n/a
C8 chunked oversize no Content-Length, 51 MiB streamed → 413 envelope; slot released (next 201); no partial ✅ 3/3 n/a
C9 admission gate 4 held chunked uploads → 5th 429 upload_busy + Retry-After: 1; all 4 complete 201 (4/4); retry 201 ✅ 4/4 n/a
C10 symlinks in-workspace symlink → alias (1).txt, target untouched; escaping symlink → 400 symlink_escape, nothing outside ✅ 4/4 n/a
C11 content-type / missing path JSON body → 415; no ?path → 400 ✅ 2/2 n/a
N1 queryDir upload through docs -> aux (DOS-name target) → 201, confirmed path canonical aux/probe.bin, bytes land via symlink; two-hop chain → 201 ✅ 4/4 n/a (no route on base)
N3 trailing slash sub2/dir/ → 400 parse_error even though the dir exists n/a
N4 encoded body Content-Encoding: gzip → 415 unsupported_media_type; nothing written ✅ 2/2 n/a
N5 mid-body abort headers + partial body + socket destroy → daemon alive, next upload 201 (slot freed), no partial file, stderr clean of unhandled errors ✅ 4/4 n/a
N6 ELOOP cycles self-cycle cyc.txt -> cyc.txtcyc (1).txt, symlink untouched; two-hop ca<->cbca (1).txt ✅ 3/3 n/a
N2 / B6 F1 attribution /file/write NUL → 500 + absolute-path echo ✅ (persists, shared layer) identical (A/A)
C12 / B5 text-write control create 201 + content intact; >5 MiB replace (with expectedHash) → 413 file_too_large ✅ 3/3 ✅ 3/3 identical
C13 qualified semantics POST /workspaces registers secondary; by-path selector → 201 into SECONDARY (not primary); unknown id → 400 workspace_mismatch; no fallback write ✅ 5/5 qualified route 404 (B4)
C14 untrusted daemon legacy + qualified upload → 403 untrusted_workspace; nothing written ✅ 3/3 n/a
F2 probe 5 control/RTL/ZWJ names accepted, byte-identical (documented posture, carried finding) ✅ 5/5 n/a

Totals: HEAD 87/87, BASE 11/11. Witnesses: 01-head-upload-matrix.png, 02-base-upload-matrix.png.

Contract clarifications re-observed (not defects): the confirmed path is the canonical workspace-relative form (docs -> aux confirms aux/probe.bin); the daemon serves a bootstrap /capabilities envelope shortly after listening, so the harness polls /workspace/trust to 200 before asserting, as SDK clients do.

Corrections

None this round.

Findings (new this round)

No blocking findings. All 87 head cells and every gate green; 9/9 mutants killed.

Two informational observations, neither caused by this PR:

  1. Keep-alive desync after an early 413 (pre-existing stack class). A client that declares a Content-Length above the cap, sends a short body, receives the early 413, and then reuses the same keep-alive socket desyncs the connection — the server parser is still owed the declared body bytes, so the next request is misparsed (empty-body 400 or hang). Measured on head: the upload admission pre-check answers 413 instantly, next reused-socket request → socket hang up. Measured on base through the pre-existing express.json({limit:'10mb'}) path: the same lying-CL request gets no early answer at all (hangs until client timeout), then the reused socket gets a stray 404 — the same class, strictly worse. Honest clients (browsers, undici/fetch, the SDK) do not reuse a connection whose request body was not fully sent; the loopback daemon has no shared-front-end smuggling surface. This round's harness hit it itself (agent: false per raw request was the fix). Not a PR finding; recorded so a future reviewer of connection-lifetime issues finds the attribution already done.
  2. Whitespace-only hunk in use-effort-command.ts (carried from the previous round's delta note) — still present against the new base; zero token-level change.

Gate and vacuity results

Gate Result
CLI changed test files (7): workspace-file-write.test.ts + fs/workspace-file-system.test.ts, bridge-file-system-adapter, workspace-file-read, server.test.ts, server/telemetry, workspace-qualified-rest 1303 passed / 0 failed (prev round 1302; +1 from the new base)
manifest-repository-context.committed.test.ts (round-1 environmental red) 5/5 passed at HEAD (status table F4)
Integration cli/qwen-serve-routes.test.ts (real daemon, capabilities baseline incl. workspace_file_upload) 36/36 passed
SDK test/unit/DaemonClient.upload.test.ts 28/28 passed
Web Shell changed test files (6): App, AtMentionPanel, ChatEditor, useAtMentionMenu, useComposerCore.dom, useFileUpload 689 passed / 0 failed
SDK build incl. 189 KB browser budget exit 0; bundle 192,550 B; gate liveness proven (planted 180 KB → expected <= 184320)
Typecheck/build web-shell tsc -p tsconfig.json --noEmit green; head npm run build pre-run by CI; base arm rebuilt packages/cli (+ packages/core via project references) from HEAD^1 sources with tsc --build green

Mutation matrix — 9/9 killed, zero survivors. Positive controls: the unmutated suites above (1303 CLI / 689 web-shell / 28 SDK green). Every mutant failed the intended behavioral assertion, not an import/compile break (witness 03-mutation-matrix.png, per-mutant logs mutant-*.log):

Mutant Change Killed by Verdict
M1 writeBytesAtomic: cap → 5 MiB text cap (inline literal) 3 tests: fs-layer accepts a payload above the 5 MiB text cap (binary policy applies) + HTTP binary policy at HTTP + accepts an upload of exactly MAX_UPLOAD_BYTES: expected 413 to be 201 killed
M2 route: no-clobber collision surfaces an error instead of numbering on 11 numbering-family tests (.env (1) dotfiles, taken candidates, 255-byte trims incl. multi-byte boundary, concurrency race, dir occupancy, suspicious-root, 1000-candidate cap, no-fs.denied audit): 10× expected 409 to be 201, 1× expected 409 to be 400 killed
M3 web-shell hook: resultPath: result.pathtargetPath invokes onUploaded exactly once with the server-confirmed path: expected 'report.pdf' to be 'report (1).pdf' killed
G4 admission: remove declared-Content-Length pre-check rejects an oversized declared Content-Length with the upload 413 envelope (hangs → fails at 1501 ms without the guard) killed
R1 round-6: remove NUL-byte admission check rejects the NUL-bearing path with parse_error and no denied event (×2 shapes): expected 500 to be 400 — reproduces pre-fix F1 killed
R2 round-6: remove inflate: false rejects an encoded request body instead of silently decoding it: expected 201 to be 415 — without the guard the gzip body is silently decoded and published killed
R3 round-6: remove ELOOP-cycle continue numbers past a symlink cycle… + …two-hop symlink cycle…: expected 400 to be 201 killed
R4 round-6: revert audit suppression (collisions audit again) does not audit a no-clobber collision as fs.denied (got 1) + emits no fs.denied events for a successful auto-numbered upload (got 3, expected 0) killed
R5 round-6: candidates re-resolve from canonicalized dir, not literal queryDir uploads through a symlinked directory whose target trips the pattern check (+ the workspace-root-pattern sibling): expected 400 to be 201 killed

Not covered

  • Browser-rendered Web Shell UI (drag styling, progress strip cadence, tag insertion): container has no browser; covered by the jsdom suites (689 green) and code reading only. XHR upload progress events are browser-only by design — real progress cadence unmeasured.
  • Per-commit attribution: depth-2 shallow checkout. git rev-list --count HEAD^1..HEAD^2 returns 1 against the metadata's 23 commits — silent truncation at the shallow boundary, so the metadata list was not individually exercised; the aggregate HEAD^1..HEAD diff (43 files, +7241/−163) is what was verified. The round delta is attributed from commit metadata (015f1b09 = merge of origin/main; previous head 2bf40faf unreachable locally).
  • Live fs.denied observation: audit suppression is proven at the unit layer via captured bridge-event lists (R4's kill quotes the event counts that would appear); no live SSE sink was subscribed.
  • Draining/removed qualified workspaces (503 workspace_runtime_unavailable): pinned by the executed workspace-qualified-rest.test.ts suite (inside the 1303); the live matrix covered unknown-workspace and by-path-selector cells only.
  • Repo-wide lint: not run; per-workspace builds/typechecks above stand in.
  • A/B against previous head 2bf40faf: not locally reachable; delta proven by the aggregate diff + suites instead.
  • The keep-alive desync observation was characterized, not fixed-and-retested — it is pre-existing and outside this PR's surface.
  • PR-declared out-of-scope surfaces: resumable/chunked uploads, folder uploads, overwrite-in-place, ACP-HTTP parity, Windows/Linux manual UI.

Methodology

Linux container (Node v22.23.2, 64 cores), merge-ref checkout at depth 2 (HEAD merge e108d5b1, HEAD^1 base 5af31316 = v0.21.11, HEAD^2 head 015f1b09). Base arm: git worktree at HEAD^1; root node_modules entries symlinked from the already-installed head tree, but all @qwen-code/* workspace links re-created deliberately — qwen-code-core, qwen-code-cli (→ cli), sdk, web-shell point into the base tree (readlink -f node_modules/@qwen-code/qwen-code-core…/tmp/base-tree/packages/core, quoted as required), while the PR-untouched workspaces (web-templates, webui, acp-bridge, audio-capture, all channels, chrome-bridge, external-context, mobile-mcp) point at the head tree's builds — clean controls because git diff HEAD^1..HEAD is empty for every one of them (only cli, sdk-typescript, web-shell are touched). scripts/generate-git-commit-info.js run for the gitignored generated file, then tsc --build of packages/cli (which built packages/core via project references). Base markers verified: workspace_file_upload absent from base dist capabilities (grep 0, head 1) and no file/upload route in base dist; base daemon boots with an identical /workspace/trust envelope (B2). Harnesses booted real daemons (dist/index.js serve --port 0 --token … --workspace <mkdtemp>) with scratch HOME/QWEN_HOME, security.folderTrust.enabled=true in settings.json, trust granted/withheld via QWEN_CODE_TRUSTED_FOLDERS_PATH; waited past the bootstrap envelope by polling /workspace/trust to 200; drove them with fetch + raw http sockets (agent: false after the keep-alive desync above bit the harness itself) and asserted on bytes-on-disk + response envelopes. Mutants applied by exact single-occurrence string replacement, run through vitest, restored byte-exact with git status --porcelain verified clean after each. Evidence images produced with scripts/verify-capture.mjs (03 is assembled from the saved per-mutant logs because the R5 pattern was corrected after the live capture pass); raw logs and harness scripts live alongside this report. Base worktree removed after the A/B cells were captured.

Evidence images

01-head-upload-matrix

02-base-upload-matrix

03-mutation-matrix

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

Qwen Code · sandboxed verification

@wenshao
wenshao added this pull request to the merge queue Aug 13, 2026
Merged via the queue into main with commit a8bcaef Aug 13, 2026
192 of 194 checks passed
@ytahdn
ytahdn deleted the feat/web-shell-file-upload branch August 13, 2026 06:50
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants