laohuang 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +10 -6
  2. package/dist/agent.d.ts +7 -27
  3. package/dist/agent.js +53 -567
  4. package/dist/agent.js.map +1 -1
  5. package/dist/capabilities.d.ts +19 -0
  6. package/dist/capabilities.js +29 -0
  7. package/dist/capabilities.js.map +1 -0
  8. package/dist/cli.d.ts +9 -6
  9. package/dist/cli.js +83 -70
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands.d.ts +20 -3
  12. package/dist/commands.js +39 -38
  13. package/dist/commands.js.map +1 -1
  14. package/dist/keybindings/default-keybindings.d.ts +2 -0
  15. package/dist/keybindings/default-keybindings.js +10 -0
  16. package/dist/keybindings/default-keybindings.js.map +1 -0
  17. package/dist/keybindings/hints.d.ts +3 -0
  18. package/dist/keybindings/hints.js +7 -0
  19. package/dist/keybindings/hints.js.map +1 -0
  20. package/dist/keybindings/key-id.d.ts +20 -0
  21. package/dist/keybindings/key-id.js +11 -0
  22. package/dist/keybindings/key-id.js.map +1 -0
  23. package/dist/keybindings/key-parser.d.ts +7 -0
  24. package/dist/keybindings/key-parser.js +92 -0
  25. package/dist/keybindings/key-parser.js.map +1 -0
  26. package/dist/keybindings/keybindings.d.ts +21 -0
  27. package/dist/keybindings/keybindings.js +65 -0
  28. package/dist/keybindings/keybindings.js.map +1 -0
  29. package/dist/routing.d.ts +2 -57
  30. package/dist/routing.js +3 -161
  31. package/dist/routing.js.map +1 -1
  32. package/dist/runtime/agent-step-runner.d.ts +51 -0
  33. package/dist/runtime/agent-step-runner.js +361 -0
  34. package/dist/runtime/agent-step-runner.js.map +1 -0
  35. package/dist/runtime/agent-turn-loop.d.ts +36 -0
  36. package/dist/runtime/agent-turn-loop.js +71 -0
  37. package/dist/runtime/agent-turn-loop.js.map +1 -0
  38. package/dist/runtime/guard-policy.d.ts +21 -0
  39. package/dist/runtime/guard-policy.js +93 -0
  40. package/dist/runtime/guard-policy.js.map +1 -0
  41. package/dist/runtime/history-committer.d.ts +34 -0
  42. package/dist/runtime/history-committer.js +77 -0
  43. package/dist/runtime/history-committer.js.map +1 -0
  44. package/dist/runtime/human-intent-router.d.ts +5 -0
  45. package/dist/runtime/human-intent-router.js +38 -0
  46. package/dist/runtime/human-intent-router.js.map +1 -0
  47. package/dist/runtime/model-runtime.d.ts +33 -0
  48. package/dist/runtime/model-runtime.js +70 -0
  49. package/dist/runtime/model-runtime.js.map +1 -0
  50. package/dist/runtime/queue-bridge.d.ts +11 -0
  51. package/dist/runtime/queue-bridge.js +2 -0
  52. package/dist/runtime/queue-bridge.js.map +1 -0
  53. package/dist/runtime/queue-dispatcher.d.ts +45 -0
  54. package/dist/runtime/queue-dispatcher.js +120 -0
  55. package/dist/runtime/queue-dispatcher.js.map +1 -0
  56. package/dist/runtime/runtime-events.d.ts +26 -0
  57. package/dist/runtime/runtime-events.js +21 -0
  58. package/dist/runtime/runtime-events.js.map +1 -0
  59. package/dist/runtime/session-action-protocol.d.ts +10 -0
  60. package/dist/runtime/session-action-protocol.js +64 -0
  61. package/dist/runtime/session-action-protocol.js.map +1 -0
  62. package/dist/runtime/session-action.d.ts +42 -0
  63. package/dist/runtime/session-action.js +3 -0
  64. package/dist/runtime/session-action.js.map +1 -0
  65. package/dist/runtime/task-lifecycle.d.ts +73 -0
  66. package/dist/runtime/task-lifecycle.js +267 -0
  67. package/dist/runtime/task-lifecycle.js.map +1 -0
  68. package/dist/runtime/tool-runtime.d.ts +33 -0
  69. package/dist/runtime/tool-runtime.js +89 -0
  70. package/dist/runtime/tool-runtime.js.map +1 -0
  71. package/dist/runtime/user-intent.d.ts +48 -0
  72. package/dist/runtime/user-intent.js +17 -0
  73. package/dist/runtime/user-intent.js.map +1 -0
  74. package/dist/session.d.ts +19 -9
  75. package/dist/session.js +119 -169
  76. package/dist/session.js.map +1 -1
  77. package/dist/terminal/editor.d.ts +16 -5
  78. package/dist/terminal/editor.js +99 -4
  79. package/dist/terminal/editor.js.map +1 -1
  80. package/dist/terminal/input.d.ts +2 -0
  81. package/dist/terminal/input.js +32 -7
  82. package/dist/terminal/input.js.map +1 -1
  83. package/dist/terminal/ui.d.ts +32 -21
  84. package/dist/terminal/ui.js +413 -252
  85. package/dist/terminal/ui.js.map +1 -1
  86. package/dist/tools.d.ts +7 -0
  87. package/dist/tools.js.map +1 -1
  88. package/dist/tui/components.d.ts +5 -0
  89. package/dist/tui/components.js +12 -0
  90. package/dist/tui/components.js.map +1 -0
  91. package/dist/tui/focus-manager.d.ts +7 -0
  92. package/dist/tui/focus-manager.js +13 -0
  93. package/dist/tui/focus-manager.js.map +1 -0
  94. package/dist/tui/overlay-manager.d.ts +12 -0
  95. package/dist/tui/overlay-manager.js +27 -0
  96. package/dist/tui/overlay-manager.js.map +1 -0
  97. package/dist/ui/display-actions.d.ts +23 -0
  98. package/dist/ui/display-actions.js +15 -0
  99. package/dist/ui/display-actions.js.map +1 -0
  100. package/dist/ui/display-policy.d.ts +38 -0
  101. package/dist/ui/display-policy.js +97 -0
  102. package/dist/ui/display-policy.js.map +1 -0
  103. package/dist/ui/frame-builder.d.ts +39 -0
  104. package/dist/ui/frame-builder.js +111 -0
  105. package/dist/ui/frame-builder.js.map +1 -0
  106. package/dist/ui/transcript-store.d.ts +35 -0
  107. package/dist/ui/transcript-store.js +172 -0
  108. package/dist/ui/transcript-store.js.map +1 -0
  109. package/dist/ui-state.js +6 -6
  110. package/dist/ui-state.js.map +1 -1
  111. package/dist/web.js +14 -1
  112. package/dist/web.js.map +1 -1
  113. package/package.json +2 -2
@@ -0,0 +1,361 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { ModelStreamCancelled, ModelStreamError, } from "../model-stream.js";
3
+ import { modelErrorKind } from "../model-adapter.js";
4
+ import { touchedPathOf } from "../tools.js";
5
+ export const FORCED_FINAL_PROMPT = `Tool use has been stopped by the runtime safety guard.
6
+ Do not call any tools. Give the user the best concise answer possible from the
7
+ information already available. Clearly state any limitation caused by stopping
8
+ tool use, but do not mention internal implementation details unless useful.`;
9
+ /** Runs the model/tool steps inside one user turn. */
10
+ export class AgentStepRunner {
11
+ options;
12
+ constructor(options) {
13
+ this.options = options;
14
+ }
15
+ async run() {
16
+ const { cancelToken, context, guardPolicy, history, userInput, } = this.options;
17
+ let toolRounds = 0;
18
+ let modelRound = 0;
19
+ let modelRequests = 0;
20
+ let totalTokens = 0;
21
+ const startedAt = performance.now();
22
+ let guardReason = null;
23
+ let guardEmitted = false;
24
+ if (!history.commitInput(userInput)) {
25
+ throw this.options.createCancelled("cancelled before user input commit");
26
+ }
27
+ this.emit("user_message", { content: userInput });
28
+ this.options.injectBaselineInstructions(cancelToken);
29
+ for (;;) {
30
+ this.raiseIfCancelled();
31
+ guardReason = guardReason ?? guardPolicy.budgetReason(totalTokens, (performance.now() - startedAt) / 1000);
32
+ const forceFinal = guardReason !== null;
33
+ if (guardReason !== null && !guardEmitted) {
34
+ guardEmitted = true;
35
+ this.emit("agent_guard_triggered", this.guardPayload({
36
+ reason: guardReason,
37
+ toolRounds,
38
+ modelRequests,
39
+ totalTokens,
40
+ startedAt,
41
+ }));
42
+ }
43
+ if (context?.modelStarted?.() === false) {
44
+ throw this.options.createCancelled("cancelled before model request");
45
+ }
46
+ modelRound += 1;
47
+ modelRequests += 1;
48
+ const requestId = modelRound === 1 && this.options.requestId !== null
49
+ ? this.options.requestId
50
+ : randomUUID();
51
+ this.options.onRequestId(requestId);
52
+ this.emit("model_request", {
53
+ round: modelRound,
54
+ request_id: requestId,
55
+ message_count: history.snapshot().length,
56
+ tool_rounds: toolRounds,
57
+ model_requests: modelRequests,
58
+ total_tokens: totalTokens,
59
+ force_final: forceFinal,
60
+ guard_reason: guardReason,
61
+ });
62
+ const requestMessages = history.snapshot();
63
+ if (forceFinal) {
64
+ const systemMessage = {
65
+ ...(requestMessages[0] ?? {}),
66
+ };
67
+ systemMessage["content"] =
68
+ `${String(systemMessage["content"] ?? "")}\n\n${FORCED_FINAL_PROMPT}`;
69
+ requestMessages[0] = systemMessage;
70
+ }
71
+ let result;
72
+ try {
73
+ const modelRequestOpened = context?.modelRequestOpened;
74
+ result = await this.options.modelRuntime.complete({
75
+ client: this.options.client,
76
+ model: this.options.model,
77
+ messages: requestMessages,
78
+ tools: this.options.toolDefinitions,
79
+ toolChoice: forceFinal ? "none" : "auto",
80
+ requestId,
81
+ cancelToken,
82
+ isRequestActive: this.options.isRequestActive,
83
+ onDelta: (kind, payload) => {
84
+ this.emit(kind, { round: modelRound, ...payload });
85
+ },
86
+ onRequestOpened: modelRequestOpened
87
+ ? () => modelRequestOpened.call(context)
88
+ : null,
89
+ });
90
+ }
91
+ catch (error) {
92
+ if (error instanceof ModelStreamCancelled) {
93
+ this.emit("model_response_aborted", {
94
+ round: modelRound,
95
+ request_id: requestId,
96
+ reason: errorMessage(error),
97
+ });
98
+ throw this.options.createCancelled(errorMessage(error), error);
99
+ }
100
+ const errorPayload = {
101
+ round: modelRound,
102
+ request_id: requestId,
103
+ error: errorMessage(error),
104
+ };
105
+ if (error instanceof ModelStreamError && error.hadDelta) {
106
+ this.emit("model_response_aborted", errorPayload);
107
+ this.options.emitLegacy("model_error", errorPayload);
108
+ }
109
+ else {
110
+ this.emit("model_error", errorPayload);
111
+ }
112
+ if (forceFinal) {
113
+ const payload = this.guardPayload({
114
+ reason: guardReason ?? "runtime safety guard",
115
+ toolRounds,
116
+ modelRequests,
117
+ totalTokens,
118
+ startedAt,
119
+ finalError: errorMessage(error),
120
+ });
121
+ this.emit("agent_guard_failed", payload);
122
+ let message = guardErrorMessage(payload);
123
+ if (this.options.provider && modelErrorKind(error) === "authentication") {
124
+ message += ` Authentication failed for ${this.options.provider}. ` +
125
+ `Run /login ${this.options.provider} to update your API key.`;
126
+ }
127
+ throw this.options.createError(message, error);
128
+ }
129
+ let message = `Model request failed: ${errorMessage(error)}`;
130
+ if (this.options.provider && modelErrorKind(error) === "authentication") {
131
+ message += `\nAuthentication failed for ${this.options.provider}. ` +
132
+ `Run /login ${this.options.provider} to update your API key.`;
133
+ }
134
+ throw this.options.createError(message, error);
135
+ }
136
+ const toolCalls = [...result.toolCalls];
137
+ let requestTokens = usageTotalTokens(result.usage);
138
+ const tokensEstimated = requestTokens === 0;
139
+ if (tokensEstimated) {
140
+ requestTokens = estimateRequestTokens(requestMessages, result.messageDict());
141
+ }
142
+ totalTokens += requestTokens;
143
+ this.emit("model_response", {
144
+ round: modelRound,
145
+ request_id: requestId,
146
+ finish_reason: result.finishReason,
147
+ tool_call_count: toolCalls.length,
148
+ tool_names: toolCalls.map((call) => call.function.name),
149
+ tool_call_ids: toolCalls.map((call) => call.id),
150
+ usage: result.usage,
151
+ request_tokens: requestTokens,
152
+ tokens_estimated: tokensEstimated,
153
+ total_tokens: totalTokens,
154
+ tool_rounds: toolRounds,
155
+ model_requests: modelRequests,
156
+ force_final: forceFinal,
157
+ });
158
+ if (forceFinal && toolCalls.length > 0) {
159
+ this.emit("model_response_aborted", {
160
+ round: modelRound,
161
+ request_id: requestId,
162
+ reason: "tool call returned while tools were disabled",
163
+ });
164
+ const payload = this.guardPayload({
165
+ reason: guardReason ?? "runtime safety guard",
166
+ toolRounds,
167
+ modelRequests,
168
+ totalTokens,
169
+ startedAt,
170
+ });
171
+ this.emit("agent_guard_failed", payload);
172
+ throw this.options.createError(guardErrorMessage(payload));
173
+ }
174
+ const postResponseGuard = guardPolicy.budgetReason(totalTokens, (performance.now() - startedAt) / 1000);
175
+ if (toolCalls.length > 0 && postResponseGuard !== null) {
176
+ this.emit("model_response_aborted", {
177
+ round: modelRound,
178
+ request_id: requestId,
179
+ reason: postResponseGuard,
180
+ });
181
+ guardReason = postResponseGuard;
182
+ continue;
183
+ }
184
+ const assistantMessage = result.messageDict();
185
+ if (!history.commitAssistant(assistantMessage)) {
186
+ this.emit("model_response_aborted", {
187
+ round: modelRound,
188
+ request_id: requestId,
189
+ reason: "cancelled before history commit",
190
+ });
191
+ throw this.options.createCancelled("cancelled before history commit");
192
+ }
193
+ this.emit("model_response_committed", { round: modelRound, request_id: requestId });
194
+ if (toolCalls.length === 0) {
195
+ if (result.content === null) {
196
+ throw this.options.createError("Model response had no content");
197
+ }
198
+ this.emit("assistant_response", {
199
+ round: modelRound,
200
+ content: truncateForEvent(result.content),
201
+ });
202
+ return result.content;
203
+ }
204
+ toolRounds += 1;
205
+ context?.toolsStarted?.();
206
+ const toolResults = (await this.options.toolRuntime.execute({
207
+ toolCalls,
208
+ executionMode: this.options.toolExecution,
209
+ cancelToken,
210
+ onToolStart: (event) => this.startToolEvent(event, modelRound),
211
+ onToolResult: (event) => this.completeToolEvent(event, modelRound),
212
+ })).results;
213
+ const repeated = guardPolicy.recordRepeatedToolCalls(toolCalls, toolResults);
214
+ history.commitToolResults(toolCalls, toolResults);
215
+ this.raiseIfCancelled();
216
+ const touchedPaths = [];
217
+ for (const toolResult of toolResults) {
218
+ const touched = touchedPathOf(toolResult);
219
+ if (typeof touched === "string") {
220
+ touchedPaths.push(touched);
221
+ }
222
+ }
223
+ this.options.discoverForTouchedPaths(touchedPaths);
224
+ if (repeated !== null) {
225
+ guardReason = `repeated tool call detected (${repeated.name} repeated ` +
226
+ `${repeated.count} times with the same arguments and result)`;
227
+ }
228
+ const pendingBatch = context?.safePoint?.();
229
+ if (pendingBatch !== null && pendingBatch !== undefined && (pendingBatch.content ?? "") !== "") {
230
+ if (!history.commitPending(pendingBatch)) {
231
+ throw this.options.createCancelled("cancelled before pending input commit");
232
+ }
233
+ this.emit("user_message", {
234
+ content: pendingBatch.content,
235
+ pending_event_ids: [...(pendingBatch.eventIds ?? [])],
236
+ });
237
+ }
238
+ }
239
+ }
240
+ startToolEvent(event, modelRound) {
241
+ this.emit("tool_start", {
242
+ ...this.toolEventContext(event, modelRound),
243
+ arguments: safeArguments(event.args),
244
+ });
245
+ }
246
+ completeToolEvent(event, modelRound) {
247
+ this.options.onToolEvent(event.toolCall.function.name, event.args, event.result);
248
+ const status = event.result["status"];
249
+ this.emit("tool_result", {
250
+ ...this.toolEventContext(event, modelRound),
251
+ status: (typeof status === "string" && status) ||
252
+ (event.result["ok"] ? "completed" : "failed"),
253
+ result: safeResult(event.result),
254
+ });
255
+ }
256
+ toolEventContext(event, modelRound) {
257
+ return {
258
+ round: modelRound,
259
+ index: event.index,
260
+ batch_size: event.batchSize,
261
+ tool_call_id: event.toolCall.id,
262
+ name: event.toolCall.function.name,
263
+ };
264
+ }
265
+ guardPayload(options) {
266
+ const payload = {
267
+ reason: options.reason,
268
+ tool_rounds: options.toolRounds,
269
+ model_requests: options.modelRequests,
270
+ total_tokens: options.totalTokens,
271
+ elapsed_ms: Math.round(performance.now() - options.startedAt),
272
+ };
273
+ if (options.finalError) {
274
+ payload["final_error"] = options.finalError;
275
+ }
276
+ return payload;
277
+ }
278
+ emit(eventType, payload) {
279
+ this.options.emit(eventType, payload);
280
+ }
281
+ isCancelled() {
282
+ return this.options.cancelToken !== null && this.options.cancelToken.isCancelled();
283
+ }
284
+ raiseIfCancelled() {
285
+ if (this.isCancelled()) {
286
+ throw this.options.createCancelled(this.options.cancelToken?.reason || "cancelled");
287
+ }
288
+ }
289
+ }
290
+ function usageTotalTokens(usage) {
291
+ if (usage === null || usage === undefined || typeof usage !== "object") {
292
+ return 0;
293
+ }
294
+ const record = usage;
295
+ const total = record["total_tokens"];
296
+ if (isJsonInteger(total)) {
297
+ return Math.max(0, total);
298
+ }
299
+ const input = record["prompt_tokens"] ?? record["input_tokens"] ?? 0;
300
+ const output = record["completion_tokens"] ?? record["output_tokens"] ?? 0;
301
+ let sum = 0;
302
+ for (const value of [input, output]) {
303
+ if (isJsonInteger(value) && value > 0) {
304
+ sum += value;
305
+ }
306
+ }
307
+ return sum;
308
+ }
309
+ function isJsonInteger(value) {
310
+ return typeof value === "number" && Number.isInteger(value);
311
+ }
312
+ function estimateRequestTokens(messages, response) {
313
+ const serialized = JSON.stringify([...messages, response]);
314
+ return Math.max(1, Math.floor((Buffer.byteLength(serialized, "utf8") + 3) / 4));
315
+ }
316
+ function guardErrorMessage(payload) {
317
+ let message = "Agent safety guard stopped tool use but could not produce a final " +
318
+ `answer: ${String(payload["reason"])}. ` +
319
+ `Tool rounds: ${String(payload["tool_rounds"])}; ` +
320
+ `model requests: ${String(payload["model_requests"])}; ` +
321
+ `tokens counted: ${String(payload["total_tokens"])}; ` +
322
+ `elapsed: ${String(payload["elapsed_ms"])}ms.`;
323
+ if (payload["final_error"]) {
324
+ message += ` Final request failed: ${String(payload["final_error"])}`;
325
+ }
326
+ return message;
327
+ }
328
+ function safeArguments(args) {
329
+ const safe = { ...args };
330
+ for (const key of ["content", "old_text", "new_text"]) {
331
+ const value = safe[key];
332
+ if (typeof value === "string") {
333
+ safe[key] = `<${value.length} chars>`;
334
+ }
335
+ }
336
+ const edits = safe["edits"];
337
+ if (Array.isArray(edits)) {
338
+ safe["edits"] = `<${edits.length} edits>`;
339
+ }
340
+ const result = {};
341
+ for (const [key, value] of Object.entries(safe)) {
342
+ result[key] = typeof value === "string" ? truncateForEvent(value) : value;
343
+ }
344
+ return result;
345
+ }
346
+ function safeResult(result) {
347
+ const safe = {};
348
+ for (const [key, value] of Object.entries(result)) {
349
+ safe[key] = typeof value === "string" ? truncateForEvent(value) : value;
350
+ }
351
+ return safe;
352
+ }
353
+ function truncateForEvent(value, limit = 4_000) {
354
+ return value.length <= limit
355
+ ? value
356
+ : `${value.slice(0, limit)}\n...[truncated ${value.length - limit} chars]`;
357
+ }
358
+ function errorMessage(error) {
359
+ return error instanceof Error ? error.message : String(error);
360
+ }
361
+ //# sourceMappingURL=agent-step-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-step-runner.js","sourceRoot":"","sources":["../../src/runtime/agent-step-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type CancelToken } from "../cancellation.ts";
2
+ import { TaskLifecycle } from "./task-lifecycle.ts";
3
+ import type { QueueBridge, QueueInputBatch } from "./queue-bridge.ts";
4
+ export interface AgentTurnContext {
5
+ readonly cancelToken: CancelToken;
6
+ setClaimedInput(batch: QueueInputBatch | null): void;
7
+ }
8
+ export type AgentTurnRunnerResult = string | null | Promise<string | null>;
9
+ export interface AgentTurnRunnerLike<Context extends AgentTurnContext> {
10
+ run(userInput: string, context: Context): AgentTurnRunnerResult;
11
+ }
12
+ export type AgentTurnRunner<Context extends AgentTurnContext> = ((content: string, context: Context) => AgentTurnRunnerResult) | AgentTurnRunnerLike<Context>;
13
+ export type TurnLoopResult = {
14
+ readonly status: "completed";
15
+ readonly result: string | null;
16
+ } | {
17
+ readonly status: "cancelled";
18
+ } | {
19
+ readonly status: "failed";
20
+ readonly error: string;
21
+ };
22
+ export interface AgentTurnLoopOptions<Context extends AgentTurnContext> {
23
+ readonly lifecycle: TaskLifecycle;
24
+ readonly bridge: QueueBridge;
25
+ readonly runner: AgentTurnRunner<Context>;
26
+ }
27
+ /** Runs consecutive model turns until the task reaches a terminal state. */
28
+ export declare class AgentTurnLoop<Context extends AgentTurnContext> {
29
+ private readonly lifecycle;
30
+ private readonly bridge;
31
+ private readonly runner;
32
+ constructor(options: AgentTurnLoopOptions<Context>);
33
+ run(taskId: string, content: string, context: Context): Promise<TurnLoopResult>;
34
+ private invokeRunner;
35
+ private finishCancelled;
36
+ }
@@ -0,0 +1,71 @@
1
+ import { CancellationError } from "../cancellation.js";
2
+ import { TaskState } from "./task-lifecycle.js";
3
+ /** Runs consecutive model turns until the task reaches a terminal state. */
4
+ export class AgentTurnLoop {
5
+ lifecycle;
6
+ bridge;
7
+ runner;
8
+ constructor(options) {
9
+ this.lifecycle = options.lifecycle;
10
+ this.bridge = options.bridge;
11
+ this.runner = options.runner;
12
+ }
13
+ async run(taskId, content, context) {
14
+ let currentInput = content;
15
+ let currentBatch = null;
16
+ try {
17
+ for (;;) {
18
+ context.cancelToken.throwIfCancelled();
19
+ this.lifecycle.markModelRunning(taskId);
20
+ context.setClaimedInput(currentBatch);
21
+ const result = await this.invokeRunner(currentInput, context);
22
+ if (currentBatch !== null) {
23
+ this.bridge.acknowledgeClaimedInput(taskId, currentBatch.eventIds);
24
+ }
25
+ context.cancelToken.throwIfCancelled();
26
+ // Drain or complete synchronously so a boundary cancellation wins.
27
+ const batch = this.bridge.drainPending(taskId);
28
+ if (batch !== null) {
29
+ currentInput = batch.content;
30
+ currentBatch = batch;
31
+ continue;
32
+ }
33
+ const record = this.lifecycle.taskRegistry.get(taskId);
34
+ if (record === null ||
35
+ record.state === TaskState.Cancelling ||
36
+ record.cancelToken.isCancelled()) {
37
+ return this.finishCancelled(taskId);
38
+ }
39
+ this.lifecycle.completeTask(taskId, result);
40
+ return { status: "completed", result };
41
+ }
42
+ }
43
+ catch (error) {
44
+ if (error instanceof CancellationError) {
45
+ return this.finishCancelled(taskId);
46
+ }
47
+ const record = this.lifecycle.taskRegistry.get(taskId);
48
+ if (record !== null && record.cancelToken.isCancelled()) {
49
+ return this.finishCancelled(taskId);
50
+ }
51
+ const message = error instanceof Error ? error.message : String(error);
52
+ this.bridge.preserveTaskInputs(taskId, "held because its task failed");
53
+ this.lifecycle.failTask(taskId, message);
54
+ return { status: "failed", error: message };
55
+ }
56
+ }
57
+ invokeRunner(content, context) {
58
+ const runner = this.runner;
59
+ const fn = typeof runner === "function" ? runner : runner.run.bind(runner);
60
+ return Promise.resolve(fn(content, context)).then((result) => result ?? null);
61
+ }
62
+ finishCancelled(taskId) {
63
+ const record = this.lifecycle.taskRegistry.get(taskId);
64
+ if (record !== null && record.state === TaskState.Cancelling) {
65
+ this.bridge.preserveTaskInputs(taskId, "held because its task was cancelled");
66
+ this.lifecycle.finishCancelled(taskId);
67
+ }
68
+ return { status: "cancelled" };
69
+ }
70
+ }
71
+ //# sourceMappingURL=agent-turn-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-turn-loop.js","sourceRoot":"","sources":["../../src/runtime/agent-turn-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AssembledToolCall } from "../model-stream.ts";
2
+ import type { ToolResult } from "../tools.ts";
3
+ export interface GuardPolicyOptions {
4
+ maxTotalTokens: number;
5
+ maxElapsedSeconds: number;
6
+ repeatedToolCallLimit: number;
7
+ }
8
+ export interface RepeatedToolCall {
9
+ name: string;
10
+ count: number;
11
+ }
12
+ /** Owns token, elapsed-time, and repeated-tool-call safety decisions. */
13
+ export declare class GuardPolicy {
14
+ private readonly maxTotalTokens;
15
+ private readonly maxElapsedSeconds;
16
+ private readonly repeatedToolCallLimit;
17
+ private readonly repeatedCalls;
18
+ constructor(options: GuardPolicyOptions);
19
+ budgetReason(totalTokens: number, elapsedSeconds: number): string | null;
20
+ recordRepeatedToolCalls(toolCalls: readonly AssembledToolCall[], toolResults: readonly ToolResult[]): RepeatedToolCall | null;
21
+ }
@@ -0,0 +1,93 @@
1
+ /** Owns token, elapsed-time, and repeated-tool-call safety decisions. */
2
+ export class GuardPolicy {
3
+ maxTotalTokens;
4
+ maxElapsedSeconds;
5
+ repeatedToolCallLimit;
6
+ repeatedCalls = new Map();
7
+ constructor(options) {
8
+ this.maxTotalTokens = options.maxTotalTokens;
9
+ this.maxElapsedSeconds = options.maxElapsedSeconds;
10
+ this.repeatedToolCallLimit = options.repeatedToolCallLimit;
11
+ }
12
+ budgetReason(totalTokens, elapsedSeconds) {
13
+ if (totalTokens >= this.maxTotalTokens) {
14
+ return `token budget reached (${this.maxTotalTokens})`;
15
+ }
16
+ if (elapsedSeconds >= this.maxElapsedSeconds) {
17
+ return `elapsed time budget reached (${String(this.maxElapsedSeconds)} seconds)`;
18
+ }
19
+ return null;
20
+ }
21
+ recordRepeatedToolCalls(toolCalls, toolResults) {
22
+ let repeated = null;
23
+ const seen = new Set();
24
+ for (let index = 0; index < toolCalls.length; index += 1) {
25
+ const toolCall = toolCalls[index];
26
+ if (toolCall === undefined) {
27
+ continue;
28
+ }
29
+ let parsedArguments;
30
+ try {
31
+ parsedArguments = JSON.parse(toolCall.function.arguments);
32
+ }
33
+ catch {
34
+ parsedArguments = toolCall.function.arguments;
35
+ }
36
+ const fingerprint = stableStringify({
37
+ name: toolCall.function.name,
38
+ arguments: parsedArguments,
39
+ result: stableToolResult(toolResults[index]),
40
+ });
41
+ const count = (this.repeatedCalls.get(fingerprint) ?? 0) + 1;
42
+ this.repeatedCalls.set(fingerprint, count);
43
+ seen.add(fingerprint);
44
+ if (repeated === null || count > repeated.count) {
45
+ repeated = { name: toolCall.function.name, count };
46
+ }
47
+ }
48
+ for (const fingerprint of [...this.repeatedCalls.keys()]) {
49
+ if (!seen.has(fingerprint)) {
50
+ this.repeatedCalls.delete(fingerprint);
51
+ }
52
+ }
53
+ return repeated !== null && repeated.count >= this.repeatedToolCallLimit
54
+ ? repeated
55
+ : null;
56
+ }
57
+ }
58
+ function stableToolResult(value) {
59
+ if (Array.isArray(value)) {
60
+ return value.map((item) => stableToolResult(item));
61
+ }
62
+ if (value !== null && typeof value === "object") {
63
+ const result = {};
64
+ for (const [key, item] of Object.entries(value)) {
65
+ if (key !== "duration_ms") {
66
+ result[key] = stableToolResult(item);
67
+ }
68
+ }
69
+ return result;
70
+ }
71
+ return value;
72
+ }
73
+ function stableStringify(value) {
74
+ if (value === null) {
75
+ return "null";
76
+ }
77
+ if (Array.isArray(value)) {
78
+ return `[${value.map((item) => stableStringify(item)).join(",")}]`;
79
+ }
80
+ if (typeof value === "object") {
81
+ const record = value;
82
+ const parts = Object.keys(record)
83
+ .filter((key) => record[key] !== undefined)
84
+ .sort()
85
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`);
86
+ return `{${parts.join(",")}}`;
87
+ }
88
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
89
+ return JSON.stringify(value);
90
+ }
91
+ return JSON.stringify(String(value));
92
+ }
93
+ //# sourceMappingURL=guard-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-policy.js","sourceRoot":"","sources":["../../src/runtime/guard-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { CancelToken } from "../cancellation.ts";
2
+ import type { AssembledToolCall } from "../model-stream.ts";
3
+ import type { ToolResult } from "../tools.ts";
4
+ export type HistoryMessage = Record<string, unknown>;
5
+ export interface PendingInputBatchLike {
6
+ content?: string | undefined;
7
+ eventIds?: readonly string[] | undefined;
8
+ }
9
+ export interface HistoryCommitContext {
10
+ commitInput?(append: () => void, rollback: () => void): boolean;
11
+ commitPending?(batch: PendingInputBatchLike, append: () => void, rollback: () => void): boolean;
12
+ commitIfActive?(callback: () => void): boolean;
13
+ }
14
+ export interface HistoryCommitterOptions {
15
+ messages: HistoryMessage[];
16
+ context: HistoryCommitContext | null;
17
+ cancelToken: CancelToken | null;
18
+ createCancelled(message: string): Error;
19
+ }
20
+ /** Commits canonical conversation history while preserving session atomicity. */
21
+ export declare class HistoryCommitter {
22
+ private readonly messages;
23
+ private readonly context;
24
+ private readonly cancelToken;
25
+ private readonly createCancelled;
26
+ constructor(options: HistoryCommitterOptions);
27
+ commitInput(content: string): boolean;
28
+ commitPending(batch: PendingInputBatchLike): boolean;
29
+ commitAssistant(message: HistoryMessage): boolean;
30
+ commitToolResults(toolCalls: readonly AssembledToolCall[], toolResults: readonly ToolResult[]): void;
31
+ snapshot(): HistoryMessage[];
32
+ private commitContextMessage;
33
+ private raiseIfCancelled;
34
+ }