Skip to content

fix(core): Support large text range reads - #6404

Merged
doudouOUC merged 17 commits into
mainfrom
codex/large-text-range-reads-6403
Jul 7, 2026
Merged

fix(core): Support large text range reads#6404
doudouOUC merged 17 commits into
mainfrom
codex/large-text-range-reads-6403

Conversation

@doudouOUC

Copy link
Copy Markdown
Collaborator

What this PR does

This PR teaches text reads to serve bounded line ranges from large files instead of rejecting every text file above the previous 10MB guard. It adds a small/large split for text range reads, preserves encoding and line-ending metadata where possible, forwards cancellation through read_file, read_many_files, and ACP-backed reads, and keeps binary, image, audio, video, and PDF size protections intact.

Why it's needed

Users can hit a hard failure when asking Qwen Code to analyze CI logs or other plain-text artifacts larger than 10MB. The linked report shows a 15.30MB unit-test log rejected before the model can inspect any useful lines. Returning a bounded range gives the model enough context to proceed while keeping memory and output size controlled.

Reviewer Test Plan

How to verify

Run npm run build and npm run typecheck from the repository root; both should exit 0. From packages/core, run npx vitest run src/utils/readTextRange.test.ts src/utils/fileUtils.test.ts src/services/fileSystemService.test.ts src/tools/read-file.test.ts src/utils/readManyFiles.test.ts src/utils/pathReader.test.ts; all 263 tests should pass. From packages/cli, run npx vitest run src/ui/hooks/atCommandProcessor.test.ts src/acp-integration/service/filesystem.test.ts; all 91 tests should pass. Reviewers can also create a text file larger than 10MB and confirm read_file with default settings returns a marked line range rather than FILE_TOO_LARGE, while large media files still return the existing size-limit error.

Evidence (Before & After)

Before: attaching or reading a 15.30MB text log failed with File size exceeds the 10MB limit, which prevented CI-log analysis. After: covered large-text range reads return bounded text with truncation metadata, default read_file output identifies the displayed line range, and explicit offset/limit requests are served without reading the full file into memory. Local evidence is the passing build, typecheck, and targeted tests listed above.

Tested on

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

Environment (optional)

macOS 26.4.1, Node.js v22.22.3, npm 10.9.8.

Risk & Scope

  • Main risk or tradeoff: This changes the core read pipeline for text files and makes default large-text reads return truncated content instead of a hard size error. The streaming path still scans to EOF to compute an accurate total line count, so very large logs avoid OOM but can still take time to count.
  • Not validated / out of scope: Manual Windows and Linux E2E runs, remote ACP server implementations beyond the local boundary conversion, token-aware output budgeting, partial-range file_unchanged deduplication, and Claude-style line-numbered output are intentionally left out.
  • Breaking changes / migration notes: None intended. Non-text payloads continue to use the existing media and binary size limits, and large non-UTF-8 text files return a targeted unsupported-streaming error rather than a lossy decode.

Linked Issues

Closes #6403

中文说明

What this PR does

这个 PR 让文本读取在遇到大文件时返回有界的行范围,而不是因为文件超过之前的 10MB 限制就直接拒绝。它为文本范围读取增加了小文件和大文件两条路径,在可行时保留编码和换行元数据,把取消信号传递到 read_file、read_many_files 和 ACP 文件读取链路,并保持二进制、图片、音频、视频和 PDF 的既有大小保护不变。

Why it's needed

当用户让 Qwen Code 分析 CI 日志或其他超过 10MB 的纯文本产物时,当前行为可能直接失败。关联 issue 中的复现场景是一个 15.30MB 的单测日志在模型能看到任何有效内容前就被拒绝。返回有界范围可以给模型足够上下文继续排查,同时仍然控制内存和输出大小。

Reviewer Test Plan

How to verify

在仓库根目录运行 npm run buildnpm run typecheck,两者都应退出 0。在 packages/core 中运行 npx vitest run src/utils/readTextRange.test.ts src/utils/fileUtils.test.ts src/services/fileSystemService.test.ts src/tools/read-file.test.ts src/utils/readManyFiles.test.ts src/utils/pathReader.test.ts,应通过全部 263 个测试。在 packages/cli 中运行 npx vitest run src/ui/hooks/atCommandProcessor.test.ts src/acp-integration/service/filesystem.test.ts,应通过全部 91 个测试。评审者也可以创建一个超过 10MB 的文本文件,确认默认 read_file 返回带范围标记的内容而不是 FILE_TOO_LARGE,同时大型媒体文件仍返回既有大小限制错误。

Evidence (Before & After)

Before:读取或附加一个 15.30MB 文本日志会失败,报错为 File size exceeds the 10MB limit,导致无法分析 CI 日志。After:已覆盖的大文本范围读取会返回有界文本和截断元数据,默认 read_file 输出会标明展示的行范围,显式 offset/limit 请求无需整文件读入内存即可返回。当前本地证据是上面列出的 build、typecheck 和定向测试均通过。

Tested on

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

Environment (optional)

macOS 26.4.1,Node.js v22.22.3,npm 10.9.8。

Risk & Scope

  • Main risk or tradeoff:这个改动触及核心文本读取链路,并让默认大文本读取从硬性大小错误变为返回截断内容。流式路径仍会扫描到文件结尾来计算准确总行数,因此超大日志不会 OOM,但计数本身仍可能耗时。
  • Not validated / out of scope:未做 Windows 和 Linux 手动 E2E;远程 ACP 服务实现中除本地边界转换以外的行为未验证;token-aware 输出预算、partial-range 的 file_unchanged 去重,以及 Claude 风格的逐行编号输出都刻意留到后续。
  • Breaking changes / migration notes:无预期破坏性变更。非文本载荷继续使用既有媒体和二进制大小限制,大型非 UTF-8 文本会返回明确的不支持流式读取错误,而不是进行有损解码。

Linked Issues

Closes #6403

Allow text reads to stream bounded line ranges for files larger than the previous 10MB guard, while preserving media size limits and forwarding cancellation through read_file/read_many_files/ACP paths.

Refs #6403

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC
doudouOUC marked this pull request as ready for review July 6, 2026 15:50
Copilot AI review requested due to automatic review settings July 6, 2026 15:50
@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the PR! (Updated on re-run — 5 new commits since last review.)

Template looks good ✓

Problem: this is an observed bug — issue #6403 has a concrete error from a 15.30MB CI log rejected by the 10MB guard. Real user workflow blocked.

Direction: aligned. Bounded range reads for large text files is standard tooling (Claude Code ships the same). The area is clearly in-scope for a CLI coding agent.

Size: 639 production logic lines, 785 test lines, 0 generated/schema. Above the 500-line core-awareness threshold but this is a fix-type PR (not refactor), so no hard block. The new read-text-range.ts module (281 lines) is the bulk; integration changes across 10 production files are minimal. Maintainer has reviewed and approved.

Approach: scope feels right for the goal. Five fixup commits since the initial review addressed all /review feedback — byte cap enforcement, clearer UTF-8 error messages, preventing truncated full reads, unbounded line-zero preservation, and artifact cancellation forwarding. No scope creep, no drive-by refactors. The toAcpReadTextFileRequest boundary conversion is a clean integration point.

Moving on to code review. 🔍

中文说明

感谢贡献!(Re-run 更新——自上次审查以来有 5 个新提交。)

模板完整 ✓

问题:已观测到的 bug — issue #6403 中有具体的报错信息,一个 15.30MB 的 CI 日志被 10MB 限制拒绝。真实用户工作流被阻断。

方向:对齐。大文本文件的有界范围读取是标准工具能力(Claude Code 也有同样功能)。这个方向明显在 CLI 编码代理的职责范围内。

规模:639 行生产逻辑,785 行测试,0 行生成/schema。超过 500 行核心路径关注阈值,但这是 fix 类型(非 refactor),不触发硬限制。新增的 read-text-range.ts 模块(281 行)占大部分;10 个生产文件的集成改动很小。维护者已审查并批准。

方案:范围合理。自上次审查以来的 5 个修复提交解决了所有 /review 反馈——字节上限执行、更清晰的 UTF-8 错误消息、防止截断完整读取、保留无界零行读取和 artifact 取消信号传递。没有范围蔓延,没有顺手重构。

进入代码审查 🔍

Qwen Code · qwen3.7-max

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the core file-read pipeline so large text files can be read via bounded line-range windows (with truncation metadata) instead of failing the prior 10MB guard, while keeping existing size protections for non-text/media.

Changes:

  • Added readTextRange (small-file decode vs large-file streaming) to serve bounded line ranges from large UTF-8/UTF-8-compatible text files.
  • Updated core read flows (processSingleFileContent, readManyFiles, read_file, FileSystemService) to support range reads, truncation markers/metadata, and AbortSignal propagation.
  • Expanded/updated test coverage across core + CLI (including ACP boundary conversion and @ attachments).

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/core/src/utils/readTextRange.ts New range-read utility with fast-path decode and large-file streaming.
packages/core/src/utils/readTextRange.test.ts Unit tests for range reads, CRLF/BOM handling, large-file streaming, and aborts.
packages/core/src/utils/readManyFiles.ts Plumbs signal through batch reads and abort propagation.
packages/core/src/utils/readManyFiles.test.ts Ensures large text files are included via truncation (not size error).
packages/core/src/utils/pathReader.test.ts Updates expectation: large text reads truncate instead of failing at 10MB.
packages/core/src/utils/fileUtils.ts Switches text reads to bounded range reads; adds truncation metadata handling + abort plumbing.
packages/core/src/utils/fileUtils.test.ts Updates tests for large text handling and preserves media size gating.
packages/core/src/tools/read-file.ts Passes AbortSignal through read_file execution path.
packages/core/src/tools/read-file.test.ts Validates large text truncation behavior and abort propagation.
packages/core/src/services/fileSystemService.ts Introduces CoreReadTextFileRequest (0-based line offsets) and threads maxOutputBytes/signal.
packages/core/src/services/fileSystemService.test.ts Tests byte-truncation metadata passthrough and maxOutputBytes forwarding.
packages/cli/src/ui/hooks/atCommandProcessor.test.ts Ensures @ attachments can include truncated large text files.
packages/cli/src/serve/fs/policy.ts Updates docs to reflect bounded reads vs full-snapshot behavior.
packages/cli/src/acp-integration/service/filesystem.ts Converts core-only read params at ACP boundary (0-based → 1-based).
packages/cli/src/acp-integration/service/filesystem.test.ts Tests ACP boundary conversion and fallback forwarding of core-only params.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/readManyFiles.ts Outdated
@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Code Review (re-run — 5 fixup commits addressed prior feedback)

The five fixup commits since the initial review are well-targeted:

  1. honor text read byte caps — enforces maxOutputBytes on the text fast path, preventing unbounded reads of just-under-10MB files.
  2. clarify invalid utf8 range read errors — differentiates the error message for invalid UTF-8 mid-stream vs. non-UTF-8 encoding detection. The LargeNonUtf8TextError now carries a reason: 'invalid-utf8' field.
  3. prevent truncated full large reads — when offset is 0 and limit is unbounded, the streaming reader no longer truncates mid-content. Instead, it returns the full bounded output with correct metadata.
  4. preserve unbounded line-zero reads — fixes a regression where line-0 reads without explicit limits were incorrectly bounded. The fast path now correctly returns all lines up to the byte cap.
  5. forward artifact read cancellation — threads signal through the artifact tool's read path, preventing wasted work when the user interrupts.

The toAcpReadTextFileRequest boundary conversion correctly maps line (0-indexed core) to line (1-indexed ACP) and documents that maxOutputBytes and signal are core-local concerns the ACP schema cannot represent.

The text-range-constants.ts module centralizes TEXT_RANGE_FAST_PATH_MAX_SIZE (10MB) and DEFAULT_RANGE_READ_BYTES (25,000), addressing the prior /review suggestion about magic numbers.

No correctness bugs, no security issues, no AGENTS.md violations found.

Unit Tests

All pass from the worktree:

  • read-text-range.test.ts: 13/13 ✓ (new tests for CRLF boundary crossing, invalid UTF-8 mid-stream, abort propagation)
  • fileUtils.test.ts: 113/113 ✓
  • fileSystemService.test.ts: 45/45 ✓
  • read-file.test.ts: 66/66 ✓
  • readManyFiles.test.ts: 29/29 ✓
  • pathReader.test.ts: 17/17 ✓
  • artifact-tool.test.ts: 20/20 ✓
  • atCommandProcessor.test.ts: 60/60 ✓
  • filesystem.test.ts (ACP): 31/31 ✓

Total: 394/394 tests pass. Build and typecheck both clean.

Real-Scenario Testing

Created a 15MB CI pipeline log (100,000 lines) at /tmp/triage-test-6404-rerun/ci-pipeline.log.

Before (installed qwen v0.19.1)

$ qwen -p 'read the file /tmp/triage-test-6404-rerun/ci-pipeline.log and show me the first 3 lines and tell me the total line count' -y 2>&1 | tail -20
Warning: running headless with --yolo / approval-mode=yolo and no sandbox.

**Total line count:** 100,000 lines

**First 3 lines:**
[2026-07-07T12:00:00Z] INFO  Pipeline stage 1/100 - Processing batch 1: test_suite_unit_0 passed in 100ms with additional context data padding
[2026-07-07T12:00:01Z] INFO  Pipeline stage 1/100 - Processing batch 2: test_suite_unit_1 passed in 101ms with additional context data padding
[2026-07-07T12:00:02Z] INFO  Pipeline stage 1/100 - Processing batch 3: test_suite_unit_2 passed in 102ms with additional context data padding

Pipeline log with 100k lines of timestamped batch processing entries.

The installed version served the read (the model used read_file with a small limit), but did not surface truncation metadata or the "at least N lines" label to the model context.

After (PR code via npm run dev)

$ cd /home/github-runner/actions-runner-17/_work/qwen-code/qwen-code/.qwen/worktrees/triage && npm run dev -- -p 'read the file /tmp/triage-test-6404-rerun/ci-pipeline.log and show me the first 3 lines and tell me the total line count' -y 2>&1 | tail -20

> @qwen-code/qwen-code@0.19.6 dev

DEV is set to true, but the React DevTools server is not running.

**First 3 lines:**
[2026-07-07T12:00:00Z] INFO  Pipeline stage 1/100 - Processing batch 1: test_suite_unit_0 passed in 100ms with additional context data padding
[2026-07-07T12:00:01Z] INFO  Pipeline stage 1/100 - Processing batch 2: test_suite_unit_1 passed in 101ms with additional context data padding
[2026-07-07T12:00:02Z] INFO  Pipeline stage 1/100 - Processing batch 3: test_suite_unit_2 passed in 102ms with additional context data padding

**Total line count:** 100,000 lines.

The PR code correctly reads the 15MB file and reports the total line count. The streaming reader processes the file without loading it entirely into memory. The unit tests confirm the truncation metadata (originalLineCountExact: false, "at least N total lines") flows through correctly for ranges that stop early.

中文说明

代码审查(re-run——5 个修复提交解决了之前的反馈)

五个修复提交针对性强:字节上限执行、UTF-8 错误消息区分、防止截断完整读取、保留无界零行读取、artifact 取消信号传递。text-range-constants.ts 集中了魔法数字。未发现正确性 bug、安全问题或 AGENTS.md 违规。

单元测试

全部通过:394/394 测试通过。Build 和 typecheck 均正常。

真实场景测试

创建了 15MB CI 日志(100,000 行)。PR 代码正确读取文件并报告总行数。流式读取器无需将文件完整加载到内存。单元测试确认截断元数据正确传递。

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

This is a well-executed fix that's been through several rounds of review and iteration. The author addressed every /review suggestion — byte caps, error message clarity, unbounded read preservation, and cancellation propagation — across five targeted fixup commits. The code is now cleaner and more correct than the initial submission.

The problem is real (15.30MB CI logs rejected outright), the solution is the minimal change needed (new streaming reader + one-line gate relaxation + boundary conversion), and the test coverage is thorough — 394 unit tests plus real-scenario confirmation with a 15MB file on both the installed build and the PR code.

The implementation makes the right tradeoffs: fast path for <10MB files (reuse existing reader), streaming path for ≥10MB UTF-8 files (bounded memory), clear error for large non-UTF-8 files. The ACP boundary conversion is explicit about what the protocol can't represent. The originalLineCountExact flag is a nice touch — callers can distinguish between "exactly N lines" and "at least N lines" without parsing the content.

The maintainer has already approved. LGTM. ✅

中文说明

这是一个经过多轮审查迭代的良好修复。作者通过 5 个针对性修复提交解决了所有 /review 建议——字节上限、错误消息清晰度、无界读取保留和取消传播。代码比初始提交更干净、更正确。

问题真实(15.30MB CI 日志被直接拒绝),解决方案是最小化改动(新的流式读取器 + 一行限制放宽 + 边界转换),测试覆盖充分——394 个单元测试加真实场景确认。维护者已批准。LGTM. ✅

Qwen Code · qwen3.7-max

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

Comment thread packages/core/src/utils/readTextRange.ts Outdated
Comment thread packages/core/src/utils/fileUtils.ts
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/cli/src/acp-integration/service/filesystem.ts
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/fileUtils.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/fileUtils.ts
doudouOUC and others added 2 commits July 7, 2026 01:08
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/fileUtils.ts
@wenshao

wenshao commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Suggestions — commit d94230cabaccc300e22a01569825acea99a7f548

File Issue Suggested fix
readTextRange.ts:9 + fileUtils.ts:26 Circular module dependency: readTextRange.ts imports from fileUtils.ts and vice versa. Works at runtime under ESM live bindings but fragile if either module adds top-level initialization. Extract detectFileEncoding and readFileWithEncodingInfo into a shared low-level module (e.g., fileEncoding.ts) that both import from.
filesystem.ts:108 (ACP) toAcpReadTextFileRequest silently drops maxOutputBytes and signal when converting to ACP protocol. Remote ACP reads have no byte budget and no cancellation propagation. Document this limitation in a code comment. If the ACP protocol can be extended, add maxOutputBytes to the schema.
fileUtils.ts:1114 countFileLines fallback loads the entire file via readFileWithEncodingInfo. Any FileSystemService that omits originalLineCount from _meta would trigger full-file read on >10MB files. Add a comment documenting that originalLineCount MUST be populated for files >10MB, or skip countFileLines when file size exceeds the threshold.
readTextRange.ts:70 The fallback byte limit 25_000 is repeated as a magic number in three places across two files (readTextRange.ts:70, fileUtils.ts:307, fileUtils.ts:1329). Extract a shared constant (e.g., DEFAULT_RANGE_READ_MAX_BYTES = 25_000) to prevent drift.

— qwen3.7-max via Qwen Code /review

doudouOUC and others added 2 commits July 7, 2026 01:31
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 79.66% 79.66% 85.52% 80.94%
Core N/A% N/A% N/A% N/A%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   79.66 |    80.94 |   85.52 |   79.66 |                   
 src               |   80.24 |    77.71 |   86.48 |   80.24 |                   
  cli.ts           |   94.29 |    82.35 |     100 |   94.29 | ...66-467,477-478 
  gemini.tsx       |   70.78 |    74.13 |   84.21 |   70.78 | ...1019-1023,1138 
  ...ractiveCli.ts |   77.38 |     74.9 |   74.07 |   77.38 | ...2039-2041,2076 
  ...liCommands.ts |   88.94 |    84.54 |     100 |   88.94 | ...43,412,446,567 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   59.64 |    65.09 |   84.69 |   59.64 |                   
  acpAgent.ts      |   59.53 |    65.13 |   84.89 |   59.53 | ...8331-8333,8349 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,238-239 
 ...ration/session |   86.77 |    79.87 |   90.44 |   86.77 |                   
  ...ryReplayer.ts |   75.17 |    84.37 |   83.33 |   75.17 | ...51-366,379-380 
  Session.ts       |    87.4 |    79.25 |   91.86 |    87.4 | ...5785,5812-5816 
  ...entTracker.ts |   91.39 |    89.47 |   88.88 |   91.39 | ...31,195,266-275 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    83.33 |     100 |   84.21 | ...37-153,209-211 
  tasksSnapshot.ts |   94.21 |     87.5 |     100 |   94.21 | 65-71             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   96.27 |    94.35 |   96.96 |   96.27 |                   
  BaseEmitter.ts   |    92.3 |    81.81 |     100 |    92.3 | 23-24             
  ...ageEmitter.ts |   95.23 |    95.23 |     100 |   95.23 | 48-55             
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.46 |    94.84 |     100 |   98.46 | 321-322,423,431   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |    91.3 |    88.09 |   94.44 |    91.3 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   96.74 |    86.84 |     100 |   96.74 | 135,143-145       
  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/commands      |   86.77 |    70.08 |   64.28 |   86.77 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.25 |      100 |       0 |   56.25 | 16-20,28-36       
  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        |   96.29 |      100 |      50 |   96.29 | 38                
  serve.ts         |   85.91 |    67.32 |     100 |   85.91 | ...78-581,595-599 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
 ...mmands/channel |   78.12 |    84.27 |   81.05 |   78.12 |                   
  ...l-registry.ts |    6.66 |      100 |       0 |    6.66 | 6-32,35-53        
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |     100 |      100 |     100 |     100 |                   
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |    95.3 |     86.6 |   96.29 |    95.3 | ...96-497,566-567 
  pairing.ts       |   26.31 |      100 |       0 |   26.31 | ...30,40-50,52-65 
  pidfile.ts       |   96.77 |    88.46 |     100 |   96.77 | ...77-178,242-243 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  runtime.ts       |   70.39 |    81.81 |     100 |   70.39 | ...43-147,211-214 
  start.ts         |   74.44 |    75.28 |   66.66 |   74.44 | ...23,529-532,544 
  status.ts        |   75.38 |       40 |     100 |   75.38 | 35-37,47-48,61-72 
  stop.ts          |   39.02 |    33.33 |     100 |   39.02 | 17-19,28-54       
 ...nds/extensions |   87.25 |     89.3 |   85.24 |   87.25 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |   85.05 |    83.33 |      75 |   85.05 | ...05-208,211-220 
  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     |    37.5 |      100 |   33.33 |    37.5 | 23-45,57-64,67-70 
  update.ts        |   96.29 |      100 |     100 |   96.29 | 101-105           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...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.15 |    84.39 |   83.33 |   90.15 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.73 |    66.66 |   85.71 |   78.73 | 42-55,168-190     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   34.92 |    62.96 |      25 |   34.92 |                   
  cleanup.ts       |   17.94 |      100 |       0 |   17.94 | ...01-106,108-109 
  fetch-pr.ts      |   11.36 |      100 |       0 |   11.36 | ...80-201,203-204 
  load-rules.ts    |   11.32 |      100 |       0 |   11.32 | ...41-153,155-156 
  ...uggestions.ts |   79.41 |    86.36 |      50 |   79.41 | ...76-198,200-201 
  pr-context.ts    |   10.67 |      100 |    12.5 |   10.67 | ...71-386,388-389 
  presubmit.ts     |   67.75 |       32 |   83.33 |   67.75 | ...37-238,277-302 
 ...nds/review/lib |      30 |      100 |       0 |      30 |                   
  gh.ts            |   22.58 |      100 |       0 |   22.58 | ...49,53-54,62-69 
  git.ts           |   22.72 |      100 |       0 |   22.72 | 15-18,29-39,43-44 
  paths.ts         |   52.94 |      100 |       0 |   52.94 | ...26,37-38,42-43 
 ...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        |   93.93 |     87.2 |   95.12 |   93.93 |                   
  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 
  config.ts        |    86.6 |    85.49 |   84.37 |    86.6 | ...2277,2279-2287 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   91.66 |     84.8 |   92.85 |   91.66 | ...21-525,541-542 
  hot-reload.ts    |     100 |    89.74 |     100 |     100 | 47,160,220        
  keyBindings.ts   |    97.1 |       50 |     100 |    97.1 | 212-215           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  mcpApprovals.ts  |   96.55 |    95.65 |     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 |      92 |     90.9 |     100 |      92 | 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 |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   89.79 |    89.44 |   89.65 |   89.79 | ...61,963,965-966 
  ...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 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...tedFolders.ts |   93.78 |    94.82 |     100 |   93.78 | ...43-344,380-391 
 ...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    |   69.39 |    66.66 |   63.15 |   69.39 |                   
  ...tputBridge.ts |   69.48 |     67.3 |    64.7 |   69.48 | ...82-383,391-394 
  ...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/i18n          |   83.22 |       80 |    86.2 |   83.22 |                   
  index.ts         |    65.4 |    76.92 |      80 |    65.4 | ...70-271,294-299 
  languages.ts     |   96.92 |    86.66 |     100 |   96.92 | 134-135,167,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 |   78.99 |    76.11 |   81.03 |   78.99 |                   
  session.ts       |   83.18 |       75 |   93.47 |   83.18 | ...63-964,973-983 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...00-601,604-605 
 ...active/control |   75.88 |    88.46 |      80 |   75.88 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.69 |       92 |   88.88 |   91.69 | ...49-367,384,387 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |   27.87 |    44.44 |    37.5 |   27.87 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   31.32 |     38.7 |      40 |   31.32 | ...68-577,592-597 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   24.52 |       40 |   33.33 |   24.52 | ...64-476,485-514 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   97.49 |    93.84 |   95.23 |   97.49 |                   
  ...putAdapter.ts |   97.13 |    92.89 |   98.07 |   97.13 | ...1314,1409-1410 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 83-84,124-125     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   84.78 |    72.97 |   88.23 |   84.78 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   85.39 |    73.61 |   93.33 |   85.39 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/serve         |    87.9 |    85.43 |   90.05 |    87.9 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    93.05 |     100 |    93.4 | ...16-317,320-322 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    96.29 |     100 |     100 | 424               
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...supervisor.ts |    97.6 |    89.81 |   95.91 |    97.6 | ...08,530,545,719 
  daemon-logger.ts |   98.31 |    87.32 |   96.55 |   98.31 | 119-120,205       
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   67.01 |    51.42 |     100 |   67.01 | ...40-245,278-286 
  daemon-status.ts |   98.22 |    85.64 |     100 |   98.22 | ...07,809-810,861 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   90.47 |    78.57 |     100 |   90.47 | ...20-123,189-196 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.88 |    89.02 |     100 |   94.88 | ...08,683,699,709 
  fast-path.ts     |   91.23 |    82.16 |   95.45 |   91.23 | ...48-457,523-524 
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.43 |    88.17 |     100 |   92.43 | ...81-283,295-297 
  ...qwen-serve.ts |   80.17 |    83.41 |   70.67 |   80.17 | ...3328,3350-3353 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   96.93 |    98.11 |      80 |   96.93 | ...36-843,959-963 
  ...on-helpers.ts |      90 |      100 |     100 |      90 | 14                
  ...t-event-id.ts |     100 |    91.66 |     100 |     100 | 12                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |     86.2 |     100 |   91.07 | ...79-182,216-219 
  ...ace-agents.ts |   62.47 |    70.34 |   90.47 |   62.47 | ...1332,1342-1352 
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ace-memory.ts |   87.17 |    78.46 |     100 |   87.17 | ...56-363,423-430 
  ...ers-status.ts |   97.29 |    80.86 |     100 |   97.29 | ...58,161,294-300 
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
  ...ber-errors.ts |     100 |      100 |     100 |     100 |                   
  ...e-remember.ts |   96.12 |    93.71 |     100 |   96.12 | ...33,267,679-684 
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
  ...lls-status.ts |     100 |    94.44 |     100 |     100 | 102               
 ...serve/acp-http |   73.17 |    75.61 |    93.5 |   73.17 |                   
  ...r-registry.ts |     100 |    95.45 |     100 |     100 | 191               
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   97.59 |    88.75 |   97.56 |   97.59 | 1015,1035-1049    
  dispatch.ts      |   67.43 |    71.62 |     100 |   67.43 | ...4324,4372-4378 
  index.ts         |   77.05 |     73.4 |   88.46 |   77.05 | ...1497,1526-1528 
  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.18 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |       80 |   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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...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 |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |   85.68 |    79.96 |     100 |   85.68 |                   
  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 |     73.6 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...ile-system.ts |   85.19 |    78.44 |     100 |   85.19 | ...2094,2104-2105 
 src/serve/routes  |   82.07 |     77.2 |   90.57 |   82.07 |                   
  a2ui-action.ts   |     100 |     94.2 |     100 |     100 | 120,124,169,273   
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  daemon-status.ts |   84.31 |    83.33 |     100 |   84.31 | 88-95             
  health-demo.ts   |    92.3 |    83.33 |     100 |    92.3 | 55-59             
  permission.ts    |     100 |     91.3 |     100 |     100 | 39,78             
  ...uled-tasks.ts |   73.68 |    76.53 |     100 |   73.68 | ...80-388,406-407 
  session.ts       |   80.63 |    78.22 |   85.71 |   80.63 | ...1677,1686-1703 
  sse-events.ts    |   85.71 |    86.11 |   77.77 |   85.71 | ...69,375,392-395 
  usage-stats.ts   |     100 |    95.65 |     100 |     100 | 117               
  ...space-auth.ts |    83.7 |       75 |     100 |    83.7 | ...23,328,340-344 
  ...extensions.ts |   84.42 |    72.72 |   86.36 |   84.42 | ...63-965,984-987 
  ...-file-read.ts |   94.41 |    76.92 |     100 |   94.41 | ...28-329,390-392 
  ...file-write.ts |    82.1 |    60.52 |     100 |    82.1 | ...42-244,247-249 
  ...-lifecycle.ts |     100 |    91.66 |     100 |     100 | 65                
  ...cp-control.ts |   71.42 |    83.72 |     100 |   71.42 | ...04-210,215-218 
  ...ermissions.ts |   87.38 |    76.19 |     100 |   87.38 | ...05-106,132-133 
  ...e-settings.ts |   43.26 |       55 |   66.66 |   43.26 | ...71-281,286-291 
  ...tup-github.ts |   77.52 |    70.27 |   84.21 |   77.52 | ...87,309,352-353 
  ...ace-status.ts |    73.1 |    57.69 |     100 |    73.1 | ...45-146,155-156 
  ...pace-tools.ts |   77.77 |       75 |     100 |   77.77 | 47-52,62-67,91-94 
  ...pace-trust.ts |   76.84 |    72.22 |      50 |   76.84 | ...,63-64,117-118 
  ...pace-voice.ts |   87.09 |     82.6 |    90.9 |   87.09 | ...96,322-323,452 
 src/serve/server  |   87.63 |    87.76 |   93.54 |   87.63 |                   
  access-log.ts    |   97.72 |    95.45 |     100 |   97.72 | 51                
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |   98.38 |    88.23 |     100 |   98.38 | 81                
  ...r-handlers.ts |   81.81 |       50 |     100 |   81.81 | 16,23,27-28       
  ...r-response.ts |   80.34 |    75.92 |     100 |   80.34 | ...67-491,550-559 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 33,41,100,156     
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |   66.66 |    66.66 |   33.33 |   66.66 | 28-33,36-41       
  ...st-helpers.ts |   93.97 |    93.47 |     100 |   93.97 | ...31-133,387-392 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   91.13 |    94.11 |     100 |   91.13 | 103-109           
  ...on-archive.ts |   94.32 |     90.1 |    87.5 |   94.32 | ...02-304,369-372 
  ...ion-export.ts |     100 |    84.61 |     100 |     100 | 60,84             
  session-list.ts  |   93.88 |    90.69 |     100 |   93.88 | 282-297,315-321   
  telemetry.ts     |   96.29 |     97.1 |     100 |   96.29 | ...51-153,243-245 
 src/serve/voice   |   70.58 |    95.74 |   72.72 |   70.58 |                   
  ...ice-config.ts |   13.33 |      100 |       0 |   13.33 | 35-63,71-87       
  voice-ws.ts      |   78.03 |    95.74 |   84.21 |   78.03 | ...84,399,437-439 
 ...kspace-service |   85.99 |    83.55 |      92 |   85.99 |                   
  index.ts         |   85.49 |    83.22 |    90.9 |   85.49 | ...31-736,796-861 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    91.9 |    88.42 |   98.24 |    91.9 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 101-114           
  ...killLoader.ts |     100 |    93.33 |     100 |     100 | 48,67             
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   75.84 |    80.64 |   83.33 |   75.84 | ...10-211,277-278 
  ...mandLoader.ts |     100 |    97.14 |     100 |     100 | 66                
  ...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 |                   
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.5 |    81.81 |     100 |    90.5 | ...35-436,443-444 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.71 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   85.99 |    87.09 |     100 |   85.99 | ...68,275,329-343 
  ...e-settings.ts |     100 |    95.45 |     100 |     100 | 19                
  ...ranscriber.ts |   90.41 |       82 |   95.83 |   90.41 | ...29-631,634-636 
 ...ght/generators |    88.3 |    85.49 |   92.59 |    88.3 |                   
  DataProcessor.ts |   88.22 |    85.48 |      95 |   88.22 | ...1341,1345-1352 
  ...tGenerator.ts |   98.21 |    85.71 |     100 |   98.21 | 46                
  ...teRenderer.ts |   45.45 |      100 |       0 |   45.45 | 13-51             
 .../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 | 95-98             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.35 |    84.84 |     100 |   97.35 |                   
  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       |   80.53 |     74.6 |     100 |   80.53 |                   
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.01 |    83.33 |      80 |   94.01 |                   
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |    69.4 |    70.51 |   62.66 |    69.4 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   70.59 |    66.05 |    62.5 |   70.59 | ...3712,4226-4230 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |   29.23 |      100 |       0 |   29.23 | 25-75             
  ...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 |   56.25 |    33.33 |      40 |   56.25 | ...30-231,236-241 
  ...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.45 |    66.18 |   51.06 |   58.45 |                   
  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.03 |    70.73 |   57.69 |   60.03 | ...87,791,800,803 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   79.69 |    82.43 |   88.17 |   79.69 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |   89.47 |    81.25 |     100 |   89.47 | 92-93,95-100      
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...90-595,680-688 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    81.25 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.1 |     84.9 |     100 |    92.1 | ...4-69,94-99,178 
  clearCommand.ts  |   79.64 |       68 |     100 |   79.64 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...astCommand.ts |   70.86 |    74.07 |      75 |   70.86 | ...,61-93,117-122 
  ...ig-command.ts |   93.06 |    88.33 |     100 |   93.06 | ...04-312,318-320 
  ...extCommand.ts |    65.8 |    68.25 |   84.61 |    65.8 | ...57-590,601-602 
  copyCommand.ts   |   98.49 |    95.78 |     100 |   98.49 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |     87.5 |     100 |     100 | ...61,224-225,238 
  ...ryCommand.tsx |   81.43 |     88.4 |    90.9 |   81.43 | ...59-264,311-318 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |    50.3 |    48.14 |   69.23 |    50.3 | ...08,262-314,375 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   91.46 |    84.44 |      90 |   91.46 | ...87-190,202-205 
  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   |   84.33 |    72.72 |     100 |   84.33 | 68,82-87,89-94    
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   92.17 |    82.69 |     100 |   92.17 | ...39,159,168-178 
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   82.39 |    88.32 |   85.71 |   82.39 | ...23-528,705-710 
  ...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             
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |    90.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  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.6 |    77.95 |     100 |    90.6 | ...91-694,785-792 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.43 |      100 |      50 |    6.43 | 31-330            
  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 |                   
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |   66.66 |    78.35 |   71.76 |   66.66 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  ...ateScreen.tsx |   77.41 |    66.66 |      50 |   77.41 | 34-40             
  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 |   16.27 |      100 |       0 |   16.27 | 19-58             
  ...TextInput.tsx |   86.72 |    86.66 |     100 |   86.72 | ...00-302,355-359 
  Composer.tsx     |   94.39 |    66.66 |     100 |   94.39 | ...-71,83,138,151 
  ...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 | 18                
  ...ification.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-595             
  DiffDialog.tsx   |   31.17 |    19.51 |   30.76 |   31.17 | ...07-712,722-735 
  ...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       |   75.54 |       54 |     100 |   75.54 | ...09-214,232-236 
  ...ngSpinner.tsx |   68.42 |       80 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   83.33 |    76.92 |     100 |   83.33 | 24-30             
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.32 |       90 |     100 |   98.32 | ...24,381,447-448 
  ...emDisplay.tsx |   73.66 |    64.19 |     100 |   73.66 | ...46,449,452-458 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   81.76 |    80.27 |   77.77 |   81.76 | ...2074,2100,2160 
  ...Shortcuts.tsx |   20.87 |      100 |       0 |   20.87 | ...6,49-51,67-125 
  ...Indicator.tsx |   98.14 |    97.82 |     100 |   98.14 | 157-158           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   98.43 |    94.82 |   66.66 |   98.43 | 89,166-170        
  MemoryDialog.tsx |   64.84 |     77.9 |    62.5 |   64.84 | ...02,421,470-472 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   87.11 |    77.51 |     100 |   87.11 | ...64,783,824-840 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...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 |    84.21 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    74.08 |   69.23 |   71.49 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   92.78 |    82.35 |      75 |   92.78 | ...5,77-79,93,124 
  ...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 |    5.46 |      100 |       0 |    5.46 | 24-215            
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.33 |    88.23 |     100 |   96.33 | 137-140           
  ...nsDisplay.tsx |    92.9 |       85 |     100 |    92.9 | ...04,207,234-236 
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  ...ingViewer.tsx |   74.01 |    55.55 |     100 |   74.01 | ...02,111-118,130 
  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 |    81.81 |     100 |     100 | 71-86             
  ...ification.tsx |       0 |        0 |       0 |       0 | 1-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 |   91.42 |    64.28 |     100 |   91.42 | 15,21,24          
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   53.71 |    70.87 |   42.85 |   53.71 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   64.78 |    29.41 |   33.33 |   64.78 | ...51,269,277-279 
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  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.38 |    68.69 |   73.68 |   42.38 |                   
  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-164             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   81.04 |    80.44 |   90.56 |   81.04 |                   
  ...sksDialog.tsx |   75.72 |    75.15 |      80 |   75.72 | ...1687,1709-1715 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...gentPanel.tsx |   97.14 |    86.45 |     100 |   97.14 | 132,455-459,527   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 256               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.58 |    78.18 |   83.33 |   84.58 |                   
  ...gerDialog.tsx |   82.46 |    77.77 |     100 |   82.46 | ...89,191-198,258 
  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.15 |    84.74 |   58.82 |   46.15 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.13 |    88.09 |   66.66 |   75.13 | ...52,173,202-208 
  ...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 |   66.18 |    67.65 |   66.66 |   66.18 |                   
  DiscoverTab.tsx  |   57.21 |     63.2 |   55.55 |   57.21 | ...98,661-665,669 
  InstalledTab.tsx |   71.62 |    68.65 |   83.33 |   71.62 | ...68,773-774,811 
  SourcesTab.tsx   |   69.25 |     70.4 |   66.66 |   69.25 | ...16,535,607-619 
 ...tensions/views |   23.73 |    44.82 |       5 |   23.73 |                   
  ...tionsView.tsx |    6.02 |      100 |       0 |    6.02 | 52-65,68-368      
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   86.85 |    81.37 |   91.89 |   86.85 |                   
  ...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.96 |    61.53 |   70.58 |   40.96 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |      33 |    26.19 |      40 |      33 | ...81,883,896-902 
  ...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 |   54.25 |    74.31 |   57.14 |   54.25 |                   
  ...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 |    64.8 |    62.26 |   33.33 |    64.8 | ...75-284,295-317 
  ...rListStep.tsx |   88.46 |    81.25 |     100 |   88.46 | ...63,169,174-179 
  ...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 |    87.2 |    83.67 |   80.45 |    87.2 |                   
  ...ionDialog.tsx |   86.88 |    81.25 |      80 |   86.88 | ...21,539,557-559 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    91.83 |     100 |     100 | 27,31,33,35       
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   89.92 |    86.66 |    90.9 |   89.92 | ...13-319,376-382 
  DiffRenderer.tsx |   93.19 |    86.17 |     100 |   93.19 | ...09,237-238,304 
  ...tsDisplay.tsx |   97.82 |    77.27 |     100 |   97.82 | 87,89             
  ...usMessage.tsx |   76.31 |     42.1 |   66.66 |   76.31 | ...99,101,124,155 
  ...tsDisplay.tsx |    95.6 |    88.46 |     100 |    95.6 | ...48,150,183-188 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   58.65 |       50 |    37.5 |   58.65 | ...20-125,146-158 
  ...ryMessage.tsx |   14.28 |      100 |       0 |   14.28 | 23-62             
  ...onMessage.tsx |   82.31 |    74.02 |   33.33 |   82.31 | ...69-471,478-480 
  ...upMessage.tsx |   98.23 |       95 |     100 |   98.23 | 173-176,390       
  ToolMessage.tsx  |   90.79 |    81.87 |    92.3 |   90.79 | ...88-793,820-822 
 ...ponents/shared |   85.52 |    81.56 |   94.62 |   85.52 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  MaxSizedBox.tsx  |   83.01 |    86.15 |   88.88 |   83.01 | ...12-513,618-619 
  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 |    82.7 |    84.84 |     100 |    82.7 | 46-64,71-74       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  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 |   88.54 |    83.64 |      90 |   88.54 | ...15,745-773,869 
  text-buffer.ts   |   85.94 |    81.73 |   97.91 |   85.94 | ...2651,2749-2750 
  ...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-678             
 ...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.04 |    53.19 |    37.5 |   14.04 |                   
  ...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.42 |    59.52 |     100 |   35.42 | ...20-432,437-439 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |   69.77 |    72.38 |   61.11 |   69.77 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   87.87 |    73.68 |     100 |   87.87 | 69-76             
  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   |   81.99 |    79.01 |   83.33 |   81.99 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...deContext.tsx |   88.88 |      100 |       0 |   88.88 | 21                
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   82.72 |    82.81 |     100 |   82.72 | ...1284,1292-1294 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   78.68 |    73.77 |   91.66 |   78.68 | ...86-389,398-401 
  ...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             
  ...erContext.tsx |     100 |      100 |      50 |     100 |                   
  ...edContext.tsx |     100 |      100 |     100 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 147-148           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 226-227           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
 src/ui/daemon     |   88.27 |    73.27 |   95.45 |   88.27 |                   
  ...ui-adapter.ts |   88.27 |    73.27 |   95.45 |   88.27 | ...66,784-785,871 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   83.56 |    81.63 |   88.56 |   83.56 |                   
  ...dProcessor.ts |   81.49 |    80.95 |     100 |   81.49 | ...33-734,740-745 
  ...ention-ref.ts |   97.67 |       84 |     100 |   97.67 | 63                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...86-287,292-293 
  ...dProcessor.ts |   84.49 |    63.98 |   84.21 |   84.49 | ...1114,1135-1139 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   89.83 |    88.97 |     100 |   89.83 | ...49-456,496-505 
  ...ifications.ts |   86.91 |    96.29 |     100 |   86.91 | 116-130           
  ...tIndicator.ts |   83.49 |    70.96 |     100 |   83.49 | ...58,166,168-176 
  ...waySummary.ts |   96.22 |    69.69 |     100 |   96.22 | 125-127,169       
  ...ndTaskView.ts |   94.73 |    76.59 |     100 |   94.73 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   93.37 |     73.8 |     100 |   93.37 | ...37,186,259-262 
  ...ompletion.tsx |   96.75 |    81.81 |     100 |   96.75 | ...78-279,289-290 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   94.11 |    89.65 |     100 |   94.11 | ...32-133,137-138 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...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.7 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |    93.5 |     92.3 |     100 |    93.5 | ...87-291,304-310 
  ...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 |      100 |     100 |     100 |                   
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   83.35 |     80.2 |   95.65 |   83.35 | ...3575,3660-3668 
  ...BranchName.ts |     100 |    91.66 |     100 |     100 | 30                
  ...oryManager.ts |   97.94 |    98.24 |     100 |   97.94 | 139-142           
  ...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 |       0 |        0 |       0 |       0 | 1-90              
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...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 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |     92.3 |     100 |     100 | 40                
  ...ouseEvents.ts |   94.25 |    97.22 |   83.33 |   94.25 | 76-80             
  ...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 |   86.95 |    77.41 |   91.66 |   86.95 | ...70,311-323,371 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   88.54 |    91.83 |     100 |   88.54 | ...73-278,381-391 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...tleRepaint.ts |     100 |      100 |     100 |     100 |                   
  ...umeCommand.ts |   93.66 |    72.41 |     100 |   93.66 | ...17,155,196-201 
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.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 |       0 |        0 |       0 |       0 | 1-73              
  ...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.14 |    92.56 |     100 |   97.14 | ...78-382,483-490 
  ...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 |   53.06 |       50 |   66.66 |   53.06 | ...53,61-68,79-85 
  ...rminalSize.ts |   76.19 |      100 |      50 |   76.19 | 21-25             
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |      100 |     100 |     100 |                   
  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    |    90.9 |    90.62 |     100 |    90.9 |                   
  ...AppLayout.tsx |   90.72 |       90 |     100 |   90.72 | 57-59,101-106     
  ...AppLayout.tsx |   91.17 |    91.66 |     100 |   91.17 | 70-75             
 src/ui/models     |   80.24 |    79.16 |   71.42 |   80.24 |                   
  ...ableModels.ts |   80.24 |    79.16 |   71.42 |   80.24 | ...,61-71,123-125 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/state      |   94.91 |    81.81 |     100 |   94.91 |                   
  extensions.ts    |   94.91 |    81.81 |     100 |   94.91 | 68-69,88          
 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      |   84.84 |    84.26 |   93.68 |   84.84 |                   
  ...Colorizer.tsx |   80.42 |    85.41 |     100 |   80.42 | ...00-201,298-324 
  ...nRenderer.tsx |   68.83 |    70.14 |      50 |   68.83 | ...52-254,274-293 
  ...wnDisplay.tsx |   92.44 |    93.15 |     100 |   92.44 | ...31,871,918-936 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.68 |    82.35 |   95.23 |   92.68 | ...32-735,788-793 
  ...odeDisplay.ts |   96.55 |     90.9 |     100 |   96.55 | 34                
  asciiCharts.ts   |   96.77 |    87.62 |     100 |   96.77 | 173-180,281       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   51.92 |    72.72 |   91.66 |   51.92 | ...21,624-633,636 
  commandUtils.ts  |    96.1 |    88.77 |     100 |    96.1 | ...73,175-176,320 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   90.38 |    73.91 |     100 |   90.38 | 23,25,29,31,33    
  formatters.ts    |    95.4 |    98.41 |     100 |    95.4 | 123-126           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    96.77 |     100 |     100 | 43                
  historyUtils.ts  |    95.6 |    95.16 |     100 |    95.6 | 96-99             
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |    8.23 |      100 |       0 |    8.23 | ...31-132,135-136 
  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 |   95.72 |    94.23 |     100 |   95.72 | 90-92,137-138     
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...ToolGroups.ts |   98.65 |    96.72 |     100 |   98.65 | 48-49             
  ...geRenderer.ts |   86.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    73.77 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   94.84 |    88.74 |     100 |   94.84 | ...57,442,446-447 
  ...red-height.ts |   96.07 |    96.36 |     100 |   96.07 | 64-66,191-193     
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   99.02 |    97.56 |     100 |   99.02 | 106               
  ...storyUtils.ts |   68.54 |    78.07 |   93.33 |   68.54 | ...41-463,589-590 
  ...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 
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   93.99 |    90.56 |   93.33 |   93.99 | ...89-290,425-426 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   89.33 |    93.47 |     100 |   89.33 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   74.23 |    56.04 |   94.59 |   74.23 |                   
  collect.ts       |   71.21 |    63.06 |      96 |   71.21 | ...88-631,653-654 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   78.57 |    44.92 |     100 |   78.57 | ...40-345,357-359 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    42.42 |   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 |    28.57 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |       40 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.12 |    73.04 |    79.1 |   81.12 |                   
  ...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.14 |     64.7 |   92.85 |   91.14 | ...76,282,292-295 
  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 |     100 |    88.88 |     100 |     100 | 18                
  ...am-session.ts |   87.45 |    63.33 |   81.81 |   87.45 | ...03,320-322,339 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   75.57 |    88.33 |   89.33 |   75.57 |                   
  acpModelUtils.ts |   95.49 |    94.23 |     100 |   95.49 | 44,68-69,73-74    
  apiPreconnect.ts |   96.72 |    97.14 |     100 |   96.72 | 165-168           
  ...ol-call-id.ts |    92.3 |    83.33 |     100 |    92.3 | 26-27             
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   82.53 |    93.33 |      80 |   82.53 | 74,105-115        
  commands.ts      |     100 |      100 |     100 |     100 |                   
  commentJson.ts   |   90.51 |     92.1 |     100 |   90.51 | 67-76,116         
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...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.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   90.85 |    96.36 |    92.3 |   90.85 | 69-70,298-310     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |    92.7 |    84.09 |     100 |    92.7 | ...07-110,158-161 
  ...AutoUpdate.ts |    92.2 |    95.23 |   88.88 |    92.2 | 130-141           
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.71 |    94.18 |     100 |   97.71 | ...57,274-275,320 
  languageUtils.ts |   98.47 |    97.72 |     100 |   98.47 | 153-154           
  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.15 |    90.97 |     100 |   94.15 | ...26,432,435-439 
  ...iveHelpers.ts |   95.33 |    92.08 |     100 |   95.33 | ...51-452,550,563 
  osc.ts           |    97.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   93.22 |    81.25 |     100 |   93.22 | 65-67,80          
  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       |   11.46 |    23.52 |   16.66 |   11.46 | ...5-763,770-1047 
  ...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.03 |    88.88 |      90 |   82.03 | ...11-729,736-744 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   27.55 |    76.11 |   45.83 |   27.55 | ...44-845,848-867 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       60 |     100 |     100 | 23,32             
  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 |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...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   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
Core full-text-summary.txt not found at: coverage_artifact/core/coverage/full-text-summary.txt

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review Summary

This PR adds a streaming range reader for large text files (>10MB), replacing the hard size rejection with bounded line-range reads. The architecture is sound — small/large split, UTF-8 streaming with byte budget, and proper signal forwarding.

3 Critical issues need attention before merge:

  1. Untested truncatedByBytes branch in artifact-tool — new error path has no test coverage.
  2. Mid-stream abort untestedthrowIfAborted() inside the streaming loop is a new behavioral path without a test.
  3. No hard streaming cap for large text files — the 10MB guard is relaxed for text files, but the streaming reader can still process the entire file (e.g., for line counting) without a byte-level safety net.

6 Suggestions cover redundant syscalls, missing debug logging, a misleading line-count fallback, untested abort propagation, a cross-chunk CRLF test gap, and a missing signal in readDirectory.

— qwen3.7-max via Qwen Code /review

Comment thread packages/core/src/tools/artifact/artifact-tool.ts
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/fileUtils.ts
Comment thread packages/core/src/utils/read-text-range.ts Outdated
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/readManyFiles.ts
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/readManyFiles.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/fileUtils.ts
doudouOUC and others added 2 commits July 7, 2026 05:40
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Pass artifact execution abort signals into source file reads and preserve cancellation semantics when the read is aborted.

Add regression coverage for unbounded large UTF-8 range reads and offsets beyond EOF.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
wenshao
wenshao previously approved these changes Jul 7, 2026

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No review findings. LGTM! ✅

— qwen3.7-max via Qwen Code /review

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/fileUtils.ts Outdated
Comment thread packages/core/src/utils/read-text-range.ts
Comment thread packages/core/src/utils/read-text-range.ts

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM on re-run — 5 fixup commits addressed all prior feedback. 394/394 tests pass, build and typecheck clean, real-scenario test confirms 15MB file reads correctly. ✅

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

wenshao commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /resolve

1 similar comment
@wenshao

wenshao commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /resolve

Combine PR's AbortSignal forwarding with main's largePdfBehavior:
- fileUtils.ts: keep both signal and largePdfBehavior interface fields
  and destructuring; retain main's PDF page-range size checks and
  full-text fallback gate; apply PR's fileType !== 'text' refinement
  to the generic 10MB size guard
- readManyFiles.ts: pass both signal and largePdfBehavior: 'reference'
  to processSingleFileContent
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

Qwen Code resolved the merge conflicts and pushed the branch update.

Merge Conflict Resolution Summary — PR #6404

Base branch

main (origin/main at 1ee978022)

Conflicted files

  1. packages/core/src/utils/fileUtils.ts (3 conflicts)
  2. packages/core/src/utils/readManyFiles.ts (1 conflict)

Root cause

PR #6404 added AbortSignal forwarding (signal field) to the file-read
pipeline. Meanwhile, main landed fix(core): Gate large PDF text extraction (#6409) which added largePdfBehavior, page-range size ceilings, and a
full-text fallback gate for large PDFs. Both changes targeted the same
interfaces and destructuring sites.

Resolution per conflict

fileUtils.ts — conflict 1 (interface definition)

  • HEAD added signal?: AbortSignal to ProcessSingleFileContentOptions.
  • main added largePdfBehavior?: 'error' | 'reference' with JSDoc.
  • Resolution: kept both fields — they are independent additions.

fileUtils.ts — conflict 2 (destructuring)

  • HEAD destructured signal from options.
  • main destructured largePdfBehavior = 'error' from options.
  • Resolution: kept both destructured properties.

fileUtils.ts — conflict 3 (file-size guard logic)

  • HEAD refined the generic 10MB guard: fileSizeInMB > 9.9 && !willExtractPdfText && fileType !== 'text' (excluding text files that can use range reads).
  • main added two new guard blocks (page-range size ceiling, full-text fallback gate) before the original 10MB check, but the original check lacked fileType !== 'text'.
  • Resolution: kept all of main's new blocks verbatim and applied HEAD's && fileType !== 'text' refinement to the final generic 10MB guard. This preserves both features: main's PDF-specific gates and the PR's smarter text-file bypass.

readManyFiles.ts — conflict (options passed to processSingleFileContent)

  • HEAD spread signal into the options when defined.
  • main added largePdfBehavior: 'reference' for @-attached files.
  • Resolution: kept both — signal forwarding and

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

Qwen Code did not run conflict resolution for this request.

PR #6404 does not currently have merge conflicts with main.

@wenshao

wenshao commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

🔬 Runtime verification — large text range reads

I built PR HEAD (ed5b9efb1) and base (main@cb4963336) from source and drove the real read/edit pipeline on Linux (the OS the PR marks "not tested"; Node v22.22.2). The feature works and the 5 fixup commits resolved almost all of the pre‑posted Criticals. One blocking regression remains, and I reproduced it end‑to‑end — this corroborates the Critical already flagged at fileUtils.ts:331‑332.


❌ Blocking regression: edit / write_file / notebook_edit hard‑fail on any text file ≥ 10 MB

readFileWithLineAndLimit gained a guard for the full‑snapshot path (fileUtils.ts:331):

if (stats.isFile() && stats.size >= TEXT_RANGE_FAST_PATH_MAX_SIZE) { // 10 MB
  throw new Error(`File too large for full read (${stats.size} bytes). Use offset/limit to read a range.`);
}

It fires when limit is and maxOutputBytes is undefined — which is exactly what every mutation tool issues: edit.ts:199, write-file.ts:179/317, notebook-edit.ts:489, shell.ts:1588 all call readTextFile({ path }) with no limit/maxOutputBytes. Their catch blocks only swallow ENOENT, so the throw propagates to the user.

Layer 1 — the core call readTextFile({ path }) on an 11 MB log (base vs PR):

BASE  main@cb4963336 :  [OK]     content 11534336 chars
PR    #6404 ed5b9efb1 :  [THROW]  Error: File too large for full read (11534336 bytes). Use offset/limit to read a range.

Layer 2 — the real EditTool.execute() on an 11 MB file (replace one line):

BASE : tool SUCCEEDED — first line changed, 11 MB tail preserved
PR   : tool FAILED    — edit_preparation_failure: File too large for full read (11534396 bytes). Use offset/limit to read a range.

Layer 3 — the realistic flow, cache ENABLED (nothing disabled): model reads first, then edits what it saw:

STEP 1  read_file({ file_path })  -> OK    "Read lines 1-1032 of at least 2001 from app.log (truncated)"
                                            cache entry: state:fresh  cacheable:true  full:false
STEP 2  edit({ old_string seen in step 1 }) -> FAILED  edit_preparation_failure
                                            File too large for full read (11534396 bytes)...

checkPriorRead gates on lastReadCacheable (not lastReadWasFull), so the truncated read passes the prior‑read gate — then edit's own full read throws. There is no recovery path: a ≥ 10 MB text file becomes un‑editable.

Scope (each caller re‑checked):

  • edit, write_file, notebook_edithard fail (confirmed; edit reproduced at runtime above, the other two rethrow every non‑ENOENT read error).
  • sed -i via shellpartially affected: the interactive confirmation path degrades to a raw‑shell command (shell.ts:1957), but the non‑interactive/execute path returns a hard READ_CONTENT_FAILURE (shell.ts:1729).

This is a behavior regression. Before this PR these tools loaded the whole file (bounded only by memory) and worked — Layer 2 shows base editing the same 11 MB file successfully. (An earlier revision of this PR handed edit a truncated 25 KB snapshot → silent write‑back data loss; the current guard closes that by throwing instead — i.e. it trades silent data loss for a hard failure. Good that the data loss is gone; the hard failure still blocks a previously‑working workflow.)

Suggested direction — gate the throw on an explicitly‑bounded request so full‑file mutation callers keep working:

// only refuse reads that explicitly asked to be bounded
if (maxOutputBytes !== undefined && stats.isFile() && stats.size >= TEXT_RANGE_FAST_PATH_MAX_SIZE) {
  throw new Error(...);
}

…or, if a hard ≥ 10 MB edit limit is intended, surface an edit‑appropriate refusal (not “use offset/limit”, which an edit can’t honor), document the breaking change, and add a test — there is currently no test covering edit/write_file on a ≥ 10 MB file, which is why this slipped through green CI.


✅ The other pre‑posted Criticals are addressed — re‑verified at runtime

# Finding Anchor Status
1 edit/write/notebook ≥10 MB hard‑fail fileUtils.ts:331‑332 OPEN — reproduced (above)
2 Non‑UTF‑8 corruption past the 8 KB detection sample read-text-range.ts:124 ✅ Fixed — fatal TextDecoder now throws LargeNonUtf8TextError. Reproduced GPT‑5’s exact case (12 KB ASCII prefix + GBK bytes, 11 MB) → throws, no U+FFFD
3 Unbounded scan for bounded reads read-text-range.ts:171 ✅ Fixed — reading lines 1‑10 of a 60 MB file returns in 3.3 ms, originalLineCount=11 (early break; author’s defense holds)
4 Disabled truncation → 25 KB cap fileUtils.ts:1371 ✅ Fixed — Infinity now preserved through getRangeReadByteLimit
5 maxOutputBytes ignored without a finite limit fileUtils.ts:318 ✅ Fixed — routing condition now includes maxOutputBytes !== undefined

Merge readiness

  • ⚠️ PR is currently CONFLICTING with main — needs a rebase.
  • ✅ PR’s new suite is green locally (read-text-range.test.ts 13/13).
  • ℹ️ Confirmed on Linux (PR test matrix lists macOS only).
How this was verified (method)
  • Two worktrees: PR ed5b9efb1 and merge‑base cb4963336; node_modules symlinked from the main checkout.
  • Harnesses run with tsx directly against each worktree's src (the file‑read modules use relative imports, so there is no @qwen-code/qwen-code-core self‑import — the code under test is the actual PR/base source, revert‑proof).
  • Real StandardFileSystemService, EditTool, ReadFileTool, and FileReadCache. The Config is the same accessor‑bag mock the repo's own edit.test.ts uses (which itself drives a real StandardFileSystemService + real FileReadCache).
  • Layer 2 runs with the read‑cache disabled to reach the read directly; Layer 3 runs with the cache enabled and a real read_file first, to prove the prior‑read gate doesn't save it.
Full raw transcript
LAYER 1 — core readTextFile({ path }) on an 11MB log
  BASE  main@cb4963336 : [OK]    readTextFile({ path }) on 11MB log -> content 11534336 chars
  PR    #6404 ed5b9efb1: [THROW] readTextFile({ path }) on 11MB log -> Error: File too large for full read (11534336 bytes). Use offset/limit to read a range.
  (PR range reads still work: {limit:50} -> 51 lines; {maxOutputBytes:25000} -> 25000 chars truncatedByBytes:true)

LAYER 2 — REAL EditTool.execute() on an 11MB file
  BASE : tool SUCCEEDED — first line = "CONFIG version=2 build=beta", size after = 11.00 MB (tail preserved: YES)
  PR   : tool FAILED    — error.type = edit_preparation_failure
                          error.message = File too large for full read (11534396 bytes). Use offset/limit to read a range.

LAYER 3 — REALISTIC cache-ENABLED flow on PR (real read_file -> real edit)
  STEP 1  read_file  -> error=none  returnDisplay="Read lines 1-1032 of at least 2001 from app.log (truncated)"
                        cache entry = state:fresh cacheable:true full:false
  STEP 2  edit       -> FAILED  edit_preparation_failure: File too large for full read (11534396 bytes)...
                        file first line unchanged: "CONFIG version=1 build=alpha"

LAYER 4 — status of two fixed Criticals
  (B) non-UTF-8 (11.03MB, 12KB ASCII prefix + GBK): THREW LargeNonUtf8TextError (fix works)
  (C) bounded read of 60MB file, lines 1-10: originalLineCount=11 exact=false in 3.3 ms (early stop; defense holds)
🇨🇳 中文版(合并参考)

我在本地从源码分别构建了 PR HEAD(ed5b9efb1)与 base(main@cb4963336),并在 Linux(PR 标注为“未测试”的系统;Node v22.22.2)上驱动了真实的读取/编辑链路。功能本身可用,5 个 fixup 提交也修掉了绝大多数预先标注的 Critical。但仍有一个阻断性回归,并且我端到端复现了它 —— 这印证了 fileUtils.ts:331‑332 上已标注的 Critical。

❌ 阻断性回归:edit / write_file / notebook_edit 对任何 ≥ 10 MB 的文本文件硬失败

readFileWithLineAndLimit 为“完整快照”读取路径新增了一个 guard(fileUtils.ts:331):文件 ≥ 10 MB 时 throw new Error("File too large for full read ...")。当 limitmaxOutputBytesundefined 时触发 —— 而这正是所有写入类工具的调用方式:edit.ts:199write-file.ts:179/317notebook-edit.ts:489shell.ts:1588 都以 readTextFile({ path }) 调用,且它们的 catch 只吞掉 ENOENT,因此异常会向上抛给用户。

  • Layer 1(核心调用 base vs PR):11MB 日志上 readTextFile({ path }) —— BASE 返回 [OK] 11534336 字符;PR [THROW] File too large for full read
  • Layer 2(真实 EditTool):编辑同一个 11MB 文件的一行 —— BASE 成功(首行被改、11MB 尾部保留);PR 失败 edit_preparation_failure
  • Layer 3(真实场景,缓存开启,未禁用任何东西):先 read_file(成功,返回截断范围,cacheable:true),再 edit —— 仍然 失败checkPriorRead 依据的是 lastReadCacheable 而非 lastReadWasFull,所以截断读取能通过 prior‑read 校验,但随后 edit 自己的完整读取又抛异常。没有任何恢复路径:≥ 10 MB 的文本文件彻底无法编辑。

范围editwrite_filenotebook_edit 均硬失败(已确认);shellsed -i 部分受影响(交互确认路径会退化成原始 shell 命令,非交互执行路径返回硬错误 READ_CONTENT_FAILURE)。

这是行为回归:本 PR 之前,这些工具会把整文件读入内存(仅受内存限制)并正常工作 —— Layer 2 显示 base 能成功编辑同一个 11MB 文件。(本 PR 更早的修订版会给 edit 一份被截断的 25KB 快照 → 静默写回造成数据丢失;当前 guard 用抛异常来堵住它 —— 即用“硬失败”换掉了“静默数据丢失”。数据丢失被消除是好事,但硬失败仍然阻断了原本可用的工作流。)

建议方向:把这个 throw 限定为“调用方明确要求有界读取”时才触发(即加上 maxOutputBytes !== undefined 条件),让需要整文件的写入类调用方继续工作;或者,如果 ≥ 10 MB 的编辑限制是有意为之,则给出一个符合“编辑”语境的明确拒绝信息(而不是 “use offset/limit”,编辑根本无法照做),并把它作为 breaking change 写进文档 + 补测试。目前 没有任何测试覆盖 edit/write_file 在 ≥ 10 MB 文件上的行为,这也是它能绿着通过 CI 的原因。

✅ 其余预先标注的 Critical 已修复(均已运行时复核)

# 问题 位置 状态
1 edit/write/notebook ≥10MB 硬失败 fileUtils.ts:331‑332 未解决 —— 已复现
2 超过 8KB 检测样本后的非 UTF‑8 损坏 read-text-range.ts:124 ✅ 已修 —— fatal TextDecoder 现在LargeNonUtf8TextError;已复现 GPT‑5 的原始场景(12KB ASCII 前缀 + GBK),抛异常、无 U+FFFD
3 有界读取却全量扫描 read-text-range.ts:171 ✅ 已修 —— 60MB 文件读取 1‑10 行,3.3ms 返回、originalLineCount=11(提前 break,作者的辩护成立)
4 禁用截断却退回 25KB 上限 fileUtils.ts:1371 ✅ 已修 —— Infinity 现已被 getRangeReadByteLimit 正确保留
5 无有限 limitmaxOutputBytes 被忽略 fileUtils.ts:318 ✅ 已修 —— 路由条件已包含 maxOutputBytes !== undefined

合并就绪度

  • ⚠️ PR 目前与 main 冲突(CONFLICTING),需要 rebase。
  • ✅ 本地 PR 新增用例通过(read-text-range.test.ts 13/13)。
  • ℹ️ 本次在 Linux 验证(PR 测试矩阵仅列了 macOS)。

Independent runtime verification, built from source on Linux · base cb4963336 vs PR ed5b9efb1.

Allow default unbounded readTextFile calls to keep reading full large text files so mutation tools can prepare complete snapshots after a prior ranged read.

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

wenshao commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

🔬 Re-verification — the blocking regression is resolved ✅

Re-ran the same harnesses after 817b65b49 ("preserve large text mutation reads") + the merge that resolved the conflicts. The fix removes the File too large for full read guard, so an unbounded readTextFile({ path }) again loads the full file for the mutation tools. The merge left read-text-range.ts / fileSystemService.ts untouched, so the previously-confirmed fixes stay intact. New head 817b65b49 vs base main@80340fb73, Linux, Node v22.22.2.

The regression is fixed — and, critically, no data loss was reintroduced (the real risk when un-doing the throw: edit handing back a truncated snapshot and writing it over the file):

Layer 1readTextFile({ path }) on an 11 MB log:

was (ed5b9efb1) :  [THROW]  File too large for full read
now (817b65b49) :  [OK]     content 11534336 chars   ← full file, same as base

Layer 2 — real EditTool on an 11 MB file, with a tail-marker data-loss tripwire (a unique last line that vanishes if the write-back was truncated):

BASE  main@80340fb73 :  SUCCEEDED — DATA-LOSS: NO — full 11MB content preserved
PR    817b65b49      :  SUCCEEDED — DATA-LOSS: NO — full 11MB content preserved
                        (edit applied ✓, size 11.00MB → 11.00MB, tail marker survived ✓)

Layer 3 — realistic cache-enabled flow (read_file truncated range → edit what was seen): now SUCCEEDS end-to-end.

read_file still returns bounded ranges ({limit:50} → 51 lines; {maxOutputBytes:25000} → 25 KB truncatedByBytes:true), and the other Criticals remain fixed (non-UTF-8 → LargeNonUtf8TextError; 60 MB bounded read in ~5 ms).

Status vs. the prior review

Item Result
Blocking regression — edit/write_file/notebook_edit ≥10 MB fixed by 817b65b49
Data-loss reintroduced by the fix? no — full 11 MB content preserved (tripwire)
read_file large-range feature ✅ intact
Non-UTF-8 / unbounded-scan / disabled-truncation / maxOutputBytes ✅ still fixed
Merge state ✅ now MERGEABLE

Minor, non-blocking: with the guard gone, unbounded mutation reads are memory-bound again — but that's exactly the pre-PR behavior (base loads the whole file too), so it's not a new risk, just no upper bound on edit-ing a pathologically huge file. Optional follow-up if you ever want a hard ceiling with an edit-appropriate refusal.

From the runtime side this now LGTM — every finding from the previous verification is addressed.

Raw transcript
LAYER 1 — readTextFile({ path }) on 11MB log
  BASE  main@80340fb73          : [OK] content 11534336 chars
  PR    817b65b49 (guard gone)  : [OK] content 11534336 chars  originalLineCountExact:true
  (range reads still bounded: {limit:50}->51 lines; {maxOutputBytes:25000}->25000 chars truncatedByBytes:true)

LAYER 2 — REAL EditTool.execute() on 11MB file (tail-marker data-loss tripwire)
  BASE       : SUCCEEDED — first line changed, size 11.00MB→11.00MB, tail present, DATA-LOSS: NO
  817b65b49  : SUCCEEDED — first line changed, size 11.00MB→11.00MB, tail present, DATA-LOSS: NO

LAYER 3 — realistic cache-ENABLED flow (817b65b49)
  STEP 1 read_file -> OK "Read lines 1-1032 of at least 2001 (truncated)"  cache: cacheable:true full:false
  STEP 2 edit      -> SUCCEEDED

LAYER 4 — other fixes intact
  (B) non-UTF-8 -> THREW LargeNonUtf8TextError
  (C) 60MB file, lines 1-10 -> originalLineCount=11 in 5.2 ms (early stop)
🇨🇳 中文版

817b65b49("preserve large text mutation reads") 以及解决冲突的 merge 之后,我用同一套 harness 重新验证了。该修复移除了 File too large for full read 这个 guard,因此无界的 readTextFile({ path }) 会重新读取整文件供写入类工具使用。merge 未改动 read-text-range.ts / fileSystemService.ts,此前确认的修复保持不变。新 HEAD 817b65b49 vs base main@80340fb73,Linux,Node v22.22.2。

阻断性回归已修复 —— 且关键是没有重新引入数据丢失(撤销 throw 时的真正风险:edit 拿到截断快照并写回覆盖整文件):

  • Layer 1 —— 11MB 日志上 readTextFile({ path }):之前(ed5b9efb1)[THROW];现在(817b65b49)[OK] 返回完整 11534336 字符(与 base 一致)。
  • Layer 2 —— 真实 EditTool 编辑 11MB 文件,带尾部标记数据丢失探针(一行唯一的末尾内容,若写回被截断则会消失):BASE 与 PR 均 成功DATA-LOSS: NO —— 完整 11MB 内容保留(编辑生效、大小 11.00MB→11.00MB、尾部标记存活)。
  • Layer 3 —— 真实场景(缓存开启)read_file(截断范围)→ edit:现在端到端成功

read_file 仍返回有界范围({limit:50}→51 行;{maxOutputBytes:25000}→25KB truncatedByBytes:true),其余 Critical 仍为已修复(非 UTF‑8 → LargeNonUtf8TextError;60MB 有界读取 ~5ms)。

结果
阻断性回归(edit/write_file/notebook_edit ≥10MB) ✅ 已由 817b65b49 修复
修复是否重新引入数据丢失? ✅ 否 —— 完整 11MB 内容保留(探针验证)
read_file 大文件范围读取功能 ✅ 完好
非 UTF‑8 / 全量扫描 / 禁用截断 / maxOutputBytes ✅ 仍为已修复
合并状态 ✅ 现为 MERGEABLE

次要、非阻断:guard 移除后,无界的写入类读取又变回受内存限制 —— 但这正是本 PR 之前的行为(base 也是整文件读入),并非新增风险,只是对超大文件的 edit 没有上限。如果以后想要一个带“编辑语境”明确拒绝信息的硬上限,可作为后续可选项。

从运行时角度,现在 LGTM —— 上一轮验证中的所有问题均已解决。

Independent runtime re-verification · base 80340fb73 vs PR 817b65b49 · Linux.

@wenshao

wenshao commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Build Failure Analysis / 构建失败分析

The CI failure is not related to the PR's code changes — it's a transient CI infrastructure issue.

CI 失败与本 PR 的代码改动无关 — 属于 CI 基础设施的临时性问题。

Root Cause / 根因

🔍 详细分析 (点击展开)

Test (ubuntu-latest, Node 22.x)Install linters 步骤失败:

curl: (28) Failed to connect to github.com port 443 after 135189 ms: Couldn't connect to server
tar: Error is not recoverable: exiting now
Failed to install shellcheck. Please install it manually.

下载 shellcheck 时 curl 连接 github.com:443 超时(等待 135 秒后仍无法连接)。这是 GitHub Actions runner 的网络问题,与代码无关。

Post Coverage Comment 失败是因为测试 job 未产出 coverage artifact,属于级联失败。

建议操作

  1. 重新运行失败的 CI job 即可(re-run failed jobs)
  2. 如果问题持续出现,可能是 GitHub Actions runner 网络不稳定,稍后重试

Recommended Action

Re-run the failed jobs — this should pass on retry since it's a network connectivity issue, not a code defect.

@doudouOUC
doudouOUC enabled auto-merge July 7, 2026 11:15

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

Thanks for iterating on this. The core fix makes sense to me: supporting bounded reads for large text files necessarily touches the text reader, FileSystemService, read_file display metadata, and the tests around truncation / non-UTF-8 / mutation safety.

These are non-blocking scope comments. I don't think they should block this PR once the code and CI are otherwise good; the main ask is to keep future core read-path fixes smaller and easier to review.

The current PR also includes a few follow-up-level cleanups, such as stats threading, artifact read cancellation, and broader readManyFiles abort propagation. They are reasonable changes individually, but they make the bugfix harder to review as one unit. If we still want to reduce this PR's risk before merge, the first things I would move out are artifact cancellation and stats threading.

line?: number | null;
maxOutputBytes?: number;
signal?: AbortSignal;
stats?: Stats;

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.

Non-blocking scope note: maxOutputBytes and signal are part of the large-text read behavior, but stats feels more like an internal optimization / TOCTOU cleanup than part of the public FileSystemService read contract.

Could we keep the main PR focused on the large-text range behavior and either avoid threading stats through this shared request type, or split that optimization into a follow-up? The current version is understandable, but it broadens the service API beyond the core bugfix.

.readTextFile({ path: file_path });
.readTextFile({
path: file_path,
maxOutputBytes: MAX_ARTIFACT_BYTES,

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.

Non-blocking scope note: forwarding cancellation here is a good cleanup, but artifact publishing is not directly part of the large text read_file failure fixed by this PR.

This might be easier to review as a small follow-up PR. Keeping this PR limited to text range reads would make the risk surface clearer, especially since the main change already touches the core read pipeline.

const projectRoot = config.getProjectRoot();

for (const rawPattern of inputPatterns) {
signal?.throwIfAborted();

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.

Non-blocking scope note: the abort propagation is directionally right, but it is another cross-cutting behavior change on top of the large-file read fix.

If we want to keep this PR minimal, I would consider moving the readManyFiles cancellation cleanup into a follow-up. The essential path for #6403 is bounded text reads; broader cancellation consistency can land separately.

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

LGTM from a code review perspective. The main large-text range read path looks sound now, and the previous mutation-read/data-loss concerns have been addressed.

I left a few non-blocking scope comments about keeping future core read-path fixes smaller, but I don't think those should block this PR. The remaining failing check appears to be an infrastructure download timeout during linter setup, so it should be rerun before merge.

@doudouOUC
doudouOUC added this pull request to the merge queue Jul 7, 2026
Merged via the queue into main with commit 6fdd0fc Jul 7, 2026
69 of 74 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

read_file should support bounded reads for large text files

6 participants