@ank1015/providers 0.0.1 → 0.0.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 (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -383
  3. package/dist/agent/conversation.d.ts +97 -0
  4. package/dist/agent/conversation.d.ts.map +1 -0
  5. package/dist/agent/conversation.js +328 -0
  6. package/dist/agent/conversation.js.map +1 -0
  7. package/dist/agent/runner.d.ts +37 -0
  8. package/dist/agent/runner.d.ts.map +1 -0
  9. package/dist/agent/runner.js +169 -0
  10. package/dist/agent/runner.js.map +1 -0
  11. package/dist/agent/tools/calculate.d.ts +15 -0
  12. package/dist/agent/tools/calculate.d.ts.map +1 -0
  13. package/dist/agent/tools/calculate.js +23 -0
  14. package/dist/agent/tools/calculate.js.map +1 -0
  15. package/dist/agent/tools/get-current-time.d.ts +15 -0
  16. package/dist/agent/tools/get-current-time.d.ts.map +1 -0
  17. package/dist/agent/tools/get-current-time.js +38 -0
  18. package/dist/agent/tools/get-current-time.js.map +1 -0
  19. package/dist/agent/tools/index.d.ts +3 -0
  20. package/dist/agent/tools/index.d.ts.map +1 -0
  21. package/dist/agent/tools/index.js +3 -0
  22. package/dist/agent/tools/index.js.map +1 -0
  23. package/dist/agent/types.d.ts +53 -31
  24. package/dist/agent/types.d.ts.map +1 -1
  25. package/dist/agent/types.js +1 -2
  26. package/dist/agent/utils.d.ts +14 -0
  27. package/dist/agent/utils.d.ts.map +1 -0
  28. package/dist/agent/utils.js +59 -0
  29. package/dist/agent/utils.js.map +1 -0
  30. package/dist/index.d.ts +16 -9
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +16 -28
  33. package/dist/index.js.map +1 -1
  34. package/dist/llm.d.ts +15 -0
  35. package/dist/llm.d.ts.map +1 -0
  36. package/dist/llm.js +92 -0
  37. package/dist/llm.js.map +1 -0
  38. package/dist/models.d.ts +8 -1
  39. package/dist/models.d.ts.map +1 -1
  40. package/dist/models.generated.d.ts +25 -112
  41. package/dist/models.generated.d.ts.map +1 -1
  42. package/dist/models.generated.js +72 -227
  43. package/dist/models.generated.js.map +1 -1
  44. package/dist/models.js +30 -32
  45. package/dist/models.js.map +1 -1
  46. package/dist/providers/google/complete.d.ts +3 -0
  47. package/dist/providers/google/complete.d.ts.map +1 -0
  48. package/dist/providers/google/complete.js +53 -0
  49. package/dist/providers/google/complete.js.map +1 -0
  50. package/dist/providers/google/index.d.ts +6 -0
  51. package/dist/providers/google/index.d.ts.map +1 -0
  52. package/dist/providers/google/index.js +6 -0
  53. package/dist/providers/google/index.js.map +1 -0
  54. package/dist/providers/google/stream.d.ts +3 -0
  55. package/dist/providers/google/stream.d.ts.map +1 -0
  56. package/dist/providers/{google.js → google/stream.js} +67 -231
  57. package/dist/providers/google/stream.js.map +1 -0
  58. package/dist/providers/google/types.d.ts +8 -0
  59. package/dist/providers/google/types.d.ts.map +1 -0
  60. package/dist/providers/google/types.js +2 -0
  61. package/dist/providers/google/types.js.map +1 -0
  62. package/dist/providers/google/utils.d.ts +30 -0
  63. package/dist/providers/google/utils.d.ts.map +1 -0
  64. package/dist/providers/google/utils.js +354 -0
  65. package/dist/providers/google/utils.js.map +1 -0
  66. package/dist/providers/openai/complete.d.ts +3 -0
  67. package/dist/providers/openai/complete.d.ts.map +1 -0
  68. package/dist/providers/openai/complete.js +57 -0
  69. package/dist/providers/openai/complete.js.map +1 -0
  70. package/dist/providers/openai/index.d.ts +4 -0
  71. package/dist/providers/openai/index.d.ts.map +1 -0
  72. package/dist/providers/openai/index.js +4 -0
  73. package/dist/providers/openai/index.js.map +1 -0
  74. package/dist/providers/openai/stream.d.ts +3 -0
  75. package/dist/providers/openai/stream.d.ts.map +1 -0
  76. package/dist/providers/{openai.js → openai/stream.js} +74 -152
  77. package/dist/providers/openai/stream.js.map +1 -0
  78. package/dist/providers/openai/types.d.ts +8 -0
  79. package/dist/providers/openai/types.d.ts.map +1 -0
  80. package/dist/providers/openai/types.js +2 -0
  81. package/dist/providers/openai/types.js.map +1 -0
  82. package/dist/providers/openai/utils.d.ts +13 -0
  83. package/dist/providers/openai/utils.d.ts.map +1 -0
  84. package/dist/providers/openai/utils.js +285 -0
  85. package/dist/providers/openai/utils.js.map +1 -0
  86. package/dist/types.d.ts +95 -87
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/types.js +1 -9
  89. package/dist/types.js.map +1 -1
  90. package/dist/utils/event-stream.d.ts +2 -2
  91. package/dist/utils/event-stream.d.ts.map +1 -1
  92. package/dist/utils/event-stream.js +2 -7
  93. package/dist/utils/event-stream.js.map +1 -1
  94. package/dist/utils/json-parse.js +3 -6
  95. package/dist/utils/json-parse.js.map +1 -1
  96. package/dist/utils/overflow.d.ts +51 -0
  97. package/dist/utils/overflow.d.ts.map +1 -0
  98. package/dist/utils/overflow.js +106 -0
  99. package/dist/utils/overflow.js.map +1 -0
  100. package/dist/utils/sanitize-unicode.js +1 -4
  101. package/dist/utils/sanitize-unicode.js.map +1 -1
  102. package/dist/utils/uuid.d.ts +6 -0
  103. package/dist/utils/uuid.d.ts.map +1 -0
  104. package/dist/utils/uuid.js +9 -0
  105. package/dist/utils/uuid.js.map +1 -0
  106. package/dist/utils/validation.d.ts +10 -3
  107. package/dist/utils/validation.d.ts.map +1 -1
  108. package/dist/utils/validation.js +20 -12
  109. package/dist/utils/validation.js.map +1 -1
  110. package/package.json +45 -8
  111. package/biome.json +0 -43
  112. package/dist/agent/agent-loop.d.ts +0 -5
  113. package/dist/agent/agent-loop.d.ts.map +0 -1
  114. package/dist/agent/agent-loop.js +0 -219
  115. package/dist/agent/agent-loop.js.map +0 -1
  116. package/dist/providers/convert.d.ts +0 -6
  117. package/dist/providers/convert.d.ts.map +0 -1
  118. package/dist/providers/convert.js +0 -207
  119. package/dist/providers/convert.js.map +0 -1
  120. package/dist/providers/google.d.ts +0 -26
  121. package/dist/providers/google.d.ts.map +0 -1
  122. package/dist/providers/google.js.map +0 -1
  123. package/dist/providers/openai.d.ts +0 -17
  124. package/dist/providers/openai.d.ts.map +0 -1
  125. package/dist/providers/openai.js.map +0 -1
  126. package/dist/stream.d.ts +0 -4
  127. package/dist/stream.d.ts.map +0 -1
  128. package/dist/stream.js +0 -40
  129. package/dist/stream.js.map +0 -1
  130. package/dist/test-google-agent-loop.d.ts +0 -2
  131. package/dist/test-google-agent-loop.d.ts.map +0 -1
  132. package/dist/test-google-agent-loop.js +0 -186
  133. package/dist/test-google-agent-loop.js.map +0 -1
  134. package/dist/test-google.d.ts +0 -2
  135. package/dist/test-google.d.ts.map +0 -1
  136. package/dist/test-google.js +0 -41
  137. package/dist/test-google.js.map +0 -1
  138. package/src/agent/agent-loop.ts +0 -275
  139. package/src/agent/types.ts +0 -80
  140. package/src/index.ts +0 -72
  141. package/src/models.generated.ts +0 -314
  142. package/src/models.ts +0 -45
  143. package/src/providers/convert.ts +0 -222
  144. package/src/providers/google.ts +0 -496
  145. package/src/providers/openai.ts +0 -437
  146. package/src/stream.ts +0 -60
  147. package/src/types.ts +0 -198
  148. package/src/utils/event-stream.ts +0 -60
  149. package/src/utils/json-parse.ts +0 -28
  150. package/src/utils/sanitize-unicode.ts +0 -25
  151. package/src/utils/validation.ts +0 -69
  152. package/test/core/agent-loop.test.ts +0 -958
  153. package/test/core/stream.test.ts +0 -409
  154. package/test/data/red-circle.png +0 -0
  155. package/test/data/superintelligentwill.pdf +0 -0
  156. package/test/edge-cases/general.test.ts +0 -565
  157. package/test/integration/e2e.test.ts +0 -530
  158. package/test/models/cost.test.ts +0 -499
  159. package/test/models/registry.test.ts +0 -298
  160. package/test/providers/convert.test.ts +0 -846
  161. package/test/providers/google-schema.test.ts +0 -666
  162. package/test/providers/google-stream.test.ts +0 -369
  163. package/test/providers/openai-stream.test.ts +0 -251
  164. package/test/utils/event-stream.test.ts +0 -289
  165. package/test/utils/json-parse.test.ts +0 -344
  166. package/test/utils/sanitize-unicode.test.ts +0 -329
  167. package/test/utils/validation.test.ts +0 -614
  168. package/tsconfig.json +0 -21
  169. package/vitest.config.ts +0 -9
@@ -0,0 +1,328 @@
1
+ import { getModel } from "../models.js";
2
+ import { generateUUID } from "../utils/uuid.js";
3
+ import { DefaultLLMClient } from "../llm.js";
4
+ import { buildUserMessage } from "./utils.js";
5
+ import { DefaultAgentRunner } from "./runner.js";
6
+ const defaultModel = getModel('google', 'gemini-3-flash-preview');
7
+ if (!defaultModel) {
8
+ throw new Error("Default model 'gemini-3-flash-preview' not found in models configuration");
9
+ }
10
+ const defaultProvider = {
11
+ model: defaultModel,
12
+ providerOptions: {}
13
+ };
14
+ const defaultConversationState = {
15
+ provider: defaultProvider,
16
+ messages: [],
17
+ tools: [],
18
+ isStreaming: false,
19
+ pendingToolCalls: new Set(),
20
+ error: undefined
21
+ };
22
+ const defaultMessageTransformer = (messages) => {
23
+ return messages.slice(); // Return a copy to avoid mutation of original array
24
+ };
25
+ export class Conversation {
26
+ constructor(opts = {}) {
27
+ this._state = defaultConversationState;
28
+ this.listeners = new Set();
29
+ this.messageQueue = [];
30
+ this.streamAssistantMessage = true;
31
+ const initialState = opts.initialState ?? {};
32
+ this.client = opts.client ?? new DefaultLLMClient();
33
+ this.runner = opts.runner ?? new DefaultAgentRunner(this.client, { streamAssistantMessage: this.streamAssistantMessage });
34
+ // Create fresh copies of reference types to avoid shared state between instances
35
+ this._state = {
36
+ ...defaultConversationState,
37
+ ...initialState,
38
+ // Override with fresh copies to ensure no shared references
39
+ messages: initialState.messages ? [...initialState.messages] : [],
40
+ tools: initialState.tools ? [...initialState.tools] : [],
41
+ pendingToolCalls: new Set(initialState.pendingToolCalls ?? []),
42
+ };
43
+ this.messageTransformer = opts.messageTransformer || defaultMessageTransformer;
44
+ this.queueMode = opts.queueMode || "one-at-a-time";
45
+ }
46
+ get state() {
47
+ return this._state;
48
+ }
49
+ subscribe(fn) {
50
+ this.listeners.add(fn);
51
+ return () => this.listeners.delete(fn);
52
+ }
53
+ emit(e) {
54
+ for (const listener of this.listeners) {
55
+ listener(e);
56
+ }
57
+ }
58
+ setStreamAssistantMessage(stream) {
59
+ this.streamAssistantMessage = stream;
60
+ // Recreate runner with updated streaming setting
61
+ this.runner = new DefaultAgentRunner(this.client, { streamAssistantMessage: stream });
62
+ }
63
+ // State mutators - update internal state without emitting events
64
+ setSystemPrompt(v) {
65
+ this._state.systemPrompt = v;
66
+ }
67
+ setProvider(provider) {
68
+ this._state.provider = provider;
69
+ }
70
+ setQueueMode(mode) {
71
+ this.queueMode = mode;
72
+ }
73
+ getQueueMode() {
74
+ return this.queueMode;
75
+ }
76
+ setTools(t) {
77
+ this._state.tools = t;
78
+ }
79
+ replaceMessages(ms) {
80
+ this._state.messages = ms.slice();
81
+ }
82
+ appendMessage(m) {
83
+ this._state.messages = [...this._state.messages, m];
84
+ }
85
+ appendMessages(ms) {
86
+ this._state.messages = [...this._state.messages, ...ms];
87
+ }
88
+ async queueMessage(m) {
89
+ // Transform message and queue it for injection at next turn
90
+ const transformed = await this.messageTransformer([m]);
91
+ this.messageQueue.push({
92
+ original: m,
93
+ llm: transformed[0], // undefined if filtered out
94
+ });
95
+ }
96
+ clearMessageQueue() {
97
+ this.messageQueue = [];
98
+ }
99
+ clearMessages() {
100
+ this._state.messages = [];
101
+ }
102
+ /**
103
+ * Remove all event listeners.
104
+ */
105
+ clearListeners() {
106
+ this.listeners.clear();
107
+ }
108
+ /**
109
+ * Remove a message by its ID.
110
+ * @returns true if the message was found and removed, false otherwise.
111
+ */
112
+ removeMessage(messageId) {
113
+ const index = this._state.messages.findIndex(m => m.id === messageId);
114
+ if (index === -1)
115
+ return false;
116
+ this._state.messages = [
117
+ ...this._state.messages.slice(0, index),
118
+ ...this._state.messages.slice(index + 1)
119
+ ];
120
+ return true;
121
+ }
122
+ /**
123
+ * Update a message by its ID using an updater function.
124
+ * @param messageId The ID of the message to update.
125
+ * @param updater A function that receives the current message and returns the updated message.
126
+ * @returns true if the message was found and updated, false otherwise.
127
+ */
128
+ updateMessage(messageId, updater) {
129
+ const index = this._state.messages.findIndex(m => m.id === messageId);
130
+ if (index === -1)
131
+ return false;
132
+ const updated = updater(this._state.messages[index]);
133
+ this._state.messages = [
134
+ ...this._state.messages.slice(0, index),
135
+ updated,
136
+ ...this._state.messages.slice(index + 1)
137
+ ];
138
+ return true;
139
+ }
140
+ abort() {
141
+ this.abortController?.abort();
142
+ }
143
+ /**
144
+ * Returns a promise that resolves when the current prompt completes.
145
+ * Returns immediately resolved promise if no prompt is running.
146
+ */
147
+ waitForIdle() {
148
+ return this.runningPrompt ?? Promise.resolve();
149
+ }
150
+ /**
151
+ * Clear all messages and state. Aborts any running prompt.
152
+ */
153
+ reset() {
154
+ // Abort any running prompt first
155
+ this.abortController?.abort();
156
+ this.abortController = undefined;
157
+ // Resolve and clear running promise
158
+ this.resolveRunningPrompt?.();
159
+ this.runningPrompt = undefined;
160
+ this.resolveRunningPrompt = undefined;
161
+ // Clear state
162
+ this._state.messages = [];
163
+ this._state.isStreaming = false;
164
+ this._state.pendingToolCalls = new Set();
165
+ this._state.error = undefined;
166
+ this.messageQueue = [];
167
+ }
168
+ /**
169
+ * Internal cleanup after agent loop completes (success, error, or abort).
170
+ * Always called in finally block to ensure consistent state.
171
+ */
172
+ _cleanup() {
173
+ this._state.isStreaming = false;
174
+ this._state.pendingToolCalls.clear();
175
+ this.abortController = undefined;
176
+ this.resolveRunningPrompt?.();
177
+ this.runningPrompt = undefined;
178
+ this.resolveRunningPrompt = undefined;
179
+ }
180
+ /**
181
+ * Append custom message to messages.
182
+ * Custom messages are inserted after running prompt resolves
183
+ */
184
+ async addCustomMessage(message) {
185
+ const messageId = generateUUID();
186
+ // emit message start event
187
+ const customMessage = {
188
+ role: 'custom',
189
+ id: messageId,
190
+ content: message,
191
+ timestamp: Date.now()
192
+ };
193
+ this.emit({ type: 'message_start', messageId, messageType: 'custom', message: customMessage });
194
+ this.emit({ type: 'message_update', messageId, messageType: 'custom', message: customMessage });
195
+ await this.waitForIdle();
196
+ this.appendMessage(customMessage);
197
+ this.emit({ type: 'message_end', messageId, messageType: 'custom', message: customMessage });
198
+ }
199
+ async prompt(input, attachments) {
200
+ // Race condition protection - prevent concurrent prompts
201
+ if (this._state.isStreaming) {
202
+ throw new Error("Cannot start a new prompt while another is running. Use waitForIdle() to wait for completion.");
203
+ }
204
+ const model = this._state.provider.model;
205
+ if (!model) {
206
+ throw new Error("No model configured");
207
+ }
208
+ const userMessage = buildUserMessage(input, attachments);
209
+ const newMessages = await this._runAgentLoop(userMessage);
210
+ return newMessages;
211
+ }
212
+ /**
213
+ * Continue from the current context without adding a new user message.
214
+ * Used for retry after overflow recovery when context already has user message or tool results.
215
+ */
216
+ async continue() {
217
+ // Race condition protection - prevent concurrent prompts
218
+ if (this._state.isStreaming) {
219
+ throw new Error("Cannot continue while another prompt is running. Use waitForIdle() to wait for completion.");
220
+ }
221
+ // Basic validation - detailed validation on transformed messages happens in _runAgentLoopContinue
222
+ if (this._state.messages.length === 0) {
223
+ throw new Error("No messages to continue from");
224
+ }
225
+ const newMessages = await this._runAgentLoopContinue();
226
+ return newMessages;
227
+ }
228
+ /**
229
+ * Prepare for running the agent loop.
230
+ * Returns the config, transformed messages, and abort signal.
231
+ */
232
+ async _prepareRun() {
233
+ const model = this._state.provider.model;
234
+ if (!model) {
235
+ throw new Error("No model configured");
236
+ }
237
+ this.runningPrompt = new Promise((resolve) => {
238
+ this.resolveRunningPrompt = resolve;
239
+ });
240
+ this.abortController = new AbortController();
241
+ const signal = this.abortController.signal;
242
+ this._state.isStreaming = true;
243
+ this._state.error = undefined;
244
+ const cfg = {
245
+ systemPrompt: this._state.systemPrompt,
246
+ tools: this._state.tools,
247
+ provider: this._state.provider,
248
+ getQueuedMessages: async () => {
249
+ if (this.queueMode === "one-at-a-time") {
250
+ if (this.messageQueue.length > 0) {
251
+ const first = this.messageQueue[0];
252
+ this.messageQueue = this.messageQueue.slice(1);
253
+ return [first];
254
+ }
255
+ return [];
256
+ }
257
+ else {
258
+ const queued = this.messageQueue.slice();
259
+ this.messageQueue = [];
260
+ return queued;
261
+ }
262
+ }
263
+ };
264
+ const llmMessages = await this.messageTransformer(this._state.messages);
265
+ return { llmMessages, cfg, signal };
266
+ }
267
+ /**
268
+ * Internal: Run the agent loop with a new user message.
269
+ */
270
+ async _runAgentLoop(userMessage) {
271
+ try {
272
+ const { llmMessages, cfg, signal } = await this._prepareRun();
273
+ const updatedMessages = [...llmMessages, userMessage];
274
+ this.emit({ type: 'agent_start' });
275
+ this.emit({ type: 'turn_start' });
276
+ this.emit({ type: 'message_start', messageId: userMessage.id, messageType: 'user', message: userMessage });
277
+ this.emit({ type: 'message_end', messageId: userMessage.id, messageType: 'user', message: userMessage });
278
+ this.appendMessage(userMessage);
279
+ const callbacks = this._createRunnerCallbacks();
280
+ const newMessages = await this.runner.run(cfg, updatedMessages, (e) => this.emit(e), signal, callbacks);
281
+ return newMessages;
282
+ }
283
+ catch (e) {
284
+ this._state.error = e instanceof Error ? e.message : String(e);
285
+ throw e;
286
+ }
287
+ finally {
288
+ this._cleanup();
289
+ }
290
+ }
291
+ async _runAgentLoopContinue() {
292
+ try {
293
+ const { llmMessages, cfg, signal } = await this._prepareRun();
294
+ // Validate that we can continue from this context
295
+ const lastMessage = llmMessages[llmMessages.length - 1];
296
+ if (!lastMessage) {
297
+ throw new Error("Cannot continue: no messages in context");
298
+ }
299
+ if (lastMessage.role !== "user" && lastMessage.role !== "toolResult") {
300
+ throw new Error(`Cannot continue from message role: ${lastMessage.role}. Expected 'user' or 'toolResult'.`);
301
+ }
302
+ this.emit({ type: 'agent_start' });
303
+ this.emit({ type: 'turn_start' });
304
+ const callbacks = this._createRunnerCallbacks();
305
+ const newMessages = await this.runner.run(cfg, [...llmMessages], (e) => this.emit(e), signal, callbacks);
306
+ return newMessages;
307
+ }
308
+ catch (e) {
309
+ this._state.error = e instanceof Error ? e.message : String(e);
310
+ throw e;
311
+ }
312
+ finally {
313
+ this._cleanup();
314
+ }
315
+ }
316
+ /**
317
+ * Create callbacks for AgentRunner to interact with Conversation state.
318
+ */
319
+ _createRunnerCallbacks() {
320
+ return {
321
+ appendMessage: (m) => this.appendMessage(m),
322
+ appendMessages: (ms) => this.appendMessages(ms),
323
+ addPendingToolCall: (id) => this._state.pendingToolCalls.add(id),
324
+ removePendingToolCall: (id) => this._state.pendingToolCalls.delete(id),
325
+ };
326
+ }
327
+ }
328
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/agent/conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Api, AssistantResponse, BaseAssistantMessage, Message, OptionsForApi, ToolResultMessage } from "../types.js";
2
+ import { AgentEvent, AgentLoopConfig, AgentTool } from "./types.js";
3
+ import { LLMClient } from "../llm.js";
4
+ /**
5
+ * AgentRunner interface - handles the execution logic of the agent loop.
6
+ * Stateless executor that can be tested independently from Conversation state management.
7
+ */
8
+ export interface AgentRunner {
9
+ run(config: AgentLoopConfig, initialMessages: Message[], emit: (event: AgentEvent) => void, signal: AbortSignal, callbacks: AgentRunnerCallbacks): Promise<Message[]>;
10
+ }
11
+ /**
12
+ * Callbacks for AgentRunner to interact with Conversation state.
13
+ * This decouples AgentRunner from direct state mutation.
14
+ */
15
+ export interface AgentRunnerCallbacks {
16
+ appendMessage: (message: Message) => void;
17
+ appendMessages: (messages: Message[]) => void;
18
+ addPendingToolCall: (toolCallId: string) => void;
19
+ removePendingToolCall: (toolCallId: string) => void;
20
+ }
21
+ export interface AgentRunnerOptions {
22
+ streamAssistantMessage?: boolean;
23
+ }
24
+ /**
25
+ * Default implementation of AgentRunner.
26
+ * Handles the main agent loop: calling LLM, processing responses, executing tools.
27
+ */
28
+ export declare class DefaultAgentRunner implements AgentRunner {
29
+ private client;
30
+ private streamAssistantMessage;
31
+ constructor(client: LLMClient, options?: AgentRunnerOptions);
32
+ run(config: AgentLoopConfig, initialMessages: Message[], emit: (event: AgentEvent) => void, signal: AbortSignal, callbacks: AgentRunnerCallbacks): Promise<Message[]>;
33
+ callAssistant<TApi extends Api>(config: AgentLoopConfig, messages: Message[], providerOptions: OptionsForApi<TApi>, signal: AbortSignal, emit: (event: AgentEvent) => void): Promise<BaseAssistantMessage<TApi>>;
34
+ executeToolCalls(tools: AgentTool[], assistantMessageContent: AssistantResponse, signal: AbortSignal, emit: (event: AgentEvent) => void, callbacks: AgentRunnerCallbacks): Promise<ToolResultMessage[]>;
35
+ private executeSingleTool;
36
+ }
37
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAqB,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzI,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAkC,MAAM,YAAY,CAAC;AACpG,OAAO,EAAkB,SAAS,EAAE,MAAM,WAAW,CAAC;AAKtD;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,GAAG,CACC,MAAM,EAAE,eAAe,EACvB,eAAe,EAAE,OAAO,EAAE,EAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACjC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,oBAAoB,GAChC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,cAAc,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAC9C,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,kBAAkB;IAC/B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IAI9C,OAAO,CAAC,MAAM;IAHlB,OAAO,CAAC,sBAAsB,CAAU;gBAG5B,MAAM,EAAE,SAAS,EACzB,OAAO,GAAE,kBAAuB;IAK9B,GAAG,CACL,MAAM,EAAE,eAAe,EACvB,eAAe,EAAE,OAAO,EAAE,EAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACjC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,oBAAoB,GAChC,OAAO,CAAC,OAAO,EAAE,CAAC;IA6Ef,aAAa,CAAC,IAAI,SAAS,GAAG,EAChC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,OAAO,EAAE,EACnB,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,EACpC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAClC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAyChC,gBAAgB,CAClB,KAAK,EAAE,SAAS,EAAE,EAClB,uBAAuB,EAAE,iBAAiB,EAC1C,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACjC,SAAS,EAAE,oBAAoB,GAChC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAqDjB,iBAAiB;CAuClC"}
@@ -0,0 +1,169 @@
1
+ import { getMockMessage } from "../llm.js";
2
+ import { generateUUID } from "../utils/uuid.js";
3
+ import { validateToolArguments } from "../utils/validation.js";
4
+ import { buildToolResultMessage } from "./utils.js";
5
+ /**
6
+ * Default implementation of AgentRunner.
7
+ * Handles the main agent loop: calling LLM, processing responses, executing tools.
8
+ */
9
+ export class DefaultAgentRunner {
10
+ constructor(client, options = {}) {
11
+ this.client = client;
12
+ this.streamAssistantMessage = options.streamAssistantMessage ?? true;
13
+ }
14
+ async run(config, initialMessages, emit, signal, callbacks) {
15
+ const newMessages = [];
16
+ const updatedMessages = [...initialMessages];
17
+ const providerOptions = { ...config.provider.providerOptions, signal };
18
+ let hasMoreToolCalls = true;
19
+ let firstTurn = true;
20
+ let queuedMessages = (await config.getQueuedMessages()) || [];
21
+ while (hasMoreToolCalls || queuedMessages.length > 0) {
22
+ if (!firstTurn) {
23
+ emit({ type: 'turn_start' });
24
+ }
25
+ else {
26
+ firstTurn = false;
27
+ }
28
+ // Process queued messages first (inject before next assistant response)
29
+ if (queuedMessages.length > 0) {
30
+ for (const { llm } of queuedMessages) {
31
+ if (llm) {
32
+ emit({ type: 'message_start', messageId: llm.id, messageType: llm.role, message: llm });
33
+ emit({ type: 'message_end', messageId: llm.id, messageType: llm.role, message: llm });
34
+ updatedMessages.push(llm);
35
+ newMessages.push(llm);
36
+ callbacks.appendMessage(llm);
37
+ }
38
+ }
39
+ queuedMessages = [];
40
+ }
41
+ const assistantMessage = await this.callAssistant(config, updatedMessages, providerOptions, signal, emit);
42
+ newMessages.push(assistantMessage);
43
+ callbacks.appendMessage(assistantMessage);
44
+ updatedMessages.push(assistantMessage);
45
+ const stopReason = assistantMessage.stopReason;
46
+ if (stopReason === 'aborted' || stopReason === 'error') {
47
+ emit({ type: "turn_end" });
48
+ emit({ type: "agent_end", agentMessages: newMessages });
49
+ return newMessages;
50
+ }
51
+ const assistantMessageContent = assistantMessage.content;
52
+ // Check for tool calls
53
+ const toolCalls = assistantMessageContent.filter((c) => c.type === "toolCall");
54
+ hasMoreToolCalls = toolCalls.length > 0;
55
+ if (hasMoreToolCalls) {
56
+ const toolResults = await this.executeToolCalls(config.tools, assistantMessageContent, signal, emit, callbacks);
57
+ updatedMessages.push(...toolResults);
58
+ newMessages.push(...toolResults);
59
+ callbacks.appendMessages(toolResults);
60
+ }
61
+ emit({ type: 'turn_end' });
62
+ // Get queued messages after turn completes
63
+ queuedMessages = (await config.getQueuedMessages()) || [];
64
+ }
65
+ emit({ type: 'agent_end', agentMessages: newMessages });
66
+ return newMessages;
67
+ }
68
+ async callAssistant(config, messages, providerOptions, signal, emit) {
69
+ const assistantMessageId = generateUUID();
70
+ const initialMessage = getMockMessage(config.provider.model);
71
+ emit({ type: 'message_start', messageId: assistantMessageId, messageType: 'assistant', message: initialMessage });
72
+ if (this.streamAssistantMessage) {
73
+ const assistantStream = this.client.stream(config.provider.model, {
74
+ messages,
75
+ systemPrompt: config.systemPrompt,
76
+ tools: config.tools
77
+ }, providerOptions, assistantMessageId);
78
+ for await (const ev of assistantStream) {
79
+ emit({ type: 'message_update', messageId: assistantMessageId, messageType: 'assistant', message: ev });
80
+ }
81
+ const assistantMessage = await assistantStream.result();
82
+ emit({ type: 'message_end', messageId: assistantMessageId, messageType: 'assistant', message: assistantMessage });
83
+ return assistantMessage;
84
+ }
85
+ else {
86
+ const assistantMessage = await this.client.complete(config.provider.model, {
87
+ messages,
88
+ systemPrompt: config.systemPrompt,
89
+ tools: config.tools
90
+ }, providerOptions, assistantMessageId);
91
+ emit({ type: 'message_end', messageId: assistantMessageId, messageType: 'assistant', message: assistantMessage });
92
+ return assistantMessage;
93
+ }
94
+ }
95
+ async executeToolCalls(tools, assistantMessageContent, signal, emit, callbacks) {
96
+ const toolCalls = assistantMessageContent.filter((c) => c.type === "toolCall");
97
+ const results = [];
98
+ for (const toolCall of toolCalls) {
99
+ if (signal.aborted)
100
+ break;
101
+ const tool = tools.find((t) => t.name === toolCall.name);
102
+ // Track pending and emit start
103
+ callbacks.addPendingToolCall(toolCall.toolCallId);
104
+ emit({
105
+ type: 'tool_execution_start',
106
+ toolCallId: toolCall.toolCallId,
107
+ toolName: toolCall.name,
108
+ args: toolCall.arguments
109
+ });
110
+ // Execute the tool
111
+ const { result, isError, errorDetails } = await this.executeSingleTool(tool, toolCall, signal, (partialResult) => emit({
112
+ type: 'tool_execution_update',
113
+ toolCallId: toolCall.toolCallId,
114
+ toolName: toolCall.name,
115
+ args: toolCall.arguments,
116
+ partialResult
117
+ }));
118
+ // Cleanup and emit end
119
+ callbacks.removePendingToolCall(toolCall.toolCallId);
120
+ emit({
121
+ type: 'tool_execution_end',
122
+ toolCallId: toolCall.toolCallId,
123
+ toolName: toolCall.name,
124
+ result,
125
+ isError
126
+ });
127
+ // Build and emit message
128
+ const toolResultMessage = buildToolResultMessage(toolCall, result, isError, errorDetails);
129
+ results.push(toolResultMessage);
130
+ emit({ type: 'message_start', messageId: toolResultMessage.id, messageType: 'toolResult', message: toolResultMessage });
131
+ emit({ type: 'message_end', messageId: toolResultMessage.id, messageType: 'toolResult', message: toolResultMessage });
132
+ }
133
+ return results;
134
+ }
135
+ async executeSingleTool(tool, toolCall, signal, onUpdate) {
136
+ if (!tool) {
137
+ return {
138
+ result: {
139
+ content: [{ type: 'text', content: `Tool ${toolCall.name} not found` }],
140
+ details: {}
141
+ },
142
+ isError: true,
143
+ errorDetails: {
144
+ message: `Tool ${toolCall.name} not found`,
145
+ name: 'ToolNotFoundError'
146
+ }
147
+ };
148
+ }
149
+ try {
150
+ const validatedArgs = validateToolArguments(tool, toolCall);
151
+ const result = await tool.execute(toolCall.toolCallId, validatedArgs, signal, onUpdate);
152
+ return { result, isError: false };
153
+ }
154
+ catch (e) {
155
+ const message = e instanceof Error ? e.message : String(e);
156
+ return {
157
+ result: {
158
+ content: [{ type: 'text', content: message }],
159
+ details: {}
160
+ },
161
+ isError: true,
162
+ errorDetails: e instanceof Error
163
+ ? { message: e.message, name: e.name, stack: e.stack }
164
+ : undefined
165
+ };
166
+ }
167
+ }
168
+ }
169
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AgentTool, AgentToolResult } from "../../agent/types.js";
2
+ export interface CalculateResult extends AgentToolResult<undefined> {
3
+ content: Array<{
4
+ type: "text";
5
+ content: string;
6
+ }>;
7
+ details: undefined;
8
+ }
9
+ export declare function calculate(expression: string): CalculateResult;
10
+ declare const calculateSchema: import("@sinclair/typebox").TObject<{
11
+ expression: import("@sinclair/typebox").TString;
12
+ }>;
13
+ export declare const calculateTool: AgentTool<typeof calculateSchema, undefined>;
14
+ export {};
15
+ //# sourceMappingURL=calculate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate.d.ts","sourceRoot":"","sources":["../../../src/agent/tools/calculate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,WAAW,eAAgB,SAAQ,eAAe,CAAC,SAAS,CAAC;IAClE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAO7D;AAED,QAAA,MAAM,eAAe;;EAEnB,CAAC;AAIH,eAAO,MAAM,aAAa,EAAE,SAAS,CAAC,OAAO,eAAe,EAAE,SAAS,CAQtE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ export function calculate(expression) {
3
+ try {
4
+ const result = new Function("return " + expression)();
5
+ return { content: [{ type: "text", content: `${expression} = ${result}` }], details: undefined };
6
+ }
7
+ catch (e) {
8
+ throw new Error(e.message || String(e));
9
+ }
10
+ }
11
+ const calculateSchema = Type.Object({
12
+ expression: Type.String({ description: "The mathematical expression to evaluate" }),
13
+ });
14
+ export const calculateTool = {
15
+ label: "Calculator",
16
+ name: "calculate",
17
+ description: "Evaluate mathematical expressions",
18
+ parameters: calculateSchema,
19
+ execute: async (_toolCallId, args) => {
20
+ return calculate(args.expression);
21
+ },
22
+ };
23
+ //# sourceMappingURL=calculate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate.js","sourceRoot":"","sources":["../../../src/agent/tools/calculate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQtD,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC3C,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAClG,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;AACF,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;CACnF,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,aAAa,GAAiD;IAC1E,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,mCAAmC;IAChD,UAAU,EAAE,eAAe;IAC3B,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,IAAqB,EAAE,EAAE;QAC7D,OAAO,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;CACD,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { AgentTool } from "../../agent/types.js";
2
+ import type { AgentToolResult } from "../types.js";
3
+ export interface GetCurrentTimeResult extends AgentToolResult<{
4
+ utcTimestamp: number;
5
+ }> {
6
+ }
7
+ export declare function getCurrentTime(timezone?: string): Promise<GetCurrentTimeResult>;
8
+ declare const getCurrentTimeSchema: import("@sinclair/typebox").TObject<{
9
+ timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ }>;
11
+ export declare const getCurrentTimeTool: AgentTool<typeof getCurrentTimeSchema, {
12
+ utcTimestamp: number;
13
+ }>;
14
+ export {};
15
+ //# sourceMappingURL=get-current-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-time.d.ts","sourceRoot":"","sources":["../../../src/agent/tools/get-current-time.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,oBAAqB,SAAQ,eAAe,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;CAAI;AAE3F,wBAAsB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAsBrF;AAED,QAAA,MAAM,oBAAoB;;EAIxB,CAAC;AAIH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,OAAO,oBAAoB,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAQ/F,CAAC"}