Skip to content

feat(telemetry): Phase 2 — tool.blocked_on_user + hook spans (#3731)#4321

Merged
doudouOUC merged 21 commits into
mainfrom
feat/telemetry-phase-2-spans
May 21, 2026
Merged

feat(telemetry): Phase 2 — tool.blocked_on_user + hook spans (#3731)#4321
doudouOUC merged 21 commits into
mainfrom
feat/telemetry-phase-2-spans

Conversation

@doudouOUC

@doudouOUC doudouOUC commented May 19, 2026

Copy link
Copy Markdown
Collaborator

Summary

Phase 2 of the hierarchical session-tracing plan in #3731. Adds two OTel span types on top of the infrastructure landed by Phase 1 (#4126) and Phase 1.5 (#4302).

  • qwen-code.tool.blocked_on_user — brackets the time a tool spends in awaiting_approval waiting for the user. Child of the tool span. Records decision (proceed_once / proceed_always / cancel / aborted / auto_approved) and source (cli / ide / hook / auto / system). Status stays UNSET — waiting is neither OK nor ERROR.
  • qwen-code.hook — wraps each pre/post-hook fire site so a slow hook can be told from a slow tool. Records hook_event (PreToolUse / PostToolUse / PostToolUseFailure), tool_name, shouldProceed, shouldStop, blockType, hasAdditionalContext. Status stays UNSET on intentional blocking; ERROR only when the hook throws.

Architectural change

To make blocked_on_user a child of the tool span, the tool span lifecycle moved from executeSingleToolCall to _schedule's validating-loop — covering validating → awaiting_approval → executing in one span. Two new private Maps on CoreToolScheduler hold span refs across method boundaries (callId-keyed). Centralized cleanup via finalizeToolSpan / finalizeBlockedSpan ensures every terminal status path also ends the corresponding span.

  • 8 terminal tool-span end sites: signal.aborted at loop entry, hard deny, plan-mode block, non-interactive deny, permission-hook deny, background-agent deny, _schedule catch, executeSingleToolCall finally.
  • 5 blocked_on_user end sites: handleConfirmationResponse cancel + proceed, autoApproveCompatiblePendingTools, _schedule catch under signal.aborted, global-error catch. ModifyWithEditor stays inside one span until final proceed/cancel — duration_ms reflects total user think-time including editor side trips.
  • 6 hook fire sites wrapped: firePreToolUseHook, firePostToolUseHook, four safelyFirePostToolUseFailureHook variants. fireNotificationHook (permission_prompt) intentionally NOT wrapped — fire-and-forget, duration is meaningless.

Diverges from claude-code on one point

claude-code's endToolBlockedOnUserSpan uses findLast-by-type to locate the span — under concurrent tool calls this can end the wrong span. Our helpers take the span object explicitly via getSpanId(span) lookup. The concurrent blocked spans test asserts the regression that bug would otherwise produce.

Closes Phase 2 in #3731

Ticks off these checklist items in the parent issue under ### Deeper observability (P3) → Phase 2:

  • Add tool.blocked_on_user span type + helper; wire into approval state machine in coreToolScheduler._schedule
  • Add hook span type + helper; wire into pre/post hook execution in coreToolScheduler.executeSingleToolCall

Test plan

  • pnpm typecheck — clean
  • npx vitest run src/telemetry/session-tracing.test.ts src/core/coreToolScheduler.test.ts — 187 / 187 pass (47 telemetry helper tests + 140 scheduler tests)
  • npx vitest run (full core package) — only the preexisting anthropicContentGenerator User-Agent test + a few crawler.test.ts / gitDiff.test.ts filesystem-timing failures remain. Confirmed unrelated to telemetry — none touch the changed files.
  • npx eslint — clean

人工验证

调用工具的prompt,需要人工选择
image

预期有
必须是这个,不是 tool_call
├─ qwen-code.tool.blocked_on_user ← 用户思考期 ├─ qwen-code.hook (PreToolUse)
├─ qwen-code.tool.execution
└─ qwen-code.hook (PostToolUse)
符合预期
image

Rollback

This PR moves the tool span lifecycle. The full set of changes is contained in one commit (38ba22d9c); revert is a single git revert. The new helpers are additive — disabling them would only require dropping the calls in coreToolScheduler.ts and removing the new exports from session-tracing.ts.

🤖 Generated with Qwen Code

Local verification (tmux + vitest)

Run the script below in a tmux pane to verify the PR locally.
Captured output and expected results are inlined.

Script

#!/usr/bin/env bash
# verify-phase-2-spans.sh — verify PR #4321 (Phase 2 telemetry spans)
set -uo pipefail

WORKTREE=/path/to/qwen-code   # adjust to your local checkout
cd "$WORKTREE/packages/core"

echo "[1/3] Branch + HEAD"
git -C "$WORKTREE" rev-parse --abbrev-ref HEAD
git -C "$WORKTREE" log --oneline -3

echo "[2/3] Typecheck"
npx tsc --noEmit && echo "TYPECHECK_OK"

echo "[3/3] Affected tests (Phase 2-tagged only)"
npx vitest run \
  src/telemetry/session-tracing.test.ts \
  src/core/coreToolScheduler.test.ts \
  --reporter=verbose 2>&1 \
  | grep -E "Phase 2|#3731|#4321|#4302|Test Files|Tests " \
  | sort -u

Run via tmux

tmux new-session -d -s phase2-verify -x 200 -y 50 \
  "/path/to/verify-phase-2-spans.sh 2>&1 | tee phase2-output.log; touch /tmp/.phase2-done"
while [ ! -f /tmp/.phase2-done ]; do sleep 5; done
tmux capture-pane -t phase2-verify -pS - > phase2-pane.txt

Expected

Captured output (this PR, branch feat/telemetry-phase-2-spans @ 6767469b2)

[1/3] Branch + HEAD
feat/telemetry-phase-2-spans
6767469b2 fix(telemetry): address #4321 review — Copilot inline + code-reviewer + silent-failure-hunter
38ba22d9c feat(telemetry): Phase 2 — tool.blocked_on_user + hook spans

[2/3] Typecheck
TYPECHECK_OK

[3/3] Affected tests (Phase 2-tagged only)
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > blocked_on_user span ends with cancel when the user rejects (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > every span recorded in a successful tool call is ended (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > execution sub-span: cancelled flag is NOT set on real exceptions (#4302) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > hook span records shouldProceed=false / blockType=denied when pre-hook blocks (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > hook span records shouldStop=true when post-hook stops execution (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > tool span is started in _schedule and ended even when pre-hook denies execution (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler request queueing > should auto-approve remaining tool calls when first tool call is approved with ProceedAlways 17ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > parents the blocked span under the explicitly-passed tool span 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > records decision/source attributes on end and leaves status UNSET 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > is idempotent — second end is a no-op 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > returns NOOP span when SDK is not initialized 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > handles concurrent blocked spans without findLast confusion 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > falls back to resolveParentContext when the tool span was already ended 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > parents under the active tool span when called inside runInToolSpanContext 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > records shouldProceed/blockType when PreToolUse blocks 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > records shouldStop/hasAdditionalContext on PostToolUse 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > marks status ERROR only when the hook itself threw 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > returns NOOP span when SDK is not initialized 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > tool execution sub-spans > cancelled: true keeps status UNSET while still recording attributes (#4302) 0ms

 Test Files  2 passed (2)
      Tests  187 passed (187)

Coverage map

Test What it proves
parents the blocked span under the explicitly-passed tool span blocked_on_user is a child of the tool span (claude-code-aligned trace tree)
records decision/source attributes on end and leaves status UNSET new attribute schema works; waiting is correctly UNSET status
handles concurrent blocked spans without findLast confusion regression test for the claude-code findLast bug we deliberately don't have
tool span is started in _schedule and ended even when pre-hook denies tool span lifecycle correctly covers the new validating → terminal range
blocked_on_user span ends with cancel when the user rejects end-to-end Cancel path through handleConfirmationResponse
every span recorded in a successful tool call is ended leak guard — no path forgets to finalize
auto-approve remaining tool calls ... ProceedAlways sibling auto-approve path emits decision: 'auto_approved', source: 'auto'
hook span records shouldProceed=false / blockType=denied when pre-hook blocks PreToolUse hook span records the actual block reason (#4321 review C2)
hook span records shouldStop=true when post-hook stops execution PostToolUse hook span records stop signal
marks status ERROR only when the hook itself threw hook span status semantics (UNSET on intentional block, ERROR on throw)

Adds two OTel span types under the existing hierarchical session-tracing
infrastructure (#3731 Phase 2; depends on Phase 1 #4126 and Phase 1.5 #4302):

1. `qwen-code.tool.blocked_on_user` — brackets the time a tool spends in
   awaiting_approval waiting for the user. Child of the tool span. Records
   decision (proceed_once / proceed_always / cancel / aborted /
   auto_approved) and source (cli / ide / hook / auto / system). Status
   stays UNSET — waiting is neither OK nor ERROR.

2. `qwen-code.hook` — wraps each pre/post-hook fire site so a slow hook can
   be told from a slow tool. Records hook_event (PreToolUse / PostToolUse /
   PostToolUseFailure), tool_name, shouldProceed, shouldStop, blockType,
   hasAdditionalContext. Status stays UNSET on intentional blocking
   decisions; ERROR only when the hook itself throws.

To make blocked_on_user a child of the tool span, the tool span lifecycle
moved from `executeSingleToolCall` to `_schedule`'s validating-loop —
covering validating → awaiting_approval → executing in one span. Two new
private Maps on CoreToolScheduler hold span refs across method boundaries
(callId-keyed). Centralized cleanup via `finalizeToolSpan` /
`finalizeBlockedSpan` private helpers ensures every terminal status path
also ends the corresponding span.

Eight terminal sites now finalize the tool span: signal.aborted at loop
entry, hard deny, plan-mode block, non-interactive deny, permission-hook
deny, background-agent deny, _schedule catch, executeSingleToolCall
finally. Five blocked_on_user end sites: handleConfirmationResponse cancel
and proceed branches, autoApproveCompatiblePendingTools, _schedule catch
under signal.aborted, and the global-error catch. ModifyWithEditor stays
inside one blocked_on_user span until the final proceed/cancel — the
duration_ms reflects total user think-time including editor side trips.

Six hook fire sites are wrapped: firePreToolUseHook, firePostToolUseHook,
and four safelyFirePostToolUseFailureHook variants (success-path
interrupt, toolResult.error path, catch-path interrupt, catch-path real
exception). fireNotificationHook is intentionally NOT wrapped — it's
fire-and-forget and the duration is meaningless.

Mirrors claude-code's session-tracing pattern but deliberately diverges on
one point: every end-helper takes the span object explicitly via
`getSpanId(span)` lookup instead of `findLast`-by-type. Under concurrent
tool calls, claude-code's findLast can end the wrong blocked span; passing
the ref directly is concurrency-safe.

Tests:
- session-tracing.test.ts: 11 new tests covering parent resolution
  (explicit parent for blocked_on_user, ALS-based for hook), idempotent
  end, NOOP behavior, error-status mapping, and a concurrency regression
  test (two parallel blocked spans ended in reverse order).
- coreToolScheduler.test.ts: mock extended with the four new helpers and
  two new metadata fields. New tests cover the tool span outliving a
  pre-hook deny path, blocked_on_user ending with cancel via the
  awaiting_approval flow, hook span recording shouldProceed=false /
  blockType='denied' on pre-hook block and shouldStop=true /
  blockType='stop' on post-hook stop, and a leak guard that asserts
  every recorded lifecycle span is ended after a successful tool call.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
Copilot AI review requested due to automatic review settings May 19, 2026 09:54
@github-actions

Copy link
Copy Markdown
Contributor

📋 Review Summary

This PR implements Phase 2 of the hierarchical session-tracing plan (#3731), adding two new OTel span types (tool.blocked_on_user and hook) with comprehensive test coverage. The architectural change to move the tool span lifecycle from executeSingleToolCall to _schedule is well-executed, and the explicit span-parenting approach correctly avoids the findLast-by-type concurrency bug present in claude-code. The implementation is thorough, with 8 terminal tool-span end sites and 5 blocked_on_user end sites all accounted for.

🔍 General Feedback

  • Strong architectural decision: Moving the tool span lifecycle to _schedule to cover validating → awaiting_approval → executing in one span is the right call for accurate tracing. This gives a complete picture of tool execution from the user's perspective.
  • Explicit span parenting: Passing the span object directly to startToolBlockedOnUserSpan and startHookSpan is superior to the findLast-by-type approach. The regression test for concurrent blocked spans validates this design choice.
  • Comprehensive cleanup strategy: Centralized cleanup via finalizeToolSpan / finalizeBlockedSpan ensures no span leaks across the 8 terminal tool-span end sites and 5 blocked_on_user end sites. This is a robust pattern.
  • Good test coverage: 187 tests pass, including specific tests for the concurrency bug, idempotency, NOOP span handling, and fallback parent resolution.
  • Thoughtful status handling: Keeping status UNSET for intentional blocking (waiting on user, hook blocking) and only using ERROR for actual hook exceptions is semantically correct for OTel.

🎯 Specific Feedback

🟢 Medium

  • File: packages/core/src/telemetry/session-tracing.ts:557-562 - The startToolBlockedOnUserSpan function has a defensive fallback when the tool span is already ended, but this scenario suggests a potential logic error elsewhere. Consider adding a debug log when this fallback path is taken to help diagnose unexpected span ordering during development:

    if (!parentSpanCtx) {
      debugLogger.debug('blocked_on_user span started without active tool parent - using fallback resolution');
    }
  • File: packages/core/src/core/coreToolScheduler.ts - The diff mentions finalizeToolSpan and finalizeBlockedSpan as centralized cleanup helpers, but these don't appear in the exported function list in session-tracing.ts. If these are private helpers in coreToolScheduler.ts, consider adding a comment explaining why they're not part of the telemetry module's public API (i.e., they're implementation details specific to the scheduler's state management).

🔵 Low

  • File: packages/core/src/telemetry/session-tracing.ts:625 - The endToolBlockedOnUserSpan function has try/catch blocks around attribute setting and span ending, which is good defensive programming. However, the warning messages use debugLogger.warn - consider whether some of these should be debugLogger.error instead, particularly for the span ending failure, as that could indicate a more serious telemetry infrastructure issue.

  • File: packages/core/src/telemetry/session-tracing.ts:715 - The endHookSpan function has a similar pattern. For consistency, consider extracting the try/catch pattern into a helper function since both endToolBlockedOnUserSpan and endHookSpan duplicate this structure:

    function safelyEndSpan(spanCtx: SpanContext, spanType: string): void {
      try {
        spanCtx.span.end();
      } catch (error) {
        debugLogger.warn(`Failed to end ${spanType} span: ${error instanceof Error ? error.message : String(error)}`);
      }
    }
  • File: packages/core/src/telemetry/constants.ts - Consider adding a comment to the new span constants explaining their purpose, similar to the existing span constants. For example:

    /** Span for tracking time a tool spends waiting for user approval/confirmation */
    export const SPAN_TOOL_BLOCKED_ON_USER = 'qwen-code.tool.blocked_on_user';
    /** Span for tracking hook execution (pre/post-tool-use hooks) */
    export const SPAN_HOOK = 'qwen-code.hook';
  • File: packages/core/src/core/coreToolScheduler.ts:2777 - The comment for auto-approving sibling tools mentions ProceedAlways* outcomes. Consider being more explicit about which specific outcomes trigger this path (e.g., ToolConfirmationOutcome.ProceedAlways vs ToolConfirmationOutcome.ProceedAlwaysSession) for future maintainers.

✅ Highlights

  • Excellent regression test: The "concurrent blocked spans without findLast confusion" test is a model example of how to test for a specific bug that exists in a similar codebase. This test will immediately catch any future regression to the findLast-by-type anti-pattern.

  • Comprehensive end-site coverage: The PR description explicitly lists all 8 terminal tool-span end sites and 5 blocked_on_user end sites. This level of thoroughness in tracking all code paths is exemplary and makes the review much easier.

  • Idempotency handling: Both endToolBlockedOnUserSpan and endHookSpan check spanCtx.ended and return early, preventing double-ending spans. This is a subtle but important defensive measure.

  • NOOP span handling: Both new span types correctly return NOOP_SPAN when the SDK is not initialized, and the end functions handle NOOP spans gracefully without throwing. This ensures telemetry is truly optional and doesn't break core functionality.

  • Clear separation of concerns: The fireNotificationHook (permission_prompt) is intentionally NOT wrapped because it's fire-and-forget. This shows good judgment in distinguishing between meaningful duration tracking and meaningless wrapper spans.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds Phase 2 hierarchical session-tracing spans to improve observability of (1) time spent awaiting user approval for tool calls and (2) hook execution latency/behavior around tool calls.

Changes:

  • Introduces qwen-code.tool.blocked_on_user span helpers and wires them into the tool confirmation state machine.
  • Introduces qwen-code.hook span helpers and wraps pre/post hook fire sites in CoreToolScheduler.
  • Updates telemetry exports/constants and expands unit tests for new span types and scheduler lifecycle behavior.

Reviewed changes

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

Show a summary per file
File Description
packages/core/src/telemetry/session-tracing.ts Adds span helpers for tool.blocked_on_user and hook, including end semantics and attributes.
packages/core/src/telemetry/session-tracing.test.ts Adds unit tests covering parenting, attributes, idempotency, and concurrency behavior for new spans.
packages/core/src/telemetry/index.ts Re-exports new helpers and related types.
packages/core/src/telemetry/constants.ts Adds span name constants for the two new span types.
packages/core/src/core/coreToolScheduler.ts Moves tool span lifecycle to cover validate→approval→execute; creates/ends blocked-on-user + hook spans at relevant sites.
packages/core/src/core/coreToolScheduler.test.ts Extends scheduler telemetry tests to assert new spans are created/ended and metadata is propagated.
Comments suppressed due to low confidence (2)

packages/core/src/core/coreToolScheduler.ts:2026

  • Same issue as earlier: the fallback tool-span creation passes { tool_name, call_id } into startToolSpan, which will record nonstandard attributes and omit 'tool.call_id'. Use namespaced attribute keys (e.g. { 'tool.call_id': callId }) and avoid duplicating tool name (already set by the first argument).
    let toolSpan = this.toolSpans.get(callId);
    if (!toolSpan) {
      toolSpan = startToolSpan(toolName, {
        tool_name: toolName,
        call_id: callId,
      });
      this.toolSpans.set(callId, toolSpan);

packages/core/src/core/coreToolScheduler.ts:1829

  • Proceed path always finalizes the blocked span with source: 'cli', but handleConfirmationResponse() can be invoked by IDE diff resolution as well (see openIdeDiffIfEnabled). Suggest: choose source: 'ide' when in IDE mode / when the confirmation came from the IDE integration, otherwise cli.
      // Proceed: end the blocked span before execution begins. ProceedOnce
      // and the three ProceedAlways* variants all close the awaiting phase.
      // The tool span itself stays open and is finalized in
      // executeSingleToolCall.
      const decision: ToolBlockedDecision =
        outcome === ToolConfirmationOutcome.ProceedOnce
          ? 'proceed_once'
          : 'proceed_always';
      this.finalizeBlockedSpan(callId, decision, 'cli');

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

Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
@github-actions

github-actions Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 76.82% 76.82% 79.42% 79.98%
Core 79.89% 79.89% 82.28% 82.72%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   76.82 |    79.98 |   79.42 |   76.82 |                   
 src               |      76 |    69.51 |   81.08 |      76 |                   
  gemini.tsx       |   68.69 |    66.66 |   77.77 |   68.69 | ...29,946-949,961 
  ...ractiveCli.ts |   80.23 |     68.3 |   78.57 |   80.23 | ...1054,1092,1195 
  ...liCommands.ts |    74.9 |     75.6 |     100 |    74.9 | ...41-265,290,391 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   61.97 |    65.24 |   78.12 |   61.97 |                   
  acpAgent.ts      |   63.32 |    65.35 |   83.05 |   63.32 | ...2112,2126-2134 
  authMethods.ts   |   12.19 |      100 |       0 |   12.19 | 11-31,34-38,41-50 
  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 |   75.88 |    72.05 |   86.25 |   75.88 |                   
  ...ryReplayer.ts |   67.34 |     75.6 |   81.81 |   67.34 | ...54-269,282-283 
  Session.ts       |   74.93 |    70.81 |   88.46 |   74.93 | ...2658,2664-2667 
  ...entTracker.ts |   90.85 |    84.84 |      90 |   90.85 | ...35,199,251-260 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    77.77 |     100 |   84.21 | ...37-153,209-211 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   96.01 |    90.75 |    92.3 |   96.01 |                   
  BaseEmitter.ts   |   76.92 |    66.66 |      80 |   76.92 | 23-24,39-40,55-56 
  ...ageEmitter.ts |     100 |    89.47 |     100 |     100 | 109,111           
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.06 |     92.3 |     100 |   98.06 | 227-228,327,335   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |   90.36 |    87.83 |   94.11 |   90.36 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   95.83 |    85.71 |     100 |   95.83 | 119,127-129       
  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      |   47.93 |    85.71 |   43.47 |   47.93 |                   
  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         |    7.74 |      100 |       0 |    7.74 | ...51-147,149-230 
 ...mmands/channel |   39.25 |    79.45 |      50 |   39.25 |                   
  ...l-registry.ts |    8.57 |      100 |       0 |    8.57 | 6-21,24-42        
  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 |    84.5 |    88.95 |   81.81 |    84.5 |                   
  consent.ts       |   71.65 |    89.28 |   42.85 |   71.65 | ...85-141,156-162 
  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         |   60.24 |    28.57 |     100 |   60.24 | ...81,83-87,89-93 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 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        |   92.89 |    85.06 |   89.13 |   92.89 |                   
  auth.ts          |   86.98 |    80.32 |     100 |   86.98 | ...26-227,243-244 
  config.ts        |   87.96 |    84.36 |      80 |   87.96 | ...1856,1858-1866 
  keyBindings.ts   |   96.55 |       50 |     100 |   96.55 | 193-196           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  settings.ts      |   85.76 |    87.25 |   89.18 |   85.76 | ...1148,1153-1156 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   96.22 |       94 |     100 |   96.22 | ...88-190,205-206 
 ...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          |   81.47 |    75.94 |   65.71 |   81.47 |                   
  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 | ...87-588,591-592 
 ...active/control |   77.04 |    88.23 |      80 |   77.04 |                   
  ...rolContext.ts |    7.14 |        0 |       0 |    7.14 | 49-84             
  ...Dispatcher.ts |   91.66 |    91.83 |   88.88 |   91.66 | ...54-372,388,391 
  ...rolService.ts |       8 |        0 |       0 |       8 | 46-179            
 ...ol/controllers |    7.03 |       80 |   13.33 |    7.03 |                   
  ...Controller.ts |   19.32 |      100 |      60 |   19.32 | 81-118,127-210    
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |    3.94 |      100 |   11.11 |    3.94 | ...63-381,391-496 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |    5.21 |      100 |       0 |    5.21 | ...21-433,442-471 
 .../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         |    79.3 |     78.8 |   92.85 |    79.3 |                   
  auth.ts          |   88.49 |    88.63 |     100 |   88.49 | ...49-150,153-155 
  capabilities.ts  |     100 |     90.9 |     100 |     100 | 264               
  ...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.3 |       84 |     100 |    92.3 | 108-111,170-177   
  eventBus.ts      |     100 |      100 |     100 |     100 |                   
  httpAcpBridge.ts |   79.62 |    78.84 |   96.38 |   79.62 | ...4246,4277-4318 
  ...oryChannel.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-106             
  loopbackBinds.ts |     100 |      100 |     100 |     100 |                   
  runQwenServe.ts  |   73.98 |    87.83 |   55.55 |   73.98 | ...94-710,735-737 
  server.ts        |   86.18 |    82.94 |   90.62 |   86.18 | ...2478,2543-2552 
  status.ts        |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...paceAgents.ts |   64.87 |    70.45 |    90.9 |   64.87 | ...1306,1316-1326 
  ...paceMemory.ts |   87.13 |    78.46 |     100 |   87.13 | ...54-361,421-428 
 src/serve/auth    |   86.54 |    78.75 |   93.75 |   86.54 |                   
  deviceFlow.ts    |   96.33 |    79.51 |    97.5 |   96.33 | ...1526,1630,1700 
  ...owProvider.ts |   45.23 |    74.07 |      75 |   45.23 | ...90-359,375,379 
 src/serve/fs      |   84.85 |    79.75 |     100 |   84.85 |                   
  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 |   83.55 |    76.22 |     100 |   83.55 | ...1859,1886-1887 
 src/serve/routes  |   89.41 |       70 |     100 |   89.41 |                   
  ...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 
 src/services      |   91.66 |    91.21 |   97.56 |   91.66 |                   
  ...mandLoader.ts |     100 |    93.75 |     100 |     100 | 92                
  ...killLoader.ts |     100 |    96.15 |     100 |     100 | 47                
  ...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 |      100 |     100 |     100 |                   
  ...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 |    85.9 |    85.61 |   90.47 |    85.9 |                   
  DataProcessor.ts |   85.63 |     85.6 |   92.85 |   85.63 | ...1122,1126-1133 
  ...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 |    83.07 |     100 |   97.35 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.45 |       70 |     100 |   92.45 | ...22,144,151,160 
  tipRegistry.ts   |     100 |    95.23 |     100 |     100 | 33                
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/test-utils    |   93.75 |    83.33 |      80 |   93.75 |                   
  ...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.16 |    73.02 |   60.34 |   65.16 |                   
  App.tsx          |     100 |      100 |     100 |     100 |                   
  AppContainer.tsx |   63.22 |    64.56 |      50 |   63.22 | ...3151,3155-3159 
  ...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.05 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...inePresets.ts |   98.17 |    88.88 |     100 |   98.17 | ...12,239,387-389 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   52.97 |    51.21 |   42.42 |   52.97 |                   
  AuthDialog.tsx   |   62.87 |     42.1 |   18.18 |   62.87 | ...03,310-332,336 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |    39.4 |       32 |   38.46 |    39.4 | ...68,471,477,480 
  useAuth.ts       |   94.55 |    73.52 |     100 |   94.55 | ...19-220,239-245 
  ...rSetupFlow.ts |   43.45 |    33.33 |      50 |   43.45 | ...68-389,406-449 
 src/ui/commands   |   73.37 |    81.23 |   81.48 |   73.37 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |   89.04 |    81.25 |     100 |   89.04 | 91-92,94-99       
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...91-596,681-689 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   95.59 |    71.42 |     100 |   95.59 | 72,154-159        
  bugCommand.ts    |   81.13 |    71.42 |     100 |   81.13 | 60-69             
  clearCommand.ts  |      92 |    76.47 |     100 |      92 | 43-44,72-73,91-92 
  ...essCommand.ts |    64.7 |       50 |      75 |    64.7 | ...48-149,163-166 
  ...extCommand.ts |   35.24 |    28.57 |   45.45 |   35.24 | ...86-521,532-533 
  copyCommand.ts   |   98.28 |    94.89 |     100 |   98.28 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |     87.5 |     100 |     100 | ...61,224-225,238 
  ...ryCommand.tsx |   68.09 |    77.77 |   77.77 |   68.09 | ...56-261,315-323 
  docsCommand.ts   |     100 |    88.88 |     100 |     100 | 25                
  doctorCommand.ts |   95.06 |    88.28 |     100 |   95.06 | ...92-293,320-321 
  dreamCommand.ts  |      75 |    66.66 |   66.66 |      75 | 22-27,44-47       
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   48.66 |     90.9 |   63.63 |   48.66 | ...05-109,159-211 
  forgetCommand.ts |   26.82 |      100 |      50 |   26.82 | 18-51             
  goalCommand.ts   |   91.41 |    84.44 |      90 |   91.41 | ...86-189,201-204 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |    20.4 |       40 |      40 |    20.4 | ...48-180,204-205 
  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 |   74.56 |    68.42 |     100 |   74.56 | ...31-245,250-273 
  ...ageCommand.ts |   92.17 |    82.69 |     100 |   92.17 | ...43,164,173-183 
  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 |   32.43 |      100 |      50 |   32.43 | 23-57             
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |    92.3 |    87.87 |     100 |    92.3 | ...,83-88,129-130 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |      80 |      100 |      50 |      80 | 19-21             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   81.43 |    65.21 |      80 |   81.43 | ...70-173,176-179 
  skillsCommand.ts |   15.04 |      100 |      25 |   15.04 | ...90-106,109-136 
  statsCommand.ts  |   88.19 |    84.21 |     100 |   88.19 | ...,58-61,143-146 
  ...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 |   62.49 |     75.1 |   64.85 |   62.49 |                   
  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    |   89.06 |       75 |     100 |   89.06 | 37,39-44,46       
  ...odeDialog.tsx |     9.7 |      100 |       0 |     9.7 | 35-47,50-182      
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   13.04 |      100 |       0 |   13.04 | 18-61             
  ...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.98 |      100 |       0 |   11.98 | 65-508            
  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       |   76.59 |    48.64 |     100 |   76.59 | ...35-136,175-180 
  ...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 |    89.88 |     100 |   98.32 | ...24,381,447-448 
  ...emDisplay.tsx |    61.7 |       36 |     100 |    61.7 | ...42,345,348-354 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.01 |    79.78 |   83.33 |   83.01 | ...1399,1531,1581 
  ...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  |   81.75 |       75 |     100 |   81.75 | ...70-274,282-286 
  MemoryDialog.tsx |    55.1 |    54.54 |   57.14 |    55.1 | ...56,368,381-383 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   80.12 |    63.55 |     100 |   80.12 | ...39-555,612-616 
  ...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 |   41.26 |    61.53 |   71.42 |   41.26 | ...74-472,476-520 
  ...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 
  ...ngsDialog.tsx |   66.27 |    71.16 |      75 |   66.27 | ...12-820,826-827 
  ...ionDialog.tsx |    87.8 |      100 |   33.33 |    87.8 | 36-39,44-51       
  ...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            
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ineDialog.tsx |   93.69 |    83.92 |     100 |   93.69 | ...11,273,293-295 
  ...yTodoList.tsx |   94.17 |       80 |     100 |   94.17 | 56-57,131-134     
  ...nsDisplay.tsx |   87.25 |       64 |     100 |   87.25 | ...45-147,154-156 
  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 
 ...nts/agent-view |   38.31 |    70.83 |   36.36 |   38.31 |                   
  ...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.28 |      100 |       0 |   10.28 | 58-311            
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.8 |    27.27 |     100 |    87.8 | ...,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.72 |    70.53 |   60.86 |   45.72 |                   
  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 |   10.15 |      100 |       0 |   10.15 | 27-161            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   75.63 |    84.49 |   85.29 |   75.63 |                   
  ...sksDialog.tsx |   70.92 |    80.48 |   76.19 |   70.92 | ...1118,1194-1196 
  ...TasksPill.tsx |   63.75 |    86.95 |     100 |   63.75 | 44,86-106,114-122 
  ...gentPanel.tsx |   99.53 |    93.18 |     100 |   99.53 | 123               
 ...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 | 17-128            
  ...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 |   68.67 |    69.07 |   69.56 |   68.67 |                   
  ...etailStep.tsx |   74.68 |    66.66 |   66.66 |   74.68 | ...71-184,188-201 
  ...etailStep.tsx |    87.4 |    73.68 |     100 |    87.4 | 41-42,99-113,119  
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   34.51 |    47.05 |   42.85 |   34.51 | ...78,482-495,499 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  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 |   82.44 |    79.55 |    72.6 |   82.44 |                   
  ...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 
  ...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.02 |    69.23 |   33.33 |   81.02 | ...24-426,433-435 
  ...upMessage.tsx |      84 |    93.61 |     100 |      84 | ...56-383,405-420 
  ToolMessage.tsx  |   88.84 |    75.71 |    92.3 |   88.84 | ...44-749,776-778 
 ...ponents/shared |   86.46 |    79.24 |   95.77 |   86.46 |                   
  ...ctionList.tsx |   99.03 |    95.65 |     100 |   99.03 | 85                
  ...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  |   84.31 |    74.19 |     100 |   84.31 | ...37,193-195,205 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  TextInput.tsx    |   77.77 |    48.78 |      80 |   77.77 | ...14-218,230-236 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  text-buffer.ts   |   85.78 |    79.85 |   97.61 |   85.78 | ...2370-2372,2468 
  ...er-actions.ts |   86.71 |    67.79 |     100 |   86.71 | ...07-608,809-811 
 ...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 |   42.16 |    69.23 |   21.42 |   42.16 |                   
  ContextUsage.tsx |     4.7 |      100 |       0 |     4.7 | ...52-167,170-456 
  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.34 |    78.06 |   80.35 |   77.34 |                   
  ...ewContext.tsx |    64.7 |    85.71 |      50 |    64.7 | ...22-225,231-241 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   95.18 |    67.56 |      50 |   95.18 | ...94-195,222-226 
  ...deContext.tsx |     100 |      100 |     100 |     100 |                   
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   82.31 |    82.84 |     100 |   82.31 | ...1153,1159-1161 
  ...owContext.tsx |   89.28 |       80 |   66.66 |   89.28 | 34,47-48,60-62    
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   43.28 |     62.5 |    62.5 |   43.28 | ...56-259,263-266 
  ...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 | 118-119           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 194-195           
  ...deContext.tsx |   76.08 |    72.72 |     100 |   76.08 | 47-48,52-59,77-78 
 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      |   82.12 |    82.11 |   86.87 |   82.12 |                   
  ...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 |   75.75 |    63.01 |   61.53 |   75.75 | ...84,908,927-931 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...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 |   19.81 |    66.66 |      25 |   19.81 | 57-175            
  ...Completion.ts |   92.77 |    89.09 |     100 |   92.77 | ...86-187,220-223 
  ...ifications.ts |   92.07 |    96.29 |     100 |   92.07 | 116-124           
  ...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   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.36 |    74.35 |     100 |   94.36 | ...60,168-169,209 
  ...ompletion.tsx |   95.95 |    82.75 |     100 |   95.95 | ...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 |   76.92 |       50 |     100 |   76.92 | 55,68,71-75,88-96 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...ialogClose.ts |   13.33 |      100 |     100 |   13.33 | 82-173            
  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.7 |     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 |   57.89 |    71.42 |      50 |   57.89 | ...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 |    77.7 |    74.93 |   91.66 |    77.7 | ...2497,2510-2518 
  ...BranchName.ts |    90.9 |     92.3 |     100 |    90.9 | 19-20,55-58       
  ...oryManager.ts |   93.15 |    93.75 |     100 |   93.15 | 44,107-110        
  ...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 |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |       75 |     100 |     100 | 22                
  ...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               
  ...umeCommand.ts |   97.08 |    83.33 |     100 |   97.08 | 103-104,133       
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   96.98 |    95.69 |     100 |   96.98 | ...83-184,238-241 
  ...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              
  ...Completion.ts |   82.67 |    85.41 |   94.73 |   82.67 | ...68-670,678-714 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   96.09 |    90.37 |     100 |   96.09 | ...62-365,450-457 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...tification.ts |     100 |    85.71 |     100 |     100 | 47                
  ...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           |   83.77 |    80.31 |     100 |   83.77 | ...55,759-767,776 
 src/ui/layouts    |   89.72 |     87.5 |     100 |   89.72 |                   
  ...AppLayout.tsx |   89.88 |     87.5 |     100 |   89.88 | 51-53,93-98       
  ...AppLayout.tsx |   89.47 |     87.5 |     100 |   89.47 | 58-63             
 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.98 |    82.97 |   92.61 |   83.98 |                   
  ...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.41 |     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 
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   59.61 |    58.82 |     100 |   59.61 | ...,86-88,107-149 
  commandUtils.ts  |    95.9 |    88.42 |     100 |    95.9 | ...62,164-165,289 
  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.27 |     100 |   95.23 | 117-120           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    94.28 |     100 |     100 | 35,57             
  historyUtils.ts  |   94.11 |       94 |     100 |   94.11 | 94-97             
  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                
  osc8.ts          |   94.71 |    87.41 |     100 |   94.71 | ...43,428,432-433 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   98.98 |    97.05 |     100 |   98.98 | 98                
  ...storyUtils.ts |   61.89 |    69.87 |      90 |   61.89 | ...76,424,429-451 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.61 |    94.84 |   92.85 |   97.61 | ...50-251,386-387 
  todoSnapshot.ts  |   89.11 |    93.33 |     100 |   89.11 | ...,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         |   76.49 |    89.66 |   94.02 |   76.49 |                   
  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   |   87.17 |     90.9 |     100 |   87.17 | 64-73             
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.98 |       75 |     100 |   70.98 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   94.28 |       88 |     100 |   94.28 | 28-29,125-126     
  errors.ts        |   98.67 |    96.36 |     100 |   98.67 | 67-68             
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   91.91 |    84.61 |     100 |   91.91 | 78-81,124-127     
  ...AutoUpdate.ts |   90.76 |    93.33 |   88.88 |   90.76 | 103-114           
  ...lationInfo.ts |     100 |      100 |     100 |     100 |                   
  languageUtils.ts |   97.89 |    96.42 |     100 |   97.89 | 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      |   98.07 |    76.92 |     100 |   98.07 | 70                
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-1047            
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.51 |    91.66 |   89.74 |   82.51 | ...76-694,701-709 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...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 |     100 |    87.5 | ...24-125,146-147 
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...entEmitter.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                
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   63.15 |    81.25 |     100 |   63.15 | 93,118-157        
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   79.89 |    82.72 |   82.28 |   79.89 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   87.58 |    78.93 |   91.76 |   87.58 |                   
  ...transcript.ts |   92.25 |    85.71 |     100 |   92.25 | ...87,306-307,438 
  ...ent-resume.ts |   82.53 |    71.28 |   77.41 |   82.53 | ...1045-1049,1052 
  ...ound-tasks.ts |    95.4 |    86.48 |     100 |    95.4 | ...55-756,827-828 
  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.29 |    86.15 |   73.04 |   76.29 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.25 |    90.62 |   86.66 |   91.25 | ...94,249-269,328 
  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 |   81.15 |     76.7 |   71.42 |   81.15 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   76.51 |    72.35 |   60.86 |   76.51 | ...1609,1636-1683 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   81.19 |    71.73 |   60.86 |   81.19 | ...98-399,402-403 
  ...nteractive.ts |   79.71 |    79.62 |      75 |   79.71 | ...54,456,458,461 
  ...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 |                   
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/config        |   78.38 |    81.98 |   65.78 |   78.38 |                   
  config.ts        |   76.21 |    80.77 |   61.16 |   76.21 | ...3730,3741-3753 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   95.01 |     90.9 |   90.47 |   95.01 | ...71-372,375-376 
 ...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          |   87.44 |    82.32 |   90.94 |   87.44 |                   
  baseLlmClient.ts |   87.24 |    76.47 |    87.5 |   87.24 | ...82,484-494,503 
  client.ts        |   87.82 |    80.63 |   88.09 |   87.82 | ...1982,2021-2024 
  ...tGenerator.ts |    72.1 |    61.11 |     100 |    72.1 | ...63,365,372-375 
  ...lScheduler.ts |   85.36 |    82.08 |   94.73 |   85.36 | ...3209,3270-3281 
  geminiChat.ts    |   89.15 |    82.14 |    92.3 |   89.15 | ...1442,1509-1510 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | 34-42,45-49,52-87 
  logger.ts        |   87.33 |    87.02 |     100 |   87.33 | ...61-565,611-625 
  ...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.59 |       95 |     100 |   98.59 | 93                
  prompts.ts       |   89.24 |    86.41 |   76.92 |   89.24 | ...-972,1175-1176 
  tokenLimits.ts   |     100 |    89.47 |     100 |     100 | 51-52             
  ...okTriggers.ts |   99.33 |    90.47 |     100 |   99.33 | 156,167           
  turn.ts          |   96.44 |    88.88 |     100 |   96.44 | ...08,421-422,470 
 ...ntentGenerator |   94.94 |    82.68 |   93.87 |   94.94 |                   
  ...tGenerator.ts |   96.51 |    84.43 |   92.59 |   96.51 | ...20,938-942,982 
  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 |   93.41 |    80.28 |   90.32 |   93.41 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |    93.4 |    80.28 |   90.32 |    93.4 | ...10,920-921,949 
 ...ntentGenerator |   81.68 |    84.08 |    90.9 |   81.68 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   76.88 |    82.25 |    87.5 |   76.88 | ...1589,1610-1616 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   52.38 |    44.44 |      50 |   52.38 | ...77,81-85,89-93 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   93.71 |     84.9 |     100 |   93.71 | ...81-482,490,556 
  ...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.83 |    89.55 |   95.65 |   96.83 |                   
  dashscope.ts     |   97.29 |    89.77 |   93.33 |   97.29 | ...81-282,358-359 
  deepseek.ts      |   95.55 |    90.56 |     100 |   95.55 | ...31-132,145-146 
  default.ts       |   95.79 |    89.65 |   88.88 |   95.79 | 122-123,193-195   
  index.ts         |     100 |      100 |     100 |     100 |                   
  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 |                   
 src/extension     |   61.02 |     79.5 |    79.2 |   61.02 |                   
  ...-converter.ts |    65.2 |    49.58 |     100 |    65.2 | ...90-791,800-832 
  ...ionManager.ts |   47.04 |    82.06 |    65.9 |   47.04 | ...1398,1408-1427 
  ...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        |   44.94 |    88.52 |      60 |   44.94 | ...53-359,398-451 
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   97.29 |    93.75 |     100 |   97.29 | ...64,184-185,274 
  npm.ts           |   48.66 |    76.08 |      75 |   48.66 | ...18-420,427-431 
  override.ts      |   94.11 |    88.88 |     100 |   94.11 | 63-64,81-82       
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-108,143-149    
  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.57 |    84.14 |   81.25 |   55.57 |                   
  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 |    71.6 |    72.13 |   83.33 |    71.6 | ...88-246,316-318 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   89.57 |    83.45 |   94.44 |   89.57 |                   
  ...eGoalStore.ts |    85.1 |    95.45 |   84.61 |    85.1 | ...63-166,174-182 
  goalHook.ts      |   97.26 |    91.48 |     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         |   83.65 |    85.46 |   86.88 |   83.65 |                   
  ...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.4 |    90.78 |     100 |    96.4 | ...91,293-294,367 
  ...entHandler.ts |    94.6 |    86.07 |   93.33 |    94.6 | ...42,799-800,810 
  hookPlanner.ts   |   88.19 |       85 |    90.9 |   88.19 | ...68-170,188-199 
  hookRegistry.ts  |   90.17 |    83.33 |     100 |   90.17 | ...33,352,356,360 
  hookRunner.ts    |   58.56 |    71.26 |   66.66 |   58.56 | ...48-749,758-759 
  hookSystem.ts    |   84.57 |      100 |   65.85 |   84.57 | ...21-622,628-629 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   93.63 |    89.47 |      90 |   93.63 | ...45-353,427-428 
  ...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  |       0 |        0 |       0 |       0 | 1-124             
  types.ts         |   91.21 |    92.13 |   85.71 |   91.21 | ...40-441,501-505 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/ide           |   74.28 |    83.39 |   78.33 |   74.28 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |    64.2 |    81.48 |   66.66 |    64.2 | ...9-970,999-1007 
  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           |   41.24 |    52.14 |   51.42 |   41.24 |                   
  ...nfigLoader.ts |   70.27 |    35.89 |   94.73 |   70.27 | ...20-422,426-432 
  ...ionFactory.ts |   42.69 |    79.16 |      50 |   42.69 | ...62-413,419-436 
  ...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 |   48.49 |    67.16 |   65.71 |   48.49 | ...1352,1369-1379 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |   78.69 |    75.34 |   75.92 |   78.69 |                   
  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.62 |    97.72 |     100 |   98.62 | 87-88             
  oauth-utils.ts   |   70.58 |    85.29 |    90.9 |   70.58 | ...70-290,315-344 
  ...n-provider.ts |   89.83 |    95.83 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   79.52 |    86.66 |   86.36 |   79.52 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   82.87 |    82.35 |   92.85 |   82.87 | ...63-173,181-182 
  ...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        |      68 |    76.27 |   66.66 |      68 |                   
  const.ts         |     100 |      100 |     100 |     100 |                   
  dream.ts         |   65.65 |    73.33 |      50 |   65.65 | 50,107-148        
  ...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       |    95.2 |    79.16 |     100 |    95.2 | 81-86,125         
  ...entPlanner.ts |   63.08 |    65.71 |   41.17 |   63.08 | ...17,222-223,332 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |    45.8 |    61.53 |   44.44 |    45.8 | ...04,211,214-346 
  indexer.ts       |   83.87 |    45.45 |     100 |   83.87 | ...50,56-57,69-70 
  manager.ts       |   75.31 |    81.04 |    75.6 |   75.31 | ...1278,1291-1293 
  memoryAge.ts     |   90.47 |    77.77 |     100 |   90.47 | 50-51             
  paths.ts         |   55.47 |    89.47 |   85.71 |   55.47 | ...,89-90,106-114 
  prompt.ts        |   93.36 |    71.42 |     100 |   93.36 | ...58,161,228-229 
  recall.ts        |   77.54 |    69.38 |   88.88 |   77.54 | ...53-258,282-293 
  ...ceSelector.ts |   91.86 |    77.27 |     100 |   91.86 | ...15,117-118,126 
  scan.ts          |   87.91 |    68.42 |     100 |   87.91 | ...47-48,58,82-87 
  ...entPlanner.ts |    11.5 |      100 |       0 |    11.5 | ...57-192,210-298 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   94.44 |    83.33 |     100 |   94.44 | 56-57,92-93       
  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.35 |    85.67 |    87.5 |   89.35 |                   
  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.59 |     100 |     100 | 222               
  modelsConfig.ts  |   84.57 |    82.14 |   81.57 |   84.57 | ...1223,1252-1253 
  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   |   74.36 |    88.55 |   57.55 |   74.36 |                   
  autoMode.ts      |   61.59 |    93.54 |   83.33 |   61.59 | ...00-238,340-356 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |   92.89 |     87.5 |     100 |   92.89 | 146-153,333-337   
  ...erousRules.ts |     100 |    83.87 |     100 |     100 | 101,113,137-143   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |    78.3 |    85.24 |   82.14 |    78.3 | ...-917,1023-1027 
  rule-parser.ts   |   96.06 |    93.22 |     100 |   96.06 | ...-875,1024-1026 
  ...-semantics.ts |   58.28 |    85.27 |    30.2 |   58.28 | ...1604-1614,1643 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   98.18 |       90 |     100 |   98.18 |                   
  system-prompt.ts |   98.18 |       90 |     100 |   98.18 | 150               
 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     |   77.46 |    70.94 |   60.71 |   77.46 |                   
  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 |   66.11 |    55.93 |   63.15 |   66.11 | ...08-409,416-425 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.12 |    86.36 |      50 |   97.12 |                   
  ...oding-plan.ts |   87.17 |      100 |       0 |   87.17 | 81-83,86-88,90-93 
  ...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          |   83.87 |    77.46 |   95.83 |   83.87 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   80.85 |    70.74 |   90.32 |   80.85 | ...1169-1185,1215 
  ...kenManager.ts |   83.76 |    76.22 |     100 |   83.76 | ...62-767,788-793 
 src/services      |   85.36 |    83.29 |    91.3 |   85.36 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.44 |    91.83 |     100 |   98.44 | 268-269           
  ...ionService.ts |   95.54 |    96.29 |     100 |   95.54 | ...19,387,389-393 
  ...ingService.ts |   83.88 |    83.33 |   83.33 |   83.88 | ...1266,1283-1284 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |     100 |    96.77 |     100 |     100 | 133,182           
  cronScheduler.ts |   97.56 |    92.98 |     100 |   97.56 | 62-63,77,155      
  ...eryService.ts |   80.43 |    95.45 |      75 |   80.43 | ...19-134,140-141 
  ...oryService.ts |   86.18 |    76.76 |   91.17 |   86.18 | ...1150,1191-1194 
  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 |                   
  gitService.ts    |   68.75 |     92.3 |   55.55 |   68.75 | ...12-122,125-129 
  ...reeService.ts |   73.83 |    69.31 |    97.5 |   73.83 | ...1460,1488-1489 
  ...ionService.ts |   98.13 |     97.8 |   95.45 |   98.13 | ...32-333,380-381 
  ...orRegistry.ts |   96.54 |    91.73 |     100 |   96.54 | ...70-471,622-623 
  sessionRecap.ts  |   12.65 |      100 |       0 |   12.65 | 44-150            
  ...ionService.ts |   90.47 |     79.2 |   96.87 |   90.47 | ...1324,1328-1329 
  sessionTitle.ts  |   93.87 |    71.15 |     100 |   93.87 | ...33-236,267-268 
  ...ionService.ts |   81.07 |    77.92 |   89.28 |   81.07 | ...1923,1929-1934 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...reeCleanup.ts |   14.56 |      100 |   33.33 |   14.56 | 58-185            
  ...ionService.ts |   84.21 |    79.41 |     100 |   84.21 | ...22-223,239-240 
 ...icrocompaction |   98.05 |     91.8 |     100 |   98.05 |                   
  microcompact.ts  |   98.05 |     91.8 |     100 |   98.05 | ...19,289,293,391 
 src/skills        |    87.5 |    83.86 |   94.23 |    87.5 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |   92.94 |    81.63 |     100 |   92.94 | ...06,226,238-240 
  skill-manager.ts |   83.31 |    79.66 |   90.32 |   83.31 | ...1120,1127-1131 
  skill-paths.ts   |   86.74 |    77.77 |     100 |   86.74 | ...00-101,106-107 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/subagents     |   82.61 |    78.89 |   95.23 |   82.61 |                   
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   77.15 |    71.36 |    93.1 |   77.15 | ...1178,1200-1201 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 51-56,69-74,78-83 
 src/telemetry     |   75.45 |    86.02 |   79.37 |   75.45 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...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 |   93.93 |    90.21 |   94.11 |   93.93 | ...75-280,299-300 
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |    51.9 |       64 |   57.77 |    51.9 | ...1214,1231-1251 
  metrics.ts       |    74.9 |    82.95 |   74.54 |    74.9 | ...58-978,981-992 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  sdk.ts           |   90.45 |    83.56 |   76.92 |   90.45 | ...17-318,338-342 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   92.27 |    87.64 |     100 |   92.27 | ...41-844,848-851 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.61 |    89.36 |     100 |   98.61 | 53,108            
  types.ts         |   79.17 |    85.83 |   83.33 |   79.17 | ...1149,1152-1181 
  uiTelemetry.ts   |   92.97 |    96.96 |   81.25 |   92.97 | ...93-194,200-207 
 ...ry/qwen-logger |   68.24 |    79.56 |   64.91 |   68.24 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   68.24 |    79.34 |   64.28 |   68.24 | ...1055,1093-1094 
 src/test-utils    |   93.16 |    95.91 |   76.47 |   93.16 |                   
  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.19 |    97.14 |   72.41 |   91.19 | ...38,202-203,216 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   78.74 |     81.4 |   85.71 |   78.74 |                   
  ...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 |   82.95 |    67.56 |    87.5 |   82.95 | ...82-185,276-277 
  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          |   79.19 |    85.71 |   78.94 |   79.19 | ...20,560,569-576 
  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 |   84.36 |    82.74 |   84.21 |   84.36 | ...2099-2103,2142 
  mcp-client.ts    |   33.18 |    77.65 |   66.66 |   33.18 | ...1490,1494-1497 
  mcp-tool.ts      |   90.98 |    88.88 |   96.42 |   90.98 | ...95-596,646-647 
  memory-config.ts |       0 |        0 |       0 |       0 | 1-47              
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  monitor.ts       |   91.36 |    83.94 |   88.46 |   91.36 | ...61,574,770-775 
  notebook-edit.ts |   81.72 |       75 |   81.25 |   81.72 | ...54-870,916-917 
  ...nforcement.ts |   82.57 |       90 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |    95.4 |    90.32 |      90 |    95.4 | ...99,298-301,304 
  ripGrep.ts       |   94.59 |    85.71 |   93.33 |   94.59 | ...60,463,541-542 
  ...-transport.ts |    6.34 |      100 |       0 |    6.34 | 47-145            
  send-message.ts  |   84.68 |    91.66 |    62.5 |   84.68 | ...,82-90,167-170 
  shell.ts         |   73.05 |    79.66 |   91.42 |   73.05 | ...4216,4265-4271 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   88.35 |    91.42 |   86.66 |   88.35 | ...12,416,439-461 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  todoWrite.ts     |   89.17 |    82.05 |   92.85 |   89.17 | ...41-546,568-569 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   74.85 |    76.85 |   80.95 |   74.85 | ...30-831,839-840 
  tool-search.ts   |   95.19 |    86.48 |    92.3 |   95.19 | ...47-153,208-213 
  tools.ts         |   90.49 |    90.19 |   84.21 |   90.49 | ...78-479,495-501 
  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   |   74.63 |    81.04 |   73.61 |   74.63 |                   
  agent.ts         |   74.88 |    81.29 |   74.24 |   74.88 | ...2393,2402-2405 
  fork-subagent.ts |   69.62 |    71.42 |   66.66 |   69.62 | ...04-105,140-151 
 src/utils         |   89.03 |    87.45 |   93.67 |   89.03 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   77.96 |    80.48 |     100 |   77.96 | ...35,156,173-176 
  bareMode.ts      |   27.27 |      100 |       0 |   27.27 | 9-15,18-19        
  browser.ts       |    7.69 |      100 |       0 |    7.69 | 17-56             
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   89.11 |     87.5 |     100 |   89.11 | ...28-129,132-133 
  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   |    95.9 |    93.84 |   94.73 |    95.9 | 106-107,214-218   
  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 |     100 |    95.45 |     100 |     100 | 83                
  errorParsing.ts  |    97.7 |    97.05 |     100 |    97.7 | 72-73             
  ...rReporting.ts |   88.46 |       90 |     100 |   88.46 | 69-74             
  errors.ts        |   70.92 |    79.59 |   53.33 |   70.92 | ...03-219,223-229 
  fetch.ts         |   70.18 |    71.42 |   71.42 |   70.18 | ...42,148,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        |    12.5 |      100 |       0 |    12.5 | 21-34             
  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 | 26                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |    74.1 |    90.76 |   58.33 |    74.1 | ...23-326,336-342 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iagnostics.ts |    96.4 |     90.9 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    83.9 |    79.36 |     100 |    83.9 | ...16,319,411-414 
  ...tProcessor.ts |   93.63 |       90 |     100 |   93.63 | ...96-302,384-385 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  modelId.ts       |   98.95 |    98.21 |     100 |   98.95 | 148               
  ...kerChecker.ts |   90.78 |    91.66 |     100 |   90.78 | 73-79             
  notebook.ts      |   94.48 |    88.59 |   95.83 |   94.48 | ...16,328,380-382 
  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.86 |     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 |                   
  ...ectSummary.ts |   89.39 |    72.41 |     100 |   89.39 | ...37-142,193-196 
  ...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         |   89.81 |    88.05 |     100 |   89.81 | ...29,350,357-358 
  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 |   81.72 |    85.04 |   95.23 |   81.72 | ...18,543,572-581 
  runtimeStatus.ts |    97.5 |    88.57 |     100 |    97.5 | 167-168           
  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 |   94.57 |    80.26 |     100 |   94.57 | ...04,213-216,270 
  ...r-launcher.ts |   76.92 |     91.3 |   66.66 |   76.92 | ...34,136,157-195 
  ...orageUtils.ts |   96.89 |    85.84 |     100 |   96.89 | ...51,367,447,466 
  shell-utils.ts   |   82.93 |    89.89 |     100 |   82.93 | ...1522,1529-1533 
  ...lAstParser.ts |   95.58 |    85.79 |     100 |   95.58 | ...1059-1061,1071 
  ...nlyChecker.ts |   95.75 |    92.39 |     100 |   95.75 | ...00-301,313-314 
  sideQuery.ts     |   98.71 |    97.14 |     100 |   98.71 | 110               
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  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    |     100 |       92 |     100 |     100 | 52,71             
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   93.71 |    89.28 |   93.33 |   93.71 | ...24-225,249-251 
  xml.ts           |     100 |      100 |     100 |     100 |                   
  yaml-parser.ts   |      92 |    84.61 |     100 |      92 | 49-53,65-69       
 ...ils/filesearch |   86.21 |    81.61 |   96.42 |   86.21 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.84 |    77.49 |   94.82 |   82.84 | ...1451,1485-1486 
  fileSearch.ts    |   93.58 |    87.32 |     100 |   93.58 | ...46-247,249-250 
  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.

… + silent-failure-hunter

Eight discrete fixes plus two new tests, all surfaced in the Phase 2 review
rounds. Grouped here because they touch the same handful of code paths.

Copilot inline (#4321 PR):
1. startToolSpan attrs naming: drop redundant `tool_name` (helper already
   sets `'tool.name'` from the first arg) and rename `call_id` to the
   namespaced `'tool.call_id'`. Two sites: `_schedule` validating-loop
   start, and the defensive fallback in executeSingleToolCall. Without
   this, traces emit non-namespaced `tool_name` / `call_id` attributes
   that consumers grepping for `tool.call_id` miss.
2. PreToolUse hook span: propagate the actual `preHookResult.blockType`
   ('denied' / 'ask' / 'stop') instead of collapsing every block to
   'denied'. Also record `hasAdditionalContext` for parity with the
   PostToolUse / failure-hook spans.
3. blocked_on_user `source` detection: use `config.getIdeMode()` (best-
   effort) so IDE-driven decisions don't all show up as `'cli'`.
   Centralized in a new `getBlockedSource()` helper.

silent-failure-hunter / code-reviewer:
4. Hook span error-tracking is dead code. firePreToolUseHook /
   firePostToolUseHook / safelyFirePostToolUseFailureHook all swallow
   throws internally — every `catch (e) { endMeta = { error, ... };
   throw e }` block in the scheduler was unreachable. Simplify all 6
   sites to `try { ... } finally { endHookSpan(...) }`. The default
   `endMeta = { success: false }` keeps the span sensible if a future
   hook impl decides to throw.
5. handleConfirmationResponse had no error handling. modifyWithEditor /
   _applyInlineModify / attemptExecutionOfScheduledCalls can throw and
   would otherwise leak both the tool span and the blocked_on_user span
   until the 30-min TTL fires. Wrap the body in a try/catch that
   finalizes both spans on rethrow. Extracted the body to
   `_handleConfirmationResponseInner` for clarity.
6. Add `'error'` to the `ToolBlockedDecision` union for system-error
   closes, so dashboards counting `decision: 'cancel'` don't get
   polluted by thrown exceptions.
7. _schedule's outer catch was labelling its non-aborted close as
   `'cancel'`. Switch to `'error'` (uses #6).
8. signal.aborted vs explicit user Cancel: when both are true, the old
   code reported `'aborted'/'system'` even though the user actually
   clicked Cancel. Reverse the precedence so `outcome === Cancel`
   wins, with `getBlockedSource()` for the source.

Tests:
- T1: extend the existing ProceedAlways auto-approve test to assert the
  two siblings' blocked spans end with `decision: 'auto_approved'`,
  `source: 'auto'`, while the first tool ends as `'proceed_always'`/cli.
- T2: existing cancel-during-confirmation test now also asserts exactly
  one blocked span is recorded for the lifecycle — the same invariant
  ModifyWithEditor's intentional preservation across editor side trips
  must not break.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Follow-up commit 6767469b2 summary

Addresses all 3 Copilot inline comments + the silent-failure-hunter / code-reviewer findings from my own pre-merge review pass.

Fixed

  • C1 Both startToolSpan calls now use the namespaced 'tool.call_id' and drop the redundant tool_name (handled by the helper from the first arg).
  • C2 PreToolUse hook span propagates the actual preHookResult.blockType ('denied' / 'ask' / 'stop') and adds hasAdditionalContext.
  • C3 New getBlockedSource() helper — derives 'ide' from config.getIdeMode(), else 'cli'. Used at the Cancel and Proceed branches.
  • S1 All 6 hook fire sites simplified to try { ... } finally { endHookSpan(...) }. The earlier catch block was dead code (the underlying hook helpers swallow throws). Default endMeta = { success: false } keeps the span sensible if a future impl decides to throw.
  • S2 handleConfirmationResponse now wraps the body in try/catch — modifyWithEditor / _applyInlineModify / attemptExecutionOfScheduledCalls throws no longer leak both spans until the 30-min TTL.
  • S3 Added 'error' to ToolBlockedDecision. _schedule's outer catch now reports 'error'/'system' (was 'cancel'/'system') — keeps user-cancel dashboards clean.
  • S5 outcome === Cancel now wins over a concurrent signal.aborted for the decision attribute.

Tests added

  • T1: extends the existing ProceedAlways auto-approve test to assert the 2 auto-approved siblings end with decision: 'auto_approved' / source: 'auto' while the first tool ends as proceed_always / cli.
  • T2: existing cancel-during-confirmation test now asserts exactly one tool.blocked_on_user record per lifecycle — guards the ModifyWithEditor invariant from regression.

Verification

  • 187 / 187 affected tests pass (coreToolScheduler.test.ts + session-tracing.test.ts)
  • tsc --noEmit clean for core
  • eslint clean

🤖 Generated with Qwen Code

… behaviors

Two follow-ups from the post-#6767469b2 review pass on PR #4321:

1. autoApproveCompatiblePendingTools error path was logging-only and
   leaving the sibling tool's blocked_on_user span open until the 30-min
   TTL fires. Symmetric with the success branch's
   finalizeBlockedSpan('auto_approved', 'auto'), the catch now finalizes
   with ('error', 'system') so the trace deterministically explains why
   the sibling didn't auto-approve.

2. Three behaviors introduced by 6767469 had no test coverage:
   - decision='error' from _schedule's outer catch when
     getConfirmationDetails throws (asserts tool span ends, no blocked
     span ever opens since the throw happens pre-awaiting_approval).
   - source='ide' when getBlockedSource() honors getIdeMode (Cancel
     path with getIdeMode: () => true).
   - Explicit Cancel takes precedence over a concurrent signal.aborted
     in the decision label — the bug the precedence flip was meant to
     fix is now regression-tested.

Extracted a small `buildApprovalScheduler` helper for the two
awaiting_approval-flow tests; the throw-on-confirmation test reuses
StructuredErrorOnConfirmationTool.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Follow-up commit 32f94d348 — autoApprove leak + 3 test gaps

Addresses the remaining HIGH item from the second-pass review (silent-failure-hunter + code-reviewer agreed) plus the three test gaps both reviewers flagged.

Fixed

  • autoApproveCompatiblePendingTools error path (line 2824) was logging-only — sibling's blocked span leaked to the 30-min TTL. Catch now calls finalizeBlockedSpan(callId, 'error', 'system') symmetric with the success branch's 'auto_approved' / 'auto'.

Tests added

  • decision='error' from _schedule's outer catch when getConfirmationDetails throws (StructuredErrorOnConfirmationTool reused).
  • source='ide' when getBlockedSource() honors getIdeMode: () => true.
  • Explicit Cancel takes precedence over signal.aborted (regression test for the precedence flip in 6767469).

Verification

  • 190 / 190 affected tests pass (was 187, +3 new).
  • tsc --noEmit clean
  • pre-commit (prettier + eslint --fix) clean

🤖 Generated with Qwen Code

…odex P3)

The previous commit 32f94d3 added a `finalizeBlockedSpan(callId, 'error',
'system')` to the autoApproveCompatiblePendingTools catch in the name of
"symmetry with the success branch". Codex review pointed out the bug:
that catch fires when evaluatePermissionFlow throws for a SIBLING tool,
but the sibling itself is still in `awaiting_approval` — the user can
still respond. By closing the blocked span at the catch, the eventual
handleConfirmationResponse → finalizeBlockedSpan call becomes a no-op
(Map.delete already cleared it), and the user's actual decision /
source attributes are lost from the trace.

Revert that line. The previous behavior was correct: log the error,
leave the span open, let the user's eventual decision close it
correctly. If the user never responds, the 30-min TTL in
session-tracing.ts cleans up the orphan span — same fallback that
already covered every other "user walks away" scenario.

The "leak" the original change was trying to fix was a phantom: the
span IS finalized once the user (or the abort signal) drives the tool
to a terminal state. The TTL is just the safety net.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Codex review disposition (/codex:review --base main)

Two findings; one adopted, one pushed back.

[P3] adopted — 68dea8a58

autoApprove catch finalizeBlockedSpan was wrong. My previous commit 32f94d348 added a finalizeBlockedSpan(callId, 'error', 'system') in the autoApproveCompatiblePendingTools catch (line 2833) for "symmetry with the success branch". Codex correctly pointed out: the sibling tool stays in `awaiting_approval` after evaluatePermissionFlow throws — the user can still respond. Closing the span at the catch makes the user's eventual decision a no-op (Map already cleared) and the actual decision/source attributes are lost.

Reverted that line. The pre-32f94d348 behavior was correct: log + leave span open + let user's decision close it correctly. The 30-min TTL in session-tracing.ts is the existing safety net for "user never responds".

[P2] pushed back — race is theoretical, not real

Codex was concerned that setStatusInternal('awaiting_approval', ...) synchronously fires `onToolCallsUpdate`, which fires `onConfirm`, which fires `handleConfirmationResponse`, which calls `finalizeBlockedSpan` BEFORE the next line (`blockedSpans.set(...)`) has run.

Tracing the actual control flow:

  1. `setStatusInternal` is sync.
  2. `notifyToolCallsUpdate` fires `onToolCallsUpdate` (sync).
  3. consumer calls `onConfirm()` → `handleConfirmationResponse(...)` returns a Promise.
  4. `handleConfirmationResponse`'s body has a single `await this._handleConfirmationResponseInner(...)` wrapping ALL of its finalize calls.
  5. `_handleConfirmationResponseInner`'s first statement is `await originalOnConfirm(...)` — yields a microtask (even if originalOnConfirm is sync).
  6. Yield returns control up the stack to the consumer, then to `notifyToolCallsUpdate`, then to `setStatusInternal`, then back to `_schedule`.
  7. `_schedule` continues: `startToolBlockedOnUserSpan(...)` + `this.blockedSpans.set(...)` run synchronously.
  8. Microtask queue drains: `_handleConfirmationResponseInner` resumes, hits `finalizeBlockedSpan`, `Map.get` succeeds.

The async barrier between `onConfirm()` and the eventual `finalizeBlockedSpan` call is NOT bypassable through synchronous `onToolCallsUpdate` — `await` always yields a microtask. `finalizeBlockedSpan` runs strictly after `blockedSpans.set`. No race in practice.

Verification

  • tsc --noEmit clean
  • npx vitest run src/core/coreToolScheduler.test.ts src/telemetry/session-tracing.test.ts — 190 / 190 pass
  • pre-commit (prettier + eslint) clean

🤖 Generated with Qwen Code

@doudouOUC doudouOUC self-assigned this May 19, 2026

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] coreToolScheduler.ts:1835 — ModifyWithEditor silent failure leaks blocked + tool spans

When getPreferredEditor() returns undefined, the bare return in _handleConfirmationResponseInner leaks both the blocked span (created in _schedule) and the tool span. No log, no user feedback — the tool silently stays in awaiting_approval until the 30-min TTL fires.

        if (!editorType) {
          debugLogger.warn(
            `ModifyWithEditor requested for ${callId} but no editor available`,
          );
          this.finalizeBlockedSpan(callId, 'error', 'system');
          return;
        }

Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.test.ts
doudouOUC added 2 commits May 19, 2026 21:30
…ecision

Two #4321 review comments from wenshao, both Critical:

1. `TOOL_FAILURE_KIND_PRE_HOOK_BLOCKED` was being emitted for FIVE distinct
   non-PreToolUse-hook deny paths in `_schedule`:
   - finalPermission === 'deny' (hard deny)
   - plan-mode block
   - non-interactive deny
   - permission_request hook deny
   - background-agent deny
   Dashboards filtering by `failure_kind = 'pre_hook_blocked'` were
   silently picking up all of these, undermining the attribute. Add
   distinct constants + status messages for each path. The original
   PRE_HOOK_BLOCKED label is now used at exactly one site — the actual
   PreToolUse hook deny in `_executeToolCallBody`.

2. `decision: 'proceed_once'` was untested. Existing tests covered
   'cancel' and 'proceed_always' (auto-approve) but not the most common
   user interaction. Add a test that schedules an approval-required tool,
   confirms with ProceedOnce, and asserts the blocked span ends with
   `decision: 'proceed_once'`, `source: 'cli'`.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
Three review items folded into one follow-up:

1. wenshao Critical (`coreToolScheduler.ts:1851`) — `ModifyWithEditor`
   path silently returned when `getPreferredEditor()` was undefined,
   leaking blocked + tool spans on user-walks-away. Add a
   `debugLogger.warn` so the silent failure is at least visible in debug
   telemetry. Deliberately do NOT finalize spans here, matching the
   Codex P3 / autoApprove decision: ModifyWithEditor stays inside one
   awaiting period, the user can still recover via Cancel/Proceed which
   closes the spans correctly, and the 30-min TTL is the safety net for
   give-up scenarios. Finalizing prematurely would make the user's
   eventual decision a no-op (Map already cleared) and lose the actual
   decision/source attributes.

2. Bot summary Medium (`session-tracing.ts:557-562`) — add a
   `debugLogger.debug` when `startToolBlockedOnUserSpan` falls back to
   `resolveParentContext` because the tool span isn't in `activeSpans`
   anymore. Helps diagnose unexpected ordering during development.

3. Bot summary Low (`constants.ts`) — JSDoc the two new span name
   constants.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Follow-up commit cc3f7fc1e — wenshao Critical + bot summary nits

wenshao Critical: ModifyWithEditor !editorType silent failure (coreToolScheduler.ts:1851)

Partially adopted. Added the debugLogger.warn you suggested so the silent failure is at least visible in debug telemetry.

Pushed back on the finalizeBlockedSpan(callId, 'error', 'system') part — for consistency with the Codex P3 / autoApprove decision a few commits earlier:

  • ModifyWithEditor is intentionally INTRA-awaiting (the blocked span covers the entire awaiting period including editor side trips per the Phase 2 design).
  • When the editor is unavailable, the tool stays in awaiting_approval — the user can still recover via Cancel or Proceed, and that decision closes the spans correctly with the actual decision/source.
  • Closing the span at the !editorType branch makes the user's eventual handleConfirmationResponse → finalizeBlockedSpan a no-op (Map already cleared) and the real decision attribute is lost.
  • The 30-min TTL in session-tracing.ts is the safety net for genuine "user walks away" cases — same fallback that already covers every other intra-awaiting bail-out path (autoApprove evaluatePermissionFlow throw, etc).

If you have a strong preference for the deterministic close, I can flip it; just want to surface the consistency cost before doing so.

Bot summary nits

# Item Disposition
Medium 1 session-tracing.ts:557-562 debug log on fallback ✅ Adopted
Medium 2 finalizeToolSpan / finalizeBlockedSpan not in telemetry exports ❌ Push back — they're explicitly private scheduler-state-machine helpers, not telemetry public API
Low 1 debugLogger.error instead of warn on span end failure ❌ Push back — span end failures are extremely rare, recoverable, and don't break the service. warn is the existing convention
Low 2 Extract safelyEndSpan helper ❌ Push back — DRY across 3 sites with ~5 lines each isn't worth the indirection. Existing code structure is consistent
Low 3 JSDoc on new SPAN constants ✅ Adopted
Low 4 Be more explicit about ProceedAlways* outcomes ❌ Push back — comment is accurate; listing ProceedAlways / ProceedAlwaysProject / ProceedAlwaysUser would be noise

Verification

  • 191 / 191 tests pass
  • tsc --noEmit clean
  • pre-commit clean

🤖 Generated with Qwen Code

@doudouOUC doudouOUC requested a review from wenshao May 19, 2026 13:47
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
…ToolSpan param

Two #4321 review Suggestions from wenshao:

1. The 6 hook fire sites (PreToolUse, PostToolUse, 4× PostToolUseFailure)
   each repeated the same try/finally + endMeta init + endHookSpan
   pattern. Future hook span protocol changes had to be made in lockstep.
   Extract a private generic helper:

       withHookSpan<T>(opts, fn, toEndMeta): Promise<T>

   Each fire site collapses from ~12 lines of try/finally scaffolding to
   ~3 lines passing in the fire callback + endMeta builder. The
   `let postHookResult!:` definite-assignment hack at the PostToolUse
   site is gone because the helper returns the awaited result directly.

2. `finalizeToolSpan(callId, metadata?)` had a dead `metadata`
   parameter — every caller pre-sets the span status via
   `setToolSpan{Failure,Cancelled}` and called `finalizeToolSpan` with no
   argument. Removed the parameter.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC doudouOUC requested a review from wenshao May 19, 2026 14:42
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
…id back-compat

Three #4321 review threads from wenshao (#4321 codex P3-equivalent +
two structural concerns):

1. **[Critical] Hook spans reported success on swallowed hook failures.**
   firePreToolUseHook / firePostToolUseHook /
   firePostToolUseFailureHook (and the safelyFire wrapper in
   coreToolScheduler) all catch transport / dispatch errors internally
   and return safe defaults. Before this fix, withHookSpan's `toEndMeta`
   ran on the safe default and recorded `success: true` — a crashing
   hook was indistinguishable from one that allowed execution.
   Add a `hookError?: string` field to the three result types, populate
   it in each catch, and have all 6 toEndMeta callbacks return
   `{ success: false, error: hookError }` when present.
   Existing "graceful error" tests updated to expect the new field.

2. **[Suggestion] ensureCleanupInterval not kicked from new helpers.**
   The 30-min TTL cleanup safety net for leaked spans only starts when
   `startInteractionSpan` is first called. Sub-agent or side-query code
   paths that call `startToolBlockedOnUserSpan` / `startHookSpan`
   without an interaction span first never trigger cleanup. Both
   helpers now call the (idempotent) `ensureCleanupInterval()` early.

3. **[Suggestion] `call_id` → `'tool.call_id'` rename is breaking for
   downstream consumers.** Phase 1's `startToolSpan(name, { tool_name,
   call_id })` shipped non-namespaced attribute keys. My Phase 2 #4321
   review-fix dropped both. Dual-emit `call_id` (legacy alias) +
   `'tool.call_id'` for one release cycle so existing dashboards /
   alerts don't silently return zero. Comment notes the legacy key is
   removed in the next release.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC doudouOUC requested a review from wenshao May 19, 2026 16:03
Comment thread packages/core/src/core/coreToolScheduler.test.ts
Comment thread packages/core/src/core/coreToolScheduler.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.

Additional observations (not on diff lines):

  • firePermissionRequestHook not wrapped with withHookSpan (coreToolScheduler.ts:1734): The PR wraps 6 hook fire sites with span instrumentation, but firePermissionRequestHook — a decision-making hook that can return allow/deny — is not wrapped. The HookEvent type also lacks a 'PermissionRequest' variant. This makes the permission hook's latency and decision invisible in traces. If this exclusion is intentional, a comment at the call site noting the rationale would help future maintainers.

  • endToolBlockedOnUserSpan never sets ERROR status (session-tracing.ts:706): When a blocked span is closed with decision: 'error' (e.g., system exception during approval flow), the span status stays UNSET. Operators filtering by SpanStatusCode.ERROR in trace backends won't surface these. Consider setting ERROR status when metadata?.decision === 'error'.

  • Test coverage gaps (pattern): Three specific new code paths lack test coverage: (1) truncateSpanError — no test passes an oversized string to verify truncation; (2) TTL sweep tool.blocked_on_user branch — the type-specific decision: 'aborted' stamping is untested; (3) endHookSpan idempotency — the blocked_on_user span has an idempotency test but the hook span does not.

— qwen-latest-series-invite-beta-v34 via Qwen Code /review

Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts Outdated
Adopted ([Suggestion]):

- coreToolScheduler.ts: `setToolSpanFailure` now applies
  `truncateSpanError` to the status message at this single ingress
  point. Many of its 10+ call sites pass raw `error.message` which can
  be unbounded — the same backend-drop risk that drove
  `truncateSpanError` for the endXSpan attribute writes. Static-
  constant callers see no change since their messages are well under
  the 1024-char cap. Required exporting `truncateSpanError` from
  `session-tracing.ts` and re-exporting from `telemetry/index.ts`.

- coreToolScheduler.ts: in `_schedule`, after the for-loop runs to
  completion, drop the abort listener if `batchState.callIds.size === 0`.
  Closes the all-error-batch leak path: if every newToolCall had
  `status !== 'validating'` (e.g., invalid params, tool not registered,
  queue full), no `finalizeToolSpan` ever fires for the batch and
  `releaseBatchListenerIfDrained` is never invoked. Without this drop,
  one dead listener accumulates per all-error batch.

- coreToolScheduler.ts: `handleConfirmationResponse` outer catch now
  emits a `debugLogger.warn` before rethrowing. Without it, if the
  caller (CLI confirmation UI layer) doesn't log the rejection, the
  error disappears from application logs entirely — operators
  grepping by callId would see nothing despite the trace backend
  showing `failure_kind: tool_exception`.

- session-tracing.test.ts: 4 new tests
  * `truncateSpanError` returns short strings unchanged
  * `truncateSpanError` truncates over 1024 chars + appends sentinel
  * `truncateSpanError` boundary at exactly 1024 chars
  * TTL sweep stamps `decision: 'aborted'` + `source: 'system'` on
    blocked_on_user spans (covers the branch added in review-3 round)

Pushed back ([Suggestion]):

- "TTL sweep can't reach scheduler-local Maps" — accurate but the fix
  is non-trivial: a parallel scheduler-side TTL sweep duplicates the
  session-tracing sweep's bookkeeping, and the practical impact is
  bounded (Maps die with the scheduler instance, which is per-session
  in CLI mode). The bigger leak (listener accumulation on shared
  signals) is already covered by `releaseBatchListenerIfDrained`.
  Marking as out-of-scope architectural follow-up.

Tests: 259/259 across affected files (coreToolScheduler 159 +
session-tracing 53 + toolHookTriggers 47). `tsc --noEmit` clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC doudouOUC requested a review from wenshao May 20, 2026 09:53
Comment thread packages/core/src/core/coreToolScheduler.test.ts Outdated
- coreToolScheduler.test.ts: convert the `truncateSpanError` mock from
  an inline identity function to `vi.fn(identity)` so individual tests
  can substitute a sentinel return. Added regression test
  `setToolSpanFailure forwards the truncateSpanError result to the span
  status (#4321)` that overrides the spy with `<<TRUNCATED-SENTINEL>>`,
  drives the scheduler through the pre-hook deny path, and asserts the
  span's ERROR status message equals the sentinel — locks the
  integration so a regression dropping the `truncateSpanError(message)`
  call inside `setToolSpanFailure` is caught at the scheduler boundary
  rather than only at the utility's unit test.

Tests: 213/213 across `coreToolScheduler.test.ts` (160) +
`session-tracing.test.ts` (53). `tsc --noEmit` clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
… review on PR #4321

Comprehensive self-review (code-reviewer + silent-failure-hunter +
type-design-analyzer + pr-test-analyzer agents) after 6 rounds of bot
feedback turned up 4 remaining actionable items. Addressed:

[silent-failure-hunter HIGH-1] toolHookTriggers.ts: when the hook
runner returns `{ success: false }` (or missing output) with no
`error.message`, the 3 fire helpers used to silently return the safe
default — `{ shouldProceed: true }` / `{ shouldStop: false }` / `{}` —
producing a hook span that reads `success: true` and looked like a
clean allow in dashboards. Now synthesizes a sentinel hookError
describing the contract violation so the span records the failure.
Three existing test cases updated to assert the new sentinel-bearing
shape.

[silent-failure-hunter HIGH-2] coreToolScheduler.ts: synchronous
throws in `_executeToolCallBody`'s prelude (addToolInputAttributes,
getMessageBus, startToolExecutionSpan, etc.) propagated up to
`executeSingleToolCall`'s `finally` without ever hitting setToolSpan*,
so the tool span ended UNSET with no failure_kind AND the tool call
stayed in 'executing' forever (checkAndNotifyCompletion never sees
terminal state, scheduler hangs). Added a catch in
executeSingleToolCall that pre-sets failure status + an error response
before the finally finalizes — guards every prelude path the body's
own try/catch doesn't cover.

[silent-failure-hunter MEDIUM-3] session-tracing.ts: the empty catch
on `sweepStaleSpans` `setAttributes` lost the `ttl_expired` +
`decision: 'aborted'` sentinel attrs silently if setAttributes ever
threw. Now matches the sibling `span.end()` catch and surfaces via
`debugLogger.warn` — TTL-leaked blocked spans stay distinguishable
from deliberately-UNSET ones in dashboards.

[pr-test-analyzer Gap1, severity 7] coreToolScheduler.test.ts: the
`signal.aborted` re-check at `_schedule:1834` (round-3 fix that
prevents opening a blocked span on an already-aborted signal between
the for-loop's await points and the awaiting_approval transition) had
no regression test. Added one that uses a tool whose
`getConfirmationDetails` aborts the signal before returning — top of
loop check passes, getConfirmationDetails resolves and aborts, re-check
fires the cancel path. Asserts `tool.failure_kind === 'cancelled'` AND
that NO blocked_on_user span was ever started.

Tests: 261/261 across affected files (coreToolScheduler 161 +
session-tracing 53 + toolHookTriggers 47). `tsc --noEmit` clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Final self-review pass — commit 84851f27c

Ran a comprehensive 4-agent review (code-reviewer + silent-failure-hunter + type-design-analyzer + pr-test-analyzer) against the final state to catch anything 6 rounds of bot review missed. 4 actionable items found; all adopted in this commit:

Adopted

[silent-failure-hunter HIGH-1] toolHookTriggers.ts — when the hook runner returns { success: false } (or missing output) with no error.message, the 3 fire helpers used to silently return the safe default { shouldProceed: true } / { shouldStop: false } / {}. The hook span then read success: true — a clean "allow" in dashboards even though the hook never actually ran. Now synthesizes a sentinel hookError describing the contract violation (e.g. hook runner returned success: false without error detail) so the span correctly records the failure. Three existing test cases updated.

[silent-failure-hunter HIGH-2] coreToolScheduler.ts — synchronous throws in _executeToolCallBody's prelude (addToolInputAttributes, getMessageBus, startToolExecutionSpan, etc.) propagated up to executeSingleToolCall's finally without ever hitting setToolSpan*. The tool span ended UNSET with no failure_kind AND the tool call stayed in 'executing' forever (checkAndNotifyCompletion never sees a terminal state → scheduler hangs). Added a catch in executeSingleToolCall that pre-sets failure status + error response before finally finalizes.

[silent-failure-hunter MEDIUM-3] session-tracing.ts — the empty catch on sweepStaleSpans setAttributes silently lost the ttl_expired + decision: 'aborted' sentinel attrs if setAttributes ever threw. Now matches the sibling span.end() catch and surfaces via debugLogger.warn.

[pr-test-analyzer Gap1, sev 7] coreToolScheduler.test.ts — the round-3 signal.aborted re-check at _schedule:1834 had no regression test. Added one that drives the exact uncovered window: tool's getConfirmationDetails aborts the signal as it returns → top-of-loop check passes, await resolves, re-check fires the cancel path. Asserts tool.failure_kind === 'cancelled' AND no blocked_on_user span is ever started.

Deferred (out of scope for this PR)

  • type-design items 1-3: BatchAbortState → class with private Set + dispose(); applyTruncatedError helper for single-ingress truncate; StartHookSpanOptions/HookSpanMetadata discriminated unions by hookEvent. All architectural cleanups — no current bug, follow-up issue worth filing.
  • code-reviewer LOW-1/2 (withHookSpan docstring nit, releaseBatchListenerIfDrained no-op comment): not worth a churn commit on their own; can land with the type-design follow-up.
  • pr-test-analyzer Gap2-6: defensive-code coverage that exercises today-dead branches (attemptExecutionOfScheduledCalls throw, drainSpansForBatch per-callId try/catch isolation, withHookSpan catch, modify-then-proceed, listener-removal-via-confirm). Real but no production impact today.

Verification

  • 261/261 tests pass across coreToolScheduler.test.ts (161) + session-tracing.test.ts (53) + toolHookTriggers.test.ts (47)
  • tsc --noEmit clean
  • ESLint clean on changed files

🤖 Generated with Qwen Code

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

[Suggestion] Missing test for the pre-body throw catch path in _executeToolCallBody (coreToolScheduler.ts:2386–2420). A test injecting a config where getMessageBus() or addToolInputAttributes throws before the scheduled → executing transition would have caught the Critical finding above and prevents future regressions.

— qwen-latest-series-invite-beta-v34 via Qwen Code /review

Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/telemetry/session-tracing.ts Outdated
Comment thread packages/core/src/core/toolHookTriggers.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/telemetry/session-tracing.ts Outdated
Comment thread packages/core/src/core/toolHookTriggers.ts
All three from the same /review run; all valid (the Critical is a real
bug in the SF-H2 fix from review-7 that this commit fixes).

[Critical] coreToolScheduler.ts:2407 — the `c.status === 'executing'`
guard on the prelude-throw catch was wrong. Prelude throws happen
BEFORE the `scheduled → executing` transition in `_executeToolCallBody`
(getMessageBus is called at line 2460, scheduled→executing flips at
line 2522). The `find(... 'executing')` skipped the setStatusInternal,
so the toolCall stayed in `scheduled` forever and
checkAndNotifyCompletion never fired — exactly the stall the SF-H2 fix
was supposed to prevent. Drop the guard; setStatusInternal already
no-ops on terminal states (success/error/cancelled) so the
unconditional call covers both scheduled-prelude and executing-body
paths. Added regression test that makes getMessageBus throw and
asserts onAllToolCallsComplete fires with status='error'.

[Suggestion] session-tracing.ts:222 — truncateSpanError used
`slice(0, 1024)` on UTF-16 code units, which splits surrogate pairs
when an emoji (e.g. 🚀) or rare CJK character sits at the boundary.
The result was a lone high surrogate followed by `'…[truncated]'` —
strict OTLP/gRPC collectors reject batches with invalid UTF-8 (a lone
high surrogate encodes to an invalid byte sequence). Back up one code
unit when the cut lands on a high surrogate. Added regression test
that constructs the boundary case (1023 'a' + 🚀 + padding) and
asserts the truncated string is valid UTF-16.

[Suggestion] toolHookTriggers.ts:133/240/319 — switched `||` to `??`
in the 3 hookError sentinel sites. `||` treats empty string as falsy
so a runner returning `{ error: { message: "" } }` triggered the
sentinel instead of preserving the (unhelpful but distinct) empty
message — a runner contract violation that's worth distinguishing
from a missing-message case. `??` synthesizes only when the message
is truly absent (undefined / null).

Tests: 263/263 across affected files (coreToolScheduler 162 +
session-tracing 54 + toolHookTriggers 47). `tsc --noEmit` clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Follow-up commit 2c268a809 — wenshao /review round-8

All 3 findings adopted (1 Critical refines the previous SF-H2 fix, 2 Suggestions correctness-tighten the round-7 changes):

[Critical] coreToolScheduler.ts:2407 — the c.status === 'executing' guard on the prelude-throw catch missed calls in scheduled state (where prelude throws actually happen — before the scheduled→executing transition at line 2522), so the call stayed in scheduled forever, exactly the stall SF-H2 was meant to prevent. Dropped the guard; setStatusInternal already no-ops on terminal states so the unconditional call covers both prelude (scheduled) and body (executing) throw paths. Added regression test that makes getMessageBus throw and asserts onAllToolCallsComplete fires with status === 'error'.

[Suggestion] session-tracing.ts:222truncateSpanError used slice(0, 1024) on UTF-16 code units, splitting surrogate pairs when 🚀/CJK lands on the boundary. The lone high surrogate that results encodes to invalid UTF-8, which strict OTLP/gRPC collectors reject. Back up one code unit when the cut lands on a high surrogate (0xD800-0xDBFF). Added regression test with 🚀 (U+1F680) on the boundary asserting valid UTF-16 output.

[Suggestion] toolHookTriggers.ts:133/240/319 — switched || to ?? in the 3 hookError sentinel sites. A runner returning { error: { message: "" } } is unhelpful but distinct from { error: undefined }; preserve the empty string instead of overwriting with the sentinel.

Verification

  • 263/263 tests pass across coreToolScheduler.test.ts (162) + session-tracing.test.ts (54) + toolHookTriggers.test.ts (47)
  • tsc --noEmit clean
  • ESLint clean on changed files

🤖 Generated with Qwen Code

Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/toolHookTriggers.ts Outdated
Comment thread packages/core/src/telemetry/session-tracing.test.ts Outdated
[Critical] coreToolScheduler.ts — `handleConfirmationResponse`'s catch
was misattributing sister-tool prelude throws to the confirmed tool's
span. The catch wrapped `_handleConfirmationResponseInner`, which
called `attemptExecutionOfScheduledCalls` at its tail. If the user
proceeds tool A with ProceedAlways, `autoApproveCompatiblePendingTools`
transitions sister tools B/C to `scheduled`, and B has a prelude
throw, the SF-H2 catch in `executeSingleToolCall` re-throws → the
throw propagates up through `attemptExecutionOfScheduledCalls` → into
the outer catch keyed on A.callId, where `setToolSpanFailure(A.span,
TOOL_EXCEPTION, B.error.message)` corrupts A's span and
`finalizeToolSpan(A.callId)` ends A's span prematurely. A's actual
result later disappears from telemetry. Fix: move
`attemptExecutionOfScheduledCalls` out of
`_handleConfirmationResponseInner` and into
`handleConfirmationResponse` after the try/catch. The catch now
covers only confirmation logic; each tool's
`executeSingleToolCall` already handles its own span lifecycle via
its own catch.

[Suggestion] toolHookTriggers.ts — reverted the round-8 `??` change
back to `||`. Downstream consumers in coreToolScheduler.ts gate on
`r.hookError ? ...`, so an empty-string `hookError` preserved by
`??` was silently dropped — the change defeated its own stated
intent. Empty-string runner error messages carry no operator value;
the sentinel ("hook runner returned ... without error detail") is
more actionable, and `||` matches existing downstream truthiness
semantics.

[Suggestion] session-tracing.test.ts — replaced the vacuous
`Buffer.from(truncated, 'utf16le')` assertion (which never throws
because Node's Buffer copies raw 16-bit code units without validating
surrogate pairs) with the suggested regex
`/[\uD800-\uDBFF](?![\uDC00-\uDFFF])/` that actually checks for
orphan high surrogates anywhere in the string.

Tests: 263/263 across affected files (coreToolScheduler 162 +
session-tracing 54 + toolHookTriggers 47). `tsc --noEmit` clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Follow-up commit a1d1190bb — wenshao /review round-9

All 3 findings adopted (1 Critical fixing a now-live bug that became reachable after SF-H2's prelude re-throw, 2 Suggestions correcting round-8 mis-steps):

[Critical] handleConfirmationResponse catch was misattributing sister-tool prelude throws to the confirmed tool's span. The catch wrapped _handleConfirmationResponseInner, which called attemptExecutionOfScheduledCalls at its tail. After SF-H2 added the prelude re-throw in executeSingleToolCall, a sister tool B's prelude throw (via autoApproveCompatiblePendingTools then exec) would propagate up to the outer catch keyed on tool A's callId — corrupting A's span with B's error message and ending A's span prematurely. Moved attemptExecutionOfScheduledCalls out of _handleConfirmationResponseInner and into handleConfirmationResponse AFTER the try/catch. The catch now only covers confirmation logic; each tool's own executeSingleToolCall catch handles its span lifecycle for exec failures.

[Suggestion] Reverted the round-8 ?? change back to || in 3 hookError sentinel sites. Downstream consumers gate on r.hookError ? ... truthiness, so empty-string hookError preserved by ?? was silently dropped — defeating the round-8 intent. Empty-string runner messages carry no operator value; the sentinel is more actionable.

[Suggestion] Replaced the vacuous Buffer.from(truncated, 'utf16le') assertion in session-tracing.test.ts (Node's Buffer copies raw 16-bit code units without validating surrogate pairs, so it never throws for any string) with the suggested regex /[\uD800-\uDBFF](?![\uDC00-\uDFFF])/ which actually checks for orphan high surrogates anywhere in the string.

Verification

  • 263/263 tests pass across coreToolScheduler.test.ts (162) + session-tracing.test.ts (54) + toolHookTriggers.test.ts (47)
  • tsc --noEmit clean
  • ESLint clean on changed files

🤖 Generated with Qwen Code

Comment thread packages/core/src/core/toolHookTriggers.test.ts
…#4321

[Suggestion] gpt-5.5 review-10: the round-9 `??` → `||` revert was
correct, but the existing tests only covered the missing-error case
(`success: false` with no `error` field). A future regression back to
`??` would still pass those tests while reintroducing the silent-drop
behavior the revert was guarding against.

Add 3 explicit tests — one per fire helper (PreToolUse, PostToolUse,
PostToolUseFailure) — that pass `{ error: { message: '' } }` and
assert the sentinel hookError is synthesized (not the empty string).
Pins the `||` semantics so any future `??` change fails the suite.

Tests: 50/50 in toolHookTriggers.test.ts (47 → 50). `tsc --noEmit`
clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)

@pomelo-nwu pomelo-nwu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed the full diff and cross-checked against the existing review threads (Copilot + wenshao). No unresolved critical issues from my side:

  • Both prior [Critical] findings are addressed — the TTL sweep now stamps sentinel attrs (ttl_expired / duration_ms / decision / source) and logs on stale spans; the ModifyWithEditor no-editor path is no worse than pre-PR behavior (kept in awaiting_approval + log + span attr + 30-min TTL safety net).
  • Spot-checked the highest-risk areas — the tool-span lifecycle move (validating → awaiting_approval → executing), the prelude-throw path (covered by the new injected-throw test), abort-listener cleanup, and the handleConfirmationResponse refactor — none change tool-execution control flow or leak spans.

Remaining items are non-blocking suggestions only. LGTM 👍

中文

已通读完整 diff,并与现有 review(Copilot + wenshao)做了交叉核对。从我这边看没有未解决的 critical 问题

  • 此前两个 [Critical] 都已落地 —— TTL 清扫现在会为 stale span 打上 sentinel 属性(ttl_expired / duration_ms / decision / source)并记日志;ModifyWithEditor 无编辑器路径不比 PR 之前更差(保持 awaiting_approval + 日志 + span 属性 + 30 分钟 TTL 兜底)。
  • 抽查了最高风险处 —— tool span 生命周期上移(validating → awaiting_approval → executing)、prelude 抛错路径(已被新增的注入抛错测试覆盖)、abort listener 清理、handleConfirmationResponse 重构 —— 均不改变工具执行控制流,也不泄漏 span。

剩余仅为非阻塞的 suggestion。认可合并 👍

@doudouOUC doudouOUC requested review from wenshao and yiliang114 May 21, 2026 03:36

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

Test coverage suggestions (cannot map to specific diff lines):

  1. Sister-tool prelude throw — The design comment at coreToolScheduler.ts:2045 explicitly states attemptExecutionOfScheduledCalls runs outside the catch to prevent a sister tool's prelude throw from corrupting the confirmed tool's span. No test validates this invariant. Suggested: schedule 2 tools, approve A, make B's prelude throw, assert A's span keeps OK status.

  2. All-invalid batch listener cleanupbatchState.callIds.size === 0 at coreToolScheduler.ts:1963 strips the abort listener when every tool fails pre-validation. No test exercises this path. In daemon sessions with many all-invalid batches, untested listener cleanup could cause MaxListenersExceededWarning.

— qwen-latest-series-invite-beta-v34 via Qwen Code /review

let end = SPAN_ERROR_MAX_CHARS;
const code = s.charCodeAt(end - 1);
if (code >= 0xd800 && code <= 0xdbff) end--;
return s.slice(0, end) + '…[truncated]';

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] truncateSpanError output exceeds its own SPAN_ERROR_MAX_CHARS (1024) cap. The sentinel '…[truncated]' is 12 code units, so a 2000-char input produces 1036-char output (1024 + 12). Operators reading SPAN_ERROR_MAX_CHARS = 1024 expect output <= 1024 chars; if a backend enforces a 1024-byte attribute budget, this "safety" truncation still drops the span.

Suggested change
return s.slice(0, end) + '…[truncated]';
const TRUNCATE_SENTINEL = '…[truncated]';
let end = SPAN_ERROR_MAX_CHARS - TRUNCATE_SENTINEL.length;
const code = s.charCodeAt(end - 1);
if (code >= 0xd800 && code <= 0xdbff) end--;
return s.slice(0, end) + TRUNCATE_SENTINEL;

Also add expect(truncated.length).toBeLessThanOrEqual(1024) to the existing test.

— qwen-latest-series-invite-beta-v34 via Qwen Code /review

`PreToolUse hook error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`,
);
return { shouldProceed: true };
const message = error instanceof Error ? error.message : String(error);

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] Catch blocks construct hookError as error instanceof Error ? error.message : String(error) without the empty-string guard that the runner-contract-violation paths already apply. If a hook transport throws new Error(''), hookError is ''; downstream r.hookError ? ... (truthiness) silently drops it, and the span records success: true — the exact allow-without-telemetry pathology the || sentinel on the !response.success paths was designed to close.

Same issue at lines 277 (firePostToolUseHook catch) and 356 (firePostToolUseFailureHook catch).

Suggested change
const message = error instanceof Error ? error.message : String(error);
const message =
(error instanceof Error ? error.message : String(error)) ||
'hook threw with empty message';

— qwen-latest-series-invite-beta-v34 via Qwen Code /review

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM — all critical findings from prior rounds are addressed with regression tests. The remaining two suggestions (sentinel-length overshoot in truncateSpanError, catch-block hookError empty-string edge case) are valid but non-blocking — can land as a follow-up.

Solid work on the span lifecycle move and the exhaustive terminal-path coverage. Ship it.

@doudouOUC doudouOUC dismissed wenshao’s stale review May 21, 2026 03:55

All concerns raised in this review have been addressed in subsequent commits. Dismissing as the feedback is no longer applicable to the current code.

@doudouOUC doudouOUC merged commit b58fe19 into main May 21, 2026
21 of 22 checks passed
@doudouOUC doudouOUC deleted the feat/telemetry-phase-2-spans branch May 21, 2026 05:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants