@telora/daemon 0.22.187 → 0.22.189
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.
- package/build-info.json +2 -2
- package/dist/completion/escalations.d.ts.map +1 -1
- package/dist/completion/escalations.js +2 -1
- package/dist/completion/escalations.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +11 -4
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/standing-approval-convergence.d.ts.map +1 -1
- package/dist/completion/standing-approval-convergence.js +2 -1
- package/dist/completion/standing-approval-convergence.js.map +1 -1
- package/dist/focus/focus-loop-registry.js +2 -2
- package/dist/focus/focus-loop-registry.js.map +1 -1
- package/dist/loops/llm-client.d.ts +1 -1
- package/dist/loops/llm-client.d.ts.map +1 -1
- package/dist/loops/llm-client.js +18 -105
- package/dist/loops/llm-client.js.map +1 -1
- package/dist/queries/agent-resolvable-promotion.d.ts +12 -0
- package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-promotion.js +17 -6
- package/dist/queries/agent-resolvable-promotion.js.map +1 -1
- package/dist/queries/delivery-gate-state.d.ts +3 -0
- package/dist/queries/delivery-gate-state.d.ts.map +1 -1
- package/dist/queries/delivery-gate-state.js +1 -1
- package/dist/queries/delivery-gate-state.js.map +1 -1
- package/dist/queries/verify-own-holds.d.ts +89 -0
- package/dist/queries/verify-own-holds.d.ts.map +1 -0
- package/dist/queries/verify-own-holds.js +93 -0
- package/dist/queries/verify-own-holds.js.map +1 -0
- package/dist/spawn/one-shot-model.d.ts +145 -0
- package/dist/spawn/one-shot-model.d.ts.map +1 -0
- package/dist/spawn/one-shot-model.js +329 -0
- package/dist/spawn/one-shot-model.js.map +1 -0
- package/dist/spawn/review-hold-park.d.ts.map +1 -1
- package/dist/spawn/review-hold-park.js +7 -3
- package/dist/spawn/review-hold-park.js.map +1 -1
- package/dist/spawn/routing-decider-spawn.d.ts +30 -0
- package/dist/spawn/routing-decider-spawn.d.ts.map +1 -1
- package/dist/spawn/routing-decider-spawn.js +84 -2
- package/dist/spawn/routing-decider-spawn.js.map +1 -1
- package/dist/spawn/routing-decider.d.ts.map +1 -1
- package/dist/spawn/routing-decider.js +22 -0
- package/dist/spawn/routing-decider.js.map +1 -1
- package/dist/spawn/spawn-cooldown.d.ts +15 -1
- package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
- package/dist/spawn/spawn-cooldown.js +67 -19
- package/dist/spawn/spawn-cooldown.js.map +1 -1
- package/dist/verify/ai-inspection-runner.d.ts.map +1 -1
- package/dist/verify/ai-inspection-runner.js +26 -7
- package/dist/verify/ai-inspection-runner.js.map +1 -1
- package/dist/verify/de-restatement.d.ts +9 -2
- package/dist/verify/de-restatement.d.ts.map +1 -1
- package/dist/verify/de-restatement.js +14 -76
- package/dist/verify/de-restatement.js.map +1 -1
- package/dist/verify/default-on-guards.d.ts +5 -2
- package/dist/verify/default-on-guards.d.ts.map +1 -1
- package/dist/verify/default-on-guards.js +5 -3
- package/dist/verify/default-on-guards.js.map +1 -1
- package/dist/verify/verification-deps-default.d.ts.map +1 -1
- package/dist/verify/verification-deps-default.js +6 -0
- package/dist/verify/verification-deps-default.js.map +1 -1
- package/dist/verify/verification-deps.d.ts +10 -0
- package/dist/verify/verification-deps.d.ts.map +1 -1
- package/dist/verify/verification-deterministic.d.ts +7 -0
- package/dist/verify/verification-deterministic.d.ts.map +1 -1
- package/dist/verify/verification-deterministic.js.map +1 -1
- package/dist/verify/verification-engine.d.ts +1 -20
- package/dist/verify/verification-engine.d.ts.map +1 -1
- package/dist/verify/verification-engine.js +24 -55
- package/dist/verify/verification-engine.js.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.d.ts +3 -1
- package/dist/verify/verification-evidence-unavailable-feedback.d.ts.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.js +3 -1
- package/dist/verify/verification-evidence-unavailable-feedback.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts +4 -12
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +7 -12
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/verify/verification-history-reset.d.ts.map +1 -1
- package/dist/verify/verification-history-reset.js +11 -3
- package/dist/verify/verification-history-reset.js.map +1 -1
- package/dist/verify/verification-model-unavailable-hold.d.ts +92 -0
- package/dist/verify/verification-model-unavailable-hold.d.ts.map +1 -0
- package/dist/verify/verification-model-unavailable-hold.js +207 -0
- package/dist/verify/verification-model-unavailable-hold.js.map +1 -0
- package/dist/verify/verification-strategies.d.ts +32 -0
- package/dist/verify/verification-strategies.d.ts.map +1 -0
- package/dist/verify/verification-strategies.js +47 -0
- package/dist/verify/verification-strategies.js.map +1 -0
- package/dist/verify/verify-reconciliation.d.ts.map +1 -1
- package/dist/verify/verify-reconciliation.js +2 -1
- package/dist/verify/verify-reconciliation.js.map +1 -1
- package/dist/verify/verify-restatement.d.ts.map +1 -1
- package/dist/verify/verify-restatement.js +21 -8
- package/dist/verify/verify-restatement.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/spawn/one-shot-model.test.ts,
|
|
3
|
+
// packages/daemon/src/verify/verification-engine.test.ts,
|
|
4
|
+
// packages/daemon/src/verify/verification-model-unavailable-hold.test.ts,
|
|
5
|
+
// packages/daemon/src/verify/verify-restatement.test.ts
|
|
6
|
+
// PINNED-BY-END
|
|
7
|
+
/**
|
|
8
|
+
* One-shot model invocation: the single `claude --print` spawner every
|
|
9
|
+
* non-team model call in the daemon goes through.
|
|
10
|
+
*
|
|
11
|
+
* Before this module each caller (verify/de-restatement.ts, loops/llm-client.ts)
|
|
12
|
+
* spawned its own `claude --print`, discarded stdout on a non-zero exit and
|
|
13
|
+
* rejected with a bare Error carrying only stderr -- which the CLI leaves EMPTY
|
|
14
|
+
* on a rate limit. On 2026-09-23 (mars) the account was rate limited for ten
|
|
15
|
+
* hours; every one-shot exited 1 with the reason invisible, and every caller
|
|
16
|
+
* consumed that exit as a result: verify wrote it into the shortfall slot and
|
|
17
|
+
* parked four deliveries, the routing decider stamped it as a decision attempt.
|
|
18
|
+
* Meanwhile spawn-cooldown.ts knew the window and held only team spawns.
|
|
19
|
+
*
|
|
20
|
+
* What this module changes, at the source:
|
|
21
|
+
* - ONE argv and ONE result shape. Output is stream-json, so the CLI's own
|
|
22
|
+
* `rate_limit_event` (the typed reset instant the team path already reads
|
|
23
|
+
* via spawn/rate-limit.ts) and the `result` event (is_error, api_error_status,
|
|
24
|
+
* usage, cost) are parsed rather than guessed from prose.
|
|
25
|
+
* - A failure is a TYPED outcome. ModelUnavailable names its kind (rate_limit,
|
|
26
|
+
* auth, timeout, spawn, unknown), the exit code, the reset instant when the
|
|
27
|
+
* provider gave one, and the tail of BOTH streams. A caller that must tell
|
|
28
|
+
* "the model could not run" from "the model judged" reads `kind`; a caller
|
|
29
|
+
* that only catches keeps working (it is still an Error).
|
|
30
|
+
* - The provider-wide window is READ before spawning and WRITTEN on a
|
|
31
|
+
* rate-limit rejection (spawn-cooldown.ts providerRateLimitHoldUntilMs /
|
|
32
|
+
* recordProviderRateLimit). During an open window no subprocess is spawned:
|
|
33
|
+
* the call rejects at once with kind rate_limit and the reset instant.
|
|
34
|
+
*
|
|
35
|
+
* @module spawn/one-shot-model
|
|
36
|
+
*/
|
|
37
|
+
import { spawn } from 'node:child_process';
|
|
38
|
+
import { createLogger } from '../shell/log.js';
|
|
39
|
+
import { trackChildProcess } from './worker-registry.js';
|
|
40
|
+
import { parseRateLimitInfo } from './rate-limit.js';
|
|
41
|
+
import { providerRateLimitHoldUntilMs, recordProviderRateLimit } from './spawn-cooldown.js';
|
|
42
|
+
const log = createLogger({ module: 'one-shot-model' });
|
|
43
|
+
const DEFAULT_TIMEOUT_MS = 2 * 60 * 1000;
|
|
44
|
+
/** How much of each stream a failure carries (enough to read the reason, never the whole transcript). */
|
|
45
|
+
const STREAM_TAIL_CHARS = 2000;
|
|
46
|
+
/**
|
|
47
|
+
* A model invocation that could not COMPLETE. Never a judgment: the model was
|
|
48
|
+
* not reached, was refused, or did not answer in time. Callers hold or retry on
|
|
49
|
+
* it; none of them may record it as a verdict, a shortfall or an attempt.
|
|
50
|
+
*/
|
|
51
|
+
export class ModelUnavailable extends Error {
|
|
52
|
+
kind;
|
|
53
|
+
label;
|
|
54
|
+
exitCode;
|
|
55
|
+
/** Epoch ms when the provider says capacity returns (rate_limit only, when it said). */
|
|
56
|
+
resetAtMs;
|
|
57
|
+
stdoutTail;
|
|
58
|
+
stderrTail;
|
|
59
|
+
constructor(args) {
|
|
60
|
+
super(formatModelUnavailable(args));
|
|
61
|
+
this.name = 'ModelUnavailable';
|
|
62
|
+
this.kind = args.kind;
|
|
63
|
+
this.label = args.label;
|
|
64
|
+
this.exitCode = args.exitCode ?? null;
|
|
65
|
+
this.resetAtMs = args.resetAtMs ?? null;
|
|
66
|
+
this.stdoutTail = args.stdoutTail ?? '';
|
|
67
|
+
this.stderrTail = args.stderrTail ?? '';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function formatModelUnavailable(args) {
|
|
71
|
+
const parts = [`${args.label}: model unavailable (${args.kind}`];
|
|
72
|
+
if (args.exitCode !== undefined && args.exitCode !== null)
|
|
73
|
+
parts.push(`, exit ${args.exitCode}`);
|
|
74
|
+
if (args.resetAtMs !== undefined && args.resetAtMs !== null) {
|
|
75
|
+
parts.push(`, resets ${new Date(args.resetAtMs).toISOString()}`);
|
|
76
|
+
}
|
|
77
|
+
parts.push(')');
|
|
78
|
+
const reason = args.detail
|
|
79
|
+
?? lastLine(args.stderrTail ?? '')
|
|
80
|
+
?? lastLine(args.stdoutTail ?? '');
|
|
81
|
+
if (reason)
|
|
82
|
+
parts.push(`: ${reason}`);
|
|
83
|
+
return parts.join('');
|
|
84
|
+
}
|
|
85
|
+
function lastLine(text) {
|
|
86
|
+
const lines = text.split('\n').map((l) => l.trim()).filter((l) => l !== '');
|
|
87
|
+
return lines.length > 0 ? lines[lines.length - 1] : null;
|
|
88
|
+
}
|
|
89
|
+
/** Type guard: the thrown value is a typed unavailability, not a model judgment. */
|
|
90
|
+
export function isModelUnavailable(err) {
|
|
91
|
+
return err instanceof ModelUnavailable;
|
|
92
|
+
}
|
|
93
|
+
function isRecord(value) {
|
|
94
|
+
return typeof value === 'object' && value !== null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Parse a `--output-format stream-json` transcript. One JSON object per line;
|
|
98
|
+
* lines that are not JSON (or not events we read) are skipped, so a partial
|
|
99
|
+
* transcript from a killed child still yields what it had. Pure.
|
|
100
|
+
*/
|
|
101
|
+
export function parseOneShotStream(stdout) {
|
|
102
|
+
const summary = {};
|
|
103
|
+
for (const line of stdout.split('\n')) {
|
|
104
|
+
const trimmed = line.trim();
|
|
105
|
+
if (trimmed === '' || !trimmed.startsWith('{'))
|
|
106
|
+
continue;
|
|
107
|
+
let event;
|
|
108
|
+
try {
|
|
109
|
+
event = JSON.parse(trimmed);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (!isRecord(event))
|
|
115
|
+
continue;
|
|
116
|
+
const type = event['type'];
|
|
117
|
+
if (type === 'system' && event['subtype'] === 'init' && typeof event['model'] === 'string') {
|
|
118
|
+
summary.initModel = event['model'];
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (type === 'rate_limit_event') {
|
|
122
|
+
const info = parseRateLimitInfo(event);
|
|
123
|
+
if (info && info.status === 'rejected') {
|
|
124
|
+
summary.rateLimitRejected = { resetAtMs: info.resetsAtMs, rateLimitType: info.rateLimitType };
|
|
125
|
+
}
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (type === 'result') {
|
|
129
|
+
const usage = isRecord(event['usage']) ? event['usage'] : undefined;
|
|
130
|
+
const modelUsage = event['modelUsage'];
|
|
131
|
+
const modelUsageKey = isRecord(modelUsage) ? Object.keys(modelUsage)[0] : undefined;
|
|
132
|
+
const status = event['api_error_status'];
|
|
133
|
+
summary.result = {
|
|
134
|
+
isError: event['is_error'] === true,
|
|
135
|
+
text: typeof event['result'] === 'string' ? event['result'] : null,
|
|
136
|
+
apiErrorStatus: typeof status === 'number' ? status : null,
|
|
137
|
+
...(usage ? { usage } : {}),
|
|
138
|
+
...(modelUsageKey ? { modelUsageKey } : {}),
|
|
139
|
+
costUsd: typeof event['total_cost_usd'] === 'number' ? event['total_cost_usd'] : null,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return summary;
|
|
144
|
+
}
|
|
145
|
+
/** The CLI's prose for a limit, when the typed event was not in the transcript (text mode, older CLI). */
|
|
146
|
+
const RATE_LIMIT_PROSE = /hit your (session|usage|weekly) limit|rate limit(ed)? (reached|exceeded)|usage limit|too many requests/i;
|
|
147
|
+
/** The CLI's prose for a refused credential. */
|
|
148
|
+
const AUTH_PROSE = /not logged in|unauthori[sz]ed|invalid api key|authentication (failed|required)/i;
|
|
149
|
+
/**
|
|
150
|
+
* The provider refusal the CLI's PROSE names, or null. One classifier for every
|
|
151
|
+
* spawner (the routing decider reads its result text through this too), so a CLI
|
|
152
|
+
* build whose rejection carries words but no status is read the same way
|
|
153
|
+
* everywhere. Callers pass prose only -- never a stream-json event line. Pure.
|
|
154
|
+
*/
|
|
155
|
+
export function providerRefusalInProse(prose) {
|
|
156
|
+
if (RATE_LIMIT_PROSE.test(prose))
|
|
157
|
+
return 'rate_limit';
|
|
158
|
+
if (AUTH_PROSE.test(prose))
|
|
159
|
+
return 'auth';
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* The human-readable part of what the child wrote: the result text, stderr, and
|
|
164
|
+
* any stdout line that is NOT a stream-json event. The event lines are never
|
|
165
|
+
* scanned -- every healthy transcript carries the literal `rate_limit_event`
|
|
166
|
+
* (status allowed), and an assistant text block about "authentication" is the
|
|
167
|
+
* model's answer, not the provider's refusal. Pure.
|
|
168
|
+
*/
|
|
169
|
+
function proseOf(summary, stdout, stderr) {
|
|
170
|
+
const plain = stdout.split('\n').filter((line) => !line.trim().startsWith('{'));
|
|
171
|
+
return [summary.result?.text ?? '', ...plain, stderr].join('\n');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Classify a finished child that did NOT complete an answer. Pure: takes what
|
|
175
|
+
* was observed, names the kind. Order matters: a typed rate-limit event beats
|
|
176
|
+
* every other signal, a status beats prose, and a timeout with no provider
|
|
177
|
+
* signal is a timeout (the prose is only consulted when nothing typed explains
|
|
178
|
+
* the exit).
|
|
179
|
+
*/
|
|
180
|
+
export function classifyOneShotFailure(args) {
|
|
181
|
+
if (args.summary.rateLimitRejected) {
|
|
182
|
+
return { kind: 'rate_limit', resetAtMs: args.summary.rateLimitRejected.resetAtMs };
|
|
183
|
+
}
|
|
184
|
+
const status = args.summary.result?.apiErrorStatus ?? null;
|
|
185
|
+
if (status === 429)
|
|
186
|
+
return { kind: 'rate_limit', resetAtMs: null };
|
|
187
|
+
if (status === 401 || status === 403)
|
|
188
|
+
return { kind: 'auth', resetAtMs: null };
|
|
189
|
+
if (args.timedOut)
|
|
190
|
+
return { kind: 'timeout', resetAtMs: null };
|
|
191
|
+
const refusal = providerRefusalInProse(proseOf(args.summary, args.stdout, args.stderr));
|
|
192
|
+
return { kind: refusal ?? 'unknown', resetAtMs: null };
|
|
193
|
+
}
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// Invocation
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
/** The argv every one-shot uses. Exported so a test can pin it without spawning. */
|
|
198
|
+
export function buildOneShotArgs(systemPrompt) {
|
|
199
|
+
return [
|
|
200
|
+
'--print',
|
|
201
|
+
'--output-format', 'stream-json',
|
|
202
|
+
'--verbose',
|
|
203
|
+
'--no-session-persistence',
|
|
204
|
+
'--system-prompt', systemPrompt,
|
|
205
|
+
];
|
|
206
|
+
}
|
|
207
|
+
/** One log line per open window, not one per held call (verify ticks every ~90s per delivery). */
|
|
208
|
+
let lastLoggedHoldUntilMs = null;
|
|
209
|
+
/** The typed refusal for a call made inside an open provider window, or null when no window is open. */
|
|
210
|
+
function heldByProviderWindow(label, nowMs) {
|
|
211
|
+
const holdUntil = providerRateLimitHoldUntilMs(nowMs);
|
|
212
|
+
if (holdUntil === null)
|
|
213
|
+
return null;
|
|
214
|
+
if (lastLoggedHoldUntilMs !== holdUntil) {
|
|
215
|
+
lastLoggedHoldUntilMs = holdUntil;
|
|
216
|
+
log.info(`[one-shot] ${label}: not spawning -- provider rate limit holds every call until ` +
|
|
217
|
+
`${new Date(holdUntil).toISOString()}`);
|
|
218
|
+
}
|
|
219
|
+
return new ModelUnavailable({
|
|
220
|
+
kind: 'rate_limit',
|
|
221
|
+
label,
|
|
222
|
+
resetAtMs: holdUntil,
|
|
223
|
+
detail: 'provider rate-limit window open; no subprocess spawned',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/** The completed answer a parsed transcript amounts to. Pure. */
|
|
227
|
+
function completedResult(summary) {
|
|
228
|
+
const result = summary.result;
|
|
229
|
+
const model = summary.initModel ?? result.modelUsageKey;
|
|
230
|
+
return {
|
|
231
|
+
text: result.text ?? '',
|
|
232
|
+
...(result.usage ? { usage: result.usage } : {}),
|
|
233
|
+
...(model ? { model } : {}),
|
|
234
|
+
costUsd: result.costUsd,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Invoke the model once. The user message goes on stdin; the system prompt on
|
|
239
|
+
* argv. Resolves with the completed answer; rejects with ModelUnavailable when
|
|
240
|
+
* the model could not be reached, was refused or did not answer in time. Any
|
|
241
|
+
* other rejection is a programming error in this wrapper, not a model outcome.
|
|
242
|
+
*/
|
|
243
|
+
export function invokeOneShotModel(systemPrompt, userMessage, opts) {
|
|
244
|
+
const label = opts.label;
|
|
245
|
+
const nowMs = opts.nowMs ?? (() => Date.now());
|
|
246
|
+
const claudeBin = opts.claudeBin ?? 'claude';
|
|
247
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
248
|
+
const spawnFn = opts.spawnFn ?? ((cmd, args, sopts) => spawn(cmd, args, sopts));
|
|
249
|
+
const held = heldByProviderWindow(label, nowMs());
|
|
250
|
+
if (held)
|
|
251
|
+
return Promise.reject(held);
|
|
252
|
+
return new Promise((resolve, reject) => {
|
|
253
|
+
let child;
|
|
254
|
+
try {
|
|
255
|
+
child = spawnFn(claudeBin, buildOneShotArgs(systemPrompt), { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
reject(new ModelUnavailable({ kind: 'spawn', label, detail: `spawn failed: ${err.message}` }));
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
// Register so a graceful stop reaps this one-shot if it is still running.
|
|
262
|
+
trackChildProcess(child, label);
|
|
263
|
+
let stdout = '';
|
|
264
|
+
let stderr = '';
|
|
265
|
+
let timedOut = false;
|
|
266
|
+
let settled = false;
|
|
267
|
+
child.stdout?.on('data', (chunk) => { stdout += chunk.toString('utf8'); });
|
|
268
|
+
child.stderr?.on('data', (chunk) => { stderr += chunk.toString('utf8'); });
|
|
269
|
+
// A child that exits before draining stdin emits EPIPE on the stdin socket
|
|
270
|
+
// asynchronously; unhandled, that would crash the daemon. The close handler
|
|
271
|
+
// classifies the exit; the write error itself carries nothing more.
|
|
272
|
+
child.stdin?.on?.('error', () => { });
|
|
273
|
+
// The timeout SETTLES the call: 'close' waits for every stdio pipe, and a
|
|
274
|
+
// grandchild (an MCP server the CLI started) that inherited stdout can hold
|
|
275
|
+
// it open after the CLI is dead. The child stays in the worker registry for
|
|
276
|
+
// the teardown reap; a late 'close' is ignored (settled).
|
|
277
|
+
const timer = setTimeout(() => {
|
|
278
|
+
timedOut = true;
|
|
279
|
+
try {
|
|
280
|
+
child.kill('SIGKILL');
|
|
281
|
+
}
|
|
282
|
+
catch { /* ignore */ }
|
|
283
|
+
const { kind, resetAtMs } = classifyOneShotFailure({ exitCode: null, timedOut, summary: parseOneShotStream(stdout), stdout, stderr });
|
|
284
|
+
fail(kind, null, resetAtMs, `no answer within ${Math.round(timeoutMs / 1000)}s; killed`);
|
|
285
|
+
}, timeoutMs);
|
|
286
|
+
const fail = (kind, exitCode, resetAtMs, detail) => {
|
|
287
|
+
if (settled)
|
|
288
|
+
return;
|
|
289
|
+
settled = true;
|
|
290
|
+
clearTimeout(timer);
|
|
291
|
+
if (kind === 'rate_limit' && resetAtMs !== null)
|
|
292
|
+
recordProviderRateLimit(resetAtMs, nowMs());
|
|
293
|
+
reject(new ModelUnavailable({
|
|
294
|
+
kind,
|
|
295
|
+
label,
|
|
296
|
+
exitCode,
|
|
297
|
+
resetAtMs,
|
|
298
|
+
stdoutTail: stdout.slice(-STREAM_TAIL_CHARS),
|
|
299
|
+
stderrTail: stderr.slice(-STREAM_TAIL_CHARS),
|
|
300
|
+
...(detail ? { detail } : {}),
|
|
301
|
+
}));
|
|
302
|
+
};
|
|
303
|
+
child.on('error', (err) => {
|
|
304
|
+
fail('spawn', null, null, `spawn error: ${err.message}`);
|
|
305
|
+
});
|
|
306
|
+
child.on('close', (code) => {
|
|
307
|
+
if (settled)
|
|
308
|
+
return;
|
|
309
|
+
const summary = parseOneShotStream(stdout);
|
|
310
|
+
const completed = code === 0 && summary.result !== undefined && !summary.result.isError;
|
|
311
|
+
if (!completed) {
|
|
312
|
+
const { kind, resetAtMs } = classifyOneShotFailure({ exitCode: code, timedOut, summary, stdout, stderr });
|
|
313
|
+
fail(kind, code, resetAtMs, summary.result?.text ?? undefined);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
settled = true;
|
|
317
|
+
clearTimeout(timer);
|
|
318
|
+
resolve(completedResult(summary));
|
|
319
|
+
});
|
|
320
|
+
try {
|
|
321
|
+
child.stdin?.write(userMessage);
|
|
322
|
+
child.stdin?.end();
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
fail('spawn', null, null, `stdin write failed: ${err.message}`);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=one-shot-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"one-shot-model.js","sourceRoot":"","sources":["../../src/spawn/one-shot-model.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+DAA+D;AAC/D,4DAA4D;AAC5D,4EAA4E;AAC5E,0DAA0D;AAC1D,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE5F,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAEvD,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,yGAAyG;AACzG,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAQ/B;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAuB;IAC3B,KAAK,CAAS;IACd,QAAQ,CAAgB;IACjC,wFAAwF;IAC/E,SAAS,CAAgB;IACzB,UAAU,CAAS;IACnB,UAAU,CAAS;IAE5B,YAAY,IAQX;QACC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IAC1C,CAAC;CACF;AAED,SAAS,sBAAsB,CAAC,IAQ/B;IACC,MAAM,KAAK,GAAa,CAAC,GAAG,IAAI,CAAC,KAAK,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjG,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;WACrB,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;WAC/B,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACrC,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,OAAO,GAAG,YAAY,gBAAgB,CAAC;AACzC,CAAC;AAuDD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACzD,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC3F,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAW,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACvC,OAAO,CAAC,iBAAiB,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;YAChG,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,OAAO,CAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;YACtF,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpF,MAAM,MAAM,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACzC,OAAO,CAAC,MAAM,GAAG;gBACf,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI;gBACnC,IAAI,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,QAAQ,CAAY,CAAC,CAAC,CAAC,IAAI;gBAC9E,cAAc,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;gBAC1D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,OAAO,EAAE,OAAO,KAAK,CAAC,gBAAgB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,gBAAgB,CAAY,CAAC,CAAC,CAAC,IAAI;aAClG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0GAA0G;AAC1G,MAAM,gBAAgB,GAAG,yGAAyG,CAAC;AACnI,gDAAgD;AAChD,MAAM,UAAU,GAAG,iFAAiF,CAAC;AAErG;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,OAAO,CAAC,OAA6B,EAAE,MAAc,EAAE,MAAc;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAMtC;IACC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC;IACrF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC;IAC3D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/E,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxF,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,OAAO;QACL,SAAS;QACT,iBAAiB,EAAE,aAAa;QAChC,WAAW;QACX,0BAA0B;QAC1B,iBAAiB,EAAE,YAAY;KAChC,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,IAAI,qBAAqB,GAAkB,IAAI,CAAC;AAEhD,wGAAwG;AACxG,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAa;IACxD,MAAM,SAAS,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;QACxC,qBAAqB,GAAG,SAAS,CAAC;QAClC,GAAG,CAAC,IAAI,CACN,cAAc,KAAK,+DAA+D;YAClF,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CACvC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC;QAC1B,IAAI,EAAE,YAAY;QAClB,KAAK;QACL,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,wDAAwD;KACjE,CAAC,CAAC;AACL,CAAC;AAED,iEAAiE;AACjE,SAAS,eAAe,CAAC,OAA6B;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAqD,CAAC;IAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,WAAmB,EACnB,IAAyB;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAEhF,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtC,OAAO,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,IAAI,KAAmB,CAAC;QACxB,IAAI,CAAC;YACH,KAAK,GAAG,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAkB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1G,OAAO;QACT,CAAC;QACD,0EAA0E;QAC1E,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEhC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,2EAA2E;QAC3E,4EAA4E;QAC5E,oEAAoE;QACpE,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA6B,CAAC,CAAC,CAAC;QAEhE,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,0DAA0D;QAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACrD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACtI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3F,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,IAAI,GAAG,CAAC,IAA0B,EAAE,QAAuB,EAAE,SAAwB,EAAE,MAAe,EAAE,EAAE;YAC9G,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,YAAY,IAAI,SAAS,KAAK,IAAI;gBAAE,uBAAuB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7F,MAAM,CAAC,IAAI,gBAAgB,CAAC;gBAC1B,IAAI;gBACJ,KAAK;gBACL,QAAQ;gBACR,SAAS;gBACT,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;gBAC5C,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;gBAC5C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,CAAC,CAAC,CAAC;QACN,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAiB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YACxF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1G,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAChC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-hold-park.d.ts","sourceRoot":"","sources":["../../src/spawn/review-hold-park.ts"],"names":[],"mappings":"AAuFA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"review-hold-park.d.ts","sourceRoot":"","sources":["../../src/spawn/review-hold-park.ts"],"names":[],"mappings":"AAuFA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AAStC,+CAA+C;AAC/C,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAAC;IACrF,+BAA+B,CAAC,EAAE,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;IACtF,oBAAoB,CAAC,EAAE,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IAChE,gFAAgF;IAChF,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACnE;AAWD,8CAA8C;AAC9C,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC/C,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAgEhC"}
|
|
@@ -86,6 +86,7 @@ import { updateDeliveryStatus } from '../queries/deliveries.js';
|
|
|
86
86
|
import { clearOperatorHoldGateState, hasOperatorHoldMarker, resolveOperatorHold, } from '../delivery/operator-hold.js';
|
|
87
87
|
import { hasCommitVerdictHoldMarker } from '../delivery/commit-verdict-hold.js';
|
|
88
88
|
import { shortfallParkRefusingRework } from '../verify/shortfall-park.js';
|
|
89
|
+
import { hasModelUnavailableHold } from '../queries/verify-own-holds.js';
|
|
89
90
|
import { clearSpawnCooldownDurably } from './spawn-cooldown.js';
|
|
90
91
|
import { createLogger } from '../shell/log.js';
|
|
91
92
|
const log = createLogger({ module: 'spawn' });
|
|
@@ -119,7 +120,10 @@ export async function gateReviewSpawnOnOperatorHold(focus, deps = {}) {
|
|
|
119
120
|
const marked = deliveries.filter((d) => d.executionStatus === VERIFY_STATUS && hasOperatorHoldMarker(d.gateState));
|
|
120
121
|
const verdictHeldIds = new Set(deliveries.filter((d) => d.executionStatus === VERIFY_STATUS && hasCommitVerdictHoldMarker(d.gateState)).map((d) => d.id));
|
|
121
122
|
const parkedIds = new Set(deliveries.filter((d) => shortfallParkRefusingRework(d) !== null).map((d) => d.id));
|
|
122
|
-
|
|
123
|
+
// Awaiting the model (queries/verify-own-holds.ts): verify's reconciliation could
|
|
124
|
+
// not run, so no verdict exists for a review to close on. Verify releases it.
|
|
125
|
+
const awaitedIds = new Set(deliveries.filter((d) => d.executionStatus === VERIFY_STATUS && hasModelUnavailableHold(d.gateState)).map((d) => d.id));
|
|
126
|
+
if (marked.length === 0 && verdictHeldIds.size === 0 && parkedIds.size === 0 && awaitedIds.size === 0) {
|
|
123
127
|
parkLogged.delete(focus.focus_id);
|
|
124
128
|
return 'none';
|
|
125
129
|
}
|
|
@@ -145,7 +149,7 @@ export async function gateReviewSpawnOnOperatorHold(focus, deps = {}) {
|
|
|
145
149
|
}
|
|
146
150
|
// Every recorded hold still stands. Park only when the review has nothing else
|
|
147
151
|
// it could move: every non-terminal delivery is one of those held deliveries.
|
|
148
|
-
const heldIds = new Set([...marked.map((d) => d.id), ...verdictHeldIds, ...parkedIds]);
|
|
152
|
+
const heldIds = new Set([...marked.map((d) => d.id), ...verdictHeldIds, ...parkedIds, ...awaitedIds]);
|
|
149
153
|
const onlyHeldWork = deliveries.every((d) => TERMINAL_STATUSES.has(d.executionStatus ?? '') || heldIds.has(d.id));
|
|
150
154
|
if (!onlyHeldWork) {
|
|
151
155
|
parkLogged.delete(focus.focus_id);
|
|
@@ -154,7 +158,7 @@ export async function gateReviewSpawnOnOperatorHold(focus, deps = {}) {
|
|
|
154
158
|
if (!parkLogged.has(focus.focus_id)) {
|
|
155
159
|
parkLogged.add(focus.focus_id);
|
|
156
160
|
log.info(`[review-hold-park] "${focus.focus_name}": review parked -- every non-terminal delivery is held in verify ` +
|
|
157
|
-
`by an open operator escalation, an awaited gate verdict or a repeating-shortfall park; no review team spawns ` +
|
|
161
|
+
`by an open operator escalation, an awaited gate verdict, an awaited model or a repeating-shortfall park; no review team spawns ` +
|
|
158
162
|
`(and no teardown accrues) until it clears`);
|
|
159
163
|
}
|
|
160
164
|
return 'parked';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-hold-park.js","sourceRoot":"","sources":["../../src/spawn/review-hold-park.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,4EAA4E;AAC5E,oEAAoE;AACpE,+DAA+D;AAC/D,2FAA2F;AAC3F,mFAAmF;AACnF,2FAA2F;AAC3F,mFAAmF;AACnF,kEAAkE;AAClE,uDAAuD;AACvD,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,GAEpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAqB9C,6EAA6E;AAC7E,8EAA8E;AAC9E,oFAAoF;AACpF,MAAM,aAAa,GAAG,QAAQ,CAAC;AAC/B,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAE9E,oFAAoF;AACpF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAErC,8CAA8C;AAC9C,MAAM,UAAU,6BAA6B;IAC3C,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,KAA+C,EAC/C,OAA2B,EAAE;IAE7B,IAAI,UAA6C,CAAC;IAClD,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,kDAAkD,KAAK,CAAC,UAAU,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5G,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,aAAa,IAAI,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACnH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,aAAa,IAAI,0BAA0B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC1H,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9G,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"review-hold-park.js","sourceRoot":"","sources":["../../src/spawn/review-hold-park.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { type ChildProcess } from 'node:child_process';
|
|
|
15
15
|
import { type TokenUsage } from '@telora/daemon-core';
|
|
16
16
|
import type { DaemonConfig } from '../types/index.js';
|
|
17
17
|
import { type TelemetryMetricRow } from '../otlp/telemetry-writer.js';
|
|
18
|
+
import { type ModelUnavailableKind } from './one-shot-model.js';
|
|
18
19
|
/**
|
|
19
20
|
* MODEL PIN: 'opus'. A routing decision is the one place the system chooses to
|
|
20
21
|
* interrupt a human: it climbs the intent ladder (product/focus context +
|
|
@@ -61,7 +62,36 @@ export interface RoutingDeciderSpawnResult {
|
|
|
61
62
|
stderr: string;
|
|
62
63
|
sessionId: string | null;
|
|
63
64
|
errorMessage?: string;
|
|
65
|
+
/**
|
|
66
|
+
* The MODEL was unavailable: the provider rejected the session on a rate limit
|
|
67
|
+
* (the stream's typed rate_limit_event, a 429 result, or the CLI's own limit
|
|
68
|
+
* prose in the result), refused it on auth (401/403 or its prose), or the
|
|
69
|
+
* provider-wide window was open so nothing was spawned. The decider did not
|
|
70
|
+
* decide and did not ATTEMPT -- the sweep stamps nothing and re-hands the
|
|
71
|
+
* observation once the model is reachable. A timeout with NO provider refusal
|
|
72
|
+
* is not this: a decider that was working for ten minutes ran. A timeout AFTER
|
|
73
|
+
* a refusal is (the refusal explains why it never finished).
|
|
74
|
+
*/
|
|
75
|
+
modelUnavailable?: {
|
|
76
|
+
kind: ModelUnavailableKind;
|
|
77
|
+
resetAtMs: number | null;
|
|
78
|
+
};
|
|
64
79
|
}
|
|
80
|
+
/** What the spawn observed of the provider, for classifying an unavailability. Pure. */
|
|
81
|
+
export interface DeciderProviderFacts {
|
|
82
|
+
rateLimitRejected: {
|
|
83
|
+
resetAtMs: number | null;
|
|
84
|
+
} | null;
|
|
85
|
+
apiErrorStatus: number | null;
|
|
86
|
+
/** The error result's text, when the result was an error (the CLI's own words). */
|
|
87
|
+
errorResultText: string | null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Pure: the model unavailability a finished decider's facts amount to, or null
|
|
91
|
+
* (any other outcome). Typed signals first; the result's prose is read through
|
|
92
|
+
* the one-shot wrapper's classifier so both spawners read one CLI the same way.
|
|
93
|
+
*/
|
|
94
|
+
export declare function deciderModelUnavailability(facts: DeciderProviderFacts): RoutingDeciderSpawnResult['modelUnavailable'] | undefined;
|
|
65
95
|
/** Injectable process seam (tests pass a fake child). */
|
|
66
96
|
export interface RoutingDeciderSpawnSeam {
|
|
67
97
|
spawnProcess: (command: string, args: string[], options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-decider-spawn.d.ts","sourceRoot":"","sources":["../../src/spawn/routing-decider-spawn.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAuC,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"routing-decider-spawn.d.ts","sourceRoot":"","sources":["../../src/spawn/routing-decider-spawn.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,9 @@ import { buildAuditMetricRow } from './lifecycle.js';
|
|
|
22
22
|
import { bufferMetric as defaultBufferMetric } from '../otlp/telemetry-writer.js';
|
|
23
23
|
import { estimateLoopCostUsd } from '../loops/index.js';
|
|
24
24
|
import { createLogger } from '../shell/log.js';
|
|
25
|
+
import { parseRateLimitInfo } from './rate-limit.js';
|
|
26
|
+
import { providerRateLimitHoldUntilMs, recordProviderRateLimit } from './spawn-cooldown.js';
|
|
27
|
+
import { providerRefusalInProse } from './one-shot-model.js';
|
|
25
28
|
const log = createLogger({ module: 'routing-decider' });
|
|
26
29
|
/**
|
|
27
30
|
* MODEL PIN: 'opus'. A routing decision is the one place the system chooses to
|
|
@@ -55,6 +58,21 @@ export const ROUTING_DECIDER_MCP_TOOLS = [
|
|
|
55
58
|
'mcp__telora-products__telora_reality_tree_traverse',
|
|
56
59
|
'mcp__telora-products__telora_wiki_search',
|
|
57
60
|
];
|
|
61
|
+
/**
|
|
62
|
+
* Pure: the model unavailability a finished decider's facts amount to, or null
|
|
63
|
+
* (any other outcome). Typed signals first; the result's prose is read through
|
|
64
|
+
* the one-shot wrapper's classifier so both spawners read one CLI the same way.
|
|
65
|
+
*/
|
|
66
|
+
export function deciderModelUnavailability(facts) {
|
|
67
|
+
if (facts.rateLimitRejected)
|
|
68
|
+
return { kind: 'rate_limit', resetAtMs: facts.rateLimitRejected.resetAtMs };
|
|
69
|
+
if (facts.apiErrorStatus === 429)
|
|
70
|
+
return { kind: 'rate_limit', resetAtMs: null };
|
|
71
|
+
if (facts.apiErrorStatus === 401 || facts.apiErrorStatus === 403)
|
|
72
|
+
return { kind: 'auth', resetAtMs: null };
|
|
73
|
+
const refusal = facts.errorResultText !== null ? providerRefusalInProse(facts.errorResultText) : null;
|
|
74
|
+
return refusal ? { kind: refusal, resetAtMs: null } : undefined;
|
|
75
|
+
}
|
|
58
76
|
const defaultSeam = {
|
|
59
77
|
spawnProcess: (command, args, options) => nodeSpawn(command, args, { cwd: options.cwd, env: options.env, stdio: ['pipe', 'pipe', 'pipe'] }),
|
|
60
78
|
};
|
|
@@ -97,6 +115,66 @@ export function buildRoutingDeciderMetricRow(params) {
|
|
|
97
115
|
metadata: { source: 'routing-decider', escalationId: params.escalationId },
|
|
98
116
|
};
|
|
99
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* The not-started result for a decider asked for inside the provider-wide
|
|
120
|
+
* rate-limit window (spawn-cooldown.ts), or null when no window is open. A
|
|
121
|
+
* decider started now would be rejected on the same limit and its exit consumed
|
|
122
|
+
* as an attempt; the sweep re-hands it after the reset.
|
|
123
|
+
*/
|
|
124
|
+
function providerHoldResult(escalationId) {
|
|
125
|
+
const holdUntil = providerRateLimitHoldUntilMs();
|
|
126
|
+
if (holdUntil === null)
|
|
127
|
+
return null;
|
|
128
|
+
const until = new Date(holdUntil).toISOString();
|
|
129
|
+
log.info(`[routing-decider] not spawning a decider for ${escalationId}: provider rate limit holds every spawn until ${until}`);
|
|
130
|
+
return {
|
|
131
|
+
started: false, exitCode: null, timedOut: false, stdout: '', stderr: '', sessionId: null,
|
|
132
|
+
errorMessage: `provider rate limit holds every spawn until ${until}`,
|
|
133
|
+
modelUnavailable: { kind: 'rate_limit', resetAtMs: holdUntil },
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Listen for the provider's own words about itself on the decider's stream: a
|
|
138
|
+
* REJECTED rate limit carries the reset instant (the typed event the team path
|
|
139
|
+
* reads, spawn/rate-limit.ts) and opens the provider-wide window; an error result
|
|
140
|
+
* carries the API status. The facts are filled in as the session runs.
|
|
141
|
+
*/
|
|
142
|
+
function attachProviderFacts(parser, escalationId) {
|
|
143
|
+
const facts = { rateLimitRejected: null, apiErrorStatus: null, errorResultText: null };
|
|
144
|
+
parser.on('event', (event) => {
|
|
145
|
+
const rl = parseRateLimitInfo(event);
|
|
146
|
+
if (rl && rl.status === 'rejected') {
|
|
147
|
+
facts.rateLimitRejected = { resetAtMs: rl.resetsAtMs };
|
|
148
|
+
if (rl.resetsAtMs !== null)
|
|
149
|
+
recordProviderRateLimit(rl.resetsAtMs);
|
|
150
|
+
log.warn(`[routing-decider] decider for ${escalationId}: provider rate limit REJECTED` +
|
|
151
|
+
`${rl.rateLimitType ? ` [${rl.rateLimitType}]` : ''}` +
|
|
152
|
+
`${rl.resetsAtMs !== null ? ` -- resets ${new Date(rl.resetsAtMs).toISOString()}` : ''}`);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
parser.on('result', (ev) => {
|
|
156
|
+
if (ev.is_error !== true)
|
|
157
|
+
return;
|
|
158
|
+
const status = ev.api_error_status;
|
|
159
|
+
if (typeof status === 'number')
|
|
160
|
+
facts.apiErrorStatus = status;
|
|
161
|
+
const text = ev.result;
|
|
162
|
+
if (typeof text === 'string')
|
|
163
|
+
facts.errorResultText = text;
|
|
164
|
+
});
|
|
165
|
+
return facts;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The `modelUnavailable` slice of a finished decider's result. A clean exit (0,
|
|
169
|
+
* no timeout) is a decider that ran, whatever the provider said along the way;
|
|
170
|
+
* only a session that did NOT complete is classified. Pure.
|
|
171
|
+
*/
|
|
172
|
+
function unavailabilityOf(code, timedOut, facts) {
|
|
173
|
+
if (code === 0 && !timedOut)
|
|
174
|
+
return {};
|
|
175
|
+
const mu = deciderModelUnavailability(facts);
|
|
176
|
+
return mu ? { modelUnavailable: mu } : {};
|
|
177
|
+
}
|
|
100
178
|
/** Spawn one routing decider and resolve when it exits (or is killed at the timeout). Never rejects. */
|
|
101
179
|
export async function spawnRoutingDecider(opts, seam = defaultSeam) {
|
|
102
180
|
const { config, focusId, escalationId } = opts;
|
|
@@ -108,6 +186,9 @@ export async function spawnRoutingDecider(opts, seam = defaultSeam) {
|
|
|
108
186
|
});
|
|
109
187
|
spawnEnv.TELORA_DAEMON_ROUTING_DECIDER = escalationId;
|
|
110
188
|
const periodStart = new Date().toISOString();
|
|
189
|
+
const held = providerHoldResult(escalationId);
|
|
190
|
+
if (held)
|
|
191
|
+
return held;
|
|
111
192
|
return await new Promise((resolve) => {
|
|
112
193
|
let child;
|
|
113
194
|
try {
|
|
@@ -141,6 +222,7 @@ export async function spawnRoutingDecider(opts, seam = defaultSeam) {
|
|
|
141
222
|
}
|
|
142
223
|
});
|
|
143
224
|
parser.on('error', () => { });
|
|
225
|
+
const facts = attachProviderFacts(parser, escalationId);
|
|
144
226
|
parser.on('result', (ev) => {
|
|
145
227
|
if (!ev.usage)
|
|
146
228
|
return;
|
|
@@ -174,11 +256,11 @@ export async function spawnRoutingDecider(opts, seam = defaultSeam) {
|
|
|
174
256
|
const text = () => (assistantText.trim() ? assistantText : rawStdout);
|
|
175
257
|
child.on('error', (err) => {
|
|
176
258
|
clearTimeout(timer);
|
|
177
|
-
resolve({ started, exitCode: null, timedOut, stdout: text(), stderr, sessionId: parser.sessionId, errorMessage: `spawn error: ${err.message}
|
|
259
|
+
resolve({ started, exitCode: null, timedOut, stdout: text(), stderr, sessionId: parser.sessionId, errorMessage: `spawn error: ${err.message}`, ...unavailabilityOf(null, timedOut, facts) });
|
|
178
260
|
});
|
|
179
261
|
child.on('close', (code) => {
|
|
180
262
|
clearTimeout(timer);
|
|
181
|
-
resolve({ started, exitCode: code, timedOut, stdout: text(), stderr, sessionId: parser.sessionId });
|
|
263
|
+
resolve({ started, exitCode: code, timedOut, stdout: text(), stderr, sessionId: parser.sessionId, ...unavailabilityOf(code, timedOut, facts) });
|
|
182
264
|
});
|
|
183
265
|
});
|
|
184
266
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-decider-spawn.js","sourceRoot":"","sources":["../../src/spawn/routing-decider-spawn.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,qEAAqE;AACrE,gBAAgB;AAEhB;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,IAAI,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAA2B,MAAM,6BAA6B,CAAC;AAC3G,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"routing-decider-spawn.js","sourceRoot":"","sources":["../../src/spawn/routing-decider-spawn.ts"],"names":[],"mappings":"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"}
|