@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,98 @@
1
+ // ============================================================
2
+ // @oni.bot/core — SQLite Checkpointer
3
+ // ============================================================
4
+ // Persistent on-disk checkpointing via better-sqlite3.
5
+ //
6
+ // npm install better-sqlite3
7
+ // npm install -D @types/better-sqlite3
8
+ // ============================================================
9
+ export class SqliteCheckpointer {
10
+ db;
11
+ constructor(db) {
12
+ this.db = db;
13
+ }
14
+ static async create(dbPath) {
15
+ let DB;
16
+ try {
17
+ const mod = await import("better-sqlite3");
18
+ DB = mod.default ?? mod;
19
+ }
20
+ catch {
21
+ throw new Error("SqliteCheckpointer requires: npm install better-sqlite3");
22
+ }
23
+ const db = new DB(dbPath);
24
+ db.exec("PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;");
25
+ db.exec(`
26
+ CREATE TABLE IF NOT EXISTS oni_checkpoints (
27
+ thread_id TEXT NOT NULL,
28
+ step INTEGER NOT NULL,
29
+ agent_id TEXT,
30
+ state TEXT NOT NULL,
31
+ next_nodes TEXT NOT NULL,
32
+ pending_sends TEXT NOT NULL DEFAULT '[]',
33
+ metadata TEXT DEFAULT NULL,
34
+ timestamp INTEGER NOT NULL,
35
+ PRIMARY KEY (thread_id, step)
36
+ );
37
+ CREATE INDEX IF NOT EXISTS idx_thread ON oni_checkpoints (thread_id);
38
+ `);
39
+ return new SqliteCheckpointer(db);
40
+ }
41
+ async get(threadId) {
42
+ const row = this.db
43
+ .prepare("SELECT * FROM oni_checkpoints WHERE thread_id=? ORDER BY step DESC LIMIT 1")
44
+ .get(threadId);
45
+ return row ? this.deserialize(row) : null;
46
+ }
47
+ async put(cp) {
48
+ this.db.prepare(`
49
+ INSERT OR REPLACE INTO oni_checkpoints
50
+ (thread_id, step, agent_id, state, next_nodes, pending_sends, metadata, timestamp)
51
+ VALUES (?,?,?,?,?,?,?,?)
52
+ `).run(cp.threadId, cp.step, cp.agentId ?? null, JSON.stringify(cp.state), JSON.stringify(cp.nextNodes), JSON.stringify(cp.pendingSends ?? []), cp.metadata ? JSON.stringify(cp.metadata) : null, cp.timestamp);
53
+ }
54
+ async list(threadId, opts) {
55
+ let sql = "SELECT * FROM oni_checkpoints WHERE thread_id=?";
56
+ const params = [threadId];
57
+ if (opts?.before !== undefined) {
58
+ sql += " AND step < ?";
59
+ params.push(opts.before);
60
+ }
61
+ sql += " ORDER BY step ASC";
62
+ if (opts?.limit !== undefined) {
63
+ sql += " LIMIT ?";
64
+ params.push(opts.limit);
65
+ }
66
+ let items = this.db.prepare(sql).all(...params)
67
+ .map(r => this.deserialize(r));
68
+ if (opts?.filter) {
69
+ items = items.filter(c => {
70
+ if (!c.metadata)
71
+ return false;
72
+ return Object.entries(opts.filter).every(([k, v]) => c.metadata[k] === v);
73
+ });
74
+ }
75
+ return items;
76
+ }
77
+ async delete(threadId) {
78
+ this.db.prepare("DELETE FROM oni_checkpoints WHERE thread_id=?").run(threadId);
79
+ }
80
+ async getAt(threadId, step) {
81
+ const row = this.db.prepare("SELECT * FROM oni_checkpoints WHERE thread_id=? AND step=?").get(threadId, step);
82
+ return row ? this.deserialize(row) : null;
83
+ }
84
+ close() { this.db.close(); }
85
+ deserialize(row) {
86
+ return {
87
+ threadId: row["thread_id"],
88
+ step: row["step"],
89
+ agentId: row["agent_id"] ?? undefined,
90
+ state: JSON.parse(row["state"]),
91
+ nextNodes: JSON.parse(row["next_nodes"]),
92
+ pendingSends: JSON.parse(row["pending_sends"]),
93
+ metadata: row["metadata"] ? JSON.parse(row["metadata"]) : undefined,
94
+ timestamp: row["timestamp"],
95
+ };
96
+ }
97
+ }
98
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/checkpointers/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ONIConfig } from "./types.js";
2
+ import type { BaseStore } from "./store/index.js";
3
+ export interface StreamWriter {
4
+ emit(name: string, data: unknown): void;
5
+ token(token: string): void;
6
+ }
7
+ export interface RunContext {
8
+ config: ONIConfig;
9
+ store: BaseStore | null;
10
+ writer: StreamWriter | null;
11
+ state: unknown;
12
+ parentGraph: unknown | null;
13
+ parentUpdates: Array<Partial<unknown>>;
14
+ step: number;
15
+ recursionLimit: number;
16
+ }
17
+ export declare function _runWithContext<T>(ctx: RunContext, fn: () => T | Promise<T>): Promise<T>;
18
+ export declare function _getRunContext(): RunContext | undefined;
19
+ export declare function getConfig(): ONIConfig;
20
+ export declare function getStore(): BaseStore | null;
21
+ export declare function getStreamWriter(): StreamWriter | null;
22
+ export declare function getCurrentState<S>(): S;
23
+ export declare function getRemainingSteps(): number;
24
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,UAAU,EACf,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,wBAAgB,cAAc,IAAI,UAAU,GAAG,SAAS,CAEvD;AAID,wBAAgB,SAAS,IAAI,SAAS,CAIrC;AAED,wBAAgB,QAAQ,IAAI,SAAS,GAAG,IAAI,CAI3C;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAIrD;AAED,wBAAgB,eAAe,CAAC,CAAC,KAAK,CAAC,CAItC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C"}
@@ -0,0 +1,47 @@
1
+ // ============================================================
2
+ // @oni.bot/core — Runtime Context (AsyncLocalStorage)
3
+ // ============================================================
4
+ // Provides getConfig(), getStore(), getStreamWriter() as
5
+ // free-standing imports callable from inside any node.
6
+ // ============================================================
7
+ import { AsyncLocalStorage } from "node:async_hooks";
8
+ const storage = new AsyncLocalStorage();
9
+ // ---- Internal: run a function with context installed ----
10
+ export function _runWithContext(ctx, fn) {
11
+ return storage.run(ctx, () => Promise.resolve(fn()));
12
+ }
13
+ export function _getRunContext() {
14
+ return storage.getStore();
15
+ }
16
+ // ---- Public accessors ----
17
+ export function getConfig() {
18
+ const ctx = storage.getStore();
19
+ if (!ctx)
20
+ throw new Error("getConfig() called outside of a graph node execution.");
21
+ return ctx.config;
22
+ }
23
+ export function getStore() {
24
+ const ctx = storage.getStore();
25
+ if (!ctx)
26
+ throw new Error("getStore() called outside of a graph node execution.");
27
+ return ctx.store;
28
+ }
29
+ export function getStreamWriter() {
30
+ const ctx = storage.getStore();
31
+ if (!ctx)
32
+ throw new Error("getStreamWriter() called outside of a graph node execution.");
33
+ return ctx.writer;
34
+ }
35
+ export function getCurrentState() {
36
+ const ctx = storage.getStore();
37
+ if (!ctx)
38
+ throw new Error("getCurrentState() called outside of a graph node execution.");
39
+ return ctx.state;
40
+ }
41
+ export function getRemainingSteps() {
42
+ const ctx = storage.getStore();
43
+ if (!ctx)
44
+ throw new Error("getRemainingSteps() called outside of a graph node execution.");
45
+ return ctx.recursionLimit - ctx.step;
46
+ }
47
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,sDAAsD;AACtD,+DAA+D;AAC/D,yDAAyD;AACzD,uDAAuD;AACvD,+DAA+D;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAqBrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAc,CAAC;AAEpD,4DAA4D;AAE5D,MAAM,UAAU,eAAe,CAC7B,GAAe,EACf,EAAwB;IAExB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,6BAA6B;AAE7B,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACnF,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAClF,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC,KAAU,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAC3F,OAAO,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC;AACvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { RequestReplyBroker, type PendingRequest } from "./request-reply.js";
2
+ export { PubSub, topicMatches, type TopicMessage } from "./pubsub.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordination/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { RequestReplyBroker } from "./request-reply.js";
2
+ export { PubSub, topicMatches } from "./pubsub.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordination/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAuB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @oni.bot/core — Pub/Sub coordination
3
+ *
4
+ * Provides topic-based publish/subscribe messaging between agents.
5
+ * Supports wildcard patterns ("*" for single segment, "**" for deep match).
6
+ */
7
+ export interface TopicMessage {
8
+ topic: string;
9
+ data: unknown;
10
+ from: string;
11
+ timestamp: number;
12
+ }
13
+ export declare class PubSub {
14
+ private subscribers;
15
+ private buffer;
16
+ /** Publish a message to a topic, notifying all matching subscribers. */
17
+ publish(from: string, topic: string, data: unknown): void;
18
+ /**
19
+ * Subscribe to a topic pattern. Returns an unsubscribe function.
20
+ * Patterns support "*" (single segment) and "**" (deep match).
21
+ */
22
+ subscribe(pattern: string, handler: (msg: TopicMessage) => void): () => void;
23
+ /** Return all buffered messages matching the given topic pattern. */
24
+ getMessages(pattern: string): TopicMessage[];
25
+ /** Drain the buffer, returning all buffered messages. */
26
+ flush(): TopicMessage[];
27
+ }
28
+ /**
29
+ * Check whether a topic pattern matches a concrete topic string.
30
+ *
31
+ * Rules:
32
+ * - Exact match: "a.b" matches "a.b"
33
+ * - Global wildcard: "*" matches any topic
34
+ * - Single-segment wildcard: "a.*" matches "a.b" but not "a.b.c"
35
+ * - Deep wildcard: "a.**" matches "a.b", "a.b.c", "a.b.c.d", etc.
36
+ */
37
+ export declare function topicMatches(pattern: string, topic: string): boolean;
38
+ //# sourceMappingURL=pubsub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../src/coordination/pubsub.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,WAAW,CAAuD;IAC1E,OAAO,CAAC,MAAM,CAAsB;IAEpC,wEAAwE;IACxE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAUzD;;;OAGG;IACH,SAAS,CACP,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,GACnC,MAAM,IAAI;IASb,qEAAqE;IACrE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAI5C,yDAAyD;IACzD,KAAK,IAAI,YAAY,EAAE;CAKxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAiBpE"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @oni.bot/core — Pub/Sub coordination
3
+ *
4
+ * Provides topic-based publish/subscribe messaging between agents.
5
+ * Supports wildcard patterns ("*" for single segment, "**" for deep match).
6
+ */
7
+ export class PubSub {
8
+ subscribers = new Map();
9
+ buffer = [];
10
+ /** Publish a message to a topic, notifying all matching subscribers. */
11
+ publish(from, topic, data) {
12
+ const msg = { topic, data, from, timestamp: Date.now() };
13
+ this.buffer.push(msg);
14
+ for (const [pattern, handlers] of this.subscribers) {
15
+ if (topicMatches(pattern, topic)) {
16
+ for (const handler of handlers)
17
+ handler(msg);
18
+ }
19
+ }
20
+ }
21
+ /**
22
+ * Subscribe to a topic pattern. Returns an unsubscribe function.
23
+ * Patterns support "*" (single segment) and "**" (deep match).
24
+ */
25
+ subscribe(pattern, handler) {
26
+ if (!this.subscribers.has(pattern))
27
+ this.subscribers.set(pattern, new Set());
28
+ this.subscribers.get(pattern).add(handler);
29
+ return () => {
30
+ this.subscribers.get(pattern)?.delete(handler);
31
+ };
32
+ }
33
+ /** Return all buffered messages matching the given topic pattern. */
34
+ getMessages(pattern) {
35
+ return this.buffer.filter((m) => topicMatches(pattern, m.topic));
36
+ }
37
+ /** Drain the buffer, returning all buffered messages. */
38
+ flush() {
39
+ const msgs = [...this.buffer];
40
+ this.buffer = [];
41
+ return msgs;
42
+ }
43
+ }
44
+ /**
45
+ * Check whether a topic pattern matches a concrete topic string.
46
+ *
47
+ * Rules:
48
+ * - Exact match: "a.b" matches "a.b"
49
+ * - Global wildcard: "*" matches any topic
50
+ * - Single-segment wildcard: "a.*" matches "a.b" but not "a.b.c"
51
+ * - Deep wildcard: "a.**" matches "a.b", "a.b.c", "a.b.c.d", etc.
52
+ */
53
+ export function topicMatches(pattern, topic) {
54
+ if (pattern === topic)
55
+ return true;
56
+ if (pattern === "*")
57
+ return true;
58
+ const pp = pattern.split(".");
59
+ const tp = topic.split(".");
60
+ for (let i = 0; i < pp.length; i++) {
61
+ if (pp[i] === "**")
62
+ return true;
63
+ if (pp[i] === "*") {
64
+ if (i === pp.length - 1)
65
+ return tp.length === pp.length;
66
+ continue;
67
+ }
68
+ if (pp[i] !== tp[i])
69
+ return false;
70
+ }
71
+ return pp.length === tp.length;
72
+ }
73
+ //# sourceMappingURL=pubsub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../src/coordination/pubsub.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,OAAO,MAAM;IACT,WAAW,GAAG,IAAI,GAAG,EAA4C,CAAC;IAClE,MAAM,GAAmB,EAAE,CAAC;IAEpC,wEAAwE;IACxE,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,IAAa;QAChD,MAAM,GAAG,GAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;gBACjC,KAAK,MAAM,OAAO,IAAI,QAAQ;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,SAAS,CACP,OAAe,EACf,OAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,WAAW,CAAC,OAAe;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,yDAAyD;IACzD,KAAK;QACH,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAa;IACzD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC;YACxD,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC;AACjC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @oni.bot/core — Request/Reply coordination broker
3
+ *
4
+ * Enables request/response patterns between agents in a graph.
5
+ * A requesting agent sends a typed payload to a target agent and
6
+ * receives a promise that resolves when the target replies.
7
+ */
8
+ export interface PendingRequest {
9
+ id: string;
10
+ from: string;
11
+ to: string;
12
+ payload: unknown;
13
+ timestamp: number;
14
+ resolved: boolean;
15
+ response?: unknown;
16
+ }
17
+ export declare class RequestReplyBroker {
18
+ private pending;
19
+ private resolvers;
20
+ /**
21
+ * Create a request from one agent to another.
22
+ * Returns the request id, a promise that resolves with the reply,
23
+ * and a message object suitable for routing through the graph.
24
+ */
25
+ request(from: string, to: string, payload: unknown): {
26
+ requestId: string;
27
+ promise: Promise<unknown>;
28
+ message: any;
29
+ };
30
+ /**
31
+ * Reply to a pending request, resolving the caller's promise.
32
+ * Returns a reply message object.
33
+ */
34
+ reply(requestId: string, payload: unknown): any;
35
+ /** Check whether an agent has any unresolved incoming requests. */
36
+ hasPending(agentId: string): boolean;
37
+ /** Return all unresolved requests targeted at the given agent. */
38
+ getPending(agentId: string): PendingRequest[];
39
+ }
40
+ //# sourceMappingURL=request-reply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-reply.d.ts","sourceRoot":"","sources":["../../src/coordination/request-reply.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,SAAS,CAA+C;IAEhE;;;;OAIG;IACH,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,GACf;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE;IA4BjE;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,GAAG;IAuB/C,mEAAmE;IACnE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOpC,kEAAkE;IAClE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE;CAK9C"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @oni.bot/core — Request/Reply coordination broker
3
+ *
4
+ * Enables request/response patterns between agents in a graph.
5
+ * A requesting agent sends a typed payload to a target agent and
6
+ * receives a promise that resolves when the target replies.
7
+ */
8
+ export class RequestReplyBroker {
9
+ pending = new Map();
10
+ resolvers = new Map();
11
+ /**
12
+ * Create a request from one agent to another.
13
+ * Returns the request id, a promise that resolves with the reply,
14
+ * and a message object suitable for routing through the graph.
15
+ */
16
+ request(from, to, payload) {
17
+ const id = `req_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
18
+ const req = {
19
+ id,
20
+ from,
21
+ to,
22
+ payload,
23
+ timestamp: Date.now(),
24
+ resolved: false,
25
+ };
26
+ this.pending.set(id, req);
27
+ const promise = new Promise((resolve) => {
28
+ this.resolvers.set(id, resolve);
29
+ });
30
+ const message = {
31
+ id,
32
+ from,
33
+ to,
34
+ content: JSON.stringify({ _type: "request", payload }),
35
+ metadata: { requestId: id },
36
+ timestamp: Date.now(),
37
+ };
38
+ return { requestId: id, promise, message };
39
+ }
40
+ /**
41
+ * Reply to a pending request, resolving the caller's promise.
42
+ * Returns a reply message object.
43
+ */
44
+ reply(requestId, payload) {
45
+ const req = this.pending.get(requestId);
46
+ if (!req)
47
+ throw new Error(`No pending request with id ${requestId}`);
48
+ req.resolved = true;
49
+ req.response = payload;
50
+ const resolver = this.resolvers.get(requestId);
51
+ if (resolver) {
52
+ resolver(payload);
53
+ this.resolvers.delete(requestId);
54
+ }
55
+ return {
56
+ id: `reply_${requestId}`,
57
+ from: req.to,
58
+ to: req.from,
59
+ content: JSON.stringify({ _type: "reply", requestId, payload }),
60
+ metadata: { requestId, isReply: true },
61
+ timestamp: Date.now(),
62
+ };
63
+ }
64
+ /** Check whether an agent has any unresolved incoming requests. */
65
+ hasPending(agentId) {
66
+ for (const req of this.pending.values()) {
67
+ if (req.to === agentId && !req.resolved)
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ /** Return all unresolved requests targeted at the given agent. */
73
+ getPending(agentId) {
74
+ return [...this.pending.values()].filter((r) => r.to === agentId && !r.resolved);
75
+ }
76
+ }
77
+ //# sourceMappingURL=request-reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-reply.js","sourceRoot":"","sources":["../../src/coordination/request-reply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare class ONIError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class InvalidSkeletonError extends ONIError {
5
+ constructor(msg: string);
6
+ }
7
+ export declare class RecursionLimitError extends ONIError {
8
+ constructor(limit: number);
9
+ }
10
+ export declare class NodeNotFoundError extends ONIError {
11
+ constructor(name: string);
12
+ }
13
+ export declare class EdgeConflictError extends ONIError {
14
+ constructor(from: string, to: string);
15
+ }
16
+ export declare class NodeExecutionError extends ONIError {
17
+ constructor(node: string, cause: Error);
18
+ }
19
+ /** Thrown at interrupt checkpoints — caught externally to pause/resume */
20
+ export declare class ONIInterrupt {
21
+ readonly node: string;
22
+ readonly timing: "before" | "after";
23
+ readonly state: unknown;
24
+ readonly isONIInterrupt = true;
25
+ constructor(node: string, timing: "before" | "after", state: unknown);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAIA,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM;CAC5B;AACD,qBAAa,oBAAqB,SAAQ,QAAQ;gBACpC,GAAG,EAAE,MAAM;CACxB;AACD,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,KAAK,EAAE,MAAM;CAI1B;AACD,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,IAAI,EAAE,MAAM;CACzB;AACD,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;CACrC;AACD,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAKvC;AAED,0EAA0E;AAC1E,qBAAa,YAAY;aAGL,IAAI,EAAI,MAAM;aACd,MAAM,EAAE,QAAQ,GAAG,OAAO;aAC1B,KAAK,EAAG,OAAO;IAJjC,QAAQ,CAAC,cAAc,QAAQ;gBAEb,IAAI,EAAI,MAAM,EACd,MAAM,EAAE,QAAQ,GAAG,OAAO,EAC1B,KAAK,EAAG,OAAO;CAElC"}
package/dist/errors.js ADDED
@@ -0,0 +1,41 @@
1
+ // ============================================================
2
+ // @oni.bot/core — Error Types v2
3
+ // ============================================================
4
+ export class ONIError extends Error {
5
+ constructor(message) { super(message); this.name = "ONIError"; }
6
+ }
7
+ export class InvalidSkeletonError extends ONIError {
8
+ constructor(msg) { super(msg); this.name = "InvalidSkeletonError"; }
9
+ }
10
+ export class RecursionLimitError extends ONIError {
11
+ constructor(limit) {
12
+ super(`Recursion limit of ${limit} reached. Possible infinite loop in agent skeleton.`);
13
+ this.name = "RecursionLimitError";
14
+ }
15
+ }
16
+ export class NodeNotFoundError extends ONIError {
17
+ constructor(name) { super(`Node "${name}" not found in skeleton.`); this.name = "NodeNotFoundError"; }
18
+ }
19
+ export class EdgeConflictError extends ONIError {
20
+ constructor(from, to) { super(`Edge conflict: "${from}" → "${to}" already exists.`); this.name = "EdgeConflictError"; }
21
+ }
22
+ export class NodeExecutionError extends ONIError {
23
+ constructor(node, cause) {
24
+ super(`Node "${node}" failed after all retry attempts: ${cause.message}`);
25
+ this.name = "NodeExecutionError";
26
+ this.cause = cause;
27
+ }
28
+ }
29
+ /** Thrown at interrupt checkpoints — caught externally to pause/resume */
30
+ export class ONIInterrupt {
31
+ node;
32
+ timing;
33
+ state;
34
+ isONIInterrupt = true;
35
+ constructor(node, timing, state) {
36
+ this.node = node;
37
+ this.timing = timing;
38
+ this.state = state;
39
+ }
40
+ }
41
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,iCAAiC;AACjC,+DAA+D;AAE/D,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;CACzE;AACD,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,GAAW,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC;CAC7E;AACD,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,KAAa;QACvB,KAAK,CAAC,sBAAsB,KAAK,qDAAqD,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AACD,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,IAAY,IAAI,KAAK,CAAC,SAAS,IAAI,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC,CAAC,CAAC;CAC/G;AACD,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,IAAY,EAAE,EAAU,IAAI,KAAK,CAAC,mBAAmB,IAAI,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC,CAAC,CAAC;CACxI;AACD,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,IAAY,EAAE,KAAY;QACpC,KAAK,CAAC,SAAS,IAAI,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,0EAA0E;AAC1E,MAAM,OAAO,YAAY;IAGL;IACA;IACA;IAJT,cAAc,GAAG,IAAI,CAAC;IAC/B,YACkB,IAAc,EACd,MAA0B,EAC1B,KAAe;QAFf,SAAI,GAAJ,IAAI,CAAU;QACd,WAAM,GAAN,MAAM,CAAoB;QAC1B,UAAK,GAAL,KAAK,CAAU;IAC9B,CAAC;CACL"}
@@ -0,0 +1,13 @@
1
+ import type { LifecycleEvent, EventType, EventHandler, EventListeners } from "./types.js";
2
+ export declare class EventBus {
3
+ private handlers;
4
+ private allHandlers;
5
+ constructor(listeners?: EventListeners);
6
+ on<T extends EventType>(type: T, handler: EventHandler<Extract<LifecycleEvent, {
7
+ type: T;
8
+ }>>): () => void;
9
+ onAll(handler: EventHandler<LifecycleEvent>): () => void;
10
+ emit(event: LifecycleEvent): void;
11
+ removeAll(): void;
12
+ }
13
+ //# sourceMappingURL=bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1F,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,WAAW,CAA2C;gBAElD,SAAS,CAAC,EAAE,cAAc;IAQtC,EAAE,CAAC,CAAC,SAAS,SAAS,EACpB,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC,GAC1D,MAAM,IAAI;IAQb,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI;IAOxD,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAoBjC,SAAS,IAAI,IAAI;CAIlB"}
@@ -0,0 +1,52 @@
1
+ export class EventBus {
2
+ handlers = new Map();
3
+ allHandlers = new Set();
4
+ constructor(listeners) {
5
+ if (listeners) {
6
+ for (const [type, handler] of Object.entries(listeners)) {
7
+ if (handler)
8
+ this.on(type, handler);
9
+ }
10
+ }
11
+ }
12
+ on(type, handler) {
13
+ if (!this.handlers.has(type))
14
+ this.handlers.set(type, new Set());
15
+ this.handlers.get(type).add(handler);
16
+ return () => {
17
+ this.handlers.get(type)?.delete(handler);
18
+ };
19
+ }
20
+ onAll(handler) {
21
+ this.allHandlers.add(handler);
22
+ return () => {
23
+ this.allHandlers.delete(handler);
24
+ };
25
+ }
26
+ emit(event) {
27
+ const typeHandlers = this.handlers.get(event.type);
28
+ if (typeHandlers) {
29
+ for (const h of typeHandlers) {
30
+ try {
31
+ h(event);
32
+ }
33
+ catch {
34
+ // swallow listener errors
35
+ }
36
+ }
37
+ }
38
+ for (const h of this.allHandlers) {
39
+ try {
40
+ h(event);
41
+ }
42
+ catch {
43
+ // swallow listener errors
44
+ }
45
+ }
46
+ }
47
+ removeAll() {
48
+ this.handlers.clear();
49
+ this.allHandlers.clear();
50
+ }
51
+ }
52
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,QAAQ;IACX,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IACrD,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE9D,YAAY,SAA0B;QACpC,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxD,IAAI,OAAO;oBAAE,IAAI,CAAC,EAAE,CAAC,IAAiB,EAAE,OAA4B,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,EAAE,CACA,IAAO,EACP,OAA2D;QAE3D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAqC;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAqB;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,CAAC,CAAC,KAAK,CAAC,CAAC;gBACX,CAAC;gBAAC,MAAM,CAAC;oBACP,0BAA0B;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,CAAC,CAAC,KAAK,CAAC,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export type { LifecycleEvent, EventType, EventHandler, EventListeners, AgentStartEvent, AgentEndEvent, LLMRequestEvent, LLMResponseEvent, ToolCallEvent, ToolResultEvent, HandoffEvent, FilterBlockedEvent, BudgetWarningEvent, ErrorEvent, } from "./types.js";
2
+ export { EventBus } from "./bus.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Bus
2
+ export { EventBus } from "./bus.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAkBA,MAAM;AACN,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}