@oni.bot/core 0.6.1
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 +308 -0
- package/dist/agents/context.d.ts +24 -0
- package/dist/agents/context.d.ts.map +1 -0
- package/dist/agents/context.js +93 -0
- package/dist/agents/context.js.map +1 -0
- package/dist/agents/define-agent.d.ts +10 -0
- package/dist/agents/define-agent.d.ts.map +1 -0
- package/dist/agents/define-agent.js +121 -0
- package/dist/agents/define-agent.js.map +1 -0
- package/dist/agents/functional-agent.d.ts +12 -0
- package/dist/agents/functional-agent.d.ts.map +1 -0
- package/dist/agents/functional-agent.js +115 -0
- package/dist/agents/functional-agent.js.map +1 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +7 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/types.d.ts +62 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/checkpoint.d.ts +27 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +91 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/checkpointers/index.d.ts +4 -0
- package/dist/checkpointers/index.d.ts.map +1 -0
- package/dist/checkpointers/index.js +5 -0
- package/dist/checkpointers/index.js.map +1 -0
- package/dist/checkpointers/namespaced.d.ts +12 -0
- package/dist/checkpointers/namespaced.d.ts.map +1 -0
- package/dist/checkpointers/namespaced.js +37 -0
- package/dist/checkpointers/namespaced.js.map +1 -0
- package/dist/checkpointers/postgres.d.ts +13 -0
- package/dist/checkpointers/postgres.d.ts.map +1 -0
- package/dist/checkpointers/postgres.js +100 -0
- package/dist/checkpointers/postgres.js.map +1 -0
- package/dist/checkpointers/sqlite.d.ts +14 -0
- package/dist/checkpointers/sqlite.d.ts.map +1 -0
- package/dist/checkpointers/sqlite.js +98 -0
- package/dist/checkpointers/sqlite.js.map +1 -0
- package/dist/context.d.ts +24 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +47 -0
- package/dist/context.js.map +1 -0
- package/dist/coordination/index.d.ts +3 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +3 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/pubsub.d.ts +38 -0
- package/dist/coordination/pubsub.d.ts.map +1 -0
- package/dist/coordination/pubsub.js +73 -0
- package/dist/coordination/pubsub.js.map +1 -0
- package/dist/coordination/request-reply.d.ts +40 -0
- package/dist/coordination/request-reply.d.ts.map +1 -0
- package/dist/coordination/request-reply.js +77 -0
- package/dist/coordination/request-reply.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/bus.d.ts +13 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +52 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +87 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +2 -0
- package/dist/events/types.js.map +1 -0
- package/dist/functional.d.ts +36 -0
- package/dist/functional.d.ts.map +1 -0
- package/dist/functional.js +103 -0
- package/dist/functional.js.map +1 -0
- package/dist/graph.d.ts +74 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +119 -0
- package/dist/graph.js.map +1 -0
- package/dist/guardrails/audit.d.ts +13 -0
- package/dist/guardrails/audit.d.ts.map +1 -0
- package/dist/guardrails/audit.js +31 -0
- package/dist/guardrails/audit.js.map +1 -0
- package/dist/guardrails/budget.d.ts +30 -0
- package/dist/guardrails/budget.d.ts.map +1 -0
- package/dist/guardrails/budget.js +154 -0
- package/dist/guardrails/budget.js.map +1 -0
- package/dist/guardrails/filters.d.ts +24 -0
- package/dist/guardrails/filters.d.ts.map +1 -0
- package/dist/guardrails/filters.js +87 -0
- package/dist/guardrails/filters.js.map +1 -0
- package/dist/guardrails/index.d.ts +8 -0
- package/dist/guardrails/index.d.ts.map +1 -0
- package/dist/guardrails/index.js +9 -0
- package/dist/guardrails/index.js.map +1 -0
- package/dist/guardrails/permissions.d.ts +9 -0
- package/dist/guardrails/permissions.d.ts.map +1 -0
- package/dist/guardrails/permissions.js +29 -0
- package/dist/guardrails/permissions.js.map +1 -0
- package/dist/guardrails/types.d.ts +30 -0
- package/dist/guardrails/types.d.ts.map +1 -0
- package/dist/guardrails/types.js +2 -0
- package/dist/guardrails/types.js.map +1 -0
- package/dist/hitl/index.d.ts +5 -0
- package/dist/hitl/index.d.ts.map +1 -0
- package/dist/hitl/index.js +3 -0
- package/dist/hitl/index.js.map +1 -0
- package/dist/hitl/interrupt.d.ts +81 -0
- package/dist/hitl/interrupt.d.ts.map +1 -0
- package/dist/hitl/interrupt.js +116 -0
- package/dist/hitl/interrupt.js.map +1 -0
- package/dist/hitl/resume.d.ts +33 -0
- package/dist/hitl/resume.d.ts.map +1 -0
- package/dist/hitl/resume.js +72 -0
- package/dist/hitl/resume.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/injected.d.ts +26 -0
- package/dist/injected.d.ts.map +1 -0
- package/dist/injected.js +25 -0
- package/dist/injected.js.map +1 -0
- package/dist/inspect.d.ts +31 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +139 -0
- package/dist/inspect.js.map +1 -0
- package/dist/messages/index.d.ts +66 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +123 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/models/anthropic.d.ts +6 -0
- package/dist/models/anthropic.d.ts.map +1 -0
- package/dist/models/anthropic.js +317 -0
- package/dist/models/anthropic.js.map +1 -0
- package/dist/models/google.d.ts +3 -0
- package/dist/models/google.d.ts.map +1 -0
- package/dist/models/google.js +310 -0
- package/dist/models/google.js.map +1 -0
- package/dist/models/index.d.ts +6 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +5 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/ollama.d.ts +7 -0
- package/dist/models/ollama.d.ts.map +1 -0
- package/dist/models/ollama.js +205 -0
- package/dist/models/ollama.js.map +1 -0
- package/dist/models/openai.d.ts +3 -0
- package/dist/models/openai.d.ts.map +1 -0
- package/dist/models/openai.js +331 -0
- package/dist/models/openai.js.map +1 -0
- package/dist/models/types.d.ts +77 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +2 -0
- package/dist/models/types.js.map +1 -0
- package/dist/prebuilt/index.d.ts +5 -0
- package/dist/prebuilt/index.d.ts.map +1 -0
- package/dist/prebuilt/index.js +4 -0
- package/dist/prebuilt/index.js.map +1 -0
- package/dist/prebuilt/react-agent.d.ts +35 -0
- package/dist/prebuilt/react-agent.d.ts.map +1 -0
- package/dist/prebuilt/react-agent.js +55 -0
- package/dist/prebuilt/react-agent.js.map +1 -0
- package/dist/prebuilt/tool-node.d.ts +15 -0
- package/dist/prebuilt/tool-node.d.ts.map +1 -0
- package/dist/prebuilt/tool-node.js +61 -0
- package/dist/prebuilt/tool-node.js.map +1 -0
- package/dist/pregel.d.ts +48 -0
- package/dist/pregel.d.ts.map +1 -0
- package/dist/pregel.js +583 -0
- package/dist/pregel.js.map +1 -0
- package/dist/retry.d.ts +3 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +40 -0
- package/dist/retry.js.map +1 -0
- package/dist/store/index.d.ts +90 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +214 -0
- package/dist/store/index.js.map +1 -0
- package/dist/stream-events.d.ts +15 -0
- package/dist/stream-events.d.ts.map +1 -0
- package/dist/stream-events.js +53 -0
- package/dist/stream-events.js.map +1 -0
- package/dist/streaming.d.ts +56 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +143 -0
- package/dist/streaming.js.map +1 -0
- package/dist/swarm/graph.d.ts +184 -0
- package/dist/swarm/graph.d.ts.map +1 -0
- package/dist/swarm/graph.js +534 -0
- package/dist/swarm/graph.js.map +1 -0
- package/dist/swarm/index.d.ts +11 -0
- package/dist/swarm/index.d.ts.map +1 -0
- package/dist/swarm/index.js +10 -0
- package/dist/swarm/index.js.map +1 -0
- package/dist/swarm/mailbox.d.ts +12 -0
- package/dist/swarm/mailbox.d.ts.map +1 -0
- package/dist/swarm/mailbox.js +36 -0
- package/dist/swarm/mailbox.js.map +1 -0
- package/dist/swarm/pool.d.ts +27 -0
- package/dist/swarm/pool.d.ts.map +1 -0
- package/dist/swarm/pool.js +87 -0
- package/dist/swarm/pool.js.map +1 -0
- package/dist/swarm/registry.d.ts +37 -0
- package/dist/swarm/registry.d.ts.map +1 -0
- package/dist/swarm/registry.js +115 -0
- package/dist/swarm/registry.js.map +1 -0
- package/dist/swarm/supervisor.d.ts +18 -0
- package/dist/swarm/supervisor.d.ts.map +1 -0
- package/dist/swarm/supervisor.js +117 -0
- package/dist/swarm/supervisor.js.map +1 -0
- package/dist/swarm/types.d.ts +111 -0
- package/dist/swarm/types.d.ts.map +1 -0
- package/dist/swarm/types.js +16 -0
- package/dist/swarm/types.js.map +1 -0
- package/dist/tools/define.d.ts +14 -0
- package/dist/tools/define.d.ts.map +1 -0
- package/dist/tools/define.js +39 -0
- package/dist/tools/define.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +23 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types.d.ts +204 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @oni.bot/core/swarm — SwarmGraph
|
|
3
|
+
// ============================================================
|
|
4
|
+
// Extends StateGraph with swarm-aware primitives:
|
|
5
|
+
// - addAgent() register an agent as a node
|
|
6
|
+
// - addSupervisor() mount supervisor routing node
|
|
7
|
+
// - addHandoffEdge() explicit agent-to-agent wires
|
|
8
|
+
// - compile() returns a full ONISkeleton
|
|
9
|
+
// ============================================================
|
|
10
|
+
import { StateGraph } from "../graph.js";
|
|
11
|
+
import { START, END, appendList, lastValue, mergeObject } from "../types.js";
|
|
12
|
+
import { Command, Send } from "../types.js";
|
|
13
|
+
import { Handoff } from "./types.js";
|
|
14
|
+
import { AgentRegistry } from "./registry.js";
|
|
15
|
+
import { createSupervisorNode } from "./supervisor.js";
|
|
16
|
+
import { getInbox } from "./mailbox.js";
|
|
17
|
+
import { RequestReplyBroker } from "../coordination/request-reply.js";
|
|
18
|
+
import { PubSub } from "../coordination/pubsub.js";
|
|
19
|
+
export const baseSwarmChannels = {
|
|
20
|
+
task: lastValue(() => ""),
|
|
21
|
+
context: mergeObject(() => ({})),
|
|
22
|
+
agentResults: mergeObject(() => ({})),
|
|
23
|
+
messages: appendList(() => []),
|
|
24
|
+
swarmMessages: appendList(() => []),
|
|
25
|
+
supervisorRound: lastValue(() => 0),
|
|
26
|
+
currentAgent: lastValue(() => null),
|
|
27
|
+
done: lastValue(() => false),
|
|
28
|
+
handoffHistory: appendList(() => []),
|
|
29
|
+
};
|
|
30
|
+
// ----------------------------------------------------------------
|
|
31
|
+
// SwarmGraph
|
|
32
|
+
// ----------------------------------------------------------------
|
|
33
|
+
export class SwarmGraph {
|
|
34
|
+
inner;
|
|
35
|
+
registry;
|
|
36
|
+
channels;
|
|
37
|
+
agentIds = new Set();
|
|
38
|
+
supervisorNodeName = "__supervisor__";
|
|
39
|
+
hasSupervisor = false;
|
|
40
|
+
_broker;
|
|
41
|
+
_pubsub;
|
|
42
|
+
get broker() {
|
|
43
|
+
return this._broker ??= new RequestReplyBroker();
|
|
44
|
+
}
|
|
45
|
+
get pubsub() {
|
|
46
|
+
return this._pubsub ??= new PubSub();
|
|
47
|
+
}
|
|
48
|
+
constructor(channels) {
|
|
49
|
+
this.channels = {
|
|
50
|
+
...baseSwarmChannels,
|
|
51
|
+
...(channels ?? {}),
|
|
52
|
+
};
|
|
53
|
+
this.inner = new StateGraph({ channels: this.channels });
|
|
54
|
+
this.registry = new AgentRegistry();
|
|
55
|
+
}
|
|
56
|
+
// ---- Static factory: hierarchical template ----
|
|
57
|
+
/**
|
|
58
|
+
* Create a complete supervisor-workers swarm from a config object.
|
|
59
|
+
* Registers all agents, wires a supervisor node, and returns the
|
|
60
|
+
* ready-to-compile SwarmGraph.
|
|
61
|
+
*/
|
|
62
|
+
static hierarchical(config) {
|
|
63
|
+
const swarm = new SwarmGraph(config.channels);
|
|
64
|
+
for (const agentDef of config.agents) {
|
|
65
|
+
swarm.addAgent(agentDef);
|
|
66
|
+
}
|
|
67
|
+
swarm.addSupervisor({
|
|
68
|
+
model: config.supervisor.model,
|
|
69
|
+
strategy: config.supervisor.strategy,
|
|
70
|
+
taskField: "task",
|
|
71
|
+
contextField: "context",
|
|
72
|
+
rules: config.supervisor.rules,
|
|
73
|
+
systemPrompt: config.supervisor.systemPrompt,
|
|
74
|
+
maxRounds: config.supervisor.maxRounds,
|
|
75
|
+
});
|
|
76
|
+
return swarm;
|
|
77
|
+
}
|
|
78
|
+
// ---- Static factory: fan-out template ----
|
|
79
|
+
/**
|
|
80
|
+
* Create a fan-out swarm that runs all agents in parallel via Send
|
|
81
|
+
* and collects results through a reducer node.
|
|
82
|
+
*/
|
|
83
|
+
static fanOut(config) {
|
|
84
|
+
const swarm = new SwarmGraph(config.channels);
|
|
85
|
+
for (const agentDef of config.agents) {
|
|
86
|
+
swarm.addAgent(agentDef);
|
|
87
|
+
}
|
|
88
|
+
// Fan-out node: passthrough that triggers conditional edges with Send
|
|
89
|
+
const agentIds = config.agents.map((a) => a.id);
|
|
90
|
+
swarm.inner.addNode("__fanout__", (_state) => {
|
|
91
|
+
// No state mutation — the conditional edge handles fan-out via Send
|
|
92
|
+
return {};
|
|
93
|
+
});
|
|
94
|
+
// Reducer node: collects agentResults and applies user reducer
|
|
95
|
+
swarm.inner.addNode("__reducer__", (state) => {
|
|
96
|
+
return config.reducer(state.agentResults ?? {});
|
|
97
|
+
});
|
|
98
|
+
// Wiring: START → __fanout__
|
|
99
|
+
swarm.inner.addEdge(START, "__fanout__");
|
|
100
|
+
// __fanout__ → Send to all agents in parallel
|
|
101
|
+
swarm.inner.addConditionalEdges("__fanout__", ((state) => agentIds.map((id) => new Send(id, { ...state }))));
|
|
102
|
+
// Each agent → __reducer__
|
|
103
|
+
for (const id of agentIds) {
|
|
104
|
+
swarm.inner.addEdge(id, "__reducer__");
|
|
105
|
+
}
|
|
106
|
+
// __reducer__ → END
|
|
107
|
+
swarm.inner.addEdge("__reducer__", END);
|
|
108
|
+
return swarm;
|
|
109
|
+
}
|
|
110
|
+
// ---- Static factory: pipeline template ----
|
|
111
|
+
/**
|
|
112
|
+
* Create a linear agent pipeline: stage1 → stage2 → … → END.
|
|
113
|
+
* Optionally override any stage's outgoing edge with a conditional
|
|
114
|
+
* transition (e.g. loop back for review cycles).
|
|
115
|
+
*/
|
|
116
|
+
static pipeline(config) {
|
|
117
|
+
const swarm = new SwarmGraph(config.channels);
|
|
118
|
+
const ids = config.stages.map((a) => a.id);
|
|
119
|
+
for (const agentDef of config.stages) {
|
|
120
|
+
swarm.addAgent(agentDef);
|
|
121
|
+
}
|
|
122
|
+
// Wire: START → first stage
|
|
123
|
+
swarm.inner.addEdge(START, ids[0]);
|
|
124
|
+
// Wire each stage to the next (or conditional)
|
|
125
|
+
for (let i = 0; i < ids.length - 1; i++) {
|
|
126
|
+
const id = ids[i];
|
|
127
|
+
if (config.transitions?.[id]) {
|
|
128
|
+
swarm.addConditionalHandoff(id, config.transitions[id]);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
swarm.inner.addEdge(id, ids[i + 1]);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Wire last stage
|
|
135
|
+
const lastId = ids[ids.length - 1];
|
|
136
|
+
if (config.transitions?.[lastId]) {
|
|
137
|
+
swarm.addConditionalHandoff(lastId, config.transitions[lastId]);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
swarm.inner.addEdge(lastId, END);
|
|
141
|
+
}
|
|
142
|
+
return swarm;
|
|
143
|
+
}
|
|
144
|
+
// ---- Static factory: peer network template ----
|
|
145
|
+
/**
|
|
146
|
+
* Create a decentralized peer network: agents route to each other
|
|
147
|
+
* via conditional handoffs, with no supervisor.
|
|
148
|
+
*/
|
|
149
|
+
static peerNetwork(config) {
|
|
150
|
+
const swarm = new SwarmGraph(config.channels);
|
|
151
|
+
for (const agentDef of config.agents) {
|
|
152
|
+
swarm.addAgent(agentDef);
|
|
153
|
+
}
|
|
154
|
+
// Wire: START → entrypoint
|
|
155
|
+
swarm.inner.addEdge(START, config.entrypoint);
|
|
156
|
+
// Wire each agent's conditional handoff
|
|
157
|
+
for (const [agentId, handoffFn] of Object.entries(config.handoffs)) {
|
|
158
|
+
swarm.addConditionalHandoff(agentId, handoffFn);
|
|
159
|
+
}
|
|
160
|
+
return swarm;
|
|
161
|
+
}
|
|
162
|
+
// ---- Static factory: map-reduce template ----
|
|
163
|
+
/**
|
|
164
|
+
* Distribute N inputs across poolSize copies of a mapper agent,
|
|
165
|
+
* fan-out via Send, and collect results through a reducer node.
|
|
166
|
+
*/
|
|
167
|
+
static mapReduce(config) {
|
|
168
|
+
const swarm = new SwarmGraph(config.channels);
|
|
169
|
+
const poolSize = config.poolSize ?? 1;
|
|
170
|
+
// Register poolSize copies of the mapper agent
|
|
171
|
+
const mapperIds = [];
|
|
172
|
+
for (let i = 0; i < poolSize; i++) {
|
|
173
|
+
const id = poolSize === 1 ? config.mapper.id : `${config.mapper.id}_${i}`;
|
|
174
|
+
mapperIds.push(id);
|
|
175
|
+
swarm.addAgent({
|
|
176
|
+
...config.mapper,
|
|
177
|
+
id,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// Splitter node: passthrough — the conditional edge handles fan-out via Send
|
|
181
|
+
swarm.inner.addNode("__splitter__", (_state) => {
|
|
182
|
+
return {};
|
|
183
|
+
});
|
|
184
|
+
// Reducer node: collects agentResults and applies user reducer
|
|
185
|
+
swarm.inner.addNode("__reducer__", (state) => {
|
|
186
|
+
return config.reducer(state.agentResults ?? {});
|
|
187
|
+
});
|
|
188
|
+
// Wiring: START → __splitter__
|
|
189
|
+
swarm.inner.addEdge(START, "__splitter__");
|
|
190
|
+
// __splitter__ → Send to mapper agents round-robin across pool
|
|
191
|
+
const inputField = config.inputField;
|
|
192
|
+
swarm.inner.addConditionalEdges("__splitter__", ((state) => {
|
|
193
|
+
const items = state[inputField];
|
|
194
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
195
|
+
return "__reducer__";
|
|
196
|
+
}
|
|
197
|
+
return items.map((item, idx) => {
|
|
198
|
+
const targetId = mapperIds[idx % mapperIds.length];
|
|
199
|
+
return new Send(targetId, { ...state, task: String(item) });
|
|
200
|
+
});
|
|
201
|
+
}));
|
|
202
|
+
// Each mapper → __reducer__
|
|
203
|
+
for (const id of mapperIds) {
|
|
204
|
+
swarm.inner.addEdge(id, "__reducer__");
|
|
205
|
+
}
|
|
206
|
+
// __reducer__ → END
|
|
207
|
+
swarm.inner.addEdge("__reducer__", END);
|
|
208
|
+
return swarm;
|
|
209
|
+
}
|
|
210
|
+
// ---- Static factory: debate template ----
|
|
211
|
+
/**
|
|
212
|
+
* Create a multi-round parallel debate with judge termination.
|
|
213
|
+
* All debaters argue in parallel each round; a judge evaluates
|
|
214
|
+
* and decides whether consensus has been reached.
|
|
215
|
+
*/
|
|
216
|
+
static debate(config) {
|
|
217
|
+
const swarm = new SwarmGraph(config.channels);
|
|
218
|
+
const debaterIds = config.debaters.map((d) => d.id);
|
|
219
|
+
const consensusKeyword = config.judge.consensusKeyword ?? "CONSENSUS";
|
|
220
|
+
for (const debater of config.debaters) {
|
|
221
|
+
swarm.addAgent(debater);
|
|
222
|
+
}
|
|
223
|
+
// Judge node: evaluates arguments, decides continue or consensus
|
|
224
|
+
swarm.inner.addNode("__judge__", async (state) => {
|
|
225
|
+
const round = state.supervisorRound ?? 0;
|
|
226
|
+
// If no agent results yet (first round), just kick off debaters
|
|
227
|
+
const results = state.agentResults ?? {};
|
|
228
|
+
if (round === 0 && Object.keys(results).length === 0) {
|
|
229
|
+
return {
|
|
230
|
+
supervisorRound: round + 1,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// Evaluate arguments via judge model
|
|
234
|
+
const argsText = Object.entries(results)
|
|
235
|
+
.map(([id, r]) => `${id}: ${JSON.stringify(r)}`)
|
|
236
|
+
.join("\n\n");
|
|
237
|
+
const response = await config.judge.model.chat({
|
|
238
|
+
messages: [{
|
|
239
|
+
role: "user",
|
|
240
|
+
content: `Round ${round}. Evaluate these arguments:\n\n${argsText}\n\nRespond "${consensusKeyword}" if consensus reached, otherwise "CONTINUE".`,
|
|
241
|
+
}],
|
|
242
|
+
systemPrompt: config.judge.systemPrompt ?? "You are a debate judge.",
|
|
243
|
+
});
|
|
244
|
+
const isConsensus = response.content.includes(consensusKeyword);
|
|
245
|
+
const nextRound = round + 1;
|
|
246
|
+
// Force done if consensus or max rounds exhausted
|
|
247
|
+
// (round 0 is kick-off only, so chat is called maxRounds times)
|
|
248
|
+
const isDone = isConsensus || nextRound > config.judge.maxRounds;
|
|
249
|
+
return {
|
|
250
|
+
done: isDone,
|
|
251
|
+
supervisorRound: nextRound,
|
|
252
|
+
messages: [{ role: "system", content: `Judge round ${round}: ${isDone ? "Consensus" : "Continue"}` }],
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
// Fan-out node: passthrough — conditional edges handle the Send dispatch
|
|
256
|
+
swarm.inner.addNode("__fanout__", (_state) => {
|
|
257
|
+
return {};
|
|
258
|
+
});
|
|
259
|
+
// Wiring: START → __judge__
|
|
260
|
+
swarm.inner.addEdge(START, "__judge__");
|
|
261
|
+
// __judge__ → conditional (done → END, else → __fanout__)
|
|
262
|
+
swarm.inner.addConditionalEdges("__judge__", (state) => {
|
|
263
|
+
if (state.done)
|
|
264
|
+
return END;
|
|
265
|
+
return "__fanout__";
|
|
266
|
+
});
|
|
267
|
+
// __fanout__ → Send to all debaters in parallel
|
|
268
|
+
swarm.inner.addConditionalEdges("__fanout__", ((state) => debaterIds.map((id) => new Send(id, { ...state }))));
|
|
269
|
+
// Each debater → __judge__
|
|
270
|
+
for (const id of debaterIds) {
|
|
271
|
+
swarm.inner.addEdge(id, "__judge__");
|
|
272
|
+
}
|
|
273
|
+
return swarm;
|
|
274
|
+
}
|
|
275
|
+
// ---- Static factory: hierarchical mesh template ----
|
|
276
|
+
/**
|
|
277
|
+
* Create a hierarchical mesh with a coordinator routing to team
|
|
278
|
+
* sub-graphs. Each team is built using pipeline() or peerNetwork()
|
|
279
|
+
* and compiled into a single node in the outer graph.
|
|
280
|
+
*/
|
|
281
|
+
static hierarchicalMesh(config) {
|
|
282
|
+
const swarm = new SwarmGraph(config.channels);
|
|
283
|
+
const teamIds = Object.keys(config.teams);
|
|
284
|
+
const maxRounds = config.coordinator.maxRounds ?? 10;
|
|
285
|
+
// Build each team as a compiled sub-skeleton and mount as a node
|
|
286
|
+
for (const [teamId, teamConfig] of Object.entries(config.teams)) {
|
|
287
|
+
let teamSwarm;
|
|
288
|
+
if (teamConfig.topology === "pipeline") {
|
|
289
|
+
teamSwarm = SwarmGraph.pipeline({ stages: teamConfig.agents });
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
teamSwarm = SwarmGraph.peerNetwork({
|
|
293
|
+
agents: teamConfig.agents,
|
|
294
|
+
entrypoint: teamConfig.agents[0].id,
|
|
295
|
+
handoffs: teamConfig.handoffs ?? {},
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
const teamSkeleton = teamSwarm.compile();
|
|
299
|
+
// Mount team as a single node in the outer graph
|
|
300
|
+
swarm.inner.addNode(teamId, async (state, cfg) => {
|
|
301
|
+
const teamResult = await teamSkeleton.invoke(state, cfg);
|
|
302
|
+
return {
|
|
303
|
+
agentResults: {
|
|
304
|
+
...(state.agentResults ?? {}),
|
|
305
|
+
[teamId]: teamResult,
|
|
306
|
+
},
|
|
307
|
+
messages: teamResult.messages ?? [],
|
|
308
|
+
};
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
// Coordinator node: routes to teams
|
|
312
|
+
swarm.inner.addNode("__coordinator__", async (state) => {
|
|
313
|
+
const round = state.supervisorRound ?? 0;
|
|
314
|
+
if (round >= maxRounds || state.done) {
|
|
315
|
+
return { done: true };
|
|
316
|
+
}
|
|
317
|
+
if (config.coordinator.strategy === "llm" && config.coordinator.model) {
|
|
318
|
+
const teamList = teamIds.map((id) => `- ${id}`).join("\n");
|
|
319
|
+
const response = await config.coordinator.model.chat({
|
|
320
|
+
messages: [{
|
|
321
|
+
role: "user",
|
|
322
|
+
content: `Task: ${state.task}\n\nAvailable teams:\n${teamList}\n\nRespond with the team name to route to, or "DONE" if complete.`,
|
|
323
|
+
}],
|
|
324
|
+
systemPrompt: config.coordinator.systemPrompt ?? "You coordinate teams.",
|
|
325
|
+
});
|
|
326
|
+
const picked = response.content.trim();
|
|
327
|
+
if (picked === "DONE" || !teamIds.includes(picked)) {
|
|
328
|
+
return { done: true, supervisorRound: round + 1 };
|
|
329
|
+
}
|
|
330
|
+
return new Command({
|
|
331
|
+
update: { supervisorRound: round + 1, currentAgent: picked },
|
|
332
|
+
goto: picked,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
// Round-robin strategy: route to teams in order, mark done after all visited
|
|
336
|
+
if (config.coordinator.strategy === "round-robin") {
|
|
337
|
+
const target = teamIds[round % teamIds.length];
|
|
338
|
+
if (round >= teamIds.length) {
|
|
339
|
+
return { done: true };
|
|
340
|
+
}
|
|
341
|
+
return new Command({
|
|
342
|
+
update: { supervisorRound: round + 1 },
|
|
343
|
+
goto: target,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
return { done: true };
|
|
347
|
+
});
|
|
348
|
+
// Wiring: START → coordinator
|
|
349
|
+
swarm.inner.addEdge(START, "__coordinator__");
|
|
350
|
+
// Each team → coordinator (loop back unless done)
|
|
351
|
+
for (const teamId of teamIds) {
|
|
352
|
+
swarm.inner.addConditionalEdges(teamId, (state) => {
|
|
353
|
+
if (state.done)
|
|
354
|
+
return END;
|
|
355
|
+
return "__coordinator__";
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
// Coordinator → conditional (done → END, else handled by Command.goto)
|
|
359
|
+
swarm.inner.addConditionalEdges("__coordinator__", (state) => {
|
|
360
|
+
if (state.done)
|
|
361
|
+
return END;
|
|
362
|
+
// Command.goto handles routing — this is the fallback
|
|
363
|
+
return END;
|
|
364
|
+
});
|
|
365
|
+
return swarm;
|
|
366
|
+
}
|
|
367
|
+
// ---- Agent registration ----
|
|
368
|
+
addAgent(def) {
|
|
369
|
+
this.registry.register(def);
|
|
370
|
+
this.agentIds.add(def.id);
|
|
371
|
+
// Wrap the agent's skeleton as a node
|
|
372
|
+
// The node executes the agent's skeleton and handles Handoff returns
|
|
373
|
+
const agentNode = async (state, config) => {
|
|
374
|
+
console.log(`[swarm] agent="${def.id}" (${def.role}) starting`);
|
|
375
|
+
this.registry.markBusy(def.id);
|
|
376
|
+
const maxRetries = def.maxRetries ?? 2;
|
|
377
|
+
let lastError;
|
|
378
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
379
|
+
try {
|
|
380
|
+
const agentInput = {
|
|
381
|
+
...state,
|
|
382
|
+
context: {
|
|
383
|
+
...(state.context ?? {}),
|
|
384
|
+
inbox: getInbox(state.swarmMessages ?? [], def.id),
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
const result = await def.skeleton.invoke(agentInput, {
|
|
388
|
+
...config,
|
|
389
|
+
agentId: def.id,
|
|
390
|
+
});
|
|
391
|
+
this.registry.markIdle(def.id);
|
|
392
|
+
console.log(`[swarm] agent="${def.id}" completed`);
|
|
393
|
+
// ---- Handoff detection ----
|
|
394
|
+
if (result instanceof Handoff || (result && result.isHandoff)) {
|
|
395
|
+
const handoff = result instanceof Handoff
|
|
396
|
+
? result
|
|
397
|
+
: new Handoff(result.opts);
|
|
398
|
+
return new Command({
|
|
399
|
+
update: {
|
|
400
|
+
context: { ...(state.context ?? {}), ...(handoff.context ?? {}) },
|
|
401
|
+
handoffHistory: [{
|
|
402
|
+
from: def.id,
|
|
403
|
+
to: handoff.to,
|
|
404
|
+
message: handoff.message,
|
|
405
|
+
step: state.supervisorRound ?? 0,
|
|
406
|
+
timestamp: Date.now(),
|
|
407
|
+
resume: handoff.resume,
|
|
408
|
+
}],
|
|
409
|
+
currentAgent: handoff.to,
|
|
410
|
+
},
|
|
411
|
+
goto: handoff.to,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
// ---- Normal result ----
|
|
415
|
+
return {
|
|
416
|
+
...result,
|
|
417
|
+
agentResults: {
|
|
418
|
+
...(state.agentResults ?? {}),
|
|
419
|
+
[def.id]: result,
|
|
420
|
+
},
|
|
421
|
+
handoffHistory: [
|
|
422
|
+
...(state.handoffHistory ?? []),
|
|
423
|
+
{
|
|
424
|
+
from: def.id,
|
|
425
|
+
to: "__completed__",
|
|
426
|
+
message: "Agent completed",
|
|
427
|
+
step: state.supervisorRound ?? 0,
|
|
428
|
+
timestamp: Date.now(),
|
|
429
|
+
},
|
|
430
|
+
],
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
lastError = err;
|
|
435
|
+
this.registry.markError(def.id);
|
|
436
|
+
console.warn(`[swarm] agent="${def.id}" attempt ${attempt + 1}/${maxRetries + 1} failed: ${err}`);
|
|
437
|
+
if (attempt < maxRetries) {
|
|
438
|
+
continue; // retry
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// All retries exhausted — fallback to supervisor if one exists
|
|
443
|
+
console.warn(`[swarm] agent="${def.id}" exhausted retries, falling back`);
|
|
444
|
+
this.registry.markIdle(def.id);
|
|
445
|
+
if (this.hasSupervisor) {
|
|
446
|
+
return new Command({
|
|
447
|
+
update: {
|
|
448
|
+
context: {
|
|
449
|
+
...(state.context ?? {}),
|
|
450
|
+
lastAgentError: { agent: def.id, error: String(lastError) },
|
|
451
|
+
},
|
|
452
|
+
},
|
|
453
|
+
goto: this.supervisorNodeName,
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
// No supervisor — rethrow
|
|
457
|
+
throw lastError;
|
|
458
|
+
};
|
|
459
|
+
this.inner.addNode(def.id, agentNode);
|
|
460
|
+
return this;
|
|
461
|
+
}
|
|
462
|
+
// ---- Supervisor ----
|
|
463
|
+
addSupervisor(config, nodeName = this.supervisorNodeName) {
|
|
464
|
+
this.supervisorNodeName = nodeName;
|
|
465
|
+
this.hasSupervisor = true;
|
|
466
|
+
const supervisorFn = createSupervisorNode(this.registry, config);
|
|
467
|
+
this.inner.addNode(nodeName, supervisorFn);
|
|
468
|
+
// Wire: START → Supervisor
|
|
469
|
+
this.inner.addEdge(START, nodeName);
|
|
470
|
+
// Wire: each agent → Supervisor (return path)
|
|
471
|
+
for (const agentId of this.agentIds) {
|
|
472
|
+
this.inner.addConditionalEdges(agentId, (state) => {
|
|
473
|
+
// If agent marked done, go to END
|
|
474
|
+
if (state.done)
|
|
475
|
+
return END;
|
|
476
|
+
return nodeName;
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return this;
|
|
480
|
+
}
|
|
481
|
+
// ---- Peer-to-peer handoff edges ----
|
|
482
|
+
/**
|
|
483
|
+
* Wire two agents to hand off directly to each other.
|
|
484
|
+
* The "from" agent's node will inspect its output for a Handoff
|
|
485
|
+
* and route accordingly.
|
|
486
|
+
*/
|
|
487
|
+
addHandoffEdge(fromAgentId, toAgentId) {
|
|
488
|
+
this.inner.addEdge(fromAgentId, toAgentId);
|
|
489
|
+
return this;
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Add a conditional handoff: fromAgent routes to different agents
|
|
493
|
+
* based on state.
|
|
494
|
+
*/
|
|
495
|
+
addConditionalHandoff(fromAgentId, condition) {
|
|
496
|
+
this.inner.addConditionalEdges(fromAgentId, condition);
|
|
497
|
+
return this;
|
|
498
|
+
}
|
|
499
|
+
// ---- Static edge passthrough ----
|
|
500
|
+
addEdge(from, to) {
|
|
501
|
+
this.inner.addEdge(from, to);
|
|
502
|
+
return this;
|
|
503
|
+
}
|
|
504
|
+
// ---- Pipeline shorthand ----
|
|
505
|
+
/**
|
|
506
|
+
* Wire agents as a linear pipeline: A → B → C → END
|
|
507
|
+
*/
|
|
508
|
+
pipeline(...agentIds) {
|
|
509
|
+
if (agentIds.length < 1)
|
|
510
|
+
return this;
|
|
511
|
+
this.inner.addEdge(START, agentIds[0]);
|
|
512
|
+
for (let i = 0; i < agentIds.length - 1; i++) {
|
|
513
|
+
this.inner.addEdge(agentIds[i], agentIds[i + 1]);
|
|
514
|
+
}
|
|
515
|
+
this.inner.addEdge(agentIds[agentIds.length - 1], END);
|
|
516
|
+
return this;
|
|
517
|
+
}
|
|
518
|
+
// ---- Compile ----
|
|
519
|
+
compile(opts = {}) {
|
|
520
|
+
const skeleton = this.inner.compile({
|
|
521
|
+
...(opts.checkpointer ? { checkpointer: opts.checkpointer } : {}),
|
|
522
|
+
...(opts.interruptBefore ? { interruptBefore: opts.interruptBefore } : {}),
|
|
523
|
+
...(opts.interruptAfter ? { interruptAfter: opts.interruptAfter } : {}),
|
|
524
|
+
});
|
|
525
|
+
// Attach swarm-specific extensions
|
|
526
|
+
const extensions = {
|
|
527
|
+
registry: this.registry,
|
|
528
|
+
agentStats: () => this.registry.stats(),
|
|
529
|
+
toMermaid: () => this.inner.toMermaid(),
|
|
530
|
+
};
|
|
531
|
+
return Object.assign(skeleton, extensions);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/swarm/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { SwarmGraph, baseSwarmChannels } from "./graph.js";
|
|
2
|
+
export type { BaseSwarmState, SwarmCompileOpts, SwarmExtensions, HierarchicalConfig, FanOutConfig, PipelineConfig, PeerNetworkConfig, MapReduceConfig, DebateConfig, HierarchicalMeshConfig } from "./graph.js";
|
|
3
|
+
export { AgentRegistry } from "./registry.js";
|
|
4
|
+
export type { AgentRecord } from "./registry.js";
|
|
5
|
+
export { AgentPool } from "./pool.js";
|
|
6
|
+
export { createSupervisorNode } from "./supervisor.js";
|
|
7
|
+
export type { SupervisorState } from "./supervisor.js";
|
|
8
|
+
export { createMessage, getInbox, consumeInbox, formatInbox } from "./mailbox.js";
|
|
9
|
+
export { Handoff } from "./types.js";
|
|
10
|
+
export type { SwarmAgentDef, AgentStatus, AgentCapability, HandoffOptions, HandoffRecord, SwarmMessage, SwarmMeta, SupervisorConfig, SupervisorRoutingStrategy, RuleRoute, AgentPoolConfig, SwarmCompileOptions, SwarmTopology, } from "./types.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swarm/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAW,YAAY,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhN,OAAO,EAAE,aAAa,EAAE,MAA2B,eAAe,CAAC;AACnE,YAAY,EAAE,WAAW,EAAE,MAAwB,eAAe,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAA+B,WAAW,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAoB,iBAAiB,CAAC;AACrE,YAAY,EAAE,eAAe,EAAE,MAAoB,iBAAiB,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAElF,OAAO,EAAE,OAAO,EAAE,MAAiC,YAAY,CAAC;AAChE,YAAY,EACV,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,yBAAyB,EACzB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @oni.bot/core/swarm — Public API
|
|
3
|
+
// ============================================================
|
|
4
|
+
export { SwarmGraph, baseSwarmChannels } from "./graph.js";
|
|
5
|
+
export { AgentRegistry } from "./registry.js";
|
|
6
|
+
export { AgentPool } from "./pool.js";
|
|
7
|
+
export { createSupervisorNode } from "./supervisor.js";
|
|
8
|
+
export { createMessage, getInbox, consumeInbox, formatInbox } from "./mailbox.js";
|
|
9
|
+
export { Handoff } from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swarm/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mCAAmC;AACnC,+DAA+D;AAE/D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAW,YAAY,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,MAA2B,eAAe,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAA+B,WAAW,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAoB,iBAAiB,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAElF,OAAO,EAAE,OAAO,EAAE,MAAiC,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SwarmMessage } from "./types.js";
|
|
2
|
+
export declare function createMessage(from: string, to: string, content: string, opts?: {
|
|
3
|
+
metadata?: Record<string, unknown>;
|
|
4
|
+
replyTo?: string;
|
|
5
|
+
}): SwarmMessage;
|
|
6
|
+
/** Extract messages addressed to a specific agent (or broadcasts) */
|
|
7
|
+
export declare function getInbox(messages: SwarmMessage[], agentId: string): SwarmMessage[];
|
|
8
|
+
/** Mark messages as consumed — returns messages NOT consumed by agentId */
|
|
9
|
+
export declare function consumeInbox(messages: SwarmMessage[], agentId: string): SwarmMessage[];
|
|
10
|
+
/** Format inbox as readable string for LLM context */
|
|
11
|
+
export declare function formatInbox(messages: SwarmMessage[]): string;
|
|
12
|
+
//# sourceMappingURL=mailbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../src/swarm/mailbox.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,wBAAgB,aAAa,CAC3B,IAAI,EAAO,MAAM,EACjB,EAAE,EAAS,MAAM,EACjB,OAAO,EAAI,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,YAAY,CAUd;AAED,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAElF;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAEtF;AAED,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAK5D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @oni.bot/core/swarm — Mailbox (async inter-agent messaging)
|
|
3
|
+
// ============================================================
|
|
4
|
+
// Agents communicate by posting messages to the shared mailbox.
|
|
5
|
+
// Each message is addressed to a specific agent ID or "*" for
|
|
6
|
+
// broadcast. Consumers pull their inbox by agent ID.
|
|
7
|
+
// ============================================================
|
|
8
|
+
let msgCounter = 0;
|
|
9
|
+
export function createMessage(from, to, content, opts) {
|
|
10
|
+
return {
|
|
11
|
+
id: `msg-${++msgCounter}-${Date.now()}`,
|
|
12
|
+
from,
|
|
13
|
+
to,
|
|
14
|
+
content,
|
|
15
|
+
metadata: opts?.metadata,
|
|
16
|
+
replyTo: opts?.replyTo,
|
|
17
|
+
timestamp: Date.now(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Extract messages addressed to a specific agent (or broadcasts) */
|
|
21
|
+
export function getInbox(messages, agentId) {
|
|
22
|
+
return messages.filter((m) => m.to === agentId || m.to === "*");
|
|
23
|
+
}
|
|
24
|
+
/** Mark messages as consumed — returns messages NOT consumed by agentId */
|
|
25
|
+
export function consumeInbox(messages, agentId) {
|
|
26
|
+
return messages.filter((m) => m.to !== agentId && m.to !== "*");
|
|
27
|
+
}
|
|
28
|
+
/** Format inbox as readable string for LLM context */
|
|
29
|
+
export function formatInbox(messages) {
|
|
30
|
+
if (!messages.length)
|
|
31
|
+
return "(no messages)";
|
|
32
|
+
return messages
|
|
33
|
+
.map((m) => `[From: ${m.from}]${m.replyTo ? ` [Re: ${m.replyTo}]` : ""}\n${m.content}`)
|
|
34
|
+
.join("\n---\n");
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=mailbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../src/swarm/mailbox.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,8DAA8D;AAC9D,+DAA+D;AAC/D,gEAAgE;AAChE,8DAA8D;AAC9D,qDAAqD;AACrD,+DAA+D;AAI/D,IAAI,UAAU,GAAG,CAAC,CAAC;AAEnB,MAAM,UAAU,aAAa,CAC3B,IAAiB,EACjB,EAAiB,EACjB,OAAiB,EACjB,IAA+D;IAE/D,OAAO;QACL,EAAE,EAAS,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;QAC9C,IAAI;QACJ,EAAE;QACF,OAAO;QACP,QAAQ,EAAG,IAAI,EAAE,QAAQ;QACzB,OAAO,EAAI,IAAI,EAAE,OAAO;QACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,QAAwB,EAAE,OAAe;IAChE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,QAAwB,EAAE,OAAe;IACpE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,WAAW,CAAC,QAAwB;IAClD,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,eAAe,CAAC;IAC7C,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACtF,IAAI,CAAC,SAAS,CAAC,CAAC;AACrB,CAAC"}
|