Skip to content

feat(web-shell): expose channel sessions in sidebar and settings - #8457

Merged
wenshao merged 34 commits into
mainfrom
feat/web-shell-channel-sessions
Aug 12, 2026
Merged

feat(web-shell): expose channel sessions in sidebar and settings#8457
wenshao merged 34 commits into
mainfrom
feat/web-shell-channel-sessions

Conversation

@BZ-D

@BZ-D BZ-D commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds a Tasks / Channels source switch above the Web Shell project session catalog. Tasks remains the default view, while Channels shows sessions started through configured integrations such as DingTalk, Feishu, and WeCom.

Keeps the selected Channels catalog on the active refresh interval so conversations created externally appear without switching tabs. The model still receives the complete Channel context, while live echo, restored transcripts, and sidebar fallback titles use a separate user-facing message projection that excludes internal Channel instructions.

Groups Channel conversations into collapsible platform sections such as DingTalk and Feishu. Multiple configured instances of the same platform share one section, pinned conversations remain in their platform section, and sessions whose configuration is no longer available remain discoverable under Other channels.

Adds a Session scope setting to every manageable Channel. Users can choose whether incoming messages create sessions per user and chat, per thread, per chat and thread, or as one channel-wide shared session. Existing plugin defaults remain effective, including the chat-and-thread default used by GitHub and GitLab.

Applies the selected sidebar source consistently to active, pinned, archived, primary-workspace, and secondary-workspace session lists. Controls are capability- or catalog-driven so older daemons retain their existing behavior.

Why it's needed

Daemon-managed Channels already persist conversations as workspace sessions tagged with the channel source, but the Web Shell sidebar only requested regular task sessions. A valid Channel conversation therefore could not be reopened from the sidebar even though it belonged to the selected workspace. After source filtering was added, the idle refresh interval also left the selected Channels view stale until the user switched tabs.

As the catalog grows, a flat list also makes it difficult to tell which integration owns each conversation. Grouping by the current workspace's Channel configuration keeps related conversations together without changing how sessions are persisted.

Channel requests combine user input with transport instructions and contextual metadata for the model. Reusing that model-facing text for transcript echo and fallback titles exposed internal instructions as if the user had typed them. The persisted display projection now keeps those concerns separate without reducing model context.

The Channel runtime also already supports configurable session routing, but the Web management catalog exposed only platform-specific credentials and access policy. Users could not inspect or change which conversations shared agent context without editing configuration manually.

Reviewer Test Plan

How to verify

  1. Connect the Web Shell to a daemon that supports session source metadata and has both a regular task session and a Channel-created session. Confirm Tasks is selected initially, the regular session is visible, and the Channel session is absent.
  2. Select Channels. Confirm Channel-created sessions are grouped into collapsible platform sections, two DingTalk configurations share one DingTalk section, a Feishu conversation remains separate, pinned conversations stay in their platform section, and a session without matching configuration appears under Other channels.
  3. Collapse and expand a platform section. Keep Channels selected and start another DingTalk conversation. Confirm it appears in the DingTalk section within a few seconds without switching to Tasks and back.
  4. Open the new conversation. Confirm its user message and fallback title contain only user-visible content, while the agent still follows the Channel transport instructions. For an image-only message, confirm no hidden instruction text is rendered.
  5. Open a DingTalk Channel editor. Confirm Session scope appears in its own section and an existing configuration without an explicit scope displays Per user and chat.
  6. Select Per thread, save, and reopen the editor. Confirm Per thread remains selected and the Channel can still be managed normally.
  7. Verify active, pinned, archived, searched, and secondary-workspace session results remain scoped to the selected source.
  8. Connect to a daemon without session source metadata support. Confirm the sidebar switch is hidden and the existing unfiltered behavior is unchanged.

Evidence (Before & After)

Before After
Channel conversations were not discoverable in the sidebar, the selected Channels view did not promptly discover externally created conversations, model-facing instructions appeared in user messages and fallback titles, and the Channel editor had no session-routing control. Tasks remains the default catalog; Channels groups conversations into collapsible platform sections and refreshes externally created conversations under their workspace; transcripts and fallback titles show only user-facing content; and manageable Channels expose their effective session scope.

Local validation passed: the full repository build and typecheck, targeted lint, 617 Channel base/daemon bridge tests, 471 ACP bridge tests, 507 CLI Session tests, 123 SessionService tests, 75 current Web Shell sidebar tests, 303 Web Shell app regression tests, 18 transcript replay tests, 43 TUI resume-history tests, and 2 Chromium Channel E2E tests. Earlier scope and catalog coverage also passed 39 Channel settings tests and 82 Web Shell sidebar/editor tests.

Tested on

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

Environment (optional)

Local Web Shell development build with the mock daemon and Chromium.

Risk & Scope

  • Main risk or tradeoff: The Channels catalog polls at the existing active two-second interval while it is selected and the primary project is expanded. The display projection crosses the Channel, daemon, ACP, persistence, replay, title, and UI boundaries; tests verify that the model receives the full prompt, only Channel sessions may supply the projection, and non-Channel metadata cannot spoof it.
  • Not validated / out of scope: Live DingTalk, Feishu, WeCom, GitHub, and GitLab provider round trips were not rerun after the fix; Channel transport behavior, runtime routing algorithms, Session Overview, and Split View are unchanged. Historical records created before this metadata existed cannot safely reconstruct a clean display message.
  • Breaking changes / migration notes: None. Daemons without session source metadata do not show the sidebar switch, unmanageable Channel types do not expose the scope field, and transcripts without display metadata retain their existing fallback behavior.

Linked Issues

N/A

中文说明

本 PR 做了什么

在 Web Shell 项目会话目录上方新增“任务 / 频道”来源切换。“任务”仍是默认视图,“频道”用于展示由钉钉、飞书和企业微信等已配置集成发起的会话。

“频道”保持选中时使用活跃刷新间隔,因此从外部新建的对话无需切换页签即可出现。模型仍会收到完整的 Channel 上下文,而实时消息回显、恢复后的对话记录和侧边栏兜底标题使用独立的用户可见消息,不包含内部 Channel 指令。

Channel 对话会按钉钉、飞书等平台归入可折叠区块。同一平台的多个配置实例会合并到同一区块,置顶对话仍保留在对应平台下,配置已不存在的会话则继续显示在“其他频道”中。

为每个可管理 Channel 新增“会话作用域”设置。用户可以选择按用户和对话、按话题、按对话和话题,或整个频道共享一个会话。现有插件默认值保持有效,包括 GitHub 和 GitLab 使用的“按对话和话题”默认值。

所选侧边栏来源会一致应用于活跃、置顶、已归档、主工作区及次级工作区的会话列表。控件均由能力或管理目录驱动,因此旧版 daemon 会保持现有行为。

为什么需要它

daemon 管理的 Channel 已经会将对话持久化为工作区会话,并标记频道来源,但 Web Shell 侧边栏此前只请求普通任务会话。因此,即使 Channel 会话属于所选工作区,也无法从侧边栏重新打开。加入来源过滤后,空闲刷新间隔仍会导致已选中的“频道”视图保持旧数据,直到用户切换页签。

随着会话目录增长,平铺列表也很难看出每条对话属于哪个集成。按当前工作区的 Channel 配置分组,可以在不改变会话持久化方式的前提下将相关对话归在一起。

Channel 请求会将用户输入、传输指令和上下文元数据组合后发送给模型。此前复用这段模型侧文本进行对话回显和兜底标题生成,会把内部指令显示成用户输入。现在持久化独立的显示文本,在不减少模型上下文的前提下分离两种用途。

Channel 运行时也已经支持可配置的会话路由,但 Web 管理目录只暴露平台凭据和准入策略。用户无法在不手动编辑配置的情况下查看或修改哪些对话共享 Agent 上下文。

Reviewer 测试计划

如何验证

  1. 将 Web Shell 连接到支持会话来源元数据、且同时存在普通任务会话和 Channel 会话的 daemon。确认初始选中“任务”,普通会话可见,Channel 会话不可见。
  2. 选择“频道”。确认 Channel 会话按平台显示在可折叠区块中,两个钉钉配置共用一个钉钉区块,飞书会话单独显示,置顶会话仍位于对应平台区块,无法匹配配置的会话显示在“其他频道”中。
  3. 折叠并重新展开一个平台区块。保持“频道”选中并新建一条钉钉对话,确认它在几秒内自动出现在钉钉区块中,无需切到“任务”再切回来。
  4. 打开新对话。确认用户消息和兜底标题只包含用户可见内容,同时 Agent 仍遵循 Channel 传输指令。对于纯图片消息,确认不会显示隐藏指令文本。
  5. 打开钉钉 Channel 编辑器。确认“会话作用域”显示在独立区块中,且未显式配置作用域的现有实例显示“按用户和对话”。
  6. 选择“按话题”,保存并重新打开编辑器。确认仍选中“按话题”,且 Channel 可以继续正常管理。
  7. 验证活跃、置顶、已归档、搜索结果以及次级工作区会话始终限定为当前选择的来源。
  8. 连接到不支持会话来源元数据的 daemon。确认侧边栏切换控件不显示,现有未过滤行为保持不变。

证据(变更前后)

变更前 变更后
侧边栏无法发现 Channel 对话;已选中的“频道”视图不会及时发现外部新建的对话;模型侧指令会出现在用户消息和兜底标题中;Channel 编辑器也没有会话路由控件。 “任务”仍是默认目录;“频道”会按平台将对话归入可折叠区块,并刷新对应工作区下从外部新建的对话;对话记录和兜底标题只展示用户可见内容;可管理 Channel 会显示其实际会话作用域。

本地验证已通过:全仓构建与类型检查、针对性 lint、617 个 Channel base/daemon bridge 测试、471 个 ACP bridge 测试、507 个 CLI Session 测试、123 个 SessionService 测试、当前 75 个 Web Shell 侧边栏测试、303 个 Web Shell App 回归测试、18 个对话重放测试、43 个 TUI 恢复历史测试,以及 2 个 Chromium Channel E2E 测试。此前的作用域和目录覆盖还通过了 39 个 Channel 设置测试和 82 个 Web Shell 侧边栏/编辑器测试。

测试平台

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

环境(可选)

本地 Web Shell 开发构建、模拟 daemon 和 Chromium。

风险与范围

  • 主要风险或权衡:“频道”被选中且主项目已展开时,会使用现有的两秒活跃轮询间隔。显示文本会经过 Channel、daemon、ACP、持久化、重放、标题和 UI 边界;测试已验证模型收到完整提示词、只有 Channel 会话可以提供显示文本,且非 Channel 元数据无法伪造它。
  • 未验证 / 范围外:修复后未重新执行真实钉钉、飞书、企业微信、GitHub 和 GitLab 提供方的端到端收发;Channel 传输行为、运行时路由算法、Session Overview 和 Split View 保持不变。新增元数据之前产生的历史记录无法安全地还原出干净的显示文本。
  • 破坏性变更 / 迁移说明:无。不支持会话来源元数据的 daemon 不会显示侧边栏切换,不可管理的 Channel 类型不会暴露作用域字段,不含显示元数据的对话记录会保持原有兜底行为。

关联 Issue

@BZ-D

BZ-D commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

E2E Test Report

Environment: macOS, local Web Shell development server, Playwright Chromium, mock daemon.

Command: npx playwright test --config playwright.config.ts client/e2e/web-shell.channels.spec.ts

Verified behaviors:

  • Tasks is selected initially, shows the regular task session, and excludes the channel-created session.
  • Selecting Channels shows the DingTalk-sourced session and excludes the regular task session.
  • A typed channel configuration can still be created and deleted.

Result: 2 passed.

Not covered: live DingTalk, Feishu, or WeCom provider round trips.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

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

Screenshots · before / after

channel-editor-dark before/after

channel-editor-existing-dark before/after

channel-editor-existing-light before/after

channel-editor-light before/after

channel-manager-dark before/after

channel-manager-light before/after

code-review-artifact-dark before/after

code-review-artifact-light before/after

extensions-manager-dark before/after

extensions-manager-light before/after

git-mode-branch-dark before/after

git-mode-branch-light before/after

git-mode-chip-dark before/after

git-mode-chip-light before/after

git-mode-popover-dark before/after

git-mode-popover-light before/after

github-channel-editor-credential-dark before/after

github-channel-editor-credential-light before/after

github-channel-editor-dark before/after

github-channel-editor-light before/after

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

Qwen Code · web-shell visuals

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

@BZ-D
BZ-D requested review from qwen-code-ci-bot and wenshao and removed request for wenshao August 3, 2026 14:38
@BZ-D BZ-D changed the title feat(web-shell): show channel sessions in sidebar feat(web-shell): expose channel sessions in sidebar and settings Aug 3, 2026
@BZ-D

BZ-D commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

E2E Test Report — Channel session scope

Environment: macOS, local Web Shell development server, Playwright Chromium, mock daemon.

Command: npx playwright test --config playwright.config.ts client/e2e/web-shell.channels.spec.ts

Verified behaviors:

  • Tasks is selected initially, shows the regular task session, and excludes the Channel-created session.
  • Selecting Channels shows the DingTalk-sourced session and excludes the regular task session.
  • A new DingTalk Channel defaults to Per user and chat.
  • Selecting Per thread persists sessionScope: "thread" in the Channel upsert request.
  • Reopening the Channel editor displays Per thread, confirming the saved value is restored.
  • The typed Channel configuration can still be deleted.

Result: 2 passed.

Not covered: live DingTalk, Feishu, WeCom, GitHub, or GitLab provider round trips.

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 3, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

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

No response changes against the PR base across 4 scenario(s).

Qwen Code · serve A/B

@BZ-D
BZ-D marked this pull request as ready for review August 3, 2026 15:07
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@BZ-D

BZ-D commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

Follow-up E2E report: Channel refresh and transcript projection

  • Kept the Channels tab selected, inserted a new Channel session through the mock daemon, and confirmed it appeared within five seconds without switching tabs.
  • Confirmed Channel model requests retain the complete transport context while live echo, restored transcripts, and fallback titles use the persisted user-facing text.
  • Confirmed image-only messages do not fall back to hidden text and non-Channel sessions cannot inject Channel display metadata.
  • Chromium Channel E2E: 2/2 passed. Targeted Channel, ACP bridge, CLI Session, SessionService, transcript replay, resume-history, and sidebar suites also passed.

补充 E2E 报告:频道刷新与对话显示文本

  • 保持“频道”页签选中,通过模拟 daemon 新增 Channel 会话,确认它在五秒内自动出现,无需切换页签。
  • 确认发送给模型的 Channel 请求仍保留完整传输上下文,而实时回显、恢复后的对话记录和兜底标题使用持久化的用户可见文本。
  • 确认纯图片消息不会回退显示隐藏文本,非 Channel 会话也无法注入 Channel 显示元数据。
  • Chromium Channel E2E 2/2 通过;针对 Channel、ACP bridge、CLI Session、SessionService、对话重放、恢复历史和侧边栏的测试也全部通过。

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run on @qwen-code /triage — gate re-evaluated against head e961edd (previously 06336a2).

Template looks good ✓

What changed since the last pass: exactly one commit — a merge of origin/main that brought in eight commits. The two that matter for this PR are Goal v3 adoption in ACP sessions (#8732) and prompt-admission ownership hardening (#8955), both of which touch the same Session/bridge surface as the channel work. The merge carried exactly one conflict, in Session.ts — this re-run's focus is that resolution (covered in Stage 2).

Problem: unchanged and still real — the sidebar hard-coded sourceType: 'default' once the daemon advertised session_source_metadata, so Channel-created sessions were invisible in their own workspace; the settings store rejected chat_thread even though the runtime routes it; and reusing the model-facing channel prompt for echo/transcripts/titles leaked internal adapter instructions as if the user had typed them. All three were verified in code on earlier passes; the merge does not alter the motivation.

Direction: aligned, unchanged. The PR exposes capabilities the daemon and channel runtime already have rather than adding a new subsystem, and closes the display leak the new visibility would have introduced. Web Shell channel management is an active roadmap area here.

Size: at this head the diff is ~1,285 production lines vs ~3,576 test lines and ~108 lines of design docs across 66 files — slightly smaller than the last pass now that Goal v3 and the admission hardening live on the main side of the diff. The author holds write access (same-repo branch), so the two-tier core gate's maintainer exemption applies and the 1,000+ production-line count remains an advisory, not an escalation. My honest answer on splitting is unchanged: mostly no — the growth is tests and review-mandated hardening of one feature. The disclosed coordination overlap with #8848 stands (whichever lands second drops its copy).

Approach: unchanged — scope matches the problem. Both controls are capability-gated (older daemons keep today's behavior), every sidebar query path takes the selected source, and the display projection extends the recording service's existing pattern instead of inventing a parallel one. Nothing in the merge alters this.

Risk: packages/cli/src/acp-integration/session/Session.ts remains the high-risk path from this repo's revert-history analysis — and it is now also the file that carried the PR's only merge conflict, so the resolution got focused review in Stage 2. No other elevated signals.

Moving on to code review. 🔍

中文说明

@qwen-code /triage 触发的 re-run——gate 基于 head e961edd 重新评估(上次为 06336a2)。

模板完整 ✓

**上次评估以来的变化:**仅一个提交——合并 origin/main,带入 8 个提交。对本 PR 有实际影响的是两个:ACP 会话采纳 Goal v3(#8732)与 prompt 准入所有权加固(#8955),两者都触及与 channel 工作相同的 Session/bridge 面。本次合并只有一处冲突,位于 Session.ts——该冲突的解决是本次 re-run 的重点(见 Stage 2)。

问题:不变且真实存在——daemon 声明 session_source_metadata 后侧边栏硬编码 sourceType: 'default',Channel 会话在自己的工作区不可见;配置存储拒绝运行时实际支持的 chat_thread;复用模型侧 channel 提示词做回显/记录/标题会泄漏适配器内部指令。三者均已在早前的审查中于代码里核实;合并不改变动机。

方向:对齐,不变。PR 暴露 daemon 与 channel 运行时已有能力而非新增子系统,并修补新可见性本身会引入的展示泄漏。Web Shell channel 管理是本仓库正在推进的方向。

规模:本 head 下 diff 约为 1,285 行生产代码、3,576 行测试、108 行设计文档,共 66 个文件——由于 Goal v3 与准入加固已位于 main 一侧,比上次略小。作者有 write 权限(同仓分支),适用核心模块两级门禁的 maintainer 豁免,1,000+ 生产行数仍为提示而非升级。关于拆分的诚实答案不变:基本不能——增量是测试与评审要求的加固。与 #8848 已披露的协调重叠仍然有效(后合入的一方删除重复部分)。

方案:不变——范围与问题匹配。两个控件均按能力开关,侧边栏所有查询路径都带上所选来源,display 投影复用录制服务已有模式。合并不改变这一点。

风险:packages/cli/src/acp-integration/session/Session.ts 仍是 revert 历史分析中的高风险路径——且现在是唯一承载合并冲突的文件,其解决方案在 Stage 2 中重点审查。无其他升级风险信号。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review (re-run at head e961edd)

This pass covers the delta since the last review: one commit, a merge of origin/main (Goal v3 in ACP sessions #8732, prompt-admission ownership hardening #8955, plus desktop/web-shell work). The merge had exactly one conflict — Session.ts — which is where the PR's display-text recording meets Goal v3's reworked prompt-recording path. I reviewed the resolution against both parents, not just the merged result.

Conflict resolution — verified correct:

  • The merged Session.ts is main's Goal v3 version plus one minimal hunk: extract promptDisplayText from promptMetadata behind a typeof === 'string' guard, then record it as payload metadata — recordUserMessage(promptText, goalTurn?.permit, { displayText, hookContext: '' }) — with priority displayText branch → goalTurn branch → plain, forwarding the Goal permit when present. The call matches the existing recordUserMessage(message, goalContext?, promptPayload?) signature that Goal v3's predecessor work landed in the recording service; nothing in the resolution drops or substitutes the model prompt (promptText stays the recorded content, displayText is display-only metadata).
  • A new Session test at this head pins exactly that separation: _meta: { 'qwen.daemon.promptDisplayText': 'hello' } on an 'internal channel instructions\n\nhello' prompt records the full text as the message and { displayText: 'hello', hookContext: '' } as payload.
  • The trust chain the earlier rounds established composes cleanly with fix(web-shell): Harden prompt admission ownership #8955's hardening: the serve route strips the authorization and display keys from forwarded _meta and re-injects display text only when the worker token is registered for that workspace (isChannelWorkerPromptAuthorized); the bridge strips caller meta and re-arms the trusted value exactly like the existing channelDelivery/modelPrompt pattern; acpAgent honors display meta only when privateParentState === 'trusted' — the same admission-ownership state fix(web-shell): Harden prompt admission ownership #8955 hardened. No layer was weakened by the merge.

Everything else from the prior review stands at this head — I re-checked the load-bearing points rather than trusting the earlier write-up: the sanitizeDisplayText boundary in ChannelBase.processInbound (8,000-code-point cap, bidi/zero-width/C0 neutralization), QQ slash detection on all-mentions-stripped input, the echo traversal-cap substitution, preview/resume/title sinks reading the recorded projection, the per-source sidebar latches and unread tracking, and the sessionScope catalog/editor path. The other overlap surfaces (MessageEmitter, acpAgent, web-shell App.tsx, DaemonSessionProvider, transcript-replay) auto-merged; the PR's diff against them at this head is exactly the previously reviewed logic.

What I did not find: correctness or security regressions introduced by the merge resolution, or scope creep beyond the disclosed #8848 overlap.

Standing, non-blocking notes (unchanged from prior passes, none load-bearing): test-efficacy gaps on a few guards, the channel-worker authorization wire key duplicated as two string literals instead of a pinned cross-package constant, sanitizePromptText still shaping some adapter display projections where sanitizeDisplayText semantics would fit better, and the channels e2e spec still untagged @smoke so PR CI's browser leg skips it (scheduled full e2e runs it).

sequenceDiagram
    participant P1 as Channel adapter
    participant P2 as ChannelBase
    participant P3 as Agent bridge
    participant P4 as Daemon prompt route
    participant P5 as Session and recording
    participant P6 as Web Shell sinks
    P1->>P2: envelope with text and optional displayText
    P2->>P2: sanitize raw fallback at projection boundary
    P2->>P3: full model text plus displayText
    P3->>P4: ACP meta with display text and worker token
    P4->>P4: strip meta, keep only workspace-authorized text
    P4->>P5: trusted prompt context only
    P5->>P5: record model text and displayText separately
    P5->>P6: transcript echo, titles, session previews
Loading
Files changed (24 of 66 shown)
File What changed
packages/channels/base/src/ChannelBase.ts Display projection computed and sanitized at the inbound boundary, threaded through buffering and coalescing
packages/channels/base/src/sanitize.ts New sanitizeDisplayText for human-facing sinks
packages/channels/base/src/DaemonChannelBridge.ts Carries displayText and worker authorization in prompt meta, deleteSessionData hook
packages/channels/base/src/AcpBridge.ts Private-parent capability handshake, displayText forwarding for standalone bridges
packages/channels/base/src/ChannelWebhookTask.ts Webhook display projection mirroring the model-prompt caps
packages/channels/github/src/GithubAdapter.ts Sanitized displayText for review/issue/comment-aggregate envelopes
packages/channels/qqbot/src/QQChannel.ts Display text keeps non-bot mentions, slash detection restored
packages/acp-bridge/src/bridge.ts Single-source display gate, projected echo and pending-entry text, re-arm strip
packages/cli/src/serve/routes/session.ts Strips display and auth meta, forwards only workspace-authorized display text
packages/cli/src/serve/channel-worker-prompt-authorization.ts Process-local worker-token registry
packages/cli/src/serve/channel-worker-supervisor.ts Registers and revokes the worker token across the spawn lifecycle
packages/cli/src/acp-integration/acpAgent.ts Honors display meta only for trusted parents
packages/cli/src/acp-integration/session/Session.ts Records displayText alongside the model prompt (the one merge conflict, resolved on top of Goal v3)
packages/cli/src/commands/channel/channel-registry.ts sessionScope descriptor injection and validation
packages/cli/src/commands/channel/daemon-worker.ts Wires promptAuthorization and permanent session deletion
packages/cli/src/serve/channel-settings-store.ts Accepts chat_thread scope
packages/cli/src/ui/commands/renameCommand.ts Auto-title uses projection, filters rename and tag commands
packages/core/src/services/chatRecordingService.ts Tracks bounded per-turn display texts, trims on rewind
packages/core/src/services/sessionService.ts Session-list previews prefer displayText, code-point truncation
packages/core/src/services/sessionTitle.ts Forward projection mode for title generation
packages/web-shell/client/components/sidebar/WebShellSidebar.tsx Tasks/Channels switch, per-source state, grouping render, poll cadence
packages/web-shell/client/components/sidebar/WorkspaceSection.tsx Per-workspace channel grouping and catalog polling
packages/web-shell/client/components/sidebar/channelSessionGroups.ts Platform grouping helper with fallback ordering
packages/web-shell/client/components/channels/ChannelEditorDialog.tsx Session scope section with i18n and plugin defaults

…and 42 more files (tests, wire-key pins, design docs, i18n, e2e spec and fixtures)

Testing

Unattended CI run — I do not build or execute PR code here; the evidence below is the PR's own CI at the reviewed head, fetched through the API, plus the static review above.

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Serve A/B (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
SDK Java / Real daemon E2E (Java 11–21) ✅ success
Integration Tests (CLI, No Sandbox) ⏭️ skipped (merge-queue-only by design)
Test (macos/windows-latest, Node 22.x) ⏭️ skipped (merge-queue-only by design)
review-pr 🔄 in progress (bot orchestration, not a PR gate)

All four pull_request-event workflow runs at this head completed green — the merge of Goal v3 and the admission hardening did not break anything the PR depends on. The three skipped legs are repo policy, not a gap in this PR: ci.yml runs the macOS/Windows unit legs and the CLI integration leg only in the merge queue ("ubuntu is the fast PR signal"), so they report skipped on every PR event now. (Earlier runs in this PR's history predate that policy, which is why prior tables showed them executing.)

Independent of CI: maintainer wenshao ran a three-arm local verification on an earlier head (PR head / merge-base "before" / capability-removed) with real qwen serve daemons, real channel workers against fake GitHub/GitLab APIs, a recording model server, and Playwright — all eight Reviewer Test Plan steps passed — and has since approved the current head e961edd. Attributed as the maintainer's own run; the only delta since is the main merge reviewed above. Not verified by anyone: live DingTalk/Feishu/WeCom provider round trips (no credentials), as the PR itself discloses.

Sandboxed verification would settle what CI cannot: @qwen-code /verify — the display-projection and worker-authorization boundary is pinned by unit tests, but the browser-level channels flow is not exercised by PR CI because the new spec is not @smoke-tagged; an A/B run would prove the wire behavior load-bearing on CI infrastructure, and tagging the spec (or widening the smoke job) is the repo-side fix for the browser leg.

中文说明

代码审查(re-run,head e961edd

本轮覆盖上次审查以来的增量:一个提交,即合并 origin/main(ACP 会话采纳 Goal v3 #8732、prompt 准入所有权加固 #8955,以及 desktop/web-shell 工作)。该合并只有一处冲突——Session.ts——即 PR 的 display-text 记录与 Goal v3 重构后的 prompt 记录路径交汇处。我对照两个父提交审查了解决方案,而不是只看合并结果。

冲突解决——核实正确:

  • 合并后的 Session.ts 是 main 的 Goal v3 版本加一个最小补丁:以 typeof === 'string' 守卫从 promptMetadata 提取 promptDisplayText,然后作为载荷元数据记录——recordUserMessage(promptText, goalTurn?.permit, { displayText, hookContext: '' })——优先级为 displayText 分支 → goalTurn 分支 → 普通分支,存在时透传 Goal permit。调用与 Goal v3 前置工作落在录制服务中的既有 recordUserMessage(message, goalContext?, promptPayload?) 签名完全匹配;解决方案没有丢弃或替换模型提示词(promptText 仍是被记录内容,displayText 仅为展示元数据)。
  • 本 head 新增的 Session 测试恰好固定了这种分离:对 'internal channel instructions\n\nhello' 提示词携带 _meta: { 'qwen.daemon.promptDisplayText': 'hello' } 时,完整文本被记录为消息,{ displayText: 'hello', hookContext: '' } 被记录为载荷。
  • 早前各轮建立的信任链与 fix(web-shell): Harden prompt admission ownership #8955 的加固干净地组合:serve 路由剥离转发 _meta 中的授权键与 display 键,仅当 worker 令牌已在该工作区注册时重新注入 display 文本;bridge 剥离调用方元数据并像既有 channelDelivery/modelPrompt 模式一样重新装填受信值;acpAgent 仅在 privateParentState === 'trusted' 时接受 display 元数据——正是 fix(web-shell): Harden prompt admission ownership #8955 加固的准入所有权状态。合并没有削弱任何一层。

上次审查的其余结论在本 head 依然成立——我复查了关键承重点而不是照抄上一轮记录:ChannelBase.processInboundsanitizeDisplayText 边界(8,000 码点上限、bidi/零宽/C0 中和)、QQ 斜杠检测基于剥离全部 mention 的输入、回显遍历上限替换、预览/恢复/标题各展示面读取记录的投影、按来源的侧边栏锁与未读跟踪、sessionScope 目录/编辑器路径。其余重叠面(MessageEmitteracpAgent、web-shell App.tsxDaemonSessionProvidertranscript-replay)为自动合并;本 head 下 PR 对它们的 diff 与此前审查的逻辑完全一致。

**未发现:**合并解决引入的正确性或安全回归,或超出已披露 #8848 重叠之外的范围蔓延。

长期、非阻塞备注(与此前各轮相同,均不影响主路径):若干防护的测试效力缺口、channel-worker 授权 wire key 以两份字符串字面量重复而非固定为跨包常量、部分适配器 display 投影仍用 sanitizePromptTextsanitizeDisplayText 语义更合适、channels e2e 用例仍未标记 @smoke 因此 PR CI 浏览器环节跳过它(定时全量 e2e 会执行)。

测试

无人值守 CI 运行——此处不构建、不执行 PR 代码;以下证据是通过 API 获取的本 head 下 PR 自身 CI 结果,加上上面的静态审查。

本 head 下所有四个 pull_request 事件的工作流运行全部绿——Goal v3 与准入加固的合并没有破坏 PR 依赖的任何东西。三个跳过的环节是仓库策略而非本 PR 的缺口:ci.yml 现在只在合并队列中运行 macOS/Windows 单测环节与 CLI 集成环节("ubuntu 是 PR 快速信号"),因此每个 PR 事件下它们报告 skipped。(本 PR 历史上更早的运行早于该策略,所以此前的表格里它们还在执行。)

CI 之外:维护者 wenshao 曾在较早 head 上完成三臂本地验证(PR head / merge-base「变更前」/ 删除门控能力),使用真实 qwen serve daemon、指向伪 GitHub/GitLab API 的真实 channel worker、录制式模型服务器与 Playwright——Reviewer 测试计划全部 8 步通过——此后已批准当前 head e961edd。归属为维护者本人的运行;其后唯一增量是上面审查的 main 合并。任何人都未验证:真实钉钉/飞书/企微提供方往返(无凭据),PR 本身也已披露。

沙箱验证可以补足 CI 无法覆盖的部分:@qwen-code /verify——display 投影与 worker 授权边界已有单测固定,但浏览器级 channels 流程因新用例未标记 @smoke 而不在 PR CI 中执行;A/B 运行可在 CI 基础设施上证明 wire 行为确实 load-bearing,浏览器环节的仓库侧修复是给用例加 @smoke 标记(或放宽 smoke job 范围)。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the only thing that happened since the last clean pass is a main merge, and its single conflict (the one file I would have worried about) resolves correctly on top of Goal v3 with a test pinning the separation; CI is green at the new head and a maintainer already approved it. The remaining residue is the same suggestion-level follow-ups as before, not doubt about the code.

Stepping back: this re-run was narrow by design — one merge commit since the reviewed head, no new author feature code. The merge pulled in Goal v3 (#8732) and the prompt-admission hardening (#8955), both touching the same surface as this PR, and produced exactly one conflict, in Session.ts. I read the resolution against both parents: it is main's Goal v3 recording path plus the PR's minimal display-text branch layered on top — goalTurn?.permit forwarded, model prompt untouched, display text as payload metadata, matching the recorder signature that already landed in core. The trust chain (serve-route worker authorization → bridge re-arm → trusted-parent gate in acpAgent) composes with #8955's hardening rather than fighting it, and the new Session test pins the exact recorded shape. My independent proposal for this problem from the first pass remains what landed; nothing in the merge changed that assessment.

What keeps this at 4 rather than 5 — all non-blocking, unchanged from the prior pass:

  • The suggestion-level threads the autofix critical-only mode left open (test-efficacy gaps on a few guards, the duplicated authorization wire-key literal, display-sanitizer consistency) deserve a human follow-up pass before or shortly after merge.
  • The browser-level channels spec is still not @smoke-tagged, so PR CI never runs it (the scheduled full e2e does). Repo-side fix, not a PR defect.
  • The channel-editor slice overlaps feat(web-shell): redesign Channel policy and workspace management #8848 by design — whoever lands second must drop their copy; keep the coordination note attached at merge time.

Verdict: approve. All four PR CI workflow runs at the reviewed head completed green (no pending legs — the skipped macOS/Windows/integration jobs are merge-queue-only by repo policy), maintainer @wenshao has already approved this exact head, and the prior bot approval was dismissed by the merge push, so a fresh approval pinned to the reviewed commit follows this comment.

中文说明

信心:4/5 —— 自上次干净评估以来唯一发生的事是一次 main 合并,而它仅有的冲突(恰是我会担心的那个文件)在 Goal v3 之上解决正确,并有测试固定分离行为;新 head 下 CI 全绿,维护者已批准。剩余问题与此前相同,都是 Suggestion 级跟进项,而不是对代码的疑虑。

整体来看:本次 re-run 范围本就收敛——被审查 head 之后只有一个合并提交,没有作者的新 feature 代码。合并带入了 Goal v3(#8732)与 prompt 准入加固(#8955),两者都触及与本 PR 相同的面,并产生了唯一一处冲突,位于 Session.ts。我对照两个父提交阅读了解决方案:它是 main 的 Goal v3 记录路径,加上 PR 最小的 display-text 分支叠加其上——透传 goalTurn?.permit,模型提示词不变,display 文本作为载荷元数据,与已落在 core 的录制器签名匹配。信任链(serve 路由 worker 授权 → bridge 重新装填 → acpAgent 受信父进程门控)与 #8955 的加固是组合而非互斥,新增的 Session 测试固定了被记录的确切形状。我从首轮起对该问题的独立设想与最终落地一致;合并不改变这一判断。

扣 1 分的原因——均非阻塞,与上次相同:

  • autofix 仅处理 Critical 模式留下的 Suggestion 级线程(若干防护的测试效力缺口、重复的授权 wire-key 字面量、display 消毒器一致性)值得在合入前或合入后尽快做一轮人工跟进。
  • 浏览器级 channels 用例仍未标记 @smoke,PR CI 从不执行它(定时全量 e2e 会执行)。仓库侧修复,不是 PR 缺陷。
  • channel 编辑器部分与 feat(web-shell): redesign Channel policy and workspace management #8848 按设计重叠——后合入的一方必须删除重复部分;合并时请保留该协调说明。

结论:批准。本 head 下所有四个 PR CI 工作流运行全部绿(无待决环节——跳过的 macOS/Windows/集成任务按仓库策略仅在合并队列运行),维护者 @wenshao 已批准同一 head,而此前的 bot 批准已被合并推送 dismiss,因此本条评论之后将提交固定到被审查提交的新批准。

Qwen Code · qwen3.8-max

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

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 3, 2026
@BZ-D

BZ-D commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

E2E test report: Channel platform grouping

Verified locally on macOS with the Web Shell mock daemon and Chromium.

  • Channel conversations are grouped by platform type.
  • Multiple DingTalk instances share one DingTalk section.
  • Feishu remains in its own section.
  • Pinned conversations remain inside their platform section.
  • Sessions without matching Channel configuration remain visible under Other channels.
  • Platform sections collapse and expand normally.
  • A conversation created while Channels is selected appears on the active refresh interval and lands in the correct platform section.
  • The existing Channel configuration create/delete flow still passes.

Validation: 75/75 targeted sidebar tests, 303/303 Web Shell app regression tests, 2/2 Chromium Channel E2E tests, full repository build and typecheck, targeted ESLint, and git diff --check.

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 3, 2026

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

中文说明

未审查: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.21.3)

Comment thread packages/channels/base/src/ChannelBase.ts Outdated
Comment thread packages/channels/base/src/ChannelBase.ts Outdated
Comment thread packages/acp-bridge/src/bridge.ts Outdated
Comment thread packages/channels/base/src/ChannelBase.ts Outdated
Comment thread packages/web-shell/client/components/sidebar/WebShellSidebar.tsx
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx
Comment thread packages/web-shell/client/components/sidebar/channelSessionGroups.test.ts Outdated
…l-sessions

# Conflicts:
#	packages/acp-bridge/src/bridge.test.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round summary — PR #8457

Feedback triage

Critical-only mode is active (after five change-producing rounds). This round's actionable sections were empty: no reviews, no inline comments, no issue-level comments, no failed checks, and no still-red checks. The Deferred non-Critical feedback section is an audit record only — per the mode rules, no code was modified, no threads were resolved, and no replies were written for those items.

There was nothing to decline, defer, or escalate: no findings of any kind arrived this round.

Base-conflict resolution (--conflict true)

Merged origin/main (7 commits ahead) into the PR branch. Five files were changed on both sides of the merge base; four auto-merged and one had a single content conflict.

  • packages/acp-bridge/src/bridge.test.ts — the only conflict. Both branches independently added historyReplay: 'response' to the same loadSession call in the transport-failure test (main via test(acp-bridge): request response-mode replay in the transport-failure test #8984, this PR in round 9), and main additionally added a comment explaining why historyPageSize requires response-mode replay (fix(serve): Keep restore request shapes distinct #8933). Resolution: kept main's comment together with the shared code line — the union of both sides, nothing dropped.
  • Auto-merged both-sides files verified by diffing the merge result against each parent: packages/cli/src/serve/routes/session.ts keeps this PR's trusted display-text forwarding and main's request-abort signal propagation (feat(serve): Propagate session list cancellation #8954); packages/core/src/services/sessionService.ts keeps this PR's display-text prompt extraction and main's cancellable listSessions scan; packages/cli/src/serve/server.test.ts and packages/core/src/services/sessionService.test.ts keep both sides' added tests.

Merge commit: 0aea2482f1 Merge remote-tracking branch 'origin/main' into feat/web-shell-channel-sessions (pre-commit hook passed).

Environment note: the runner's /tmp tmpfs had exhausted its inodes (100% used by stale temp files), so Vitest runs used a TMPDIR redirected into the checkout (locally git-excluded via .git/info/exclude; not committed). No source or test file outside the merge was modified.

Verification

Each command below was actually run on the merged tree, in this order:

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest packages/acp-bridge src/bridge.test.ts (conflict file) — 575 passed
  • vitest packages/core (sessionService, sessionTitle, worktreeSessionService, chatRecordingService + autoTitle, jsonl-utils, runtimeStatus) — 7 files, 331 passed
  • vitest packages/cli (serve: server, persisted-session-list-cache, channel-settings-store, channel-worker-supervisor, acp-http/transport) — 1406 passed, 0 failed, 1 skipped
  • vitest packages/cli (channel registry/builtins, daemon-worker, display-text-wire-key, memory-intent-classifier, private-parent-capability-wire-key, renameCommand, resumeHistoryUtils, compose-review, acpAgent, acp Session) — 11 files, 1416 passed
  • vitest packages/web-shell (App, AddWorkspaceDialog) — 2 files, 420 passed
  • vitest packages/webui (DaemonSessionProvider, actions) — 2 files, 332 passed
  • vitest packages/sdk-typescript (DaemonSessionClient) — 57 passed
  • vitest packages/channels/base (AcpBridge, ChannelBase, DaemonChannelBridge, sanitize) — 4 files, 722 passed
  • vitest packages/core (openaiContentGenerator converter, provider/default) — 2 files, 249 passed

No settings source changed in this PR, so npm run generate:settings-schema was not required.

中文说明

Autofix 审查轮次总结 — PR #8457

反馈分诊

当前处于仅处理 Critical 的模式(已完成 5 个产生改动的轮次)。本轮可执行区域为空:没有审查意见、没有行内评论、没有 issue 级评论、没有失败的检查,也没有持续红色的检查。Deferred non-Critical feedback(已延后的非 Critical 反馈)部分仅为审计记录——按照该模式规则,未修改任何代码、未解决任何线程、也未就这些条目撰写任何回复。

本轮没有需要拒绝、延后或升级的条目:完全没有收到任何发现。

基础分支冲突解决(--conflict true

origin/main(领先 7 个提交)合并进 PR 分支。合并基线两侧各有改动的文件共 5 个,其中 4 个自动合并成功,1 个存在单处内容冲突。

  • packages/acp-bridge/src/bridge.test.ts — 唯一冲突。两个分支各自独立地在同一个传输失败测试的同一处 loadSession 调用中添加了 historyReplay: 'response'(main 侧来自 test(acp-bridge): request response-mode replay in the transport-failure test #8984,本 PR 在第 9 轮添加),且 main 侧额外增加了一段注释,解释 historyPageSize 为何必须配合 response 模式回放(fix(serve): Keep restore request shapes distinct #8933)。解决方式:保留 main 的注释及双方共有的代码行——取两侧之并集,未丢弃任何内容。
  • 对自动合并的两侧共有文件,已通过将合并结果分别与两个父提交对比 diff 来验证:packages/cli/src/serve/routes/session.ts 同时保留了本 PR 的可信 display-text 转发与 main 的请求中止信号传播(feat(serve): Propagate session list cancellation #8954);packages/core/src/services/sessionService.ts 同时保留了本 PR 的 display-text 提示词提取与 main 的可取消 listSessions 扫描;packages/cli/src/serve/server.test.tspackages/core/src/services/sessionService.test.ts 保留了双方各自新增的测试。

合并提交:0aea2482f1 Merge remote-tracking branch 'origin/main' into feat/web-shell-channel-sessions(pre-commit 钩子通过)。

环境说明:Runner 的 /tmp tmpfs inode 已耗尽(100% 被陈旧临时文件占用),因此 Vitest 运行改用了重定向到代码检出目录内的 TMPDIR(通过 .git/info/exclude 在本地排除,未提交)。除合并本身外,未修改任何源码或测试文件。

验证

以下每条命令均在合并后的代码树上实际执行,顺序如下:

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest packages/acp-bridge src/bridge.test.ts(冲突文件)— 575 个测试通过
  • vitest packages/core(sessionService、sessionTitle、worktreeSessionService、chatRecordingService + autoTitle、jsonl-utils、runtimeStatus)— 7 个文件,331 个测试通过
  • vitest packages/cli(serve:server、persisted-session-list-cache、channel-settings-store、channel-worker-supervisor、acp-http/transport)— 1406 个测试通过,0 失败,1 跳过
  • vitest packages/cli(channel registry/builtins、daemon-worker、display-text-wire-key、memory-intent-classifier、private-parent-capability-wire-key、renameCommand、resumeHistoryUtils、compose-review、acpAgent、acp Session)— 11 个文件,1416 个测试通过
  • vitest packages/web-shell(App、AddWorkspaceDialog)— 2 个文件,420 个测试通过
  • vitest packages/webui(DaemonSessionProvider、actions)— 2 个文件,332 个测试通过
  • vitest packages/sdk-typescript(DaemonSessionClient)— 57 个测试通过
  • vitest packages/channels/base(AcpBridge、ChannelBase、DaemonChannelBridge、sanitize)— 4 个文件,722 个测试通过
  • vitest packages/core(openaiContentGenerator converter、provider/default)— 2 个文件,249 个测试通过

本 PR 未改动任何 settings 源文件,因此无需执行 npm run generate:settings-schema

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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

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


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

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 12, 2026
@wenshao

wenshao commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Independent local verification — real daemon, real channel workers, real browser

I rebuilt this PR locally and ran it end to end against live qwen serve daemons with real channel workers driving real conversations, plus a merge-base "before" arm and a third arm with the gating capability removed. All eight steps of the Reviewer Test Plan reproduce. I found no functional defect. Two small observations are noted below for the author's judgement; neither blocks merge.

Verified at head 0aea248 (merge-base 1570e6c).

How it was verified

Three independent stacks, each a daemon started from that tree's own source, each serving its own packages/web-shell/dist built from the same tree. No mock daemon, no vite dev server, no hand-written fixtures for the channel catalog.

Arm Tree Purpose
head PR 0aea248 The feature under test
base merge-base 1570e6c "Before" behaviour
nocap PR 0aea248 with session_source_metadata deleted from packages/cli/src/serve/capabilities.ts PR frontend against a daemon that cannot support the switch

Channel conversations were produced by real channel workers (qwen serve --channel all), four configured instances: three GitHub and one GitLab. Both adapters read their API root from their own baseUrl config field, so each instance was pointed at a local fake GitHub / GitLab REST API that records every request. The model is a recording OpenAI-compatible server, which lets me assert separately on what the model received and what the transcript shows. The auto-title model echoes back the conversation text it was given, so every session title in the screenshots is literal evidence of what reached the title generator (hence the TITLESAW marker). Browser driving is Playwright Chromium against the daemon-served UI.

Substitution, stated up front: DingTalk, Feishu and WeCom hardcode their API hosts, so I could not run their transports without live credentials. Grouping is decided purely by each session's sourceId → the instance's config.type → the catalog's displayName, so three GitHub instances plus one GitLab instance exercise byte-for-byte the same code path as two DingTalk instances plus one Feishu. The DingTalk editor itself was exercised for real, against a DingTalk instance in the live daemon catalog.

Reviewer Test Plan results

# Step Result
1 Tasks selected initially, regular session visible, Channel session absent Pass. Initial requests carry sourceType=default; the four channel conversations are absent from Tasks.
2 Channels groups into collapsible platform sections; instances of one platform share a section; other platform separate; pinned stays in section; unmatched under Other channels Pass. Three GitHub instances collapse into one GitHub · 3 section, GitLab is separate, and after deleting the gh-retired instance its conversation moved to Other channels about one second later. Pinning a GitHub conversation moved it to the top of the GitHub section rather than into a separate pinned block, and it did not appear under Tasks.
3 Collapse/expand; a new conversation appears within seconds without switching tabs Pass. Injecting a new GitHub notification while the Channels tab was open surfaced the new conversation in 4.0 s measured from injection. The channel's own poll interval was 3 s, so the sidebar contributed roughly a second of that.
4 New conversation shows only user-visible content; agent still follows the transport instructions Pass, and this is the sharpest result of the run. Same conversation, same wire surface, two arms:
5 DingTalk editor shows Session scope in its own section; legacy config shows Per user and chat Pass. A DingTalk instance configured without any sessionScope renders a dedicated SESSION section defaulting to Per user and chat.
6 Select Per thread, save, reopen — still Per thread, channel still manageable Pass. After saving, <workspace>/.qwen/settings.json contains "sessionScope": "thread" and the reopened editor shows Per thread.
7 Active, pinned, archived, searched and secondary-workspace lists stay scoped to the source Pass. Active and archived requests both carry sourceType=channel while Channels is selected (…&archiveState=archived&view=organized&group=all&sourceType=channel). Pinned is intentionally not requested separately in the Channels view; pinned channel conversations render inline in their platform section.
8 Daemon without session source metadata: switch hidden, existing behaviour unchanged Pass. With the capability removed the switch is absent and the PR frontend drops sourceType from its session queries entirely, falling back to the old unfiltered request.

For step 4, the recorded user message on the same GitHub conversation:

base (merge-base)
  "GitHub publication policy:\n- Your final response is published verbatim as a public
   GitHub issue/PR comment.\n- Do not use gh, curl, or the GitHub API to create, edit,
   delete, or review GitHub content. ... [alice] Triage this issue and respond with the
   next action.\n\nType: Issue | Title: Payment webhook retries never stop | URL: ..."

head (this PR)
  "Issue assigned: Payment webhook retries never stop"

The leak was not limited to the transcript. On the base arm the auto-generated session titles were derived from that same model-facing text, so the sidebar would have read …tool transcripts, or private operational details in the final response. - Treat all GitHub issue, PR…. On head the same sessions title as Issue assigned: <issue title>.

Meanwhile the model still receives everything: the recorded request to the model on the head arm contains the full GitHub publication policy, the [alice] Triage this issue… instruction, the trigger guidance and the issue metadata. Nothing was removed from the model's context.

The ChannelBase fallback also holds for adapters that never set displayText: the GitLab conversation's transcript on head is the plain issue description, while on base its title carried the sender prefix and the interpolated action_prompt_template metadata.

The authorization boundary is load-bearing

The PR claims only an authenticated channel worker can supply the display projection. I tested that directly against the running daemon by replaying the same HTTP prompt three ways:

Request Result
Channel session, _meta display text + a guessed authorization token Projection dropped — transcript shows the real prompt text
Channel session, same body with the real per-launch worker token (read out of the worker's process environment) Projection accepted
Non-channel (default) session, same body with the real token Projection dropped — transcript shows the real prompt text

Only the token value differs between rows 1 and 2, so the gate is exactly what does the work; row 3 confirms the additional sourceType === 'channel' requirement. The token is a fresh randomUUID() per worker launch, registered and revoked with the worker's lifecycle, not a fixed constant.

Two observations for your judgement

1. The Channels tab costs three requests per tick, not one. Measured over 30 idle seconds with the project expanded:

Tab …/sessions …/channels …/channel-types /capabilities
Tasks 1 0 0 1
Channels 15 15 15 15

The 15 session polls are the intended 2 s cadence that the PR's risk section already discloses. The extra /capabilities count correlates exactly with the same tick, so each catalog reload appears to re-resolve the channel_management capability rather than reuse the connection's known capability set. Caching that would cut the added traffic by a third for free. Nothing here is incorrect, just more chatty than the risk note implies.

2. Other channels sorts by first-seen session, not last. Because groups are emitted in session iteration order, the fallback section can land between two real platforms — I saw GitHub, Other channels, GitLab. Pinning the fallback group to the end would read more naturally. Purely cosmetic.

Separately, and pre-existing rather than caused by this PR: a legacy channel config that predates the access-policy field cannot be saved from the editor without also choosing an access policy, because that field is required. It surfaces here only because editing a legacy config is now a normal thing to do in order to set the session scope.

Not covered

  • Live DingTalk / Feishu / WeCom / GitHub / GitLab provider round trips (no credentials; local fake API roots were used instead, as described above).
  • The image-only channel message case in step 4 — the GitHub adapter has no path that produces an attachment-only envelope, so the displayText === '' branch was not exercised in the live stack. It is covered by unit tests.
  • Secondary-workspace behaviour was reviewed in code and in the request shapes but not run with a second workspace mounted.

Local test and build results

Everything below was run on the PR tree.

Suite Result
packages/channels/base 19 files, 1028 tests passed
packages/acp-bridge 26 files, 1284 tests passed
packages/cli (channel, serve, Session, acpAgent, rename, resume-history) 25 files, 1530 tests passed
packages/core (chatRecordingService, autoTitle, sessionService, sessionTitle) 4 files, 258 tests passed
packages/web-shell (sidebar + channels) 15 files, 205 tests passed
packages/channels/github 2 files, 207 tests passed
packages/channels/qqbot events 1 file, 88 tests passed
Total 4600 tests passed, 0 failures

npm run build completed cleanly on both the PR tree and the merge-base tree.

One thing worth confirming while reading the code: the real daemon catalog agrees with the design doc, which is where hand-written fixtures usually drift. GET /workspace/channel-types on the live daemon returns sessionScope on exactly the four manageable types, with user as the default for DingTalk, WeCom and Feishu, chat_thread for GitHub and GitLab, and all four scope options on each — and no sessionScope field on the non-manageable types (Telegram, WeChat, QQ).

Evidence

Tasks selected — channel conversations absent Channels selected — grouped by platform

A channel conversation opened from the sidebar — the user message is the display projection only:

Before (merge-base): no switch, channel conversations unreachable Daemon without session_source_metadata: switch hidden
Legacy DingTalk config → Per user and chat After saving Per thread and reopening

Verdict from my side: the behaviour claimed in the description is what the code actually does, the backward-compatibility gate works in both directions, and the display-projection trust boundary resists forgery. I'm comfortable with this merging.

中文版本

本地独立验证 —— 真实 daemon、真实 Channel worker、真实浏览器

我在本地重新构建了这个 PR,并在真实的 qwen serve daemon 上做了端到端验证:真实的 Channel worker 产生真实的对话,另外还起了 merge-base 的「变更前」对照,以及一个删掉门控能力的第三套环境。Reviewer 测试计划的 8 个步骤全部复现通过,没有发现功能缺陷。下面记录两点供作者自行判断的观察,都不阻塞合并。

验证的 head 是 0aea248,merge-base 是 1570e6c

怎么验的

三套互相独立的栈,每套的 daemon 都从各自源码启动,Web Shell 也由各自 daemon 提供、由同一棵树构建。没有用 mock daemon,没有用 vite dev server,Channel 目录也不是手写 fixture。

环境 代码 用途
head PR 0aea248 被测功能
base merge-base 1570e6c 变更前行为
nocap PR 0aea248,但从 packages/cli/src/serve/capabilities.ts 删掉 session_source_metadata PR 前端连接不支持该能力的 daemon

Channel 对话来自真实的 Channel workerqwen serve --channel all),共配置 4 个实例:3 个 GitHub、1 个 GitLab。这两个适配器的 API 根地址都来自自身的 baseUrl 配置项,因此每个实例都指向一个会记录全部请求的本地伪 GitHub / GitLab REST API。模型侧是一个记录型 OpenAI 兼容服务,这样可以分别断言「模型收到了什么」和「转录里显示了什么」。自动标题模型会把收到的对话文本原样回显,所以截图里每条会话标题都是标题生成器实际所见内容的直接证据(TITLESAW 标记即来源于此)。浏览器侧用 Playwright Chromium 直接访问 daemon 提供的 UI。

需要事先说明的替代: 钉钉、飞书、企业微信的 API 域名是写死的,没有真实凭据就跑不起来它们的传输层。分组完全由会话的 sourceId → 实例的 config.type → 目录的 displayName 决定,因此「3 个 GitHub + 1 个 GitLab」走的代码路径与「2 个钉钉 + 1 个飞书」完全一致。钉钉编辑器本身是真实验证的,对应的是真实 daemon 目录中的一个钉钉实例。

测试计划验证结果

# 步骤 结果
1 初始选中「任务」,普通会话可见,Channel 会话不可见 通过。 初始请求带 sourceType=default,4 条 Channel 对话都不在「任务」中。
2 「频道」按平台分组、可折叠;同平台多实例合并;异平台分开;置顶留在本区块;无配置的进「其他频道」 通过。 3 个 GitHub 实例合并成一个 GitHub · 3 区块,GitLab 独立;删除 gh-retired 实例后约 1 秒,它的对话就移到了 Other channels。置顶一条 GitHub 对话后,它移到 GitHub 区块顶部而不是独立的置顶块,并且不会出现在「任务」下。
3 折叠/展开;新对话数秒内自动出现,无需切页签 通过。 在「频道」页签打开的状态下注入新的 GitHub 通知,从注入到出现实测 4.0 秒。该频道自身轮询间隔为 3 秒,所以侧边栏只贡献了大约 1 秒。
4 新对话只显示用户可见内容;Agent 仍遵循传输指令 通过,这也是本次验证中最锐利的一条结论。同一条对话、同一处线协议,两个环境对比:
5 钉钉编辑器中「会话作用域」在独立区块;未显式配置时显示「按用户和对话」 通过。 未配置 sessionScope 的钉钉实例会渲染独立的 SESSION 区块,默认值为 Per user and chat
6 选「按话题」保存后重开仍是「按话题」,且频道可正常管理 通过。 保存后 <workspace>/.qwen/settings.json 中出现 "sessionScope": "thread",重新打开编辑器显示 Per thread
7 活跃、置顶、归档、搜索、次级工作区都限定在当前来源 通过。 选中「频道」时,活跃和归档请求都带 sourceType=channel…&archiveState=archived&view=organized&group=all&sourceType=channel)。「频道」视图下有意不单独请求置顶列表,置顶的 Channel 对话直接内联在所属平台区块中。
8 不支持会话来源元数据的 daemon:切换控件隐藏,原有行为不变 通过。 移除该能力后不仅控件消失,PR 前端还会把 sourceType 从会话查询中整个去掉,退回旧的未过滤请求。

第 4 步中,同一条 GitHub 对话记录下来的用户消息:

base(merge-base)
  "GitHub publication policy:\n- Your final response is published verbatim as a public
   GitHub issue/PR comment.\n- Do not use gh, curl, or the GitHub API to create, edit,
   delete, or review GitHub content. ... [alice] Triage this issue and respond with the
   next action.\n\nType: Issue | Title: Payment webhook retries never stop | URL: ..."

head(本 PR)
  "Issue assigned: Payment webhook retries never stop"

泄漏不止于转录。base 环境下自动生成的会话标题同样来自这段模型侧文本,侧边栏会显示成 …tool transcripts, or private operational details in the final response. - Treat all GitHub issue, PR…;head 上同一批会话的标题是 Issue assigned: <issue 标题>

与此同时模型收到的内容没有减少:head 环境记录到的模型请求里,完整包含 GitHub publication policy、[alice] Triage this issue… 指令、触发场景指引和 issue 元数据。

对于没有设置 displayText 的适配器,ChannelBase 的兜底同样有效:head 上 GitLab 对话的转录就是纯粹的 issue 描述,而 base 上它的标题还带着发送者前缀和插值后的 action_prompt_template 元数据。

授权边界确实在起作用

PR 声称只有经过认证的 Channel worker 才能提供显示投影。我直接对运行中的 daemon 用三种方式重放同一个 HTTP prompt:

请求 结果
Channel 会话,_meta 带显示文本 + 猜测的授权令牌 投影被丢弃 —— 转录显示真实 prompt 文本
Channel 会话,同样的 body 但用真实的单次启动 worker 令牌(从 worker 进程环境中读出) 投影被接受
非 Channel(default)会话,同样的 body + 真实令牌 投影被丢弃 —— 转录显示真实 prompt 文本

第 1、2 行之间只有令牌值不同,说明这道门就是起决定作用的地方;第 3 行则确认了额外的 sourceType === 'channel' 条件。该令牌是每次 worker 启动新生成的 randomUUID(),随 worker 生命周期注册与吊销,不是固定常量。

两点供判断的观察

1.「频道」页签每个 tick 是三次请求,不是一次。 在项目展开、空闲 30 秒的条件下实测:

页签 …/sessions …/channels …/channel-types /capabilities
任务 1 0 0 1
频道 15 15 15 15

15 次会话轮询就是 PR 风险说明里已经披露的 2 秒节奏。但额外的 /capabilities 次数与同一个 tick 完全吻合,说明每次目录刷新都会重新解析一次 channel_management 能力,而不是复用连接上已知的能力集合。把它缓存起来可以直接省掉三分之一的新增流量。这里没有任何错误,只是比风险说明听上去更"话痨"一些。

2.「其他频道」按首次出现的会话顺序排序,而不是排在最后。 由于分组按会话遍历顺序产出,兜底区块可能夹在两个真实平台中间 —— 我实测到的顺序是 GitHubOther channelsGitLab。把兜底分组固定排到最后会更自然。纯属观感问题。

另外一点是既有行为、并非本 PR 引入:早于「准入策略」字段的旧频道配置,在编辑器里必须同时选一个准入策略才能保存,因为该字段是必填。它之所以在这里浮现,是因为现在「编辑旧配置」成了设置会话作用域的常规操作。

未覆盖的部分

  • 真实的钉钉 / 飞书 / 企业微信 / GitHub / GitLab 端到端收发(无凭据,如上所述改用了本地伪 API 根地址)。
  • 第 4 步中的纯图片消息场景 —— GitHub 适配器没有产生纯附件 envelope 的路径,因此 displayText === '' 分支未在真实栈中触发,该分支由单测覆盖。
  • 次级工作区行为只做了代码与请求形态的检查,没有真的挂载第二个工作区运行。

本地测试与构建结果

以下全部在 PR 代码树上执行。

套件 结果
packages/channels/base 19 个文件,1028 个测试通过
packages/acp-bridge 26 个文件,1284 个测试通过
packages/cli(channel、serve、Session、acpAgent、rename、resume-history) 25 个文件,1530 个测试通过
packages/core(chatRecordingService、autoTitle、sessionService、sessionTitle) 4 个文件,258 个测试通过
packages/web-shell(sidebar + channels) 15 个文件,205 个测试通过
packages/channels/github 2 个文件,207 个测试通过
packages/channels/qqbot events 1 个文件,88 个测试通过
合计 4600 个测试通过,0 失败

npm run build 在 PR 树和 merge-base 树上均干净通过。

还有一点值得在读代码时确认:真实 daemon 下发的目录与设计文档一致 —— 手写 fixture 最容易在这里漂移。真实 daemon 的 GET /workspace/channel-types 恰好在 4 个可管理类型上返回 sessionScope:钉钉、企业微信、飞书默认 user,GitHub、GitLab 默认 chat_thread,每个都带全部四个选项;不可管理的类型(Telegram、微信、QQ)则没有该字段。

证据截图

选中「任务」—— Channel 对话不可见 选中「频道」—— 按平台分组

从侧边栏打开的 Channel 对话 —— 用户消息只有显示投影:

变更前(merge-base):没有切换控件,Channel 对话无法触达 不支持 session_source_metadata 的 daemon:控件隐藏
旧钉钉配置 → Per user and chat 保存 Per thread 后重新打开

我这边的结论:描述中声称的行为与代码实际行为一致,向后兼容门控在两个方向上都成立,显示投影的信任边界也扛得住伪造。我认为可以合并。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Thank you for the exceptionally thorough end-to-end verification — three independent daemon stacks, real channel workers, a merge-base "before" arm, and a capability-removed arm. Glad all eight test-plan steps reproduce and the display-projection trust boundary holds against forgery.

Feedback dispositions

Verification report (all 8 Reviewer Test Plan steps pass; authorization boundary is load-bearing) — no change needed. Treated as confirmation that the shipped behavior matches the description. Nothing to act on.

Observation 2 — Other channels sorts by first-seen session, not last — IMPLEMENTED. This was a real cosmetic defect: because groups are emitted in session iteration order, an orphan session seen before any platform session wedged the fallback section between two real platforms (your GitHub, Other channels, GitLab example). The grouping helper now pins the unresolved fallback group after every named platform section, regardless of arrival order, while preserving the relative order of the platform sections themselves. Both consumers (the primary sidebar list and the per-workspace sections) go through the same helper, so one change covers both. The aria-label/group ids are unchanged, so persisted collapse state is unaffected. Covered by the updated prototype-member test plus a new dedicated ordering test.

Observation 1 — Channels tab costs three requests per tick (/capabilities re-resolved on each catalog reload) — DECLINED for this PR; best handled as a follow-up. I traced this before deciding, and the evidence says the extra /capabilities traffic is not produced by code this PR added:

  • The channel gating reads already-cached state only — workspace.capabilities (memoized in DaemonWorkspaceProvider.getCapabilities) and connection.capabilities. It issues no request of its own.
  • The channel catalog reload path (useChannelsloadChannelsworkspaceChannelTypes() + workspaceChannels()) issues exactly the two channel endpoints, never /capabilities.
  • The session-catalog poll path (listWorkspaceSessionsPage) also never touches /capabilities.

So the per-tick /capabilities request originates in the shared daemon connection/workspace capability layer that this feature consumes but does not own. Changing that caching behavior is a cross-cutting optimization affecting every daemon-react-sdk consumer (workspace provider, session provider, voice, workspace registration), which is broader than this sidebar feature and carries regression risk I'm not willing to take in this PR. The cadence itself (active-session poll interval while the Channels source is expanded) is the disclosed design; only the redundant capability re-resolution is chattier than the risk note implies. Recommend a focused follow-up to cache/hoist the capability check out of the reload loop — happy to open that as a separate issue.

Also noted, and deliberately left alone as pre-existing (not introduced here): a legacy channel config that predates the access-policy field cannot be saved from the editor without also choosing an access policy. That predates this PR; it only surfaces now because editing a legacy config is the normal way to set session scope. Worth its own small fix.

Conflict notes

--conflict false; no merge performed, no conflicts.

Verification

All commands actually run on this tree (head 06336a2):

  • npm run build (root, all packages) — passed (exit 0; produced packages/web-shell/dist among others)
  • npm run typecheck (root, all workspaces) — passed (no type errors)
  • npm run lint (root: eslint . --ext .ts,.tsx && eslint integration-tests) — passed (exit 0)
  • npx vitest run --config vitest.config.ts in packages/web-shell (full unit suite, e2e excluded) — 3322 passed, 0 failed
  • Focused npx vitest run client/components/sidebar/channelSessionGroups.test.ts client/components/sidebar/WorkspaceSection.test.tsx — 23 passed
  • Focused npx vitest run client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx client/components/sidebar/WebShellSidebar.collapse-persist.test.tsx — 80 passed
  • npx vitest run build-artifact.test.ts — 12 passed (after building the web-shell bundle)
  • npx prettier --check on the two changed files — passed

Not applicable: integration tests (change is a pure sidebar grouping function, not exercised through the bundled CLI) and generate:settings-schema (no settings source changed).

中文说明

非常感谢这次极其彻底的端到端验证——三套互相独立的 daemon 栈、真实的 Channel worker、merge-base「变更前」对照,以及一个删掉门控能力的环境。很高兴看到测试计划的全部 8 个步骤都能复现通过,且显示投影的信任边界能够抵抗伪造。

反馈处理结果

验证报告(Reviewer 测试计划 8 步全部通过;授权边界确实在起作用)—— 无需改动。 视为对「实际行为与描述一致」的确认,没有需要处理的内容。

观察 2 ——「其他频道」按首次出现的会话排序、而不是排在最后 —— 已实现。 这是一个真实的观感缺陷:由于分组按会话遍历顺序产出,先于任何平台会话出现的孤儿会话会把兜底区块夹在两个真实平台之间(即你举的 GitHubOther channelsGitLab 的例子)。现在分组辅助函数会把未解析的兜底区块固定排在所有已命名平台区块之后,无论会话到达顺序如何,同时保持各平台区块之间的相对顺序不变。两个使用方(主侧边栏列表和按工作区的分区)都走同一个辅助函数,因此一处改动即可覆盖两者。aria-label/分组 id 保持不变,所以已持久化的折叠状态不受影响。更新后的 prototype-member 测试加上一个新增的专门排序测试覆盖了该行为。

观察 1 ——「频道」页签每个 tick 是三次请求(每次目录刷新都重新解析 /capabilities)—— 本 PR 中暂不处理;建议作为后续跟进。 决定之前我先做了溯源,证据表明多出来的 /capabilities 流量并非本 PR 新增代码产生:

  • 频道门控只读取已缓存的状态——workspace.capabilities(在 DaemonWorkspaceProvider.getCapabilities 中做了记忆化)和 connection.capabilities,自身不发起任何请求。
  • 频道目录刷新路径(useChannelsloadChannelsworkspaceChannelTypes() + workspaceChannels())恰好只发起两个频道端点请求,从不请求 /capabilities
  • 会话目录轮询路径(listWorkspaceSessionsPage)同样从不触碰 /capabilities

因此,每个 tick 的 /capabilities 请求源自共享的 daemon 连接/工作区能力层——本功能只是消费它、并不拥有它。修改该缓存行为是一个牵一发动全身的优化,会影响每一个 daemon-react-sdk 的使用方(workspace provider、session provider、语音、工作区注册),其范围超出了本侧边栏功能,并且带来我不愿在本 PR 中承担的回归风险。轮询节奏本身(在「频道」来源展开时使用 active-session 轮询间隔)是已经披露的设计;只有多余的能力重复解析比风险说明所暗示的更"话痨"。建议用一个专门的后续改动,把能力检查缓存起来或移出刷新循环——我可以单独为此开一个 issue。

另外有一点记录在案、但因属于既有问题(并非本 PR 引入)而刻意不处理:早于「准入策略」字段的旧频道配置,在编辑器里必须同时选一个准入策略才能保存。这在本 PR 之前就存在,只是因为现在「编辑旧配置」成了设置会话作用域的常规操作才浮现出来。值得单独做一个小修复。

冲突说明

--conflict false;未进行合并,无冲突。

验证

以下命令均在当前代码树(head 06336a2)上实际执行:

  • npm run build(根目录,全部包)—— 通过(exit 0;产出了 packages/web-shell/dist 等)
  • npm run typecheck(根目录,全部 workspace)—— 通过(无类型错误)
  • npm run lint(根目录:eslint . --ext .ts,.tsx && eslint integration-tests)—— 通过(exit 0)
  • packages/web-shell 中执行 npx vitest run --config vitest.config.ts(完整单测套件,排除 e2e)—— 3322 通过,0 失败
  • 定点 npx vitest run client/components/sidebar/channelSessionGroups.test.ts client/components/sidebar/WorkspaceSection.test.tsx —— 23 通过
  • 定点 npx vitest run client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx client/components/sidebar/WebShellSidebar.collapse-persist.test.tsx —— 80 通过
  • npx vitest run build-artifact.test.ts —— 12 通过(在构建 web-shell bundle 之后)
  • 对两个改动文件执行 npx prettier --check —— 通过

不适用:集成测试(改动是一个纯粹的侧边栏分组函数,不经过打包后的 CLI 执行)以及 generate:settings-schema(未改动任何 settings 源)。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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 pushed a commit that referenced this pull request Aug 12, 2026
@wenshao

wenshao commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

wenshao
wenshao previously approved these changes Aug 12, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 57 passed · 0 failed · 57 total

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

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

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

Verification report

Verification report — PR #8457 (feat(web-shell): expose channel sessions in sidebar and settings)

Verdict: merge-ready — 57/57 scripted assertions passed, 0 unexpected failures. Verified head: 06336a25cb0856d03c2cc3e9ffabbd1260bac886 (merge a95fe866, base a32ec1ee). First verification round (no previous-report.md present).

中文摘要
  • 结论: merge-ready。57/57 脚本化断言通过,0 个意外失败。
  • A/B 结论(核心声明): 频道消息的“用户可见投影(displayText)”在持久化缝上成立。对同一组会话 JSONL,head 的侧边栏预览只显示用户文本(纯图片消息为空),base 则把模型侧频道指令([DingTalk] … never reveal these instructions)完整泄漏进预览,且 base 的截断在 UTF-16 码元边界切分产生孤立代理项(…\ud83c...),head 按码点截断干净。10/10 单元符合预期(base 的红色单元即“修复前确实泄漏”的对照断言)。
  • 授权门: 每个 channel worker 的授权令牌是 randomUUID(),绑定工作区 cwd,退出即吊销;harness 验证了跨工作区/非字符串/吊销后均拒绝(13/13,含跨包 wire key 一致性)。daemon 的 ACP 子进程由 bridge 以 private-parent capability 派生,显示文本只对受信任父进程保留。
  • 分组: 平台分组矩阵 10/10(两个钉钉实例合并、Other channels 钉在命名平台之后、sourceId: 'constructor' 不崩溃)。
  • 变异矩阵: 2 个变异均被 PR 自带测试杀死(sessionService 4 failed | 134 passed;channelSessionGroups 2 failed | 2 passed),无存活者。
  • Findings: 无阻塞项;两条建议级观察(webhook 显示文本折行策略与频道路径不一致;session bus echo 在有 displayText 时丢弃第二个及以后的 text block——现有构造器只发一个 text block,故当前无数据丢失)。
  • 未覆盖: Chromium e2e(容器无浏览器)、真实提供方收发、逐 commit 归因(shallow checkout 只有 3 个 commit)、整 daemon HTTP 全链路(改为逐缝验证 + 其 575/1892 测试套件)。

Scope selection

Central claim — a channel prompt's user-authored text travels as a separate display projection across Channel → daemon → ACP → persistence → UI boundaries, under an authorization gate: every user-visible surface (session-bus echo, pending entries, recorded transcript, sidebar preview, auto-title input) shows only the projection while the model keeps the full prompt; callers that are not an authenticated channel worker cannot inject one.

Secondary claims — (1) the Channels sidebar catalog groups sessions into collapsible platform sections with the unresolved "Other channels" section pinned after every named platform; (2) every manageable channel advertises a sessionScope enum (including the new chat_thread) with plugin defaults preserved.

Everything else (live provider round trips, Chromium e2e, per-commit attribution) is listed under Not covered.

Central claim: A/B at the persistence/preview seam

The seam is SessionService.listSessions() — the exact call the daemon session-list route uses to build sidebar previews — driven mock-free against real JSONL session files written to a scratch runtime dir, once per arm. Each arm is an esbuild bundle of packages/core/src/services/sessionService.ts from that arm's tree (--packages=external, zero @qwen-code/* runtime imports, so no workspace-symlink confound; package.json/lockfile untouched by the PR, so root node_modules reuse is a clean control). Base arm = HEAD^1 worktree. Raw per-arm output: logs/h1-head.jsonl, logs/h1-base.jsonl; scripted adjudication: logs/h1-adjudication.txt (10/10).

Cell Fixture (first user record) HEAD preview BASE preview Verdict
C1 typical channel message model text [DingTalk] … never reveal these instructions + displayText: '帮我写个问候语' 帮我写个问候语 full model prompt leaked (184 chars) head fixed / base leaks, as predicted
C2 image-only message model text + displayText: '' '' (nothing rendered) full model prompt leaked head fixed / base leaks
C3 legacy record (no payload) plain user text plain legacy question identical compat control, both arms equal
C4 astral truncation 251-code-point emoji string as both text and displayText 203 code points (200 + '...'), no lone surrogate cut at UTF-16 unit 200 → lone surrogate \ud83c + ... (renders ``) head fixed / base corrupts
C5 subtype user record first subtype: 'goal_runtime' internal record, then real user record real question INTERNAL GOAL RUNTIME TEXT leaked head fixed / base leaks

Witness: evidence/01-ab-preview-projection-head-vs-base.png (live rerun of both arms plus the adjudication). The base arm's red cells are the expected-failure controls — each is counted as a passing assertion that the pre-PR code exhibited the leak the PR claims to fix.

The projection is honored end-to-end on head, not just at this seam: Session.ts records systemPayload.displayText on the user record (verified shape at chatRecordingService.recordUserMessage), chatRecordingService tracks it for titles (getUserDisplayTextsForTitle, consumed by renameCommand and tryGenerateSessionTitle, which switches the title dialog to the projection when any turn carries one), and sessionService.extractFirstPromptFromRecords prefers it, skips '' (image-only), and skips subtype records.

Authorization gate and wire keys

The display-text meta key can only enter the system through two gated writers:

  • Daemon path: routes/session.ts strips qwen.daemon.channelPromptAuthorization and qwen.daemon.promptDisplayText from forwarded _meta, then re-admits the display text only if the authorization token is registered for exactly this workspace's cwd (channel-worker-prompt-authorization.ts). The token is a per-worker randomUUID() (channel-worker-supervisor.ts:387), registered at spawn, revoked on spawn-failure, worker exit, and supervisor stop; the worker reads it from QWEN_CHANNEL_DAEMON_WORKER and scrubs it from its own env (daemon-worker.ts:790).
  • ACP child: acpAgent.ts deletes the display-text key from untrusted callers and restores it only when privateParentState === 'trusted'; both the daemon bridge (bridge.ts:3133-3145,3524) and the standalone AcpBridge establish that trust with the private-parent capability handshake, and bridge.ts only populates it for sourceType === 'channel' entries (getChannelPromptDisplayText).

Harness 2 (harness-2-gate-and-wire-keys.mjs, 13/13, witness evidence/03-gate-and-wire-keys.png): fresh token rejected; registered token authorizes only its own workspace; non-string and 'constructor' tokens rejected; revoked token rejected; re-registration works; and the three packages' literal wire-key constants agree (qwen.daemon.promptDisplayText, qwen.daemon.channelPromptAuthorization, qwen-code/private-parent-capability / QWEN_CODE_PRIVATE_ACP_CAPABILITY, qwen.channel.prompt unchanged).

Secondary claim 1: sidebar grouping matrix

Harness 3 (harness-3-grouping-matrix.mjs, 10/10, witness evidence/02-grouping-matrix-head.png) against the compiled channelSessionGroups.ts: two DingTalk instances share one section; Feishu separate; an orphan session listed first still lands in "Other channels" last (the pin from the final commit); sourceId: 'constructor' does not throw (Object.hasOwn guard) and lands in Other; whitespace type trims into its platform, blank type falls back; uncatalogued type uses the raw label; without a fallback group first-seen order is preserved.

Secondary claim 2: session scope

channel-registry.ts now injects a sessionScope enum field (user / thread / chat_thread / single) into every manageable catalog entry lacking one, defaulting to plugin.defaultSessionScope ?? 'user', and assertManagementDescriptor rejects invalid defaults or a plugin field that omits the default; channel-settings-store.ts accepts chat_thread (base's allow-set was ['user','thread','single'] — cited statically from HEAD^1; a behavioral base arm was not built for this store because its upsert path loads real plugins). Pinned by the green channel-registry*.test.ts and channel-settings-store.test.ts runs below.

Display-text sanitizer boundaries

Harness 4 (harness-4-sanitize-display.mjs, 14/14, logs/h4-sanitize.txt): sanitizeDisplayText (applied at the ChannelBase.processInbound boundary, envelope.displayText ?? envelope.text, cap 8000) strips NEL/bidi overrides/zero-width/line separators, folds C0 controls except newline (multi-line user text keeps its lines in the transcript), preserves brackets (display, not prompt), and caps by code point without splitting surrogate pairs.

Mutation matrix (vacuity of the PR's own tests)

Mutation Suite that should catch it Result
MUT-1: extractFirstPromptFromRecords reverted to base logic (displayText branch deleted) packages/core sessionService.test.ts killed4 failed | 134 passed; failures are the intended assertions, e.g. expected 'internal channel instructions' to be 'hello', expected 'internal channel instructions' to be '' (witness evidence/04-mut1-kills-displaytext-tests.png)
MUT-2: Other-channels pin removed (return ordered) packages/web-shell channelSessionGroups.test.ts killed2 failed | 2 passed; pins the fallback group after every resolved platform section got ['channel-type-fallback', …] instead of ['channel-type:feishu', …] (witness evidence/05-mut2-kills-pinning-tests.png)

No survivors. Both files were restored byte-identical to head afterwards (git diff empty; the green gate runs below ran on the restored tree).

Targeted gates (head, restored tree)

Suite Result
core: sessionService + sessionTitle + chatRecordingService + autoTitle 258 passed (258)
channels/base: full workspace (19 files) 1028 passed (1028)
acp-bridge: bridge.test.ts 575 passed (575)
cli: wire-key, registry, builtins, daemon-worker, memory-intent, settings-store, worker-supervisor, rename, resumeHistory (10 files) 397 passed (397)
cli: Session.test.ts + acpAgent.test.ts + server.test.ts 1892 tests, 0 failures, 0 errors (junit)
channels/github GithubAdapter + channels/qqbot events 190 + 88 passed
web-shell: grouping + WorkspaceSection + sidebar collapse/removal + editor (6 files) 144 passed (144)

The two mutation kills double as the liveness proof for the core and web-shell suites (planted violation reported, then clean run green).

Reviewer Test Plan walkthrough

  1. Tasks default, channel session absent from Tasks — covered by green sidebar suites (source switch gated at WebShellSidebar.tsx:595-600 on capabilities.features.includes('session_source_metadata')); not re-driven in a browser here.
  2. Platform sections, shared DingTalk section, pinned stays, Other channels — harness 3 M1-M5.
  3. New DingTalk conversation appears under Channels within the active poll interval — code path present (design doc + sidebar polling tests green); browser not available here.
  4. User message/title show only user-visible content, model keeps full prompt; image-only shows nothing — harness 1 C1/C2/C4/C5 + sessionTitle dialog switch (green).
  5. Session scope section with effective default for legacy configs — channel-registry builtins tests green.
  6. Select Per thread, save, reopen — settings-store + editor tests green; not browser-driven.
  7. Active/pinned/archived/search/secondary scoped to source — sidebar suites green.
  8. Old daemon: switch hidden, behavior unchanged — capability gate verified in code (WebShellSidebar.tsx:4272 renders the switch only when sourceMetadataEnabled), plus collapse-persist suite green.

Findings

F-1 (Suggestion, non-blocking): webhook display projection folds newlines, channel path preserves them. buildChannelWebhookDisplayText runs title/summary through sanitizePromptText (which folds CR/LF/TAB to spaces), while the live channel boundary uses sanitizeDisplayText (newline-preserving). The comment states this mirrors the model-prompt treatment intentionally, so multi-line webhook summaries render as one line in transcripts while DingTalk/Feishu text keeps its line structure. No leak either way; consider whether webhook summaries should get the display-side sanitizer for consistency.

F-2 (Suggestion, non-blocking): echo drops text blocks after the first when a projection is present. In echoPromptToSessionBus (bridge.ts ~1400), with displayText !== undefined every text block after the first is skipped (if (displayTextPublished) continue). Today's channel prompt builders emit exactly one text block (images first, single text last), so nothing is dropped on any current path; a future adapter emitting multiple text blocks would silently lose the extras from the session-bus transcript. Latent edge, no current trigger found.

Not covered

  • Chromium e2e (web-shell.channels.spec.ts etc.): no browser in this container (NO-PLAYWRIGHT-BROWSERS, no system Chrome). The two channel e2e specs and mockDaemon changes were not executed; their unit-level counterparts are green.
  • Live provider round trips (DingTalk/Feishu/WeCom/GitHub/GitLab) — same as the PR's own scope statement.
  • Per-commit attribution: the checkout is shallow (rev-parse --is-shallow-repository = true; only merge/base/head reachable while the snapshot lists 33 commits). The aggregate HEAD^1..HEAD diff was verified; individual commits were not.
  • Full-daemon HTTP wire run of a channel webhook end-to-end. Each seam of the chain was instead verified in isolation (harnesses 1-4) plus the PR's own 575-test bridge suite and 1892-test CLI session/serve suites; the harnesses reproduce the persisted wire shape, not a live daemon trigger.
  • Behavioral A/B of the chat_thread settings-store acceptance (base allow-set cited statically from HEAD^1 source); head acceptance pinned by its green test.
  • TUI displayText path (pre-existing hook projection) — unchanged by this PR.

Methodology

Environment: node:22-bookworm CI container, repo at merge a95fe866; npm ci + npm run build pre-ran at head. Arms: head = repo tree; base = git worktree add tmp/base-tree HEAD^1, compiled with esbuild 0.25.6 (--bundle --format=esm --platform=node --packages=external) from each tree's TS source into self-contained bundles (verified zero @qwen-code/* runtime imports; nested packages/core/node_modules/ajv v8 resolves identically for both). Harnesses are plain .mjs drivers in this artifact dir. To rebuild the bundles they consume, run from the repo root: ./node_modules/esbuild/bin/esbuild packages/core/src/services/sessionService.ts --bundle --format=esm --platform=node --packages=external --outfile=packages/core/.harness/sessionService.bundle.mjs (and the same invocation for tmp/base-tree/.../sessionService.ts.harness-base/, packages/cli/src/serve/channel-worker-prompt-authorization.ts, the wire-key entry, packages/web-shell/client/components/sidebar/channelSessionGroups.ts, and packages/channels/base/src/sanitize.ts). Gates ran via per-package npx vitest run <files>. Raw logs: logs/h1-head.jsonl, logs/h1-base.jsonl, logs/h1-adjudication.txt, logs/h2-gate.txt, logs/h3-grouping.txt, logs/h4-sanitize.txt. Mutation backups: mut1-sessionService.orig.ts, mut2-channelSessionGroups.orig.ts. Assertion counts: harness 1 adjudication 10 + harness 2 13 + harness 3 10 + harness 4 14 + mutation kills 2 + gate runs 8 = 57, all passing.

Evidence images

01-ab-preview-projection-head-vs-base

02-grouping-matrix-head

03-gate-and-wire-keys

04-mut1-kills-displaytext-tests

05-mut2-kills-pinning-tests

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅ Every Critical from the review rounds is verifiably fixed at this head, CI is green (including the previously red required unit leg), and the display-projection trust boundary holds up under reading. Non-blocking follow-ups are named in the Stage 3 comment. Approved by the triage gate on behalf of the maintainers.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Could not produce a passing fix for this feedback (round 9/100). This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own.

What I found before stopping:
Qwen failed during address-review: signal SIGTERM.

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

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


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

…l-sessions

# Conflicts:
#	packages/cli/src/acp-integration/session/Session.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round summary — PR #8457

Feedback triage

No actionable feedback this round. feedback.md contained no reviews, no inline comments, no issue-level comments, and no failed or still-red checks. Critical-only mode is active after five change-producing rounds; the deferred non-Critical feedback section listed no items and was left untouched per policy.

Base conflict resolution (--conflict true)

Merged origin/main (8 commits ahead, including Goal v3 adoption in ACP sessions, footer text selection, web-shell hardening, and same-session refresh fixes). One content conflict:

  • packages/cli/src/acp-integration/session/Session.ts — both sides modified the user-message recording branch in the ACP prompt flow:

    • This PR added promptDisplayText support (from the DAEMON_PROMPT_DISPLAY_TEXT_META_KEY prompt metadata) so channel session transcripts record the user-authored display text.
    • origin/main (Goal v3, feat(cli): adopt Goal v3 in ACP sessions #8732) added Goal-turn permit recording: recordUserMessage(promptText, goalTurn.permit) when a user-origin Goal turn is active.

    The resolution unions both behaviors, mirroring the pattern main's own Goal v3 code uses in client.ts (recordUserMessage(request, goalPermit, userPromptRecordPayload)): when promptDisplayText is present, the call passes the Goal permit and the display-text payload together; otherwise main's exact two-arg (Goal turn) and one-arg (plain) call shapes are preserved. All other files auto-merged cleanly, including packages/web-shell/client/i18n.tsx and the Session test files.

    A first resolution draft passed an explicit undefined second argument on the plain path, which two merged tests from main rightly rejected (toHaveBeenCalledWith is argument-count exact); the code was corrected to keep main's call shapes rather than loosening the tests.

Dispositions

  • Required findings: none this round.
  • Optional findings: none this round.
  • Escalated / declined / deferred: none.
  • Inline comments resolved in code: none (no inline findings were raised this round), so resolved-comments.txt and comment-replies.json are omitted.

Verification

  • npm run build — passed (exit 0, run on the final resolved tree)
  • npm run typecheck — passed (exit 0, run on the final resolved tree)
  • npm run lint — passed (exit 0, run on the final resolved tree)
  • Focused Vitest packages/cli: Session.test.ts, Session.review-lease.test.ts, Session.worktree.test.ts — 3 files passed, 599 tests passed (initial run showed 2 failures caused by my first draft's call shape; fixed and re-run green)
  • Focused Vitest packages/core: chatRecordingService.test.ts, chatRecordingService.autoTitle.test.ts, sessionService.test.ts, sessionTitle.test.ts — 4 files passed, 258 tests passed
  • Focused Vitest packages/cli: channel-worker-supervisor.test.ts, server.test.ts, display-text-wire-key.test.ts — 3 files passed, 1018 tests passed
  • Integration tests after npm run bundle — not required: the changed behavior (ACP user-message recording) is fully exercised by the unit suites above; no settings source changed, so no schema regeneration.
  • Merge commit: e961edd309 (additive merge of origin/main into feat/web-shell-channel-sessions); working tree clean afterward.
中文说明

Autofix 评审轮次总结 — PR #8457

反馈分诊

本轮没有需要处理的反馈。feedback.md 中没有评审、没有行内评论、没有 issue 级评论,也没有失败或持续失败的检查项。在 5 个产生改动的轮次之后已进入仅处理 Critical 的模式;延后的非 Critical 反馈区域没有列出任何条目,按策略保持原样不动。

基线冲突解决(--conflict true

已合并 origin/main(领先 8 个提交,包括 ACP 会话采用 Goal v3、footer 文本选择、web-shell 加固以及同会话刷新修复)。一处内容冲突:

  • packages/cli/src/acp-integration/session/Session.ts — 双方都修改了 ACP prompt 流程中的用户消息记录分支:

    • 本 PR 增加了 promptDisplayText 支持(来自 DAEMON_PROMPT_DISPLAY_TEXT_META_KEY prompt 元数据),使 channel 会话转录能够记录用户撰写的展示文本。
    • origin/main(Goal v3,feat(cli): adopt Goal v3 in ACP sessions #8732)增加了 Goal 回合许可记录:当存在用户发起的 Goal 回合时调用 recordUserMessage(promptText, goalTurn.permit)

    解决方案将两者合并,遵循 main 自身 Goal v3 代码在 client.ts 中使用的模式(recordUserMessage(request, goalPermit, userPromptRecordPayload)):当存在 promptDisplayText 时,调用同时传入 Goal 许可和展示文本载荷;其余情况则保留 main 原有的两参数(Goal 回合)与单参数(普通)调用形态。其他所有文件均自动合并成功,包括 packages/web-shell/client/i18n.tsx 和各 Session 测试文件。

    最初的解决方案草案在普通路径上传入了显式的 undefined 第二参数,被 main 合并进来的两个测试正确地拒绝(toHaveBeenCalledWith 对参数个数严格匹配);修正方式是让代码保留 main 的调用形态,而不是放宽测试断言。

处置结果

  • 必改项:本轮无。
  • 可选项:本轮无。
  • 升级/拒绝/延后:无。
  • 在代码中解决的行内评论:无(本轮没有行内反馈),因此省略 resolved-comments.txtcomment-replies.json

验证

  • npm run build — 通过(退出码 0,在最终解决后的代码树上运行)
  • npm run typecheck — 通过(退出码 0,在最终解决后的代码树上运行)
  • npm run lint — 通过(退出码 0,在最终解决后的代码树上运行)
  • 定向 Vitest packages/cliSession.test.tsSession.review-lease.test.tsSession.worktree.test.ts — 3 个文件通过,599 个测试通过(首次运行有 2 个失败,源于第一版草案的调用形态;修复后重跑全绿)
  • 定向 Vitest packages/corechatRecordingService.test.tschatRecordingService.autoTitle.test.tssessionService.test.tssessionTitle.test.ts — 4 个文件通过,258 个测试通过
  • 定向 Vitest packages/clichannel-worker-supervisor.test.tsserver.test.tsdisplay-text-wire-key.test.ts — 3 个文件通过,1018 个测试通过
  • npm run bundle 后的集成测试 — 不需要:改动的行为(ACP 用户消息记录)已被上述单元测试完整覆盖;未改动任何 settings 源文件,因此无需重新生成 schema。
  • 合并提交:e961edd309(将 origin/main 追加式合并进 feat/web-shell-channel-sessions);之后工作树干净。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

📊 Takeover milestone — round 10/100, in the current window. Census: 8 pushed fix(es), 0 no-change review(s), 1 timeout(s), 1 rejected attempt(s), 0 other round(s) (crash / model error / gate error / infra), 2 base update(s).

This many rounds deserves a human look. Options: keep going (fine — nothing changes), split or reduce the PR if rounds keep accumulating, or release takeover (remove the autofix/takeover label or comment @qwen-code /takeover stop). Management continues unchanged unless you act.

中文说明

📊 接管里程碑 —— 第 10/100 轮(当前窗口)。统计:推送修复 8 次、审阅无需改动 0 次、超时 1 次、验证拒绝 1 次、其他轮次(崩溃/模型错误/门错误/infra)0 次、base 更新 2 次。

轮次到这个量值得人工看一眼。可选:继续(无需操作);若轮次持续累积,考虑拆分或缩减 PR;或释放接管(移除 autofix/takeover 标签或评论 @qwen-code /takeover stop)。不操作则托管照常继续。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round: no action needed

This round found no actionable feedback, so no changes were made and the PR head stays at its current commit.

  • Critical-only mode is active (after five change-producing rounds). The actionable sections — reviews, inline comments, and issue-level comments — contained no new items from trusted maintainers or the automated reviewer in this round's window. The deferred non-Critical feedback list is empty; any such items remain open for human follow-up per the mode rules.
  • No persisting check failures. Every check listed under "Failed checks" concluded CANCELLED, not failed: those workflow runs were cancelled within one or two seconds of starting when replacement runs for the same head commit began. In the replacement runs, the fast jobs already succeeded (e.g. label, Classify PR, the SDK Java matrix, Desktop Shell), while the remaining jobs (e.g. Test (ubuntu-latest, Node 22.x), Serve A/B, Capture web-shell visuals, Real daemon E2E) were still in progress when this round's data was captured. The "still-red checks" list is empty, so nothing from earlier rounds is failing either.
  • No conflict resolution was required (--conflict false), and no merge was performed.

If the in-progress replacement CI runs turn up a real failure, it will arrive as actionable feedback in a later round.

中文说明

Autofix 审查轮次:无需处理

本轮未发现任何可处理的反馈,因此未做任何改动,PR 的 head 保持在当前提交。

  • 当前处于仅处理 Critical 的模式(在经历 5 个产生改动的轮次之后)。本轮窗口内,可处理区域——评审(Reviews)、行内评论(inline comments)与 issue 级评论(issue-level comments)——均没有来自可信维护者或自动审查者的新条目。延后的非 Critical 反馈列表为空;如有此类条目,将按该模式规则保持开放,留待人工跟进。
  • 不存在持续失败的检查。「Failed checks」中列出的每一项检查的结论都是 CANCELLED(已取消),而非失败:这些工作流运行在启动后一两秒内即被取消,原因是针对同一 head 提交的替代运行随即开始。在替代运行中,快速任务已经通过(例如 labelClassify PR、SDK Java 矩阵、Desktop Shell),其余任务(例如 Test (ubuntu-latest, Node 22.x)Serve A/BCapture web-shell visualsReal daemon E2E)在本轮数据采集时仍在进行中。「仍为红色的检查(still-red checks)」列表为空,说明此前轮次也没有遗留失败项。
  • 无需解决冲突--conflict false),也未执行任何合并操作。

如果进行中的替代 CI 运行出现真实失败,它会作为可处理反馈在后续轮次中送达。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 12, 2026
@wenshao

wenshao commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@wenshao
wenshao enabled auto-merge August 12, 2026 16:55
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 79 passed · 0 failed · 79 total

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

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

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

Verification report

Verification report — PR #8457 (feat(web-shell): expose channel sessions in sidebar and settings) — round 2

Verdict: merge-ready — 79/79 scripted assertions passed, 0 unexpected failures. Verified head: e961edd309538ca00030817b82fa306fe2925bab (merge 04d354df03, base 50097c154cb25aae5d244cf185375453fe088bcc). Follow-up round — round 1 verified head 06336a25cb0856d03c2cc3e9ffabbd1260bac886.

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

第二轮沙箱验证:79/79 脚本化断言通过,0 个意外失败。

  • 与上一轮的差异: PR 仅新增一个提交——把最新 main 合入分支(commit 34)。对全部 66 个 PR 文件逐一对比两轮 head 的内容:58 个文件字节相同;8 个文件因 main 推进而漂移,其中 7 个的 PR 补丁内容(hunk)逐字不变,只有上下文行移动。唯一实质变化Session.ts:displayText 记录分支需要与 main 新增的 goalTurn/recorder 机制重新合并,合并结果经代码审读、变异探针和 1912 个 CLI 会话测试验证为正确。
  • A/B 结论(核心声明,重测): 用户可见投影在新 head 上依然成立——11/11 单元符合预期,base 对照单元按预测泄漏模型侧频道指令 / 在奇数对齐的 UTF-16 边界产生孤立代理项,head 全部干净。
  • 重测项: 门禁、网关与 wire key(23/23)、平台分组矩阵(11/11)、显示文本净化边界(18/18)、变异矩阵(MUT-1/MUT-2 均被杀死)、8 个目标测试门禁 + CLI 包 typecheck,全部在新 head 上重新执行(未沿用旧报告数字)。
  • 新发现(建议级 F-3): main 的 Goal 机制与 displayText 分支的交点没有被任何测试钉住——Goal 活跃时频道消息会走 goal-user 分支,此时代码正确地同时记录 goalContext 和 displayText,但把 goalTurn?.permit 删掉的变异(MUT-3a)在两个相关测试下都存活。行为本身验证为正确,属完整性缺口而非缺陷。
  • 上一轮 F-1/F-2: 均在新 head 上复测,结论不变(stand),均为建议级。
  • 未覆盖: Chromium e2e(容器无浏览器)、真实提供方收发、逐 commit 归因(浅克隆)、整 daemon HTTP 全链路、全仓 build/typecheck(PR 自身 CI 覆盖;本轮仅对合并发生的 cli 包做了定向 tsc)。

Previous-finding status (round 1 → round 2)

Round 1 report: merge-ready, 57/57 assertions, head 06336a25. Every carried-forward measurement below was re-run at the new head, not diffed from the old report.

# Round-1 finding Severity Status at new head e961edd3
Round-1 verdict merge-ready, central claim proven 10/10 Stands, re-proven: harnesses re-run at the new head, 11/11 (H1), plus full gate re-runs below
F-1 Webhook display projection folds newlines (sanitizePromptText), channel path preserves them (sanitizeDisplayText) Suggestion Stands — re-read buildChannelWebhookDisplayText (ChannelWebhookTask.ts:118): still sanitizePromptText for title and summary, comment still states it mirrors the model-prompt treatment intentionally. H4 re-measured the contrast (prompt sanitizer folds newline / display sanitizer preserves newline, both pass). No leak either way
F-2 Session-bus echo drops text blocks after the first when a projection is present Suggestion StandsechoPromptToSessionBus (bridge.ts:1386-1405) unchanged in logic; new wrinkle observed: when the echo window holds no text block, the first text block past the window is pulled in (image-only prompts still echo their text). DaemonChannelBridge.prompt (line 411-419) still emits [image?, single text], so nothing is dropped on any current path — latent edge unchanged

No declined or deferred rows existed in round 1.

Delta since round 1 (what this round verified on top)

The PR's snapshot lists 34 commits; commit 33 is round 1's verified head 06336a25, and commit 34 (e961edd3) — a merge of origin/main into the branch — is the only new commit (scripted comparison of the snapshot's commits array against locally reachable objects; the shallow graft makes rev-list counts unreliable, so the snapshot list + object reachability was used instead). The branch was rewritten relative to round 1 (06336a25 is not an ancestor of e961edd3), but content comparison bounds the damage:

  • 66 files in the current effective diff (HEAD^1..HEAD); for each, git diff 06336a25 HEAD -- <file>: 58 byte-identical, 8 changed.
  • For the 8, the old vs new effective patches were diffed hunk-by-hunk: 7 are context-only drift (main moved surrounding code; PR hunk content byte-identical) — bridge.ts, bridge.test.ts, bridgeTypes.ts, acpAgent.ts, acpAgent.test.ts, Session.test.ts, i18n.tsx.
  • 1 file carries a real re-merge: Session.ts — see the next section. These three delta facts are counted as assertions in assertions.json.

The one substantive change: Session.ts × main's goalTurn refactor

Main landed a Goal-turn refactor in Session.ts between bases: recordUserMessage calls now thread a GoalTurnPermit. The PR's display-text recording hunk was re-merged against it:

// base (50097c15)                          // head (this PR)
if (goalTurn) {                             if (promptDisplayText !== undefined) {
  recorder?.recordUserMessage(                recorder?.recordUserMessage(promptText,
    promptText, goalTurn.permit);               goalTurn?.permit, {
} else {                                        displayText: promptDisplayText,
  recorder?.recordUserMessage(promptText);      hookContext: '',
}                                             });
                                            } else if (goalTurn) {
                                              recorder?.recordUserMessage(promptText, goalTurn.permit);
                                            } else {
                                              recorder?.recordUserMessage(promptText);
                                            }

Verified:

  1. Base behavior preserved when no projection is present: branches 2–3 are byte-equivalent to base (read side-by-side against the HEAD^1 worktree). The goalContext plumbing is intact. The hookContext: '' value is load-bearing and verified against the real readers: transcript projection gates on typeof payload.hookContext === 'string' (core projectUserTranscriptForDisplay, transcript-records.ts:172; desktop projectQwenUserRecordText, qwen-agent.ts:998) — a string, even empty, is what activates the displayText path, so channel records render the projection on TUI/desktop resume while payload-less records (plain and goal-user) fall back to the message parts unchanged. An image-only record (displayText: '') projects to '', and the TUI resume's ?? extractTextFromParts keeps '' (nullish-coalescing), pushing no user item — consistent with the sidebar preview's C2 behavior.
  2. PR behavior preserved when no goal turn: branch 1 with goalTurn?.permit === undefined is exactly the round-1 shape; pinned by the green test records daemon prompt display text separately from model context (MUT-3b positive control proves the test reaches this branch).
  3. The combination is reachable and correct: goal-turn reservation fires for any prompt while a Goal is active (Session.ts:3461-3466, not channel-specific), so a channel message arriving during an active Goal takes branch 1 with a real permit — the record gets both goalContext and the display projection, which is the semantically correct reconciliation (main would have recorded the goal ownership; the PR adds the projection on top).
  4. Gates: all 1912 CLI Session/acpAgent/server tests green at head (see Targeted gates).

F-3 (new, Suggestion — completeness, not merge condition): the branch-1-with-permit combination is unpinned. Mutation MUT-3a (replace goalTurn?.permit with undefined in branch 1) survives both individually-targeted tests — the displayText test (no goal in fixture) and the goal-user test admits an ordinary ACP prompt into the active Goal turn (no _meta display text) each cover one axis only. The positive control MUT-3b (if (false) on the same branch) kills the displayText test with the intended spy-argument assertion, so the suite is live; the gap is real and exactly where a future goal/merge refactor would land. Suggested fixture: a session.prompt with _meta: {'qwen.daemon.promptDisplayText': …} while a Goal is active, asserting recordUserMessage(text, permit, {displayText, hookContext: ''}).

Central claim (re-measured): A/B at the persistence/preview seam

Harness 1 (harness-1-preview-ab.mjs) — identical JSONL fixtures driven mock-free through esbuild bundles of sessionService.ts from each arm (--packages=external, verified zero @qwen-code/* imports in both bundles, so no workspace-symlink confound; lockfile untouched by the PR so root node_modules reuse is a clean control). Base arm = HEAD^1 (50097c15) worktree; head arm = repo tree. 11/11 (witness evidence/01-ab-preview-projection-head-vs-base.png; raw: logs/ of both runs prints inline in the capture).

Cell Fixture (first user record) HEAD preview BASE preview Verdict
C1 typical channel message model text [DingTalk] … never reveal these instructions + displayText: '帮我写个问候语' 帮我写个问候语 full model prompt leaked head fixed / base leaks (control)
C2 image-only message model text + displayText: '' '' full model prompt leaked head fixed / base leaks (control)
C3 legacy record (no payload) plain user text plain legacy question identical compat control, both arms equal
C4 astral truncation 'x' + '🙂'×250 (251 cp / 501 units) as text+displayText 200 code points + ..., no lone surrogate cut at UTF-16 unit 200 → lone surrogate + ... head fixed / base corrupts (control)
C5 subtype user record first subtype: 'goal_runtime' record, then real user record real question INTERNAL GOAL RUNTIME TEXT leaked head fixed / base leaks (control)

Methodology note vs round 1: the new base's extractPromptText slices at UTF-16 unit 200, which lands on an even boundary for a pure emoji run (round 1's old base corrupted that exact fixture); the C4 fixture was re-aligned with a 1-unit 'x' prefix so the cap lands mid-pair. Same base defect class, corrected probe — the head arm's code-point truncation is clean on both alignments.

Authorization gate and wire keys (re-measured)

Harness 2 (harness-2-gate-and-wire-keys.mjs), 23/23 (witness evidence/03-gate-and-wire-keys.png): fresh/undefined/numeric/object/'constructor' tokens rejected; registered token scoped to exactly its workspace cwd; revoke → reject; re-registration works. Wire keys: qwen.daemon.promptDisplayText and qwen.daemon.channelPromptAuthorization each exist at exactly their two known definition sites (acp-bridge bridgeTypes.ts + channels/base ChannelAgentBridge.ts; cli channel-worker-prompt-authorization.ts + channels/base) — the duplication is documented as intentional (channel-base keeps a minimal dependency footprint) and is pinned by the two cross-package wire-key tests, both green in the CLI gate. routes/session.ts strips both keys from forwarded _meta before conditionally re-admitting the display text; acpAgent.ts deletes the key for untrusted callers and restores it only at privateParentState === 'trusted'.

Secondary claims (re-measured)

  • Grouping — harness 3, 11/11 (witness evidence/02-grouping-matrix-head.png): two DingTalk instances share one section (+ whitespace-padded type trims in); Feishu separate; orphan listed first still lands in Other channels last; sourceId: 'constructor' safe (Object.hasOwn); blank type falls back; uncatalogued type uses raw label; first-seen order preserved when no fallback exists.
  • Session scope — base allow-set re-verified behaviorally-adjacent at the new base: tmp/base-tree channel-settings-store.ts:147 = ['user','thread','single'], head = ['user','thread','chat_thread','single']; pinned by the green registry/builtins/settings-store tests in the CLI gate.

Sanitizer boundaries (re-measured)

Harness 4 (harness-4-sanitize-display.mjs), 18/18: NEL/bidi/zero-width/line-separator/variation-selector stripped; newline preserved (multi-line keeps all lines); TAB/CR/DEL folded; brackets preserved; code-point cap clean at every boundary; production cap 8000 (ChannelBase.ts:335); benign CJK/emoji unchanged; plus the F-1 contrast pair.

Mutation matrix (re-run at new head)

Mutation Suite Result
MUT-1: extractFirstPromptFromRecords reverted to base logic core sessionService.test.ts killed4 failed | 134 passed; intended assertions, e.g. expected 'hello session a' to be 'later prompt' (witness evidence/04-mut1-kills-displaytext-tests.png)
MUT-2: Other-channels pin removed (return ordered) web-shell channelSessionGroups.test.ts killed2 failed | 2 passed (witness evidence/05-mut2-kills-pinning-tests.png)
MUT-3a: goalTurn?.permitundefined in the displayText branch (Session.ts) cli Session.test.ts, both targeted tests survived — both green; classified as a coverage gap (F-3), behavior verified correct by reading + gates (witness evidence/06-mut3-permit-drop-survives.png)
MUT-3b (positive control): if (false) on the same branch cli Session.test.ts killed — spy-argument mismatch names expected vs received

No other survivors. Both round-1 kill counts reproduced exactly. All mutated files restored byte-identical (git diff empty) before the green gate runs.

Targeted gates (head tree, all re-run this round)

Suite Result
core: sessionService + sessionTitle + chatRecordingService + autoTitle 258 passed (258)
acp-bridge: bridge.test.ts 575 passed (575)
channels/base: full workspace 1028 passed (1028)
channels/github GithubAdapter.test.ts 190 passed (190)
channels/qqbot events.test.ts 88 passed (88)
cli: wire-keys, registry, builtins, daemon-worker, memory-intent, settings-store, worker-supervisor, rename, resumeHistory (10 files) 397 passed (397)
cli: Session.test.ts + acpAgent.test.ts + server.test.ts 1912 passed (1912) — round 1 had 1892; +20 are main-side tests absorbed by the merge
web-shell: grouping + WorkspaceSection + sidebar collapse/removal + editor (6 files) 144 passed (144)
tsc --noEmit on packages/cli (the merge-affected package) clean, exit 0

Liveness of the core/web-shell/cli suites is proven by the mutation kills and positive controls above. Note: the first CLI gate run accidentally overlapped the MUT-1 window (cli vitest aliases core to ../core/index.ts source); it was re-run on the restored tree — the 1912 figure is from the clean re-run.

Reviewer Test Plan walkthrough (status at new head)

  1. Tasks default / channel session absent — sidebar suites green; capability gate unchanged (not browser-driven here).
  2. Platform sections, shared DingTalk, pinned stays, Other channels — harness 3, re-measured.
  3. New conversation appears under Channels on the active interval — code path + polling suites green; browser not available.
  4. User message/title show only user-visible content; image-only shows nothing — harness 1 C1/C2/C4/C5 re-measured; sessionTitle dialog switch green in core gate.
  5. Session scope section with effective default — registry/builtins green, re-run.
  6. Select Per thread, save, reopen — settings-store + editor green, re-run.
  7. Active/pinned/archived/search/secondary scoped to source — sidebar suites green, re-run.
  8. Old daemon: switch hidden, behavior unchanged — capability gate in code + collapse-persist suite green.

Findings

F-1 (Suggestion, carried over, stands): webhook display projection folds newlines, channel path preserves them. buildChannelWebhookDisplayText (ChannelWebhookTask.ts:118) runs title/summary through sanitizePromptText (folds CR/LF/TAB), while the live channel boundary uses newline-preserving sanitizeDisplayText. The comment states this mirrors the model-prompt treatment intentionally; no leak either way. Consider whether webhook summaries should get the display-side sanitizer for consistency.

F-2 (Suggestion, carried over, stands): echo drops text blocks after the first when a projection is present. echoPromptToSessionBus (bridge.ts:1386-1405): with displayText !== undefined, text blocks after the first are skipped. Current channel constructors emit exactly one text block (DaemonChannelBridge.ts:411-419), so nothing is dropped today; a future multi-text-block adapter would silently lose the extras from the session-bus echo. Latent, unchanged.

F-3 (Suggestion, new): the displayText × goalTurn combination is unpinned. See the Session.ts section above — MUT-3a survives both targeted tests; the reachable combination (channel message during an active Goal) records correctly today (both goalContext and the projection), but nothing asserts it. Completeness gap, not a defect; suggested fixture included above.

No blocking findings.

Not covered

  • Chromium e2e (web-shell.channels.spec.ts etc.): no browser in this container. Unit-level counterparts green.
  • Live provider round trips (DingTalk/Feishu/WeCom/GitHub/GitLab) — same scope statement as the PR.
  • Per-commit attribution of commits 1–33: shallow checkout; round 1 verified the aggregate at the old head, this round verified the aggregate at the new head plus the exact inter-round delta (only commit 34 is new, and its content effect is bounded in the Delta section). Individual older commits were not re-exercised.
  • Full-daemon HTTP wire run of a channel webhook end-to-end — each seam verified in isolation (harnesses 1–4) plus the 575-test bridge and 1912-test CLI suites; harnesses reproduce the persisted wire shape, not a live daemon trigger.
  • Trial merge into current main / repo-wide build+typecheck: no network in the sandbox, so origin/main beyond the snapshot's baseRefOid is unreachable; the PR head itself is a fresh merge of origin/main with conflict resolutions, which is the closest available proxy. The PR's own CI covers the repo-wide build/typecheck; this round ran a targeted tsc --noEmit on the merge-affected cli package only.
  • Behavioral A/B of the chat_thread settings-store acceptance — base allow-set cited from the HEAD^1 source; head acceptance pinned by its green test.

Methodology

Environment: node:22-bookworm CI container, repo at merge 04d354df03 (merge-ref checkout: HEAD^1 = base tip 50097c15, HEAD^2 = PR head e961edd3, matching the snapshot's baseRefOid/headRefOid); npm ci + npm run build pre-ran at head. Delta analysis used the locally reachable round-1 head 06336a25 (fetched object) to bound inter-round changes per file and per hunk. Arms: head = repo tree; base = git worktree add tmp/base-tree HEAD^1, each compiled with the repo's esbuild (--bundle --format=esm --platform=node --packages=external; verified zero @qwen-code/* runtime imports in every bundle, so no workspace-symlink confound, and identical external dependency sets across arms). Bundle placement: the two sessionService bundles live at packages/core/.harness/ inside the head tree because their external ajv/dist/2020.js import must resolve to the nested packages/core/node_modules/ajv v8 (the root node_modules/ajv is v6 and lacks it — a relocation that ignored this produced ERR_MODULE_NOT_FOUND and was reverted); the four self-contained bundles (authz, wirekeys, groups, sanitize — zero external imports) ship in this artifact's bundles/ so harnesses 2–4 rerun anywhere. Rebuild the sessionService bundles with ./node_modules/esbuild/bin/esbuild packages/core/src/services/sessionService.ts --bundle --format=esm --platform=node --packages=external --outfile=packages/core/.harness/sessionService.head.mjs (and the base-worktree equivalent) before re-running harness 1. Gates ran via per-package npx vitest run <files>; mutations were applied with exact-match text replacement and restored byte-identical (git-diff-verified) before green runs. Evidence PNGs via scripts/verify-capture.mjs. Assertion counts: H1 11 + H2 23 + H3 11 + H4 18 + mutation adjudications 4 + gates 9 + delta analysis 3 = 79, all passing; fail counts only unexpected outcomes (base-arm red cells are encoded as expected-failure controls and count as passes). One harness-design iteration occurred on H1 C4 (the pure-emoji fixture aligned evenly on the new base's 200-unit slice; re-aligned with an 'x' prefix) — the final run is the measurement.

Evidence images

01-ab-preview-projection-head-vs-base

02-grouping-matrix-head

03-gate-and-wire-keys

04-mut1-kills-displaytext-tests

05-mut2-kills-pinning-tests

06-mut3-permit-drop-survives

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅ Re-run verified the main merge (Goal v3 + admission hardening) and its single Session.ts conflict resolution on top of it; CI green at this head. Approved pinned to the reviewed commit.

@wenshao
wenshao added this pull request to the merge queue Aug 12, 2026
Merged via the queue into main with commit 01ef9bc Aug 12, 2026
61 of 79 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.11.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants