@open-multi-agent/core 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +373 -0
- package/dist/agent/agent.d.ts +153 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +559 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/loop-detector.d.ts +39 -0
- package/dist/agent/loop-detector.d.ts.map +1 -0
- package/dist/agent/loop-detector.js +122 -0
- package/dist/agent/loop-detector.js.map +1 -0
- package/dist/agent/pool.d.ts +158 -0
- package/dist/agent/pool.d.ts.map +1 -0
- package/dist/agent/pool.js +320 -0
- package/dist/agent/pool.js.map +1 -0
- package/dist/agent/runner.d.ts +242 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +943 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/structured-output.d.ts +33 -0
- package/dist/agent/structured-output.d.ts.map +1 -0
- package/dist/agent/structured-output.js +116 -0
- package/dist/agent/structured-output.js.map +1 -0
- package/dist/cli/oma.d.ts +30 -0
- package/dist/cli/oma.d.ts.map +1 -0
- package/dist/cli/oma.js +433 -0
- package/dist/cli/oma.js.map +1 -0
- package/dist/dashboard/layout-tasks.d.ts +23 -0
- package/dist/dashboard/layout-tasks.d.ts.map +1 -0
- package/dist/dashboard/layout-tasks.js +79 -0
- package/dist/dashboard/layout-tasks.js.map +1 -0
- package/dist/dashboard/render-team-run-dashboard.d.ts +11 -0
- package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -0
- package/dist/dashboard/render-team-run-dashboard.js +456 -0
- package/dist/dashboard/render-team-run-dashboard.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/adapter.d.ts +54 -0
- package/dist/llm/adapter.d.ts.map +1 -0
- package/dist/llm/adapter.js +101 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/anthropic.d.ts +57 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +432 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/azure-openai.d.ts +74 -0
- package/dist/llm/azure-openai.d.ts.map +1 -0
- package/dist/llm/azure-openai.js +267 -0
- package/dist/llm/azure-openai.js.map +1 -0
- package/dist/llm/bedrock.d.ts +41 -0
- package/dist/llm/bedrock.d.ts.map +1 -0
- package/dist/llm/bedrock.js +345 -0
- package/dist/llm/bedrock.js.map +1 -0
- package/dist/llm/copilot.d.ts +92 -0
- package/dist/llm/copilot.d.ts.map +1 -0
- package/dist/llm/copilot.js +433 -0
- package/dist/llm/copilot.js.map +1 -0
- package/dist/llm/deepseek.d.ts +21 -0
- package/dist/llm/deepseek.d.ts.map +1 -0
- package/dist/llm/deepseek.js +24 -0
- package/dist/llm/deepseek.js.map +1 -0
- package/dist/llm/gemini.d.ts +65 -0
- package/dist/llm/gemini.d.ts.map +1 -0
- package/dist/llm/gemini.js +427 -0
- package/dist/llm/gemini.js.map +1 -0
- package/dist/llm/grok.d.ts +21 -0
- package/dist/llm/grok.d.ts.map +1 -0
- package/dist/llm/grok.js +24 -0
- package/dist/llm/grok.js.map +1 -0
- package/dist/llm/minimax.d.ts +21 -0
- package/dist/llm/minimax.d.ts.map +1 -0
- package/dist/llm/minimax.js +24 -0
- package/dist/llm/minimax.js.map +1 -0
- package/dist/llm/openai-common.d.ts +65 -0
- package/dist/llm/openai-common.d.ts.map +1 -0
- package/dist/llm/openai-common.js +286 -0
- package/dist/llm/openai-common.js.map +1 -0
- package/dist/llm/openai.d.ts +63 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +256 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/qiniu.d.ts +21 -0
- package/dist/llm/qiniu.d.ts.map +1 -0
- package/dist/llm/qiniu.js +24 -0
- package/dist/llm/qiniu.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +2 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory/shared.d.ts +162 -0
- package/dist/memory/shared.d.ts.map +1 -0
- package/dist/memory/shared.js +294 -0
- package/dist/memory/shared.js.map +1 -0
- package/dist/memory/store.d.ts +72 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +121 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +245 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +1400 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/scheduler.d.ts +112 -0
- package/dist/orchestrator/scheduler.d.ts.map +1 -0
- package/dist/orchestrator/scheduler.js +256 -0
- package/dist/orchestrator/scheduler.js.map +1 -0
- package/dist/task/queue.d.ts +191 -0
- package/dist/task/queue.d.ts.map +1 -0
- package/dist/task/queue.js +408 -0
- package/dist/task/queue.js.map +1 -0
- package/dist/task/task.d.ts +90 -0
- package/dist/task/task.d.ts.map +1 -0
- package/dist/task/task.js +206 -0
- package/dist/task/task.js.map +1 -0
- package/dist/team/messaging.d.ts +106 -0
- package/dist/team/messaging.d.ts.map +1 -0
- package/dist/team/messaging.js +183 -0
- package/dist/team/messaging.js.map +1 -0
- package/dist/team/team.d.ts +141 -0
- package/dist/team/team.d.ts.map +1 -0
- package/dist/team/team.js +293 -0
- package/dist/team/team.js.map +1 -0
- package/dist/tool/built-in/bash.d.ts +12 -0
- package/dist/tool/built-in/bash.d.ts.map +1 -0
- package/dist/tool/built-in/bash.js +133 -0
- package/dist/tool/built-in/bash.js.map +1 -0
- package/dist/tool/built-in/delegate.d.ts +29 -0
- package/dist/tool/built-in/delegate.d.ts.map +1 -0
- package/dist/tool/built-in/delegate.js +92 -0
- package/dist/tool/built-in/delegate.js.map +1 -0
- package/dist/tool/built-in/file-edit.d.ts +14 -0
- package/dist/tool/built-in/file-edit.d.ts.map +1 -0
- package/dist/tool/built-in/file-edit.js +130 -0
- package/dist/tool/built-in/file-edit.js.map +1 -0
- package/dist/tool/built-in/file-read.d.ts +12 -0
- package/dist/tool/built-in/file-read.d.ts.map +1 -0
- package/dist/tool/built-in/file-read.js +82 -0
- package/dist/tool/built-in/file-read.js.map +1 -0
- package/dist/tool/built-in/file-write.d.ts +11 -0
- package/dist/tool/built-in/file-write.d.ts.map +1 -0
- package/dist/tool/built-in/file-write.js +70 -0
- package/dist/tool/built-in/file-write.js.map +1 -0
- package/dist/tool/built-in/fs-walk.d.ts +23 -0
- package/dist/tool/built-in/fs-walk.d.ts.map +1 -0
- package/dist/tool/built-in/fs-walk.js +78 -0
- package/dist/tool/built-in/fs-walk.js.map +1 -0
- package/dist/tool/built-in/glob.d.ts +12 -0
- package/dist/tool/built-in/glob.d.ts.map +1 -0
- package/dist/tool/built-in/glob.js +82 -0
- package/dist/tool/built-in/glob.js.map +1 -0
- package/dist/tool/built-in/grep.d.ts +15 -0
- package/dist/tool/built-in/grep.d.ts.map +1 -0
- package/dist/tool/built-in/grep.js +218 -0
- package/dist/tool/built-in/grep.js.map +1 -0
- package/dist/tool/built-in/index.d.ts +48 -0
- package/dist/tool/built-in/index.d.ts.map +1 -0
- package/dist/tool/built-in/index.js +56 -0
- package/dist/tool/built-in/index.js.map +1 -0
- package/dist/tool/executor.d.ts +100 -0
- package/dist/tool/executor.d.ts.map +1 -0
- package/dist/tool/executor.js +184 -0
- package/dist/tool/executor.js.map +1 -0
- package/dist/tool/framework.d.ts +167 -0
- package/dist/tool/framework.d.ts.map +1 -0
- package/dist/tool/framework.js +402 -0
- package/dist/tool/framework.js.map +1 -0
- package/dist/tool/mcp.d.ts +31 -0
- package/dist/tool/mcp.d.ts.map +1 -0
- package/dist/tool/mcp.js +175 -0
- package/dist/tool/mcp.js.map +1 -0
- package/dist/tool/text-tool-extractor.d.ts +32 -0
- package/dist/tool/text-tool-extractor.d.ts.map +1 -0
- package/dist/tool/text-tool-extractor.js +195 -0
- package/dist/tool/text-tool-extractor.js.map +1 -0
- package/dist/types.d.ts +916 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/keywords.d.ts +18 -0
- package/dist/utils/keywords.d.ts.map +1 -0
- package/dist/utils/keywords.js +32 -0
- package/dist/utils/keywords.js.map +1 -0
- package/dist/utils/semaphore.d.ts +49 -0
- package/dist/utils/semaphore.d.ts.map +1 -0
- package/dist/utils/semaphore.js +89 -0
- package/dist/utils/semaphore.js.map +1 -0
- package/dist/utils/tokens.d.ts +7 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +30 -0
- package/dist/utils/tokens.js.map +1 -0
- package/dist/utils/trace.d.ts +12 -0
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/trace.js +30 -0
- package/dist/utils/trace.js.map +1 -0
- package/docs/DECISIONS.md +49 -0
- package/docs/cli.md +265 -0
- package/docs/context-management.md +24 -0
- package/docs/featured-partner.md +28 -0
- package/docs/observability.md +56 -0
- package/docs/providers.md +78 -0
- package/docs/shared-memory.md +27 -0
- package/docs/tool-configuration.md +152 -0
- package/package.json +96 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Team — the central coordination object for a named group of agents.
|
|
3
|
+
*
|
|
4
|
+
* A {@link Team} owns the agent roster, the inter-agent {@link MessageBus},
|
|
5
|
+
* the {@link TaskQueue}, and (optionally) a {@link SharedMemory} instance.
|
|
6
|
+
* It also exposes a typed event bus so orchestrators can react to lifecycle
|
|
7
|
+
* events without polling.
|
|
8
|
+
*/
|
|
9
|
+
import { SharedMemory } from '../memory/shared.js';
|
|
10
|
+
import { MessageBus } from './messaging.js';
|
|
11
|
+
import { TaskQueue } from '../task/queue.js';
|
|
12
|
+
import { createTask } from '../task/task.js';
|
|
13
|
+
/** Minimal synchronous event emitter. */
|
|
14
|
+
class EventBus {
|
|
15
|
+
listeners = new Map();
|
|
16
|
+
on(event, handler) {
|
|
17
|
+
let map = this.listeners.get(event);
|
|
18
|
+
if (!map) {
|
|
19
|
+
map = new Map();
|
|
20
|
+
this.listeners.set(event, map);
|
|
21
|
+
}
|
|
22
|
+
const id = Symbol();
|
|
23
|
+
map.set(id, handler);
|
|
24
|
+
return () => {
|
|
25
|
+
map.delete(id);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
emit(event, data) {
|
|
29
|
+
const map = this.listeners.get(event);
|
|
30
|
+
if (!map)
|
|
31
|
+
return;
|
|
32
|
+
for (const handler of map.values()) {
|
|
33
|
+
handler(data);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Team
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Coordinates a named group of agents with shared messaging, task queuing,
|
|
42
|
+
* and optional shared memory.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const team = new Team({
|
|
47
|
+
* name: 'research-team',
|
|
48
|
+
* agents: [researcherConfig, writerConfig],
|
|
49
|
+
* sharedMemory: true,
|
|
50
|
+
* maxConcurrency: 2,
|
|
51
|
+
* })
|
|
52
|
+
*
|
|
53
|
+
* team.on('task:complete', (data) => {
|
|
54
|
+
* const event = data as OrchestratorEvent
|
|
55
|
+
* console.log(`Task done: ${event.task}`)
|
|
56
|
+
* })
|
|
57
|
+
*
|
|
58
|
+
* const task = team.addTask({
|
|
59
|
+
* title: 'Research topic',
|
|
60
|
+
* description: 'Gather background on quantum computing',
|
|
61
|
+
* status: 'pending',
|
|
62
|
+
* assignee: 'researcher',
|
|
63
|
+
* })
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export class Team {
|
|
67
|
+
name;
|
|
68
|
+
config;
|
|
69
|
+
agentMap;
|
|
70
|
+
bus;
|
|
71
|
+
queue;
|
|
72
|
+
memory;
|
|
73
|
+
events;
|
|
74
|
+
constructor(config) {
|
|
75
|
+
this.config = config;
|
|
76
|
+
this.name = config.name;
|
|
77
|
+
// Index agents by name for O(1) lookup.
|
|
78
|
+
this.agentMap = new Map(config.agents.map((a) => [a.name, a]));
|
|
79
|
+
this.bus = new MessageBus();
|
|
80
|
+
this.queue = new TaskQueue();
|
|
81
|
+
// Resolve shared memory:
|
|
82
|
+
// - `sharedMemoryStore` takes precedence when present (enables memory regardless of boolean).
|
|
83
|
+
// - `sharedMemory: true` with no custom store → default in-memory store.
|
|
84
|
+
// - otherwise → no shared memory.
|
|
85
|
+
// Use `!== undefined` rather than a truthy check so that malformed falsy
|
|
86
|
+
// values (null, 0, '') still reach SharedMemory's shape validation and
|
|
87
|
+
// fail fast, instead of silently falling back and hiding the config bug.
|
|
88
|
+
this.memory = config.sharedMemoryStore !== undefined
|
|
89
|
+
? new SharedMemory(config.sharedMemoryStore)
|
|
90
|
+
: config.sharedMemory
|
|
91
|
+
? new SharedMemory()
|
|
92
|
+
: undefined;
|
|
93
|
+
this.events = new EventBus();
|
|
94
|
+
// Bridge queue events onto the team's event bus.
|
|
95
|
+
this.queue.on('task:ready', (task) => {
|
|
96
|
+
const event = {
|
|
97
|
+
type: 'task_start',
|
|
98
|
+
task: task.id,
|
|
99
|
+
data: task,
|
|
100
|
+
};
|
|
101
|
+
this.events.emit('task:ready', event);
|
|
102
|
+
});
|
|
103
|
+
this.queue.on('task:complete', (task) => {
|
|
104
|
+
const event = {
|
|
105
|
+
type: 'task_complete',
|
|
106
|
+
task: task.id,
|
|
107
|
+
data: task,
|
|
108
|
+
};
|
|
109
|
+
this.events.emit('task:complete', event);
|
|
110
|
+
});
|
|
111
|
+
this.queue.on('task:failed', (task) => {
|
|
112
|
+
const event = {
|
|
113
|
+
type: 'error',
|
|
114
|
+
task: task.id,
|
|
115
|
+
data: task,
|
|
116
|
+
};
|
|
117
|
+
this.events.emit('task:failed', event);
|
|
118
|
+
});
|
|
119
|
+
this.queue.on('all:complete', () => {
|
|
120
|
+
this.events.emit('all:complete', undefined);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Agent roster
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
/** Returns a shallow copy of the agent configs in registration order. */
|
|
127
|
+
getAgents() {
|
|
128
|
+
return Array.from(this.agentMap.values());
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Looks up an agent by name.
|
|
132
|
+
*
|
|
133
|
+
* @returns The {@link AgentConfig} or `undefined` when the name is not known.
|
|
134
|
+
*/
|
|
135
|
+
getAgent(name) {
|
|
136
|
+
return this.agentMap.get(name);
|
|
137
|
+
}
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// Messaging
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
/**
|
|
142
|
+
* Sends a point-to-point message from `from` to `to`.
|
|
143
|
+
*
|
|
144
|
+
* The message is persisted on the bus and any active subscribers for `to`
|
|
145
|
+
* are notified synchronously.
|
|
146
|
+
*/
|
|
147
|
+
sendMessage(from, to, content) {
|
|
148
|
+
const message = this.bus.send(from, to, content);
|
|
149
|
+
const event = {
|
|
150
|
+
type: 'message',
|
|
151
|
+
agent: from,
|
|
152
|
+
data: message,
|
|
153
|
+
};
|
|
154
|
+
this.events.emit('message', event);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Returns all messages (read or unread) addressed to `agentName`, in
|
|
158
|
+
* chronological order.
|
|
159
|
+
*/
|
|
160
|
+
getMessages(agentName) {
|
|
161
|
+
return this.bus.getAll(agentName);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Broadcasts `content` from `from` to every other agent.
|
|
165
|
+
*
|
|
166
|
+
* The `to` field of the resulting message is `'*'`.
|
|
167
|
+
*/
|
|
168
|
+
broadcast(from, content) {
|
|
169
|
+
const message = this.bus.broadcast(from, content);
|
|
170
|
+
const event = {
|
|
171
|
+
type: 'message',
|
|
172
|
+
agent: from,
|
|
173
|
+
data: message,
|
|
174
|
+
};
|
|
175
|
+
this.events.emit('broadcast', event);
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Task management
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
/**
|
|
181
|
+
* Creates a new task, adds it to the queue, and returns the persisted
|
|
182
|
+
* {@link Task} (with generated `id`, `createdAt`, and `updatedAt`).
|
|
183
|
+
*
|
|
184
|
+
* @param task - Everything except the generated fields.
|
|
185
|
+
*/
|
|
186
|
+
addTask(task) {
|
|
187
|
+
const created = createTask({
|
|
188
|
+
title: task.title,
|
|
189
|
+
description: task.description,
|
|
190
|
+
assignee: task.assignee,
|
|
191
|
+
dependsOn: task.dependsOn ? [...task.dependsOn] : undefined,
|
|
192
|
+
});
|
|
193
|
+
// Preserve any non-default status (e.g. 'blocked') supplied by the caller.
|
|
194
|
+
const finalTask = task.status !== 'pending'
|
|
195
|
+
? { ...created, status: task.status, result: task.result }
|
|
196
|
+
: created;
|
|
197
|
+
this.queue.add(finalTask);
|
|
198
|
+
return finalTask;
|
|
199
|
+
}
|
|
200
|
+
/** Returns a snapshot of all tasks in the queue (any status). */
|
|
201
|
+
getTasks() {
|
|
202
|
+
return this.queue.list();
|
|
203
|
+
}
|
|
204
|
+
/** Returns all tasks whose `assignee` is `agentName`. */
|
|
205
|
+
getTasksByAssignee(agentName) {
|
|
206
|
+
return this.queue.list().filter((t) => t.assignee === agentName);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Applies a partial update to the task identified by `taskId`.
|
|
210
|
+
*
|
|
211
|
+
* @throws {Error} when the task is not found.
|
|
212
|
+
*/
|
|
213
|
+
updateTask(taskId, update) {
|
|
214
|
+
// Extract only mutable fields accepted by the queue.
|
|
215
|
+
const { status, result, assignee } = update;
|
|
216
|
+
return this.queue.update(taskId, {
|
|
217
|
+
...(status !== undefined && { status }),
|
|
218
|
+
...(result !== undefined && { result }),
|
|
219
|
+
...(assignee !== undefined && { assignee }),
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Returns the next `'pending'` task for `agentName`, respecting dependencies.
|
|
224
|
+
*
|
|
225
|
+
* Tries to find a task explicitly assigned to the agent first; falls back to
|
|
226
|
+
* the first unassigned pending task.
|
|
227
|
+
*
|
|
228
|
+
* @returns `undefined` when no ready task exists for this agent.
|
|
229
|
+
*/
|
|
230
|
+
getNextTask(agentName) {
|
|
231
|
+
// Prefer a task explicitly assigned to this agent.
|
|
232
|
+
const assigned = this.queue.next(agentName);
|
|
233
|
+
if (assigned)
|
|
234
|
+
return assigned;
|
|
235
|
+
// Fall back to any unassigned pending task.
|
|
236
|
+
return this.queue.nextAvailable();
|
|
237
|
+
}
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// Memory
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
/**
|
|
242
|
+
* Returns the shared {@link MemoryStore} for this team, or `undefined` if
|
|
243
|
+
* `sharedMemory` was not enabled in {@link TeamConfig}.
|
|
244
|
+
*
|
|
245
|
+
* Note: the returned value satisfies the {@link MemoryStore} interface.
|
|
246
|
+
* Callers that need the full {@link SharedMemory} API can use the
|
|
247
|
+
* `as SharedMemory` cast, but depending on the concrete type is discouraged.
|
|
248
|
+
*/
|
|
249
|
+
getSharedMemory() {
|
|
250
|
+
return this.memory?.getStore();
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Returns the raw {@link SharedMemory} instance (team-internal accessor).
|
|
254
|
+
* Use this when you need the namespacing / `getSummary` features.
|
|
255
|
+
*
|
|
256
|
+
* @internal
|
|
257
|
+
*/
|
|
258
|
+
getSharedMemoryInstance() {
|
|
259
|
+
return this.memory;
|
|
260
|
+
}
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// Events
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
/**
|
|
265
|
+
* Subscribes to a team event.
|
|
266
|
+
*
|
|
267
|
+
* Built-in events:
|
|
268
|
+
* - `'task:ready'` — emitted when a task becomes runnable.
|
|
269
|
+
* - `'task:complete'` — emitted when a task completes successfully.
|
|
270
|
+
* - `'task:failed'` — emitted when a task fails.
|
|
271
|
+
* - `'all:complete'` — emitted when every task in the queue has terminated.
|
|
272
|
+
* - `'message'` — emitted on point-to-point messages.
|
|
273
|
+
* - `'broadcast'` — emitted on broadcast messages.
|
|
274
|
+
*
|
|
275
|
+
* `data` is typed as `unknown`; cast to {@link OrchestratorEvent} for
|
|
276
|
+
* structured access.
|
|
277
|
+
*
|
|
278
|
+
* @returns An unsubscribe function.
|
|
279
|
+
*/
|
|
280
|
+
on(event, handler) {
|
|
281
|
+
return this.events.on(event, handler);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Emits a custom event on the team's event bus.
|
|
285
|
+
*
|
|
286
|
+
* Orchestrators can use this to signal domain-specific lifecycle milestones
|
|
287
|
+
* (e.g. `'phase:research:complete'`) without modifying the Team class.
|
|
288
|
+
*/
|
|
289
|
+
emit(event, data) {
|
|
290
|
+
this.events.emit(event, data);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=team.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/team/team.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in bash tool.
|
|
3
|
+
*
|
|
4
|
+
* Executes a shell command and returns its stdout + stderr. Supports an
|
|
5
|
+
* optional timeout and a custom working directory.
|
|
6
|
+
*/
|
|
7
|
+
export declare const bashTool: import("../framework.js").ToolDefinition<{
|
|
8
|
+
command: string;
|
|
9
|
+
timeout?: number | undefined;
|
|
10
|
+
cwd?: string | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=bash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/bash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,eAAO,MAAM,QAAQ;;;;EAyCnB,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in bash tool.
|
|
3
|
+
*
|
|
4
|
+
* Executes a shell command and returns its stdout + stderr. Supports an
|
|
5
|
+
* optional timeout and a custom working directory.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { defineTool } from '../framework.js';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Constants
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Tool definition
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
export const bashTool = defineTool({
|
|
18
|
+
name: 'bash',
|
|
19
|
+
description: 'Execute a bash command and return its stdout and stderr. ' +
|
|
20
|
+
'Use this for file system operations, running scripts, installing packages, ' +
|
|
21
|
+
'and any task that requires shell access. ' +
|
|
22
|
+
'The command runs in a non-interactive shell (bash -c). ' +
|
|
23
|
+
'Long-running commands should use the timeout parameter.',
|
|
24
|
+
inputSchema: z.object({
|
|
25
|
+
command: z.string().describe('The bash command to execute.'),
|
|
26
|
+
timeout: z
|
|
27
|
+
.number()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe(`Timeout in milliseconds before the command is forcibly killed. ` +
|
|
30
|
+
`Defaults to ${DEFAULT_TIMEOUT_MS} ms.`),
|
|
31
|
+
cwd: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Working directory in which to run the command.'),
|
|
35
|
+
}),
|
|
36
|
+
execute: async (input, context) => {
|
|
37
|
+
const timeoutMs = input.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
38
|
+
const { stdout, stderr, exitCode } = await runCommand(input.command, { cwd: input.cwd, timeoutMs }, context.abortSignal);
|
|
39
|
+
const combined = buildOutput(stdout, stderr, exitCode);
|
|
40
|
+
const isError = exitCode !== 0;
|
|
41
|
+
return {
|
|
42
|
+
data: combined,
|
|
43
|
+
isError,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Spawn a bash subprocess, capture its output, and resolve when it exits or
|
|
49
|
+
* the abort signal fires.
|
|
50
|
+
*/
|
|
51
|
+
function runCommand(command, options, signal) {
|
|
52
|
+
return new Promise((resolve) => {
|
|
53
|
+
const stdoutChunks = [];
|
|
54
|
+
const stderrChunks = [];
|
|
55
|
+
const child = spawn('bash', ['-c', command], {
|
|
56
|
+
cwd: options.cwd,
|
|
57
|
+
env: process.env,
|
|
58
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
59
|
+
});
|
|
60
|
+
child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
|
|
61
|
+
child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
|
|
62
|
+
let timedOut = false;
|
|
63
|
+
let settled = false;
|
|
64
|
+
const done = (exitCode) => {
|
|
65
|
+
if (settled)
|
|
66
|
+
return;
|
|
67
|
+
settled = true;
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
if (signal !== undefined) {
|
|
70
|
+
signal.removeEventListener('abort', onAbort);
|
|
71
|
+
}
|
|
72
|
+
const stdout = Buffer.concat(stdoutChunks).toString('utf8');
|
|
73
|
+
const stderr = Buffer.concat(stderrChunks).toString('utf8');
|
|
74
|
+
resolve({ stdout, stderr, exitCode });
|
|
75
|
+
};
|
|
76
|
+
// Timeout handler
|
|
77
|
+
const timer = setTimeout(() => {
|
|
78
|
+
timedOut = true;
|
|
79
|
+
child.kill('SIGKILL');
|
|
80
|
+
}, options.timeoutMs);
|
|
81
|
+
// Abort-signal handler
|
|
82
|
+
const onAbort = () => {
|
|
83
|
+
child.kill('SIGKILL');
|
|
84
|
+
};
|
|
85
|
+
if (signal !== undefined) {
|
|
86
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
87
|
+
}
|
|
88
|
+
child.on('close', (code) => {
|
|
89
|
+
const exitCode = code ?? (timedOut ? 124 : 1);
|
|
90
|
+
done(exitCode);
|
|
91
|
+
});
|
|
92
|
+
child.on('error', (err) => {
|
|
93
|
+
if (!settled) {
|
|
94
|
+
settled = true;
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
if (signal !== undefined) {
|
|
97
|
+
signal.removeEventListener('abort', onAbort);
|
|
98
|
+
}
|
|
99
|
+
resolve({
|
|
100
|
+
stdout: '',
|
|
101
|
+
stderr: err.message,
|
|
102
|
+
exitCode: 127,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Format captured output into a single readable string.
|
|
110
|
+
* When only stdout is present its content is returned as-is.
|
|
111
|
+
* When stderr is also present both sections are labelled.
|
|
112
|
+
*/
|
|
113
|
+
function buildOutput(stdout, stderr, exitCode) {
|
|
114
|
+
const parts = [];
|
|
115
|
+
if (stdout.length > 0) {
|
|
116
|
+
parts.push(stdout);
|
|
117
|
+
}
|
|
118
|
+
if (stderr.length > 0) {
|
|
119
|
+
parts.push(stdout.length > 0
|
|
120
|
+
? `--- stderr ---\n${stderr}`
|
|
121
|
+
: stderr);
|
|
122
|
+
}
|
|
123
|
+
if (parts.length === 0) {
|
|
124
|
+
return exitCode === 0
|
|
125
|
+
? '(command completed with no output)'
|
|
126
|
+
: `(command exited with code ${exitCode}, no output)`;
|
|
127
|
+
}
|
|
128
|
+
if (exitCode !== 0 && parts.length > 0) {
|
|
129
|
+
parts.push(`\n(exit code: ${exitCode})`);
|
|
130
|
+
}
|
|
131
|
+
return parts.join('\n');
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tool/built-in/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Built-in `delegate_to_agent` tool for synchronous handoff to a roster agent.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import type { ToolDefinition } from '../../types.js';
|
|
6
|
+
declare const inputSchema: z.ZodObject<{
|
|
7
|
+
target_agent: z.ZodString;
|
|
8
|
+
prompt: z.ZodString;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
target_agent: string;
|
|
11
|
+
prompt: string;
|
|
12
|
+
}, {
|
|
13
|
+
target_agent: string;
|
|
14
|
+
prompt: string;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Delegates a sub-task to another agent on the team and returns that agent's final text output.
|
|
18
|
+
*
|
|
19
|
+
* Only available when the orchestrator injects {@link ToolUseContext.team} with
|
|
20
|
+
* `runDelegatedAgent` (pool-backed `runTeam` / `runTasks`). Standalone `runAgent`
|
|
21
|
+
* does not register this tool by default.
|
|
22
|
+
*
|
|
23
|
+
* Nested {@link AgentRunResult.tokenUsage} from the delegated run is surfaced via
|
|
24
|
+
* {@link ToolResult.metadata} so the parent runner can aggregate it into its total
|
|
25
|
+
* (keeps `maxTokenBudget` accurate across delegation chains).
|
|
26
|
+
*/
|
|
27
|
+
export declare const delegateToAgentTool: ToolDefinition<z.infer<typeof inputSchema>>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=delegate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/delegate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,gBAAgB,CAAA;AAEhF,QAAA,MAAM,WAAW;;;;;;;;;EAGf,CAAA;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAqF3E,CAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Built-in `delegate_to_agent` tool for synchronous handoff to a roster agent.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const inputSchema = z.object({
|
|
6
|
+
target_agent: z.string().min(1).describe('Name of the team agent to run the sub-task.'),
|
|
7
|
+
prompt: z.string().min(1).describe('Instructions / question for the target agent.'),
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Delegates a sub-task to another agent on the team and returns that agent's final text output.
|
|
11
|
+
*
|
|
12
|
+
* Only available when the orchestrator injects {@link ToolUseContext.team} with
|
|
13
|
+
* `runDelegatedAgent` (pool-backed `runTeam` / `runTasks`). Standalone `runAgent`
|
|
14
|
+
* does not register this tool by default.
|
|
15
|
+
*
|
|
16
|
+
* Nested {@link AgentRunResult.tokenUsage} from the delegated run is surfaced via
|
|
17
|
+
* {@link ToolResult.metadata} so the parent runner can aggregate it into its total
|
|
18
|
+
* (keeps `maxTokenBudget` accurate across delegation chains).
|
|
19
|
+
*/
|
|
20
|
+
export const delegateToAgentTool = {
|
|
21
|
+
name: 'delegate_to_agent',
|
|
22
|
+
description: 'Run a sub-task on another agent from this team and return that agent\'s final answer as the tool result. ' +
|
|
23
|
+
'Use when you need a specialist teammate to produce output you will incorporate. ' +
|
|
24
|
+
'The target agent runs in a fresh conversation for this prompt only.',
|
|
25
|
+
inputSchema,
|
|
26
|
+
async execute({ target_agent: targetAgent, prompt }, context) {
|
|
27
|
+
const team = context.team;
|
|
28
|
+
if (!team?.runDelegatedAgent) {
|
|
29
|
+
return {
|
|
30
|
+
data: 'delegate_to_agent is only available during orchestrated team runs with the delegation tool enabled. ' +
|
|
31
|
+
'Use SharedMemory or explicit tasks instead.',
|
|
32
|
+
isError: true,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (targetAgent === context.agent.name) {
|
|
36
|
+
return {
|
|
37
|
+
data: 'Cannot delegate to yourself; use another team member.',
|
|
38
|
+
isError: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (!team.agents.includes(targetAgent)) {
|
|
42
|
+
return {
|
|
43
|
+
data: `Unknown agent "${targetAgent}". Roster: ${team.agents.join(', ')}`,
|
|
44
|
+
isError: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const chain = team.delegationChain ?? [];
|
|
48
|
+
if (chain.includes(targetAgent)) {
|
|
49
|
+
return {
|
|
50
|
+
data: `Delegation cycle detected: ${[...chain, targetAgent].join(' -> ')}. ` +
|
|
51
|
+
'Pick a different target or restructure the plan.',
|
|
52
|
+
isError: true,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const depth = team.delegationDepth ?? 0;
|
|
56
|
+
const maxDepth = team.maxDelegationDepth ?? 3;
|
|
57
|
+
if (depth >= maxDepth) {
|
|
58
|
+
return {
|
|
59
|
+
data: `Maximum delegation depth (${maxDepth}) reached; cannot delegate further.`,
|
|
60
|
+
isError: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (team.delegationPool !== undefined && team.delegationPool.availableRunSlots < 1) {
|
|
64
|
+
return {
|
|
65
|
+
data: 'Agent pool has no free concurrency slot for a delegated run (nested run would block indefinitely). ' +
|
|
66
|
+
'Increase orchestrator maxConcurrency, wait for parallel work to finish, or avoid delegating while the pool is saturated.',
|
|
67
|
+
isError: true,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const result = await team.runDelegatedAgent(targetAgent, prompt);
|
|
71
|
+
if (team.sharedMemory) {
|
|
72
|
+
const suffix = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
73
|
+
const key = `delegation:${targetAgent}:${suffix}`;
|
|
74
|
+
try {
|
|
75
|
+
await team.sharedMemory.set(`${context.agent.name}/${key}`, result.output, {
|
|
76
|
+
agent: context.agent.name,
|
|
77
|
+
delegatedTo: targetAgent,
|
|
78
|
+
success: String(result.success),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Audit is best-effort; do not fail the tool on store errors.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
data: result.output,
|
|
87
|
+
isError: !result.success,
|
|
88
|
+
metadata: { tokenUsage: result.tokenUsage },
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=delegate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../../src/tool/built-in/delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in file-edit tool.
|
|
3
|
+
*
|
|
4
|
+
* Performs a targeted string replacement inside an existing file.
|
|
5
|
+
* The uniqueness invariant (one match unless replace_all is set) prevents the
|
|
6
|
+
* common class of bugs where a generic pattern matches the wrong occurrence.
|
|
7
|
+
*/
|
|
8
|
+
export declare const fileEditTool: import("../framework.js").ToolDefinition<{
|
|
9
|
+
path: string;
|
|
10
|
+
old_string: string;
|
|
11
|
+
new_string: string;
|
|
12
|
+
replace_all?: boolean | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=file-edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-edit.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/file-edit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,eAAO,MAAM,YAAY;;;;;EA+FvB,CAAA"}
|