@agentskit/runtime 0.4.0 → 0.4.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/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # @agentskit/runtime
2
+
3
+ Run autonomous agents in 5 lines — no UI, no boilerplate, just results.
4
+
5
+ ## Why
6
+
7
+ - **ReAct loop handled for you** — observe, think, act, repeat: the runtime drives the full cycle and stops when the agent decides it's done
8
+ - **Structured, inspectable results** — every run returns the final content, step count, all tool calls made, and total duration; no black boxes
9
+ - **Production-ready lifecycle** — lazy tool `init`/`dispose`, `AbortSignal` cancellation, memory persistence, and `AgentEvent` emissions for observability
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm install @agentskit/runtime @agentskit/adapters
15
+ ```
16
+
17
+ ## Quick example
18
+
19
+ ```ts
20
+ import { createRuntime } from '@agentskit/runtime'
21
+ import { openai } from '@agentskit/adapters'
22
+ import { webSearch, filesystem } from '@agentskit/tools'
23
+
24
+ const runtime = createRuntime({
25
+ adapter: openai({ apiKey: process.env.OPENAI_API_KEY, model: 'gpt-4o' }),
26
+ tools: [webSearch(), ...filesystem({ basePath: './workspace' })],
27
+ systemPrompt: 'You are a helpful research assistant.',
28
+ })
29
+
30
+ const result = await runtime.run('Research the latest advances in quantum computing')
31
+ console.log(result.content)
32
+ console.log(`Completed in ${result.steps} steps, ${result.durationMs}ms`)
33
+ ```
34
+
35
+ ## With skills
36
+
37
+ ```ts
38
+ import { createRuntime } from '@agentskit/runtime'
39
+ import { anthropic } from '@agentskit/adapters'
40
+ import { researcher } from '@agentskit/skills'
41
+
42
+ const runtime = createRuntime({
43
+ adapter: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY!, model: 'claude-sonnet-4-6' }),
44
+ })
45
+
46
+ const result = await runtime.run('Summarize REST vs GraphQL', { skill: researcher })
47
+ console.log(result.content)
48
+ ```
49
+
50
+ ## Next steps
51
+
52
+ - Add **RAG**: pass `retriever` from [`@agentskit/rag`](https://www.npmjs.com/package/@agentskit/rag) — see [`@agentskit/rag` README](https://www.npmjs.com/package/@agentskit/rag)
53
+ - Add **observability** with [`@agentskit/observability`](https://www.npmjs.com/package/@agentskit/observability) `observers` for LangSmith or OpenTelemetry
54
+
55
+ ## Ecosystem
56
+
57
+ | Package | Role |
58
+ |---------|------|
59
+ | [@agentskit/core](https://www.npmjs.com/package/@agentskit/core) | `createRuntime` contracts, `Retriever` |
60
+ | [@agentskit/adapters](https://www.npmjs.com/package/@agentskit/adapters) | LLM adapters |
61
+ | [@agentskit/tools](https://www.npmjs.com/package/@agentskit/tools) | Tool modules |
62
+ | [@agentskit/skills](https://www.npmjs.com/package/@agentskit/skills) | Pre-built skills |
63
+ | [@agentskit/rag](https://www.npmjs.com/package/@agentskit/rag) | `retriever` for context injection |
64
+
65
+ ## Docs
66
+
67
+ [Full documentation](https://emersonbraun.github.io/agentskit/)
package/dist/index.cjs CHANGED
@@ -3,193 +3,244 @@
3
3
  var core = require('@agentskit/core');
4
4
 
5
5
  // src/runner.ts
6
- function safeParseArgs(args) {
7
- try {
8
- const parsed = JSON.parse(args);
9
- return parsed && typeof parsed === "object" ? parsed : {};
10
- } catch {
11
- return {};
12
- }
6
+
7
+ // src/delegates.ts
8
+ function buildDelegateTools(delegates, runDelegate) {
9
+ return Object.entries(delegates).map(([name, config]) => ({
10
+ name: `delegate_${name}`,
11
+ description: `Delegate a subtask to the "${name}" agent. ${config.skill.description}`,
12
+ schema: {
13
+ type: "object",
14
+ properties: {
15
+ task: { type: "string", description: `The task to delegate to ${name}` }
16
+ },
17
+ required: ["task"]
18
+ },
19
+ execute: async (args) => {
20
+ const result = await runDelegate(name, config, args.task);
21
+ return result.content;
22
+ }
23
+ }));
13
24
  }
25
+
26
+ // src/runner.ts
14
27
  function createRuntime(config) {
15
28
  const emitter = core.createEventEmitter();
16
29
  for (const observer of config.observers ?? []) {
17
30
  emitter.addObserver(observer);
18
31
  }
19
- return {
20
- async run(task, options) {
21
- const startTime = Date.now();
22
- const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10;
23
- const signal = options?.signal;
24
- let skillTools = [];
25
- let systemPrompt = options?.systemPrompt ?? config.systemPrompt ?? "";
26
- if (options?.skill) {
27
- systemPrompt = options.skill.systemPrompt;
28
- if (options.skill.onActivate) {
29
- const activation = await options.skill.onActivate();
30
- skillTools = activation.tools ?? [];
31
- }
32
- }
33
- const toolMap = /* @__PURE__ */ new Map();
34
- for (const tool of config.tools ?? []) toolMap.set(tool.name, tool);
35
- for (const tool of options?.tools ?? []) toolMap.set(tool.name, tool);
36
- for (const tool of skillTools) toolMap.set(tool.name, tool);
37
- const tools = [...toolMap.values()];
38
- const initialized = /* @__PURE__ */ new Set();
39
- const initTool = async (tool) => {
40
- if (tool.init && !initialized.has(tool.name)) {
41
- await tool.init();
42
- initialized.add(tool.name);
43
- }
44
- };
45
- const disposeAll = async () => {
46
- for (const name of initialized) {
47
- const tool = toolMap.get(name);
48
- try {
49
- await tool?.dispose?.();
50
- } catch {
51
- }
52
- }
53
- };
54
- const messages = [];
55
- if (systemPrompt) {
56
- messages.push(core.buildMessage({ role: "system", content: systemPrompt }));
57
- }
58
- messages.push(core.buildMessage({ role: "user", content: task }));
59
- const allToolCalls = [];
60
- let step = 0;
61
- let finalContent = "";
62
- try {
63
- while (step < maxSteps) {
64
- if (signal?.aborted) {
65
- break;
66
- }
67
- step++;
68
- emitter.emit({ type: "agent:step", step, action: step === 1 ? "initial" : "tool-result-loop" });
69
- const request = {
70
- messages,
71
- context: {
72
- systemPrompt,
73
- temperature: options?.skill?.temperature ?? config.temperature,
74
- maxTokens: config.maxTokens,
75
- tools
76
- }
32
+ const maxDelegationDepth = config.maxDelegationDepth ?? 3;
33
+ async function runInternal(task, options, depth) {
34
+ const startTime = Date.now();
35
+ const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10;
36
+ const signal = options?.signal;
37
+ let effectiveSystemPrompt = options?.systemPrompt ?? config.systemPrompt ?? "";
38
+ let skillTools = [];
39
+ if (options?.skill) {
40
+ effectiveSystemPrompt = options.skill.systemPrompt;
41
+ const activation = await core.activateSkills([options.skill]);
42
+ skillTools = activation.skillTools;
43
+ }
44
+ const toolMap = core.buildToolMap(config.tools, options?.tools, skillTools);
45
+ const mergedDelegates = {
46
+ ...config.delegates ?? {},
47
+ ...options?.delegates ?? {}
48
+ };
49
+ if (Object.keys(mergedDelegates).length > 0 && depth < maxDelegationDepth) {
50
+ const delegateTools = buildDelegateTools(
51
+ mergedDelegates,
52
+ async (name, delegateConfig, delegateTask) => {
53
+ emitter.emit({ type: "agent:delegate:start", name, task: delegateTask, depth: depth + 1 });
54
+ const delegateStart = Date.now();
55
+ const childRuntime = delegateConfig.adapter ? createRuntime({ ...config, adapter: delegateConfig.adapter }) : { run: (t, o) => runInternal(t, o, depth + 1) };
56
+ const childOptions = {
57
+ skill: delegateConfig.skill,
58
+ tools: delegateConfig.tools,
59
+ maxSteps: delegateConfig.maxSteps ?? 5,
60
+ signal,
61
+ sharedContext: options?.sharedContext
77
62
  };
78
- const streamStart = Date.now();
79
- const source = config.adapter.createSource(request);
80
- emitter.emit({ type: "llm:start", messageCount: messages.length });
81
- let accumulatedText = "";
82
- const stepToolCalls = [];
83
- let streamError = null;
84
- await core.consumeStream(source, {
85
- onText(accumulated) {
86
- accumulatedText = accumulated;
87
- },
88
- async onToolCall(chunk) {
89
- if (chunk.toolCall) {
90
- stepToolCalls.push({ toolCall: chunk.toolCall });
91
- }
92
- },
93
- onError(error) {
94
- streamError = error;
95
- },
96
- onDone(accumulated) {
97
- accumulatedText = accumulated;
98
- }
99
- });
63
+ const result = await childRuntime.run(delegateTask, childOptions);
100
64
  emitter.emit({
101
- type: "llm:end",
102
- content: accumulatedText,
103
- durationMs: Date.now() - streamStart
104
- });
105
- if (streamError) {
106
- emitter.emit({ type: "error", error: streamError });
107
- throw streamError;
108
- }
109
- if (signal?.aborted) {
110
- break;
111
- }
112
- const assistantToolCalls = stepToolCalls.map(({ toolCall }) => ({
113
- id: toolCall.id,
114
- name: toolCall.name,
115
- args: safeParseArgs(toolCall.args),
116
- status: "pending"
117
- }));
118
- const assistantMessage = core.buildMessage({
119
- role: "assistant",
120
- content: accumulatedText,
121
- status: "complete"
65
+ type: "agent:delegate:end",
66
+ name,
67
+ result: result.content,
68
+ durationMs: Date.now() - delegateStart,
69
+ depth: depth + 1
122
70
  });
123
- if (assistantToolCalls.length > 0) {
124
- assistantMessage.toolCalls = assistantToolCalls;
125
- }
126
- messages.push(assistantMessage);
127
- if (assistantToolCalls.length === 0) {
128
- finalContent = accumulatedText;
129
- break;
71
+ return result;
72
+ }
73
+ );
74
+ for (const tool of delegateTools) toolMap.set(tool.name, tool);
75
+ }
76
+ const tools = [...toolMap.values()];
77
+ const lifecycle = core.createToolLifecycle(toolMap);
78
+ const messages = [];
79
+ if (effectiveSystemPrompt) {
80
+ messages.push(core.buildMessage({ role: "system", content: effectiveSystemPrompt }));
81
+ }
82
+ messages.push(core.buildMessage({ role: "user", content: task }));
83
+ const allToolCalls = [];
84
+ let step = 0;
85
+ let finalContent = "";
86
+ try {
87
+ while (step < maxSteps) {
88
+ if (signal?.aborted) break;
89
+ step++;
90
+ emitter.emit({ type: "agent:step", step, action: step === 1 ? "initial" : "tool-result-loop" });
91
+ const retrievedDocuments = config.retriever ? await config.retriever.retrieve({ query: task, messages }) : [];
92
+ const retrievalContext = core.formatRetrievedDocuments(retrievedDocuments);
93
+ const requestMessages = retrievalContext ? [core.buildMessage({ role: "system", content: `Use the retrieved context below when it is relevant.
94
+
95
+ ${retrievalContext}` }), ...messages] : messages;
96
+ const request = {
97
+ messages: requestMessages,
98
+ context: {
99
+ systemPrompt: effectiveSystemPrompt,
100
+ temperature: options?.skill?.temperature ?? config.temperature,
101
+ maxTokens: config.maxTokens,
102
+ tools,
103
+ metadata: retrievedDocuments.length > 0 ? { retrievedDocuments } : void 0
130
104
  }
131
- for (const toolCall of assistantToolCalls) {
132
- if (signal?.aborted) break;
133
- const tool = toolMap.get(toolCall.name);
134
- allToolCalls.push(toolCall);
135
- if (!tool?.execute) {
136
- const errorMsg = `Tool "${toolCall.name}" not found or has no execute function`;
137
- toolCall.status = "error";
138
- toolCall.error = errorMsg;
139
- messages.push(core.buildMessage({ role: "tool", content: errorMsg }));
140
- emitter.emit({ type: "error", error: new Error(errorMsg) });
141
- continue;
142
- }
143
- await initTool(tool);
144
- emitter.emit({ type: "tool:start", name: toolCall.name, args: toolCall.args });
145
- const toolStart = Date.now();
146
- try {
147
- const result = await core.executeToolCall(tool, toolCall.args, {
148
- messages,
149
- call: toolCall
150
- });
151
- toolCall.status = "complete";
152
- toolCall.result = result;
153
- messages.push(core.buildMessage({ role: "tool", content: result }));
154
- emitter.emit({
155
- type: "tool:end",
156
- name: toolCall.name,
157
- result,
158
- durationMs: Date.now() - toolStart
159
- });
160
- } catch (error) {
161
- const errorMsg = error instanceof Error ? error.message : String(error);
162
- toolCall.status = "error";
163
- toolCall.error = errorMsg;
164
- messages.push(core.buildMessage({ role: "tool", content: `Error: ${errorMsg}` }));
165
- emitter.emit({
166
- type: "tool:end",
167
- name: toolCall.name,
168
- result: `Error: ${errorMsg}`,
169
- durationMs: Date.now() - toolStart
170
- });
105
+ };
106
+ const streamStart = Date.now();
107
+ const source = config.adapter.createSource(request);
108
+ emitter.emit({ type: "llm:start", messageCount: request.messages.length });
109
+ let accumulatedText = "";
110
+ const stepToolCalls = [];
111
+ let streamError = null;
112
+ await core.consumeStream(source, {
113
+ onText(accumulated) {
114
+ accumulatedText = accumulated;
115
+ },
116
+ async onToolCall(chunk) {
117
+ if (chunk.toolCall) {
118
+ stepToolCalls.push({ toolCall: chunk.toolCall });
171
119
  }
120
+ },
121
+ onError(error) {
122
+ streamError = error;
123
+ },
124
+ onDone(accumulated) {
125
+ accumulatedText = accumulated;
172
126
  }
127
+ });
128
+ emitter.emit({
129
+ type: "llm:end",
130
+ content: accumulatedText,
131
+ durationMs: Date.now() - streamStart
132
+ });
133
+ if (streamError) {
134
+ emitter.emit({ type: "error", error: streamError });
135
+ throw streamError;
136
+ }
137
+ if (signal?.aborted) break;
138
+ const assistantToolCalls = stepToolCalls.map(({ toolCall }) => ({
139
+ id: toolCall.id,
140
+ name: toolCall.name,
141
+ args: core.safeParseArgs(toolCall.args),
142
+ status: "pending"
143
+ }));
144
+ const assistantMessage = core.buildMessage({
145
+ role: "assistant",
146
+ content: accumulatedText,
147
+ status: "complete"
148
+ });
149
+ if (assistantToolCalls.length > 0) {
150
+ assistantMessage.toolCalls = assistantToolCalls;
151
+ }
152
+ messages.push(assistantMessage);
153
+ if (assistantToolCalls.length === 0) {
173
154
  finalContent = accumulatedText;
155
+ break;
174
156
  }
175
- if (config.memory) {
176
- await config.memory.save(messages);
177
- emitter.emit({ type: "memory:save", messageCount: messages.length });
157
+ for (const toolCall of assistantToolCalls) {
158
+ if (signal?.aborted) break;
159
+ const tool = toolMap.get(toolCall.name);
160
+ allToolCalls.push(toolCall);
161
+ const execResult = await core.executeSafeTool({
162
+ tool,
163
+ toolCall,
164
+ context: { messages, call: toolCall },
165
+ emitter,
166
+ lifecycle,
167
+ onPartial: (partial) => {
168
+ toolCall.result = partial;
169
+ },
170
+ onConfirm: config.onConfirm
171
+ });
172
+ toolCall.status = execResult.status === "complete" ? "complete" : "error";
173
+ if (execResult.status === "complete") {
174
+ toolCall.result = execResult.result;
175
+ messages.push(core.buildMessage({ role: "tool", content: execResult.result ?? "" }));
176
+ } else if (execResult.status === "skipped") {
177
+ toolCall.status = "error";
178
+ toolCall.error = execResult.result;
179
+ messages.push(core.buildMessage({ role: "tool", content: execResult.result ?? "Tool execution skipped" }));
180
+ } else {
181
+ toolCall.error = execResult.error;
182
+ messages.push(core.buildMessage({ role: "tool", content: `Error: ${execResult.error}` }));
183
+ }
178
184
  }
179
- return {
180
- content: finalContent,
181
- messages,
182
- steps: step,
183
- toolCalls: allToolCalls,
184
- durationMs: Date.now() - startTime
185
- };
186
- } finally {
187
- await disposeAll();
185
+ finalContent = accumulatedText;
188
186
  }
187
+ if (config.memory) {
188
+ await config.memory.save(messages);
189
+ emitter.emit({ type: "memory:save", messageCount: messages.length });
190
+ }
191
+ return {
192
+ content: finalContent,
193
+ messages,
194
+ steps: step,
195
+ toolCalls: allToolCalls,
196
+ durationMs: Date.now() - startTime
197
+ };
198
+ } finally {
199
+ await lifecycle.disposeAll();
200
+ }
201
+ }
202
+ return {
203
+ run(task, options) {
204
+ return runInternal(task, options, 0);
205
+ }
206
+ };
207
+ }
208
+
209
+ // src/shared-context.ts
210
+ function createSharedContext(initial) {
211
+ const store = new Map(
212
+ initial ? Object.entries(initial) : []
213
+ );
214
+ return {
215
+ get(key) {
216
+ return store.get(key);
217
+ },
218
+ set(key, value) {
219
+ store.set(key, value);
220
+ },
221
+ has(key) {
222
+ return store.has(key);
223
+ },
224
+ entries() {
225
+ return Object.fromEntries(store);
226
+ },
227
+ readOnly() {
228
+ return {
229
+ get(key) {
230
+ return store.get(key);
231
+ },
232
+ has(key) {
233
+ return store.has(key);
234
+ },
235
+ entries() {
236
+ return Object.fromEntries(store);
237
+ }
238
+ };
189
239
  }
190
240
  };
191
241
  }
192
242
 
193
243
  exports.createRuntime = createRuntime;
244
+ exports.createSharedContext = createSharedContext;
194
245
  //# sourceMappingURL=index.cjs.map
195
246
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runner.ts"],"names":["createEventEmitter","buildMessage","consumeStream","executeToolCall"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n buildMessage,\n consumeStream,\n createEventEmitter,\n executeToolCall,\n generateId,\n} from '@agentskit/core'\nimport type {\n AdapterRequest,\n Message,\n StreamChunk,\n ToolCall,\n ToolDefinition,\n} from '@agentskit/core'\nimport type { RuntimeConfig, RunOptions, RunResult } from './types'\n\nfunction safeParseArgs(args: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(args)\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nexport function createRuntime(config: RuntimeConfig) {\n const emitter = createEventEmitter()\n\n for (const observer of config.observers ?? []) {\n emitter.addObserver(observer)\n }\n\n return {\n async run(task: string, options?: RunOptions): Promise<RunResult> {\n const startTime = Date.now()\n\n // Resolve effective config\n const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10\n const signal = options?.signal\n\n // Activate skill if provided\n let skillTools: ToolDefinition[] = []\n let systemPrompt = options?.systemPrompt ?? config.systemPrompt ?? ''\n\n if (options?.skill) {\n systemPrompt = options.skill.systemPrompt\n if (options.skill.onActivate) {\n const activation = await options.skill.onActivate()\n skillTools = activation.tools ?? []\n }\n }\n\n // Merge tools: config < options < skill (last wins on name collision)\n const toolMap = new Map<string, ToolDefinition>()\n for (const tool of config.tools ?? []) toolMap.set(tool.name, tool)\n for (const tool of options?.tools ?? []) toolMap.set(tool.name, tool)\n for (const tool of skillTools) toolMap.set(tool.name, tool)\n const tools = [...toolMap.values()]\n\n // Lazy init tracking\n const initialized = new Set<string>()\n\n const initTool = async (tool: ToolDefinition) => {\n if (tool.init && !initialized.has(tool.name)) {\n await tool.init()\n initialized.add(tool.name)\n }\n }\n\n const disposeAll = async () => {\n for (const name of initialized) {\n const tool = toolMap.get(name)\n try {\n await tool?.dispose?.()\n } catch {\n // Dispose errors should not propagate\n }\n }\n }\n\n // Build initial messages\n const messages: Message[] = []\n\n if (systemPrompt) {\n messages.push(buildMessage({ role: 'system', content: systemPrompt }))\n }\n\n messages.push(buildMessage({ role: 'user', content: task }))\n\n const allToolCalls: ToolCall[] = []\n let step = 0\n let finalContent = ''\n\n try {\n while (step < maxSteps) {\n if (signal?.aborted) {\n break\n }\n\n step++\n emitter.emit({ type: 'agent:step', step, action: step === 1 ? 'initial' : 'tool-result-loop' })\n\n // Build adapter request\n const request: AdapterRequest = {\n messages,\n context: {\n systemPrompt,\n temperature: options?.skill?.temperature ?? config.temperature,\n maxTokens: config.maxTokens,\n tools,\n },\n }\n\n // Call adapter\n const streamStart = Date.now()\n const source = config.adapter.createSource(request)\n emitter.emit({ type: 'llm:start', messageCount: messages.length })\n\n let accumulatedText = ''\n const stepToolCalls: Array<{ toolCall: StreamChunk['toolCall'] }> = []\n let streamError: Error | null = null\n\n await consumeStream(source, {\n onText(accumulated) {\n accumulatedText = accumulated\n },\n async onToolCall(chunk) {\n if (chunk.toolCall) {\n stepToolCalls.push({ toolCall: chunk.toolCall })\n }\n },\n onError(error) {\n streamError = error\n },\n onDone(accumulated) {\n accumulatedText = accumulated\n },\n })\n\n emitter.emit({\n type: 'llm:end',\n content: accumulatedText,\n durationMs: Date.now() - streamStart,\n })\n\n if (streamError) {\n emitter.emit({ type: 'error', error: streamError })\n throw streamError\n }\n\n if (signal?.aborted) {\n break\n }\n\n // Build assistant message with tool calls\n const assistantToolCalls: ToolCall[] = stepToolCalls.map(({ toolCall }) => ({\n id: toolCall!.id,\n name: toolCall!.name,\n args: safeParseArgs(toolCall!.args),\n status: 'pending' as const,\n }))\n\n const assistantMessage = buildMessage({\n role: 'assistant',\n content: accumulatedText,\n status: 'complete',\n })\n if (assistantToolCalls.length > 0) {\n assistantMessage.toolCalls = assistantToolCalls\n }\n messages.push(assistantMessage)\n\n // No tool calls → agent is done\n if (assistantToolCalls.length === 0) {\n finalContent = accumulatedText\n break\n }\n\n // Execute each tool call and inject results\n for (const toolCall of assistantToolCalls) {\n if (signal?.aborted) break\n\n const tool = toolMap.get(toolCall.name)\n allToolCalls.push(toolCall)\n\n if (!tool?.execute) {\n // No executor — inject error as tool result\n const errorMsg = `Tool \"${toolCall.name}\" not found or has no execute function`\n toolCall.status = 'error'\n toolCall.error = errorMsg\n messages.push(buildMessage({ role: 'tool', content: errorMsg }))\n emitter.emit({ type: 'error', error: new Error(errorMsg) })\n continue\n }\n\n // Lazy init\n await initTool(tool)\n\n emitter.emit({ type: 'tool:start', name: toolCall.name, args: toolCall.args })\n const toolStart = Date.now()\n\n try {\n const result = await executeToolCall(tool, toolCall.args, {\n messages,\n call: toolCall,\n })\n toolCall.status = 'complete'\n toolCall.result = result\n messages.push(buildMessage({ role: 'tool', content: result }))\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result,\n durationMs: Date.now() - toolStart,\n })\n } catch (error) {\n // Inject error as tool result — let LLM decide what to do\n const errorMsg = error instanceof Error ? error.message : String(error)\n toolCall.status = 'error'\n toolCall.error = errorMsg\n messages.push(buildMessage({ role: 'tool', content: `Error: ${errorMsg}` }))\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result: `Error: ${errorMsg}`,\n durationMs: Date.now() - toolStart,\n })\n }\n }\n\n // After last iteration with tool calls, if we hit maxSteps next loop will break\n finalContent = accumulatedText\n }\n\n // Save to memory if configured\n if (config.memory) {\n await config.memory.save(messages)\n emitter.emit({ type: 'memory:save', messageCount: messages.length })\n }\n\n return {\n content: finalContent,\n messages,\n steps: step,\n toolCalls: allToolCalls,\n durationMs: Date.now() - startTime,\n }\n } finally {\n await disposeAll()\n }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/delegates.ts","../src/runner.ts","../src/shared-context.ts"],"names":["createEventEmitter","activateSkills","buildToolMap","createToolLifecycle","buildMessage","formatRetrievedDocuments","consumeStream","safeParseArgs","executeSafeTool"],"mappings":";;;;;;;AAGO,SAAS,kBAAA,CACd,WACA,WAAA,EACkB;AAClB,EAAA,OAAO,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,MAAO;AAAA,IACxD,IAAA,EAAM,YAAY,IAAI,CAAA,CAAA;AAAA,IACtB,aAAa,CAAA,2BAAA,EAA8B,IAAI,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,WAAW,CAAA,CAAA;AAAA,IACnF,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,MAAM,EAAE,IAAA,EAAM,UAAU,WAAA,EAAa,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA;AAAG,OACzE;AAAA,MACA,QAAA,EAAU,CAAC,MAAM;AAAA,KACnB;AAAA,IACA,OAAA,EAAS,OAAO,IAAA,KAAkC;AAChD,MAAA,MAAM,SAAS,MAAM,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ,KAAK,IAAc,CAAA;AAClE,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF,CAAE,CAAA;AACJ;;;ACFO,SAAS,cAAc,MAAA,EAAuB;AACnD,EAAA,MAAM,UAAUA,uBAAA,EAAmB;AAEnC,EAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG;AAC7C,IAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,CAAA;AAExD,EAAA,eAAe,WAAA,CACb,IAAA,EACA,OAAA,EACA,KAAA,EACoB;AACpB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,MAAA,CAAO,QAAA,IAAY,EAAA;AACzD,IAAA,MAAM,SAAS,OAAA,EAAS,MAAA;AAGxB,IAAA,IAAI,qBAAA,GAAwB,OAAA,EAAS,YAAA,IAAgB,MAAA,CAAO,YAAA,IAAgB,EAAA;AAC5E,IAAA,IAAI,aAAyD,EAAC;AAE9D,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,qBAAA,GAAwB,QAAQ,KAAA,CAAM,YAAA;AACtC,MAAA,MAAM,aAAa,MAAMC,mBAAA,CAAe,CAAC,OAAA,CAAQ,KAAK,CAAC,CAAA;AACvD,MAAA,UAAA,GAAa,UAAA,CAAW,UAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,UAAUC,iBAAA,CAAa,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,OAAO,UAAU,CAAA;AAGrE,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,GAAI,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,MACzB,GAAI,OAAA,EAAS,SAAA,IAAa;AAAC,KAC7B;AAGA,IAAA,IAAI,OAAO,IAAA,CAAK,eAAe,EAAE,MAAA,GAAS,CAAA,IAAK,QAAQ,kBAAA,EAAoB;AACzE,MAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,QACpB,eAAA;AAAA,QACA,OAAO,IAAA,EAAM,cAAA,EAAgB,YAAA,KAAiB;AAC5C,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,MAAM,YAAA,EAAc,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,CAAA;AACzF,UAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAE/B,UAAA,MAAM,YAAA,GAAe,eAAe,OAAA,GAChC,aAAA,CAAc,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,cAAA,CAAe,OAAA,EAAS,IAC5D,EAAE,GAAA,EAAK,CAAC,CAAA,EAAW,CAAA,KAAmB,YAAY,CAAA,EAAG,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAE;AAEvE,UAAA,MAAM,YAAA,GAA2B;AAAA,YAC/B,OAAO,cAAA,CAAe,KAAA;AAAA,YACtB,OAAO,cAAA,CAAe,KAAA;AAAA,YACtB,QAAA,EAAU,eAAe,QAAA,IAAY,CAAA;AAAA,YACrC,MAAA;AAAA,YACA,eAAe,OAAA,EAAS;AAAA,WAC1B;AAEA,UAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,GAAA,CAAI,cAAc,YAAY,CAAA;AAEhE,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,oBAAA;AAAA,YACN,IAAA;AAAA,YACA,QAAQ,MAAA,CAAO,OAAA;AAAA,YACf,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AAAA,YACzB,OAAO,KAAA,GAAQ;AAAA,WAChB,CAAA;AAED,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,OACF;AACA,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAClC,IAAA,MAAM,SAAA,GAAYC,yBAAoB,OAAO,CAAA;AAG7C,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,QAAA,CAAS,IAAA,CAAKC,kBAAa,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,qBAAA,EAAuB,CAAC,CAAA;AAAA,IAChF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAKA,kBAAa,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAE3D,IAAA,MAAM,eAA2B,EAAC;AAClC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,EAAU;AACtB,QAAA,IAAI,QAAQ,OAAA,EAAS;AAErB,QAAA,IAAA,EAAA;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,QAAQ,IAAA,KAAS,CAAA,GAAI,SAAA,GAAY,kBAAA,EAAoB,CAAA;AAG9F,QAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,SAAA,GAC9B,MAAM,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,IACzD,EAAC;AACL,QAAA,MAAM,gBAAA,GAAmBC,8BAAyB,kBAAkB,CAAA;AAEpE,QAAA,MAAM,kBAAkB,gBAAA,GACpB,CAACD,kBAAa,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,CAAA;;AAAA,EAA2D,gBAAgB,CAAA,CAAA,EAAI,CAAA,EAAG,GAAG,QAAQ,CAAA,GACtI,QAAA;AAEJ,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B,QAAA,EAAU,eAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,YAAA,EAAc,qBAAA;AAAA,YACd,WAAA,EAAa,OAAA,EAAS,KAAA,EAAO,WAAA,IAAe,MAAA,CAAO,WAAA;AAAA,YACnD,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,KAAA;AAAA,YACA,UAAU,kBAAA,CAAmB,MAAA,GAAS,CAAA,GAAI,EAAE,oBAAmB,GAAI,KAAA;AAAA;AACrE,SACF;AAEA,QAAA,MAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAClD,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,cAAc,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AAEzE,QAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,QAAA,MAAM,gBAA8D,EAAC;AACrE,QAAA,IAAI,WAAA,GAA4B,IAAA;AAEhC,QAAA,MAAME,mBAAc,MAAA,EAAQ;AAAA,UAC1B,OAAO,WAAA,EAAa;AAClB,YAAA,eAAA,GAAkB,WAAA;AAAA,UACpB,CAAA;AAAA,UACA,MAAM,WAAW,KAAA,EAAO;AACtB,YAAA,IAAI,MAAM,QAAA,EAAU;AAClB,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAAA,YACjD;AAAA,UACF,CAAA;AAAA,UACA,QAAQ,KAAA,EAAO;AACb,YAAA,WAAA,GAAc,KAAA;AAAA,UAChB,CAAA;AAAA,UACA,OAAO,WAAA,EAAa;AAClB,YAAA,eAAA,GAAkB,WAAA;AAAA,UACpB;AAAA,SACD,CAAA;AAED,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,eAAA;AAAA,UACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SAC1B,CAAA;AAED,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,aAAa,CAAA;AAClD,UAAA,MAAM,WAAA;AAAA,QACR;AAEA,QAAA,IAAI,QAAQ,OAAA,EAAS;AAGrB,QAAA,MAAM,qBAAiC,aAAA,CAAc,GAAA,CAAI,CAAC,EAAE,UAAS,MAAO;AAAA,UAC1E,IAAI,QAAA,CAAU,EAAA;AAAA,UACd,MAAM,QAAA,CAAU,IAAA;AAAA,UAChB,IAAA,EAAMC,kBAAA,CAAc,QAAA,CAAU,IAAI,CAAA;AAAA,UAClC,MAAA,EAAQ;AAAA,SACV,CAAE,CAAA;AAEF,QAAA,MAAM,mBAAmBH,iBAAA,CAAa;AAAA,UACpC,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,eAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,UAAA,gBAAA,CAAiB,SAAA,GAAY,kBAAA;AAAA,QAC/B;AACA,QAAA,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAG9B,QAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACnC,UAAA,YAAA,GAAe,eAAA;AACf,UAAA;AAAA,QACF;AAGA,QAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AACzC,UAAA,IAAI,QAAQ,OAAA,EAAS;AAErB,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA;AACtC,UAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAE1B,UAAA,MAAM,UAAA,GAAa,MAAMI,oBAAA,CAAgB;AAAA,YACvC,IAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,EAAS,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS;AAAA,YACpC,OAAA;AAAA,YACA,SAAA;AAAA,YACA,SAAA,EAAW,CAAC,OAAA,KAAY;AAAE,cAAA,QAAA,CAAS,MAAA,GAAS,OAAA;AAAA,YAAQ,CAAA;AAAA,YACpD,WAAW,MAAA,CAAO;AAAA,WACnB,CAAA;AAED,UAAA,QAAA,CAAS,MAAA,GAAS,UAAA,CAAW,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,OAAA;AAClE,UAAA,IAAI,UAAA,CAAW,WAAW,UAAA,EAAY;AACpC,YAAA,QAAA,CAAS,SAAS,UAAA,CAAW,MAAA;AAC7B,YAAA,QAAA,CAAS,IAAA,CAAKJ,iBAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,UAAA,CAAW,MAAA,IAAU,EAAA,EAAI,CAAC,CAAA;AAAA,UAChF,CAAA,MAAA,IAAW,UAAA,CAAW,MAAA,KAAW,SAAA,EAAW;AAC1C,YAAA,QAAA,CAAS,MAAA,GAAS,OAAA;AAClB,YAAA,QAAA,CAAS,QAAQ,UAAA,CAAW,MAAA;AAC5B,YAAA,QAAA,CAAS,IAAA,CAAKA,iBAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,UAAA,CAAW,MAAA,IAAU,wBAAA,EAA0B,CAAC,CAAA;AAAA,UACtG,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,QAAQ,UAAA,CAAW,KAAA;AAC5B,YAAA,QAAA,CAAS,IAAA,CAAKA,iBAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,UACrF;AAAA,QACF;AAEA,QAAA,YAAA,GAAe,eAAA;AAAA,MACjB;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACjC,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,eAAe,YAAA,EAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,MACrE;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,QAAA;AAAA,QACA,KAAA,EAAO,IAAA;AAAA,QACP,SAAA,EAAW,YAAA;AAAA,QACX,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC3B;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAM,UAAU,UAAA,EAAW;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,MAAc,OAAA,EAA0C;AAC1D,MAAA,OAAO,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,CAAC,CAAA;AAAA,IACrC;AAAA,GACF;AACF;;;ACnPO,SAAS,oBACd,OAAA,EACe;AACf,EAAA,MAAM,QAAQ,IAAI,GAAA;AAAA,IAChB,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAO,IAAI;AAAC,GACvC;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,EAAK;AAAE,MAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,IAAE,CAAA;AAAA,IACjC,GAAA,CAAI,KAAK,KAAA,EAAO;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IAAE,CAAA;AAAA,IACxC,IAAI,GAAA,EAAK;AAAE,MAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,IAAE,CAAA;AAAA,IACjC,OAAA,GAAU;AAAE,MAAA,OAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,IAAE,CAAA;AAAA,IAC7C,QAAA,GAAW;AACT,MAAA,OAAO;AAAA,QACL,IAAI,GAAA,EAAa;AAAE,UAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,QAAE,CAAA;AAAA,QACzC,IAAI,GAAA,EAAa;AAAE,UAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,QAAE,CAAA;AAAA,QACzC,OAAA,GAAU;AAAE,UAAA,OAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,QAAE;AAAA,OAC/C;AAAA,IACF;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["import type { ToolDefinition } from '@agentskit/core'\nimport type { DelegateConfig, RunResult } from './types'\n\nexport function buildDelegateTools(\n delegates: Record<string, DelegateConfig>,\n runDelegate: (name: string, config: DelegateConfig, task: string) => Promise<RunResult>,\n): ToolDefinition[] {\n return Object.entries(delegates).map(([name, config]) => ({\n name: `delegate_${name}`,\n description: `Delegate a subtask to the \"${name}\" agent. ${config.skill.description}`,\n schema: {\n type: 'object' as const,\n properties: {\n task: { type: 'string', description: `The task to delegate to ${name}` },\n },\n required: ['task'],\n },\n execute: async (args: Record<string, unknown>) => {\n const result = await runDelegate(name, config, args.task as string)\n return result.content\n },\n }))\n}\n","import {\n buildMessage,\n consumeStream,\n createEventEmitter,\n safeParseArgs,\n createToolLifecycle,\n formatRetrievedDocuments,\n buildToolMap,\n activateSkills,\n executeSafeTool,\n} from '@agentskit/core'\nimport type {\n AdapterRequest,\n Message,\n StreamChunk,\n ToolCall,\n} from '@agentskit/core'\nimport type { RuntimeConfig, RunOptions, RunResult } from './types'\nimport { buildDelegateTools } from './delegates'\n\nexport function createRuntime(config: RuntimeConfig) {\n const emitter = createEventEmitter()\n\n for (const observer of config.observers ?? []) {\n emitter.addObserver(observer)\n }\n\n const maxDelegationDepth = config.maxDelegationDepth ?? 3\n\n async function runInternal(\n task: string,\n options: RunOptions | undefined,\n depth: number,\n ): Promise<RunResult> {\n const startTime = Date.now()\n\n const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10\n const signal = options?.signal\n\n // Activate skill: use skill's systemPrompt directly, activate tools via shared helper\n let effectiveSystemPrompt = options?.systemPrompt ?? config.systemPrompt ?? ''\n let skillTools: import('@agentskit/core').ToolDefinition[] = []\n\n if (options?.skill) {\n effectiveSystemPrompt = options.skill.systemPrompt\n const activation = await activateSkills([options.skill])\n skillTools = activation.skillTools\n }\n\n // Build tool map using shared helper\n const toolMap = buildToolMap(config.tools, options?.tools, skillTools)\n\n // Merge delegates: config < options (last wins on name collision)\n const mergedDelegates = {\n ...(config.delegates ?? {}),\n ...(options?.delegates ?? {}),\n }\n\n // Generate delegate tools if within depth limit\n if (Object.keys(mergedDelegates).length > 0 && depth < maxDelegationDepth) {\n const delegateTools = buildDelegateTools(\n mergedDelegates,\n async (name, delegateConfig, delegateTask) => {\n emitter.emit({ type: 'agent:delegate:start', name, task: delegateTask, depth: depth + 1 })\n const delegateStart = Date.now()\n\n const childRuntime = delegateConfig.adapter\n ? createRuntime({ ...config, adapter: delegateConfig.adapter })\n : { run: (t: string, o?: RunOptions) => runInternal(t, o, depth + 1) }\n\n const childOptions: RunOptions = {\n skill: delegateConfig.skill,\n tools: delegateConfig.tools,\n maxSteps: delegateConfig.maxSteps ?? 5,\n signal,\n sharedContext: options?.sharedContext,\n }\n\n const result = await childRuntime.run(delegateTask, childOptions)\n\n emitter.emit({\n type: 'agent:delegate:end',\n name,\n result: result.content,\n durationMs: Date.now() - delegateStart,\n depth: depth + 1,\n })\n\n return result\n },\n )\n for (const tool of delegateTools) toolMap.set(tool.name, tool)\n }\n\n const tools = [...toolMap.values()]\n const lifecycle = createToolLifecycle(toolMap)\n\n // Build initial messages\n const messages: Message[] = []\n\n if (effectiveSystemPrompt) {\n messages.push(buildMessage({ role: 'system', content: effectiveSystemPrompt }))\n }\n\n messages.push(buildMessage({ role: 'user', content: task }))\n\n const allToolCalls: ToolCall[] = []\n let step = 0\n let finalContent = ''\n\n try {\n while (step < maxSteps) {\n if (signal?.aborted) break\n\n step++\n emitter.emit({ type: 'agent:step', step, action: step === 1 ? 'initial' : 'tool-result-loop' })\n\n // Retrieve context if configured\n const retrievedDocuments = config.retriever\n ? await config.retriever.retrieve({ query: task, messages })\n : []\n const retrievalContext = formatRetrievedDocuments(retrievedDocuments)\n\n const requestMessages = retrievalContext\n ? [buildMessage({ role: 'system', content: `Use the retrieved context below when it is relevant.\\n\\n${retrievalContext}` }), ...messages]\n : messages\n\n const request: AdapterRequest = {\n messages: requestMessages,\n context: {\n systemPrompt: effectiveSystemPrompt,\n temperature: options?.skill?.temperature ?? config.temperature,\n maxTokens: config.maxTokens,\n tools,\n metadata: retrievedDocuments.length > 0 ? { retrievedDocuments } : undefined,\n },\n }\n\n const streamStart = Date.now()\n const source = config.adapter.createSource(request)\n emitter.emit({ type: 'llm:start', messageCount: request.messages.length })\n\n let accumulatedText = ''\n const stepToolCalls: Array<{ toolCall: StreamChunk['toolCall'] }> = []\n let streamError: Error | null = null\n\n await consumeStream(source, {\n onText(accumulated) {\n accumulatedText = accumulated\n },\n async onToolCall(chunk) {\n if (chunk.toolCall) {\n stepToolCalls.push({ toolCall: chunk.toolCall })\n }\n },\n onError(error) {\n streamError = error\n },\n onDone(accumulated) {\n accumulatedText = accumulated\n },\n })\n\n emitter.emit({\n type: 'llm:end',\n content: accumulatedText,\n durationMs: Date.now() - streamStart,\n })\n\n if (streamError) {\n emitter.emit({ type: 'error', error: streamError })\n throw streamError\n }\n\n if (signal?.aborted) break\n\n // Build assistant message with tool calls\n const assistantToolCalls: ToolCall[] = stepToolCalls.map(({ toolCall }) => ({\n id: toolCall!.id,\n name: toolCall!.name,\n args: safeParseArgs(toolCall!.args),\n status: 'pending' as const,\n }))\n\n const assistantMessage = buildMessage({\n role: 'assistant',\n content: accumulatedText,\n status: 'complete',\n })\n if (assistantToolCalls.length > 0) {\n assistantMessage.toolCalls = assistantToolCalls\n }\n messages.push(assistantMessage)\n\n // No tool calls → agent is done\n if (assistantToolCalls.length === 0) {\n finalContent = accumulatedText\n break\n }\n\n // Execute all tool calls using shared executeSafeTool\n for (const toolCall of assistantToolCalls) {\n if (signal?.aborted) break\n\n const tool = toolMap.get(toolCall.name)\n allToolCalls.push(toolCall)\n\n const execResult = await executeSafeTool({\n tool,\n toolCall,\n context: { messages, call: toolCall },\n emitter,\n lifecycle,\n onPartial: (partial) => { toolCall.result = partial },\n onConfirm: config.onConfirm,\n })\n\n toolCall.status = execResult.status === 'complete' ? 'complete' : 'error'\n if (execResult.status === 'complete') {\n toolCall.result = execResult.result\n messages.push(buildMessage({ role: 'tool', content: execResult.result ?? '' }))\n } else if (execResult.status === 'skipped') {\n toolCall.status = 'error'\n toolCall.error = execResult.result\n messages.push(buildMessage({ role: 'tool', content: execResult.result ?? 'Tool execution skipped' }))\n } else {\n toolCall.error = execResult.error\n messages.push(buildMessage({ role: 'tool', content: `Error: ${execResult.error}` }))\n }\n }\n\n finalContent = accumulatedText\n }\n\n // Save to memory if configured\n if (config.memory) {\n await config.memory.save(messages)\n emitter.emit({ type: 'memory:save', messageCount: messages.length })\n }\n\n return {\n content: finalContent,\n messages,\n steps: step,\n toolCalls: allToolCalls,\n durationMs: Date.now() - startTime,\n }\n } finally {\n await lifecycle.disposeAll()\n }\n }\n\n return {\n run(task: string, options?: RunOptions): Promise<RunResult> {\n return runInternal(task, options, 0)\n },\n }\n}\n","export interface SharedContext {\n get(key: string): unknown\n set(key: string, value: unknown): void\n has(key: string): boolean\n entries(): Record<string, unknown>\n readOnly(): ReadonlySharedContext\n}\n\nexport interface ReadonlySharedContext {\n get(key: string): unknown\n has(key: string): boolean\n entries(): Record<string, unknown>\n}\n\nexport function createSharedContext(\n initial?: Record<string, unknown>,\n): SharedContext {\n const store = new Map<string, unknown>(\n initial ? Object.entries(initial) : [],\n )\n\n return {\n get(key) { return store.get(key) },\n set(key, value) { store.set(key, value) },\n has(key) { return store.has(key) },\n entries() { return Object.fromEntries(store) },\n readOnly() {\n return {\n get(key: string) { return store.get(key) },\n has(key: string) { return store.has(key) },\n entries() { return Object.fromEntries(store) },\n }\n },\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,14 +1,38 @@
1
- import { ToolDefinition, SkillDefinition, Message, ToolCall, AdapterFactory, ChatMemory, Observer } from '@agentskit/core';
1
+ import { SkillDefinition, ToolDefinition, AdapterFactory, Message, ToolCall, ChatMemory, Retriever, Observer, MaybePromise } from '@agentskit/core';
2
2
 
3
+ interface SharedContext {
4
+ get(key: string): unknown;
5
+ set(key: string, value: unknown): void;
6
+ has(key: string): boolean;
7
+ entries(): Record<string, unknown>;
8
+ readOnly(): ReadonlySharedContext;
9
+ }
10
+ interface ReadonlySharedContext {
11
+ get(key: string): unknown;
12
+ has(key: string): boolean;
13
+ entries(): Record<string, unknown>;
14
+ }
15
+ declare function createSharedContext(initial?: Record<string, unknown>): SharedContext;
16
+
17
+ interface DelegateConfig {
18
+ skill: SkillDefinition;
19
+ tools?: ToolDefinition[];
20
+ adapter?: AdapterFactory;
21
+ maxSteps?: number;
22
+ }
3
23
  interface RuntimeConfig {
4
24
  adapter: AdapterFactory;
5
25
  tools?: ToolDefinition[];
6
26
  systemPrompt?: string;
7
27
  memory?: ChatMemory;
28
+ retriever?: Retriever;
8
29
  observers?: Observer[];
9
30
  maxSteps?: number;
10
31
  temperature?: number;
11
32
  maxTokens?: number;
33
+ delegates?: Record<string, DelegateConfig>;
34
+ maxDelegationDepth?: number;
35
+ onConfirm?: (toolCall: ToolCall) => MaybePromise<boolean>;
12
36
  }
13
37
  interface RunOptions {
14
38
  tools?: ToolDefinition[];
@@ -16,6 +40,8 @@ interface RunOptions {
16
40
  skill?: SkillDefinition;
17
41
  maxSteps?: number;
18
42
  signal?: AbortSignal;
43
+ delegates?: Record<string, DelegateConfig>;
44
+ sharedContext?: SharedContext;
19
45
  }
20
46
  interface RunResult {
21
47
  content: string;
@@ -29,4 +55,4 @@ declare function createRuntime(config: RuntimeConfig): {
29
55
  run(task: string, options?: RunOptions): Promise<RunResult>;
30
56
  };
31
57
 
32
- export { type RunOptions, type RunResult, type RuntimeConfig, createRuntime };
58
+ export { type DelegateConfig, type ReadonlySharedContext, type RunOptions, type RunResult, type RuntimeConfig, type SharedContext, createRuntime, createSharedContext };
package/dist/index.d.ts CHANGED
@@ -1,14 +1,38 @@
1
- import { ToolDefinition, SkillDefinition, Message, ToolCall, AdapterFactory, ChatMemory, Observer } from '@agentskit/core';
1
+ import { SkillDefinition, ToolDefinition, AdapterFactory, Message, ToolCall, ChatMemory, Retriever, Observer, MaybePromise } from '@agentskit/core';
2
2
 
3
+ interface SharedContext {
4
+ get(key: string): unknown;
5
+ set(key: string, value: unknown): void;
6
+ has(key: string): boolean;
7
+ entries(): Record<string, unknown>;
8
+ readOnly(): ReadonlySharedContext;
9
+ }
10
+ interface ReadonlySharedContext {
11
+ get(key: string): unknown;
12
+ has(key: string): boolean;
13
+ entries(): Record<string, unknown>;
14
+ }
15
+ declare function createSharedContext(initial?: Record<string, unknown>): SharedContext;
16
+
17
+ interface DelegateConfig {
18
+ skill: SkillDefinition;
19
+ tools?: ToolDefinition[];
20
+ adapter?: AdapterFactory;
21
+ maxSteps?: number;
22
+ }
3
23
  interface RuntimeConfig {
4
24
  adapter: AdapterFactory;
5
25
  tools?: ToolDefinition[];
6
26
  systemPrompt?: string;
7
27
  memory?: ChatMemory;
28
+ retriever?: Retriever;
8
29
  observers?: Observer[];
9
30
  maxSteps?: number;
10
31
  temperature?: number;
11
32
  maxTokens?: number;
33
+ delegates?: Record<string, DelegateConfig>;
34
+ maxDelegationDepth?: number;
35
+ onConfirm?: (toolCall: ToolCall) => MaybePromise<boolean>;
12
36
  }
13
37
  interface RunOptions {
14
38
  tools?: ToolDefinition[];
@@ -16,6 +40,8 @@ interface RunOptions {
16
40
  skill?: SkillDefinition;
17
41
  maxSteps?: number;
18
42
  signal?: AbortSignal;
43
+ delegates?: Record<string, DelegateConfig>;
44
+ sharedContext?: SharedContext;
19
45
  }
20
46
  interface RunResult {
21
47
  content: string;
@@ -29,4 +55,4 @@ declare function createRuntime(config: RuntimeConfig): {
29
55
  run(task: string, options?: RunOptions): Promise<RunResult>;
30
56
  };
31
57
 
32
- export { type RunOptions, type RunResult, type RuntimeConfig, createRuntime };
58
+ export { type DelegateConfig, type ReadonlySharedContext, type RunOptions, type RunResult, type RuntimeConfig, type SharedContext, createRuntime, createSharedContext };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA"}
package/dist/index.js CHANGED
@@ -1,193 +1,243 @@
1
- import { createEventEmitter, buildMessage, consumeStream, executeToolCall } from '@agentskit/core';
1
+ import { createEventEmitter, activateSkills, buildToolMap, createToolLifecycle, buildMessage, formatRetrievedDocuments, consumeStream, safeParseArgs, executeSafeTool } from '@agentskit/core';
2
2
 
3
3
  // src/runner.ts
4
- function safeParseArgs(args) {
5
- try {
6
- const parsed = JSON.parse(args);
7
- return parsed && typeof parsed === "object" ? parsed : {};
8
- } catch {
9
- return {};
10
- }
4
+
5
+ // src/delegates.ts
6
+ function buildDelegateTools(delegates, runDelegate) {
7
+ return Object.entries(delegates).map(([name, config]) => ({
8
+ name: `delegate_${name}`,
9
+ description: `Delegate a subtask to the "${name}" agent. ${config.skill.description}`,
10
+ schema: {
11
+ type: "object",
12
+ properties: {
13
+ task: { type: "string", description: `The task to delegate to ${name}` }
14
+ },
15
+ required: ["task"]
16
+ },
17
+ execute: async (args) => {
18
+ const result = await runDelegate(name, config, args.task);
19
+ return result.content;
20
+ }
21
+ }));
11
22
  }
23
+
24
+ // src/runner.ts
12
25
  function createRuntime(config) {
13
26
  const emitter = createEventEmitter();
14
27
  for (const observer of config.observers ?? []) {
15
28
  emitter.addObserver(observer);
16
29
  }
17
- return {
18
- async run(task, options) {
19
- const startTime = Date.now();
20
- const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10;
21
- const signal = options?.signal;
22
- let skillTools = [];
23
- let systemPrompt = options?.systemPrompt ?? config.systemPrompt ?? "";
24
- if (options?.skill) {
25
- systemPrompt = options.skill.systemPrompt;
26
- if (options.skill.onActivate) {
27
- const activation = await options.skill.onActivate();
28
- skillTools = activation.tools ?? [];
29
- }
30
- }
31
- const toolMap = /* @__PURE__ */ new Map();
32
- for (const tool of config.tools ?? []) toolMap.set(tool.name, tool);
33
- for (const tool of options?.tools ?? []) toolMap.set(tool.name, tool);
34
- for (const tool of skillTools) toolMap.set(tool.name, tool);
35
- const tools = [...toolMap.values()];
36
- const initialized = /* @__PURE__ */ new Set();
37
- const initTool = async (tool) => {
38
- if (tool.init && !initialized.has(tool.name)) {
39
- await tool.init();
40
- initialized.add(tool.name);
41
- }
42
- };
43
- const disposeAll = async () => {
44
- for (const name of initialized) {
45
- const tool = toolMap.get(name);
46
- try {
47
- await tool?.dispose?.();
48
- } catch {
49
- }
50
- }
51
- };
52
- const messages = [];
53
- if (systemPrompt) {
54
- messages.push(buildMessage({ role: "system", content: systemPrompt }));
55
- }
56
- messages.push(buildMessage({ role: "user", content: task }));
57
- const allToolCalls = [];
58
- let step = 0;
59
- let finalContent = "";
60
- try {
61
- while (step < maxSteps) {
62
- if (signal?.aborted) {
63
- break;
64
- }
65
- step++;
66
- emitter.emit({ type: "agent:step", step, action: step === 1 ? "initial" : "tool-result-loop" });
67
- const request = {
68
- messages,
69
- context: {
70
- systemPrompt,
71
- temperature: options?.skill?.temperature ?? config.temperature,
72
- maxTokens: config.maxTokens,
73
- tools
74
- }
30
+ const maxDelegationDepth = config.maxDelegationDepth ?? 3;
31
+ async function runInternal(task, options, depth) {
32
+ const startTime = Date.now();
33
+ const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10;
34
+ const signal = options?.signal;
35
+ let effectiveSystemPrompt = options?.systemPrompt ?? config.systemPrompt ?? "";
36
+ let skillTools = [];
37
+ if (options?.skill) {
38
+ effectiveSystemPrompt = options.skill.systemPrompt;
39
+ const activation = await activateSkills([options.skill]);
40
+ skillTools = activation.skillTools;
41
+ }
42
+ const toolMap = buildToolMap(config.tools, options?.tools, skillTools);
43
+ const mergedDelegates = {
44
+ ...config.delegates ?? {},
45
+ ...options?.delegates ?? {}
46
+ };
47
+ if (Object.keys(mergedDelegates).length > 0 && depth < maxDelegationDepth) {
48
+ const delegateTools = buildDelegateTools(
49
+ mergedDelegates,
50
+ async (name, delegateConfig, delegateTask) => {
51
+ emitter.emit({ type: "agent:delegate:start", name, task: delegateTask, depth: depth + 1 });
52
+ const delegateStart = Date.now();
53
+ const childRuntime = delegateConfig.adapter ? createRuntime({ ...config, adapter: delegateConfig.adapter }) : { run: (t, o) => runInternal(t, o, depth + 1) };
54
+ const childOptions = {
55
+ skill: delegateConfig.skill,
56
+ tools: delegateConfig.tools,
57
+ maxSteps: delegateConfig.maxSteps ?? 5,
58
+ signal,
59
+ sharedContext: options?.sharedContext
75
60
  };
76
- const streamStart = Date.now();
77
- const source = config.adapter.createSource(request);
78
- emitter.emit({ type: "llm:start", messageCount: messages.length });
79
- let accumulatedText = "";
80
- const stepToolCalls = [];
81
- let streamError = null;
82
- await consumeStream(source, {
83
- onText(accumulated) {
84
- accumulatedText = accumulated;
85
- },
86
- async onToolCall(chunk) {
87
- if (chunk.toolCall) {
88
- stepToolCalls.push({ toolCall: chunk.toolCall });
89
- }
90
- },
91
- onError(error) {
92
- streamError = error;
93
- },
94
- onDone(accumulated) {
95
- accumulatedText = accumulated;
96
- }
97
- });
61
+ const result = await childRuntime.run(delegateTask, childOptions);
98
62
  emitter.emit({
99
- type: "llm:end",
100
- content: accumulatedText,
101
- durationMs: Date.now() - streamStart
102
- });
103
- if (streamError) {
104
- emitter.emit({ type: "error", error: streamError });
105
- throw streamError;
106
- }
107
- if (signal?.aborted) {
108
- break;
109
- }
110
- const assistantToolCalls = stepToolCalls.map(({ toolCall }) => ({
111
- id: toolCall.id,
112
- name: toolCall.name,
113
- args: safeParseArgs(toolCall.args),
114
- status: "pending"
115
- }));
116
- const assistantMessage = buildMessage({
117
- role: "assistant",
118
- content: accumulatedText,
119
- status: "complete"
63
+ type: "agent:delegate:end",
64
+ name,
65
+ result: result.content,
66
+ durationMs: Date.now() - delegateStart,
67
+ depth: depth + 1
120
68
  });
121
- if (assistantToolCalls.length > 0) {
122
- assistantMessage.toolCalls = assistantToolCalls;
123
- }
124
- messages.push(assistantMessage);
125
- if (assistantToolCalls.length === 0) {
126
- finalContent = accumulatedText;
127
- break;
69
+ return result;
70
+ }
71
+ );
72
+ for (const tool of delegateTools) toolMap.set(tool.name, tool);
73
+ }
74
+ const tools = [...toolMap.values()];
75
+ const lifecycle = createToolLifecycle(toolMap);
76
+ const messages = [];
77
+ if (effectiveSystemPrompt) {
78
+ messages.push(buildMessage({ role: "system", content: effectiveSystemPrompt }));
79
+ }
80
+ messages.push(buildMessage({ role: "user", content: task }));
81
+ const allToolCalls = [];
82
+ let step = 0;
83
+ let finalContent = "";
84
+ try {
85
+ while (step < maxSteps) {
86
+ if (signal?.aborted) break;
87
+ step++;
88
+ emitter.emit({ type: "agent:step", step, action: step === 1 ? "initial" : "tool-result-loop" });
89
+ const retrievedDocuments = config.retriever ? await config.retriever.retrieve({ query: task, messages }) : [];
90
+ const retrievalContext = formatRetrievedDocuments(retrievedDocuments);
91
+ const requestMessages = retrievalContext ? [buildMessage({ role: "system", content: `Use the retrieved context below when it is relevant.
92
+
93
+ ${retrievalContext}` }), ...messages] : messages;
94
+ const request = {
95
+ messages: requestMessages,
96
+ context: {
97
+ systemPrompt: effectiveSystemPrompt,
98
+ temperature: options?.skill?.temperature ?? config.temperature,
99
+ maxTokens: config.maxTokens,
100
+ tools,
101
+ metadata: retrievedDocuments.length > 0 ? { retrievedDocuments } : void 0
128
102
  }
129
- for (const toolCall of assistantToolCalls) {
130
- if (signal?.aborted) break;
131
- const tool = toolMap.get(toolCall.name);
132
- allToolCalls.push(toolCall);
133
- if (!tool?.execute) {
134
- const errorMsg = `Tool "${toolCall.name}" not found or has no execute function`;
135
- toolCall.status = "error";
136
- toolCall.error = errorMsg;
137
- messages.push(buildMessage({ role: "tool", content: errorMsg }));
138
- emitter.emit({ type: "error", error: new Error(errorMsg) });
139
- continue;
140
- }
141
- await initTool(tool);
142
- emitter.emit({ type: "tool:start", name: toolCall.name, args: toolCall.args });
143
- const toolStart = Date.now();
144
- try {
145
- const result = await executeToolCall(tool, toolCall.args, {
146
- messages,
147
- call: toolCall
148
- });
149
- toolCall.status = "complete";
150
- toolCall.result = result;
151
- messages.push(buildMessage({ role: "tool", content: result }));
152
- emitter.emit({
153
- type: "tool:end",
154
- name: toolCall.name,
155
- result,
156
- durationMs: Date.now() - toolStart
157
- });
158
- } catch (error) {
159
- const errorMsg = error instanceof Error ? error.message : String(error);
160
- toolCall.status = "error";
161
- toolCall.error = errorMsg;
162
- messages.push(buildMessage({ role: "tool", content: `Error: ${errorMsg}` }));
163
- emitter.emit({
164
- type: "tool:end",
165
- name: toolCall.name,
166
- result: `Error: ${errorMsg}`,
167
- durationMs: Date.now() - toolStart
168
- });
103
+ };
104
+ const streamStart = Date.now();
105
+ const source = config.adapter.createSource(request);
106
+ emitter.emit({ type: "llm:start", messageCount: request.messages.length });
107
+ let accumulatedText = "";
108
+ const stepToolCalls = [];
109
+ let streamError = null;
110
+ await consumeStream(source, {
111
+ onText(accumulated) {
112
+ accumulatedText = accumulated;
113
+ },
114
+ async onToolCall(chunk) {
115
+ if (chunk.toolCall) {
116
+ stepToolCalls.push({ toolCall: chunk.toolCall });
169
117
  }
118
+ },
119
+ onError(error) {
120
+ streamError = error;
121
+ },
122
+ onDone(accumulated) {
123
+ accumulatedText = accumulated;
170
124
  }
125
+ });
126
+ emitter.emit({
127
+ type: "llm:end",
128
+ content: accumulatedText,
129
+ durationMs: Date.now() - streamStart
130
+ });
131
+ if (streamError) {
132
+ emitter.emit({ type: "error", error: streamError });
133
+ throw streamError;
134
+ }
135
+ if (signal?.aborted) break;
136
+ const assistantToolCalls = stepToolCalls.map(({ toolCall }) => ({
137
+ id: toolCall.id,
138
+ name: toolCall.name,
139
+ args: safeParseArgs(toolCall.args),
140
+ status: "pending"
141
+ }));
142
+ const assistantMessage = buildMessage({
143
+ role: "assistant",
144
+ content: accumulatedText,
145
+ status: "complete"
146
+ });
147
+ if (assistantToolCalls.length > 0) {
148
+ assistantMessage.toolCalls = assistantToolCalls;
149
+ }
150
+ messages.push(assistantMessage);
151
+ if (assistantToolCalls.length === 0) {
171
152
  finalContent = accumulatedText;
153
+ break;
172
154
  }
173
- if (config.memory) {
174
- await config.memory.save(messages);
175
- emitter.emit({ type: "memory:save", messageCount: messages.length });
155
+ for (const toolCall of assistantToolCalls) {
156
+ if (signal?.aborted) break;
157
+ const tool = toolMap.get(toolCall.name);
158
+ allToolCalls.push(toolCall);
159
+ const execResult = await executeSafeTool({
160
+ tool,
161
+ toolCall,
162
+ context: { messages, call: toolCall },
163
+ emitter,
164
+ lifecycle,
165
+ onPartial: (partial) => {
166
+ toolCall.result = partial;
167
+ },
168
+ onConfirm: config.onConfirm
169
+ });
170
+ toolCall.status = execResult.status === "complete" ? "complete" : "error";
171
+ if (execResult.status === "complete") {
172
+ toolCall.result = execResult.result;
173
+ messages.push(buildMessage({ role: "tool", content: execResult.result ?? "" }));
174
+ } else if (execResult.status === "skipped") {
175
+ toolCall.status = "error";
176
+ toolCall.error = execResult.result;
177
+ messages.push(buildMessage({ role: "tool", content: execResult.result ?? "Tool execution skipped" }));
178
+ } else {
179
+ toolCall.error = execResult.error;
180
+ messages.push(buildMessage({ role: "tool", content: `Error: ${execResult.error}` }));
181
+ }
176
182
  }
177
- return {
178
- content: finalContent,
179
- messages,
180
- steps: step,
181
- toolCalls: allToolCalls,
182
- durationMs: Date.now() - startTime
183
- };
184
- } finally {
185
- await disposeAll();
183
+ finalContent = accumulatedText;
186
184
  }
185
+ if (config.memory) {
186
+ await config.memory.save(messages);
187
+ emitter.emit({ type: "memory:save", messageCount: messages.length });
188
+ }
189
+ return {
190
+ content: finalContent,
191
+ messages,
192
+ steps: step,
193
+ toolCalls: allToolCalls,
194
+ durationMs: Date.now() - startTime
195
+ };
196
+ } finally {
197
+ await lifecycle.disposeAll();
198
+ }
199
+ }
200
+ return {
201
+ run(task, options) {
202
+ return runInternal(task, options, 0);
203
+ }
204
+ };
205
+ }
206
+
207
+ // src/shared-context.ts
208
+ function createSharedContext(initial) {
209
+ const store = new Map(
210
+ initial ? Object.entries(initial) : []
211
+ );
212
+ return {
213
+ get(key) {
214
+ return store.get(key);
215
+ },
216
+ set(key, value) {
217
+ store.set(key, value);
218
+ },
219
+ has(key) {
220
+ return store.has(key);
221
+ },
222
+ entries() {
223
+ return Object.fromEntries(store);
224
+ },
225
+ readOnly() {
226
+ return {
227
+ get(key) {
228
+ return store.get(key);
229
+ },
230
+ has(key) {
231
+ return store.has(key);
232
+ },
233
+ entries() {
234
+ return Object.fromEntries(store);
235
+ }
236
+ };
187
237
  }
188
238
  };
189
239
  }
190
240
 
191
- export { createRuntime };
241
+ export { createRuntime, createSharedContext };
192
242
  //# sourceMappingURL=index.js.map
193
243
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runner.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n buildMessage,\n consumeStream,\n createEventEmitter,\n executeToolCall,\n generateId,\n} from '@agentskit/core'\nimport type {\n AdapterRequest,\n Message,\n StreamChunk,\n ToolCall,\n ToolDefinition,\n} from '@agentskit/core'\nimport type { RuntimeConfig, RunOptions, RunResult } from './types'\n\nfunction safeParseArgs(args: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(args)\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nexport function createRuntime(config: RuntimeConfig) {\n const emitter = createEventEmitter()\n\n for (const observer of config.observers ?? []) {\n emitter.addObserver(observer)\n }\n\n return {\n async run(task: string, options?: RunOptions): Promise<RunResult> {\n const startTime = Date.now()\n\n // Resolve effective config\n const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10\n const signal = options?.signal\n\n // Activate skill if provided\n let skillTools: ToolDefinition[] = []\n let systemPrompt = options?.systemPrompt ?? config.systemPrompt ?? ''\n\n if (options?.skill) {\n systemPrompt = options.skill.systemPrompt\n if (options.skill.onActivate) {\n const activation = await options.skill.onActivate()\n skillTools = activation.tools ?? []\n }\n }\n\n // Merge tools: config < options < skill (last wins on name collision)\n const toolMap = new Map<string, ToolDefinition>()\n for (const tool of config.tools ?? []) toolMap.set(tool.name, tool)\n for (const tool of options?.tools ?? []) toolMap.set(tool.name, tool)\n for (const tool of skillTools) toolMap.set(tool.name, tool)\n const tools = [...toolMap.values()]\n\n // Lazy init tracking\n const initialized = new Set<string>()\n\n const initTool = async (tool: ToolDefinition) => {\n if (tool.init && !initialized.has(tool.name)) {\n await tool.init()\n initialized.add(tool.name)\n }\n }\n\n const disposeAll = async () => {\n for (const name of initialized) {\n const tool = toolMap.get(name)\n try {\n await tool?.dispose?.()\n } catch {\n // Dispose errors should not propagate\n }\n }\n }\n\n // Build initial messages\n const messages: Message[] = []\n\n if (systemPrompt) {\n messages.push(buildMessage({ role: 'system', content: systemPrompt }))\n }\n\n messages.push(buildMessage({ role: 'user', content: task }))\n\n const allToolCalls: ToolCall[] = []\n let step = 0\n let finalContent = ''\n\n try {\n while (step < maxSteps) {\n if (signal?.aborted) {\n break\n }\n\n step++\n emitter.emit({ type: 'agent:step', step, action: step === 1 ? 'initial' : 'tool-result-loop' })\n\n // Build adapter request\n const request: AdapterRequest = {\n messages,\n context: {\n systemPrompt,\n temperature: options?.skill?.temperature ?? config.temperature,\n maxTokens: config.maxTokens,\n tools,\n },\n }\n\n // Call adapter\n const streamStart = Date.now()\n const source = config.adapter.createSource(request)\n emitter.emit({ type: 'llm:start', messageCount: messages.length })\n\n let accumulatedText = ''\n const stepToolCalls: Array<{ toolCall: StreamChunk['toolCall'] }> = []\n let streamError: Error | null = null\n\n await consumeStream(source, {\n onText(accumulated) {\n accumulatedText = accumulated\n },\n async onToolCall(chunk) {\n if (chunk.toolCall) {\n stepToolCalls.push({ toolCall: chunk.toolCall })\n }\n },\n onError(error) {\n streamError = error\n },\n onDone(accumulated) {\n accumulatedText = accumulated\n },\n })\n\n emitter.emit({\n type: 'llm:end',\n content: accumulatedText,\n durationMs: Date.now() - streamStart,\n })\n\n if (streamError) {\n emitter.emit({ type: 'error', error: streamError })\n throw streamError\n }\n\n if (signal?.aborted) {\n break\n }\n\n // Build assistant message with tool calls\n const assistantToolCalls: ToolCall[] = stepToolCalls.map(({ toolCall }) => ({\n id: toolCall!.id,\n name: toolCall!.name,\n args: safeParseArgs(toolCall!.args),\n status: 'pending' as const,\n }))\n\n const assistantMessage = buildMessage({\n role: 'assistant',\n content: accumulatedText,\n status: 'complete',\n })\n if (assistantToolCalls.length > 0) {\n assistantMessage.toolCalls = assistantToolCalls\n }\n messages.push(assistantMessage)\n\n // No tool calls → agent is done\n if (assistantToolCalls.length === 0) {\n finalContent = accumulatedText\n break\n }\n\n // Execute each tool call and inject results\n for (const toolCall of assistantToolCalls) {\n if (signal?.aborted) break\n\n const tool = toolMap.get(toolCall.name)\n allToolCalls.push(toolCall)\n\n if (!tool?.execute) {\n // No executor — inject error as tool result\n const errorMsg = `Tool \"${toolCall.name}\" not found or has no execute function`\n toolCall.status = 'error'\n toolCall.error = errorMsg\n messages.push(buildMessage({ role: 'tool', content: errorMsg }))\n emitter.emit({ type: 'error', error: new Error(errorMsg) })\n continue\n }\n\n // Lazy init\n await initTool(tool)\n\n emitter.emit({ type: 'tool:start', name: toolCall.name, args: toolCall.args })\n const toolStart = Date.now()\n\n try {\n const result = await executeToolCall(tool, toolCall.args, {\n messages,\n call: toolCall,\n })\n toolCall.status = 'complete'\n toolCall.result = result\n messages.push(buildMessage({ role: 'tool', content: result }))\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result,\n durationMs: Date.now() - toolStart,\n })\n } catch (error) {\n // Inject error as tool result — let LLM decide what to do\n const errorMsg = error instanceof Error ? error.message : String(error)\n toolCall.status = 'error'\n toolCall.error = errorMsg\n messages.push(buildMessage({ role: 'tool', content: `Error: ${errorMsg}` }))\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result: `Error: ${errorMsg}`,\n durationMs: Date.now() - toolStart,\n })\n }\n }\n\n // After last iteration with tool calls, if we hit maxSteps next loop will break\n finalContent = accumulatedText\n }\n\n // Save to memory if configured\n if (config.memory) {\n await config.memory.save(messages)\n emitter.emit({ type: 'memory:save', messageCount: messages.length })\n }\n\n return {\n content: finalContent,\n messages,\n steps: step,\n toolCalls: allToolCalls,\n durationMs: Date.now() - startTime,\n }\n } finally {\n await disposeAll()\n }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/delegates.ts","../src/runner.ts","../src/shared-context.ts"],"names":[],"mappings":";;;;;AAGO,SAAS,kBAAA,CACd,WACA,WAAA,EACkB;AAClB,EAAA,OAAO,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,MAAO;AAAA,IACxD,IAAA,EAAM,YAAY,IAAI,CAAA,CAAA;AAAA,IACtB,aAAa,CAAA,2BAAA,EAA8B,IAAI,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,WAAW,CAAA,CAAA;AAAA,IACnF,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,MAAM,EAAE,IAAA,EAAM,UAAU,WAAA,EAAa,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA;AAAG,OACzE;AAAA,MACA,QAAA,EAAU,CAAC,MAAM;AAAA,KACnB;AAAA,IACA,OAAA,EAAS,OAAO,IAAA,KAAkC;AAChD,MAAA,MAAM,SAAS,MAAM,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ,KAAK,IAAc,CAAA;AAClE,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF,CAAE,CAAA;AACJ;;;ACFO,SAAS,cAAc,MAAA,EAAuB;AACnD,EAAA,MAAM,UAAU,kBAAA,EAAmB;AAEnC,EAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG;AAC7C,IAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,CAAA;AAExD,EAAA,eAAe,WAAA,CACb,IAAA,EACA,OAAA,EACA,KAAA,EACoB;AACpB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,MAAA,CAAO,QAAA,IAAY,EAAA;AACzD,IAAA,MAAM,SAAS,OAAA,EAAS,MAAA;AAGxB,IAAA,IAAI,qBAAA,GAAwB,OAAA,EAAS,YAAA,IAAgB,MAAA,CAAO,YAAA,IAAgB,EAAA;AAC5E,IAAA,IAAI,aAAyD,EAAC;AAE9D,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,qBAAA,GAAwB,QAAQ,KAAA,CAAM,YAAA;AACtC,MAAA,MAAM,aAAa,MAAM,cAAA,CAAe,CAAC,OAAA,CAAQ,KAAK,CAAC,CAAA;AACvD,MAAA,UAAA,GAAa,UAAA,CAAW,UAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,UAAU,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,OAAO,UAAU,CAAA;AAGrE,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,GAAI,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,MACzB,GAAI,OAAA,EAAS,SAAA,IAAa;AAAC,KAC7B;AAGA,IAAA,IAAI,OAAO,IAAA,CAAK,eAAe,EAAE,MAAA,GAAS,CAAA,IAAK,QAAQ,kBAAA,EAAoB;AACzE,MAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,QACpB,eAAA;AAAA,QACA,OAAO,IAAA,EAAM,cAAA,EAAgB,YAAA,KAAiB;AAC5C,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,MAAM,YAAA,EAAc,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,CAAA;AACzF,UAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAE/B,UAAA,MAAM,YAAA,GAAe,eAAe,OAAA,GAChC,aAAA,CAAc,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,cAAA,CAAe,OAAA,EAAS,IAC5D,EAAE,GAAA,EAAK,CAAC,CAAA,EAAW,CAAA,KAAmB,YAAY,CAAA,EAAG,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAE;AAEvE,UAAA,MAAM,YAAA,GAA2B;AAAA,YAC/B,OAAO,cAAA,CAAe,KAAA;AAAA,YACtB,OAAO,cAAA,CAAe,KAAA;AAAA,YACtB,QAAA,EAAU,eAAe,QAAA,IAAY,CAAA;AAAA,YACrC,MAAA;AAAA,YACA,eAAe,OAAA,EAAS;AAAA,WAC1B;AAEA,UAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,GAAA,CAAI,cAAc,YAAY,CAAA;AAEhE,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,oBAAA;AAAA,YACN,IAAA;AAAA,YACA,QAAQ,MAAA,CAAO,OAAA;AAAA,YACf,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AAAA,YACzB,OAAO,KAAA,GAAQ;AAAA,WAChB,CAAA;AAED,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,OACF;AACA,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,oBAAoB,OAAO,CAAA;AAG7C,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,QAAA,CAAS,IAAA,CAAK,aAAa,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,qBAAA,EAAuB,CAAC,CAAA;AAAA,IAChF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,aAAa,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAE3D,IAAA,MAAM,eAA2B,EAAC;AAClC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,EAAU;AACtB,QAAA,IAAI,QAAQ,OAAA,EAAS;AAErB,QAAA,IAAA,EAAA;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,QAAQ,IAAA,KAAS,CAAA,GAAI,SAAA,GAAY,kBAAA,EAAoB,CAAA;AAG9F,QAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,SAAA,GAC9B,MAAM,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,IACzD,EAAC;AACL,QAAA,MAAM,gBAAA,GAAmB,yBAAyB,kBAAkB,CAAA;AAEpE,QAAA,MAAM,kBAAkB,gBAAA,GACpB,CAAC,aAAa,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,CAAA;;AAAA,EAA2D,gBAAgB,CAAA,CAAA,EAAI,CAAA,EAAG,GAAG,QAAQ,CAAA,GACtI,QAAA;AAEJ,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B,QAAA,EAAU,eAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,YAAA,EAAc,qBAAA;AAAA,YACd,WAAA,EAAa,OAAA,EAAS,KAAA,EAAO,WAAA,IAAe,MAAA,CAAO,WAAA;AAAA,YACnD,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,KAAA;AAAA,YACA,UAAU,kBAAA,CAAmB,MAAA,GAAS,CAAA,GAAI,EAAE,oBAAmB,GAAI,KAAA;AAAA;AACrE,SACF;AAEA,QAAA,MAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAClD,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,cAAc,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AAEzE,QAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,QAAA,MAAM,gBAA8D,EAAC;AACrE,QAAA,IAAI,WAAA,GAA4B,IAAA;AAEhC,QAAA,MAAM,cAAc,MAAA,EAAQ;AAAA,UAC1B,OAAO,WAAA,EAAa;AAClB,YAAA,eAAA,GAAkB,WAAA;AAAA,UACpB,CAAA;AAAA,UACA,MAAM,WAAW,KAAA,EAAO;AACtB,YAAA,IAAI,MAAM,QAAA,EAAU;AAClB,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAAA,YACjD;AAAA,UACF,CAAA;AAAA,UACA,QAAQ,KAAA,EAAO;AACb,YAAA,WAAA,GAAc,KAAA;AAAA,UAChB,CAAA;AAAA,UACA,OAAO,WAAA,EAAa;AAClB,YAAA,eAAA,GAAkB,WAAA;AAAA,UACpB;AAAA,SACD,CAAA;AAED,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,eAAA;AAAA,UACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SAC1B,CAAA;AAED,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,aAAa,CAAA;AAClD,UAAA,MAAM,WAAA;AAAA,QACR;AAEA,QAAA,IAAI,QAAQ,OAAA,EAAS;AAGrB,QAAA,MAAM,qBAAiC,aAAA,CAAc,GAAA,CAAI,CAAC,EAAE,UAAS,MAAO;AAAA,UAC1E,IAAI,QAAA,CAAU,EAAA;AAAA,UACd,MAAM,QAAA,CAAU,IAAA;AAAA,UAChB,IAAA,EAAM,aAAA,CAAc,QAAA,CAAU,IAAI,CAAA;AAAA,UAClC,MAAA,EAAQ;AAAA,SACV,CAAE,CAAA;AAEF,QAAA,MAAM,mBAAmB,YAAA,CAAa;AAAA,UACpC,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,eAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,UAAA,gBAAA,CAAiB,SAAA,GAAY,kBAAA;AAAA,QAC/B;AACA,QAAA,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAG9B,QAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACnC,UAAA,YAAA,GAAe,eAAA;AACf,UAAA;AAAA,QACF;AAGA,QAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AACzC,UAAA,IAAI,QAAQ,OAAA,EAAS;AAErB,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA;AACtC,UAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAE1B,UAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB;AAAA,YACvC,IAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,EAAS,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS;AAAA,YACpC,OAAA;AAAA,YACA,SAAA;AAAA,YACA,SAAA,EAAW,CAAC,OAAA,KAAY;AAAE,cAAA,QAAA,CAAS,MAAA,GAAS,OAAA;AAAA,YAAQ,CAAA;AAAA,YACpD,WAAW,MAAA,CAAO;AAAA,WACnB,CAAA;AAED,UAAA,QAAA,CAAS,MAAA,GAAS,UAAA,CAAW,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,OAAA;AAClE,UAAA,IAAI,UAAA,CAAW,WAAW,UAAA,EAAY;AACpC,YAAA,QAAA,CAAS,SAAS,UAAA,CAAW,MAAA;AAC7B,YAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,UAAA,CAAW,MAAA,IAAU,EAAA,EAAI,CAAC,CAAA;AAAA,UAChF,CAAA,MAAA,IAAW,UAAA,CAAW,MAAA,KAAW,SAAA,EAAW;AAC1C,YAAA,QAAA,CAAS,MAAA,GAAS,OAAA;AAClB,YAAA,QAAA,CAAS,QAAQ,UAAA,CAAW,MAAA;AAC5B,YAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,UAAA,CAAW,MAAA,IAAU,wBAAA,EAA0B,CAAC,CAAA;AAAA,UACtG,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,QAAQ,UAAA,CAAW,KAAA;AAC5B,YAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,UACrF;AAAA,QACF;AAEA,QAAA,YAAA,GAAe,eAAA;AAAA,MACjB;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACjC,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,eAAe,YAAA,EAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,MACrE;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,QAAA;AAAA,QACA,KAAA,EAAO,IAAA;AAAA,QACP,SAAA,EAAW,YAAA;AAAA,QACX,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC3B;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAM,UAAU,UAAA,EAAW;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,MAAc,OAAA,EAA0C;AAC1D,MAAA,OAAO,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,CAAC,CAAA;AAAA,IACrC;AAAA,GACF;AACF;;;ACnPO,SAAS,oBACd,OAAA,EACe;AACf,EAAA,MAAM,QAAQ,IAAI,GAAA;AAAA,IAChB,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAO,IAAI;AAAC,GACvC;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,EAAK;AAAE,MAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,IAAE,CAAA;AAAA,IACjC,GAAA,CAAI,KAAK,KAAA,EAAO;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IAAE,CAAA;AAAA,IACxC,IAAI,GAAA,EAAK;AAAE,MAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,IAAE,CAAA;AAAA,IACjC,OAAA,GAAU;AAAE,MAAA,OAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,IAAE,CAAA;AAAA,IAC7C,QAAA,GAAW;AACT,MAAA,OAAO;AAAA,QACL,IAAI,GAAA,EAAa;AAAE,UAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,QAAE,CAAA;AAAA,QACzC,IAAI,GAAA,EAAa;AAAE,UAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,QAAE,CAAA;AAAA,QACzC,OAAA,GAAU;AAAE,UAAA,OAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,QAAE;AAAA,OAC/C;AAAA,IACF;AAAA,GACF;AACF","file":"index.js","sourcesContent":["import type { ToolDefinition } from '@agentskit/core'\nimport type { DelegateConfig, RunResult } from './types'\n\nexport function buildDelegateTools(\n delegates: Record<string, DelegateConfig>,\n runDelegate: (name: string, config: DelegateConfig, task: string) => Promise<RunResult>,\n): ToolDefinition[] {\n return Object.entries(delegates).map(([name, config]) => ({\n name: `delegate_${name}`,\n description: `Delegate a subtask to the \"${name}\" agent. ${config.skill.description}`,\n schema: {\n type: 'object' as const,\n properties: {\n task: { type: 'string', description: `The task to delegate to ${name}` },\n },\n required: ['task'],\n },\n execute: async (args: Record<string, unknown>) => {\n const result = await runDelegate(name, config, args.task as string)\n return result.content\n },\n }))\n}\n","import {\n buildMessage,\n consumeStream,\n createEventEmitter,\n safeParseArgs,\n createToolLifecycle,\n formatRetrievedDocuments,\n buildToolMap,\n activateSkills,\n executeSafeTool,\n} from '@agentskit/core'\nimport type {\n AdapterRequest,\n Message,\n StreamChunk,\n ToolCall,\n} from '@agentskit/core'\nimport type { RuntimeConfig, RunOptions, RunResult } from './types'\nimport { buildDelegateTools } from './delegates'\n\nexport function createRuntime(config: RuntimeConfig) {\n const emitter = createEventEmitter()\n\n for (const observer of config.observers ?? []) {\n emitter.addObserver(observer)\n }\n\n const maxDelegationDepth = config.maxDelegationDepth ?? 3\n\n async function runInternal(\n task: string,\n options: RunOptions | undefined,\n depth: number,\n ): Promise<RunResult> {\n const startTime = Date.now()\n\n const maxSteps = options?.maxSteps ?? config.maxSteps ?? 10\n const signal = options?.signal\n\n // Activate skill: use skill's systemPrompt directly, activate tools via shared helper\n let effectiveSystemPrompt = options?.systemPrompt ?? config.systemPrompt ?? ''\n let skillTools: import('@agentskit/core').ToolDefinition[] = []\n\n if (options?.skill) {\n effectiveSystemPrompt = options.skill.systemPrompt\n const activation = await activateSkills([options.skill])\n skillTools = activation.skillTools\n }\n\n // Build tool map using shared helper\n const toolMap = buildToolMap(config.tools, options?.tools, skillTools)\n\n // Merge delegates: config < options (last wins on name collision)\n const mergedDelegates = {\n ...(config.delegates ?? {}),\n ...(options?.delegates ?? {}),\n }\n\n // Generate delegate tools if within depth limit\n if (Object.keys(mergedDelegates).length > 0 && depth < maxDelegationDepth) {\n const delegateTools = buildDelegateTools(\n mergedDelegates,\n async (name, delegateConfig, delegateTask) => {\n emitter.emit({ type: 'agent:delegate:start', name, task: delegateTask, depth: depth + 1 })\n const delegateStart = Date.now()\n\n const childRuntime = delegateConfig.adapter\n ? createRuntime({ ...config, adapter: delegateConfig.adapter })\n : { run: (t: string, o?: RunOptions) => runInternal(t, o, depth + 1) }\n\n const childOptions: RunOptions = {\n skill: delegateConfig.skill,\n tools: delegateConfig.tools,\n maxSteps: delegateConfig.maxSteps ?? 5,\n signal,\n sharedContext: options?.sharedContext,\n }\n\n const result = await childRuntime.run(delegateTask, childOptions)\n\n emitter.emit({\n type: 'agent:delegate:end',\n name,\n result: result.content,\n durationMs: Date.now() - delegateStart,\n depth: depth + 1,\n })\n\n return result\n },\n )\n for (const tool of delegateTools) toolMap.set(tool.name, tool)\n }\n\n const tools = [...toolMap.values()]\n const lifecycle = createToolLifecycle(toolMap)\n\n // Build initial messages\n const messages: Message[] = []\n\n if (effectiveSystemPrompt) {\n messages.push(buildMessage({ role: 'system', content: effectiveSystemPrompt }))\n }\n\n messages.push(buildMessage({ role: 'user', content: task }))\n\n const allToolCalls: ToolCall[] = []\n let step = 0\n let finalContent = ''\n\n try {\n while (step < maxSteps) {\n if (signal?.aborted) break\n\n step++\n emitter.emit({ type: 'agent:step', step, action: step === 1 ? 'initial' : 'tool-result-loop' })\n\n // Retrieve context if configured\n const retrievedDocuments = config.retriever\n ? await config.retriever.retrieve({ query: task, messages })\n : []\n const retrievalContext = formatRetrievedDocuments(retrievedDocuments)\n\n const requestMessages = retrievalContext\n ? [buildMessage({ role: 'system', content: `Use the retrieved context below when it is relevant.\\n\\n${retrievalContext}` }), ...messages]\n : messages\n\n const request: AdapterRequest = {\n messages: requestMessages,\n context: {\n systemPrompt: effectiveSystemPrompt,\n temperature: options?.skill?.temperature ?? config.temperature,\n maxTokens: config.maxTokens,\n tools,\n metadata: retrievedDocuments.length > 0 ? { retrievedDocuments } : undefined,\n },\n }\n\n const streamStart = Date.now()\n const source = config.adapter.createSource(request)\n emitter.emit({ type: 'llm:start', messageCount: request.messages.length })\n\n let accumulatedText = ''\n const stepToolCalls: Array<{ toolCall: StreamChunk['toolCall'] }> = []\n let streamError: Error | null = null\n\n await consumeStream(source, {\n onText(accumulated) {\n accumulatedText = accumulated\n },\n async onToolCall(chunk) {\n if (chunk.toolCall) {\n stepToolCalls.push({ toolCall: chunk.toolCall })\n }\n },\n onError(error) {\n streamError = error\n },\n onDone(accumulated) {\n accumulatedText = accumulated\n },\n })\n\n emitter.emit({\n type: 'llm:end',\n content: accumulatedText,\n durationMs: Date.now() - streamStart,\n })\n\n if (streamError) {\n emitter.emit({ type: 'error', error: streamError })\n throw streamError\n }\n\n if (signal?.aborted) break\n\n // Build assistant message with tool calls\n const assistantToolCalls: ToolCall[] = stepToolCalls.map(({ toolCall }) => ({\n id: toolCall!.id,\n name: toolCall!.name,\n args: safeParseArgs(toolCall!.args),\n status: 'pending' as const,\n }))\n\n const assistantMessage = buildMessage({\n role: 'assistant',\n content: accumulatedText,\n status: 'complete',\n })\n if (assistantToolCalls.length > 0) {\n assistantMessage.toolCalls = assistantToolCalls\n }\n messages.push(assistantMessage)\n\n // No tool calls → agent is done\n if (assistantToolCalls.length === 0) {\n finalContent = accumulatedText\n break\n }\n\n // Execute all tool calls using shared executeSafeTool\n for (const toolCall of assistantToolCalls) {\n if (signal?.aborted) break\n\n const tool = toolMap.get(toolCall.name)\n allToolCalls.push(toolCall)\n\n const execResult = await executeSafeTool({\n tool,\n toolCall,\n context: { messages, call: toolCall },\n emitter,\n lifecycle,\n onPartial: (partial) => { toolCall.result = partial },\n onConfirm: config.onConfirm,\n })\n\n toolCall.status = execResult.status === 'complete' ? 'complete' : 'error'\n if (execResult.status === 'complete') {\n toolCall.result = execResult.result\n messages.push(buildMessage({ role: 'tool', content: execResult.result ?? '' }))\n } else if (execResult.status === 'skipped') {\n toolCall.status = 'error'\n toolCall.error = execResult.result\n messages.push(buildMessage({ role: 'tool', content: execResult.result ?? 'Tool execution skipped' }))\n } else {\n toolCall.error = execResult.error\n messages.push(buildMessage({ role: 'tool', content: `Error: ${execResult.error}` }))\n }\n }\n\n finalContent = accumulatedText\n }\n\n // Save to memory if configured\n if (config.memory) {\n await config.memory.save(messages)\n emitter.emit({ type: 'memory:save', messageCount: messages.length })\n }\n\n return {\n content: finalContent,\n messages,\n steps: step,\n toolCalls: allToolCalls,\n durationMs: Date.now() - startTime,\n }\n } finally {\n await lifecycle.disposeAll()\n }\n }\n\n return {\n run(task: string, options?: RunOptions): Promise<RunResult> {\n return runInternal(task, options, 0)\n },\n }\n}\n","export interface SharedContext {\n get(key: string): unknown\n set(key: string, value: unknown): void\n has(key: string): boolean\n entries(): Record<string, unknown>\n readOnly(): ReadonlySharedContext\n}\n\nexport interface ReadonlySharedContext {\n get(key: string): unknown\n has(key: string): boolean\n entries(): Record<string, unknown>\n}\n\nexport function createSharedContext(\n initial?: Record<string, unknown>,\n): SharedContext {\n const store = new Map<string, unknown>(\n initial ? Object.entries(initial) : [],\n )\n\n return {\n get(key) { return store.get(key) },\n set(key, value) { store.set(key, value) },\n has(key) { return store.has(key) },\n entries() { return Object.fromEntries(store) },\n readOnly() {\n return {\n get(key: string) { return store.get(key) },\n has(key: string) { return store.has(key) },\n entries() { return Object.fromEntries(store) },\n }\n },\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { RuntimeConfig, RunOptions, RunResult } from './types';
2
+ export declare function createRuntime(config: RuntimeConfig): {
3
+ run(task: string, options?: RunOptions): Promise<RunResult>;
4
+ };
5
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEnE,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;cAQ/B,MAAM,YAAY,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;EA6MpE"}
@@ -0,0 +1,27 @@
1
+ import type { AdapterFactory, ChatMemory, Message, Observer, Retriever, SkillDefinition, ToolCall, ToolDefinition } from '@agentskit/core';
2
+ export interface RuntimeConfig {
3
+ adapter: AdapterFactory;
4
+ tools?: ToolDefinition[];
5
+ systemPrompt?: string;
6
+ memory?: ChatMemory;
7
+ retriever?: Retriever;
8
+ observers?: Observer[];
9
+ maxSteps?: number;
10
+ temperature?: number;
11
+ maxTokens?: number;
12
+ }
13
+ export interface RunOptions {
14
+ tools?: ToolDefinition[];
15
+ systemPrompt?: string;
16
+ skill?: SkillDefinition;
17
+ maxSteps?: number;
18
+ signal?: AbortSignal;
19
+ }
20
+ export interface RunResult {
21
+ content: string;
22
+ messages: Message[];
23
+ steps: number;
24
+ toolCalls: ToolCall[];
25
+ durationMs: number;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,OAAO,EACP,QAAQ,EACR,SAAS,EACT,eAAe,EACf,QAAQ,EACR,cAAc,EACf,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,CAAA;IACvB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CACnB"}
package/package.json CHANGED
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "name": "@agentskit/runtime",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Standalone agent runtime with ReAct loop for AgentsKit.",
5
+ "keywords": [
6
+ "agentskit",
7
+ "ai",
8
+ "agents",
9
+ "llm",
10
+ "chat",
11
+ "typescript",
12
+ "runtime",
13
+ "react-loop",
14
+ "orchestration"
15
+ ],
5
16
  "type": "module",
6
17
  "main": "./dist/index.cjs",
7
18
  "module": "./dist/index.js",
@@ -17,12 +28,12 @@
17
28
  "dist"
18
29
  ],
19
30
  "dependencies": {
20
- "@agentskit/core": "0.4.0"
31
+ "@agentskit/core": "0.4.2"
21
32
  },
22
33
  "devDependencies": {
23
- "@types/node": "^24.0.0",
34
+ "@types/node": "^25.5.2",
24
35
  "tsup": "^8.5.0",
25
- "typescript": "^5.9.2",
36
+ "typescript": "^6.0.2",
26
37
  "vitest": "^4.1.2"
27
38
  },
28
39
  "publishConfig": {