@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,27 @@
|
|
|
1
|
+
import type { SwarmAgentDef } from "./types.js";
|
|
2
|
+
import type { ONIConfig } from "../types.js";
|
|
3
|
+
type PoolStrategy = "round-robin" | "least-busy" | "random";
|
|
4
|
+
export declare class AgentPool<S extends Record<string, unknown>> {
|
|
5
|
+
private slots;
|
|
6
|
+
private strategy;
|
|
7
|
+
private rrIndex;
|
|
8
|
+
private queue;
|
|
9
|
+
private maxQueueDepth;
|
|
10
|
+
constructor(agents: SwarmAgentDef<S>[], opts?: {
|
|
11
|
+
strategy?: PoolStrategy;
|
|
12
|
+
maxQueueDepth?: number;
|
|
13
|
+
});
|
|
14
|
+
invoke(input: Partial<S>, config?: ONIConfig): Promise<S>;
|
|
15
|
+
/** Run N inputs across the pool in parallel */
|
|
16
|
+
batch(inputs: Partial<S>[], config?: ONIConfig): Promise<S[]>;
|
|
17
|
+
stats(): Array<{
|
|
18
|
+
agentId: string;
|
|
19
|
+
activeTasks: number;
|
|
20
|
+
totalRuns: number;
|
|
21
|
+
}>;
|
|
22
|
+
queueDepth(): number;
|
|
23
|
+
private pickSlot;
|
|
24
|
+
private runOnSlot;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/swarm/pool.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C,KAAK,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE5D,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtD,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAKL;IACR,OAAO,CAAC,aAAa,CAAS;gBAG5B,MAAM,EAAK,aAAa,CAAC,CAAC,CAAC,EAAE,EAC7B,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;IAUtD,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAiB/D,+CAA+C;IACzC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAMnE,KAAK,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ3E,UAAU,IAAI,MAAM;IAIpB,OAAO,CAAC,QAAQ;YAmBF,SAAS;CAyBxB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @oni.bot/core/swarm — AgentPool
|
|
3
|
+
// ============================================================
|
|
4
|
+
// Manages N instances of equivalent agents with load balancing.
|
|
5
|
+
// Provides a unified invoke() that routes to the least-busy
|
|
6
|
+
// agent or queues if all are at capacity.
|
|
7
|
+
// ============================================================
|
|
8
|
+
export class AgentPool {
|
|
9
|
+
slots;
|
|
10
|
+
strategy;
|
|
11
|
+
rrIndex = 0;
|
|
12
|
+
queue = [];
|
|
13
|
+
maxQueueDepth;
|
|
14
|
+
constructor(agents, opts) {
|
|
15
|
+
if (!agents.length)
|
|
16
|
+
throw new Error("AgentPool requires at least one agent.");
|
|
17
|
+
this.slots = agents.map((a) => ({ agent: a, activeTasks: 0, totalRuns: 0 }));
|
|
18
|
+
this.strategy = opts?.strategy ?? "least-busy";
|
|
19
|
+
this.maxQueueDepth = opts?.maxQueueDepth ?? 100;
|
|
20
|
+
}
|
|
21
|
+
// ---- Public API ----
|
|
22
|
+
async invoke(input, config) {
|
|
23
|
+
const slot = this.pickSlot();
|
|
24
|
+
if (slot) {
|
|
25
|
+
return this.runOnSlot(slot, input, config);
|
|
26
|
+
}
|
|
27
|
+
// All at capacity — queue with backpressure
|
|
28
|
+
if (this.queue.length >= this.maxQueueDepth) {
|
|
29
|
+
throw new Error(`AgentPool queue depth exceeded (max ${this.maxQueueDepth}). Apply backpressure.`);
|
|
30
|
+
}
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
this.queue.push({ input, config, resolve, reject });
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Run N inputs across the pool in parallel */
|
|
36
|
+
async batch(inputs, config) {
|
|
37
|
+
return Promise.all(inputs.map((inp) => this.invoke(inp, config)));
|
|
38
|
+
}
|
|
39
|
+
// ---- Stats ----
|
|
40
|
+
stats() {
|
|
41
|
+
return this.slots.map((s) => ({
|
|
42
|
+
agentId: s.agent.id,
|
|
43
|
+
activeTasks: s.activeTasks,
|
|
44
|
+
totalRuns: s.totalRuns,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
queueDepth() { return this.queue.length; }
|
|
48
|
+
// ---- Internals ----
|
|
49
|
+
pickSlot() {
|
|
50
|
+
const available = this.slots.filter((s) => s.activeTasks < (s.agent.maxConcurrency ?? 1));
|
|
51
|
+
if (!available.length)
|
|
52
|
+
return null;
|
|
53
|
+
switch (this.strategy) {
|
|
54
|
+
case "least-busy":
|
|
55
|
+
return available.reduce((a, b) => (a.activeTasks <= b.activeTasks ? a : b));
|
|
56
|
+
case "round-robin": {
|
|
57
|
+
const slot = available[this.rrIndex % available.length];
|
|
58
|
+
this.rrIndex++;
|
|
59
|
+
return slot;
|
|
60
|
+
}
|
|
61
|
+
case "random":
|
|
62
|
+
return available[Math.floor(Math.random() * available.length)];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async runOnSlot(slot, input, config) {
|
|
66
|
+
slot.activeTasks++;
|
|
67
|
+
slot.totalRuns++;
|
|
68
|
+
try {
|
|
69
|
+
const result = await slot.agent.skeleton.invoke(input, {
|
|
70
|
+
...config,
|
|
71
|
+
agentId: slot.agent.id,
|
|
72
|
+
});
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
slot.activeTasks--;
|
|
77
|
+
// Drain queue
|
|
78
|
+
if (this.queue.length > 0) {
|
|
79
|
+
const next = this.queue.shift();
|
|
80
|
+
this.runOnSlot(slot, next.input, next.config)
|
|
81
|
+
.then(next.resolve)
|
|
82
|
+
.catch(next.reject);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/swarm/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SwarmAgentDef, AgentStatus } from "./types.js";
|
|
2
|
+
export interface AgentRecord<S extends Record<string, unknown>> {
|
|
3
|
+
def: SwarmAgentDef<S>;
|
|
4
|
+
status: AgentStatus;
|
|
5
|
+
activeTasks: number;
|
|
6
|
+
totalRuns: number;
|
|
7
|
+
lastActive: number | null;
|
|
8
|
+
errors: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class AgentRegistry<S extends Record<string, unknown> = Record<string, unknown>> {
|
|
11
|
+
private agents;
|
|
12
|
+
register(def: SwarmAgentDef<S>): this;
|
|
13
|
+
deregister(agentId: string): boolean;
|
|
14
|
+
get(agentId: string): AgentRecord<S> | null;
|
|
15
|
+
getDef(agentId: string): SwarmAgentDef<S> | null;
|
|
16
|
+
getAll(): AgentRecord<S>[];
|
|
17
|
+
/** Find agents by role (exact or partial match) */
|
|
18
|
+
findByRole(role: string): AgentRecord<S>[];
|
|
19
|
+
/** Find agents that have a specific capability by name */
|
|
20
|
+
findByCapability(capabilityName: string): AgentRecord<S>[];
|
|
21
|
+
/** Find idle agents ready to accept work */
|
|
22
|
+
findIdle(): AgentRecord<S>[];
|
|
23
|
+
/** Find the least-busy agent across all registered agents */
|
|
24
|
+
leastBusy(): AgentRecord<S> | null;
|
|
25
|
+
setStatus(agentId: string, status: AgentStatus): void;
|
|
26
|
+
markBusy(agentId: string): void;
|
|
27
|
+
markIdle(agentId: string): void;
|
|
28
|
+
markError(agentId: string): void;
|
|
29
|
+
toManifest(): string;
|
|
30
|
+
stats(): Record<string, {
|
|
31
|
+
status: AgentStatus;
|
|
32
|
+
activeTasks: number;
|
|
33
|
+
totalRuns: number;
|
|
34
|
+
errors: number;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/swarm/registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,GAAG,EAAU,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAO,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAI,MAAM,CAAC;IACpB,UAAU,EAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAO,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpF,OAAO,CAAC,MAAM,CAAqC;IAInD,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAerC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMpC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAIhD,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;IAI1B,mDAAmD;IACnD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE;IAM1C,0DAA0D;IAC1D,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE;IAQ1D,4CAA4C;IAC5C,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;IAM5B,6DAA6D;IAC7D,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAUlC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAKrD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU/B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS/B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWhC,UAAU,IAAI,MAAM;IAcpB,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAYzG"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @oni.bot/core/swarm — AgentRegistry
|
|
3
|
+
// ============================================================
|
|
4
|
+
// A live catalog of agents in the swarm. Runtime injectable —
|
|
5
|
+
// register/deregister agents without recompiling the graph.
|
|
6
|
+
// ============================================================
|
|
7
|
+
export class AgentRegistry {
|
|
8
|
+
agents = new Map();
|
|
9
|
+
// ---- Registration ----
|
|
10
|
+
register(def) {
|
|
11
|
+
if (this.agents.has(def.id)) {
|
|
12
|
+
throw new Error(`Agent "${def.id}" is already registered.`);
|
|
13
|
+
}
|
|
14
|
+
this.agents.set(def.id, {
|
|
15
|
+
def,
|
|
16
|
+
status: "idle",
|
|
17
|
+
activeTasks: 0,
|
|
18
|
+
totalRuns: 0,
|
|
19
|
+
lastActive: null,
|
|
20
|
+
errors: 0,
|
|
21
|
+
});
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
deregister(agentId) {
|
|
25
|
+
return this.agents.delete(agentId);
|
|
26
|
+
}
|
|
27
|
+
// ---- Lookups ----
|
|
28
|
+
get(agentId) {
|
|
29
|
+
return this.agents.get(agentId) ?? null;
|
|
30
|
+
}
|
|
31
|
+
getDef(agentId) {
|
|
32
|
+
return this.agents.get(agentId)?.def ?? null;
|
|
33
|
+
}
|
|
34
|
+
getAll() {
|
|
35
|
+
return [...this.agents.values()];
|
|
36
|
+
}
|
|
37
|
+
/** Find agents by role (exact or partial match) */
|
|
38
|
+
findByRole(role) {
|
|
39
|
+
return [...this.agents.values()].filter((a) => a.def.role.toLowerCase().includes(role.toLowerCase()));
|
|
40
|
+
}
|
|
41
|
+
/** Find agents that have a specific capability by name */
|
|
42
|
+
findByCapability(capabilityName) {
|
|
43
|
+
return [...this.agents.values()].filter((a) => a.def.capabilities.some((c) => c.name.toLowerCase().includes(capabilityName.toLowerCase())));
|
|
44
|
+
}
|
|
45
|
+
/** Find idle agents ready to accept work */
|
|
46
|
+
findIdle() {
|
|
47
|
+
return [...this.agents.values()].filter((a) => a.status === "idle" || a.activeTasks < (a.def.maxConcurrency ?? 1));
|
|
48
|
+
}
|
|
49
|
+
/** Find the least-busy agent across all registered agents */
|
|
50
|
+
leastBusy() {
|
|
51
|
+
const available = [...this.agents.values()].filter((a) => a.status !== "terminated" && a.status !== "error");
|
|
52
|
+
if (!available.length)
|
|
53
|
+
return null;
|
|
54
|
+
return available.reduce((a, b) => (a.activeTasks <= b.activeTasks ? a : b));
|
|
55
|
+
}
|
|
56
|
+
// ---- Status management ----
|
|
57
|
+
setStatus(agentId, status) {
|
|
58
|
+
const rec = this.agents.get(agentId);
|
|
59
|
+
if (rec)
|
|
60
|
+
rec.status = status;
|
|
61
|
+
}
|
|
62
|
+
markBusy(agentId) {
|
|
63
|
+
const rec = this.agents.get(agentId);
|
|
64
|
+
if (rec) {
|
|
65
|
+
rec.status = "busy";
|
|
66
|
+
rec.activeTasks++;
|
|
67
|
+
rec.totalRuns++;
|
|
68
|
+
rec.lastActive = Date.now();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
markIdle(agentId) {
|
|
72
|
+
const rec = this.agents.get(agentId);
|
|
73
|
+
if (rec) {
|
|
74
|
+
rec.activeTasks = Math.max(0, rec.activeTasks - 1);
|
|
75
|
+
if (rec.activeTasks === 0)
|
|
76
|
+
rec.status = "idle";
|
|
77
|
+
rec.lastActive = Date.now();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
markError(agentId) {
|
|
81
|
+
const rec = this.agents.get(agentId);
|
|
82
|
+
if (rec) {
|
|
83
|
+
rec.errors++;
|
|
84
|
+
rec.activeTasks = Math.max(0, rec.activeTasks - 1);
|
|
85
|
+
if (rec.activeTasks === 0)
|
|
86
|
+
rec.status = "idle";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ---- Capability manifest (for LLM routing prompt) ----
|
|
90
|
+
toManifest() {
|
|
91
|
+
return [...this.agents.values()]
|
|
92
|
+
.filter((a) => a.status !== "terminated")
|
|
93
|
+
.map((a) => {
|
|
94
|
+
const caps = a.def.capabilities
|
|
95
|
+
.map((c) => ` - ${c.name}: ${c.description}`)
|
|
96
|
+
.join("\n");
|
|
97
|
+
return `Agent ID: "${a.def.id}" | Role: ${a.def.role}\n Capabilities:\n${caps}\n Status: ${a.status} (active tasks: ${a.activeTasks})`;
|
|
98
|
+
})
|
|
99
|
+
.join("\n\n");
|
|
100
|
+
}
|
|
101
|
+
// ---- Stats ----
|
|
102
|
+
stats() {
|
|
103
|
+
const out = {};
|
|
104
|
+
for (const [id, rec] of this.agents) {
|
|
105
|
+
out[id] = {
|
|
106
|
+
status: rec.status,
|
|
107
|
+
activeTasks: rec.activeTasks,
|
|
108
|
+
totalRuns: rec.totalRuns,
|
|
109
|
+
errors: rec.errors,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/swarm/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { NodeFn } from "../types.js";
|
|
2
|
+
import type { SupervisorConfig } from "./types.js";
|
|
3
|
+
import type { AgentRegistry } from "./registry.js";
|
|
4
|
+
export interface SupervisorState {
|
|
5
|
+
task: string;
|
|
6
|
+
context: Record<string, unknown>;
|
|
7
|
+
supervisorRound: number;
|
|
8
|
+
currentAgent: string | null;
|
|
9
|
+
agentResults: Record<string, unknown>;
|
|
10
|
+
messages: Array<{
|
|
11
|
+
role: string;
|
|
12
|
+
content: string;
|
|
13
|
+
}>;
|
|
14
|
+
done: boolean;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export declare function createSupervisorNode<S extends SupervisorState>(registry: AgentRegistry<S>, config: SupervisorConfig<S>): NodeFn<S>;
|
|
18
|
+
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/swarm/supervisor.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,gBAAgB,EAAa,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAOnD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAa,MAAM,CAAC;IACxB,OAAO,EAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAK,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,EAAS,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,IAAI,EAAa,OAAO,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAK,OAAO,CAAC;CAC1B;AAMD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,eAAe,EAC5D,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAI,gBAAgB,CAAC,CAAC,CAAC,GAC5B,MAAM,CAAC,CAAC,CAAC,CAiEX"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @oni.bot/core/swarm — Supervisor
|
|
3
|
+
// ============================================================
|
|
4
|
+
// The orchestrating node in a hierarchical swarm.
|
|
5
|
+
// Routes tasks to agents using LLM, rule-based, or round-robin
|
|
6
|
+
// strategies. Collects results and decides when to END.
|
|
7
|
+
// ============================================================
|
|
8
|
+
import { END } from "../types.js";
|
|
9
|
+
import { Command } from "../types.js";
|
|
10
|
+
// ----------------------------------------------------------------
|
|
11
|
+
// createSupervisorNode — factory that returns a NodeFn
|
|
12
|
+
// ----------------------------------------------------------------
|
|
13
|
+
export function createSupervisorNode(registry, config) {
|
|
14
|
+
const maxRounds = config.maxRounds ?? 10;
|
|
15
|
+
return async (state) => {
|
|
16
|
+
const round = state.supervisorRound ?? 0;
|
|
17
|
+
const task = String(state[config.taskField] ?? "");
|
|
18
|
+
// Guard: max rounds
|
|
19
|
+
if (round >= maxRounds || state.done) {
|
|
20
|
+
console.log(`[supervisor] round=${round} → END`);
|
|
21
|
+
return new Command({
|
|
22
|
+
update: { supervisorRound: round },
|
|
23
|
+
goto: END,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// Check if last agent marked task as done
|
|
27
|
+
if (state.done) {
|
|
28
|
+
return new Command({ update: {}, goto: END });
|
|
29
|
+
}
|
|
30
|
+
const rawCtx = (config.contextField ? state[config.contextField] : {});
|
|
31
|
+
// Enrich context with supervisorRound so rules/LLM can inspect the current round
|
|
32
|
+
const ctx = { ...rawCtx, supervisorRound: round };
|
|
33
|
+
// Route to next agent
|
|
34
|
+
let targetAgentId = null;
|
|
35
|
+
switch (config.strategy) {
|
|
36
|
+
case "llm":
|
|
37
|
+
targetAgentId = await routeViaLLM(task, ctx, registry, config.model, config.systemPrompt);
|
|
38
|
+
break;
|
|
39
|
+
case "rule":
|
|
40
|
+
targetAgentId = routeViaRules(task, ctx, config.rules ?? []);
|
|
41
|
+
break;
|
|
42
|
+
case "round-robin":
|
|
43
|
+
targetAgentId = routeRoundRobin(registry, round);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
if (!targetAgentId) {
|
|
47
|
+
console.warn(`[supervisor] No agent found for task. Going to END.`);
|
|
48
|
+
return new Command({ update: {}, goto: END });
|
|
49
|
+
}
|
|
50
|
+
const agentDef = registry.getDef(targetAgentId);
|
|
51
|
+
if (!agentDef) {
|
|
52
|
+
console.warn(`[supervisor] Agent "${targetAgentId}" not in registry.`);
|
|
53
|
+
return new Command({ update: {}, goto: END });
|
|
54
|
+
}
|
|
55
|
+
console.log(`[supervisor] round=${round} → routing to "${targetAgentId}" (${agentDef.role})`);
|
|
56
|
+
return new Command({
|
|
57
|
+
update: {
|
|
58
|
+
supervisorRound: round + 1,
|
|
59
|
+
currentAgent: targetAgentId,
|
|
60
|
+
messages: [
|
|
61
|
+
...state.messages,
|
|
62
|
+
{ role: "system", content: `Supervisor routing to: ${agentDef.role}` },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
goto: targetAgentId,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// ----------------------------------------------------------------
|
|
70
|
+
// Routing strategies
|
|
71
|
+
// ----------------------------------------------------------------
|
|
72
|
+
async function routeViaLLM(task, context, registry, model, systemPrompt) {
|
|
73
|
+
const manifest = registry.toManifest();
|
|
74
|
+
const agentIds = registry.getAll().map((a) => a.def.id);
|
|
75
|
+
const prompt = [
|
|
76
|
+
`TASK: ${task}`,
|
|
77
|
+
context && Object.keys(context).length
|
|
78
|
+
? `CONTEXT: ${JSON.stringify(context, null, 2)}`
|
|
79
|
+
: "",
|
|
80
|
+
"",
|
|
81
|
+
"AVAILABLE AGENTS:",
|
|
82
|
+
manifest,
|
|
83
|
+
"",
|
|
84
|
+
`Respond with ONLY the agent ID. Valid IDs: ${agentIds.join(", ")}`,
|
|
85
|
+
]
|
|
86
|
+
.filter(Boolean)
|
|
87
|
+
.join("\n");
|
|
88
|
+
const response = await model.chat({
|
|
89
|
+
messages: [{ role: "user", content: prompt }],
|
|
90
|
+
systemPrompt: systemPrompt ?? "You are an agent router. Choose the best agent for the given task.",
|
|
91
|
+
});
|
|
92
|
+
const cleaned = response.content.trim().replace(/['"]/g, "");
|
|
93
|
+
// Validate the LLM returned a real agent ID
|
|
94
|
+
if (agentIds.includes(cleaned))
|
|
95
|
+
return cleaned;
|
|
96
|
+
// Fuzzy: find the first agent ID that appears in the response
|
|
97
|
+
return agentIds.find((id) => response.content.includes(id)) ?? null;
|
|
98
|
+
}
|
|
99
|
+
function routeViaRules(task, context, rules) {
|
|
100
|
+
for (const rule of rules) {
|
|
101
|
+
if (rule.condition(task, context))
|
|
102
|
+
return rule.agentId;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
function routeRoundRobin(registry, round) {
|
|
107
|
+
const agents = registry.findIdle();
|
|
108
|
+
if (!agents.length) {
|
|
109
|
+
// Fall back to all agents if none idle
|
|
110
|
+
const all = registry.getAll().filter((a) => a.status !== "terminated");
|
|
111
|
+
if (!all.length)
|
|
112
|
+
return null;
|
|
113
|
+
return all[round % all.length].def.id;
|
|
114
|
+
}
|
|
115
|
+
return agents[round % agents.length].def.id;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/swarm/supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { ONISkeleton, ONICheckpointer } from "../types.js";
|
|
2
|
+
import type { ONIModel } from "../models/types.js";
|
|
3
|
+
export type AgentStatus = "idle" | "busy" | "terminated" | "error";
|
|
4
|
+
export interface AgentCapability {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
/** Examples of inputs this agent handles well */
|
|
8
|
+
examples?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface SwarmAgentDef<S extends Record<string, unknown> = Record<string, unknown>> {
|
|
11
|
+
/** Unique ID within the swarm */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Human-readable role label */
|
|
14
|
+
role: string;
|
|
15
|
+
/** Describes what this agent can handle — used by Supervisor for routing */
|
|
16
|
+
capabilities: AgentCapability[];
|
|
17
|
+
/** The compiled skeleton backing this agent */
|
|
18
|
+
skeleton: ONISkeleton<S>;
|
|
19
|
+
/** Max simultaneous executions (default: 1) */
|
|
20
|
+
maxConcurrency?: number;
|
|
21
|
+
/** System prompt injected into routing context */
|
|
22
|
+
systemPrompt?: string;
|
|
23
|
+
/** Max retries before fallback to supervisor (default: 2) */
|
|
24
|
+
maxRetries?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface HandoffOptions {
|
|
27
|
+
/** Target agent ID to hand off to */
|
|
28
|
+
to: string;
|
|
29
|
+
/** Human-readable instruction for the receiving agent */
|
|
30
|
+
message: string;
|
|
31
|
+
/** Additional context merged into the receiving agent's input */
|
|
32
|
+
context?: Record<string, unknown>;
|
|
33
|
+
/**
|
|
34
|
+
* Which agent to return to after the target completes.
|
|
35
|
+
* If omitted, control returns to the Supervisor (if present) or END.
|
|
36
|
+
*/
|
|
37
|
+
resume?: string;
|
|
38
|
+
/** Priority hint for the AgentPool scheduler */
|
|
39
|
+
priority?: "low" | "normal" | "high" | "critical";
|
|
40
|
+
}
|
|
41
|
+
export declare class Handoff {
|
|
42
|
+
readonly opts: HandoffOptions;
|
|
43
|
+
readonly isHandoff = true;
|
|
44
|
+
constructor(opts: HandoffOptions);
|
|
45
|
+
get to(): string;
|
|
46
|
+
get message(): string;
|
|
47
|
+
get context(): Record<string, unknown> | undefined;
|
|
48
|
+
get resume(): string | undefined;
|
|
49
|
+
get priority(): string;
|
|
50
|
+
}
|
|
51
|
+
export interface SwarmMessage {
|
|
52
|
+
id: string;
|
|
53
|
+
from: string;
|
|
54
|
+
to: string;
|
|
55
|
+
content: string;
|
|
56
|
+
metadata?: Record<string, unknown>;
|
|
57
|
+
timestamp: number;
|
|
58
|
+
replyTo?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface HandoffRecord {
|
|
61
|
+
from: string;
|
|
62
|
+
to: string;
|
|
63
|
+
message: string;
|
|
64
|
+
step: number;
|
|
65
|
+
timestamp: number;
|
|
66
|
+
resume?: string;
|
|
67
|
+
}
|
|
68
|
+
export interface SwarmMeta {
|
|
69
|
+
activeAgents: string[];
|
|
70
|
+
completedAgents: string[];
|
|
71
|
+
handoffHistory: HandoffRecord[];
|
|
72
|
+
messages: SwarmMessage[];
|
|
73
|
+
currentAgent?: string;
|
|
74
|
+
supervisorRound: number;
|
|
75
|
+
}
|
|
76
|
+
export type SupervisorRoutingStrategy = "llm" | "rule" | "round-robin";
|
|
77
|
+
export interface RuleRoute {
|
|
78
|
+
condition: (task: string, context: Record<string, unknown>) => boolean;
|
|
79
|
+
agentId: string;
|
|
80
|
+
}
|
|
81
|
+
export interface SupervisorConfig<S extends Record<string, unknown>> {
|
|
82
|
+
/** ONIModel for LLM-based routing (required if strategy === "llm") */
|
|
83
|
+
model?: ONIModel;
|
|
84
|
+
/** Routing strategy */
|
|
85
|
+
strategy: SupervisorRoutingStrategy;
|
|
86
|
+
/** Rule-based routes (required if strategy === "rule") */
|
|
87
|
+
rules?: RuleRoute[];
|
|
88
|
+
/** Field in state that contains the current task */
|
|
89
|
+
taskField: keyof S;
|
|
90
|
+
/** Field in state that contains routing context */
|
|
91
|
+
contextField?: keyof S;
|
|
92
|
+
/** Max rounds before Supervisor sends to END */
|
|
93
|
+
maxRounds?: number;
|
|
94
|
+
/** System prompt for LLM-based routing */
|
|
95
|
+
systemPrompt?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface AgentPoolConfig<S extends Record<string, unknown>> {
|
|
98
|
+
/** Agents in the pool — all handle the same task type */
|
|
99
|
+
agents: SwarmAgentDef<S>[];
|
|
100
|
+
/** Load balancing strategy */
|
|
101
|
+
strategy?: "round-robin" | "least-busy" | "random";
|
|
102
|
+
/** Max queue depth before backpressure kicks in */
|
|
103
|
+
maxQueueDepth?: number;
|
|
104
|
+
}
|
|
105
|
+
export interface SwarmCompileOptions<S extends Record<string, unknown>> {
|
|
106
|
+
checkpointer?: ONICheckpointer<S>;
|
|
107
|
+
interruptBefore?: string[];
|
|
108
|
+
interruptAfter?: string[];
|
|
109
|
+
}
|
|
110
|
+
export type SwarmTopology = "hierarchical" | "peer-to-peer" | "pipeline" | "hierarchical-mesh" | "custom";
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/swarm/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @oni.bot/core/swarm — Swarm Types
|
|
3
|
+
// ============================================================
|
|
4
|
+
export class Handoff {
|
|
5
|
+
opts;
|
|
6
|
+
isHandoff = true;
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
this.opts = opts;
|
|
9
|
+
}
|
|
10
|
+
get to() { return this.opts.to; }
|
|
11
|
+
get message() { return this.opts.message; }
|
|
12
|
+
get context() { return this.opts.context; }
|
|
13
|
+
get resume() { return this.opts.resume; }
|
|
14
|
+
get priority() { return this.opts.priority ?? "normal"; }
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/swarm/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAuD/D,MAAM,OAAO,OAAO;IAEU;IADnB,SAAS,GAAG,IAAI,CAAC;IAC1B,YAA4B,IAAoB;QAApB,SAAI,GAAJ,IAAI,CAAgB;IAAG,CAAC;IAEpD,IAAI,EAAE,KAAoB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,IAAI,OAAO,KAAe,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,KAA2C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,IAAI,MAAM,KAA2B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,KAAc,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC;CACnE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ToolDefinition, DefineToolOptions } from "./types.js";
|
|
2
|
+
export declare function defineTool<TInput = any, TOutput = any>(opts: DefineToolOptions<TInput, TOutput>): ToolDefinition<TInput, TOutput>;
|
|
3
|
+
export declare function executeTool<TInput, TOutput>(tool: ToolDefinition<TInput, TOutput>, input: TInput): Promise<TOutput>;
|
|
4
|
+
export declare function executeToolCalls(tools: ToolDefinition[], calls: Array<{
|
|
5
|
+
name: string;
|
|
6
|
+
args: Record<string, unknown>;
|
|
7
|
+
id: string;
|
|
8
|
+
}>): Promise<Array<{
|
|
9
|
+
toolCallId: string;
|
|
10
|
+
name: string;
|
|
11
|
+
result: unknown;
|
|
12
|
+
isError?: boolean;
|
|
13
|
+
}>>;
|
|
14
|
+
//# sourceMappingURL=define.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/tools/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAe,MAAM,YAAY,CAAC;AAGjF,wBAAgB,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EACpD,IAAI,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAOjC;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,OAAO,EAC/C,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,cAAc,EAAE,EACvB,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GACxE,OAAO,CAAC,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAgB1F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { getConfig, getStore, getCurrentState, getStreamWriter } from "../context.js";
|
|
2
|
+
export function defineTool(opts) {
|
|
3
|
+
return {
|
|
4
|
+
name: opts.name,
|
|
5
|
+
description: opts.description,
|
|
6
|
+
schema: opts.schema,
|
|
7
|
+
execute: opts.execute,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export async function executeTool(tool, input) {
|
|
11
|
+
const ctx = {
|
|
12
|
+
config: getConfig(),
|
|
13
|
+
store: getStore(),
|
|
14
|
+
state: getCurrentState(),
|
|
15
|
+
emit: (event, data) => {
|
|
16
|
+
const writer = getStreamWriter();
|
|
17
|
+
if (writer)
|
|
18
|
+
writer.emit(event, data);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
return await tool.execute(input, ctx);
|
|
22
|
+
}
|
|
23
|
+
export async function executeToolCalls(tools, calls) {
|
|
24
|
+
const toolMap = new Map(tools.map(t => [t.name, t]));
|
|
25
|
+
return Promise.all(calls.map(async (call) => {
|
|
26
|
+
const tool = toolMap.get(call.name);
|
|
27
|
+
if (!tool) {
|
|
28
|
+
return { toolCallId: call.id, name: call.name, result: `Tool "${call.name}" not found`, isError: true };
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const result = await executeTool(tool, call.args);
|
|
32
|
+
return { toolCallId: call.id, name: call.name, result };
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return { toolCallId: call.id, name: call.name, result: String(err), isError: true };
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/tools/define.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEtF,MAAM,UAAU,UAAU,CACxB,IAAwC;IAExC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAqC,EACrC,KAAa;IAEb,MAAM,GAAG,GAAgB;QACvB,MAAM,EAAE,SAAS,EAAE;QACnB,KAAK,EAAE,QAAQ,EAAE;QACjB,KAAK,EAAE,eAAe,EAA2B;QACjD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YACjC,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;IACF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAuB,EACvB,KAAyE;IAEzE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,IAAI,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1G,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtF,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|