@glbgpt/cli 0.2.3 → 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 (47) hide show
  1. package/README.md +50 -4
  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 +9 -3
  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 +4 -0
  17. package/dist/src/config/configFile.js +4 -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/httpChatBackend.js +72 -20
  23. package/dist/src/core/httpChatBackend.js.map +1 -1
  24. package/dist/src/core/progressGuard.d.ts +16 -0
  25. package/dist/src/core/progressGuard.js +197 -0
  26. package/dist/src/core/progressGuard.js.map +1 -0
  27. package/dist/src/core/runChat.d.ts +8 -0
  28. package/dist/src/core/runChat.js +23 -5
  29. package/dist/src/core/runChat.js.map +1 -1
  30. package/dist/src/core/tokenBudget.d.ts +45 -0
  31. package/dist/src/core/tokenBudget.js +111 -0
  32. package/dist/src/core/tokenBudget.js.map +1 -0
  33. package/dist/src/core/turnLoop.d.ts +7 -1
  34. package/dist/src/core/turnLoop.js +108 -44
  35. package/dist/src/core/turnLoop.js.map +1 -1
  36. package/dist/src/core/types.d.ts +21 -0
  37. package/dist/src/exec/output.d.ts +6 -0
  38. package/dist/src/exec/output.js +26 -11
  39. package/dist/src/exec/output.js.map +1 -1
  40. package/dist/src/tui/App.js +7 -3
  41. package/dist/src/tui/App.js.map +1 -1
  42. package/dist/src/tui/chatController.d.ts +11 -1
  43. package/dist/src/tui/chatController.js +91 -15
  44. package/dist/src/tui/chatController.js.map +1 -1
  45. package/dist/src/tui/run.js +1 -0
  46. package/dist/src/tui/run.js.map +1 -1
  47. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { Session } from './session.js';
2
2
  import { TurnLoop } from './turnLoop.js';
3
3
  import { ToolRegistry } from './toolRegistry.js';
4
+ import { TurnTokenBudget } from './tokenBudget.js';
4
5
  import { newId } from './id.js';
5
6
  import { planStructuredOutput, planForMode, parseStructuredJson, stripSyntheticNulls, isResponseFormatRejection, } from './structuredOutput.js';
6
7
  /**
@@ -14,7 +15,8 @@ import { planStructuredOutput, planForMode, parseStructuredJson, stripSyntheticN
14
15
  */
15
16
  export async function runChatTurn(params, onEvent) {
16
17
  const plan = params.outputSchema ? planStructuredOutput(params.model, params.outputSchema) : undefined;
17
- const first = await runOnce(params, plan, onEvent);
18
+ const tokenBudget = new TurnTokenBudget(params.maxTurnTokens);
19
+ const first = await runOnce(params, plan, tokenBudget, onEvent);
18
20
  const failure = first.thrown instanceof Error ? first.thrown.message : first.engineError;
19
21
  if (failure &&
20
22
  plan?.mode === 'json_schema' &&
@@ -25,7 +27,7 @@ export async function runChatTurn(params, onEvent) {
25
27
  // regardless of the flag, others lack json_schema entirely). Nothing streamed, the failed
26
28
  // call is refunded server-side → one retry in json_object mode with the schema in the prompt.
27
29
  const fallback = planForMode('json_object', params.outputSchema);
28
- const second = await runOnce(params, fallback, onEvent);
30
+ const second = await runOnce(params, fallback, tokenBudget, onEvent);
29
31
  // Keep any usage the rejected request reported, matching the streamed usage events.
30
32
  // These are token totals, not a claim about whether the backend charged/refunded it.
31
33
  second.usage.prompt_tokens += first.usage.prompt_tokens;
@@ -34,7 +36,7 @@ export async function runChatTurn(params, onEvent) {
34
36
  }
35
37
  return finish(first, plan, params);
36
38
  }
37
- async function runOnce(params, plan, onEvent) {
39
+ async function runOnce(params, plan, tokenBudget, onEvent) {
38
40
  const session = new Session({ id: newId(), model: params.model });
39
41
  const responseFormat = plan ? plan.responseFormat : params.responseFormat;
40
42
  const system = [params.system?.trim(), plan?.systemAddendum].filter((s) => !!s).join('\n\n');
@@ -63,6 +65,12 @@ async function runOnce(params, plan, onEvent) {
63
65
  result.usage.prompt_tokens += event.promptTokens;
64
66
  result.usage.completion_tokens += event.completionTokens;
65
67
  break;
68
+ case 'turn_paused':
69
+ result.paused = event;
70
+ break;
71
+ case 'task_status':
72
+ result.task = event.assessment;
73
+ break;
66
74
  case 'error':
67
75
  result.engineError = event.message;
68
76
  break;
@@ -71,7 +79,7 @@ async function runOnce(params, plan, onEvent) {
71
79
  // turn_complete is implicit in runTurn resolving.
72
80
  }
73
81
  return onEvent?.(event);
74
- }, { responseFormat });
82
+ }, { responseFormat, tokenBudget, assessTask: params.assessTask });
75
83
  }
76
84
  catch (err) {
77
85
  result.thrown = err;
@@ -79,6 +87,8 @@ async function runOnce(params, plan, onEvent) {
79
87
  return result;
80
88
  }
81
89
  function finish(r, plan, params) {
90
+ if (r.paused)
91
+ throw new TurnPausedError(r.paused.reason, r.paused.message);
82
92
  if (r.thrown !== undefined)
83
93
  throw r.thrown;
84
94
  if (r.engineError)
@@ -90,6 +100,14 @@ function finish(r, plan, params) {
90
100
  if (params.outputSchema)
91
101
  stripSyntheticNulls(structured, params.outputSchema.schema);
92
102
  }
93
- return { content: r.content, structured, usage: r.usage };
103
+ return { content: r.content, structured, usage: r.usage, ...(r.task ? { task: r.task } : {}) };
104
+ }
105
+ export class TurnPausedError extends Error {
106
+ reason;
107
+ constructor(reason, message) {
108
+ super(message);
109
+ this.reason = reason;
110
+ this.name = 'TurnPausedError';
111
+ }
94
112
  }
95
113
  //# sourceMappingURL=runChat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runChat.js","sourceRoot":"","sources":["../../../src/core/runChat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runChat.js","sourceRoot":"","sources":["../../../src/core/runChat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { ChatChunk, ChatMessage, ChatRequest } from './types.js';
2
+ export declare const DEFAULT_MAX_TURN_TOKENS = 200000;
3
+ export declare const MIN_MAX_TURN_TOKENS = 1000;
4
+ export declare const MAX_MAX_TURN_TOKENS = 10000000;
5
+ export declare function parseMaxTurnTokens(value: string | number, source?: string): number;
6
+ /** Explicit turn option > environment > saved configuration > the bounded default. */
7
+ export declare function resolveMaxTurnTokens(override?: number): number;
8
+ /**
9
+ * Approximate input size: text uses the same bytes/4 heuristic as context compaction;
10
+ * image parts use a bounded vision allowance instead of tokenizing their URL/base64.
11
+ * Include message framing, tool definitions and output schemas because they are resent
12
+ * on each request. Provider tokenization, image tokens and server prompts can differ.
13
+ */
14
+ export declare function estimateRequestTokens(req: ChatRequest): number;
15
+ export interface TokenBudgetSnapshot {
16
+ usedTokens: number;
17
+ limitTokens: number;
18
+ remainingTokens: number;
19
+ /** True when any missing provider usage was replaced by a local estimate. */
20
+ estimated: boolean;
21
+ }
22
+ export interface TokenBudgetPreflight extends TokenBudgetSnapshot {
23
+ allowed: boolean;
24
+ reason?: 'exhausted' | 'request_too_large';
25
+ estimatedPromptTokens: number;
26
+ }
27
+ /**
28
+ * Cumulative request-token protection for one user turn, including tool rounds and retries.
29
+ * Share this instance across retries; record each request once using its final usage snapshot.
30
+ * This pauses further requests, not an in-flight response, and is not a hard billing cap.
31
+ */
32
+ export declare class TurnTokenBudget {
33
+ readonly limitTokens: number;
34
+ private usedTokens;
35
+ private estimated;
36
+ private warned;
37
+ constructor(limit?: number);
38
+ snapshot(): TokenBudgetSnapshot;
39
+ /** Check the exact request projection about to be sent, after pruning and any added prompts. */
40
+ preflight(req: ChatRequest): TokenBudgetPreflight;
41
+ /** Call once per model request, also on interruption/failure when some usage may be known. */
42
+ recordCall(req: ChatRequest, output: Pick<ChatMessage, 'content' | 'tool_calls'>, usage?: ChatChunk['usage']): TokenBudgetSnapshot;
43
+ /** Emit at most one warning per turn when cumulative usage reaches 80% of the limit. */
44
+ takeWarning(): TokenBudgetSnapshot | null;
45
+ }
@@ -0,0 +1,111 @@
1
+ import { getConfigValueSync } from '../config/configFile.js';
2
+ import { estimateMessageTokens } from './compaction.js';
3
+ export const DEFAULT_MAX_TURN_TOKENS = 200_000;
4
+ export const MIN_MAX_TURN_TOKENS = 1_000;
5
+ export const MAX_MAX_TURN_TOKENS = 10_000_000;
6
+ // Cross-model headroom for one vision input, not a provider token formula or upper bound.
7
+ // Actual image usage depends on the model, dimensions, detail and preprocessing, not the
8
+ // compressed file size or base64 length. Keep each image's estimate bounded; count every
9
+ // image separately and replace estimates with provider usage whenever it is available.
10
+ const IMAGE_TOKEN_ESTIMATE = 16_384;
11
+ const LOW_DETAIL_IMAGE_TOKEN_ESTIMATE = 4_096;
12
+ export function parseMaxTurnTokens(value, source = 'max-turn-tokens') {
13
+ const raw = typeof value === 'string' ? value.trim() : value;
14
+ const parsed = typeof raw === 'string' && /^\d+$/.test(raw) ? Number(raw) : raw;
15
+ if (typeof parsed !== 'number' ||
16
+ !Number.isSafeInteger(parsed) ||
17
+ parsed < MIN_MAX_TURN_TOKENS ||
18
+ parsed > MAX_MAX_TURN_TOKENS) {
19
+ throw new Error(`${source} must be an integer between ${MIN_MAX_TURN_TOKENS} and ${MAX_MAX_TURN_TOKENS}.`);
20
+ }
21
+ return parsed;
22
+ }
23
+ /** Explicit turn option > environment > saved configuration > the bounded default. */
24
+ export function resolveMaxTurnTokens(override) {
25
+ if (override !== undefined)
26
+ return parseMaxTurnTokens(override, 'maxTurnTokens');
27
+ const env = process.env.GLBGPT_MAX_TURN_TOKENS;
28
+ if (env !== undefined)
29
+ return parseMaxTurnTokens(env, 'GLBGPT_MAX_TURN_TOKENS');
30
+ const stored = getConfigValueSync('max-turn-tokens');
31
+ return stored === undefined ? DEFAULT_MAX_TURN_TOKENS : parseMaxTurnTokens(stored);
32
+ }
33
+ /**
34
+ * Approximate input size: text uses the same bytes/4 heuristic as context compaction;
35
+ * image parts use a bounded vision allowance instead of tokenizing their URL/base64.
36
+ * Include message framing, tool definitions and output schemas because they are resent
37
+ * on each request. Provider tokenization, image tokens and server prompts can differ.
38
+ */
39
+ export function estimateRequestTokens(req) {
40
+ const messages = req.messages.reduce((sum, message) => sum + estimateBudgetMessageTokens(message) + 4, 3);
41
+ return messages + estimateJsonTokens(req.tools) + estimateJsonTokens(req.response_format);
42
+ }
43
+ /** Never serialize image content: a supported 8 MiB image is not millions of text tokens. */
44
+ function estimateBudgetMessageTokens(message) {
45
+ if (!Array.isArray(message.content))
46
+ return estimateMessageTokens(message);
47
+ const toolTokens = estimateMessageTokens({ ...message, content: null });
48
+ return message.content.reduce((sum, part) => {
49
+ if (part.type === 'text')
50
+ return sum + estimateMessageTokens({ role: message.role, content: part.text });
51
+ // `detail` is optional on OpenAI-compatible image inputs; older CLI types omit it.
52
+ const lowDetail = 'detail' in part.image_url && part.image_url.detail === 'low';
53
+ return sum + (lowDetail ? LOW_DETAIL_IMAGE_TOKEN_ESTIMATE : IMAGE_TOKEN_ESTIMATE);
54
+ }, toolTokens);
55
+ }
56
+ function estimateJsonTokens(value) {
57
+ if (value === undefined || value === null)
58
+ return 0;
59
+ return Math.ceil(Buffer.byteLength(JSON.stringify(value), 'utf8') / 4);
60
+ }
61
+ /**
62
+ * Cumulative request-token protection for one user turn, including tool rounds and retries.
63
+ * Share this instance across retries; record each request once using its final usage snapshot.
64
+ * This pauses further requests, not an in-flight response, and is not a hard billing cap.
65
+ */
66
+ export class TurnTokenBudget {
67
+ limitTokens;
68
+ usedTokens = 0;
69
+ estimated = false;
70
+ warned = false;
71
+ constructor(limit = resolveMaxTurnTokens()) {
72
+ this.limitTokens = parseMaxTurnTokens(limit, 'maxTurnTokens');
73
+ }
74
+ snapshot() {
75
+ return {
76
+ usedTokens: this.usedTokens,
77
+ limitTokens: this.limitTokens,
78
+ remainingTokens: Math.max(0, this.limitTokens - this.usedTokens),
79
+ estimated: this.estimated,
80
+ };
81
+ }
82
+ /** Check the exact request projection about to be sent, after pruning and any added prompts. */
83
+ preflight(req) {
84
+ const snapshot = this.snapshot();
85
+ const estimatedPromptTokens = estimateRequestTokens(req);
86
+ const reason = snapshot.remainingTokens === 0
87
+ ? 'exhausted'
88
+ : estimatedPromptTokens > snapshot.remainingTokens ? 'request_too_large' : undefined;
89
+ return { ...snapshot, estimatedPromptTokens, allowed: reason === undefined, ...(reason ? { reason } : {}) };
90
+ }
91
+ /** Call once per model request, also on interruption/failure when some usage may be known. */
92
+ recordCall(req, output, usage) {
93
+ const prompt = knownTokens(usage?.prompt_tokens);
94
+ const completion = knownTokens(usage?.completion_tokens);
95
+ this.estimated ||= prompt === undefined || completion === undefined;
96
+ this.usedTokens += (prompt ?? estimateRequestTokens(req)) +
97
+ (completion ?? estimateBudgetMessageTokens({ role: 'assistant', ...output }));
98
+ return this.snapshot();
99
+ }
100
+ /** Emit at most one warning per turn when cumulative usage reaches 80% of the limit. */
101
+ takeWarning() {
102
+ if (this.warned || this.usedTokens < this.limitTokens * 0.8)
103
+ return null;
104
+ this.warned = true;
105
+ return this.snapshot();
106
+ }
107
+ }
108
+ function knownTokens(value) {
109
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : undefined;
110
+ }
111
+ //# sourceMappingURL=tokenBudget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBudget.js","sourceRoot":"","sources":["../../../src/core/tokenBudget.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import type { ChatBackend, EngineEvent } from './types.js';
1
+ import type { ChatBackend, EngineEvent, TaskAssessment } from './types.js';
2
2
  import type { Session } from './session.js';
3
3
  import type { ToolRegistry } from './toolRegistry.js';
4
+ import { TurnTokenBudget } from './tokenBudget.js';
4
5
  /**
5
6
  * Event sink. A returned promise applies BACKPRESSURE on the streaming pump (pi A3):
6
7
  * consumeStream awaits it before pulling the next chunk, so a slow consumer (exec piping
@@ -16,6 +17,11 @@ export interface TurnOptions {
16
17
  includeGatedTools?: boolean;
17
18
  /** Hard cap on tool calls dispatched in this turn. Defaults to the configured max-tool-calls budget. */
18
19
  maxToolCalls?: number;
20
+ /** Shared across safe retries of a single user turn. */
21
+ tokenBudget?: TurnTokenBudget;
22
+ maxTurnTokens?: number;
23
+ /** Local, read-only delivery check. Never sends another model request. */
24
+ assessTask?: () => Promise<TaskAssessment | undefined>;
19
25
  /**
20
26
  * Steering (pi B2): called at each round boundary AFTER tool results are appended and
21
27
  * BEFORE the next model call. Returned items are appended as user messages, so text the
@@ -1,6 +1,8 @@
1
1
  import { BUDGET_EXHAUSTED_MESSAGE } from '../fs/limits.js';
2
2
  import { resolveMaxToolCalls } from './turnLimits.js';
3
3
  import { pruneSessionContext } from './contextPrune.js';
4
+ import { ProgressGuard } from './progressGuard.js';
5
+ import { TurnTokenBudget } from './tokenBudget.js';
4
6
  import { track } from '../telemetry/telemetry.js';
5
7
  /** Bound retries that cannot dispatch tools, independently of productive tool rounds. */
6
8
  const MAX_NO_DISPATCH_ROUNDS = 3;
@@ -49,22 +51,22 @@ export class TurnLoop {
49
51
  let noDispatchRounds = 0;
50
52
  let finalAnswerAttempts = 0;
51
53
  let lastPromptTokens = 0;
52
- // Identical repeated tool calls (same name + byte-identical arguments) get an advisory
53
- // note appended to the 3rd/5th/8th result (dsh's repeat-tool-reminder posture): never
54
- // blocks, never costs a round — just breaks "retry the same thing forever" loops.
55
- const repeatCounts = new Map();
56
- const withRepeatNotice = (call, result) => {
57
- const key = `${call.function.name}\u0000${call.function.arguments}`;
58
- const n = (repeatCounts.get(key) ?? 0) + 1;
59
- repeatCounts.set(key, n);
60
- if ((n === 3 || n === 5 || n === 8) &&
61
- result !== null &&
62
- typeof result === 'object' &&
63
- !Array.isArray(result)) {
64
- return {
65
- ...result,
66
- 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.`,
67
- };
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 };
68
70
  }
69
71
  return result;
70
72
  };
@@ -77,17 +79,20 @@ export class TurnLoop {
77
79
  emit({ type: 'turn_interrupted' });
78
80
  return;
79
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';
80
88
  const stopReason = toolCallsUsed >= budget
81
89
  ? BUDGET_EXHAUSTED_MESSAGE
82
90
  : noDispatchRounds >= MAX_NO_DISPATCH_ROUNDS
83
91
  ? NO_DISPATCH_MESSAGE
84
92
  : undefined;
85
93
  if (stopReason && finalAnswerAttempts >= MAX_FINAL_ANSWER_ATTEMPTS) {
86
- emit({
87
- type: 'error',
88
- message: 'The model kept requesting tools after the turn limit. Progress has been preserved; ' +
89
- 'continue with a new message to resume the unfinished work.',
90
- });
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.');
91
96
  return;
92
97
  }
93
98
  if (stopReason)
@@ -101,9 +106,13 @@ export class TurnLoop {
101
106
  if (event.type === 'usage')
102
107
  lastPromptTokens = event.promptTokens;
103
108
  return emit(event);
104
- }, opts, stopReason));
109
+ }, opts, tokens, stopReason));
105
110
  }
106
111
  catch (err) {
112
+ if (err instanceof TokenBudgetPause) {
113
+ await pause('token_budget', err.message);
114
+ return;
115
+ }
107
116
  // User interruption (Esc): keep whatever partial text already streamed so the
108
117
  // conversation history matches what the user saw, then end the turn quietly.
109
118
  if (opts.signal?.aborted) {
@@ -113,31 +122,42 @@ export class TurnLoop {
113
122
  emit({ type: 'turn_interrupted' });
114
123
  return;
115
124
  }
116
- if (completedRounds === 0)
125
+ const partial = partialContentOf(err);
126
+ if (partial)
127
+ session.addAssistantMessage(partial, []);
128
+ else if (completedRounds === 0)
117
129
  session.rollbackTo(checkpoint);
118
130
  throw err;
119
131
  }
120
132
  // A call that produced neither text nor tool calls is a failure, not a completed turn
121
133
  // (e.g. an upstream that closed the stream early). Don't record an empty assistant
122
134
  // message and don't pretend the turn succeeded.
123
- if (content.length === 0 && toolCalls.length === 0) {
135
+ if (content.trim().length === 0 && toolCalls.length === 0) {
124
136
  // The request itself succeeded (no throw) — the model just returned nothing. Keep the
125
137
  // user message (not a poison payload) so a retry has context; only add nothing more.
126
138
  emit({
127
139
  type: 'error',
128
- 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.`,
129
141
  });
130
142
  return;
131
143
  }
132
144
  session.addAssistantMessage(content.length > 0 ? content : null, toolCalls);
133
145
  completedRounds += 1;
134
146
  if (toolCalls.length === 0) {
135
- track('turn_complete', {
136
- model: session.model,
137
- latency_ms: Date.now() - startedAt,
138
- tool_calls: toolCallsUsed,
139
- });
140
- 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
+ }
141
161
  return;
142
162
  }
143
163
  // Length-truncated message with tool calls: never execute them (arguments may be
@@ -204,9 +224,8 @@ export class TurnLoop {
204
224
  }
205
225
  const results = await Promise.all(toolCalls.map(async (call, i) => {
206
226
  const denied = denial[i];
207
- const result = withRepeatNotice(call, denied
208
- ? { error: denied }
209
- : 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);
210
229
  // Ends may arrive out of completion order; the TUI matches rows by call id.
211
230
  emit({
212
231
  type: 'tool_call_end',
@@ -217,7 +236,10 @@ export class TurnLoop {
217
236
  return result;
218
237
  }));
219
238
  // Tool messages must follow the tool_calls order the model emitted.
220
- 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
+ }
221
243
  }
222
244
  else {
223
245
  for (let i = 0; i < toolCalls.length; i++) {
@@ -231,10 +253,8 @@ export class TurnLoop {
231
253
  });
232
254
  // Past a budget/cap, don't dispatch: feed the model an error instead, so it
233
255
  // wraps up with what it has (a normal answer, not a hard stop).
234
- const denied = denial[i];
235
- const result = withRepeatNotice(call, denied
236
- ? { error: denied }
237
- : 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));
238
258
  emit({
239
259
  type: 'tool_call_end',
240
260
  id: call.id,
@@ -249,6 +269,8 @@ export class TurnLoop {
249
269
  emit({ type: 'turn_interrupted' });
250
270
  return;
251
271
  }
272
+ if (repetitionPause || tokens.snapshot().remainingTokens === 0)
273
+ continue;
252
274
  // Steering: text typed mid-turn joins the conversation before the next model call.
253
275
  for (const content of opts.takeSteering?.() ?? []) {
254
276
  session.addUserMessage(content);
@@ -257,7 +279,7 @@ export class TurnLoop {
257
279
  }
258
280
  }
259
281
  /** Stream a single model call, emitting text deltas and accumulating tool_calls. */
260
- async streamOneCall(session, emit, opts, stopReason) {
282
+ async streamOneCall(session, emit, opts, tokens, stopReason) {
261
283
  const req = {
262
284
  model: session.model,
263
285
  // The pruning projection, not the raw history (raw stays intact on disk).
@@ -273,18 +295,41 @@ export class TurnLoop {
273
295
  ...(stopReason ? { tool_choice: 'none' } : {}),
274
296
  ...(opts.responseFormat !== undefined ? { response_format: opts.responseFormat } : {}),
275
297
  };
298
+ const preflight = tokens.preflight(req);
299
+ if (!preflight.allowed)
300
+ throw new TokenBudgetPause(tokenPauseMessage(preflight));
276
301
  let content = '';
277
302
  const toolAcc = new Map();
278
303
  let finishReason = null;
304
+ let usage;
279
305
  try {
280
- 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; });
281
307
  }
282
308
  catch (err) {
283
- // Attach the partial text so an interrupt can preserve what already streamed.
309
+ // Preserve already streamed text on interruption or a later upstream failure.
284
310
  if (opts.signal?.aborted)
285
311
  throw new InterruptedStreamError(content);
312
+ if (content)
313
+ throw new PartialStreamError(content, err);
286
314
  throw err;
287
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
+ }
288
333
  const toolCalls = [...toolAcc.entries()]
289
334
  .sort((a, b) => a[0] - b[0])
290
335
  .map(([, e]) => ({
@@ -301,7 +346,7 @@ export class TurnLoop {
301
346
  * Iterate the backend stream, forwarding deltas/usage and accumulating tool-call pieces.
302
347
  * Returns the last non-null finish_reason seen (providers send it on the closing chunk).
303
348
  */
304
- async consumeStream(req, opts, emit, onText, toolAcc) {
349
+ async consumeStream(req, opts, emit, onText, toolAcc, onUsage) {
305
350
  let finishReason = null;
306
351
  let usage;
307
352
  try {
@@ -340,6 +385,7 @@ export class TurnLoop {
340
385
  finally {
341
386
  // Providers can send cumulative snapshots more than once in a stream. Emit the
342
387
  // final known usage once per request, including on failure or interruption.
388
+ onUsage(usage);
343
389
  if (usage) {
344
390
  await emit({
345
391
  type: 'usage',
@@ -360,7 +406,7 @@ class InterruptedStreamError extends Error {
360
406
  }
361
407
  }
362
408
  function partialContentOf(err) {
363
- return err instanceof InterruptedStreamError ? err.partialContent : '';
409
+ return err instanceof InterruptedStreamError || err instanceof PartialStreamError ? err.partialContent : '';
364
410
  }
365
411
  function safeParseArgs(raw) {
366
412
  try {
@@ -370,4 +416,22 @@ function safeParseArgs(raw) {
370
416
  return {};
371
417
  }
372
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
+ }
373
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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"}