@code-yeongyu/senpi-agent-core 2026.7.25-2

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 (142) hide show
  1. package/README.md +508 -0
  2. package/dist/agent-loop.d.ts +31 -0
  3. package/dist/agent-loop.d.ts.map +1 -0
  4. package/dist/agent-loop.js +851 -0
  5. package/dist/agent-loop.js.map +1 -0
  6. package/dist/agent.d.ts +140 -0
  7. package/dist/agent.d.ts.map +1 -0
  8. package/dist/agent.js +464 -0
  9. package/dist/agent.js.map +1 -0
  10. package/dist/harness/agent-harness.d.ts +94 -0
  11. package/dist/harness/agent-harness.d.ts.map +1 -0
  12. package/dist/harness/agent-harness.js +988 -0
  13. package/dist/harness/agent-harness.js.map +1 -0
  14. package/dist/harness/compaction/branch-summarization.d.ts +55 -0
  15. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
  16. package/dist/harness/compaction/branch-summarization.js +172 -0
  17. package/dist/harness/compaction/branch-summarization.js.map +1 -0
  18. package/dist/harness/compaction/compaction.d.ts +107 -0
  19. package/dist/harness/compaction/compaction.d.ts.map +1 -0
  20. package/dist/harness/compaction/compaction.js +588 -0
  21. package/dist/harness/compaction/compaction.js.map +1 -0
  22. package/dist/harness/compaction/utils.d.ts +36 -0
  23. package/dist/harness/compaction/utils.d.ts.map +1 -0
  24. package/dist/harness/compaction/utils.js +136 -0
  25. package/dist/harness/compaction/utils.js.map +1 -0
  26. package/dist/harness/env/nodejs.d.ts +45 -0
  27. package/dist/harness/env/nodejs.d.ts.map +1 -0
  28. package/dist/harness/env/nodejs.js +620 -0
  29. package/dist/harness/env/nodejs.js.map +1 -0
  30. package/dist/harness/messages.d.ts +52 -0
  31. package/dist/harness/messages.d.ts.map +1 -0
  32. package/dist/harness/messages.js +102 -0
  33. package/dist/harness/messages.js.map +1 -0
  34. package/dist/harness/prompt-templates.d.ts +48 -0
  35. package/dist/harness/prompt-templates.d.ts.map +1 -0
  36. package/dist/harness/prompt-templates.js +230 -0
  37. package/dist/harness/prompt-templates.js.map +1 -0
  38. package/dist/harness/session/jsonl-repo.d.ts +26 -0
  39. package/dist/harness/session/jsonl-repo.d.ts.map +1 -0
  40. package/dist/harness/session/jsonl-repo.js +100 -0
  41. package/dist/harness/session/jsonl-repo.js.map +1 -0
  42. package/dist/harness/session/jsonl-storage.d.ts +42 -0
  43. package/dist/harness/session/jsonl-storage.d.ts.map +1 -0
  44. package/dist/harness/session/jsonl-storage.js +286 -0
  45. package/dist/harness/session/jsonl-storage.js.map +1 -0
  46. package/dist/harness/session/memory-repo.d.ts +18 -0
  47. package/dist/harness/session/memory-repo.d.ts.map +1 -0
  48. package/dist/harness/session/memory-repo.js +44 -0
  49. package/dist/harness/session/memory-repo.js.map +1 -0
  50. package/dist/harness/session/memory-storage.d.ts +33 -0
  51. package/dist/harness/session/memory-storage.d.ts.map +1 -0
  52. package/dist/harness/session/memory-storage.js +163 -0
  53. package/dist/harness/session/memory-storage.js.map +1 -0
  54. package/dist/harness/session/repo-utils.d.ts +11 -0
  55. package/dist/harness/session/repo-utils.d.ts.map +1 -0
  56. package/dist/harness/session/repo-utils.js +39 -0
  57. package/dist/harness/session/repo-utils.js.map +1 -0
  58. package/dist/harness/session/session.d.ts +49 -0
  59. package/dist/harness/session/session.d.ts.map +1 -0
  60. package/dist/harness/session/session.js +261 -0
  61. package/dist/harness/session/session.js.map +1 -0
  62. package/dist/harness/skills.d.ts +44 -0
  63. package/dist/harness/skills.d.ts.map +1 -0
  64. package/dist/harness/skills.js +311 -0
  65. package/dist/harness/skills.js.map +1 -0
  66. package/dist/harness/system-prompt.d.ts +3 -0
  67. package/dist/harness/system-prompt.d.ts.map +1 -0
  68. package/dist/harness/system-prompt.js +30 -0
  69. package/dist/harness/system-prompt.js.map +1 -0
  70. package/dist/harness/tools/bash.d.ts +27 -0
  71. package/dist/harness/tools/bash.d.ts.map +1 -0
  72. package/dist/harness/tools/bash.js +132 -0
  73. package/dist/harness/tools/bash.js.map +1 -0
  74. package/dist/harness/tools/edit-diff.d.ts +89 -0
  75. package/dist/harness/tools/edit-diff.d.ts.map +1 -0
  76. package/dist/harness/tools/edit-diff.js +386 -0
  77. package/dist/harness/tools/edit-diff.js.map +1 -0
  78. package/dist/harness/tools/edit.d.ts +19 -0
  79. package/dist/harness/tools/edit.d.ts.map +1 -0
  80. package/dist/harness/tools/edit.js +95 -0
  81. package/dist/harness/tools/edit.js.map +1 -0
  82. package/dist/harness/tools/file-mutation-queue.d.ts +4 -0
  83. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -0
  84. package/dist/harness/tools/file-mutation-queue.js +46 -0
  85. package/dist/harness/tools/file-mutation-queue.js.map +1 -0
  86. package/dist/harness/tools/image.d.ts +3 -0
  87. package/dist/harness/tools/image.d.ts.map +1 -0
  88. package/dist/harness/tools/image.js +106 -0
  89. package/dist/harness/tools/image.js.map +1 -0
  90. package/dist/harness/tools/index.d.ts +6 -0
  91. package/dist/harness/tools/index.d.ts.map +1 -0
  92. package/dist/harness/tools/index.js +5 -0
  93. package/dist/harness/tools/index.js.map +1 -0
  94. package/dist/harness/tools/path-utils.d.ts +4 -0
  95. package/dist/harness/tools/path-utils.d.ts.map +1 -0
  96. package/dist/harness/tools/path-utils.js +26 -0
  97. package/dist/harness/tools/path-utils.js.map +1 -0
  98. package/dist/harness/tools/read.d.ts +34 -0
  99. package/dist/harness/tools/read.d.ts.map +1 -0
  100. package/dist/harness/tools/read.js +110 -0
  101. package/dist/harness/tools/read.js.map +1 -0
  102. package/dist/harness/tools/tool-context.d.ts +6 -0
  103. package/dist/harness/tools/tool-context.d.ts.map +1 -0
  104. package/dist/harness/tools/tool-context.js +2 -0
  105. package/dist/harness/tools/tool-context.js.map +1 -0
  106. package/dist/harness/tools/write.d.ts +11 -0
  107. package/dist/harness/tools/write.d.ts.map +1 -0
  108. package/dist/harness/tools/write.js +31 -0
  109. package/dist/harness/tools/write.js.map +1 -0
  110. package/dist/harness/types.d.ts +682 -0
  111. package/dist/harness/types.d.ts.map +1 -0
  112. package/dist/harness/types.js +83 -0
  113. package/dist/harness/types.js.map +1 -0
  114. package/dist/harness/utils/shell-output.d.ts +22 -0
  115. package/dist/harness/utils/shell-output.d.ts.map +1 -0
  116. package/dist/harness/utils/shell-output.js +181 -0
  117. package/dist/harness/utils/shell-output.js.map +1 -0
  118. package/dist/harness/utils/truncate.d.ts +70 -0
  119. package/dist/harness/utils/truncate.d.ts.map +1 -0
  120. package/dist/harness/utils/truncate.js +296 -0
  121. package/dist/harness/utils/truncate.js.map +1 -0
  122. package/dist/index.d.ts +24 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +30 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/node.d.ts +3 -0
  127. package/dist/node.d.ts.map +1 -0
  128. package/dist/node.js +3 -0
  129. package/dist/node.js.map +1 -0
  130. package/dist/proxy.d.ts +71 -0
  131. package/dist/proxy.d.ts.map +1 -0
  132. package/dist/proxy.js +280 -0
  133. package/dist/proxy.js.map +1 -0
  134. package/dist/stream-fn.d.ts +10 -0
  135. package/dist/stream-fn.d.ts.map +1 -0
  136. package/dist/stream-fn.js +17 -0
  137. package/dist/stream-fn.js.map +1 -0
  138. package/dist/types.d.ts +415 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +2 -0
  141. package/dist/types.js.map +1 -0
  142. package/package.json +61 -0
package/dist/agent.js ADDED
@@ -0,0 +1,464 @@
1
+ import { runAgentLoop, runAgentLoopContinue } from "./agent-loop.js";
2
+ import { getDefaultStreamFn } from "./stream-fn.js";
3
+ function defaultConvertToLlm(messages) {
4
+ return messages.filter((message) => message.role === "user" || message.role === "assistant" || message.role === "toolResult");
5
+ }
6
+ const EMPTY_USAGE = {
7
+ input: 0,
8
+ output: 0,
9
+ cacheRead: 0,
10
+ cacheWrite: 0,
11
+ totalTokens: 0,
12
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
13
+ };
14
+ const DEFAULT_MODEL = {
15
+ id: "unknown",
16
+ name: "unknown",
17
+ api: "unknown",
18
+ provider: "unknown",
19
+ baseUrl: "",
20
+ reasoning: false,
21
+ input: [],
22
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
23
+ contextWindow: 0,
24
+ maxTokens: 0,
25
+ };
26
+ function createMutableAgentState(initialState) {
27
+ let tools = initialState?.tools?.slice() ?? [];
28
+ let messages = initialState?.messages?.slice() ?? [];
29
+ return {
30
+ systemPrompt: initialState?.systemPrompt ?? "",
31
+ model: initialState?.model ?? DEFAULT_MODEL,
32
+ thinkingLevel: initialState?.thinkingLevel ?? "off",
33
+ get tools() {
34
+ return tools;
35
+ },
36
+ set tools(nextTools) {
37
+ tools = nextTools.slice();
38
+ },
39
+ get messages() {
40
+ return messages;
41
+ },
42
+ set messages(nextMessages) {
43
+ messages = nextMessages.slice();
44
+ },
45
+ isStreaming: false,
46
+ streamingMessage: undefined,
47
+ pendingToolCalls: new Set(),
48
+ errorMessage: undefined,
49
+ };
50
+ }
51
+ class PendingMessageQueue {
52
+ constructor(mode) {
53
+ this.messages = [];
54
+ this.clearGeneration = 0;
55
+ this.mode = mode;
56
+ }
57
+ enqueue(message) {
58
+ this.messages.push(message);
59
+ }
60
+ hasItems() {
61
+ return this.messages.length > 0;
62
+ }
63
+ getClearGeneration() {
64
+ return this.clearGeneration;
65
+ }
66
+ drain() {
67
+ if (this.mode === "all") {
68
+ const drained = this.messages.slice();
69
+ this.messages = [];
70
+ return drained;
71
+ }
72
+ const first = this.messages[0];
73
+ if (!first) {
74
+ return [];
75
+ }
76
+ this.messages = this.messages.slice(1);
77
+ return [first];
78
+ }
79
+ prepend(messages) {
80
+ this.messages = [...messages, ...this.messages];
81
+ }
82
+ clear() {
83
+ this.messages = [];
84
+ this.clearGeneration++;
85
+ }
86
+ }
87
+ /**
88
+ * Stateful wrapper around the low-level agent loop.
89
+ *
90
+ * `Agent` owns the current transcript, emits lifecycle events, executes tools,
91
+ * and exposes queueing APIs for steering and follow-up messages.
92
+ */
93
+ export class Agent {
94
+ constructor(options) {
95
+ this.listeners = new Set();
96
+ // Older compiled consumers may omit options or streamFn even though the current API requires them.
97
+ const runtimeOptions = options ?? {};
98
+ this._state = createMutableAgentState(runtimeOptions.initialState);
99
+ this.convertToLlm = runtimeOptions.convertToLlm ?? defaultConvertToLlm;
100
+ this.transformContext = runtimeOptions.transformContext;
101
+ this.streamFunction = runtimeOptions.streamFn ?? getDefaultStreamFn();
102
+ this.getApiKey = runtimeOptions.getApiKey;
103
+ this.onPayload = runtimeOptions.onPayload;
104
+ this.onResponse = runtimeOptions.onResponse;
105
+ this.beforeToolCall = runtimeOptions.beforeToolCall;
106
+ this.afterToolCall = runtimeOptions.afterToolCall;
107
+ this.prepareNextTurn = runtimeOptions.prepareNextTurn;
108
+ this.prepareNextTurnWithContext = runtimeOptions.prepareNextTurnWithContext;
109
+ this.steeringQueue = new PendingMessageQueue(runtimeOptions.steeringMode ?? "one-at-a-time");
110
+ this.followUpQueue = new PendingMessageQueue(runtimeOptions.followUpMode ?? "one-at-a-time");
111
+ this.sessionId = runtimeOptions.sessionId;
112
+ this.thinkingBudgets = runtimeOptions.thinkingBudgets;
113
+ this.transport = runtimeOptions.transport ?? "auto";
114
+ this.timeoutMs = runtimeOptions.timeoutMs;
115
+ this.maxRetryDelayMs = runtimeOptions.maxRetryDelayMs;
116
+ this.toolExecution = runtimeOptions.toolExecution ?? "parallel";
117
+ this.abortServerSideFallback = runtimeOptions.abortServerSideFallback;
118
+ }
119
+ /**
120
+ * Subscribe to agent lifecycle events.
121
+ *
122
+ * Listener promises are awaited in subscription order and are included in
123
+ * the current run's settlement. Listeners also receive the active abort
124
+ * signal for the current run.
125
+ *
126
+ * `agent_end` is the final emitted event for a run, but the agent does not
127
+ * become idle until all awaited listeners for that event have settled.
128
+ */
129
+ subscribe(listener) {
130
+ this.listeners.add(listener);
131
+ return () => this.listeners.delete(listener);
132
+ }
133
+ /**
134
+ * Current agent state.
135
+ *
136
+ * Assigning `state.tools` or `state.messages` copies the provided top-level array.
137
+ */
138
+ get state() {
139
+ return this._state;
140
+ }
141
+ /** Controls how queued steering messages are drained. */
142
+ set steeringMode(mode) {
143
+ this.steeringQueue.mode = mode;
144
+ }
145
+ get steeringMode() {
146
+ return this.steeringQueue.mode;
147
+ }
148
+ /** Controls how queued follow-up messages are drained. */
149
+ set followUpMode(mode) {
150
+ this.followUpQueue.mode = mode;
151
+ }
152
+ get followUpMode() {
153
+ return this.followUpQueue.mode;
154
+ }
155
+ /** Queue a message to be injected after the current assistant turn finishes. */
156
+ steer(message) {
157
+ this.steeringQueue.enqueue(message);
158
+ }
159
+ /** Queue a message to run only after the agent would otherwise stop. */
160
+ followUp(message) {
161
+ this.followUpQueue.enqueue(message);
162
+ }
163
+ /** Remove all queued steering messages. */
164
+ clearSteeringQueue() {
165
+ this.steeringQueue.clear();
166
+ }
167
+ /** Remove all queued follow-up messages. */
168
+ clearFollowUpQueue() {
169
+ this.followUpQueue.clear();
170
+ }
171
+ /** Remove all queued steering and follow-up messages. */
172
+ clearAllQueues() {
173
+ this.clearSteeringQueue();
174
+ this.clearFollowUpQueue();
175
+ }
176
+ /** Returns true when either queue still contains pending messages. */
177
+ hasQueuedMessages() {
178
+ return this.steeringQueue.hasItems() || this.followUpQueue.hasItems();
179
+ }
180
+ /** Active abort signal for the current run, if any. */
181
+ get signal() {
182
+ return this.activeRun?.abortController.signal;
183
+ }
184
+ /** Abort the current run, if one is active. */
185
+ abort() {
186
+ this.activeRun?.abortController.abort();
187
+ }
188
+ /**
189
+ * Keep queued steering and follow-up messages for an external owner after
190
+ * this run reaches agent_end, without changing the active abort signal.
191
+ */
192
+ suppressQueuedMessageDrain() {
193
+ if (this.activeRun) {
194
+ this.activeRun.suppressQueuedMessageDrain = true;
195
+ }
196
+ }
197
+ /**
198
+ * Resolve when the current run and all awaited event listeners have finished.
199
+ *
200
+ * This resolves after `agent_end` listeners settle.
201
+ */
202
+ waitForIdle() {
203
+ return this.activeRun?.promise ?? Promise.resolve();
204
+ }
205
+ /** Clear transcript state, runtime state, and queued messages. */
206
+ reset() {
207
+ this._state.messages = [];
208
+ this._state.isStreaming = false;
209
+ this._state.streamingMessage = undefined;
210
+ this._state.pendingToolCalls = new Set();
211
+ this._state.errorMessage = undefined;
212
+ this.clearFollowUpQueue();
213
+ this.clearSteeringQueue();
214
+ }
215
+ async prompt(input, images) {
216
+ if (this.activeRun) {
217
+ throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");
218
+ }
219
+ const messages = this.normalizePromptInput(input, images);
220
+ await this.runPromptMessages(messages);
221
+ }
222
+ /** Continue by delivering queued input first when a compaction leaves custom context at the tail. */
223
+ async continueWithQueuedMessages() {
224
+ if (this.activeRun) {
225
+ throw new Error("Agent is already processing. Wait for completion before continuing.");
226
+ }
227
+ if (this._state.messages[this._state.messages.length - 1]?.role === "assistant") {
228
+ await this.continue();
229
+ return;
230
+ }
231
+ const queuedSteering = this.steeringQueue.drain();
232
+ if (queuedSteering.length > 0) {
233
+ await this.runPromptMessages(queuedSteering, { skipInitialSteeringPoll: true });
234
+ return;
235
+ }
236
+ const queuedFollowUps = this.followUpQueue.drain();
237
+ if (queuedFollowUps.length > 0) {
238
+ await this.runPromptMessages(queuedFollowUps);
239
+ return;
240
+ }
241
+ await this.continue();
242
+ }
243
+ /** Continue from the current transcript. The last message must be a user or tool-result message. */
244
+ async continue() {
245
+ if (this.activeRun) {
246
+ throw new Error("Agent is already processing. Wait for completion before continuing.");
247
+ }
248
+ const lastMessage = this._state.messages[this._state.messages.length - 1];
249
+ if (!lastMessage) {
250
+ throw new Error("No messages to continue from");
251
+ }
252
+ if (lastMessage.role === "assistant") {
253
+ const queuedSteering = this.steeringQueue.drain();
254
+ if (queuedSteering.length > 0) {
255
+ await this.runPromptMessages(queuedSteering, { skipInitialSteeringPoll: true });
256
+ return;
257
+ }
258
+ const queuedFollowUps = this.followUpQueue.drain();
259
+ if (queuedFollowUps.length > 0) {
260
+ await this.runPromptMessages(queuedFollowUps);
261
+ return;
262
+ }
263
+ throw new Error("Cannot continue from message role: assistant");
264
+ }
265
+ await this.runContinuation();
266
+ }
267
+ normalizePromptInput(input, images) {
268
+ if (Array.isArray(input)) {
269
+ return input;
270
+ }
271
+ if (typeof input !== "string") {
272
+ return [input];
273
+ }
274
+ const content = [{ type: "text", text: input }];
275
+ if (images && images.length > 0) {
276
+ content.push(...images);
277
+ }
278
+ return [{ role: "user", content, timestamp: Date.now() }];
279
+ }
280
+ async runPromptMessages(messages, options = {}) {
281
+ await this.runWithLifecycle(async (signal) => {
282
+ await runAgentLoop(messages, this.createContextSnapshot(), this.createLoopConfig(options), (event) => this.processEvents(event), signal, this.streamFunction);
283
+ });
284
+ }
285
+ async runContinuation() {
286
+ await this.runWithLifecycle(async (signal) => {
287
+ await runAgentLoopContinue(this.createContextSnapshot(), this.createLoopConfig(), (event) => this.processEvents(event), signal, this.streamFunction);
288
+ });
289
+ }
290
+ createContextSnapshot() {
291
+ return {
292
+ systemPrompt: this._state.systemPrompt,
293
+ messages: this._state.messages.slice(),
294
+ tools: this._state.tools.slice(),
295
+ };
296
+ }
297
+ createLoopConfig(options = {}) {
298
+ let skipInitialSteeringPoll = options.skipInitialSteeringPoll === true;
299
+ let steeringQueueGeneration = this.steeringQueue.getClearGeneration();
300
+ let followUpQueueGeneration = this.followUpQueue.getClearGeneration();
301
+ return {
302
+ model: this._state.model,
303
+ reasoning: this._state.thinkingLevel === "off" ? undefined : this._state.thinkingLevel,
304
+ sessionId: this.sessionId,
305
+ onPayload: this.onPayload,
306
+ onResponse: this.onResponse,
307
+ transport: this.transport,
308
+ thinkingBudgets: this.thinkingBudgets,
309
+ timeoutMs: this.timeoutMs,
310
+ maxRetryDelayMs: this.maxRetryDelayMs,
311
+ abortServerSideFallback: this.abortServerSideFallback,
312
+ toolExecution: this.toolExecution,
313
+ beforeToolCall: this.beforeToolCall,
314
+ afterToolCall: this.afterToolCall,
315
+ prepareNextTurn: this.prepareNextTurnWithContext || this.prepareNextTurn
316
+ ? async (context) => {
317
+ if (this.prepareNextTurnWithContext) {
318
+ return await this.prepareNextTurnWithContext(context, this.signal);
319
+ }
320
+ return await this.prepareNextTurn?.(this.signal);
321
+ }
322
+ : undefined,
323
+ convertToLlm: this.convertToLlm,
324
+ transformContext: this.transformContext,
325
+ getApiKey: this.getApiKey,
326
+ getSteeringMessages: async () => {
327
+ if (skipInitialSteeringPoll) {
328
+ skipInitialSteeringPoll = false;
329
+ return [];
330
+ }
331
+ steeringQueueGeneration = this.steeringQueue.getClearGeneration();
332
+ return this.steeringQueue.drain();
333
+ },
334
+ getFollowUpMessages: async () => {
335
+ followUpQueueGeneration = this.followUpQueue.getClearGeneration();
336
+ return this.followUpQueue.drain();
337
+ },
338
+ restorePendingMessages: (queue, messages) => {
339
+ if (queue === "steering") {
340
+ if (this.steeringQueue.getClearGeneration() !== steeringQueueGeneration)
341
+ return;
342
+ this.steeringQueue.prepend(messages);
343
+ return;
344
+ }
345
+ if (this.followUpQueue.getClearGeneration() !== followUpQueueGeneration)
346
+ return;
347
+ this.followUpQueue.prepend(messages);
348
+ },
349
+ };
350
+ }
351
+ async runWithLifecycle(executor) {
352
+ if (this.activeRun) {
353
+ throw new Error("Agent is already processing.");
354
+ }
355
+ const abortController = new AbortController();
356
+ let resolvePromise = () => { };
357
+ const promise = new Promise((resolve) => {
358
+ resolvePromise = resolve;
359
+ });
360
+ this.activeRun = { promise, resolve: resolvePromise, abortController, suppressQueuedMessageDrain: false };
361
+ this._state.isStreaming = true;
362
+ this._state.streamingMessage = undefined;
363
+ this._state.errorMessage = undefined;
364
+ try {
365
+ await executor(abortController.signal);
366
+ while (!abortController.signal.aborted &&
367
+ !this.activeRun?.suppressQueuedMessageDrain &&
368
+ this.hasQueuedMessages()) {
369
+ await this.runQueuedMessagesAfterAgentEnd(abortController.signal);
370
+ }
371
+ }
372
+ catch (error) {
373
+ await this.handleRunFailure(error, abortController.signal.aborted);
374
+ }
375
+ finally {
376
+ this.finishRun();
377
+ }
378
+ }
379
+ async runQueuedMessagesAfterAgentEnd(signal) {
380
+ const queuedSteering = this.steeringQueue.drain();
381
+ if (queuedSteering.length > 0) {
382
+ await runAgentLoop(queuedSteering, this.createContextSnapshot(), this.createLoopConfig({ skipInitialSteeringPoll: true }), (event) => this.processEvents(event), signal, this.streamFunction);
383
+ return;
384
+ }
385
+ const queuedFollowUps = this.followUpQueue.drain();
386
+ if (queuedFollowUps.length === 0) {
387
+ return;
388
+ }
389
+ await runAgentLoop(queuedFollowUps, this.createContextSnapshot(), this.createLoopConfig(), (event) => this.processEvents(event), signal, this.streamFunction);
390
+ }
391
+ async handleRunFailure(error, aborted) {
392
+ const failureMessage = {
393
+ role: "assistant",
394
+ content: [{ type: "text", text: "" }],
395
+ api: this._state.model.api,
396
+ provider: this._state.model.provider,
397
+ model: this._state.model.id,
398
+ usage: EMPTY_USAGE,
399
+ stopReason: aborted ? "aborted" : "error",
400
+ errorMessage: error instanceof Error ? error.message : String(error),
401
+ timestamp: Date.now(),
402
+ };
403
+ await this.processEvents({ type: "message_start", message: failureMessage });
404
+ await this.processEvents({ type: "message_end", message: failureMessage });
405
+ await this.processEvents({ type: "turn_end", message: failureMessage, toolResults: [] });
406
+ await this.processEvents({ type: "agent_end", messages: [failureMessage] });
407
+ }
408
+ finishRun() {
409
+ this._state.isStreaming = false;
410
+ this._state.streamingMessage = undefined;
411
+ this._state.pendingToolCalls = new Set();
412
+ this.activeRun?.resolve();
413
+ this.activeRun = undefined;
414
+ }
415
+ /**
416
+ * Reduce internal state for a loop event, then await listeners.
417
+ *
418
+ * `agent_end` only means no further loop events will be emitted. The run is
419
+ * considered idle later, after all awaited listeners for `agent_end` finish
420
+ * and `finishRun()` clears runtime-owned state.
421
+ */
422
+ async processEvents(event) {
423
+ switch (event.type) {
424
+ case "message_start":
425
+ this._state.streamingMessage = event.message;
426
+ break;
427
+ case "message_update":
428
+ this._state.streamingMessage = event.message;
429
+ break;
430
+ case "message_end":
431
+ this._state.streamingMessage = undefined;
432
+ this._state.messages.push(event.message);
433
+ break;
434
+ case "tool_execution_start": {
435
+ const pendingToolCalls = new Set(this._state.pendingToolCalls);
436
+ pendingToolCalls.add(event.toolCallId);
437
+ this._state.pendingToolCalls = pendingToolCalls;
438
+ break;
439
+ }
440
+ case "tool_execution_end": {
441
+ const pendingToolCalls = new Set(this._state.pendingToolCalls);
442
+ pendingToolCalls.delete(event.toolCallId);
443
+ this._state.pendingToolCalls = pendingToolCalls;
444
+ break;
445
+ }
446
+ case "turn_end":
447
+ if (event.message.role === "assistant" && event.message.errorMessage) {
448
+ this._state.errorMessage = event.message.errorMessage;
449
+ }
450
+ break;
451
+ case "agent_end":
452
+ this._state.streamingMessage = undefined;
453
+ break;
454
+ }
455
+ const signal = this.activeRun?.abortController.signal;
456
+ if (!signal) {
457
+ throw new Error("Agent listener invoked outside active run");
458
+ }
459
+ for (const listener of this.listeners) {
460
+ await listener(event, signal);
461
+ }
462
+ }
463
+ }
464
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAqBpD,SAAS,mBAAmB,CAAC,QAAwB;IACpD,OAAO,QAAQ,CAAC,MAAM,CACrB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CACrG,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG;IACnB,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;CACpE,CAAC;AAEF,MAAM,aAAa,GAAG;IACrB,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;IAC1D,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,CAAC;CACS,CAAC;AASvB,SAAS,uBAAuB,CAC/B,YAAkH;IAElH,IAAI,KAAK,GAAG,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,QAAQ,GAAG,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAErD,OAAO;QACN,YAAY,EAAE,YAAY,EAAE,YAAY,IAAI,EAAE;QAC9C,KAAK,EAAE,YAAY,EAAE,KAAK,IAAI,aAAa;QAC3C,aAAa,EAAE,YAAY,EAAE,aAAa,IAAI,KAAK;QACnD,IAAI,KAAK;YACR,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,SAA2B;YACpC,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,QAAQ;YACX,OAAO,QAAQ,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,CAAC,YAA4B;YACxC,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC;QACD,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB,EAAE,IAAI,GAAG,EAAU;QACnC,YAAY,EAAE,SAAS;KACvB,CAAC;AACH,CAAC;AA+BD,MAAM,mBAAmB;IAKxB,YAAY,IAAe;QAJnB,aAAQ,GAAmB,EAAE,CAAC;QAC9B,oBAAe,GAAG,CAAC,CAAC;QAI3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,OAAqB;QAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,kBAAkB;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,QAAwB;QAC/B,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,eAAe,EAAE,CAAC;IACxB,CAAC;CACD;AASD;;;;;GAKG;AACH,MAAM,OAAO,KAAK;IA0CjB,YAAY,OAAqB;QAxChB,cAAS,GAAG,IAAI,GAAG,EAAoE,CAAC;QAyCxG,mGAAmG;QACnG,MAAM,cAAc,GAA0B,OAAO,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,YAAY,IAAI,mBAAmB,CAAC;QACvE,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,CAAC;QACxD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,eAAe,CAAC;QACtD,IAAI,CAAC,0BAA0B,GAAG,cAAc,CAAC,0BAA0B,CAAC;QAC5E,IAAI,CAAC,aAAa,GAAG,IAAI,mBAAmB,CAAC,cAAc,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC;QAC7F,IAAI,CAAC,aAAa,GAAG,IAAI,mBAAmB,CAAC,cAAc,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC;QAC7F,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,eAAe,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,IAAI,MAAM,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,eAAe,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,aAAa,IAAI,UAAU,CAAC;QAChE,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC,uBAAuB,CAAC;IACvE,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,QAA0E;QACnF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACH,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,yDAAyD;IACzD,IAAI,YAAY,CAAC,IAAe;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,0DAA0D;IAC1D,IAAI,YAAY,CAAC,IAAe;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,OAAqB;QAC1B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,wEAAwE;IACxE,QAAQ,CAAC,OAAqB;QAC7B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;QACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,4CAA4C;IAC5C,kBAAkB;QACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,yDAAyD;IACzD,cAAc;QACb,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC3B,CAAC;IAED,sEAAsE;IACtE,iBAAiB;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;IACvE,CAAC;IAED,uDAAuD;IACvD,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED,+CAA+C;IAC/C,KAAK;QACJ,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,0BAA0B;QACzB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,CAAC,0BAA0B,GAAG,IAAI,CAAC;QAClD,CAAC;IACF,CAAC;IAED;;;;OAIG;IACH,WAAW;QACV,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC;IAED,kEAAkE;IAClE,KAAK;QACJ,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;QACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC3B,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,KAA6C,EAAE,MAAuB;QAClF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACd,4GAA4G,CAC5G,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,qGAAqG;IACrG,KAAK,CAAC,0BAA0B;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YACjF,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO;QACR,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAClD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;YAChF,OAAO;QACR,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACnD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAC9C,OAAO;QACR,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACvB,CAAC;IAED,oGAAoG;IACpG,KAAK,CAAC,QAAQ;QACb,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAClD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChF,OAAO;YACR,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACnD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;gBAC9C,OAAO;YACR,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC9B,CAAC;IAEO,oBAAoB,CAC3B,KAA6C,EAC7C,MAAuB;QAEvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAsC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC9B,QAAwB,EACxB,OAAO,GAA0C,EAAE;QAEnD,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5C,MAAM,YAAY,CACjB,QAAQ,EACR,IAAI,CAAC,qBAAqB,EAAE,EAC5B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACpC,MAAM,EACN,IAAI,CAAC,cAAc,CACnB,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,eAAe;QAC5B,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5C,MAAM,oBAAoB,CACzB,IAAI,CAAC,qBAAqB,EAAE,EAC5B,IAAI,CAAC,gBAAgB,EAAE,EACvB,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACpC,MAAM,EACN,IAAI,CAAC,cAAc,CACnB,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,qBAAqB;QAC5B,OAAO;YACN,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;YACtC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;SAChC,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAO,GAA0C,EAAE;QAC3E,IAAI,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,KAAK,IAAI,CAAC;QACvE,IAAI,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;QACtE,IAAI,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;QACtE,OAAO;YACN,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa;YACtF,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,eAAe,EACd,IAAI,CAAC,0BAA0B,IAAI,IAAI,CAAC,eAAe;gBACtD,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;oBAClB,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;wBACrC,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpE,CAAC;oBACD,OAAO,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClD,CAAC;gBACF,CAAC,CAAC,SAAS;YACb,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,mBAAmB,EAAE,KAAK,IAAI,EAAE;gBAC/B,IAAI,uBAAuB,EAAE,CAAC;oBAC7B,uBAAuB,GAAG,KAAK,CAAC;oBAChC,OAAO,EAAE,CAAC;gBACX,CAAC;gBACD,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;gBAClE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACnC,CAAC;YACD,mBAAmB,EAAE,KAAK,IAAI,EAAE;gBAC/B,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;gBAClE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACnC,CAAC;YACD,sBAAsB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC3C,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC1B,IAAI,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,uBAAuB;wBAAE,OAAO;oBAChF,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACrC,OAAO;gBACR,CAAC;gBACD,IAAI,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,uBAAuB;oBAAE,OAAO;gBAChF,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;SACD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,QAAgD;QAC9E,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,IAAI,cAAc,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC7C,cAAc,GAAG,OAAO,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC;QAE1G,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;QAErC,IAAI,CAAC;YACJ,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACvC,OACC,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO;gBAC/B,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B;gBAC3C,IAAI,CAAC,iBAAiB,EAAE,EACvB,CAAC;gBACF,MAAM,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACnE,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,SAAS,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,8BAA8B,CAAC,MAAmB;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAClD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,YAAY,CACjB,cAAc,EACd,IAAI,CAAC,qBAAqB,EAAE,EAC5B,IAAI,CAAC,gBAAgB,CAAC,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,EACxD,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACpC,MAAM,EACN,IAAI,CAAC,cAAc,CACnB,CAAC;YACF,OAAO;QACR,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACnD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;QACR,CAAC;QAED,MAAM,YAAY,CACjB,eAAe,EACf,IAAI,CAAC,qBAAqB,EAAE,EAC5B,IAAI,CAAC,gBAAgB,EAAE,EACvB,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACpC,MAAM,EACN,IAAI,CAAC,cAAc,CACnB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAc,EAAE,OAAgB;QAC9D,MAAM,cAAc,GAAG;YACtB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACrC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;YAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ;YACpC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC3B,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;YACzC,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YACpE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACE,CAAC;QACzB,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACzF,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAEO,SAAS;QAChB,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QACjD,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,aAAa,CAAC,KAAiB;QAC5C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,eAAe;gBACnB,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC7C,MAAM;YAEP,KAAK,gBAAgB;gBACpB,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC7C,MAAM;YAEP,KAAK,aAAa;gBACjB,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM;YAEP,KAAK,sBAAsB,EAAE,CAAC;gBAC7B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAC/D,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;gBAChD,MAAM;YACP,CAAC;YAED,KAAK,oBAAoB,EAAE,CAAC;gBAC3B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAC/D,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;gBAChD,MAAM;YACP,CAAC;YAED,KAAK,UAAU;gBACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;oBACtE,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;gBACvD,CAAC;gBACD,MAAM;YAEP,KAAK,WAAW;gBACf,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACzC,MAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;CACD","sourcesContent":["import type {\n\tImageContent,\n\tMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tTextContent,\n\tThinkingBudgets,\n\tTransport,\n} from \"@earendil-works/pi-ai\";\nimport { runAgentLoop, runAgentLoopContinue } from \"./agent-loop.ts\";\nimport { getDefaultStreamFn } from \"./stream-fn.ts\";\nimport type {\n\tAfterToolCallContext,\n\tAfterToolCallResult,\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentState,\n\tAgentTool,\n\tBeforeToolCallContext,\n\tBeforeToolCallResult,\n\tPrepareNextTurnContext,\n\tQueueMode,\n\tStreamFn,\n\tToolExecutionMode,\n} from \"./types.ts\";\n\nexport type { QueueMode } from \"./types.ts\";\n\nfunction defaultConvertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages.filter(\n\t\t(message) => message.role === \"user\" || message.role === \"assistant\" || message.role === \"toolResult\",\n\t);\n}\n\nconst EMPTY_USAGE = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nconst DEFAULT_MODEL = {\n\tid: \"unknown\",\n\tname: \"unknown\",\n\tapi: \"unknown\",\n\tprovider: \"unknown\",\n\tbaseUrl: \"\",\n\treasoning: false,\n\tinput: [],\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\tcontextWindow: 0,\n\tmaxTokens: 0,\n} satisfies Model<any>;\n\ntype MutableAgentState = Omit<AgentState, \"isStreaming\" | \"streamingMessage\" | \"pendingToolCalls\" | \"errorMessage\"> & {\n\tisStreaming: boolean;\n\tstreamingMessage?: AgentMessage;\n\tpendingToolCalls: Set<string>;\n\terrorMessage?: string;\n};\n\nfunction createMutableAgentState(\n\tinitialState?: Partial<Omit<AgentState, \"pendingToolCalls\" | \"isStreaming\" | \"streamingMessage\" | \"errorMessage\">>,\n): MutableAgentState {\n\tlet tools = initialState?.tools?.slice() ?? [];\n\tlet messages = initialState?.messages?.slice() ?? [];\n\n\treturn {\n\t\tsystemPrompt: initialState?.systemPrompt ?? \"\",\n\t\tmodel: initialState?.model ?? DEFAULT_MODEL,\n\t\tthinkingLevel: initialState?.thinkingLevel ?? \"off\",\n\t\tget tools() {\n\t\t\treturn tools;\n\t\t},\n\t\tset tools(nextTools: AgentTool<any>[]) {\n\t\t\ttools = nextTools.slice();\n\t\t},\n\t\tget messages() {\n\t\t\treturn messages;\n\t\t},\n\t\tset messages(nextMessages: AgentMessage[]) {\n\t\t\tmessages = nextMessages.slice();\n\t\t},\n\t\tisStreaming: false,\n\t\tstreamingMessage: undefined,\n\t\tpendingToolCalls: new Set<string>(),\n\t\terrorMessage: undefined,\n\t};\n}\n\n/** Options for constructing an {@link Agent}. */\nexport interface AgentOptions {\n\tinitialState?: Partial<Omit<AgentState, \"pendingToolCalls\" | \"isStreaming\" | \"streamingMessage\" | \"errorMessage\">>;\n\tconvertToLlm?: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;\n\ttransformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>;\n\tstreamFn: StreamFn;\n\tgetApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;\n\tonPayload?: SimpleStreamOptions[\"onPayload\"];\n\tonResponse?: SimpleStreamOptions[\"onResponse\"];\n\tbeforeToolCall?: (context: BeforeToolCallContext, signal?: AbortSignal) => Promise<BeforeToolCallResult | undefined>;\n\tafterToolCall?: (context: AfterToolCallContext, signal?: AbortSignal) => Promise<AfterToolCallResult | undefined>;\n\tprepareNextTurn?: (\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tprepareNextTurnWithContext?: (\n\t\tcontext: PrepareNextTurnContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tsteeringMode?: QueueMode;\n\tfollowUpMode?: QueueMode;\n\tsessionId?: string;\n\tthinkingBudgets?: ThinkingBudgets;\n\ttransport?: Transport;\n\ttimeoutMs?: number;\n\tmaxRetryDelayMs?: number;\n\ttoolExecution?: ToolExecutionMode;\n\tabortServerSideFallback?: boolean;\n}\n\nclass PendingMessageQueue {\n\tprivate messages: AgentMessage[] = [];\n\tprivate clearGeneration = 0;\n\tpublic mode: QueueMode;\n\n\tconstructor(mode: QueueMode) {\n\t\tthis.mode = mode;\n\t}\n\n\tenqueue(message: AgentMessage): void {\n\t\tthis.messages.push(message);\n\t}\n\n\thasItems(): boolean {\n\t\treturn this.messages.length > 0;\n\t}\n\n\tgetClearGeneration(): number {\n\t\treturn this.clearGeneration;\n\t}\n\n\tdrain(): AgentMessage[] {\n\t\tif (this.mode === \"all\") {\n\t\t\tconst drained = this.messages.slice();\n\t\t\tthis.messages = [];\n\t\t\treturn drained;\n\t\t}\n\n\t\tconst first = this.messages[0];\n\t\tif (!first) {\n\t\t\treturn [];\n\t\t}\n\t\tthis.messages = this.messages.slice(1);\n\t\treturn [first];\n\t}\n\n\tprepend(messages: AgentMessage[]): void {\n\t\tthis.messages = [...messages, ...this.messages];\n\t}\n\n\tclear(): void {\n\t\tthis.messages = [];\n\t\tthis.clearGeneration++;\n\t}\n}\n\ntype ActiveRun = {\n\tpromise: Promise<void>;\n\tresolve: () => void;\n\tabortController: AbortController;\n\tsuppressQueuedMessageDrain: boolean;\n};\n\n/**\n * Stateful wrapper around the low-level agent loop.\n *\n * `Agent` owns the current transcript, emits lifecycle events, executes tools,\n * and exposes queueing APIs for steering and follow-up messages.\n */\nexport class Agent {\n\tprivate _state: MutableAgentState;\n\tprivate readonly listeners = new Set<(event: AgentEvent, signal: AbortSignal) => Promise<void> | void>();\n\tprivate readonly steeringQueue: PendingMessageQueue;\n\tprivate readonly followUpQueue: PendingMessageQueue;\n\n\tpublic convertToLlm: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;\n\tpublic transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>;\n\tpublic streamFunction: StreamFn;\n\tpublic getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;\n\tpublic onPayload?: SimpleStreamOptions[\"onPayload\"];\n\tpublic onResponse?: SimpleStreamOptions[\"onResponse\"];\n\tpublic beforeToolCall?: (\n\t\tcontext: BeforeToolCallContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<BeforeToolCallResult | undefined>;\n\tpublic afterToolCall?: (\n\t\tcontext: AfterToolCallContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<AfterToolCallResult | undefined>;\n\tpublic prepareNextTurn?: (\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tpublic prepareNextTurnWithContext?: (\n\t\tcontext: PrepareNextTurnContext,\n\t\tsignal?: AbortSignal,\n\t) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined;\n\tprivate activeRun?: ActiveRun;\n\t/** Session identifier forwarded to providers for cache-aware backends. */\n\tpublic sessionId?: string;\n\t/** Optional per-level thinking token budgets forwarded to the stream function. */\n\tpublic thinkingBudgets?: ThinkingBudgets;\n\t/** Preferred transport forwarded to the stream function. */\n\tpublic transport: Transport;\n\tpublic timeoutMs?: number;\n\t/** Optional cap for provider-requested retry delays. */\n\tpublic maxRetryDelayMs?: number;\n\t/** Tool execution strategy for assistant messages that contain multiple tool calls. */\n\tpublic toolExecution: ToolExecutionMode;\n\t/** Forwarded to the stream function; providers without server-side fallback ignore it. */\n\tpublic abortServerSideFallback?: boolean;\n\n\tconstructor(options: AgentOptions) {\n\t\t// Older compiled consumers may omit options or streamFn even though the current API requires them.\n\t\tconst runtimeOptions: Partial<AgentOptions> = options ?? {};\n\t\tthis._state = createMutableAgentState(runtimeOptions.initialState);\n\t\tthis.convertToLlm = runtimeOptions.convertToLlm ?? defaultConvertToLlm;\n\t\tthis.transformContext = runtimeOptions.transformContext;\n\t\tthis.streamFunction = runtimeOptions.streamFn ?? getDefaultStreamFn();\n\t\tthis.getApiKey = runtimeOptions.getApiKey;\n\t\tthis.onPayload = runtimeOptions.onPayload;\n\t\tthis.onResponse = runtimeOptions.onResponse;\n\t\tthis.beforeToolCall = runtimeOptions.beforeToolCall;\n\t\tthis.afterToolCall = runtimeOptions.afterToolCall;\n\t\tthis.prepareNextTurn = runtimeOptions.prepareNextTurn;\n\t\tthis.prepareNextTurnWithContext = runtimeOptions.prepareNextTurnWithContext;\n\t\tthis.steeringQueue = new PendingMessageQueue(runtimeOptions.steeringMode ?? \"one-at-a-time\");\n\t\tthis.followUpQueue = new PendingMessageQueue(runtimeOptions.followUpMode ?? \"one-at-a-time\");\n\t\tthis.sessionId = runtimeOptions.sessionId;\n\t\tthis.thinkingBudgets = runtimeOptions.thinkingBudgets;\n\t\tthis.transport = runtimeOptions.transport ?? \"auto\";\n\t\tthis.timeoutMs = runtimeOptions.timeoutMs;\n\t\tthis.maxRetryDelayMs = runtimeOptions.maxRetryDelayMs;\n\t\tthis.toolExecution = runtimeOptions.toolExecution ?? \"parallel\";\n\t\tthis.abortServerSideFallback = runtimeOptions.abortServerSideFallback;\n\t}\n\n\t/**\n\t * Subscribe to agent lifecycle events.\n\t *\n\t * Listener promises are awaited in subscription order and are included in\n\t * the current run's settlement. Listeners also receive the active abort\n\t * signal for the current run.\n\t *\n\t * `agent_end` is the final emitted event for a run, but the agent does not\n\t * become idle until all awaited listeners for that event have settled.\n\t */\n\tsubscribe(listener: (event: AgentEvent, signal: AbortSignal) => Promise<void> | void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\t/**\n\t * Current agent state.\n\t *\n\t * Assigning `state.tools` or `state.messages` copies the provided top-level array.\n\t */\n\tget state(): AgentState {\n\t\treturn this._state;\n\t}\n\n\t/** Controls how queued steering messages are drained. */\n\tset steeringMode(mode: QueueMode) {\n\t\tthis.steeringQueue.mode = mode;\n\t}\n\n\tget steeringMode(): QueueMode {\n\t\treturn this.steeringQueue.mode;\n\t}\n\n\t/** Controls how queued follow-up messages are drained. */\n\tset followUpMode(mode: QueueMode) {\n\t\tthis.followUpQueue.mode = mode;\n\t}\n\n\tget followUpMode(): QueueMode {\n\t\treturn this.followUpQueue.mode;\n\t}\n\n\t/** Queue a message to be injected after the current assistant turn finishes. */\n\tsteer(message: AgentMessage): void {\n\t\tthis.steeringQueue.enqueue(message);\n\t}\n\n\t/** Queue a message to run only after the agent would otherwise stop. */\n\tfollowUp(message: AgentMessage): void {\n\t\tthis.followUpQueue.enqueue(message);\n\t}\n\n\t/** Remove all queued steering messages. */\n\tclearSteeringQueue(): void {\n\t\tthis.steeringQueue.clear();\n\t}\n\n\t/** Remove all queued follow-up messages. */\n\tclearFollowUpQueue(): void {\n\t\tthis.followUpQueue.clear();\n\t}\n\n\t/** Remove all queued steering and follow-up messages. */\n\tclearAllQueues(): void {\n\t\tthis.clearSteeringQueue();\n\t\tthis.clearFollowUpQueue();\n\t}\n\n\t/** Returns true when either queue still contains pending messages. */\n\thasQueuedMessages(): boolean {\n\t\treturn this.steeringQueue.hasItems() || this.followUpQueue.hasItems();\n\t}\n\n\t/** Active abort signal for the current run, if any. */\n\tget signal(): AbortSignal | undefined {\n\t\treturn this.activeRun?.abortController.signal;\n\t}\n\n\t/** Abort the current run, if one is active. */\n\tabort(): void {\n\t\tthis.activeRun?.abortController.abort();\n\t}\n\n\t/**\n\t * Keep queued steering and follow-up messages for an external owner after\n\t * this run reaches agent_end, without changing the active abort signal.\n\t */\n\tsuppressQueuedMessageDrain(): void {\n\t\tif (this.activeRun) {\n\t\t\tthis.activeRun.suppressQueuedMessageDrain = true;\n\t\t}\n\t}\n\n\t/**\n\t * Resolve when the current run and all awaited event listeners have finished.\n\t *\n\t * This resolves after `agent_end` listeners settle.\n\t */\n\twaitForIdle(): Promise<void> {\n\t\treturn this.activeRun?.promise ?? Promise.resolve();\n\t}\n\n\t/** Clear transcript state, runtime state, and queued messages. */\n\treset(): void {\n\t\tthis._state.messages = [];\n\t\tthis._state.isStreaming = false;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\tthis._state.errorMessage = undefined;\n\t\tthis.clearFollowUpQueue();\n\t\tthis.clearSteeringQueue();\n\t}\n\n\t/** Start a new prompt from text, a single message, or a batch of messages. */\n\tasync prompt(message: AgentMessage | AgentMessage[]): Promise<void>;\n\tasync prompt(input: string, images?: ImageContent[]): Promise<void>;\n\tasync prompt(input: string | AgentMessage | AgentMessage[], images?: ImageContent[]): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.\",\n\t\t\t);\n\t\t}\n\t\tconst messages = this.normalizePromptInput(input, images);\n\t\tawait this.runPromptMessages(messages);\n\t}\n\n\t/** Continue by delivering queued input first when a compaction leaves custom context at the tail. */\n\tasync continueWithQueuedMessages(): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new Error(\"Agent is already processing. Wait for completion before continuing.\");\n\t\t}\n\n\t\tif (this._state.messages[this._state.messages.length - 1]?.role === \"assistant\") {\n\t\t\tawait this.continue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst queuedSteering = this.steeringQueue.drain();\n\t\tif (queuedSteering.length > 0) {\n\t\t\tawait this.runPromptMessages(queuedSteering, { skipInitialSteeringPoll: true });\n\t\t\treturn;\n\t\t}\n\n\t\tconst queuedFollowUps = this.followUpQueue.drain();\n\t\tif (queuedFollowUps.length > 0) {\n\t\t\tawait this.runPromptMessages(queuedFollowUps);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.continue();\n\t}\n\n\t/** Continue from the current transcript. The last message must be a user or tool-result message. */\n\tasync continue(): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new Error(\"Agent is already processing. Wait for completion before continuing.\");\n\t\t}\n\n\t\tconst lastMessage = this._state.messages[this._state.messages.length - 1];\n\t\tif (!lastMessage) {\n\t\t\tthrow new Error(\"No messages to continue from\");\n\t\t}\n\n\t\tif (lastMessage.role === \"assistant\") {\n\t\t\tconst queuedSteering = this.steeringQueue.drain();\n\t\t\tif (queuedSteering.length > 0) {\n\t\t\t\tawait this.runPromptMessages(queuedSteering, { skipInitialSteeringPoll: true });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst queuedFollowUps = this.followUpQueue.drain();\n\t\t\tif (queuedFollowUps.length > 0) {\n\t\t\t\tawait this.runPromptMessages(queuedFollowUps);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t\t}\n\n\t\tawait this.runContinuation();\n\t}\n\n\tprivate normalizePromptInput(\n\t\tinput: string | AgentMessage | AgentMessage[],\n\t\timages?: ImageContent[],\n\t): AgentMessage[] {\n\t\tif (Array.isArray(input)) {\n\t\t\treturn input;\n\t\t}\n\n\t\tif (typeof input !== \"string\") {\n\t\t\treturn [input];\n\t\t}\n\n\t\tconst content: Array<TextContent | ImageContent> = [{ type: \"text\", text: input }];\n\t\tif (images && images.length > 0) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\treturn [{ role: \"user\", content, timestamp: Date.now() }];\n\t}\n\n\tprivate async runPromptMessages(\n\t\tmessages: AgentMessage[],\n\t\toptions: { skipInitialSteeringPoll?: boolean } = {},\n\t): Promise<void> {\n\t\tawait this.runWithLifecycle(async (signal) => {\n\t\t\tawait runAgentLoop(\n\t\t\t\tmessages,\n\t\t\t\tthis.createContextSnapshot(),\n\t\t\t\tthis.createLoopConfig(options),\n\t\t\t\t(event) => this.processEvents(event),\n\t\t\t\tsignal,\n\t\t\t\tthis.streamFunction,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate async runContinuation(): Promise<void> {\n\t\tawait this.runWithLifecycle(async (signal) => {\n\t\t\tawait runAgentLoopContinue(\n\t\t\t\tthis.createContextSnapshot(),\n\t\t\t\tthis.createLoopConfig(),\n\t\t\t\t(event) => this.processEvents(event),\n\t\t\t\tsignal,\n\t\t\t\tthis.streamFunction,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate createContextSnapshot(): AgentContext {\n\t\treturn {\n\t\t\tsystemPrompt: this._state.systemPrompt,\n\t\t\tmessages: this._state.messages.slice(),\n\t\t\ttools: this._state.tools.slice(),\n\t\t};\n\t}\n\n\tprivate createLoopConfig(options: { skipInitialSteeringPoll?: boolean } = {}): AgentLoopConfig {\n\t\tlet skipInitialSteeringPoll = options.skipInitialSteeringPoll === true;\n\t\tlet steeringQueueGeneration = this.steeringQueue.getClearGeneration();\n\t\tlet followUpQueueGeneration = this.followUpQueue.getClearGeneration();\n\t\treturn {\n\t\t\tmodel: this._state.model,\n\t\t\treasoning: this._state.thinkingLevel === \"off\" ? undefined : this._state.thinkingLevel,\n\t\t\tsessionId: this.sessionId,\n\t\t\tonPayload: this.onPayload,\n\t\t\tonResponse: this.onResponse,\n\t\t\ttransport: this.transport,\n\t\t\tthinkingBudgets: this.thinkingBudgets,\n\t\t\ttimeoutMs: this.timeoutMs,\n\t\t\tmaxRetryDelayMs: this.maxRetryDelayMs,\n\t\t\tabortServerSideFallback: this.abortServerSideFallback,\n\t\t\ttoolExecution: this.toolExecution,\n\t\t\tbeforeToolCall: this.beforeToolCall,\n\t\t\tafterToolCall: this.afterToolCall,\n\t\t\tprepareNextTurn:\n\t\t\t\tthis.prepareNextTurnWithContext || this.prepareNextTurn\n\t\t\t\t\t? async (context) => {\n\t\t\t\t\t\t\tif (this.prepareNextTurnWithContext) {\n\t\t\t\t\t\t\t\treturn await this.prepareNextTurnWithContext(context, this.signal);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn await this.prepareNextTurn?.(this.signal);\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tconvertToLlm: this.convertToLlm,\n\t\t\ttransformContext: this.transformContext,\n\t\t\tgetApiKey: this.getApiKey,\n\t\t\tgetSteeringMessages: async () => {\n\t\t\t\tif (skipInitialSteeringPoll) {\n\t\t\t\t\tskipInitialSteeringPoll = false;\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\tsteeringQueueGeneration = this.steeringQueue.getClearGeneration();\n\t\t\t\treturn this.steeringQueue.drain();\n\t\t\t},\n\t\t\tgetFollowUpMessages: async () => {\n\t\t\t\tfollowUpQueueGeneration = this.followUpQueue.getClearGeneration();\n\t\t\t\treturn this.followUpQueue.drain();\n\t\t\t},\n\t\t\trestorePendingMessages: (queue, messages) => {\n\t\t\t\tif (queue === \"steering\") {\n\t\t\t\t\tif (this.steeringQueue.getClearGeneration() !== steeringQueueGeneration) return;\n\t\t\t\t\tthis.steeringQueue.prepend(messages);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.followUpQueue.getClearGeneration() !== followUpQueueGeneration) return;\n\t\t\t\tthis.followUpQueue.prepend(messages);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async runWithLifecycle(executor: (signal: AbortSignal) => Promise<void>): Promise<void> {\n\t\tif (this.activeRun) {\n\t\t\tthrow new Error(\"Agent is already processing.\");\n\t\t}\n\n\t\tconst abortController = new AbortController();\n\t\tlet resolvePromise = () => {};\n\t\tconst promise = new Promise<void>((resolve) => {\n\t\t\tresolvePromise = resolve;\n\t\t});\n\t\tthis.activeRun = { promise, resolve: resolvePromise, abortController, suppressQueuedMessageDrain: false };\n\n\t\tthis._state.isStreaming = true;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.errorMessage = undefined;\n\n\t\ttry {\n\t\t\tawait executor(abortController.signal);\n\t\t\twhile (\n\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t!this.activeRun?.suppressQueuedMessageDrain &&\n\t\t\t\tthis.hasQueuedMessages()\n\t\t\t) {\n\t\t\t\tawait this.runQueuedMessagesAfterAgentEnd(abortController.signal);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this.handleRunFailure(error, abortController.signal.aborted);\n\t\t} finally {\n\t\t\tthis.finishRun();\n\t\t}\n\t}\n\n\tprivate async runQueuedMessagesAfterAgentEnd(signal: AbortSignal): Promise<void> {\n\t\tconst queuedSteering = this.steeringQueue.drain();\n\t\tif (queuedSteering.length > 0) {\n\t\t\tawait runAgentLoop(\n\t\t\t\tqueuedSteering,\n\t\t\t\tthis.createContextSnapshot(),\n\t\t\t\tthis.createLoopConfig({ skipInitialSteeringPoll: true }),\n\t\t\t\t(event) => this.processEvents(event),\n\t\t\t\tsignal,\n\t\t\t\tthis.streamFunction,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst queuedFollowUps = this.followUpQueue.drain();\n\t\tif (queuedFollowUps.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait runAgentLoop(\n\t\t\tqueuedFollowUps,\n\t\t\tthis.createContextSnapshot(),\n\t\t\tthis.createLoopConfig(),\n\t\t\t(event) => this.processEvents(event),\n\t\t\tsignal,\n\t\t\tthis.streamFunction,\n\t\t);\n\t}\n\n\tprivate async handleRunFailure(error: unknown, aborted: boolean): Promise<void> {\n\t\tconst failureMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [{ type: \"text\", text: \"\" }],\n\t\t\tapi: this._state.model.api,\n\t\t\tprovider: this._state.model.provider,\n\t\t\tmodel: this._state.model.id,\n\t\t\tusage: EMPTY_USAGE,\n\t\t\tstopReason: aborted ? \"aborted\" : \"error\",\n\t\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies AgentMessage;\n\t\tawait this.processEvents({ type: \"message_start\", message: failureMessage });\n\t\tawait this.processEvents({ type: \"message_end\", message: failureMessage });\n\t\tawait this.processEvents({ type: \"turn_end\", message: failureMessage, toolResults: [] });\n\t\tawait this.processEvents({ type: \"agent_end\", messages: [failureMessage] });\n\t}\n\n\tprivate finishRun(): void {\n\t\tthis._state.isStreaming = false;\n\t\tthis._state.streamingMessage = undefined;\n\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\tthis.activeRun?.resolve();\n\t\tthis.activeRun = undefined;\n\t}\n\n\t/**\n\t * Reduce internal state for a loop event, then await listeners.\n\t *\n\t * `agent_end` only means no further loop events will be emitted. The run is\n\t * considered idle later, after all awaited listeners for `agent_end` finish\n\t * and `finishRun()` clears runtime-owned state.\n\t */\n\tprivate async processEvents(event: AgentEvent): Promise<void> {\n\t\tswitch (event.type) {\n\t\t\tcase \"message_start\":\n\t\t\t\tthis._state.streamingMessage = event.message;\n\t\t\t\tbreak;\n\n\t\t\tcase \"message_update\":\n\t\t\t\tthis._state.streamingMessage = event.message;\n\t\t\t\tbreak;\n\n\t\t\tcase \"message_end\":\n\t\t\t\tthis._state.streamingMessage = undefined;\n\t\t\t\tthis._state.messages.push(event.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"tool_execution_start\": {\n\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\tpendingToolCalls.add(event.toolCallId);\n\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"tool_execution_end\": {\n\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\tpendingToolCalls.delete(event.toolCallId);\n\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"turn_end\":\n\t\t\t\tif (event.message.role === \"assistant\" && event.message.errorMessage) {\n\t\t\t\t\tthis._state.errorMessage = event.message.errorMessage;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"agent_end\":\n\t\t\t\tthis._state.streamingMessage = undefined;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst signal = this.activeRun?.abortController.signal;\n\t\tif (!signal) {\n\t\t\tthrow new Error(\"Agent listener invoked outside active run\");\n\t\t}\n\t\tfor (const listener of this.listeners) {\n\t\t\tawait listener(event, signal);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,94 @@
1
+ import { type AssistantMessage, type ImageContent, type Model, type Models } from "@earendil-works/pi-ai";
2
+ import type { AgentMessage, QueueMode, ThinkingLevel } from "../types.ts";
3
+ import type { AbortResult, AgentHarnessEvent, AgentHarnessEventResultMap, AgentHarnessOptions, AgentHarnessOwnEvent, AgentHarnessResources, AgentHarnessStreamOptions, AgentHarnessTool, CompactResult, NavigateTreeResult, PromptTemplate, Skill } from "./types.ts";
4
+ export declare class AgentHarness<TContext extends object | undefined = undefined, TSkill extends Skill = Skill, TPromptTemplate extends PromptTemplate = PromptTemplate, TTool extends AgentHarnessTool<TContext> = AgentHarnessTool<TContext>> {
5
+ private session;
6
+ readonly models: Models;
7
+ private phase;
8
+ private runAbortController?;
9
+ private runPromise?;
10
+ private pendingSessionWrites;
11
+ private model;
12
+ private thinkingLevel;
13
+ private systemPrompt;
14
+ private toolContext;
15
+ private streamOptions;
16
+ private retry;
17
+ private resources;
18
+ private tools;
19
+ private activeToolNames;
20
+ private steerQueue;
21
+ private steeringQueueMode;
22
+ private followUpQueue;
23
+ private followUpQueueMode;
24
+ private nextTurnQueue;
25
+ private handlers;
26
+ constructor(options: AgentHarnessOptions<TContext, TSkill, TPromptTemplate, TTool>);
27
+ private getHandlers;
28
+ private emitOwn;
29
+ private emitAny;
30
+ private emitHook;
31
+ private retryCallbacks;
32
+ private emitBeforeProviderRequest;
33
+ private emitBeforeProviderPayload;
34
+ private emitQueueUpdate;
35
+ private startRunPromise;
36
+ private resolveToolContext;
37
+ private bindToolContext;
38
+ private createTurnState;
39
+ private createContext;
40
+ private createStreamFn;
41
+ private drainQueuedMessages;
42
+ private createLoopConfig;
43
+ private validateUniqueNames;
44
+ private validateToolNames;
45
+ private flushPendingSessionWrites;
46
+ private handleAgentEvent;
47
+ private emitRunFailure;
48
+ private executeTurn;
49
+ prompt(text: string, options?: {
50
+ images?: ImageContent[];
51
+ }): Promise<AssistantMessage>;
52
+ skill(name: string, additionalInstructions?: string): Promise<AssistantMessage>;
53
+ promptFromTemplate(name: string, args?: string[]): Promise<AssistantMessage>;
54
+ steer(text: string, options?: {
55
+ images?: ImageContent[];
56
+ }): Promise<void>;
57
+ followUp(text: string, options?: {
58
+ images?: ImageContent[];
59
+ }): Promise<void>;
60
+ nextTurn(text: string, options?: {
61
+ images?: ImageContent[];
62
+ }): Promise<void>;
63
+ appendMessage(message: AgentMessage): Promise<void>;
64
+ compact(customInstructions?: string): Promise<CompactResult>;
65
+ navigateTree(targetId: string, options?: {
66
+ summarize?: boolean;
67
+ customInstructions?: string;
68
+ replaceInstructions?: boolean;
69
+ label?: string;
70
+ }): Promise<NavigateTreeResult>;
71
+ getModel(): Model<any>;
72
+ setModel(model: Model<any>): Promise<void>;
73
+ getThinkingLevel(): ThinkingLevel;
74
+ setThinkingLevel(level: ThinkingLevel): Promise<void>;
75
+ getTools(): TTool[];
76
+ setTools(tools: TTool[], activeToolNames?: string[]): Promise<void>;
77
+ getActiveTools(): TTool[];
78
+ setActiveTools(toolNames: string[]): Promise<void>;
79
+ getSteeringMode(): QueueMode;
80
+ setSteeringMode(mode: QueueMode): Promise<void>;
81
+ getFollowUpMode(): QueueMode;
82
+ setFollowUpMode(mode: QueueMode): Promise<void>;
83
+ getResources(): AgentHarnessResources<TSkill, TPromptTemplate>;
84
+ setResources(resources: AgentHarnessResources<TSkill, TPromptTemplate>): Promise<void>;
85
+ getStreamOptions(): AgentHarnessStreamOptions;
86
+ setStreamOptions(streamOptions: AgentHarnessStreamOptions): Promise<void>;
87
+ abort(): Promise<AbortResult>;
88
+ waitForIdle(): Promise<void>;
89
+ subscribe(listener: (event: AgentHarnessEvent<TSkill, TPromptTemplate>, signal?: AbortSignal) => Promise<void> | void): () => void;
90
+ on<TType extends keyof AgentHarnessEventResultMap>(type: TType, handler: (event: Extract<AgentHarnessOwnEvent, {
91
+ type: TType;
92
+ }>) => Promise<AgentHarnessEventResultMap[TType]> | AgentHarnessEventResultMap[TType]): () => void;
93
+ }
94
+ //# sourceMappingURL=agent-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-harness.d.ts","sourceRoot":"","sources":["../../src/harness/agent-harness.ts"],"names":[],"mappings":"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"}