typed-agents 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +201 -0
  3. package/dist/agents/agent.decorator.d.ts +19 -0
  4. package/dist/agents/agent.decorator.d.ts.map +1 -0
  5. package/dist/agents/agent.decorator.js +38 -0
  6. package/dist/agents/agent.decorator.js.map +1 -0
  7. package/dist/agents/agent.runtime.d.ts +133 -0
  8. package/dist/agents/agent.runtime.d.ts.map +1 -0
  9. package/dist/agents/agent.runtime.js +593 -0
  10. package/dist/agents/agent.runtime.js.map +1 -0
  11. package/dist/agents/agent.types.d.ts +245 -0
  12. package/dist/agents/agent.types.d.ts.map +1 -0
  13. package/dist/agents/agent.types.js +27 -0
  14. package/dist/agents/agent.types.js.map +1 -0
  15. package/dist/agents/behavior-engine/behavior.types.d.ts +23 -0
  16. package/dist/agents/behavior-engine/behavior.types.d.ts.map +1 -0
  17. package/dist/agents/behavior-engine/behavior.types.js +3 -0
  18. package/dist/agents/behavior-engine/behavior.types.js.map +1 -0
  19. package/dist/agents/behavior-engine/build-system-prompt.d.ts +12 -0
  20. package/dist/agents/behavior-engine/build-system-prompt.d.ts.map +1 -0
  21. package/dist/agents/behavior-engine/build-system-prompt.js +29 -0
  22. package/dist/agents/behavior-engine/build-system-prompt.js.map +1 -0
  23. package/dist/agents/behavior-engine/index.d.ts +7 -0
  24. package/dist/agents/behavior-engine/index.d.ts.map +1 -0
  25. package/dist/agents/behavior-engine/index.js +23 -0
  26. package/dist/agents/behavior-engine/index.js.map +1 -0
  27. package/dist/agents/behavior-engine/load-behavior.d.ts +16 -0
  28. package/dist/agents/behavior-engine/load-behavior.d.ts.map +1 -0
  29. package/dist/agents/behavior-engine/load-behavior.js +36 -0
  30. package/dist/agents/behavior-engine/load-behavior.js.map +1 -0
  31. package/dist/agents/behavior-engine/merge-behavior.d.ts +12 -0
  32. package/dist/agents/behavior-engine/merge-behavior.d.ts.map +1 -0
  33. package/dist/agents/behavior-engine/merge-behavior.js +33 -0
  34. package/dist/agents/behavior-engine/merge-behavior.js.map +1 -0
  35. package/dist/agents/behavior-engine/parse-behavior.d.ts +10 -0
  36. package/dist/agents/behavior-engine/parse-behavior.d.ts.map +1 -0
  37. package/dist/agents/behavior-engine/parse-behavior.js +66 -0
  38. package/dist/agents/behavior-engine/parse-behavior.js.map +1 -0
  39. package/dist/agents/behavior-engine/watch-behavior.d.ts +10 -0
  40. package/dist/agents/behavior-engine/watch-behavior.d.ts.map +1 -0
  41. package/dist/agents/behavior-engine/watch-behavior.js +34 -0
  42. package/dist/agents/behavior-engine/watch-behavior.js.map +1 -0
  43. package/dist/agents/compose.d.ts +41 -0
  44. package/dist/agents/compose.d.ts.map +1 -0
  45. package/dist/agents/compose.js +29 -0
  46. package/dist/agents/compose.js.map +1 -0
  47. package/dist/agents/index.d.ts +7 -0
  48. package/dist/agents/index.d.ts.map +1 -0
  49. package/dist/agents/index.js +25 -0
  50. package/dist/agents/index.js.map +1 -0
  51. package/dist/agents/runtime-engine/build-tool-map.d.ts +16 -0
  52. package/dist/agents/runtime-engine/build-tool-map.d.ts.map +1 -0
  53. package/dist/agents/runtime-engine/build-tool-map.js +88 -0
  54. package/dist/agents/runtime-engine/build-tool-map.js.map +1 -0
  55. package/dist/agents/runtime-engine/convert-zod-to-tool-schema.d.ts +13 -0
  56. package/dist/agents/runtime-engine/convert-zod-to-tool-schema.d.ts.map +1 -0
  57. package/dist/agents/runtime-engine/convert-zod-to-tool-schema.js +26 -0
  58. package/dist/agents/runtime-engine/convert-zod-to-tool-schema.js.map +1 -0
  59. package/dist/agents/runtime-engine/execute-tool.d.ts +19 -0
  60. package/dist/agents/runtime-engine/execute-tool.d.ts.map +1 -0
  61. package/dist/agents/runtime-engine/execute-tool.js +100 -0
  62. package/dist/agents/runtime-engine/execute-tool.js.map +1 -0
  63. package/dist/agents/runtime-engine/index.d.ts +7 -0
  64. package/dist/agents/runtime-engine/index.d.ts.map +1 -0
  65. package/dist/agents/runtime-engine/index.js +23 -0
  66. package/dist/agents/runtime-engine/index.js.map +1 -0
  67. package/dist/agents/runtime-engine/parse-tool-arguments.d.ts +12 -0
  68. package/dist/agents/runtime-engine/parse-tool-arguments.d.ts.map +1 -0
  69. package/dist/agents/runtime-engine/parse-tool-arguments.js +42 -0
  70. package/dist/agents/runtime-engine/parse-tool-arguments.js.map +1 -0
  71. package/dist/agents/runtime-engine/retry.utils.d.ts +26 -0
  72. package/dist/agents/runtime-engine/retry.utils.d.ts.map +1 -0
  73. package/dist/agents/runtime-engine/retry.utils.js +55 -0
  74. package/dist/agents/runtime-engine/retry.utils.js.map +1 -0
  75. package/dist/agents/runtime-engine/state-persistence.d.ts +56 -0
  76. package/dist/agents/runtime-engine/state-persistence.d.ts.map +1 -0
  77. package/dist/agents/runtime-engine/state-persistence.js +70 -0
  78. package/dist/agents/runtime-engine/state-persistence.js.map +1 -0
  79. package/dist/clients/index.d.ts +3 -0
  80. package/dist/clients/index.d.ts.map +1 -0
  81. package/dist/clients/index.js +19 -0
  82. package/dist/clients/index.js.map +1 -0
  83. package/dist/clients/llm.client.d.ts +48 -0
  84. package/dist/clients/llm.client.d.ts.map +1 -0
  85. package/dist/clients/llm.client.js +3 -0
  86. package/dist/clients/llm.client.js.map +1 -0
  87. package/dist/clients/ollama.client.d.ts +20 -0
  88. package/dist/clients/ollama.client.d.ts.map +1 -0
  89. package/dist/clients/ollama.client.js +85 -0
  90. package/dist/clients/ollama.client.js.map +1 -0
  91. package/dist/core/logger/index.d.ts +2 -0
  92. package/dist/core/logger/index.d.ts.map +1 -0
  93. package/dist/core/logger/index.js +18 -0
  94. package/dist/core/logger/index.js.map +1 -0
  95. package/dist/core/logger/logger.d.ts +7 -0
  96. package/dist/core/logger/logger.d.ts.map +1 -0
  97. package/dist/core/logger/logger.js +19 -0
  98. package/dist/core/logger/logger.js.map +1 -0
  99. package/dist/index.d.ts +6 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +22 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/runtime/agent.runner.d.ts +29 -0
  104. package/dist/runtime/agent.runner.d.ts.map +1 -0
  105. package/dist/runtime/agent.runner.js +39 -0
  106. package/dist/runtime/agent.runner.js.map +1 -0
  107. package/dist/runtime/index.d.ts +2 -0
  108. package/dist/runtime/index.d.ts.map +1 -0
  109. package/dist/runtime/index.js +18 -0
  110. package/dist/runtime/index.js.map +1 -0
  111. package/dist/tools/index.d.ts +4 -0
  112. package/dist/tools/index.d.ts.map +1 -0
  113. package/dist/tools/index.js +20 -0
  114. package/dist/tools/index.js.map +1 -0
  115. package/dist/tools/registry.d.ts +128 -0
  116. package/dist/tools/registry.d.ts.map +1 -0
  117. package/dist/tools/registry.js +140 -0
  118. package/dist/tools/registry.js.map +1 -0
  119. package/dist/tools/tool.decorator.d.ts +71 -0
  120. package/dist/tools/tool.decorator.d.ts.map +1 -0
  121. package/dist/tools/tool.decorator.js +98 -0
  122. package/dist/tools/tool.decorator.js.map +1 -0
  123. package/dist/tools/tool.types.d.ts +231 -0
  124. package/dist/tools/tool.types.d.ts.map +1 -0
  125. package/dist/tools/tool.types.js +3 -0
  126. package/dist/tools/tool.types.js.map +1 -0
  127. package/package.json +45 -0
@@ -0,0 +1,593 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AgentRuntime = void 0;
7
+ const agent_decorator_1 = require("./agent.decorator");
8
+ const build_tool_map_1 = require("./runtime-engine/build-tool-map");
9
+ const execute_tool_1 = require("./runtime-engine/execute-tool");
10
+ const logger_1 = require("../core/logger/logger");
11
+ const events_1 = require("events");
12
+ const ollama_client_1 = require("../clients/ollama.client");
13
+ const build_system_prompt_1 = require("./behavior-engine/build-system-prompt");
14
+ const load_behavior_1 = require("./behavior-engine/load-behavior");
15
+ const retry_utils_1 = require("./runtime-engine/retry.utils");
16
+ const crypto_1 = require("crypto");
17
+ const state_persistence_1 = require("./runtime-engine/state-persistence");
18
+ const path_1 = __importDefault(require("path"));
19
+ const fs_1 = __importDefault(require("fs"));
20
+ // ─────────────────────────────────────────────────────────────
21
+ // P4 — Planning / Reflection prompts
22
+ // ─────────────────────────────────────────────────────────────
23
+ /**
24
+ * Prompt used to instruct the LLM to generate a concise step-by-step plan before execution.
25
+ * This is injected as a user message in planning mode.
26
+ */
27
+ const PLANNING_PROMPT = "Before executing, write a concise step-by-step plan (max 5 steps) in this format:\n" +
28
+ "<plan>\n1. ...\n2. ...\n</plan>\n" +
29
+ "Do not execute yet — just plan.";
30
+ /**
31
+ * Prompt used to trigger self-reflection after each tool call in "reflect" planning mode.
32
+ * Encourages the LLM to assess and potentially adjust its approach.
33
+ */
34
+ const REFLECTION_PROMPT = "Reflect briefly (1-2 sentences): is your current approach optimal, " +
35
+ "or should you adjust your next step?";
36
+ /**
37
+ * Core runtime engine for executing agent classes decorated with `@agent()`.
38
+ *
39
+ * Manages the full agent lifecycle: initialization, ReAct loop, tool execution,
40
+ * persistence, planning/reflection, and event emission. Supports both buffered
41
+ * and streaming execution modes.
42
+ */
43
+ class AgentRuntime {
44
+ showLogs;
45
+ emitter = new events_1.EventEmitter();
46
+ subAgentCache = new Map();
47
+ persister;
48
+ cacheDir = null;
49
+ /**
50
+ * Creates a new AgentRuntime instance with optional persistence configuration.
51
+ *
52
+ * @param showLogs - Whether to enable console logging for events and operations.
53
+ * @param persistConfig - Configuration for state persistence (none, memory, or file).
54
+ */
55
+ constructor(showLogs, persistConfig = { mode: "none" }) {
56
+ this.showLogs = showLogs;
57
+ // P1: NullPersister eliminates the inline anonymous object { save: async()=>{} ... }
58
+ if (persistConfig.mode === "memory") {
59
+ this.persister = new state_persistence_1.MemoryPersister();
60
+ }
61
+ else if (persistConfig.mode === "file") {
62
+ const dir = persistConfig.dir ?? "./.agent-runs";
63
+ this.persister = new state_persistence_1.FilePersister(dir);
64
+ this.cacheDir = dir;
65
+ }
66
+ else {
67
+ this.persister = new state_persistence_1.NullPersister();
68
+ }
69
+ }
70
+ /**
71
+ * Clears the internal cache of sub-agent results.
72
+ * Useful for resetting state between runs or when tools change.
73
+ */
74
+ clearSubAgentCache() {
75
+ this.subAgentCache.clear();
76
+ if (this.showLogs)
77
+ logger_1.Logger.info("Sub-agent cache cleared");
78
+ }
79
+ /**
80
+ * Registers an event handler for a specific agent event type.
81
+ *
82
+ * @param event - The event type to listen for (e.g., "agent:start", "tool:call").
83
+ * @param handler - Callback function invoked when the event is emitted.
84
+ */
85
+ on(event, handler) {
86
+ this.emitter.on(event, handler);
87
+ }
88
+ /**
89
+ * Emits an agent event to all registered listeners and optionally logs it.
90
+ *
91
+ * @param event - The event object to emit.
92
+ */
93
+ emit(event) {
94
+ this.emitter.emit(event.type, event);
95
+ if (this.showLogs) {
96
+ logger_1.Logger[event.log.level](`[${event.type}] ${event.log.message}`, event);
97
+ }
98
+ }
99
+ /**
100
+ * Saves the current agent state to the configured persister.
101
+ *
102
+ * @param runId - Unique identifier for the run.
103
+ * @param context - Current agent context to serialize.
104
+ * @param isFinished - Whether the run is complete.
105
+ */
106
+ async saveState(runId, context, isFinished = false) {
107
+ const serialized = {
108
+ runId,
109
+ agentName: context.agentName,
110
+ messages: context.messages,
111
+ state: context.state,
112
+ step: context.step,
113
+ timestamp: Date.now(),
114
+ isFinished,
115
+ };
116
+ await this.persister.save(runId, serialized);
117
+ context.emit({
118
+ type: "state:saved",
119
+ log: { level: "info", message: "State saved" },
120
+ payload: { runId },
121
+ });
122
+ }
123
+ /**
124
+ * Saves the sub-agent cache to a JSON file in the cache directory.
125
+ *
126
+ * @param runId - Run ID used to name the cache file.
127
+ */
128
+ async saveCache(runId) {
129
+ if (!this.cacheDir)
130
+ return;
131
+ const file = path_1.default.join(this.cacheDir, `${runId}-cache.json`);
132
+ await fs_1.default.promises.writeFile(file, JSON.stringify(Object.fromEntries(this.subAgentCache), null, 2));
133
+ }
134
+ /**
135
+ * Loads the sub-agent cache from a JSON file if it exists.
136
+ *
137
+ * @param runId - Run ID to identify the cache file.
138
+ */
139
+ async loadCache(runId) {
140
+ if (!this.cacheDir)
141
+ return;
142
+ const file = path_1.default.join(this.cacheDir, `${runId}-cache.json`);
143
+ try {
144
+ const content = await fs_1.default.promises.readFile(file, "utf-8");
145
+ this.subAgentCache = new Map(Object.entries(JSON.parse(content)));
146
+ if (this.showLogs)
147
+ logger_1.Logger.info(`Cache loaded for run ${runId}`);
148
+ }
149
+ catch {
150
+ // Cache not found — no problem
151
+ }
152
+ }
153
+ // ─── helpers ────────────────────────────────────────────────────────────
154
+ /**
155
+ * Resolves the LLM client to use, prioritizing injected client, then metadata client, then creating one from model.
156
+ *
157
+ * @param metadata - Agent metadata containing client or model info.
158
+ * @param injected - Optionally injected client (overrides others).
159
+ * @returns The resolved LLMClient instance.
160
+ * @throws Error if no client or model is available.
161
+ */
162
+ resolveClient(metadata, injected) {
163
+ return (injected ??
164
+ metadata.llmClient ??
165
+ (metadata.model
166
+ ? new ollama_client_1.OllamaClient(metadata.model)
167
+ : (() => { throw new Error("Either llmClient or model must be provided"); })()));
168
+ }
169
+ /**
170
+ * Builds the initial message array for the agent conversation.
171
+ *
172
+ * @param systemPrompt - The system prompt to include.
173
+ * @param prompt - The user input prompt.
174
+ * @returns Array of LLMMessage objects.
175
+ */
176
+ buildInitialMessages(systemPrompt, prompt) {
177
+ return [
178
+ { role: "system", content: systemPrompt },
179
+ { role: "user", content: prompt },
180
+ ];
181
+ }
182
+ // ─── P4: planning step ──────────────────────────────────────────────────
183
+ /**
184
+ * Asks the LLM to produce a plan before the main execution loop.
185
+ * Best-effort: a failure here does not abort the run.
186
+ *
187
+ * @param context - Current agent context.
188
+ * @param client - LLM client to use for planning.
189
+ * @param options - Run options (for temperature, etc.).
190
+ */
191
+ async executePlanningStep(context, client, options) {
192
+ const planMessages = [
193
+ ...context.messages,
194
+ { role: "user", content: PLANNING_PROMPT },
195
+ ];
196
+ try {
197
+ const planResponse = await client.invoke(planMessages, [], { temperature: 0 });
198
+ const plan = planResponse.text.trim();
199
+ if (!plan)
200
+ return;
201
+ context.emit({
202
+ type: "agent:plan",
203
+ log: { level: "info", message: "Plan generated" },
204
+ payload: { plan },
205
+ });
206
+ // Inject plan as context so the model stays on track
207
+ context.messages.push({ role: "assistant", content: `[PLAN]\n${plan}` });
208
+ }
209
+ catch (err) {
210
+ logger_1.Logger.warn(`[AgentRuntime] Planning step failed (non-fatal): ${String(err)}`);
211
+ }
212
+ }
213
+ /**
214
+ * After a tool result, asks the LLM to self-reflect and optionally adjust.
215
+ * Only triggered in "reflect" planning mode.
216
+ *
217
+ * @param context - Current agent context.
218
+ * @param client - LLM client to use for reflection.
219
+ */
220
+ async executeReflectionStep(context, client) {
221
+ const reflectMessages = [
222
+ ...context.messages,
223
+ { role: "user", content: REFLECTION_PROMPT },
224
+ ];
225
+ try {
226
+ const reflectResponse = await client.invoke(reflectMessages, [], { temperature: 0.1 });
227
+ const reflection = reflectResponse.text.trim();
228
+ if (!reflection)
229
+ return;
230
+ context.emit({
231
+ type: "agent:reflect",
232
+ log: { level: "info", message: "Reflection.." },
233
+ payload: { reflection },
234
+ });
235
+ context.messages.push({ role: "assistant", content: `[REFLECTION] ${reflection}` });
236
+ }
237
+ catch (err) {
238
+ logger_1.Logger.warn(`[AgentRuntime] Reflection step failed (non-fatal): ${String(err)}`);
239
+ }
240
+ }
241
+ // ─── Core: run ──────────────────────────────────────────────────────────
242
+ /**
243
+ * Executes an agent class in buffered mode, returning the final output string.
244
+ *
245
+ * This method handles the full ReAct loop: planning (if enabled), LLM calls,
246
+ * tool execution, reflection, persistence, and event emission. Supports resuming
247
+ * from a previous run ID.
248
+ *
249
+ * @param agentClass - The agent class decorated with `@agent()`.
250
+ * @param prompt - The user input prompt to start the conversation.
251
+ * @param injectedClient - Optional LLM client to override the agent's default.
252
+ * @param options - Runtime options (maxSteps, temperature, persistence, etc.).
253
+ * @returns The final output string from the agent.
254
+ * @throws Error if agent metadata is missing or run resumption fails.
255
+ */
256
+ async run(agentClass, prompt, injectedClient, options = {}) {
257
+ const metadata = (0, agent_decorator_1.getAgentMetadata)(agentClass);
258
+ if (!metadata)
259
+ throw new Error("Agent metadata not found");
260
+ const effectiveMaxSteps = options.maxSteps ?? metadata.maxSteps ?? 5;
261
+ const isSilent = options.silent ?? false;
262
+ const planningMode = options.planning ?? "none";
263
+ let systemPrompt = metadata.systemPrompt ?? "You are a helpful AI assistant. Use tools if needed.";
264
+ if (metadata.behavior) {
265
+ const behavior = (0, load_behavior_1.loadBehavior)(metadata.behavior);
266
+ systemPrompt = (0, build_system_prompt_1.buildSystemPrompt)(behavior);
267
+ if (!isSilent) {
268
+ console.log("\n🧠 SYSTEM PROMPT:\n", systemPrompt, "\n----------------------\n");
269
+ }
270
+ }
271
+ const client = this.resolveClient(metadata, injectedClient);
272
+ const toolMap = new Map();
273
+ const tools = [];
274
+ (0, build_tool_map_1.buildToolMap)(metadata.tools, toolMap, tools);
275
+ const runId = options.resumeId ?? (0, crypto_1.randomUUID)();
276
+ let messages;
277
+ let state;
278
+ let startStep;
279
+ let isResuming = false;
280
+ if (options.resumeId) {
281
+ const saved = await this.persister.load(runId);
282
+ if (!saved)
283
+ throw new Error(`Run ${runId} not found`);
284
+ // Early return if already completed
285
+ if (saved.isFinished) {
286
+ const lastOutput = saved.messages.at(-1)?.content ?? "No output";
287
+ this.emit({
288
+ type: "agent:finish",
289
+ log: { level: "info", message: `🏁 Run ${runId} already completed` },
290
+ payload: { output: lastOutput },
291
+ });
292
+ return lastOutput;
293
+ }
294
+ messages = saved.messages;
295
+ state = saved.state;
296
+ startStep = saved.step;
297
+ isResuming = true;
298
+ }
299
+ else {
300
+ messages = this.buildInitialMessages(systemPrompt, prompt);
301
+ state = { steps: 0, toolCalls: 0, startTime: Date.now() };
302
+ startStep = 0;
303
+ }
304
+ const context = {
305
+ agentName: metadata.name,
306
+ input: prompt,
307
+ messages,
308
+ state,
309
+ step: startStep,
310
+ toolMap,
311
+ tools,
312
+ startTime: Date.now(),
313
+ emit: this.emit.bind(this),
314
+ runId,
315
+ };
316
+ if (this.cacheDir)
317
+ await this.loadCache(runId);
318
+ if (isResuming) {
319
+ context.emit({
320
+ type: "agent:resume",
321
+ log: { level: "info", message: `Resuming run ${runId}` },
322
+ payload: { runId },
323
+ });
324
+ }
325
+ else {
326
+ context.emit({
327
+ type: "agent:start",
328
+ log: { level: "info", message: `Starting agent: ${metadata.name}` },
329
+ payload: { agent: metadata.name, input: prompt },
330
+ });
331
+ }
332
+ const maxRetries = options.maxRetries ?? 3;
333
+ const retryDelay = options.retryDelayMs ?? 800;
334
+ const backoff = options.backoff ?? true;
335
+ // P4: optional planning step before the main loop
336
+ if (planningMode === "basic" || planningMode === "reflect") {
337
+ await this.executePlanningStep(context, client, options);
338
+ }
339
+ // ── Main ReAct loop ──────────────────────────────────────────────────
340
+ for (let step = startStep; step < effectiveMaxSteps; step++) {
341
+ context.step = step;
342
+ context.state.steps++;
343
+ context.emit({
344
+ type: "agent:step",
345
+ log: { level: "info", message: `Step ${step + 1} of ${effectiveMaxSteps}` },
346
+ payload: { step },
347
+ });
348
+ const response = await (0, retry_utils_1.withRetry)(() => client.invoke(context.messages, context.tools, { temperature: options.temperature ?? 0.2 }), maxRetries, retryDelay, backoff, context.emit.bind(context), { name: "LLM" });
349
+ context.messages.push({
350
+ role: "assistant",
351
+ content: response.text,
352
+ tool_calls: response.tool_calls,
353
+ });
354
+ context.emit({
355
+ type: "llm:response",
356
+ log: { level: "info", message: "LLM response received" },
357
+ payload: response,
358
+ });
359
+ await this.saveState(runId, context);
360
+ // No tool calls → final answer
361
+ if (!response.tool_calls?.length) {
362
+ await this.saveState(runId, context, true);
363
+ context.emit({
364
+ type: "agent:finish",
365
+ log: { level: "info", message: "Agent finished" },
366
+ payload: { output: response.text },
367
+ });
368
+ return response.text;
369
+ }
370
+ // Execute each tool call
371
+ for (const call of response.tool_calls) {
372
+ const toolName = call.function.name;
373
+ const toolArgs = call.function.arguments;
374
+ const toolCallId = call.id;
375
+ context.state.toolCalls++;
376
+ context.emit({
377
+ type: "tool:call",
378
+ log: { level: "info", message: `Calling tool: ${toolName}` },
379
+ payload: { name: toolName, args: toolArgs },
380
+ });
381
+ // P2: executeTool now returns ToolResult, not a raw string
382
+ const toolResult = await (0, retry_utils_1.withRetry)(() => (0, execute_tool_1.executeTool)(toolName, toolArgs, context.toolMap, options, this.subAgentCache), maxRetries, retryDelay, backoff, context.emit.bind(context), { name: toolName });
383
+ if (toolResult.ok) {
384
+ context.emit({
385
+ type: "tool:result",
386
+ log: { level: "info", message: `Tool result: ${toolName}` },
387
+ payload: { name: toolName, result: toolResult.value },
388
+ });
389
+ context.messages.push({
390
+ role: "tool",
391
+ content: toolResult.value,
392
+ tool_call_id: toolCallId,
393
+ });
394
+ }
395
+ else {
396
+ // P2: tool errors are now explicit events, not silent string pass-throughs
397
+ context.emit({
398
+ type: "tool:error",
399
+ log: { level: "warn", message: `Tool error: ${toolName} — ${toolResult.error}` },
400
+ payload: { name: toolName, error: toolResult.error },
401
+ });
402
+ // Pass a structured error back to the LLM so it can adapt
403
+ context.messages.push({
404
+ role: "tool",
405
+ content: `[TOOL ERROR] ${toolResult.error}`,
406
+ tool_call_id: toolCallId,
407
+ });
408
+ }
409
+ await this.saveState(runId, context);
410
+ // P4: optional reflection after each tool result
411
+ if (planningMode === "reflect") {
412
+ await this.executeReflectionStep(context, client);
413
+ }
414
+ }
415
+ }
416
+ if (this.cacheDir && (options.persistCache ?? false)) {
417
+ await this.saveCache(runId);
418
+ }
419
+ context.emit({
420
+ type: "agent:max_steps",
421
+ log: { level: "warn", message: `Reached max steps (${effectiveMaxSteps})` },
422
+ });
423
+ return "I reached the maximum number of steps without finding a final answer.";
424
+ }
425
+ // ─── P3: runStream ──────────────────────────────────────────────────────
426
+ /**
427
+ * Streaming variant of `run`. Yields:
428
+ * - AgentEvent for every lifecycle event (steps, tool calls, planning…)
429
+ * - StreamChunk { type: "text_delta" } for incremental LLM text tokens
430
+ *
431
+ * Falls back to buffered `invoke` if the client does not implement `invokeStream`.
432
+ *
433
+ * Usage example:
434
+ * for await (const event of runtime.runStream(MyAgent, prompt)) {
435
+ * if (event.type === "text_delta") process.stdout.write(event.delta);
436
+ * }
437
+ *
438
+ * @param agentClass - The agent class decorated with `@agent()`.
439
+ * @param prompt - The user input prompt.
440
+ * @param injectedClient - Optional LLM client override.
441
+ * @param options - Runtime options.
442
+ * @returns Async generator yielding events and stream chunks.
443
+ * @throws Error if agent metadata is missing.
444
+ */
445
+ async *runStream(agentClass, prompt, injectedClient, options = {}) {
446
+ const metadata = (0, agent_decorator_1.getAgentMetadata)(agentClass);
447
+ if (!metadata)
448
+ throw new Error("Agent metadata not found");
449
+ const effectiveMaxSteps = options.maxSteps ?? metadata.maxSteps ?? 5;
450
+ const planningMode = options.planning ?? "none";
451
+ let systemPrompt = metadata.systemPrompt ?? "You are a helpful AI assistant. Use tools if needed.";
452
+ if (metadata.behavior) {
453
+ systemPrompt = (0, build_system_prompt_1.buildSystemPrompt)((0, load_behavior_1.loadBehavior)(metadata.behavior));
454
+ }
455
+ const client = this.resolveClient(metadata, injectedClient);
456
+ const toolMap = new Map();
457
+ const tools = [];
458
+ (0, build_tool_map_1.buildToolMap)(metadata.tools, toolMap, tools);
459
+ const runId = options.resumeId ?? (0, crypto_1.randomUUID)();
460
+ const messages = this.buildInitialMessages(systemPrompt, prompt);
461
+ const state = { steps: 0, toolCalls: 0, startTime: Date.now() };
462
+ // Buffer for events emitted synchronously inside async operations
463
+ const eventQueue = [];
464
+ const context = {
465
+ agentName: metadata.name,
466
+ input: prompt,
467
+ messages,
468
+ state,
469
+ step: 0,
470
+ toolMap,
471
+ tools,
472
+ startTime: Date.now(),
473
+ // Override emit to both fire the EventEmitter AND buffer for the generator
474
+ emit: (event) => {
475
+ this.emit(event); // EventEmitter (for .on() subscribers)
476
+ eventQueue.push(event); // buffer for yield
477
+ },
478
+ runId,
479
+ };
480
+ const flush = function* () {
481
+ while (eventQueue.length > 0)
482
+ yield eventQueue.shift();
483
+ };
484
+ context.emit({
485
+ type: "agent:start",
486
+ log: { level: "info", message: `Starting agent (stream): ${metadata.name}` },
487
+ payload: { agent: metadata.name, input: prompt },
488
+ });
489
+ yield* flush();
490
+ if (planningMode === "basic" || planningMode === "reflect") {
491
+ await this.executePlanningStep(context, client, options);
492
+ yield* flush();
493
+ }
494
+ const maxRetries = options.maxRetries ?? 3;
495
+ const retryDelay = options.retryDelayMs ?? 800;
496
+ const backoff = options.backoff ?? true;
497
+ for (let step = 0; step < effectiveMaxSteps; step++) {
498
+ context.step = step;
499
+ context.state.steps++;
500
+ context.emit({
501
+ type: "agent:step",
502
+ log: { level: "info", message: `Step ${step + 1} of ${effectiveMaxSteps}` },
503
+ payload: { step },
504
+ });
505
+ yield* flush();
506
+ // ── LLM call: streaming or buffered ─────────────────────────────
507
+ let response;
508
+ if (client.invokeStream) {
509
+ // P3: true token streaming
510
+ const stream = client.invokeStream(context.messages, context.tools, {
511
+ temperature: options.temperature ?? 0.2,
512
+ });
513
+ let doneChunk = null;
514
+ for await (const chunk of stream) {
515
+ if (chunk.type === "text_delta") {
516
+ yield chunk; // forward text deltas immediately
517
+ }
518
+ else if (chunk.type === "done") {
519
+ doneChunk = chunk;
520
+ }
521
+ // tool_call_delta: logged via done.response.tool_calls
522
+ }
523
+ if (!doneChunk)
524
+ throw new Error("Stream ended without a done chunk");
525
+ response = doneChunk.response;
526
+ }
527
+ else {
528
+ // Fallback: non-streaming invoke
529
+ response = await (0, retry_utils_1.withRetry)(() => client.invoke(context.messages, context.tools, { temperature: options.temperature ?? 0.2 }), maxRetries, retryDelay, backoff, context.emit.bind(context), { name: "LLM" });
530
+ }
531
+ context.messages.push({ role: "assistant", content: response.text, tool_calls: response.tool_calls });
532
+ context.emit({
533
+ type: "llm:response",
534
+ log: { level: "info", message: "LLM response received" },
535
+ payload: response,
536
+ });
537
+ yield* flush();
538
+ await this.saveState(runId, context);
539
+ if (!response.tool_calls?.length) {
540
+ await this.saveState(runId, context, true);
541
+ context.emit({
542
+ type: "agent:finish",
543
+ log: { level: "info", message: "Agent finished" },
544
+ payload: { output: response.text },
545
+ });
546
+ yield* flush();
547
+ return;
548
+ }
549
+ for (const call of response.tool_calls) {
550
+ const toolName = call.function.name;
551
+ const toolArgs = call.function.arguments;
552
+ const toolCallId = call.id;
553
+ context.state.toolCalls++;
554
+ context.emit({
555
+ type: "tool:call",
556
+ log: { level: "info", message: `Calling tool: ${toolName}` },
557
+ payload: { name: toolName, args: toolArgs },
558
+ });
559
+ yield* flush();
560
+ const toolResult = await (0, retry_utils_1.withRetry)(() => (0, execute_tool_1.executeTool)(toolName, toolArgs, context.toolMap, options, this.subAgentCache), maxRetries, retryDelay, backoff, context.emit.bind(context), { name: toolName });
561
+ if (toolResult.ok) {
562
+ context.emit({
563
+ type: "tool:result",
564
+ log: { level: "info", message: `Tool result: ${toolName}` },
565
+ payload: { name: toolName, result: toolResult.value },
566
+ });
567
+ context.messages.push({ role: "tool", content: toolResult.value, tool_call_id: toolCallId });
568
+ }
569
+ else {
570
+ context.emit({
571
+ type: "tool:error",
572
+ log: { level: "warn", message: `Tool error: ${toolName}` },
573
+ payload: { name: toolName, error: toolResult.error },
574
+ });
575
+ context.messages.push({ role: "tool", content: `[TOOL ERROR] ${toolResult.error}`, tool_call_id: toolCallId });
576
+ }
577
+ yield* flush();
578
+ await this.saveState(runId, context);
579
+ if (planningMode === "reflect") {
580
+ await this.executeReflectionStep(context, client);
581
+ yield* flush();
582
+ }
583
+ }
584
+ }
585
+ context.emit({
586
+ type: "agent:max_steps",
587
+ log: { level: "warn", message: `Reached max steps (${effectiveMaxSteps})` },
588
+ });
589
+ yield* flush();
590
+ }
591
+ }
592
+ exports.AgentRuntime = AgentRuntime;
593
+ //# sourceMappingURL=agent.runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.runtime.js","sourceRoot":"","sources":["../../src/agents/agent.runtime.ts"],"names":[],"mappings":"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"}