Skip to content

fix(channels): preserve DingTalk rich-text multi-image messages - #9922

Open
BenGuanRan wants to merge 12 commits into
mainfrom
fix/dingtalk-richtext-multi-image
Open

fix(channels): preserve DingTalk rich-text multi-image messages#9922
BenGuanRan wants to merge 12 commits into
mainfrom
fix/dingtalk-richtext-multi-image

Conversation

@BenGuanRan

Copy link
Copy Markdown
Collaborator

What this PR does

This PR preserves every image from a DingTalk rich-text message as an ordered attachment on the same channel turn. It carries the ordered image collection through both ACP and daemon-backed sessions, persists daemon attachments for Web Shell hydration, and cleans up partial uploads if a later image fails.

It keeps the existing single-image fields as a compatibility fallback for channel adapters and bridge implementations that have not adopted the ordered collection yet. Daemon uploads also normalize parameterized image MIME types and release prompt state before best-effort rollback so an upload failure cannot wedge the session.

Why it's needed

DingTalk sends a group of pictures in one richText callback. The adapter already extracted every picture download code, but only the first code was downloaded and forwarded, so the model and Web Shell silently lost the remaining images. This fixes the loss while preserving single-image behavior and attachment order.

Reviewer Test Plan

How to verify

Configure a DingTalk Stream channel backed by qwen serve, send several images together in one direct message, and ask the model how many images it received. Confirm that each picture is downloaded once, the daemon persists the same number of ordered attachments before accepting the prompt, Web Shell shows every image on the user turn, and the bot replies using all images. Also force a daemon attachment upload failure and confirm the session accepts a later prompt without retaining attachments from the failed turn.

Evidence (Before & After)

Before: one DingTalk callback containing five pictures produced one daemon attachment and the model reported one visible image.

After: one real DingTalk callback containing three pictures produced three HTTP 201 attachment uploads, three persisted attachment references, three Web Shell images, a completed qwen3.8-max turn that identified three images, and a reply visible in DingTalk.

Tested on

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

Environment (optional)

Local development daemon with DingTalk Stream and the loopback Web Shell; Node.js v24.13.0.

Risk & Scope

  • Main risk or tradeoff: daemon turns now perform one attachment upload per image before prompt submission; if any upload fails, the prompt is rejected and earlier uploads are removed rather than submitting a partial image set.
  • Not validated / out of scope: group-chat policy behavior, non-DingTalk channel ingestion, and real-device testing on Windows or Linux.
  • Breaking changes / migration notes: none; existing single-image fields remain supported as a fallback.

Linked Issues

Fixes #9878

中文说明

本 PR 做了什么

本 PR 将钉钉富文本消息中的每张图片按原顺序保留为同一个 Channel turn 的附件,并让有序图片集合同时贯通 ACP 与 daemon session。daemon 附件会持久化供 Web Shell 恢复展示;如果后续某张图片上传失败,之前已上传的附件会被清理。

现有单图字段继续作为兼容回退,尚未采用有序图片集合的 Channel adapter 和 bridge 不受影响。daemon 上传还会规范化带参数的图片 MIME 类型,并在尽力回滚附件前释放 prompt 状态,避免上传失败永久卡住 session。

为什么需要

钉钉会把一次发送的多张图片放在同一个 richText callback 中。适配器虽然已经提取全部图片下载码,但此前只下载并转发第一个,因此模型和 Web Shell 会静默丢失其余图片。本修复在保持单图行为和附件顺序的同时解决该问题。

Reviewer 测试计划

如何验证

配置由 qwen serve 承载的钉钉 Stream Channel,在私聊中一次发送多张图片,并询问模型收到了几张。确认每张图片只下载一次,daemon 在接受 prompt 前持久化相同数量且顺序一致的附件,Web Shell 在用户 turn 中展示全部图片,机器人基于全部图片回复。另模拟 daemon 附件上传失败,确认该 session 随后仍能接受新 prompt,并且失败 turn 不会残留附件。

前后证据

修复前:包含五张图片的一个钉钉 callback 只产生一个 daemon 附件,模型报告只能看到一张图片。

修复后:真实钉钉 callback 中的三张图片产生三次 HTTP 201 附件上传、三个持久化附件引用和三张 Web Shell 图片;qwen3.8-max turn 正常完成并识别出三张图片,钉钉客户端收到回复。

测试平台

系统 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

本地开发 daemon、钉钉 Stream、loopback Web Shell;Node.js v24.13.0。

风险与范围

  • 主要风险或取舍:daemon turn 会在提交 prompt 前为每张图片执行一次附件上传;任一上传失败时会拒绝整个 prompt 并删除之前的附件,而不是提交不完整的图片集合。
  • 未验证或不在范围内:群聊策略行为、非钉钉 Channel 入站,以及 Windows/Linux 真机测试。
  • 破坏性变更或迁移说明:无;现有单图字段继续作为回退支持。

关联 Issue

Fixes #9878

@BenGuanRan

Copy link
Copy Markdown
Collaborator Author

DingTalk rich-text multi-image E2E report

Scope

Verify that every image in one DingTalk richText callback reaches the same Qwen daemon turn, is persisted in the Web Shell transcript, is visible to the configured vision model, and still produces a DingTalk reply.

Environment

  • macOS arm64
  • Node.js v24.13.0
  • Qwen Code development daemon from fix/dingtalk-richtext-multi-image
  • DingTalk Stream direct message
  • Model: qwen3.8-max
  • Web Shell: loopback daemon UI

Baseline reproduction

  1. Send five images together as one DingTalk message.
  2. Observe one DingTalk Stream callback containing all five rich-text picture parts.
  3. Observe only one daemon attachment upload and one persisted attachment reference.
  4. Ask the model how many images it received.

Observed before the fix: the model reported only one image. This evidence is recorded in issue #9878 without callback payloads, user identifiers, credentials, or signed download URLs.

Fixed-path verification

  1. Start qwen serve with the DingTalk channel and open the matching Web Shell session.
  2. Send three PNG images together in one direct message.
  3. Wait for the bot reply and inspect daemon/session evidence.

Observed after the fix:

  • One DingTalk Stream callback was received for the multi-image message.
  • Three attachment uploads completed with HTTP 201 before the prompt was accepted with HTTP 202.
  • All three attachments were readable through the owning daemon session with HTTP 200.
  • The persisted user turn contained three ordered image/png attachment references.
  • Web Shell rendered all three image attachments in the user turn.
  • qwen3.8-max explicitly identified that the user sent three images.
  • The prompt reached completed / end_turn, and the DingTalk client received the reply.

The three live-test images were intentionally identical. Relative order is therefore anchored separately by unit coverage using distinct image bytes and distinct attachment identifiers.

Failure-path regression coverage

  • A failed first upload releases prompt state so a later prompt in the same daemon session can run.
  • A later failed upload rolls back earlier successful uploads.
  • Prompt state is released before a slow rollback settles.
  • Parameterized and mixed-case image MIME types are normalized before daemon upload.

Privacy

The report contains no callback payload, sender identity, conversation/session identifier, credential, API key, signed URL, image bytes, or base64 data.

@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 24, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Qwen Triage finished — CI landed green on 125d45e and the deferred approval was posted. finalize run

Qwen Triage 已完成 —— 125d45e 的 CI 全绿,延迟审批已提交。查看 finalize 运行

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓ — every required section is filled in, including a real before/after and the bilingual body.

Problem: this is an observed bug, not theoretical hardening. #9878 carries a full reproduction (five images in one DingTalk direct message → one POST /session/:id/attachments → one persisted attachmentReferences entry → the model sees one of five images) plus a source-path trace showing content.downloadCodes[0] is the only code forwarded. The linked issue is self-reported by the PR author (hence the review/self-reported label), but the runtime evidence is concrete.

Direction: aligned. Silently dropping user images in an already-supported channel is a data-loss correctness bug, and multi-image ingestion is an area the reference agent has also been actively fixing lately (e.g. "Fixed pasting or dropping multiple images only inserting the last one"). No direction concerns.

Size: not applicable to the core-module gate — no enumerated core paths are touched. The change spans two workspace packages (@qwen-code/channel-base and @qwen-code/channel-dingtalk), which is the direct adapter↔base seam the feature lives at. Breakdown: ~146 production lines vs ~349 test lines vs 383 lines of design/plan docs (house convention for multi-file changes). Well below any escalation threshold, and it's a fix-type PR.

Approach: the scope feels right at the structure level. The ordered images collection with the legacy single-image fields kept as a compatibility fallback is the minimal path — the other eight channel adapters still use the legacy fields, and migrating them all here would balloon the PR. One thing I'll look at in code review: the description promises cleanup of partial uploads when a later daemon upload fails (plus releasing prompt state before rollback), which goes a bit beyond the design doc's "keep current failure semantics" — worth confirming the implementation matches.

Risk: no elevated risk signals — none of the changed files match the revert-history high-risk paths.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓ —— 所有必填部分都已填写,包含真实的前后对比证据和中英双语正文。

问题:这是已观测到的 bug,而非理论性加固。#9878 提供了完整复现(一次钉钉私聊发送五张图片 → 只有一次 POST /session/:id/attachments → 只持久化一条 attachmentReferences → 模型只看到五张中的一张),并附源码路径分析:只有 content.downloadCodes[0] 被转发。关联 issue 由 PR 作者本人提交(因此有 review/self-reported 标签),但运行时证据是具体的。

方向:对齐。在已支持的渠道里静默丢弃用户图片属于数据丢失类的正确性 bug;参考产品近期也在持续修复多图摄入相关问题(如 "Fixed pasting or dropping multiple images only inserting the last one")。方向无顾虑。

规模:不触发核心模块门禁 —— 未触及任何已列名的核心路径。改动跨两个工作区包(@qwen-code/channel-base@qwen-code/channel-dingtalk),这正是该功能所在的 adapter↔base 接缝。构成:生产代码约 146 行、测试约 349 行、设计/计划文档 383 行(多文件改动的仓库惯例)。远低于任何升级阈值,且为 fix 类型。

方案:从结构上看范围合理。有序 images 集合并保留旧单图字段作为兼容回退是最小路径 —— 其余八个渠道适配器仍在使用旧字段,若在本 PR 中一并迁移会显著扩大范围。代码审查时会重点看一处:PR 描述承诺后续上传失败时清理已上传的部分(并在回滚前释放 prompt 状态),比设计文档中"保持现有失败语义"更进一步——需确认实现与描述一致。

风险:无升级风险信号 —— 改动文件均未命中 revert 历史高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qqqys

qqqys commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

I formed my independent expectation before reading the diff: loop every download code in the adapter, carry an ordered image collection through the bridge options with the legacy single-image fields kept as fallback, upload each image to the daemon session before prompting, and never submit a partial set. The PR does exactly this, and does it cleanly — no simpler path was missed.

What I verified beyond the diff itself:

  • Interface widening is safe. The two methods added to DaemonChannelSessionClient (uploadAttachment, removeAttachment) already exist on the SDK's DaemonSessionClient with compatible signatures, so the real session client that daemon-worker passes through satisfies the widened interface without changes.
  • No double-counting. ChannelBase now normalizes the legacy imageBase64 field first, then every data-backed image attachment. Adapters set one or the other (Weixin/Telegram use the legacy field, DingTalk/Feishu use attachments), so no adapter feeds the same image twice. Single-image adapters keep exactly their current behavior.
  • The upload flow matches the description. Uploads happen inside the prompt try; on any failure the flag is set, the error rethrown, and the finally releases all prompt state before best-effort Promise.allSettled removal of already-uploaded attachments — a failed upload cannot wedge the session, and a follow-up prompt is accepted (covered by a dedicated test).
  • Fail-closed on exotic MIME. channelImageName rejects anything outside bmp/gif/jpeg/png/webp and normalizes parameterized types (image/png; charset=binaryimage/png), so unsupported types fail the turn with rollback instead of uploading junk. DingTalk coerces non-image/* media to image/jpeg upstream, so the practical blast radius is nil.
  • Prior art. The Web UI daemon path already uses the same upload-reference-then-rollback pattern for user attachments, and session_attachments is a since: 'v1' capability, so no feature gate is needed on this path.
  • The tests pin the change: removing the adapter loop, the normalization, or the rollback each fails a dedicated test. The quoted-image test that previously documented the single-slot workaround is correctly inverted to assert the new data-backed behavior.

One non-blocking nit: the daemonSession() stub in SessionRouter.test.ts (not in this diff) is an object literal typed as DaemonChannelSessionClient and now lacks the two new required members. It's invisible today because the package tsconfig excludes test files from typecheck and vitest doesn't type-check, but it will surface if test type-checking ever lands — worth adding the two mocks there in a follow-up.

sequenceDiagram
    participant P1 as DingTalk
    participant P2 as DingtalkAdapter
    participant P3 as ChannelBase
    participant P4 as DaemonChannelBridge
    participant P5 as Daemon session
    P1->>P2: richText callback with N picture codes
    P2->>P2: download every code in order
    P2->>P3: envelope with N ordered image attachments
    P3->>P4: ordered images collection plus legacy fallback fields
    P4->>P5: upload each image in order
    P5-->>P4: attachment reference per image
    P4->>P5: prompt with N references before text
    alt a later upload fails
        P4->>P5: remove already-uploaded attachments
        P4-->>P3: prompt rejected, prompt state already released
    end
Loading
Files changed (11 of 11 shown)
File What changed
docs/design/dingtalk-richtext-multi-image.md Design doc - ordered collection, compatibility, failure semantics
docs/plans/dingtalk-richtext-multi-image.md Implementation plan with test plan and steps
packages/channels/base/src/AcpBridge.ts Emits one ACP image block per image before text, legacy fallback
packages/channels/base/src/AcpBridge.test.ts New test - two images ordered before the text block
packages/channels/base/src/ChannelAgentBridge.ts New ChannelPromptImage type and optional images prompt option
packages/channels/base/src/ChannelBase.ts Normalizes legacy field plus all image attachments into one ordered collection
packages/channels/base/src/ChannelBase.test.ts Expectations updated to the ordered collection incl. legacy fallback
packages/channels/base/src/DaemonChannelBridge.ts Uploads each image as a daemon attachment, rolls back partial uploads on failure
packages/channels/base/src/DaemonChannelBridge.test.ts Four new tests - ordering, rollback, state release before rollback, MIME normalization
packages/channels/dingtalk/src/DingtalkAdapter.ts Loops every download code, removes the single-inline-slot workaround
packages/channels/dingtalk/src/DingtalkAdapter.test.ts Multi-download richText test, quoted-image expectation inverted

Testing

Unattended CI run — I do not build or execute PR code; the evidence below is the PR's own CI on the reviewed commit, read through the API.

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

Check Conclusion
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
review-scan ✅ success
route ✅ success
Secret scan (TruffleHog) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

The main unit suite Test (ubuntu-latest, Node 22.x) was still running at review time — no outcome is asserted for it here; the table above is updated in place once CI settles. The skipped verify / tmux-testing checks are comment-triggered lanes, not failures.

Sandboxed verification would settle this: @qwen-code /verify — the end-to-end claim (one rich-text callback with N pictures → N ordered daemon attachment references, Web Shell replay, model sees all N) currently rests on mocked unit tests plus the author's self-reported macOS run in the PR description (author's claim, not independently re-run here). An A/B run against the base build would prove the attachments-per-callback count is load-bearing on this diff.

中文说明

代码审查

我在看 diff 之前先形成了独立预期:适配器遍历每个下载码、桥接层用有序图片集合(保留旧单图字段回退)、提示前逐张上传到 daemon 会话、绝不提交残缺集合。PR 的实现与此完全一致,且没有遗漏更简路径。

diff 之外核实的内容:

  • 接口扩展安全。 DaemonChannelSessionClient 新增的 uploadAttachment/removeAttachment 在 SDK 的 DaemonSessionClient 上已存在且签名兼容,daemon-worker 透传的真实会话客户端无需改动即可满足扩展后的接口。
  • 不会重复计数。 ChannelBase 先归一化旧 imageBase64 字段、再归一化全部数据型图片附件。各适配器二者只用其一(微信/Telegram 用旧字段,钉钉/飞书用附件),同一图片不会被送入两次;单图适配器行为完全不变。
  • 上传流程与描述一致。 上传在 prompt 的 try 内进行;任一失败即置标志并抛出,finally 会先释放全部 prompt 状态,再尽力(Promise.allSettled)删除已上传附件——上传失败不会卡死会话,后续 prompt 可正常进入(有专门测试覆盖)。
  • 对非常规 MIME 失败即关闭。 channelImageName 拒绝 bmp/gif/jpeg/png/webp 之外的类型,并规范化带参数的 MIME(image/png; charset=binaryimage/png),异常类型会带触发回滚的 turn 失败而非上传垃圾数据。钉钉上游已把非 image/* 媒体强制为 image/jpeg,实际影响面为零。
  • 先例。 Web UI 的 daemon 路径已经使用同样的"上传-引用-失败回滚"模式,且 session_attachmentssince: 'v1' 能力,该路径无需能力门控。
  • 测试能钉住改动:去掉适配器循环、归一化或回滚逻辑,各有专门测试会失败。原先记录"单槽位"变通的引用图片测试已正确反转为断言新的数据型行为。

一个非阻塞小问题:SessionRouter.test.ts(不在本 diff 中)的 daemonSession() 桩是标注为 DaemonChannelSessionClient 的对象字面量,现在缺少两个新增必需成员。当前不可见(包级 tsconfig 排除了测试文件,vitest 不做类型检查),但若将来引入测试类型检查会暴露——建议后续补上两个 mock。

测试

无人值守 CI 运行——不构建、不执行 PR 代码;以下为通过 API 读取的该提交自身 CI 证据。主单测 Test (ubuntu-latest, Node 22.x) 审查时仍在运行,此处不断言其结果;CI 结束后上方表格会原地更新。verify/tmux-testing 为评论触发的隔离通道,跳过非失败。

沙箱验证可以落定此事:@qwen-code /verify —— 端到端结论(一次含 N 张图的富文本回调 → N 个有序 daemon 附件引用、Web Shell 回放、模型看到全部 N 张)目前依赖 mock 单测加上作者在 PR 描述中的自述 macOS 验证(作者声明,未在此独立复现)。对 base 构建做 A/B 运行可证明"每次回调的附件数"确由本 diff 承载。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — a clean, well-scoped fix that matches my independent proposal and pins its behavior with real tests; the point withheld is the still-running unit suite and the end-to-end leg that only mocked tests plus the author's self-report cover so far.

Stepping back: this is exactly the kind of PR the gate should wave through. The problem is real and reproduced (five images in, one image out, with runtime evidence in #9878), the fix is the minimal one — an ordered collection threaded through the existing seams with the legacy fields left intact for the eight adapters that haven't migrated — and nothing in the diff is incidental. The failure handling is the part I scrutinized most, and it's right: prompt state is released before best-effort rollback, a partial upload set is never submitted, and each of those claims has a dedicated test that would fail without the implementation. The pre-existing Web UI upload-then-rollback pattern is followed rather than reinvented, which is what I'd want to see in six months.

My two reservations are both non-blocking and recorded in the review comment: the SessionRouter.test.ts stub now drifts from the widened interface (invisible until test type-checking exists), and the real-device round trip is the author's claim — the /verify line above names how to settle it if a maintainer wants that before merge. Neither changes the direction of this verdict.

Approval is deferred only because the PR's own CI had not settled at review time: the unit suite Test (ubuntu-latest, Node 22.x) was still running on the reviewed commit. If that lands green, the approval below should be posted automatically pinned to this commit; if anything lands red or the head moves, it is withheld.

中文说明

这是一次干净、范围得当的修复:问题真实且已复现(#9878:五张图只进一张,有运行时证据),方案是最小路径——有序集合穿过既有接缝、旧字段为未迁移的八个适配器保留——diff 中没有顺手改动。失败处理是重点核查项且正确:尽力回滚前先释放 prompt 状态、绝不提交残缺上传集合,每条结论都有"去掉实现即失败"的专门测试。既有的 Web UI"上传-失败回滚"模式被复用而非重造。

两点保留意见均不阻塞(已记录在审查评论中):SessionRouter.test.ts 的桩与扩展后的接口出现漂移(在引入测试类型检查前不可见);真机端到端目前是作者自述——上面的 /verify 一行写明了维护者如需落定可走的通道。两者都不改变本结论方向。

审批之所以暂缓,仅因审查时 PR 自身 CI 未出结果:主单测仍在该提交上运行。若其转绿,将自动按此提交钉住发布审批;若出现红项或提交移动,则保持不发。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.33% 85.33% 90.67% 84.34%
Core 88.52% 88.52% 90.13% 86.98%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.33 |    84.34 |   90.67 |   85.33 |                   
 src               |   85.82 |    81.89 |   88.03 |   85.82 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.34 |    78.04 |   80.76 |   73.34 | ...1336-1340,1467 
  ...ractiveCli.ts |   88.26 |    82.64 |   88.88 |   88.26 | ...3135,3141,3207 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |    73.5 |    76.25 |   93.17 |    73.5 |                   
  acpAgent.ts      |   72.37 |    75.94 |   92.27 |   72.37 | ...74,12285,12331 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |     91.3 |     100 |     100 | 73,124            
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.05 |    86.57 |   95.75 |   91.05 |                   
  Session.ts       |    90.4 |    85.32 |   95.13 |    90.4 | ...50,12677-12681 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.16 |    86.36 |     100 |   94.16 | ...43,347,427,431 
  ...y-replayer.ts |   83.41 |    93.22 |   94.11 |   83.41 | ...29-147,265-267 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.59 |   91.53 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |     77.6 |   94.28 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |    85.04 |   90.69 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   95.37 |    86.44 |     100 |   95.37 | 203-204,228-233   
 src/commands      |   90.66 |    78.53 |   65.62 |   90.66 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.07 |    88.56 |   90.64 |   89.07 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.83 |    96.35 |     100 |   95.83 | ...03-208,266-269 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.93 |    85.55 |   94.33 |   93.93 | ...1268,1275-1276 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.25 |    84.61 |   83.33 |   90.25 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.58 |       90 |   92.84 |   91.58 |                   
  agent-prompt.ts  |   94.89 |    92.98 |   97.95 |   94.89 | ...3281,3616-3696 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.18 |    89.69 |    90.9 |   92.18 | ...1061,1063-1064 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.11 |    93.74 |   98.52 |   97.11 | ...5378-5422,5697 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |    94.1 |    92.85 |   92.85 |    94.1 | ...80-782,787-789 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.25 |    92.05 |     100 |   97.25 | ...1548,1705-1710 
  findings.ts      |   96.02 |    92.15 |     100 |   96.02 | ...1249,1258-1259 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.66 |     100 |   99.48 | 567,838,894       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  pr-context.ts    |   96.03 |    87.58 |     100 |   96.03 | ...2233,2333-2349 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1214,1249-1280 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...22,638-692,706 
  save-artifact.ts |    93.7 |    91.66 |   94.11 |    93.7 | ...71-574,667-670 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   83.78 |    78.57 |   88.88 |   83.78 | ...69-783,785-807 
  submit.ts        |   94.11 |    89.38 |   94.44 |   94.11 | ...1673,1701-1738 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   85.62 |    81.26 |      96 |   85.62 | ...3120,3128-3148 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.36 |    94.79 |   98.75 |   97.36 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 785-786           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |   93.48 |    93.45 |     100 |   93.48 | ...79-385,583-584 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.46 |    97.17 |    90.9 |   99.46 | 590,808           
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.74 |    93.12 |     100 |   98.74 | ...48,271,297-298 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.77 |    93.93 |     100 |   96.77 | 234-235,272-273   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.4 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,819,1200,1217 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.85 |    86.66 |     100 |   92.85 | 204-205,207-211   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |     98.1 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    97.05 |     100 |     100 | 154,199           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.04 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.28 |    90.07 |   95.01 |   94.28 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.22 |    89.22 |   83.78 |   89.22 | ...2516,2518-2526 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |    96.5 |    93.58 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.16 |    92.71 |      90 |   91.16 | ...1027,1029-1030 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.82 |     89.2 |   85.18 |   80.82 | ...85-603,610-618 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.09 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.18 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.69 |    96.28 |     100 |   99.69 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.24 |    84.44 |    90.8 |   87.24 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 702               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.04 |    80.69 |   76.06 |   84.04 | ...7995,8013-8017 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    88.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   91.16 |    90.45 |   71.42 |   91.16 | ...3012,3042-3043 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |    98.6 |     79.8 |     100 |    98.6 | 108,136,179,182   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.55 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.34 |    80.22 |    94.5 |   80.34 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.51 |    77.21 |   93.33 |   75.51 | ...5509,5566-5572 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   90.17 |    85.27 |      95 |   90.17 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.09 |    78.66 |     100 |   89.09 | ...91-292,339-340 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   77.23 |     70.5 |   90.46 |   77.23 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   87.45 |    65.93 |   95.65 |   87.45 | ...1186-1187,1215 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.87 |    81.03 |   95.27 |   85.87 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.94 |    85.26 |   93.75 |   87.94 | ...1539,1584-1585 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.25 |    82.36 |   93.45 |   86.25 | ...6730,6732-6733 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.75 |    89.98 |   97.22 |   92.75 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   91.39 |    87.04 |   97.56 |   91.39 | ...,975,1003-1004 
  ...ion-export.ts |     100 |       95 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.67 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 106               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.37 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |    68.96 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   70.84 |    77.49 |   72.04 |   70.84 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.08 |       72 |   69.44 |   76.08 | ...4298,4414-4420 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   71.53 |    75.47 |    62.5 |   71.53 | ...11,338,405-410 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.04 |     84.2 |   91.07 |   84.04 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   74.79 |    74.39 |   84.61 |   74.79 | ...89-622,633-634 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.01 |    85.76 |     100 |   86.01 | ...1093,1127-1132 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |    73.1 |    80.02 |   77.58 |    73.1 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.51 |    87.35 |   85.71 |   90.51 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.85 |    88.38 |   93.75 |   93.85 | ...1051,1096-1098 
 ...ponents/shared |   86.52 |    82.35 |   86.72 |   86.52 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.62 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.45 |    73.87 |   95.45 |   88.45 |                   
  ...ui-adapter.ts |   88.45 |    73.87 |   95.45 |   88.45 | ...81,799-800,886 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   85.97 |     83.9 |   87.81 |   85.97 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |    87.4 |    84.04 |   78.26 |    87.4 | ...5817-5819,5821 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...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 |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.73 |    85.83 |   96.06 |   87.73 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.39 |    89.62 |   96.39 |   92.39 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.14 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   87.06 |    81.91 |     100 |   87.06 | ...70-371,378-379 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.38 |    71.83 |   88.88 |   70.38 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.52 |    86.98 |   90.13 |   88.52 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.24 |    84.51 |   94.55 |   90.24 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.64 |       78 |    85.1 |   85.64 | ...1793-1797,1800 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   93.18 |    83.47 |   94.44 |   93.18 | ...90,698,703-710 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.27 |    88.23 |   98.33 |   95.27 | ...1478,1492-1494 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.96 |    68.22 |   78.94 |   76.96 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.91 |     65.2 |   78.57 |   75.91 | ...1888,1894-1895 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.07 |    85.19 |   76.12 |   78.07 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   90.87 |    85.24 |   93.18 |   90.87 | ...83,685,687-688 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.21 |    87.65 |   91.18 |   93.21 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   90.27 |    80.44 |   80.95 |   90.27 | ...2525,2571-2573 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.63 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.87 |    90.47 |   91.48 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.47 |    83.47 |   94.44 |   95.47 | ...44,312,332-335 
  ...ow-sandbox.ts |   96.91 |    91.02 |     100 |   96.91 | ...1704,1710-1711 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   84.25 |    85.18 |   91.03 |   84.25 |                   
  TeamManager.ts   |   77.21 |    83.04 |   83.87 |   77.21 | ...1832,1855-1856 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |   91.71 |    94.44 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   85.27 |    87.59 |   77.25 |   85.27 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.13 |    87.12 |   75.22 |   84.13 | ...9017,9024-9025 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.71 |    88.46 |   93.76 |   92.71 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.7 |    88.26 |   91.11 |    92.7 | ...4351,4449-4450 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...08-509,554-560 
  ...lScheduler.ts |   89.82 |    84.83 |   94.73 |   89.82 | ...6483,6511-6527 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |   95.09 |    90.39 |   96.66 |   95.09 | ...5550,5598-5599 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.89 |    91.66 |      85 |   93.89 | ...1272,1475-1476 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 698-699,768       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.38 |    88.09 |   97.36 |   96.38 |                   
  ...tGenerator.ts |   97.38 |    86.64 |   97.29 |   97.38 | ...1403,1432,1443 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  ...tGenerator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
 ...ntentGenerator |   96.65 |     91.3 |   95.23 |   96.65 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.59 |    90.75 |      95 |   96.59 | ...1299-1300,1328 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.19 |    90.86 |   96.58 |   92.19 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.26 |    89.67 |   96.87 |   91.26 | ...1948,2117-2132 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |   95.36 |    91.52 |     100 |   95.36 | ...1433-1434,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |    97.2 |    91.81 |   98.63 |    97.2 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.23 |    89.79 |     100 |   95.23 | ...49-150,163-164 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   88.71 |    86.07 |   93.41 |   88.71 |                   
  ...ive-safety.ts |   97.77 |    93.75 |     100 |   97.77 | 100-101           
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.27 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.52 |    83.52 |      83 |   84.52 | ...3139,3177-3178 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |    92.7 |     87.7 |     100 |    92.7 | ...1340-1341,1351 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.72 |    81.87 |   86.84 |   84.72 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.36 |     70.4 |   58.33 |   76.36 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   92.88 |    89.34 |   94.65 |   92.88 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |    91.17 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  ...ion-prompt.ts |   89.13 |    83.33 |     100 |   89.13 | 52-56             
  goal-evidence.ts |   88.54 |    87.98 |   97.67 |   88.54 | ...1200,1223-1226 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.71 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 215-216           
  goal-reducer.ts  |   95.25 |    92.82 |   97.29 |   95.25 | ...73,552,570-571 
  goal-runtime.ts  |   96.38 |    89.73 |   95.83 |   96.38 | ...1349-1350,1480 
  goal-tools.ts    |   98.38 |    94.17 |   95.83 |   98.38 | ...05-206,307-308 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.35 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   88.97 |    85.07 |   91.31 |   88.97 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.16 |    78.76 |   94.44 |   90.16 | ...06,629,642-648 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |   78.51 |    83.16 |   77.77 |   78.51 | ...1487,1500-1502 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.19 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   76.89 |    74.07 |   72.22 |   76.89 | ...47-451,454,460 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    80.95 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.82 |    89.74 |   91.35 |   92.82 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    68.96 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.18 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |    92.74 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.78 |    78.34 |   81.25 |   83.78 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |    90.6 |    86.32 |   96.78 |    90.6 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.72 |    96.53 |     100 |   97.72 | ...1081,1224-1232 
  ...ingService.ts |   92.43 |    87.79 |   94.73 |   92.43 | ...2843,2858-2859 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.52 |    90.99 |     100 |   95.52 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.66 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.23 |     100 |   98.26 | ...65-866,889-890 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.67 |    80.64 |     100 |   91.67 | ...1062-1063,1091 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |     92.3 |   97.22 |   94.49 | ...98-600,656-664 
  ...pr-service.ts |   96.22 |    89.13 |     100 |   96.22 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.61 |    87.01 |    93.4 |   89.61 | ...3013,3027-3047 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.76 |    84.07 |     100 |   90.76 | ...10-513,565-566 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.77 |    86.05 |   94.73 |   89.77 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   86.09 |    85.64 |   86.11 |   86.09 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   88.56 |    89.42 |    98.3 |   88.56 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.51 |    86.52 |   97.43 |   85.51 | ...1583,1660-1661 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.55 |    84.83 |   85.71 |   82.55 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.44 |      75 |   93.95 | ...41,483-484,500 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    95.68 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.25 |    85.68 |   90.06 |   87.25 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   90.64 |     93.1 |      75 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.06 |    80.15 |   85.71 |   82.06 | ...3234,3236-3237 
  mcp-client.ts    |   86.08 |     87.5 |   93.93 |   86.08 | ...2483,2487-2490 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   97.95 |    92.37 |     100 |   97.95 | ...1161,1216-1217 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |   95.79 |    81.35 |     100 |   95.79 | ...10,563,573-577 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |      80 |    89.74 |   66.66 |      80 | ...59-265,333-340 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |    86.36 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.35 |    81.52 |   85.71 |   80.35 | ...1017,1025-1026 
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...64-565,581-587 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.06 |    85.71 |   89.47 |   87.06 | ...29-832,869-904 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.49 |    88.65 |   89.56 |   87.49 |                   
  agent.ts         |   86.18 |    87.83 |   87.36 |   86.18 | ...4385,4419-4429 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |     82.3 |   78.66 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    86.11 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   88.32 |    86.77 |   81.48 |   88.32 |                   
  workflow.ts      |   88.32 |    86.77 |   81.48 |   88.32 | ...35,780,782-783 
 src/utils         |   92.75 |    89.76 |    96.8 |   92.75 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |     100 |    97.14 |      95 |     100 | 79,86             
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.08 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.47 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |    57.14 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.34 |    96.55 |     100 |   96.34 | ...35-340,342-347 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

中文说明

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

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

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

Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/AcpBridge.ts Outdated
return getString(content['text']);
}

function channelImageName(mimeType: string, index = 0): string {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This upload cluster re-implements helpers the webui already has for exactly this daemon flow, and the copies have drifted: imageAttachmentName / imageAttachmentMimeType (packages/webui/src/daemon/session/actions.ts:94-103), daemonPromptImageToBlob (packages/webui/src/daemon/session/promptContent.ts:27), and removeUploadedAttachments (actions.ts:413-422 — a shape-for-shape match of the new Promise.allSettled(...removeAttachment...) finally block below).

The drift is concrete: webui maps jpgjpeg, strips +suffix, falls back to img and never throws; this helper throws for any extension outside five values (see the Critical on line 139). A future naming/MIME fix — adding avif, say — made in one copy will not propagate to the other, and the two daemon-attachment surfaces will keep diverging. channels/base has no dependency on webui today, so resolving this needs a shared-home decision: hoist the helpers (name derivation, MIME normalization, base64→Blob, rollback) into a module both packages may consume, or at minimum mirror their semantics deliberately and document why the channel allow-list is stricter than the daemon's.

中文说明

这个上传集群重新实现了 webui 里已有的、针对同一 daemon 流程的辅助函数,而且两份已经分叉:imageAttachmentName / imageAttachmentMimeTypepackages/webui/src/daemon/session/actions.ts:94-103)、daemonPromptImageToBlobpackages/webui/src/daemon/session/promptContent.ts:27)、removeUploadedAttachmentsactions.ts:413-422——与下方新增的 Promise.allSettled(...removeAttachment...) finally 块在形状上完全一致)。

分叉是具体的:webui 会把 jpgjpeg 映射、剥掉 +suffix、回退到 img 且从不抛异常;而这里的辅助函数对五个值之外的任何扩展名都抛异常(见 139 行的 Critical)。未来任何命名/MIME 修复——比如加入 avif——只改一份不会传播到另一份,两个 daemon 附件入口会持续分叉。目前 channels/base 并不依赖 webui,因此需要一个"共同归属"的决定:把这些辅助函数(命名推导、MIME 归一化、base64→Blob、回滚)提升到两个包都能消费的模块里;至少也应有意识地镜像它们的语义,并说明为什么 channel 侧的白名单比 daemon 更严格。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Deferred to the follow-up queue: the drift is real and verified, but hoisting the naming/MIME/Blob/rollback helpers into a module shared by channels/base and webui needs a shared-home design decision outside this PR's footprint. This round shrank the drift deliberately — the Critical fix aligned channel-side semantics with the daemon store (image/jpgimage/jpeg alias, degrade-by-skip instead of throw).

中文说明

延迟到后续跟进队列:分叉属实且已验证,但把命名/MIME/Blob/回滚辅助函数提升到 channels/basewebui 共享的模块,需要一个超出本 PR 范围的"共享归属"设计决定。本轮已有意缩小分叉——Critical 修复把 channel 侧语义与 daemon 存储对齐(image/jpgimage/jpeg 别名、以跳过代替抛异常的降级)。

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.

Deferred to the follow-up queue. The duplication is real and verified: the channel upload cluster mirrors webui's daemon-attachment helpers (imageAttachmentName/imageAttachmentMimeType in packages/webui/src/daemon/session/actions.ts, daemonPromptImageToBlob, removeUploadedAttachments), and the deeper fix is hoisting them into a module both packages consume. That crosses package boundaries (channels/base has no webui/acp-bridge dependency) and needs a shared-home decision outside this PR's DingTalk multi-image footprint, so it is recorded in the deferred-findings queue rather than implemented here.

The finding's minimal in-scope branch is already in place at HEAD: the daemon-store mirrors are deliberate and documented — CHANNEL_IMAGE_EXTENSIONS and CHANNEL_IMAGE_MAX_UPLOAD_BYTES carry pointer comments naming SUPPORTED_IMAGE_MIME_TYPES / SESSION_ATTACHMENT_MAX_ITEM_BYTES in packages/acp-bridge/src/sessionAttachments.ts as the source of truth and explaining the pre-check (the store rejects inadmissible uploads; checking first lets one bad image degrade by omission instead of failing the turn). The sibling re-report thread focused on the pointer comment (R1-5) is resolved by that comment.

延后到后续跟进队列处理。重复实现确实存在且已核实:channel 上传集群镜像了 webui 的 daemon 附件辅助函数(packages/webui/src/daemon/session/actions.ts 中的 imageAttachmentName/imageAttachmentMimeTypedaemonPromptImageToBlobremoveUploadedAttachments),更彻底的修复是把这些辅助函数提升到两个包都能消费的共享模块。但这跨越了包边界(channels/base 不依赖 webui/acp-bridge),需要一个超出本 PR(钉钉多图)范围的共享归属决策,因此记入延后队列而不是在此实现。

该发现的最小范围内分支已在 HEAD 落地:对 daemon 存储常量的镜像是有意为之且有文档说明——CHANNEL_IMAGE_EXTENSIONSCHANNEL_IMAGE_MAX_UPLOAD_BYTES 都带指针注释,指明 packages/acp-bridge/src/sessionAttachments.ts 中的 SUPPORTED_IMAGE_MIME_TYPES / SESSION_ATTACHMENT_MAX_ITEM_BYTES 是权威来源,并解释了预检原因(存储会拒绝不可接收的上传;先检查才能让单张坏图以省略降级而非让整个 turn 失败)。聚焦于指针注释的兄弟线程(R1-5 重报)已因该注释而关闭。

Comment thread packages/channels/base/src/DaemonChannelBridge.test.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/ChannelBase.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts
Comment thread packages/channels/base/src/ChannelBase.test.ts
@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #9922

Commit: 7b92aa427bfix(channels): deliver channel images on older daemons and unknown MIME types (9 files, +373/−48; mostly witness tests). No conflicts (--conflict false).

Feedback points and decisions

Critical findings (both reproduced before fixing, both resolved)

  • [rc:3843982545] MIME allow-list throws away the whole turn — Reproduced on the pre-round code: bridge.prompt with an image/jpg (or image/tiff) image rejects with Unsupported channel image MIME type, so the text and all sibling images are lost. Fixed at the root: a new shared resolvePromptImages normalizes the non-standard image/jpg alias to image/jpeg (matching the daemon attachment store's own mapping), and channelImageName now returns undefined for unrecognized subtypes; the upload loop then warns on stderr (package sanitizeLogText convention) and skips that one image instead of rejecting the prompt — degrade-by-omission like the core read path. Witnesses: normalizes the image/jpg alias before uploading and skips channel images with unrecognized MIME subtypes instead of failing the turn (both fail pre-fix, pass post-fix). This also absorbs [rc:3843982604]: the corrected degrade behavior is now pinned, including the warning and the no-upload-for-the-skipped-image assertion.
  • [rc:3843982553] Unconditional uploads skip the session_attachments capability pre-flight — Reproduced on the pre-round code: the bridge uploads unconditionally, so a daemon without the attachment routes 404s and the whole turn (text included) is never submitted. Fixed the way the sibling consumers do it: runChannelDaemonWorker already fetches the capabilities envelope and now passes sessionAttachments: capabilities.features.includes('session_attachments') into DaemonChannelBridge; when absent, the bridge emits the pre-PR inline image blocks and never calls the upload routes. Default is off (inline), matching the deny-by-default posture of the other gates. Witnesses: keeps prompt images inline when the daemon lacks session attachments plus two daemon-worker wiring tests (all fail pre-fix, pass post-fix).

Suggestions resolved this round

  • [rc:3843982569] Duplicated legacy-fallback normalization blocks — Resolved: extracted resolvePromptImages next to ChannelAgentBridgePromptOptions in ChannelAgentBridge.ts; both bridges now call it, the two pasted ternaries are gone (net subtractive), and MIME parameter/case cleanup plus the jpg alias normalization live in exactly one place. The image/png; charset=binary divergence the finding described is now impossible by construction.
  • [rc:3843982579] SessionRouter.test.ts fake missing the new required methods — Resolved: daemonSession() now declares uploadAttachment/removeAttachment like the createFakeSession update this PR already made.
  • [rc:3843982591] Legacy-fallback ternary had zero coverage — Resolved: one legacy-only test per bridge (uploads a legacy-only prompt image pair on the daemon bridge, sends a legacy-only image pair as one inline image block on AcpBridge). Mutation-probed: deleting the legacy branch of the resolver now fails both.
  • [rc:3843982597] Uploaded bytes never pinned — Resolved: the replay test now decodes both captured Blobs and asserts the exact bytes ([1,2,3] / [4,5,6] from valid base64 payloads), which catches the utf8-decode, raw-string, and image-swap mutations the finding demonstrated.
  • [rc:3843982614] Legacy-first ordering unpinned — Resolved: new ChannelBase test orders the legacy image before attachment images supplies both sources and pins the order.
  • [rc:3843982644] Compat-fill assertion dropped by the rename — Resolved: forwards every image attachment in order re-asserts options.imageBase64 === 'base64data' / options.imageMimeType === 'image/png', so deleting the if (!imageBase64) fill now fails the suite.

Suggestions deferred to the next round (round budget ~8 findings, Criticals first)

  • [rc:3843982561] Rollback does not cover post-upload prompt failures — real (verified by code reading: rollbackUploadedAttachments is only set in the upload-loop catch), but the fix needs careful abort-vs-definite-admission-rejection handling around session.prompt; deferred as its own focused change. Reply posted on the thread.
  • [rc:3843982574] Upload cluster drifts from the webui helpers — the drift is verified, but hoisting the naming/MIME/Blob/rollback helpers into a module shared by channels/base and webui needs a shared-home design decision outside this PR's footprint, so it is deferred to the follow-up queue (recorded in deferred-findings.json). Note: this round's Critical fix deliberately aligned channel-side semantics with the daemon store (jpg→jpeg alias, never-throw degradation). Reply posted on the thread.
  • [rc:3843982586] README still documents only the legacy fields — valid docs gap, deferred for budget. Reply posted on the thread.
  • [rc:3843982623] Rollback allSettled results discarded without logging — valid, small, deferred with the rollback work. Reply posted on the thread.

Other items

  • [rv:5008430553] CHANGES_REQUESTED review — its substance is the two Critical findings above, both resolved in code with failing-then-passing witnesses. Its disclosed gap (integration suite not run) is noted: the behavior changed here is fully exercised by the unit suites of the two owning packages; the CLI/interactive integration harnesses do not drive channel image prompts.
  • [ic:5394353035] Maintainer E2E report — informational confirmation that three ordered attachments reach one daemon turn, persist, and are visible to the model. No action required; the new byte-pinning and ordering unit tests anchor the same properties offline.

Mutation probes (each new guard has its own witness)

Probe Mutation Witness result
capability gate if (true) — always upload inline-fallback test FAILS; restored → green
jpg alias alias normalization removed alias test FAILS; restored → green
degrade skip throw restored for unknown subtypes skip test FAILS; restored → green
legacy fallback legacy-pair branch deleted both legacy-only tests FAIL; restored → green
MIME cleanup parameter/case cleanup removed existing normalization test FAILS; restored → green
worker wiring pre-fix state (option absent) both wiring tests FAIL (pre-fix run)

Verification

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0, no errors/warnings)
  • npx vitest run in packages/channels/base (touched, full package) — 19 files, 1055 tests passed
  • npx vitest run in packages/channels/dingtalk — 10 files, 369 tests passed
  • npx vitest run in packages/channels/{feishu,github,gitlab,qqbot,telegram,wecom,weixin} (consumers of the changed shared code) — 266 + 207 + 59 + 291 + 17 + 135 + 85 tests passed
  • npx vitest run src/commands/channel/daemon-worker.test.ts in packages/cli (touched) — 85 tests passed
  • Pre-fix reproduction of both Criticals recorded (3 bridge tests + 2 wiring tests failing on the pre-round code)
  • Prettier check clean on all nine changed files; settings sources untouched, no schema regeneration needed; integration tests not applicable (behavior unit-covered, not exercised by the bundled-CLI harness)
中文说明

Autofix 审查轮次 — PR #9922

提交:7b92aa427bfix(channels): deliver channel images on older daemons and unknown MIME types(9 个文件,+373/−48;主要为见证测试)。无冲突(--conflict false)。

反馈点与处理决定

Critical 发现(均先在修复前复现,均已解决)

  • [rc:3843982545] MIME 白名单 throw 会丢掉整个 turn — 已在本轮前的代码上复现:bridge.prompt 携带 image/jpg(或 image/tiff)图片时以 Unsupported channel image MIME type 拒绝,文字和其余图片全部丢失。已从根因修复:新的共享函数 resolvePromptImages 把非标准的 image/jpg 别名规范化为 image/jpeg(与 daemon 附件存储自身的映射一致),channelImageName 对无法识别的子类型返回 undefined;上传循环随后按包内 sanitizeLogText 约定在 stderr 打警告并只跳过这一张图,而不是拒绝整个 prompt —— 与 core 读取路径一致地"省略降级"。见证测试:normalizes the image/jpg alias before uploadingskips channel images with unrecognized MIME subtypes instead of failing the turn(修复前失败、修复后通过)。该项同时吸收了 [rc:3843982604]:修正后的降级行为现已被测试约束,包括警告输出与"被跳过的图片不触发上传"的断言。
  • [rc:3843982553] 无条件上传跳过了 session_attachments 能力预检 — 已在本轮前的代码上复现:bridge 无条件上传,遇到没有附件路由的 daemon 返回 404,整个 turn(含文字)从未提交。按同类消费方的方式修复:runChannelDaemonWorker 本就获取 capabilities envelope,现在把 sessionAttachments: capabilities.features.includes('session_attachments') 传入 DaemonChannelBridge;缺失该能力时改发 PR 之前的内联图片块,完全不调用上传路由。默认值为关(内联),与其他门控一致的"默认拒绝"姿态。见证测试:keeps prompt images inline when the daemon lacks session attachments 及两个 daemon-worker 接线测试(均修复前失败、修复后通过)。

本轮已解决的 Suggestion

  • [rc:3843982569] 重复的旧字段回退归一化代码块 — 已解决:在 ChannelAgentBridge.tsChannelAgentBridgePromptOptions 旁提取 resolvePromptImages;两个 bridge 都改为调用它,两份粘贴的三元表达式被删除(净删减),MIME 参数/大小写清理与 jpg 别名规范化集中在一处。发现中描述的 image/png; charset=binary 分叉从结构上不再可能发生。
  • [rc:3843982579] SessionRouter.test.ts fake 缺少新增的必需方法 — 已解决:daemonSession() 现在声明 uploadAttachment/removeAttachment,与本 PR 已对 createFakeSession 做的更新保持一致。
  • [rc:3843982591] 旧字段回退三元表达式零覆盖 — 已解决:每个 bridge 各加一个仅传旧字段的测试(daemon 侧 uploads a legacy-only prompt image pair,AcpBridge 侧 sends a legacy-only image pair as one inline image block)。已做变异验证:删除解析函数中的旧字段分支会使两个测试同时失败。
  • [rc:3843982597] 上传字节从未被约束 — 已解决:回放展示测试现在解码两个捕获到的 Blob 并断言精确字节(合法 base64 载荷解出 [1,2,3] / [4,5,6]),可以捕获该发现所演示的 utf8 解码、原始字符串、两图数据互换三类变异。
  • [rc:3843982614] 旧字段优先的顺序无约束 — 已解决:新增 ChannelBase 测试 orders the legacy image before attachment images,同时提供两种来源并约束顺序。
  • [rc:3843982644] 测试重命名丢掉了兼容填充断言 — 已解决:forwards every image attachment in order 重新断言 options.imageBase64 === 'base64data' / options.imageMimeType === 'image/png',删除 if (!imageBase64) 填充现在会使测试失败。

延迟到下一轮的 Suggestion(本轮预算约 8 项,Critical 优先)

  • [rc:3843982561] 回滚未覆盖"上传成功后 prompt 失败" — 真实存在(已通过代码阅读确认:rollbackUploadedAttachments 只在上传循环的 catch 中置位),但修复需要对 session.prompt 的中止与"明确接收拒绝"语义做细致处理;延迟为一次专门的修改。已在对应线程回复。
  • [rc:3843982574] 上传集群与 webui 辅助函数分叉 — 分叉已验证属实,但把命名/MIME/Blob/回滚辅助函数提升到 channels/basewebui 共享的模块,需要一个超出本 PR 范围的"共享归属"设计决定,因此延迟到后续跟进队列(记录于 deferred-findings.json)。注意:本轮 Critical 修复已有意把 channel 侧语义与 daemon 存储对齐(jpg→jpeg 别名、不抛异常的降级)。已在对应线程回复。
  • [rc:3843982586] README 仍只写了旧字段 — 有效的文档缺口,因预算延迟。已在对应线程回复。
  • [rc:3843982623] 回滚的 allSettled 结果被丢弃且无日志 — 有效、改动小,与回滚相关工作一并延迟。已在对应线程回复。

其他条目

  • [rv:5008430553] CHANGES_REQUESTED 审查 — 其实质内容即上述两个 Critical,均已在代码中解决并有"先失败后通过"的见证测试。其披露的缺口(未跑集成测试)已记录:本次改动的行为由两个所属包的单元测试套件完整演练;CLI/交互式集成测试框架并不驱动 channel 图片 prompt。
  • [ic:5394353035] 维护者 E2E 报告 — 信息性内容,确认三张有序附件进入同一个 daemon turn、被持久化且模型可见。无需处理;新增的字节约束与顺序单测已离线锚定同样的性质。

变异探针(每个新守卫都有自己的见证)

探针 变异 见证结果
能力门控 if (true) — 始终上传 内联回退测试失败;还原后绿
jpg 别名 移除别名规范化 别名测试失败;还原后绿
降级跳过 对未知子类型恢复 throw 跳过测试失败;还原后绿
旧字段回退 删除旧字段对分支 两个仅旧字段测试均失败;还原后绿
MIME 清理 移除参数/大小写清理 现有归一化测试失败;还原后绿
worker 接线 修复前状态(缺选项) 两个接线测试失败(修复前运行)

验证

  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0,无 error/warning)
  • packages/channels/basenpx vitest run(被改动,整包)— 19 个文件、1055 个测试通过
  • packages/channels/dingtalknpx vitest run — 10 个文件、369 个测试通过
  • packages/channels/{feishu,github,gitlab,qqbot,telegram,wecom,weixin}npx vitest run(改动共享代码的消费方)— 266 + 207 + 59 + 291 + 17 + 135 + 85 个测试通过
  • packages/clinpx vitest run src/commands/channel/daemon-worker.test.ts(被改动)— 85 个测试通过
  • 记录了两个 Critical 的修复前复现(3 个 bridge 测试 + 2 个接线测试在本轮前代码上失败)
  • 全部九个改动文件 Prettier 检查通过;未触碰 settings 源,无需重新生成 schema;集成测试不适用(行为已有单测覆盖,捆绑 CLI 测试框架不演练该路径)

🧭 Gate advisory — this round modified areas outside the PR footprint (machine-measured, not agent-authored):

  • packages/cli
    Review the expansion deliberately; the footprint gate is in advisory mode. · 本轮改动了 PR 足迹之外的区域(门自动测量,非 agent 文本),当前足迹门为 advisory 模式,请有意识地审阅该扩张。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

中文说明

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

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

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

Comment thread packages/channels/base/src/ChannelAgentBridge.ts Outdated
Comment thread packages/channels/base/src/DaemonChannelBridge.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/ChannelAgentBridge.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.test.ts Outdated
Comment thread packages/channels/base/src/DaemonChannelBridge.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
…jected turns

- Drop image entries missing data/mimeType in resolvePromptImages so one
  malformed attachment degrades to a prompt without the image instead of
  throwing a TypeError that kills the whole turn (restores the pre-diff
  legacy-guard behavior for out-of-contract extension adapters).
- Require the image/ MIME prefix in channelImageName so non-image types
  whose tail spells a known extension (audio/png) are skipped with a
  warning instead of tripping the daemon store's name/content-type check
  and failing the turn.
- Roll uploaded images back when the daemon definitively rejects prompt
  admission (DaemonHttpError on the admission request, local prompt-queue
  limit), matching the webui client; admitted-turn errors and transport
  failures keep the uploads because the daemon may already reference them.
- Upload prompt images concurrently like the webui path, preserving input
  order and the existing rollback contract.
- Log failed attachment removals during rollback via sanitizeLogText.
- Point CHANNEL_IMAGE_EXTENSIONS at the daemon store's set as source of
  truth; document the ordered images contract in the README.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #9922

Round commit: 6483770335fix(channels): harden channel image delivery against malformed and rejected turns (4 files, +480/−58, all inside the PR's existing footprint in packages/channels/base).

Feedback dispositions

Finding Severity Disposition
R2-1 [rc:3845700407] — missing mimeType throws TypeError, kills the turn Critical Fixed — reproduced, then filtered in resolvePromptImages
R2-2 [rc:3845700421]channelImageName slices without the image/ prefix check Critical Fixed — reproduced, prefix guard added
R1-3 [rc:3845700447] — uploads never removed when session.prompt fails after uploads Critical Fixed — reproduced, rollback on definite admission rejection
R2-4 [rc:3845700476] — sequential image uploads Suggestion Implemented — uploads fanned out like the webui path
R1-12 [rc:3845700484] — rollback removal failures unlogged Suggestion Implemented — one stderr line per rejected removal
R2-3 [rc:3845700463]toLowerCase() branch has zero coverage Suggestion Implemented — mixed-case inputs added to both normalization tests
R1-7 [rc:3845700455] — README documents only legacy image fields Suggestion Implemented — ordered images contract documented
R1-5 [rc:3845700471] — third hand-maintained copy of the store's image set Suggestion Implemented (minimal part) — pointer comment to the source of truth; the cross-package unification remains tracked in the deferred-findings queue from round 1

Details

R2-1 (Critical) — malformed image entries crashed the turn

Reproduced first: the new test drops malformed prompt image entries instead of failing the turn failed against the pre-round code with TypeError: Cannot read properties of undefined (reading 'split'). Fix: resolvePromptImages (the single normalization point shared by DaemonChannelBridge and AcpBridge) now drops entries whose data or mimeType is missing, empty, or non-string, restoring the pre-diff degrade-to-prompt-without-image behavior of the legacy field guards. Covered by the new test (entries missing data / missing mimeType).

R2-2 (Critical) — non-image MIME types passed the allow-list

Reproduced first: the new test with audio/png showed the pre-round code uploading image.png with Content-Type audio/png, which the daemon store's name/content-type coherence check rejects, failing the whole turn. Fix: channelImageName now requires the image/ prefix before slicing the subtype (the exact suggested fix), so such types hit the existing skip-and-warn degradation.

R1-3 (Critical) — orphaned uploads on prompt-admission rejection

Reproduced first: two new tests showed removeAttachment was never called when session.prompt rejected after successful uploads. Fix: a structural isDefinitePromptAdmissionRejection predicate (channels/base keeps no SDK dependency) mirrors the webui client's contract — DaemonHttpError from the admission request itself, or DaemonPendingPromptLimitError raised client-side before any request — and sets the rollback flag in a catch around session.prompt. Post-admission failures are excluded exactly as the webui does: turn errors carry _daemonTurnError, and aborts/transport errors may already be resolved by the daemon, so they keep the uploads. Negative control test keeps uploaded channel images when an admitted turn errors pins the exclusion.

R2-4 (Suggestion) — parallel uploads

Uploads now fan out via Promise.allSettled like the webui's attachment path: names are index-disambiguated and prompt order comes from array order, so nothing serializes them. Observable contract preserved — first rejection still rolls back all fulfilled uploads and rethrows; skipped (unrecognized-MIME) images still degrade with the stderr warning. New test uploads channel images concurrently and keeps prompt order pins both the fan-out and the input-order preservation.

R1-12 (Suggestion) — rollback failures logged

The rollback's Promise.allSettled results are now inspected; each rejected removal writes one sanitizeLogText-sanitized stderr line, matching the package's skip-warning convention. New test logs failed attachment removals while rolling back uploads pins it.

R2-3 (Suggestion) — mixed-case coverage

normalizes channel image MIME types before uploading now sends IMAGE/PNG; charset=binary (expecting image.png / image/png), and the alias test sends Image/JPG (expecting image-2.jpeg / image/jpeg). Both fail if .toLowerCase() is deleted (verified by mutation probe M6 below).

R1-7 (Suggestion) — README

packages/channels/base/README.md now documents the ordered images?: Array<{ data, mimeType }> contract as preferred in both the ChannelAgentBridge interface snippet and the AcpBridge method table, marks the legacy pair as a first-image-only fallback, and describes the MIME normalization bridges apply.

R1-5 (Suggestion) — source-of-truth pointer

CHANNEL_IMAGE_EXTENSIONS now carries a pointer comment naming SUPPORTED_IMAGE_MIME_TYPES in packages/acp-bridge/src/sessionAttachments.ts as the source of truth (verified the two sets match at this head), and the misleading "like the core read path" comparison was dropped from the skip comment. The structural fix the finding proposes as the alternative — making the daemon the decider / unifying the three copies — crosses package boundaries and stays tracked in the deferred-findings queue created in round 1.

Review-level note

[rv:5010492046] disclosed that Integration Tests (CLI, No Sandbox) were skipped in CI and not run locally. The channel-relevant integration files were run locally against the freshly bundled CLI this round (see Verification, 7/7 passed). The remainder of that CI suite is outside this round's local scope; the workflow's CI remains the final gate.

Conflict notes

None — --conflict false; no merge performed.

Mutation probes (guard removed → witness test FAILS; restored → green)

  • M1: delete the resolvePromptImages filter → drops malformed prompt image entries fails
  • M2: delete the image/ prefix guard → skips channel images whose MIME type is not an image type fails
  • M3: disable the admission rollback branch → both admission-rejection tests fail
  • M4: drop the _daemonTurnError exclusion → keeps uploaded channel images when an admitted turn errors fails
  • M5: serialize the upload fan-out → uploads channel images concurrently and keeps prompt order fails
  • M6: delete .toLowerCase() → both mixed-case normalization tests fail
  • M7: disable the rollback logging branch → logs failed attachment removals while rolling back uploads fails

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx vitest run in packages/channels/base — 19 files / 1062 tests passed (includes this round's 8 new/changed tests; 6 of them failed against the pre-round code, witnessing the three Criticals and the R2-4/R1-12 behaviors)
  • npx vitest run src/commands/channel/daemon-worker.test.ts in packages/cli — 1 file / 85 tests passed
  • npx vitest run in packages/channels/dingtalk — 10 files / 369 tests passed
  • npm run bundle — passed
  • QWEN_SANDBOX=false npx vitest run cli/qwen-serve-channel-workers.test.ts channel-plugin.test.ts in integration-tests — 2 files / 7 tests passed
  • Settings sources untouched → npm run generate:settings-schema not applicable
中文说明

Autofix 轮次总结 — PR #9922

本轮提交:6483770335fix(channels): harden channel image delivery against malformed and rejected turns(4 个文件,+480/−58,全部位于 PR 既有的 packages/channels/base 足迹内)。

反馈处置

发现 严重级别 处置
R2-1 [rc:3845700407] — 缺少 mimeType 抛出 TypeError,导致整个 turn 失败 Critical 已修复 — 先复现,随后在 resolvePromptImages 中过滤
R2-2 [rc:3845700421]channelImageName 未检查 image/ 前缀就切片 Critical 已修复 — 先复现,补上前缀守卫
R1-3 [rc:3845700447] — 上传成功后 session.prompt 失败时已上传图片从不清理 Critical 已修复 — 先复现,在明确的接收拒绝时回滚
R2-4 [rc:3845700476] — 图片串行上传 Suggestion 已实现 — 与 webui 路径一致地并行上传
R1-12 [rc:3845700484] — 回滚删除失败无日志 Suggestion 已实现 — 每个失败的删除写一行 stderr
R2-3 [rc:3845700463]toLowerCase() 分支零覆盖 Suggestion 已实现 — 两个归一化测试加入混合大小写输入
R1-7 [rc:3845700455] — README 只记录旧图片字段 Suggestion 已实现 — 补充有序 images 契约文档
R1-5 [rc:3845700471] — daemon 存储图片集合的第三份手工维护副本 Suggestion 已实现(最小部分) — 添加指向权威来源的指针注释;跨包统一仍由第一轮建立的 deferred-findings 队列跟踪

详情

R2-1(Critical)— 格式不完整的图片条目导致 turn 崩溃

先复现:新测试 drops malformed prompt image entries instead of failing the turn 在本轮之前的代码上以 TypeError: Cannot read properties of undefined (reading 'split') 失败。修复:resolvePromptImagesDaemonChannelBridgeAcpBridge 共享的唯一归一化点)现在会丢弃 datamimeType 缺失、为空或非字符串的条目,恢复旧字段守卫"降级为不带该图片的 prompt"的行为。由新测试覆盖(分别缺少 data / 缺少 mimeType 的条目)。

R2-2(Critical)— 非图片 MIME 类型通过了白名单

先复现:使用 audio/png 的新测试显示,本轮之前的代码会以 image.png 文件名、audio/png Content-Type 上传,而 daemon 存储的名字/Content-Type 一致性检查会拒绝它,导致整个 turn 失败。修复:channelImageName 在切分子类型前先要求 image/ 前缀(与建议修复完全一致),此类类型由此进入既有的"跳过 + 警告"降级路径。

R1-3(Critical)— prompt 接收被拒后上传成为孤儿

先复现:两个新测试显示,上传成功后 session.prompt 被拒绝时 removeAttachment 从未被调用。修复:新增结构化的 isDefinitePromptAdmissionRejection 判定(channels/base 不依赖 SDK),与 webui 客户端的契约一致 — 接收请求本身返回的 DaemonHttpError,或客户端在发出任何请求前抛出的 DaemonPendingPromptLimitError — 并在包裹 session.prompt 的 catch 中置位回滚标志。接收后的失败被明确排除,与 webui 完全一致:turn 错误带 _daemonTurnError,而中止/传输错误时 daemon 可能已经解析了这些附件,因此保留上传。负向对照测试 keeps uploaded channel images when an admitted turn errors 固定了这一排除行为。

R2-4(Suggestion)— 并行上传

上传现在像 webui 附件路径一样通过 Promise.allSettled 展开:文件名以索引区分、prompt 顺序由数组顺序决定,因此没有任何因素要求串行。可观察契约保持不变 — 首个失败仍会回滚所有已完成的上传并重新抛出;被跳过的(无法识别 MIME 的)图片仍按 stderr 警告降级。新测试 uploads channel images concurrently and keeps prompt order 同时固定了并行展开与输入顺序保持。

R1-12(Suggestion)— 记录回滚失败

回滚的 Promise.allSettled 结果现在会被检查;每个被拒绝的删除都通过 sanitizeLogText 消毒后写一行 stderr,与包内跳过警告的约定一致。新测试 logs failed attachment removals while rolling back uploads 固定该行为。

R2-3(Suggestion)— 混合大小写覆盖

normalizes channel image MIME types before uploading 现在发送 IMAGE/PNG; charset=binary(期望 image.png / image/png),别名测试发送 Image/JPG(期望 image-2.jpeg / image/jpeg)。删除 .toLowerCase() 后两个测试都会失败(已由下方变异探针 M6 验证)。

R1-7(Suggestion)— README

packages/channels/base/README.md 现在在 ChannelAgentBridge 接口片段和 AcpBridge 方法表两处都把有序的 images?: Array<{ data, mimeType }> 契约记录为首选,把旧字段对标记为仅携带第一张图片的回退,并说明 bridge 应用的 MIME 归一化。

R1-5(Suggestion)— 权威来源指针

CHANNEL_IMAGE_EXTENSIONS 现在带有指针注释,指明 packages/acp-bridge/src/sessionAttachments.ts 中的 SUPPORTED_IMAGE_MIME_TYPES 是权威来源(已在当前 head 上核实两个集合一致),同时从跳过注释中移除了误导性的"like the core read path"比较。该发现提出的另一个备选方案 — 让 daemon 做决策者 / 统一三份副本 — 跨越包边界,仍由第一轮建立的 deferred-findings 队列跟踪。

审查层面说明

[rv:5010492046] 披露 Integration Tests (CLI, No Sandbox) 在 CI 中被跳过且未在本地运行。本轮已在本地对新打包的 CLI 运行了 channel 相关的集成测试文件(见 Verification,7/7 通过)。该 CI 套件中其余部分超出本轮本地范围;工作流的 CI 仍是最终验证关卡。

冲突说明

无 — --conflict false;未执行任何合并。

变异探针(删除守卫 → 证据测试失败;还原 → 全绿)

  • M1:删除 resolvePromptImages 过滤器 → drops malformed prompt image entries 失败
  • M2:删除 image/ 前缀守卫 → skips channel images whose MIME type is not an image type 失败
  • M3:禁用接收拒绝回滚分支 → 两个接收拒绝测试均失败
  • M4:删除 _daemonTurnError 排除条件 → keeps uploaded channel images when an admitted turn errors 失败
  • M5:把上传展开改回串行 → uploads channel images concurrently and keeps prompt order 失败
  • M6:删除 .toLowerCase() → 两个混合大小写归一化测试均失败
  • M7:禁用回滚日志分支 → logs failed attachment removals while rolling back uploads 失败

验证(Verification)

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • packages/channels/basenpx vitest run — 19 个文件 / 1062 个测试通过(包含本轮 8 个新增/修改测试;其中 6 个在本轮之前的代码上失败,证明了三个 Critical 及 R2-4/R1-12 的行为)
  • packages/clinpx vitest run src/commands/channel/daemon-worker.test.ts — 1 个文件 / 85 个测试通过
  • packages/channels/dingtalknpx vitest run — 10 个文件 / 369 个测试通过
  • npm run bundle — 通过
  • integration-testsQWEN_SANDBOX=false npx vitest run cli/qwen-serve-channel-workers.test.ts channel-plugin.test.ts — 2 个文件 / 7 个测试通过
  • 未改动任何 settings 源 → 无需 npm run generate:settings-schema

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

Not explored to full depth (tool budget reached): "agent 5": executing DaemonChannelBridge.test.ts at HEAD (worktree lacks node_modules; install + build exceeded remaining budget).

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

  • packages/channels/base/src/AcpBridge.ts:287 — [review] inline image-block construction { type: 'image', data, mimeType } is pasted in both bridges (AcpBridge.ts:287-293, DaemonChannelBridge.ts:517-523); shared home exists in ChannelAgentBri…

Convergence: round 3 posted 5 inline comment(s), 5 of them reported for the first time; the previous round posted 8 (4 new). Findings keep coming back to the same files: packages/channels/base/src/DaemonChannelBridge.ts (findings in rounds 1, 2; 3 more now); packages/channels/base/src/ChannelAgentBridge.ts (findings in rounds 1, 2; 1 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

未探索到全部深度(达到工具调用预算):"agent 5"executing DaemonChannelBridge.test.ts at HEAD (worktree lacks node_modules; install + build exceeded remaining budget)

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

收敛情况:第 3 轮发布了 5 条行内评论,其中 5 条是首次提出;上一轮发布了 8 条(其中 4 条首次提出)。发现反复回到同一批文件:packages/channels/base/src/DaemonChannelBridge.ts(第 1、2 轮已出过发现,本轮又有 3 条);packages/channels/base/src/ChannelAgentBridge.ts(第 1、2 轮已出过发现,本轮又有 1 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。本轮没有未决的 Critical,因此"合入后把剩余 Suggestion 线程转到后续 issue"是一个可选的结束方式——已合入的 PR 不会继续发散。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/channels/base/src/DaemonChannelBridge.ts
Comment thread packages/channels/base/src/ChannelAgentBridge.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/README.md Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — no code change (growth-audit round)

This round was triggered by the diff-growth brake: this counting window grew src +123 / test +624 net lines over its baseline (budgets 400/400). The growth audit ran first, per the window rules, and recorded growth-audit.json with verdict sound (both axes pass).

Growth audit findings

  • The window covers exactly the two hardening commits 7b92aa427b and 6483770335, which fixed the five Criticals raised in earlier review rounds (MIME allow-list killing whole turns, missing session_attachments capability gate for older daemons, TypeError on malformed image entries, non-image MIME slipping past the allow-list, orphaned uploads on rejected prompt admission) plus accepted suggestions (concurrent uploads, rollback logging, README contract docs).
  • KISS: pass. Every accumulated piece is load-bearing for a named finding with probe evidence. The load-bearing structural claims were re-verified at HEAD: _daemonTurnError is a real SDK marker (packages/sdk-typescript/src/daemon/DaemonClient.ts), the channel MIME list exactly mirrors the daemon store's SUPPORTED_IMAGE_MIME_TYPES (packages/acp-bridge/src/sessionAttachments.ts), and channels/base depends only on @agentclientprotocol/sdk, so SDK error classes and webui helpers are not importable. The two structurally simpler alternatives (daemon-decides allow-list; hoisting attachment helpers into a shared package) require cross-package design decisions outside this PR's footprint and are already deferred to the follow-up queue.
  • Minimal change: pass. Every hunk traces to the PR's original problem (issue bug(channels/dingtalk): richText multi-image messages forward only the first image #9878) or an accepted review finding; zero untraceable hunks. The over-budget growth is test-only (624 vs 400; source is 123, within budget) — the witness tests the verification gate mandates per guard, which the new deferred findings ask to pin even harder.

Why no change this round

  • All five round-3 findings are non-Critical and were deferred by the growth brake's Critical-only filter; they remain open for human follow-up (or a @qwen-code /retry window).
  • No failed checks, no conflicts, and no maintainer items requiring action.
  • No verification commands were run because nothing changed; the pushed head is unchanged.
中文说明

Autofix 轮次总结 —— 无代码改动(增长审计轮)

本轮由 diff 增长刹车触发:本计数窗口相对基线净增长 源码 +123 / 测试 +624 行(预算 400/400)。按窗口规则,增长审计先行执行,结果已写入 growth-audit.json,结论为 sound(健康)(两个轴均通过)。

增长审计结论

  • 窗口恰好覆盖两个加固提交 7b92aa427b6483770335,它们修复了前几轮评审提出的五个 Critical(MIME 白名单抛错导致整个 turn 失败、旧版 daemon 缺少 session_attachments 能力预检、格式不完整图片条目触发 TypeError、非图片 MIME 绕过白名单、prompt 准入被拒后上传的附件成为孤儿),以及已接受的建议(并行上传、回滚日志、README 契约文档)。
  • KISS:通过。 每个累积下来的代码片段都有对应的具名发现及探针证据支撑。关键结构性论断已在 HEAD 上重新核实:_daemonTurnError 是真实的 SDK 标记(packages/sdk-typescript/src/daemon/DaemonClient.ts);channel 侧 MIME 列表与 daemon 存储的 SUPPORTED_IMAGE_MIME_TYPESpackages/acp-bridge/src/sessionAttachments.ts)完全一致;且 channels/base 仅依赖 @agentclientprotocol/sdk,因此既无法导入 SDK 错误类,也无法复用 webui 的辅助函数。两个结构上更简单的替代方案(由 daemon 裁决白名单;把附件辅助函数提升到共享包)都需要超出本 PR 范围的跨包设计决定,且已被延迟到后续跟进队列。
  • 最小改动:通过。 所有 hunk 均可追溯到 PR 的原始问题(issue bug(channels/dingtalk): richText multi-image messages forward only the first image #9878)或已接受的评审发现;不存在无法追溯的 hunk。超出预算的增长全部来自测试(624 vs 400;源码为 123,在预算内)——即验证门禁要求每个守卫都必须配备的见证测试,而本轮被延迟的新发现恰恰要求对这些见证再加约束。

本轮为何不做改动

  • 第三轮的全部五个发现均为非 Critical,已被增长刹车的"仅 Critical"过滤器延迟,保持开放留待人工跟进(或通过 @qwen-code /retry 开启新窗口处理)。
  • 无失败检查、无冲突、无需要处理的维护者条目。
  • 因无任何改动,未运行验证命令;推送的 head 保持不变。

Deferred non-Critical feedback

Critical-only mode is active: the PR's diff grew src 123 / test 624 net lines beyond this counting window's baseline (budgets: 400/400). The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback continues to flow unaffected during a growth-only engagement (the per-author batch budget applies only after 5 change-producing rounds). (@qwen-code /retry starts a fresh counting window.)

中文说明

已进入仅处理 Critical 的模式:本计数窗口内 diff 净增长已达 源码 123 / 测试 624 行(预算 400/400)。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。纯增长触发期间维护者反馈照常流动(按作者的批次预算仅在完成 5 个产生改动的轮次后生效)。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round summary — PR #9922

One commit this round: fix(channels): skip oversized channel images and pin review gaps (#9922). No base conflict (--conflict false), no merge performed.

All 26 inline findings are resolved in code — 21 were verified as already fixed by the earlier round commits on this branch (7b92aa427b, 6483770335), and the 5 round-3 Suggestions are addressed by this round's commit. No finding was declined, deferred, or escalated. The issue-level comment [ic:5394353035] is an E2E verification report supporting the PR; it requests no change.

Addressed this round

Finding Disposition Change
rc:3846971965 (R3-1, Suggestion) Implemented The daemon upload loop now decodes each image once, pre-checks the bytes against CHANNEL_IMAGE_MAX_UPLOAD_BYTES (mirrors the store's SESSION_ATTACHMENT_MAX_ITEM_BYTES, 8 MiB) and skips oversized images with a stderr warning — the same degrade-by-omission as the MIME guard — instead of failing the whole turn. The Blob is built from the decoded bytes. New test: an 8 MiB+1 image is skipped with a warning while its sibling still reaches the prompt.
rc:3846971967 (R3-2, Suggestion) Implemented Extended drops malformed prompt image entries with an empty-string data entry, an empty-string mimeType entry, and a null entry; added uploads the legacy pair when images is empty (pins that images: [] does not shadow the legacy pair); added the AcpBridge twin drops malformed prompt image entries before the text prompt — the inline path has no downstream MIME gate, so it is the witness that kills the empty-mimeType filter mutant.
rc:3846971976 (R3-3, Suggestion) Implemented Added keeps uploaded channel images when the prompt fails with an unrecognized error: session.prompt rejects with a plain new Error('connection reset') (the SDK's post-admission shape) and removeAttachment must not be called — pinning the matcher's default branch.
rc:3846971983 (R3-4, Suggestion) Implemented The rollback-failure log line now names both identifiers: failed to remove channel image <attachmentId> for session <sessionId> during rollback: <reason>. The existing rollback-log test now asserts both image.png and session-1 appear.
rc:3846971994 (R3-5, Suggestion) Implemented README contract paragraph now documents that daemon-backed bridges restrict uploads to the store's supported subtypes and its 8 MiB per-item limit, skipping out-of-limit images with a log line, while AcpBridge delivers any normalized image/* inline.

Verified already resolved by earlier commits (re-checked against this round's head)

  • rc:3843982545 (R1-1, Critical) — image/jpg alias normalization plus skip-with-warning degradation for unrecognized subtypes replace the turn-killing throw; tests: normalizes the image/jpg alias before uploading, skips channel images with unrecognized MIME subtypes instead of failing the turn.
  • rc:3843982553 (R1-2, Critical) — sessionAttachments is passed from capabilities.features.includes(SESSION_ATTACHMENTS_FEATURE) in daemon-worker.ts; older daemons receive pre-PR inline image blocks; test: keeps prompt images inline when the daemon lacks session attachments.
  • rc:3843982561 / rc:3845700447 (R1-3) — session.prompt is wrapped in its own catch that rolls back only on definite pre-admission rejections (isDefinitePromptAdmissionRejection); tests: removes uploaded channel images when the daemon rejects prompt admission, removes uploaded channel images when the local prompt queue is full, keeps uploaded channel images when an admitted turn errors.
  • rc:3843982569 (R1-4) — the legacy-fallback + MIME normalization block is now the single shared resolvePromptImages in ChannelAgentBridge.ts, called by both bridges.
  • rc:3843982574 / rc:3845700471 (R1-5) — resolved via the finding's option (b): the CHANNEL_IMAGE_EXTENSIONS comment names SUPPORTED_IMAGE_MIME_TYPES in packages/acp-bridge/src/sessionAttachments.ts as the source of truth and explains the deliberate mirror (channels/base keeps no acp-bridge dependency).
  • rc:3843982579 (R1-6) — SessionRouter.test.ts daemonSession() fake now declares uploadAttachment and removeAttachment.
  • rc:3843982586 / rc:3845700455 (R1-7) — README documents the ordered images contract as preferred and the legacy pair as fallback in both the interface snippet and the AcpBridge method table.
  • rc:3843982591 (R1-8) — legacy-only coverage exists per bridge: uploads a legacy-only prompt image pair (daemon) and sends a legacy-only image pair as one inline image block (ACP).
  • rc:3843982597 (R1-9) — uploaded Blob bytes are pinned by decoding arrayBuffer() and comparing exact buffers.
  • rc:3843982604 (R1-10) — the throw was replaced by degradation; the corrected behavior is pinned by the two skip tests above.
  • rc:3843982614 (R1-11) — orders the legacy image before attachment images pins the legacy-first ordering in ChannelBase.
  • rc:3843982623 / rc:3845700484 (R1-12) — rejected rollback removals are logged via sanitizeLogText; extended with identifiers this round (R3-4).
  • rc:3843982644 (R1-13) — the legacy compatibility fill assertions (options.imageBase64 / options.imageMimeType) are re-pinned in ChannelBase tests.
  • rc:3845700407 (R2-1, Critical) — resolvePromptImages filters entries missing data/mimeType before mapping; test: drops malformed prompt image entries instead of failing the turn.
  • rc:3845700421 (R2-2, Critical) — channelImageName requires the image/ prefix before slicing; test: skips channel images whose MIME type is not an image type (audio/png).
  • rc:3845700463 (R2-3) — mixed-case MIME coverage: IMAGE/PNG; charset=binary and Image/JPG inputs.
  • rc:3845700476 (R2-4) — uploads fan out via Promise.allSettled like the webui; test: uploads channel images concurrently and keeps prompt order.

Mutation probes (all killed, then restored to green)

Probe Mutation Witness that failed
P1 remove the 8 MiB size guard skips channel images above the daemon attachment size limit...
P2 strip identifiers from the rollback log line logs failed attachment removals while rolling back uploads
P3a remove image.data.length > 0 from the filter drops malformed prompt image entries instead of failing the turn
P3b remove !!image from the filter same test (null entry)
P3c images.length > 0>= 0 uploads the legacy pair when images is empty
P3d remove image.mimeType.length > 0 from the filter drops malformed prompt image entries before the text prompt (AcpBridge)
P4 widen the admission matcher to roll back any record error keeps uploaded channel images when the prompt fails with an unrecognized error

Verification

  • npx vitest run src/DaemonChannelBridge.test.ts src/AcpBridge.test.ts (in packages/channels/base) — passed, 2 files / 120 tests
  • npx vitest run (full packages/channels/base suite) — passed, 19 files / 1066 tests
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check on the four changed files — passed
  • Mutation probes — 7/7 mutants killed by their witness tests; restored code re-verified green
  • Integration tests after npm run bundle — not run: every behavior changed this round (size pre-check, rollback log identifiers, filter/ordering/matcher coverage, README) is exercised by the unit tests above; the daemon-worker wiring is unchanged this round
  • Settings schema regeneration — not applicable (no settings source touched)
中文说明

Autofix 审查轮次总结 — PR #9922

本轮一个提交:fix(channels): skip oversized channel images and pin review gaps (#9922)。无基线冲突(--conflict false),未执行合并。

全部 26 条行内发现均已在代码中解决——其中 21 条经复核确认已由本分支早前的轮次提交(7b92aa427b6483770335)修复,5 条第 3 轮 Suggestion 由本轮提交处理。没有拒绝、延后或升级任何发现。议题级评论 [ic:5394353035] 是一份支持本 PR 的 E2E 验证报告,不要求任何改动。

本轮处理

发现 处置 改动
rc:3846971965(R3-1,Suggestion) 已实现 daemon 上传循环现在对每张图片只解码一次,将字节数与 CHANNEL_IMAGE_MAX_UPLOAD_BYTES(镜像存储的 SESSION_ATTACHMENT_MAX_ITEM_BYTES,8 MiB)预先比较,超限图片带 stderr 警告跳过——与 MIME 守卫相同的"省略降级"——而不是让整个 turn 失败。Blob 由解码后的字节构造。新增测试:8 MiB+1 的图片被跳过并告警,其兄弟图片仍正常进入 prompt。
rc:3846971967(R3-2,Suggestion) 已实现 扩展 drops malformed prompt image entries:空字符串 data 条目、空字符串 mimeType 条目、null 条目;新增 uploads the legacy pair when images is empty(约束 images: [] 不会遮蔽旧字段对);新增 AcpBridge 孪生测试 drops malformed prompt image entries before the text prompt——内联路径没有下游 MIME 门,因此它是能杀死"空 mimeType 过滤器变异体"的见证。
rc:3846971976(R3-3,Suggestion) 已实现 新增 keeps uploaded channel images when the prompt fails with an unrecognized errorsession.prompt 以普通 new Error('connection reset')(SDK 接收后的错误形态)拒绝时不得调用 removeAttachment——约束匹配器的默认分支。
rc:3846971983(R3-4,Suggestion) 已实现 回滚失败日志现在包含两个标识:failed to remove channel image <attachmentId> for session <sessionId> during rollback: <reason>。现有回滚日志测试新增断言日志中同时出现 image.pngsession-1
rc:3846971994(R3-5,Suggestion) 已实现 README 契约段落现在记录:daemon 路径的 bridge 会把上传限定为存储支持的子类型及其 8 MiB 单项上限,超限图片带日志跳过而不失败整个 turn;AcpBridge 则内联投递任意归一化后的 image/*

已复核确认由早前提交解决(按本轮 HEAD 复核)

  • rc:3843982545(R1-1,Critical)—— image/jpg 别名归一化加上"未识别子类型跳过并告警"的降级,取代了会打挂整个 turn 的 throw;测试:normalizes the image/jpg alias before uploadingskips channel images with unrecognized MIME subtypes instead of failing the turn
  • rc:3843982553(R1-2,Critical)—— daemon-worker.tscapabilities.features.includes(SESSION_ATTACHMENTS_FEATURE) 传入 sessionAttachments;旧版 daemon 收到 PR 之前的内联图片块;测试:keeps prompt images inline when the daemon lacks session attachments
  • rc:3843982561 / rc:3845700447(R1-3)—— session.prompt 有独立的 catch,仅在明确的接收前拒绝(isDefinitePromptAdmissionRejection)时回滚;测试:removes uploaded channel images when the daemon rejects prompt admissionremoves uploaded channel images when the local prompt queue is fullkeeps uploaded channel images when an admitted turn errors
  • rc:3843982569(R1-4)—— 旧字段回退 + MIME 归一化代码块现在是 ChannelAgentBridge.ts 中唯一的共享函数 resolvePromptImages,两个 bridge 都调用它。
  • rc:3843982574 / rc:3845700471(R1-5)—— 按发现的选项 (b) 解决:CHANNEL_IMAGE_EXTENSIONS 的注释指明 packages/acp-bridge/src/sessionAttachments.ts 中的 SUPPORTED_IMAGE_MIME_TYPES 是权威来源,并解释了有意识的镜像(channels/base 不依赖 acp-bridge)。
  • rc:3843982579(R1-6)—— SessionRouter.test.tsdaemonSession() fake 现在声明了 uploadAttachmentremoveAttachment
  • rc:3843982586 / rc:3845700455(R1-7)—— README 在接口片段和 AcpBridge 方法表两处都把有序 images 契约记录为首选、旧字段对记录为回退。
  • rc:3843982591(R1-8)—— 每个 bridge 各有一个仅旧字段的覆盖:uploads a legacy-only prompt image pair(daemon)、sends a legacy-only image pair as one inline image block(ACP)。
  • rc:3843982597(R1-9)—— 上传的 Blob 字节通过解码 arrayBuffer() 并与精确缓冲区比较来约束。
  • rc:3843982604(R1-10)—— throw 已被降级取代;修正后的行为由上述两个跳过测试约束。
  • rc:3843982614(R1-11)—— orders the legacy image before attachment images 约束 ChannelBase 中"旧字段优先"的顺序。
  • rc:3843982623 / rc:3845700484(R1-12)—— 被拒绝的回滚删除会经 sanitizeLogText 记录日志;本轮扩展加入了标识(R3-4)。
  • rc:3843982644(R1-13)—— 旧字段兼容填充的断言(options.imageBase64 / options.imageMimeType)已在 ChannelBase 测试中重新约束。
  • rc:3845700407(R2-1,Critical)—— resolvePromptImages 在 map 之前过滤缺少 data/mimeType 的条目;测试:drops malformed prompt image entries instead of failing the turn
  • rc:3845700421(R2-2,Critical)—— channelImageName 在切片前要求 image/ 前缀;测试:skips channel images whose MIME type is not an image typeaudio/png)。
  • rc:3845700463(R2-3)—— 混合大小写 MIME 覆盖:IMAGE/PNG; charset=binaryImage/JPG 输入。
  • rc:3845700476(R2-4)—— 上传像 webui 一样通过 Promise.allSettled 并行展开;测试:uploads channel images concurrently and keeps prompt order

变异探针(全部被杀死,随后还原并复绿)

探针 变异 失败的见证测试
P1 移除 8 MiB 尺寸守卫 skips channel images above the daemon attachment size limit...
P2 去掉回滚日志行中的标识 logs failed attachment removals while rolling back uploads
P3a 移除过滤器中的 image.data.length > 0 drops malformed prompt image entries instead of failing the turn
P3b 移除过滤器中的 !!image 同上(null 条目)
P3c images.length > 0>= 0 uploads the legacy pair when images is empty
P3d 移除过滤器中的 image.mimeType.length > 0 drops malformed prompt image entries before the text prompt(AcpBridge)
P4 放宽接收匹配器为对任何 record 形态错误都回滚 keeps uploaded channel images when the prompt fails with an unrecognized error

验证

  • npx vitest run src/DaemonChannelBridge.test.ts src/AcpBridge.test.ts(在 packages/channels/base 内)—— 通过,2 个文件 / 120 个测试
  • npx vitest runpackages/channels/base 全套件)—— 通过,19 个文件 / 1066 个测试
  • npm run build —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • 对四个改动文件运行 npx prettier --check —— 通过
  • 变异探针 —— 7/7 变异体均被其见证测试杀死;还原后的代码复验为绿
  • npm run bundle 后的集成测试 —— 未运行:本轮改动的全部行为(尺寸预检、回滚日志标识、过滤器/顺序/匹配器覆盖、README)都由上述单元测试演练;本轮未改动 daemon-worker 接线
  • 设置 schema 重新生成 —— 不适用(未触及任何设置源)

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

  • mirrored daemon-store constants not pinned by any cross-package test — already reported as R1-5 (comment 3845700471) at packages/channels/base/src/DaemonChannelBridge.ts:147

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

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

  • packages/channels/base/src/DaemonChannelBridge.ts:504 — [probe] no test pins that uploads are aborted with the prompt controller's signal (surviving mutation verified by probe)
  • packages/channels/base/src/DaemonChannelBridge.ts:54 — [test] the new uploadAttachment/removeAttachment interface members ship with no test gating (type-only, build-gated)
  • packages/channels/base/src/DaemonChannelBridge.ts:108 — [test] the sessionAttachments capability-option declaration survives hunk-revert with every test green (type-only, build-gated; runtime branches tested)

Convergence: round 4 posted 4 inline comment(s), 4 of them reported for the first time; the previous round posted 5 (5 new). Findings keep coming back to the same files: packages/channels/base/src/DaemonChannelBridge.ts (findings in round 3; 4 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

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

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

收敛情况:第 4 轮发布了 4 条行内评论,其中 4 条是首次提出;上一轮发布了 5 条(其中 5 条首次提出)。发现反复回到同一批文件:packages/channels/base/src/DaemonChannelBridge.ts(第 3 轮已出过发现,本轮又有 4 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/DaemonChannelBridge.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts Outdated
Comment thread packages/channels/base/src/DaemonChannelBridge.ts
…mits (#9922)

- Skip channel images whose base64 decodes to zero bytes before
  uploading: the daemon store rejects empty images with 400, which
  failed the whole turn instead of degrading by omission.
- Bound the inline fallback for daemons without session_attachments:
  apply the same per-item admission gate and keep the aggregate base64
  payload under the daemon's 10mb prompt-body limit, so multi-image
  turns against older daemons degrade by omission instead of failing
  with 413.
- Reject oversized images from the base64 length before allocating the
  decoded buffer, so several oversized images no longer allocate their
  full decoded payloads concurrently before being discarded.
- Tag the skip log lines with the session id so operators can correlate
  a skipped image to its channel session.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #9922

Commit: e57fb50bbafix(channels): keep channel image delivery within daemon admission limits (#9922) (3 files, +266/−9). No base-conflict merge was needed (--conflict false).

Feedback points and dispositions

[rc:3847894018] Critical — zero-byte decodes uploaded, daemon 400 fails the whole turn → Resolved

Reproduced on d70222eb85 before changing anything: a new test prompting with data: 'A' (invalid base64, decodes to 0 bytes) showed the bridge attempting the upload, which fails the turn — the exact shape of the finding (the daemon route returns 400 "Image attachments cannot be empty" for empty image bodies, confirmed in packages/cli/src/serve/routes/session.ts). The fix completes the mirror of the daemon store's admission rule (SessionAttachmentStore.putAttachment rejects byteLength === 0 || byteLength > SESSION_ATTACHMENT_MAX_ITEM_BYTES): both delivery paths now run through one shared decodeChannelImage helper that rejects empty decodes and degrades by omission with a log line. Witnessed by skips channel images that decode to zero bytes instead of failing the turn (upload path) and skips inline channel images that decode to nothing (inline path) — both fail pre-fix, pass post-fix.

[rc:3847894043] Critical — inline fallback unbounded, old-daemon turns 413 → Resolved

Reproduced pre-fix: the inline fallback forwarded every image with no bound (new test with three ~3.5 MiB images showed all three forwarded — ~14 MiB of base64 against the daemon's express.json({ limit: '10mb' }) prompt-body cap, the 413 scenario of the finding; the cap itself was verified in packages/cli/src/serve/server/error-handlers.ts). The inline branch now applies the same shared per-item admission gate and an aggregate base64 budget (CHANNEL_IMAGE_INLINE_MAX_BASE64_BYTES = 8 MiB, safely under the 10 MiB body limit with headroom for the text prompt and JSON envelope). As the finding's probe showed, a per-item cap alone cannot fix this (base64 inflates 4/3 and payloads sum), so the budget is aggregate and measured on the base64 that actually rides in the body. One deliberate choice: when an image does not fit the remaining budget it is skipped and later, smaller images are still admitted (order preserved, degrade by omission) instead of stopping the loop outright — the payload stays under the cap either way. Witnessed by bounds the inline image payload for daemons without session attachments — fails pre-fix (all three forwarded), passes post-fix (only the first fits, two skip logs, text still delivered).

[rc:3847894048] Suggestion — oversized images fully decoded before being discarded → Resolved

decodeChannelImage rejects oversized images from the base64 length before allocating: floor(len * 3 / 4) adjusted for trailing padding (the adjustment keeps an image of exactly the 8 MiB limit admissible, matching the store's > rule — without it the estimate overshoots by the padding bytes). Witnesses: rejects oversized channel images from the base64 length without decoding them (spies Buffer.from and asserts the oversized payload is never decoded — fails pre-fix, passes post-fix) and uploads a channel image at exactly the daemon attachment size limit (boundary pin).

One deviation from the suggestion's wording, recorded here: it proposed keeping the decoded byteLength > MAX check afterwards "as the exact guard", but with a padding-aware estimate that branch is unreachable — decoded size can never exceed floor(len * 3 / 4) minus padding, because invalid characters only shrink the decode. Per AGENTS.md (no error handling for scenarios that cannot happen, and every guard needs a witness), the dead check was dropped; the estimate gate is the size guard and is fully witnessed by the two tests above.

[rc:3847894053] Suggestion — skip logs carry no session id → Resolved

All three skip log lines (unsupported MIME type, per-item admission skip on both paths, aggregate-budget skip) now end with for session ${sanitizeLogText(sessionId, 128)}, matching the rollback-failure log already in the same function. Witnessed by new toContain('for session session-1') assertions, including on the two pre-existing skip tests (both fail pre-fix without the session tag).

Not requested this round (recorded, no action)

  • The review body's dedup note (mirrored daemon-store constants not pinned by a cross-package test, already reported as R1-5 in round 1) was explicitly "not repeated" this round; its thread remains open on the PR. A clean fix would need an @qwen-code/acp-bridge dev-dependency in packages/channels/base plus a lockfile change, which the autofix boundaries forbid, so it stays in its own thread for maintainer scheduling.
  • The three items deferred under the convergence posture (upload-abort signal pin, uploadAttachment/removeAttachment interface gating, sessionAttachments capability-option gating) are marked "recorded, not requested in this round" — no action taken.

Changes

  • packages/channels/base/src/DaemonChannelBridge.ts — new CHANNEL_IMAGE_INLINE_MAX_BASE64_BYTES constant and shared decodeChannelImage admission helper (padding-aware oversize estimate, then decode, then empty check); upload path uses the helper instead of its partial inline check; inline fallback gains the per-item gate plus the aggregate base64 budget; all three skip logs gain the session id; mirroring comment updated.
  • packages/channels/base/src/DaemonChannelBridge.test.ts — 5 new tests (zero-decode upload skip, exact-limit boundary, no-decode spy, inline aggregate budget, inline empty skip) plus for session … assertions on the two existing skip tests (+214 lines).
  • packages/channels/base/README.md — the degrade-by-omission sentence now states the full per-item admission rule (non-empty, ≤ 8 MiB decoded) and the inline fallback's aggregate budget.

Mutation probes (each new guard's witness verified)

Probe Mutation Result
1 remove the zero-byte check 2 tests FAIL (zero-decode upload + inline) → restored
2 remove the inline aggregate budget 1 test FAILS (inline budget) → restored
3 remove the pre-decode estimate 1 test FAILS (Buffer.from spy) → restored
4 drop the padding adjustment (naive estimate) 1 test FAILS (exact-limit boundary) → restored

Verification

  • npx vitest run src/DaemonChannelBridge.test.ts (packages/channels/base) — pre-fix: 6 failed / 77 passed (defect witnesses); post-fix: 83 passed
  • npx vitest run (whole packages/channels/base suite) — 19 files, 1071 passed
  • npm run buildpassed
  • npm run typecheckpassed
  • npm run lintpassed
  • npx prettier --check on the three changed files — passed
  • Integration tests after npm run bundle — not run: the touched behavior (bridge-side image admission) is fully unit-exercised in packages/channels/base and is not only reachable through the bundled CLI or integration harness.
  • Settings schema — not touched, no regeneration needed.
中文说明

Autofix 轮次总结 — PR #9922

提交:e57fb50bbafix(channels): keep channel image delivery within daemon admission limits (#9922)(3 个文件,+266/−9)。无需合并 base 解决冲突(--conflict false)。

反馈点及处置

[rc:3847894018] Critical — 解码为零字节的图片被上传,daemon 返回 400 导致整个 turn 失败 → 已解决

在修改任何代码之前,先在 d70222eb85 上复现:新增测试以 data: 'A'(非法 base64,解码为 0 字节)发起 prompt,显示 bridge 尝试了上传并导致 turn 失败——与该发现的描述完全一致(在 packages/cli/src/serve/routes/session.ts 中确认:空图片体会被 daemon 路由以 400 "Image attachments cannot be empty" 拒绝)。修复方式是把 daemon 存储的接纳规则镜像补完整(SessionAttachmentStore.putAttachment 拒绝 byteLength === 0 || byteLength > SESSION_ATTACHMENT_MAX_ITEM_BYTES):两条投递路径现在都经过同一个共享的 decodeChannelImage 辅助函数,拒绝空解码结果,以记录日志并省略的方式降级。见证测试:skips channel images that decode to zero bytes instead of failing the turn(上传路径)与 skips inline channel images that decode to nothing(内联路径)——两者修复前失败、修复后通过。

[rc:3847894043] Critical — 内联回退无上限,旧版 daemon 上的 turn 返回 413 → 已解决

修复前复现:内联回退无上限地转发所有图片(新测试用三张约 3.5 MiB 的图片,显示三张全部被转发——约 14 MiB 的 base64,对应 daemon express.json({ limit: '10mb' }) prompt 请求体上限,即该发现描述的 413 场景;该上限已在 packages/cli/src/serve/server/error-handlers.ts 中核实)。内联分支现在应用相同的共享单项接纳守卫,并且增加总体积 base64 预算(CHANNEL_IMAGE_INLINE_MAX_BASE64_BYTES = 8 MiB,安全低于 10 MiB 请求体上限,并为文本 prompt 和 JSON 封皮预留余量)。正如该发现的探针所示,仅镜像单项上限无法修复此问题(base64 会放大 4/3 且多图体积累加),因此预算是面向总体积、并按实际进入请求体的 base64 计量的。一个有意的选择:当某张图片放不进剩余预算时,跳过它并继续接纳后面更小的图片(保持顺序、省略降级),而不是直接停止循环——两种方式下请求体都保持在上限之内。见证测试:bounds the inline image payload for daemons without session attachments——修复前失败(三张全部转发),修复后通过(仅第一张放入,两条跳过日志,文本仍然送达)。

[rc:3847894048] Suggestion — 超大图片在被丢弃前已被完整解码 → 已解决

decodeChannelImage 在分配内存之前就根据 base64 长度拒绝超大图片:floor(len * 3 / 4) 再扣除末尾填充字符(这一调整使恰好等于 8 MiB 上限的图片仍然可被接纳,与存储的 > 规则一致——不调整的话估算值会因填充字符而偏大)。见证测试:rejects oversized channel images from the base64 length without decoding them(对 Buffer.from 打桩,断言超大载荷从未被解码——修复前失败、修复后通过)以及 uploads a channel image at exactly the daemon attachment size limit(边界钉固)。

与建议措辞有一处偏差,记录在此:建议提出在解码后保留 byteLength > MAX 检查"作为精确守卫",但在带填充调整的估算下,该分支不可达——解码结果永远不会超过 floor(len * 3 / 4) 减去填充,因为非法字符只会让解码结果更小。依据 AGENTS.md(不为不可能发生的场景做错误处理、每个守卫都需要见证),删除了这个死检查;估算守卫即为尺寸守卫,并由上述两个测试完整见证。

[rc:3847894053] Suggestion — 跳过日志不含会话 id → 已解决

三条跳过日志(不支持的 MIME 类型、两条路径上的单项接纳跳过、总体积预算跳过)现在都以 for session ${sanitizeLogText(sessionId, 128)} 结尾,与同一函数中已有的回滚失败日志保持一致。见证:新增的 toContain('for session session-1') 断言,包括加在两个已有跳过测试上的断言(修复前因缺少会话标记而失败)。

本轮不要求处理(仅记录,不行动)

  • 审查正文中的去重说明(镜像的 daemon 存储常量没有跨包测试钉固,第 1 轮已作为 R1-5 报告)本轮明确"不再重复发布",其线程在 PR 上保持打开。一个干净的修复需要在 packages/channels/base 中新增对 @qwen-code/acp-bridge 的开发依赖并修改 lockfile,这超出 autofix 的边界,故保留在其自身线程中,由维护者安排。
  • 收敛姿态下延后的三项(上传中止信号钉固、uploadAttachment/removeAttachment 接口门控、sessionAttachments 能力选项门控)均标注为"已记录,本轮不要求修改"——未采取行动。

变更内容

  • packages/channels/base/src/DaemonChannelBridge.ts — 新增 CHANNEL_IMAGE_INLINE_MAX_BASE64_BYTES 常量与共享的 decodeChannelImage 接纳辅助函数(带填充调整的超大估算,然后解码,再检查空结果);上传路径改用该辅助函数,替代原先不完整的内联检查;内联回退增加单项守卫与总体积 base64 预算;三条跳过日志都加上会话 id;镜像注释同步更新。
  • packages/channels/base/src/DaemonChannelBridge.test.ts — 5 个新测试(零解码上传跳过、恰好上限边界、无解码桩测试、内联总体积预算、内联空结果跳过),并在两个已有跳过测试上补充 for session … 断言(+214 行)。
  • packages/channels/base/README.md — 省略降级的那句话现在完整表述单项接纳规则(非空、解码后 ≤ 8 MiB)以及内联回退的总体积预算。

变异探针(每个新守卫的见证均已验证)

探针 变异 结果
1 移除零字节检查 2 个测试失败(零解码上传 + 内联)→ 已恢复
2 移除内联总体积预算 1 个测试失败(内联预算)→ 已恢复
3 移除解码前估算 1 个测试失败(Buffer.from 桩测试)→ 已恢复
4 去掉填充调整(朴素估算) 1 个测试失败(恰好上限边界)→ 已恢复

验证

  • npx vitest run src/DaemonChannelBridge.test.ts(packages/channels/base)— 修复前:6 失败 / 77 通过(缺陷见证);修复后:83 通过
  • npx vitest run(packages/channels/base 全套件)— 19 个文件,1071 通过
  • npm run build通过
  • npm run typecheck通过
  • npm run lint通过
  • npx prettier --check(三个变更文件)— 通过
  • npm run bundle 后的集成测试 — 未运行:本次触及的行为(bridge 侧图片接纳)已在 packages/channels/base 中被单元测试完整覆盖,并非只能经由打包 CLI 或集成测试框架触达。
  • 设置 schema — 未触及,无需重新生成。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

  • hand-maintained daemon-store mirrors (supported subtype set, 8 MiB cap, naming scheme, inline budget) not pinned by any cross-package test — already reported as R1-5 (comment 3845700471) at packages/channels/base/src/DaemonChannelBridge.ts:…

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

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

  • packages/channels/base/src/DaemonChannelBridge.ts:54 — [test] new uploadAttachment/removeAttachment interface members ship with no test gating (type-only, build-gated)
  • packages/channels/base/src/DaemonChannelBridge.ts:108 — [test] sessionAttachments capability-option declaration survives hunk-revert with every test green (type-only, build-gated; runtime branches tested)

Convergence: round 5 posted 2 inline comment(s), 2 of them reported for the first time; the previous round posted 4 (4 new). Findings keep coming back to the same files: packages/channels/base/src/DaemonChannelBridge.ts (findings in round 4; 2 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

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

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

收敛情况:第 5 轮发布了 2 条行内评论,其中 2 条是首次提出;上一轮发布了 4 条(其中 4 条首次提出)。发现反复回到同一批文件:packages/channels/base/src/DaemonChannelBridge.ts(第 4 轮已出过发现,本轮又有 2 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/channels/base/src/DaemonChannelBridge.ts
Comment thread packages/channels/base/src/DaemonChannelBridge.ts

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

⚠️ This run could not certify that any of this diff was reviewed.

Not reviewed: coverage — no plan was given, so this run cannot show that any of the diff was read.

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

The pre-decode size estimate subtracted trailing '=' padding even when the input length does not complete a quantum; Node's lenient base64 decoder ignores such stray padding, so malformed input decoding to the 8 MiB limit plus one byte slipped past the gate and the daemon's 413 then failed the whole turn. Subtract padding only for multiple-of-4 input so the estimate is a strict upper bound.

Also give the skip reason a caller-supplied label so the inline fallback for daemons without session_attachments names the inline budget instead of an attachment-store limit those daemons do not have.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback addressed — PR #9922 (round 6)

Commit: 2393e85c36 on fix/dingtalk-richtext-multi-image (base: main, no merge needed, --conflict false).

Feedback points and dispositions

[rc:3848601570] Critical — size estimate undercounts by 1 byte on malformed padding → Resolved

The finding is real and was reproduced at e57fb50bba before any change:

  • Node probe: 'A'.repeat(11184812) + '=' (length % 4 = 1) → estimate 8,388,608 (admitted), Buffer.from(..., 'base64') decodes 8,388,609 bytes (> 8 MiB); the '==' variant (length % 4 = 2) behaves the same; the well-formed control is skipped correctly.
  • Failing-test reproduction: the new witness test (upload path, daemon simulated to answer 413) failed on the pre-round code with daemon 413: Request body too large (max 8 MiB) — the malformed image passed the gate, an upload was attempted, and the turn rejected, exactly the reported failure.

Fix: decodeChannelImage's length estimate now subtracts trailing =/== padding only when the input length is a multiple of 4 (i.e. the padding completes a quantum). Node's lenient decoder ignores stray trailing padding on malformed input, so this makes the estimate a strict upper bound of the decoded size: anything decoding past the 8 MiB limit is rejected on length alone, and the well-formed boundary case (exactly 8 MiB, single = pad, multiple-of-4 length) is unchanged. Both suggested remedies were probe-verified by the reviewer; the padding-condition fix was chosen over a post-decode re-check because it corrects the estimate in place (the reviewer explicitly validated this alternative) instead of adding a second redundant check.

Witness: new test skips malformed-padded channel images that decode past the size limit — asserts no uploadAttachment call, the skip warning, and a text-only prompt for both malformed variants. Mutation probe: replacing data.length % 4 === 0 with true (restoring the buggy behavior) makes this test fail; restoring the guard returns it to green.

[rc:3848601596] Suggestion — inline fallback blames a limit the old daemon does not have → Resolved

Reproduced with a failing test at e57fb50bba: with session_attachments absent and one image decoding past 8 MiB, the skip line read skipped channel image above the daemon attachment size limit ... — pointing operators at an attachment-store setting that does not exist on that daemon.

Fix: decodeChannelImage takes a caller-supplied oversizedReason. The upload path keeps 'above the daemon attachment size limit'; the inline fallback now passes 'above the inline image budget', naming the constraint that actually applies there (the aggregate base64 budget under the daemon's 10mb prompt-body cap). Behavior is unchanged; only the diagnostic attribution is corrected.

Witness: new test names the inline budget when skipping oversized inline channel images — asserts the skip line names the inline budget and not the attachment-store limit, and that the turn proceeds text-only. Mutation probe: reverting the inline label to the store wording makes this test fail; restoring the label returns it to green.

Recorded by the review, not requested this round — no action

The review body lists the previously reported R1-5 finding (hand-maintained daemon-store mirrors not pinned by a cross-package test) as confirmed-but-not-repeated, and two convergence-deferred test-gating observations (uploadAttachment/removeAttachment interface members and the sessionAttachments capability declaration, both type-only/build-gated) as explicitly "recorded, not requested in this round". No code was changed for them. The review's cluster observation (findings recurring in DaemonChannelBridge.ts) is noted; this round's two fixes share the same helper and close it at the root cause rather than adding another guard.

Conflict notes

None — --conflict false, no merge performed.

Verification

  • Reproduction (pre-fix, at e57fb50bba): Node probe confirmed the estimate undercount; the two new tests were run against the unfixed source and both FAILED (413 turn rejection; misattributed skip line) — required for the Critical, applied to both findings.
  • Mutation probe 1: data.length % 4 === 0trueskips malformed-padded channel images that decode past the size limit FAILED (1 failed | 84 skipped); guard restored — green.
  • Mutation probe 2: inline label reverted to the store wording — names the inline budget when skipping oversized inline channel images FAILED (1 failed | 84 skipped); label restored — green.
  • npx vitest run src/DaemonChannelBridge.test.ts (packages/channels/base) — 85 passed.
  • npx vitest run full packages/channels/base — 19 test files, 1073 passed.
  • npm run build — passed (exit 0).
  • npm run typecheck — passed (exit 0).
  • npm run lint — passed (exit 0).
  • npx prettier --check on the two changed files — passed.
  • Integration tests not run: the touched behavior is fully exercised by the unit tests above, not only through the bundled CLI or integration harness. Settings schema regeneration not needed: no settings source changed.
中文说明

已处理的评审反馈 — PR #9922(第 6 轮)

提交:fix/dingtalk-richtext-multi-image 分支上的 2393e85c36(base:main,无需合并,--conflict false)。

反馈点与处理结果

[rc:3848601570] Critical — 尺寸估算在畸形填充上少算 1 字节 → 已解决

该发现属实,并在动手修改前已在 e57fb50bba 上复现:

  • Node 探针:'A'.repeat(11184812) + '='(长度 % 4 = 1)→ 估算 8,388,608(放行),而 Buffer.from(..., 'base64') 实际解码出 8,388,609 字节(超过 8 MiB);'==' 变体(长度 % 4 = 2)行为相同;格式正常的对照组被正确跳过。
  • 失败测试复现:新增的证人测试(上传路径,daemon 被模拟为返回 413)在本轮之前的代码上失败,报 daemon 413: Request body too large (max 8 MiB)——畸形图片通过了守卫、上传被尝试、整个 turn 被拒绝,与报告的失败完全一致。

修复:decodeChannelImage 的长度估算现在仅在输入长度为 4 的倍数(即填充构成完整 quantum)时才减去尾部 =/== 填充。Node 的宽松解码器会忽略畸形输入上多余的尾部填充,因此该条件使估算成为解码尺寸的严格上界:任何解码后超过 8 MiB 上限的输入都会仅凭长度被拒绝,而格式正常的边界情形(恰好 8 MiB、单个 = 填充、长度为 4 的倍数)行为不变。评审给出的两种修复方案均经其探针验证;选择填充条件修复而非解码后复查,是因为它就地把估算修正(评审明确验证过这一替代方案),而不是再叠加一个冗余检查。

证人:新测试 skips malformed-padded channel images that decode past the size limit——对两个畸形变体断言不调用 uploadAttachment、输出跳过警告、且 prompt 仅含文本。变异探针:将 data.length % 4 === 0 替换为 true(恢复缺陷行为)后该测试失败;恢复守卫后回到绿色。

[rc:3848601596] Suggestion — 内联回退归因于旧 daemon 并不存在的上限 → 已解决

已用失败测试在 e57fb50bba 上复现:当 session_attachments 缺失且一张图片解码后超过 8 MiB 时,跳过日志写作 skipped channel image above the daemon attachment size limit ...——把运维者引向该 daemon 上并不存在的附件存储配置。

修复:decodeChannelImage 接受调用方提供的 oversizedReason。上传路径保留 'above the daemon attachment size limit';内联回退改传 'above the inline image budget',点名该路径真正生效的约束(daemon 10mb 请求体上限之下的总体 base64 预算)。行为不变,仅修正诊断归因。

证人:新测试 names the inline budget when skipping oversized inline channel images——断言跳过日志点名内联预算而非附件存储上限,且 turn 以纯文本继续。变异探针:把内联标签还原为存储措辞后该测试失败;恢复标签后回到绿色。

评审记录在案、本轮不要求处理 — 不采取行动

评审正文将此前已报告的 R1-5 发现(手工维护的 daemon 存储镜像没有跨包测试钉住)标记为"已确认但不重复发布",并将两条收敛姿态下延后的测试守卫观察(uploadAttachment/removeAttachment 接口成员、sessionAttachments 能力声明,均为纯类型/构建守卫)明确标注为"已记录、本轮不要求修改"。本轮未就它们改动代码。评审关于发现簇的观察(发现反复出现在 DaemonChannelBridge.ts)已知悉;本轮两处修复同源于该辅助函数,并从根因上收口,而不是再加一个守卫。

冲突说明

无——--conflict false,未执行合并。

验证

  • 复现(修复前,e57fb50bba):Node 探针确认估算少算;两个新测试在未修复源码上运行且均失败(413 turn 拒绝;错误归因的跳过日志)——这是 Critical 的必需步骤,两个发现均照此执行。
  • 变异探针 1:data.length % 4 === 0true——skips malformed-padded channel images that decode past the size limit 失败(1 failed | 84 skipped);恢复守卫后回到绿色。
  • 变异探针 2:内联标签还原为存储措辞——names the inline budget when skipping oversized inline channel images 失败(1 failed | 84 skipped);恢复标签后回到绿色。
  • npx vitest run src/DaemonChannelBridge.test.ts(packages/channels/base)— 85 通过。
  • npx vitest run packages/channels/base 全量 — 19 个测试文件,1073 通过。
  • npm run build — 通过(exit 0)。
  • npm run typecheck — 通过(exit 0)。
  • npm run lint — 通过(exit 0)。
  • npx prettier --check 两个改动文件 — 通过。
  • 未运行集成测试:本次改动的行为已由上述单元测试完整覆盖,并非只经由打包后的 CLI 或集成测试框架验证。无需重新生成设置 schema:未改动任何设置源。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

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

  • packages/channels/base/src/DaemonChannelBridge.ts:203 — [review] admission-rejection predicate duplicated from webui under the same name, keyed off SDK internals
  • packages/channels/base/src/DaemonChannelBridge.ts:563 — [review] inline fallback fully decodes every image before the budget check that only needs the string length
  • packages/channels/base/src/DaemonChannelBridge.ts:655 — [probe] rollback discards the removeAttachment boolean; a resolved false (not removed) is silently treated as success
  • packages/channels/base/src/DaemonChannelBridge.ts:48 — [test] uploadAttachment/removeAttachment interface additions ship with no test gating (type-only, build-gated)
  • packages/channels/base/src/DaemonChannelBridge.ts:103 — [test] sessionAttachments capability-option declaration survives hunk-revert with every test green (type-only, build-gated)
中文说明

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

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

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #9922 (no code change)

This was a growth-audit round: the counting window (baseline 6483770335 → head 2393e85c36, three commits) grew source 66 / test 461 net lines, with the test side over its 400-line budget.

Growth audit verdict: sound (recorded in growth-audit.json)

  • KISS axis — pass. The window's net source growth is 66 lines: two budget constants mirroring two different daemon-side constraints (the attachment store's per-item 8 MiB cap; the older daemon's express.json({ limit: '10mb' }) prompt-body cap), one shared pure gate helper (decodeChannelImage), and three call sites with skip logging. Each piece is load-bearing for a specific accepted finding: the store's 413/400 rejections used to fail whole multi-image turns; oversized images must be rejected on base64 length without allocating the decoded buffer; and the padding branch fixes a proven undercount where malformed padding slipped past a naive estimate and a daemon 413 failed the turn (pinned by a witness test). Structurally simpler shapes were examined and rejected: delegating gating to the daemon is impossible on the inline path (aggregate cap, no per-item server gate) and would allocate/transfer oversized payloads; merging the two constants couples unrelated constraints; dropping the padding branch reintroduces the proven bug.
  • Minimal-change axis — pass, zero untraceable hunks. Every window hunk stays inside the PR's existing footprint (packages/channels/base + its README) and traces to an accepted review finding named in the commit bodies, or documents exactly that behavior. The over-budget line class is tests, and it is mechanical: repository rules require every guard a round's commits add to carry its own witness, and three finding-driven rounds each added gates.

The verdict is sound, so no consolidation or deletion is required and the counting window re-arms at the current size.

Feedback dispositions

  • [rv:5014025724] (@doudouOUC, COMMENTED, via qwen3.8-max /review) — No action. The review body contains no findings at all: it is a report that the review run itself could not certify coverage ("no plan was given, so this run cannot show that any of the diff was read"). There is no checkable defect claim to reproduce and nothing to fix in code. It also ran against commit e57fb50bba, one commit behind the current head 2393e85c36. Note that the prior automated review (pullrequestreview-5007437286) is an APPROVED "LGTM, looks ready to ship — CI landed green after the review."
  • Deferred non-Critical feedback (automated review pullrequestreview-5014774705) — untouched. Critical-only mode is active; deferred items are an audit record, not this round's work, and remain open for human follow-up.
  • Failed checks / still-red checks — none.

Outcome

No code changes, no commit. Nothing was resolved, declined at the code level, or deferred to the follow-up queue this round.

中文说明

Autofix 轮次总结 — PR #9922(无代码改动)

本轮是一次增长审计轮:计数窗口(基线 6483770335 → 头部 2393e85c36,共三个提交)净增长源码 66 行 / 测试 461 行,其中测试侧超出了 400 行的预算。

增长审计结论:sound(已记录于 growth-audit.json

  • KISS 轴 — 通过。 本窗口源码净增长仅 66 行:两个预算常量,分别对应两个不同的 daemon 侧约束(附件存储的单条 8 MiB 上限;旧版 daemon 的 express.json({ limit: '10mb' }) 请求体上限),一个共享的纯函数门槛辅助函数(decodeChannelImage),以及三处带跳过日志的调用点。每一部分都是某个已被接受的评审发现所必需的:存储的 413/400 拒绝过去会导致整个多图回合失败;超大图片必须在 base64 长度层面被拒绝而不分配解码后的缓冲区;而 padding 分支修复了一个已被证实的少算缺陷——畸形 padding 曾绕过朴素估算,导致 daemon 返回 413 并使整个回合失败(已有见证测试钉住)。我们考察过结构上更简单的方案并予以否决:把门槛判断委托给 daemon 在内联路径上不可行(聚合上限、没有逐条服务端校验),且会分配并传输超大载荷;合并两个常量会把互不相关的约束耦合在一起;去掉 padding 分支会重新引入已被证实的缺陷。
  • 最小改动轴 — 通过,零不可追溯的改动块。 本窗口的所有改动块都在该 PR 既有足迹范围内(packages/channels/base 及其 README),并且每一块都能追溯到提交信息中写明的、已被接受的评审发现,或仅仅是对该行为的文档记录。超出预算的是测试行数,这是机制性的:仓库规则要求每轮提交新增的每个守卫都必须有自己的见证测试,而三个由评审发现驱动的轮次各自新增了守卫。

结论为 sound,因此无需合并或删除代码,计数窗口将以当前规模重新启动。

反馈处置

  • [rv:5014025724](@doudouOUC,COMMENTED,经由 qwen3.8-max /review)— 无需处理。 该评审正文不含任何发现:它只是一份评审运行本身无法认证覆盖率的报告("没有提供计划,因此本次运行无法证明读取过任何 diff")。其中没有任何可复现验证的缺陷主张,代码中没有可修复的内容。而且它运行在提交 e57fb50bba 上,比当前头部 2393e85c36 落后一个提交。另外,此前的自动评审(pullrequestreview-5007437286)是 APPROVED 的 "LGTM, looks ready to ship — CI landed green after the review."。
  • 被推迟的非 Critical 反馈(自动评审 pullrequestreview-5014774705)— 未触碰。 当前处于仅处理 Critical 的模式;被推迟的条目属于审计记录,不是本轮工作,保持开放留待人工跟进。
  • 失败的检查 / 持续失败的检查 — 无。

结果

无代码改动,无提交。本轮没有任何条目被解决、在代码层面被否决,或被推迟到跟进队列。

Deferred non-Critical feedback

Critical-only mode is active: the PR's diff grew src 66 / test 461 net lines beyond this counting window's baseline (budgets: 400/400). The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback continues to flow unaffected during a growth-only engagement (the per-author batch budget applies only after 5 change-producing rounds). (@qwen-code /retry starts a fresh counting window.)

中文说明

已进入仅处理 Critical 的模式:本计数窗口内 diff 净增长已达 源码 66 / 测试 461 行(预算 400/400)。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。纯增长触发期间维护者反馈照常流动(按作者的批次预算仅在完成 5 个产生改动的轮次后生效)。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round: no code changes — all open findings re-verified at HEAD

This round re-verified all 32 open inline findings against the current head (2393e85c). Every Critical finding had already been fixed by earlier round commits; this round confirmed each fix still stands in code and is pinned by tests (all green — see Verification). One Suggestion was deferred to the follow-up queue. No new code changes were required, so nothing was committed.

Critical findings re-verified as resolved (fixed by earlier commits)

  • rc:3843982545 — MIME allow-list killing the whole turn: the shared resolvePromptImages normalizes aliases (image/jpgimage/jpeg), and unrecognized subtypes degrade to skip-with-warning instead of throwing. Pinned by normalizes the image/jpg alias before uploading and skips channel images with unrecognized MIME subtypes instead of failing the turn.
  • rc:3843982553 — missing session_attachments capability pre-flight: the bridge takes sessionAttachments from capabilities.features.includes('session_attachments') in the daemon worker, and daemons without the feature get the pre-PR inline path. Pinned in daemon-worker.test.ts for both feature states and by keeps prompt images inline when the daemon lacks session attachments.
  • rc:3845700407 — missing mimeType TypeError: malformed entries (missing/empty data or mimeType, null) are dropped in resolvePromptImages. Pinned by drops malformed prompt image entries in both bridges.
  • rc:3845700421 — non-image MIME bypass: channelImageName requires the image/ prefix before slicing. Pinned by skips channel images whose MIME type is not an image type (audio/png).
  • rc:3843982561 + rc:3845700447 — orphaned uploads when session.prompt fails after successful uploads: rollback fires on definite admission rejections (DaemonHttpError without _daemonTurnError, DaemonPendingPromptLimitError) and never on admitted turns or unrecognized errors. Pinned by four tests: admission 400, prompt-queue-full, admitted-turn error kept, plain Error('connection reset') kept.
  • rc:3847894018 — zero-byte uploads: decodeChannelImage skips payloads that decode to nothing. Pinned on both the upload path and the inline path.
  • rc:3847894043 — unbounded inline fallback: per-item decode gate plus an aggregate inline base64 budget keep the prompt body under the daemon's 10 MB limit. Pinned by bounds the inline image payload for daemons without session attachments.
  • rc:3848601570 — 1-byte size-estimate undercount: padding is subtracted only when the input length completes a quantum, making the estimate a strict upper bound (the alternative fix named in the finding itself). Pinned by skips malformed-padded channel images that decode past the size limit using the exact 'A'.repeat(11184812) + '=' witness inputs.

Suggestions re-verified as resolved

  • Shared normalization (rc:3843982569) — the pasted legacy-fallback blocks were extracted into the shared resolvePromptImages in ChannelAgentBridge.ts; both bridges call it, so MIME parameter stripping, lowercasing, alias mapping, and the legacy fallback live in one place.
  • Test pinning — rc:3843982591 (legacy-only pair tests in both bridges plus images: [] falling back to the legacy pair), rc:3843982597 (captured Blobs are decoded and their exact bytes pinned, with distinct per-image data so a swap mutation is caught), rc:3843982604 (the corrected degrade behavior for unsupported subtypes is pinned: one upload, warning, image omitted), rc:3843982614 (orders the legacy image before attachment images), rc:3843982644 (legacy compat fill re-pinned via options.imageBase64/options.imageMimeType assertions), rc:3845700463 (mixed-case IMAGE/PNG; charset=binary and Image/JPG normalization pinned), rc:3846971967 (empty-string data, empty-string mimeType, null entry, and images: [] fallback all pinned), rc:3846971976 (unrecognized error shapes keep uploads), rc:3847894048 (oversized images rejected from base64 length without decoding).
  • Rollback cleanup logging (rc:3843982623, rc:3845700484, rc:3846971983) — rejected removals are logged with the attachment id, session id, and reason via sanitizeLogText; pinned by logs failed attachment removals while rolling back uploads.
  • Parallel uploads (rc:3845700476) — uploads fan out via Promise.allSettled; pinned by uploads channel images concurrently and keeps prompt order.
  • Log correlation (rc:3847894053) — both skip logs name the session; asserted in the skip tests.
  • Inline wording (rc:3848601596)decodeChannelImage takes a caller-supplied limit label; the fallback path reports above the inline image budget; pinned by names the inline budget when skipping oversized inline channel images.
  • Session fake (rc:3843982579)SessionRouter.test.ts fakes now declare uploadAttachment/removeAttachment.
  • Source-of-truth pointer (rc:3845700471) — the mirrored subtype set and size cap carry pointer comments naming SUPPORTED_IMAGE_MIME_TYPES / SESSION_ATTACHMENT_MAX_ITEM_BYTES in packages/acp-bridge/src/sessionAttachments.ts as the source of truth — the minimal branch this finding requested.
  • README (rc:3843982586, rc:3845700455, rc:3846971994) — both the interface snippet and the AcpBridge method table document the ordered images contract with the legacy pair marked as fallback, and the subtype restriction plus skip-instead-of-fail behavior are documented in the contract section.

Deferred to the follow-up queue

  • rc:3843982574 — hoisting the daemon-attachment helpers (naming, MIME normalization, base64→Blob, rollback) into a module both channels/base and webui consume. Verified real, but the fix crosses package boundaries and needs a shared-home decision outside this PR's DingTalk multi-image footprint; the in-scope minimal branch (deliberate mirroring plus source-of-truth pointer comments) is already in place. A reply with the full reasoning is posted on the thread.

Issue-level comment

  • ic:5394353035 — the maintainer's DingTalk E2E report confirms the fixed path end-to-end (multi-image callback → three 201 uploads → 202 prompt → ordered persisted references → Web Shell renders all three → model counts three → reply delivered), with no failed or still-red checks. No action required.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed, 0 problems
  • vitest run packages/channels/base (DaemonChannelBridge.test.ts, AcpBridge.test.ts, SessionRouter.test.ts) — 224 passed
  • vitest run packages/channels/base ChannelBase.test.ts — 591 passed
  • vitest run packages/cli daemon-worker.test.ts — 85 passed
  • Integration Tests (CLI, No Sandbox): skipped in CI and not run locally — the same disclosed gap carried by every review round. Not load-bearing for this round: no code changed, and the touched behavior is exercised by the unit suites above plus the maintainer's live E2E report.
中文说明

Autofix 审查轮:无代码变更 —— 所有未决发现已在 HEAD 复核完毕

本轮在当前 head(2393e85c)上复核了全部 32 条未决行内发现。所有 Critical 发现均已由之前轮次的提交修复;本轮逐条确认这些修复在代码中仍然成立,且都有测试约束(全部绿色——见"验证"一节)。1 条 Suggestion 被延后到后续跟进队列。本轮不需要任何新的代码变更,因此没有提交。

已复核为解决的 Critical 发现(由先前提交修复)

  • rc:3843982545 —— MIME 白名单导致整个 turn 失败:共享的 resolvePromptImages 会规范化别名(image/jpgimage/jpeg),未识别的子类型降级为"跳过 + 警告"而不是抛异常。由 normalizes the image/jpg alias before uploadingskips channel images with unrecognized MIME subtypes instead of failing the turn 约束。
  • rc:3843982553 —— 缺少 session_attachments 能力预检:bridge 从 daemon worker 中的 capabilities.features.includes('session_attachments') 取得 sessionAttachments,不支持该特性的 daemon 走 PR 之前的内联路径。由 daemon-worker.test.ts 对两种特性状态的测试以及 keeps prompt images inline when the daemon lacks session attachments 约束。
  • rc:3845700407 —— 缺 mimeType 抛 TypeError:格式不完整的条目(缺/空 datamimeTypenull)在 resolvePromptImages 中被丢弃。由两个 bridge 的 drops malformed prompt image entries 约束。
  • rc:3845700421 —— 非图片 MIME 绕过:channelImageName 在切片前先要求 image/ 前缀。由 skips channel images whose MIME type is not an image typeaudio/png)约束。
  • rc:3843982561 + rc:3845700447 —— 上传成功后 session.prompt 失败导致孤儿附件:回滚只在明确的接收拒绝(不带 _daemonTurnErrorDaemonHttpErrorDaemonPendingPromptLimitError)时触发,已被接收的 turn 和未识别的错误一律不回滚。由四个测试约束:接收 400、本地 prompt 队列满、已接收 turn 出错保留、普通 Error('connection reset') 保留。
  • rc:3847894018 —— 零字节上传:decodeChannelImage 会跳过解码后为空的载荷。上传路径和内联路径均有测试约束。
  • rc:3847894043 —— 内联回退无上限:单项解码守卫 + 总体积内联 base64 预算,把 prompt 请求体控制在 daemon 10 MB 上限之内。由 bounds the inline image payload for daemons without session attachments 约束。
  • rc:3848601570 —— 尺寸估算少算 1 字节:仅当输入长度构成完整 quantum 时才减去填充,使估算成为严格上界(即该发现自身列出的替代修复方案)。由 skips malformed-padded channel images that decode past the size limit 使用与发现完全相同的 'A'.repeat(11184812) + '=' 证据输入约束。

已复核为解决的 Suggestion

  • 共享归一化(rc:3843982569) —— 被粘贴的旧字段回退代码块已提取为 ChannelAgentBridge.ts 中的共享函数 resolvePromptImages;两个 bridge 都调用它,MIME 参数剥离、小写化、别名映射、旧字段回退集中在一处。
  • 测试约束 —— rc:3843982591(两个 bridge 的仅旧字段测试,外加 images: [] 回退到旧字段对)、rc:3843982597(捕获的 Blob 被解码并约束精确字节,两张图片数据不同,因此交换变异也能被抓到)、rc:3843982604(不支持子类型的修正后降级行为被约束:一次上传、一条警告、图片被省略)、rc:3843982614(orders the legacy image before attachment images)、rc:3843982644(旧字段兼容填充经 options.imageBase64/options.imageMimeType 断言重新约束)、rc:3845700463(混合大小写 IMAGE/PNG; charset=binaryImage/JPG 的归一化被约束)、rc:3846971967(空字符串 data、空字符串 mimeTypenull 条目、images: [] 回退均被约束)、rc:3846971976(未识别的错误形态保留上传)、rc:3847894048(超大图片仅凭 base64 长度拒绝、不解码)。
  • 回滚清理日志(rc:3843982623、rc:3845700484、rc:3846971983) —— 被拒绝的删除会经 sanitizeLogText 记录附件 id、会话 id 和原因;由 logs failed attachment removals while rolling back uploads 约束。
  • 并行上传(rc:3845700476) —— 上传经 Promise.allSettled 扇出;由 uploads channel images concurrently and keeps prompt order 约束。
  • 日志可关联性(rc:3847894053) —— 两条跳过日志都带会话标识;跳过测试中有断言。
  • 内联措辞(rc:3848601596) —— decodeChannelImage 接受调用方提供的上限标签;回退路径报告 above the inline image budget;由 names the inline budget when skipping oversized inline channel images 约束。
  • 会话 fake(rc:3843982579) —— SessionRouter.test.ts 的 fake 已声明 uploadAttachment/removeAttachment
  • 权威来源指针(rc:3845700471) —— 镜像的子类型集合与尺寸上限都带指针注释,指明 packages/acp-bridge/src/sessionAttachments.ts 中的 SUPPORTED_IMAGE_MIME_TYPES / SESSION_ATTACHMENT_MAX_ITEM_BYTES 是权威来源——正是该发现要求的最小分支。
  • README(rc:3843982586、rc:3845700455、rc:3846971994) —— 接口片段与 AcpBridge 方法表两处都记录了有序 images 契约、并把旧字段对标记为回退;契约一节还记录了子类型限制以及"跳过而非失败"的行为。

延后到后续跟进队列

  • rc:3843982574 —— 把 daemon 附件辅助函数(命名、MIME 归一化、base64→Blob、回滚)提升到 channels/basewebui 都能消费的共享模块。已核实问题真实存在,但修复跨越包边界、需要一个超出本 PR(钉钉多图)范围的共享归属决策;范围内的最小分支(有意镜像 + 权威来源指针注释)已经落地。完整理由已作为回复发布在该线程。

Issue 级评论

  • ic:5394353035 —— 维护者的钉钉 E2E 报告端到端确认了修复路径(多图回调 → 三次 201 上传 → 202 prompt → 有序的持久化引用 → Web Shell 渲染全部三张 → 模型正确数出三张 → 回复送达),没有失败或仍然红色的检查项。无需处理。

验证

  • npm run build —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过,0 问题
  • vitest run packages/channels/base(DaemonChannelBridge.test.ts、AcpBridge.test.ts、SessionRouter.test.ts)—— 224 通过
  • vitest run packages/channels/base ChannelBase.test.ts —— 591 通过
  • vitest run packages/cli daemon-worker.test.ts —— 85 通过
  • Integration Tests (CLI, No Sandbox):CI 中跳过、本地未运行 —— 与每一轮审查一致的已披露缺口。本轮不关键:没有代码变更,且涉及的行为已由上述单元测试套件加维护者的真实 E2E 报告覆盖。

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


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

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(channels/dingtalk): richText multi-image messages forward only the first image

5 participants