@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.
Files changed (234) hide show
  1. package/README.md +308 -0
  2. package/dist/agents/context.d.ts +24 -0
  3. package/dist/agents/context.d.ts.map +1 -0
  4. package/dist/agents/context.js +93 -0
  5. package/dist/agents/context.js.map +1 -0
  6. package/dist/agents/define-agent.d.ts +10 -0
  7. package/dist/agents/define-agent.d.ts.map +1 -0
  8. package/dist/agents/define-agent.js +121 -0
  9. package/dist/agents/define-agent.js.map +1 -0
  10. package/dist/agents/functional-agent.d.ts +12 -0
  11. package/dist/agents/functional-agent.d.ts.map +1 -0
  12. package/dist/agents/functional-agent.js +115 -0
  13. package/dist/agents/functional-agent.js.map +1 -0
  14. package/dist/agents/index.d.ts +6 -0
  15. package/dist/agents/index.d.ts.map +1 -0
  16. package/dist/agents/index.js +7 -0
  17. package/dist/agents/index.js.map +1 -0
  18. package/dist/agents/types.d.ts +62 -0
  19. package/dist/agents/types.d.ts.map +1 -0
  20. package/dist/agents/types.js +8 -0
  21. package/dist/agents/types.js.map +1 -0
  22. package/dist/checkpoint.d.ts +27 -0
  23. package/dist/checkpoint.d.ts.map +1 -0
  24. package/dist/checkpoint.js +91 -0
  25. package/dist/checkpoint.js.map +1 -0
  26. package/dist/checkpointers/index.d.ts +4 -0
  27. package/dist/checkpointers/index.d.ts.map +1 -0
  28. package/dist/checkpointers/index.js +5 -0
  29. package/dist/checkpointers/index.js.map +1 -0
  30. package/dist/checkpointers/namespaced.d.ts +12 -0
  31. package/dist/checkpointers/namespaced.d.ts.map +1 -0
  32. package/dist/checkpointers/namespaced.js +37 -0
  33. package/dist/checkpointers/namespaced.js.map +1 -0
  34. package/dist/checkpointers/postgres.d.ts +13 -0
  35. package/dist/checkpointers/postgres.d.ts.map +1 -0
  36. package/dist/checkpointers/postgres.js +100 -0
  37. package/dist/checkpointers/postgres.js.map +1 -0
  38. package/dist/checkpointers/sqlite.d.ts +14 -0
  39. package/dist/checkpointers/sqlite.d.ts.map +1 -0
  40. package/dist/checkpointers/sqlite.js +98 -0
  41. package/dist/checkpointers/sqlite.js.map +1 -0
  42. package/dist/context.d.ts +24 -0
  43. package/dist/context.d.ts.map +1 -0
  44. package/dist/context.js +47 -0
  45. package/dist/context.js.map +1 -0
  46. package/dist/coordination/index.d.ts +3 -0
  47. package/dist/coordination/index.d.ts.map +1 -0
  48. package/dist/coordination/index.js +3 -0
  49. package/dist/coordination/index.js.map +1 -0
  50. package/dist/coordination/pubsub.d.ts +38 -0
  51. package/dist/coordination/pubsub.d.ts.map +1 -0
  52. package/dist/coordination/pubsub.js +73 -0
  53. package/dist/coordination/pubsub.js.map +1 -0
  54. package/dist/coordination/request-reply.d.ts +40 -0
  55. package/dist/coordination/request-reply.d.ts.map +1 -0
  56. package/dist/coordination/request-reply.js +77 -0
  57. package/dist/coordination/request-reply.js.map +1 -0
  58. package/dist/errors.d.ts +27 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +41 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/events/bus.d.ts +13 -0
  63. package/dist/events/bus.d.ts.map +1 -0
  64. package/dist/events/bus.js +52 -0
  65. package/dist/events/bus.js.map +1 -0
  66. package/dist/events/index.d.ts +3 -0
  67. package/dist/events/index.d.ts.map +1 -0
  68. package/dist/events/index.js +3 -0
  69. package/dist/events/index.js.map +1 -0
  70. package/dist/events/types.d.ts +87 -0
  71. package/dist/events/types.d.ts.map +1 -0
  72. package/dist/events/types.js +2 -0
  73. package/dist/events/types.js.map +1 -0
  74. package/dist/functional.d.ts +36 -0
  75. package/dist/functional.d.ts.map +1 -0
  76. package/dist/functional.js +103 -0
  77. package/dist/functional.js.map +1 -0
  78. package/dist/graph.d.ts +74 -0
  79. package/dist/graph.d.ts.map +1 -0
  80. package/dist/graph.js +119 -0
  81. package/dist/graph.js.map +1 -0
  82. package/dist/guardrails/audit.d.ts +13 -0
  83. package/dist/guardrails/audit.d.ts.map +1 -0
  84. package/dist/guardrails/audit.js +31 -0
  85. package/dist/guardrails/audit.js.map +1 -0
  86. package/dist/guardrails/budget.d.ts +30 -0
  87. package/dist/guardrails/budget.d.ts.map +1 -0
  88. package/dist/guardrails/budget.js +154 -0
  89. package/dist/guardrails/budget.js.map +1 -0
  90. package/dist/guardrails/filters.d.ts +24 -0
  91. package/dist/guardrails/filters.d.ts.map +1 -0
  92. package/dist/guardrails/filters.js +87 -0
  93. package/dist/guardrails/filters.js.map +1 -0
  94. package/dist/guardrails/index.d.ts +8 -0
  95. package/dist/guardrails/index.d.ts.map +1 -0
  96. package/dist/guardrails/index.js +9 -0
  97. package/dist/guardrails/index.js.map +1 -0
  98. package/dist/guardrails/permissions.d.ts +9 -0
  99. package/dist/guardrails/permissions.d.ts.map +1 -0
  100. package/dist/guardrails/permissions.js +29 -0
  101. package/dist/guardrails/permissions.js.map +1 -0
  102. package/dist/guardrails/types.d.ts +30 -0
  103. package/dist/guardrails/types.d.ts.map +1 -0
  104. package/dist/guardrails/types.js +2 -0
  105. package/dist/guardrails/types.js.map +1 -0
  106. package/dist/hitl/index.d.ts +5 -0
  107. package/dist/hitl/index.d.ts.map +1 -0
  108. package/dist/hitl/index.js +3 -0
  109. package/dist/hitl/index.js.map +1 -0
  110. package/dist/hitl/interrupt.d.ts +81 -0
  111. package/dist/hitl/interrupt.d.ts.map +1 -0
  112. package/dist/hitl/interrupt.js +116 -0
  113. package/dist/hitl/interrupt.js.map +1 -0
  114. package/dist/hitl/resume.d.ts +33 -0
  115. package/dist/hitl/resume.d.ts.map +1 -0
  116. package/dist/hitl/resume.js +72 -0
  117. package/dist/hitl/resume.js.map +1 -0
  118. package/dist/index.d.ts +57 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +58 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/injected.d.ts +26 -0
  123. package/dist/injected.d.ts.map +1 -0
  124. package/dist/injected.js +25 -0
  125. package/dist/injected.js.map +1 -0
  126. package/dist/inspect.d.ts +31 -0
  127. package/dist/inspect.d.ts.map +1 -0
  128. package/dist/inspect.js +139 -0
  129. package/dist/inspect.js.map +1 -0
  130. package/dist/messages/index.d.ts +66 -0
  131. package/dist/messages/index.d.ts.map +1 -0
  132. package/dist/messages/index.js +123 -0
  133. package/dist/messages/index.js.map +1 -0
  134. package/dist/models/anthropic.d.ts +6 -0
  135. package/dist/models/anthropic.d.ts.map +1 -0
  136. package/dist/models/anthropic.js +317 -0
  137. package/dist/models/anthropic.js.map +1 -0
  138. package/dist/models/google.d.ts +3 -0
  139. package/dist/models/google.d.ts.map +1 -0
  140. package/dist/models/google.js +310 -0
  141. package/dist/models/google.js.map +1 -0
  142. package/dist/models/index.d.ts +6 -0
  143. package/dist/models/index.d.ts.map +1 -0
  144. package/dist/models/index.js +5 -0
  145. package/dist/models/index.js.map +1 -0
  146. package/dist/models/ollama.d.ts +7 -0
  147. package/dist/models/ollama.d.ts.map +1 -0
  148. package/dist/models/ollama.js +205 -0
  149. package/dist/models/ollama.js.map +1 -0
  150. package/dist/models/openai.d.ts +3 -0
  151. package/dist/models/openai.d.ts.map +1 -0
  152. package/dist/models/openai.js +331 -0
  153. package/dist/models/openai.js.map +1 -0
  154. package/dist/models/types.d.ts +77 -0
  155. package/dist/models/types.d.ts.map +1 -0
  156. package/dist/models/types.js +2 -0
  157. package/dist/models/types.js.map +1 -0
  158. package/dist/prebuilt/index.d.ts +5 -0
  159. package/dist/prebuilt/index.d.ts.map +1 -0
  160. package/dist/prebuilt/index.js +4 -0
  161. package/dist/prebuilt/index.js.map +1 -0
  162. package/dist/prebuilt/react-agent.d.ts +35 -0
  163. package/dist/prebuilt/react-agent.d.ts.map +1 -0
  164. package/dist/prebuilt/react-agent.js +55 -0
  165. package/dist/prebuilt/react-agent.js.map +1 -0
  166. package/dist/prebuilt/tool-node.d.ts +15 -0
  167. package/dist/prebuilt/tool-node.d.ts.map +1 -0
  168. package/dist/prebuilt/tool-node.js +61 -0
  169. package/dist/prebuilt/tool-node.js.map +1 -0
  170. package/dist/pregel.d.ts +48 -0
  171. package/dist/pregel.d.ts.map +1 -0
  172. package/dist/pregel.js +583 -0
  173. package/dist/pregel.js.map +1 -0
  174. package/dist/retry.d.ts +3 -0
  175. package/dist/retry.d.ts.map +1 -0
  176. package/dist/retry.js +40 -0
  177. package/dist/retry.js.map +1 -0
  178. package/dist/store/index.d.ts +90 -0
  179. package/dist/store/index.d.ts.map +1 -0
  180. package/dist/store/index.js +214 -0
  181. package/dist/store/index.js.map +1 -0
  182. package/dist/stream-events.d.ts +15 -0
  183. package/dist/stream-events.d.ts.map +1 -0
  184. package/dist/stream-events.js +53 -0
  185. package/dist/stream-events.js.map +1 -0
  186. package/dist/streaming.d.ts +56 -0
  187. package/dist/streaming.d.ts.map +1 -0
  188. package/dist/streaming.js +143 -0
  189. package/dist/streaming.js.map +1 -0
  190. package/dist/swarm/graph.d.ts +184 -0
  191. package/dist/swarm/graph.d.ts.map +1 -0
  192. package/dist/swarm/graph.js +534 -0
  193. package/dist/swarm/graph.js.map +1 -0
  194. package/dist/swarm/index.d.ts +11 -0
  195. package/dist/swarm/index.d.ts.map +1 -0
  196. package/dist/swarm/index.js +10 -0
  197. package/dist/swarm/index.js.map +1 -0
  198. package/dist/swarm/mailbox.d.ts +12 -0
  199. package/dist/swarm/mailbox.d.ts.map +1 -0
  200. package/dist/swarm/mailbox.js +36 -0
  201. package/dist/swarm/mailbox.js.map +1 -0
  202. package/dist/swarm/pool.d.ts +27 -0
  203. package/dist/swarm/pool.d.ts.map +1 -0
  204. package/dist/swarm/pool.js +87 -0
  205. package/dist/swarm/pool.js.map +1 -0
  206. package/dist/swarm/registry.d.ts +37 -0
  207. package/dist/swarm/registry.d.ts.map +1 -0
  208. package/dist/swarm/registry.js +115 -0
  209. package/dist/swarm/registry.js.map +1 -0
  210. package/dist/swarm/supervisor.d.ts +18 -0
  211. package/dist/swarm/supervisor.d.ts.map +1 -0
  212. package/dist/swarm/supervisor.js +117 -0
  213. package/dist/swarm/supervisor.js.map +1 -0
  214. package/dist/swarm/types.d.ts +111 -0
  215. package/dist/swarm/types.d.ts.map +1 -0
  216. package/dist/swarm/types.js +16 -0
  217. package/dist/swarm/types.js.map +1 -0
  218. package/dist/tools/define.d.ts +14 -0
  219. package/dist/tools/define.d.ts.map +1 -0
  220. package/dist/tools/define.js +39 -0
  221. package/dist/tools/define.js.map +1 -0
  222. package/dist/tools/index.d.ts +3 -0
  223. package/dist/tools/index.d.ts.map +1 -0
  224. package/dist/tools/index.js +2 -0
  225. package/dist/tools/index.js.map +1 -0
  226. package/dist/tools/types.d.ts +23 -0
  227. package/dist/tools/types.d.ts.map +1 -0
  228. package/dist/tools/types.js +2 -0
  229. package/dist/tools/types.js.map +1 -0
  230. package/dist/types.d.ts +204 -0
  231. package/dist/types.d.ts.map +1 -0
  232. package/dist/types.js +45 -0
  233. package/dist/types.js.map +1 -0
  234. 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"}