@easynet/agent-tool 1.0.3 → 1.0.5

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 (43) hide show
  1. package/dist/api/main.cjs +15 -14
  2. package/dist/api/main.js +4 -3
  3. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  4. package/dist/{canonicalCoreSchemas-CTW6CCFY.cjs → canonicalCoreSchemas-MI6NURRD.cjs} +3 -2
  5. package/dist/{canonicalCoreSchemas-CTW6CCFY.cjs.map → canonicalCoreSchemas-MI6NURRD.cjs.map} +1 -1
  6. package/dist/canonicalCoreSchemas-MM5HFUT5.js +4 -0
  7. package/dist/{canonicalCoreSchemas-YLHVHYJZ.js.map → canonicalCoreSchemas-MM5HFUT5.js.map} +1 -1
  8. package/dist/{chunk-4U266P4H.cjs → chunk-4UX3TSYX.cjs} +24 -8
  9. package/dist/chunk-4UX3TSYX.cjs.map +1 -0
  10. package/dist/chunk-DGUM43GV.js +10 -0
  11. package/dist/chunk-DGUM43GV.js.map +1 -0
  12. package/dist/{chunk-YJSGSAS6.cjs → chunk-DRAI5EGY.cjs} +8 -8
  13. package/dist/{chunk-YJSGSAS6.cjs.map → chunk-DRAI5EGY.cjs.map} +1 -1
  14. package/dist/{chunk-WOCVXQOW.js → chunk-FJZYOB7A.js} +3 -3
  15. package/dist/{chunk-WOCVXQOW.js.map → chunk-FJZYOB7A.js.map} +1 -1
  16. package/dist/{chunk-KPKQ647P.cjs → chunk-IMILAC3V.cjs} +12 -12
  17. package/dist/{chunk-KPKQ647P.cjs.map → chunk-IMILAC3V.cjs.map} +1 -1
  18. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  19. package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
  20. package/dist/{chunk-YMCAX4O6.js → chunk-SRWE4BYI.js} +26 -10
  21. package/dist/chunk-SRWE4BYI.js.map +1 -0
  22. package/dist/{chunk-7SGI5EGB.js → chunk-T5HY2LIT.js} +3 -3
  23. package/dist/{chunk-7SGI5EGB.js.map → chunk-T5HY2LIT.js.map} +1 -1
  24. package/dist/{chunk-XJS3NKHW.cjs → chunk-TLK7HDJD.cjs} +9 -9
  25. package/dist/{chunk-XJS3NKHW.cjs.map → chunk-TLK7HDJD.cjs.map} +1 -1
  26. package/dist/{chunk-U55KMDXY.js → chunk-YDW7XTCB.js} +4 -4
  27. package/dist/{chunk-U55KMDXY.js.map → chunk-YDW7XTCB.js.map} +1 -1
  28. package/dist/core/index.cjs +1 -0
  29. package/dist/core/index.js +1 -0
  30. package/dist/core/runtime.cjs +1 -0
  31. package/dist/core/runtime.js +1 -0
  32. package/dist/index.cjs +45 -44
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.js +6 -5
  35. package/dist/index.js.map +1 -1
  36. package/dist/utils/cli/index.cjs +16 -15
  37. package/dist/utils/cli/index.cjs.map +1 -1
  38. package/dist/utils/cli/index.js +4 -3
  39. package/dist/utils/cli/index.js.map +1 -1
  40. package/package.json +1 -5
  41. package/dist/canonicalCoreSchemas-YLHVHYJZ.js +0 -3
  42. package/dist/chunk-4U266P4H.cjs.map +0 -1
  43. package/dist/chunk-YMCAX4O6.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { createRuntimeFromConfig, MCP_KIND } from './chunk-YMCAX4O6.js';
1
+ import { createRuntimeFromConfig, MCP_KIND } from './chunk-SRWE4BYI.js';
2
2
  import { enrichSpecWithCanonicalSchema } from './chunk-FR2CXERF.js';
3
3
  import { createServer } from 'http';
4
4
 
@@ -240,7 +240,7 @@ function createOpenAPIHttpServer(runtime, options = {}) {
240
240
  return;
241
241
  }
242
242
  if (req.method === "GET" && norm === "/tools") {
243
- const { enrichSpecWithCanonicalSchema: enrichSpecWithCanonicalSchema2 } = await import('./canonicalCoreSchemas-YLHVHYJZ.js');
243
+ const { enrichSpecWithCanonicalSchema: enrichSpecWithCanonicalSchema2 } = await import('./canonicalCoreSchemas-MM5HFUT5.js');
244
244
  const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema2);
245
245
  const tools = specs.map((s) => ({
246
246
  name: s.name,
@@ -465,5 +465,5 @@ async function runMCPServerOverStdio(runtime, options = {}) {
465
465
  }
466
466
 
467
467
  export { createHttpService, createMCPServer, createMCPServerStreamableHttp, createMCPStreamableHttpHandler, runMCPServerOverStdio };
468
- //# sourceMappingURL=chunk-U55KMDXY.js.map
469
- //# sourceMappingURL=chunk-U55KMDXY.js.map
468
+ //# sourceMappingURL=chunk-YDW7XTCB.js.map
469
+ //# sourceMappingURL=chunk-YDW7XTCB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts","../src/api/expose/mcpServer.ts"],"names":["enrichSpecWithCanonicalSchema","DEFAULT_CTX"],"mappings":"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","file":"chunk-U55KMDXY.js","sourcesContent":["/**\n * Expose tools as OpenAPI (Swagger) spec and optional HTTP server.\n * Same tools can be used via LangChain, MCP, or REST.\n */\n\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\nexport interface OpenAPISpecOptions {\n /** API title (default: \"Tool API\") */\n title?: string;\n /** API version (default: \"1.0.0\") */\n version?: string;\n /** Base path for the API (default: \"\") */\n basePath?: string;\n}\n\n/** Tool name to URL path segment: \"core/fs.readText\" -> \"core~fs.readText\" */\nexport function toolNameToSlug(name: string): string {\n return name.replace(/\\//g, \"~\");\n}\n\n/** URL path segment back to tool name: \"core~fs.readText\" -> \"core/fs.readText\" */\nexport function slugToToolName(slug: string): string {\n return slug.replace(/~/g, \"/\");\n}\n\n/** Safe schema key for components: \"core/fs.readText\" -> \"Tool_core_fs_readText\" */\nfunction toolSchemaKey(name: string): string {\n return `Tool_${name.replace(/[^a-zA-Z0-9_]/g, \"_\")}`;\n}\n\nconst resultSchema = {\n type: \"object\" as const,\n properties: {\n result: { description: \"Tool return value\", additionalProperties: true },\n },\n};\nconst errorSchema = {\n type: \"object\" as const,\n properties: {\n error: { type: \"string\" },\n kind: { type: \"string\" },\n details: { type: \"object\", additionalProperties: true },\n },\n};\n\n/**\n * Build OpenAPI 3.0 document from the tool registry.\n * GET /tools, POST /invoke (generic), and one POST /invoke/{toolSlug} per tool with that tool's input schema.\n */\nexport function toolsToOpenAPISpec(\n registry: ToolRegistry,\n options: OpenAPISpecOptions = {}\n): Record<string, unknown> {\n const title = options.title ?? \"Tool API\";\n const version = options.version ?? \"1.0.0\";\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const specs = registry.snapshot().map(enrichSpecWithCanonicalSchema);\n\n const toolNamesSchema = {\n type: \"object\",\n required: [\"tools\"],\n properties: {\n tools: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n description: { type: \"string\" },\n kind: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const invokeRequestBody = {\n type: \"object\",\n required: [\"tool\", \"args\"],\n properties: {\n tool: { type: \"string\", description: \"Tool name (e.g. from GET /tools)\" },\n args: {\n type: \"object\",\n description: \"Tool arguments (schema per tool; use per-tool paths for typed schema)\",\n additionalProperties: true,\n },\n },\n };\n\n const prefix = basePath ? `${basePath}/` : \"/\";\n const paths: Record<string, unknown> = {\n [`${prefix}tools`]: {\n get: {\n summary: \"List tools\",\n description: \"Returns all registered tool names and descriptions.\",\n operationId: \"listTools\",\n responses: {\n \"200\": {\n description: \"List of tools\",\n content: {\n \"application/json\": {\n schema: toolNamesSchema,\n },\n },\n },\n },\n },\n },\n [`${prefix}invoke`]: {\n post: {\n summary: \"Invoke a tool (generic)\",\n description: \"Call any tool by name with body { tool, args }. For typed schemas use POST /invoke/{toolSlug}.\",\n operationId: \"invokeTool\",\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: invokeRequestBody,\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n },\n };\n\n const schemaEntries: [string, object][] = [];\n for (const s of specs) {\n const key = toolSchemaKey(s.name);\n schemaEntries.push([key, s.inputSchema as object]);\n const slug = toolNameToSlug(s.name);\n paths[`${prefix}invoke/${slug}`] = {\n post: {\n summary: s.description ?? s.name,\n description: `Invoke tool \\`${s.name}\\`. Request body is the tool's arguments (JSON Schema below).`,\n operationId: `invoke_${key}`,\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${key}` },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request (invalid args or tool error)\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n };\n }\n\n return {\n openapi: \"3.0.3\",\n info: { title, version },\n paths,\n components: {\n schemas: Object.fromEntries(schemaEntries),\n },\n };\n}\n","/**\n * HTTP server that exposes tools via OpenAPI (Swagger): GET / (Swagger UI), GET /openapi.json, GET /tools, POST /invoke.\n * All invokes go through PTCRuntime.invoke(intent, ctx). Uses Node's built-in http.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { toolsToOpenAPISpec, slugToToolName } from \"./openapi.js\";\n\nexport interface OpenAPIHttpServerOptions {\n /** Port (default: 0 = let OS choose) */\n port?: number;\n /** Host (default: \"localhost\") */\n host?: string;\n /** Base path for routes (default: \"\") */\n basePath?: string;\n /** Build ExecContext for each request (default: minimal ctx) */\n execContextFactory?: (req: IncomingMessage) => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `http-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nfunction parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw.trim()) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw) as unknown);\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\n/** Build HTML for Swagger UI (CDN) pointing at the given spec URL. */\nfunction swaggerUiHtml(specUrl: string): string {\n const specUrlEscaped = specUrl.replace(/\"/g, \"&quot;\");\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Tool API – Swagger UI</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\">\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" crossorigin></script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" crossorigin></script>\n <script>\n window.onload = function() {\n window.ui = SwaggerUIBundle({\n url: \"${specUrlEscaped}\",\n dom_id: \"#swagger-ui\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n layout: \"StandaloneLayout\"\n });\n };\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Create an HTTP server that exposes tools via OpenAPI-style routes.\n * - GET / or GET /swagger: Swagger UI (interactive docs)\n * - GET /openapi.json (or basePath/openapi.json): OpenAPI 3.0 spec\n * - GET /tools: list tools\n * - POST /invoke: body { tool, args } -> { result } or { error }\n */\nexport function createOpenAPIHttpServer(\n runtime: PTCRuntime,\n options: OpenAPIHttpServerOptions = {}\n): import(\"node:http\").Server {\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? \"/\";\n const path = url.split(\"?\")[0] ?? \"/\";\n const norm = basePath ? (path === basePath ? \"\" : path.replace(basePath, \"\") || \"/\") : path;\n\n try {\n if (req.method === \"GET\" && (norm === \"/\" || norm === \"/swagger\")) {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n const html = swaggerUiHtml(specPath);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"GET\" && (norm === \"/openapi.json\" || norm === \"/spec\")) {\n const spec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n });\n sendJson(res, 200, spec);\n return;\n }\n\n if (req.method === \"GET\" && norm === \"/tools\") {\n const { enrichSpecWithCanonicalSchema } = await import(\"../../tools/util/canonicalCoreSchemas.js\");\n const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema);\n const tools = specs.map((s) => ({\n name: s.name,\n description: s.description,\n kind: s.kind,\n inputSchema: s.inputSchema,\n }));\n sendJson(res, 200, { tools });\n return;\n }\n\n if (req.method === \"POST\" && norm === \"/invoke\") {\n const body = (await parseBody(req)) as { tool?: string; args?: unknown };\n const tool = body?.tool;\n const args = body?.args ?? {};\n if (typeof tool !== \"string\" || !tool.trim()) {\n sendJson(res, 400, { error: \"Missing or invalid 'tool' in body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: tool.trim(), args, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n if (req.method === \"POST\" && norm.startsWith(\"/invoke/\") && norm.length > \"/invoke/\".length) {\n const slug = norm.slice(\"/invoke/\".length);\n const toolName = slugToToolName(slug);\n let args: unknown;\n try {\n args = await parseBody(req);\n } catch {\n sendJson(res, 400, { error: \"Invalid JSON body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: toolName, args: args ?? {}, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", path: norm }));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: message, kind: \"INTERNAL_ERROR\" });\n }\n });\n\n return server;\n}\n\n/**\n * Start the OpenAPI HTTP server on the given port/host.\n * Call after createOpenAPIHttpServer if you did not pass port in options.\n */\nexport function listenOpenAPIHttpServer(\n server: import(\"node:http\").Server,\n options: { port?: number; host?: string } = {}\n): Promise<{ port: number; host: string }> {\n return new Promise((resolve, reject) => {\n const port = options.port ?? 0;\n const host = options.host ?? \"localhost\";\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr?.port != null ? addr.port : port;\n resolve({ port: actualPort, host });\n });\n server.on(\"error\", reject);\n });\n}\n\nexport interface HttpServiceResult {\n /** Node HTTP server (call .close() when done) */\n server: import(\"node:http\").Server;\n /** OpenAPI 3.0 spec document (for Swagger UI etc.) */\n openApiSpec: Record<string, unknown>;\n /** Start listening; returns { port, host } */\n listen: (options?: { port?: number; host?: string }) => Promise<{ port: number; host: string }>;\n}\n\nexport interface CreateHttpServiceOptions extends OpenAPIHttpServerOptions {\n /** API title for OpenAPI spec (default: \"Tool API\") */\n title?: string;\n /** API version for OpenAPI spec (default: \"1.0.0\") */\n version?: string;\n}\n\n/**\n * Create HTTP service that exposes tools via OpenAPI (Swagger).\n * Returns server, OpenAPI spec, and a listen() helper.\n */\nexport function createHttpService(\n runtime: PTCRuntime,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\n/**\n * Create HTTP service from config (async: loads tools from projectPath when set).\n */\nexport function createHttpService(\n config: CreateRuntimeOptions,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\nexport async function createHttpService(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateHttpServiceOptions = {}\n): Promise<HttpServiceResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const server = createOpenAPIHttpServer(runtime, options);\n const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: options.title ?? \"Tool API\",\n version: options.version ?? \"1.0.0\",\n basePath: options.basePath,\n });\n return {\n server,\n openApiSpec,\n listen: (listenOpts) => listenOpenAPIHttpServer(server, listenOpts),\n };\n}\n","/**\n * Expose tools as an MCP server (stdio or Streamable HTTP). All invokes go through PTCRuntime.invoke(intent, ctx).\n * Requires @modelcontextprotocol/sdk.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { MCP_KIND } from \"../../tools/mcp/types.js\";\n\nexport interface MCPServerOptions {\n /** Server name (default: \"agent-tool\") */\n name?: string;\n /** Server version (default: \"1.0.0\") */\n version?: string;\n /** Build ExecContext for each tool call (default: minimal ctx) */\n execContextFactory?: () => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nexport interface MCPServerResult {\n /** The MCP server instance */\n server: { connect(transport: unknown): Promise<void>; close?(): Promise<void> };\n /** Call this to start listening on stdio (for in-process MCP service) */\n connectStdio: () => Promise<void>;\n}\n\n/** Request handler for Streamable HTTP: (req, res, parsedBody?) => Promise<void>. Use with Express app.post(path, handler) and express.json(). */\nexport type MCPStreamableHttpHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n) => Promise<void>;\n\nexport interface MCPServerStreamableHttpResult {\n /** Express app with POST /mcp (or path) wired to Streamable HTTP handler */\n app: { post: (path: string, handler: MCPStreamableHttpHandler) => void };\n /** Path mounted (e.g. \"/mcp\") */\n path: string;\n /** Start HTTP server; returns when listening. Use createMCPStreamableHttpHandler + your own server if you prefer. */\n listen: (port?: number, host?: string) => Promise<{ url: string; port: number }>;\n}\n\n/**\n * Create a configured McpServer with all tools from the given runtime (no transport connected).\n * Used by createMCPServer (stdio) and createMCPStreamableHttpHandler (Streamable HTTP).\n */\nasync function createMcpServerWithTools(\n runtime: PTCRuntime,\n options: MCPServerOptions\n): Promise<{ server: InstanceType<Awaited<typeof import(\"@modelcontextprotocol/sdk/server/mcp.js\")>[\"McpServer\"]> }> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const name = options.name ?? \"agent-tool\";\n const version = options.version ?? \"1.0.0\";\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = new McpServer({ name, version });\n const registry = runtime.getRegistry();\n const specs = registry.snapshot();\n\n for (const spec of specs) {\n server.registerTool(\n spec.name,\n {\n description: spec.description ?? `Tool: ${spec.name}`,\n inputSchema: spec.inputSchema,\n _meta: spec._meta,\n } as Parameters<typeof server.registerTool>[1],\n async (args: unknown) => {\n const ctx = ctxFactory();\n const result = await runtime.invoke(\n { tool: spec.name, args: args ?? {}, purpose: MCP_KIND },\n ctx\n );\n if (result.ok) {\n return { content: [{ type: \"text\", text: JSON.stringify(result.result) }] };\n }\n const err = result.error;\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: err?.message ?? \"Tool failed\", kind: err?.kind }),\n },\n ],\n isError: true,\n };\n }\n );\n }\n return { server };\n}\n\n/**\n * Create an MCP server that serves all tools from the given PTCRuntime.\n * Register tools with the server; then call connectStdio() to listen on stdio (for Cursor/Claude).\n */\nexport function createMCPServer(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\n/**\n * Create an MCP server from config (async: loads tools from projectPath when set).\n */\nexport function createMCPServer(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\nexport async function createMCPServer(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const { server } = await createMcpServerWithTools(runtime, options);\n\n return {\n server,\n async connectStdio() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n },\n };\n}\n\n/**\n * Create a request handler for MCP Streamable HTTP (stateless). Use with Express: app.use(express.json()); app.post(\"/mcp\", handler).\n * Each request gets a new server and transport; supports SSE and direct HTTP responses per MCP Streamable HTTP spec.\n */\nexport function createMCPStreamableHttpHandler(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): MCPStreamableHttpHandler;\n\nexport function createMCPStreamableHttpHandler(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPStreamableHttpHandler>;\n\nexport function createMCPStreamableHttpHandler(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): MCPStreamableHttpHandler | Promise<MCPStreamableHttpHandler> {\n if (\"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\") {\n const runtime = runtimeOrConfig as PTCRuntime;\n return async function streamableHttpHandler(\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n ): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const { server } = await createMcpServerWithTools(runtime, options);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await server.connect(transport);\n const onClose = (): void => {\n transport.close().catch(() => {});\n server.close().catch(() => {});\n res.removeListener(\"close\", onClose);\n res.removeListener(\"finish\", onClose);\n };\n res.once(\"close\", onClose);\n res.once(\"finish\", onClose);\n await transport.handleRequest(\n req as IncomingMessage & { auth?: import(\"@modelcontextprotocol/sdk/server/auth/types.js\").AuthInfo },\n res,\n parsedBody\n );\n };\n }\n return (async (): Promise<MCPStreamableHttpHandler> => {\n const { runtime } = await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions);\n return createMCPStreamableHttpHandler(runtime, options) as MCPStreamableHttpHandler;\n })();\n}\n\nexport interface CreateMCPServerStreamableHttpOptions extends MCPServerOptions {\n /** Path for MCP endpoint (default: \"/mcp\") */\n path?: string;\n /** Host to bind (default: \"127.0.0.1\") */\n host?: string;\n /** Port (default: 3000) */\n port?: number;\n}\n\n/**\n * Create an Express app with MCP Streamable HTTP handler mounted at path. Requires @modelcontextprotocol/sdk (which uses express).\n * Returns app and listen(port?, host?) to start the HTTP server.\n */\nexport function createMCPServerStreamableHttp(\n runtime: PTCRuntime,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport function createMCPServerStreamableHttp(\n config: CreateRuntimeOptions,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport async function createMCPServerStreamableHttp(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateMCPServerStreamableHttpOptions = {}\n): Promise<MCPServerStreamableHttpResult> {\n const path = options.path ?? \"/mcp\";\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 3000;\n const { createMcpExpressApp } = await import(\"@modelcontextprotocol/sdk/server/express.js\");\n const handler =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? createMCPStreamableHttpHandler(runtimeOrConfig as PTCRuntime, options)\n : await createMCPStreamableHttpHandler(runtimeOrConfig as CreateRuntimeOptions, options);\n const app = createMcpExpressApp({ host });\n app.post(path, handler);\n\n return {\n app,\n path,\n async listen(listenPort?: number, listenHost?: string): Promise<{ url: string; port: number }> {\n const p = listenPort ?? port;\n const h = listenHost ?? host;\n return new Promise((resolve, reject) => {\n const server = (app as {\n listen: (port: number, host: string, cb?: () => void) => import(\"node:http\").Server;\n }).listen(p, h, () => {\n const addr = server.address();\n const actualPort =\n typeof addr === \"object\" && addr !== null && \"port\" in addr ? addr.port : p;\n resolve({ url: `http://${h}:${actualPort}${path}`, port: actualPort });\n });\n });\n },\n };\n}\n\n/**\n * Run MCP server over stdio using the given runtime.\n * Call this when your process should act as an MCP server (e.g. for Cursor/Claude to connect).\n */\nexport async function runMCPServerOverStdio(\n runtime: PTCRuntime,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const result = await createMCPServer(runtime, options);\n await result.connectStdio();\n return result;\n}\n"]}
1
+ {"version":3,"sources":["../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts","../src/api/expose/mcpServer.ts"],"names":["enrichSpecWithCanonicalSchema","DEFAULT_CTX"],"mappings":"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","file":"chunk-YDW7XTCB.js","sourcesContent":["/**\n * Expose tools as OpenAPI (Swagger) spec and optional HTTP server.\n * Same tools can be used via LangChain, MCP, or REST.\n */\n\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\nexport interface OpenAPISpecOptions {\n /** API title (default: \"Tool API\") */\n title?: string;\n /** API version (default: \"1.0.0\") */\n version?: string;\n /** Base path for the API (default: \"\") */\n basePath?: string;\n}\n\n/** Tool name to URL path segment: \"core/fs.readText\" -> \"core~fs.readText\" */\nexport function toolNameToSlug(name: string): string {\n return name.replace(/\\//g, \"~\");\n}\n\n/** URL path segment back to tool name: \"core~fs.readText\" -> \"core/fs.readText\" */\nexport function slugToToolName(slug: string): string {\n return slug.replace(/~/g, \"/\");\n}\n\n/** Safe schema key for components: \"core/fs.readText\" -> \"Tool_core_fs_readText\" */\nfunction toolSchemaKey(name: string): string {\n return `Tool_${name.replace(/[^a-zA-Z0-9_]/g, \"_\")}`;\n}\n\nconst resultSchema = {\n type: \"object\" as const,\n properties: {\n result: { description: \"Tool return value\", additionalProperties: true },\n },\n};\nconst errorSchema = {\n type: \"object\" as const,\n properties: {\n error: { type: \"string\" },\n kind: { type: \"string\" },\n details: { type: \"object\", additionalProperties: true },\n },\n};\n\n/**\n * Build OpenAPI 3.0 document from the tool registry.\n * GET /tools, POST /invoke (generic), and one POST /invoke/{toolSlug} per tool with that tool's input schema.\n */\nexport function toolsToOpenAPISpec(\n registry: ToolRegistry,\n options: OpenAPISpecOptions = {}\n): Record<string, unknown> {\n const title = options.title ?? \"Tool API\";\n const version = options.version ?? \"1.0.0\";\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const specs = registry.snapshot().map(enrichSpecWithCanonicalSchema);\n\n const toolNamesSchema = {\n type: \"object\",\n required: [\"tools\"],\n properties: {\n tools: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n description: { type: \"string\" },\n kind: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const invokeRequestBody = {\n type: \"object\",\n required: [\"tool\", \"args\"],\n properties: {\n tool: { type: \"string\", description: \"Tool name (e.g. from GET /tools)\" },\n args: {\n type: \"object\",\n description: \"Tool arguments (schema per tool; use per-tool paths for typed schema)\",\n additionalProperties: true,\n },\n },\n };\n\n const prefix = basePath ? `${basePath}/` : \"/\";\n const paths: Record<string, unknown> = {\n [`${prefix}tools`]: {\n get: {\n summary: \"List tools\",\n description: \"Returns all registered tool names and descriptions.\",\n operationId: \"listTools\",\n responses: {\n \"200\": {\n description: \"List of tools\",\n content: {\n \"application/json\": {\n schema: toolNamesSchema,\n },\n },\n },\n },\n },\n },\n [`${prefix}invoke`]: {\n post: {\n summary: \"Invoke a tool (generic)\",\n description: \"Call any tool by name with body { tool, args }. For typed schemas use POST /invoke/{toolSlug}.\",\n operationId: \"invokeTool\",\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: invokeRequestBody,\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n },\n };\n\n const schemaEntries: [string, object][] = [];\n for (const s of specs) {\n const key = toolSchemaKey(s.name);\n schemaEntries.push([key, s.inputSchema as object]);\n const slug = toolNameToSlug(s.name);\n paths[`${prefix}invoke/${slug}`] = {\n post: {\n summary: s.description ?? s.name,\n description: `Invoke tool \\`${s.name}\\`. Request body is the tool's arguments (JSON Schema below).`,\n operationId: `invoke_${key}`,\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${key}` },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request (invalid args or tool error)\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n };\n }\n\n return {\n openapi: \"3.0.3\",\n info: { title, version },\n paths,\n components: {\n schemas: Object.fromEntries(schemaEntries),\n },\n };\n}\n","/**\n * HTTP server that exposes tools via OpenAPI (Swagger): GET / (Swagger UI), GET /openapi.json, GET /tools, POST /invoke.\n * All invokes go through PTCRuntime.invoke(intent, ctx). Uses Node's built-in http.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { toolsToOpenAPISpec, slugToToolName } from \"./openapi.js\";\n\nexport interface OpenAPIHttpServerOptions {\n /** Port (default: 0 = let OS choose) */\n port?: number;\n /** Host (default: \"localhost\") */\n host?: string;\n /** Base path for routes (default: \"\") */\n basePath?: string;\n /** Build ExecContext for each request (default: minimal ctx) */\n execContextFactory?: (req: IncomingMessage) => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `http-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nfunction parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw.trim()) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw) as unknown);\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\n/** Build HTML for Swagger UI (CDN) pointing at the given spec URL. */\nfunction swaggerUiHtml(specUrl: string): string {\n const specUrlEscaped = specUrl.replace(/\"/g, \"&quot;\");\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Tool API – Swagger UI</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\">\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" crossorigin></script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" crossorigin></script>\n <script>\n window.onload = function() {\n window.ui = SwaggerUIBundle({\n url: \"${specUrlEscaped}\",\n dom_id: \"#swagger-ui\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n layout: \"StandaloneLayout\"\n });\n };\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Create an HTTP server that exposes tools via OpenAPI-style routes.\n * - GET / or GET /swagger: Swagger UI (interactive docs)\n * - GET /openapi.json (or basePath/openapi.json): OpenAPI 3.0 spec\n * - GET /tools: list tools\n * - POST /invoke: body { tool, args } -> { result } or { error }\n */\nexport function createOpenAPIHttpServer(\n runtime: PTCRuntime,\n options: OpenAPIHttpServerOptions = {}\n): import(\"node:http\").Server {\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? \"/\";\n const path = url.split(\"?\")[0] ?? \"/\";\n const norm = basePath ? (path === basePath ? \"\" : path.replace(basePath, \"\") || \"/\") : path;\n\n try {\n if (req.method === \"GET\" && (norm === \"/\" || norm === \"/swagger\")) {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n const html = swaggerUiHtml(specPath);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"GET\" && (norm === \"/openapi.json\" || norm === \"/spec\")) {\n const spec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n });\n sendJson(res, 200, spec);\n return;\n }\n\n if (req.method === \"GET\" && norm === \"/tools\") {\n const { enrichSpecWithCanonicalSchema } = await import(\"../../tools/util/canonicalCoreSchemas.js\");\n const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema);\n const tools = specs.map((s) => ({\n name: s.name,\n description: s.description,\n kind: s.kind,\n inputSchema: s.inputSchema,\n }));\n sendJson(res, 200, { tools });\n return;\n }\n\n if (req.method === \"POST\" && norm === \"/invoke\") {\n const body = (await parseBody(req)) as { tool?: string; args?: unknown };\n const tool = body?.tool;\n const args = body?.args ?? {};\n if (typeof tool !== \"string\" || !tool.trim()) {\n sendJson(res, 400, { error: \"Missing or invalid 'tool' in body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: tool.trim(), args, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n if (req.method === \"POST\" && norm.startsWith(\"/invoke/\") && norm.length > \"/invoke/\".length) {\n const slug = norm.slice(\"/invoke/\".length);\n const toolName = slugToToolName(slug);\n let args: unknown;\n try {\n args = await parseBody(req);\n } catch {\n sendJson(res, 400, { error: \"Invalid JSON body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: toolName, args: args ?? {}, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", path: norm }));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: message, kind: \"INTERNAL_ERROR\" });\n }\n });\n\n return server;\n}\n\n/**\n * Start the OpenAPI HTTP server on the given port/host.\n * Call after createOpenAPIHttpServer if you did not pass port in options.\n */\nexport function listenOpenAPIHttpServer(\n server: import(\"node:http\").Server,\n options: { port?: number; host?: string } = {}\n): Promise<{ port: number; host: string }> {\n return new Promise((resolve, reject) => {\n const port = options.port ?? 0;\n const host = options.host ?? \"localhost\";\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr?.port != null ? addr.port : port;\n resolve({ port: actualPort, host });\n });\n server.on(\"error\", reject);\n });\n}\n\nexport interface HttpServiceResult {\n /** Node HTTP server (call .close() when done) */\n server: import(\"node:http\").Server;\n /** OpenAPI 3.0 spec document (for Swagger UI etc.) */\n openApiSpec: Record<string, unknown>;\n /** Start listening; returns { port, host } */\n listen: (options?: { port?: number; host?: string }) => Promise<{ port: number; host: string }>;\n}\n\nexport interface CreateHttpServiceOptions extends OpenAPIHttpServerOptions {\n /** API title for OpenAPI spec (default: \"Tool API\") */\n title?: string;\n /** API version for OpenAPI spec (default: \"1.0.0\") */\n version?: string;\n}\n\n/**\n * Create HTTP service that exposes tools via OpenAPI (Swagger).\n * Returns server, OpenAPI spec, and a listen() helper.\n */\nexport function createHttpService(\n runtime: PTCRuntime,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\n/**\n * Create HTTP service from config (async: loads tools from projectPath when set).\n */\nexport function createHttpService(\n config: CreateRuntimeOptions,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\nexport async function createHttpService(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateHttpServiceOptions = {}\n): Promise<HttpServiceResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const server = createOpenAPIHttpServer(runtime, options);\n const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: options.title ?? \"Tool API\",\n version: options.version ?? \"1.0.0\",\n basePath: options.basePath,\n });\n return {\n server,\n openApiSpec,\n listen: (listenOpts) => listenOpenAPIHttpServer(server, listenOpts),\n };\n}\n","/**\n * Expose tools as an MCP server (stdio or Streamable HTTP). All invokes go through PTCRuntime.invoke(intent, ctx).\n * Requires @modelcontextprotocol/sdk.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { MCP_KIND } from \"../../tools/mcp/types.js\";\n\nexport interface MCPServerOptions {\n /** Server name (default: \"agent-tool\") */\n name?: string;\n /** Server version (default: \"1.0.0\") */\n version?: string;\n /** Build ExecContext for each tool call (default: minimal ctx) */\n execContextFactory?: () => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nexport interface MCPServerResult {\n /** The MCP server instance */\n server: { connect(transport: unknown): Promise<void>; close?(): Promise<void> };\n /** Call this to start listening on stdio (for in-process MCP service) */\n connectStdio: () => Promise<void>;\n}\n\n/** Request handler for Streamable HTTP: (req, res, parsedBody?) => Promise<void>. Use with Express app.post(path, handler) and express.json(). */\nexport type MCPStreamableHttpHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n) => Promise<void>;\n\nexport interface MCPServerStreamableHttpResult {\n /** Express app with POST /mcp (or path) wired to Streamable HTTP handler */\n app: { post: (path: string, handler: MCPStreamableHttpHandler) => void };\n /** Path mounted (e.g. \"/mcp\") */\n path: string;\n /** Start HTTP server; returns when listening. Use createMCPStreamableHttpHandler + your own server if you prefer. */\n listen: (port?: number, host?: string) => Promise<{ url: string; port: number }>;\n}\n\n/**\n * Create a configured McpServer with all tools from the given runtime (no transport connected).\n * Used by createMCPServer (stdio) and createMCPStreamableHttpHandler (Streamable HTTP).\n */\nasync function createMcpServerWithTools(\n runtime: PTCRuntime,\n options: MCPServerOptions\n): Promise<{ server: InstanceType<Awaited<typeof import(\"@modelcontextprotocol/sdk/server/mcp.js\")>[\"McpServer\"]> }> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const name = options.name ?? \"agent-tool\";\n const version = options.version ?? \"1.0.0\";\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = new McpServer({ name, version });\n const registry = runtime.getRegistry();\n const specs = registry.snapshot();\n\n for (const spec of specs) {\n server.registerTool(\n spec.name,\n {\n description: spec.description ?? `Tool: ${spec.name}`,\n inputSchema: spec.inputSchema,\n _meta: spec._meta,\n } as Parameters<typeof server.registerTool>[1],\n async (args: unknown) => {\n const ctx = ctxFactory();\n const result = await runtime.invoke(\n { tool: spec.name, args: args ?? {}, purpose: MCP_KIND },\n ctx\n );\n if (result.ok) {\n return { content: [{ type: \"text\", text: JSON.stringify(result.result) }] };\n }\n const err = result.error;\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: err?.message ?? \"Tool failed\", kind: err?.kind }),\n },\n ],\n isError: true,\n };\n }\n );\n }\n return { server };\n}\n\n/**\n * Create an MCP server that serves all tools from the given PTCRuntime.\n * Register tools with the server; then call connectStdio() to listen on stdio (for Cursor/Claude).\n */\nexport function createMCPServer(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\n/**\n * Create an MCP server from config (async: loads tools from projectPath when set).\n */\nexport function createMCPServer(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\nexport async function createMCPServer(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const { server } = await createMcpServerWithTools(runtime, options);\n\n return {\n server,\n async connectStdio() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n },\n };\n}\n\n/**\n * Create a request handler for MCP Streamable HTTP (stateless). Use with Express: app.use(express.json()); app.post(\"/mcp\", handler).\n * Each request gets a new server and transport; supports SSE and direct HTTP responses per MCP Streamable HTTP spec.\n */\nexport function createMCPStreamableHttpHandler(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): MCPStreamableHttpHandler;\n\nexport function createMCPStreamableHttpHandler(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPStreamableHttpHandler>;\n\nexport function createMCPStreamableHttpHandler(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): MCPStreamableHttpHandler | Promise<MCPStreamableHttpHandler> {\n if (\"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\") {\n const runtime = runtimeOrConfig as PTCRuntime;\n return async function streamableHttpHandler(\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n ): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const { server } = await createMcpServerWithTools(runtime, options);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await server.connect(transport);\n const onClose = (): void => {\n transport.close().catch(() => {});\n server.close().catch(() => {});\n res.removeListener(\"close\", onClose);\n res.removeListener(\"finish\", onClose);\n };\n res.once(\"close\", onClose);\n res.once(\"finish\", onClose);\n await transport.handleRequest(\n req as IncomingMessage & { auth?: import(\"@modelcontextprotocol/sdk/server/auth/types.js\").AuthInfo },\n res,\n parsedBody\n );\n };\n }\n return (async (): Promise<MCPStreamableHttpHandler> => {\n const { runtime } = await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions);\n return createMCPStreamableHttpHandler(runtime, options) as MCPStreamableHttpHandler;\n })();\n}\n\nexport interface CreateMCPServerStreamableHttpOptions extends MCPServerOptions {\n /** Path for MCP endpoint (default: \"/mcp\") */\n path?: string;\n /** Host to bind (default: \"127.0.0.1\") */\n host?: string;\n /** Port (default: 3000) */\n port?: number;\n}\n\n/**\n * Create an Express app with MCP Streamable HTTP handler mounted at path. Requires @modelcontextprotocol/sdk (which uses express).\n * Returns app and listen(port?, host?) to start the HTTP server.\n */\nexport function createMCPServerStreamableHttp(\n runtime: PTCRuntime,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport function createMCPServerStreamableHttp(\n config: CreateRuntimeOptions,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport async function createMCPServerStreamableHttp(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateMCPServerStreamableHttpOptions = {}\n): Promise<MCPServerStreamableHttpResult> {\n const path = options.path ?? \"/mcp\";\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 3000;\n const { createMcpExpressApp } = await import(\"@modelcontextprotocol/sdk/server/express.js\");\n const handler =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? createMCPStreamableHttpHandler(runtimeOrConfig as PTCRuntime, options)\n : await createMCPStreamableHttpHandler(runtimeOrConfig as CreateRuntimeOptions, options);\n const app = createMcpExpressApp({ host });\n app.post(path, handler);\n\n return {\n app,\n path,\n async listen(listenPort?: number, listenHost?: string): Promise<{ url: string; port: number }> {\n const p = listenPort ?? port;\n const h = listenHost ?? host;\n return new Promise((resolve, reject) => {\n const server = (app as {\n listen: (port: number, host: string, cb?: () => void) => import(\"node:http\").Server;\n }).listen(p, h, () => {\n const addr = server.address();\n const actualPort =\n typeof addr === \"object\" && addr !== null && \"port\" in addr ? addr.port : p;\n resolve({ url: `http://${h}:${actualPort}${path}`, port: actualPort });\n });\n });\n },\n };\n}\n\n/**\n * Run MCP server over stdio using the given runtime.\n * Call this when your process should act as an MCP server (e.g. for Cursor/Claude to connect).\n */\nexport async function runMCPServerOverStdio(\n runtime: PTCRuntime,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const result = await createMCPServer(runtime, options);\n await result.connectStdio();\n return result;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkSOFUWEZ6_cjs = require('../chunk-SOFUWEZ6.cjs');
4
+ require('../chunk-JEQ2X3Z6.cjs');
4
5
 
5
6
 
6
7
 
@@ -1,3 +1,4 @@
1
1
  export { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA, createToolSpec } from '../chunk-5SWSNVMI.js';
2
+ import '../chunk-DGUM43GV.js';
2
3
  //# sourceMappingURL=index.js.map
3
4
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkZNJBRLKN_cjs = require('../chunk-ZNJBRLKN.cjs');
4
+ require('../chunk-JEQ2X3Z6.cjs');
4
5
 
5
6
 
6
7
 
@@ -1,3 +1,4 @@
1
1
  export { ToolRegistry, createTaggedError, isRetryable, withRetry } from '../chunk-AE6FSNGY.js';
2
+ import '../chunk-DGUM43GV.js';
2
3
  //# sourceMappingURL=runtime.js.map
3
4
  //# sourceMappingURL=runtime.js.map
package/dist/index.cjs CHANGED
@@ -1,11 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkKPKQ647P_cjs = require('./chunk-KPKQ647P.cjs');
4
- var chunkXJS3NKHW_cjs = require('./chunk-XJS3NKHW.cjs');
5
- var chunk4U266P4H_cjs = require('./chunk-4U266P4H.cjs');
3
+ var chunkIMILAC3V_cjs = require('./chunk-IMILAC3V.cjs');
4
+ var chunkTLK7HDJD_cjs = require('./chunk-TLK7HDJD.cjs');
5
+ var chunk4UX3TSYX_cjs = require('./chunk-4UX3TSYX.cjs');
6
6
  var chunkSOFUWEZ6_cjs = require('./chunk-SOFUWEZ6.cjs');
7
7
  var chunkZNJBRLKN_cjs = require('./chunk-ZNJBRLKN.cjs');
8
8
  require('./chunk-6F5JHLZ7.cjs');
9
+ require('./chunk-JEQ2X3Z6.cjs');
9
10
  var path = require('path');
10
11
  var child_process = require('child_process');
11
12
  var fs = require('fs');
@@ -25,7 +26,7 @@ var MCPClientAdapter = class {
25
26
  constructor(client) {
26
27
  this.client = client;
27
28
  }
28
- kind = chunk4U266P4H_cjs.MCP_KIND;
29
+ kind = chunk4UX3TSYX_cjs.MCP_KIND;
29
30
  async invoke(spec, args, _ctx) {
30
31
  const params = args != null && typeof args === "object" && !Array.isArray(args) ? args : {};
31
32
  const result = await this.client.callTool({ name: spec.name, arguments: params });
@@ -66,7 +67,7 @@ function mcpToolsToSpecs(tools) {
66
67
  return tools.map((t) => ({
67
68
  name: t.name,
68
69
  version: "1.0.0",
69
- kind: chunk4U266P4H_cjs.MCP_KIND,
70
+ kind: chunk4UX3TSYX_cjs.MCP_KIND,
70
71
  description: t.description ?? `MCP tool: ${t.name}`,
71
72
  inputSchema: t.inputSchema ?? chunkSOFUWEZ6_cjs.DEFAULT_INPUT_SCHEMA,
72
73
  outputSchema: chunkSOFUWEZ6_cjs.DEFAULT_OUTPUT_SCHEMA,
@@ -106,8 +107,8 @@ async function registerMCPToolsFromConfig(runtime, registry, options = {}) {
106
107
  const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? path.join(process.cwd(), "mcp.json");
107
108
  const dirPath = path.dirname(configPath);
108
109
  const entryPoint = path.basename(configPath);
109
- const toolName = options.toolName ?? chunk4U266P4H_cjs.MCP_KIND;
110
- const loaded = await chunkXJS3NKHW_cjs.loadMCPTool(dirPath, { kind: chunk4U266P4H_cjs.MCP_KIND, name: toolName, entryPoint });
110
+ const toolName = options.toolName ?? chunk4UX3TSYX_cjs.MCP_KIND;
111
+ const loaded = await chunkTLK7HDJD_cjs.loadMCPTool(dirPath, { kind: chunk4UX3TSYX_cjs.MCP_KIND, name: toolName, entryPoint });
111
112
  if (!loaded.mcpConfig) {
112
113
  throw new Error("mcp.json must have command or url");
113
114
  }
@@ -210,151 +211,151 @@ async function importFromCache(packageRoot) {
210
211
 
211
212
  Object.defineProperty(exports, "LangChainToolsHub", {
212
213
  enumerable: true,
213
- get: function () { return chunkKPKQ647P_cjs.LangChainToolsHub; }
214
+ get: function () { return chunkIMILAC3V_cjs.LangChainToolsHub; }
214
215
  });
215
216
  Object.defineProperty(exports, "createAgentTools", {
216
217
  enumerable: true,
217
- get: function () { return chunkKPKQ647P_cjs.createAgentTools; }
218
+ get: function () { return chunkIMILAC3V_cjs.createAgentTools; }
218
219
  });
219
220
  Object.defineProperty(exports, "DirectoryScanner", {
220
221
  enumerable: true,
221
- get: function () { return chunkXJS3NKHW_cjs.DirectoryScanner; }
222
+ get: function () { return chunkTLK7HDJD_cjs.DirectoryScanner; }
222
223
  });
223
224
  Object.defineProperty(exports, "DiscoveryError", {
224
225
  enumerable: true,
225
- get: function () { return chunkXJS3NKHW_cjs.DiscoveryError; }
226
+ get: function () { return chunkTLK7HDJD_cjs.DiscoveryError; }
226
227
  });
227
228
  Object.defineProperty(exports, "SkillManifestError", {
228
229
  enumerable: true,
229
- get: function () { return chunkXJS3NKHW_cjs.SkillManifestError; }
230
+ get: function () { return chunkTLK7HDJD_cjs.SkillManifestError; }
230
231
  });
231
232
  Object.defineProperty(exports, "buildFunctionToTool", {
232
233
  enumerable: true,
233
- get: function () { return chunkXJS3NKHW_cjs.buildFunctionToTool; }
234
+ get: function () { return chunkTLK7HDJD_cjs.buildFunctionToTool; }
234
235
  });
235
236
  Object.defineProperty(exports, "buildMcpPackage", {
236
237
  enumerable: true,
237
- get: function () { return chunkXJS3NKHW_cjs.buildMcpPackage; }
238
+ get: function () { return chunkTLK7HDJD_cjs.buildMcpPackage; }
238
239
  });
239
240
  Object.defineProperty(exports, "initProject", {
240
241
  enumerable: true,
241
- get: function () { return chunkXJS3NKHW_cjs.initProject; }
242
+ get: function () { return chunkTLK7HDJD_cjs.initProject; }
242
243
  });
243
244
  Object.defineProperty(exports, "loadMCPTool", {
244
245
  enumerable: true,
245
- get: function () { return chunkXJS3NKHW_cjs.loadMCPTool; }
246
+ get: function () { return chunkTLK7HDJD_cjs.loadMCPTool; }
246
247
  });
247
248
  Object.defineProperty(exports, "loadSkillDefinition", {
248
249
  enumerable: true,
249
- get: function () { return chunkXJS3NKHW_cjs.loadSkillDefinition; }
250
+ get: function () { return chunkTLK7HDJD_cjs.loadSkillDefinition; }
250
251
  });
251
252
  Object.defineProperty(exports, "parseSkillMd", {
252
253
  enumerable: true,
253
- get: function () { return chunkXJS3NKHW_cjs.parseSkillMd; }
254
+ get: function () { return chunkTLK7HDJD_cjs.parseSkillMd; }
254
255
  });
255
256
  Object.defineProperty(exports, "runGeneratedMCP", {
256
257
  enumerable: true,
257
- get: function () { return chunkXJS3NKHW_cjs.runGeneratedMCP; }
258
+ get: function () { return chunkTLK7HDJD_cjs.runGeneratedMCP; }
258
259
  });
259
260
  Object.defineProperty(exports, "runMcpServer", {
260
261
  enumerable: true,
261
- get: function () { return chunkXJS3NKHW_cjs.runMcpServer; }
262
+ get: function () { return chunkTLK7HDJD_cjs.runMcpServer; }
262
263
  });
263
264
  Object.defineProperty(exports, "scan", {
264
265
  enumerable: true,
265
- get: function () { return chunkXJS3NKHW_cjs.scan; }
266
+ get: function () { return chunkTLK7HDJD_cjs.scan; }
266
267
  });
267
268
  Object.defineProperty(exports, "scanForTools", {
268
269
  enumerable: true,
269
- get: function () { return chunkXJS3NKHW_cjs.scanForTools; }
270
+ get: function () { return chunkTLK7HDJD_cjs.scanForTools; }
270
271
  });
271
272
  Object.defineProperty(exports, "scanSkillResources", {
272
273
  enumerable: true,
273
- get: function () { return chunkXJS3NKHW_cjs.scanSkillResources; }
274
+ get: function () { return chunkTLK7HDJD_cjs.scanSkillResources; }
274
275
  });
275
276
  Object.defineProperty(exports, "validateFrontmatter", {
276
277
  enumerable: true,
277
- get: function () { return chunkXJS3NKHW_cjs.validateFrontmatter; }
278
+ get: function () { return chunkTLK7HDJD_cjs.validateFrontmatter; }
278
279
  });
279
280
  Object.defineProperty(exports, "BudgetManager", {
280
281
  enumerable: true,
281
- get: function () { return chunk4U266P4H_cjs.BudgetManager; }
282
+ get: function () { return chunk4UX3TSYX_cjs.BudgetManager; }
282
283
  });
283
284
  Object.defineProperty(exports, "EventLog", {
284
285
  enumerable: true,
285
- get: function () { return chunk4U266P4H_cjs.EventLog; }
286
+ get: function () { return chunk4UX3TSYX_cjs.EventLog; }
286
287
  });
287
288
  Object.defineProperty(exports, "Metrics", {
288
289
  enumerable: true,
289
- get: function () { return chunk4U266P4H_cjs.Metrics; }
290
+ get: function () { return chunk4UX3TSYX_cjs.Metrics; }
290
291
  });
291
292
  Object.defineProperty(exports, "PTCRuntime", {
292
293
  enumerable: true,
293
- get: function () { return chunk4U266P4H_cjs.PTCRuntime; }
294
+ get: function () { return chunk4UX3TSYX_cjs.PTCRuntime; }
294
295
  });
295
296
  Object.defineProperty(exports, "PolicyDeniedError", {
296
297
  enumerable: true,
297
- get: function () { return chunk4U266P4H_cjs.PolicyDeniedError; }
298
+ get: function () { return chunk4UX3TSYX_cjs.PolicyDeniedError; }
298
299
  });
299
300
  Object.defineProperty(exports, "PolicyEngine", {
300
301
  enumerable: true,
301
- get: function () { return chunk4U266P4H_cjs.PolicyEngine; }
302
+ get: function () { return chunk4UX3TSYX_cjs.PolicyEngine; }
302
303
  });
303
304
  Object.defineProperty(exports, "SchemaValidationError", {
304
305
  enumerable: true,
305
- get: function () { return chunk4U266P4H_cjs.SchemaValidationError; }
306
+ get: function () { return chunk4UX3TSYX_cjs.SchemaValidationError; }
306
307
  });
307
308
  Object.defineProperty(exports, "SchemaValidator", {
308
309
  enumerable: true,
309
- get: function () { return chunk4U266P4H_cjs.SchemaValidator; }
310
+ get: function () { return chunk4UX3TSYX_cjs.SchemaValidator; }
310
311
  });
311
312
  Object.defineProperty(exports, "Tracing", {
312
313
  enumerable: true,
313
- get: function () { return chunk4U266P4H_cjs.Tracing; }
314
+ get: function () { return chunk4UX3TSYX_cjs.Tracing; }
314
315
  });
315
316
  Object.defineProperty(exports, "buildEvidence", {
316
317
  enumerable: true,
317
- get: function () { return chunk4U266P4H_cjs.buildEvidence; }
318
+ get: function () { return chunk4UX3TSYX_cjs.buildEvidence; }
318
319
  });
319
320
  Object.defineProperty(exports, "createLogger", {
320
321
  enumerable: true,
321
- get: function () { return chunk4U266P4H_cjs.createLogger; }
322
+ get: function () { return chunk4UX3TSYX_cjs.createLogger; }
322
323
  });
323
324
  Object.defineProperty(exports, "expandToolDescriptorsToRegistryNames", {
324
325
  enumerable: true,
325
- get: function () { return chunk4U266P4H_cjs.expandToolDescriptorsToRegistryNames; }
326
+ get: function () { return chunk4UX3TSYX_cjs.expandToolDescriptorsToRegistryNames; }
326
327
  });
327
328
  Object.defineProperty(exports, "isNpmToolDescriptor", {
328
329
  enumerable: true,
329
- get: function () { return chunk4U266P4H_cjs.isNpmToolDescriptor; }
330
+ get: function () { return chunk4UX3TSYX_cjs.isNpmToolDescriptor; }
330
331
  });
331
332
  Object.defineProperty(exports, "loadToolConfig", {
332
333
  enumerable: true,
333
- get: function () { return chunk4U266P4H_cjs.loadToolConfig; }
334
+ get: function () { return chunk4UX3TSYX_cjs.loadToolConfig; }
334
335
  });
335
336
  Object.defineProperty(exports, "normalizeToolList", {
336
337
  enumerable: true,
337
- get: function () { return chunk4U266P4H_cjs.normalizeToolList; }
338
+ get: function () { return chunk4UX3TSYX_cjs.normalizeToolList; }
338
339
  });
339
340
  Object.defineProperty(exports, "parseNpmToolDescriptor", {
340
341
  enumerable: true,
341
- get: function () { return chunk4U266P4H_cjs.parseNpmToolDescriptor; }
342
+ get: function () { return chunk4UX3TSYX_cjs.parseNpmToolDescriptor; }
342
343
  });
343
344
  Object.defineProperty(exports, "resolveNpmToolDescriptor", {
344
345
  enumerable: true,
345
- get: function () { return chunk4U266P4H_cjs.resolveNpmToolDescriptor; }
346
+ get: function () { return chunk4UX3TSYX_cjs.resolveNpmToolDescriptor; }
346
347
  });
347
348
  Object.defineProperty(exports, "resolveToolDescriptor", {
348
349
  enumerable: true,
349
- get: function () { return chunk4U266P4H_cjs.resolveToolDescriptor; }
350
+ get: function () { return chunk4UX3TSYX_cjs.resolveToolDescriptor; }
350
351
  });
351
352
  Object.defineProperty(exports, "sanitizeForLog", {
352
353
  enumerable: true,
353
- get: function () { return chunk4U266P4H_cjs.sanitizeForLog; }
354
+ get: function () { return chunk4UX3TSYX_cjs.sanitizeForLog; }
354
355
  });
355
356
  Object.defineProperty(exports, "summarizeForLog", {
356
357
  enumerable: true,
357
- get: function () { return chunk4U266P4H_cjs.summarizeForLog; }
358
+ get: function () { return chunk4UX3TSYX_cjs.summarizeForLog; }
358
359
  });
359
360
  Object.defineProperty(exports, "DEFAULT_INPUT_SCHEMA", {
360
361
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts","../src/utils/npmCache.ts"],"names":["MCP_KIND","DEFAULT_INPUT_SCHEMA","DEFAULT_OUTPUT_SCHEMA","join","dirname","basename","loadMCPTool","homedir","mkdirSync","execSync","readdirSync","existsSync","rmSync","renameSync","readFileSync","pathToFileURL"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAS,uBAAuB,MAAA,EAAgC;AAC9D,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAClB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,QAAQ,IAAI,CAAA,CACjD,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpB,IAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,OAAO,UAAA,KAAe,MAAA,SAAkB,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9B;AAMO,IAAM,mBAAN,MAA8C;AAAA,EAGnD,YAA6B,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA,EAF5C,IAAA,GAAOA,0BAAA;AAAA,EAIhB,MAAM,MAAA,CACJ,IAAA,EACA,IAAA,EACA,IAAA,EAC6C;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GACzE,IAAA,GACD,EAAC;AACL,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,CAAA;AAChF,IAAA,MAAM,IAAA,GAAO,uBAAuB,MAAM,CAAA;AAC1C,IAAA,IAAI,WAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,GAAA,EAAK,MAAA,EAAO;AAAA,EAC5C;AACF;;;ACfA,eAAsB,WAAW,cAAA,EAA8D;AAC7F,EAAA,IAAI,cAAA,CAAe,IAAA,KAAS,OAAA,IAAW,CAAC,eAAe,OAAA,EAAS;AAC9D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qEAAA,EAAwE,eAAe,IAAI,CAAA;AAAA,KAC7F;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAO,kCAAkC,CAAA;AAClE,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OACrC,2CACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,cAAA,CAAe,OAAA;AAAA,IACxB,IAAA,EAAM,cAAA,CAAe,IAAA,IAAQ,EAAC;AAAA,IAC9B,KAAK,cAAA,CAAe,GAAA;AAAA,IACpB,KAAK,cAAA,CAAe;AAAA,GACtB;AACA,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,CAAqB,YAAY,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAClE,EAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAMA,0BAAA;AAAA,IACN,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,CAAA;AAAA,IACjD,WAAA,EAAa,EAAE,WAAA,IAAeC,sCAAA;AAAA,IAC9B,YAAA,EAAcC,uCAAA;AAAA,IACd,cAAc;AAAC,GACjB,CAAE,CAAA;AACJ;;;AC3DO,IAAM,oBAAN,MAAwB;AAAA,EACZ,WAAA,uBAAkB,GAAA,EAA+B;AAAA,EAElE,iBAAA,CAAkB,UAAkB,MAAA,EAA4C;AAC9E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,IAAA,GAA0B,OAAO,GAAA,GACnC,EAAE,MAAM,KAAA,EAAO,GAAA,EAAK,MAAA,CAAO,GAAA,EAAI,GAC/B;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,KAAK,MAAA,CAAO;AAAA,KACd;AACJ,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAA,EAA2B;AAChC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,YAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF;;;ACvBA,eAAsB,0BAAA,CACpB,OAAA,EACA,QAAA,EACA,OAAA,GAAmC,EAAC,EACH;AACjC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,GAAA,CAAI,mBAAmBC,SAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,CAAA;AACtG,EAAA,MAAM,OAAA,GAAUC,aAAQ,UAAU,CAAA;AAClC,EAAA,MAAM,UAAA,GAAaC,cAAS,UAAU,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAYL,0BAAA;AAErC,EAAA,MAAM,MAAA,GAAS,MAAMM,6BAAA,CAAY,OAAA,EAAS,EAAE,MAAMN,0BAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,CAAA;AACxF,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,EAAkB;AACtC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,iBAAA,CAAkB,QAAA,EAAU,OAAO,SAAS,CAAA;AAE3E,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,MAAM,WAAW,cAAc,CAAA;AAC7D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,SAAA,EAAU;AACzC,EAAA,MAAM,KAAA,GAAQ,gBAAgB,KAAK,CAAA;AACnC,EAAA,QAAA,CAAS,aAAa,KAAK,CAAA;AAC3B,EAAA,OAAA,CAAQ,eAAA,CAAgB,IAAI,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAEpD,EAAA,OAAO,EAAE,SAAA,EAAU;AACrB;ACjCA,IAAM,kBAAA,GAAqBG,SAAAA,CAAKI,UAAA,EAAQ,EAAG,UAAU,OAAO,CAAA;AAK5D,SAAS,oBAAoB,IAAA,EAAwB;AACnD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC1C,EAAA,OAAO,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC/C;AAKA,SAAS,eAAA,CAAgB,SAAA,EAAmB,WAAA,EAAqB,OAAA,EAAyB;AACxF,EAAA,MAAM,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAChD,EAAA,OAAOJ,SAAAA,CAAK,SAAA,EAAW,GAAG,QAAA,EAAU,OAAO,CAAA;AAC7C;AAMA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,qCAAqC,CAAA;AAC9D,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAK,IAAA;AAC7B;AAOO,SAAS,qBACd,WAAA,EACA,OAAA,GAAkB,QAAA,EAClB,OAAA,GAAuC,EAAC,EAChC;AACR,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,kBAAA;AACvC,EAAA,MAAM,QAAA,GAAWA,SAAAA,CAAK,SAAA,EAAW,WAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAC/F,EAAAK,YAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAEvC,EAAA,IAAI;AACF,IAAAC,sBAAA,CAAS,YAAY,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAA,CAAA,EAAK;AAAA,MAC9E,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,MACjB,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAM,KAAA,GAAQC,eAAY,QAAQ,CAAA;AAClC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAChD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,eAAA,GAAkB,sBAAsB,GAAG,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,SAAA,EAAW,WAAA,EAAa,eAAe,CAAA;AACxE,IAAA,MAAM,eAAA,GAAkBP,SAAAA,CAAK,QAAA,EAAU,cAAc,CAAA;AACrD,IAAA,MAAM,eAAA,GAAkBA,SAAAA,CAAK,QAAA,EAAU,cAAc,CAAA;AAErD,IAAA,IAAIQ,aAAA,CAAW,eAAe,CAAA,IAAKA,aAAA,CAAW,eAAe,CAAA,EAAG;AAC9D,MAAA,OAAA,CAAQ,YAAA,GAAe,UAAU,WAAW,CAAA;AAC5C,MAAAC,SAAA,CAAO,UAAU,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACjD,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAaT,SAAAA,CAAK,QAAA,EAAU,SAAS,CAAA;AAC3C,IAAAK,YAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACzC,IAAAC,sBAAA,CAAS,aAAaN,SAAAA,CAAK,QAAA,EAAU,GAAG,CAAC,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,CAAA,EAAK;AAAA,MAC/D,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAM,gBAAA,GAAmBA,SAAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AACnD,IAAA,IAAI,CAACQ,aAAA,CAAW,gBAAgB,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAsD,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAAH,YAAA,CAAUL,UAAK,QAAA,EAAU,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,IAAA,IAAIQ,aAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,MAAAC,SAAA,CAAO,UAAU,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACnD;AACA,IAAAC,aAAA,CAAW,kBAAkB,QAAQ,CAAA;AAErC,IAAAJ,sBAAA,CAAS,aAAA,EAAe;AAAA,MACtB,GAAA,EAAK,QAAA;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAA,CAAQ,YAAA,GAAe,UAAU,WAAW,CAAA;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,IAAIE,aAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,MAAAC,SAAA,CAAO,UAAU,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACnD;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,MAAM,OAAA,GAAUT,SAAAA,CAAK,WAAA,EAAa,cAAc,CAAA;AAChD,EAAA,IAAI,CAACQ,aAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,WAAW,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMG,eAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,eAAA;AACzB,EAAA,MAAM,KAAA,GAAQX,SAAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AACpC,EAAA,IAAI,CAACQ,aAAA,CAAW,KAAK,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,KAAK,CAAA,CAAE,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,gBAAgB,WAAA,EAAuC;AAC3E,EAAA,MAAM,SAAA,GAAY,oBAAoB,WAAW,CAAA;AACjD,EAAA,MAAM,OAAA,GAAUI,iBAAA,CAAc,SAAS,CAAA,CAAE,IAAA;AACzC,EAAA,OAAO;AAAA;AAAA,IAA0B;AAAA,GAAA;AACnC","file":"index.cjs","sourcesContent":["/**\n * ToolAdapter for MCP tools: holds SDK Client reference, invoke() calls client.callTool.\n * Framework-level support so scripts use registerMCPToolsFromConfig instead of inline MCP logic.\n */\n\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** SDK Client type (avoid hard typing on @modelcontextprotocol/sdk in this file for optional dep). */\nexport interface MCPClientLike {\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\nfunction textFromCallToolResult(result: CallToolResult): string {\n if (result.content?.length) {\n const parts = result.content\n .filter((c) => c.type === \"text\" && c.text != null)\n .map((c) => c.text);\n if (parts.length) return parts.join(\"\\n\");\n }\n if (result.toolResult !== undefined) return JSON.stringify(result.toolResult);\n return JSON.stringify(result);\n}\n\n/**\n * Adapter that invokes MCP tools via the SDK Client (callTool).\n * Register with runtime after connecting and listing tools; specs must have kind MCP_KIND.\n */\nexport class MCPClientAdapter implements ToolAdapter {\n readonly kind = MCP_KIND;\n\n constructor(private readonly client: MCPClientLike) {}\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext\n ): Promise<{ result: unknown; raw?: unknown }> {\n const params = args != null && typeof args === \"object\" && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : {};\n const result = await this.client.callTool({ name: spec.name, arguments: params });\n const text = textFromCallToolResult(result);\n let resultValue: unknown = text;\n try {\n resultValue = JSON.parse(text) as unknown;\n } catch {\n // keep as string\n }\n return { result: resultValue, raw: result };\n }\n}\n","/**\n * Connect to an MCP server via stdio using MCPConnectionInfo.\n * Framework-level: uses @modelcontextprotocol/sdk Client + StdioClientTransport.\n */\n\nimport type { MCPConnectionInfo } from \"./MCPProcessManager.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport { MCP_KIND } from \"./types.js\";\n\nexport interface MCPConnectResult {\n /** SDK Client; use listTools() and callTool(). */\n client: MCPClientLike;\n /** Transport; call close() when done. */\n transport: MCPTransportLike;\n}\n\nexport interface MCPClientLike {\n connect(transport: MCPTransportLike): Promise<void>;\n listTools(params?: unknown): Promise<{ tools: MCPToolDef[] }>;\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface MCPTransportLike {\n close(): Promise<void>;\n}\n\nexport interface MCPToolDef {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\n/**\n * Connect to MCP server via stdio. Only stdio is supported; url/SSE not implemented here.\n * Requires @modelcontextprotocol/sdk. Returns client and transport; caller must call transport.close() when done.\n */\nexport async function connectMCP(connectionInfo: MCPConnectionInfo): Promise<MCPConnectResult> {\n if (connectionInfo.type !== \"stdio\" || !connectionInfo.command) {\n throw new Error(\n `MCP stdio requires connectionInfo.type \"stdio\" and command; got type=${connectionInfo.type}`\n );\n }\n\n const { Client } = await import(\"@modelcontextprotocol/sdk/client\");\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n\n const serverParams = {\n command: connectionInfo.command,\n args: connectionInfo.args ?? [],\n env: connectionInfo.env,\n cwd: connectionInfo.cwd,\n };\n const transport = new StdioClientTransport(serverParams);\n const client = new Client({ name: \"agent-tool\", version: \"1.0.0\" });\n await client.connect(transport);\n return {\n client: client as unknown as MCPClientLike,\n transport: transport as unknown as MCPTransportLike,\n };\n}\n\n/**\n * Convert MCP listTools() result to ToolSpec[] (kind MCP_KIND) for registry.\n */\nexport function mcpToolsToSpecs(tools: MCPToolDef[]): ToolSpec[] {\n return tools.map((t) => ({\n name: t.name,\n version: \"1.0.0\",\n kind: MCP_KIND,\n description: t.description ?? `MCP tool: ${t.name}`,\n inputSchema: t.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: DEFAULT_OUTPUT_SCHEMA,\n capabilities: [],\n }));\n}\n","import type { MCPServerConfig } from \"../discoveryFactory.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n /** Working directory when spawning (when type=\"stdio\") */\n cwd?: string;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n this.connections.set(toolName, info);\n return info;\n }\n\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n dispose(): void {\n this.connections.clear();\n }\n}\n","/**\n * High-level API: load mcp.json, connect to MCP server, register tools with runtime.\n * Framework-level so scripts call registerMCPToolsFromConfig() instead of inline MCP logic.\n */\n\nimport { basename, dirname, join } from \"node:path\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { MCP_KIND } from \"./types.js\";\nimport { loadMCPTool } from \"./MCPLoader.js\";\nimport { MCPProcessManager } from \"./MCPProcessManager.js\";\nimport { connectMCP, mcpToolsToSpecs } from \"./connectMCP.js\";\nimport { MCPClientAdapter } from \"./MCPClientAdapter.js\";\n\nexport interface RegisterMCPToolsOptions {\n /** Path to mcp.json (or dir containing it). Default: process.env.MCP_CONFIG_PATH or \"mcp.json\" in cwd. */\n configPath?: string;\n /** Tool name for getConnectionInfo (default \"mcp\"). */\n toolName?: string;\n}\n\nexport interface RegisterMCPToolsResult {\n /** Transport; caller must call transport.close() when done. */\n transport: { close(): Promise<void> };\n}\n\n/**\n * Load mcp config (from configPath or MCP_CONFIG_PATH), connect via stdio, list tools,\n * register ToolSpec[] with registry and MCPClientAdapter with runtime. Returns transport for cleanup.\n */\nexport async function registerMCPToolsFromConfig(\n runtime: PTCRuntime,\n registry: ToolRegistry,\n options: RegisterMCPToolsOptions = {}\n): Promise<RegisterMCPToolsResult> {\n const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? join(process.cwd(), \"mcp.json\");\n const dirPath = dirname(configPath);\n const entryPoint = basename(configPath);\n const toolName = options.toolName ?? MCP_KIND;\n\n const loaded = await loadMCPTool(dirPath, { kind: MCP_KIND, name: toolName, entryPoint });\n if (!loaded.mcpConfig) {\n throw new Error(\"mcp.json must have command or url\");\n }\n const manager = new MCPProcessManager();\n const connectionInfo = manager.getConnectionInfo(toolName, loaded.mcpConfig);\n\n const { client, transport } = await connectMCP(connectionInfo);\n const { tools } = await client.listTools();\n const specs = mcpToolsToSpecs(tools);\n registry.bulkRegister(specs);\n runtime.registerAdapter(new MCPClientAdapter(client));\n\n return { transport };\n}\n","/**\n * Framework: resolve an npm package into a local cache folder (like Maven .m2).\n * Cache root: ~/.agent/cache/, organized by package path and version.\n * Packs the package, extracts it, runs npm install in that directory so each\n * downloaded package has its own node_modules—no sharing with the host project—\n * to avoid package conflicts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\n\nexport interface EnsurePackageInCacheOptions {\n /** Custom cache root (default: ~/.agent/cache) */\n cacheBase?: string;\n /** Called after npm install; use to add symlinks/aliases in cacheDir/node_modules */\n afterInstall?: (cacheDir: string, packageName: string) => void;\n}\n\nconst DEFAULT_CACHE_BASE = join(homedir(), \".agent\", \"cache\");\n\n/**\n * Package path for cache dir: @scope/name -> scope/name (path segments).\n */\nfunction packagePathSegments(name: string): string[] {\n const withoutScope = name.replace(/^@/, \"\");\n return withoutScope.split(\"/\").filter(Boolean);\n}\n\n/**\n * Resolve cache dir: cacheBase/scope/packageName/version (e.g. ~/.agent/cache/easynet/agent-tool-buildin/0.0.1).\n */\nfunction resolveCacheDir(cacheBase: string, packageName: string, version: string): string {\n const segments = packagePathSegments(packageName);\n return join(cacheBase, ...segments, version);\n}\n\n/**\n * Extract version from packed tarball name (e.g. easynet-agent-tool-buildin-0.0.1.tgz -> 0.0.1)\n * or read from extracted package/package.json.\n */\nfunction getVersionFromTarball(tgzName: string): string {\n const base = tgzName.replace(/\\.tgz$/i, \"\");\n const match = base.match(/-(\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?)$/);\n return match ? match[1]! : base;\n}\n\n/**\n * Ensure the npm package is in the cache: pack, extract, npm install.\n * Returns the package root path (with its own node_modules).\n * Cache layout: ~/.agent/cache/<scope>/<name>/<version>/ (like Maven .m2).\n */\nexport function ensurePackageInCache(\n packageName: string,\n version: string = \"latest\",\n options: EnsurePackageInCacheOptions = {},\n): string {\n const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;\n const packDest = join(cacheBase, \".pack-tmp\", packageName.replace(/@/g, \"\").replace(/\\//g, \"_\"));\n mkdirSync(packDest, { recursive: true });\n\n try {\n execSync(`npm pack ${packageName}@${version} --pack-destination \"${packDest}\"`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const files = readdirSync(packDest);\n const tgz = files.find((f) => f.endsWith(\".tgz\"));\n if (!tgz) {\n throw new Error(`npm pack did not produce a .tgz in ${packDest}`);\n }\n\n const resolvedVersion = getVersionFromTarball(tgz);\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n options.afterInstall?.(cacheDir, packageName);\n rmSync(packDest, { recursive: true, force: true });\n return cacheDir;\n }\n\n const extractDir = join(packDest, \"extract\");\n mkdirSync(extractDir, { recursive: true });\n execSync(`tar -xzf \"${join(packDest, tgz)}\" -C \"${extractDir}\"`, {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const extractedPackage = join(extractDir, \"package\");\n if (!existsSync(extractedPackage)) {\n throw new Error(`Extracted tarball did not contain \"package\" dir in ${extractDir}`);\n }\n\n mkdirSync(join(cacheDir, \"..\"), { recursive: true });\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n renameSync(extractedPackage, cacheDir);\n\n execSync(\"npm install\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n } finally {\n if (existsSync(packDest)) {\n rmSync(packDest, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Resolve the package entry point (main or dist/index.js).\n */\nexport function getPackageEntryPath(packageRoot: string): string {\n const pkgPath = join(packageRoot, \"package.json\");\n if (!existsSync(pkgPath)) {\n throw new Error(`No package.json in ${packageRoot}`);\n }\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { main?: string; exports?: unknown };\n const main = pkg.main ?? \"dist/index.js\";\n const entry = join(packageRoot, main);\n if (!existsSync(entry)) {\n throw new Error(`Entry not found: ${entry}`);\n }\n return entry;\n}\n\n/**\n * Dynamic import from a cached package (file URL so Node resolves the package's node_modules).\n */\nexport async function importFromCache(packageRoot: string): Promise<unknown> {\n const entryPath = getPackageEntryPath(packageRoot);\n const fileUrl = pathToFileURL(entryPath).href;\n return import(/* @vite-ignore */ fileUrl);\n}\n"]}
1
+ {"version":3,"sources":["../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts","../src/utils/npmCache.ts"],"names":["MCP_KIND","DEFAULT_INPUT_SCHEMA","DEFAULT_OUTPUT_SCHEMA","join","dirname","basename","loadMCPTool","homedir","mkdirSync","execSync","readdirSync","existsSync","rmSync","renameSync","readFileSync","pathToFileURL"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ToolAdapter for MCP tools: holds SDK Client reference, invoke() calls client.callTool.\n * Framework-level support so scripts use registerMCPToolsFromConfig instead of inline MCP logic.\n */\n\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** SDK Client type (avoid hard typing on @modelcontextprotocol/sdk in this file for optional dep). */\nexport interface MCPClientLike {\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\nfunction textFromCallToolResult(result: CallToolResult): string {\n if (result.content?.length) {\n const parts = result.content\n .filter((c) => c.type === \"text\" && c.text != null)\n .map((c) => c.text);\n if (parts.length) return parts.join(\"\\n\");\n }\n if (result.toolResult !== undefined) return JSON.stringify(result.toolResult);\n return JSON.stringify(result);\n}\n\n/**\n * Adapter that invokes MCP tools via the SDK Client (callTool).\n * Register with runtime after connecting and listing tools; specs must have kind MCP_KIND.\n */\nexport class MCPClientAdapter implements ToolAdapter {\n readonly kind = MCP_KIND;\n\n constructor(private readonly client: MCPClientLike) {}\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext\n ): Promise<{ result: unknown; raw?: unknown }> {\n const params = args != null && typeof args === \"object\" && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : {};\n const result = await this.client.callTool({ name: spec.name, arguments: params });\n const text = textFromCallToolResult(result);\n let resultValue: unknown = text;\n try {\n resultValue = JSON.parse(text) as unknown;\n } catch {\n // keep as string\n }\n return { result: resultValue, raw: result };\n }\n}\n","/**\n * Connect to an MCP server via stdio using MCPConnectionInfo.\n * Framework-level: uses @modelcontextprotocol/sdk Client + StdioClientTransport.\n */\n\nimport type { MCPConnectionInfo } from \"./MCPProcessManager.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport { MCP_KIND } from \"./types.js\";\n\nexport interface MCPConnectResult {\n /** SDK Client; use listTools() and callTool(). */\n client: MCPClientLike;\n /** Transport; call close() when done. */\n transport: MCPTransportLike;\n}\n\nexport interface MCPClientLike {\n connect(transport: MCPTransportLike): Promise<void>;\n listTools(params?: unknown): Promise<{ tools: MCPToolDef[] }>;\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface MCPTransportLike {\n close(): Promise<void>;\n}\n\nexport interface MCPToolDef {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\n/**\n * Connect to MCP server via stdio. Only stdio is supported; url/SSE not implemented here.\n * Requires @modelcontextprotocol/sdk. Returns client and transport; caller must call transport.close() when done.\n */\nexport async function connectMCP(connectionInfo: MCPConnectionInfo): Promise<MCPConnectResult> {\n if (connectionInfo.type !== \"stdio\" || !connectionInfo.command) {\n throw new Error(\n `MCP stdio requires connectionInfo.type \"stdio\" and command; got type=${connectionInfo.type}`\n );\n }\n\n const { Client } = await import(\"@modelcontextprotocol/sdk/client\");\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n\n const serverParams = {\n command: connectionInfo.command,\n args: connectionInfo.args ?? [],\n env: connectionInfo.env,\n cwd: connectionInfo.cwd,\n };\n const transport = new StdioClientTransport(serverParams);\n const client = new Client({ name: \"agent-tool\", version: \"1.0.0\" });\n await client.connect(transport);\n return {\n client: client as unknown as MCPClientLike,\n transport: transport as unknown as MCPTransportLike,\n };\n}\n\n/**\n * Convert MCP listTools() result to ToolSpec[] (kind MCP_KIND) for registry.\n */\nexport function mcpToolsToSpecs(tools: MCPToolDef[]): ToolSpec[] {\n return tools.map((t) => ({\n name: t.name,\n version: \"1.0.0\",\n kind: MCP_KIND,\n description: t.description ?? `MCP tool: ${t.name}`,\n inputSchema: t.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: DEFAULT_OUTPUT_SCHEMA,\n capabilities: [],\n }));\n}\n","import type { MCPServerConfig } from \"../discoveryFactory.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n /** Working directory when spawning (when type=\"stdio\") */\n cwd?: string;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n this.connections.set(toolName, info);\n return info;\n }\n\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n dispose(): void {\n this.connections.clear();\n }\n}\n","/**\n * High-level API: load mcp.json, connect to MCP server, register tools with runtime.\n * Framework-level so scripts call registerMCPToolsFromConfig() instead of inline MCP logic.\n */\n\nimport { basename, dirname, join } from \"node:path\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { MCP_KIND } from \"./types.js\";\nimport { loadMCPTool } from \"./MCPLoader.js\";\nimport { MCPProcessManager } from \"./MCPProcessManager.js\";\nimport { connectMCP, mcpToolsToSpecs } from \"./connectMCP.js\";\nimport { MCPClientAdapter } from \"./MCPClientAdapter.js\";\n\nexport interface RegisterMCPToolsOptions {\n /** Path to mcp.json (or dir containing it). Default: process.env.MCP_CONFIG_PATH or \"mcp.json\" in cwd. */\n configPath?: string;\n /** Tool name for getConnectionInfo (default \"mcp\"). */\n toolName?: string;\n}\n\nexport interface RegisterMCPToolsResult {\n /** Transport; caller must call transport.close() when done. */\n transport: { close(): Promise<void> };\n}\n\n/**\n * Load mcp config (from configPath or MCP_CONFIG_PATH), connect via stdio, list tools,\n * register ToolSpec[] with registry and MCPClientAdapter with runtime. Returns transport for cleanup.\n */\nexport async function registerMCPToolsFromConfig(\n runtime: PTCRuntime,\n registry: ToolRegistry,\n options: RegisterMCPToolsOptions = {}\n): Promise<RegisterMCPToolsResult> {\n const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? join(process.cwd(), \"mcp.json\");\n const dirPath = dirname(configPath);\n const entryPoint = basename(configPath);\n const toolName = options.toolName ?? MCP_KIND;\n\n const loaded = await loadMCPTool(dirPath, { kind: MCP_KIND, name: toolName, entryPoint });\n if (!loaded.mcpConfig) {\n throw new Error(\"mcp.json must have command or url\");\n }\n const manager = new MCPProcessManager();\n const connectionInfo = manager.getConnectionInfo(toolName, loaded.mcpConfig);\n\n const { client, transport } = await connectMCP(connectionInfo);\n const { tools } = await client.listTools();\n const specs = mcpToolsToSpecs(tools);\n registry.bulkRegister(specs);\n runtime.registerAdapter(new MCPClientAdapter(client));\n\n return { transport };\n}\n","/**\n * Framework: resolve an npm package into a local cache folder (like Maven .m2).\n * Cache root: ~/.agent/cache/, organized by package path and version.\n * Packs the package, extracts it, runs npm install in that directory so each\n * downloaded package has its own node_modules—no sharing with the host project—\n * to avoid package conflicts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\n\nexport interface EnsurePackageInCacheOptions {\n /** Custom cache root (default: ~/.agent/cache) */\n cacheBase?: string;\n /** Called after npm install; use to add symlinks/aliases in cacheDir/node_modules */\n afterInstall?: (cacheDir: string, packageName: string) => void;\n}\n\nconst DEFAULT_CACHE_BASE = join(homedir(), \".agent\", \"cache\");\n\n/**\n * Package path for cache dir: @scope/name -> scope/name (path segments).\n */\nfunction packagePathSegments(name: string): string[] {\n const withoutScope = name.replace(/^@/, \"\");\n return withoutScope.split(\"/\").filter(Boolean);\n}\n\n/**\n * Resolve cache dir: cacheBase/scope/packageName/version (e.g. ~/.agent/cache/easynet/agent-tool-buildin/0.0.1).\n */\nfunction resolveCacheDir(cacheBase: string, packageName: string, version: string): string {\n const segments = packagePathSegments(packageName);\n return join(cacheBase, ...segments, version);\n}\n\n/**\n * Extract version from packed tarball name (e.g. easynet-agent-tool-buildin-0.0.1.tgz -> 0.0.1)\n * or read from extracted package/package.json.\n */\nfunction getVersionFromTarball(tgzName: string): string {\n const base = tgzName.replace(/\\.tgz$/i, \"\");\n const match = base.match(/-(\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?)$/);\n return match ? match[1]! : base;\n}\n\n/**\n * Ensure the npm package is in the cache: pack, extract, npm install.\n * Returns the package root path (with its own node_modules).\n * Cache layout: ~/.agent/cache/<scope>/<name>/<version>/ (like Maven .m2).\n */\nexport function ensurePackageInCache(\n packageName: string,\n version: string = \"latest\",\n options: EnsurePackageInCacheOptions = {},\n): string {\n const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;\n const packDest = join(cacheBase, \".pack-tmp\", packageName.replace(/@/g, \"\").replace(/\\//g, \"_\"));\n mkdirSync(packDest, { recursive: true });\n\n try {\n execSync(`npm pack ${packageName}@${version} --pack-destination \"${packDest}\"`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const files = readdirSync(packDest);\n const tgz = files.find((f) => f.endsWith(\".tgz\"));\n if (!tgz) {\n throw new Error(`npm pack did not produce a .tgz in ${packDest}`);\n }\n\n const resolvedVersion = getVersionFromTarball(tgz);\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n options.afterInstall?.(cacheDir, packageName);\n rmSync(packDest, { recursive: true, force: true });\n return cacheDir;\n }\n\n const extractDir = join(packDest, \"extract\");\n mkdirSync(extractDir, { recursive: true });\n execSync(`tar -xzf \"${join(packDest, tgz)}\" -C \"${extractDir}\"`, {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const extractedPackage = join(extractDir, \"package\");\n if (!existsSync(extractedPackage)) {\n throw new Error(`Extracted tarball did not contain \"package\" dir in ${extractDir}`);\n }\n\n mkdirSync(join(cacheDir, \"..\"), { recursive: true });\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n renameSync(extractedPackage, cacheDir);\n\n execSync(\"npm install\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n } finally {\n if (existsSync(packDest)) {\n rmSync(packDest, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Resolve the package entry point (main or dist/index.js).\n */\nexport function getPackageEntryPath(packageRoot: string): string {\n const pkgPath = join(packageRoot, \"package.json\");\n if (!existsSync(pkgPath)) {\n throw new Error(`No package.json in ${packageRoot}`);\n }\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { main?: string; exports?: unknown };\n const main = pkg.main ?? \"dist/index.js\";\n const entry = join(packageRoot, main);\n if (!existsSync(entry)) {\n throw new Error(`Entry not found: ${entry}`);\n }\n return entry;\n}\n\n/**\n * Dynamic import from a cached package (file URL so Node resolves the package's node_modules).\n */\nexport async function importFromCache(packageRoot: string): Promise<unknown> {\n const entryPath = getPackageEntryPath(packageRoot);\n const fileUrl = pathToFileURL(entryPath).href;\n return import(/* @vite-ignore */ fileUrl);\n}\n"]}