@zhixuan92/multi-model-agent-core 4.0.1 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/README.md +18 -6
  2. package/dist/bounded-execution/activity-tracker-types.d.ts +2 -2
  3. package/dist/bounded-execution/activity-tracker-types.d.ts.map +1 -1
  4. package/dist/bounded-execution/activity-tracker.d.ts +3 -3
  5. package/dist/bounded-execution/activity-tracker.d.ts.map +1 -1
  6. package/dist/bounded-execution/activity-tracker.js +15 -15
  7. package/dist/bounded-execution/activity-tracker.js.map +1 -1
  8. package/dist/config/model-profile-registry.d.ts +0 -10
  9. package/dist/config/model-profile-registry.d.ts.map +1 -1
  10. package/dist/config/model-profile-registry.js +126 -8
  11. package/dist/config/model-profile-registry.js.map +1 -1
  12. package/dist/config/schema.d.ts +0 -1
  13. package/dist/config/schema.d.ts.map +1 -1
  14. package/dist/config/schema.js +3 -1
  15. package/dist/config/schema.js.map +1 -1
  16. package/dist/escalation/delegate-with-escalation.d.ts +24 -0
  17. package/dist/escalation/delegate-with-escalation.d.ts.map +1 -1
  18. package/dist/escalation/delegate-with-escalation.js +5 -0
  19. package/dist/escalation/delegate-with-escalation.js.map +1 -1
  20. package/dist/escalation/fallback-types.d.ts +1 -1
  21. package/dist/escalation/fallback-types.d.ts.map +1 -1
  22. package/dist/escalation/fallback.js +2 -2
  23. package/dist/escalation/fallback.js.map +1 -1
  24. package/dist/events/cloud-events.d.ts +3 -4
  25. package/dist/events/cloud-events.d.ts.map +1 -1
  26. package/dist/events/cloud-events.js +0 -1
  27. package/dist/events/cloud-events.js.map +1 -1
  28. package/dist/events/event-builder.d.ts +4 -2
  29. package/dist/events/event-builder.d.ts.map +1 -1
  30. package/dist/events/event-builder.js +47 -45
  31. package/dist/events/event-builder.js.map +1 -1
  32. package/dist/events/observability-events.d.ts +7 -8
  33. package/dist/events/observability-events.d.ts.map +1 -1
  34. package/dist/events/running-headline-sink.d.ts +26 -0
  35. package/dist/events/running-headline-sink.d.ts.map +1 -0
  36. package/dist/events/running-headline-sink.js +116 -0
  37. package/dist/events/running-headline-sink.js.map +1 -0
  38. package/dist/events/telemetry-types.d.ts +20 -20
  39. package/dist/events/telemetry-types.js +8 -8
  40. package/dist/events/telemetry-types.js.map +1 -1
  41. package/dist/events/verbose-log-channel.d.ts +22 -2
  42. package/dist/events/verbose-log-channel.d.ts.map +1 -1
  43. package/dist/events/verbose-log-channel.js +46 -9
  44. package/dist/events/verbose-log-channel.js.map +1 -1
  45. package/dist/index.d.ts +4 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +4 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/intake/brief-compiler-slots/delegate.d.ts +1 -0
  50. package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -1
  51. package/dist/intake/brief-compiler-slots/delegate.js +10 -2
  52. package/dist/intake/brief-compiler-slots/delegate.js.map +1 -1
  53. package/dist/lifecycle/executor-output-types.d.ts +2 -2
  54. package/dist/lifecycle/executor-output-types.d.ts.map +1 -1
  55. package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -1
  56. package/dist/lifecycle/handlers/baseline-handlers.js +48 -1
  57. package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -1
  58. package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +1 -1
  59. package/dist/lifecycle/handlers/quality-chain-handlers.js +126 -6
  60. package/dist/lifecycle/handlers/quality-chain-handlers.js.map +1 -1
  61. package/dist/lifecycle/handlers/review-diff-handler.d.ts.map +1 -1
  62. package/dist/lifecycle/handlers/review-diff-handler.js +36 -1
  63. package/dist/lifecycle/handlers/review-diff-handler.js.map +1 -1
  64. package/dist/lifecycle/handlers/run-verify-command-handler.js +11 -2
  65. package/dist/lifecycle/handlers/run-verify-command-handler.js.map +1 -1
  66. package/dist/lifecycle/handlers/spec-chain-handlers.d.ts.map +1 -1
  67. package/dist/lifecycle/handlers/spec-chain-handlers.js +107 -6
  68. package/dist/lifecycle/handlers/spec-chain-handlers.js.map +1 -1
  69. package/dist/lifecycle/handlers/terminal-handlers.d.ts +8 -0
  70. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
  71. package/dist/lifecycle/handlers/terminal-handlers.js +168 -11
  72. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
  73. package/dist/lifecycle/lifecycle-context.d.ts +0 -2
  74. package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
  75. package/dist/lifecycle/merge-stage-stats.d.ts +31 -0
  76. package/dist/lifecycle/merge-stage-stats.d.ts.map +1 -0
  77. package/dist/lifecycle/merge-stage-stats.js +64 -0
  78. package/dist/lifecycle/merge-stage-stats.js.map +1 -0
  79. package/dist/lifecycle/shared-compute.js +4 -4
  80. package/dist/lifecycle/shared-compute.js.map +1 -1
  81. package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
  82. package/dist/lifecycle/stage-plan-builder.js +6 -0
  83. package/dist/lifecycle/stage-plan-builder.js.map +1 -1
  84. package/dist/lifecycle/stage-plan-types.d.ts +3 -0
  85. package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
  86. package/dist/lifecycle/stage-progression.d.ts +20 -0
  87. package/dist/lifecycle/stage-progression.d.ts.map +1 -0
  88. package/dist/lifecycle/stage-progression.js +165 -0
  89. package/dist/lifecycle/stage-progression.js.map +1 -0
  90. package/dist/lifecycle/task-executor.d.ts.map +1 -1
  91. package/dist/lifecycle/task-executor.js +55 -10
  92. package/dist/lifecycle/task-executor.js.map +1 -1
  93. package/dist/lifecycle/task-runner.d.ts +7 -3
  94. package/dist/lifecycle/task-runner.d.ts.map +1 -1
  95. package/dist/lifecycle/task-runner.js +43 -7
  96. package/dist/lifecycle/task-runner.js.map +1 -1
  97. package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -1
  98. package/dist/providers/anthropic-messages-adapter.js +25 -1
  99. package/dist/providers/anthropic-messages-adapter.js.map +1 -1
  100. package/dist/providers/base/result-builders.d.ts +1 -1
  101. package/dist/providers/base/result-builders.d.ts.map +1 -1
  102. package/dist/providers/base/result-builders.js +4 -4
  103. package/dist/providers/base/result-builders.js.map +1 -1
  104. package/dist/providers/make-runner-shell.d.ts.map +1 -1
  105. package/dist/providers/make-runner-shell.js +6 -5
  106. package/dist/providers/make-runner-shell.js.map +1 -1
  107. package/dist/providers/openai-chat-adapter.d.ts +0 -2
  108. package/dist/providers/openai-chat-adapter.d.ts.map +1 -1
  109. package/dist/providers/openai-chat-adapter.js +2 -3
  110. package/dist/providers/openai-chat-adapter.js.map +1 -1
  111. package/dist/providers/openai-responses-adapter.d.ts +1 -2
  112. package/dist/providers/openai-responses-adapter.d.ts.map +1 -1
  113. package/dist/providers/openai-responses-adapter.js +67 -39
  114. package/dist/providers/openai-responses-adapter.js.map +1 -1
  115. package/dist/providers/provider-factory.d.ts.map +1 -1
  116. package/dist/providers/provider-factory.js +45 -9
  117. package/dist/providers/provider-factory.js.map +1 -1
  118. package/dist/providers/runner-adapter.d.ts +10 -0
  119. package/dist/providers/runner-adapter.d.ts.map +1 -1
  120. package/dist/providers/runner-shell-types.d.ts +33 -0
  121. package/dist/providers/runner-shell-types.d.ts.map +1 -1
  122. package/dist/providers/runner-shell.d.ts +10 -1
  123. package/dist/providers/runner-shell.d.ts.map +1 -1
  124. package/dist/providers/runner-shell.js +251 -18
  125. package/dist/providers/runner-shell.js.map +1 -1
  126. package/dist/providers/runner-types.d.ts +21 -2
  127. package/dist/providers/runner-types.d.ts.map +1 -1
  128. package/dist/providers/tool-name-sets.d.ts +29 -0
  129. package/dist/providers/tool-name-sets.d.ts.map +1 -0
  130. package/dist/providers/tool-name-sets.js +41 -0
  131. package/dist/providers/tool-name-sets.js.map +1 -0
  132. package/dist/reporting/headline-composer.d.ts +12 -0
  133. package/dist/reporting/headline-composer.d.ts.map +1 -1
  134. package/dist/reporting/headline-composer.js.map +1 -1
  135. package/dist/reporting/headline-templates/audit.d.ts.map +1 -1
  136. package/dist/reporting/headline-templates/audit.js +26 -6
  137. package/dist/reporting/headline-templates/audit.js.map +1 -1
  138. package/dist/reporting/headline-templates/delegate.d.ts.map +1 -1
  139. package/dist/reporting/headline-templates/delegate.js +25 -6
  140. package/dist/reporting/headline-templates/delegate.js.map +1 -1
  141. package/dist/reporting/headline-templates/execute-plan.d.ts.map +1 -1
  142. package/dist/reporting/headline-templates/execute-plan.js +4 -1
  143. package/dist/reporting/headline-templates/execute-plan.js.map +1 -1
  144. package/dist/reporting/headline-templates/review.d.ts.map +1 -1
  145. package/dist/reporting/headline-templates/review.js +14 -7
  146. package/dist/reporting/headline-templates/review.js.map +1 -1
  147. package/dist/reporting/headline-text.d.ts +31 -0
  148. package/dist/reporting/headline-text.d.ts.map +1 -0
  149. package/dist/reporting/headline-text.js +42 -0
  150. package/dist/reporting/headline-text.js.map +1 -0
  151. package/dist/reporting/severity.d.ts +40 -0
  152. package/dist/reporting/severity.d.ts.map +1 -0
  153. package/dist/reporting/severity.js +57 -0
  154. package/dist/reporting/severity.js.map +1 -0
  155. package/dist/reporting/structured-report.d.ts +3 -3
  156. package/dist/research/explore-orchestrator.d.ts.map +1 -1
  157. package/dist/research/explore-orchestrator.js +4 -5
  158. package/dist/research/explore-orchestrator.js.map +1 -1
  159. package/dist/review/annotator-engine.d.ts +8 -0
  160. package/dist/review/annotator-engine.d.ts.map +1 -1
  161. package/dist/review/annotator-engine.js +7 -1
  162. package/dist/review/annotator-engine.js.map +1 -1
  163. package/dist/review/review-types.d.ts +6 -2
  164. package/dist/review/review-types.d.ts.map +1 -1
  165. package/dist/review/reviewer-engine.d.ts +11 -0
  166. package/dist/review/reviewer-engine.d.ts.map +1 -1
  167. package/dist/review/reviewer-engine.js +18 -1
  168. package/dist/review/reviewer-engine.js.map +1 -1
  169. package/dist/review/reviewer-output-parser.d.ts.map +1 -1
  170. package/dist/review/reviewer-output-parser.js +27 -5
  171. package/dist/review/reviewer-output-parser.js.map +1 -1
  172. package/dist/stores/batch-registry.d.ts +18 -0
  173. package/dist/stores/batch-registry.d.ts.map +1 -1
  174. package/dist/stores/batch-registry.js +10 -0
  175. package/dist/stores/batch-registry.js.map +1 -1
  176. package/dist/stores/context-block-tool.d.ts +14 -0
  177. package/dist/stores/context-block-tool.d.ts.map +1 -1
  178. package/dist/stores/context-block-tool.js.map +1 -1
  179. package/dist/stores/file-backed-context-block-store.d.ts +63 -0
  180. package/dist/stores/file-backed-context-block-store.d.ts.map +1 -0
  181. package/dist/stores/file-backed-context-block-store.js +293 -0
  182. package/dist/stores/file-backed-context-block-store.js.map +1 -0
  183. package/dist/stores/project-context-registry.d.ts +16 -3
  184. package/dist/stores/project-context-registry.d.ts.map +1 -1
  185. package/dist/stores/project-context-registry.js +9 -2
  186. package/dist/stores/project-context-registry.js.map +1 -1
  187. package/dist/tools/audit/schema.d.ts +2 -2
  188. package/dist/tools/retry/tool-config.js +1 -1
  189. package/dist/tools/retry/tool-config.js.map +1 -1
  190. package/dist/tools/review/schema.d.ts +1 -1
  191. package/dist/types/enums.d.ts +10 -10
  192. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"provider-factory.d.ts","sourceRoot":"","sources":["../../src/providers/provider-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAa,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAOpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWzD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAG7E;AAED,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,IAAI,CAGxF;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE;IACxC,IAAI,EAAE,mBAAmB,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,aAAa,CA+BhB;AAQD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,QAAQ,CA4ElF"}
1
+ {"version":3,"file":"provider-factory.d.ts","sourceRoot":"","sources":["../../src/providers/provider-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAa,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAOpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAYzD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAG7E;AAED,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,IAAI,CAGxF;AAcD,wBAAgB,YAAY,CAAC,WAAW,EAAE;IACxC,IAAI,EAAE,mBAAmB,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,aAAa,CA4ChB;AAQD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,QAAQ,CAuFlF"}
@@ -3,6 +3,7 @@ import { AnthropicMessagesAdapter } from './anthropic-messages-adapter.js';
3
3
  import { OpenAIChatAdapter } from './openai-chat-adapter.js';
4
4
  import { OpenAIResponsesAdapter } from './openai-responses-adapter.js';
5
5
  import { makeToolDefinitions } from './tool-definitions.js';
6
+ import { getCodexAuth } from '../identity/auth-token-store.js';
6
7
  let coreTestProviderOverride = null;
7
8
  let coreTestProviderOverrideMap = null;
8
9
  function assertTestProviderEnabled() {
@@ -18,10 +19,20 @@ export function __setCoreTestProviderOverrideMap(map) {
18
19
  assertTestProviderEnabled();
19
20
  coreTestProviderOverrideMap = map;
20
21
  }
22
+ // No output-token caps anywhere — the only worker bounds are the
23
+ // task-level wall-clock deadline and (when set) the per-task cost
24
+ // ceiling. OpenAI Chat + Responses adapters omit max_tokens entirely
25
+ // so the model uses its full output budget. Anthropic Messages
26
+ // **requires** max_tokens per API spec, so we pass a value high
27
+ // enough to never bite in practice (matches the largest documented
28
+ // ceiling across the Claude family). If a model accepts less, the
29
+ // API rejects loudly — easier to triage than a silent truncation,
30
+ // which is the failure mode 4.0.x hit at the 4096 default when
31
+ // deepseek-v4-pro burned its budget on a thinking block.
32
+ const ANTHROPIC_MAX_TOKENS_REQUIRED = 64000;
21
33
  export function buildAdapter(agentConfig) {
22
34
  const apiKey = agentConfig.apiKey
23
35
  ?? (agentConfig.apiKeyEnv ? process.env[agentConfig.apiKeyEnv] : undefined);
24
- const maxOutputTokens = 4096;
25
36
  switch (agentConfig.type) {
26
37
  case 'claude':
27
38
  case 'claude-compatible':
@@ -29,7 +40,7 @@ export function buildAdapter(agentConfig) {
29
40
  apiKey: apiKey || 'not-needed',
30
41
  baseURL: agentConfig.baseUrl,
31
42
  model: agentConfig.model,
32
- maxOutputTokens,
43
+ maxOutputTokens: ANTHROPIC_MAX_TOKENS_REQUIRED,
33
44
  providerType: agentConfig.type,
34
45
  });
35
46
  case 'openai-compatible':
@@ -37,16 +48,30 @@ export function buildAdapter(agentConfig) {
37
48
  apiKey: apiKey || 'not-needed',
38
49
  baseURL: agentConfig.baseUrl,
39
50
  model: agentConfig.model,
40
- maxOutputTokens,
41
51
  providerType: 'openai-compatible',
42
52
  });
43
- case 'codex':
53
+ case 'codex': {
54
+ // Prefer ChatGPT/Codex OAuth (~/.codex/auth.json) — this is how
55
+ // users who logged in via `codex` CLI authenticate. Without it, the
56
+ // request hits api.openai.com with a placeholder key and 401s. If
57
+ // OAuth is missing, fall back to whatever apiKey the user supplied
58
+ // (so the codex type can also be pointed at api.openai.com with a
59
+ // real key, or any other OpenAI-Responses-compatible endpoint).
60
+ const oauth = getCodexAuth();
61
+ if (oauth && !apiKey && !agentConfig.baseUrl) {
62
+ return new OpenAIResponsesAdapter({
63
+ apiKey: oauth.accessToken,
64
+ baseURL: 'https://chatgpt.com/backend-api/codex',
65
+ model: agentConfig.model,
66
+ defaultHeaders: { 'chatgpt-account-id': oauth.accountId },
67
+ });
68
+ }
44
69
  return new OpenAIResponsesAdapter({
45
70
  apiKey: apiKey || 'not-needed',
46
71
  baseURL: agentConfig.baseUrl,
47
72
  model: agentConfig.model,
48
- maxOutputTokens,
49
73
  });
74
+ }
50
75
  }
51
76
  }
52
77
  const SYSTEM_PROMPT = [
@@ -77,13 +102,20 @@ export function createProvider(slot, config) {
77
102
  ? `${SYSTEM_PROMPT}\n\n${options.instructionsSuffix}`
78
103
  : SYSTEM_PROMPT;
79
104
  const adapter = buildAdapter(agentConfig);
80
- const shell = new RunnerShell(adapter);
105
+ const shell = new RunnerShell(adapter, providerConfig.model);
81
106
  const result = await shell.run({
82
107
  systemPrompt: effectiveSystemPrompt,
83
108
  userMessage: prompt,
84
109
  toolDefinitions,
85
110
  maxTurns,
86
111
  cwd,
112
+ ...(options.abortSignal && { abortSignal: options.abortSignal }),
113
+ ...(options.bus && { bus: options.bus }),
114
+ ...(options.batchId !== undefined && { batchId: options.batchId }),
115
+ ...(options.taskIndex !== undefined && { taskIndex: options.taskIndex }),
116
+ ...(options.tier !== undefined && { tier: options.tier }),
117
+ ...(options.stageLabel !== undefined && { stageLabel: options.stageLabel }),
118
+ model: providerConfig.model,
87
119
  });
88
120
  const toolCallSummaries = result.toolCalls.map(tc => {
89
121
  const inputPreview = typeof tc.input === 'object' && tc.input !== null
@@ -95,15 +127,19 @@ export function createProvider(slot, config) {
95
127
  output: result.finalAssistantText,
96
128
  status: result.workerStatus === 'done' ? 'ok' : 'incomplete',
97
129
  usage: result.usage,
98
- turns: result.toolCalls.length,
99
- filesRead: [],
100
- filesWritten: [],
130
+ turns: result.turns,
131
+ durationMs: result.durationMs,
132
+ filesRead: result.filesRead,
133
+ filesWritten: result.filesWritten,
101
134
  toolCalls: toolCallSummaries,
102
135
  outputIsDiagnostic: false,
103
136
  escalationLog: [],
104
137
  parsedFindings: null,
105
138
  workerStatus: result.workerStatus,
106
139
  errorCode: result.errorCode,
140
+ ...(result.costUSD !== null && {
141
+ cost: { costUSD: result.costUSD, costDeltaVsMainUSD: null },
142
+ }),
107
143
  };
108
144
  }
109
145
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../../src/providers/provider-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../../src/providers/provider-factory.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,16 @@ export interface AdapterTurnResult {
26
26
  usage: TokenUsage;
27
27
  finishReason: 'stop' | 'tool_use' | 'max_tokens' | 'error';
28
28
  errorCode?: string;
29
+ /** Provider-side response shape for verbose diagnostics. Adapters report
30
+ * the raw stop_reason and a count of each content block type so the
31
+ * runner-shell can emit a `runner_response_received` event when the
32
+ * bus is wired. Lets operators see e.g. `{ text: 0, thinking: 1 }`
33
+ * when a provider returns reasoning-only and no narrative — the
34
+ * signature failure mode that produced silent empty output in 4.0.x. */
35
+ responseShape?: {
36
+ stopReason?: string;
37
+ contentBlocks?: Record<string, number>;
38
+ };
29
39
  }
30
40
  export interface AdapterCapabilities {
31
41
  cache_control: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"runner-adapter.d.ts","sourceRoot":"","sources":["../../src/providers/runner-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC9C,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,QAAQ,GAAG,mBAAmB,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC;IACjG,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC3D"}
1
+ {"version":3,"file":"runner-adapter.d.ts","sourceRoot":"","sources":["../../src/providers/runner-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC9C,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;6EAKyE;IACzE,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,QAAQ,GAAG,mBAAmB,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC;IACjG,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC3D"}
@@ -1,4 +1,5 @@
1
1
  import type { TokenUsage } from './runner-types.js';
2
+ import type { EventEmitter } from '../events/event-emitter.js';
2
3
  export type WorkerStatus = 'done' | 'done_with_concerns' | 'needs_context' | 'blocked' | 'failed';
3
4
  export interface RunInput {
4
5
  systemPrompt: string;
@@ -9,6 +10,25 @@ export interface RunInput {
9
10
  capabilities?: import('./runner-adapter.js').AdapterCapabilities;
10
11
  abortSignal?: AbortSignal;
11
12
  deadlineMs?: number;
13
+ /** Bus for per-turn / per-runner-call observability events. When present,
14
+ * shell + adapter emit `runner_turn_started` / `runner_response_received`
15
+ * / `runner_turn_completed` events so VerboseLogChannel surfaces them
16
+ * on stderr in real time during a long task run. */
17
+ bus?: EventEmitter;
18
+ /** Identifies the in-flight batch in emitted events. */
19
+ batchId?: string;
20
+ /** Identifies which task within a batch is running. Carried through to
21
+ * every emitted event so polling can show per-task progress when a
22
+ * batch has multiple parallel tasks. */
23
+ taskIndex?: number;
24
+ /** Tier label (`'standard'` | `'complex'`) included in emitted events. */
25
+ tier?: string;
26
+ /** Provider model id included in emitted events. */
27
+ model?: string;
28
+ /** Lifecycle stage label (e.g. 'Implementing', 'Spec review'). Surfaced
29
+ * on the running-headline polling response so the main agent's poll
30
+ * loop shows which lifecycle stage is currently active. */
31
+ stageLabel?: string;
12
32
  }
13
33
  export interface RunResult {
14
34
  workerStatus: WorkerStatus;
@@ -16,6 +36,19 @@ export interface RunResult {
16
36
  toolCalls: ToolCall[];
17
37
  usage: TokenUsage;
18
38
  errorCode?: ErrorCode;
39
+ /** Number of LLM turns executed (one per adapter.turn() call). Distinct
40
+ * from toolCalls.length — a turn can return multiple tool calls or none. */
41
+ turns: number;
42
+ /** Wall-clock for the entire shell.run() invocation. */
43
+ durationMs: number;
44
+ /** Files read during this run (paths from successful read_file/readFile tool calls). */
45
+ filesRead: string[];
46
+ /** Files written during this run (paths from successful write_file/writeFile/edit_file tool calls). */
47
+ filesWritten: string[];
48
+ /** USD cost computed from usage tokens and the model's rate card.
49
+ * null when the model isn't in the rate-card registry (treated as honest-null
50
+ * by the wire, not zero). */
51
+ costUSD: number | null;
19
52
  }
20
53
  export interface ToolDefinition {
21
54
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"runner-shell-types.d.ts","sourceRoot":"","sources":["../../src/providers/runner-shell-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,oBAAoB,GAAG,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElG,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,CAAC;IACjE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"runner-shell-types.d.ts","sourceRoot":"","sources":["../../src/providers/runner-shell-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,oBAAoB,GAAG,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElG,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,CAAC;IACjE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;yDAGqD;IACrD,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;6CAEyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;gEAE4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;iFAC6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uGAAuG;IACvG,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;;kCAE8B;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC"}
@@ -1,8 +1,17 @@
1
1
  import type { RunInput, RunResult } from './runner-shell-types.js';
2
2
  import type { RunnerAdapter } from './runner-adapter.js';
3
+ export declare function shellCommandWritesFs(command: string): boolean;
3
4
  export declare class RunnerShell {
4
5
  private adapter;
5
- constructor(adapter: RunnerAdapter);
6
+ /** Default model id used for cost computation when input.model is absent.
7
+ * Reviewer/annotator engines call shell.run() without setting input.model,
8
+ * so without this default every reviewer-side stage would record costUSD=null. */
9
+ private defaultModel?;
10
+ constructor(adapter: RunnerAdapter,
11
+ /** Default model id used for cost computation when input.model is absent.
12
+ * Reviewer/annotator engines call shell.run() without setting input.model,
13
+ * so without this default every reviewer-side stage would record costUSD=null. */
14
+ defaultModel?: string | undefined);
6
15
  run(input: RunInput): Promise<RunResult>;
7
16
  }
8
17
  //# sourceMappingURL=runner-shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner-shell.d.ts","sourceRoot":"","sources":["../../src/providers/runner-shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA8B,MAAM,yBAAyB,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAA6D,MAAM,qBAAqB,CAAC;AAMpH,qBAAa,WAAW;IACV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAEpC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CA0E/C"}
1
+ {"version":3,"file":"runner-shell.d.ts","sourceRoot":"","sources":["../../src/providers/runner-shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA8B,MAAM,yBAAyB,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAA6D,MAAM,qBAAqB,CAAC;AAoEpH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM7D;AAaD,qBAAa,WAAW;IAEpB,OAAO,CAAC,OAAO;IACf;;uFAEmF;IACnF,OAAO,CAAC,YAAY,CAAC;gBAJb,OAAO,EAAE,aAAa;IAC9B;;uFAEmF;IAC3E,YAAY,CAAC,EAAE,MAAM,YAAA;IAGzB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CAqN/C"}
@@ -1,18 +1,123 @@
1
+ import { resolveRateCard, priceTokens } from '../bounded-execution/cost-compute.js';
1
2
  const DEFAULT_CAPABILITIES = {
2
3
  cache_control: false, thinking: false, vision: false, tool_use: true, streaming: false, other: [],
3
4
  };
5
+ // Tool-name sets are centralized in `tool-name-sets.ts` so the
6
+ // runner-shell + running-headline-sink can't drift. Note: this
7
+ // runner's READ list is intentionally narrower than the central
8
+ // READ_TOOL_NAMES — runner-shell tracks filesRead by extractable
9
+ // path, and grep/glob/listFiles don't have a single "file" arg. The
10
+ // central set is for the polling headline's read activity counter,
11
+ // which counts every read-class tool call regardless of args.
12
+ import { WRITE_TOOL_NAMES, SHELL_TOOL_NAMES } from './tool-name-sets.js';
13
+ const READ_TOOL_NAMES = new Set(['readFile', 'read_file']);
14
+ function extractPathFromToolInput(input) {
15
+ if (typeof input !== 'object' || input === null)
16
+ return undefined;
17
+ const obj = input;
18
+ for (const key of ['path', 'file_path', 'filePath']) {
19
+ const v = obj[key];
20
+ if (typeof v === 'string')
21
+ return v;
22
+ }
23
+ return undefined;
24
+ }
25
+ /**
26
+ * Heuristic: does the given shell command write to the filesystem?
27
+ *
28
+ * Gap 11 fix (4.0.3+): the polling headline tracks file writes by tool
29
+ * name (writeFile/write_file/edit_file). Workers that bypass these and
30
+ * write via run_shell (cat >, sed -i, tee, etc.) used to show "0 write"
31
+ * for the entire run despite actively producing artifacts. This
32
+ * heuristic looks for common write patterns in the command string;
33
+ * false positives are acceptable (operator gets a slightly noisy count)
34
+ * but false negatives are not (the headline lies about progress).
35
+ *
36
+ * Patterns detected:
37
+ * - Output redirects: `> file`, `>> file`, `&> file`, `>| file`
38
+ * - Heredoc to file: `<<EOF > file`, `cat <<...> file`
39
+ * - `sed -i` / `sed -i ''` (in-place edit)
40
+ * - `awk -i inplace` / `gawk -i inplace`
41
+ * - `tee file`, `tee -a file`
42
+ * - `cp/mv/touch/install` (file creation/moves)
43
+ * - `mkdir`, `rm`, `chmod`, `chown` (filesystem mutation)
44
+ * - `git checkout/reset/restore/pull/merge` (modifies files)
45
+ * - `python/node -c '... open(... "w") ...'` is NOT detected — too
46
+ * ambiguous; keeps false-positive rate low.
47
+ */
48
+ const SHELL_WRITE_PATTERNS = [
49
+ /[^&|>]>>?\s*[^&|>\s]/, // > file or >> file (excluding 2>&1, &> handled below)
50
+ /&>\s*[^&|>\s]/, // &> file
51
+ />\|\s*[^&|>\s]/, // >| file
52
+ /\bsed\s+(?:-[a-z]*i[a-z]*\b|--in-place\b)/i, // sed -i / sed --in-place
53
+ /\b(?:awk|gawk|nawk)\s+-i\s+inplace\b/i,
54
+ /\btee\b/,
55
+ /\b(?:cp|mv|touch|install|ln)\s+/,
56
+ /\bmkdir\s+/,
57
+ /\brm\s+/,
58
+ /\bchmod\s+/,
59
+ /\bchown\s+/,
60
+ /\bgit\s+(?:checkout|reset|restore|pull|merge|clean|stash|cherry-pick|rebase|apply)\b/,
61
+ /\bnpm\s+(?:install|i|ci|uninstall|update|run\s+build|run\s+test)\b/,
62
+ /\bpnpm\s+(?:install|add|remove|update|run)\b/,
63
+ /\byarn\s+(?:install|add|remove|upgrade)\b/,
64
+ ];
65
+ export function shellCommandWritesFs(command) {
66
+ if (!command || command.length === 0)
67
+ return false;
68
+ for (const pattern of SHELL_WRITE_PATTERNS) {
69
+ if (pattern.test(command))
70
+ return true;
71
+ }
72
+ return false;
73
+ }
74
+ function extractShellCommand(input) {
75
+ if (typeof input !== 'object' || input === null)
76
+ return undefined;
77
+ const obj = input;
78
+ for (const key of ['command', 'cmd', 'shell']) {
79
+ const v = obj[key];
80
+ if (typeof v === 'string')
81
+ return v;
82
+ if (Array.isArray(v))
83
+ return v.join(' ');
84
+ }
85
+ return undefined;
86
+ }
4
87
  export class RunnerShell {
5
88
  adapter;
6
- constructor(adapter) {
89
+ defaultModel;
90
+ constructor(adapter,
91
+ /** Default model id used for cost computation when input.model is absent.
92
+ * Reviewer/annotator engines call shell.run() without setting input.model,
93
+ * so without this default every reviewer-side stage would record costUSD=null. */
94
+ defaultModel) {
7
95
  this.adapter = adapter;
96
+ this.defaultModel = defaultModel;
8
97
  }
9
98
  async run(input) {
99
+ const startMs = Date.now();
100
+ const modelForCost = input.model ?? this.defaultModel;
10
101
  const ctx = { cwd: input.cwd, callCache: new Map() };
11
102
  const usage = { inputTokens: 0, outputTokens: 0, cachedReadTokens: 0, cachedNonReadTokens: 0 };
12
103
  const allToolCalls = [];
104
+ const filesRead = [];
105
+ const filesWritten = [];
106
+ let turns = 0;
13
107
  const history = [];
14
108
  let finalText = '';
15
109
  let stoppedByAdapter = false;
110
+ // Common fields stamped on every emitted bus event so VerboseLogChannel
111
+ // surfaces enough context for an operator to see which run a line belongs
112
+ // to without grepping back to the originating request.
113
+ const baseEventFields = {
114
+ ...(input.batchId !== undefined && { batchId: input.batchId }),
115
+ ...(input.taskIndex !== undefined && { taskIndex: input.taskIndex }),
116
+ ...(input.tier !== undefined && { tier: input.tier }),
117
+ ...(input.model !== undefined && { model: input.model }),
118
+ ...(input.stageLabel !== undefined && { stageLabel: input.stageLabel }),
119
+ providerType: this.adapter.providerType,
120
+ };
16
121
  for (let turn = 0; turn < input.maxTurns; turn++) {
17
122
  if (input.abortSignal?.aborted) {
18
123
  return {
@@ -21,8 +126,28 @@ export class RunnerShell {
21
126
  toolCalls: allToolCalls,
22
127
  usage,
23
128
  errorCode: 'aborted',
129
+ turns,
130
+ durationMs: Date.now() - startMs,
131
+ filesRead,
132
+ filesWritten,
133
+ costUSD: computeCost(modelForCost, usage),
24
134
  };
25
135
  }
136
+ // Three-event-per-turn lifecycle so verbose stderr surfaces every
137
+ // state change. `runner_turn_started` fires before the LLM call so
138
+ // operators see "now waiting on the model" in real time. After the
139
+ // adapter returns, `runner_response_received` carries the raw
140
+ // provider response shape (stop_reason + content-block tally). After
141
+ // local tool execution, `runner_turn_completed` carries per-tool
142
+ // counts (read vs write etc.) so operators can see what work the
143
+ // model is doing without grepping the JSONL log.
144
+ input.bus?.emit({
145
+ event: 'runner_turn_started',
146
+ ts: new Date().toISOString(),
147
+ ...baseEventFields,
148
+ turnIndex: turn,
149
+ });
150
+ turns++;
26
151
  const turnResult = await this.adapter.turn({
27
152
  systemPrompt: input.systemPrompt,
28
153
  userMessage: input.userMessage,
@@ -37,34 +162,131 @@ export class RunnerShell {
37
162
  usage.cachedReadTokens += turnResult.usage.cachedReadTokens;
38
163
  usage.cachedNonReadTokens += turnResult.usage.cachedNonReadTokens;
39
164
  finalText = turnResult.assistantText;
165
+ input.bus?.emit({
166
+ event: 'runner_response_received',
167
+ ts: new Date().toISOString(),
168
+ ...baseEventFields,
169
+ turnIndex: turn,
170
+ finishReason: turnResult.finishReason,
171
+ assistantTextLen: turnResult.assistantText.length,
172
+ toolCallCount: turnResult.toolCalls.length,
173
+ ...(turnResult.responseShape?.stopReason !== undefined && { stopReason: turnResult.responseShape.stopReason }),
174
+ ...(turnResult.responseShape?.contentBlocks !== undefined && { contentBlocks: turnResult.responseShape.contentBlocks }),
175
+ usage: turnResult.usage,
176
+ });
40
177
  const turnRecord = {
41
178
  assistantText: turnResult.assistantText,
42
179
  toolCalls: [],
43
180
  };
44
- if (turnResult.toolCalls.length === 0) {
181
+ const willTerminate = turnResult.toolCalls.length === 0;
182
+ if (willTerminate) {
45
183
  history.push(turnRecord);
46
184
  stoppedByAdapter = true;
47
- break;
48
185
  }
49
- for (const call of turnResult.toolCalls) {
50
- const def = input.toolDefinitions.find(d => d.name === call.name);
51
- let result;
52
- if (!def) {
53
- result = { error: `unknown tool: ${call.name}` };
54
- }
55
- else {
56
- try {
57
- result = await def.execute(call.input, ctx);
186
+ else {
187
+ for (const call of turnResult.toolCalls) {
188
+ const def = input.toolDefinitions.find(d => d.name === call.name);
189
+ let result;
190
+ if (!def) {
191
+ result = { error: `unknown tool: ${call.name}` };
192
+ }
193
+ else {
194
+ try {
195
+ result = await def.execute(call.input, ctx);
196
+ }
197
+ catch (err) {
198
+ result = { error: `tool execution failed: ${err instanceof Error ? err.message : String(err)}` };
199
+ }
58
200
  }
59
- catch (err) {
60
- result = { error: `tool execution failed: ${err instanceof Error ? err.message : String(err)}` };
201
+ const enriched = { name: call.name, input: call.input, result };
202
+ allToolCalls.push(enriched);
203
+ turnRecord.toolCalls.push(enriched);
204
+ // Track file ops so the wire telemetry's filesReadCount /
205
+ // filesWrittenCount aren't perpetually 0. Only count successful
206
+ // calls (a tool that threw produced { error: ... } as result).
207
+ const succeeded = !(typeof result === 'object' && result !== null && 'error' in result);
208
+ if (succeeded) {
209
+ const path = extractPathFromToolInput(call.input);
210
+ if (READ_TOOL_NAMES.has(call.name) && path)
211
+ filesRead.push(path);
212
+ else if (WRITE_TOOL_NAMES.has(call.name) && path)
213
+ filesWritten.push(path);
214
+ else if (SHELL_TOOL_NAMES.has(call.name)) {
215
+ // Gap 11 fix (4.0.3+): workers writing via run_shell
216
+ // (cat >, sed -i, tee, etc.) used to show "0 write" in
217
+ // polling for the entire run despite actively producing
218
+ // artifacts. Detect common write patterns in the command
219
+ // arg and attribute as a synthetic write entry tagged
220
+ // `shell:` so callers can distinguish it from explicit
221
+ // write_file calls. False positives acceptable; false
222
+ // negatives are not — the headline must reflect reality.
223
+ const command = extractShellCommand(call.input);
224
+ if (command && shellCommandWritesFs(command)) {
225
+ filesWritten.push(`shell:${command.slice(0, 80)}`);
226
+ }
227
+ }
61
228
  }
62
229
  }
63
- const enriched = { name: call.name, input: call.input, result };
64
- allToolCalls.push(enriched);
65
- turnRecord.toolCalls.push(enriched);
230
+ history.push(turnRecord);
231
+ }
232
+ // Per-tool counts for THIS turn so operators see "5 readFile, 1 grep"
233
+ // instead of the bare "tool_call_count=6". The user can immediately
234
+ // tell read vs write activity without inspecting the JSONL log.
235
+ const toolCallsByName = {};
236
+ // Gap 11 (4.0.3+): also count shell calls that wrote to the
237
+ // filesystem so the headline reflects worker-produced artifacts
238
+ // even when the worker bypassed write_file/edit_file.
239
+ let shellWritesThisTurn = 0;
240
+ for (const tc of turnResult.toolCalls) {
241
+ toolCallsByName[tc.name] = (toolCallsByName[tc.name] ?? 0) + 1;
242
+ if (SHELL_TOOL_NAMES.has(tc.name)) {
243
+ const cmd = extractShellCommand(tc.input);
244
+ if (cmd && shellCommandWritesFs(cmd))
245
+ shellWritesThisTurn += 1;
246
+ }
66
247
  }
67
- history.push(turnRecord);
248
+ input.bus?.emit({
249
+ event: 'runner_turn_completed',
250
+ ts: new Date().toISOString(),
251
+ ...baseEventFields,
252
+ turnIndex: turn,
253
+ terminated: willTerminate,
254
+ toolCallCount: turnResult.toolCalls.length,
255
+ ...(turnResult.toolCalls.length > 0 && { toolCalls: toolCallsByName }),
256
+ ...(shellWritesThisTurn > 0 && { shellWrites: shellWritesThisTurn }),
257
+ });
258
+ if (willTerminate)
259
+ break;
260
+ }
261
+ // Empty-output regression guard (4.0.3). The 4.0.x runner-shell
262
+ // unconditionally reported `workerStatus: 'done'` whenever the adapter
263
+ // returned no tool calls — even when assistantText was empty. Combined
264
+ // with the anthropic-messages adapter's text-only extraction, a
265
+ // reasoning model that emitted thinking blocks with no text block (or
266
+ // any provider that returned end_turn with empty content) silently
267
+ // produced an "ok" RunResult carrying `output: ''`. The reviewer
268
+ // engine then approved that empty output and the audit/delegate
269
+ // looked successful while emitting nothing useful.
270
+ //
271
+ // 3.12.7's claude-agent-sdk owned the agent loop and didn't have this
272
+ // failure mode. This branch restores the missing check: stopping with
273
+ // empty narrative AND no tool calls is `incomplete`, surfaced as a
274
+ // structured error with errorCode `empty_output` so callers can tell
275
+ // the difference between "model finished cleanly" and "model returned
276
+ // nothing usable".
277
+ if (stoppedByAdapter && finalText.trim() === '' && allToolCalls.length === 0) {
278
+ return {
279
+ workerStatus: 'failed',
280
+ finalAssistantText: '',
281
+ toolCalls: allToolCalls,
282
+ usage,
283
+ errorCode: 'empty_output',
284
+ turns,
285
+ durationMs: Date.now() - startMs,
286
+ filesRead,
287
+ filesWritten,
288
+ costUSD: computeCost(modelForCost, usage),
289
+ };
68
290
  }
69
291
  return {
70
292
  workerStatus: stoppedByAdapter ? 'done' : 'blocked',
@@ -72,7 +294,18 @@ export class RunnerShell {
72
294
  toolCalls: allToolCalls,
73
295
  usage,
74
296
  ...(stoppedByAdapter ? {} : { errorCode: 'max_turns_exhausted' }),
297
+ turns,
298
+ durationMs: Date.now() - startMs,
299
+ filesRead,
300
+ filesWritten,
301
+ costUSD: computeCost(modelForCost, usage),
75
302
  };
76
303
  }
77
304
  }
305
+ function computeCost(model, usage) {
306
+ const card = resolveRateCard(model ?? null);
307
+ if (!card)
308
+ return null;
309
+ return priceTokens(usage, card);
310
+ }
78
311
  //# sourceMappingURL=runner-shell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner-shell.js","sourceRoot":"","sources":["../../src/providers/runner-shell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner-shell.js","sourceRoot":"","sources":["../../src/providers/runner-shell.ts"],"names":[],"mappings":"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"}