@reactive-agents/tools 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -3
- package/dist/index.js +164 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,12 +42,38 @@ const result = await agent.run("What are the latest AI developments?");
|
|
|
42
42
|
|
|
43
43
|
## MCP Client
|
|
44
44
|
|
|
45
|
+
The MCP client supports connecting to local MCP servers over stdio using `Bun.spawn()`.
|
|
46
|
+
|
|
45
47
|
```typescript
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
import { makeMCPClient } from "@reactive-agents/tools";
|
|
49
|
+
import { Effect } from "effect";
|
|
50
|
+
|
|
51
|
+
const program = Effect.gen(function* () {
|
|
52
|
+
const client = yield* makeMCPClient;
|
|
53
|
+
|
|
54
|
+
// Connect to a local MCP server over stdio
|
|
55
|
+
const server = yield* client.connect({
|
|
56
|
+
name: "filesystem",
|
|
57
|
+
transport: "stdio",
|
|
58
|
+
command: "npx",
|
|
59
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Call a tool on the server
|
|
63
|
+
const result = yield* client.callTool("filesystem", "read_file", {
|
|
64
|
+
path: "/tmp/example.txt",
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
yield* client.disconnect("filesystem");
|
|
68
|
+
return result;
|
|
69
|
+
});
|
|
49
70
|
```
|
|
50
71
|
|
|
72
|
+
**Transport support:**
|
|
73
|
+
- **stdio** — Fully implemented. Uses `Bun.spawn()` with a background stdout reader loop for line-delimited JSON-RPC. Handles the MCP `initialize` handshake, tool discovery via `tools/list`, and `tools/call` invocations. Pending requests are tracked with Promise-based resolution; the subprocess is killed on disconnect.
|
|
74
|
+
- **SSE (HTTP event stream)** — Stub, not yet implemented.
|
|
75
|
+
- **WebSocket** — Stub, not yet implemented.
|
|
76
|
+
|
|
51
77
|
## Documentation
|
|
52
78
|
|
|
53
79
|
Full documentation at [tylerjrbuell.github.io/reactive-agents-ts/guides/tools/](https://tylerjrbuell.github.io/reactive-agents-ts/guides/tools/)
|
package/dist/index.js
CHANGED
|
@@ -161,12 +161,145 @@ var makeToolRegistry = Effect.gen(function* () {
|
|
|
161
161
|
|
|
162
162
|
// src/mcp/mcp-client.ts
|
|
163
163
|
import { Effect as Effect2, Ref as Ref2 } from "effect";
|
|
164
|
-
var
|
|
165
|
-
var
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
164
|
+
var activeTransports = /* @__PURE__ */ new Map();
|
|
165
|
+
var startStdioReader = (serverName, transport) => {
|
|
166
|
+
const { subprocess } = transport;
|
|
167
|
+
void (async () => {
|
|
168
|
+
const stdout = subprocess.stdout;
|
|
169
|
+
if (!stdout) return;
|
|
170
|
+
const decoder = new TextDecoder();
|
|
171
|
+
let buffer = "";
|
|
172
|
+
try {
|
|
173
|
+
for await (const chunk of stdout) {
|
|
174
|
+
if (transport.readerStopped) break;
|
|
175
|
+
buffer += decoder.decode(chunk, { stream: true });
|
|
176
|
+
const lines = buffer.split("\n");
|
|
177
|
+
buffer = lines.pop() ?? "";
|
|
178
|
+
for (const line of lines) {
|
|
179
|
+
const trimmed = line.trim();
|
|
180
|
+
if (!trimmed) continue;
|
|
181
|
+
let parsed;
|
|
182
|
+
try {
|
|
183
|
+
parsed = JSON.parse(trimmed);
|
|
184
|
+
} catch {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const pending = transport.pendingRequests.get(parsed.id);
|
|
188
|
+
if (pending) {
|
|
189
|
+
transport.pendingRequests.delete(parsed.id);
|
|
190
|
+
pending.resolve(parsed);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
} catch (err) {
|
|
195
|
+
transport.readerStopped = true;
|
|
196
|
+
for (const [id, pending] of transport.pendingRequests) {
|
|
197
|
+
transport.pendingRequests.delete(id);
|
|
198
|
+
pending.reject(
|
|
199
|
+
err instanceof Error ? err : new Error(
|
|
200
|
+
`MCP stdio reader error for "${serverName}": ${String(err)}`
|
|
201
|
+
)
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
})();
|
|
206
|
+
};
|
|
207
|
+
var createTransport = (config) => {
|
|
208
|
+
if (config.transport === "stdio") {
|
|
209
|
+
return Effect2.tryPromise(async () => {
|
|
210
|
+
const command = config.command;
|
|
211
|
+
if (!command) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
`MCP server "${config.name}" has transport "stdio" but no command specified`
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
const subprocess = Bun.spawn([command, ...config.args ?? []], {
|
|
217
|
+
stdin: "pipe",
|
|
218
|
+
stdout: "pipe",
|
|
219
|
+
stderr: "pipe"
|
|
220
|
+
});
|
|
221
|
+
const transport = {
|
|
222
|
+
subprocess,
|
|
223
|
+
pendingRequests: /* @__PURE__ */ new Map(),
|
|
224
|
+
readerStopped: false
|
|
225
|
+
};
|
|
226
|
+
activeTransports.set(config.name, transport);
|
|
227
|
+
startStdioReader(config.name, transport);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (config.transport === "sse") {
|
|
231
|
+
return Effect2.void;
|
|
232
|
+
}
|
|
233
|
+
if (config.transport === "websocket") {
|
|
234
|
+
return Effect2.void;
|
|
235
|
+
}
|
|
236
|
+
return Effect2.void;
|
|
237
|
+
};
|
|
238
|
+
var sendRequest = (config, request) => {
|
|
239
|
+
if (config.transport === "stdio") {
|
|
240
|
+
return Effect2.tryPromise({
|
|
241
|
+
try: () => {
|
|
242
|
+
const transport = activeTransports.get(config.name);
|
|
243
|
+
if (!transport) {
|
|
244
|
+
return Promise.reject(
|
|
245
|
+
new Error(
|
|
246
|
+
`No active stdio transport for MCP server "${config.name}" \u2014 was createTransport called?`
|
|
247
|
+
)
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
return new Promise((resolve2, reject) => {
|
|
251
|
+
transport.pendingRequests.set(request.id, { resolve: resolve2, reject });
|
|
252
|
+
const line = JSON.stringify(request) + "\n";
|
|
253
|
+
const encoded = new TextEncoder().encode(line);
|
|
254
|
+
const stdin = transport.subprocess.stdin;
|
|
255
|
+
if (!stdin) {
|
|
256
|
+
transport.pendingRequests.delete(request.id);
|
|
257
|
+
reject(
|
|
258
|
+
new Error(
|
|
259
|
+
`Subprocess stdin is not writable for MCP server "${config.name}"`
|
|
260
|
+
)
|
|
261
|
+
);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
stdin.write(
|
|
266
|
+
encoded
|
|
267
|
+
);
|
|
268
|
+
const flushed = stdin.flush?.();
|
|
269
|
+
if (flushed instanceof Promise) {
|
|
270
|
+
flushed.catch((err) => {
|
|
271
|
+
transport.pendingRequests.delete(request.id);
|
|
272
|
+
reject(
|
|
273
|
+
err instanceof Error ? err : new Error(
|
|
274
|
+
`Flush failed for MCP server "${config.name}": ${String(err)}`
|
|
275
|
+
)
|
|
276
|
+
);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
} catch (err) {
|
|
280
|
+
transport.pendingRequests.delete(request.id);
|
|
281
|
+
reject(
|
|
282
|
+
err instanceof Error ? err : new Error(
|
|
283
|
+
`Failed to write to MCP server "${config.name}" stdin: ${String(err)}`
|
|
284
|
+
)
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
},
|
|
289
|
+
catch: (e) => new MCPConnectionError({
|
|
290
|
+
message: e instanceof Error ? e.message : `Failed to send request to MCP server "${config.name}"`,
|
|
291
|
+
serverName: config.name,
|
|
292
|
+
transport: config.transport,
|
|
293
|
+
cause: e
|
|
294
|
+
})
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
return Effect2.succeed({
|
|
298
|
+
jsonrpc: "2.0",
|
|
299
|
+
id: request.id,
|
|
300
|
+
result: {}
|
|
301
|
+
});
|
|
302
|
+
};
|
|
170
303
|
var makeMCPClient = Effect2.gen(function* () {
|
|
171
304
|
const serversRef = yield* Ref2.make(/* @__PURE__ */ new Map());
|
|
172
305
|
const requestIdRef = yield* Ref2.make(0);
|
|
@@ -259,13 +392,32 @@ var makeMCPClient = Effect2.gen(function* () {
|
|
|
259
392
|
}
|
|
260
393
|
return response.result;
|
|
261
394
|
});
|
|
262
|
-
const disconnect = (serverName) =>
|
|
263
|
-
const
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
395
|
+
const disconnect = (serverName) => Effect2.gen(function* () {
|
|
396
|
+
const transport = activeTransports.get(serverName);
|
|
397
|
+
if (transport) {
|
|
398
|
+
transport.readerStopped = true;
|
|
399
|
+
for (const [id, pending] of transport.pendingRequests) {
|
|
400
|
+
transport.pendingRequests.delete(id);
|
|
401
|
+
pending.reject(
|
|
402
|
+
new Error(
|
|
403
|
+
`MCP server "${serverName}" disconnected with pending request id=${String(id)}`
|
|
404
|
+
)
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
try {
|
|
408
|
+
transport.subprocess.kill();
|
|
409
|
+
} catch {
|
|
410
|
+
}
|
|
411
|
+
activeTransports.delete(serverName);
|
|
267
412
|
}
|
|
268
|
-
|
|
413
|
+
yield* Ref2.update(serversRef, (servers) => {
|
|
414
|
+
const newServers = new Map(servers);
|
|
415
|
+
const server = newServers.get(serverName);
|
|
416
|
+
if (server) {
|
|
417
|
+
newServers.set(serverName, { ...server, status: "disconnected" });
|
|
418
|
+
}
|
|
419
|
+
return newServers;
|
|
420
|
+
});
|
|
269
421
|
});
|
|
270
422
|
const listServers = () => Effect2.gen(function* () {
|
|
271
423
|
const servers = yield* Ref2.get(serversRef);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/tool-service.ts","../src/registry/tool-registry.ts","../src/mcp/mcp-client.ts","../src/execution/sandbox.ts","../src/validation/input-validator.ts","../src/function-calling/function-adapter.ts","../src/skills/web-search.ts","../src/skills/file-operations.ts","../src/skills/http-client.ts","../src/skills/code-execution.ts","../src/runtime.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\n// ─── Tool Definition ───\n\nexport const ToolParameterSchema = Schema.Struct({\n name: Schema.String,\n type: Schema.Literal(\"string\", \"number\", \"boolean\", \"object\", \"array\"),\n description: Schema.String,\n required: Schema.Boolean,\n default: Schema.optional(Schema.Unknown),\n enum: Schema.optional(Schema.Array(Schema.String)),\n});\nexport type ToolParameter = typeof ToolParameterSchema.Type;\n\nexport const ToolDefinitionSchema = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: Schema.Array(ToolParameterSchema),\n returnType: Schema.optional(Schema.String),\n category: Schema.optional(\n Schema.Literal(\"search\", \"file\", \"code\", \"http\", \"data\", \"custom\"),\n ),\n riskLevel: Schema.Literal(\"low\", \"medium\", \"high\", \"critical\"),\n timeoutMs: Schema.Number,\n requiresApproval: Schema.Boolean,\n source: Schema.Literal(\"builtin\", \"mcp\", \"function\", \"plugin\"),\n});\nexport type ToolDefinition = typeof ToolDefinitionSchema.Type;\n\n// ─── Tool Execution ───\n\nexport const ToolInputSchema = Schema.Struct({\n toolName: Schema.String,\n arguments: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n agentId: Schema.String,\n sessionId: Schema.String,\n correlationId: Schema.optional(Schema.String),\n});\nexport type ToolInput = typeof ToolInputSchema.Type;\n\nexport const ToolOutputSchema = Schema.Struct({\n toolName: Schema.String,\n success: Schema.Boolean,\n result: Schema.Unknown,\n error: Schema.optional(Schema.String),\n executionTimeMs: Schema.Number,\n metadata: Schema.optional(\n Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n ),\n});\nexport type ToolOutput = typeof ToolOutputSchema.Type;\n\n// ─── MCP Types ───\n\nexport const MCPServerSchema = Schema.Struct({\n name: Schema.String,\n version: Schema.String,\n transport: Schema.Literal(\"stdio\", \"sse\", \"websocket\"),\n endpoint: Schema.optional(Schema.String),\n command: Schema.optional(Schema.String),\n args: Schema.optional(Schema.Array(Schema.String)),\n tools: Schema.Array(Schema.String),\n status: Schema.Literal(\"connected\", \"disconnected\", \"error\"),\n});\nexport type MCPServer = typeof MCPServerSchema.Type;\n\nexport const MCPRequestSchema = Schema.Struct({\n jsonrpc: Schema.Literal(\"2.0\"),\n id: Schema.Union(Schema.String, Schema.Number),\n method: Schema.String,\n params: Schema.optional(Schema.Unknown),\n});\nexport type MCPRequest = typeof MCPRequestSchema.Type;\n\nexport const MCPResponseSchema = Schema.Struct({\n jsonrpc: Schema.Literal(\"2.0\"),\n id: Schema.Union(Schema.String, Schema.Number),\n result: Schema.optional(Schema.Unknown),\n error: Schema.optional(\n Schema.Struct({\n code: Schema.Number,\n message: Schema.String,\n data: Schema.optional(Schema.Unknown),\n }),\n ),\n});\nexport type MCPResponse = typeof MCPResponseSchema.Type;\n\n// ─── Function Calling (Anthropic/OpenAI format) ───\n\nexport const FunctionCallingToolSchema = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n input_schema: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n});\nexport type FunctionCallingTool = typeof FunctionCallingToolSchema.Type;\n","import { Data } from \"effect\";\n\nexport class ToolNotFoundError extends Data.TaggedError(\"ToolNotFoundError\")<{\n readonly message: string;\n readonly toolName: string;\n readonly availableTools?: readonly string[];\n}> {}\n\nexport class ToolExecutionError extends Data.TaggedError(\n \"ToolExecutionError\",\n)<{\n readonly message: string;\n readonly toolName: string;\n readonly input?: unknown;\n readonly cause?: unknown;\n}> {}\n\nexport class ToolTimeoutError extends Data.TaggedError(\"ToolTimeoutError\")<{\n readonly message: string;\n readonly toolName: string;\n readonly timeoutMs: number;\n}> {}\n\nexport class ToolValidationError extends Data.TaggedError(\n \"ToolValidationError\",\n)<{\n readonly message: string;\n readonly toolName: string;\n readonly parameter: string;\n readonly expected: string;\n readonly received: string;\n}> {}\n\nexport class MCPConnectionError extends Data.TaggedError(\n \"MCPConnectionError\",\n)<{\n readonly message: string;\n readonly serverName: string;\n readonly transport: string;\n readonly cause?: unknown;\n}> {}\n\nexport class ToolAuthorizationError extends Data.TaggedError(\n \"ToolAuthorizationError\",\n)<{\n readonly message: string;\n readonly toolName: string;\n readonly agentId: string;\n}> {}\n","import { Effect, Context, Layer } from \"effect\";\n\nimport type {\n ToolInput,\n ToolOutput,\n ToolDefinition,\n MCPServer,\n FunctionCallingTool,\n} from \"./types.js\";\nimport {\n ToolNotFoundError,\n ToolExecutionError,\n ToolTimeoutError,\n ToolValidationError,\n ToolAuthorizationError,\n MCPConnectionError,\n} from \"./errors.js\";\nimport { makeToolRegistry } from \"./registry/tool-registry.js\";\nimport { makeMCPClient } from \"./mcp/mcp-client.js\";\nimport { makeSandbox } from \"./execution/sandbox.js\";\nimport { validateToolInput } from \"./validation/input-validator.js\";\nimport { EventBus } from \"@reactive-agents/core\";\n\n// ─── Service Tag ───\n\nexport class ToolService extends Context.Tag(\"ToolService\")<\n ToolService,\n {\n readonly execute: (\n input: ToolInput,\n ) => Effect.Effect<\n ToolOutput,\n | ToolNotFoundError\n | ToolExecutionError\n | ToolTimeoutError\n | ToolValidationError\n | ToolAuthorizationError\n >;\n\n readonly register: (\n definition: ToolDefinition,\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>,\n ) => Effect.Effect<void, never>;\n\n readonly connectMCPServer: (\n config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n ) => Effect.Effect<MCPServer, MCPConnectionError>;\n\n readonly disconnectMCPServer: (\n serverName: string,\n ) => Effect.Effect<void, MCPConnectionError>;\n\n readonly listTools: (filter?: {\n category?: string;\n source?: string;\n riskLevel?: string;\n }) => Effect.Effect<readonly ToolDefinition[], never>;\n\n readonly getTool: (\n name: string,\n ) => Effect.Effect<ToolDefinition, ToolNotFoundError>;\n\n readonly toFunctionCallingFormat: () => Effect.Effect<\n readonly FunctionCallingTool[],\n never\n >;\n\n readonly listMCPServers: () => Effect.Effect<readonly MCPServer[], never>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const ToolServiceLive = Layer.effect(\n ToolService,\n Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const registry = yield* makeToolRegistry;\n const mcpClient = yield* makeMCPClient;\n const sandbox = makeSandbox();\n\n const execute = (\n input: ToolInput,\n ): Effect.Effect<\n ToolOutput,\n | ToolNotFoundError\n | ToolExecutionError\n | ToolTimeoutError\n | ToolValidationError\n | ToolAuthorizationError\n > =>\n Effect.gen(function* () {\n const startTime = Date.now();\n\n // Step 1: Look up tool\n const tool = yield* registry.get(input.toolName);\n\n // Step 2: Validate input\n const validatedArgs = yield* validateToolInput(\n tool.definition,\n input.arguments,\n );\n\n // Step 3: Execute in sandbox with timeout\n const result = yield* sandbox.execute(\n () => tool.handler(validatedArgs),\n {\n timeoutMs: tool.definition.timeoutMs,\n toolName: input.toolName,\n },\n );\n\n const executionTimeMs = Date.now() - startTime;\n\n // Step 4: Emit event\n yield* eventBus.publish({\n _tag: \"Custom\",\n type: \"tools.executed\",\n payload: {\n toolName: input.toolName,\n success: true,\n executionTimeMs,\n },\n });\n\n return {\n toolName: input.toolName,\n success: true as const,\n result,\n executionTimeMs,\n } satisfies ToolOutput;\n });\n\n const register = (\n definition: ToolDefinition,\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>,\n ): Effect.Effect<void, never> => registry.register(definition, handler);\n\n const connectMCPServer = (\n config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n ): Effect.Effect<MCPServer, MCPConnectionError> =>\n Effect.gen(function* () {\n const server = yield* mcpClient.connect(config);\n\n // Register each MCP tool in the registry\n for (const toolName of server.tools) {\n yield* registry.register(\n {\n name: `${server.name}/${toolName}`,\n description: `MCP tool from ${server.name}`,\n parameters: [],\n riskLevel: \"medium\",\n timeoutMs: 30_000,\n requiresApproval: false,\n source: \"mcp\",\n },\n (args) =>\n mcpClient.callTool(server.name, toolName, args).pipe(\n Effect.mapError(\n (e) =>\n new ToolExecutionError({\n message: `MCP tool ${toolName} failed`,\n toolName,\n cause: e,\n }),\n ),\n ),\n );\n }\n\n yield* eventBus.publish({\n _tag: \"Custom\",\n type: \"tools.mcp-connected\",\n payload: { serverName: server.name, tools: server.tools },\n });\n\n return server;\n });\n\n const disconnectMCPServer = (\n serverName: string,\n ): Effect.Effect<void, MCPConnectionError> =>\n Effect.gen(function* () {\n yield* mcpClient.disconnect(serverName);\n yield* eventBus.publish({\n _tag: \"Custom\",\n type: \"tools.mcp-disconnected\",\n payload: { serverName },\n });\n });\n\n const listTools = (filter?: {\n category?: string;\n source?: string;\n riskLevel?: string;\n }): Effect.Effect<readonly ToolDefinition[], never> =>\n registry.list(filter);\n\n const getTool = (\n name: string,\n ): Effect.Effect<ToolDefinition, ToolNotFoundError> =>\n registry.get(name).pipe(Effect.map((t) => t.definition));\n\n const toFunctionCallingFormat = (): Effect.Effect<\n readonly FunctionCallingTool[],\n never\n > => registry.toFunctionCallingFormat();\n\n const listMCPServers = (): Effect.Effect<readonly MCPServer[], never> =>\n mcpClient.listServers();\n\n return {\n execute,\n register,\n connectMCPServer,\n disconnectMCPServer,\n listTools,\n getTool,\n toFunctionCallingFormat,\n listMCPServers,\n };\n }),\n);\n","import { Effect, Ref } from \"effect\";\n\nimport type { ToolDefinition, FunctionCallingTool } from \"../types.js\";\nimport { ToolNotFoundError, ToolExecutionError } from \"../errors.js\";\n\nexport interface RegisteredTool {\n readonly definition: ToolDefinition;\n readonly handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>;\n}\n\nexport const makeToolRegistry = Effect.gen(function* () {\n const toolsRef = yield* Ref.make<Map<string, RegisteredTool>>(new Map());\n\n const register = (\n definition: ToolDefinition,\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>,\n ): Effect.Effect<void, never> =>\n Ref.update(toolsRef, (tools) => {\n const newTools = new Map(tools);\n newTools.set(definition.name, { definition, handler });\n return newTools;\n });\n\n const get = (\n name: string,\n ): Effect.Effect<RegisteredTool, ToolNotFoundError> =>\n Effect.gen(function* () {\n const tools = yield* Ref.get(toolsRef);\n const tool = tools.get(name);\n if (!tool) {\n const available = [...tools.keys()];\n return yield* Effect.fail(\n new ToolNotFoundError({\n message: `Tool \"${name}\" not found`,\n toolName: name,\n availableTools: available,\n }),\n );\n }\n return tool;\n });\n\n const list = (filter?: {\n category?: string;\n source?: string;\n riskLevel?: string;\n }): Effect.Effect<readonly ToolDefinition[], never> =>\n Effect.gen(function* () {\n const tools = yield* Ref.get(toolsRef);\n let definitions = [...tools.values()].map((t) => t.definition);\n\n if (filter?.category)\n definitions = definitions.filter((d) => d.category === filter.category);\n if (filter?.source)\n definitions = definitions.filter((d) => d.source === filter.source);\n if (filter?.riskLevel)\n definitions = definitions.filter(\n (d) => d.riskLevel === filter.riskLevel,\n );\n\n return definitions;\n });\n\n const toFunctionCallingFormat = (): Effect.Effect<\n readonly FunctionCallingTool[],\n never\n > =>\n Effect.gen(function* () {\n const tools = yield* Ref.get(toolsRef);\n return [...tools.values()].map((t) => ({\n name: t.definition.name,\n description: t.definition.description,\n input_schema: {\n type: \"object\" as unknown,\n properties: Object.fromEntries(\n t.definition.parameters.map((p) => [\n p.name,\n {\n type: p.type,\n description: p.description,\n ...(p.enum ? { enum: p.enum } : {}),\n },\n ]),\n ) as Record<string, unknown>,\n required: t.definition.parameters\n .filter((p) => p.required)\n .map((p) => p.name),\n } as Record<string, unknown>,\n }));\n });\n\n return { register, get, list, toFunctionCallingFormat };\n});\n","import { Effect, Ref } from \"effect\";\n\nimport type { MCPServer, MCPRequest, MCPResponse } from \"../types.js\";\nimport { MCPConnectionError, ToolExecutionError } from \"../errors.js\";\n\n// ─── Transport Creation (stub - real implementation varies by transport) ───\n\nconst createTransport = (\n _config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n): Effect.Effect<void, unknown> => Effect.void;\n\n// ─── JSON-RPC request sender (stub) ───\n\nconst sendRequest = (\n _config: Pick<MCPServer, \"name\" | \"transport\" | \"endpoint\" | \"command\">,\n request: MCPRequest,\n): Effect.Effect<MCPResponse, MCPConnectionError> =>\n Effect.succeed({\n jsonrpc: \"2.0\" as const,\n id: request.id,\n result: {},\n });\n\nexport const makeMCPClient = Effect.gen(function* () {\n const serversRef = yield* Ref.make<Map<string, MCPServer>>(new Map());\n const requestIdRef = yield* Ref.make(0);\n\n const nextRequestId = Ref.updateAndGet(requestIdRef, (id) => id + 1);\n\n const connect = (\n config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n ): Effect.Effect<MCPServer, MCPConnectionError> =>\n Effect.gen(function* () {\n // Step 1: Establish connection based on transport\n yield* createTransport(config).pipe(\n Effect.mapError(\n (e) =>\n new MCPConnectionError({\n message: `Failed to connect to MCP server \"${config.name}\"`,\n serverName: config.name,\n transport: config.transport,\n cause: e,\n }),\n ),\n );\n\n // Step 2: Initialize protocol (send initialize request)\n const reqId1 = yield* nextRequestId;\n const initResponse = yield* sendRequest(config, {\n jsonrpc: \"2.0\",\n id: reqId1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2024-11-05\",\n capabilities: { tools: {} },\n clientInfo: { name: \"reactive-agents\", version: \"1.0.0\" },\n },\n });\n\n // Step 3: Discover available tools\n const reqId2 = yield* nextRequestId;\n const toolsResponse = yield* sendRequest(config, {\n jsonrpc: \"2.0\",\n id: reqId2,\n method: \"tools/list\",\n });\n\n const toolNames = Array.isArray(toolsResponse.result)\n ? toolsResponse.result.map(\n (t: Record<string, unknown>) => t.name as string,\n )\n : [];\n\n const server: MCPServer = {\n name: config.name,\n version:\n (initResponse.result as Record<string, unknown>)?.serverInfo !=\n null\n ? String(\n (\n (initResponse.result as Record<string, unknown>)\n .serverInfo as Record<string, unknown>\n )?.version,\n )\n : \"unknown\",\n transport: config.transport,\n endpoint: config.endpoint,\n command: config.command,\n args: config.args,\n tools: toolNames,\n status: \"connected\",\n };\n\n yield* Ref.update(serversRef, (servers) => {\n const newServers = new Map(servers);\n newServers.set(server.name, server);\n return newServers;\n });\n\n return server;\n });\n\n const callTool = (\n serverName: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Effect.Effect<unknown, MCPConnectionError | ToolExecutionError> =>\n Effect.gen(function* () {\n const servers = yield* Ref.get(serversRef);\n const server = servers.get(serverName);\n\n if (!server || server.status !== \"connected\") {\n return yield* Effect.fail(\n new MCPConnectionError({\n message: `MCP server \"${serverName}\" not connected`,\n serverName,\n transport: server?.transport ?? \"unknown\",\n }),\n );\n }\n\n const reqId = yield* nextRequestId;\n const response = yield* sendRequest(\n {\n name: serverName,\n transport: server.transport,\n endpoint: server.endpoint,\n command: server.command,\n },\n {\n jsonrpc: \"2.0\",\n id: reqId,\n method: \"tools/call\",\n params: { name: toolName, arguments: args },\n },\n );\n\n if (response.error) {\n return yield* Effect.fail(\n new ToolExecutionError({\n message: `MCP tool \"${toolName}\" failed: ${response.error.message}`,\n toolName,\n input: args,\n }),\n );\n }\n\n return response.result;\n });\n\n const disconnect = (\n serverName: string,\n ): Effect.Effect<void, MCPConnectionError> =>\n Ref.update(serversRef, (servers) => {\n const newServers = new Map(servers);\n const server = newServers.get(serverName);\n if (server) {\n newServers.set(serverName, { ...server, status: \"disconnected\" });\n }\n return newServers;\n });\n\n const listServers = (): Effect.Effect<readonly MCPServer[], never> =>\n Effect.gen(function* () {\n const servers = yield* Ref.get(serversRef);\n return [...servers.values()];\n });\n\n return { connect, callTool, disconnect, listServers };\n});\n","import { Duration, Effect } from \"effect\";\n\nimport { ToolExecutionError, ToolTimeoutError } from \"../errors.js\";\n\nexport const makeSandbox = () => {\n const execute = <A>(\n fn: () => Effect.Effect<A, ToolExecutionError>,\n options: { timeoutMs: number; toolName?: string },\n ): Effect.Effect<A, ToolExecutionError | ToolTimeoutError> =>\n fn().pipe(\n // Enforce timeout\n Effect.timeoutFail({\n duration: Duration.millis(options.timeoutMs),\n onTimeout: () =>\n new ToolTimeoutError({\n message: `Tool execution timed out after ${options.timeoutMs}ms`,\n toolName: options.toolName ?? \"unknown\",\n timeoutMs: options.timeoutMs,\n }),\n }),\n // Catch unexpected errors\n Effect.catchAllDefect((defect) =>\n Effect.fail(\n new ToolExecutionError({\n message: `Tool crashed: ${String(defect)}`,\n toolName: options.toolName ?? \"unknown\",\n cause: defect,\n }),\n ),\n ),\n );\n\n return { execute };\n};\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolValidationError } from \"../errors.js\";\n\nexport const validateToolInput = (\n definition: ToolDefinition,\n args: Record<string, unknown>,\n): Effect.Effect<Record<string, unknown>, ToolValidationError> =>\n Effect.gen(function* () {\n const validated: Record<string, unknown> = {};\n\n for (const param of definition.parameters) {\n const value = args[param.name];\n\n // Check required\n if (param.required && (value === undefined || value === null)) {\n return yield* Effect.fail(\n new ToolValidationError({\n message: `Missing required parameter \"${param.name}\"`,\n toolName: definition.name,\n parameter: param.name,\n expected: param.type,\n received: \"undefined\",\n }),\n );\n }\n\n if (value === undefined) {\n if (param.default !== undefined) {\n validated[param.name] = param.default;\n }\n continue;\n }\n\n // Type check\n const actualType = Array.isArray(value) ? \"array\" : typeof value;\n if (\n actualType !== param.type &&\n !(param.type === \"object\" && actualType === \"object\")\n ) {\n return yield* Effect.fail(\n new ToolValidationError({\n message: `Parameter \"${param.name}\" expected ${param.type}, got ${actualType}`,\n toolName: definition.name,\n parameter: param.name,\n expected: param.type,\n received: actualType,\n }),\n );\n }\n\n // Enum check\n if (\n param.enum &&\n typeof value === \"string\" &&\n !param.enum.includes(value)\n ) {\n return yield* Effect.fail(\n new ToolValidationError({\n message: `Parameter \"${param.name}\" must be one of: ${param.enum.join(\", \")}`,\n toolName: definition.name,\n parameter: param.name,\n expected: param.enum.join(\" | \"),\n received: String(value),\n }),\n );\n }\n\n validated[param.name] = value;\n }\n\n return validated;\n });\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition, FunctionCallingTool } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\n/**\n * Adapt a native function into a ToolDefinition + handler pair\n * suitable for registration in the ToolRegistry.\n */\nexport const adaptFunction = (opts: {\n readonly name: string;\n readonly description: string;\n readonly parameters: ToolDefinition[\"parameters\"];\n readonly category?: ToolDefinition[\"category\"];\n readonly riskLevel?: ToolDefinition[\"riskLevel\"];\n readonly timeoutMs?: number;\n readonly fn: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>;\n}): {\n definition: ToolDefinition;\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>;\n} => ({\n definition: {\n name: opts.name,\n description: opts.description,\n parameters: opts.parameters,\n category: opts.category,\n riskLevel: opts.riskLevel ?? \"low\",\n timeoutMs: opts.timeoutMs ?? 30_000,\n requiresApproval: false,\n source: \"function\" as const,\n },\n handler: opts.fn,\n});\n\n/**\n * Convert a ToolDefinition to the Anthropic/OpenAI function calling format.\n */\nexport const toFunctionCallingTool = (\n definition: ToolDefinition,\n): FunctionCallingTool => ({\n name: definition.name,\n description: definition.description,\n input_schema: {\n type: \"object\" as unknown,\n properties: Object.fromEntries(\n definition.parameters.map((p) => [\n p.name,\n {\n type: p.type,\n description: p.description,\n ...(p.enum ? { enum: p.enum } : {}),\n },\n ]),\n ) as Record<string, unknown>,\n required: definition.parameters\n .filter((p) => p.required)\n .map((p) => p.name),\n } as Record<string, unknown>,\n});\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const webSearchTool: ToolDefinition = {\n name: \"web-search\",\n description: \"Search the web for information using a query string\",\n parameters: [\n {\n name: \"query\",\n type: \"string\",\n description: \"Search query\",\n required: true,\n },\n {\n name: \"maxResults\",\n type: \"number\",\n description: \"Max results to return\",\n required: false,\n default: 5,\n },\n ],\n category: \"search\",\n riskLevel: \"low\",\n timeoutMs: 10_000,\n requiresApproval: false,\n source: \"builtin\",\n};\n\nexport const webSearchHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const query = args.query as string;\n const maxResults = (args.maxResults as number) ?? 5;\n\n // In production: call search API (Tavily, SerpAPI, etc.)\n // Stub implementation for Phase 1\n return {\n query,\n maxResults,\n results: [],\n message: \"Web search stub - configure TAVILY_API_KEY for real results\",\n };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `Web search failed: ${e}`,\n toolName: \"web-search\",\n cause: e,\n }),\n });\n","import { Effect } from \"effect\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const fileReadTool: ToolDefinition = {\n name: \"file-read\",\n description: \"Read the contents of a file\",\n parameters: [\n {\n name: \"path\",\n type: \"string\",\n description: \"File path to read\",\n required: true,\n },\n {\n name: \"encoding\",\n type: \"string\",\n description: \"File encoding\",\n required: false,\n default: \"utf-8\",\n },\n ],\n category: \"file\",\n riskLevel: \"medium\",\n timeoutMs: 5_000,\n requiresApproval: false,\n source: \"builtin\",\n};\n\nexport const fileReadHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const filePath = args.path as string;\n const encoding = (args.encoding as BufferEncoding) ?? \"utf-8\";\n\n // Security: resolve path and check it's within allowed directory\n const resolved = path.resolve(filePath);\n const allowedBase = process.cwd();\n if (!resolved.startsWith(allowedBase)) {\n throw new Error(`Path traversal detected: ${filePath}`);\n }\n\n return await fs.readFile(resolved, { encoding });\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `File read failed: ${e}`,\n toolName: \"file-read\",\n cause: e,\n }),\n });\n\nexport const fileWriteTool: ToolDefinition = {\n name: \"file-write\",\n description: \"Write contents to a file\",\n parameters: [\n {\n name: \"path\",\n type: \"string\",\n description: \"File path to write\",\n required: true,\n },\n {\n name: \"content\",\n type: \"string\",\n description: \"Content to write\",\n required: true,\n },\n {\n name: \"encoding\",\n type: \"string\",\n description: \"File encoding\",\n required: false,\n default: \"utf-8\",\n },\n ],\n category: \"file\",\n riskLevel: \"high\",\n timeoutMs: 5_000,\n requiresApproval: true,\n source: \"builtin\",\n};\n\nexport const fileWriteHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const filePath = args.path as string;\n const content = args.content as string;\n const encoding = (args.encoding as BufferEncoding) ?? \"utf-8\";\n\n const resolved = path.resolve(filePath);\n const allowedBase = process.cwd();\n if (!resolved.startsWith(allowedBase)) {\n throw new Error(`Path traversal detected: ${filePath}`);\n }\n\n await fs.writeFile(resolved, content, { encoding });\n return { written: true, path: resolved };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `File write failed: ${e}`,\n toolName: \"file-write\",\n cause: e,\n }),\n });\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const httpGetTool: ToolDefinition = {\n name: \"http-get\",\n description: \"Make an HTTP GET request to a URL\",\n parameters: [\n {\n name: \"url\",\n type: \"string\",\n description: \"URL to fetch\",\n required: true,\n },\n {\n name: \"headers\",\n type: \"object\",\n description: \"Optional request headers\",\n required: false,\n },\n ],\n category: \"http\",\n riskLevel: \"medium\",\n timeoutMs: 15_000,\n requiresApproval: false,\n source: \"builtin\",\n};\n\nexport const httpGetHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const url = args.url as string;\n const headers = (args.headers as Record<string, string>) ?? {};\n\n const response = await fetch(url, { method: \"GET\", headers });\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n let body: unknown;\n if (contentType.includes(\"application/json\")) {\n body = await response.json();\n } else {\n body = await response.text();\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n body,\n };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `HTTP GET failed: ${e}`,\n toolName: \"http-get\",\n cause: e,\n }),\n });\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const codeExecuteTool: ToolDefinition = {\n name: \"code-execute\",\n description: \"Execute a JavaScript/TypeScript code snippet in a sandboxed environment\",\n parameters: [\n {\n name: \"code\",\n type: \"string\",\n description: \"Code to execute\",\n required: true,\n },\n {\n name: \"language\",\n type: \"string\",\n description: \"Programming language\",\n required: false,\n default: \"javascript\",\n enum: [\"javascript\", \"typescript\"],\n },\n ],\n category: \"code\",\n riskLevel: \"critical\",\n timeoutMs: 30_000,\n requiresApproval: true,\n source: \"builtin\",\n};\n\nexport const codeExecuteHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.try({\n try: () => {\n const code = args.code as string;\n // Phase 1: Simple eval-based execution (stub)\n // In production: use isolated-vm or Worker threads\n // For safety, we only return a stub response\n return {\n code,\n executed: false,\n message:\n \"Code execution stub - production implementation requires sandboxed runtime\",\n };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `Code execution failed: ${e}`,\n toolName: \"code-execute\",\n cause: e,\n }),\n });\n","import { Layer } from \"effect\";\n\nimport { EventBusLive } from \"@reactive-agents/core\";\nimport { ToolServiceLive } from \"./tool-service.js\";\n\n/**\n * Creates the full Tools layer with all dependencies wired.\n * Requires EventBus to be provided (or uses EventBusLive by default).\n */\nexport const createToolsLayer = () =>\n ToolServiceLive.pipe(Layer.provide(EventBusLive));\n\n/**\n * ToolServiceLive layer that requires EventBus to be provided externally.\n * Use this when composing with a shared EventBus from the runtime.\n */\nexport const ToolsLayer = ToolServiceLive;\n"],"mappings":";AAAA,SAAS,cAAc;AAIhB,IAAM,sBAAsB,OAAO,OAAO;AAAA,EAC/C,MAAM,OAAO;AAAA,EACb,MAAM,OAAO,QAAQ,UAAU,UAAU,WAAW,UAAU,OAAO;AAAA,EACrE,aAAa,OAAO;AAAA,EACpB,UAAU,OAAO;AAAA,EACjB,SAAS,OAAO,SAAS,OAAO,OAAO;AAAA,EACvC,MAAM,OAAO,SAAS,OAAO,MAAM,OAAO,MAAM,CAAC;AACnD,CAAC;AAGM,IAAM,uBAAuB,OAAO,OAAO;AAAA,EAChD,MAAM,OAAO;AAAA,EACb,aAAa,OAAO;AAAA,EACpB,YAAY,OAAO,MAAM,mBAAmB;AAAA,EAC5C,YAAY,OAAO,SAAS,OAAO,MAAM;AAAA,EACzC,UAAU,OAAO;AAAA,IACf,OAAO,QAAQ,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EACnE;AAAA,EACA,WAAW,OAAO,QAAQ,OAAO,UAAU,QAAQ,UAAU;AAAA,EAC7D,WAAW,OAAO;AAAA,EAClB,kBAAkB,OAAO;AAAA,EACzB,QAAQ,OAAO,QAAQ,WAAW,OAAO,YAAY,QAAQ;AAC/D,CAAC;AAKM,IAAM,kBAAkB,OAAO,OAAO;AAAA,EAC3C,UAAU,OAAO;AAAA,EACjB,WAAW,OAAO,OAAO,EAAE,KAAK,OAAO,QAAQ,OAAO,OAAO,QAAQ,CAAC;AAAA,EACtE,SAAS,OAAO;AAAA,EAChB,WAAW,OAAO;AAAA,EAClB,eAAe,OAAO,SAAS,OAAO,MAAM;AAC9C,CAAC;AAGM,IAAM,mBAAmB,OAAO,OAAO;AAAA,EAC5C,UAAU,OAAO;AAAA,EACjB,SAAS,OAAO;AAAA,EAChB,QAAQ,OAAO;AAAA,EACf,OAAO,OAAO,SAAS,OAAO,MAAM;AAAA,EACpC,iBAAiB,OAAO;AAAA,EACxB,UAAU,OAAO;AAAA,IACf,OAAO,OAAO,EAAE,KAAK,OAAO,QAAQ,OAAO,OAAO,QAAQ,CAAC;AAAA,EAC7D;AACF,CAAC;AAKM,IAAM,kBAAkB,OAAO,OAAO;AAAA,EAC3C,MAAM,OAAO;AAAA,EACb,SAAS,OAAO;AAAA,EAChB,WAAW,OAAO,QAAQ,SAAS,OAAO,WAAW;AAAA,EACrD,UAAU,OAAO,SAAS,OAAO,MAAM;AAAA,EACvC,SAAS,OAAO,SAAS,OAAO,MAAM;AAAA,EACtC,MAAM,OAAO,SAAS,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,EACjD,OAAO,OAAO,MAAM,OAAO,MAAM;AAAA,EACjC,QAAQ,OAAO,QAAQ,aAAa,gBAAgB,OAAO;AAC7D,CAAC;AAGM,IAAM,mBAAmB,OAAO,OAAO;AAAA,EAC5C,SAAS,OAAO,QAAQ,KAAK;AAAA,EAC7B,IAAI,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM;AAAA,EAC7C,QAAQ,OAAO;AAAA,EACf,QAAQ,OAAO,SAAS,OAAO,OAAO;AACxC,CAAC;AAGM,IAAM,oBAAoB,OAAO,OAAO;AAAA,EAC7C,SAAS,OAAO,QAAQ,KAAK;AAAA,EAC7B,IAAI,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM;AAAA,EAC7C,QAAQ,OAAO,SAAS,OAAO,OAAO;AAAA,EACtC,OAAO,OAAO;AAAA,IACZ,OAAO,OAAO;AAAA,MACZ,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO,SAAS,OAAO,OAAO;AAAA,IACtC,CAAC;AAAA,EACH;AACF,CAAC;AAKM,IAAM,4BAA4B,OAAO,OAAO;AAAA,EACrD,MAAM,OAAO;AAAA,EACb,aAAa,OAAO;AAAA,EACpB,cAAc,OAAO,OAAO,EAAE,KAAK,OAAO,QAAQ,OAAO,OAAO,QAAQ,CAAC;AAC3E,CAAC;;;AC9FD,SAAS,YAAY;AAEd,IAAM,oBAAN,cAAgC,KAAK,YAAY,mBAAmB,EAIxE;AAAC;AAEG,IAAM,qBAAN,cAAiC,KAAK;AAAA,EAC3C;AACF,EAKG;AAAC;AAEG,IAAM,mBAAN,cAA+B,KAAK,YAAY,kBAAkB,EAItE;AAAC;AAEG,IAAM,sBAAN,cAAkC,KAAK;AAAA,EAC5C;AACF,EAMG;AAAC;AAEG,IAAM,qBAAN,cAAiC,KAAK;AAAA,EAC3C;AACF,EAKG;AAAC;AAEG,IAAM,yBAAN,cAAqC,KAAK;AAAA,EAC/C;AACF,EAIG;AAAC;;;AChDJ,SAAS,UAAAA,SAAQ,SAAS,aAAa;;;ACAvC,SAAS,QAAQ,WAAW;AAYrB,IAAM,mBAAmB,OAAO,IAAI,aAAa;AACtD,QAAM,WAAW,OAAO,IAAI,KAAkC,oBAAI,IAAI,CAAC;AAEvE,QAAM,WAAW,CACf,YACA,YAIA,IAAI,OAAO,UAAU,CAAC,UAAU;AAC9B,UAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,aAAS,IAAI,WAAW,MAAM,EAAE,YAAY,QAAQ,CAAC;AACrD,WAAO;AAAA,EACT,CAAC;AAEH,QAAM,MAAM,CACV,SAEA,OAAO,IAAI,aAAa;AACtB,UAAM,QAAQ,OAAO,IAAI,IAAI,QAAQ;AACrC,UAAM,OAAO,MAAM,IAAI,IAAI;AAC3B,QAAI,CAAC,MAAM;AACT,YAAM,YAAY,CAAC,GAAG,MAAM,KAAK,CAAC;AAClC,aAAO,OAAO,OAAO;AAAA,QACnB,IAAI,kBAAkB;AAAA,UACpB,SAAS,SAAS,IAAI;AAAA,UACtB,UAAU;AAAA,UACV,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAEH,QAAM,OAAO,CAAC,WAKZ,OAAO,IAAI,aAAa;AACtB,UAAM,QAAQ,OAAO,IAAI,IAAI,QAAQ;AACrC,QAAI,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU;AAE7D,QAAI,QAAQ;AACV,oBAAc,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ;AACxE,QAAI,QAAQ;AACV,oBAAc,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,MAAM;AACpE,QAAI,QAAQ;AACV,oBAAc,YAAY;AAAA,QACxB,CAAC,MAAM,EAAE,cAAc,OAAO;AAAA,MAChC;AAEF,WAAO;AAAA,EACT,CAAC;AAEH,QAAM,0BAA0B,MAI9B,OAAO,IAAI,aAAa;AACtB,UAAM,QAAQ,OAAO,IAAI,IAAI,QAAQ;AACrC,WAAO,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,MACrC,MAAM,EAAE,WAAW;AAAA,MACnB,aAAa,EAAE,WAAW;AAAA,MAC1B,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,YAAY,OAAO;AAAA,UACjB,EAAE,WAAW,WAAW,IAAI,CAAC,MAAM;AAAA,YACjC,EAAE;AAAA,YACF;AAAA,cACE,MAAM,EAAE;AAAA,cACR,aAAa,EAAE;AAAA,cACf,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,YACnC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,UAAU,EAAE,WAAW,WACpB,OAAO,CAAC,MAAM,EAAE,QAAQ,EACxB,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACtB;AAAA,IACF,EAAE;AAAA,EACJ,CAAC;AAEH,SAAO,EAAE,UAAU,KAAK,MAAM,wBAAwB;AACxD,CAAC;;;AChGD,SAAS,UAAAC,SAAQ,OAAAC,YAAW;AAO5B,IAAM,kBAAkB,CACtB,YAIiCC,QAAO;AAI1C,IAAM,cAAc,CAClB,SACA,YAEAA,QAAO,QAAQ;AAAA,EACb,SAAS;AAAA,EACT,IAAI,QAAQ;AAAA,EACZ,QAAQ,CAAC;AACX,CAAC;AAEI,IAAM,gBAAgBA,QAAO,IAAI,aAAa;AACnD,QAAM,aAAa,OAAOC,KAAI,KAA6B,oBAAI,IAAI,CAAC;AACpE,QAAM,eAAe,OAAOA,KAAI,KAAK,CAAC;AAEtC,QAAM,gBAAgBA,KAAI,aAAa,cAAc,CAAC,OAAO,KAAK,CAAC;AAEnE,QAAM,UAAU,CACd,WAKAD,QAAO,IAAI,aAAa;AAEtB,WAAO,gBAAgB,MAAM,EAAE;AAAA,MAC7BA,QAAO;AAAA,QACL,CAAC,MACC,IAAI,mBAAmB;AAAA,UACrB,SAAS,oCAAoC,OAAO,IAAI;AAAA,UACxD,YAAY,OAAO;AAAA,UACnB,WAAW,OAAO;AAAA,UAClB,OAAO;AAAA,QACT,CAAC;AAAA,MACL;AAAA,IACF;AAGA,UAAM,SAAS,OAAO;AACtB,UAAM,eAAe,OAAO,YAAY,QAAQ;AAAA,MAC9C,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,iBAAiB;AAAA,QACjB,cAAc,EAAE,OAAO,CAAC,EAAE;AAAA,QAC1B,YAAY,EAAE,MAAM,mBAAmB,SAAS,QAAQ;AAAA,MAC1D;AAAA,IACF,CAAC;AAGD,UAAM,SAAS,OAAO;AACtB,UAAM,gBAAgB,OAAO,YAAY,QAAQ;AAAA,MAC/C,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,YAAY,MAAM,QAAQ,cAAc,MAAM,IAChD,cAAc,OAAO;AAAA,MACnB,CAAC,MAA+B,EAAE;AAAA,IACpC,IACA,CAAC;AAEL,UAAM,SAAoB;AAAA,MACxB,MAAM,OAAO;AAAA,MACb,SACG,aAAa,QAAoC,cAClD,OACI;AAAA,QAEK,aAAa,OACX,YACF;AAAA,MACL,IACA;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAEA,WAAOC,KAAI,OAAO,YAAY,CAAC,YAAY;AACzC,YAAM,aAAa,IAAI,IAAI,OAAO;AAClC,iBAAW,IAAI,OAAO,MAAM,MAAM;AAClC,aAAO;AAAA,IACT,CAAC;AAED,WAAO;AAAA,EACT,CAAC;AAEH,QAAM,WAAW,CACf,YACA,UACA,SAEAD,QAAO,IAAI,aAAa;AACtB,UAAM,UAAU,OAAOC,KAAI,IAAI,UAAU;AACzC,UAAM,SAAS,QAAQ,IAAI,UAAU;AAErC,QAAI,CAAC,UAAU,OAAO,WAAW,aAAa;AAC5C,aAAO,OAAOD,QAAO;AAAA,QACnB,IAAI,mBAAmB;AAAA,UACrB,SAAS,eAAe,UAAU;AAAA,UAClC;AAAA,UACA,WAAW,QAAQ,aAAa;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,QAAQ,OAAO;AACrB,UAAM,WAAW,OAAO;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN,WAAW,OAAO;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,QAAQ,EAAE,MAAM,UAAU,WAAW,KAAK;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,SAAS,OAAO;AAClB,aAAO,OAAOA,QAAO;AAAA,QACnB,IAAI,mBAAmB;AAAA,UACrB,SAAS,aAAa,QAAQ,aAAa,SAAS,MAAM,OAAO;AAAA,UACjE;AAAA,UACA,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,SAAS;AAAA,EAClB,CAAC;AAEH,QAAM,aAAa,CACjB,eAEAC,KAAI,OAAO,YAAY,CAAC,YAAY;AAClC,UAAM,aAAa,IAAI,IAAI,OAAO;AAClC,UAAM,SAAS,WAAW,IAAI,UAAU;AACxC,QAAI,QAAQ;AACV,iBAAW,IAAI,YAAY,EAAE,GAAG,QAAQ,QAAQ,eAAe,CAAC;AAAA,IAClE;AACA,WAAO;AAAA,EACT,CAAC;AAEH,QAAM,cAAc,MAClBD,QAAO,IAAI,aAAa;AACtB,UAAM,UAAU,OAAOC,KAAI,IAAI,UAAU;AACzC,WAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;AAAA,EAC7B,CAAC;AAEH,SAAO,EAAE,SAAS,UAAU,YAAY,YAAY;AACtD,CAAC;;;AC/KD,SAAS,UAAU,UAAAC,eAAc;AAI1B,IAAM,cAAc,MAAM;AAC/B,QAAM,UAAU,CACd,IACA,YAEA,GAAG,EAAE;AAAA;AAAA,IAEHC,QAAO,YAAY;AAAA,MACjB,UAAU,SAAS,OAAO,QAAQ,SAAS;AAAA,MAC3C,WAAW,MACT,IAAI,iBAAiB;AAAA,QACnB,SAAS,kCAAkC,QAAQ,SAAS;AAAA,QAC5D,UAAU,QAAQ,YAAY;AAAA,QAC9B,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,IACL,CAAC;AAAA;AAAA,IAEDA,QAAO;AAAA,MAAe,CAAC,WACrBA,QAAO;AAAA,QACL,IAAI,mBAAmB;AAAA,UACrB,SAAS,iBAAiB,OAAO,MAAM,CAAC;AAAA,UACxC,UAAU,QAAQ,YAAY;AAAA,UAC9B,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEF,SAAO,EAAE,QAAQ;AACnB;;;ACjCA,SAAS,UAAAC,eAAc;AAKhB,IAAM,oBAAoB,CAC/B,YACA,SAEAC,QAAO,IAAI,aAAa;AACtB,QAAM,YAAqC,CAAC;AAE5C,aAAW,SAAS,WAAW,YAAY;AACzC,UAAM,QAAQ,KAAK,MAAM,IAAI;AAG7B,QAAI,MAAM,aAAa,UAAU,UAAa,UAAU,OAAO;AAC7D,aAAO,OAAOA,QAAO;AAAA,QACnB,IAAI,oBAAoB;AAAA,UACtB,SAAS,+BAA+B,MAAM,IAAI;AAAA,UAClD,UAAU,WAAW;AAAA,UACrB,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,UAAU,QAAW;AACvB,UAAI,MAAM,YAAY,QAAW;AAC/B,kBAAU,MAAM,IAAI,IAAI,MAAM;AAAA,MAChC;AACA;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,QAAQ,KAAK,IAAI,UAAU,OAAO;AAC3D,QACE,eAAe,MAAM,QACrB,EAAE,MAAM,SAAS,YAAY,eAAe,WAC5C;AACA,aAAO,OAAOA,QAAO;AAAA,QACnB,IAAI,oBAAoB;AAAA,UACtB,SAAS,cAAc,MAAM,IAAI,cAAc,MAAM,IAAI,SAAS,UAAU;AAAA,UAC5E,UAAU,WAAW;AAAA,UACrB,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QACE,MAAM,QACN,OAAO,UAAU,YACjB,CAAC,MAAM,KAAK,SAAS,KAAK,GAC1B;AACA,aAAO,OAAOA,QAAO;AAAA,QACnB,IAAI,oBAAoB;AAAA,UACtB,SAAS,cAAc,MAAM,IAAI,qBAAqB,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,UAC3E,UAAU,WAAW;AAAA,UACrB,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM,KAAK,KAAK,KAAK;AAAA,UAC/B,UAAU,OAAO,KAAK;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,cAAU,MAAM,IAAI,IAAI;AAAA,EAC1B;AAEA,SAAO;AACT,CAAC;;;AJpDH,SAAS,gBAAgB;AAIlB,IAAM,cAAN,cAA0B,QAAQ,IAAI,aAAa,EAiDxD,EAAE;AAAC;AAIE,IAAM,kBAAkB,MAAM;AAAA,EACnC;AAAA,EACAC,QAAO,IAAI,aAAa;AACtB,UAAM,WAAW,OAAO;AACxB,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,OAAO;AACzB,UAAM,UAAU,YAAY;AAE5B,UAAM,UAAU,CACd,UASAA,QAAO,IAAI,aAAa;AACtB,YAAM,YAAY,KAAK,IAAI;AAG3B,YAAM,OAAO,OAAO,SAAS,IAAI,MAAM,QAAQ;AAG/C,YAAM,gBAAgB,OAAO;AAAA,QAC3B,KAAK;AAAA,QACL,MAAM;AAAA,MACR;AAGA,YAAM,SAAS,OAAO,QAAQ;AAAA,QAC5B,MAAM,KAAK,QAAQ,aAAa;AAAA,QAChC;AAAA,UACE,WAAW,KAAK,WAAW;AAAA,UAC3B,UAAU,MAAM;AAAA,QAClB;AAAA,MACF;AAEA,YAAM,kBAAkB,KAAK,IAAI,IAAI;AAGrC,aAAO,SAAS,QAAQ;AAAA,QACtB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,UACP,UAAU,MAAM;AAAA,UAChB,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,UAAU,MAAM;AAAA,QAChB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAEH,UAAM,WAAW,CACf,YACA,YAG+B,SAAS,SAAS,YAAY,OAAO;AAEtE,UAAM,mBAAmB,CACvB,WAKAA,QAAO,IAAI,aAAa;AACtB,YAAM,SAAS,OAAO,UAAU,QAAQ,MAAM;AAG9C,iBAAW,YAAY,OAAO,OAAO;AACnC,eAAO,SAAS;AAAA,UACd;AAAA,YACE,MAAM,GAAG,OAAO,IAAI,IAAI,QAAQ;AAAA,YAChC,aAAa,iBAAiB,OAAO,IAAI;AAAA,YACzC,YAAY,CAAC;AAAA,YACb,WAAW;AAAA,YACX,WAAW;AAAA,YACX,kBAAkB;AAAA,YAClB,QAAQ;AAAA,UACV;AAAA,UACA,CAAC,SACC,UAAU,SAAS,OAAO,MAAM,UAAU,IAAI,EAAE;AAAA,YAC9CA,QAAO;AAAA,cACL,CAAC,MACC,IAAI,mBAAmB;AAAA,gBACrB,SAAS,YAAY,QAAQ;AAAA,gBAC7B;AAAA,gBACA,OAAO;AAAA,cACT,CAAC;AAAA,YACL;AAAA,UACF;AAAA,QACJ;AAAA,MACF;AAEA,aAAO,SAAS,QAAQ;AAAA,QACtB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,EAAE,YAAY,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,MAC1D,CAAC;AAED,aAAO;AAAA,IACT,CAAC;AAEH,UAAM,sBAAsB,CAC1B,eAEAA,QAAO,IAAI,aAAa;AACtB,aAAO,UAAU,WAAW,UAAU;AACtC,aAAO,SAAS,QAAQ;AAAA,QACtB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,EAAE,WAAW;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAEH,UAAM,YAAY,CAAC,WAKjB,SAAS,KAAK,MAAM;AAEtB,UAAM,UAAU,CACd,SAEA,SAAS,IAAI,IAAI,EAAE,KAAKA,QAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AAEzD,UAAM,0BAA0B,MAG3B,SAAS,wBAAwB;AAEtC,UAAM,iBAAiB,MACrB,UAAU,YAAY;AAExB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AKxOA,OAAuB;AAShB,IAAM,gBAAgB,CAAC,UAexB;AAAA,EACJ,YAAY;AAAA,IACV,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,WAAW,KAAK,aAAa;AAAA,IAC7B,WAAW,KAAK,aAAa;AAAA,IAC7B,kBAAkB;AAAA,IAClB,QAAQ;AAAA,EACV;AAAA,EACA,SAAS,KAAK;AAChB;AAKO,IAAM,wBAAwB,CACnC,gBACyB;AAAA,EACzB,MAAM,WAAW;AAAA,EACjB,aAAa,WAAW;AAAA,EACxB,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY,OAAO;AAAA,MACjB,WAAW,WAAW,IAAI,CAAC,MAAM;AAAA,QAC/B,EAAE;AAAA,QACF;AAAA,UACE,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,QACnC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,UAAU,WAAW,WAClB,OAAO,CAAC,MAAM,EAAE,QAAQ,EACxB,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACtB;AACF;;;AC9DA,SAAS,UAAAC,eAAc;AAKhB,IAAM,gBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,QAAQ;AACV;AAEO,IAAM,mBAAmB,CAC9B,SAEAC,QAAO,WAAW;AAAA,EAChB,KAAK,YAAY;AACf,UAAM,QAAQ,KAAK;AACnB,UAAM,aAAc,KAAK,cAAyB;AAIlD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,CAAC;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,OAAO,CAAC,MACN,IAAI,mBAAmB;AAAA,IACrB,SAAS,sBAAsB,CAAC;AAAA,IAChC,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACL,CAAC;;;ACrDH,SAAS,UAAAC,eAAc;AACvB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAKf,IAAM,eAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,QAAQ;AACV;AAEO,IAAM,kBAAkB,CAC7B,SAEAC,QAAO,WAAW;AAAA,EAChB,KAAK,YAAY;AACf,UAAM,WAAW,KAAK;AACtB,UAAM,WAAY,KAAK,YAA+B;AAGtD,UAAM,WAAgB,aAAQ,QAAQ;AACtC,UAAM,cAAc,QAAQ,IAAI;AAChC,QAAI,CAAC,SAAS,WAAW,WAAW,GAAG;AACrC,YAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AAAA,IACxD;AAEA,WAAO,MAAS,YAAS,UAAU,EAAE,SAAS,CAAC;AAAA,EACjD;AAAA,EACA,OAAO,CAAC,MACN,IAAI,mBAAmB;AAAA,IACrB,SAAS,qBAAqB,CAAC;AAAA,IAC/B,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACL,CAAC;AAEI,IAAM,gBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,QAAQ;AACV;AAEO,IAAM,mBAAmB,CAC9B,SAEAA,QAAO,WAAW;AAAA,EAChB,KAAK,YAAY;AACf,UAAM,WAAW,KAAK;AACtB,UAAM,UAAU,KAAK;AACrB,UAAM,WAAY,KAAK,YAA+B;AAEtD,UAAM,WAAgB,aAAQ,QAAQ;AACtC,UAAM,cAAc,QAAQ,IAAI;AAChC,QAAI,CAAC,SAAS,WAAW,WAAW,GAAG;AACrC,YAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AAAA,IACxD;AAEA,UAAS,aAAU,UAAU,SAAS,EAAE,SAAS,CAAC;AAClD,WAAO,EAAE,SAAS,MAAM,MAAM,SAAS;AAAA,EACzC;AAAA,EACA,OAAO,CAAC,MACN,IAAI,mBAAmB;AAAA,IACrB,SAAS,sBAAsB,CAAC;AAAA,IAChC,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACL,CAAC;;;AChHH,SAAS,UAAAC,eAAc;AAKhB,IAAM,cAA8B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,QAAQ;AACV;AAEO,IAAM,iBAAiB,CAC5B,SAEAC,QAAO,WAAW;AAAA,EAChB,KAAK,YAAY;AACf,UAAM,MAAM,KAAK;AACjB,UAAM,UAAW,KAAK,WAAsC,CAAC;AAE7D,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,QAAQ,CAAC;AAC5D,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAE5D,QAAI;AACJ,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,OAAO;AACL,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B;AAEA,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB,SAAS,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO,CAAC,MACN,IAAI,mBAAmB;AAAA,IACrB,SAAS,oBAAoB,CAAC;AAAA,IAC9B,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACL,CAAC;;;AC5DH,SAAS,UAAAC,gBAAc;AAKhB,IAAM,kBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM,CAAC,cAAc,YAAY;AAAA,IACnC;AAAA,EACF;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,QAAQ;AACV;AAEO,IAAM,qBAAqB,CAChC,SAEAC,SAAO,IAAI;AAAA,EACT,KAAK,MAAM;AACT,UAAM,OAAO,KAAK;AAIlB,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,SACE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,OAAO,CAAC,MACN,IAAI,mBAAmB;AAAA,IACrB,SAAS,0BAA0B,CAAC;AAAA,IACpC,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACL,CAAC;;;ACrDH,SAAS,SAAAC,cAAa;AAEtB,SAAS,oBAAoB;AAOtB,IAAM,mBAAmB,MAC9B,gBAAgB,KAAKC,OAAM,QAAQ,YAAY,CAAC;AAM3C,IAAM,aAAa;","names":["Effect","Effect","Ref","Effect","Ref","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Layer","Layer"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/tool-service.ts","../src/registry/tool-registry.ts","../src/mcp/mcp-client.ts","../src/execution/sandbox.ts","../src/validation/input-validator.ts","../src/function-calling/function-adapter.ts","../src/skills/web-search.ts","../src/skills/file-operations.ts","../src/skills/http-client.ts","../src/skills/code-execution.ts","../src/runtime.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\n// ─── Tool Definition ───\n\nexport const ToolParameterSchema = Schema.Struct({\n name: Schema.String,\n type: Schema.Literal(\"string\", \"number\", \"boolean\", \"object\", \"array\"),\n description: Schema.String,\n required: Schema.Boolean,\n default: Schema.optional(Schema.Unknown),\n enum: Schema.optional(Schema.Array(Schema.String)),\n});\nexport type ToolParameter = typeof ToolParameterSchema.Type;\n\nexport const ToolDefinitionSchema = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: Schema.Array(ToolParameterSchema),\n returnType: Schema.optional(Schema.String),\n category: Schema.optional(\n Schema.Literal(\"search\", \"file\", \"code\", \"http\", \"data\", \"custom\"),\n ),\n riskLevel: Schema.Literal(\"low\", \"medium\", \"high\", \"critical\"),\n timeoutMs: Schema.Number,\n requiresApproval: Schema.Boolean,\n source: Schema.Literal(\"builtin\", \"mcp\", \"function\", \"plugin\"),\n});\nexport type ToolDefinition = typeof ToolDefinitionSchema.Type;\n\n// ─── Tool Execution ───\n\nexport const ToolInputSchema = Schema.Struct({\n toolName: Schema.String,\n arguments: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n agentId: Schema.String,\n sessionId: Schema.String,\n correlationId: Schema.optional(Schema.String),\n});\nexport type ToolInput = typeof ToolInputSchema.Type;\n\nexport const ToolOutputSchema = Schema.Struct({\n toolName: Schema.String,\n success: Schema.Boolean,\n result: Schema.Unknown,\n error: Schema.optional(Schema.String),\n executionTimeMs: Schema.Number,\n metadata: Schema.optional(\n Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n ),\n});\nexport type ToolOutput = typeof ToolOutputSchema.Type;\n\n// ─── MCP Types ───\n\nexport const MCPServerSchema = Schema.Struct({\n name: Schema.String,\n version: Schema.String,\n transport: Schema.Literal(\"stdio\", \"sse\", \"websocket\"),\n endpoint: Schema.optional(Schema.String),\n command: Schema.optional(Schema.String),\n args: Schema.optional(Schema.Array(Schema.String)),\n tools: Schema.Array(Schema.String),\n status: Schema.Literal(\"connected\", \"disconnected\", \"error\"),\n});\nexport type MCPServer = typeof MCPServerSchema.Type;\n\nexport const MCPRequestSchema = Schema.Struct({\n jsonrpc: Schema.Literal(\"2.0\"),\n id: Schema.Union(Schema.String, Schema.Number),\n method: Schema.String,\n params: Schema.optional(Schema.Unknown),\n});\nexport type MCPRequest = typeof MCPRequestSchema.Type;\n\nexport const MCPResponseSchema = Schema.Struct({\n jsonrpc: Schema.Literal(\"2.0\"),\n id: Schema.Union(Schema.String, Schema.Number),\n result: Schema.optional(Schema.Unknown),\n error: Schema.optional(\n Schema.Struct({\n code: Schema.Number,\n message: Schema.String,\n data: Schema.optional(Schema.Unknown),\n }),\n ),\n});\nexport type MCPResponse = typeof MCPResponseSchema.Type;\n\n// ─── Function Calling (Anthropic/OpenAI format) ───\n\nexport const FunctionCallingToolSchema = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n input_schema: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n});\nexport type FunctionCallingTool = typeof FunctionCallingToolSchema.Type;\n","import { Data } from \"effect\";\n\nexport class ToolNotFoundError extends Data.TaggedError(\"ToolNotFoundError\")<{\n readonly message: string;\n readonly toolName: string;\n readonly availableTools?: readonly string[];\n}> {}\n\nexport class ToolExecutionError extends Data.TaggedError(\n \"ToolExecutionError\",\n)<{\n readonly message: string;\n readonly toolName: string;\n readonly input?: unknown;\n readonly cause?: unknown;\n}> {}\n\nexport class ToolTimeoutError extends Data.TaggedError(\"ToolTimeoutError\")<{\n readonly message: string;\n readonly toolName: string;\n readonly timeoutMs: number;\n}> {}\n\nexport class ToolValidationError extends Data.TaggedError(\n \"ToolValidationError\",\n)<{\n readonly message: string;\n readonly toolName: string;\n readonly parameter: string;\n readonly expected: string;\n readonly received: string;\n}> {}\n\nexport class MCPConnectionError extends Data.TaggedError(\n \"MCPConnectionError\",\n)<{\n readonly message: string;\n readonly serverName: string;\n readonly transport: string;\n readonly cause?: unknown;\n}> {}\n\nexport class ToolAuthorizationError extends Data.TaggedError(\n \"ToolAuthorizationError\",\n)<{\n readonly message: string;\n readonly toolName: string;\n readonly agentId: string;\n}> {}\n","import { Effect, Context, Layer } from \"effect\";\n\nimport type {\n ToolInput,\n ToolOutput,\n ToolDefinition,\n MCPServer,\n FunctionCallingTool,\n} from \"./types.js\";\nimport {\n ToolNotFoundError,\n ToolExecutionError,\n ToolTimeoutError,\n ToolValidationError,\n ToolAuthorizationError,\n MCPConnectionError,\n} from \"./errors.js\";\nimport { makeToolRegistry } from \"./registry/tool-registry.js\";\nimport { makeMCPClient } from \"./mcp/mcp-client.js\";\nimport { makeSandbox } from \"./execution/sandbox.js\";\nimport { validateToolInput } from \"./validation/input-validator.js\";\nimport { EventBus } from \"@reactive-agents/core\";\n\n// ─── Service Tag ───\n\nexport class ToolService extends Context.Tag(\"ToolService\")<\n ToolService,\n {\n readonly execute: (\n input: ToolInput,\n ) => Effect.Effect<\n ToolOutput,\n | ToolNotFoundError\n | ToolExecutionError\n | ToolTimeoutError\n | ToolValidationError\n | ToolAuthorizationError\n >;\n\n readonly register: (\n definition: ToolDefinition,\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>,\n ) => Effect.Effect<void, never>;\n\n readonly connectMCPServer: (\n config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n ) => Effect.Effect<MCPServer, MCPConnectionError>;\n\n readonly disconnectMCPServer: (\n serverName: string,\n ) => Effect.Effect<void, MCPConnectionError>;\n\n readonly listTools: (filter?: {\n category?: string;\n source?: string;\n riskLevel?: string;\n }) => Effect.Effect<readonly ToolDefinition[], never>;\n\n readonly getTool: (\n name: string,\n ) => Effect.Effect<ToolDefinition, ToolNotFoundError>;\n\n readonly toFunctionCallingFormat: () => Effect.Effect<\n readonly FunctionCallingTool[],\n never\n >;\n\n readonly listMCPServers: () => Effect.Effect<readonly MCPServer[], never>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const ToolServiceLive = Layer.effect(\n ToolService,\n Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const registry = yield* makeToolRegistry;\n const mcpClient = yield* makeMCPClient;\n const sandbox = makeSandbox();\n\n const execute = (\n input: ToolInput,\n ): Effect.Effect<\n ToolOutput,\n | ToolNotFoundError\n | ToolExecutionError\n | ToolTimeoutError\n | ToolValidationError\n | ToolAuthorizationError\n > =>\n Effect.gen(function* () {\n const startTime = Date.now();\n\n // Step 1: Look up tool\n const tool = yield* registry.get(input.toolName);\n\n // Step 2: Validate input\n const validatedArgs = yield* validateToolInput(\n tool.definition,\n input.arguments,\n );\n\n // Step 3: Execute in sandbox with timeout\n const result = yield* sandbox.execute(\n () => tool.handler(validatedArgs),\n {\n timeoutMs: tool.definition.timeoutMs,\n toolName: input.toolName,\n },\n );\n\n const executionTimeMs = Date.now() - startTime;\n\n // Step 4: Emit event\n yield* eventBus.publish({\n _tag: \"Custom\",\n type: \"tools.executed\",\n payload: {\n toolName: input.toolName,\n success: true,\n executionTimeMs,\n },\n });\n\n return {\n toolName: input.toolName,\n success: true as const,\n result,\n executionTimeMs,\n } satisfies ToolOutput;\n });\n\n const register = (\n definition: ToolDefinition,\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>,\n ): Effect.Effect<void, never> => registry.register(definition, handler);\n\n const connectMCPServer = (\n config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n ): Effect.Effect<MCPServer, MCPConnectionError> =>\n Effect.gen(function* () {\n const server = yield* mcpClient.connect(config);\n\n // Register each MCP tool in the registry\n for (const toolName of server.tools) {\n yield* registry.register(\n {\n name: `${server.name}/${toolName}`,\n description: `MCP tool from ${server.name}`,\n parameters: [],\n riskLevel: \"medium\",\n timeoutMs: 30_000,\n requiresApproval: false,\n source: \"mcp\",\n },\n (args) =>\n mcpClient.callTool(server.name, toolName, args).pipe(\n Effect.mapError(\n (e) =>\n new ToolExecutionError({\n message: `MCP tool ${toolName} failed`,\n toolName,\n cause: e,\n }),\n ),\n ),\n );\n }\n\n yield* eventBus.publish({\n _tag: \"Custom\",\n type: \"tools.mcp-connected\",\n payload: { serverName: server.name, tools: server.tools },\n });\n\n return server;\n });\n\n const disconnectMCPServer = (\n serverName: string,\n ): Effect.Effect<void, MCPConnectionError> =>\n Effect.gen(function* () {\n yield* mcpClient.disconnect(serverName);\n yield* eventBus.publish({\n _tag: \"Custom\",\n type: \"tools.mcp-disconnected\",\n payload: { serverName },\n });\n });\n\n const listTools = (filter?: {\n category?: string;\n source?: string;\n riskLevel?: string;\n }): Effect.Effect<readonly ToolDefinition[], never> =>\n registry.list(filter);\n\n const getTool = (\n name: string,\n ): Effect.Effect<ToolDefinition, ToolNotFoundError> =>\n registry.get(name).pipe(Effect.map((t) => t.definition));\n\n const toFunctionCallingFormat = (): Effect.Effect<\n readonly FunctionCallingTool[],\n never\n > => registry.toFunctionCallingFormat();\n\n const listMCPServers = (): Effect.Effect<readonly MCPServer[], never> =>\n mcpClient.listServers();\n\n return {\n execute,\n register,\n connectMCPServer,\n disconnectMCPServer,\n listTools,\n getTool,\n toFunctionCallingFormat,\n listMCPServers,\n };\n }),\n);\n","import { Effect, Ref } from \"effect\";\n\nimport type { ToolDefinition, FunctionCallingTool } from \"../types.js\";\nimport { ToolNotFoundError, ToolExecutionError } from \"../errors.js\";\n\nexport interface RegisteredTool {\n readonly definition: ToolDefinition;\n readonly handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>;\n}\n\nexport const makeToolRegistry = Effect.gen(function* () {\n const toolsRef = yield* Ref.make<Map<string, RegisteredTool>>(new Map());\n\n const register = (\n definition: ToolDefinition,\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>,\n ): Effect.Effect<void, never> =>\n Ref.update(toolsRef, (tools) => {\n const newTools = new Map(tools);\n newTools.set(definition.name, { definition, handler });\n return newTools;\n });\n\n const get = (\n name: string,\n ): Effect.Effect<RegisteredTool, ToolNotFoundError> =>\n Effect.gen(function* () {\n const tools = yield* Ref.get(toolsRef);\n const tool = tools.get(name);\n if (!tool) {\n const available = [...tools.keys()];\n return yield* Effect.fail(\n new ToolNotFoundError({\n message: `Tool \"${name}\" not found`,\n toolName: name,\n availableTools: available,\n }),\n );\n }\n return tool;\n });\n\n const list = (filter?: {\n category?: string;\n source?: string;\n riskLevel?: string;\n }): Effect.Effect<readonly ToolDefinition[], never> =>\n Effect.gen(function* () {\n const tools = yield* Ref.get(toolsRef);\n let definitions = [...tools.values()].map((t) => t.definition);\n\n if (filter?.category)\n definitions = definitions.filter((d) => d.category === filter.category);\n if (filter?.source)\n definitions = definitions.filter((d) => d.source === filter.source);\n if (filter?.riskLevel)\n definitions = definitions.filter(\n (d) => d.riskLevel === filter.riskLevel,\n );\n\n return definitions;\n });\n\n const toFunctionCallingFormat = (): Effect.Effect<\n readonly FunctionCallingTool[],\n never\n > =>\n Effect.gen(function* () {\n const tools = yield* Ref.get(toolsRef);\n return [...tools.values()].map((t) => ({\n name: t.definition.name,\n description: t.definition.description,\n input_schema: {\n type: \"object\" as unknown,\n properties: Object.fromEntries(\n t.definition.parameters.map((p) => [\n p.name,\n {\n type: p.type,\n description: p.description,\n ...(p.enum ? { enum: p.enum } : {}),\n },\n ]),\n ) as Record<string, unknown>,\n required: t.definition.parameters\n .filter((p) => p.required)\n .map((p) => p.name),\n } as Record<string, unknown>,\n }));\n });\n\n return { register, get, list, toFunctionCallingFormat };\n});\n","import { Effect, Ref } from \"effect\";\n\nimport type { MCPServer, MCPRequest, MCPResponse } from \"../types.js\";\nimport { MCPConnectionError, ToolExecutionError } from \"../errors.js\";\n\n// ─── Active Transport State ───\n\ninterface StdioTransport {\n subprocess: ReturnType<typeof Bun.spawn>;\n pendingRequests: Map<\n string | number,\n {\n resolve: (response: MCPResponse) => void;\n reject: (err: Error) => void;\n }\n >;\n readerStopped: boolean;\n}\n\n// Module-level map: serverName -> StdioTransport\nconst activeTransports = new Map<string, StdioTransport>();\n\n// ─── Background stdout reader ───\n\nconst startStdioReader = (\n serverName: string,\n transport: StdioTransport,\n): void => {\n const { subprocess } = transport;\n\n void (async () => {\n // Cast to AsyncIterable — Bun.spawn({stdout:\"pipe\"}) returns ReadableStream\n const stdout = subprocess.stdout as AsyncIterable<Uint8Array> | null;\n if (!stdout) return;\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for await (const chunk of stdout) {\n if (transport.readerStopped) break;\n\n buffer += decoder.decode(chunk as Uint8Array, { stream: true });\n\n // Split on newlines — process each complete line\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let parsed: MCPResponse;\n try {\n parsed = JSON.parse(trimmed) as MCPResponse;\n } catch {\n // Not valid JSON (e.g., server log lines) — skip\n continue;\n }\n\n const pending = transport.pendingRequests.get(parsed.id);\n if (pending) {\n transport.pendingRequests.delete(parsed.id);\n pending.resolve(parsed);\n }\n // Unsolicited notifications (no matching pending) are silently dropped\n }\n }\n } catch (err) {\n // Reader died — reject all pending requests\n transport.readerStopped = true;\n for (const [id, pending] of transport.pendingRequests) {\n transport.pendingRequests.delete(id);\n pending.reject(\n err instanceof Error\n ? err\n : new Error(\n `MCP stdio reader error for \"${serverName}\": ${String(err)}`,\n ),\n );\n }\n }\n })();\n};\n\n// ─── Transport Creation ───\n\nconst createTransport = (\n config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n): Effect.Effect<void, unknown> => {\n if (config.transport === \"stdio\") {\n return Effect.tryPromise(async () => {\n const command = config.command;\n if (!command) {\n throw new Error(\n `MCP server \"${config.name}\" has transport \"stdio\" but no command specified`,\n );\n }\n\n const subprocess = Bun.spawn([command, ...(config.args ?? [])], {\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const transport: StdioTransport = {\n subprocess,\n pendingRequests: new Map(),\n readerStopped: false,\n };\n\n activeTransports.set(config.name, transport);\n startStdioReader(config.name, transport);\n });\n }\n\n // SSE transport — TODO: implement HTTP event stream\n if (config.transport === \"sse\") {\n return Effect.void;\n }\n\n // WebSocket transport — TODO: implement WebSocket\n if (config.transport === \"websocket\") {\n return Effect.void;\n }\n\n return Effect.void;\n};\n\n// ─── JSON-RPC Request Sender ───\n\nconst sendRequest = (\n config: Pick<MCPServer, \"name\" | \"transport\" | \"endpoint\" | \"command\">,\n request: MCPRequest,\n): Effect.Effect<MCPResponse, MCPConnectionError> => {\n if (config.transport === \"stdio\") {\n return Effect.tryPromise({\n try: () => {\n const transport = activeTransports.get(config.name);\n if (!transport) {\n return Promise.reject(\n new Error(\n `No active stdio transport for MCP server \"${config.name}\" — was createTransport called?`,\n ),\n );\n }\n\n return new Promise<MCPResponse>((resolve, reject) => {\n // Register before writing to avoid a race where the server\n // responds faster than we register the handler\n transport.pendingRequests.set(request.id, { resolve, reject });\n\n const line = JSON.stringify(request) + \"\\n\";\n const encoded = new TextEncoder().encode(line);\n const stdin = transport.subprocess.stdin;\n\n if (!stdin) {\n transport.pendingRequests.delete(request.id);\n reject(\n new Error(\n `Subprocess stdin is not writable for MCP server \"${config.name}\"`,\n ),\n );\n return;\n }\n\n // Bun.FileSink.write() is synchronous — returns bytes written, not a Promise\n try {\n (stdin as unknown as { write(b: Uint8Array): number }).write(\n encoded,\n );\n // flush() may return void or Promise<void>\n const flushed = (\n stdin as unknown as { flush?(): void | Promise<void> }\n ).flush?.();\n if (flushed instanceof Promise) {\n flushed.catch((err: unknown) => {\n transport.pendingRequests.delete(request.id);\n reject(\n err instanceof Error\n ? err\n : new Error(\n `Flush failed for MCP server \"${config.name}\": ${String(err)}`,\n ),\n );\n });\n }\n } catch (err) {\n transport.pendingRequests.delete(request.id);\n reject(\n err instanceof Error\n ? err\n : new Error(\n `Failed to write to MCP server \"${config.name}\" stdin: ${String(err)}`,\n ),\n );\n }\n });\n },\n catch: (e) =>\n new MCPConnectionError({\n message:\n e instanceof Error\n ? e.message\n : `Failed to send request to MCP server \"${config.name}\"`,\n serverName: config.name,\n transport: config.transport,\n cause: e,\n }),\n });\n }\n\n // SSE / WebSocket stubs — return empty success\n return Effect.succeed({\n jsonrpc: \"2.0\" as const,\n id: request.id,\n result: {},\n });\n};\n\n// ─── MCP Client ───\n\nexport const makeMCPClient = Effect.gen(function* () {\n const serversRef = yield* Ref.make<Map<string, MCPServer>>(new Map());\n const requestIdRef = yield* Ref.make(0);\n\n const nextRequestId = Ref.updateAndGet(requestIdRef, (id) => id + 1);\n\n const connect = (\n config: Pick<\n MCPServer,\n \"name\" | \"transport\" | \"endpoint\" | \"command\" | \"args\"\n >,\n ): Effect.Effect<MCPServer, MCPConnectionError> =>\n Effect.gen(function* () {\n yield* createTransport(config).pipe(\n Effect.mapError(\n (e) =>\n new MCPConnectionError({\n message: `Failed to connect to MCP server \"${config.name}\"`,\n serverName: config.name,\n transport: config.transport,\n cause: e,\n }),\n ),\n );\n\n // MCP initialize handshake\n const reqId1 = yield* nextRequestId;\n const initResponse = yield* sendRequest(config, {\n jsonrpc: \"2.0\",\n id: reqId1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2024-11-05\",\n capabilities: { tools: {} },\n clientInfo: { name: \"reactive-agents\", version: \"1.0.0\" },\n },\n });\n\n // Discover available tools\n const reqId2 = yield* nextRequestId;\n const toolsResponse = yield* sendRequest(config, {\n jsonrpc: \"2.0\",\n id: reqId2,\n method: \"tools/list\",\n });\n\n const toolNames = Array.isArray(toolsResponse.result)\n ? toolsResponse.result.map(\n (t: Record<string, unknown>) => t.name as string,\n )\n : [];\n\n const server: MCPServer = {\n name: config.name,\n version:\n (initResponse.result as Record<string, unknown>)?.serverInfo != null\n ? String(\n (\n (initResponse.result as Record<string, unknown>)\n .serverInfo as Record<string, unknown>\n )?.version,\n )\n : \"unknown\",\n transport: config.transport,\n endpoint: config.endpoint,\n command: config.command,\n args: config.args,\n tools: toolNames,\n status: \"connected\",\n };\n\n yield* Ref.update(serversRef, (servers) => {\n const newServers = new Map(servers);\n newServers.set(server.name, server);\n return newServers;\n });\n\n return server;\n });\n\n const callTool = (\n serverName: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Effect.Effect<unknown, MCPConnectionError | ToolExecutionError> =>\n Effect.gen(function* () {\n const servers = yield* Ref.get(serversRef);\n const server = servers.get(serverName);\n\n if (!server || server.status !== \"connected\") {\n return yield* Effect.fail(\n new MCPConnectionError({\n message: `MCP server \"${serverName}\" not connected`,\n serverName,\n transport: server?.transport ?? \"unknown\",\n }),\n );\n }\n\n const reqId = yield* nextRequestId;\n const response = yield* sendRequest(\n {\n name: serverName,\n transport: server.transport,\n endpoint: server.endpoint,\n command: server.command,\n },\n {\n jsonrpc: \"2.0\",\n id: reqId,\n method: \"tools/call\",\n params: { name: toolName, arguments: args },\n },\n );\n\n if (response.error) {\n return yield* Effect.fail(\n new ToolExecutionError({\n message: `MCP tool \"${toolName}\" failed: ${response.error.message}`,\n toolName,\n input: args,\n }),\n );\n }\n\n return response.result;\n });\n\n const disconnect = (\n serverName: string,\n ): Effect.Effect<void, MCPConnectionError> =>\n Effect.gen(function* () {\n const transport = activeTransports.get(serverName);\n if (transport) {\n transport.readerStopped = true;\n\n // Reject any in-flight requests before killing the process\n for (const [id, pending] of transport.pendingRequests) {\n transport.pendingRequests.delete(id);\n pending.reject(\n new Error(\n `MCP server \"${serverName}\" disconnected with pending request id=${String(id)}`,\n ),\n );\n }\n\n try {\n transport.subprocess.kill();\n } catch {\n // Process may already be gone\n }\n\n activeTransports.delete(serverName);\n }\n\n yield* Ref.update(serversRef, (servers) => {\n const newServers = new Map(servers);\n const server = newServers.get(serverName);\n if (server) {\n newServers.set(serverName, { ...server, status: \"disconnected\" });\n }\n return newServers;\n });\n });\n\n const listServers = (): Effect.Effect<readonly MCPServer[], never> =>\n Effect.gen(function* () {\n const servers = yield* Ref.get(serversRef);\n return [...servers.values()];\n });\n\n return { connect, callTool, disconnect, listServers };\n});\n","import { Duration, Effect } from \"effect\";\n\nimport { ToolExecutionError, ToolTimeoutError } from \"../errors.js\";\n\nexport const makeSandbox = () => {\n const execute = <A>(\n fn: () => Effect.Effect<A, ToolExecutionError>,\n options: { timeoutMs: number; toolName?: string },\n ): Effect.Effect<A, ToolExecutionError | ToolTimeoutError> =>\n fn().pipe(\n // Enforce timeout\n Effect.timeoutFail({\n duration: Duration.millis(options.timeoutMs),\n onTimeout: () =>\n new ToolTimeoutError({\n message: `Tool execution timed out after ${options.timeoutMs}ms`,\n toolName: options.toolName ?? \"unknown\",\n timeoutMs: options.timeoutMs,\n }),\n }),\n // Catch unexpected errors\n Effect.catchAllDefect((defect) =>\n Effect.fail(\n new ToolExecutionError({\n message: `Tool crashed: ${String(defect)}`,\n toolName: options.toolName ?? \"unknown\",\n cause: defect,\n }),\n ),\n ),\n );\n\n return { execute };\n};\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolValidationError } from \"../errors.js\";\n\nexport const validateToolInput = (\n definition: ToolDefinition,\n args: Record<string, unknown>,\n): Effect.Effect<Record<string, unknown>, ToolValidationError> =>\n Effect.gen(function* () {\n const validated: Record<string, unknown> = {};\n\n for (const param of definition.parameters) {\n const value = args[param.name];\n\n // Check required\n if (param.required && (value === undefined || value === null)) {\n return yield* Effect.fail(\n new ToolValidationError({\n message: `Missing required parameter \"${param.name}\"`,\n toolName: definition.name,\n parameter: param.name,\n expected: param.type,\n received: \"undefined\",\n }),\n );\n }\n\n if (value === undefined) {\n if (param.default !== undefined) {\n validated[param.name] = param.default;\n }\n continue;\n }\n\n // Type check\n const actualType = Array.isArray(value) ? \"array\" : typeof value;\n if (\n actualType !== param.type &&\n !(param.type === \"object\" && actualType === \"object\")\n ) {\n return yield* Effect.fail(\n new ToolValidationError({\n message: `Parameter \"${param.name}\" expected ${param.type}, got ${actualType}`,\n toolName: definition.name,\n parameter: param.name,\n expected: param.type,\n received: actualType,\n }),\n );\n }\n\n // Enum check\n if (\n param.enum &&\n typeof value === \"string\" &&\n !param.enum.includes(value)\n ) {\n return yield* Effect.fail(\n new ToolValidationError({\n message: `Parameter \"${param.name}\" must be one of: ${param.enum.join(\", \")}`,\n toolName: definition.name,\n parameter: param.name,\n expected: param.enum.join(\" | \"),\n received: String(value),\n }),\n );\n }\n\n validated[param.name] = value;\n }\n\n return validated;\n });\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition, FunctionCallingTool } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\n/**\n * Adapt a native function into a ToolDefinition + handler pair\n * suitable for registration in the ToolRegistry.\n */\nexport const adaptFunction = (opts: {\n readonly name: string;\n readonly description: string;\n readonly parameters: ToolDefinition[\"parameters\"];\n readonly category?: ToolDefinition[\"category\"];\n readonly riskLevel?: ToolDefinition[\"riskLevel\"];\n readonly timeoutMs?: number;\n readonly fn: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>;\n}): {\n definition: ToolDefinition;\n handler: (\n args: Record<string, unknown>,\n ) => Effect.Effect<unknown, ToolExecutionError>;\n} => ({\n definition: {\n name: opts.name,\n description: opts.description,\n parameters: opts.parameters,\n category: opts.category,\n riskLevel: opts.riskLevel ?? \"low\",\n timeoutMs: opts.timeoutMs ?? 30_000,\n requiresApproval: false,\n source: \"function\" as const,\n },\n handler: opts.fn,\n});\n\n/**\n * Convert a ToolDefinition to the Anthropic/OpenAI function calling format.\n */\nexport const toFunctionCallingTool = (\n definition: ToolDefinition,\n): FunctionCallingTool => ({\n name: definition.name,\n description: definition.description,\n input_schema: {\n type: \"object\" as unknown,\n properties: Object.fromEntries(\n definition.parameters.map((p) => [\n p.name,\n {\n type: p.type,\n description: p.description,\n ...(p.enum ? { enum: p.enum } : {}),\n },\n ]),\n ) as Record<string, unknown>,\n required: definition.parameters\n .filter((p) => p.required)\n .map((p) => p.name),\n } as Record<string, unknown>,\n});\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const webSearchTool: ToolDefinition = {\n name: \"web-search\",\n description: \"Search the web for information using a query string\",\n parameters: [\n {\n name: \"query\",\n type: \"string\",\n description: \"Search query\",\n required: true,\n },\n {\n name: \"maxResults\",\n type: \"number\",\n description: \"Max results to return\",\n required: false,\n default: 5,\n },\n ],\n category: \"search\",\n riskLevel: \"low\",\n timeoutMs: 10_000,\n requiresApproval: false,\n source: \"builtin\",\n};\n\nexport const webSearchHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const query = args.query as string;\n const maxResults = (args.maxResults as number) ?? 5;\n\n // In production: call search API (Tavily, SerpAPI, etc.)\n // Stub implementation for Phase 1\n return {\n query,\n maxResults,\n results: [],\n message: \"Web search stub - configure TAVILY_API_KEY for real results\",\n };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `Web search failed: ${e}`,\n toolName: \"web-search\",\n cause: e,\n }),\n });\n","import { Effect } from \"effect\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const fileReadTool: ToolDefinition = {\n name: \"file-read\",\n description: \"Read the contents of a file\",\n parameters: [\n {\n name: \"path\",\n type: \"string\",\n description: \"File path to read\",\n required: true,\n },\n {\n name: \"encoding\",\n type: \"string\",\n description: \"File encoding\",\n required: false,\n default: \"utf-8\",\n },\n ],\n category: \"file\",\n riskLevel: \"medium\",\n timeoutMs: 5_000,\n requiresApproval: false,\n source: \"builtin\",\n};\n\nexport const fileReadHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const filePath = args.path as string;\n const encoding = (args.encoding as BufferEncoding) ?? \"utf-8\";\n\n // Security: resolve path and check it's within allowed directory\n const resolved = path.resolve(filePath);\n const allowedBase = process.cwd();\n if (!resolved.startsWith(allowedBase)) {\n throw new Error(`Path traversal detected: ${filePath}`);\n }\n\n return await fs.readFile(resolved, { encoding });\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `File read failed: ${e}`,\n toolName: \"file-read\",\n cause: e,\n }),\n });\n\nexport const fileWriteTool: ToolDefinition = {\n name: \"file-write\",\n description: \"Write contents to a file\",\n parameters: [\n {\n name: \"path\",\n type: \"string\",\n description: \"File path to write\",\n required: true,\n },\n {\n name: \"content\",\n type: \"string\",\n description: \"Content to write\",\n required: true,\n },\n {\n name: \"encoding\",\n type: \"string\",\n description: \"File encoding\",\n required: false,\n default: \"utf-8\",\n },\n ],\n category: \"file\",\n riskLevel: \"high\",\n timeoutMs: 5_000,\n requiresApproval: true,\n source: \"builtin\",\n};\n\nexport const fileWriteHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const filePath = args.path as string;\n const content = args.content as string;\n const encoding = (args.encoding as BufferEncoding) ?? \"utf-8\";\n\n const resolved = path.resolve(filePath);\n const allowedBase = process.cwd();\n if (!resolved.startsWith(allowedBase)) {\n throw new Error(`Path traversal detected: ${filePath}`);\n }\n\n await fs.writeFile(resolved, content, { encoding });\n return { written: true, path: resolved };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `File write failed: ${e}`,\n toolName: \"file-write\",\n cause: e,\n }),\n });\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const httpGetTool: ToolDefinition = {\n name: \"http-get\",\n description: \"Make an HTTP GET request to a URL\",\n parameters: [\n {\n name: \"url\",\n type: \"string\",\n description: \"URL to fetch\",\n required: true,\n },\n {\n name: \"headers\",\n type: \"object\",\n description: \"Optional request headers\",\n required: false,\n },\n ],\n category: \"http\",\n riskLevel: \"medium\",\n timeoutMs: 15_000,\n requiresApproval: false,\n source: \"builtin\",\n};\n\nexport const httpGetHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.tryPromise({\n try: async () => {\n const url = args.url as string;\n const headers = (args.headers as Record<string, string>) ?? {};\n\n const response = await fetch(url, { method: \"GET\", headers });\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n let body: unknown;\n if (contentType.includes(\"application/json\")) {\n body = await response.json();\n } else {\n body = await response.text();\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n body,\n };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `HTTP GET failed: ${e}`,\n toolName: \"http-get\",\n cause: e,\n }),\n });\n","import { Effect } from \"effect\";\n\nimport type { ToolDefinition } from \"../types.js\";\nimport { ToolExecutionError } from \"../errors.js\";\n\nexport const codeExecuteTool: ToolDefinition = {\n name: \"code-execute\",\n description: \"Execute a JavaScript/TypeScript code snippet in a sandboxed environment\",\n parameters: [\n {\n name: \"code\",\n type: \"string\",\n description: \"Code to execute\",\n required: true,\n },\n {\n name: \"language\",\n type: \"string\",\n description: \"Programming language\",\n required: false,\n default: \"javascript\",\n enum: [\"javascript\", \"typescript\"],\n },\n ],\n category: \"code\",\n riskLevel: \"critical\",\n timeoutMs: 30_000,\n requiresApproval: true,\n source: \"builtin\",\n};\n\nexport const codeExecuteHandler = (\n args: Record<string, unknown>,\n): Effect.Effect<unknown, ToolExecutionError> =>\n Effect.try({\n try: () => {\n const code = args.code as string;\n // Phase 1: Simple eval-based execution (stub)\n // In production: use isolated-vm or Worker threads\n // For safety, we only return a stub response\n return {\n code,\n executed: false,\n message:\n \"Code execution stub - production implementation requires sandboxed runtime\",\n };\n },\n catch: (e) =>\n new ToolExecutionError({\n message: `Code execution failed: ${e}`,\n toolName: \"code-execute\",\n cause: e,\n }),\n });\n","import { Layer } from \"effect\";\n\nimport { EventBusLive } from \"@reactive-agents/core\";\nimport { ToolServiceLive } from \"./tool-service.js\";\n\n/**\n * Creates the full Tools layer with all dependencies wired.\n * Requires EventBus to be provided (or uses EventBusLive by default).\n */\nexport const createToolsLayer = () =>\n ToolServiceLive.pipe(Layer.provide(EventBusLive));\n\n/**\n * ToolServiceLive layer that requires EventBus to be provided externally.\n * Use this when composing with a shared EventBus from the runtime.\n */\nexport const ToolsLayer = ToolServiceLive;\n"],"mappings":"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","names":["Effect","Effect","Ref","Effect","resolve","Ref","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Effect","Layer","Layer"]}
|