@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.
Files changed (55) hide show
  1. package/README.md +62 -3
  2. package/dist/src/coding/bashTool.js +27 -11
  3. package/dist/src/coding/bashTool.js.map +1 -1
  4. package/dist/src/coding/deliveryCheck.d.ts +7 -0
  5. package/dist/src/coding/deliveryCheck.js +143 -0
  6. package/dist/src/coding/deliveryCheck.js.map +1 -0
  7. package/dist/src/coding/permissionGate.d.ts +6 -0
  8. package/dist/src/coding/permissionGate.js +8 -2
  9. package/dist/src/coding/permissionGate.js.map +1 -1
  10. package/dist/src/coding/projectContext.js +11 -1
  11. package/dist/src/coding/projectContext.js.map +1 -1
  12. package/dist/src/commands/configCommand.js +20 -1
  13. package/dist/src/commands/configCommand.js.map +1 -1
  14. package/dist/src/commands/execCommand.js +18 -1
  15. package/dist/src/commands/execCommand.js.map +1 -1
  16. package/dist/src/config/configFile.d.ts +8 -0
  17. package/dist/src/config/configFile.js +8 -0
  18. package/dist/src/config/configFile.js.map +1 -1
  19. package/dist/src/core/compaction.d.ts +6 -1
  20. package/dist/src/core/compaction.js +23 -5
  21. package/dist/src/core/compaction.js.map +1 -1
  22. package/dist/src/core/contextPrune.d.ts +18 -6
  23. package/dist/src/core/contextPrune.js +108 -20
  24. package/dist/src/core/contextPrune.js.map +1 -1
  25. package/dist/src/core/httpChatBackend.js +72 -20
  26. package/dist/src/core/httpChatBackend.js.map +1 -1
  27. package/dist/src/core/progressGuard.d.ts +16 -0
  28. package/dist/src/core/progressGuard.js +197 -0
  29. package/dist/src/core/progressGuard.js.map +1 -0
  30. package/dist/src/core/runChat.d.ts +9 -1
  31. package/dist/src/core/runChat.js +31 -10
  32. package/dist/src/core/runChat.js.map +1 -1
  33. package/dist/src/core/tokenBudget.d.ts +45 -0
  34. package/dist/src/core/tokenBudget.js +111 -0
  35. package/dist/src/core/tokenBudget.js.map +1 -0
  36. package/dist/src/core/turnLimits.d.ts +5 -0
  37. package/dist/src/core/turnLimits.js +28 -0
  38. package/dist/src/core/turnLimits.js.map +1 -0
  39. package/dist/src/core/turnLoop.d.ts +8 -2
  40. package/dist/src/core/turnLoop.js +201 -89
  41. package/dist/src/core/turnLoop.js.map +1 -1
  42. package/dist/src/core/types.d.ts +24 -1
  43. package/dist/src/exec/output.d.ts +7 -1
  44. package/dist/src/exec/output.js +29 -13
  45. package/dist/src/exec/output.js.map +1 -1
  46. package/dist/src/index.js +4 -0
  47. package/dist/src/index.js.map +1 -1
  48. package/dist/src/tui/App.js +8 -5
  49. package/dist/src/tui/App.js.map +1 -1
  50. package/dist/src/tui/chatController.d.ts +15 -3
  51. package/dist/src/tui/chatController.js +108 -42
  52. package/dist/src/tui/chatController.js.map +1 -1
  53. package/dist/src/tui/run.js +1 -0
  54. package/dist/src/tui/run.js.map +1 -1
  55. package/package.json +1 -1
@@ -1,7 +1,14 @@
1
- import { BUDGET_EXHAUSTED_MESSAGE, MAX_TOOL_CALLS_PER_TURN } from '../fs/limits.js';
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
- /** Pathological backstop only — the tool budget below governs normal turns. */
4
- const MAX_ROUNDS = 32;
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
- // Checkpoint before adding the user message so a FAILED turn can roll back to leave no
38
- // trace. Otherwise a request that fails (e.g. an oversized image payload) stays in history
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 ?? MAX_TOOL_CALLS_PER_TURN;
48
+ const budget = resolveMaxToolCalls(opts.maxToolCalls);
43
49
  let toolCallsUsed = 0;
44
- // Identical repeated tool calls (same name + byte-identical arguments) get an advisory
45
- // note appended to the 3rd/5th/8th result (dsh's repeat-tool-reminder posture): never
46
- // blocks, never costs a round — just breaks "retry the same thing forever" loops.
47
- const repeatCounts = new Map();
48
- const withRepeatNotice = (call, result) => {
49
- const key = `${call.function.name}\u0000${call.function.arguments}`;
50
- const n = (repeatCounts.get(key) ?? 0) + 1;
51
- repeatCounts.set(key, n);
52
- if ((n === 3 || n === 5 || n === 8) &&
53
- result !== null &&
54
- typeof result === 'object' &&
55
- !Array.isArray(result)) {
56
- return {
57
- ...result,
58
- repeated_call_notice: `This is call #${n} of ${call.function.name} with exactly the same arguments this turn. If the result keeps not helping, change the arguments or approach, or continue with what you already have.`,
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
- for (let round = 0; round < MAX_ROUNDS; round++) {
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, emit, opts, toolCallsUsed >= budget));
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
- session.rollbackTo(checkpoint); // failed turn leaves no trace
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: 'The model returned no output. Please try again.',
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
- track('turn_complete', {
102
- model: session.model,
103
- latency_ms: Date.now() - startedAt,
104
- tool_calls: toolCallsUsed,
105
- });
106
- emit({ type: 'turn_complete' });
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 = withRepeatNotice(call, denied
170
- ? { error: denied }
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
- toolCalls.forEach((call, i) => session.addToolMessage(call.id, call.function.name, results[i]));
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 = withRepeatNotice(call, denied
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, forceNoTools) {
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: session.requestMessages(),
231
- tools: this.registry.toOpenAITools(opts.includeGatedTools ?? true),
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
- ...(forceNoTools ? { tool_choice: 'none' } : {}),
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
- // Attach the partial text so an interrupt can preserve what already streamed.
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
- for await (const chunk of this.backend.stream(req, opts.signal)) {
267
- // The final chunk (include_usage) carries token counts with empty/no choices; surface
268
- // them before the delta guard below skips it.
269
- if (chunk.usage) {
270
- emit({
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: chunk.usage.prompt_tokens ?? 0,
273
- completionTokens: chunk.usage.completion_tokens ?? 0,
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":"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"}
1
+ {"version":3,"file":"turnLoop.js","sourceRoot":"","sources":["../../../src/core/turnLoop.ts"],"names":[],"mappings":"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"}
@@ -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
- /** Token usage from the final stream chunk. */
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. */
@@ -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
- /** Token usage from the final stream chunk. */
29
+ /** Final token usage for one model call; the result totals all calls in the turn. */
37
30
  usageEvent(promptTokens, completionTokens) {
38
- this.usage = { prompt_tokens: promptTokens, completion_tokens: completionTokens };
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
  }