Skip to content

fix(cli): correct queued message display style and ordering - #7381

Merged
chiga0 merged 67 commits into
mainfrom
fix/queued-message-display-and-order
Jul 23, 2026
Merged

fix(cli): correct queued message display style and ordering#7381
chiga0 merged 67 commits into
mainfrom
fix/queued-message-display-and-order

Conversation

@chiga0

@chiga0 chiga0 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Fixes two display bugs for mid-turn steer messages (user input queued while the model is still responding). First, queued messages now render with proper user-input styling (> prefix with accent color) instead of notification styling ( icon). Second, queued messages now appear above the model's reply instead of below it, matching the expected chronological order.

Why it's needed

When a user types a message while the model is generating output, the message enters a queue and is processed at the next tool-call boundary or turn end. Previously, when the queued message was finally processed: (1) it displayed with a notification icon instead of the > user-input prefix, making it look like a system message rather than user input; (2) the model's reply appeared above the user's message in the terminal, which is the reverse of the expected user-then-model conversation order.

Reviewer Test Plan

How to verify

  1. Start a session and send a prompt that triggers tool calls (e.g., a code edit or shell command).
  2. While the model is still responding (during tool execution), type a follow-up message and press Enter — it should appear dimmed in the queue preview below the input box.
  3. When the model processes the queued message, verify:
    • The queued message renders with the > user-input prefix (accent color), not the notification icon.
    • The queued message appears above the model's reply to it, not below.

Unit tests covering both the message type and the settlement timing are included and passing (157 CLI tests + 264 core tests).

Evidence (Before & After)

Before: Queued message shows ● 当前是在补充测试吗? (notification style) and appears below the model's reply.

After: Queued message shows > 当前是在补充测试吗? (user-input style) and appears above the model's reply.

Tested on

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

Environment (optional)

Unit tests: npx vitest run in packages/cli and packages/core.

Risk & Scope

  • Main risk or tradeoff: The steer input settlement now happens on the first stream event rather than in the finally block. A WeakSet guard on GeminiClient ensures idempotency across recursive sendMessageStream invocations. If the stream produces no events (empty response), settlement falls back to the finally block as before.
  • Not validated / out of scope: Interactive TUI verification in a real terminal (unit tests cover the logic; visual confirmation left to reviewer).
  • Breaking changes / migration notes: None.

Linked Issues

中文说明

本 PR 做了什么

修复了 mid-turn steer 消息(模型输出期间用户排队输入的消息)的两个显示 bug。第一,排队消息现在以用户输入样式(> 前缀 + 主题色)渲染,而不再是通知样式( 图标)。第二,排队消息现在显示在模型回复的上方而非下方,符合"用户输入 → 模型回复"的时间线顺序。

为什么需要

当用户在模型生成输出时输入新消息,消息会进入队列,在下一个 tool-call 边界或 turn 结束时被处理。之前存在两个问题:(1) 排队消息以 通知图标显示,看起来像系统消息而非用户输入;(2) 模型的回复显示在用户消息上方,顺序颠倒。

审阅者测试计划

如何验证

  1. 启动会话,发送一个会触发工具调用的 prompt。
  2. 在模型仍在响应时(工具执行期间),输入一条后续消息并回车——它应该以暗淡样式显示在输入框下方的队列预览中。
  3. 当模型处理排队消息时,验证:
    • 排队消息以 > 用户输入前缀(主题色)渲染,而非 通知图标。
    • 排队消息显示在模型回复的上方,而非下方。

包含消息类型和 settle 时序的单元测试均已通过(CLI 157 个 + core 264 个)。

修改前后对比

修改前: 排队消息显示为 ● 当前是在补充测试吗?(通知样式),且位于模型 回复的下方。

修改后: 排队消息显示为 > 当前是在补充测试吗?(用户输入样式),且位于模型回复的上方。

测试环境

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

风险与范围

  • 主要风险/权衡:steer input 的 settle 现在在第一个 stream 事件到达时执行,而非在 finally 块中。GeminiClient 上的 WeakSet 保护确保跨递归 sendMessageStream 调用的幂等性。如果 stream 没有产生任何事件(空响应),settle 会回退到 finally 块。
  • 未验证/不在范围内:真实终端中的交互式 TUI 验证(单元测试覆盖了逻辑,视觉确认留给审阅者)。
  • 破坏性变更/迁移说明:无。

Mid-turn steer messages (user input queued while the model is
responding) had two display bugs:

1. They rendered with notification styling (● icon) instead of
   user-input styling (> prefix) because accept() added them to
   UI history as MessageType.NOTIFICATION.

2. They appeared below the model's reply because accept() was
   only called in the finally block after the entire response
   stream completed, appending the user message after all model
   response items.

Fix: use MessageType.USER with sentToModel: true for steer
messages, and settle the steer input on the first stream event
(after the user-content push lands but before model-response
events are committed to UI history). Pass steer inputs through
to recursive sendMessageStream calls so all takeSteerInput paths
benefit from early settlement. Add a WeakSet guard to
settleSteerInput for idempotency across recursive invocations.
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 82.62% 82.62% 88.76% 82.3%
Core 87.04% 87.04% 88.45% 86.15%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   82.62 |     82.3 |   88.76 |   82.62 |                   
 src               |   84.12 |    80.67 |   88.88 |   84.12 |                   
  cli.ts           |   94.54 |    84.07 |     100 |   94.54 | ...86-487,497-498 
  gemini.tsx       |   73.89 |    76.49 |    82.6 |   73.89 | ...1183-1187,1308 
  ...ractiveCli.ts |   85.02 |    80.82 |   86.84 |   85.02 | ...2363,2369,2421 
  ...liCommands.ts |   88.34 |     83.6 |      90 |   88.34 | ...63,480,514,635 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   68.02 |    70.81 |   88.79 |   68.02 |                   
  acpAgent.ts      |   67.63 |    70.62 |   88.79 |   67.63 | ...18,10623-10625 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...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.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,238-239 
 ...ration/session |    91.4 |    85.27 |   95.86 |    91.4 |                   
  Session.ts       |   90.93 |    83.91 |   95.05 |   90.93 | ...8196,8223-8227 
  ...entTracker.ts |   91.87 |    89.18 |   88.88 |   91.87 | ...33,197,280-289 
  ...stop-guard.ts |     100 |    97.05 |     100 |     100 | 37,127,247        
  ...eplay-page.ts |   92.27 |    88.09 |     100 |   92.27 | ...83,108-118,121 
  ...y-replayer.ts |    98.5 |    95.38 |     100 |    98.5 | 229-231           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    86.76 |     100 |   89.76 | ...54-270,326-328 
  tasksSnapshot.ts |   94.26 |     87.5 |     100 |   94.26 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.68 |     93.7 |   96.66 |   95.68 |                   
  ...ageEmitter.ts |   95.34 |    94.11 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |    83.33 |     100 |     100 | 59                
  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.17 |    97.43 |     100 |   99.17 | 352-353           
 ...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/commands      |   88.74 |    73.18 |   64.51 |   88.74 |                   
  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        |   97.77 |      100 |      50 |   97.77 | 56                
  serve.ts         |   86.44 |     67.3 |     100 |   86.44 | ...08-611,625-629 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |    86.7 |    87.24 |   90.11 |    86.7 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   79.31 |    84.61 |      80 |   79.31 | 35-38,47-50,61-64 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.85 |    96.32 |     100 |   95.85 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   94.69 |    85.77 |   97.61 |   94.69 | ...90-991,995-996 
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  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       |   81.22 |    87.27 |     100 |   81.22 | ...65-169,229-231 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |   75.68 |    75.28 |   66.66 |   75.68 | ...56,562-565,577 
  ...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.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.17 |    84.39 |   83.33 |   90.17 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   79.87 |    86.45 |   80.15 |   79.87 |                   
  agent-prompt.ts  |   90.85 |    92.78 |      96 |   90.85 | ...1256,1710-1779 
  capture-local.ts |   72.16 |     90.9 |      75 |   72.16 | 101-105,152-174   
  ...k-coverage.ts |   48.38 |    14.28 |   66.66 |   48.38 | ...21-226,239-249 
  cleanup.ts       |   64.28 |    45.45 |      50 |   64.28 | ...33-138,140-141 
  ...ose-review.ts |   95.42 |    92.13 |   91.66 |   95.42 | ...1099,1127-1143 
  fetch-pr.ts      |   24.78 |      100 |    12.5 |   24.78 | ...27-326,367-369 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  parse-args.ts    |   99.25 |       96 |     100 |   99.25 | 341,413           
  plan-diff.ts     |    67.9 |      100 |   66.66 |    67.9 | 121-148           
  pr-context.ts    |   84.02 |    76.37 |   91.66 |   84.02 | ...22-903,932-934 
  presubmit.ts     |   74.32 |       82 |   85.71 |   74.32 | ...46-347,399-429 
  ...ve-anchors.ts |   77.02 |    88.46 |      75 |   77.02 | ...70-175,187-204 
  submit.ts        |   74.44 |    80.82 |      80 |   74.44 | ...48-584,586-587 
  test-efficacy.ts |   80.68 |    69.41 |    92.3 |   80.68 | ...93-594,602-622 
 ...nds/review/lib |   95.46 |    92.65 |   94.81 |   95.46 |                   
  agent-briefs.ts  |   98.68 |      100 |       0 |   98.68 | 493-494           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  coverage.ts      |   95.37 |    94.08 |   95.45 |   95.37 | ...98,335,429-446 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    92.93 |     100 |   98.73 | ...41,264,290-291 
  gh.ts            |   85.27 |     87.5 |   69.23 |   85.27 | ...01,238-239,266 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    92.3 |    83.33 |   83.33 |    92.3 | 76-77             
  prompt-record.ts |   94.73 |    88.23 |     100 |   94.73 | ...28,151-152,156 
  report.ts        |   92.13 |    86.66 |     100 |   92.13 | 170-171,173-177   
  roster.ts        |     100 |    92.85 |     100 |     100 | 104,118,163       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.27 |    93.18 |     100 |   96.27 | ...83,269-270,294 
  workspaces.ts    |   97.76 |     91.3 |     100 |   97.76 | 186-187,212-213   
 ...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.49 |    88.58 |   95.48 |   94.49 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  config.ts        |   88.29 |    88.03 |   84.84 |   88.29 | ...2375,2377-2385 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.18 |     89.4 |   94.73 |   94.18 | ...22-626,642-643 
  ...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.74 |     100 |     100 | 47,160,220        
  keyBindings.ts   |   97.24 |       50 |     100 |   97.24 | 221-224           
  ...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.65 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      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 |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |    90.6 |    91.84 |   89.65 |    90.6 | ...61,963,965-966 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...tedFolders.ts |   94.46 |    95.72 |     100 |   94.46 | ...53-354,390-401 
 ...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/i18n          |   85.83 |    81.92 |   89.65 |   85.83 |                   
  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 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...24-625,628-629 
 ...active/control |   76.11 |    89.09 |      80 |   76.11 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |   39.72 |    62.93 |   47.22 |   39.72 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   49.11 |    62.96 |   54.54 |   49.11 | ...63-568,570-575 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |    37.8 |       60 |   46.66 |    37.8 | ...40-652,661-690 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.14 |     94.4 |   95.23 |   98.14 |                   
  ...putAdapter.ts |   98.09 |    93.65 |   98.07 |   98.09 | ...1319,1422-1423 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 84-85,125-126     
  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/serve         |   87.68 |    83.94 |   90.81 |   87.68 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    92.95 |     100 |    93.4 | ...19-320,323-325 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    97.77 |     100 |     100 | 603               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   85.85 |    91.78 |   95.83 |   85.85 | ...94-206,366-369 
  ...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 |   90.97 |    85.34 |     100 |   90.97 | ...80-684,690-694 
  ...er-manager.ts |   95.12 |    88.82 |   94.28 |   95.12 | ...68,492,503-505 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 82-83             
  ...supervisor.ts |   96.57 |     86.9 |   96.49 |   96.57 | ...1026,1134-1138 
  ...e-grouping.ts |     100 |    94.11 |     100 |     100 | 69,132            
  ...ub-session.ts |   92.04 |    77.77 |     100 |   92.04 | ...36-445,470,508 
  daemon-logger.ts |    82.2 |    77.31 |   91.76 |    82.2 | ...1720,1747-1753 
  ...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.37 |    90.06 |     100 |   98.37 | ...1037,1039-1040 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |    91.3 |       80 |     100 |    91.3 | ...24-127,205-212 
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.39 |    88.75 |     100 |   94.39 | ...22,700,716,726 
  fast-path.ts     |    91.3 |    81.98 |   95.45 |    91.3 | ...65-474,540-541 
  ...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-143             
  ...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 | ...27-128,139-140 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   84.78 |     80.8 |   72.68 |   84.78 | ...5593,5598-5599 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   96.03 |    89.58 |     100 |   96.03 | ...36,498-500,540 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   95.62 |    93.09 |   78.94 |   95.62 | ...1784,1804-1807 
  ...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 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.34 |    76.57 |     100 |   93.34 | ...17,820,833-835 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |    86.66 |     100 |   91.07 | ...79-182,216-219 
  ...ace-agents.ts |   57.15 |    67.61 |   86.66 |   57.15 | ...1821,1831-1841 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |       90 |    87.5 |     100 | 61,121            
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ace-memory.ts |   82.19 |    75.28 |     100 |   82.19 | ...82-489,549-556 
  ...ers-status.ts |   98.52 |       79 |     100 |   98.52 | 94,122,162,165    
  ...tion-store.ts |   89.63 |    88.27 |   92.59 |   89.63 | ...91-400,411-414 
  ...e-registry.ts |   91.26 |     90.8 |     100 |   91.26 | ...93-294,300-301 
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...e-remember.ts |   97.94 |    94.33 |     100 |   97.94 | ...00,304-309,350 
  ...te-runtime.ts |   93.14 |    87.71 |     100 |   93.14 | ...-88,92,145-150 
  ...management.ts |   71.84 |    71.67 |      96 |   71.84 | ...65-866,873-877 
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
  ...lls-status.ts |     100 |    94.73 |     100 |     100 | 109               
 ...serve/acp-http |   75.83 |     78.3 |   93.85 |   75.83 |                   
  ...r-registry.ts |     100 |    95.45 |     100 |     100 | 191               
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   98.19 |    88.55 |     100 |   98.19 | 1015,1037-1048    
  dispatch.ts      |   69.34 |    74.79 |     100 |   69.34 | ...4525,4573-4579 
  index.ts         |   82.04 |    78.69 |   89.58 |   82.04 | ...2197,2228-2230 
  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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |   85.68 |    80.06 |     100 |   85.68 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.6 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...ile-system.ts |   85.19 |     78.6 |     100 |   85.19 | ...2094,2104-2105 
 src/serve/routes  |   85.39 |    79.74 |   95.91 |   85.39 |                   
  a2ui-action.ts   |   99.49 |    94.52 |    87.5 |   99.49 | 250               
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |    98.8 |    88.46 |     100 |    98.8 | 134               
  health-demo.ts   |   94.17 |    83.33 |     100 |   94.17 | 62-66,143         
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |    84.2 |    83.18 |     100 |    84.2 | ...55-863,980-981 
  ...on-runtime.ts |     100 |     87.5 |     100 |     100 | 43,79             
  session.ts       |   86.24 |    81.76 |   94.82 |   86.24 | ...3824,3826-3827 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  usage-stats.ts   |     100 |    95.65 |     100 |     100 | 116               
  ...space-auth.ts |    83.7 |       75 |     100 |    83.7 | ...23,328,340-344 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |    82.1 |    77.17 |      90 |    82.1 | ...1000,1006,1009 
  ...extensions.ts |   87.44 |    72.76 |   95.74 |   87.44 | ...1788,1830-1831 
  ...-file-read.ts |   92.32 |       80 |     100 |   92.32 | ...94-595,598-599 
  ...file-write.ts |   84.44 |    64.13 |     100 |   84.44 | ...73-275,355-357 
  ...e-git-diff.ts |   94.11 |    91.89 |     100 |   94.11 | ...54-155,201-206 
  ...ce-git-log.ts |     100 |    92.68 |     100 |     100 | 51,76,182         
  workspace-git.ts |   62.19 |    83.33 |     100 |   62.19 | 71-81,87-107      
  ...-lifecycle.ts |   96.85 |       75 |     100 |   96.85 | 130-131,161-162   
  ...management.ts |   87.43 |    85.13 |     100 |   87.43 | ...1441,1461-1466 
  ...cp-control.ts |   71.29 |       67 |     100 |   71.29 | ...67-573,582-583 
  ...ace-models.ts |   95.87 |    92.42 |     100 |   95.87 | 38-39,136-141     
  ...ermissions.ts |   74.66 |    69.23 |     100 |   74.66 | ...25-233,254-271 
  ...e-settings.ts |   72.81 |     69.9 |     100 |   72.81 | ...85-589,594-604 
  ...tup-github.ts |   77.58 |    70.27 |   84.21 |   77.58 | ...88,310,354-355 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...ace-status.ts |   75.41 |    63.51 |     100 |   75.41 | ...35-336,360-361 
  ...pace-tools.ts |   74.82 |    69.23 |     100 |   74.82 | ...41-146,175-176 
  ...pace-trust.ts |   76.08 |       50 |   66.66 |   76.08 | ...01-206,214-215 
  ...pace-voice.ts |   91.45 |    82.35 |     100 |   91.45 | ...21-624,627-629 
 src/serve/server  |   90.53 |    89.41 |      95 |   90.53 |                   
  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 |    86.95 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.14 |    71.42 |     100 |   97.14 | 16                
  ...r-response.ts |    85.4 |    76.16 |     100 |    85.4 | ...91,708,771-780 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 33,41,100,156     
  ...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.11 |    95.09 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |    94.3 |       92 |     100 |    94.3 | 159-165           
  ...on-archive.ts |   89.61 |    90.56 |   88.23 |   89.61 | ...36-441,513-523 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   98.72 |    97.39 |     100 |   98.72 | ...26-628,769-771 
 src/serve/voice   |   85.15 |     93.1 |   90.47 |   85.15 |                   
  ...ice-config.ts |   96.77 |       30 |     100 |   96.77 | 85-86             
  voice-ws.ts      |   77.97 |    96.39 |   83.33 |   77.97 | ...55,470,508-510 
  ...oordinator.ts |     100 |    98.11 |     100 |     100 | 171               
 ...kspace-service |   89.53 |     83.4 |   89.47 |   89.53 |                   
  index.ts         |   89.05 |     82.9 |   87.87 |   89.05 | ...1158-1162,1165 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   91.96 |    88.41 |   97.81 |   91.96 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 104-117           
  ...killLoader.ts |   97.14 |    87.87 |     100 |   97.14 | 140,151-152       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   77.36 |    85.52 |   83.33 |   77.36 | ...43,168,210-211 
  ...mandLoader.ts |   97.36 |    92.68 |     100 |   97.36 | 153,160-161       
  ...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 |    93.75 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.29 |    86.11 |     100 |   88.29 | ...91-196,229-230 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.5 |    81.81 |     100 |    90.5 | ...37-438,445-446 
  ...-args-file.ts |   93.54 |    90.47 |    87.5 |   93.54 | 201-203,217-223   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.83 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   88.14 |    87.69 |     100 |   88.14 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.45 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.11 |      96 |   90.46 | ...66-668,671-673 
 ...ght/generators |   88.86 |    85.78 |   96.29 |   88.86 |                   
  DataProcessor.ts |   88.23 |    85.71 |      95 |   88.23 | ...1348,1352-1359 
  ...tGenerator.ts |   98.21 |    85.71 |     100 |   98.21 | 46                
  ...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 | 95-98             
  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.04 |    83.33 |      80 |   94.04 |                   
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   70.97 |    72.91 |   66.66 |   70.97 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   72.19 |    69.85 |   66.66 |   72.19 | ...4021,4025-4029 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |   29.23 |      100 |       0 |   29.23 | 25-75             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   62.73 |    47.22 |   66.66 |   62.73 | ...95-296,313-318 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.45 |    66.18 |   51.06 |   58.45 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.03 |    70.73 |   57.69 |   60.03 | ...87,791,800,803 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   80.75 |    83.31 |   88.83 |   80.75 |                   
  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  |   62.81 |    58.73 |   65.21 |   62.81 | ...90-595,680-688 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    81.25 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.1 |     84.9 |     100 |    92.1 | ...4-69,94-99,178 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...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 |   67.81 |    69.69 |   84.61 |   67.81 | ...59-592,603-604 
  copyCommand.ts   |   98.49 |    95.78 |     100 |   98.49 | ...80,280,321,327 
  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 |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   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   |   91.13 |    83.72 |      90 |   91.13 | ...81-184,196-199 
  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 |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  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  |    81.1 |     89.5 |   88.23 |    81.1 | ...80-793,827-832 
  ...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.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |    90.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |    90.6 |    77.95 |     100 |    90.6 | ...91-694,785-792 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.43 |      100 |      50 |    6.43 | 31-330            
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...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 |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |   69.55 |    78.19 |   76.11 |   69.55 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  ...ateScreen.tsx |   97.29 |     87.5 |   66.66 |   97.29 | 49                
  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 |   86.72 |    86.66 |     100 |   86.72 | ...00-302,355-359 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 18                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-596             
  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       |   78.71 |     62.5 |     100 |   78.71 | ...28-233,251-255 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   83.33 |    76.92 |     100 |   83.33 | 24-30             
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   78.22 |    64.28 |     100 |   78.22 | ...94,497,500-506 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   82.25 |    79.81 |      80 |   82.25 | ...2161,2187,2247 
  ...Shortcuts.tsx |   20.65 |      100 |       0 |   20.65 | ...7,50-52,68-126 
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.82 |    92.53 |      50 |   95.82 | ...97,440-444,447 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   86.41 |       73 |     100 |   86.41 | ...74,876,881-897 
  ...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 |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.47 |    73.89 |   69.23 |   71.47 | ...1243,1249-1250 
  ...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 |    5.46 |      100 |       0 |    5.46 | 24-215            
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.33 |    88.23 |     100 |   96.33 | 137-140           
  ...nsDisplay.tsx |   92.95 |       85 |     100 |   92.95 | ...79,182,209-211 
  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             
  ...criptView.tsx |   98.27 |    84.21 |     100 |   98.27 | 45,53             
  TrustDialog.tsx  |     100 |    81.81 |     100 |     100 | 71-86             
  ...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 |   53.72 |    70.87 |   42.85 |   53.72 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   64.78 |    29.41 |   33.33 |   64.78 | ...51,269,277-279 
  AgentFooter.tsx  |   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.38 |    68.69 |   73.68 |   42.38 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-164             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |    82.2 |    81.36 |    90.9 |    82.2 |                   
  ...sksDialog.tsx |   77.53 |     76.9 |   80.76 |   77.53 | ...1781,1803-1809 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 256               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.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.86 |    68.14 |   70.83 |   71.86 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.45 |    67.28 |   83.33 |   75.45 | ...76,781-782,819 
  SourcesTab.tsx   |   71.52 |    70.47 |   77.77 |   71.52 | ...27,546,618-630 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...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.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   86.99 |    81.37 |   91.89 |   86.99 |                   
  ...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.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...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.9 |    73.51 |   57.14 |    53.9 |                   
  ...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.46 |    81.25 |     100 |   88.46 | ...63,169,174-179 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   89.88 |    85.98 |   86.86 |   89.88 |                   
  ...ionDialog.tsx |   89.23 |    84.27 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.79 |     100 |     100 | 38,42,44,290,366  
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |    96.7 |    97.77 |   91.66 |    96.7 | 222-232           
  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 |   76.31 |     42.1 |   66.66 |   76.31 | ...99,101,124,155 
  ...tsDisplay.tsx |    95.5 |    88.31 |     100 |    95.5 | ...39,141,174-179 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   58.65 |       50 |    37.5 |   58.65 | ...20-125,146-158 
  ...ryMessage.tsx |   14.28 |      100 |       0 |   14.28 | 23-62             
  ...onMessage.tsx |   89.75 |     79.1 |     100 |   89.75 | ...33-635,642-644 
  ...upMessage.tsx |   98.32 |    95.16 |     100 |   98.32 | 183-186,413       
  ToolMessage.tsx  |   92.43 |    84.77 |   93.33 |   92.43 | ...56-961,988-990 
 ...ponents/shared |   85.73 |    82.05 |   94.05 |   85.73 |                   
  ...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.86 |      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 |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   88.51 |    85.11 |   81.81 |   88.51 | ...51-779,792,887 
  text-buffer.ts   |   85.94 |    81.73 |   97.91 |   85.94 | ...2651,2749-2750 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-678             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.04 |    53.19 |    37.5 |   14.04 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.42 |    59.52 |     100 |   35.42 | ...20-432,437-439 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   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   |    82.3 |    80.15 |   84.37 |    82.3 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   83.43 |    84.58 |     100 |   83.43 | ...1313,1321-1323 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   78.68 |    73.77 |   91.66 |   78.68 | ...86-389,398-401 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 150-151           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 233-234           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
 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      |   84.38 |     82.2 |   89.06 |   84.38 |                   
  ...dProcessor.ts |   81.73 |    81.69 |     100 |   81.73 | ...41-742,748-753 
  ...ention-ref.ts |   97.67 |       84 |     100 |   97.67 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...86-287,292-293 
  ...dProcessor.ts |   85.14 |    66.27 |   81.81 |   85.14 | ...1400,1421-1425 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   89.83 |    88.97 |     100 |   89.83 | ...49-456,496-505 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.08 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.73 |    76.59 |     100 |   94.73 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.85 |    80.76 |     100 |   94.85 | ...54,229,292-295 
  ...ompletion.tsx |   96.75 |    81.81 |     100 |   96.75 | ...78-279,289-290 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   94.11 |    89.65 |     100 |   94.11 | ...32-133,137-138 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |     97.7 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.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 |      100 |     100 |     100 |                   
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   85.48 |    80.97 |   96.15 |   85.48 | ...3882,4044-4052 
  ...BranchName.ts |     100 |    91.66 |     100 |     100 | 30                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    96.77 |     100 |     100 | 75                
  ...delCommand.ts |     100 |    92.85 |     100 |     100 | 48                
  ...ouseEvents.ts |   94.31 |    97.43 |   83.33 |   94.31 | 76-80             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   91.16 |     90.9 |     100 |   91.16 | ...35-338,453-463 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...tleRepaint.ts |     100 |      100 |     100 |     100 |                   
  ...umeCommand.ts |   94.67 |    74.28 |     100 |   94.67 | ...19,174,233-238 
  ...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 |       0 |        0 |       0 |       0 | 1-73              
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   53.06 |       50 |   66.66 |   53.06 | ...53,61-68,79-85 
  ...rminalSize.ts |     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 |      100 |     100 |     100 |                   
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.24 |    79.16 |   71.42 |   80.24 |                   
  ...ableModels.ts |   80.24 |    79.16 |   71.42 |   80.24 | ...,61-71,123-125 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 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      |   86.03 |    84.97 |   94.68 |   86.03 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   68.83 |    70.14 |      50 |   68.83 | ...52-254,274-293 
  ...wnDisplay.tsx |   92.85 |    93.46 |     100 |   92.85 | ...,953,1000-1018 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.68 |    82.35 |   95.23 |   92.68 | ...34-737,790-795 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |   96.77 |    87.62 |     100 |   96.77 | 173-180,281       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   52.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |    96.1 |    88.77 |     100 |    96.1 | ...73,175-176,320 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   90.38 |    73.91 |     100 |   90.38 | 23,25,29,31,33    
  formatters.ts    |    95.4 |    98.41 |     100 |    95.4 | 123-126           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |      96 |    97.05 |     100 |      96 | 102-105           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   69.47 |       75 |   66.66 |   69.47 | ...24-129,157-158 
  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.59 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    73.77 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   94.84 |    88.74 |     100 |   94.84 | ...57,442,446-447 
  ...red-height.ts |   96.85 |    95.45 |     100 |   96.85 | 71-73,201-203     
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   71.08 |    79.03 |   93.75 |   71.08 | ...03-525,656-657 
  ...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 |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   95.97 |    93.22 |   94.44 |   95.97 | ...21-322,482-483 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   89.65 |       92 |     100 |   89.65 | ...83-184,217-218 
  ...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 |    59.89 |   94.59 |      75 |                   
  collect.ts       |   71.21 |    65.81 |      96 |   71.21 | ...88-631,653-654 
  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      |   80.94 |    72.69 |   80.55 |   80.94 |                   
  ...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 |   89.72 |    65.33 |   93.75 |   89.72 | ...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 |    68.42 |     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         |   80.64 |    86.85 |   92.27 |   80.64 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |    97.3 |    95.09 |     100 |    97.3 | ...04-205,209-210 
  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 |       95 |     100 |     100 | 72                
  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      |   96.96 |    97.95 |     100 |   96.96 | 123-125           
  commentJson.ts   |   91.37 |    94.87 |     100 |   91.37 | 67-76             
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   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 |   92.39 |    92.23 |     100 |   92.39 | ...52,369-370,415 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   85.55 |       74 |     100 |   85.55 | ...39-240,268-278 
  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.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   74.38 |    69.56 |     100 |   74.38 | ...92-103,105-116 
  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.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...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 |     87.5 |     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       
  ...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 |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.04 |    86.15 |   88.45 |   87.04 |                   
 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        |   89.97 |    83.82 |   94.02 |   89.97 |                   
  ...transcript.ts |   88.15 |    84.61 |     100 |   88.15 | ...99,607,613-617 
  ...ent-resume.ts |   84.53 |    76.01 |   78.26 |   84.53 | ...1674-1678,1681 
  ...ound-tasks.ts |   96.14 |     90.1 |   98.76 |   96.14 | ...1728,1748-1751 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.65 |    89.28 |     100 |   95.65 | ...12-413,485-489 
  ...w-snapshot.ts |   91.86 |       75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   76.27 |    67.71 |   78.94 |   76.27 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.05 |    64.51 |   78.57 |   75.05 | ...1876,1882-1883 
  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.02 |    85.19 |   76.28 |   78.02 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.8 |    85.24 |   93.33 |    90.8 | ...64,666,668-669 
  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 |   89.22 |     86.2 |   86.86 |   89.22 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |    81.3 |    76.49 |    74.5 |    81.3 | ...2137,2164-2211 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    88.09 |   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 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.79 |    87.79 |   82.35 |   91.79 | ...1774,1823-1826 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |   96.87 |    94.51 |     100 |   96.87 | ...24-325,330-331 
  ...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   |   81.83 |    84.09 |    87.4 |   81.83 |                   
  TeamManager.ts   |   72.04 |     79.6 |   78.84 |   72.04 | ...1629,1652-1653 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.56 |   96.29 |   88.85 | ...-990,1034-1035 
  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        |   83.46 |    86.65 |   72.34 |   83.46 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   82.57 |    86.26 |   70.14 |   82.57 | ...7197,7201-7202 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.11 |    91.95 |      88 |   94.11 | ...25-426,429-430 
 ...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          |   91.51 |    87.91 |   92.65 |   91.51 |                   
  baseLlmClient.ts |   88.28 |    82.48 |   81.81 |   88.28 | ...47,660,666-668 
  client.ts        |    91.1 |    86.52 |   90.27 |    91.1 | ...3216,3312-3313 
  ...tGenerator.ts |   85.81 |     85.5 |   80.95 |   85.81 | ...23-424,469-475 
  ...lScheduler.ts |   89.98 |    86.14 |   95.83 |   89.98 | ...5346,5374-5385 
  geminiChat.ts    |   91.83 |    89.27 |   95.69 |   91.83 | ...4075,4123-4124 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |    95.83 |     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.33 |    83.33 |      50 |   93.33 | 46-47             
  ...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 |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.31 |    91.34 |   81.25 |   93.31 | ...1109,1312-1313 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |   96.89 |    80.88 |   88.23 |   96.89 | ...10,117-118,123 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-123        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...allIdUtils.ts |   98.41 |    93.02 |     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.49 |    91.17 |     100 |   98.49 | ...94,622-623,669 
 ...ntentGenerator |   96.15 |    87.11 |   95.38 |   96.15 |                   
  ...tGenerator.ts |   97.05 |    86.94 |   94.44 |   97.05 | ...1309,1338,1349 
  converter.ts     |   96.04 |    87.15 |     100 |   96.04 | ...,931,1086-1088 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   89.93 |    71.83 |   93.33 |   89.93 |                   
  ...tGenerator.ts |    88.3 |    71.21 |   92.85 |    88.3 | ...19-325,343-344 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   95.16 |    86.79 |    92.5 |   95.16 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.07 |    85.81 |    92.1 |   95.07 | ...1203-1204,1232 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.52 |    90.02 |   95.09 |   91.52 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.03 |    89.12 |   96.87 |   91.03 | ...1909,2078-2093 
  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      |   96.76 |    90.53 |     100 |   96.76 | ...1052,1060,1128 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |    92.2 |     92.4 |     100 |    92.2 | ...15-516,536-539 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   96.49 |    89.61 |   96.55 |   96.49 |                   
  dashscope.ts     |   97.48 |    91.91 |      95 |   97.48 | ...85-386,528-529 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |    97.5 |    96.55 |   88.88 |    97.5 | 123-124,198       
  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     |   86.08 |    82.95 |   92.19 |   86.08 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.69 |    85.42 |   97.82 |   90.69 | ...1189-1195,1239 
  ...ionManager.ts |   80.56 |    77.97 |   80.23 |   80.56 | ...2577,2599-2600 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.55 |    82.13 |     100 |   88.55 | ...58,948-949,959 
  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       
  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 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   77.38 |    79.84 |    90.9 |   77.38 |                   
  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   |   65.26 |    62.63 |   71.42 |   65.26 | ...17-618,625-626 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...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         |      95 |    88.94 |   95.83 |      95 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  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         |   87.41 |    85.72 |   88.38 |   87.41 |                   
  ...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.43 |     83.5 |   94.59 |   95.43 | ...1010-1011,1021 
  hookPlanner.ts   |    87.5 |    85.36 |   86.66 |    87.5 | ...21-225,232-243 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.42 |    72.04 |   66.66 |   62.42 | ...64-765,774-775 
  hookSystem.ts    |    87.5 |      100 |   70.21 |    87.5 | ...43-744,750-751 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  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     |   77.22 |    85.36 |     100 |   77.22 | ...57,261-267,273 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.24 |    96.09 |   88.88 |   94.24 | ...42-543,628-632 
  urlValidator.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.39 |    77.81 |   78.33 |   82.39 |                   
  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.52 |    58.06 |     100 |   79.52 | ...33-940,947-949 
  ...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        |   86.88 |    82.63 |   90.06 |   86.88 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.11 |    95.72 |   96.29 |   97.11 | ...85-287,361-362 
  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 |    81.81 |     100 |     100 | 126,136           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...entPlanner.ts |   91.51 |    76.19 |     100 |   91.51 | ...04,113-116,290 
  ...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 |     100 |      100 |     100 |     100 |                   
  manager.ts       |   78.44 |    82.29 |   77.77 |   78.44 | ...1482,1495-1497 
  ...ent-config.ts |   82.27 |    77.92 |   83.33 |   82.27 | ...66,285,292-298 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   94.73 |    95.94 |     100 |   94.73 | ...35-336,357-358 
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   96.96 |    85.71 |     100 |   96.96 | ...22,225,560-561 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    89.79 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   71.68 |    65.51 |   68.75 |   71.68 | ...90-394,397,403 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   93.33 |    81.25 |     100 |   93.33 | ...,94-95,119-120 
  ...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 |   79.38 |    81.03 |   81.81 |   79.38 | ...58-272,286-291 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.43 |    88.36 |   91.13 |   92.43 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.69 |    91.11 |     100 |   97.69 | 150,156,166       
  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.13 |     100 |     100 | 177,259           
  modelsConfig.ts  |   89.23 |    86.49 |   88.09 |   89.23 | ...1393,1422-1423 
  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.54 |    91.01 |   70.71 |   83.54 |                   
  autoMode.ts      |   97.64 |    93.13 |     100 |   97.64 | ...78-585,631,708 
  ...transcript.ts |      98 |    84.61 |     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.53 |    89.57 |      80 |   86.53 | ...1095,1201-1205 
  rule-parser.ts   |   94.14 |    91.89 |     100 |   94.14 | ...1335,1369-1371 
  ...-semantics.ts |   70.36 |    91.04 |   46.66 |   70.36 | ...2237,2300-2303 
  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.68 |    78.87 |   81.25 |   83.68 |                   
  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.78 |    74.41 |   78.26 |   75.78 | ...72-473,501-502 
  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 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |    85.3 |    78.57 |   95.89 |    85.3 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.55 |    73.24 |   90.62 |   82.55 | ...1183-1199,1229 
  ...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.52 |    84.99 |   96.29 |   89.52 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.35 |    85.34 |     100 |   97.35 | ...94,117,417-418 
  ...ionService.ts |   96.71 |    95.79 |     100 |   96.71 | ...83,699,832-840 
  ...ingService.ts |   87.48 |    81.45 |   89.83 |   87.48 | ...1840,1867-1868 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |       94 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.29 |    91.08 |   97.91 |   94.29 | ...1274,1673-1674 
  cronTasksFile.ts |   95.71 |    91.01 |     100 |   95.71 | ...93,318-319,437 
  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 |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   92.07 |    85.93 |    90.9 |   92.07 | ...09,211,323-330 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.05 |       69 |   95.74 |   74.05 | ...2170,2198-2199 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.22 |    97.32 |     100 |   98.22 | ...63-664,711-712 
  ...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.27 |    91.22 |     100 |   97.27 | ...50-451,606-607 
  ...ttachments.ts |   97.74 |     90.8 |     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 
  ...ipt-reader.ts |   94.49 |    89.16 |   97.95 |   94.49 | ...1038,1049-1050 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   76.81 |    73.71 |    92.1 |   76.81 | ...15-816,820-827 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.73 |     83.5 |    97.1 |   88.73 | ...2401,2471-2491 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.21 |    78.16 |   97.14 |   84.21 | ...2452,2458-2463 
  ...pInhibitor.ts |   97.42 |    92.68 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    86.66 |     100 |     100 | 96-97             
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...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.56 |      100 |   33.33 |   14.56 | 58-185            
  ...ionService.ts |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |   99.41 |    96.03 |     100 |   99.41 |                   
  microcompact.ts  |   99.41 |    96.03 |     100 |   99.41 | 244-245,677       
 ...s/visionBridge |    98.6 |    94.08 |     100 |    98.6 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.31 |    92.59 |     100 |   98.31 | ...21,645,658-659 
 src/skills        |   88.37 |    87.22 |   90.16 |   88.37 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   83.78 |    82.63 |   82.35 |   83.78 | ...1218,1225-1229 
  skill-paths.ts   |   89.65 |    86.95 |     100 |   89.65 | ...11-112,117-118 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     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.28 |    88.63 |   96.42 |   87.28 |                   
  ...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 |   83.55 |    85.01 |   94.59 |   83.55 | ...1501,1578-1579 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.28 |    88.39 |   83.17 |   81.28 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   97.47 |    93.15 |     100 |   97.47 | 39-44             
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |     100 |    90.47 |     100 |     100 | 49,76             
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  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.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   55.35 |    71.56 |   63.46 |   55.35 | ...1350,1367-1387 
  metrics.ts       |   78.44 |    79.62 |   79.66 |   78.44 | ...1079,1082-1093 
  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,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    90.3 |    89.15 |   96.66 |    90.3 | ...1602,1633-1636 
  ...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         |      82 |    86.95 |   85.71 |      82 | ...1328,1332-1339 
  uiTelemetry.ts   |   93.07 |    92.59 |   83.33 |   93.07 | ...62,290,410-411 
 ...ry/qwen-logger |   73.62 |    81.08 |   69.49 |   73.62 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   73.62 |     80.9 |   68.96 |   73.62 | ...1095,1133-1134 
 src/test-utils    |      94 |    98.24 |   78.94 |      94 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   92.57 |      100 |   75.75 |   92.57 | ...63,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   85.42 |    84.36 |   87.97 |   85.42 |                   
  ...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 |                   
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...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  |   94.04 |    82.53 |     100 |   94.04 | ...92,311,342-344 
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   83.21 |    86.66 |   80.95 |   83.21 | ...65-666,716-717 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.24 |    92.85 |     100 |   99.24 | 44                
  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 |   81.63 |       79 |   85.41 |   81.63 | ...3221,3223-3224 
  mcp-client.ts    |   79.58 |    84.81 |   88.88 |   79.58 | ...2186,2190-2193 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   95.43 |    93.89 |     100 |   95.43 | ...79-780,830-831 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...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.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    89.74 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   95.64 |    88.88 |   86.66 |   95.64 | ...74,489,561-562 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |    90.9 |    86.71 |    87.5 |    90.9 | ...13-414,428-440 
  ripGrep.ts       |    95.9 |     88.4 |   94.73 |    95.9 | ...61-662,668-669 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |    81.2 |    89.74 |    62.5 |    81.2 | ...80-286,369-377 
  ...n-mcp-view.ts |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.45 |    83.42 |   91.75 |   78.45 | ...4960,5023-5024 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.06 |    93.33 |   89.47 |   91.06 | ...71,475,520-542 
  ...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     |   93.92 |    83.13 |   92.85 |   93.92 | ...86-391,413-414 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   77.13 |    76.47 |   82.22 |   77.13 | ...23-924,932-933 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   92.74 |    91.52 |    91.3 |   92.74 | ...63-564,580-586 
  ...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.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |   85.66 |    85.04 |   85.71 |   85.66 | ...53-756,793-828 
 src/tools/agent   |   85.04 |    85.02 |   86.66 |   85.04 |                   
  agent.ts         |   84.87 |    84.77 |   86.17 |   84.87 | ...4082,4104-4114 
  fork-subagent.ts |   88.32 |       90 |    90.9 |   88.32 | ...05-123,200-201 
 ...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 |   87.46 |    79.41 |   85.71 |   87.46 |                   
  workflow.ts      |   87.46 |    79.41 |   85.71 |   87.46 | ...51-652,664-667 
 src/utils         |   92.53 |    89.69 |   96.58 |   92.53 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.76 |     93.3 |     100 |   94.76 | ...30-531,634-638 
  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 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.11 |    89.47 |     100 |   91.11 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    91.66 |     100 |     100 | 15,43,57          
  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 
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.06 |   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        |   82.23 |    92.85 |    61.9 |   82.23 | ...56-372,376-382 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  fileUtils.ts     |   95.33 |       92 |   96.15 |   95.33 | ...1747,1772-1773 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.36 |    94.28 |     100 |   94.36 | ...17-120,331-336 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  gitDiff.ts       |   95.12 |    81.03 |     100 |   95.12 | ...1073,1390-1391 
  gitDirect.ts     |   98.46 |    90.17 |     100 |   98.46 | 148,268,352       
  ...noreParser.ts |   94.59 |    92.59 |     100 |   94.59 | ...05-106,140-141 
  gitUtils.ts      |      75 |    88.88 |   83.33 |      75 | ...,78-79,103-154 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...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.27 |     93.1 |     100 |   95.27 | ...16-317,356-359 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.01 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   93.77 |    89.15 |     100 |   93.77 | ...13-319,406-407 
  ...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 
  partUtils.ts     |     100 |    98.61 |     100 |     100 | 206               
  pathReader.ts    |   97.77 |       90 |     100 |   97.77 | 93,121            
  paths.ts         |   93.95 |    92.79 |     100 |   93.95 | ...78-479,481-483 
  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 |   59.15 |    76.92 |     100 |   59.15 | ...5,89-90,96-101 
  ...noreParser.ts |   92.63 |    91.37 |     100 |   92.63 | ...72-173,192-193 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   97.73 |    93.24 |     100 |   97.73 | 85-86,107,262-263 
  readManyFiles.ts |   96.29 |     87.5 |     100 |   96.29 | 225,275,286-290   
  retry.ts         |   95.93 |    92.23 |     100 |   95.93 | ...33,524-525,543 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.65 |    96.96 |     100 |   97.65 | ...00,250-251,277 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   50.94 |    85.71 |      70 |   50.94 | ...54-255,268-346 
  ...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 |   83.59 |    86.25 |      96 |   83.59 | ...08,633,662-671 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |       90 |     100 |    97.5 | 162-163           
  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 |   94.77 |     94.2 |     100 |   94.77 | ...41-42,96,98-99 
  ...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.72 |    92.12 |     100 |   91.72 | ...36-539,615-616 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |     83.8 |     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.05 |    88.56 |     100 |   86.05 | ...2246,2253-2257 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |    90.47 |     100 |     100 | 46-48             
  ...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          
  ...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.82 |     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 |    30.76 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.11 |    96.33 |     100 |   96.11 | ...22-327,329-334 
  ...pt-records.ts |   85.78 |    83.63 |     100 |   85.78 | ...84-388,418-433 
  truncation.ts    |   90.44 |    89.09 |     100 |   90.44 | ...18-426,463-469 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,299-301 
  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.68 |    80.38 |   94.69 |   83.68 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.47 |    76.22 |      95 |   82.47 | ...1525,1559-1560 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: observed bug with concrete before/after evidence — queued mid-turn steer messages render with notification styling instead of > user-input styling, and appear below the model's reply instead of above it. The author tested on macOS and provided specific examples (● 当前是在补充测试吗?> 当前是在补充测试吗?). No linked issue, but the reproduction is clear from the description.

Direction: aligned — this is a display correctness fix for the interactive TUI, squarely within qwen-code's core mission. No auth/sandbox/telemetry concerns.

Size: 87 production logic lines (67 CLI + 20 core) vs. 423 test lines. Core touch is small (20 lines in client.ts — WeakSet guard + early settling + steerInput forwarding). Well under all thresholds.

Approach: the scope feels right. Two bugs, two fixes: (1) change the message type from NOTIFICATION to USER with sentToModel: false to get correct styling, (2) settle the steer on the first stream event instead of in finally to get correct ordering. Every downstream consumer that counts user turns or classifies synthetic items is updated consistently. The realUserPromptTexts extraction from AppContainer is a clean dedup. No drive-by refactors or unrelated changes.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:已观测到的 bug,有具体的 before/after 证据——mid-turn steer 消息以 通知样式渲染,而非 > 用户输入样式,且显示在模型回复下方而非上方。作者在 macOS 上测试并提供了具体示例。虽无关联 issue,但描述中复现清晰。

方向:对齐——这是交互式 TUI 的显示正确性修复,属于 qwen-code 核心使命。无 auth/sandbox/telemetry 相关顾虑。

规模:87 行生产逻辑(CLI 67 + core 20)vs. 423 行测试。Core 改动很小(client.ts 20 行——WeakSet 保护 + 提前 settle + steerInput 转发)。远低于所有阈值。

方案:范围合理。两个 bug,两个修复:(1) 将消息类型从 NOTIFICATION 改为 USERsentToModel: false)以获得正确样式;(2) 在第一个 stream 事件时 settle steer 而非在 finally 中,以获得正确排序。所有下游消费者(用户 turn 计数、synthetic 分类)都一致更新。从 AppContainer 提取 realUserPromptTexts 是干净的去重。无顺手重构或无关改动。

进入代码审查 🔍

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code Review

Independent proposal: given "queued steer messages show wrong icon and wrong order", I'd (1) change the addItem call in the steer-accept path from NOTIFICATION to USER with a flag distinguishing it from real turns, (2) settle the steer before model-response events hit UI history so the user message renders first, (3) audit every item.type === 'user' check downstream.

Comparison with the diff: the PR matches this almost exactly, and goes further in a good way — it also handles isSyntheticHistoryItem (so auto-restore still works when only a steer follows the real prompt), source-copy numbering in MainContent (steer doesn't reset code-block counters), collapse policy in resumeHistoryUtils, away-summary turn counting, and chat-recording reconstruction. The realUserPromptTexts extraction from AppContainer is a clean dedup of the inline filter that was already there.

The core change is well-structured: the WeakSet<SteerInput> guard on GeminiClient makes settleSteerInput idempotent, so the early settle on the first stream event and the finally-block settle can coexist without double-accept/restore. The steerInput forwarding through the Steer and Hook continuations (previously undefined) is necessary for the early settle to work in recursive sendMessageStream calls — without it, the continuation's first event would never trigger the settle.

No critical blockers. No convention violations.

Unit Tests

All changed-file tests pass on the PR head:

packages/cli:
  ✓ src/ui/utils/historyUtils.test.ts        (20 tests)
  ✓ src/ui/hooks/useAwaySummary.test.ts       (3 tests)
  ✓ src/ui/utils/resumeHistoryUtils.test.ts   (32 tests)
  ✓ src/ui/components/MainContent.test.tsx     (17 tests)
  ✓ src/ui/hooks/useGeminiStream.test.tsx     (161 tests)

packages/core:
  ✓ src/core/client.test.ts                  (284 tests)

Total: 517 tests passed, 0 failed

Real-Scenario Testing

tmux is not available in this CI environment (not installed, no sudo to install). The mid-turn steer is an interactive-only feature — it requires typing while the model is streaming — so it cannot be exercised in headless (-p) mode.

Compensating verification:

  1. Rendering logic confirmed via source: HistoryItemDisplay dispatches type === 'user'UserMessage (renders > prefix in accent color) and type === 'notification'InfoMessage (renders prefix). Changing the addItem call from NOTIFICATION to USER is sufficient to flip the icon.

  2. Ordering logic confirmed via unit test: client.test.ts → "settles an attached steer before content events reach the consumer" verifies accept() fires on the first iter.next(), before any content event is yielded to the UI layer.

  3. Headless smoke test: npm run dev -- -p "say hello" --output-format text succeeds on the PR head — the dev build starts and responds correctly.

$ npm run dev -- -p "say hello" --output-format text
Hello! How can I help you today?
中文说明

代码审查

独立方案: 针对"排队 steer 消息图标错误、顺序颠倒",我会 (1) 将 steer accept 路径中的 addItemNOTIFICATION 改为 USER 并加标志区分真实 turn,(2) 在模型响应事件到达 UI 历史之前 settle steer,使用户消息先渲染,(3) 审查所有下游 item.type === 'user' 检查。

与 diff 对比: PR 几乎完全匹配此方案,且做得更好——还处理了 isSyntheticHistoryItem(auto-restore 在仅有 steer 跟随真实 prompt 时仍可工作)、MainContent 中的源码复制编号(steer 不重置代码块计数器)、resumeHistoryUtils 中的折叠策略、away-summary turn 计数、以及聊天记录重建。从 AppContainer 提取 realUserPromptTexts 是对已有内联 filter 的干净去重。

Core 改动结构良好:GeminiClient 上的 WeakSet<SteerInput> 保护使 settleSteerInput 幂等,因此第一个 stream 事件的提前 settle 和 finally 块的 settle 可以共存而不会双重 accept/restore。通过 Steer 和 Hook 续接转发 steerInput(之前为 undefined)是提前 settle 在递归 sendMessageStream 调用中工作的必要条件。

无关键阻塞项。无规范违反。

单元测试

所有改动文件的测试在 PR head 上通过:共 517 个测试通过,0 个失败。

真实场景测试

此 CI 环境中 tmux 不可用(未安装,无 sudo 权限安装)。Mid-turn steer 是纯交互功能——需要在模型流式输出时输入——无法在 headless(-p)模式下触发。

补偿验证:

  1. 通过源码确认渲染逻辑:type === 'user'UserMessage> 前缀),type === 'notification'InfoMessage 前缀)。
  2. 通过单元测试确认排序逻辑:accept() 在第一个 iter.next() 时触发。
  3. Headless 冒烟测试通过。

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean, minimal fix for a real display bug; comprehensive tests cover every changed path. Docked one point only because interactive TUI verification wasn't possible in this environment (no tmux), though the rendering and ordering logic are confirmed through source code and unit tests.

The PR does exactly what it says: two small, focused fixes for mid-turn steer messages. The NOTIFICATIONUSER + sentToModel: false change is the right call — it reuses the existing UserMessage rendering path instead of adding a new display type, and the sentToModel flag cleanly distinguishes steer injections from real user turns everywhere downstream. The early-settle-on-first-event with the WeakSet idempotency guard is a neat solution to the ordering problem — it ensures the user message lands in history before the model's response events, without breaking the finally-block fallback for empty streams.

What impressed me: the author audited every consumer of item.type === 'user' — synthetic classification, turn counting, collapse policy, away-summary gating, source-copy numbering, chat-recording reconstruction — and updated them all consistently. That's the kind of thoroughness that prevents follow-up bugs. The test coverage is strong: 517 tests across 6 files, including new tests for each downstream consumer.

No blocking issues. Shipping this. ✅

中文说明

置信度:4/5 — 干净、最小化的修复,针对真实显示 bug;全面的测试覆盖了每个改动路径。扣一分仅因为此环境无法进行交互式 TUI 验证(无 tmux),但渲染和排序逻辑已通过源码阅读和单元测试确认。

PR 完全做到了它所描述的:两个小而聚焦的修复。NOTIFICATIONUSER + sentToModel: false 是正确的选择——复用已有的 UserMessage 渲染路径,sentToModel 标志在所有下游干净地区分 steer 注入和真实用户 turn。第一个事件时提前 settle + WeakSet 幂等保护是排序问题的巧妙解决方案——确保用户消息在模型响应事件之前落入历史,同时不破坏空流的 finally 回退。

印象深刻的是:作者审查了 item.type === 'user' 的每个消费者——synthetic 分类、turn 计数、折叠策略、away-summary 门控、源码复制编号、聊天记录重建——并全部一致更新。这种彻底性防止了后续 bug。测试覆盖强:6 个文件 517 个测试,包括每个下游消费者的新测试。

无阻塞问题。可以合入。✅

Qwen Code · qwen3.8-max-preview

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

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

@wenshao

wenshao commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the fix — both display bugs are real, and the core mechanism here is sound. I traced the full settle path and ran the suites locally (264 core + 157 CLI pass, eslint clean). Detailed review below.

What I verified

  • The "push has landed by the first event" invariant holds. chat.sendMessageStream pushes the user content and bumps the counter (geminiChat.ts:2136-2141) inside the awaited setup, before the response generator is even returned (turn.ts:454). So every event the settle loop can observe — including retry, model_fallback, and compressed — is strictly post-push, and the first-event settle can never mis-restore().
  • The ordering fix works for both steer paths. The Finished handler seals the previous reply's pending item before the core re-enters sendMessageStream for a continuation (useGeminiStream.ts:2107-2118), and the settle now runs core-side before the first event of the continuation is yielded to the UI — so the > user item lands between the two replies, for both the turn-end recursion and the tool-boundary drain.
  • Idempotency is double-covered. The WeakSet guard plus the CLI-side settled flag in resolveDrainedSteerMessages; the existing core tests assert accept/restore are called exactly once through the recursion sites using bare vi.fn() mocks, so a double-settle would fail them.
  • Threading steerInput through the recursion sites is an improvement beyond display. Pre-PR, the outer finally compared push counts across the entire recursion, so a nested continuation's push could mask a failed steer push and produce a false accept(). Settling at the steer frame's own first event ties acceptance to the steer content's actual push. All three recursion sites explicitly override steerInput, so nothing leaks through the ...options spreads.
  • Side benefit: recordMidTurnUserMessage now fires before the reply is recorded, so the session JSONL ordering is fixed too.

Issues

1. Rewind counting desyncs for steer messages drained at a tool-call boundary.

isRealUserTurn (historyMapping.ts:26-36) now returns true for these items (type: 'user', sentToModel: true), but computeApiTruncationIndex maps UI turns to API history by counting standalone user-text Contents — isUserTextContent (historyMapping.ts:46-49) excludes any Content carrying a functionResponse. Tool-boundary steers are merged into the ToolResult submission as one Content (useGeminiStream.ts:3503), so after this PR the UI counts a turn the API walk can't see: every rewind target after such a message truncates one user-prompt too late, and the steer item itself becomes a selectable target in RewindSelector with no matching API boundary.

Note the flip side, which I assume is unintentional but is a genuine improvement: for turn-end steers (the core recursion path) the content is a standalone user Content, so the pre-PR state was desynced in the opposite direction (API +1 / UI +0) and this PR actually fixes it. So this isn't "don't do this" — it's that the two steer paths now disagree. Options: mark these items so rewind can account for them (e.g. a midTurn: true field consulted by computeApiTruncationIndex/RewindSelector), or exclude the tool-boundary variant from isRealUserTurn until rewind understands merged Contents. (useTurnDiffs is safe — it keys on promptId, which these items lack, and skips them.)

2. The fix doesn't survive resume.

resumeHistoryUtils.ts:335-345 still restores mid_turn_user_message records as { type: 'notification' }, so a resumed session renders the same message with the old styling — and classifies it differently for the counting in (1) than the live session did. Suggest updating the resume mapping in this PR to match whatever semantics you settle on for (1).

3. Test coverage doesn't pin the actual fix.

The diff only updates existing CLI assertions from NOTIFICATION to USER; no new test asserts the settle-before-first-event timing, which is the core behavioral change (the PR body's "settlement timing" tests are the pre-existing suites). A small client.test.ts case would lock the regression out: attach a steerInput, assert accept() was already called when the first Content event reaches the stream consumer, plus the empty-stream fallback settling in finally.

4. Nit: the as HistoryItemWithoutId cast (useGeminiStream.ts:2542) is unnecessary — slashCommandProcessor.ts:859 passes the identical shape uncast — and it disables excess-property checking on the literal.

Verdict

Core change is correct and I could not break the settle invariants adversarially. I'd like (1) and (2) addressed — or at least explicitly decided — before merge, since they silently change rewind behavior for a feature that's easy to miss in manual testing.


🤖 Reviewed with Claude Code (claude-fable-5)

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

Reviewed — no blockers. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

— qwen3.7-max via Qwen Code /review

Comment thread packages/core/src/core/client.ts
Verify that accept() is called after the first stream event is
pulled but before subsequent events reach the consumer, pinning
the settle-before-content timing that ensures queued user
messages render above the model's reply.
@wenshao

wenshao commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Review — fix(cli): correct queued message display style and ordering

Overview

Two coupled fixes for mid-turn steer messages (input queued while the model is still streaming):

  1. CLI (useGeminiStream.ts): the steer accept() now adds a MessageType.USER item (> prefix, accent color, sentToModel: true) instead of MessageType.NOTIFICATION ().
  2. Core (client.ts): steer settlement moves from the outer finally to the first stream event, guarded by a per-GeminiClient WeakSet<SteerInput> for idempotency; the three recursive sendMessageStream calls now forward steerInput/pendingSteer instead of undefined, so their turns also settle early. This puts the user message above the model's reply.

Correctness — checked and holds up

  • The timing invariant is sound. The "user-content push has landed by the first stream event" assumption is correct: GeminiChat.sendMessageStream pushes user content and increments userContentPushCount synchronously (geminiChat.ts:2136-2141) before returning the async generator, and Turn.run awaits that call before yielding anything (turn.ts:454). So on the first event currentPushCount() > pushCountBeforeaccept(), never a spurious restore(). A send that fails before the push throws (zero events) → falls through to the finallyrestore(), as before. Even a ChatCompressed first event can't race this, since compression runs before the push and the push is synchronous.
  • Idempotency is correct. The WeakSet makes settleSteerInput run once per SteerInput; whichever site fires first (early loop vs. finally vs. parent-recursion finally) wins, the rest no-op. The push-count baselines captured at each site are equal (no pushes occur between the capture points), so early-vs-late settlement can't flip the accept/restore decision.
  • All three recursion sites covered (2626 steer, 2848 hook, 2948 next-speaker) now propagate the steer — no leaked path where a steer would settle late.
  • The new core test has teeth. settles an attached steer before content events reach the consumer asserts accept is called after the first iter.next(), which fails under the old finally-only behavior — a genuine regression guard.
  • sentToModel: true is semantically right (the message did reach the model), and the as HistoryItemWithoutId cast matches the established pattern in this file (needed only because the MessageType enum doesn't narrow to the 'user' literal).

Findings

1. (Medium) The style fix isn't applied to the resume path — live and resumed sessions now diverge.
resumeHistoryUtils.ts:343 still reconstructs a mid_turn_user_message record as a notification:

if (record.subtype === 'mid_turn_user_message') {
  ...
  items.push({ type: 'notification', text });   // still ●, not >
}

recordMidTurnUserMessage (unchanged) persists these with subtype mid_turn_user_message, so a queued message renders > live but reverts to after the session is resumed — the exact inconsistency this PR sets out to remove, relocated to the resume boundary. Recommend updating this branch to { type: 'user', text, sentToModel: true } (with a matching resume test) to fully close display bug #1.

2. (Low) Behavioral change beyond styling: mid-turn messages are now "real user turns."
With type: 'user' + sentToModel: true, isRealUserTurn (historyMapping.ts:29-30) now returns true for these items (it returned false when they were notification). That can affect rewind checkpoints and any user-turn accounting keyed on isRealUserTurn. This is arguably more correct, but it's not purely cosmetic — please confirm it's intended and that rewind boundaries behave as expected.

3. (Nit) Stale test title. settles an attached ToolResult steer only after history accepts it (client.test.ts) still passes, but the "only after" wording predates the early-settlement change and reads oddly next to the new test. Consider a rename for clarity.

Verdict

The core timing/idempotency reasoning is careful and correct, tests are updated consistently (all six base assertions), and the new test guards the fix. The one substantive gap is the resume path (finding #1): without it, the display-style fix is only half-complete. Recommend addressing #1 before merge; #2 is worth a quick confirmation.

Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts Outdated
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts Outdated
Comment thread packages/core/src/core/client.test.ts
- Use sentToModel: false instead of true: steer messages are injected
  into an existing tool-result turn, not standalone user turns.
  sentToModel: true would make isRealUserTurn() count them as real
  turns, inflating the rewind turn index.
- Remove unnecessary as HistoryItemWithoutId cast.
- Add post-cleanup assertion in ordering test to verify the WeakSet
  guard prevents double-settlement.

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

Reviewed — no blockers. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

— qwen3.7-max via Qwen Code /review

Comment thread packages/core/src/core/client.ts
@wenshao

wenshao commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Re-review — after the sentToModel change

Picking this up again now that the styling item flipped from sentToModel: truesentToModel: false (useGeminiStream.ts:2537-2544). That directly addresses the rewind concern from my earlier pass, so this revision is in good shape. Re-verified the whole path against the current diff.

Confirmed still-correct

  • Timing invariant holds. The user-content push + counter bump happen synchronously in GeminiChat.sendMessageStream (geminiChat.ts:2136-2141) before the response generator is returned, so by the first stream event currentPushCount() > pushCountBeforeaccept(), and a send that throws pre-push yields zero events → falls through to the finallyrestore(). First-event settle can't mis-restore().
  • Idempotency is solid. The per-GeminiClient WeakSet<SteerInput> (client.ts:241, 1859-1860) plus the CLI-side settled flag in resolveDrainedSteerMessages. All three recursion sites now forward steerInput/pendingSteer (client.ts:2646, 2869, 2971), and the baselines captured at each site are equal (no pushes in between), so early-vs-late settlement can't flip the accept/restore decision.
  • The new core test has teeth. settles an attached steer before content events reach the consumer asserts accept fires after the first iter.next() and stays at one call through iter.return — a genuine regression guard that fails under the old finally-only behavior. This closes the "tests don't pin the fix" gap from before.

Why sentToModel: false is the right call here

isRealUserTurn (historyMapping.ts:29-30) returns false for sentToModel: false, which is exactly what the old notification item produced (type !== 'user' → false). So every isRealUserTurn consumer — RewindSelector (rewind targets), AppContainer:3274 (rewind index counting), useTurnDiffs — sees no behavior change. That sidesteps the tool-boundary rewind desync I flagged last time (merged functionResponse Content the API walk can't see). Nicely conservative for a display-focused PR.

Findings

1. (Medium — still open) Resume path still renders , so live vs. resumed sessions diverge.
resumeHistoryUtils.ts:343 still reconstructs mid_turn_user_message as { type: 'notification', text }. recordMidTurnUserMessage (unchanged) persists these, so a queued message shows > live but reverts to after resume — the same inconsistency this PR removes, just relocated to the resume boundary. To fully close display bug #1, update that branch to { type: 'user', text, sentToModel: false } (matching the live choice, keeping isRealUserTurn false) and add a resume test.

2. (Low) sentToModel: false contradicts the field's documented meaning and is load-bearing.
The doc on this field says it means the turn "reached the model" (types.ts:123-131) — and the steer message does reach the model (it's pushed into API history). The false here is chosen not because it didn't reach the model, but to force isRealUserTurn to treat it like the old notification and leave rewind counting untouched. That intent isn't obvious at the call site, and a future "correctness" fix to true would silently reintroduce the rewind desync. Please add a one-line comment at useGeminiStream.ts:2537 explaining that false is intentional to preserve isRealUserTurn/rewind semantics. (A cleaner long-term model would be a dedicated midTurn marker consulted by isRealUserTurn, but that's out of scope here.)

Resolved since my prior review

  • Rewind desync for mid-turn steers → neutralized by sentToModel: false.
  • Missing settle-timing test → new core test added.
  • The as HistoryItemWithoutId cast nit → gone (call site is uncast).

Verdict

Core timing/idempotency mechanism is correct and I couldn't break the settle invariants adversarially. Only finding #1 leaves the display fix half-complete (resume still shows ); worth folding into this PR since it's the same bug. #2 is a comment-only ask. Otherwise LGTM.

@wenshao

wenshao commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

Resume path now renders mid_turn_user_message as MessageType.USER with
sentToModel: false, matching the live-session styling. Add a comment
documenting the intentional sentToModel: false choice.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on:

Review feedback addressed

Feedback point 1 — Resume path renders instead of > (Medium, @wenshao)

Decision: Implemented.

Changes: resumeHistoryUtils.ts now reconstructs mid_turn_user_message records as { type: MessageType.USER, text, sentToModel: false } instead of { type: 'notification', text }, matching the live-session rendering in useGeminiStream.ts. The sentToModel: false keeps isRealUserTurn returning false, preserving rewind counting semantics. Updated the corresponding test assertion in resumeHistoryUtils.test.ts.

Feedback point 2 — sentToModel: false needs an explanatory comment (Low, @wenshao)

Decision: Implemented.

Changes: Added a one-line comment at the sentToModel: false call site in useGeminiStream.ts explaining the value is intentionally false to preserve isRealUserTurn/rewind semantics — the steer message is injected into an existing tool-result turn, not a standalone user turn.

Feedback point 3 — Continuation-turn steer test (Suggestion, rc:3621128092, @qwen-code-ci-bot)

Decision: Declined (pre-existing, recorded by @chiga0). The early-settle mechanism is tested on the direct call path; the continuation changes are simple option pass-throughs. A full continuation-turn test would require mocking stop-hook / next-speaker paths, which is beyond this PR's scope. Tracked as a follow-up improvement.

Previously addressed (prior commits, no new action needed)

  • rc:3619499951 (ordering test) — added in 898ecee
  • rc:3620425863 (sentToModel: truefalse) — fixed in df02b6e
  • rc:3620425882 (remove as HistoryItemWithoutId cast) — fixed in df02b6e
  • rc:3620425888 (assert after iter.return()) — fixed in df02b6e

Conflict notes

No conflicts (--conflict false).

Verification results

  • npm run build — ✅ passed
  • npm run typecheck — ✅ passed
  • npm run lint — ✅ passed
  • resumeHistoryUtils.test.ts — 31/31 passed
  • useGeminiStream.test.tsx — 157/157 passed
  • client.test.ts — 265/265 passed
中文说明

已处理的审查反馈

反馈点 1 — 恢复会话路径显示 而非 >(中等,@wenshao

决定: 已实现。

变更: resumeHistoryUtils.ts 现在将 mid_turn_user_message 记录重建为 { type: MessageType.USER, text, sentToModel: false },而非 { type: 'notification', text },与 useGeminiStream.ts 中的实时会话渲染保持一致。sentToModel: false 使 isRealUserTurn 返回 false,保留回退计数语义。同时更新了 resumeHistoryUtils.test.ts 中对应的测试断言。

反馈点 2 — sentToModel: false 需要解释性注释(低,@wenshao

决定: 已实现。

变更:useGeminiStream.tssentToModel: false 调用处添加了一行注释,说明该值有意设为 false 以保留 isRealUserTurn/回退语义——steer 消息被注入到现有的工具结果轮次中,而非独立的用户轮次。

反馈点 3 — 续轮 steer 测试(建议,rc:3621128092,@qwen-code-ci-bot

决定: 拒绝(已有记录,由 @chiga0 说明)。早期结算机制已在直接调用路径上测试;续轮变更是简单的选项传递。完整的续轮测试需要模拟 stop-hook / next-speaker 路径,超出本 PR 范围。已作为后续改进跟踪。

先前已处理(之前的提交,无需新操作)

  • rc:3619499951(排序测试)— 在 898ecee 中添加
  • rc:3620425863sentToModel: truefalse)— 在 df02b6e 中修复
  • rc:3620425882(移除 as HistoryItemWithoutId 类型断言)— 在 df02b6e 中修复
  • rc:3620425888iter.return() 后断言)— 在 df02b6e 中修复

冲突说明

无冲突(--conflict false)。

验证结果

  • npm run build — ✅ 通过
  • npm run typecheck — ✅ 通过
  • npm run lint — ✅ 通过
  • resumeHistoryUtils.test.ts — 31/31 通过
  • useGeminiStream.test.tsx — 157/157 通过
  • client.test.ts — 265/265 通过

Base-conflict check: no conflict with main.

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human.


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

Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
Comment thread packages/cli/src/ui/utils/resumeHistoryUtils.ts
Steer messages (sentToModel: false) were counted as real user turns by
five downstream consumers that filter on type === 'user' without checking
sentToModel, breaking cancel auto-restore, telemetry turn count, prompt
recall, away-recap thresholds, and resume collapse boundaries.

Add sentToModel !== false guards at each site.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on:

Review feedback addressed

[Critical] rc:3624375698 — Steer messages break downstream type === 'user' filters

Decision: Implemented.

Changes: Added sentToModel !== false guards at all four affected call sites so steer messages (type: 'user', sentToModel: false) are excluded from real-user-turn logic:

  1. historyUtils.tsfindLastUserItemIndex: Now skips steer items, fixing cancel auto-restore targeting the wrong item.
  2. useGeminiStream.ts — YOLO findLastIndex: Now skips steer items, fixing telemetry ConversationFinishedEvent turn count.
  3. AppContainer.tsxfetchUserMessages: Now skips steer items, fixing prompt-recall pollution.
  4. useAwaySummary.tsshouldFireRecap: Both userMessageCount and userSinceLast counters now skip steer items, fixing premature away-recap triggers.

Why sentToModel !== false instead of isRealUserTurn(): The isRealUserTurn helper also excludes slash commands and applies a legacy lexical fallback. These call sites should continue counting slash-command invocations as user activity; only steer messages need exclusion. The sentToModel !== false guard is the minimal, targeted fix.

[Suggestion] rc:3624375701 — Collapse boundary counts steer messages as user turns

Decision: Implemented.

Changes: applyCollapsePolicyAndSummary in resumeHistoryUtils.ts now checks item.sentToModel !== false when counting user turns for the collapse boundary, consistent with the other four fixes above.

Verification

  • npm run build
  • npm run typecheck
  • npm run lint
  • Focused Vitest: historyUtils.test.ts (13), useAwaySummary.test.ts (2), resumeHistoryUtils.test.ts (31), useGeminiStream.test.tsx (157), AppContainer.test.tsx (119), client.test.ts (265) — all 587 tests pass ✅

Conflict

No conflict (--conflict false).

中文说明

已处理的评审反馈

[Critical] rc:3624375698 — Steer 消息破坏了下游 type === 'user' 过滤器

决定: 已实现。

变更: 在所有四个受影响的调用点添加了 sentToModel !== false 守卫,使 steer 消息(type: 'user'sentToModel: false)被排除在真实用户轮次逻辑之外:

  1. historyUtils.tsfindLastUserItemIndex 现在跳过 steer 项,修复取消操作自动恢复定位到错误项的问题。
  2. useGeminiStream.ts — YOLO findLastIndex 现在跳过 steer 项,修复遥测 ConversationFinishedEvent 轮次计数。
  3. AppContainer.tsxfetchUserMessages 现在跳过 steer 项,修复提示词召回列表被污染的问题。
  4. useAwaySummary.tsshouldFireRecap userMessageCountuserSinceLast 两个计数器现在都跳过 steer 项,修复离开回顾提前触发的问题。

为什么用 sentToModel !== false 而不是 isRealUserTurn() isRealUserTurn 辅助函数还会排除斜杠命令并应用旧的词法回退逻辑。这些调用点应继续将斜杠命令调用计为用户活动;只需要排除 steer 消息。sentToModel !== false 守卫是最小化、精准的修复。

[Suggestion] rc:3624375701 — 折叠边界将 steer 消息计为用户轮次

决定: 已实现。

变更: resumeHistoryUtils.ts 中的 applyCollapsePolicyAndSummary 现在在计算折叠边界的用户轮次时检查 item.sentToModel !== false,与上述其他四处修复保持一致。

验证

  • npm run build
  • npm run typecheck
  • npm run lint
  • 聚焦 Vitest:historyUtils.test.ts(13)、useAwaySummary.test.ts(2)、resumeHistoryUtils.test.ts(31)、useGeminiStream.test.tsx(157)、AppContainer.test.tsx(119)、client.test.ts(265)— 全部 587 个测试通过 ✅

冲突

无冲突(--conflict false)。

Base-conflict check: no conflict with main.

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human.


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

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

Reviewed — no blockers. Suggestions are inline. 2 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/ui/utils/historyUtils.ts
Comment thread packages/cli/src/ui/utils/resumeHistoryUtils.ts
Comment thread packages/cli/src/ui/hooks/useAwaySummary.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on:

Review feedback addressed

All three suggestion-level findings were implemented — each requested missing test coverage for a sentToModel !== false guard introduced in this PR.

rc:3625138429 — historyUtils.ts:126 (findLastUserItemIndex)

Decision: Implemented.

Change: Added a test in historyUtils.test.ts verifying that findLastUserItemIndex skips user items with sentToModel: false, returning the index of the last real user prompt instead of a steer item.

rc:3625138434 — resumeHistoryUtils.ts:647 (applyCollapsePolicyAndSummary)

Decision: Implemented.

Change: Added a test in resumeHistoryUtils.test.ts verifying that sentToModel: false items are not counted as user turns when calculating the collapse boundary. The test places a steer item at the end of a 3-turn conversation and asserts the boundary stays at the second real user turn.

rc:3625138441 — useAwaySummary.ts:55 (shouldFireRecap)

Decision: Implemented.

Change: Added a test in useAwaySummary.test.ts verifying that steer items (sentToModel: false) are excluded from user message counts. The test provides 2 real user messages + 1 steer item (below the threshold of 3) and asserts the recap does not fire.

Conflict notes

No conflicts (--conflict false).

Verification

  • npm run build
  • npm run typecheck
  • npm run lint
  • npx vitest run src/ui/utils/historyUtils.test.ts — 14 tests passed ✅
  • npx vitest run src/ui/utils/resumeHistoryUtils.test.ts — 32 tests passed ✅
  • npx vitest run src/ui/hooks/useAwaySummary.test.ts — 3 tests passed ✅
中文说明

已处理的审查反馈

三条 Suggestion 级别的审查意见均已实现——每条都要求为本 PR 引入的 sentToModel !== false 守卫补充缺失的测试覆盖。

rc:3625138429 — historyUtils.ts:126(findLastUserItemIndex)

决定: 已实现。

变更:historyUtils.test.ts 中新增测试,验证 findLastUserItemIndex 会跳过 sentToModel: false 的用户项,返回最后一个真实用户提示的索引而非 steer 消息的索引。

rc:3625138434 — resumeHistoryUtils.ts:647(applyCollapsePolicyAndSummary)

决定: 已实现。

变更:resumeHistoryUtils.test.ts 中新增测试,验证 sentToModel: false 的项在计算折叠边界时不被计为用户轮次。测试将一条 steer 消息放在 3 轮对话末尾,断言边界仍停留在第二个真实用户轮次处。

rc:3625138441 — useAwaySummary.ts:55(shouldFireRecap)

决定: 已实现。

变更:useAwaySummary.test.ts 中新增测试,验证 steer 消息(sentToModel: false)不计入用户消息数。测试提供 2 条真实用户消息 + 1 条 steer 消息(低于阈值 3),断言回顾不会触发。

冲突说明

无冲突(--conflict false)。

验证结果

  • npm run build
  • npm run typecheck
  • npm run lint
  • npx vitest run src/ui/utils/historyUtils.test.ts — 14 个测试通过 ✅
  • npx vitest run src/ui/utils/resumeHistoryUtils.test.ts — 32 个测试通过 ✅
  • npx vitest run src/ui/hooks/useAwaySummary.test.ts — 3 个测试通过 ✅

Base-conflict check: no conflict with main.

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human.


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

ytahdn and others added 10 commits July 23, 2026 16:11
* fix(web-shell): sync background agent status

* fix(web-shell): harden background agent reconciliation

---------

Co-authored-by: ytahdn <ytahdn@gmail.com>
* feat(core): propagate trusted daemon invocation context

* test(cli): update ACP startup expectation

* refactor(core): centralize ACP capability env key

* test(cli): update worktree ACP core mock

* test(integration): run daemon context smoke on PRs

* test(ci): update no-AK smoke expectation

* test(core): cover invocation context isolation

* fix(cli): compare ACP capability safely

* fix(docs): restore GitHub action input names

* fix(core): sanitize private ACP capability from child env

* fix(core): reuse private ACP capability env constant

* test(cli): cover malformed trusted invocation context

* test(acp-bridge): assert exact child environment

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: 易良 <1204183885@qq.com>
* fix(feishu): await stream cancels in media download teardown

downloadMedia left two reject paths' stream teardown unawaited:

- the oversize-stream path called reader.cancel() without awaiting, so a
  cancel error during teardown became an unhandled rejection (fatal under
  Node's default --unhandled-rejections=throw);
- the Content-Length reject path returned without cancelling resp.body,
  leaving the connection pinned until GC.

Both were already fixed for the sibling DingTalk downloader in #7361 (which
was itself modelled on this Feishu code), so this brings Feishu to parity.
Adds a regression test that pins the reader.cancel() await via a rejecting
cancel, plus an assertion that the Content-Length path releases the body.

* test(feishu): cover a rejecting body.cancel() on the Content-Length path

Mirrors the existing reader.cancel() teardown test for the other reject
path, per review feedback. Removing the await on resp.body?.cancel()
flips execution onto the 'rejected: size ... exceeds' branch and the
test fails.
…7569)

The agent's address-summary.md / no-action.md already ends with a
collapsed Chinese translation, but the workflow-appended wrapper lines
around it — the "Addressed/Reviewed the latest feedback" lead-in, the
"Base-conflict check" line, and the "Re-review when you have a moment"
footer — were English-only and sat outside that block. So the posted
comment was only half translated, unlike the takeover-ack comments
(full collapsed Chinese block) and the "model/模型" sign-off in this
same report (already inline-bilingual).

Give each wrapper line an inline Chinese translation, matching the
model/模型 idiom. The English halves are preserved verbatim — the
streak-reset detector globs on "Addressed the latest review feedback"
and "no changes needed", and a test extracts these lines — so behaviour
is unchanged and old English-only comments still match. A new test pins
each English-Chinese pair so a future reword that drops the Chinese
fails. The terminal handoff/failure comment is left English-only for
now (SKILL.md keeps it so by design); that is a separate change.

Co-authored-by: wenshao <wenshao@example.com>
…s Chinese (#7564)

When the PR author writes Chinese, the posted /review body was
English-only. fetch-pr now records whether the PR description contains
Han characters (prDescriptionHasHan, detected from the same gh pr view
call and stamped into the plan report), and compose-review renders the
body bilingually off that flag: the English body leads, the complete
Chinese version rides collapsed in a <details><summary>中文说明</summary>
block, and the model footer stays outside the fold. The signal is the
CLI's own — the caller cannot toggle the register of a certified body —
and a local plan has no field, so nothing changes for terminal-only
reviews.

Every deterministic body fragment carries an en/zh pair end to end:
compose-review's clause templates and describeChunkGap phrases, the
coverage disclosures (reasons, publicLabel role subjects via a new
publicLabelZh, the path-free unread-brief reason) and the Step 4/5 gap
texts including the combined same-shape sentence. Fragments with no
deterministic translation — model-written findings, caller echoes,
interpolated errors — ride verbatim in both halves. verificationGaps now
returns structural {subject, reason, subjectZh, reasonZh} entries, which
also removes compose-review's last recover-the-boundary-from-prose parse.

SKILL.md instructs the same format for the model-authored inline
comments: English finding first (marker and suggestion block stay in the
English half — tooling filters on them), full Chinese translation
collapsed beneath, footer last.

Co-authored-by: verify <verify@local>
…7562)

* feat(autofix): auto-rerun a check that died on infrastructure, once

A failed check can be red because the machine died, not the code — a
self-hosted runner losing the server, the disk filling. #7490's E2E
failed with "runner lost communication with the server" and went green
on a rerun. The scan now reruns such a check's failed jobs automatically.

Detection is a conservative annotation whitelist (INFRA_FAILURE_SIGNATURES)
— only unambiguous machine failures, never a test-level timeout, which
could be a real regression. The one-shot guard is run_attempt, not a
marker: a run already retried to attempt 2 and still infra-failing is
persistent, so it is left for a human; after a rerun the attempt
increments, so the next scan will not rerun it. Every step is fail-safe
(any API error → no rerun), it runs only when the PR actually has a
failed check, and the gate carries the same review-address carve-out as
the other check selectors so the loop never reruns its own runs.

This is the transient-infra sibling of #7554 (stale-base): that merges
current main when a check is base-inherited; this reruns when a check
died on the runner. Neither touches a check that is a genuine failure.

Note: rerun-failed-jobs needs the PAT to hold `actions: write`.

* fix(autofix): use POSIX ERE groups in infra-failure regex, cover all signatures in tests (#7562)

* fix(autofix): also treat a git fetch/clone transport death as infra

#6506's checkout died mid-transfer — "fetch-pack: invalid index-pack
output" and "RPC failed; curl 92 ... CANCEL" — which then hung the job
into the 20m limit. That is infra, not the PR (it only touches a doc),
and a re-run made it green. But the infra-signature whitelist did not
cover it, so the auto-rerun did not fire and it waited on a human.

Add `invalid index-pack output` and `RPC failed` — the two canonical
git-transport-death phrases — to INFRA_FAILURE_SIGNATURES. A co-present
job-timeout line does not block the match (one matching line classifies
the run), and a BARE timeout with no transport signature is still left
alone, since it can be a real regression. Both new signatures are pinned
in the test's per-signature loop, plus a case on #6506's real composite
annotation and a bare-timeout-is-not-rerun guard.

* fix(autofix): paginate annotations and filter Autofix runs in infra-rerun loop (#7562)

---------

Co-authored-by: wenshao <wenshao@example.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
… token; preserve turn attribution and surface compaction failures in replay (#7458)

* fix(daemon): epoch-token restart detection, compaction attribution, and degraded-snapshot signaling (DAEMON-001/007/008)

* fix(acp-bridge): field-level turn attribution merge and replayDegraded bridge test (#7458)

* fix(serve): skip bus epoch lookup for virtual subagent SSE streams (#7458)

The REST SSE route looked up the bus epoch for every session id, but
virtual subagent sessions ride their own bus and their compound ids are
not in the bridge's byId map, so the lookup threw and aborted the
subscription — breaking subagent event streams. Skip the lookup for the
virtual path and degrade a torn-down real session to a headerless stream
(mirrors the /acp route). Also bumps the daemon browser SDK bundle budget
(167KB -> 168KB) for the epoch fields and declares eventEpoch on
DaemonSession so the create/attach path drops its inline type cast.

* fix(serve): stamp eventEpoch on accepted continuations and surface replayDegraded in the SDK (#7458)

Address three review suggestions:
- POST /session/:id/continue now returns eventEpoch alongside lastEventId,
  mirroring the prompt 202 envelope so continuation-seeded SSE cursors
  detect daemon restarts (DAEMON-001)
- DaemonSessionClient exposes replayDegraded from the load response so SDK
  consumers can prefer the full transcript over a degraded snapshot
- add /acp dispatch-level regression test for the degraded-snapshot stderr
  breadcrumb (fires only when snapshot.degraded is set)

* test(cli): fix load-reply race in the degraded-breadcrumb transport test

Await each session/load reply frame before opening the session stream so
the GET cannot race conn.ownSession() into a 403; addresses the review
Critical on the deg-0 arm.

* fix(serve): allow and expose X-Qwen-Event-Epoch in CORS headers

Cross-origin SSE clients must send the epoch header through preflight and
read it from the response, or stale-cursor detection (DAEMON-001) is
silently disabled for every CORS client.

---------

Co-authored-by: qwen-code-bot <qwen-code-bot@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen Autofix <qwen-autofix[bot]@users.noreply.github.com>
* feat(core): align GenAI telemetry with ARMS

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

* fix(core): remove estimated token usage splits

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

* fix(core): address GenAI telemetry review feedback

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

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
…se (#7556)

* Initial plan

* fix(serve): avoid TOCTOU race dropping live sessions from list response

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: 易良 <1204183885@qq.com>
@wenshao

wenshao commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

✅ Real-TUI verification report — both fixes confirmed

I built this PR locally (merged onto latest main to clear the conflict), ran the full build + typecheck, ran the PR's unit tests, and — most importantly for this change — drove the real interactive TUI in tmux to reproduce the queued/steer-message flow end to end on both main (buggy) and this PR (fixed). Both reported bugs are reproduced on main and both are fixed by this PR. Looks good to merge once the trivial conflict is resolved (see below).

Build & static checks

Check Result
npm run build (all packages, on PR merged with main) ✅ pass
TypeScript typecheck (part of build) ✅ pass

Unit tests (local)

  • PR logic that does not transitively import the shell service passes locally: historyUtils.test.ts (20), resumeHistoryUtils.test.ts + selection-span.test.ts (21) → 41/41 green.
  • The remaining PR test files (MainContent, useGeminiStream, client, useAwaySummary, selection-text, …) fail only at module-load time in my local vitest, with TypeError: Cannot destructure property 'Terminal' of 'default' as it is undefined thrown from packages/core/src/services/shellExecutionService.ts (import pkg from '@xterm/headless'). I verified with plain node that @xterm/headless's default export is defined there, so this is a local vitest ESM-interop issue in a file this PR does not touch — not an assertion failure and not introduced by this PR. These suites pass in CI per the author. Flagging it only for transparency.

Real interactive TUI test (the core claim of this PR)

Method: real tmux session, large viewport, --approval-mode yolo, driving the built CLI (packages/cli/dist/index.js) exactly as a user would. Screenshots below are rendered from tmux capture-pane -e ANSI dumps (so the real terminal colors are preserved — note the accent purple rgb(203,166,247)).

Scenario (same on both branches):

  1. Send a prompt that makes the model run a long tool call (sleep 30).
  2. While the model is still mid-turn (tool executing, status bar shows Enter to steer), type a follow-up message 当前是在补充测试吗?请简短回答 and press Enter → it becomes a queued mid-turn steer message.
  3. Wait for the model to finish the tool and settle the queued message; capture the rendered history.

BEFORE — main (bug reproduced):

before

  • The queued message renders as ● 当前是在补充测试吗?请简短回答 — a notification bullet in default/gray color, not a user-input line. ❌
  • It appears below the model's reply, i.e. model-then-user — the reverse of conversation order. ❌

AFTER — this PR merged with main (both fixed):

after

  • The queued message renders as > 当前是在补充测试吗?请简短回答 — the user-input prefix > in the accent color rgb(203,166,247), visually identical to a normal user turn. ✅
  • It appears above the model's reply to it (user-then-model), matching chronological order. ✅

The mid-turn queue preview itself also behaved correctly (the message showed dimmed under the input box with the ↑ to edit queued messages hint while the tool was still running).

Conflict / merge note

GitHub currently marks this PR CONFLICTING. I merged origin/main into the PR head to build & test; the only conflict is in packages/cli/src/ui/selection/selection-text.test.ts, where main added a setBoundary(...) test helper that the PR branch's copy of the file lacks (and which later tests in that same file call). Resolution = keep main's helper (a clean, additive take). Trivial and safe — worth rebasing the branch so the merge button turns green.

Verdict

Both display bugs are reproduced on main and fixed by this PR, confirmed by real interactive TUI evidence (not just unit tests). The early-settlement / WeakSet idempotency change in client.ts behaved correctly under the live stream in my run (the queued message settled exactly once and rendered in the right place). Recommend merging after a rebase to clear the one test-fixture conflict.


中文验证报告(Chinese version)

✅ 真实 TUI 验证报告 —— 两处修复均已确认

我在本地构建了本 PR(合并到最新 main 以解决冲突),跑通了完整 build + typecheck 与 PR 的单元测试,并针对本 PR 的核心改动,在 tmux 真实交互式 TUI 中端到端复现了排队/steer 消息流程,分别在 main(有 bug)和本 PR(已修复)上各跑一遍。两个 bug 在 main 上均能复现,且均被本 PR 修复。解决那个简单冲突后即可合入(见下)。

构建与静态检查

检查项 结果
npm run build(PR 合并 main 后,全部包) ✅ 通过
TypeScript typecheck(含在 build 中) ✅ 通过

单元测试(本地)

  • 间接 import shell 服务的 PR 逻辑本地全绿:historyUtils.test.ts(20)、resumeHistoryUtils.test.ts + selection-span.test.ts(21)→ 41/41 通过
  • 其余 PR 测试文件(MainContentuseGeminiStreamclientuseAwaySummaryselection-text 等)在我本地 vitest 中仅在模块加载期失败,报错为 packages/core/src/services/shellExecutionService.tsimport pkg from '@xterm/headless' 触发的 Cannot destructure property 'Terminal' of 'default' as it is undefined。我用纯 node 验证过该处 default 导出其实是存在的,因此这是本地 vitest 的 ESM 互操作问题,且发生在 PR 未触碰的文件里——不是断言失败,也非本 PR 引入。这些套件在 CI 中按作者说明是通过的,此处仅为透明起见说明。

真实交互式 TUI 测试(本 PR 的核心主张)

方法: 真实 tmux 会话、大视口、--approval-mode yolo,像真实用户一样驱动构建产物 CLI(packages/cli/dist/index.js)。下方截图由 tmux capture-pane -e 的 ANSI 转储渲染而来(保留真实终端颜色——注意主题紫 rgb(203,166,247))。

场景(两个分支完全相同):

  1. 发一个让模型执行长工具调用的 prompt(sleep 30)。
  2. 模型仍在 mid-turn(工具执行中、状态栏显示 Enter to steer)时,输入后续消息 当前是在补充测试吗?请简短回答 并按 Enter → 成为排队的 mid-turn steer 消息。
  3. 等模型完成工具并 settle 该排队消息,捕获渲染后的历史。

修改前 —— main(复现 bug):

before

  • 排队消息渲染为 ● 当前是在补充测试吗?请简短回答 —— 默认/灰色的通知圆点 ,并非用户输入行。❌
  • 它出现在模型 回复的下方,即“模型→用户”,与对话顺序相反。❌

修改后 —— 本 PR 合并 main(两处均修复):

after

  • 排队消息渲染为 > 当前是在补充测试吗?请简短回答 —— 主题色 rgb(203,166,247)用户输入前缀 >,外观与普通用户轮次一致。✅
  • 它出现在模型对其 回复的上方(用户→模型),符合时间顺序。✅

mid-turn 的队列预览本身也表现正确(工具仍在运行时,该消息以暗淡样式显示在输入框下方,并带 ↑ to edit queued messages 提示)。

冲突 / 合入说明

GitHub 目前把本 PR 标为 CONFLICTING。我为构建与测试把 origin/main 合并进了 PR head;唯一冲突在 packages/cli/src/ui/selection/selection-text.test.tsmain 在该文件新增了一个 setBoundary(...) 测试辅助函数,而 PR 分支的该文件副本里没有(但同文件后面的测试会调用它)。解决方式 = 保留 main 的辅助函数(干净的增量取舍),简单且安全——建议 rebase 一下分支让合入按钮变绿。

结论

两个显示 bug 在 main 上均复现、并被本 PR 修复,且由真实交互式 TUI 证据(而非仅单元测试)确认。client.ts 中 early-settlement / WeakSet 幂等性改动在我的真实流式运行中表现正确(排队消息恰好 settle 一次并渲染在正确位置)。建议合入,rebase 解决那一个测试 fixture 冲突即可。

wenshao
wenshao previously approved these changes Jul 23, 2026
@chiga0

chiga0 commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code-ci-bot /triage

…splay-and-order

# Conflicts:
#	packages/web-shell/README.md
#	packages/web-shell/client/App.test.tsx
#	packages/web-shell/client/App.tsx
#	packages/web-shell/client/shadowDom.test.ts
#	packages/web-shell/client/shadowDom.ts
@wenshao

wenshao commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

Review — head b18499f7 (13 files, +477/−33)

Verdict: LGTM, no blockers. The mechanism is sound and the test suite genuinely constrains it. Everything below is a Suggestion or a Note; this PR is at round 11 and none of it is worth another round on its own — fold in what's cheap, drop the rest.

Overview

Two coupled fixes for mid-turn steer messages: (1) useGeminiStream renders the settled queued message as MessageType.USER + sentToModel: false (> prefix, accent) instead of MessageType.NOTIFICATION (); (2) GeminiClient.sendMessageStream settles the attached steer on the first stream event instead of in the outer finally, so the user line commits before the model's reply — with a WeakSet<SteerInput> making settleSteerInput idempotent and steerInput now forwarded into the recursive continuations. Five downstream type === 'user' counting sites get sentToModel !== false guards.

What I verified

  • Suites green on this head (worktree off b18499f7, node_modules from a fresh main checkout): client.test.ts 284/284, useGeminiStream.test.tsx 161/161, historyUtils + resumeHistoryUtils + useAwaySummary + MainContent + useHistoryManager 96/96, plus adjacent RewindSelector / useInputHistory / historyMapping / export 57/57. prettier --check clean on all 13 files.
  • The "push has landed by the first event" invariant holds structurally, not just in the mock. GeminiChat.sendMessageStream is an async function that pushes userContent and increments userContentPushCount at geminiChat.ts:2163-2168, and only then returns the inner async function* at geminiChat.ts:2256. The rollback path at geminiChat.ts:2244-2251 (history.pop() + userContentPushCount--) throws rather than returning a generator. So no turn.run event can ever be observed before the push lands or after it is rolled back — the early settle cannot mis-fire restore() on content that actually reached the model. This was my main concern with moving the settle earlier (a premature restore() would double the text: sent to the model and refilled into the input buffer); it does not apply.
  • Push-counter → steer-content correspondence at all three forwarding sites. Steer sends steerInput.parts; Hook builds continueRequest with ...pendingSteer.parts appended; next-speaker uses nextRequest = pendingSteer.parts. In each case a counter bump really does mean this steer's content landed, so accept() is the right branch. The ToolResult attach path (useGeminiStream.ts:3622, responsesToSend.push(...drainedSteer.parts)) likewise.
  • Mutation-tested 11 behaviors; 10 killed. Removing the in-loop settle → 3 core tests fail. Reverting steerInput forwarding at the Steer + Hook sites → 2 fail. Removing the WeakSet guard → 4 fail. Reverting each of the 7 CLI predicate changes (MainContent ×2, useGeminiStream YOLO, collapse boundary, isSyntheticHistoryItem, findLastUserItemIndex, realUserPromptTexts, useAwaySummary ×2) → each kills its own test. The new tests are not vacuous.

Findings

1. [Suggestion] The third steerInput forwarding site has no test. client.ts:3066 (the nextSpeakerCheck === 'model' continuation). Reverting steerInput: pendingSteersteerInput: undefined there leaves all 284 core tests green, while the identical revert at the Steer and Hook sites kills a test each. One more case modelled on "forwards steerInput through the Steer continuation for early settling", driving checkNextSpeaker to 'model', would close it.

2. [Suggestion] The consecutive-duplicate suppression — the reachable trigger is wider than previously noted. The earlier note on useHistoryManager.ts:65-69 described a tiny window (a steer landing immediately after an identical-text real prompt). The actually-reachable case is two identical messages queued in the same drain batch: useMessageQueue.addMessage appends without dedupe, drainQueue returns ["go", "go"], resolveSteeredMessages puts both segments into resolved.parts, and accept() then calls addItem once per message in one synchronous block. Probed on this head:

addItem({type:'user', text:'go', sentToModel:false}) ×2  →  history = ['go']          // this PR
addItem({type:'notification', text:'go'}) ×2            →  history = ['go', 'go']    // pre-PR

Both copies reach the model; one silently vanishes from the transcript. Cosmetic, but it's now a plain duplicate-input case rather than a race. One-line fix if you want it: && newItem.sentToModel !== false in the suppression condition.

3. [Note] The five new guards also change behavior for the flag's original population — local slash commands. slashCommandProcessor.ts:859 has been writing { type: USER, text, sentToModel: false } for every visible slash-command invocation since well before this PR, flipping to true only when the command submits a prompt. So /help, /stats, /theme … silently inherit all five guards:

site effect on local slash commands
MainContent.tsx:161,193 no longer reset copy-block numbering (a change vs main, opposite in direction to the bug this PR fixes)
realUserPromptTexts dropped from currentSessionUserMessages, so a slash command typed this session loses its chronological slot in ↑-history. Not lost — logMessage runs at useGeminiStream.ts:1026 before slash dispatch, so it still arrives via getPreviousUserMessages() — but it now sorts below every real prompt of the session
isSyntheticHistoryItem slash-command invocations are now "synthetic" for cancel/auto-restore
collapse boundary / away-recap / YOLO turn count no longer counted as turns

Several of these are arguably improvements, and I found no concrete failure — but none are stated, and one comment is now factually wrong: historyUtils.ts:67-69 still lists "slash-command results the user explicitly asked for" under Meaningful, two lines below the new case 'user': return item.sentToModel === false (lines 64-65). Cheapest fix is to correct that comment. The more robust shape — probably a follow-up, not this PR — is a dedicated discriminator rather than overloading sentToModel: the recording layer already has exactly one (subtype: 'mid_turn_user_message', written at chatRecordingService.ts:1161, read at AppContainer.tsx:788 and acpAgent.ts:635), and resumeHistoryUtils.ts:335 is already branching on it two lines above the line this PR changed.

4. [Note] types.ts:123-132 documents sentToModel as "whether this UI history item represents a user turn that reached the model." A steer message does reach the model, so the value is deliberately counterfactual now. The // Intentionally false: comment at the write site says so, but the field's own doc block is what a future reader greps — one sentence there would prevent the next person from "fixing" it to true.

Pre-existing, adjacent (not introduced here, no action needed on this PR)

computeApiTruncationIndex counts UI turns with isRealUserTurn (skips steer, both before and after this PR) but counts API-side entries with isUserTextContent. For a tool-boundary steer these agree — the steer parts ride along in a Content that also carries functionResponse, which isUserTextContent excludes. For an end-of-turn steer they don't: the Steer continuation pushes a pure-text user Content that isUserTextContent does count, so a later rewind can resolve one entry too early and truncate at the steer instead of the target prompt. Static reading only — I did not drive this at runtime, and it predates this PR (the steer item was a notification before, equally uncounted). Flagging it because this PR is the first thing to make steer items visibly user-shaped, so it'll be the natural place to look when someone hits it.

中文摘要

结论:LGTM,无阻塞项。 机制正确,测试有效约束了行为。以下均为建议或提示;本 PR 已到第 11 轮,不值得单独再开一轮——顺手能改的改,其余可放弃。

已验证

  • 本 head 上套件全绿:core client.test.ts 284/284、CLI useGeminiStream 161/161、其余受影响 CLI 套件 96/96、相邻套件 57/57;13 个文件 prettier 全部通过。
  • "第一个事件到达时 push 必已落地"这一不变量在结构上成立,不只是 mock 里成立:geminiChat.ts:2163-2168外层 async 函数里 push userContent 并自增计数器,直到 2256 行才返回内层生成器;回滚路径(2244-2251)是 throw 而非返回生成器。因此 turn.run 的任何事件都不可能早于 push 或晚于回滚被观察到——提前 settle 不可能误触 restore()。这原本是我对"把 settle 提前"最大的顾虑(误 restore 会导致文本既发给模型、又回填输入框),实际不成立。
  • 三处 continuation 的"计数器增长 ⇔ 该 steer 内容落地"对应关系逐一核对无误。
  • 变异测试 11 项,杀掉 10 项:去掉循环内 settle → 3 个 core 测试失败;回退 Steer/Hook 两处转发 → 2 个失败;去掉 WeakSet → 4 个失败;7 处 CLI 判定逐一回退 → 各自被对应测试杀掉。新增测试非空转。

问题

  1. [建议] 第三处 steerInput 转发点无测试覆盖(client.ts:3066,next-speaker continuation)。把该处改回 undefined,284 个 core 测试全绿;而同样的回退在 Steer/Hook 两处各会杀掉一个测试。
  2. [建议] 连续重复抑制的真实触发面比此前所述更宽:不是"steer 紧跟同文本真实 prompt"的窄窗口,而是同一批 drain 中排队了两条相同消息。队列不去重,accept() 在同一同步块里逐条 addItem,于是两份都发给了模型、却只渲染一条(已在本 head 上探针确认;改为 notification 类型则两条都渲染)。一行修复:抑制条件加 && newItem.sentToModel !== false
  3. [提示] 五处新增守卫同时改变了该标志"原住民"——本地斜杠命令的行为slashCommandProcessor.ts:859 早在本 PR 之前就为每个可见斜杠命令写入 sentToModel: false,所以 /help/stats 等一并继承了全部五处守卫(copy 编号不再重置、当前会话内 ↑ 历史位次下沉、被判为 synthetic、不再计入折叠/recap/YOLO 轮数)。未发现具体故障,但没有说明,且 historyUtils.ts:67-69 的注释现在与代码矛盾——它仍把"用户主动请求的斜杠命令结果"列为 Meaningful,而两行之上新增的 case 'user'(64-65 行) 已把它们判为 synthetic。最省事的修法是改注释;更稳妥的形态(建议作为后续 PR)是用专门的判别字段而非复用 sentToModel——录制层已经有现成的 subtype: 'mid_turn_user_message',而且 resumeHistoryUtils.ts:335 就在本 PR 改动行的两行之上分支于它。
  4. [提示] types.ts:123-132sentToModel 定义为"该条目是否代表一次到达了模型的用户轮次"。steer 消息确实到达了模型,所以这里的取值是刻意反事实的。写入点已有 // Intentionally false: 注释,但字段自身的文档才是后来者会 grep 的地方,补一句可以避免下一个人把它"修"成 true

既有问题(非本 PR 引入,本 PR 无需处理)

computeApiTruncationIndex 的 UI 侧用 isRealUserTurn 计数(跳过 steer),API 侧用 isUserTextContent 计数。工具边界的 steer 两边一致(steer parts 与 functionResponse 同处一个 Content,被排除);回合末的 steer 则不一致(Steer continuation push 的是纯文本 user Content,会被计入),因此后续 rewind 可能提前一个条目、截断到 steer 而非目标 prompt。仅静态分析,未运行时验证;且早于本 PR 存在(此前 steer 是 notification,同样不计入)。之所以在此记录,是因为本 PR 首次让 steer 条目在视觉上成为用户轮次,将来出问题时会最先查到这里。

@wenshao

wenshao commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

✅ Independent local re-verification — head b18499f7 (fresh build + controlled A/B)

Re-confirming on the current head (isolated worktree at b18499f7, base 74a786da, macOS / Node 22.23.1). This complements the earlier real-tmux report and the mutation-tested review — it adds a clean, reproducible A/B (revert one production file to base, keep this PR's tests → the tests fail) and a deterministic before/after render. Verdict: LGTM, merge-ready — no blockers.

1. Unit tests — all green on this head

Suite Tests
useGeminiStream.test.tsx 161 ✅
MainContent.test.tsx / historyUtils / resumeHistoryUtils / useAwaySummary 72 ✅
AppContainer.test.tsx (heaviest consumer of the changed helpers — rewind/prompt-history) 122 ✅
core/client.test.ts 284 ✅
Total 639 / 639

2. A/B — the fix is load-bearing

For each row I reverted only that one production file to base inside the PR worktree, kept this PR's tests, and re-ran. Every case fails on base and passes on head — the tests genuinely pin the behavior, not vice-versa.

Reverted to base Test Result on base code
useGeminiStream.ts records mid-turn queued user messages after tool results accept them expected -1 to be >= 0 — base adds the queued msg as NOTIFICATION, so no USER item exists
useGeminiStream.ts excludes sentToModel-false steer items from YOLO turn-count telemetry expected 1 to be 3 — base counts the steer as the last user turn
client.ts settles an attached steer before content events reach the consumer accept called (base settles only in the finally)
client.ts forwards steerInput through the Steer continuation for early settling accept called (base forwards steerInput: undefined)
client.ts forwards steerInput through the Hook continuation for early settling expected 3 to be less than 3accept deferred to the final event

This isolates the two headline bugs to exactly the two production changes: the display type (useGeminiStream.ts, NOTIFICATIONUSER+sentToModel:false) and the ordering (client.ts, settle-on-first-event + forward steerInput).

3. Before / after — real render output

Rendered from the actual HistoryItemDisplay dispatch (real UserMessage/InfoMessage/AssistantMessage components, truecolor forced) for the two history states the fix produces — so the glyphs and the accent color rgb(203,166,247) are the real ones the TUI paints:

before / after

  • Before (base): queued msg = notification (default color), rendered below the model's reply. ❌
  • After (this PR): queued msg = > user input (accent color), rendered above the reply. ✅ — matches user→model order.

Verdict

Both display bugs are fixed and the fixes are load-bearing (A/B above), with no regression in the largest consumer suite (AppContainer, 122 ✅). The early-settle + WeakSet idempotency mechanism in client.ts is sound. Recommend merge. The open items are the non-blocking nits from my round-11 review (resume-path , slash-command guard side-effects, sentToModel doc comment) — fold in what's cheap, none warrant another round.

中文验证报告(Chinese version)

✅ 独立本地复验 —— head b18499f7(全新构建 + 受控 A/B)

当前 head 上重新确认(隔离 worktree,head b18499f7,base 74a786da,macOS / Node 22.23.1)。本报告是对此前 tmux 真实 TUI 报告与变异测试评审的补充——新增了一组干净、可复现的 A/B(把某一个生产文件回退到 base、保留本 PR 的测试 → 测试失败),以及一张确定性的前后对比渲染图。结论:LGTM,可合入——无阻塞项。

1. 单元测试 —— 本 head 全绿

套件 用例数
useGeminiStream.test.tsx 161 ✅
MainContent.test.tsx / historyUtils / resumeHistoryUtils / useAwaySummary 72 ✅
AppContainer.test.tsx(改动辅助函数的最重消费者——rewind / prompt 历史) 122 ✅
core/client.test.ts 284 ✅
合计 639 / 639

2. A/B —— 修复是"load-bearing"的

每一行我都把那一个生产文件回退到 base、保留本 PR 的测试,再重跑。每个用例在 base 上失败、在 head 上通过——说明测试真正锁定了行为,而非反过来。

回退到 base 的文件 测试 base 代码上的结果
useGeminiStream.ts records mid-turn queued user messages after tool results accept them expected -1 to be >= 0 —— base 以 NOTIFICATION 加入排队消息,找不到 USER 条目
useGeminiStream.ts excludes sentToModel-false steer items from YOLO turn-count telemetry expected 1 to be 3 —— base 把 steer 当作最后一个用户轮次计数
client.ts settles an attached steer before content events reach the consumer accept 调用 0 次(base 只在 finally 里 settle)
client.ts forwards steerInput through the Steer continuation for early settling accept 调用 0 次(base 转发的是 steerInput: undefined
client.ts forwards steerInput through the Hook continuation for early settling expected 3 to be less than 3 —— accept 被推迟到最后一个事件

这把两个核心 bug 精确定位到了两处生产改动:显示类型useGeminiStream.tsNOTIFICATIONUSER+sentToModel:false)与顺序client.ts,首个事件即 settle + 转发 steerInput)。

3. 前后对比 —— 真实渲染输出

真实的 HistoryItemDisplay 分发路径渲染(真实 UserMessage/InfoMessage/AssistantMessage 组件、强制 truecolor),对应修复所产生的两种历史状态——因此图中的字形与主题色 rgb(203,166,247) 就是 TUI 真实绘制的样子:

前后对比

  • 修改前(base): 排队消息 = 通知(默认色),渲染在模型 回复的下方。❌
  • 修改后(本 PR): 排队消息 = > 用户输入(主题色),渲染在回复的上方。✅ —— 符合"用户→模型"顺序。

结论

两个显示 bug 均已修复且修复是 load-bearing 的(见上方 A/B),最重的消费者套件(AppContainer,122 ✅)无回归。client.ts 的 early-settle + WeakSet 幂等机制正确。建议合入。 剩余项均为我第 11 轮评审里的非阻塞小项(resume 路径仍显示 、斜杠命令继承守卫的副作用、sentToModel 文档注释)——顺手能改的改,均不值得单独再开一轮。


🤖 Verified locally with Claude Code

@wenshao

wenshao commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

ytahdn
ytahdn previously requested changes Jul 23, 2026

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

[Critical] Preserve repeated queued steer messages in UI history

accept() now appends every drained steer as MessageType.USER, but useHistoryManager.addItem drops consecutive USER items whose text is identical. The queue itself permits duplicate entries, so if a user submits the same steer twice while the model is responding, both copies are sent to the model and recorded by recordMidTurnUserMessage, while the second UI row is silently discarded. This leaves the visible transcript inconsistent with the actual request and breaks the display guarantee this PR is fixing.

Please exclude sentToModel: false steer items from consecutive-user deduplication (including the case where a real user item and steer share the same text), and add a regression test with two identical queued steer messages.

Relevant sites: useGeminiStream.ts:2550-2558, useHistoryManager.ts:61-70.

中文说明

[Critical] UI 历史必须保留重复的 queued steer 消息

accept() 现在会把每条已 drain 的 steer 添加为 MessageType.USER,但 useHistoryManager.addItem 会丢弃文本相同的连续 USER 项。队列本身允许重复输入,因此用户在模型响应期间连续发送两次相同 steer 时,两条都会发送给模型并由 recordMidTurnUserMessage 记录,但第二条 UI 记录会被静默删除。这会导致可见对话历史与实际请求不一致,也破坏了本 PR 要修复的显示保证。

请从连续用户消息去重中排除 sentToModel: false 的 steer 项(也要覆盖真实用户消息与 steer 文本相同的情况),并添加两条相同 queued steer 的回归测试。

相关位置:useGeminiStream.ts:2550-2558useHistoryManager.ts:61-70

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

@chiga0

chiga0 commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator Author

@ytahdn Thanks for the thorough review. The consecutive-user dedup in addItem is a pre-existing guard against accidental double-sends — it applies to ALL type: 'user' items, not just steers. The scenario it would affect (user submits the exact same steer text twice during one model response) is extremely rare, and even then both copies ARE sent to the model and recorded via recordMidTurnUserMessage — only the duplicate UI row is suppressed, which is arguably the correct UX.

Adding a sentToModel exception to the dedup logic would increase complexity for a near-zero-probability edge case and risks introducing new boundary issues. Tracking this as a follow-up if it ever surfaces in practice. Keeping this PR scoped to the two confirmed display bugs.

@chiga0
chiga0 dismissed ytahdn’s stale review July 23, 2026 09:36

Addressed: the consecutive-user dedup is a pre-existing guard applicable to all user items. The edge case (identical steer text submitted twice) is near-zero probability and both copies are still sent to the model. Tracked as follow-up.

@chiga0
chiga0 added this pull request to the merge queue Jul 23, 2026
Merged via the queue into main with commit 8610320 Jul 23, 2026
60 of 61 checks passed
@chiga0
chiga0 deleted the fix/queued-message-display-and-order branch July 23, 2026 09:38

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Full review — steer display fix

Verdict: 🟡 Concur with @ytahdn's unresolved Critical on the useHistoryManager dedup — that one is on the PR's critical path and should land before merge. Everything else I checked is sound. Suggestions below are non-blocking.

I verified the changes against the tip of fix/queued-message-display-and-order (b18499f7). Local test runs of the affected suites all pass (historyUtils 20, useAwaySummary 3, resumeHistoryUtils 32, MainContent 17, useGeminiStream 161, AppContainer 122, core/client 284).

Correctness of the mechanism

  • Early-settle timing is safe. chat.sendMessageStream awaits its own body up to this.userContentPushCount++ at geminiChat.ts:2168 before returning the generator, so by the time turn.run yields its first event into the client loop, the push counter has advanced. The early settleSteerInput therefore observes the push and calls accept(). Setup-error paths decrement the counter, so if chat.sendMessageStream throws before pushing, the outer finally still restore()s correctly.
  • WeakSet<SteerInput> idempotency guard cleanly reconciles the four settle sites (early-settle + three continuation finally blocks + the UserPromptSubmit-blocked settleSteerInput at line 2035). No path can double-settle; no path can fail to settle.
  • Continuation forwarding on all three recursive paths (Steer / Hook / next-speaker). Missing any one would silently regress the ordering on that subset of turns; the PR covers all three.
  • Resume-path symmetry. convertToHistoryItems now emits the same {type: 'user', sentToModel: false} shape as the live path, so resumed sessions render identically to fresh ones.

Downstream reader propagation

I grep'd every type === 'user' / MessageType.USER read site in packages/cli/src for missed guards. All history-item consumers that need to distinguish a steer from a real turn are updated (isSyntheticHistoryItem, findLastUserItemIndex, new realUserPromptTexts, YOLO turn count, recap gate, copy numbering, collapse boundary). isRealUserTurn was already correct for sentToModel === false, so RewindSelector.getUserTurns and computeApiTruncationIndex fall out naturally.

ChatRecord consumers (DataProcessor, export/collect, markdown formatter) filter by subtype === 'mid_turn_user_message' already; they're a separate axis and out of scope here.

Critical (concur with @ytahdn)

useHistoryManager.addItem silently drops repeat-text steer messages.

useMessageQueue.drainQueue (useMessageQueue.ts:80-93) keeps duplicates. The accept() callback (useGeminiStream.ts:2544-2560) iterates every drained message and calls addItem per entry. On the second identical entry, useHistoryManager.ts:65-71 matches on type === 'user' + equal text and returns prevHistory unchanged. Meanwhile the model receives both parts (merged into the same request) and recordMidTurnUserMessage records both. The net effect is exactly the display/reality inconsistency this PR is trying to eliminate — just now scoped to "user typed the same text twice at one tool boundary" (or "steer text happens to match the immediately preceding real user turn").

Minimal fix in useHistoryManager.ts:65-71:

if (
  lastItem.type === 'user' &&
  newItem.type === 'user' &&
  lastItem.text === newItem.text &&
  lastItem.sentToModel !== false &&
  newItem.sentToModel !== false
) {
  return prevHistory;
}

Regression test cases:

  • Two consecutive steer items with identical text — both must land.
  • Real user turn followed by a steer with identical text — both must land.

Suggestions (non-blocking)

  • AppContainer.tsx:3158hasUserTurns = history.some((h) => h.type === 'user') misses the sentToModel !== false guard. Not a functional bug (the selector itself filters via isRealUserTurn and would just render empty), but the last unguarded site of this shape in the PR's scope. One-line fix.
  • findLastUserItemIndex / realUserPromptTexts vs. isRealUserTurn on legacy sessions. isRealUserTurn has a slash-command lexical fallback when sentToModel === undefined; the new helpers treat undefined as "real". This is intentional given the callers, but the two functions can now disagree on the same legacy item. A one-line docstring on the new helpers ("does not apply the slash-command fallback — see isRealUserTurn for that behavior") would prevent future confusion.
  • Missing test for the next-speaker steer forwarding path (client.ts:3066). The Steer and Hook continuations each have a dedicated early-settle test; the nextSpeakerCheck === 'model' continuation received the same steerInput: pendingSteer change but has no coverage. Author already flagged this as a follow-up — acceptable.

What was already resolved in-thread

The earlier round of review already fixed: MessageType.USER + sentToModel: false (was true in an earlier draft — would have poisoned isRealUserTurn), the redundant as HistoryItemWithoutId cast, the post-iter.return() WeakSet assertion, dedup into findLastUserItemIndex, and the resumed-mid-turn-steer restoration path. These all look good against the current tip.

中文摘要

结论:认同 @ytahdn 未解决的 CriticaluseHistoryManager 去重会静默丢弃重复文本的 steer),其余部分正确。我核验的要点:early-settle 时序安全(push 在生成器返回前完成)、WeakSet 幂等守卫覆盖四个 settle 点、三条 continuation 都转发了 steerInput、resume 路径与实时路径对齐、所有 UI 历史消费方都加了 sentToModel !== false 守卫。建议里最有价值的是 AppContainer.tsx:3158 那处漏掉的守卫(一行修复)。dedup 修复必须落在本 PR,否则本 PR 想消除的"UI 与模型/录制不一致"仍会在"同文本被队列两次"这一子场景下复现。

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.