@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.
- package/LICENSE +21 -0
- package/README.md +93 -383
- package/dist/agent/conversation.d.ts +97 -0
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js +328 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/runner.d.ts +37 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +169 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/tools/calculate.d.ts +15 -0
- package/dist/agent/tools/calculate.d.ts.map +1 -0
- package/dist/agent/tools/calculate.js +23 -0
- package/dist/agent/tools/calculate.js.map +1 -0
- package/dist/agent/tools/get-current-time.d.ts +15 -0
- package/dist/agent/tools/get-current-time.d.ts.map +1 -0
- package/dist/agent/tools/get-current-time.js +38 -0
- package/dist/agent/tools/get-current-time.js.map +1 -0
- package/dist/agent/tools/index.d.ts +3 -0
- package/dist/agent/tools/index.d.ts.map +1 -0
- package/dist/agent/tools/index.js +3 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/types.d.ts +53 -31
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +1 -2
- package/dist/agent/utils.d.ts +14 -0
- package/dist/agent/utils.d.ts.map +1 -0
- package/dist/agent/utils.js +59 -0
- package/dist/agent/utils.js.map +1 -0
- package/dist/index.d.ts +16 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -28
- package/dist/index.js.map +1 -1
- package/dist/llm.d.ts +15 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +92 -0
- package/dist/llm.js.map +1 -0
- package/dist/models.d.ts +8 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +25 -112
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +72 -227
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +30 -32
- package/dist/models.js.map +1 -1
- package/dist/providers/google/complete.d.ts +3 -0
- package/dist/providers/google/complete.d.ts.map +1 -0
- package/dist/providers/google/complete.js +53 -0
- package/dist/providers/google/complete.js.map +1 -0
- package/dist/providers/google/index.d.ts +6 -0
- package/dist/providers/google/index.d.ts.map +1 -0
- package/dist/providers/google/index.js +6 -0
- package/dist/providers/google/index.js.map +1 -0
- package/dist/providers/google/stream.d.ts +3 -0
- package/dist/providers/google/stream.d.ts.map +1 -0
- package/dist/providers/{google.js → google/stream.js} +67 -231
- package/dist/providers/google/stream.js.map +1 -0
- package/dist/providers/google/types.d.ts +8 -0
- package/dist/providers/google/types.d.ts.map +1 -0
- package/dist/providers/google/types.js +2 -0
- package/dist/providers/google/types.js.map +1 -0
- package/dist/providers/google/utils.d.ts +30 -0
- package/dist/providers/google/utils.d.ts.map +1 -0
- package/dist/providers/google/utils.js +354 -0
- package/dist/providers/google/utils.js.map +1 -0
- package/dist/providers/openai/complete.d.ts +3 -0
- package/dist/providers/openai/complete.d.ts.map +1 -0
- package/dist/providers/openai/complete.js +57 -0
- package/dist/providers/openai/complete.js.map +1 -0
- package/dist/providers/openai/index.d.ts +4 -0
- package/dist/providers/openai/index.d.ts.map +1 -0
- package/dist/providers/openai/index.js +4 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/stream.d.ts +3 -0
- package/dist/providers/openai/stream.d.ts.map +1 -0
- package/dist/providers/{openai.js → openai/stream.js} +74 -152
- package/dist/providers/openai/stream.js.map +1 -0
- package/dist/providers/openai/types.d.ts +8 -0
- package/dist/providers/openai/types.d.ts.map +1 -0
- package/dist/providers/openai/types.js +2 -0
- package/dist/providers/openai/types.js.map +1 -0
- package/dist/providers/openai/utils.d.ts +13 -0
- package/dist/providers/openai/utils.d.ts.map +1 -0
- package/dist/providers/openai/utils.js +285 -0
- package/dist/providers/openai/utils.js.map +1 -0
- package/dist/types.d.ts +95 -87
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -9
- package/dist/types.js.map +1 -1
- package/dist/utils/event-stream.d.ts +2 -2
- package/dist/utils/event-stream.d.ts.map +1 -1
- package/dist/utils/event-stream.js +2 -7
- package/dist/utils/event-stream.js.map +1 -1
- package/dist/utils/json-parse.js +3 -6
- package/dist/utils/json-parse.js.map +1 -1
- package/dist/utils/overflow.d.ts +51 -0
- package/dist/utils/overflow.d.ts.map +1 -0
- package/dist/utils/overflow.js +106 -0
- package/dist/utils/overflow.js.map +1 -0
- package/dist/utils/sanitize-unicode.js +1 -4
- package/dist/utils/sanitize-unicode.js.map +1 -1
- package/dist/utils/uuid.d.ts +6 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +9 -0
- package/dist/utils/uuid.js.map +1 -0
- package/dist/utils/validation.d.ts +10 -3
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +20 -12
- package/dist/utils/validation.js.map +1 -1
- package/package.json +45 -8
- package/biome.json +0 -43
- package/dist/agent/agent-loop.d.ts +0 -5
- package/dist/agent/agent-loop.d.ts.map +0 -1
- package/dist/agent/agent-loop.js +0 -219
- package/dist/agent/agent-loop.js.map +0 -1
- package/dist/providers/convert.d.ts +0 -6
- package/dist/providers/convert.d.ts.map +0 -1
- package/dist/providers/convert.js +0 -207
- package/dist/providers/convert.js.map +0 -1
- package/dist/providers/google.d.ts +0 -26
- package/dist/providers/google.d.ts.map +0 -1
- package/dist/providers/google.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -17
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js.map +0 -1
- package/dist/stream.d.ts +0 -4
- package/dist/stream.d.ts.map +0 -1
- package/dist/stream.js +0 -40
- package/dist/stream.js.map +0 -1
- package/dist/test-google-agent-loop.d.ts +0 -2
- package/dist/test-google-agent-loop.d.ts.map +0 -1
- package/dist/test-google-agent-loop.js +0 -186
- package/dist/test-google-agent-loop.js.map +0 -1
- package/dist/test-google.d.ts +0 -2
- package/dist/test-google.d.ts.map +0 -1
- package/dist/test-google.js +0 -41
- package/dist/test-google.js.map +0 -1
- package/src/agent/agent-loop.ts +0 -275
- package/src/agent/types.ts +0 -80
- package/src/index.ts +0 -72
- package/src/models.generated.ts +0 -314
- package/src/models.ts +0 -45
- package/src/providers/convert.ts +0 -222
- package/src/providers/google.ts +0 -496
- package/src/providers/openai.ts +0 -437
- package/src/stream.ts +0 -60
- package/src/types.ts +0 -198
- package/src/utils/event-stream.ts +0 -60
- package/src/utils/json-parse.ts +0 -28
- package/src/utils/sanitize-unicode.ts +0 -25
- package/src/utils/validation.ts +0 -69
- package/test/core/agent-loop.test.ts +0 -958
- package/test/core/stream.test.ts +0 -409
- package/test/data/red-circle.png +0 -0
- package/test/data/superintelligentwill.pdf +0 -0
- package/test/edge-cases/general.test.ts +0 -565
- package/test/integration/e2e.test.ts +0 -530
- package/test/models/cost.test.ts +0 -499
- package/test/models/registry.test.ts +0 -298
- package/test/providers/convert.test.ts +0 -846
- package/test/providers/google-schema.test.ts +0 -666
- package/test/providers/google-stream.test.ts +0 -369
- package/test/providers/openai-stream.test.ts +0 -251
- package/test/utils/event-stream.test.ts +0 -289
- package/test/utils/json-parse.test.ts +0 -344
- package/test/utils/sanitize-unicode.test.ts +0 -329
- package/test/utils/validation.test.ts +0 -614
- package/tsconfig.json +0 -21
- 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAa,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAqC,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAcpF,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;AAClE,IAAI,CAAC,YAAY,EAAE,CAAC;IACnB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,eAAe,GAAuB;IAC3C,KAAK,EAAE,YAAY;IACnB,eAAe,EAAE,EAAE;CACnB,CAAA;AAED,MAAM,wBAAwB,GAAe;IAC5C,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,IAAI,GAAG,EAAU;IACnC,KAAK,EAAE,SAAS;CAChB,CAAA;AAED,MAAM,yBAAyB,GAAG,CAAC,QAAmB,EAAE,EAAE;IACzD,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,oDAAoD;AAC9E,CAAC,CAAA;AAED,MAAM,OAAO,YAAY;IAaxB,YAAY,OAAqB,EAAE;QAV3B,WAAM,GAAe,wBAAwB,CAAC;QAC9C,cAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;QAG/C,iBAAY,GAAkC,EAAE,CAAC;QAIjD,2BAAsB,GAAY,IAAI,CAAC;QAG9C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;QAC1H,iFAAiF;QACjF,IAAI,CAAC,MAAM,GAAG;YACb,GAAG,wBAAwB;YAC3B,GAAG,YAAY;YACf,4DAA4D;YAC5D,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACjE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YACxD,gBAAgB,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,gBAAgB,IAAI,EAAE,CAAC;SAC9D,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,yBAAyB,CAAC;QAC/E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,eAAe,CAAC;IACpD,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,EAA2B;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAEO,IAAI,CAAC,CAAa;QACzB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACb,CAAC;IACF,CAAC;IAED,yBAAyB,CAAC,MAAe;QACxC,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC;QACrC,iDAAiD;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,iEAAiE;IACjE,eAAe,CAAC,CAAS;QACxB,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAmB,QAAwB;QACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,IAA6B;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,YAAY;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,CAA2B;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,eAAe,CAAC,EAAa;QAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,aAAa,CAAC,CAAU;QACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,cAAc,CAAC,EAAa;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,CAAU;QAC5B,4DAA4D;QAC5D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACtB,QAAQ,EAAE,CAAC;YACX,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,4BAA4B;SACjD,CAAC,CAAC;IACJ,CAAC;IAED,iBAAiB;QAChB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,aAAa;QACZ,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,cAAc;QACb,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,SAAiB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG;YACtB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YACvC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SACxC,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,SAAiB,EAAE,OAAsC;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG;YACtB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YACvC,OAAO;YACP,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SACxC,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW;QACV,OAAO,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,iCAAiC;QACjC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,oCAAoC;QACpC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;QAEtC,cAAc;QACd,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACK,QAAQ;QACf,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAA4B;QAClD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,2BAA2B;QAC3B,MAAM,aAAa,GAAkB;YACpC,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QAChG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,WAA0B;QACrD,yDAAyD;QACzD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACb,yDAAyD;QACzD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAC/G,CAAC;QAED,kGAAkG;QAClG,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACvD,OAAO,WAAW,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,WAAW;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;QAE9B,MAAM,GAAG,GAAoB;YAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,iBAAiB,EAAE,KAAK,IAAO,EAAE;gBAChC,IAAI,IAAI,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;oBACxC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;wBACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC/C,OAAO,CAAC,KAAK,CAAuB,CAAC;oBACtC,CAAC;oBACD,OAAO,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACP,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;oBACzC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;oBACvB,OAAO,MAA4B,CAAC;gBACrC,CAAC;YACF,CAAC;SACD,CAAA;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,WAAoB;QAC/C,IAAI,CAAC;YACJ,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9D,MAAM,eAAe,GAAG,CAAC,GAAG,WAAW,EAAE,WAAW,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3G,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YACzG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACxG,OAAO,WAAW,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,CAAC;QACT,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,qBAAqB;QAClC,IAAI,CAAC;YACJ,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAE9D,kDAAkD;YAClD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,sCAAsC,WAAW,CAAC,IAAI,oCAAoC,CAAC,CAAC;YAC7G,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAElC,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACzG,OAAO,WAAW,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,CAAC;QACT,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjB,CAAC;IACF,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC7B,OAAO;YACN,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAC3C,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/C,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,qBAAqB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;SACtE,CAAC;IACH,CAAC;CACD"}
|
|
@@ -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"}
|