Skip to content

feat(cli): add auto-improve command - #4161

Closed
DragonnZhang wants to merge 94 commits into
mainfrom
dragon/feat-self-improve
Closed

feat(cli): add auto-improve command#4161
DragonnZhang wants to merge 94 commits into
mainfrom
dragon/feat-self-improve

Conversation

@DragonnZhang

@DragonnZhang DragonnZhang commented May 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • What changed: Added a new /auto-improve slash command that lets Qwen Code run a session-scoped loop for small, locally verifiable repository improvements. The command supports source configuration, loop start/status/stop controls, scheduled ticks, and local state tracking for each run.
  • Source configuration: /auto-improve source supports built-in source toggles plus an editable custom source list. Users can add multiple custom source hints, edit existing hints, delete hints, and save them into the repository-level auto-improve config.
  • Delivery policy: Auto-improve now uses source-aware local delivery. Local/default tasks target the loop's default branch, PR-derived tasks target the PR head branch, unclear targets use a local-only branch, and push is skipped unless the user explicitly requested it.
  • Cancellation behavior: Cancelling an auto-improve tick with Escape marks the active run as cancelled when possible and reminds the user that the loop remains active until /auto-improve stop.
  • Why it changed: To provide a structured automated improvement workflow where the agent can analyze, plan, implement, verify, and locally commit changes from isolated worktrees without accidentally delivering PR fixes to the wrong branch.
  • Reviewer focus: Verify the command naming and help text, scheduled tick behavior, state management during improvement sessions, worktree isolation model, custom source list UX, legacy single-context config migration, source-aware delivery rules, and PR source prioritization for open non-draft PRs with actionable unresolved review feedback.

Validation

  • Commands run:
    npm run build
    npm run typecheck
    cd packages/cli && npx vitest run src/ui/commands/autoImproveCommand.test.ts
  • Expected result: /auto-improve source opens source configuration, supports adding/editing/deleting custom source entries, and /auto-improve start --every <interval> [prompt] snapshots those custom sources into the loop and schedules /auto-improve tick <loop-id>. Tick instructions require PR-derived tasks to use PR head branches and prohibit push unless explicitly requested.
  • Observed result: Build passes; typecheck passes; the focused command test passes with 8 tests.
  • Quickest reviewer verification path: Run the focused test above, then try /auto-improve source and /auto-improve start --every 30m in the CLI with cron enabled.

Scope / Risk

  • Main risk or tradeoff: Worktree cleanup on failure or interrupt; a hard process kill could still leave orphaned local worktrees.
  • Not covered / not validated: Cross-platform worktree behavior, especially Windows.
  • Breaking changes / migration notes: This PR introduces the command as /auto-improve. Existing draft userContext config is migrated into the new custom source list on read.

Testing Matrix

macOS Windows Linux
npm run Pass Not run Not run
npx Pass Not run Not run
Docker Not run Not run Not run

Testing matrix notes:

  • Core logic and focused tests were validated on macOS.
  • Windows worktree behavior needs separate validation.

Linked Issues / Bugs

No linked issues.

@github-actions

Copy link
Copy Markdown
Contributor

📋 Review Summary

This PR introduces a well-architected /self-improve command that enables session-scoped, automated repository improvement loops. The implementation demonstrates solid design with clean separation between state management, UI components, and command processing. The code follows existing project conventions and includes comprehensive test coverage.

🔍 General Feedback

  • Architecture: Clean separation of concerns between selfImproveCommand.ts (command logic), selfImproveState.ts (state persistence), and SelfImproveSourceDialog.tsx (UI). The design doc clearly outlines the intended behavior.
  • State Management: Thoughtful use of JSON files under .qwen/self-improve/ with proper error handling for missing/corrupt files.
  • Test Coverage: 140 lines of tests covering core functionality including source dialog, session startup, and status reporting.
  • Integration: Minimal, surgical changes to existing files (contexts, dialog manager, command loader) follow established patterns.
  • Internationalization: Consistent use of t() for all user-facing strings.

🎯 Specific Feedback

🟡 High

  • packages/cli/src/ui/commands/selfImproveCommand.ts:157 — The buildTickPrompt() function constructs a detailed prompt but hardcodes the "5 repair attempts" rule in the prompt text. This magic number should be a named constant at the module level for clarity and future configurability.

  • packages/cli/src/ui/commands/selfImproveCommand.ts:204-212 — In startSelfImprove(), the cron job is created before the loop state is fully initialized. If initializeSelfImproveLoopFiles() fails, the cron job remains registered but points to non-existent state. Consider initializing files first, then registering the scheduler.

  • packages/cli/src/ui/commands/selfImproveState.ts:93-103 — The normalizeConfig() function silently defaults malformed config to safe defaults. While this prevents crashes, it may hide configuration errors from users. Consider logging a warning when normalization occurs.

🟢 Medium

  • packages/cli/src/ui/commands/selfImproveCommand.ts:78 — The parseInterval() function supports multiple languages (分钟,小时) but the error messages reference these in English only. Ensure consistency or document the localization strategy.

  • packages/cli/src/ui/commands/selfImproveCommand.ts:100-101 — The cron expression 7 */${value} * * * includes a 7-minute offset to avoid hour-boundary thundering herd. This is a good practice, but should be documented with a comment explaining the intent.

  • packages/cli/src/ui/components/SelfImproveSourceDialog.tsx:62-76 — The useEffect cleanup pattern is correct, but consider extracting the async loading logic into a separate function for testability and readability.

  • packages/cli/src/ui/commands/selfImproveCommand.test.ts:46-53 — Tests use a mock scheduler but don't verify that the cron job is properly cleaned up on stop. Add a test case for the stop flow verifying scheduler.delete() is called.

🔵 Low

  • packages/cli/src/ui/commands/selfImproveCommand.ts:1 — The execFile import from node:child_process is used only for git commands. Consider documenting why execFile is preferred over the git service from @qwen-code/qwen-code-core (which is used elsewhere in the codebase).

  • packages/cli/src/ui/commands/selfImproveState.ts:188 — The initializeSelfImproveLoopFiles() function writes state.json twice (once via writeSelfImproveLoopState() and once directly). The writeSelfImproveLoopState() already creates the runs directory, making the earlier mkdir call redundant.

  • packages/cli/src/ui/components/SelfImproveSourceDialog.tsx:145 — The useKeypress handler checks activeIndex < SOURCE_ROWS.length which allows the "User context" input row to be selected, but the navigation logic for onUp/onDown in TextInput (lines 204-205) uses hardcoded indices. Consider defining a constant for USER_CONTEXT_ROW_INDEX = SOURCE_ROWS.length.

  • packages/cli/src/ui/contexts/UIStateContext.tsx:148 — The isSelfImproveSourceDialogOpen field is added but no corresponding initial state value is shown in this diff. Verify the provider initializes this to false.

  • packages/cli/src/ui/commands/selfImproveCommand.ts:139 — The describeSources() function returns "none configured" when all sources are disabled. This string could benefit from localization via t().

✅ Highlights

  • Design Document: Excellent design doc (.qwen/design/2026-05-15-self-improve-command.md) that clearly explains the goal, user commands, state layout, loop behavior, and implementation shape. This makes the PR significantly easier to review.

  • Session-Scoped Loops: Smart design decision to make loops session-scoped rather than persistent. This reduces complexity around orphaned worktrees and simplifies state management.

  • Graceful Stop Handling: The stopSelfImprove() function correctly handles both idle and active run scenarios, setting stopRequested: true for graceful shutdown when a run is in progress.

  • Stale Loop Detection: The statusSelfImprove() function checks if the cron job still exists to detect stale loops (lines 247-249), preventing false "running" status after CLI crashes.

  • Worktree Isolation: The tick prompt explicitly instructs the agent to work in isolated git worktrees and never overwrite uncommitted user changes—critical safety guarantees.

  • Test Structure: Well-organized tests using createMockCommandContext test utility, proper cleanup with afterEach, and meaningful assertions on both return values and side effects (file system state).

@github-actions

github-actions Bot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 75.94% 75.94% 80.11% 79.31%
Core 81.57% 81.57% 83.64% 83.8%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   75.94 |    79.31 |   80.11 |   75.94 |                   
 src               |   67.41 |    66.33 |   71.73 |   67.41 |                   
  gemini.tsx       |   61.89 |    64.28 |   71.42 |   61.89 | ...1192-1195,1207 
  ...ractiveCli.ts |   63.96 |    62.57 |   63.15 |   63.96 | ...1677-1679,1714 
  ...liCommands.ts |   84.43 |    74.32 |     100 |   84.43 | ...40,366,400,487 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   56.44 |    61.18 |   82.75 |   56.44 |                   
  acpAgent.ts      |   56.29 |    61.21 |   82.94 |   56.29 | ...7006,7031-7046 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   68.65 |    83.33 |   66.66 |   68.65 |                   
  filesystem.ts    |   68.65 |    83.33 |   66.66 |   68.65 | ...32,77-94,97-98 
 ...ration/session |   80.36 |    74.26 |   87.73 |   80.36 |                   
  ...ryReplayer.ts |   67.34 |     75.6 |   81.81 |   67.34 | ...54-269,282-283 
  Session.ts       |   80.07 |    73.49 |   89.04 |   80.07 | ...3949,3975-3979 
  ...entTracker.ts |   90.75 |    84.37 |   88.88 |   90.75 | ...30,194,246-255 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    78.57 |     100 |   84.21 | ...37-153,209-211 
  tasksSnapshot.ts |   94.06 |    86.66 |     100 |   94.06 | 60-66             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   95.37 |    91.94 |   96.55 |   95.37 |                   
  BaseEmitter.ts   |   84.61 |       70 |     100 |   84.61 | 23-24,39-40       
  ...ageEmitter.ts |   94.07 |    91.42 |     100 |   94.07 | 47-54             
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.33 |    93.67 |     100 |   98.33 | 300-301,387,395   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |    91.3 |    88.09 |   94.44 |    91.3 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   96.74 |    86.84 |     100 |   96.74 | 135,143-145       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/commands      |   32.76 |    85.71 |   43.47 |   32.76 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.66 |      100 |       0 |   56.66 | 15-19,27-34       
  extensions.tsx   |   96.55 |      100 |      50 |   96.55 | 37                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   94.73 |      100 |      50 |   94.73 | 28                
  review.ts        |   51.85 |      100 |       0 |   51.85 | 24-35,38          
  serve.ts         |    4.42 |      100 |       0 |    4.42 | ...67-235,237-424 
 ...mmands/channel |    39.2 |    79.45 |      50 |    39.2 |                   
  ...l-registry.ts |    8.33 |      100 |       0 |    8.33 | 6-22,25-43        
  config-utils.ts  |      92 |      100 |   66.66 |      92 | 21-26             
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  pairing.ts       |   26.31 |      100 |       0 |   26.31 | ...30,40-50,52-65 
  pidfile.ts       |   96.34 |    86.95 |     100 |   96.34 | 49,59,91          
  start.ts         |   30.98 |       52 |   69.23 |   30.98 | ...72-475,484-486 
  status.ts        |   17.85 |      100 |       0 |   17.85 | 15-26,32-76       
  stop.ts          |      20 |      100 |       0 |      20 | 14-48             
 ...nds/extensions |   85.44 |    89.39 |   81.81 |   85.44 |                   
  consent.ts       |   72.68 |       90 |   42.85 |   72.68 | ...86-142,157-163 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |    75.6 |    66.66 |   66.66 |    75.6 | ...39-142,145-153 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |      100 |     100 |     100 |                   
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  uninstall.ts     |    37.5 |      100 |   33.33 |    37.5 | 23-45,57-64,67-70 
  update.ts        |   96.32 |      100 |     100 |   96.32 | 101-105           
  utils.ts         |   67.77 |    38.88 |     100 |   67.77 | ...,94-98,100-104 
 ...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  |   92.29 |    86.08 |   88.88 |   92.29 |                   
  add.ts           |     100 |    98.03 |     100 |     100 | 293               
  list.ts          |   91.22 |    80.76 |      80 |   91.22 | ...19-121,146-147 
  reconnect.ts     |   76.72 |    71.42 |   85.71 |   76.72 | 35-48,153-175     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   11.57 |      100 |       0 |   11.57 |                   
  cleanup.ts       |   17.94 |      100 |       0 |   17.94 | ...01-106,108-109 
  deterministic.ts |   13.75 |      100 |       0 |   13.75 | ...22-738,740-741 
  fetch-pr.ts      |   11.36 |      100 |       0 |   11.36 | ...80-201,203-204 
  load-rules.ts    |   11.32 |      100 |       0 |   11.32 | ...41-153,155-156 
  pr-context.ts    |    6.22 |      100 |       0 |    6.22 | ...97-312,314-315 
  presubmit.ts     |    9.35 |      100 |       0 |    9.35 | ...62-287,289-290 
 ...nds/review/lib |      30 |      100 |       0 |      30 |                   
  gh.ts            |   22.58 |      100 |       0 |   22.58 | ...49,53-54,62-69 
  git.ts           |   22.72 |      100 |       0 |   22.72 | 15-18,29-39,43-44 
  paths.ts         |   52.94 |      100 |       0 |   52.94 | ...26,37-38,42-43 
 src/config        |   91.34 |    85.24 |      89 |   91.34 |                   
  auth.ts          |   86.74 |    80.88 |     100 |   86.74 | ...40-241,257-258 
  config.ts        |   87.06 |     84.6 |   82.14 |   87.06 | ...2006,2008-2016 
  keyBindings.ts   |   96.87 |       50 |     100 |   96.87 | 201-204           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  settings.ts      |   78.84 |    86.29 |    87.5 |   78.84 | ...1519,1534-1537 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   96.22 |    94.33 |     100 |   96.22 | ...95-197,212-213 
 ...nfig/migration |   94.89 |    78.94 |   83.33 |   94.89 |                   
  index.ts         |   94.87 |    88.88 |     100 |   94.87 | 91-92             
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.74 |       96 |     100 |   94.74 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |    90.19 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
 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    |   63.09 |    64.51 |   55.55 |   63.09 |                   
  ...tputBridge.ts |   62.94 |    65.51 |   56.25 |   62.94 | ...22-323,331-334 
  ...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          |   82.51 |    75.94 |   65.71 |   82.51 |                   
  index.ts         |   63.68 |    69.56 |   53.84 |   63.68 | ...70-271,281-286 
  languages.ts     |   96.92 |    86.66 |     100 |   96.92 | 134-135,167,184   
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   72.57 |    71.12 |   74.07 |   72.57 |                   
  session.ts       |   76.64 |     69.4 |   85.71 |   76.64 | ...23-824,833-843 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...90-591,594-595 
 ...active/control |   76.29 |    88.23 |      80 |   76.29 |                   
  ...rolContext.ts |    6.89 |        0 |       0 |    6.89 | 50-86             
  ...Dispatcher.ts |   91.66 |    91.83 |   88.88 |   91.66 | ...49-367,383,386 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |    25.4 |    35.71 |   35.48 |    25.4 |                   
  ...Controller.ts |   36.97 |       80 |      80 |   36.97 | ...15-117,127-210 
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   28.33 |    34.48 |      40 |   28.33 | ...64-573,588-593 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   21.97 |    28.57 |   27.27 |   21.97 | ...39-451,460-489 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.01 |    93.77 |   95.23 |   98.01 |                   
  ...putAdapter.ts |   97.89 |    92.82 |   98.07 |   97.89 | ...1303,1398-1399 
  ...putAdapter.ts |      96 |     90.9 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 83-84,124-125     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   86.98 |       75 |   85.71 |   86.98 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.12 |    76.08 |   91.66 |   88.12 | ...21-222,233-236 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/serve         |   77.54 |    81.81 |   78.66 |   77.54 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.26 |    92.64 |     100 |   93.26 | ...07-308,311-313 
  ...temAdapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    95.23 |     100 |     100 | 331               
  daemonLogger.ts  |   98.63 |    90.32 |   95.83 |   98.63 | 161,165           
  ...usProvider.ts |   67.01 |    51.42 |     100 |   67.01 | ...40-245,278-286 
  debugMode.ts     |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  envSnapshot.ts   |   92.75 |       84 |     100 |   92.75 | 110-113,179-186   
  eventBus.ts      |     100 |      100 |     100 |     100 |                   
  ...oryChannel.ts |       0 |        0 |       0 |       0 | 1-14              
  index.ts         |       0 |        0 |       0 |       0 | 1-141             
  loopbackBinds.ts |     100 |      100 |     100 |     100 |                   
  ...ssionAudit.ts |     100 |      100 |   93.33 |     100 |                   
  rateLimit.ts     |   90.37 |    87.77 |   93.75 |   90.37 | ...95-297,348-352 
  runQwenServe.ts  |   67.48 |    83.22 |   30.61 |   67.48 | ...1346,1349-1356 
  server.ts        |   78.68 |    83.12 |    85.5 |   78.68 | ...4487,4553-4562 
  status.ts        |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...paceAgents.ts |   62.47 |    70.34 |   90.47 |   62.47 | ...1346,1356-1366 
  ...paceMemory.ts |   87.13 |    78.46 |     100 |   87.13 | ...54-361,421-428 
 src/serve/acpHttp |   64.72 |    66.43 |    93.1 |   64.72 |                   
  ...onRegistry.ts |    86.3 |    75.43 |   92.59 |    86.3 | ...34-338,409-423 
  dispatch.ts      |   54.31 |    57.04 |     100 |   54.31 | ...2223,2285-2300 
  index.ts         |   75.59 |    67.71 |    90.9 |   75.59 | ...28,731,757-759 
  jsonRpc.ts       |     100 |    96.96 |     100 |     100 | 92                
  sseStream.ts     |   93.85 |    87.87 |   84.61 |   93.85 | ...48-150,152-154 
  ...portStream.ts |       0 |        0 |       0 |       0 | 1                 
  wsStream.ts      |   91.76 |       80 |     100 |   91.76 | 43,48,91,95-98    
 src/serve/auth    |   86.86 |    79.18 |   93.87 |   86.86 |                   
  deviceFlow.ts    |   96.35 |       80 |   97.61 |   96.35 | ...1358,1453,1519 
  ...owProvider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 src/serve/fs      |   85.12 |    81.01 |     100 |   85.12 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 201               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.82 |    77.08 |     100 |   77.82 | ...64,493-497,510 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...FileSystem.ts |   84.03 |    78.55 |     100 |   84.03 | ...2031,2058-2059 
 src/serve/routes  |   71.32 |    70.65 |    93.1 |   71.32 |                   
  ...ceFileRead.ts |   94.41 |    76.92 |     100 |   94.41 | ...28-329,390-392 
  ...eFileWrite.ts |    82.1 |    60.52 |     100 |    82.1 | ...42-244,247-249 
  ...ceSettings.ts |   21.98 |      100 |      50 |   21.98 | ...04-217,224-321 
 ...kspace-service |   81.05 |     82.4 |   86.66 |   81.05 |                   
  index.ts         |   81.23 |    83.17 |   92.85 |   81.23 | ...92-497,557-622 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/services      |    91.9 |     90.8 |   97.56 |    91.9 |                   
  ...mandLoader.ts |     100 |    93.75 |     100 |     100 | 96                
  ...killLoader.ts |     100 |     93.1 |     100 |     100 | 48,67             
  ...andService.ts |    98.7 |      100 |     100 |    98.7 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   75.84 |    80.64 |   83.33 |   75.84 | ...10-211,277-278 
  ...mandLoader.ts |     100 |    96.96 |     100 |     100 | 66                
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.21 |    96.66 |     100 |   98.21 | 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 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |    88.3 |    85.49 |   92.59 |    88.3 |                   
  DataProcessor.ts |   88.22 |    85.48 |      95 |   88.22 | ...1341,1345-1352 
  ...tGenerator.ts |   98.21 |    85.71 |     100 |   98.21 | 46                
  ...teRenderer.ts |   45.45 |      100 |       0 |   45.45 | 13-51             
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 95-98             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.35 |    84.84 |     100 |   97.35 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   66.82 |    78.94 |   66.66 |   66.82 |                   
  ...reeStartup.ts |   66.82 |    78.94 |   66.66 |   66.82 | ...08-312,363-426 
 src/test-utils    |   93.71 |    83.33 |      80 |   93.71 |                   
  ...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            |   65.17 |    73.21 |   59.67 |   65.17 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   64.17 |    65.12 |      50 |   64.17 | ...3244,3248-3252 
  ...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 |                   
  ...inePresets.ts |   98.28 |    89.87 |     100 |   98.28 | ...34,261,420-422 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   59.16 |    65.94 |   51.11 |   59.16 |                   
  AuthDialog.tsx   |   62.87 |     42.1 |   18.18 |   62.87 | ...03,310-332,336 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.03 |    70.37 |      56 |   60.03 | ...87,791,800,803 
  useAuth.ts       |   94.55 |    73.52 |     100 |   94.55 | ...19-220,239-245 
  ...rSetupFlow.ts |   43.52 |    33.33 |      50 |   43.52 | ...72-393,410-453 
 src/ui/commands   |   77.91 |    79.82 |   87.02 |   77.91 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |   89.47 |    81.25 |     100 |   89.47 | 92-93,95-100      
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...90-595,680-688 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oveCommand.ts |   72.22 |    64.67 |   84.21 |   72.22 | ...1153,1186-1195 
  ...proveState.ts |   87.55 |    81.06 |   94.59 |   87.55 | ...41-842,849-850 
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |   89.44 |    80.35 |     100 |   89.44 | ...81,106-111,190 
  clearCommand.ts  |   79.64 |       68 |     100 |   79.64 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...astCommand.ts |   70.86 |    74.07 |      75 |   70.86 | ...,61-93,117-122 
  ...extCommand.ts |   65.35 |     66.1 |   84.61 |   65.35 | ...42-575,586-587 
  copyCommand.ts   |   98.48 |    95.78 |     100 |   98.48 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |     87.5 |     100 |     100 | ...61,224-225,238 
  ...ryCommand.tsx |   81.84 |    86.11 |   91.66 |   81.84 | ...66-271,318-325 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   61.27 |    87.06 |    87.5 |   61.27 | ...71-372,445-665 
  dreamCommand.ts  |   85.45 |    91.66 |     100 |   85.45 | 66-73             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   51.54 |    48.14 |   69.23 |   51.54 | ...97,251-303,364 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.44 |     100 |     100 | 92,151            
  goalCommand.ts   |   91.41 |    84.44 |      90 |   91.41 | ...87-190,202-205 
  helpCommand.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 
  initCommand.ts   |   84.33 |    72.72 |     100 |   84.33 | 68,82-87,89-94    
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   92.17 |    82.69 |     100 |   92.17 | ...39,159,168-178 
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   75.09 |    78.18 |      75 |   75.09 | ...20-225,262-267 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...berCommand.ts |      96 |       70 |     100 |      96 | 57,62             
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |   90.47 |    84.61 |     100 |   90.47 | ...32-137,167-168 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   81.43 |    65.21 |      80 |   81.43 | ...70-173,176-179 
  skillsCommand.ts |   84.12 |    76.92 |     100 |   84.12 | 36-44,68          
  statsCommand.ts  |   91.48 |    89.47 |     100 |   91.48 | 40-43,134-141     
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.46 |      100 |      50 |    6.46 | 31-329            
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
 src/ui/components |   61.18 |     76.7 |    60.9 |   61.18 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   16.27 |      100 |       0 |   16.27 | 19-58             
  ...rceDialog.tsx |    9.97 |      100 |      25 |    9.97 | 38-69,93-412      
  ...StatusBox.tsx |   86.79 |    39.13 |     100 |   86.79 | ...55-157,170-179 
  ...TextInput.tsx |   77.01 |       76 |     100 |   77.01 | ...20,234-236,263 
  Composer.tsx     |    81.6 |     64.7 |     100 |    81.6 | ...90,108,160,173 
  ...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 
  ...ification.tsx |   28.57 |      100 |       0 |   28.57 | 16-36             
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.94 |      100 |       0 |   11.94 | 69-547            
  DiffDialog.tsx   |    2.47 |      100 |       0 |    2.47 | 68-732            
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  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       |   77.12 |    52.27 |     100 |   77.12 | ...43,167,188-193 
  ...ngSpinner.tsx |   68.42 |       80 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   76.19 |    81.81 |     100 |   76.19 | 24-30,46-50       
  Header.tsx       |   98.62 |    94.28 |     100 |   98.62 | 162,164           
  Help.tsx         |   98.32 |       90 |     100 |   98.32 | ...24,381,447-448 
  ...emDisplay.tsx |   61.88 |    35.84 |     100 |   61.88 | ...55,358,361-367 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   82.22 |     78.8 |   83.33 |   82.22 | ...1628,1643,1693 
  ...Shortcuts.tsx |   20.87 |      100 |       0 |   20.87 | ...6,49-51,67-125 
  ...Indicator.tsx |     100 |    91.42 |     100 |     100 | 65,74             
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   87.11 |    88.31 |   66.66 |   87.11 | ...26,284,343-347 
  MemoryDialog.tsx |   61.87 |    76.05 |    62.5 |   61.87 | ...72,391,428-430 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.19 |    69.17 |     100 |   85.19 | ...80-596,653-657 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   18.18 |      100 |       0 |   18.18 | 15-58             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   87.11 |     73.8 |     100 |   87.11 | ...48,354-370,406 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   92.42 |    84.37 |     100 |   92.42 | ...,70-71,143-145 
  ...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 |   66.31 |    71.16 |      75 |   66.31 | ...16-824,830-831 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...ionPicker.tsx |   17.59 |      100 |       0 |   17.59 | 55-172            
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.85 |      100 |       0 |    8.85 | ...5,49-84,92-238 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    3.28 |      100 |       0 |    3.28 | 25-258            
  ...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 |   87.25 |       64 |     100 |   87.25 | ...57-159,166-168 
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    81.81 |     100 |     100 | 71-86             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   91.42 |    64.28 |     100 |   91.42 | 15,21,24          
  ...s-helpers.tsx |      25 |      100 |       0 |      25 | ...3,86-89,94-102 
 ...nts/agent-view |   38.05 |    78.57 |   36.36 |   38.05 |                   
  ...atContent.tsx |    8.79 |      100 |       0 |    8.79 | 53-265,271-273    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   10.84 |      100 |       0 |   10.84 | 59-308            
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |   87.17 |    61.76 |     100 |   87.17 | ...,85,98-106,124 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.59 |    70.53 |   60.86 |   45.59 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.92 |      100 |       0 |    9.92 | 27-164            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   79.76 |    82.24 |   91.17 |   79.76 |                   
  ...sksDialog.tsx |   76.68 |       80 |   85.71 |   76.68 | ...1139,1215-1217 
  ...TasksPill.tsx |   63.75 |    86.95 |     100 |   63.75 | 44,86-106,114-122 
  ...gentPanel.tsx |    97.4 |    86.31 |     100 |    97.4 | 123,434-438       
 ...nts/extensions |   45.28 |    33.33 |      60 |   45.28 |                   
  ...gerDialog.tsx |   44.31 |    34.14 |      75 |   44.31 | ...71-480,483-488 
  index.ts         |       0 |        0 |       0 |       0 | 1-9               
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   54.88 |    94.23 |   66.66 |   54.88 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |    6.18 |      100 |       0 |    6.18 | 20-131            
  ...nListStep.tsx |   88.43 |    94.73 |      80 |   88.43 | 52-53,59-72,106   
  ...electStep.tsx |   13.46 |      100 |       0 |   13.46 | 20-70             
  ...nfirmStep.tsx |   19.56 |      100 |       0 |   19.56 | 23-65             
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...mponents/hooks |   86.85 |    81.37 |   91.89 |   86.85 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   20.98 |    86.36 |   83.33 |   20.98 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |    3.64 |      100 |       0 |    3.64 | 41-717            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-30              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   95.83 |    88.88 |     100 |   95.83 | 16,20,109-110     
 ...ents/mcp/steps |   26.74 |    54.54 |   42.85 |   26.74 |                   
  ...icateStep.tsx |    5.88 |      100 |       0 |    5.88 | 40-55,58-296      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |    5.26 |      100 |       0 |    5.26 | 31-247            
  ...rListStep.tsx |   75.18 |    59.37 |     100 |   75.18 | ...53-158,169-173 
  ...etailStep.tsx |   10.41 |      100 |       0 |   10.41 | ...1,67-79,82-139 
  ToolListStep.tsx |   69.02 |       50 |     100 |   69.02 | ...22,125,134-143 
 ...nents/messages |   83.06 |    80.02 |    75.6 |   83.06 |                   
  ...ionDialog.tsx |   80.84 |     77.6 |    62.5 |   80.84 | ...98,516,534-536 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |   97.67 |    83.72 |     100 |   97.67 | 119,142,150       
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   79.06 |      100 |      70 |   79.06 | ...51-264,268-280 
  DiffRenderer.tsx |   93.19 |    86.17 |     100 |   93.19 | ...09,237-238,304 
  ...tsDisplay.tsx |   97.82 |    77.27 |     100 |   97.82 | 87,89             
  ...usMessage.tsx |   76.31 |     42.1 |   66.66 |   76.31 | ...99,101,124,155 
  ...tsDisplay.tsx |    95.1 |    88.05 |     100 |    95.1 | ...29,131,164-169 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   55.67 |       40 |   28.57 |   55.67 | ...20-125,133-145 
  ...ryMessage.tsx |   14.28 |      100 |       0 |   14.28 | 23-62             
  ...onMessage.tsx |   81.98 |     72.6 |   33.33 |   81.98 | ...65-467,474-476 
  ...upMessage.tsx |   82.63 |    92.85 |     100 |   82.63 | ...85-412,434-449 
  ToolMessage.tsx  |    87.8 |    73.28 |    92.3 |    87.8 | ...59-764,791-793 
 ...ponents/shared |   84.34 |    80.39 |    95.5 |   84.34 |                   
  ...ctionList.tsx |   99.14 |       96 |     100 |   99.14 | 99                
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  MaxSizedBox.tsx  |   83.01 |    86.25 |   88.88 |   83.01 | ...12-513,618-619 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   76.25 |       80 |     100 |   76.25 | 44-58,65-68       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    66.07 |      80 |    80.8 | ...36-240,252-258 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   84.26 |    80.88 |      90 |   84.26 | ...68-696,743-765 
  text-buffer.ts   |   85.75 |     80.9 |   97.91 |   85.75 | ...2636,2734-2735 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.64 |      100 |       0 |    3.64 |                   
  ...gerDialog.tsx |    3.64 |      100 |       0 |    3.64 | ...90-148,151-691 
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |   21.51 |    59.52 |   27.27 |   21.51 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.42 |    59.52 |     100 |   35.42 | ...20-432,437-439 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   70.21 |    67.32 |    64.7 |   70.21 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   87.69 |    73.68 |     100 |   87.69 | 65-72             
  McpStatus.tsx    |   89.53 |    60.52 |     100 |   89.53 | ...72,175-177,262 
  SkillsList.tsx   |   27.27 |      100 |       0 |   27.27 | 18-35             
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   77.42 |    77.64 |   81.03 |   77.42 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |    93.3 |    64.28 |      50 |    93.3 | ...35-236,263-267 
  ...deContext.tsx |     100 |      100 |     100 |     100 |                   
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   81.67 |     81.6 |     100 |   81.67 | ...1199,1203-1205 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   43.26 |     62.5 |    62.5 |   43.26 | ...64-267,276-279 
  ...gsContext.tsx |   83.33 |       50 |     100 |   83.33 | 17-18             
  ...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             
  ...nsContext.tsx |   88.23 |       50 |     100 |   88.23 | 134-135           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 199-200           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
 src/ui/daemon     |   90.76 |    73.73 |   95.45 |   90.76 |                   
  ...TuiAdapter.ts |   90.76 |    73.73 |   95.45 |   90.76 | ...53,771-772,858 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   81.54 |    80.72 |   86.29 |   81.54 |                   
  ...dProcessor.ts |   83.12 |    82.56 |     100 |   83.12 | ...88-389,408-435 
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...dProcessor.ts |    94.8 |    70.58 |     100 |    94.8 | ...76-277,282-283 
  ...dProcessor.ts |   83.77 |    62.23 |      80 |   83.77 | ...1014,1035-1039 
  ...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 |      32 |       60 |     100 |      32 | 42-44,51-90       
  ...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 |   91.79 |    86.88 |     100 |   91.79 | ...05-206,243-246 
  ...ifications.ts |   86.91 |    96.29 |     100 |   86.91 | 116-130           
  ...tIndicator.ts |   83.49 |    70.96 |     100 |   83.49 | ...60,168,170-178 
  ...waySummary.ts |   96.22 |    69.69 |     100 |   96.22 | 125-127,169       
  ...ndTaskView.ts |   94.21 |    76.08 |     100 |   94.21 | 122-126,213,219   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   92.53 |    71.42 |     100 |   92.53 | ...32,172,245-248 
  ...ompletion.tsx |   96.01 |    83.87 |     100 |   96.01 | ...22-223,225-226 
  ...dMigration.ts |   90.62 |       75 |     100 |   90.62 | 38-40             
  useCompletion.ts |    92.4 |     87.5 |     100 |    92.4 | 68-69,93-94,98-99 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   77.27 |       50 |     100 |   77.27 | ...2,75-79,93-101 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...ialogClose.ts |   11.26 |      100 |     100 |   11.26 | 89-193            
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.45 |     92.3 |     100 |   93.45 | ...83-287,300-306 
  ...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 |   89.15 |     62.5 |      50 |   89.15 | ...22-124,149-150 
  ...miniStream.ts |   79.25 |     76.2 |   92.85 |   79.25 | ...2740,2791-2799 
  ...BranchName.ts |    90.9 |     92.3 |     100 |    90.9 | 19-20,55-58       
  ...oryManager.ts |   96.92 |    96.29 |     100 |   96.92 | 52,139-142,218    
  ...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 |      100 |     100 |     100 |                   
  useLogger.ts     |   21.05 |      100 |       0 |   21.05 | 15-37             
  useMCPHealth.ts  |   63.15 |       75 |      50 |   63.15 | 42-52,64-67       
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |       75 |     100 |     100 | 22                
  ...ouseEvents.ts |   87.17 |    88.88 |   66.66 |   87.17 | 81-82,86-88       
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   86.49 |    77.96 |    90.9 |   86.49 | ...26,288-300,348 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |    84.7 |    93.33 |     100 |    84.7 | ...71-276,372-382 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...tleRepaint.ts |     100 |      100 |     100 |     100 |                   
  ...umeCommand.ts |   96.96 |    83.33 |     100 |   96.96 | 101-102,131       
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   97.05 |    96.07 |     100 |   97.05 | ...90-191,245-248 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |      100 |     100 |     100 |                   
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   91.74 |    79.41 |     100 |   91.74 | ...74,122-123,133 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-73              
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.73 |    85.41 |   94.73 |   82.73 | ...70-672,680-716 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |    96.3 |    92.19 |     100 |    96.3 | ...77-380,466-473 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   53.06 |       50 |   66.66 |   53.06 | ...53,61-68,79-85 
  ...rminalSize.ts |   76.19 |      100 |      50 |   76.19 | 21-25             
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   88.09 |    85.71 |     100 |   88.09 | 44-45,51-53       
  ...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 | 44-45,87          
  vim.ts           |   74.37 |    67.77 |   69.23 |   74.37 | ...1842-1849,1857 
 src/ui/layouts    |    90.9 |    90.62 |     100 |    90.9 |                   
  ...AppLayout.tsx |   90.72 |       90 |     100 |   90.72 | 57-59,101-106     
  ...AppLayout.tsx |   91.17 |    91.66 |     100 |   91.17 | 70-75             
 src/ui/models     |   80.24 |    79.16 |   71.42 |   80.24 |                   
  ...ableModels.ts |   80.24 |    79.16 |   71.42 |   80.24 | ...,61-71,123-125 
 ...noninteractive |     100 |      100 |   14.28 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |   14.28 |     100 |                   
 src/ui/state      |   94.91 |    81.81 |     100 |   94.91 |                   
  extensions.ts    |   94.91 |    81.81 |     100 |   94.91 | 68-69,88          
 src/ui/themes     |   98.53 |    70.58 |     100 |   98.53 |                   
  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   |     100 |      100 |     100 |     100 |                   
  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 |   87.98 |    82.89 |     100 |   87.98 | ...48-357,362-363 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   83.33 |    82.83 |   92.77 |   83.33 |                   
  ...Colorizer.tsx |   79.53 |    83.78 |     100 |   79.53 | ...51-152,249-275 
  ...nRenderer.tsx |   68.83 |    70.14 |      50 |   68.83 | ...52-254,274-293 
  ...wnDisplay.tsx |   86.01 |    87.66 |     100 |   86.01 | ...87,704,729-754 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.08 |    80.45 |      95 |   92.08 | ...76-679,723-728 
  ...odeDisplay.ts |   96.55 |     90.9 |     100 |   96.55 | 34                
  asciiCharts.ts   |   96.77 |    87.62 |     100 |   96.77 | 173-180,281       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   49.89 |    71.79 |    90.9 |   49.89 | ...79,582-591,594 
  commandUtils.ts  |    95.9 |    88.42 |     100 |    95.9 | ...66,168-169,293 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   88.37 |    72.22 |     100 |   88.37 | 23,25,29,31,33    
  formatters.ts    |   95.23 |     98.3 |     100 |   95.23 | 117-120           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    96.55 |     100 |     100 | 43                
  historyUtils.ts  |    94.2 |    94.11 |     100 |    94.2 | 95-98             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |    8.23 |      100 |       0 |    8.23 | ...31-132,135-136 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |    89.47 |     100 |     100 | 81,110            
  ...nUtilities.ts |   69.84 |    85.71 |     100 |   69.84 | 75-91,100-101     
  ...ToolGroups.ts |   98.66 |    96.77 |     100 |   98.66 | 48-49             
  ...geRenderer.ts |   86.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   90.71 |    73.33 |   88.88 |   90.71 | ...40-143,200-201 
  osc8.ts          |   94.73 |    87.75 |     100 |   94.73 | ...49,434,438-439 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   99.02 |    97.14 |     100 |   99.02 | 106               
  ...storyUtils.ts |   62.74 |    71.26 |      90 |   62.74 | ...84,432,437-459 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...ataService.ts |   93.17 |     80.3 |     100 |   93.17 | ...14,227,254-256 
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.61 |    94.84 |   92.85 |   97.61 | ...50-251,386-387 
  todoSnapshot.ts  |   89.33 |    93.47 |     100 |   89.33 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
 ...i/utils/export |   56.77 |     40.8 |   79.41 |   56.77 |                   
  collect.ts       |   55.92 |    50.58 |   86.36 |   55.92 | ...25-640,642-647 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   57.47 |    20.51 |      80 |   57.47 | ...09-310,324-359 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |      40 |      100 |       0 |      40 | 11-13             
 ...ort/formatters |    3.38 |      100 |       0 |    3.38 |                   
  html.ts          |    9.61 |      100 |       0 |    9.61 | ...28,34-76,82-84 
  json.ts          |      50 |      100 |       0 |      50 | 14-15             
  jsonl.ts         |     3.5 |      100 |       0 |     3.5 | 14-76             
  markdown.ts      |    0.94 |      100 |       0 |    0.94 | 13-295            
 src/utils         |   72.36 |    89.19 |   90.46 |   72.36 |                   
  acpModelUtils.ts |     100 |      100 |     100 |     100 |                   
  apiPreconnect.ts |   96.72 |    97.14 |     100 |   96.72 | 165-168           
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   84.12 |    93.33 |      80 |   84.12 | 75,106-115        
  commands.ts      |     100 |      100 |     100 |     100 |                   
  commentJson.ts   |   90.51 |    91.89 |     100 |   90.51 | 67-76,116         
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.38 |    71.83 |   88.88 |   70.38 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 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.42 |     100 |   97.14 | 125-126           
  errors.ts        |   90.85 |    96.36 |    92.3 |   90.85 | 69-70,298-310     
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   91.91 |    84.61 |     100 |   91.91 | 78-81,124-127     
  ...AutoUpdate.ts |    92.2 |    95.23 |   88.88 |    92.2 | 130-141           
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   89.17 |    92.77 |     100 |   89.17 | ...55,272-273,318 
  languageUtils.ts |   98.19 |    97.14 |     100 |   98.19 | 132-133           
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...onfigUtils.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   96.79 |    93.28 |     100 |   96.79 | ...76-477,575,588 
  osc.ts           |    97.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |       80 |     100 |   88.88 | 33-34             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  readStdin.ts     |   79.62 |       90 |      80 |   79.62 | 33-40,52-54       
  relaunch.ts      |   93.22 |    81.25 |     100 |   93.22 | 65-67,80          
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-1038            
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.51 |    91.72 |   89.74 |   82.51 | ...76-694,701-709 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   26.82 |    73.77 |   43.47 |   26.82 | ...36-837,840-859 
  ...upProfiler.ts |   98.46 |    94.52 |     100 |   98.46 | 130-131,305       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       60 |     100 |     100 | 23,32             
  systemInfo.ts    |   95.12 |    89.06 |     100 |   95.12 | ...43-244,249-253 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    95.23 |     100 |     100 | 60,90             
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   91.17 |    82.35 |     100 |   91.17 | 67-68,73-74,77-78 
  version.ts       |     100 |       50 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |    62.1 |       75 |     100 |    62.1 | 93,107,118-157    
 ...s/housekeeping |   90.15 |     89.7 |   94.11 |   90.15 |                   
  cleanup.ts       |   94.33 |       95 |     100 |   94.33 | 60-62             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   89.71 |    88.23 |   85.71 |   89.71 | 51-55,66,116-120  
  throttledOnce.ts |   86.66 |    85.18 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   81.57 |     83.8 |   83.64 |   81.57 |                   
 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        |   88.13 |    79.27 |   92.22 |   88.13 |                   
  ...transcript.ts |   92.25 |    85.71 |     100 |   92.25 | ...87,306-307,438 
  ...ent-resume.ts |   83.06 |    70.75 |   78.12 |   83.06 | ...1099-1103,1106 
  ...ound-tasks.ts |   95.76 |    87.57 |     100 |   95.76 | ...26-827,898-899 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/arena  |   76.54 |    66.87 |   78.72 |   76.54 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.37 |    63.37 |   78.26 |   75.37 | ...1860,1866-1867 
  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 |   76.43 |    86.23 |   73.04 |   76.43 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.98 |     90.9 |   86.66 |   91.98 | ...95,250-270,329 
  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 |   84.79 |    83.25 |   78.47 |   84.79 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   77.31 |    73.21 |   65.21 |   77.31 | ...1704,1731-1778 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   84.48 |    78.04 |   63.63 |   84.48 | ...00-401,404-405 
  ...nteractive.ts |   80.55 |    81.35 |   74.07 |   80.55 | ...79,481,483,486 
  ...statistics.ts |   98.19 |    82.35 |     100 |   98.19 | 127,151,192,225   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...chestrator.ts |   93.38 |    92.53 |     100 |   93.38 | ...45-450,499-502 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |     100 |    98.11 |     100 |     100 | 117,282           
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   79.26 |    81.55 |   85.95 |   79.26 |                   
  TeamManager.ts   |   67.11 |    76.25 |   74.41 |   67.11 | ...1433,1456-1457 
  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         |   85.81 |     78.3 |   95.45 |   85.81 | ...86-889,933-934 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...37-141,148-152 
  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 |    93.38 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    77.77 |     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        |   78.23 |    83.62 |   64.72 |   78.23 |                   
  config.ts        |   76.48 |    82.78 |   60.82 |   76.48 | ...4730,4735-4736 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |    94.9 |     90.9 |   90.24 |    94.9 | ...64-365,368-369 
 ...nfirmation-bus |   98.29 |    97.14 |     100 |   98.29 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   88.62 |    83.78 |   91.83 |   88.62 |                   
  baseLlmClient.ts |   81.25 |    76.47 |   77.77 |   81.25 | ...13,515-525,534 
  client.ts        |   86.28 |     80.8 |   89.47 |   86.28 | ...2471,2565-2566 
  ...tGenerator.ts |   84.86 |    69.23 |     100 |   84.86 | ...84,386,393-396 
  ...lScheduler.ts |   88.37 |    81.74 |   95.71 |   88.37 | ...4001,4029-4040 
  geminiChat.ts    |   91.37 |    87.79 |   96.15 |   91.37 | ...3032,3099-3100 
  geminiRequest.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 
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   92.59 |       75 |      50 |   92.59 | 41-42             
  ...on-helpers.ts |   86.48 |    72.22 |     100 |   86.48 | ...97-198,212-221 
  ...issionFlow.ts |   98.75 |    95.83 |     100 |   98.75 | 93                
  prompts.ts       |   88.88 |    87.87 |   72.72 |   88.88 | ...-908,1111-1112 
  tokenLimits.ts   |     100 |    89.47 |     100 |     100 | 51-52             
  ...okTriggers.ts |   99.43 |    91.34 |     100 |   99.43 | 172,183           
  turn.ts          |   96.46 |    88.88 |     100 |   96.46 | ...32,445-446,494 
 ...ntentGenerator |   94.88 |    82.07 |      94 |   94.88 |                   
  ...tGenerator.ts |   96.29 |    83.18 |   92.85 |   96.29 | ...1,971,999-1001 
  converter.ts     |   94.51 |    80.72 |     100 |   94.51 | ...06-607,617,823 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.53 |    71.64 |   93.33 |   91.53 |                   
  ...tGenerator.ts |      90 |    70.96 |   92.85 |      90 | ...80-286,304-305 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   94.22 |    83.96 |   91.17 |   94.22 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   94.09 |     82.5 |   90.62 |   94.09 | ...1025-1026,1054 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   86.35 |     84.4 |   93.67 |   86.35 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   84.89 |    82.17 |   96.15 |   84.89 | ...1395,1611-1626 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   54.54 |    68.75 |      50 |   54.54 | ...79,87-91,95-99 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   94.38 |     86.5 |     100 |   94.38 | ...38-539,547,615 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   90.66 |    88.57 |     100 |   90.66 | ...15-319,349-350 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   96.67 |    88.94 |   96.07 |   96.67 |                   
  dashscope.ts     |   97.37 |    91.39 |   93.33 |   97.37 | ...90-291,369-370 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   95.79 |    89.65 |   88.88 |   95.79 | 122-123,193-195   
  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 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
 src/extension     |   62.37 |    79.41 |   80.31 |   62.37 |                   
  ...-converter.ts |   66.28 |    52.03 |     100 |   66.28 | ...98-799,808-840 
  ...ionManager.ts |    47.1 |    82.06 |    65.9 |    47.1 | ...1405,1415-1434 
  ...onSettings.ts |   93.46 |    93.05 |     100 |   93.46 | ...17-221,228-232 
  ...-converter.ts |   54.88 |    94.44 |      60 |   54.88 | ...35-146,158-192 
  github.ts        |   46.41 |     87.3 |   63.63 |   46.41 | ...66-372,411-464 
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   97.31 |    93.75 |     100 |   97.31 | ...65,185-186,275 
  npm.ts           |   59.01 |    71.69 |    87.5 |   59.01 | ...23-425,432-436 
  override.ts      |   94.11 |    88.88 |     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    
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.75 |    83.33 |     100 |   88.75 | ...28-231,234-237 
 src/followup      |   55.24 |    85.18 |   81.25 |   55.24 |                   
  followupState.ts |      96 |    89.74 |     100 |      96 | 159-161,218-219   
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   95.06 |       84 |     100 |   95.06 | 78,108,122,133    
  speculation.ts   |   13.02 |      100 |   16.66 |   13.02 | 89-464,524-575    
  ...onToolGate.ts |     100 |    96.42 |     100 |     100 | 94                
  ...nGenerator.ts |   70.23 |    74.57 |   83.33 |   70.23 | ...83-247,317-319 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   89.57 |    83.57 |   94.44 |   89.57 |                   
  ...eGoalStore.ts |    85.1 |    95.45 |   84.61 |    85.1 | ...63-166,174-182 
  goalHook.ts      |   97.26 |    91.66 |     100 |   97.26 | 100-105           
  goalJudge.ts     |   84.33 |    74.28 |     100 |   84.33 | ...57-358,366-368 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   86.88 |    85.58 |   88.01 |   86.88 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.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.35 |    90.69 |     100 |   96.35 | ...00-301,382,384 
  ...entHandler.ts |   95.27 |    86.74 |   94.11 |   95.27 | ...63,920-921,931 
  hookPlanner.ts   |   86.29 |    83.33 |   85.71 |   86.29 | ...15-219,226-237 
  hookRegistry.ts  |   91.48 |    84.61 |     100 |   91.48 | ...97,416,420,424 
  hookRunner.ts    |   62.42 |    72.04 |   66.66 |   62.42 | ...64-765,774-775 
  hookSystem.ts    |   86.78 |      100 |   68.88 |   86.78 | ...07-708,714-715 
  ...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 |   96.37 |     90.9 |      90 |   96.37 | 342-350,424-425   
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   96.66 |    91.66 |     100 |   96.66 | ...90,209-210,223 
  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         |   92.83 |       94 |    87.5 |   92.83 | ...87-488,573-577 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/ide           |   75.55 |    83.52 |   78.33 |   75.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   66.14 |    81.75 |   66.66 |   66.14 | ...3-964,993-1001 
  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           |   42.42 |     51.9 |   52.14 |   42.42 |                   
  ...nfigLoader.ts |   70.27 |    35.89 |   94.73 |   70.27 | ...20-422,426-432 
  ...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 |   25.31 |    62.06 |   41.66 |   25.31 | ...85-704,710-740 
  ...eLspClient.ts |   32.77 |       80 |   17.64 |   32.77 | ...84-288,294-295 
  ...LspService.ts |   51.85 |    65.98 |   68.57 |   51.85 | ...1339,1399-1409 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |   78.75 |    75.56 |   75.92 |   78.75 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   73.82 |    53.92 |     100 |   73.82 | ...88-895,902-904 
  ...en-storage.ts |   98.64 |    97.77 |     100 |   98.64 | 88-89             
  oauth-utils.ts   |   70.58 |    85.29 |    90.9 |   70.58 | ...70-290,315-344 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   79.72 |    87.05 |   86.36 |   79.72 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   83.44 |    84.21 |   92.85 |   83.44 | ...68-178,186-187 
  ...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        |   73.17 |    77.08 |   72.39 |   73.17 |                   
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |      66 |    73.33 |      50 |      66 | 51,108-149        
  ...entPlanner.ts |   57.84 |    72.72 |   33.33 |   57.84 | ...35,140-147,152 
  entries.ts       |   63.77 |    79.16 |      50 |   63.77 | ...72-180,183-189 
  extract.ts       |   92.72 |    74.19 |     100 |   92.72 | ...32,151-154,211 
  ...entPlanner.ts |   67.59 |     73.8 |      50 |   67.59 | ...31,240-243,415 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |      46 |    61.53 |   44.44 |      46 | ...05,212,215-347 
  indexer.ts       |    86.3 |       50 |     100 |    86.3 | ...56,62-63,75-76 
  manager.ts       |    75.5 |    81.04 |    75.6 |    75.5 | ...1292,1305-1307 
  memoryAge.ts     |   90.47 |    77.77 |     100 |   90.47 | 50-51             
  paths.ts         |   79.06 |    95.12 |     100 |   79.06 | 32-33,49-86       
  prompt.ts        |   94.85 |    78.57 |     100 |   94.85 | ...62,165,303-304 
  recall.ts        |   76.73 |    69.38 |   88.88 |   76.73 | ...72-277,301-312 
  ...ceSelector.ts |   91.86 |    77.27 |     100 |   91.86 | ...24,126-127,135 
  scan.ts          |   92.92 |    78.26 |     100 |   92.92 | ...51-52,62,90-91 
  ...entPlanner.ts |   58.33 |    66.66 |   56.25 |   58.33 | ...61-282,358-403 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   93.33 |    81.25 |     100 |   93.33 | ...,94-95,119-120 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   79.38 |    78.33 |   81.81 |   79.38 | ...58-272,286-291 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   89.98 |    86.95 |   88.15 |   89.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   90.24 |    91.42 |     100 |   90.24 | 142,148,151-160   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.66 |    92.85 |     100 |   98.66 | 162,324,330       
  modelRegistry.ts |     100 |    98.63 |     100 |     100 | 229               
  modelsConfig.ts  |   86.24 |    85.23 |   82.92 |   86.24 | ...1328,1357-1358 
  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   |   82.65 |    91.86 |   68.32 |   82.65 |                   
  autoMode.ts      |   97.83 |    94.21 |     100 |   97.83 | 521-522,543-550   
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |   93.95 |    94.44 |     100 |   93.95 | 158-165,383-387   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   84.86 |    89.03 |      80 |   84.86 | ...1024,1130-1134 
  rule-parser.ts   |   97.37 |    93.82 |     100 |   97.37 | ...-875,1024-1026 
  ...-semantics.ts |   70.28 |    90.69 |   46.21 |   70.28 | ...2214,2277-2280 
  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 | 219               
 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     |   79.44 |    64.39 |   64.28 |   79.44 |                   
  all-providers.ts |      68 |      100 |       0 |      68 | 68-69,73-79,83-89 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   98.87 |    87.27 |     100 |   98.87 | 268-269           
  ...der-config.ts |   69.73 |    47.29 |   68.42 |   69.73 | ...10-411,418-427 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.31 |    86.36 |      50 |   97.31 |                   
  ...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.01 |    81.25 |      75 |   97.01 | 120-121           
  deepseek.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 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |    85.3 |     78.8 |   95.89 |    85.3 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.55 |    73.71 |   90.62 |   82.55 | ...1183-1199,1229 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/services      |   84.43 |    83.92 |   91.05 |   84.43 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.35 |    85.34 |     100 |   97.35 | ...94,117,417-418 
  ...ionService.ts |   98.19 |    94.94 |     100 |   98.19 | 496,498-502,605   
  ...ingService.ts |   82.38 |    83.11 |   79.48 |   82.38 | ...1387,1390-1402 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |     100 |    97.43 |     100 |     100 | 215,268           
  cronScheduler.ts |   97.66 |    93.33 |     100 |   97.66 | 62-63,77,173      
  ...eryService.ts |   80.43 |    95.45 |      75 |   80.43 | ...19-134,140-141 
  ...oryService.ts |   78.77 |    76.76 |   81.57 |   78.77 | ...1258,1299-1302 
  fileReadCache.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   91.27 |    82.69 |    90.9 |   91.27 | ...94,196,294-301 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    69.4 |    68.82 |   93.33 |    69.4 | ...2064,2092-2093 
  ...ionService.ts |   98.13 |     97.8 |   95.45 |   98.13 | ...32-333,380-381 
  ...ticsDumper.ts |   98.37 |    95.45 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   96.06 |    91.48 |   96.96 |   96.06 | ...49,850,864-866 
  ...orRegistry.ts |   97.24 |    92.03 |     100 |   97.24 | ...49-450,601-602 
  ...ttachments.ts |   97.24 |    90.39 |     100 |   97.24 | ...08,646,661-662 
  sessionRecap.ts  |     9.7 |      100 |       0 |     9.7 | 44-174            
  ...ionService.ts |   83.85 |    77.64 |   94.28 |   83.85 | ...1488,1526-1546 
  sessionTitle.ts  |   93.87 |    71.15 |     100 |   93.87 | ...33-236,267-268 
  ...ionService.ts |   81.29 |    78.31 |   89.28 |   81.29 | ...1926,1932-1937 
  ...pInhibitor.ts |   97.02 |    90.74 |     100 |   97.02 | ...14-115,289-290 
  ...Estimation.ts |     100 |      100 |     100 |     100 |                   
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...oryService.ts |    60.2 |    74.07 |   42.85 |    60.2 | ...00-302,307-308 
  ...reeCleanup.ts |   14.56 |      100 |   33.33 |   14.56 | 58-185            
  ...ionService.ts |   84.21 |    79.41 |     100 |   84.21 | ...18-219,235-236 
 ...icrocompaction |   98.05 |       92 |     100 |   98.05 |                   
  microcompact.ts  |   98.05 |       92 |     100 |   98.05 | ...19,292,296,394 
 src/skills        |   87.96 |    86.16 |   89.83 |   87.96 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |   94.79 |     87.5 |     100 |   94.79 | ...00,220,232-234 
  skill-manager.ts |   83.35 |    81.42 |   82.35 |   83.35 | ...1195,1202-1206 
  skill-paths.ts   |   89.15 |    86.36 |     100 |   89.15 | ...00-101,106-107 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.53 |    97.36 |     100 |   97.53 | 248-249           
 src/subagents     |   85.52 |    85.21 |   94.11 |   85.52 |                   
  ...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 |   80.74 |    79.37 |   90.62 |   80.74 | ...1410,1487-1488 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   77.96 |    86.48 |   79.77 |   77.96 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   98.96 |    79.48 |     100 |   98.96 | 169,183           
  ...on-tracing.ts |   58.02 |    60.41 |   55.55 |   58.02 | ...08,349-351,367 
  ...attributes.ts |   98.13 |       88 |     100 |   98.13 | 185-187           
  ...-exporters.ts |   46.37 |      100 |   44.44 |   46.37 | ...85,88-89,92-93 
  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       |   54.08 |    65.85 |   60.86 |   54.08 | ...1250,1267-1287 
  metrics.ts       |   75.31 |    80.85 |   77.19 |   75.31 | ...1021,1024-1035 
  ...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       
  sdk.ts           |   86.75 |     88.4 |   66.66 |   86.75 | ...17-621,659-681 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   89.93 |    87.81 |   96.55 |   89.93 | ...1494,1525-1528 
  ...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         |   80.89 |     86.4 |   85.33 |   80.89 | ...1215,1218-1247 
  uiTelemetry.ts   |      92 |    95.34 |   80.95 |      92 | ...00,206-216,244 
 ...ry/qwen-logger |   68.17 |     80.2 |   65.51 |   68.17 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   68.17 |       80 |   64.91 |   68.17 | ...1077,1115-1116 
 src/test-utils    |   93.44 |    96.15 |   77.77 |   93.44 |                   
  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     |   91.71 |    97.36 |   74.19 |   91.71 | ...54,218-219,232 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   79.52 |    82.07 |   85.84 |   79.52 |                   
  ...erQuestion.ts |   88.93 |    76.74 |    90.9 |   88.93 | ...39-340,347-348 
  cron-create.ts   |   88.11 |    88.88 |    62.5 |   88.11 | ...,43-44,165-172 
  cron-delete.ts   |   96.82 |      100 |   83.33 |   96.82 | 26-27             
  cron-list.ts     |   96.66 |      100 |   83.33 |   96.66 | 25-26             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   81.02 |    84.07 |      75 |   81.02 | ...15-716,826-876 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  exit-worktree.ts |   84.23 |    85.96 |   91.66 |   84.23 | ...92-293,298-312 
  exitPlanMode.ts  |   85.09 |    85.71 |     100 |   85.09 | ...60-163,177-189 
  glob.ts          |   90.63 |    88.33 |   84.61 |   90.63 | ...28,171,302,305 
  grep.ts          |   78.91 |    85.71 |      75 |   78.91 | ...69-576,600-601 
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.77 |    60.09 |   90.32 |   72.77 | ...1211,1213-1214 
  ...nt-manager.ts |   80.29 |    77.98 |   84.44 |   80.29 | ...2932,2934-2935 
  mcp-client.ts    |      43 |    87.57 |      75 |      43 | ...1790,1794-1797 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.21 |    83.96 |   79.41 |   77.21 | ...1259,1267-1268 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 123-149           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  mcp-tool.ts      |   91.36 |    89.32 |   96.55 |   91.36 | ...40-641,691-692 
  ...sport-pool.ts |   83.27 |       80 |   84.61 |   83.27 | ...1399,1406-1410 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |       0 |        0 |       0 |       0 | 1-47              
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  monitor.ts       |   91.65 |    84.05 |   88.46 |   91.65 | ...87,600,796-801 
  notebook-edit.ts |   85.11 |    76.42 |   81.25 |   85.11 | ...54-870,916-917 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |       90 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   94.75 |    90.32 |   81.81 |   94.75 | ...02,305,388-389 
  ripGrep.ts       |   94.14 |    85.71 |    87.5 |   94.14 | ...94-495,545-546 
  ...-transport.ts |    6.34 |      100 |       0 |    6.34 | 47-145            
  send-message.ts  |   79.48 |    86.95 |    62.5 |   79.48 | ...97-203,286-294 
  ...n-mcp-view.ts |   92.37 |    93.54 |   88.88 |   92.37 | 118-126           
  shell.ts         |   74.41 |    80.92 |   91.89 |   74.41 | ...4260,4331-4332 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |    89.4 |     92.5 |   88.88 |    89.4 | ...43,447,476-498 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |   93.85 |     92.3 |   81.81 |   93.85 | 41-45,59-60,91    
  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   |    81.5 |       78 |    92.3 |    81.5 | ...74-382,408-414 
  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 
  todoWrite.ts     |   89.27 |    82.05 |   92.85 |   89.27 | ...50-555,577-578 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   76.19 |     76.1 |   81.39 |   76.19 | ...53-854,862-863 
  tool-search.ts   |   92.35 |    85.84 |    92.3 |   92.35 | ...08-213,320-329 
  tools.ts         |   92.33 |    90.74 |   90.47 |   92.33 | ...99-500,516-522 
  web-fetch.ts     |   88.84 |       80 |   92.85 |   88.84 | ...12-313,315-316 
  write-file.ts    |   82.65 |    80.45 |   84.61 |   82.65 | ...65-668,696-731 
 src/tools/agent   |   75.27 |    83.14 |   72.83 |   75.27 |                   
  agent.ts         |   75.47 |    83.28 |   72.97 |   75.47 | ...2971,2998-3061 
  fork-subagent.ts |   70.73 |    77.77 |   71.42 |   70.73 | ...09-110,145-156 
 ...s/computer-use |   85.21 |     87.9 |   76.31 |   85.21 |                   
  bootstrap.ts     |   72.09 |    92.85 |   66.66 |   72.09 | 137-191,302-303   
  client.ts        |      38 |      100 |      50 |      38 | ...48-178,182-191 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |       75 |     100 |   94.44 | 40-41             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 43                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |   95.67 |    82.97 |    92.3 |   95.67 | 49-50,159-165     
 ...tools/workflow |   93.03 |    66.66 |    90.9 |   93.03 |                   
  workflow.ts      |   93.03 |    66.66 |    90.9 |   93.03 | ...35-236,248-251 
 src/utils         |   90.08 |    87.98 |   94.55 |   90.08 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.76 |    93.06 |     100 |   94.76 | ...30-531,634-638 
  bareMode.ts      |   27.27 |      100 |       0 |   27.27 | 9-15,18-19        
  browser.ts       |   76.31 |    53.33 |     100 |   76.31 | ...37,43-44,65-66 
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |      90 |    87.71 |     100 |      90 | ...54-155,158-159 
  cronDisplay.ts   |   42.85 |    23.07 |     100 |   42.85 | 26-31,33-45,47-54 
  cronParser.ts    |   89.74 |    85.71 |     100 |   89.74 | ...,63-64,183-186 
  debugLogger.ts   |   96.42 |    94.11 |   88.23 |   96.42 | 185-189           
  editHelper.ts    |   93.63 |    83.52 |     100 |   93.63 | ...28-429,463-464 
  editor.ts        |    97.6 |     95.4 |     100 |    97.6 | ...25-326,328-329 
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.78 |    89.13 |      95 |   96.78 | ...51-252,257,403 
  errorParsing.ts  |    97.7 |    97.05 |     100 |    97.7 | 72-73             
  ...rReporting.ts |   88.46 |       90 |     100 |   88.46 | 69-74             
  errors.ts        |   70.54 |    79.59 |      50 |   70.54 | ...15-231,235-241 
  fetch.ts         |    70.8 |     77.5 |   71.42 |    70.8 | ...41-142,161,186 
  fileUtils.ts     |    91.5 |    86.19 |   95.23 |    91.5 | ...1191,1195-1201 
  forkedAgent.ts   |   80.68 |    78.12 |   83.33 |   80.68 | ...39-545,550-556 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...eUtilities.ts |   89.21 |    86.66 |     100 |   89.21 | 16-17,49-55,65-66 
  ...rStructure.ts |   94.36 |    94.28 |     100 |   94.36 | ...17-120,330-335 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  gitDiff.ts       |   92.36 |    79.53 |     100 |   92.36 | ...55-856,928-929 
  ...noreParser.ts |    92.3 |    89.36 |     100 |    92.3 | ...15-116,186-187 
  gitUtils.ts      |   73.64 |    90.32 |   83.33 |   73.64 | ...,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 |                   
  jsonl-utils.ts   |   88.98 |    90.66 |   91.66 |   88.98 | ...46-349,359-365 
  ...-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.02 |     100 |   93.77 | ...13-319,406-407 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...kerChecker.ts |   90.78 |    91.66 |     100 |   90.78 | 73-79             
  notebook.ts      |   94.57 |    89.83 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   90.85 |    87.87 |     100 |   90.85 | ...97-199,222-227 
  partUtils.ts     |     100 |    98.61 |     100 |     100 | 206               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.21 |    91.95 |     100 |   93.21 | ...89-390,392-394 
  pdf.ts           |   93.68 |    87.05 |     100 |   93.68 | ...96-297,321-325 
  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 |   58.57 |       76 |     100 |   58.57 | ...4,88-89,95-100 
  ...noreParser.ts |   85.45 |    85.18 |     100 |   85.45 | ...59,65-66,72-73 
  rateLimit.ts     |   92.55 |    85.92 |     100 |   92.55 | ...70-272,309-310 
  readManyFiles.ts |   87.59 |       84 |     100 |   87.59 | ...09-211,227-238 
  retry.ts         |   91.86 |    87.17 |     100 |   91.86 | ...30,451,458-459 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ripgrepUtils.ts  |   46.79 |    84.37 |   66.66 |   46.79 | ...45-246,258-335 
  ...sDiscovery.ts |   97.42 |    92.85 |     100 |   97.42 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   82.18 |    85.18 |   95.23 |   82.18 | ...24,549,578-587 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    88.57 |     100 |    97.5 | 162-163           
  safeJsonParse.ts |   74.07 |    83.33 |     100 |   74.07 | 40-46             
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   90.78 |    88.23 |     100 |   90.78 | ...41-42,93,95-96 
  ...aValidator.ts |      95 |    82.75 |     100 |      95 | ...07,216-219,273 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   96.89 |    85.84 |     100 |   96.89 | ...51,367,447,466 
  shell-utils.ts   |   84.39 |    90.46 |     100 |   84.39 | ...1583,1590-1594 
  ...lAstParser.ts |   95.57 |    85.79 |     100 |   95.57 | ...1066-1068,1078 
  ...ContextEnv.ts |     100 |      100 |     100 |     100 |                   
  ...nlyChecker.ts |   95.08 |    91.66 |     100 |   95.08 | ...15-316,324-325 
  sideQuery.ts     |   86.17 |    86.53 |     100 |   86.17 | ...55-161,163-169 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   81.48 |       75 |     100 |   81.48 | 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 
  textUtils.ts     |      60 |      100 |   66.66 |      60 | 36-55             
  thoughtUtils.ts  |     100 |    92.85 |     100 |     100 | 71                
  ...-converter.ts |   94.59 |    85.71 |     100 |   94.59 | 35-36             
  tool-utils.ts    |    93.6 |     91.3 |     100 |    93.6 | ...58-159,162-163 
  truncation.ts    |   96.35 |    90.58 |     100 |   96.35 | ...04,239,288-289 
  windowsPath.ts   |   89.47 |    78.57 |     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.5 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    73.84 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.58 |    81.02 |   94.28 |   83.58 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   83.07 |    77.74 |   94.82 |   83.07 | ...1468,1502-1503 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...70-271,273-274 
  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 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |     92.3 |     100 |     100 | 46                
 ...uest-tokenizer |   56.63 |    74.52 |   74.19 |   56.63 |                   
  ...eTokenizer.ts |   41.86 |    76.47 |   69.23 |   41.86 | ...70-443,453-507 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |      76 |      100 |   33.33 |      76 | 45-48,55-56       
  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.

Comment thread packages/cli/src/ui/commands/selfImproveState.ts Outdated
Comment thread packages/cli/src/ui/commands/selfImproveState.ts Outdated
Comment thread packages/cli/src/ui/commands/selfImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ Downgraded from Request changes to Comment: CI failing: Test (macos-latest, Node 22.x), Test (ubuntu-latest, Node 22.x), Test (windows-latest, Node 22.x).

This is a supplementary review pass focusing on issues not covered by the prior review. The initial review already identified the core issues (stale loop recovery, getRepoRoot error handling, cron/state write ordering, test coverage gaps, path traversal). The following are additional findings:

New Critical findings:

  1. currentRun type safety in stopSelfImprove — accessing .status on a non-object currentRun produces undefined, causing hasActiveRun=true and leaving the loop stuck in stopping state.

  2. CronScheduler 3-day expiry silently kills long-running loopsstartSelfImprove never warns that recurring cron jobs expire after 3 days. A --every 1d loop silently dies.

New Suggestions:

  1. Top-level action handler duplicates subcommand routing (dead code)
  2. isRecord duplicated across selfImproveCommand.ts and selfImproveState.ts
  3. start subcommand reassembles string for regex re-parsing instead of passing structured params
  4. parseInterval silently upgrades seconds to minutes without informing the user
  5. tickSelfImprove uses misleading "loop is stopping" message for all non-running states
  6. active.json not cleaned after graceful stop with an active run — user must stop twice

— glm-5.1 via Qwen Code /review

Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/selfImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.test.ts
@DragonnZhang DragonnZhang changed the title feat(cli): add self-improve command feat(cli): add auto-improve command May 20, 2026
Comment thread packages/cli/src/ui/components/AutoImproveSourceDialog.tsx
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveState.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/ui/commands/autoImproveState.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
@wenshao

wenshao commented May 21, 2026

Copy link
Copy Markdown
Collaborator

@DragonnZhang 这个 PR 跟最新 main 有冲突了,请 rebase / merge 一下 ~ 当前唯一的冲突文件是 packages/cli/src/services/BuiltinCommandLoader.ts(最近 main 上有 BuiltinCommandLoader 相关改动)。落后约 123 commits,rebase 时可能还要扫一眼其它 auto-merged 文件确认行为没有偏差。

Comment thread packages/cli/src/ui/commands/autoImproveState.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts Outdated
Comment thread packages/cli/src/ui/components/AutoImproveSourceDialog.tsx
Comment thread packages/cli/src/ui/components/AutoImproveSourceDialog.tsx Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.test.ts

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Found 1 Critical issue and 1 Suggestion. CI is still pending (Lint, Test (macos-latest, Node 22.x), Test (ubuntu-latest, Node 22.x), Test (windows-latest, Node 22.x), CodeQL).

Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
@DragonnZhang
DragonnZhang force-pushed the dragon/feat-self-improve branch 2 times, most recently from 3c7e949 to 3fcdc11 Compare May 21, 2026 07:19

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

CI note: Test (macos-latest, Node 22.x) is failing.

Non-inline findings:

  1. useDialogClose.ts is not registered for the auto-improve-source dialog. When the source dialog is open and the user presses Ctrl+C, closeAnyOpenDialog() does not match any known dialog, so it falls through to the exit-prompt path while the source dialog is still rendered. Fix: add isAutoImproveSourceDialogOpen / closeAutoImproveSourceDialog to DialogCloseOptions and handle in closeAnyOpenDialog, consistent with all other dialogs.

  2. submitPromptOnCompleteRef leak after tick API failure: when a cron-fired tick's API call fails (429, network error), the catch block does not clear submitPromptOnCompleteRef. The stale markRunCompleted callback leaks into the next successful user turn, marking the failed run as 'success'. Fix: reset submitPromptOnCompleteRef.current = null at turn start (alongside lastTurnUserItemRef) and in the error catch block.

Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.test.ts
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts Outdated
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveState.ts Outdated
Comment thread packages/cli/src/ui/components/AutoImproveSourceDialog.tsx
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
@DragonnZhang
DragonnZhang marked this pull request as ready for review May 21, 2026 10:12
@DragonnZhang
DragonnZhang enabled auto-merge (squash) May 21, 2026 10:12
@DragonnZhang
DragonnZhang requested a review from wenshao May 22, 2026 05:19
Comment thread packages/cli/src/acp-integration/session/Session.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
Comment thread packages/cli/src/ui/components/AutoImproveStatusBox.tsx Outdated
Comment thread packages/cli/src/nonInteractiveCli.ts Outdated
Comment thread packages/cli/src/nonInteractiveCli.ts
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/nonInteractiveCli.ts Outdated
Comment thread packages/cli/src/acp-integration/session/Session.ts Outdated
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
Comment thread packages/cli/src/nonInteractiveCli.ts
Comment thread packages/cli/src/nonInteractiveCli.ts
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread scripts/installation/install-qwen-standalone.bat
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts Outdated
@DragonnZhang

Copy link
Copy Markdown
Collaborator Author

Auto-improve tick summary (3 fixes pushed)

1. 01724d04a — test(cli): add autoImproveState persistence layer tests

Added 23 tests for the state module addressing review feedback:

  • Path traversal rejection (../escape, ../../../../etc)
  • Malformed JSON (SyntaxError → null)
  • Invalid shape, unknown status → stale normalization
  • Legacy primitive currentRun/lastRun handling
  • Config deduplication, active pointer validation

2. c9e345a15 — fix(cli): localize describeSources strings

Wrapped all source labels in describeSources() with t() for i18n. Added 'none configured' key to en/zh/zh-TW locales. Resolved the describeSources review thread.

3. Tests verified

  • autoImproveState.test.ts: 23/23 passed
  • autoImproveCommand.test.ts: 22/22 passed

Comment thread packages/cli/src/ui/commands/autoImproveState.ts Outdated
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
Comment thread packages/cli/src/nonInteractiveCli.ts Outdated
- compactAutoImproveRunIndex: add hysteresis (compact at >2×MAX, not >MAX)
  so it stops re-firing the read+parse+write on every tick once the cap is
  reached; update the threshold test + add a hysteresis-band no-op test
- getCurrentBranch: pass { timeout: 10_000 } to git symbolic-ref, matching
  getRepoRoot, so a blocking git config can't hang the CLI
- nonInteractiveCli cron tick: distinguish SIGINT/AbortError from real
  failures (abortController.signal.aborted → { cancelled: true }) so a
  cancelled tick records as 'cancelled', not 'failed'; mirrors Session.ts
Clean merge — brings in main's fix for the yaml-parser 'known limitations'
pin tests so the Test suite is green against current main.

@DragonnZhang DragonnZhang left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

No review findings. Downgraded from Approve to Comment: self-PR (author is the authenticated user). LGTM. — claude-sonnet-4-20250514 via Qwen Code /review

Comment thread packages/cli/src/nonInteractiveCli.ts Outdated
Comment thread packages/cli/src/nonInteractiveCli.ts Outdated
… SIGINT in -p path

- cron tick: wrap partListToText in try/catch that fires slashOnComplete
  (cancelled on abort, else errored) before rethrowing — it runs outside
  the try/finally below, so a throw would otherwise strand currentRun
- outer -p error path: distinguish SIGINT (cancelled) from real failures
  (errored) when firing the captured slashOnComplete, mirroring the
  cron-tick abort check

@DragonnZhang DragonnZhang left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Downgraded from Request Changes to Comment: self-PR (GitHub does not allow REQUEST_CHANGES on your own PR).

Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
…-day expiry

CronScheduler creates recurring jobs with a hard 3-day expiry and reaps
them on tick(); nothing refreshed the auto-improve job, so a loop running
longer than 3 days was silently killed.

- core: add CronScheduler.refresh(id) — extends a recurring job's expiry to
  now + THREE_DAYS_MS (no-op for one-shot/unknown jobs)
- cli: tickAutoImproveClaim refreshes the job's expiry on every active tick
  (ticks fire far more often than every 3 days), so the job persists for the
  life of the loop; only for active+running loops, so stopped/stale loops
  still expire
- tests: refresh unit tests + assert an active tick refreshes the cron job

@DragonnZhang DragonnZhang left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

No review findings. Downgraded from Approve to Comment: self-PR (GitHub does not allow self-approval). CI is partially pending (macOS/Windows tests still in progress). The code demonstrates thorough defensive engineering: atomic writes, TOCTOU guards (re-read + mutex), ownership checks (expectedRunId), prompt injection hardening (boundary marker neutralization, control char stripping), stale run reclaim, and comprehensive onComplete firing on all paths (success, error, cancel). All previously reported issues from earlier commits have been addressed. — Qwen Code /review

Comment thread packages/cli/src/ui/commands/dreamCommand.ts Outdated
Comment thread packages/cli/src/acp-integration/session/Session.ts Outdated
The PR added a 'cancelled' onComplete signal; propagate it to the remaining
consumers so a SIGINT/abort isn't mis-recorded:
- dreamCommand: guard writeDreamManualRun on cancelled too (not just errored),
  so a cancelled /dream doesn't persist a false consolidation record
- Session.ts regular ACP path: map stopReason 'cancelled' to { cancelled: true }
  instead of lumping all non-end_turn reasons into { errored: true }
- Session.ts catch: pass { cancelled: true } when pendingSend.signal.aborted,
  mirroring the cron path
};
}

async function getRepoRoot(config: Config): Promise<string> {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Three independent implementations of "resolve git repo root" exist across this file (getRepoRoot at line 195), autoImproveState.ts (resolveRepoRoot at line 798), and AutoImproveSourceDialog.tsx (resolveRepoRoot at line 42). All three spawn git rev-parse --show-toplevel with a 10-second timeout and cwd fallback. Only this version has caching via repoRootCache.

If the timeout, fallback logic, or caching policy needs to change, three locations must be updated in sync. The dialog and state module also make redundant subprocess calls without caching.

Consider extracting a single shared resolveRepoRoot(config) with caching into autoImproveState.ts and importing from the other two files.

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fair point on the duplication. Holding off on consolidating it into this PR, though: the three call sites have intentionally different needs — getRepoRoot (cron tick / hot path) caches via repoRootCache, while AutoImproveSourceDialog's resolver runs once on dialog open and the autoImproveState one runs in a context where the cache isn't shared. Folding the dialog/state paths onto the cached resolver is a behavior change (cache lifetime/invalidation) that's better done deliberately as a focused refactor than bundled into this feature PR. Flagging for maintainer call on whether to require it here or track separately — leaving open.

if (sendResult.stopReason === 'cancelled') {
slashOnCompleteCancelled = true;
} else {
slashOnCompleteErrored = true;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] When sendResult.stopReason === 'max_tokens' and responseStream is null, this code sets slashOnCompleteErrored = true. For auto-improve runs that completed substantial work before hitting the token limit, recording the run as 'failed' is misleading.

Users reviewing run history may incorrectly assume a run failed when it actually completed meaningful work. Consider distinguishing max_tokens from other failure modes — either record as success when the response contained meaningful output, or add a distinct status.

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Valid semantics question, but it's a product call I'd rather not decide unilaterally: should a max_tokens run be recorded as 'failed', 'success', or a distinct status (e.g. 'truncated')? Today the loop treats any non-end_turn, non-cancelled stop as errored. Mapping max_tokens to success-when-meaningful-output needs a definition of "meaningful", and a new status touches the run-index schema + status UI. Leaving open for maintainer input on the preferred run-status semantics rather than guessing.

Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts Outdated
…onComplete

The interactive submitPrompt catch fired onComplete({ errored: true }) for all
errors. A process-shutdown abort can reach this catch with the onComplete ref
still set (unlike an interactive cancel, which clears it first), mis-recording
a cancelled run as 'failed'. Map AbortError to { cancelled: true }, consistent
with the ACP and non-interactive paths.

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

Code Review Summary

PR: #4161 — feat: add auto-improve self-improvement loop
Review method: Automated (qwen3.7-max via Qwen Code)
Deterministic analysis: ✅ tsc 0 errors, eslint 0 errors
Build: ✅ passed | Tests: ✅ 341/341 passed

Overview

This is a large feature PR (+5745/-27, 33 files) adding an auto-improve self-improvement loop with cron scheduling, state persistence, worktree isolation, UI dialogs, and non-interactive CLI support. The architecture is sound overall, but there are several robustness and test-coverage concerns that should be addressed before merge.

Findings Summary

# Severity File Issue
F3 Critical autoImproveCommand.ts Worktree cleanup relies on LLM following prompt rules, not programmatic enforcement
F4 Suggestion cronScheduler.ts Cron job silently reaped after 3-day expiry with no logging
F7 Nice to have autoImproveState.ts compactAutoImproveRunIndex double-reads file
F8 Suggestion autoImproveState.ts listAutoImproveLoopStates is dead code (exported, zero callers)
F11 Suggestion autoImproveCommand.ts Three separate resolveRepoRoot implementations
F13 Suggestion useGeminiStream.ts Auto-improve-specific logic in general hook
F14 Suggestion cronScheduler.ts parseCron called O(jitter) times per second — should cache
F17 Critical nonInteractiveCli.ts Cron callback (~90 lines) entirely untested
F18 Critical Session.ts Cron error/cancel branches (4 branches) only happy-path tested
F19 Suggestion autoImproveCommand.ts withTickMutex has no concurrent-access test
RA Suggestion ui/types.ts cancelled flag in SubmitPromptActionReturn but missing from SubmitPromptResult.onComplete

Total: 3 Critical, 7 Suggestion, 1 Nice to have

CronScheduler findings (no inline — lines not in diff)

F4 — Silent job reaping: tick() deletes expired jobs via this.jobs.delete(job.id) at line 206 with zero log output. After 3-day expiry with no refresh() call, the job silently disappears leaving stale state files. Suggestion: Add a log entry before deletion.

F14 — parseCron per second: matches(job.cronExpr, candidateDate) at line 234 internally parses the cron expression on every call. For N jobs, this means O(N) parseCron calls per second. Suggestion: Cache parsed cron fields on the job object when registered.

Low-confidence findings (not inline)

These findings were identified at lower confidence and are listed for awareness only:

  • Cross-process TOCTOU race in tick claiming (documented limitation in the code)
  • Run record fields lack sanitization/length caps
  • worktreePath lacks path validation before git worktree remove
  • Silent error swallowing in nonInteractiveCli.ts partListToText path
  • markRunCompleted write failure strands run for up to 2h
  • Interactive cancel race on lastRun.status

— qwen3.7-max via Qwen Code /review

};
}

async function markRunCompleted(

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] Worktree cleanup is delegated to the LLM via prompt instructions rather than enforced programmatically.

markRunCompleted updates the run record status but does not programmatically remove the git worktree. The worktreePath field is stored in SelfImproveRunRef but never cleaned up on completion, failure, or cancellation. Cleanup is instead instructed to the AI agent in the tick prompt (lines ~549, 553, 556).

If a run fails, is cancelled, or the process crashes mid-tick, the worktree remains on disk. Over time, leaked worktrees accumulate in the repo directory.

Suggestion: Add explicit git worktree remove <worktreePath> in markRunCompleted and in the error/cancel paths of the tick handler. Don't rely on the LLM agent to execute cleanup commands.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Real concern, but a deliberate design choice I won't flip unilaterally. Cleanup is delegated to the agent via the tick prompt so it can decide what to preserve; making markRunCompleted run git worktree remove --force unconditionally risks destroying a worktree that still holds uncommitted work, and races the agent's own cleanup. A safe programmatic GC (remove only on terminal failure/cancel, force-guarded, skip if unexpectedly dirty) is worth doing but needs a policy decision. Flagging for maintainer input — leaving open.

Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
import process from 'node:process';

const debugLogger = createDebugLogger('GEMINI_STREAM');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] parseAutoImproveTickLoopId introduces auto-improve-specific logic into the general useGeminiStream hook.

This parsing function is only relevant to the auto-improve feature but lives in a hook used by all streaming operations. As the feature grows, this coupling will increase.

Suggestion: Move this logic into autoImproveCommand.ts or a dedicated auto-improve hook, keeping useGeminiStream feature-agnostic.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fair coupling point. parseAutoImproveTickLoopId lives here because the loop-id must be recovered from the prompt at the exact point the hook submits it (to thread cancellation back to the right loop). Moving it to a dedicated auto-improve module is reasonable but re-exposes the submit-time seam; better as a focused decoupling pass than widening this PR. Leaving open for maintainer prioritization.

// accumulated from process start rather than this tick.
const cronJobStart = Date.now();
const label = job.prompt.slice(0, 40);
let modelText = job.prompt;

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] The non-interactive cron callback (~90 lines, lines ~1348-1440) has zero test coverage.

This code path handles the entire auto-improve tick lifecycle in non-interactive (headless/CI) mode: reading state, creating worktrees, running the agent, processing results, and updating state. It's a critical path for CI/CD usage of the auto-improve feature.

Without tests, regressions in any of the ~5 branches (success, failure, cancellation, worktree error, state read error) will go undetected.

Suggestion: Add integration tests covering at minimum:

  1. Successful tick end-to-end
  2. Run failure → state updated to failed
  3. Cancellation → state updated to cancelled
  4. Worktree creation failure → graceful error handling

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Agreed — the headless -p cron callback is the biggest coverage gap (flagged as a tracked follow-up in earlier threads too). It needs a nonInteractiveCli test scaffold that drives the callback through success/failure/cancel/worktree-error/state-error; that's a substantial piece I'd rather land deliberately than rush. Leaving open as the tracked test-harness follow-up.

cancelled?: boolean;
}) => Promise<void>)
| undefined;
let slashOnCompleteErrored = false;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] The cron error/cancel branches in Session.ts have only happy-path test coverage.

This block declares slashOnCompleteErrored and slashOnCompleteCancelled flags and manages at least 4 error/cancel paths (lines 1769, 1795, 1822, 1833, 1899). Only the success path (run completes, branch created, PR submitted) is tested.

The error branches handle real failure modes — agent errors, worktree failures, cancellation mid-tick — that users will encounter in practice.

Suggestion: Add tests for:

  1. Agent returns error → slashOnCompleteErrored = true path
  2. User/system cancels → slashOnCompleteCancelled = true path
  3. Worktree operation fails during tick
  4. State write failure after run completion

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Same theme as the non-interactive coverage gap — the Session.ts cron error/cancel branches only have happy-path coverage. The branches are now correct (errored vs cancelled distinguished); exercising agent-error / worktree-failure / cancel-mid-tick needs fixtures simulating those mid-stream. Tracking alongside the cron test-harness follow-up; leaving open.

// sessions. (Cross-process races between separate CLI invocations still require
// on-disk file locking; this closes the common in-process case.)
const tickMutexes = new Map<string, Promise<unknown>>();
function withTickMutex<T>(loopId: string, fn: () => Promise<T>): Promise<T> {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] withTickMutex has no test for concurrent access.

This mutex serializes ticks per loopId using a Map of chained promises. It's the only concurrency control preventing overlapping runs of the same loop, but there's no test verifying it actually serializes correctly under concurrent calls.

Suggestion: Add a test that fires multiple concurrent withTickMutex calls for the same loopId and asserts they execute sequentially.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reasonable coverage gap. withTickMutex is internal (not exported), so a direct unit test means exporting it purely for testing; the serialization is currently exercised indirectly via the tick tests. A proper concurrent test (two overlapping tick <id> calls asserting one claims and the other skips) is a good focused follow-up — flagging rather than adding a fragile concurrency test under time pressure.

Comment thread packages/cli/src/ui/types.ts
- types: add 'cancelled?' to SubmitPromptResult.onComplete and
  NonInteractiveSlashCommandResult.onComplete so they match
  SubmitPromptActionReturn (Session.ts branches on both errored/cancelled)
- compactAutoImproveRunIndex: reuse the JSON.parse from the record-count
  check via normalizeRunIndex instead of re-reading the file through
  readAutoImproveRunIndex (one fewer read+parse)

@DragonnZhang DragonnZhang left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Re-reviewed at f2d09ed. No high-confidence issues found.

The new commits add robust onComplete threading for error/cancellation paths across Session.ts (ACP), nonInteractiveCli.ts (headless), and useGeminiStream.ts (interactive). Key improvements since the last review:

  • onComplete now fires on error and cancellation paths (not just success), preventing currentRun deadlocks when a tick fails or is cancelled.
  • Cancellation vs. failure distinction is consistently propagated (AbortError -> cancelled, other errors -> failed) across all three execution modes.
  • Cron scheduler gains a refresh() method to extend recurring job expiry, preventing silent reaping of long-running loops.
  • Stale run reclamation (2h max age) with runId ownership guard provides a safe backstop for stuck runs.
  • Prompt injection defense: fence markers in user input are neutralized (--- -> en dashes) with test coverage.
  • Extensive test coverage for the new paths (concurrent tick mutex, TOCTOU re-read, stale completion handling, cancellation).

CI: 7 passing, 2 pending (CodeQL + review workflow itself). No failures.

Verdict: APPROVE

Comment thread packages/cli/src/ui/commands/autoImproveCommand.ts
If active.json referenced a loop whose state.json was missing/corrupt,
readAutoImproveLoopState returned null, the running/stopping guard was
skipped, and startAutoImprove fell through to create a new loop — leaving
the old loop directory orphaned under .qwen/auto-improve/loops/. Since
readAutoImproveLoopState only returns null for ENOENT/SyntaxError (transient
FS errors rethrow), null is genuinely unrecoverable: remove the orphaned dir
and clear the dangling pointer before starting fresh.
Resolve conflicts where main refactored the same code my changes touch:
- Session.ts cron handler: keep main's withInteractionSpan telemetry wrapper
  (cronHadError / turnCount / conversation_finished) AND re-integrate the
  auto-improve slashOnComplete lifecycle — slash-command resolution of the
  cron prompt, onComplete capture, and the cancelled/errored finally-fire
  (main's version had no slash handling, which auto-improve's cron tick needs)
- Session.ts #executePrompt: take main's withInteractionSpan + logUserPrompt
  structure, re-add the pendingSlashOnComplete capture
- Session.ts class field: keep both pendingSlashOnComplete and followupAbort
- dreamCommand: keep main's recordDream helper + ACP eager-fire path, but
  guard the non-ACP onComplete on errored/cancelled

Verified: Session/dream/auto-improve suites 202/202.

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

[Critical] slashCommandProcessor.test.ts (unchanged file) has 2 typecheck errors caused by this PR's type/signature changes:

  1. Line 137 (TS2739): createMockActions() is missing 3 new properties: openSkillsManagerDialog, openAutoImproveSourceDialog, openStatsDialog
  2. Line 1547 (TS2554): useSlashCommandProcessor() call expects 16-17 arguments but receives 15 — missing the new updateItem parameter

Both need to be updated to match the modified SlashCommandProcessorActions type and hook signature.

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/ui/commands/autoImproveState.ts
Comment thread packages/cli/src/nonInteractiveCliCommands.ts
…ompt

main's UserPromptExpansion hook can block a submit_prompt and return a
'message' result, discarding the captured onComplete. For an auto-improve
tick (/auto-improve tick → submit_prompt with onComplete=markRunCompleted),
that stranded currentRun in 'implementing' until the 2h stale reclaim. Fire
result.onComplete({ errored: true }) before returning the blocked result.
# Conflicts:
#	packages/cli/src/ui/hooks/useGeminiStream.ts
@wenshao

wenshao commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator

🧪 Local runtime verification (built CLI + real model, interactive TUI via tmux) — ⚠️ one merge-blocking defect found (rest of the surface passes)

Same protocol as my other PR verifications: built the PR head (df22089, 92 commits; the branch has origin/main merged in and is 2 commits behind latest main) with npm ci && npm run build && npm run bundle, then drove the built dist/cli.js interactive TUI in tmux against a real Qwen model, in a scratch git repo seeded with a TODO so ticks have bounded, locally verifiable work. ~35 minutes of live driving: 3 loops created, 7 tick executions (2 cron-fired on schedule), 4 real improvement commits landed. No unit tests re-run — runtime observation only.

Environment: macOS (arm64), Node v22.22.2, isolated tmux socket, scratch repo /tmp/ai-playground (no remote → push impossible by construction), approvalMode: yolo. Note: on the merged head, cron is default-on (isCronEnabled() honors only the QWEN_CODE_DISABLE_CRON=1 kill switch), so the PR-description's "enable experimental.cron" instructions are already outdated.

What passes (and passes well)

# Scenario Observed
1 ✅ Usage / routing Bare /auto-improve → 4-line usage; tick stays hidden
2 ✅ End-to-end tick runs 4 runs completed: TODO fix, sibling-function fix, boundary tests, README docs — each in an isolated worktree (EnterWorktree), checks run (6/6…15/15), committed to the loop default branch main per the local-source delivery rule, conventional commit messages, worktree removed after success
3 ✅ Run bookkeeping summary.md, runs/index.json, per-run docs all written; status box "Recent runs" shows task/branch/commit/run-doc per run
4 ✅ Cron scheduling */5 * * * * fired on schedule three times (:20, :25, :30), each submitting /auto-improve tick <loopId> into the session (the :25 submission line ● Cron: /auto-improve tick … captured directly)
5 ✅ Status box running/stopped variants, loop id, cadence+cron, default branch, sources, cron job id, prompt, custom sources, last/recent runs — all accurate
6 ✅ Stop semantics stop → "Auto-improve loop stopped.", cron job deleted, active pointer cleared; tick-after-stop → "skipped: loop is not active."
7 ✅ Duplicate start second start while active → "An auto-improve loop is already active: "
8 ✅ Source dialog CRUD toggle built-ins, add ×2, edit, delete, Save → config.json matches dialog state exactly; Esc discards cleanly
9 ✅ Legacy migration userContext config → shown as custom source in dialog, snapshotted into a new loop, rendered in status box (end-to-end)
10 🔍 Interval validation 45m / 2d / 90s / banana → each gets its specific, correct error
11 🔍 Hostile loop id /auto-improve tick ../../etc/passwd → graceful "skipped: loop is not active."
12 🔍 Cron kill switch QWEN_CODE_DISABLE_CRON=1 → start correctly rejected (but see finding 4 on the message text)

⚠️ Finding 1 (merge-blocking): runs are finalized as success seconds into the run — Esc-cancellation only works in a tiny window

Decisive observation (no cancel, no cron involved): start --every 30m21 seconds in, while the agent was visibly mid-worktree-work (esc to cancel spinner active), state.json already read:

currentRun: None | lastRun: {'runId': 'pending-2026-06-12T06-40-44Z-…', 'status': 'success', …}

The run is recorded success at the end of the model's first stream segment, not when the tick actually finishes. Everything the PR builds on top of run lifecycle then degrades:

  • Esc during the tool phase (≈ the entire real duration of a tick): only "● Request cancelled." appears — no "Auto-improve run cancelled. The loop is still active…" reminder, no cancelled status (run already success). Reproduced on a cron-fired tick and on a start-submitted tick.
  • Esc within the first seconds (before the first segment ends) works exactly as designed — reminder shown, lastRun.status: cancelled. Reproduced twice. The claimed behavior exists; its window is just a few seconds wide.
  • The "previous run is still active" tick-dedup guard can effectively never trip in-session after those first seconds (currentRun is already cleared). Observed: a cron tick started a brand-new full run ~10s after I Esc'd the previous one, with no skip message.
  • Books end up clean-but-wrong: a later tick's agent even backfilled the cancelled run's index record as success (per tick-prompt rule 11), so the cancellation leaves no trace anywhere.

Likely site: packages/cli/src/ui/hooks/useGeminiStream.ts — the submit_prompt onComplete fires after the first processGeminiStreamEvents returns (tool-call continuations re-enter submitQuery as ToolResult with the refs already cleared, so currentAutoImproveLoopIdRef is also nulled — which is why the Esc handler no longer recognizes the turn as an auto-improve tick). Suggested fix: fire onComplete (and keep the loop-id ref alive) only when the turn reaches a terminal state with no pending tool continuations.

Other findings

  1. ⚠️ User-queued messages lost at a cron boundary (observed once): /auto-improve status + stop queued during tick 1 ("Press ↑ to edit queued messages" visible) were silently discarded when tick 1's completion coincided with the cron tick submission; pane shows Request cancelled.-free transition final response → ● Cron: … → > /auto-improve tick … with my two commands never echoed or executed. Negative control: with no cron racing the boundary, a queued status drained and executed normally. Worth checking the cron-submission vs message-queue interaction.
  2. Esc mid-run orphans the worktree.qwen/worktrees/error-message-checks + branch worktree-error-message-checks left behind, and the footer still showed ⎇ worktree-error-message-checks after cancel. The PR's risk note says "a hard process kill could still leave orphaned worktrees"; a plain Esc suffices.
  3. Stale gate-failure advice: with cron force-disabled the error says "Enable experimental.cron or QWEN_CODE_ENABLE_CRON=1" — on the merged head neither exists (isCronEnabled() reads only the kill switch; cron is default-on). Same staleness in the PR description's validation steps.
  4. Non-interactive mode is fully gated off-p "/auto-improve status"The command "/auto-improve" is not supported in this mode. Yet the PR adds non-interactive onComplete plumbing with comments anticipating -p "/auto-improve start". If non-interactive is intentionally deferred, fine (the plumbing is just unreachable); if not, start/status/stop/tick need supportedModes including non-interactive.
  5. Dialog nits: (a) entering edit mode places the cursor at the start of the existing text — typed text prepends ("… and tests/" became and tests/Focus on TODO…); cursor-at-end is the usual convention. (b) Under synthetic rapid-fire keys (no inter-key delay), a space can toggle the row the state machine was on rather than the row the cursor shows — human typing speed doesn't hit this; paced keys behave perfectly.
  6. Positive observation worth keeping: the four committed improvements were genuinely good, bounded changes (input validation + matching tests, boundary coverage, accurate README API docs) with passing checks each time, and the user's working tree was never touched.

Verdict (merge reference)

The loop machinery — scheduling, worktree isolation, source-aware local delivery, run docs, stop semantics, source dialog, legacy migration, input validation — all verify cleanly at the real surface, and the agent-side behavior is impressively disciplined. But finding 1 breaks one of the PR's explicitly claimed behaviors (Esc cancellation) for all but the first few seconds of every tick, and silently mis-records interrupted runs as successful — for a feature whose whole job is autonomous bookkeeping of unattended runs, I'd treat that as merge-blocking. Recommend: fix the onComplete timing, re-run the Esc matrix (early / tool-phase / cron-fired), then this is good to go. Findings 2–6 are follow-up grade.

🇨🇳 中文版(点击展开)

🧪 本地运行时验证(构建后 CLI + 真实模型,tmux 交互式 TUI)— ⚠️ 发现一个建议阻塞合并的缺陷(其余表面全部通过)

与我其他 PR 验证相同的流程:本地构建 PR head(df22089,92 个 commit;分支已合入 origin/main,落后最新 main 仅 2 个提交),在 tmux 中驱动构建产物 dist/cli.js 的交互式 TUI,使用真实 Qwen 模型,测试场地是一个预埋 TODO 的临时 git 仓库(tick 因此有有界、本地可验证的工作可做)。约 35 分钟真实驱动:创建 3 个循环、执行 7 次 tick(其中 2 次由 cron 按计划自动触发)、产生 4 个真实改进 commit。未重跑单测——纯运行时观察。

环境: macOS (arm64)、Node v22.22.2、独立 tmux socket、临时仓库 /tmp/ai-playground(无 remote → 推送在构造上不可能)、approvalMode: yolo。注意:在合并后的 head 上 cron 已默认开启isCronEnabled() 只认 QWEN_CODE_DISABLE_CRON=1 杀开关),PR 描述中"启用 experimental.cron"的指引已过时。

通过项(且质量很高)

# 场景 观察结果
1 ✅ 用法/路由 /auto-improve → 4 行用法;tick 保持隐藏
2 ✅ tick 端到端 4 次完整运行:TODO 修复、兄弟函数一致性修复、边界测试、README 文档——每次都在隔离 worktreeEnterWorktree)中进行,跑检查(6/6…15/15),按 local 源交付规则提交到循环默认分支 main,规范的 commit message,成功后删除 worktree
3 ✅ 运行记账 summary.mdruns/index.json、每次运行的文档全部写齐;状态盒 "Recent runs" 展示每次的任务/分支/commit/run doc
4 ✅ cron 调度 */5 * * * * 按计划触发三次(:20、:25、:30),每次向会话提交 /auto-improve tick <loopId>(:25 的提交行 ● Cron: /auto-improve tick … 有直接捕获)
5 ✅ 状态盒 running/stopped 两种形态、loop id、节奏+cron、默认分支、源、cron job id、prompt、自定义源、last/recent runs——全部准确
6 ✅ stop 语义 stop → "Auto-improve loop stopped.",cron job 删除、活动指针清除;停止后 tick → "skipped: loop is not active."
7 ✅ 重复 start 活动期间再次 start → "An auto-improve loop is already active: "
8 ✅ 源对话框 CRUD 切换内置源、添加 ×2、编辑、删除、保存 → config.json 与对话框状态完全一致;Esc 干净放弃
9 ✅ legacy 迁移 userContext 配置 → 对话框中显示为自定义源、快照进新循环、状态盒中渲染(端到端)
10 🔍 间隔校验 45m / 2d / 90s / banana → 各自得到具体、正确的报错
11 🔍 恶意 loop id /auto-improve tick ../../etc/passwd → 优雅的 "skipped: loop is not active."
12 🔍 cron 杀开关 QWEN_CODE_DISABLE_CRON=1 → start 被正确拒绝(但文案见发现 4)

⚠️ 发现 1(建议阻塞合并):运行在开始数秒后即被定格为 success —— Esc 取消只在极小窗口内生效

决定性观察(无取消、无 cron 干扰):start --every 30m第 21 秒、agent 明显还在 worktree 中干活(esc to cancel 转轮仍在)时,state.json 已经是:

currentRun: None | lastRun: {'runId': 'pending-2026-06-12T06-40-44Z-…', 'status': 'success', …}

运行在模型第一个流式段结束时就被记为 success,而非 tick 真正完成时。构建在运行生命周期之上的一切随之退化:

  • 工具阶段按 Esc(≈ tick 的几乎全部真实时长):只出现 "● Request cancelled." —— 没有"循环仍活跃"提醒、没有 cancelled 状态(已被记为 success)。在 cron 触发的 tick 和 start 提交的 tick 上均复现。
  • 开始数秒内按 Esc(第一段流结束前)则完全符合设计——提醒出现、lastRun.status: cancelled。复现两次。声明的行为存在,只是窗口只有几秒宽。
  • "previous run is still active" 去重保护在会话内几乎永远不会触发currentRun 早已清空)。实测:Esc 掉上一个 tick 约 10 秒后,cron tick 直接开启了全新一轮,没有任何 skip。
  • 账面干净但错误:后续 tick 的 agent 甚至按 tick 提示词规则 11 把被取消运行的索引记录"补账"成了 success——取消行为在任何地方都不留痕。

可能位置:packages/cli/src/ui/hooks/useGeminiStream.ts —— submit_promptonComplete 在第一次 processGeminiStreamEvents 返回后即触发(工具调用续传以 ToolResult 重入 submitQuery,相关 ref 已被清空,因此 currentAutoImproveLoopIdRef 也被置空——这正是 Esc 处理器不再识别该回合为 auto-improve tick 的原因)。建议修复:仅在回合到达终态(无待续工具调用)时触发 onComplete 并保持 loop-id ref 存活。

其他发现

  1. ⚠️ cron 边界处用户排队消息丢失(观察到一次): tick 1 运行期间排队的 /auto-improve status + stop("Press ↑ to edit queued messages" 可见)在 tick 1 结束恰逢 cron tick 提交时被静默丢弃;pane 显示 最终响应 → ● Cron: … → > /auto-improve tick … 的过渡,两条命令从未回显或执行。反向对照:无 cron 竞争时,排队的 status 正常排空执行。建议检查 cron 提交与消息队列的交互。
  2. 运行中 Esc 会遗留孤儿 worktree —— .qwen/worktrees/error-message-checks + 分支 worktree-error-message-checks 残留,且取消后底栏仍显示 ⎇ worktree-error-message-checks。PR 风险声明说"硬杀进程才可能遗留孤儿 worktree",实际普通 Esc 即可。
  3. 门控失败文案过时: cron 被强制关闭时报错说 "Enable experimental.cron or QWEN_CODE_ENABLE_CRON=1"——合并后的 head 上两者都不存在(isCronEnabled() 只读杀开关;cron 默认开启)。PR 描述的验证步骤同样过时。
  4. 非交互模式完全被挡 —— -p "/auto-improve status"The command "/auto-improve" is not supported in this mode. 但 PR 添加了非交互 onComplete 管道,注释还预期 -p "/auto-improve start" 可用。若有意延后非交互支持则无妨(管道暂不可达);否则 start/status/stop/tick 需要声明包含非交互的 supportedModes
  5. 对话框小问题:(a) 进入编辑模式时光标在已有文本行首——输入会变成前缀("… and tests/" 变成了 and tests/Focus on TODO…);常规习惯是光标在行尾。(b) 合成的无间隔连发按键下,space 可能作用于状态机之前所在行而非光标显示行——人类手速不会触发;放慢节奏后行为完美。
  6. 值得保留的正面观察:四个落地的改进都是真正有价值、有边界的修改(输入校验+配套测试、边界覆盖、准确的 README API 文档),每次检查都通过,且用户工作区从未被碰过。

结论(合并参考)

循环机制——调度、worktree 隔离、源感知本地交付、运行文档、stop 语义、源对话框、legacy 迁移、输入校验——在真实表面全部干净通过,agent 侧行为也相当自律。但发现 1 使 PR 明确声明的行为之一(Esc 取消)在每个 tick 除最初几秒外全程失效,并把被中断的运行静默记为成功——对一个核心职责就是无人值守运行记账的功能而言,我认为这应当阻塞合并。建议:修复 onComplete 时机,重跑 Esc 矩阵(早期/工具阶段/cron 触发),之后即可合并。发现 2–6 属后续跟进级别。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

/review Summary

PR: feat(cli): add auto-improve command (#4161)
Reviewer: qwen3.7-max via Qwen Code
Scope: 34 files, +5786 lines

Overall Assessment

This is a large, ambitious feature adding session-scoped repository improvement loops. The code is well-structured with clear separation of concerns (state management, cron scheduling, command handling). Build and all existing tests pass; typecheck and lint are clean.

Findings

3 inline comments posted (1 Critical, 2 Suggestions):

# Severity File Issue
1 🔴 Critical nonInteractiveCli.ts Cron callback IIFE (~100 lines) has zero test coverage
2 💡 Suggestion Session.ts cronHadError not set on token-limit cutoff — misleading span status
3 💡 Suggestion dreamCommand.ts ACP path eagerly records dream without error/cancel guard

8 findings flagged for human review (low confidence — not posted as inline comments):

  • Cross-process TOCTOU on state.json (no file locking)
  • Cron re-resolves commands every tick, overwriting shared Config
  • Ctrl+C cancellation depends on string-scraping prompt text
  • markRunCompleted write failure silently swallowed
  • Worktree cleanup delegated to LLM — orphaned worktrees accumulate
  • 3 independent resolveRepoRoot implementations with different caching
  • parseStartArgs accepts day units but parseInterval rejects them
  • startAutoImprove stale reclaim has no debug log

Existing Review Coverage

@wenshao has already posted 23+ inline comments covering many important issues (JSON.parse validation, stale loops, try-catch, cron boundaries, tick concurrency, path traversal, prompt injection, test gaps, etc.). The findings above are non-overlapping with existing comments.


— qwen3.7-max via Qwen Code /review

sendMessageType: SendMessageType.Cron,
});
drainLocalQueue().then(checkCronDone, onDrainError);
void (async () => {

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] Cron callback IIFE (~100 lines of new async code) has zero test coverage.

This entire void (async () => { ... })() block — the primary execution path for headless/CI cron ticks — is never exercised by tests. The test file mocks cron as disabled and never tests:

  1. submit_prompt resolution with onComplete callback
  2. partListToText error handling when sendResult is null
  3. The cancelled vs errored branch distinction
  4. The agent message emission on error

Bugs here mean ticks silently fail or deadlock future ticks for up to 2 hours with no user-visible signal.

Suggested fix: Add integration-level tests (even with mocked model) covering:

  • Successful tick: submit_prompt → model response → onComplete fired
  • Token-limit cutoff: sendResult null → slashOnCompleteErrored set
  • Abort/cancel: ac.signal.aborted → slashOnCompleteCancelled set
  • Error path: exception → cronHadError + debug log

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Agreed this headless cron-callback path needs coverage — it's the same gap as the existing open thread on the non-interactive cron callback. Adding it properly means integration-level tests (mocked model + temp worktree) exercising: successful tick (submit_prompt -> response -> onComplete fired), token-limit cutoff (sendResult null -> slashOnCompleteErrored), abort/cancel (signal.aborted -> slashOnCompleteCancelled), and the error path (exception -> cronHadError + debug log). Leaving this open pending maintainer direction on the preferred test harness rather than resolving it.

Comment thread packages/cli/src/acp-integration/session/Session.ts
Comment thread packages/cli/src/ui/commands/dreamCommand.ts
The ACP path fired recordDream() eagerly before the turn ran, while the
interactive path correctly deferred it to a guarded onComplete. Now that
Session.ts captures and fires the submit_prompt onComplete (via
pendingSlashOnComplete) with errored/cancelled flags, ACP can use the same
guarded onComplete — so a failed/cancelled /dream in ACP no longer
persists a consolidation record as if it completed. Unifies both modes.

Updates the two ACP tests to assert deferral instead of eager write.
When sendResult.responseStream is null and the stop reason is not
'cancelled' (e.g. max_tokens), the run is already recorded failed via
slashOnCompleteErrored, but cronHadError stayed false so the interaction
span reported 'ok'. Set cronHadError too so the span status matches the
recorded run outcome.
@wenshao

wenshao commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator

🔁 Re-verification of the two commits pushed after my report this morning (real daemon/ACP surface, A/B against df22089)

Verdict: both new commits (96e9fd01f /dream ACP deferral, 13bb4df5c cron span status) do exactly what they claim — verified end-to-end on the real qwen serve daemon driving the ACP Session, with a decisive A/B against the previous head. Keep them. However, neither commit touches the interactive useGeminiStream path, so Finding 1 from my morning report (runs finalized as success at the end of the first stream segment; Esc-cancellation dead for the rest of the tick) is code-identical at 13bb4df5c and remains the one merge-blocker.

Setup

  • A/B bundles: old = df22089 (the head my morning report verified) vs new = 13bb4df5c, both full real builds (npm run build + npm run bundle, tsc 0 errors; bundles provably distinct — the old bundle contains the eager recordDream().catch call site, the new one doesn't).
  • Real surface: node dist/cli.js serve per scenario in tmux, isolated $HOME + scratch git repo, QWEN_CODE_MEMORY_LOCAL=1 (so the observable artifact is <proj>/.qwen/meta.json), mock OpenAI-compatible provider with controllable outcome (hold-open / 500 / instant-ok). Driven via REST: POST /sessionPOST /session/:id/prompt "/dream" → sample meta.json (lastDreamAt presence) at decisive instants. dream confirmed present in GET /session/:id/supported-commands.

/dream ACP deferral — 7 runs, all cells decisive

Scenario (/dream via REST prompt) old df22089 new 13bb4df5c
Sampled mid-turn (provider holding the response open) lastDreamAt already written — eager write before the turn ran ✅ absent (deferred)
Turn succeeds → record at turn end written (eagerly, earlier) ✅ written 22 ms after "prompt turn completed"
Turn fails (provider 500 ×5 retries observed) ❌ record persisted for a failed consolidation ✅ never written (checked again minutes later)
Turn cancelled (POST /session/:id/cancel mid-hold) ❌ record persisted for a cancelled turn ✅ never written
Cancel closure (same session): cancel turn 1, then run a 2nd successful /dream n/a (eager writes make it moot) ✅ turn 1 → daemon logs "prompt turn failed" 24 ms after cancel, no record; turn 2 → completes and records. Session and the pendingSlashOnComplete machinery stay healthy after a cancelled slash turn

Unit-level pinning: the two updated ACP tests fail against the old implementation (defers writeDreamManualRun… and …cancelled are exactly the 2 failures with old dreamCommand.ts + new tests) and pass on the new head — the tests genuinely pin the fix. dreamCommand + Session suites: 132/132; autoImproveCommand/autoImproveState/useGeminiStream suites: 177/177; cronScheduler passes. Merge with today's main (b794d64f) is conflict-free (git merge-tree --write-tree clean), and the PR's GitHub CI is green on all three platforms.

13bb4df5c (cron span status) — verified structurally

The cron-tick interaction span resolves its status via ac.signal.aborted ? 'cancelled' : cronHadError ? 'error' : 'ok' (Session.ts:2192). The null-responseStream + non-cancelled stop-reason branch (e.g. max_tokens) recorded the run as failed but left cronHadError=false → span said ok; the commit sets cronHadError=true there, matching the other error branch. Code-path reading confirms the claim; note no test pins this branch's span status (minor — fine as is, or a one-liner assertion in Session.test.ts if you want it locked).

Why Finding 1 is still open (and unchanged)

git diff df22089..13bb4df5c touches only dreamCommand.ts/.test.ts and Session.tsuseGeminiStream.ts, autoImproveCommand.ts, autoImproveState.ts are byte-identical to the head I live-verified this morning, so every observation in that report still applies to the interactive surface: success-at-first-segment, the few-seconds Esc window, the dedup guard that can't trip, cancelled runs backfilled as success. One additional scoping note from this round: the new ACP deferral is correct because Session.ts fires onComplete at true turn end — the interactive path fires it at the end of the first stream segment, so even interactive /dream would record mid-turn on a consolidation that invokes tools (same root cause, not auto-improve-specific). Fixing the interactive onComplete timing resolves Finding 1 and this in one move.

Also observed (pre-existing daemon behavior, identical on both heads, not this PR's scope): cancelling a slash-submitted turn logs a noisy child RPC error "Not currently generating" even though the cancel takes effect, and the daemon WARN line renders the failure reason as [object Object].

Recommendation

Unchanged from this morning, now with the delta verified: the two new commits are solid — the PR still needs the interactive onComplete/Esc-cancellation fix (Finding 1) before merge. Findings 2–6 from the morning report remain follow-up grade.

🇨🇳 中文版(点击展开)

🔁 对今早报告后新推送的两个 commit 的复验(真实 daemon/ACP 表面,与 df22089 A/B 对比)

结论:两个新 commit(96e9fd01f /dream ACP 延迟记录、13bb4df5c cron span 状态)所声称的行为全部属实 —— 在真实 qwen serve daemon 驱动 ACP Session 的表面上端到端验证,并与上一个 head 做了决定性 A/B。建议保留。但两个 commit 都没有触碰交互式 useGeminiStream 路径,因此今早报告的 Finding 1(运行在第一个流式段结束时即被定格为 success;tick 其余全程 Esc 取消失效)在 13bb4df5c 上代码完全相同,仍是唯一的合并阻塞项。

环境

  • A/B 产物:old = df22089(今早报告验证的 head)vs new = 13bb4df5c,均为完整真实构建(npm run build + npm run bundle,tsc 0 错误;两 bundle 可证不同 —— 旧 bundle 含 eager recordDream().catch 调用点,新无)。
  • 真实表面:每场景在 tmux 中起 node dist/cli.js serve,隔离 $HOME + 临时 git 仓库,QWEN_CODE_MEMORY_LOCAL=1(可观察产物为 <proj>/.qwen/meta.json),mock OpenAI 兼容 provider 可控结局(挂起 / 500 / 立即成功)。REST 驱动:POST /sessionPOST /session/:id/prompt "/dream" → 在决定性时刻采样 meta.json(lastDreamAt 是否存在)。dream 已确认出现在 GET /session/:id/supported-commands

/dream ACP 延迟记录 —— 7 次运行,每格都有决定性结果

场景(REST 提交 /dream) old df22089 new 13bb4df5c
turn 进行中采样(provider 挂起响应) lastDreamAt 已写入 —— turn 未跑完即 eager 写 ✅ 缺席(延迟)
turn 成功 → turn 结束时记录 已写(更早、eager) ✅ "prompt turn completed" 后 22ms 写入
turn 失败(观察到 provider 500 ×5 重试) ❌ 失败的 consolidation 仍被持久化记录 ✅ 始终未写(数分钟后复查仍干净)
turn 被取消(挂起中 POST /session/:id/cancel) ❌ 被取消的 turn 仍被记录 ✅ 始终未写
取消闭环(同一会话):取消 turn 1,再跑第 2 个成功的 /dream n/a(eager 写使其无意义) ✅ turn 1 → cancel 后 24ms daemon 记 "prompt turn failed"、无记录;turn 2 → 完成并记录。被取消的 slash turn 之后,会话与 pendingSlashOnComplete 机制保持健康

单测钉住验证:两个更新后的 ACP 测试对旧实现恰好失败(旧 dreamCommand.ts × 新测试 → 失败的正是 defers writeDreamManualRun……cancelled 两条),新 head 上通过 —— 测试真实钉住了修复。dreamCommand + Session 套件 132/132;autoImproveCommand/autoImproveState/useGeminiStream 套件 177/177;cronScheduler 通过。与今日 main(b794d64f)合并无冲突(git merge-tree --write-tree 干净),GitHub CI 三平台全绿。

13bb4df5c(cron span 状态)—— 结构性验证

cron tick 的 interaction span 状态由 ac.signal.aborted ? 'cancelled' : cronHadError ? 'error' : 'ok'(Session.ts:2192)决定。responseStream 为 null 且 stop reason 非 cancelled(如 max_tokens)的分支此前把运行记为 failed 但 cronHadError 保持 false → span 报 ok;该 commit 在此分支补设 cronHadError=true,与另一错误分支一致。代码路径阅读证实其声称;注意该分支的 span 状态没有测试钉住(轻微 —— 可保持现状,或在 Session.test.ts 加一行断言锁定)。

Finding 1 为何仍然开放(且未变)

git diff df22089..13bb4df5c 只触及 dreamCommand.ts/.test.tsSession.ts —— useGeminiStream.tsautoImproveCommand.tsautoImproveState.ts 与我今早实测的 head 逐字节相同,因此那份报告对交互式表面的全部观察依然成立:第一段即 success、Esc 仅数秒窗口、去重保护无法触发、被取消的运行被补账为 success。本轮新增一个范围说明:新的 ACP 延迟记录之所以正确,是因为 Session.ts 在真正的 turn 结束时触发 onComplete —— 而交互式路径在第一个流式段结束时就触发,所以交互式 /dream 在涉及工具调用的 consolidation 上同样会中途记录(同一根因,并非 auto-improve 独有)。修好交互式 onComplete 时机,Finding 1 与此一并解决。

另外观察到(预存在的 daemon 行为,新旧两侧一致,不属于本 PR 范围):取消 slash 提交的 turn 时,child 会记一条嘈杂的 RPC 错误 "Not currently generating"(尽管取消实际生效),且 daemon WARN 行把失败原因渲染为 [object Object]

建议

与今早一致,且 delta 已验证:两个新 commit 可靠 —— PR 在合并前仍需修复交互式 onComplete/Esc 取消(Finding 1)。 今早报告的发现 2–6 仍为后续跟进级别。

auto-merge was automatically disabled June 12, 2026 09:35

Pull request was closed

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

Reviewers

Couldn't load reviewers.

Assignees

Couldn't load assignees.