@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
@@ -0,0 +1,170 @@
1
+ /**
2
+ * MCP Client — connects to an MCP server, discovers tools, and forwards calls.
3
+ *
4
+ * Lifecycle:
5
+ * 1. connect() — spawn server, perform initialize handshake, list tools
6
+ * 2. listTools() — return discovered tools (cached from connect)
7
+ * 3. callTool(name, args) — forward tool invocation to server
8
+ * 4. disconnect() — gracefully shut down
9
+ *
10
+ * Swarm-aware: A single MCPClient instance can serve multiple swarm agents.
11
+ * Tool calls are stateless — concurrent callers are safe.
12
+ */
13
+ import { StdioTransport } from "./transport.js";
14
+ // ── Constants ─────────────────────────────────────────────────
15
+ const MCP_PROTOCOL_VERSION = "2024-11-05";
16
+ const CLIENT_NAME = "oni-core";
17
+ const CLIENT_VERSION = "0.8.1";
18
+ // ── MCPClient ─────────────────────────────────────────────────
19
+ export class MCPClient {
20
+ config;
21
+ transport = null;
22
+ state = "disconnected";
23
+ serverInfo;
24
+ tools = [];
25
+ error;
26
+ onToolsChanged;
27
+ constructor(config, options) {
28
+ this.config = config;
29
+ this.onToolsChanged = options?.onToolsChanged;
30
+ }
31
+ // ── Lifecycle ───────────────────────────────────────────────
32
+ /**
33
+ * Connect to the MCP server:
34
+ * 1. Spawn the server process via stdio transport
35
+ * 2. Perform the initialize handshake
36
+ * 3. Send initialized notification
37
+ * 4. Discover available tools
38
+ */
39
+ async connect() {
40
+ if (this.state === "ready")
41
+ return;
42
+ this.state = "connecting";
43
+ this.error = undefined;
44
+ try {
45
+ this.transport = new StdioTransport({
46
+ command: this.config.command,
47
+ args: this.config.args,
48
+ env: this.config.env,
49
+ cwd: this.config.cwd,
50
+ onNotification: (n) => this.handleNotification(n),
51
+ });
52
+ await this.transport.start();
53
+ // Initialize handshake
54
+ const initResponse = await this.transport.send("initialize", {
55
+ protocolVersion: MCP_PROTOCOL_VERSION,
56
+ capabilities: {},
57
+ clientInfo: {
58
+ name: CLIENT_NAME,
59
+ version: CLIENT_VERSION,
60
+ },
61
+ });
62
+ if (initResponse.error) {
63
+ throw new Error(`MCP initialize failed: ${initResponse.error.message}`);
64
+ }
65
+ const initResult = initResponse.result;
66
+ this.serverInfo = initResult.serverInfo;
67
+ // Send initialized notification
68
+ this.transport.notify("notifications/initialized");
69
+ // Discover tools
70
+ await this.refreshTools();
71
+ this.state = "ready";
72
+ }
73
+ catch (err) {
74
+ this.state = "error";
75
+ this.error =
76
+ err instanceof Error ? err.message : String(err);
77
+ // Clean up on failure
78
+ this.transport?.stop();
79
+ this.transport = null;
80
+ throw err;
81
+ }
82
+ }
83
+ /**
84
+ * Disconnect from the MCP server gracefully.
85
+ */
86
+ async disconnect() {
87
+ if (this.transport) {
88
+ this.transport.stop();
89
+ this.transport = null;
90
+ }
91
+ this.state = "disconnected";
92
+ this.tools = [];
93
+ this.serverInfo = undefined;
94
+ this.error = undefined;
95
+ }
96
+ // ── Tool Discovery ──────────────────────────────────────────
97
+ /**
98
+ * Refresh the tool list from the server.
99
+ */
100
+ async refreshTools() {
101
+ if (!this.transport?.isConnected()) {
102
+ throw new Error("MCP client not connected");
103
+ }
104
+ const response = await this.transport.send("tools/list");
105
+ if (response.error) {
106
+ throw new Error(`MCP tools/list failed: ${response.error.message}`);
107
+ }
108
+ const result = response.result;
109
+ this.tools = result.tools ?? [];
110
+ }
111
+ /**
112
+ * Return the cached list of available tools.
113
+ */
114
+ listTools() {
115
+ return [...this.tools];
116
+ }
117
+ // ── Tool Execution ──────────────────────────────────────────
118
+ /**
119
+ * Call a tool on the MCP server.
120
+ * Returns the tool result with content array.
121
+ *
122
+ * Concurrency-safe: multiple callers can invoke simultaneously.
123
+ */
124
+ async callTool(name, args) {
125
+ if (!this.transport?.isConnected() || this.state !== "ready") {
126
+ throw new Error("MCP client not ready");
127
+ }
128
+ const response = await this.transport.send("tools/call", {
129
+ name,
130
+ arguments: args ?? {},
131
+ });
132
+ if (response.error) {
133
+ return {
134
+ content: [
135
+ {
136
+ type: "text",
137
+ text: `MCP tool error: ${response.error.message}`,
138
+ },
139
+ ],
140
+ isError: true,
141
+ };
142
+ }
143
+ return response.result;
144
+ }
145
+ // ── State ───────────────────────────────────────────────────
146
+ getState() {
147
+ return this.state;
148
+ }
149
+ getInfo() {
150
+ return {
151
+ name: this.config.name,
152
+ state: this.state,
153
+ serverInfo: this.serverInfo,
154
+ tools: [...this.tools],
155
+ error: this.error,
156
+ };
157
+ }
158
+ // ── Notifications ───────────────────────────────────────────
159
+ handleNotification(notification) {
160
+ if (notification.method === "notifications/tools/list_changed") {
161
+ // Server says tools have changed — refresh
162
+ void this.refreshTools().then(() => {
163
+ this.onToolsChanged?.();
164
+ }).catch(() => {
165
+ // Silently ignore refresh failures from notifications
166
+ });
167
+ }
168
+ }
169
+ }
170
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * MCP Tool Conversion — converts MCP tool definitions to ONI ToolDefinitions.
3
+ *
4
+ * Bridges MCP protocol tools into the ONI framework so they can be used
5
+ * by the Conductor, subagents, and swarm agents with the same interface
6
+ * as native tools.
7
+ */
8
+ import type { ToolDefinition } from "../tools/types.js";
9
+ import type { MCPToolDefinition, MCPCallToolResult } from "./types.js";
10
+ import type { MCPClient } from "./client.js";
11
+ /**
12
+ * Convert a single MCP tool definition into an ONI ToolDefinition.
13
+ *
14
+ * The resulting tool, when executed, forwards the call to the MCP server
15
+ * via the provided client. Results are serialized to a string.
16
+ */
17
+ export declare function mcpToolToDefinition(tool: MCPToolDefinition, client: MCPClient, serverName: string): ToolDefinition<Record<string, unknown>, string>;
18
+ /**
19
+ * Convert all tools from an MCP client into ONI ToolDefinitions.
20
+ */
21
+ export declare function convertMCPTools(client: MCPClient, serverName: string): ToolDefinition[];
22
+ /**
23
+ * Format MCP tool result content into a string for the LLM.
24
+ */
25
+ export declare function formatMCPResult(result: MCPCallToolResult): string;
26
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/mcp/convert.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAc,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,GACjB,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAUjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,GACjB,cAAc,EAAE,CAGlB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAcjE"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * MCP Tool Conversion — converts MCP tool definitions to ONI ToolDefinitions.
3
+ *
4
+ * Bridges MCP protocol tools into the ONI framework so they can be used
5
+ * by the Conductor, subagents, and swarm agents with the same interface
6
+ * as native tools.
7
+ */
8
+ /**
9
+ * Convert a single MCP tool definition into an ONI ToolDefinition.
10
+ *
11
+ * The resulting tool, when executed, forwards the call to the MCP server
12
+ * via the provided client. Results are serialized to a string.
13
+ */
14
+ export function mcpToolToDefinition(tool, client, serverName) {
15
+ return {
16
+ name: `mcp__${serverName}__${tool.name}`,
17
+ description: tool.description ?? `MCP tool: ${tool.name} (via ${serverName})`,
18
+ schema: tool.inputSchema,
19
+ execute: async (input) => {
20
+ const result = await client.callTool(tool.name, input);
21
+ return formatMCPResult(result);
22
+ },
23
+ };
24
+ }
25
+ /**
26
+ * Convert all tools from an MCP client into ONI ToolDefinitions.
27
+ */
28
+ export function convertMCPTools(client, serverName) {
29
+ const tools = client.listTools();
30
+ return tools.map((t) => mcpToolToDefinition(t, client, serverName));
31
+ }
32
+ /**
33
+ * Format MCP tool result content into a string for the LLM.
34
+ */
35
+ export function formatMCPResult(result) {
36
+ const parts = [];
37
+ for (const content of result.content) {
38
+ parts.push(formatContent(content));
39
+ }
40
+ const text = parts.join("\n");
41
+ if (result.isError) {
42
+ return `[MCP Error] ${text}`;
43
+ }
44
+ return text;
45
+ }
46
+ function formatContent(content) {
47
+ switch (content.type) {
48
+ case "text":
49
+ return content.text;
50
+ case "image":
51
+ return `[Image: ${content.mimeType}, ${content.data.length} bytes base64]`;
52
+ default:
53
+ return "[Unknown content type]";
54
+ }
55
+ }
56
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/mcp/convert.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAuB,EACvB,MAAiB,EACjB,UAAkB;IAElB,OAAO;QACL,IAAI,EAAE,QAAQ,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE;QACxC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,CAAC,IAAI,SAAS,UAAU,GAAG;QAC7E,MAAM,EAAE,IAAI,CAAC,WAAsC;QACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAiB,EACjB,UAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAyB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,eAAe,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,OAAmB;IACxC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,WAAW,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC;QAC7E;YACE,OAAO,wBAAwB,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MCP (Model Context Protocol) — client for connecting to external tool servers.
3
+ *
4
+ * Supports stdio transport with Content-Length framing (the standard MCP wire protocol).
5
+ * Discovers tools via tools/list, forwards calls via tools/call, and converts
6
+ * MCP tools into ONI ToolDefinitions for seamless integration.
7
+ *
8
+ * Usage:
9
+ * import { MCPClient, convertMCPTools } from "@oni.bot/core/mcp";
10
+ *
11
+ * const client = new MCPClient({ name: "my-server", transport: "stdio", command: "npx", args: ["-y", "my-mcp-server"] });
12
+ * await client.connect();
13
+ * const tools = convertMCPTools(client, "my-server");
14
+ * // tools are now ONI ToolDefinitions — pass to Conductor, swarm, etc.
15
+ */
16
+ export { MCPClient } from "./client.js";
17
+ export { StdioTransport } from "./transport.js";
18
+ export { convertMCPTools, mcpToolToDefinition, formatMCPResult } from "./convert.js";
19
+ export type { MCPServerConfig, MCPToolDefinition, MCPCallToolResult, MCPClientState, MCPClientInfo, MCPServerInfo, MCPInitializeResult, MCPToolListResult, MCPContent, MCPTextContent, MCPImageContent, MCPCapabilities, MCPToolInputSchema, JsonRpcRequest, JsonRpcResponse, JsonRpcNotification, JsonRpcError, } from "./types.js";
20
+ export type { NotificationHandler, StdioTransportConfig } from "./transport.js";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrF,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * MCP (Model Context Protocol) — client for connecting to external tool servers.
3
+ *
4
+ * Supports stdio transport with Content-Length framing (the standard MCP wire protocol).
5
+ * Discovers tools via tools/list, forwards calls via tools/call, and converts
6
+ * MCP tools into ONI ToolDefinitions for seamless integration.
7
+ *
8
+ * Usage:
9
+ * import { MCPClient, convertMCPTools } from "@oni.bot/core/mcp";
10
+ *
11
+ * const client = new MCPClient({ name: "my-server", transport: "stdio", command: "npx", args: ["-y", "my-mcp-server"] });
12
+ * await client.connect();
13
+ * const tools = convertMCPTools(client, "my-server");
14
+ * // tools are now ONI ToolDefinitions — pass to Conductor, swarm, etc.
15
+ */
16
+ export { MCPClient } from "./client.js";
17
+ export { StdioTransport } from "./transport.js";
18
+ export { convertMCPTools, mcpToolToDefinition, formatMCPResult } from "./convert.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * MCP Transport — JSON-RPC over stdio with Content-Length framing.
3
+ *
4
+ * Implements the standard LSP/MCP wire protocol:
5
+ * Content-Length: <N>\r\n\r\n<JSON payload>
6
+ *
7
+ * The transport handles:
8
+ * - Spawning a child process
9
+ * - Framing outbound JSON-RPC messages
10
+ * - Parsing inbound Content-Length framed responses
11
+ * - Routing responses to pending request promises
12
+ * - Forwarding notifications to a handler
13
+ */
14
+ import type { JsonRpcResponse, JsonRpcNotification } from "./types.js";
15
+ export type NotificationHandler = (notification: JsonRpcNotification) => void;
16
+ export interface StdioTransportConfig {
17
+ command: string;
18
+ args?: string[];
19
+ env?: Record<string, string>;
20
+ cwd?: string;
21
+ onNotification?: NotificationHandler;
22
+ /** Timeout for spawning the process (ms, default: 10000) */
23
+ spawnTimeout?: number;
24
+ }
25
+ export declare class StdioTransport {
26
+ private config;
27
+ private process;
28
+ private nextId;
29
+ private pending;
30
+ private buffer;
31
+ private onNotification;
32
+ private connected;
33
+ constructor(config: StdioTransportConfig);
34
+ /**
35
+ * Spawn the child process and start reading stdout.
36
+ * Throws if the process fails to spawn within the timeout.
37
+ */
38
+ start(): Promise<void>;
39
+ /**
40
+ * Stop the transport and kill the child process.
41
+ */
42
+ stop(): void;
43
+ isConnected(): boolean;
44
+ /**
45
+ * Send a JSON-RPC request and wait for the response.
46
+ * Times out after `timeoutMs` (default: 30s).
47
+ */
48
+ send(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<JsonRpcResponse>;
49
+ /**
50
+ * Send a JSON-RPC notification (no response expected).
51
+ */
52
+ notify(method: string, params?: Record<string, unknown>): void;
53
+ private processBuffer;
54
+ private handleMessage;
55
+ }
56
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/mcp/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAEV,eAAe,EACf,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAIpB,MAAM,MAAM,mBAAmB,GAAG,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAE9E,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAUD,qBAAa,cAAc;IAQb,OAAO,CAAC,MAAM;IAP1B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,SAAS,CAAS;gBAEN,MAAM,EAAE,oBAAoB;IAMhD;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAsBZ,WAAW,IAAI,OAAO;IAMtB;;;OAGG;IACG,IAAI,CACR,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,SAAS,GACjB,OAAO,CAAC,eAAe,CAAC;IAkC3B;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAgB9D,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,aAAa;CAiBtB"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * MCP Transport — JSON-RPC over stdio with Content-Length framing.
3
+ *
4
+ * Implements the standard LSP/MCP wire protocol:
5
+ * Content-Length: <N>\r\n\r\n<JSON payload>
6
+ *
7
+ * The transport handles:
8
+ * - Spawning a child process
9
+ * - Framing outbound JSON-RPC messages
10
+ * - Parsing inbound Content-Length framed responses
11
+ * - Routing responses to pending request promises
12
+ * - Forwarding notifications to a handler
13
+ */
14
+ import { spawn } from "node:child_process";
15
+ // ── StdioTransport ────────────────────────────────────────────
16
+ export class StdioTransport {
17
+ config;
18
+ process = null;
19
+ nextId = 1;
20
+ pending = new Map();
21
+ buffer = "";
22
+ onNotification;
23
+ connected = false;
24
+ constructor(config) {
25
+ this.config = config;
26
+ this.onNotification = config.onNotification ?? (() => { });
27
+ }
28
+ // ── Lifecycle ───────────────────────────────────────────────
29
+ /**
30
+ * Spawn the child process and start reading stdout.
31
+ * Throws if the process fails to spawn within the timeout.
32
+ */
33
+ async start() {
34
+ if (this.connected)
35
+ return;
36
+ const timeout = this.config.spawnTimeout ?? 10_000;
37
+ return new Promise((resolve, reject) => {
38
+ const timer = setTimeout(() => {
39
+ this.stop();
40
+ reject(new Error(`MCP server failed to start within ${timeout}ms`));
41
+ }, timeout);
42
+ try {
43
+ this.process = spawn(this.config.command, this.config.args ?? [], {
44
+ stdio: ["pipe", "pipe", "pipe"],
45
+ env: { ...process.env, ...this.config.env },
46
+ cwd: this.config.cwd,
47
+ shell: false,
48
+ });
49
+ }
50
+ catch (err) {
51
+ clearTimeout(timer);
52
+ reject(new Error(`Failed to spawn MCP server: ${err instanceof Error ? err.message : String(err)}`));
53
+ return;
54
+ }
55
+ this.process.on("error", (err) => {
56
+ clearTimeout(timer);
57
+ this.connected = false;
58
+ reject(new Error(`MCP server process error: ${err.message}`));
59
+ });
60
+ this.process.on("exit", (code) => {
61
+ this.connected = false;
62
+ // Reject all pending requests
63
+ for (const [id, req] of this.pending) {
64
+ req.reject(new Error(`MCP server exited with code ${code}`));
65
+ clearTimeout(req.timer);
66
+ this.pending.delete(id);
67
+ }
68
+ });
69
+ if (this.process.stdout) {
70
+ this.process.stdout.on("data", (chunk) => {
71
+ this.buffer += chunk.toString("utf-8");
72
+ this.processBuffer();
73
+ });
74
+ }
75
+ // Process spawned successfully — consider it started
76
+ // (actual MCP readiness is confirmed by the initialize handshake)
77
+ this.connected = true;
78
+ clearTimeout(timer);
79
+ resolve();
80
+ });
81
+ }
82
+ /**
83
+ * Stop the transport and kill the child process.
84
+ */
85
+ stop() {
86
+ this.connected = false;
87
+ // Clear all pending requests
88
+ for (const [id, req] of this.pending) {
89
+ req.reject(new Error("MCP transport stopped"));
90
+ clearTimeout(req.timer);
91
+ this.pending.delete(id);
92
+ }
93
+ if (this.process) {
94
+ try {
95
+ this.process.kill("SIGTERM");
96
+ }
97
+ catch {
98
+ // Process may have already exited
99
+ }
100
+ this.process = null;
101
+ }
102
+ this.buffer = "";
103
+ }
104
+ isConnected() {
105
+ return this.connected;
106
+ }
107
+ // ── Send ────────────────────────────────────────────────────
108
+ /**
109
+ * Send a JSON-RPC request and wait for the response.
110
+ * Times out after `timeoutMs` (default: 30s).
111
+ */
112
+ async send(method, params, timeoutMs = 30_000) {
113
+ if (!this.connected || !this.process?.stdin) {
114
+ throw new Error("MCP transport not connected");
115
+ }
116
+ const id = this.nextId++;
117
+ const request = {
118
+ jsonrpc: "2.0",
119
+ id,
120
+ method,
121
+ ...(params !== undefined ? { params } : {}),
122
+ };
123
+ return new Promise((resolve, reject) => {
124
+ const timer = setTimeout(() => {
125
+ this.pending.delete(id);
126
+ reject(new Error(`MCP request "${method}" timed out after ${timeoutMs}ms`));
127
+ }, timeoutMs);
128
+ this.pending.set(id, { resolve, reject, timer });
129
+ const payload = JSON.stringify(request);
130
+ const frame = `Content-Length: ${Buffer.byteLength(payload)}\r\n\r\n${payload}`;
131
+ this.process.stdin.write(frame, (err) => {
132
+ if (err) {
133
+ this.pending.delete(id);
134
+ clearTimeout(timer);
135
+ reject(new Error(`Failed to write to MCP server: ${err.message}`));
136
+ }
137
+ });
138
+ });
139
+ }
140
+ /**
141
+ * Send a JSON-RPC notification (no response expected).
142
+ */
143
+ notify(method, params) {
144
+ if (!this.connected || !this.process?.stdin)
145
+ return;
146
+ const notification = {
147
+ jsonrpc: "2.0",
148
+ method,
149
+ ...(params !== undefined ? { params } : {}),
150
+ };
151
+ const payload = JSON.stringify(notification);
152
+ const frame = `Content-Length: ${Buffer.byteLength(payload)}\r\n\r\n${payload}`;
153
+ this.process.stdin.write(frame);
154
+ }
155
+ // ── Buffer processing ───────────────────────────────────────
156
+ processBuffer() {
157
+ while (true) {
158
+ // Look for Content-Length header
159
+ const headerEnd = this.buffer.indexOf("\r\n\r\n");
160
+ if (headerEnd === -1)
161
+ break;
162
+ const header = this.buffer.slice(0, headerEnd);
163
+ const match = header.match(/Content-Length:\s*(\d+)/i);
164
+ if (!match) {
165
+ // Invalid header — skip to next potential header
166
+ this.buffer = this.buffer.slice(headerEnd + 4);
167
+ continue;
168
+ }
169
+ const contentLength = parseInt(match[1], 10);
170
+ const bodyStart = headerEnd + 4;
171
+ const bodyEnd = bodyStart + contentLength;
172
+ if (this.buffer.length < bodyEnd) {
173
+ // Not enough data yet — wait for more
174
+ break;
175
+ }
176
+ const body = this.buffer.slice(bodyStart, bodyEnd);
177
+ this.buffer = this.buffer.slice(bodyEnd);
178
+ try {
179
+ const message = JSON.parse(body);
180
+ this.handleMessage(message);
181
+ }
182
+ catch {
183
+ // Malformed JSON — skip
184
+ }
185
+ }
186
+ }
187
+ handleMessage(message) {
188
+ // Response (has id)
189
+ if ("id" in message && typeof message.id === "number") {
190
+ const pending = this.pending.get(message.id);
191
+ if (pending) {
192
+ clearTimeout(pending.timer);
193
+ this.pending.delete(message.id);
194
+ pending.resolve(message);
195
+ }
196
+ return;
197
+ }
198
+ // Notification (no id, has method)
199
+ if ("method" in message && typeof message.method === "string") {
200
+ this.onNotification(message);
201
+ }
202
+ }
203
+ }
204
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/mcp/transport.ts"],"names":[],"mappings":"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"}