@oni.bot/core 0.8.0 → 1.0.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 (237) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +59 -373
  3. package/dist/checkpointers/sqlite.d.ts.map +1 -1
  4. package/dist/checkpointers/sqlite.js +23 -8
  5. package/dist/checkpointers/sqlite.js.map +1 -1
  6. package/dist/cli/build.d.ts +11 -0
  7. package/dist/cli/build.d.ts.map +1 -0
  8. package/dist/cli/build.js +61 -0
  9. package/dist/cli/build.js.map +1 -0
  10. package/dist/cli/dev.d.ts +5 -0
  11. package/dist/cli/dev.d.ts.map +1 -0
  12. package/dist/cli/dev.js +54 -0
  13. package/dist/cli/dev.js.map +1 -0
  14. package/dist/cli/index.js +16 -27
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/init.d.ts +2 -0
  17. package/dist/cli/init.d.ts.map +1 -1
  18. package/dist/cli/init.js +18 -1
  19. package/dist/cli/init.js.map +1 -1
  20. package/dist/cli/inspect.d.ts +5 -0
  21. package/dist/cli/inspect.d.ts.map +1 -0
  22. package/dist/cli/inspect.js +85 -0
  23. package/dist/cli/inspect.js.map +1 -0
  24. package/dist/cli/router.d.ts +14 -0
  25. package/dist/cli/router.d.ts.map +1 -0
  26. package/dist/cli/router.js +107 -0
  27. package/dist/cli/router.js.map +1 -0
  28. package/dist/cli/run.d.ts +5 -0
  29. package/dist/cli/run.d.ts.map +1 -0
  30. package/dist/cli/run.js +53 -0
  31. package/dist/cli/run.js.map +1 -0
  32. package/dist/cli/templates.d.ts +1 -0
  33. package/dist/cli/templates.d.ts.map +1 -1
  34. package/dist/cli/templates.js +106 -66
  35. package/dist/cli/templates.js.map +1 -1
  36. package/dist/cli/test.d.ts +3 -0
  37. package/dist/cli/test.d.ts.map +1 -0
  38. package/dist/cli/test.js +29 -0
  39. package/dist/cli/test.js.map +1 -0
  40. package/dist/config/index.d.ts +3 -0
  41. package/dist/config/index.d.ts.map +1 -0
  42. package/dist/config/index.js +3 -0
  43. package/dist/config/index.js.map +1 -0
  44. package/dist/config/loader.d.ts +37 -0
  45. package/dist/config/loader.d.ts.map +1 -0
  46. package/dist/config/loader.js +180 -0
  47. package/dist/config/loader.js.map +1 -0
  48. package/dist/config/types.d.ts +74 -0
  49. package/dist/config/types.d.ts.map +1 -0
  50. package/dist/config/types.js +5 -0
  51. package/dist/config/types.js.map +1 -0
  52. package/dist/coordination/pubsub.d.ts +4 -0
  53. package/dist/coordination/pubsub.d.ts.map +1 -1
  54. package/dist/coordination/pubsub.js +8 -0
  55. package/dist/coordination/pubsub.js.map +1 -1
  56. package/dist/coordination/request-reply.d.ts +3 -1
  57. package/dist/coordination/request-reply.d.ts.map +1 -1
  58. package/dist/coordination/request-reply.js +11 -2
  59. package/dist/coordination/request-reply.js.map +1 -1
  60. package/dist/errors.d.ts +7 -1
  61. package/dist/errors.d.ts.map +1 -1
  62. package/dist/errors.js +18 -3
  63. package/dist/errors.js.map +1 -1
  64. package/dist/events/bridge.d.ts +17 -0
  65. package/dist/events/bridge.d.ts.map +1 -0
  66. package/dist/events/bridge.js +67 -0
  67. package/dist/events/bridge.js.map +1 -0
  68. package/dist/events/bus.d.ts +9 -0
  69. package/dist/events/bus.d.ts.map +1 -1
  70. package/dist/events/bus.js +39 -4
  71. package/dist/events/bus.js.map +1 -1
  72. package/dist/events/index.d.ts +2 -1
  73. package/dist/events/index.d.ts.map +1 -1
  74. package/dist/events/index.js +2 -0
  75. package/dist/events/index.js.map +1 -1
  76. package/dist/events/types.d.ts +123 -1
  77. package/dist/events/types.d.ts.map +1 -1
  78. package/dist/graph.d.ts.map +1 -1
  79. package/dist/graph.js +16 -8
  80. package/dist/graph.js.map +1 -1
  81. package/dist/guardrails/types.d.ts +1 -1
  82. package/dist/guardrails/types.d.ts.map +1 -1
  83. package/dist/harness/agent-loop.d.ts.map +1 -1
  84. package/dist/harness/agent-loop.js +226 -29
  85. package/dist/harness/agent-loop.js.map +1 -1
  86. package/dist/harness/context-compactor.d.ts +21 -2
  87. package/dist/harness/context-compactor.d.ts.map +1 -1
  88. package/dist/harness/context-compactor.js +45 -6
  89. package/dist/harness/context-compactor.js.map +1 -1
  90. package/dist/harness/hooks-engine.d.ts +7 -1
  91. package/dist/harness/hooks-engine.d.ts.map +1 -1
  92. package/dist/harness/hooks-engine.js.map +1 -1
  93. package/dist/harness/index.d.ts +3 -2
  94. package/dist/harness/index.d.ts.map +1 -1
  95. package/dist/harness/index.js +2 -0
  96. package/dist/harness/index.js.map +1 -1
  97. package/dist/harness/skill-loader.d.ts +14 -1
  98. package/dist/harness/skill-loader.d.ts.map +1 -1
  99. package/dist/harness/skill-loader.js +33 -3
  100. package/dist/harness/skill-loader.js.map +1 -1
  101. package/dist/harness/types.d.ts +24 -2
  102. package/dist/harness/types.d.ts.map +1 -1
  103. package/dist/harness/types.js.map +1 -1
  104. package/dist/harness/validate-args.d.ts +16 -0
  105. package/dist/harness/validate-args.d.ts.map +1 -0
  106. package/dist/harness/validate-args.js +132 -0
  107. package/dist/harness/validate-args.js.map +1 -0
  108. package/dist/index.d.ts +3 -3
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +12 -12
  111. package/dist/index.js.map +1 -1
  112. package/dist/internal/timeout.d.ts +2 -0
  113. package/dist/internal/timeout.d.ts.map +1 -0
  114. package/dist/internal/timeout.js +16 -0
  115. package/dist/internal/timeout.js.map +1 -0
  116. package/dist/lsp/client.d.ts +70 -0
  117. package/dist/lsp/client.d.ts.map +1 -0
  118. package/dist/lsp/client.js +421 -0
  119. package/dist/lsp/client.js.map +1 -0
  120. package/dist/lsp/index.d.ts +77 -0
  121. package/dist/lsp/index.d.ts.map +1 -0
  122. package/dist/lsp/index.js +183 -0
  123. package/dist/lsp/index.js.map +1 -0
  124. package/dist/lsp/servers.d.ts +48 -0
  125. package/dist/lsp/servers.d.ts.map +1 -0
  126. package/dist/lsp/servers.js +108 -0
  127. package/dist/lsp/servers.js.map +1 -0
  128. package/dist/lsp/types.d.ts +142 -0
  129. package/dist/lsp/types.d.ts.map +1 -0
  130. package/dist/lsp/types.js +16 -0
  131. package/dist/lsp/types.js.map +1 -0
  132. package/dist/mcp/client.d.ts +56 -0
  133. package/dist/mcp/client.d.ts.map +1 -0
  134. package/dist/mcp/client.js +170 -0
  135. package/dist/mcp/client.js.map +1 -0
  136. package/dist/mcp/convert.d.ts +26 -0
  137. package/dist/mcp/convert.d.ts.map +1 -0
  138. package/dist/mcp/convert.js +56 -0
  139. package/dist/mcp/convert.js.map +1 -0
  140. package/dist/mcp/index.d.ts +21 -0
  141. package/dist/mcp/index.d.ts.map +1 -0
  142. package/dist/mcp/index.js +19 -0
  143. package/dist/mcp/index.js.map +1 -0
  144. package/dist/mcp/transport.d.ts +56 -0
  145. package/dist/mcp/transport.d.ts.map +1 -0
  146. package/dist/mcp/transport.js +204 -0
  147. package/dist/mcp/transport.js.map +1 -0
  148. package/dist/mcp/types.d.ts +96 -0
  149. package/dist/mcp/types.d.ts.map +1 -0
  150. package/dist/mcp/types.js +11 -0
  151. package/dist/mcp/types.js.map +1 -0
  152. package/dist/models/anthropic.d.ts.map +1 -1
  153. package/dist/models/anthropic.js +78 -41
  154. package/dist/models/anthropic.js.map +1 -1
  155. package/dist/models/google.d.ts.map +1 -1
  156. package/dist/models/google.js +47 -46
  157. package/dist/models/google.js.map +1 -1
  158. package/dist/models/http-error.d.ts +16 -0
  159. package/dist/models/http-error.d.ts.map +1 -0
  160. package/dist/models/http-error.js +67 -0
  161. package/dist/models/http-error.js.map +1 -0
  162. package/dist/models/index.d.ts +3 -0
  163. package/dist/models/index.d.ts.map +1 -1
  164. package/dist/models/index.js +2 -0
  165. package/dist/models/index.js.map +1 -1
  166. package/dist/models/ollama.d.ts.map +1 -1
  167. package/dist/models/ollama.js +4 -3
  168. package/dist/models/ollama.js.map +1 -1
  169. package/dist/models/openai.d.ts.map +1 -1
  170. package/dist/models/openai.js +36 -44
  171. package/dist/models/openai.js.map +1 -1
  172. package/dist/models/openrouter.d.ts +13 -0
  173. package/dist/models/openrouter.d.ts.map +1 -1
  174. package/dist/models/openrouter.js +86 -47
  175. package/dist/models/openrouter.js.map +1 -1
  176. package/dist/models/sse.d.ts +9 -0
  177. package/dist/models/sse.d.ts.map +1 -0
  178. package/dist/models/sse.js +45 -0
  179. package/dist/models/sse.js.map +1 -0
  180. package/dist/models/types.d.ts +10 -0
  181. package/dist/models/types.d.ts.map +1 -1
  182. package/dist/pregel.d.ts +4 -0
  183. package/dist/pregel.d.ts.map +1 -1
  184. package/dist/pregel.js +121 -54
  185. package/dist/pregel.js.map +1 -1
  186. package/dist/retry.d.ts.map +1 -1
  187. package/dist/retry.js +10 -3
  188. package/dist/retry.js.map +1 -1
  189. package/dist/store/index.d.ts +3 -0
  190. package/dist/store/index.d.ts.map +1 -1
  191. package/dist/store/index.js +17 -0
  192. package/dist/store/index.js.map +1 -1
  193. package/dist/streaming.d.ts +4 -1
  194. package/dist/streaming.d.ts.map +1 -1
  195. package/dist/streaming.js +21 -7
  196. package/dist/streaming.js.map +1 -1
  197. package/dist/swarm/graph.d.ts +81 -2
  198. package/dist/swarm/graph.d.ts.map +1 -1
  199. package/dist/swarm/graph.js +517 -32
  200. package/dist/swarm/graph.js.map +1 -1
  201. package/dist/swarm/index.d.ts +10 -2
  202. package/dist/swarm/index.d.ts.map +1 -1
  203. package/dist/swarm/index.js +6 -1
  204. package/dist/swarm/index.js.map +1 -1
  205. package/dist/swarm/mermaid.d.ts +10 -0
  206. package/dist/swarm/mermaid.d.ts.map +1 -0
  207. package/dist/swarm/mermaid.js +64 -0
  208. package/dist/swarm/mermaid.js.map +1 -0
  209. package/dist/swarm/pool.d.ts +9 -1
  210. package/dist/swarm/pool.d.ts.map +1 -1
  211. package/dist/swarm/pool.js +58 -10
  212. package/dist/swarm/pool.js.map +1 -1
  213. package/dist/swarm/registry.d.ts +11 -1
  214. package/dist/swarm/registry.d.ts.map +1 -1
  215. package/dist/swarm/registry.js +17 -3
  216. package/dist/swarm/registry.js.map +1 -1
  217. package/dist/swarm/scaling.d.ts +95 -0
  218. package/dist/swarm/scaling.d.ts.map +1 -0
  219. package/dist/swarm/scaling.js +214 -0
  220. package/dist/swarm/scaling.js.map +1 -0
  221. package/dist/swarm/snapshot.d.ts +51 -0
  222. package/dist/swarm/snapshot.d.ts.map +1 -0
  223. package/dist/swarm/snapshot.js +115 -0
  224. package/dist/swarm/snapshot.js.map +1 -0
  225. package/dist/swarm/supervisor.d.ts.map +1 -1
  226. package/dist/swarm/supervisor.js +82 -0
  227. package/dist/swarm/supervisor.js.map +1 -1
  228. package/dist/swarm/tracer.d.ts +57 -0
  229. package/dist/swarm/tracer.d.ts.map +1 -0
  230. package/dist/swarm/tracer.js +138 -0
  231. package/dist/swarm/tracer.js.map +1 -0
  232. package/dist/swarm/types.d.ts +23 -1
  233. package/dist/swarm/types.d.ts.map +1 -1
  234. package/dist/swarm/types.js.map +1 -1
  235. package/dist/tools/types.d.ts +2 -0
  236. package/dist/tools/types.d.ts.map +1 -1
  237. package/package.json +160 -141
@@ -14,7 +14,7 @@ export const templates = {
14
14
  test: "vitest run",
15
15
  },
16
16
  dependencies: {
17
- "@oni.bot/core": "^0.7.0",
17
+ "@oni.bot/core": "^0.8.0",
18
18
  },
19
19
  devDependencies: {
20
20
  tsx: "^4.0.0",
@@ -42,77 +42,117 @@ export const templates = {
42
42
  return JSON.stringify(config, null, 2) + "\n";
43
43
  },
44
44
  entrypoint() {
45
- return `import { StateGraph, START, END, lastValue, appendList } from "@oni.bot/core";
46
- import { MemoryCheckpointer } from "@oni.bot/core";
47
- import type { Message } from "@oni.bot/core";
48
-
49
- // Define your state
50
- type AgentState = {
51
- messages: Message[];
52
- result: string;
53
- };
54
-
55
- // Build the graph
56
- const graph = new StateGraph<AgentState>({
57
- channels: {
58
- messages: appendList<Message>(),
59
- result: lastValue(() => ""),
60
- },
61
- });
62
-
63
- // Add nodes
64
- graph.addNode("process", async (state) => {
65
- const lastMessage = state.messages[state.messages.length - 1];
66
- return {
67
- result: \`Processed: \${lastMessage?.content ?? "no input"}\`,
68
- };
69
- });
70
-
71
- // Wire edges
72
- graph.addEdge(START, "process");
73
- graph.addEdge("process", END);
74
-
75
- // Compile with checkpointing
76
- const app = graph.compile({
77
- checkpointer: new MemoryCheckpointer(),
78
- });
79
-
80
- // Run it
81
- const result = await app.invoke(
82
- { messages: [{ id: "1", role: "user", content: "Hello, ONI!" }] },
83
- { threadId: "demo-1" },
84
- );
85
-
86
- console.log("Result:", result.result);
45
+ return `import { StateGraph, START, END, lastValue, appendList } from "@oni.bot/core";
46
+ import { MemoryCheckpointer } from "@oni.bot/core";
47
+ import type { Message } from "@oni.bot/core";
48
+
49
+ // Define your state
50
+ type AgentState = {
51
+ messages: Message[];
52
+ result: string;
53
+ };
54
+
55
+ // Build the graph
56
+ const graph = new StateGraph<AgentState>({
57
+ channels: {
58
+ messages: appendList<Message>(),
59
+ result: lastValue(() => ""),
60
+ },
61
+ });
62
+
63
+ // Add nodes
64
+ graph.addNode("process", async (state) => {
65
+ const lastMessage = state.messages[state.messages.length - 1];
66
+ return {
67
+ result: \`Processed: \${lastMessage?.content ?? "no input"}\`,
68
+ };
69
+ });
70
+
71
+ // Wire edges
72
+ graph.addEdge(START, "process");
73
+ graph.addEdge("process", END);
74
+
75
+ // Compile with checkpointing
76
+ const app = graph.compile({
77
+ checkpointer: new MemoryCheckpointer(),
78
+ });
79
+
80
+ // Run it
81
+ const result = await app.invoke(
82
+ { messages: [{ id: "1", role: "user", content: "Hello, ONI!" }] },
83
+ { threadId: "demo-1" },
84
+ );
85
+
86
+ console.log("Result:", result.result);
87
87
  `;
88
88
  },
89
89
  test() {
90
- return `import { describe, it, expect } from "vitest";
91
- import { StateGraph, START, END, lastValue } from "@oni.bot/core";
92
- import { createTestHarness } from "@oni.bot/core/testing";
93
-
94
- describe("my agent", () => {
95
- it("processes input", async () => {
96
- type S = { value: string };
97
- const graph = new StateGraph<S>({
98
- channels: { value: lastValue(() => "") },
99
- });
100
- graph.addNode("echo", async (s) => ({ value: s.value + "!" }));
101
- graph.addEdge(START, "echo");
102
- graph.addEdge("echo", END);
103
-
104
- const harness = createTestHarness(graph);
105
- const result = await harness.invoke({ value: "test" });
106
- expect(result.value).toBe("test!");
107
- });
108
- });
90
+ return `import { describe, it, expect } from "vitest";
91
+ import { StateGraph, START, END, lastValue } from "@oni.bot/core";
92
+ import { createTestHarness } from "@oni.bot/core/testing";
93
+
94
+ describe("my agent", () => {
95
+ it("processes input", async () => {
96
+ type S = { value: string };
97
+ const graph = new StateGraph<S>({
98
+ channels: { value: lastValue(() => "") },
99
+ });
100
+ graph.addNode("echo", async (s) => ({ value: s.value + "!" }));
101
+ graph.addEdge(START, "echo");
102
+ graph.addEdge("echo", END);
103
+
104
+ const harness = createTestHarness(graph);
105
+ const result = await harness.invoke({ value: "test" });
106
+ expect(result.value).toBe("test!");
107
+ });
108
+ });
109
+ `;
110
+ },
111
+ harnessAgent() {
112
+ return `import { ONIHarness } from "@oni.bot/core/harness";
113
+ import { anthropic } from "@oni.bot/core/models";
114
+ import { defineTool } from "@oni.bot/core/tools";
115
+
116
+ const model = anthropic("claude-sonnet-4-20250514");
117
+ const fastModel = anthropic("claude-haiku-4-5-20251001");
118
+
119
+ const greetTool = defineTool({
120
+ name: "greet",
121
+ description: "Generate a greeting for a person",
122
+ schema: {
123
+ type: "object",
124
+ properties: { name: { type: "string" } },
125
+ required: ["name"],
126
+ },
127
+ execute: async (input: { name: string }) => \`Hello, \${input.name}!\`,
128
+ });
129
+
130
+ const harness = ONIHarness.create({
131
+ model,
132
+ fastModel,
133
+ soul: "You are a helpful assistant. Use tools when needed.",
134
+ sharedTools: [greetTool],
135
+ maxTurns: 5,
136
+ });
137
+
138
+ async function main() {
139
+ const prompt = process.argv[2] ?? "Greet the user with a warm welcome";
140
+ console.log("Running agent...");
141
+
142
+ for await (const msg of harness.run(prompt, { name: "assistant" })) {
143
+ if (msg.type === "assistant") console.log("[assistant]", msg.content);
144
+ if (msg.type === "result") console.log("\\nResult:", msg.content);
145
+ }
146
+ }
147
+
148
+ main().catch(console.error);
109
149
  `;
110
150
  },
111
151
  gitignore() {
112
- return `node_modules/
113
- dist/
114
- *.js.map
115
- .env
152
+ return `node_modules/
153
+ dist/
154
+ *.js.map
155
+ .env
116
156
  `;
117
157
  },
118
158
  };
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/cli/templates.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wCAAwC;AACxC,+DAA+D;AAE/D,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG;YACV,IAAI;YACJ,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,GAAG,EAAE,wBAAwB;gBAC7B,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,YAAY;aACnB;YACD,YAAY,EAAE;gBACZ,eAAe,EAAE,QAAQ;aAC1B;YACD,eAAe,EAAE;gBACf,GAAG,EAAE,QAAQ;gBACb,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,QAAQ;gBAChB,aAAa,EAAE,SAAS;aACzB;SACF,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7C,CAAC;IAED,QAAQ;QACN,MAAM,MAAM,GAAG;YACb,eAAe,EAAE;gBACf,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,UAAU;gBAClB,gBAAgB,EAAE,UAAU;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI;gBACZ,YAAY,EAAE,IAAI;aACnB;YACD,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,CAAC;IAED,UAAU;QACR,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CV,CAAC;IACA,CAAC;IAED,IAAI;QACF,OAAO;;;;;;;;;;;;;;;;;;;CAmBV,CAAC;IACA,CAAC;IAED,SAAS;QACP,OAAO;;;;CAIV,CAAC;IACA,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/cli/templates.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wCAAwC;AACxC,+DAA+D;AAE/D,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG;YACV,IAAI;YACJ,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,GAAG,EAAE,wBAAwB;gBAC7B,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,YAAY;aACnB;YACD,YAAY,EAAE;gBACZ,eAAe,EAAE,QAAQ;aAC1B;YACD,eAAe,EAAE;gBACf,GAAG,EAAE,QAAQ;gBACb,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,QAAQ;gBAChB,aAAa,EAAE,SAAS;aACzB;SACF,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7C,CAAC;IAED,QAAQ;QACN,MAAM,MAAM,GAAG;YACb,eAAe,EAAE;gBACf,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,UAAU;gBAClB,gBAAgB,EAAE,UAAU;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI;gBACZ,YAAY,EAAE,IAAI;aACnB;YACD,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,CAAC;IAED,UAAU;QACR,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CV,CAAC;IACA,CAAC;IAED,IAAI;QACF,OAAO;;;;;;;;;;;;;;;;;;;CAmBV,CAAC;IACA,CAAC;IAED,YAAY;QACV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCV,CAAC;IACA,CAAC;IAED,SAAS;QACP,OAAO;;;;CAIV,CAAC;IACA,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedArgs } from "./router.js";
2
+ export declare function testCommand(args: ParsedArgs): Promise<void>;
3
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/cli/test.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BjE"}
@@ -0,0 +1,29 @@
1
+ // ============================================================
2
+ // @oni.bot/core CLI — test command
3
+ // Runs vitest with ONI-friendly defaults
4
+ // ============================================================
5
+ import { spawn } from "node:child_process";
6
+ export async function testCommand(args) {
7
+ const pattern = args.positional[0];
8
+ const watch = args.flags.watch === "true" || args.flags.w === "true";
9
+ const vitestArgs = [watch ? "" : "run"].filter(Boolean);
10
+ if (pattern) {
11
+ vitestArgs.push(pattern);
12
+ }
13
+ if (args.flags.verbose === "true") {
14
+ vitestArgs.push("--reporter=verbose");
15
+ }
16
+ console.log(`\n Running tests${pattern ? ` matching: ${pattern}` : ""}${watch ? " (watch mode)" : ""}\n`);
17
+ const child = spawn("npx", ["vitest", ...vitestArgs], {
18
+ stdio: "inherit",
19
+ shell: true,
20
+ });
21
+ return new Promise((resolvePromise) => {
22
+ child.on("close", (code) => {
23
+ if (code && code !== 0)
24
+ process.exitCode = code;
25
+ resolvePromise();
26
+ });
27
+ });
28
+ }
29
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/cli/test.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mCAAmC;AACnC,yCAAyC;AACzC,+DAA+D;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC;IAErE,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAExD,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAE3G,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,EAAE;QACpD,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YAChD,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type { ONIConfig, ModelConfig, AgentConfig, PermissionRuleset, CompactionConfig, SwarmConfig, LSPServerConfig, LoadConfigOptions, } from "./types.js";
2
+ export { loadConfig, parseJsonc, stripJsonComments, deepMerge, } from "./loader.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,SAAS,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Loader
2
+ export { loadConfig, parseJsonc, stripJsonComments, deepMerge, } from "./loader.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAYA,SAAS;AACT,OAAO,EACL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,SAAS,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { ONIConfig, LoadConfigOptions } from "./types.js";
2
+ /**
3
+ * Strip comments from JSONC text.
4
+ * Handles:
5
+ * - `//` line comments
6
+ * - `/* ... *​/` block comments
7
+ * - Preserves comments inside quoted strings
8
+ * - Handles escaped quotes within strings
9
+ */
10
+ export declare function stripJsonComments(text: string): string;
11
+ /**
12
+ * Parse a JSONC string (JSON with comments) into a value.
13
+ * Strips comments first, then delegates to JSON.parse.
14
+ */
15
+ export declare function parseJsonc(text: string): unknown;
16
+ /**
17
+ * Deep merge two objects. Object keys are merged recursively.
18
+ * Arrays and primitives are replaced (not merged).
19
+ * undefined values in override are skipped (don't overwrite base).
20
+ * null values in override DO replace base values.
21
+ *
22
+ * Does NOT mutate base or override — returns a new object.
23
+ */
24
+ export declare function deepMerge<T extends Record<string, unknown>>(base: T, override: Partial<T>): T;
25
+ /**
26
+ * Load and merge ONI configuration from hierarchical paths.
27
+ *
28
+ * Resolution order (last wins):
29
+ * 1. `~/.oni/config.jsonc` — global defaults
30
+ * 2. `<projectDir>/oni.jsonc` — project-level
31
+ * 3. `<projectDir>/.oni/config.jsonc` — alternative project-level
32
+ * 4. `inline` option — programmatic override (highest priority)
33
+ *
34
+ * Invalid files are silently skipped (logged but don't throw).
35
+ */
36
+ export declare function loadConfig(options?: LoadConfigOptions): Promise<ONIConfig>;
37
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI/D;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+DtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhD;AAID;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,GACnB,CAAC,CA2BH;AAQD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,SAAS,CAAC,CA0BpB"}
@@ -0,0 +1,180 @@
1
+ // ============================================================
2
+ // @oni.bot/core/config — Loader
3
+ // JSONC parser, deep merge, hierarchical config loading.
4
+ // ============================================================
5
+ import { readFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { homedir } from "node:os";
8
+ // ─── JSONC Parsing ─────────────────────────────────────────────────────────
9
+ /**
10
+ * Strip comments from JSONC text.
11
+ * Handles:
12
+ * - `//` line comments
13
+ * - `/* ... *​/` block comments
14
+ * - Preserves comments inside quoted strings
15
+ * - Handles escaped quotes within strings
16
+ */
17
+ export function stripJsonComments(text) {
18
+ let result = "";
19
+ let i = 0;
20
+ const len = text.length;
21
+ while (i < len) {
22
+ const ch = text[i];
23
+ // String literal — copy verbatim until closing quote
24
+ if (ch === '"') {
25
+ result += ch;
26
+ i++;
27
+ while (i < len) {
28
+ const sc = text[i];
29
+ result += sc;
30
+ if (sc === "\\") {
31
+ // Escaped character — copy next char too
32
+ i++;
33
+ if (i < len) {
34
+ result += text[i];
35
+ }
36
+ }
37
+ else if (sc === '"') {
38
+ break;
39
+ }
40
+ i++;
41
+ }
42
+ i++;
43
+ continue;
44
+ }
45
+ // Line comment //
46
+ if (ch === "/" && i + 1 < len && text[i + 1] === "/") {
47
+ // Skip to end of line
48
+ i += 2;
49
+ while (i < len && text[i] !== "\n") {
50
+ i++;
51
+ }
52
+ continue;
53
+ }
54
+ // Block comment /* ... */
55
+ if (ch === "/" && i + 1 < len && text[i + 1] === "*") {
56
+ i += 2;
57
+ while (i < len) {
58
+ if (text[i] === "*" && i + 1 < len && text[i + 1] === "/") {
59
+ i += 2;
60
+ break;
61
+ }
62
+ // Preserve newlines to maintain line numbers for error messages
63
+ if (text[i] === "\n") {
64
+ result += "\n";
65
+ }
66
+ i++;
67
+ }
68
+ continue;
69
+ }
70
+ // Normal character
71
+ result += ch;
72
+ i++;
73
+ }
74
+ return result;
75
+ }
76
+ /**
77
+ * Parse a JSONC string (JSON with comments) into a value.
78
+ * Strips comments first, then delegates to JSON.parse.
79
+ */
80
+ export function parseJsonc(text) {
81
+ const cleaned = stripJsonComments(text);
82
+ return JSON.parse(cleaned);
83
+ }
84
+ // ─── Deep Merge ────────────────────────────────────────────────────────────
85
+ /**
86
+ * Deep merge two objects. Object keys are merged recursively.
87
+ * Arrays and primitives are replaced (not merged).
88
+ * undefined values in override are skipped (don't overwrite base).
89
+ * null values in override DO replace base values.
90
+ *
91
+ * Does NOT mutate base or override — returns a new object.
92
+ */
93
+ export function deepMerge(base, override) {
94
+ const result = { ...base };
95
+ for (const key of Object.keys(override)) {
96
+ const overrideVal = override[key];
97
+ // Skip undefined — don't overwrite base
98
+ if (overrideVal === undefined)
99
+ continue;
100
+ const baseVal = base[key];
101
+ // If both are plain objects, merge recursively
102
+ if (isPlainObject(baseVal) &&
103
+ isPlainObject(overrideVal)) {
104
+ result[key] = deepMerge(baseVal, overrideVal);
105
+ }
106
+ else {
107
+ // Replace (arrays, primitives, null)
108
+ result[key] = overrideVal;
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+ function isPlainObject(val) {
114
+ return val !== null && typeof val === "object" && !Array.isArray(val);
115
+ }
116
+ // ─── Config Loading ────────────────────────────────────────────────────────
117
+ /**
118
+ * Load and merge ONI configuration from hierarchical paths.
119
+ *
120
+ * Resolution order (last wins):
121
+ * 1. `~/.oni/config.jsonc` — global defaults
122
+ * 2. `<projectDir>/oni.jsonc` — project-level
123
+ * 3. `<projectDir>/.oni/config.jsonc` — alternative project-level
124
+ * 4. `inline` option — programmatic override (highest priority)
125
+ *
126
+ * Invalid files are silently skipped (logged but don't throw).
127
+ */
128
+ export async function loadConfig(options) {
129
+ const globalDir = options?.globalDir ?? join(homedir(), ".oni");
130
+ const projectDir = options?.projectDir ?? process.cwd();
131
+ // Collect config file paths in priority order (first = lowest priority)
132
+ const configPaths = [
133
+ join(globalDir, "config.jsonc"),
134
+ join(projectDir, "oni.jsonc"),
135
+ join(projectDir, ".oni", "config.jsonc"),
136
+ ];
137
+ let merged = {};
138
+ for (const configPath of configPaths) {
139
+ const partial = await loadSingleConfig(configPath);
140
+ if (partial) {
141
+ merged = mergeConfig(merged, partial);
142
+ }
143
+ }
144
+ // Inline overrides (highest priority)
145
+ if (options?.inline) {
146
+ merged = mergeConfig(merged, options.inline);
147
+ }
148
+ return merged;
149
+ }
150
+ /**
151
+ * Merge two ONI configs with special handling:
152
+ * - `lsp: false` replaces any existing lsp config
153
+ * - Otherwise uses deepMerge
154
+ */
155
+ function mergeConfig(base, override) {
156
+ // Special case: lsp: false means "disable all LSP" — don't merge
157
+ if (override.lsp === false) {
158
+ return { ...deepMerge(base, override), lsp: false };
159
+ }
160
+ return deepMerge(base, override);
161
+ }
162
+ /**
163
+ * Load a single JSONC config file. Returns null if file doesn't exist
164
+ * or can't be parsed.
165
+ */
166
+ async function loadSingleConfig(path) {
167
+ try {
168
+ const text = await readFile(path, "utf-8");
169
+ const parsed = parseJsonc(text);
170
+ if (isPlainObject(parsed)) {
171
+ return parsed;
172
+ }
173
+ return null;
174
+ }
175
+ catch {
176
+ // File doesn't exist or can't be read — skip silently
177
+ return null;
178
+ }
179
+ }
180
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gCAAgC;AAChC,yDAAyD;AACzD,+DAA+D;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IAExB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnB,qDAAqD;QACrD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,EAAE,CAAC;YACb,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;gBACf,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,IAAI,EAAE,CAAC;gBACb,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;oBAChB,yCAAyC;oBACzC,CAAC,EAAE,CAAC;oBACJ,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;wBACZ,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpB,CAAC;gBACH,CAAC;qBAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;oBACtB,MAAM;gBACR,CAAC;gBACD,CAAC,EAAE,CAAC;YACN,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,kBAAkB;QAClB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrD,sBAAsB;YACtB,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnC,CAAC,EAAE,CAAC;YACN,CAAC;YACD,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrD,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC1D,CAAC,IAAI,CAAC,CAAC;oBACP,MAAM;gBACR,CAAC;gBACD,gEAAgE;gBAChE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBACrB,MAAM,IAAI,IAAI,CAAC;gBACjB,CAAC;gBACD,CAAC,EAAE,CAAC;YACN,CAAC;YACD,SAAS;QACX,CAAC;QAED,mBAAmB;QACnB,MAAM,IAAI,EAAE,CAAC;QACb,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CACvB,IAAO,EACP,QAAoB;IAEpB,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAmB,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAElC,wCAAwC;QACxC,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1B,+CAA+C;QAC/C,IACE,aAAa,CAAC,OAAO,CAAC;YACtB,aAAa,CAAC,WAAW,CAAC,EAC1B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,OAAkC,EAClC,WAAsC,CACzB,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,MAAM,CAAC,GAAG,CAAC,GAAG,WAAyB,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,OAAO,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAA2B;IAE3B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAExD,wEAAwE;IACxE,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;QAC7B,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC;KACzC,CAAC;IAEF,IAAI,MAAM,GAAc,EAAE,CAAC;IAE3B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAClB,IAAe,EACf,QAA4B;IAE5B,iEAAiE;IACjE,IAAI,QAAQ,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,EAAE,GAAG,SAAS,CAAC,IAA+B,EAAE,QAAmC,CAAc,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACzH,CAAC;IACD,OAAO,SAAS,CACd,IAA+B,EAC/B,QAAmC,CACvB,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAC7B,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAA4B,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,74 @@
1
+ /** Model provider + model ID pair. */
2
+ export interface ModelConfig {
3
+ provider: string;
4
+ model: string;
5
+ }
6
+ /** Named agent definition (data-driven, composable into swarm slots). */
7
+ export interface AgentConfig {
8
+ /** Override model for this agent */
9
+ model?: ModelConfig;
10
+ /** Tool names this agent can use (empty = all) */
11
+ tools?: string[];
12
+ /** Maximum turns for this agent's loop */
13
+ maxSteps?: number;
14
+ /** System prompt override or extension */
15
+ prompt?: string;
16
+ /** Per-agent permission overrides */
17
+ permissions?: PermissionRuleset;
18
+ }
19
+ /** Permission rules in config format (tool → action or tool → pattern map). */
20
+ export type PermissionRuleset = Record<string, "allow" | "deny" | "ask" | Record<string, "allow" | "deny" | "ask">>;
21
+ /** Compaction behavior config. */
22
+ export interface CompactionConfig {
23
+ /** Enable auto-compaction on context overflow (default: true) */
24
+ auto?: boolean;
25
+ /** Usage fraction threshold (default: 0.68) */
26
+ threshold?: number;
27
+ /** Additional tool names whose output survives pruning */
28
+ protectedTools?: string[];
29
+ }
30
+ /** Swarm default settings. */
31
+ export interface SwarmConfig {
32
+ /** Default topology when auto-select isn't used */
33
+ defaultTopology?: string;
34
+ /** Max concurrent agents in pool/fan-out topologies */
35
+ maxConcurrency?: number;
36
+ /** Per-agent timeout in ms */
37
+ agentTimeout?: number;
38
+ /** Default pool size */
39
+ poolSize?: number;
40
+ }
41
+ /** LSP server configuration. */
42
+ export interface LSPServerConfig {
43
+ command: string;
44
+ args?: string[];
45
+ /** File extensions this server handles */
46
+ extensions?: string[];
47
+ }
48
+ /** Root configuration object — loaded from JSONC files. */
49
+ export interface ONIConfig {
50
+ /** Default model for all agents */
51
+ model?: ModelConfig;
52
+ /** Named agent definitions */
53
+ agents?: Record<string, AgentConfig>;
54
+ /** Permission rules */
55
+ permissions?: PermissionRuleset;
56
+ /** Compaction settings */
57
+ compaction?: CompactionConfig;
58
+ /** Swarm defaults */
59
+ swarm?: SwarmConfig;
60
+ /** LSP server config. Set to false to disable all LSP. */
61
+ lsp?: Record<string, LSPServerConfig> | false;
62
+ /** Plugin paths (npm packages or local file paths) */
63
+ plugins?: string[];
64
+ }
65
+ /** Options for loadConfig(). */
66
+ export interface LoadConfigOptions {
67
+ /** Override global config directory (default: ~/.oni) */
68
+ globalDir?: string;
69
+ /** Project directory to look for config files (default: process.cwd()) */
70
+ projectDir?: string;
71
+ /** Inline config to merge last (highest priority) */
72
+ inline?: Partial<ONIConfig>;
73
+ }
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAIA,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,MAAM,CACpC,MAAM,EACN,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,CACpE,CAAC;AAEF,kCAAkC;AAClC,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gCAAgC;AAChC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,uBAAuB;IACvB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,0BAA0B;IAC1B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,qBAAqB;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC;IAC9C,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;CAC7B"}
@@ -0,0 +1,5 @@
1
+ // ============================================================
2
+ // @oni.bot/core/config — Types
3
+ // ============================================================
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+BAA+B;AAC/B,+DAA+D"}
@@ -13,6 +13,10 @@ export interface TopicMessage {
13
13
  export declare class PubSub {
14
14
  private subscribers;
15
15
  private buffer;
16
+ private maxBufferSize;
17
+ constructor(opts?: {
18
+ maxBufferSize?: number;
19
+ });
16
20
  /** Publish a message to a topic, notifying all matching subscribers. */
17
21
  publish(from: string, topic: string, data: unknown): void;
18
22
  /**
@@ -1 +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"}
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;IACpC,OAAO,CAAC,aAAa,CAAqB;gBAE9B,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;IAI7C,wEAAwE;IACxE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAczD;;;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"}
@@ -7,10 +7,18 @@
7
7
  export class PubSub {
8
8
  subscribers = new Map();
9
9
  buffer = [];
10
+ maxBufferSize;
11
+ constructor(opts) {
12
+ this.maxBufferSize = opts?.maxBufferSize;
13
+ }
10
14
  /** Publish a message to a topic, notifying all matching subscribers. */
11
15
  publish(from, topic, data) {
12
16
  const msg = { topic, data, from, timestamp: Date.now() };
13
17
  this.buffer.push(msg);
18
+ // Enforce buffer bounds by dropping oldest
19
+ if (this.maxBufferSize != null && this.buffer.length > this.maxBufferSize) {
20
+ this.buffer = this.buffer.slice(this.buffer.length - this.maxBufferSize);
21
+ }
14
22
  for (const [pattern, handlers] of this.subscribers) {
15
23
  if (topicMatches(pattern, topic)) {
16
24
  for (const handler of handlers)
@@ -1 +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"}
1
+ {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../src/coordination/pubsub.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,9 @@ export declare class RequestReplyBroker {
22
22
  * Returns the request id, a promise that resolves with the reply,
23
23
  * and a message object suitable for routing through the graph.
24
24
  */
25
- request(from: string, to: string, payload: unknown): {
25
+ request(from: string, to: string, payload: unknown, opts?: {
26
+ timeoutMs?: number;
27
+ }): {
26
28
  requestId: string;
27
29
  promise: Promise<unknown>;
28
30
  message: any;