@zhixuan92/multi-model-agent-core 0.1.0 → 0.2.0

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 (82) hide show
  1. package/README.md +0 -6
  2. package/dist/config/schema.d.ts +27 -0
  3. package/dist/config/schema.d.ts.map +1 -1
  4. package/dist/config/schema.js +13 -0
  5. package/dist/config/schema.js.map +1 -1
  6. package/dist/context/context-block-store.d.ts +75 -0
  7. package/dist/context/context-block-store.d.ts.map +1 -0
  8. package/dist/context/context-block-store.js +82 -0
  9. package/dist/context/context-block-store.js.map +1 -0
  10. package/dist/context/expand-context-blocks.d.ts +20 -0
  11. package/dist/context/expand-context-blocks.d.ts.map +1 -0
  12. package/dist/context/expand-context-blocks.js +46 -0
  13. package/dist/context/expand-context-blocks.js.map +1 -0
  14. package/dist/delegate-with-escalation.d.ts +34 -0
  15. package/dist/delegate-with-escalation.d.ts.map +1 -0
  16. package/dist/delegate-with-escalation.js +168 -0
  17. package/dist/delegate-with-escalation.js.map +1 -0
  18. package/dist/index.d.ts +4 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/model-profiles.json +8 -4
  23. package/dist/provider.d.ts.map +1 -1
  24. package/dist/provider.js +7 -1
  25. package/dist/provider.js.map +1 -1
  26. package/dist/routing/model-profiles.d.ts +1 -0
  27. package/dist/routing/model-profiles.d.ts.map +1 -1
  28. package/dist/routing/model-profiles.js +4 -0
  29. package/dist/routing/model-profiles.js.map +1 -1
  30. package/dist/run-tasks.d.ts +26 -2
  31. package/dist/run-tasks.d.ts.map +1 -1
  32. package/dist/run-tasks.js +61 -19
  33. package/dist/run-tasks.js.map +1 -1
  34. package/dist/runners/claude-runner.d.ts.map +1 -1
  35. package/dist/runners/claude-runner.js +643 -32
  36. package/dist/runners/claude-runner.js.map +1 -1
  37. package/dist/runners/codex-runner.d.ts.map +1 -1
  38. package/dist/runners/codex-runner.js +473 -48
  39. package/dist/runners/codex-runner.js.map +1 -1
  40. package/dist/runners/error-classification.d.ts +30 -0
  41. package/dist/runners/error-classification.d.ts.map +1 -0
  42. package/dist/runners/error-classification.js +72 -0
  43. package/dist/runners/error-classification.js.map +1 -0
  44. package/dist/runners/injection-type.d.ts +17 -0
  45. package/dist/runners/injection-type.d.ts.map +1 -0
  46. package/dist/runners/injection-type.js +27 -0
  47. package/dist/runners/injection-type.js.map +1 -0
  48. package/dist/runners/openai-runner.d.ts +5 -0
  49. package/dist/runners/openai-runner.d.ts.map +1 -1
  50. package/dist/runners/openai-runner.js +508 -36
  51. package/dist/runners/openai-runner.js.map +1 -1
  52. package/dist/runners/prevention.d.ts +41 -0
  53. package/dist/runners/prevention.d.ts.map +1 -0
  54. package/dist/runners/prevention.js +68 -0
  55. package/dist/runners/prevention.js.map +1 -0
  56. package/dist/runners/supervision.d.ts +130 -0
  57. package/dist/runners/supervision.d.ts.map +1 -0
  58. package/dist/runners/supervision.js +238 -0
  59. package/dist/runners/supervision.js.map +1 -0
  60. package/dist/tools/claude-adapter.d.ts.map +1 -1
  61. package/dist/tools/claude-adapter.js +6 -3
  62. package/dist/tools/claude-adapter.js.map +1 -1
  63. package/dist/tools/definitions.d.ts +3 -1
  64. package/dist/tools/definitions.d.ts.map +1 -1
  65. package/dist/tools/definitions.js +56 -5
  66. package/dist/tools/definitions.js.map +1 -1
  67. package/dist/tools/openai-adapter.d.ts.map +1 -1
  68. package/dist/tools/openai-adapter.js +6 -3
  69. package/dist/tools/openai-adapter.js.map +1 -1
  70. package/dist/tools/scratchpad.d.ts +28 -0
  71. package/dist/tools/scratchpad.d.ts.map +1 -0
  72. package/dist/tools/scratchpad.js +49 -0
  73. package/dist/tools/scratchpad.js.map +1 -0
  74. package/dist/tools/tracker.d.ts +38 -2
  75. package/dist/tools/tracker.d.ts.map +1 -1
  76. package/dist/tools/tracker.js +54 -5
  77. package/dist/tools/tracker.js.map +1 -1
  78. package/dist/types.d.ts +184 -2
  79. package/dist/types.d.ts.map +1 -1
  80. package/dist/types.js +17 -1
  81. package/dist/types.js.map +1 -1
  82. package/package.json +9 -15
@@ -1,8 +1,15 @@
1
- import { Agent, run as agentRun, setTracingDisabled, OpenAIChatCompletionsModel, MaxTurnsExceededError } from '@openai/agents';
2
- import { withTimeout } from '../types.js';
1
+ import { Agent, run as agentRun, setTracingDisabled, OpenAIChatCompletionsModel, MaxTurnsExceededError, } from '@openai/agents';
2
+ import { createHash } from 'node:crypto';
3
+ import { withTimeout, computeCostUSD, } from '../types.js';
4
+ import { injectionTypeFor } from './injection-type.js';
3
5
  import { FileTracker } from '../tools/tracker.js';
4
6
  import { createToolImplementations } from '../tools/definitions.js';
5
7
  import { createOpenAITools } from '../tools/openai-adapter.js';
8
+ import { TextScratchpad } from '../tools/scratchpad.js';
9
+ import { buildSystemPrompt, buildBudgetHint, buildReGroundingMessage, buildBudgetPressureNudge, RE_GROUNDING_INTERVAL_TURNS, } from './prevention.js';
10
+ import { validateCompletion, buildRePrompt, sameDegenerateOutput, resolveInputTokenSoftLimit, checkWatchdogThreshold, logWatchdogEvent, THINKING_DIAGNOSTIC_MARKER, } from './supervision.js';
11
+ import { classifyError } from './error-classification.js';
12
+ import { findModelProfile } from '../routing/model-profiles.js';
6
13
  // Disable tracing — not all OpenAI-compatible providers support it
7
14
  setTracingDisabled(true);
8
15
  /**
@@ -12,9 +19,56 @@ setTracingDisabled(true);
12
19
  * chain-of-thought inline wrapped in `<think>...</think>` tags. These are
13
20
  * scratch-pad content and should not surface to the caller. Stripping is
14
21
  * non-greedy, multi-line, and handles multiple blocks.
22
+ *
23
+ * If the entire input was reasoning (stripping leaves nothing), return an
24
+ * explicit marker instead of an empty string. Silently swallowing
25
+ * "all thinking, no answer" responses leaves the caller with `output: ""`
26
+ * and no idea what happened — see the openai-runner empty-output diagnostic.
15
27
  */
16
28
  export function stripThinkingTags(text) {
17
- return text.replace(/<think>[\s\S]*?<\/think>\s*/gi, '').trimStart();
29
+ if (!text)
30
+ return '';
31
+ const stripped = text.replace(/<think>[\s\S]*?<\/think>\s*/gi, '').trimStart();
32
+ if (!stripped && /<think>[\s\S]*?<\/think>/i.test(text)) {
33
+ return THINKING_DIAGNOSTIC_MARKER;
34
+ }
35
+ return stripped;
36
+ }
37
+ /**
38
+ * Hard cap on supervision re-prompts before we give up and salvage. Three is
39
+ * the value chosen in the spec (A.2.2): enough room for the model to recover
40
+ * from a one-off fragment but not so many that a wedged model can burn the
41
+ * budget via repeated re-prompts.
42
+ */
43
+ const MAX_SUPERVISION_RETRIES = 3;
44
+ /**
45
+ * Extract every assistant text emission from a single `agentRun(...)` result.
46
+ * See the SDK introspection finding in supervision.ts: `result.newItems` is a
47
+ * discriminated union and entries of type `"message_output_item"` wrap an
48
+ * `AssistantMessageItem` whose `content` is a list of `{ type: 'output_text',
49
+ * text }` / `refusal` / `audio` / `image` parts. We concatenate every
50
+ * `output_text` part from every assistant `message_output_item`. Refusals
51
+ * and non-text parts are ignored (they have no salvage value for a
52
+ * text-in-text-out sub-agent).
53
+ */
54
+ function extractAssistantText(newItems) {
55
+ const chunks = [];
56
+ for (const item of newItems) {
57
+ if (item.type !== 'message_output_item')
58
+ continue;
59
+ const raw = item.rawItem;
60
+ if (raw.role !== 'assistant')
61
+ continue;
62
+ const content = raw.content;
63
+ if (!Array.isArray(content))
64
+ continue;
65
+ for (const part of content) {
66
+ if (part.type === 'output_text' && typeof part.text === 'string') {
67
+ chunks.push(part.text);
68
+ }
69
+ }
70
+ }
71
+ return chunks.join('');
18
72
  }
19
73
  export async function runOpenAI(prompt, options, runner) {
20
74
  const maxTurns = options.maxTurns ?? runner.providerConfig.maxTurns ?? runner.defaults.maxTurns;
@@ -24,7 +78,33 @@ export async function runOpenAI(prompt, options, runner) {
24
78
  const effort = options.effort ?? runner.providerConfig.effort;
25
79
  const sandboxPolicy = options.sandboxPolicy ?? runner.providerConfig.sandboxPolicy ?? 'cwd-only';
26
80
  const abortController = new AbortController();
27
- const tracker = new FileTracker();
81
+ // --- Progress event emission (Task 9) -----------------------------------
82
+ //
83
+ // `onProgress` is already wrapped in `safeSink` by the orchestrator
84
+ // (Task 8), so any throw from the consumer callback is swallowed
85
+ // upstream and cannot corrupt this loop. We do not need to wrap it
86
+ // again here.
87
+ const onProgress = options.onProgress;
88
+ const emit = (event) => {
89
+ if (onProgress)
90
+ onProgress(event);
91
+ };
92
+ // Hoisted out of `run()` so the withTimeout callback (which runs in a
93
+ // different microtask chain) can still read partial usage from the last
94
+ // successful agentRun. `run()` updates this on every turn. Declared
95
+ // here (before the tracker) so the FileTracker callback closure can
96
+ // reference it without a TDZ issue at construction.
97
+ let currentResult;
98
+ // The tracker fires `onToolCall` synchronously inside every
99
+ // `trackToolCall(...)` — which itself is called from inside a tool
100
+ // implementation during an `agentRun` turn. That means `currentResult`
101
+ // may still hold the PREVIOUS turn's request count when the callback
102
+ // fires. We read it with an optional chain + fallback and attribute
103
+ // the tool call to the in-flight turn (previous turn + 1).
104
+ const tracker = new FileTracker((summary) => {
105
+ const inflightTurn = (currentResult?.state.usage.requests ?? 0) + 1;
106
+ emit({ kind: 'tool_call', turn: inflightTurn, toolSummary: summary });
107
+ });
28
108
  const toolImpls = createToolImplementations(tracker, cwd, sandboxPolicy, abortController.signal);
29
109
  const fileTools = toolMode === 'full' ? createOpenAITools(toolImpls, sandboxPolicy) : [];
30
110
  // Add hosted tools (web_search, image_generation, etc.) if configured — only when tools are enabled
@@ -33,60 +113,452 @@ export async function runOpenAI(prompt, options, runner) {
33
113
  ? (runner.providerConfig.hostedTools ?? []).map(t => ({ type: t }))
34
114
  : [];
35
115
  const tools = [...fileTools, ...hostedTools];
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
117
  const model = new OpenAIChatCompletionsModel(runner.client, runner.providerConfig.model);
118
+ // --- Prevention layer: system prompt + budget hint ---
119
+ //
120
+ // buildSystemPrompt() is deliberately static and parameter-free. The Task 1
121
+ // review rejected speculative `providerLabel` / `maxTurns` parameters — the
122
+ // system prompt is generic ~400 tokens of discipline that applies to every
123
+ // provider. Per-turn budget information is threaded through buildBudgetHint
124
+ // (prepended to the first user prompt) and buildReGroundingMessage
125
+ // (injected every RE_GROUNDING_INTERVAL_TURNS turns).
126
+ const systemPrompt = buildSystemPrompt();
127
+ const budgetHint = buildBudgetHint({ maxTurns });
128
+ const promptWithBudgetHint = `${budgetHint}\n\n${prompt}`;
129
+ // --- onInitialRequest (Task 12) ----------------------------------------
130
+ //
131
+ // Fire once per attempt with the canonical orchestrator-side initial
132
+ // brief: `${systemPrompt}\n\n${promptWithBudgetHint}`. This is NOT the
133
+ // literal request body the `@openai/agents` SDK transmits — the SDK
134
+ // wraps our systemPrompt in the Agent `instructions` field and our
135
+ // user prompt in a messages array. We hash the canonical form instead
136
+ // so the hash is cross-runner stable: the same canonical brief on any
137
+ // of the three runners produces the same hash, even though each SDK's
138
+ // wire format differs. This answers "did the orchestrator send the
139
+ // same brief across retries?" — not "were the literal wire bytes
140
+ // identical?". See `AttemptRecord.initialPromptHash` in types.ts for
141
+ // the full caveat. We guard with try/catch because the orchestrator
142
+ // owns the callback and a throw would corrupt its closure (symmetry
143
+ // with safeSink around onProgress).
144
+ if (options.onInitialRequest) {
145
+ const canonicalInitialBrief = `${systemPrompt}\n\n${promptWithBudgetHint}`;
146
+ try {
147
+ options.onInitialRequest({
148
+ lengthChars: canonicalInitialBrief.length,
149
+ sha256: createHash('sha256').update(canonicalInitialBrief).digest('hex'),
150
+ });
151
+ }
152
+ catch {
153
+ // Swallow — a broken callback must not affect dispatch.
154
+ }
155
+ }
37
156
  const agent = new Agent({
38
157
  name: 'sub-agent',
39
158
  model,
40
- instructions: 'You are a helpful assistant. Complete the task given to you. Use the provided tools when needed.',
159
+ instructions: systemPrompt,
41
160
  tools,
42
161
  ...(effort && effort !== 'none' && {
43
162
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
163
  modelSettings: { reasoning: { effort: effort } },
45
164
  }),
46
165
  });
166
+ // --- Watchdog: resolve the input-token soft limit once per run ---
167
+ const profile = findModelProfile(runner.providerConfig.model);
168
+ const softLimit = resolveInputTokenSoftLimit(runner.providerConfig, profile);
169
+ // --- Scratchpad: buffers assistant text across every agentRun() call so
170
+ // that every termination path (ok/incomplete/max_turns/error/timeout/
171
+ // force_salvage) can return the best text we heard, even if the final
172
+ // message is junk. ---
173
+ const scratchpad = new TextScratchpad();
174
+ /**
175
+ * Build an AgentInputItem[] for continuing `prev` with a new user message.
176
+ *
177
+ * @openai/agents does NOT expose a `conversation:` option on `run()`. It
178
+ * accepts `string | AgentInputItem[] | RunState` as the input. The idiomatic
179
+ * way to "continue" a completed run with a new user turn is to pass
180
+ * `[...prev.history, { role: 'user', content: newText }]` as the input on
181
+ * the next call. `result.history` is the full conversation (system prompt
182
+ * + original input + every new item generated during the run), typed as
183
+ * `AgentInputItem[]`. See node_modules/@openai/agents-core/dist/run.d.ts
184
+ * line 182 and result.d.ts line 84 (history getter).
185
+ */
186
+ const continueWith = (prev, nextUserMessage) => {
187
+ const history = prev.history;
188
+ return [
189
+ ...history,
190
+ { role: 'user', content: nextUserMessage },
191
+ ];
192
+ };
193
+ /**
194
+ * Local helper: run one agent turn and buffer its assistant text into
195
+ * the scratchpad. Closes over `agent`, `abortController`, `scratchpad`
196
+ * and `emit` so every call site in `run()` is just one line AND every
197
+ * turn automatically emits the correct `turn_start` / `text_emission`
198
+ * / `turn_complete` progress events.
199
+ *
200
+ * Event ordering:
201
+ * 1. `turn_start` — fires BEFORE agentRun. Turn number is the NEXT
202
+ * request count (prev + 1) because the SDK won't bump
203
+ * `state.usage.requests` until the call completes.
204
+ * 2. `text_emission` — fires AFTER scratchpad.append, only when the
205
+ * stripped assistant text is non-empty. Skipping empty emissions
206
+ * keeps the event stream useful (empty-text turns are observable
207
+ * via `turn_complete` alone).
208
+ * 3. `turn_complete` — fires AFTER agentRun, with the post-call
209
+ * cumulative usage from `result.state.usage`.
210
+ */
211
+ const runTurnAndBuffer = async (input, turnBudget) => {
212
+ const nextTurn = (currentResult?.state.usage.requests ?? 0) + 1;
213
+ emit({ kind: 'turn_start', turn: nextTurn, provider: 'openai-compatible' });
214
+ const result = (await agentRun(agent, input, {
215
+ maxTurns: turnBudget,
216
+ signal: abortController.signal,
217
+ }));
218
+ const text = stripThinkingTags(extractAssistantText(result.newItems));
219
+ scratchpad.append(result.state.usage.requests, text);
220
+ if (text.length > 0) {
221
+ emit({
222
+ kind: 'text_emission',
223
+ turn: result.state.usage.requests,
224
+ chars: text.length,
225
+ preview: text.slice(0, 200),
226
+ });
227
+ }
228
+ emit({
229
+ kind: 'turn_complete',
230
+ turn: result.state.usage.requests,
231
+ cumulativeInputTokens: result.state.usage.inputTokens,
232
+ cumulativeOutputTokens: result.state.usage.outputTokens,
233
+ });
234
+ return result;
235
+ };
47
236
  const run = async () => {
48
237
  try {
49
- const result = await agentRun(agent, prompt, { maxTurns, signal: abortController.signal });
50
- const usage = result.state.usage;
51
- return {
52
- output: stripThinkingTags(result.finalOutput ?? ''),
53
- status: 'ok',
54
- usage: {
55
- inputTokens: usage.inputTokens,
56
- outputTokens: usage.outputTokens,
57
- totalTokens: usage.totalTokens,
58
- costUSD: null,
59
- },
60
- turns: usage.requests,
61
- files: tracker.getFiles(),
62
- };
238
+ currentResult = await runTurnAndBuffer(promptWithBudgetHint, maxTurns);
239
+ let supervisionRetries = 0;
240
+ // Initialized to `null` (NOT ''): on the first turn there is no
241
+ // previous degenerate output to compare against, so the
242
+ // same-output early-out must be skipped. Initialising to ''
243
+ // would cause `sameDegenerateOutput('', '')` to fire on a first-
244
+ // turn empty output and break the loop before retries run.
245
+ let lastDegenerateOutput = null;
246
+ // Track the input-token count at which we last fired a warning
247
+ // nudge. This prevents nudging twice in a row for the same
248
+ // `currentResult` when validation still fails after a nudge
249
+ // response: the next loop iteration will see
250
+ // `currentInputTokens <= lastWarnedInputTokens` and fall through
251
+ // to validation / re-prompt instead of re-issuing the nudge.
252
+ let lastWarnedInputTokens = -1;
253
+ // Supervision loop. On each iteration we:
254
+ // 1. Check the watchdog (may force-terminate or nudge)
255
+ // 2. Validate the final message (may re-prompt)
256
+ // 3. Inject re-grounding every RE_GROUNDING_INTERVAL_TURNS turns
257
+ // A single pass where validateCompletion returns `valid` is the clean
258
+ // exit. Otherwise we either re-prompt (and loop) or salvage.
259
+ // eslint-disable-next-line no-constant-condition
260
+ while (true) {
261
+ // --- Watchdog check ---
262
+ const currentInputTokens = currentResult.state.usage.inputTokens;
263
+ const watchdogStatus = checkWatchdogThreshold(currentInputTokens, softLimit);
264
+ if (watchdogStatus !== 'ok') {
265
+ logWatchdogEvent(watchdogStatus, {
266
+ provider: 'openai-compatible',
267
+ model: runner.providerConfig.model,
268
+ turn: currentResult.state.usage.requests,
269
+ inputTokens: currentInputTokens,
270
+ softLimit,
271
+ scratchpadChars: scratchpad.toString().length,
272
+ });
273
+ }
274
+ if (watchdogStatus === 'force_salvage') {
275
+ // `watchdog_force_salvage` is not an injected message — no
276
+ // re-prompt is sent — but observers still want to see exactly
277
+ // why the run is being killed. We emit the event with a
278
+ // `contentLengthChars` of 0 to reflect the "nothing was
279
+ // injected, we just terminated" semantics.
280
+ emit({
281
+ kind: 'injection',
282
+ injectionType: 'watchdog_force_salvage',
283
+ turn: currentResult.state.usage.requests,
284
+ contentLengthChars: 0,
285
+ });
286
+ const salvaged = buildForceSalvageResult(currentResult, scratchpad, tracker, runner.providerConfig, softLimit);
287
+ emit({ kind: 'done', status: salvaged.status });
288
+ return salvaged;
289
+ }
290
+ // Warning-band nudge: fire at most once per distinct input-token
291
+ // level. We dispatch the nudge turn, append to the scratchpad,
292
+ // record the new high-watermark, and then FALL THROUGH to the
293
+ // validation block below — the nudge response might itself be a
294
+ // perfectly valid final answer, so we must validate it in the
295
+ // SAME iteration. Without the fall-through, a valid nudge
296
+ // response would be thrown away and the loop would grind until
297
+ // force_salvage (pre-fix bug #1).
298
+ if (watchdogStatus === 'warning' && currentInputTokens > lastWarnedInputTokens) {
299
+ const warning = buildBudgetPressureNudge({
300
+ inputTokens: currentInputTokens,
301
+ softLimit,
302
+ });
303
+ emit({
304
+ kind: 'injection',
305
+ injectionType: 'watchdog_warning',
306
+ turn: currentResult.state.usage.requests,
307
+ contentLengthChars: warning.length,
308
+ });
309
+ lastWarnedInputTokens = currentInputTokens;
310
+ currentResult = await runTurnAndBuffer(continueWith(currentResult, warning), 1);
311
+ }
312
+ // --- Validation check ---
313
+ const stripped = stripThinkingTags(currentResult.finalOutput ?? '');
314
+ const validation = validateCompletion(stripped);
315
+ if (validation.valid) {
316
+ const ok = buildOkResult(stripped, currentResult, tracker, runner.providerConfig);
317
+ emit({ kind: 'done', status: ok.status });
318
+ return ok;
319
+ }
320
+ // Degenerate. Apply same-output early-out (only when we have a
321
+ // prior degenerate output to compare against) and retry budget.
322
+ if (lastDegenerateOutput !== null && sameDegenerateOutput(stripped, lastDegenerateOutput))
323
+ break;
324
+ lastDegenerateOutput = stripped;
325
+ supervisionRetries++;
326
+ if (supervisionRetries >= MAX_SUPERVISION_RETRIES)
327
+ break;
328
+ // --- Re-prompt the model to recover ---
329
+ const rePrompt = buildRePrompt(validation);
330
+ emit({
331
+ kind: 'injection',
332
+ injectionType: injectionTypeFor(validation.kind),
333
+ turn: currentResult.state.usage.requests,
334
+ contentLengthChars: rePrompt.length,
335
+ });
336
+ // Give the model a small budget to recover. One extra turn per
337
+ // retry is enough for the "emit your final answer" nudge.
338
+ currentResult = await runTurnAndBuffer(continueWith(currentResult, rePrompt), 1);
339
+ // --- Periodic re-grounding ---
340
+ const turnsSoFar = currentResult.state.usage.requests;
341
+ if (turnsSoFar > 0 && turnsSoFar % RE_GROUNDING_INTERVAL_TURNS === 0) {
342
+ const reground = buildReGroundingMessage({
343
+ originalPromptExcerpt: prompt,
344
+ currentTurn: turnsSoFar,
345
+ maxTurns,
346
+ toolCallsSoFar: tracker.getToolCalls().length,
347
+ filesReadSoFar: tracker.getReads().length,
348
+ });
349
+ emit({
350
+ kind: 'injection',
351
+ injectionType: 'reground',
352
+ turn: currentResult.state.usage.requests,
353
+ contentLengthChars: reground.length,
354
+ });
355
+ currentResult = await runTurnAndBuffer(continueWith(currentResult, reground), 1);
356
+ }
357
+ }
358
+ // Supervision exhausted (either retry budget or same-output early-out).
359
+ // Salvage from the scratchpad if we have anything; otherwise return the
360
+ // existing incomplete diagnostic.
361
+ const exhausted = buildSupervisionExhaustedResult(currentResult, scratchpad, tracker, runner.providerConfig);
362
+ emit({ kind: 'done', status: exhausted.status });
363
+ return exhausted;
63
364
  }
64
365
  catch (err) {
65
366
  if (err instanceof MaxTurnsExceededError) {
367
+ // max_turns path: prefer scratchpad salvage over the bare diagnostic.
368
+ // Preserve whatever partial usage we accumulated in the last
369
+ // successful agentRun so the caller sees real numbers, not zeros.
370
+ const filesRead = tracker.getReads();
371
+ const filesWritten = tracker.getWrites();
372
+ const toolCalls = tracker.getToolCalls();
373
+ emit({ kind: 'done', status: 'max_turns' });
374
+ const hasSalvage = !scratchpad.isEmpty();
66
375
  return {
67
- output: `Agent exceeded max turns (${maxTurns}).`,
376
+ output: hasSalvage
377
+ ? scratchpad.latest()
378
+ : `Agent exceeded max turns (${maxTurns}).`,
68
379
  status: 'max_turns',
69
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null },
70
- turns: maxTurns,
71
- files: tracker.getFiles(),
380
+ usage: partialUsage(currentResult, runner.providerConfig),
381
+ turns: currentResult?.state.usage.requests ?? maxTurns,
382
+ filesRead,
383
+ filesWritten,
384
+ toolCalls,
385
+ outputIsDiagnostic: !hasSalvage,
386
+ escalationLog: [],
72
387
  };
73
388
  }
389
+ // Classify the thrown error into a finer-grained RunStatus so the
390
+ // escalation orchestrator (and downstream observers) can distinguish
391
+ // abort / network / HTTP-error / generic failure modes. We still
392
+ // surface the original error message as the `error` field — the
393
+ // classifier's `reason` is deliberately a stable category label and
394
+ // NOT the human-readable message.
395
+ const { status, reason } = classifyError(err);
396
+ const msg = err instanceof Error ? err.message : String(err);
397
+ emit({ kind: 'done', status });
398
+ const hasSalvage = !scratchpad.isEmpty();
74
399
  return {
75
- output: `Sub-agent error: ${err instanceof Error ? err.message : String(err)}`,
76
- status: 'error',
77
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null },
78
- turns: 0,
79
- files: tracker.getFiles(),
80
- error: err instanceof Error ? err.message : String(err),
400
+ output: hasSalvage ? scratchpad.latest() : `Sub-agent error: ${msg}`,
401
+ status,
402
+ usage: partialUsage(currentResult, runner.providerConfig),
403
+ turns: currentResult?.state.usage.requests ?? 0,
404
+ filesRead: tracker.getReads(),
405
+ filesWritten: tracker.getWrites(),
406
+ toolCalls: tracker.getToolCalls(),
407
+ outputIsDiagnostic: !hasSalvage,
408
+ escalationLog: [],
409
+ error: msg || reason,
81
410
  };
82
411
  }
83
412
  };
84
- return withTimeout(run(), timeoutMs, () => ({
85
- output: `Agent timed out after ${timeoutMs}ms.`,
86
- status: 'timeout',
87
- files: tracker.getFiles(),
88
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null },
89
- turns: maxTurns,
90
- }), abortController);
413
+ return withTimeout(run(), timeoutMs, () => {
414
+ emit({ kind: 'done', status: 'timeout' });
415
+ const hasSalvage = !scratchpad.isEmpty();
416
+ return {
417
+ output: hasSalvage
418
+ ? scratchpad.latest()
419
+ : `Agent timed out after ${timeoutMs}ms.`,
420
+ status: 'timeout',
421
+ filesRead: tracker.getReads(),
422
+ filesWritten: tracker.getWrites(),
423
+ toolCalls: tracker.getToolCalls(),
424
+ // Preserve partial usage from the last successful agentRun so the
425
+ // caller sees real numbers, not zeros, on a timeout.
426
+ usage: partialUsage(currentResult, runner.providerConfig),
427
+ turns: currentResult?.state.usage.requests ?? maxTurns,
428
+ outputIsDiagnostic: !hasSalvage,
429
+ escalationLog: [],
430
+ };
431
+ }, abortController);
432
+ }
433
+ // --- Helpers: canonical return-shape builders -------------------------------
434
+ function buildOkResult(output, currentResult, tracker, providerConfig) {
435
+ const usage = currentResult.state.usage;
436
+ const costUSD = computeCostUSD(usage.inputTokens, usage.outputTokens, providerConfig);
437
+ return {
438
+ output,
439
+ status: 'ok',
440
+ usage: {
441
+ inputTokens: usage.inputTokens,
442
+ outputTokens: usage.outputTokens,
443
+ totalTokens: usage.totalTokens,
444
+ costUSD,
445
+ },
446
+ turns: usage.requests,
447
+ filesRead: tracker.getReads(),
448
+ filesWritten: tracker.getWrites(),
449
+ toolCalls: tracker.getToolCalls(),
450
+ // `ok` always carries a real model answer — never a diagnostic.
451
+ outputIsDiagnostic: false,
452
+ escalationLog: [],
453
+ };
454
+ }
455
+ function buildSupervisionExhaustedResult(currentResult, scratchpad, tracker, providerConfig) {
456
+ const usage = currentResult.state.usage;
457
+ const filesRead = tracker.getReads();
458
+ const filesWritten = tracker.getWrites();
459
+ const toolCalls = tracker.getToolCalls();
460
+ const costUSD = computeCostUSD(usage.inputTokens, usage.outputTokens, providerConfig);
461
+ const hasSalvage = !scratchpad.isEmpty();
462
+ return {
463
+ output: hasSalvage
464
+ ? scratchpad.latest()
465
+ : buildIncompleteDiagnostic({
466
+ providerLabel: 'openai-compatible',
467
+ turns: usage.requests,
468
+ inputTokens: usage.inputTokens,
469
+ outputTokens: usage.outputTokens,
470
+ filesRead,
471
+ filesWritten,
472
+ }),
473
+ status: 'incomplete',
474
+ usage: {
475
+ inputTokens: usage.inputTokens,
476
+ outputTokens: usage.outputTokens,
477
+ totalTokens: usage.totalTokens,
478
+ costUSD,
479
+ },
480
+ turns: usage.requests,
481
+ filesRead,
482
+ filesWritten,
483
+ toolCalls,
484
+ outputIsDiagnostic: !hasSalvage,
485
+ escalationLog: [],
486
+ };
487
+ }
488
+ function buildForceSalvageResult(currentResult, scratchpad, tracker, providerConfig, softLimit) {
489
+ const usage = currentResult.state.usage;
490
+ const filesRead = tracker.getReads();
491
+ const filesWritten = tracker.getWrites();
492
+ const toolCalls = tracker.getToolCalls();
493
+ const costUSD = computeCostUSD(usage.inputTokens, usage.outputTokens, providerConfig);
494
+ const hasSalvage = !scratchpad.isEmpty();
495
+ return {
496
+ output: hasSalvage
497
+ ? scratchpad.latest()
498
+ : `[openai-compatible sub-agent forcibly terminated at ${usage.inputTokens} input tokens (soft limit ${softLimit}). No usable text was buffered.]`,
499
+ status: 'incomplete',
500
+ usage: {
501
+ inputTokens: usage.inputTokens,
502
+ outputTokens: usage.outputTokens,
503
+ totalTokens: usage.totalTokens,
504
+ costUSD,
505
+ },
506
+ turns: usage.requests,
507
+ filesRead,
508
+ filesWritten,
509
+ toolCalls,
510
+ outputIsDiagnostic: !hasSalvage,
511
+ escalationLog: [],
512
+ };
513
+ }
514
+ /**
515
+ * Synthesise a diagnostic message for runs that completed without producing
516
+ * usable final output. Surfaces enough metadata for the caller to debug:
517
+ * how many turns were spent, what the model burnt token-wise, and what files
518
+ * the worker actually looked at before giving up.
519
+ */
520
+ function buildIncompleteDiagnostic(opts) {
521
+ const lines = [
522
+ `[${opts.providerLabel} sub-agent terminated without producing a final answer]`,
523
+ '',
524
+ 'The agent loop ended on a message with no tool calls and no plain-text content. ' +
525
+ 'This usually means one of:',
526
+ ' • the model emitted only <think> reasoning, then stopped',
527
+ ' • the model produced a conversational fragment instead of a final answer',
528
+ ' • a tool call was malformed and the SDK treated the response as terminal',
529
+ '',
530
+ `Turns used: ${opts.turns}`,
531
+ `Input tokens: ${opts.inputTokens}`,
532
+ `Output tokens: ${opts.outputTokens}`,
533
+ `Files read: ${opts.filesRead.length}${opts.filesRead.length > 0 ? ` (${formatFileList(opts.filesRead)})` : ''}`,
534
+ `Files written: ${opts.filesWritten.length}${opts.filesWritten.length > 0 ? ` (${formatFileList(opts.filesWritten)})` : ''}`,
535
+ '',
536
+ 'Recommended action: re-dispatch with a tighter, more explicit brief, or escalate to a higher-tier provider.',
537
+ ];
538
+ return lines.join('\n');
539
+ }
540
+ function formatFileList(files) {
541
+ const MAX_SHOWN = 10;
542
+ if (files.length <= MAX_SHOWN)
543
+ return files.join(', ');
544
+ return `${files.slice(0, MAX_SHOWN).join(', ')}, … ${files.length - MAX_SHOWN} more`;
545
+ }
546
+ /**
547
+ * Read whatever usage we managed to accumulate from the last successful
548
+ * `agentRun` before a throw, max_turns, or timeout. Used by every
549
+ * non-happy-path return so the caller sees real token counts (and a
550
+ * real cost estimate) instead of zeros.
551
+ */
552
+ function partialUsage(result, providerConfig) {
553
+ if (!result) {
554
+ return { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null };
555
+ }
556
+ const usage = result.state.usage;
557
+ return {
558
+ inputTokens: usage.inputTokens,
559
+ outputTokens: usage.outputTokens,
560
+ totalTokens: usage.totalTokens,
561
+ costUSD: computeCostUSD(usage.inputTokens, usage.outputTokens, providerConfig),
562
+ };
91
563
  }
92
564
  //# sourceMappingURL=openai-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-runner.js","sourceRoot":"","sources":["../../src/runners/openai-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai-runner.js","sourceRoot":"","sources":["../../src/runners/openai-runner.ts"],"names":[],"mappings":"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"}