@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 +67 -0
- package/dist/index.cjs +218 -167
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -2
- package/dist/index.d.ts +28 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +219 -169
- package/dist/index.js.map +1 -1
- package/dist/runner.d.ts +5 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +15 -4
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
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: "
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":"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","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,
|
|
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,
|
|
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,
|
|
1
|
+
import { createEventEmitter, activateSkills, buildToolMap, createToolLifecycle, buildMessage, formatRetrievedDocuments, consumeStream, safeParseArgs, executeSafeTool } from '@agentskit/core';
|
|
2
2
|
|
|
3
3
|
// src/runner.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
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: "
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
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":"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","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"]}
|
package/dist/runner.d.ts
ADDED
|
@@ -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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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.
|
|
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.
|
|
31
|
+
"@agentskit/core": "0.4.2"
|
|
21
32
|
},
|
|
22
33
|
"devDependencies": {
|
|
23
|
-
"@types/node": "^
|
|
34
|
+
"@types/node": "^25.5.2",
|
|
24
35
|
"tsup": "^8.5.0",
|
|
25
|
-
"typescript": "^
|
|
36
|
+
"typescript": "^6.0.2",
|
|
26
37
|
"vitest": "^4.1.2"
|
|
27
38
|
},
|
|
28
39
|
"publishConfig": {
|