@glbgpt/cli 0.2.2 → 0.2.4
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/README.md +62 -3
- package/dist/src/coding/bashTool.js +27 -11
- package/dist/src/coding/bashTool.js.map +1 -1
- package/dist/src/coding/deliveryCheck.d.ts +7 -0
- package/dist/src/coding/deliveryCheck.js +143 -0
- package/dist/src/coding/deliveryCheck.js.map +1 -0
- package/dist/src/coding/permissionGate.d.ts +6 -0
- package/dist/src/coding/permissionGate.js +8 -2
- package/dist/src/coding/permissionGate.js.map +1 -1
- package/dist/src/coding/projectContext.js +11 -1
- package/dist/src/coding/projectContext.js.map +1 -1
- package/dist/src/commands/configCommand.js +20 -1
- package/dist/src/commands/configCommand.js.map +1 -1
- package/dist/src/commands/execCommand.js +18 -1
- package/dist/src/commands/execCommand.js.map +1 -1
- package/dist/src/config/configFile.d.ts +8 -0
- package/dist/src/config/configFile.js +8 -0
- package/dist/src/config/configFile.js.map +1 -1
- package/dist/src/core/compaction.d.ts +6 -1
- package/dist/src/core/compaction.js +23 -5
- package/dist/src/core/compaction.js.map +1 -1
- package/dist/src/core/contextPrune.d.ts +18 -6
- package/dist/src/core/contextPrune.js +108 -20
- package/dist/src/core/contextPrune.js.map +1 -1
- package/dist/src/core/httpChatBackend.js +72 -20
- package/dist/src/core/httpChatBackend.js.map +1 -1
- package/dist/src/core/progressGuard.d.ts +16 -0
- package/dist/src/core/progressGuard.js +197 -0
- package/dist/src/core/progressGuard.js.map +1 -0
- package/dist/src/core/runChat.d.ts +9 -1
- package/dist/src/core/runChat.js +31 -10
- package/dist/src/core/runChat.js.map +1 -1
- package/dist/src/core/tokenBudget.d.ts +45 -0
- package/dist/src/core/tokenBudget.js +111 -0
- package/dist/src/core/tokenBudget.js.map +1 -0
- package/dist/src/core/turnLimits.d.ts +5 -0
- package/dist/src/core/turnLimits.js +28 -0
- package/dist/src/core/turnLimits.js.map +1 -0
- package/dist/src/core/turnLoop.d.ts +8 -2
- package/dist/src/core/turnLoop.js +201 -89
- package/dist/src/core/turnLoop.js.map +1 -1
- package/dist/src/core/types.d.ts +24 -1
- package/dist/src/exec/output.d.ts +7 -1
- package/dist/src/exec/output.js +29 -13
- package/dist/src/exec/output.js.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/tui/App.js +8 -5
- package/dist/src/tui/App.js.map +1 -1
- package/dist/src/tui/chatController.d.ts +15 -3
- package/dist/src/tui/chatController.js +108 -42
- package/dist/src/tui/chatController.js.map +1 -1
- package/dist/src/tui/run.js +1 -0
- package/dist/src/tui/run.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import { BUDGET_EXHAUSTED_MESSAGE
|
|
1
|
+
import { BUDGET_EXHAUSTED_MESSAGE } from '../fs/limits.js';
|
|
2
|
+
import { resolveMaxToolCalls } from './turnLimits.js';
|
|
3
|
+
import { pruneSessionContext } from './contextPrune.js';
|
|
4
|
+
import { ProgressGuard } from './progressGuard.js';
|
|
5
|
+
import { TurnTokenBudget } from './tokenBudget.js';
|
|
2
6
|
import { track } from '../telemetry/telemetry.js';
|
|
3
|
-
/**
|
|
4
|
-
const
|
|
7
|
+
/** Bound retries that cannot dispatch tools, independently of productive tool rounds. */
|
|
8
|
+
const MAX_NO_DISPATCH_ROUNDS = 3;
|
|
9
|
+
const MAX_FINAL_ANSWER_ATTEMPTS = 2;
|
|
10
|
+
const NO_DISPATCH_MESSAGE = 'Several tool rounds could not execute. Stop requesting tools and summarize the progress, ' +
|
|
11
|
+
'the blocker, and any unfinished work.';
|
|
5
12
|
/**
|
|
6
13
|
* Fed back for every tool call on a message the provider cut off with finish_reason=length:
|
|
7
14
|
* streamed tool-call arguments are accumulated incrementally, so a length-truncated message
|
|
@@ -34,29 +41,32 @@ export class TurnLoop {
|
|
|
34
41
|
return this.backend;
|
|
35
42
|
}
|
|
36
43
|
async runTurn(session, userContent, emit, opts = {}) {
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
// and is re-sent every subsequent turn — poisoning the session so even "hello" keeps failing.
|
|
44
|
+
// Only a rejected first request can be rolled back. Later failures must preserve
|
|
45
|
+
// completed tool rounds: local writes and paid tasks cannot be undone with history.
|
|
40
46
|
const checkpoint = session.messageCount();
|
|
41
47
|
const startedAt = Date.now();
|
|
42
|
-
const budget = opts.maxToolCalls
|
|
48
|
+
const budget = resolveMaxToolCalls(opts.maxToolCalls);
|
|
43
49
|
let toolCallsUsed = 0;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
50
|
+
let completedRounds = 0;
|
|
51
|
+
let noDispatchRounds = 0;
|
|
52
|
+
let finalAnswerAttempts = 0;
|
|
53
|
+
let lastPromptTokens = 0;
|
|
54
|
+
const progress = new ProgressGuard();
|
|
55
|
+
const tokens = opts.tokenBudget ?? new TurnTokenBudget(opts.maxTurnTokens);
|
|
56
|
+
let repetitionPause;
|
|
57
|
+
const pause = async (reason, message) => {
|
|
58
|
+
// Persist the reason alongside the already completed tool history for /resume.
|
|
59
|
+
session.addSystemNote(`[turn paused: ${reason}] ${message} ` +
|
|
60
|
+
'This records the previous turn only. A new user message may resume work with fresh turn limits.');
|
|
61
|
+
await emit({ type: 'turn_paused', reason, message });
|
|
62
|
+
};
|
|
63
|
+
const observe = async (call, result) => {
|
|
64
|
+
const finding = progress.observe(call.function.name, call.function.arguments, result);
|
|
65
|
+
if (finding?.kind === 'pause')
|
|
66
|
+
repetitionPause = finding.message;
|
|
67
|
+
if (finding?.kind === 'warning') {
|
|
68
|
+
await emit({ type: 'notice', message: finding.message });
|
|
69
|
+
return { ...result, repeated_call_notice: finding.message };
|
|
60
70
|
}
|
|
61
71
|
return result;
|
|
62
72
|
};
|
|
@@ -64,14 +74,45 @@ export class TurnLoop {
|
|
|
64
74
|
// bounds per-turn spend). Enforced alongside the global budget below.
|
|
65
75
|
const perToolUsed = new Map();
|
|
66
76
|
session.addUserMessage(userContent);
|
|
67
|
-
|
|
77
|
+
while (true) {
|
|
78
|
+
if (opts.signal?.aborted) {
|
|
79
|
+
emit({ type: 'turn_interrupted' });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (repetitionPause) {
|
|
83
|
+
await pause('repeated_no_progress', repetitionPause +
|
|
84
|
+
' Work and tool history have been preserved. Review the results, continue with a new message, or switch models.');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const limitReason = toolCallsUsed >= budget ? 'tool_budget' : 'tools_unavailable';
|
|
88
|
+
const stopReason = toolCallsUsed >= budget
|
|
89
|
+
? BUDGET_EXHAUSTED_MESSAGE
|
|
90
|
+
: noDispatchRounds >= MAX_NO_DISPATCH_ROUNDS
|
|
91
|
+
? NO_DISPATCH_MESSAGE
|
|
92
|
+
: undefined;
|
|
93
|
+
if (stopReason && finalAnswerAttempts >= MAX_FINAL_ANSWER_ATTEMPTS) {
|
|
94
|
+
await pause(limitReason, 'The model kept requesting tools after the turn limit. Progress has been preserved; ' +
|
|
95
|
+
'continue with a new message to resume the unfinished work.');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (stopReason)
|
|
99
|
+
finalAnswerAttempts += 1;
|
|
100
|
+
pruneSessionContext(session, lastPromptTokens);
|
|
68
101
|
let content;
|
|
69
102
|
let toolCalls;
|
|
70
103
|
let finishReason;
|
|
71
104
|
try {
|
|
72
|
-
({ content, toolCalls, finishReason } = await this.streamOneCall(session,
|
|
105
|
+
({ content, toolCalls, finishReason } = await this.streamOneCall(session, (event) => {
|
|
106
|
+
if (event.type === 'usage')
|
|
107
|
+
lastPromptTokens = event.promptTokens;
|
|
108
|
+
return emit(event);
|
|
109
|
+
}, opts, tokens, stopReason));
|
|
73
110
|
}
|
|
74
111
|
catch (err) {
|
|
112
|
+
if (err instanceof TokenBudgetPause) {
|
|
113
|
+
await pause('token_budget', err.message);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
75
116
|
// User interruption (Esc): keep whatever partial text already streamed so the
|
|
76
117
|
// conversation history matches what the user saw, then end the turn quietly.
|
|
77
118
|
if (opts.signal?.aborted) {
|
|
@@ -81,35 +122,49 @@ export class TurnLoop {
|
|
|
81
122
|
emit({ type: 'turn_interrupted' });
|
|
82
123
|
return;
|
|
83
124
|
}
|
|
84
|
-
|
|
125
|
+
const partial = partialContentOf(err);
|
|
126
|
+
if (partial)
|
|
127
|
+
session.addAssistantMessage(partial, []);
|
|
128
|
+
else if (completedRounds === 0)
|
|
129
|
+
session.rollbackTo(checkpoint);
|
|
85
130
|
throw err;
|
|
86
131
|
}
|
|
87
132
|
// A call that produced neither text nor tool calls is a failure, not a completed turn
|
|
88
133
|
// (e.g. an upstream that closed the stream early). Don't record an empty assistant
|
|
89
134
|
// message and don't pretend the turn succeeded.
|
|
90
|
-
if (content.length === 0 && toolCalls.length === 0) {
|
|
135
|
+
if (content.trim().length === 0 && toolCalls.length === 0) {
|
|
91
136
|
// The request itself succeeded (no throw) — the model just returned nothing. Keep the
|
|
92
137
|
// user message (not a poison payload) so a retry has context; only add nothing more.
|
|
93
138
|
emit({
|
|
94
139
|
type: 'error',
|
|
95
|
-
message:
|
|
140
|
+
message: `The model ${session.model} returned no output. This turn did not complete; review progress before retrying.`,
|
|
96
141
|
});
|
|
97
142
|
return;
|
|
98
143
|
}
|
|
99
144
|
session.addAssistantMessage(content.length > 0 ? content : null, toolCalls);
|
|
145
|
+
completedRounds += 1;
|
|
100
146
|
if (toolCalls.length === 0) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
147
|
+
if (stopReason && (budget > 0 || completedRounds > 1)) {
|
|
148
|
+
await pause(limitReason, stopReason + ' Progress has been preserved. Continue with a new message to resume.');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const assessment = finishReason === 'length'
|
|
152
|
+
? { status: 'incomplete', message: 'The model response reached its output limit. The task may be unfinished; review the partial answer before continuing.' }
|
|
153
|
+
: await opts.assessTask?.();
|
|
154
|
+
if (assessment)
|
|
155
|
+
await emit({ type: 'task_status', assessment });
|
|
156
|
+
track('turn_complete', {
|
|
157
|
+
model: session.model, latency_ms: Date.now() - startedAt, tool_calls: toolCallsUsed,
|
|
158
|
+
});
|
|
159
|
+
await emit({ type: 'turn_complete' });
|
|
160
|
+
}
|
|
107
161
|
return;
|
|
108
162
|
}
|
|
109
163
|
// Length-truncated message with tool calls: never execute them (arguments may be
|
|
110
164
|
// silently incomplete). Answer every call with an error result and loop so the
|
|
111
165
|
// model re-issues. Consumes no budget — nothing ran.
|
|
112
|
-
if (finishReason === 'length') {
|
|
166
|
+
if (finishReason === 'length' && !stopReason) {
|
|
167
|
+
noDispatchRounds += 1;
|
|
113
168
|
for (const call of toolCalls) {
|
|
114
169
|
const result = { error: LENGTH_TRUNCATED_TOOLS_MESSAGE };
|
|
115
170
|
emit({
|
|
@@ -139,7 +194,10 @@ export class TurnLoop {
|
|
|
139
194
|
// Budget + per-tool cap slots are assigned by call order UP FRONT so the outcome is
|
|
140
195
|
// deterministic whether the round runs sequentially or in parallel. A call denied by
|
|
141
196
|
// its tool's own cap consumes no global-budget slot (it never executes).
|
|
197
|
+
const usedBeforeRound = toolCallsUsed;
|
|
142
198
|
const denial = toolCalls.map((call) => {
|
|
199
|
+
if (stopReason)
|
|
200
|
+
return stopReason;
|
|
143
201
|
const name = call.function.name;
|
|
144
202
|
const cap = this.registry.maxCallsPerTurn(name);
|
|
145
203
|
if (cap !== undefined) {
|
|
@@ -166,9 +224,8 @@ export class TurnLoop {
|
|
|
166
224
|
}
|
|
167
225
|
const results = await Promise.all(toolCalls.map(async (call, i) => {
|
|
168
226
|
const denied = denial[i];
|
|
169
|
-
const result =
|
|
170
|
-
|
|
171
|
-
: await this.registry.dispatch(call.function.name, call.function.arguments));
|
|
227
|
+
const result = denied ? { error: denied } :
|
|
228
|
+
await this.registry.dispatch(call.function.name, call.function.arguments);
|
|
172
229
|
// Ends may arrive out of completion order; the TUI matches rows by call id.
|
|
173
230
|
emit({
|
|
174
231
|
type: 'tool_call_end',
|
|
@@ -179,7 +236,10 @@ export class TurnLoop {
|
|
|
179
236
|
return result;
|
|
180
237
|
}));
|
|
181
238
|
// Tool messages must follow the tool_calls order the model emitted.
|
|
182
|
-
|
|
239
|
+
for (let i = 0; i < toolCalls.length; i++) {
|
|
240
|
+
const result = denial[i] ? results[i] : await observe(toolCalls[i], results[i]);
|
|
241
|
+
session.addToolMessage(toolCalls[i].id, toolCalls[i].function.name, result);
|
|
242
|
+
}
|
|
183
243
|
}
|
|
184
244
|
else {
|
|
185
245
|
for (let i = 0; i < toolCalls.length; i++) {
|
|
@@ -193,10 +253,8 @@ export class TurnLoop {
|
|
|
193
253
|
});
|
|
194
254
|
// Past a budget/cap, don't dispatch: feed the model an error instead, so it
|
|
195
255
|
// wraps up with what it has (a normal answer, not a hard stop).
|
|
196
|
-
const denied = denial[i];
|
|
197
|
-
const result =
|
|
198
|
-
? { error: denied }
|
|
199
|
-
: await this.registry.dispatch(call.function.name, call.function.arguments));
|
|
256
|
+
const denied = denial[i] ?? repetitionPause;
|
|
257
|
+
const result = denied ? { error: denied } : await observe(call, await this.registry.dispatch(call.function.name, call.function.arguments));
|
|
200
258
|
emit({
|
|
201
259
|
type: 'tool_call_end',
|
|
202
260
|
id: call.id,
|
|
@@ -206,45 +264,72 @@ export class TurnLoop {
|
|
|
206
264
|
session.addToolMessage(call.id, call.function.name, result);
|
|
207
265
|
}
|
|
208
266
|
}
|
|
267
|
+
noDispatchRounds = toolCallsUsed === usedBeforeRound ? noDispatchRounds + 1 : 0;
|
|
209
268
|
if (opts.signal?.aborted) {
|
|
210
269
|
emit({ type: 'turn_interrupted' });
|
|
211
270
|
return;
|
|
212
271
|
}
|
|
272
|
+
if (repetitionPause || tokens.snapshot().remainingTokens === 0)
|
|
273
|
+
continue;
|
|
213
274
|
// Steering: text typed mid-turn joins the conversation before the next model call.
|
|
214
275
|
for (const content of opts.takeSteering?.() ?? []) {
|
|
215
276
|
session.addUserMessage(content);
|
|
216
277
|
}
|
|
217
278
|
// Loop: stream again now that tool results (and any steering) are in the messages.
|
|
218
279
|
}
|
|
219
|
-
session.rollbackTo(checkpoint);
|
|
220
|
-
emit({
|
|
221
|
-
type: 'error',
|
|
222
|
-
message: `Turn exceeded ${MAX_ROUNDS} tool-calling rounds`,
|
|
223
|
-
});
|
|
224
280
|
}
|
|
225
281
|
/** Stream a single model call, emitting text deltas and accumulating tool_calls. */
|
|
226
|
-
async streamOneCall(session, emit, opts,
|
|
282
|
+
async streamOneCall(session, emit, opts, tokens, stopReason) {
|
|
227
283
|
const req = {
|
|
228
284
|
model: session.model,
|
|
229
285
|
// The pruning projection, not the raw history (raw stays intact on disk).
|
|
230
|
-
messages:
|
|
231
|
-
|
|
286
|
+
messages: stopReason
|
|
287
|
+
? [...session.requestMessages(), {
|
|
288
|
+
role: 'system',
|
|
289
|
+
content: `${stopReason} Give a final answer using the results already available. ` +
|
|
290
|
+
'Clearly distinguish completed work from unfinished work and explain how to continue. Do not call tools.',
|
|
291
|
+
}]
|
|
292
|
+
: session.requestMessages(),
|
|
293
|
+
tools: stopReason ? undefined : this.registry.toOpenAITools(opts.includeGatedTools ?? true),
|
|
232
294
|
stream: true,
|
|
233
|
-
...(
|
|
295
|
+
...(stopReason ? { tool_choice: 'none' } : {}),
|
|
234
296
|
...(opts.responseFormat !== undefined ? { response_format: opts.responseFormat } : {}),
|
|
235
297
|
};
|
|
298
|
+
const preflight = tokens.preflight(req);
|
|
299
|
+
if (!preflight.allowed)
|
|
300
|
+
throw new TokenBudgetPause(tokenPauseMessage(preflight));
|
|
236
301
|
let content = '';
|
|
237
302
|
const toolAcc = new Map();
|
|
238
303
|
let finishReason = null;
|
|
304
|
+
let usage;
|
|
239
305
|
try {
|
|
240
|
-
finishReason = await this.consumeStream(req, opts, emit, (text) => (content += text), toolAcc);
|
|
306
|
+
finishReason = await this.consumeStream(req, opts, emit, (text) => (content += text), toolAcc, (value) => { usage = value; });
|
|
241
307
|
}
|
|
242
308
|
catch (err) {
|
|
243
|
-
//
|
|
309
|
+
// Preserve already streamed text on interruption or a later upstream failure.
|
|
244
310
|
if (opts.signal?.aborted)
|
|
245
311
|
throw new InterruptedStreamError(content);
|
|
312
|
+
if (content)
|
|
313
|
+
throw new PartialStreamError(content, err);
|
|
246
314
|
throw err;
|
|
247
315
|
}
|
|
316
|
+
finally {
|
|
317
|
+
const output = {
|
|
318
|
+
content,
|
|
319
|
+
tool_calls: [...toolAcc.values()].map(entry => ({
|
|
320
|
+
id: entry.id,
|
|
321
|
+
type: 'function',
|
|
322
|
+
function: { name: entry.name, arguments: entry.args },
|
|
323
|
+
...(entry.extraContent !== undefined ? { extra_content: entry.extraContent } : {}),
|
|
324
|
+
})),
|
|
325
|
+
};
|
|
326
|
+
const snapshot = tokens.recordCall(req, output, usage);
|
|
327
|
+
await emit({ type: 'token_budget', usedTokens: snapshot.usedTokens, limitTokens: snapshot.limitTokens, estimated: snapshot.estimated });
|
|
328
|
+
if (tokens.takeWarning())
|
|
329
|
+
await emit({ type: 'notice', message: `This turn has used ${snapshot.usedTokens.toLocaleString()} of its ${snapshot.limitTokens.toLocaleString()} token budget` +
|
|
330
|
+
`${snapshot.estimated ? ' (includes estimates)' : ''}. The CLI will check the next request against the remaining budget; an in-flight response can exceed it. ` +
|
|
331
|
+
'This is a token safeguard, not an exact credit limit.' });
|
|
332
|
+
}
|
|
248
333
|
const toolCalls = [...toolAcc.entries()]
|
|
249
334
|
.sort((a, b) => a[0] - b[0])
|
|
250
335
|
.map(([, e]) => ({
|
|
@@ -261,44 +346,53 @@ export class TurnLoop {
|
|
|
261
346
|
* Iterate the backend stream, forwarding deltas/usage and accumulating tool-call pieces.
|
|
262
347
|
* Returns the last non-null finish_reason seen (providers send it on the closing chunk).
|
|
263
348
|
*/
|
|
264
|
-
async consumeStream(req, opts, emit, onText, toolAcc) {
|
|
349
|
+
async consumeStream(req, opts, emit, onText, toolAcc, onUsage) {
|
|
265
350
|
let finishReason = null;
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
351
|
+
let usage;
|
|
352
|
+
try {
|
|
353
|
+
for await (const chunk of this.backend.stream(req, opts.signal)) {
|
|
354
|
+
// Usage snapshots can arrive with empty/no choices; retain the last one.
|
|
355
|
+
if (chunk.usage)
|
|
356
|
+
usage = chunk.usage;
|
|
357
|
+
const choice = chunk.choices?.[0];
|
|
358
|
+
if (typeof choice?.finish_reason === 'string')
|
|
359
|
+
finishReason = choice.finish_reason;
|
|
360
|
+
const delta = choice?.delta;
|
|
361
|
+
if (!delta)
|
|
362
|
+
continue;
|
|
363
|
+
if (typeof delta.content === 'string' && delta.content.length > 0) {
|
|
364
|
+
onText(delta.content);
|
|
365
|
+
const r = emit({ type: 'assistant_delta', text: delta.content });
|
|
366
|
+
if (r)
|
|
367
|
+
await r; // backpressure: wait for the consumer to drain
|
|
368
|
+
}
|
|
369
|
+
if (delta.tool_calls) {
|
|
370
|
+
for (const tc of delta.tool_calls) {
|
|
371
|
+
const entry = toolAcc.get(tc.index) ?? { id: '', name: '', args: '' };
|
|
372
|
+
if (tc.id)
|
|
373
|
+
entry.id = tc.id;
|
|
374
|
+
if (tc.function?.name)
|
|
375
|
+
entry.name = tc.function.name;
|
|
376
|
+
if (tc.function?.arguments)
|
|
377
|
+
entry.args += tc.function.arguments;
|
|
378
|
+
if (tc.extra_content !== undefined)
|
|
379
|
+
entry.extraContent = tc.extra_content;
|
|
380
|
+
toolAcc.set(tc.index, entry);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
// Providers can send cumulative snapshots more than once in a stream. Emit the
|
|
387
|
+
// final known usage once per request, including on failure or interruption.
|
|
388
|
+
onUsage(usage);
|
|
389
|
+
if (usage) {
|
|
390
|
+
await emit({
|
|
271
391
|
type: 'usage',
|
|
272
|
-
promptTokens:
|
|
273
|
-
completionTokens:
|
|
392
|
+
promptTokens: usage.prompt_tokens ?? 0,
|
|
393
|
+
completionTokens: usage.completion_tokens ?? 0,
|
|
274
394
|
});
|
|
275
395
|
}
|
|
276
|
-
const choice = chunk.choices?.[0];
|
|
277
|
-
if (typeof choice?.finish_reason === 'string')
|
|
278
|
-
finishReason = choice.finish_reason;
|
|
279
|
-
const delta = choice?.delta;
|
|
280
|
-
if (!delta)
|
|
281
|
-
continue;
|
|
282
|
-
if (typeof delta.content === 'string' && delta.content.length > 0) {
|
|
283
|
-
onText(delta.content);
|
|
284
|
-
const r = emit({ type: 'assistant_delta', text: delta.content });
|
|
285
|
-
if (r)
|
|
286
|
-
await r; // backpressure: wait for the consumer to drain
|
|
287
|
-
}
|
|
288
|
-
if (delta.tool_calls) {
|
|
289
|
-
for (const tc of delta.tool_calls) {
|
|
290
|
-
const entry = toolAcc.get(tc.index) ?? { id: '', name: '', args: '' };
|
|
291
|
-
if (tc.id)
|
|
292
|
-
entry.id = tc.id;
|
|
293
|
-
if (tc.function?.name)
|
|
294
|
-
entry.name = tc.function.name;
|
|
295
|
-
if (tc.function?.arguments)
|
|
296
|
-
entry.args += tc.function.arguments;
|
|
297
|
-
if (tc.extra_content !== undefined)
|
|
298
|
-
entry.extraContent = tc.extra_content;
|
|
299
|
-
toolAcc.set(tc.index, entry);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
396
|
}
|
|
303
397
|
return finishReason;
|
|
304
398
|
}
|
|
@@ -312,7 +406,7 @@ class InterruptedStreamError extends Error {
|
|
|
312
406
|
}
|
|
313
407
|
}
|
|
314
408
|
function partialContentOf(err) {
|
|
315
|
-
return err instanceof InterruptedStreamError ? err.partialContent : '';
|
|
409
|
+
return err instanceof InterruptedStreamError || err instanceof PartialStreamError ? err.partialContent : '';
|
|
316
410
|
}
|
|
317
411
|
function safeParseArgs(raw) {
|
|
318
412
|
try {
|
|
@@ -322,4 +416,22 @@ function safeParseArgs(raw) {
|
|
|
322
416
|
return {};
|
|
323
417
|
}
|
|
324
418
|
}
|
|
419
|
+
class TokenBudgetPause extends Error {
|
|
420
|
+
}
|
|
421
|
+
function tokenPauseMessage(check) {
|
|
422
|
+
const reason = check.reason === 'request_too_large'
|
|
423
|
+
? `The next request needs an estimated ${check.estimatedPromptTokens.toLocaleString()} input tokens, ` +
|
|
424
|
+
`above the ${check.remainingTokens.toLocaleString()} tokens left in this turn's budget.`
|
|
425
|
+
: `This turn has used ${check.usedTokens.toLocaleString()} tokens, reaching its ${check.limitTokens.toLocaleString()} token budget.`;
|
|
426
|
+
return reason + ' Work has been preserved. Review the results and continue with a new message, ' +
|
|
427
|
+
'or change max-turn-tokens. Usage may include estimates; an in-flight response can exceed this safeguard. ' +
|
|
428
|
+
'Billing is determined by the server.';
|
|
429
|
+
}
|
|
430
|
+
class PartialStreamError extends Error {
|
|
431
|
+
partialContent;
|
|
432
|
+
constructor(partialContent, cause) {
|
|
433
|
+
super(cause instanceof Error ? cause.message : String(cause), { cause });
|
|
434
|
+
this.partialContent = partialContent;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
325
437
|
//# sourceMappingURL=turnLoop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnLoop.js","sourceRoot":"","sources":["../../../src/core/turnLoop.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAElD,+EAA+E;AAC/E,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB;;;;;;GAMG;AACH,MAAM,8BAA8B,GAClC,uFAAuF;IACvF,wEAAwE,CAAC;AA4B3E;;;;;;;;;;GAUG;AACH,MAAM,OAAO,QAAQ;IAEA;IACA;IAFnB,YACmB,OAAoB,EACpB,QAAsB;QADtB,YAAO,GAAP,OAAO,CAAa;QACpB,aAAQ,GAAR,QAAQ,CAAc;IACtC,CAAC;IAEJ,wGAAwG;IACxG,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAgB,EAChB,WAAwD,EACxD,IAAU,EACV,OAAoB,EAAE;QAEtB,uFAAuF;QACvF,2FAA2F;QAC3F,8FAA8F;QAC9F,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,uBAAuB,CAAC;QAC5D,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,uFAAuF;QACvF,sFAAsF;QACtF,kFAAkF;QAClF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,MAAM,gBAAgB,GAAG,CAAI,IAAc,EAAE,MAAS,EAAK,EAAE;YAC3D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3C,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACzB,IACE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM,KAAK,IAAI;gBACf,OAAO,MAAM,KAAK,QAAQ;gBAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EACtB,CAAC;gBACD,OAAO;oBACL,GAAI,MAAkC;oBACtC,oBAAoB,EAAE,iBAAiB,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,wJAAwJ;iBACrN,CAAC;YACT,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QACF,kFAAkF;QAClF,sEAAsE;QACtE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAEpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,IAAI,OAAe,CAAC;YACpB,IAAI,SAAqB,CAAC;YAC1B,IAAI,YAA2B,CAAC;YAChC,IAAI,CAAC;gBACH,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAC9D,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,aAAa,IAAI,MAAM,CACxB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,8EAA8E;gBAC9E,6EAA6E;gBAC7E,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACtC,IAAI,OAAO;wBAAE,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACtD,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,8BAA8B;gBAC9D,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,sFAAsF;YACtF,mFAAmF;YACnF,gDAAgD;YAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnD,sFAAsF;gBACtF,qFAAqF;gBACrF,IAAI,CAAC;oBACH,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,iDAAiD;iBAC3D,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAE5E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,eAAe,EAAE;oBACrB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,UAAU,EAAE,aAAa;iBAC1B,CAAC,CAAC;gBACH,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,iFAAiF;YACjF,+EAA+E;YAC/E,qDAAqD;YACrD,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;oBACzD,IAAI,CAAC;wBACH,IAAI,EAAE,iBAAiB;wBACvB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;wBACxB,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;qBAC7C,CAAC,CAAC;oBACH,IAAI,CAAC;wBACH,IAAI,EAAE,eAAe;wBACrB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;wBACxB,MAAM;qBACP,CAAC,CAAC;oBACH,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC9D,CAAC;gBACD,SAAS;YACX,CAAC;YAED,2EAA2E;YAC3E,sFAAsF;YACtF,4DAA4D;YAC5D,EAAE;YACF,iFAAiF;YACjF,6EAA6E;YAC7E,iFAAiF;YACjF,6DAA6D;YAC7D,oFAAoF;YACpF,qFAAqF;YACrF,yEAAyE;YACzE,MAAM,MAAM,GAAyB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;wBAChB,OAAO,OAAO,IAAI,0CAA0C,GAAG,uCAAuC,CAAC;oBACzG,CAAC;oBACD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,aAAa,IAAI,MAAM;oBAAE,OAAO,wBAAwB,CAAC;gBAC7D,aAAa,IAAI,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,MAAM,QAAQ,GACZ,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5F,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACH,IAAI,EAAE,iBAAiB;wBACvB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;wBACxB,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;qBAC7C,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;oBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM,MAAM,GAAG,gBAAgB,CAC7B,IAAI,EACJ,MAAM;wBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;wBACnB,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC9E,CAAC;oBACF,4EAA4E;oBAC5E,IAAI,CAAC;wBACH,IAAI,EAAE,eAAe;wBACrB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;wBACxB,MAAM;qBACP,CAAC,CAAC;oBACH,OAAO,MAAM,CAAC;gBAChB,CAAC,CAAC,CACH,CAAC;gBACF,oEAAoE;gBACpE,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClG,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBACpD,IAAI,CAAC;wBACH,IAAI,EAAE,iBAAiB;wBACvB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;wBACxB,IAAI;qBACL,CAAC,CAAC;oBACH,4EAA4E;oBAC5E,gEAAgE;oBAChE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM,MAAM,GAAG,gBAAgB,CAC7B,IAAI,EACJ,MAAM;wBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;wBACnB,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC9E,CAAC;oBACF,IAAI,CAAC;wBACH,IAAI,EAAE,eAAe;wBACrB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;wBACxB,MAAM;qBACP,CAAC,CAAC;oBACH,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,mFAAmF;YACnF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClD,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;YACD,mFAAmF;QACrF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,iBAAiB,UAAU,sBAAsB;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,oFAAoF;IAC5E,KAAK,CAAC,aAAa,CACzB,OAAgB,EAChB,IAAU,EACV,IAAiB,EACjB,YAAqB;QAMrB,MAAM,GAAG,GAAG;YACV,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,0EAA0E;YAC1E,QAAQ,EAAE,OAAO,CAAC,eAAe,EAAE;YACnC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC;YAClE,MAAM,EAAE,IAAa;YACrB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvF,CAAC;QAEF,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8E,CAAC;QACtG,IAAI,YAAY,GAAkB,IAAI,CAAC;QAEvC,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACjG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,8EAA8E;YAC9E,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACpE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAe,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;aACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACf,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,UAAmB;YACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;YAC7C,uFAAuF;YACvF,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE7C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,aAAa,CACzB,GAAyC,EACzC,IAAiB,EACjB,IAAU,EACV,MAA8B,EAC9B,OAAwF;QAExF,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChE,sFAAsF;YACtF,8CAA8C;YAC9C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC;oBAC5C,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC;iBACrD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,OAAO,MAAM,EAAE,aAAa,KAAK,QAAQ;gBAAE,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;YACnF,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;YAC5B,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjE,IAAI,CAAC;oBAAE,MAAM,CAAC,CAAC,CAAC,+CAA+C;YACjE,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;oBACtE,IAAI,EAAE,CAAC,EAAE;wBAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;oBAC5B,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI;wBAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACrD,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS;wBAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAChE,IAAI,EAAE,CAAC,aAAa,KAAK,SAAS;wBAAE,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,aAAa,CAAC;oBAC1E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,sBAAuB,SAAQ,KAAK;IACnB;IAArB,YAAqB,cAAsB;QACzC,KAAK,CAAC,aAAa,CAAC,CAAC;QADF,mBAAc,GAAd,cAAc,CAAQ;IAE3C,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,OAAO,GAAG,YAAY,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"turnLoop.js","sourceRoot":"","sources":["../../../src/core/turnLoop.ts"],"names":[],"mappings":"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"}
|
package/dist/src/core/types.d.ts
CHANGED
|
@@ -123,6 +123,12 @@ export interface ClientTool {
|
|
|
123
123
|
}
|
|
124
124
|
/** Result of running a client tool. Serialized to JSON as the tool message content. */
|
|
125
125
|
export type ToolResult = Record<string, unknown>;
|
|
126
|
+
export type PauseReason = 'repeated_no_progress' | 'token_budget' | 'tool_budget' | 'tools_unavailable';
|
|
127
|
+
/** A conversational turn ending does not prove the user's deliverable works. */
|
|
128
|
+
export interface TaskAssessment {
|
|
129
|
+
status: 'incomplete' | 'unverified';
|
|
130
|
+
message: string;
|
|
131
|
+
}
|
|
126
132
|
/**
|
|
127
133
|
* Typed events emitted by the engine. Both the TUI and `exec` front-ends
|
|
128
134
|
* consume the same event stream, so their behavior stays consistent.
|
|
@@ -140,10 +146,27 @@ export type EngineEvent = {
|
|
|
140
146
|
id: string;
|
|
141
147
|
name: string;
|
|
142
148
|
result: ToolResult;
|
|
143
|
-
}
|
|
149
|
+
}
|
|
150
|
+
/** Final known token usage for one model request (not the cumulative turn total). */
|
|
151
|
+
| {
|
|
144
152
|
type: 'usage';
|
|
145
153
|
promptTokens: number;
|
|
146
154
|
completionTokens: number;
|
|
155
|
+
} | {
|
|
156
|
+
type: 'token_budget';
|
|
157
|
+
usedTokens: number;
|
|
158
|
+
limitTokens: number;
|
|
159
|
+
estimated: boolean;
|
|
160
|
+
} | {
|
|
161
|
+
type: 'notice';
|
|
162
|
+
message: string;
|
|
163
|
+
} | {
|
|
164
|
+
type: 'task_status';
|
|
165
|
+
assessment: TaskAssessment;
|
|
166
|
+
} | {
|
|
167
|
+
type: 'turn_paused';
|
|
168
|
+
reason: PauseReason;
|
|
169
|
+
message: string;
|
|
147
170
|
} | {
|
|
148
171
|
type: 'turn_complete';
|
|
149
172
|
} | {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PauseReason, TaskAssessment } from '../core/types.js';
|
|
1
2
|
/**
|
|
2
3
|
* Output emitters for `glbgpt exec`. Three modes share one accumulator:
|
|
3
4
|
* - `text` (default): the final message as plain text on stdout.
|
|
@@ -22,14 +23,19 @@ export declare class ExecOutput {
|
|
|
22
23
|
private readonly model;
|
|
23
24
|
private readonly sinks;
|
|
24
25
|
private content;
|
|
26
|
+
private paused?;
|
|
27
|
+
private task?;
|
|
25
28
|
private usage;
|
|
26
29
|
constructor(mode: OutputMode, model: string, sinks: OutputSinks);
|
|
27
30
|
/** Emitted once before streaming (jsonl only). */
|
|
28
31
|
start(): void;
|
|
29
32
|
/** An assistant text delta. */
|
|
30
33
|
delta(text: string): void | Promise<void>;
|
|
31
|
-
/**
|
|
34
|
+
/** Final token usage for one model call; the result totals all calls in the turn. */
|
|
32
35
|
usageEvent(promptTokens: number, completionTokens: number): void;
|
|
36
|
+
notice(message: string): void;
|
|
37
|
+
taskStatus(assessment: TaskAssessment): void;
|
|
38
|
+
pause(reason: PauseReason, message: string): void;
|
|
33
39
|
/** Successful completion. `structured` is the parsed object when --output-schema was used. */
|
|
34
40
|
finishResult(structured: unknown | null): void;
|
|
35
41
|
/** Turn failed. Keeps the active output structure and returns via a non-zero exit upstream. */
|
package/dist/src/exec/output.js
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Output emitters for `glbgpt exec`. Three modes share one accumulator:
|
|
3
|
-
* - `text` (default): the final message as plain text on stdout.
|
|
4
|
-
* - `json` : a single final result object on stdout.
|
|
5
|
-
* - `jsonl` : streaming protocol events, one JSON per line, on stdout.
|
|
6
|
-
*
|
|
7
|
-
* In every mode stdout carries only the result/events; progress and diagnostics go to stderr.
|
|
8
|
-
* The write sinks are injected so tests can capture output without touching process streams.
|
|
9
|
-
*/
|
|
10
1
|
export class ExecOutput {
|
|
11
2
|
mode;
|
|
12
3
|
model;
|
|
13
4
|
sinks;
|
|
14
5
|
content = '';
|
|
6
|
+
paused;
|
|
7
|
+
task;
|
|
15
8
|
usage = { prompt_tokens: 0, completion_tokens: 0 };
|
|
16
9
|
constructor(mode, model, sinks) {
|
|
17
10
|
this.mode = mode;
|
|
@@ -33,13 +26,32 @@ export class ExecOutput {
|
|
|
33
26
|
if (this.mode === 'jsonl')
|
|
34
27
|
return this.line({ type: 'delta', text });
|
|
35
28
|
}
|
|
36
|
-
/**
|
|
29
|
+
/** Final token usage for one model call; the result totals all calls in the turn. */
|
|
37
30
|
usageEvent(promptTokens, completionTokens) {
|
|
38
|
-
this.usage
|
|
31
|
+
this.usage.prompt_tokens += promptTokens;
|
|
32
|
+
this.usage.completion_tokens += completionTokens;
|
|
39
33
|
if (this.mode === 'jsonl') {
|
|
40
34
|
this.line({ type: 'usage', prompt_tokens: promptTokens, completion_tokens: completionTokens });
|
|
41
35
|
}
|
|
42
36
|
}
|
|
37
|
+
notice(message) {
|
|
38
|
+
if (this.mode === 'jsonl')
|
|
39
|
+
this.line({ type: 'notice', message });
|
|
40
|
+
else
|
|
41
|
+
this.sinks.err(`${message}\n`);
|
|
42
|
+
}
|
|
43
|
+
taskStatus(assessment) {
|
|
44
|
+
this.task = assessment;
|
|
45
|
+
if (this.mode === 'jsonl')
|
|
46
|
+
this.line({ type: 'task_status', ...assessment });
|
|
47
|
+
else
|
|
48
|
+
this.sinks.err(`Task ${assessment.status}: ${assessment.message}\n`);
|
|
49
|
+
}
|
|
50
|
+
pause(reason, message) {
|
|
51
|
+
this.paused = { reason, message };
|
|
52
|
+
if (this.mode === 'jsonl')
|
|
53
|
+
this.line({ type: 'turn_paused', reason, message });
|
|
54
|
+
}
|
|
43
55
|
/** Successful completion. `structured` is the parsed object when --output-schema was used. */
|
|
44
56
|
finishResult(structured) {
|
|
45
57
|
if (this.mode === 'text') {
|
|
@@ -54,6 +66,7 @@ export class ExecOutput {
|
|
|
54
66
|
structured,
|
|
55
67
|
usage: this.usage,
|
|
56
68
|
error: null,
|
|
69
|
+
...(this.task ? { task: this.task } : {}),
|
|
57
70
|
});
|
|
58
71
|
}
|
|
59
72
|
/** Turn failed. Keeps the active output structure and returns via a non-zero exit upstream. */
|
|
@@ -65,13 +78,16 @@ export class ExecOutput {
|
|
|
65
78
|
content: this.content,
|
|
66
79
|
structured: null,
|
|
67
80
|
usage: this.usage,
|
|
68
|
-
error: { message },
|
|
81
|
+
error: { message, ...(this.paused ? { reason: this.paused.reason } : {}) },
|
|
82
|
+
...(this.paused ? { status: 'paused' } : {}),
|
|
69
83
|
});
|
|
70
84
|
}
|
|
71
85
|
else if (this.mode === 'jsonl') {
|
|
72
|
-
this.line({ type: 'error', message });
|
|
86
|
+
this.line({ type: 'error', message, ...(this.paused ? { reason: this.paused.reason } : {}) });
|
|
73
87
|
}
|
|
74
88
|
else {
|
|
89
|
+
if (this.content)
|
|
90
|
+
this.sinks.out(this.content.endsWith('\n') ? this.content : `${this.content}\n`);
|
|
75
91
|
this.sinks.err(`${message}\n`);
|
|
76
92
|
}
|
|
77
93
|
}
|