@oni.bot/core 1.0.1 → 1.0.3
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/CHANGELOG.md +146 -126
- package/SECURITY.md +2 -2
- package/dist/agents/context.d.ts +0 -2
- package/dist/agents/context.d.ts.map +1 -1
- package/dist/agents/context.js +1 -3
- package/dist/agents/context.js.map +1 -1
- package/dist/agents/define-agent.d.ts.map +1 -1
- package/dist/agents/define-agent.js +99 -41
- package/dist/agents/define-agent.js.map +1 -1
- package/dist/agents/functional-agent.d.ts.map +1 -1
- package/dist/agents/functional-agent.js +0 -7
- package/dist/agents/functional-agent.js.map +1 -1
- package/dist/agents/types.d.ts +0 -2
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/checkpoint.d.ts.map +1 -1
- package/dist/checkpoint.js +7 -2
- package/dist/checkpoint.js.map +1 -1
- package/dist/checkpointers/postgres.d.ts.map +1 -1
- package/dist/checkpointers/postgres.js +47 -31
- package/dist/checkpointers/postgres.js.map +1 -1
- package/dist/checkpointers/sqlite.js +4 -4
- package/dist/checkpointers/sqlite.js.map +1 -1
- package/dist/circuit-breaker.d.ts +1 -0
- package/dist/circuit-breaker.d.ts.map +1 -1
- package/dist/circuit-breaker.js +13 -0
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/cli/dev.d.ts.map +1 -1
- package/dist/cli/dev.js +0 -1
- package/dist/cli/dev.js.map +1 -1
- package/dist/cli/router.js +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +0 -1
- package/dist/cli/run.js.map +1 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +35 -5
- package/dist/config/loader.js.map +1 -1
- package/dist/context.d.ts +20 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/coordination/pubsub.d.ts +1 -0
- package/dist/coordination/pubsub.d.ts.map +1 -1
- package/dist/coordination/pubsub.js +31 -16
- package/dist/coordination/pubsub.js.map +1 -1
- package/dist/coordination/request-reply.d.ts +7 -0
- package/dist/coordination/request-reply.d.ts.map +1 -1
- package/dist/coordination/request-reply.js +65 -11
- package/dist/coordination/request-reply.js.map +1 -1
- package/dist/events/bus.d.ts +1 -0
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/bus.js +16 -10
- package/dist/events/bus.js.map +1 -1
- package/dist/functional.d.ts.map +1 -1
- package/dist/functional.js +3 -0
- package/dist/functional.js.map +1 -1
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +21 -3
- package/dist/graph.js.map +1 -1
- package/dist/guardrails/audit.d.ts +4 -1
- package/dist/guardrails/audit.d.ts.map +1 -1
- package/dist/guardrails/audit.js +18 -1
- package/dist/guardrails/audit.js.map +1 -1
- package/dist/harness/agent-loop.d.ts.map +1 -1
- package/dist/harness/agent-loop.js +471 -352
- package/dist/harness/agent-loop.js.map +1 -1
- package/dist/harness/context-compactor.d.ts +1 -0
- package/dist/harness/context-compactor.d.ts.map +1 -1
- package/dist/harness/context-compactor.js +43 -1
- package/dist/harness/context-compactor.js.map +1 -1
- package/dist/harness/harness.d.ts +6 -0
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js +32 -5
- package/dist/harness/harness.js.map +1 -1
- package/dist/harness/hooks-engine.d.ts.map +1 -1
- package/dist/harness/hooks-engine.js +12 -10
- package/dist/harness/hooks-engine.js.map +1 -1
- package/dist/harness/index.d.ts +3 -1
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +2 -0
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/memory-loader.d.ts +150 -0
- package/dist/harness/memory-loader.d.ts.map +1 -0
- package/dist/harness/memory-loader.js +714 -0
- package/dist/harness/memory-loader.js.map +1 -0
- package/dist/harness/safety-gate.d.ts.map +1 -1
- package/dist/harness/safety-gate.js +47 -26
- package/dist/harness/safety-gate.js.map +1 -1
- package/dist/harness/skill-loader.d.ts +7 -0
- package/dist/harness/skill-loader.d.ts.map +1 -1
- package/dist/harness/skill-loader.js +24 -8
- package/dist/harness/skill-loader.js.map +1 -1
- package/dist/harness/todo-module.d.ts.map +1 -1
- package/dist/harness/todo-module.js +13 -6
- package/dist/harness/todo-module.js.map +1 -1
- package/dist/harness/types.d.ts +7 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/validate-args.js +18 -3
- package/dist/harness/validate-args.js.map +1 -1
- package/dist/hitl/interrupt.d.ts +2 -2
- package/dist/hitl/interrupt.d.ts.map +1 -1
- package/dist/hitl/interrupt.js +6 -4
- package/dist/hitl/interrupt.js.map +1 -1
- package/dist/hitl/resume.d.ts +10 -0
- package/dist/hitl/resume.d.ts.map +1 -1
- package/dist/hitl/resume.js +31 -0
- package/dist/hitl/resume.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/injected.d.ts.map +1 -1
- package/dist/injected.js.map +1 -1
- package/dist/inspect.d.ts.map +1 -1
- package/dist/inspect.js +28 -8
- package/dist/inspect.js.map +1 -1
- package/dist/lsp/client.d.ts +2 -0
- package/dist/lsp/client.d.ts.map +1 -1
- package/dist/lsp/client.js +62 -17
- package/dist/lsp/client.js.map +1 -1
- package/dist/lsp/index.d.ts.map +1 -1
- package/dist/lsp/index.js.map +1 -1
- package/dist/mcp/client.d.ts +2 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +45 -14
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/convert.js +1 -1
- package/dist/mcp/convert.js.map +1 -1
- package/dist/mcp/transport.d.ts +2 -0
- package/dist/mcp/transport.d.ts.map +1 -1
- package/dist/mcp/transport.js +33 -8
- package/dist/mcp/transport.js.map +1 -1
- package/dist/messages/index.d.ts.map +1 -1
- package/dist/messages/index.js +7 -1
- package/dist/messages/index.js.map +1 -1
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +25 -15
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/google.d.ts.map +1 -1
- package/dist/models/google.js +23 -7
- package/dist/models/google.js.map +1 -1
- package/dist/models/ollama.d.ts.map +1 -1
- package/dist/models/ollama.js +11 -1
- package/dist/models/ollama.js.map +1 -1
- package/dist/models/openai.d.ts.map +1 -1
- package/dist/models/openai.js +15 -3
- package/dist/models/openai.js.map +1 -1
- package/dist/models/openrouter.d.ts.map +1 -1
- package/dist/models/openrouter.js +14 -3
- package/dist/models/openrouter.js.map +1 -1
- package/dist/prebuilt/react-agent.d.ts.map +1 -1
- package/dist/prebuilt/react-agent.js +1 -0
- package/dist/prebuilt/react-agent.js.map +1 -1
- package/dist/pregel.d.ts +11 -6
- package/dist/pregel.d.ts.map +1 -1
- package/dist/pregel.js +473 -349
- package/dist/pregel.js.map +1 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +7 -6
- package/dist/retry.js.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +63 -13
- package/dist/store/index.js.map +1 -1
- package/dist/stream-events.d.ts.map +1 -1
- package/dist/stream-events.js +3 -9
- package/dist/stream-events.js.map +1 -1
- package/dist/streaming.d.ts +5 -2
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +9 -8
- package/dist/streaming.js.map +1 -1
- package/dist/swarm/graph.d.ts +16 -2
- package/dist/swarm/graph.d.ts.map +1 -1
- package/dist/swarm/graph.js +204 -53
- package/dist/swarm/graph.js.map +1 -1
- package/dist/swarm/index.d.ts +2 -1
- package/dist/swarm/index.d.ts.map +1 -1
- package/dist/swarm/index.js.map +1 -1
- package/dist/swarm/mailbox.d.ts.map +1 -1
- package/dist/swarm/mailbox.js +3 -1
- package/dist/swarm/mailbox.js.map +1 -1
- package/dist/swarm/mermaid.d.ts +2 -1
- package/dist/swarm/mermaid.d.ts.map +1 -1
- package/dist/swarm/mermaid.js +6 -3
- package/dist/swarm/mermaid.js.map +1 -1
- package/dist/swarm/pool.d.ts.map +1 -1
- package/dist/swarm/pool.js +30 -5
- package/dist/swarm/pool.js.map +1 -1
- package/dist/swarm/registry.d.ts.map +1 -1
- package/dist/swarm/registry.js +7 -0
- package/dist/swarm/registry.js.map +1 -1
- package/dist/swarm/scaling.d.ts +10 -1
- package/dist/swarm/scaling.d.ts.map +1 -1
- package/dist/swarm/scaling.js +85 -14
- package/dist/swarm/scaling.js.map +1 -1
- package/dist/swarm/snapshot.d.ts.map +1 -1
- package/dist/swarm/snapshot.js +10 -1
- package/dist/swarm/snapshot.js.map +1 -1
- package/dist/swarm/supervisor.js +20 -12
- package/dist/swarm/supervisor.js.map +1 -1
- package/dist/swarm/tracer.d.ts +3 -1
- package/dist/swarm/tracer.d.ts.map +1 -1
- package/dist/swarm/tracer.js +66 -15
- package/dist/swarm/tracer.js.map +1 -1
- package/dist/swarm/types.d.ts +1 -6
- package/dist/swarm/types.d.ts.map +1 -1
- package/dist/testing/index.d.ts +2 -2
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/tools/define.d.ts.map +1 -1
- package/dist/tools/define.js +1 -0
- package/dist/tools/define.js.map +1 -1
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/swarm/graph.ts"],"names":[],"mappings":"AAWA,OAAO,EAAS,GAAG,EAAsC,MAAM,aAAa,CAAC;AAE7E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/swarm/graph.ts"],"names":[],"mappings":"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"}
|
package/dist/swarm/graph.js
CHANGED
|
@@ -38,6 +38,7 @@ export class SwarmGraph {
|
|
|
38
38
|
agentIds = new Set();
|
|
39
39
|
supervisorNodeName = "__supervisor__";
|
|
40
40
|
hasSupervisor = false;
|
|
41
|
+
onErrorPolicy = "fallback";
|
|
41
42
|
_broker;
|
|
42
43
|
_pubsub;
|
|
43
44
|
get broker() {
|
|
@@ -76,6 +77,7 @@ export class SwarmGraph {
|
|
|
76
77
|
deadlineMs: config.supervisor.deadlineMs,
|
|
77
78
|
autoRecover: config.supervisor.autoRecover,
|
|
78
79
|
});
|
|
80
|
+
swarm.onErrorPolicy = config.onError ?? "fallback";
|
|
79
81
|
return swarm;
|
|
80
82
|
}
|
|
81
83
|
// ---- Static factory: fan-out template ----
|
|
@@ -154,6 +156,9 @@ export class SwarmGraph {
|
|
|
154
156
|
* transition (e.g. loop back for review cycles).
|
|
155
157
|
*/
|
|
156
158
|
static pipeline(config) {
|
|
159
|
+
if (config.stages.length === 0) {
|
|
160
|
+
throw new Error("SwarmGraph.pipeline: stages must contain at least one agent.");
|
|
161
|
+
}
|
|
157
162
|
const swarm = new SwarmGraph(config.channels);
|
|
158
163
|
const ids = config.stages.map((a) => a.id);
|
|
159
164
|
for (const agentDef of config.stages) {
|
|
@@ -205,8 +210,11 @@ export class SwarmGraph {
|
|
|
205
210
|
* fan-out via Send, and collect results through a reducer node.
|
|
206
211
|
*/
|
|
207
212
|
static mapReduce(config) {
|
|
208
|
-
const swarm = new SwarmGraph(config.channels);
|
|
209
213
|
const poolSize = config.poolSize ?? 1;
|
|
214
|
+
if (poolSize < 1) {
|
|
215
|
+
throw new Error("SwarmGraph.mapReduce: poolSize must be at least 1.");
|
|
216
|
+
}
|
|
217
|
+
const swarm = new SwarmGraph(config.channels);
|
|
210
218
|
// Register poolSize copies of the mapper agent
|
|
211
219
|
const mapperIds = [];
|
|
212
220
|
for (let i = 0; i < poolSize; i++) {
|
|
@@ -227,15 +235,39 @@ export class SwarmGraph {
|
|
|
227
235
|
});
|
|
228
236
|
// Wiring: START → __splitter__
|
|
229
237
|
swarm.inner.addEdge(START, "__splitter__");
|
|
230
|
-
// __splitter__ → Send to mapper agents
|
|
238
|
+
// __splitter__ → Send to mapper agents using the configured poolStrategy
|
|
231
239
|
const inputField = config.inputField;
|
|
240
|
+
const strategy = config.poolStrategy ?? "round-robin";
|
|
232
241
|
swarm.inner.addConditionalEdges("__splitter__", ((state) => {
|
|
233
242
|
const items = state[inputField];
|
|
234
243
|
if (!Array.isArray(items) || items.length === 0) {
|
|
235
244
|
return "__reducer__";
|
|
236
245
|
}
|
|
246
|
+
// Per-batch assignment counts — used by least-busy strategy
|
|
247
|
+
const assignCounts = new Map(mapperIds.map((id) => [id, 0]));
|
|
237
248
|
return items.map((item, idx) => {
|
|
238
|
-
|
|
249
|
+
let targetId;
|
|
250
|
+
if (strategy === "random") {
|
|
251
|
+
targetId = mapperIds[Math.floor(Math.random() * mapperIds.length)];
|
|
252
|
+
}
|
|
253
|
+
else if (strategy === "least-busy") {
|
|
254
|
+
// Pick the mapper with fewest assignments in this batch so far
|
|
255
|
+
let minCount = Infinity;
|
|
256
|
+
let minId = mapperIds[0];
|
|
257
|
+
for (const id of mapperIds) {
|
|
258
|
+
const c = assignCounts.get(id) ?? 0;
|
|
259
|
+
if (c < minCount) {
|
|
260
|
+
minCount = c;
|
|
261
|
+
minId = id;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
targetId = minId;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
// round-robin (default)
|
|
268
|
+
targetId = mapperIds[idx % mapperIds.length];
|
|
269
|
+
}
|
|
270
|
+
assignCounts.set(targetId, (assignCounts.get(targetId) ?? 0) + 1);
|
|
239
271
|
return new Send(targetId, { ...state, task: String(item) });
|
|
240
272
|
});
|
|
241
273
|
}));
|
|
@@ -254,6 +286,9 @@ export class SwarmGraph {
|
|
|
254
286
|
* and decides whether consensus has been reached.
|
|
255
287
|
*/
|
|
256
288
|
static debate(config) {
|
|
289
|
+
if (config.debaters.length === 0) {
|
|
290
|
+
throw new Error("SwarmGraph.debate: debaters must contain at least one agent.");
|
|
291
|
+
}
|
|
257
292
|
const swarm = new SwarmGraph(config.channels);
|
|
258
293
|
const debaterIds = config.debaters.map((d) => d.id);
|
|
259
294
|
const consensusKeyword = config.judge.consensusKeyword ?? "CONSENSUS";
|
|
@@ -378,15 +413,17 @@ export class SwarmGraph {
|
|
|
378
413
|
});
|
|
379
414
|
}
|
|
380
415
|
const teamSkeleton = teamSwarm.compile();
|
|
381
|
-
// Mount team as a single node in the outer graph
|
|
416
|
+
// Mount team as a single node in the outer graph.
|
|
417
|
+
// Spread all top-level fields from teamResult (including done, context)
|
|
418
|
+
// so they propagate to the outer coordinator state.
|
|
382
419
|
swarm.inner.addNode(teamId, async (state, cfg) => {
|
|
383
420
|
const teamResult = await teamSkeleton.invoke(state, cfg);
|
|
384
421
|
return {
|
|
422
|
+
...teamResult,
|
|
385
423
|
agentResults: {
|
|
386
424
|
...(state.agentResults ?? {}),
|
|
387
425
|
[teamId]: teamResult,
|
|
388
426
|
},
|
|
389
|
-
messages: teamResult.messages ?? [],
|
|
390
427
|
};
|
|
391
428
|
});
|
|
392
429
|
}
|
|
@@ -425,6 +462,22 @@ export class SwarmGraph {
|
|
|
425
462
|
goto: target,
|
|
426
463
|
});
|
|
427
464
|
}
|
|
465
|
+
// Rule-based strategy: evaluate rules in order, route to the first match
|
|
466
|
+
if (config.coordinator.strategy === "rule") {
|
|
467
|
+
const rules = config.coordinator.rules ?? [];
|
|
468
|
+
const task = String(state.task ?? "");
|
|
469
|
+
const ctx = (state.context ?? {});
|
|
470
|
+
for (const rule of rules) {
|
|
471
|
+
if (rule.condition(task, ctx)) {
|
|
472
|
+
return new Command({
|
|
473
|
+
update: { supervisorRound: round + 1, currentAgent: rule.agentId },
|
|
474
|
+
goto: rule.agentId,
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
// No matching rule — done
|
|
479
|
+
return { done: true, supervisorRound: round + 1 };
|
|
480
|
+
}
|
|
428
481
|
return { done: true };
|
|
429
482
|
});
|
|
430
483
|
// Wiring: START → coordinator
|
|
@@ -453,7 +506,6 @@ export class SwarmGraph {
|
|
|
453
506
|
*/
|
|
454
507
|
static race(config) {
|
|
455
508
|
const swarm = new SwarmGraph(config.channels);
|
|
456
|
-
const agentIds = config.agents.map((a) => a.id);
|
|
457
509
|
const accept = config.accept ?? (() => true);
|
|
458
510
|
const timeoutMs = config.timeoutMs;
|
|
459
511
|
// Register agents so they appear in the registry
|
|
@@ -461,37 +513,53 @@ export class SwarmGraph {
|
|
|
461
513
|
swarm.registry.register(agentDef);
|
|
462
514
|
swarm.agentIds.add(agentDef.id);
|
|
463
515
|
}
|
|
464
|
-
// Single node that races all agents
|
|
516
|
+
// Single node that races all agents — resolves as soon as one produces
|
|
517
|
+
// an acceptable result (true Promise.race semantics, not Promise.all).
|
|
465
518
|
swarm.inner.addNode("__race__", async (state, cfg) => {
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
519
|
+
const agentPromises = config.agents.map((agent) => {
|
|
520
|
+
const p = agent.skeleton
|
|
521
|
+
.invoke({ ...state }, { ...cfg, agentId: agent.id })
|
|
522
|
+
.then((result) => ({ id: agent.id, result, error: null }), (err) => ({ id: agent.id, result: null, error: err }));
|
|
523
|
+
if (timeoutMs != null) {
|
|
524
|
+
return Promise.race([
|
|
525
|
+
p,
|
|
526
|
+
new Promise((resolve) => setTimeout(() => resolve({ id: agent.id, result: null, error: new Error("timeout") }), timeoutMs)),
|
|
527
|
+
]);
|
|
473
528
|
}
|
|
529
|
+
return p;
|
|
474
530
|
});
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
]));
|
|
482
|
-
allResults = await Promise.all(timedPromises);
|
|
483
|
-
}
|
|
484
|
-
else {
|
|
485
|
-
allResults = await Promise.all(promises);
|
|
486
|
-
}
|
|
487
|
-
// Find the first acceptable result (in order of agent definition)
|
|
488
|
-
for (const { id, result, error } of allResults) {
|
|
489
|
-
if (!error && accept(result)) {
|
|
490
|
-
return {
|
|
491
|
-
agentResults: { [id]: result },
|
|
492
|
-
context: { ...(state.context ?? {}), raceWinner: id },
|
|
493
|
-
};
|
|
531
|
+
// Resolve as soon as the first acceptable result arrives.
|
|
532
|
+
const winner = await new Promise((resolve) => {
|
|
533
|
+
let remaining = agentPromises.length;
|
|
534
|
+
if (remaining === 0) {
|
|
535
|
+
resolve(null);
|
|
536
|
+
return;
|
|
494
537
|
}
|
|
538
|
+
for (const p of agentPromises) {
|
|
539
|
+
p.then((r) => {
|
|
540
|
+
let accepted = false;
|
|
541
|
+
try {
|
|
542
|
+
accepted = !r.error && accept(r.result);
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
// accept() threw — treat as not accepted to keep remaining decrement working
|
|
546
|
+
}
|
|
547
|
+
if (accepted) {
|
|
548
|
+
resolve(r);
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
remaining--;
|
|
552
|
+
if (remaining === 0)
|
|
553
|
+
resolve(null);
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
if (winner) {
|
|
559
|
+
return {
|
|
560
|
+
agentResults: { [winner.id]: winner.result },
|
|
561
|
+
context: { ...(state.context ?? {}), raceWinner: winner.id },
|
|
562
|
+
};
|
|
495
563
|
}
|
|
496
564
|
// No acceptable result
|
|
497
565
|
return {
|
|
@@ -513,7 +581,7 @@ export class SwarmGraph {
|
|
|
513
581
|
static dag(config) {
|
|
514
582
|
const agentMap = new Map(config.agents.map((a) => [a.id, a]));
|
|
515
583
|
// Validate dependencies
|
|
516
|
-
for (const [
|
|
584
|
+
for (const [_node, deps] of Object.entries(config.dependencies)) {
|
|
517
585
|
for (const dep of deps) {
|
|
518
586
|
if (!agentMap.has(dep)) {
|
|
519
587
|
throw new Error(`Dependency "${dep}" not found in agents list.`);
|
|
@@ -547,8 +615,8 @@ export class SwarmGraph {
|
|
|
547
615
|
}
|
|
548
616
|
// Group agents into layers based on dependencies
|
|
549
617
|
const deps = config.dependencies;
|
|
550
|
-
const
|
|
551
|
-
const
|
|
618
|
+
const _rootIds = config.agents.filter((a) => !deps[a.id]?.length).map((a) => a.id);
|
|
619
|
+
const _nonRootIds = config.agents.filter((a) => deps[a.id]?.length).map((a) => a.id);
|
|
552
620
|
// For DAG execution: use a single orchestrator node
|
|
553
621
|
swarm.inner.addNode("__dag_runner__", async (state, cfg) => {
|
|
554
622
|
const results = {};
|
|
@@ -617,17 +685,37 @@ export class SwarmGraph {
|
|
|
617
685
|
idx,
|
|
618
686
|
targetId: poolIds[idx % poolIds.length],
|
|
619
687
|
}));
|
|
620
|
-
await new Promise((resolve,
|
|
688
|
+
await new Promise((resolve, _reject) => {
|
|
621
689
|
let completed = 0;
|
|
622
690
|
const total = queue.length;
|
|
623
691
|
function processNext() {
|
|
624
692
|
while (running < poolSize && queue.length > 0) {
|
|
625
693
|
const work = queue.shift();
|
|
694
|
+
// Respect removeAgent() — if the assigned slot was removed, redirect
|
|
695
|
+
// to an active pool slot; if none remain, mark the item as failed.
|
|
696
|
+
let agentDef = swarm.registry.getDef(work.targetId);
|
|
697
|
+
if (!agentDef) {
|
|
698
|
+
const activeIds = poolIds.filter((id) => !!swarm.registry.getDef(id));
|
|
699
|
+
if (activeIds.length > 0) {
|
|
700
|
+
work.targetId = activeIds[work.idx % activeIds.length];
|
|
701
|
+
agentDef = swarm.registry.getDef(work.targetId);
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
results[`item_${work.idx}`] = { _error: `Pool slot removed; no active agents remain` };
|
|
705
|
+
completed++;
|
|
706
|
+
if (completed === total)
|
|
707
|
+
resolve();
|
|
708
|
+
continue;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
626
711
|
running++;
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
const
|
|
630
|
-
|
|
712
|
+
// Use the full wrapped agentNode (hooks, retries, timeout) stored
|
|
713
|
+
// by addAgent() in swarm.inner.nodes rather than raw skeleton.invoke.
|
|
714
|
+
const wrappedFn = swarm.inner.nodes.get(work.targetId)?.fn;
|
|
715
|
+
const invocation = wrappedFn
|
|
716
|
+
? wrappedFn({ ...state, task: String(work.item) }, { ...cfg, agentId: work.targetId })
|
|
717
|
+
: agentDef.skeleton.invoke({ ...state, task: String(work.item) }, { ...cfg, agentId: work.targetId });
|
|
718
|
+
invocation.then((result) => {
|
|
631
719
|
results[`item_${work.idx}`] = result;
|
|
632
720
|
running--;
|
|
633
721
|
completed++;
|
|
@@ -665,6 +753,9 @@ export class SwarmGraph {
|
|
|
665
753
|
* Each stage runs a compiled sub-swarm, passing state through.
|
|
666
754
|
*/
|
|
667
755
|
static compose(config) {
|
|
756
|
+
if (config.stages.length === 0) {
|
|
757
|
+
throw new Error("SwarmGraph.compose: stages must contain at least one sub-swarm.");
|
|
758
|
+
}
|
|
668
759
|
const swarm = new SwarmGraph(config.channels);
|
|
669
760
|
const stageIds = config.stages.map((s) => s.id);
|
|
670
761
|
for (const stage of config.stages) {
|
|
@@ -774,7 +865,6 @@ export class SwarmGraph {
|
|
|
774
865
|
[def.id]: result,
|
|
775
866
|
},
|
|
776
867
|
handoffHistory: [
|
|
777
|
-
...(state.handoffHistory ?? []),
|
|
778
868
|
{
|
|
779
869
|
from: def.id,
|
|
780
870
|
to: "__completed__",
|
|
@@ -787,7 +877,6 @@ export class SwarmGraph {
|
|
|
787
877
|
}
|
|
788
878
|
catch (err) {
|
|
789
879
|
lastError = err;
|
|
790
|
-
this.registry.markError(def.id);
|
|
791
880
|
if (attempt < maxRetries) {
|
|
792
881
|
// Backoff delay between retries — clamped to remaining deadline
|
|
793
882
|
if (retryDelayMs > 0) {
|
|
@@ -805,7 +894,8 @@ export class SwarmGraph {
|
|
|
805
894
|
}
|
|
806
895
|
}
|
|
807
896
|
}
|
|
808
|
-
// All retries exhausted — fire onError hook
|
|
897
|
+
// All retries exhausted — mark error once, then fire onError hook
|
|
898
|
+
this.registry.markError(def.id);
|
|
809
899
|
await def.hooks?.onError?.(def.id, lastError);
|
|
810
900
|
// Keep agent in error status (don't reset to idle)
|
|
811
901
|
// Build structured error context
|
|
@@ -814,7 +904,7 @@ export class SwarmGraph {
|
|
|
814
904
|
errStr.includes("model") ? "model_error" :
|
|
815
905
|
errStr.includes("tool") ? "tool_error" :
|
|
816
906
|
"unknown";
|
|
817
|
-
if (this.hasSupervisor) {
|
|
907
|
+
if (this.hasSupervisor && this.onErrorPolicy !== "throw") {
|
|
818
908
|
return new Command({
|
|
819
909
|
update: {
|
|
820
910
|
context: {
|
|
@@ -831,7 +921,7 @@ export class SwarmGraph {
|
|
|
831
921
|
goto: this.supervisorNodeName,
|
|
832
922
|
});
|
|
833
923
|
}
|
|
834
|
-
// No supervisor — rethrow
|
|
924
|
+
// No supervisor, or onError: "throw" — rethrow
|
|
835
925
|
throw lastError;
|
|
836
926
|
};
|
|
837
927
|
this.inner.addNode(def.id, agentNode);
|
|
@@ -895,8 +985,12 @@ export class SwarmGraph {
|
|
|
895
985
|
if (edge.type === "static") {
|
|
896
986
|
edgeTargets.add(edge.to);
|
|
897
987
|
}
|
|
898
|
-
// Conditional edges
|
|
899
|
-
|
|
988
|
+
// Conditional edges also declare a reachable target
|
|
989
|
+
if (edge.type === "conditional" && edge.pathMap) {
|
|
990
|
+
for (const target of Object.values(edge.pathMap)) {
|
|
991
|
+
edgeTargets.add(target);
|
|
992
|
+
}
|
|
993
|
+
}
|
|
900
994
|
}
|
|
901
995
|
for (const agentId of this.agentIds) {
|
|
902
996
|
if (!edgeTargets.has(agentId)) {
|
|
@@ -922,21 +1016,51 @@ export class SwarmGraph {
|
|
|
922
1016
|
// ---- Compile ----
|
|
923
1017
|
compile(opts = {}) {
|
|
924
1018
|
const skeleton = this.inner.compile({
|
|
925
|
-
...(opts.checkpointer ? { checkpointer: opts.checkpointer } : {}),
|
|
926
|
-
...(opts.interruptBefore ? { interruptBefore: opts.interruptBefore } : {}),
|
|
927
|
-
...(opts.interruptAfter ? { interruptAfter: opts.interruptAfter } : {}),
|
|
1019
|
+
...(opts.checkpointer !== undefined ? { checkpointer: opts.checkpointer } : {}),
|
|
1020
|
+
...(opts.interruptBefore !== undefined ? { interruptBefore: opts.interruptBefore } : {}),
|
|
1021
|
+
...(opts.interruptAfter !== undefined ? { interruptAfter: opts.interruptAfter } : {}),
|
|
1022
|
+
...(opts.store !== undefined ? { store: opts.store } : {}),
|
|
1023
|
+
...(opts.guardrails !== undefined ? { guardrails: opts.guardrails } : {}),
|
|
1024
|
+
...(opts.listeners !== undefined ? { listeners: opts.listeners } : {}),
|
|
1025
|
+
...(opts.defaults !== undefined ? { defaults: opts.defaults } : {}),
|
|
1026
|
+
...(opts.deadLetterQueue !== undefined ? { deadLetterQueue: opts.deadLetterQueue } : {}),
|
|
1027
|
+
...(opts.tracer !== undefined ? { tracer: opts.tracer } : {}),
|
|
928
1028
|
});
|
|
929
1029
|
const registry = this.registry;
|
|
930
1030
|
const inner = this.inner;
|
|
931
1031
|
const hasSupervisor = this.hasSupervisor;
|
|
932
1032
|
const supervisorNodeName = this.supervisorNodeName;
|
|
933
|
-
const self = this;
|
|
934
1033
|
// Attach swarm-specific extensions
|
|
935
1034
|
const extensions = {
|
|
936
1035
|
registry,
|
|
937
1036
|
agentStats: () => registry.stats(),
|
|
938
|
-
toMermaid: () =>
|
|
1037
|
+
toMermaid: () => {
|
|
1038
|
+
// Read from the live runner's edge map so the diagram reflects
|
|
1039
|
+
// agents added/removed via spawnAgent()/removeAgent() after compile.
|
|
1040
|
+
const runner = skeleton._runner;
|
|
1041
|
+
const edgesBySource = runner?._edgesBySource;
|
|
1042
|
+
if (!edgesBySource)
|
|
1043
|
+
return inner.toMermaid(); // safe fallback
|
|
1044
|
+
const lines = ["graph TD"];
|
|
1045
|
+
for (const [from, edges] of edgesBySource) {
|
|
1046
|
+
for (const edge of edges) {
|
|
1047
|
+
if (edge.type === "static" && edge.to !== undefined) {
|
|
1048
|
+
lines.push(` ${from} --> ${edge.to}`);
|
|
1049
|
+
}
|
|
1050
|
+
else {
|
|
1051
|
+
lines.push(` ${from} -->|?| conditional_${from}`);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
return lines.join("\n");
|
|
1056
|
+
},
|
|
939
1057
|
spawnAgent(def) {
|
|
1058
|
+
// spawnAgent requires a supervisor to route the spawned agent back into the graph.
|
|
1059
|
+
// In unsupervised topologies there is no return path, so the agent would never execute.
|
|
1060
|
+
if (!hasSupervisor) {
|
|
1061
|
+
throw new Error(`spawnAgent() requires a supervisor node. ` +
|
|
1062
|
+
`Use SwarmGraph.hierarchical() to add a supervisor, or call addAgent() before compile() for static topologies.`);
|
|
1063
|
+
}
|
|
940
1064
|
// Register in the registry
|
|
941
1065
|
registry.register(def);
|
|
942
1066
|
// Create the agent node function (same logic as addAgent)
|
|
@@ -977,9 +1101,36 @@ export class SwarmGraph {
|
|
|
977
1101
|
if (runner?.nodes) {
|
|
978
1102
|
runner.nodes.set(def.id, { name: def.id, fn: agentNode });
|
|
979
1103
|
}
|
|
1104
|
+
// In supervised swarms, add a conditional return edge so the runner
|
|
1105
|
+
// knows to send this agent's output back to the supervisor (or END).
|
|
1106
|
+
if (hasSupervisor && runner) {
|
|
1107
|
+
const returnEdge = {
|
|
1108
|
+
type: "conditional",
|
|
1109
|
+
from: def.id,
|
|
1110
|
+
condition: (st) => st.done ? END : supervisorNodeName,
|
|
1111
|
+
};
|
|
1112
|
+
const edgesBySource = runner._edgesBySource;
|
|
1113
|
+
const list = edgesBySource.get(def.id) ?? [];
|
|
1114
|
+
list.push(returnEdge);
|
|
1115
|
+
edgesBySource.set(def.id, list);
|
|
1116
|
+
}
|
|
980
1117
|
},
|
|
981
1118
|
removeAgent(agentId) {
|
|
982
1119
|
registry.deregister(agentId);
|
|
1120
|
+
const runner = skeleton._runner;
|
|
1121
|
+
if (runner?.nodes)
|
|
1122
|
+
runner.nodes.delete(agentId);
|
|
1123
|
+
// Remove stale edges pointing TO the removed agent so Pregel doesn't try to route to it.
|
|
1124
|
+
// Also remove edges FROM the agent (it won't execute, but keeps _edgesBySource clean).
|
|
1125
|
+
if (runner?._edgesBySource) {
|
|
1126
|
+
const edgesBySource = runner._edgesBySource;
|
|
1127
|
+
for (const [from, edges] of edgesBySource) {
|
|
1128
|
+
const filtered = edges.filter((e) => !(e.type === "static" && e.to === agentId));
|
|
1129
|
+
if (filtered.length !== edges.length)
|
|
1130
|
+
edgesBySource.set(from, filtered);
|
|
1131
|
+
}
|
|
1132
|
+
edgesBySource.delete(agentId);
|
|
1133
|
+
}
|
|
983
1134
|
},
|
|
984
1135
|
};
|
|
985
1136
|
return Object.assign(skeleton, extensions);
|