@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.
- package/dist/api/main.cjs +15 -14
- package/dist/api/main.js +4 -3
- package/dist/api/runtimeFromConfig.d.ts.map +1 -1
- package/dist/{canonicalCoreSchemas-CTW6CCFY.cjs → canonicalCoreSchemas-MI6NURRD.cjs} +3 -2
- package/dist/{canonicalCoreSchemas-CTW6CCFY.cjs.map → canonicalCoreSchemas-MI6NURRD.cjs.map} +1 -1
- package/dist/canonicalCoreSchemas-MM5HFUT5.js +4 -0
- package/dist/{canonicalCoreSchemas-YLHVHYJZ.js.map → canonicalCoreSchemas-MM5HFUT5.js.map} +1 -1
- package/dist/{chunk-4U266P4H.cjs → chunk-4UX3TSYX.cjs} +24 -8
- package/dist/chunk-4UX3TSYX.cjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/{chunk-YJSGSAS6.cjs → chunk-DRAI5EGY.cjs} +8 -8
- package/dist/{chunk-YJSGSAS6.cjs.map → chunk-DRAI5EGY.cjs.map} +1 -1
- package/dist/{chunk-WOCVXQOW.js → chunk-FJZYOB7A.js} +3 -3
- package/dist/{chunk-WOCVXQOW.js.map → chunk-FJZYOB7A.js.map} +1 -1
- package/dist/{chunk-KPKQ647P.cjs → chunk-IMILAC3V.cjs} +12 -12
- package/dist/{chunk-KPKQ647P.cjs.map → chunk-IMILAC3V.cjs.map} +1 -1
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
- package/dist/{chunk-YMCAX4O6.js → chunk-SRWE4BYI.js} +26 -10
- package/dist/chunk-SRWE4BYI.js.map +1 -0
- package/dist/{chunk-7SGI5EGB.js → chunk-T5HY2LIT.js} +3 -3
- package/dist/{chunk-7SGI5EGB.js.map → chunk-T5HY2LIT.js.map} +1 -1
- package/dist/{chunk-XJS3NKHW.cjs → chunk-TLK7HDJD.cjs} +9 -9
- package/dist/{chunk-XJS3NKHW.cjs.map → chunk-TLK7HDJD.cjs.map} +1 -1
- package/dist/{chunk-U55KMDXY.js → chunk-YDW7XTCB.js} +4 -4
- package/dist/{chunk-U55KMDXY.js.map → chunk-YDW7XTCB.js.map} +1 -1
- package/dist/core/index.cjs +1 -0
- package/dist/core/index.js +1 -0
- package/dist/core/runtime.cjs +1 -0
- package/dist/core/runtime.js +1 -0
- package/dist/index.cjs +45 -44
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/cli/index.cjs +16 -15
- package/dist/utils/cli/index.cjs.map +1 -1
- package/dist/utils/cli/index.js +4 -3
- package/dist/utils/cli/index.js.map +1 -1
- package/package.json +1 -5
- package/dist/canonicalCoreSchemas-YLHVHYJZ.js +0 -3
- package/dist/chunk-4U266P4H.cjs.map +0 -1
- package/dist/chunk-YMCAX4O6.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createRuntimeFromConfig, MCP_KIND } from './chunk-
|
|
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-
|
|
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-
|
|
469
|
-
//# sourceMappingURL=chunk-
|
|
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, \""\");\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, \""\");\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"]}
|
package/dist/core/index.cjs
CHANGED
package/dist/core/index.js
CHANGED
package/dist/core/runtime.cjs
CHANGED
package/dist/core/runtime.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
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 =
|
|
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:
|
|
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 ??
|
|
110
|
-
const loaded = await
|
|
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
|
|
214
|
+
get: function () { return chunkIMILAC3V_cjs.LangChainToolsHub; }
|
|
214
215
|
});
|
|
215
216
|
Object.defineProperty(exports, "createAgentTools", {
|
|
216
217
|
enumerable: true,
|
|
217
|
-
get: function () { return
|
|
218
|
+
get: function () { return chunkIMILAC3V_cjs.createAgentTools; }
|
|
218
219
|
});
|
|
219
220
|
Object.defineProperty(exports, "DirectoryScanner", {
|
|
220
221
|
enumerable: true,
|
|
221
|
-
get: function () { return
|
|
222
|
+
get: function () { return chunkTLK7HDJD_cjs.DirectoryScanner; }
|
|
222
223
|
});
|
|
223
224
|
Object.defineProperty(exports, "DiscoveryError", {
|
|
224
225
|
enumerable: true,
|
|
225
|
-
get: function () { return
|
|
226
|
+
get: function () { return chunkTLK7HDJD_cjs.DiscoveryError; }
|
|
226
227
|
});
|
|
227
228
|
Object.defineProperty(exports, "SkillManifestError", {
|
|
228
229
|
enumerable: true,
|
|
229
|
-
get: function () { return
|
|
230
|
+
get: function () { return chunkTLK7HDJD_cjs.SkillManifestError; }
|
|
230
231
|
});
|
|
231
232
|
Object.defineProperty(exports, "buildFunctionToTool", {
|
|
232
233
|
enumerable: true,
|
|
233
|
-
get: function () { return
|
|
234
|
+
get: function () { return chunkTLK7HDJD_cjs.buildFunctionToTool; }
|
|
234
235
|
});
|
|
235
236
|
Object.defineProperty(exports, "buildMcpPackage", {
|
|
236
237
|
enumerable: true,
|
|
237
|
-
get: function () { return
|
|
238
|
+
get: function () { return chunkTLK7HDJD_cjs.buildMcpPackage; }
|
|
238
239
|
});
|
|
239
240
|
Object.defineProperty(exports, "initProject", {
|
|
240
241
|
enumerable: true,
|
|
241
|
-
get: function () { return
|
|
242
|
+
get: function () { return chunkTLK7HDJD_cjs.initProject; }
|
|
242
243
|
});
|
|
243
244
|
Object.defineProperty(exports, "loadMCPTool", {
|
|
244
245
|
enumerable: true,
|
|
245
|
-
get: function () { return
|
|
246
|
+
get: function () { return chunkTLK7HDJD_cjs.loadMCPTool; }
|
|
246
247
|
});
|
|
247
248
|
Object.defineProperty(exports, "loadSkillDefinition", {
|
|
248
249
|
enumerable: true,
|
|
249
|
-
get: function () { return
|
|
250
|
+
get: function () { return chunkTLK7HDJD_cjs.loadSkillDefinition; }
|
|
250
251
|
});
|
|
251
252
|
Object.defineProperty(exports, "parseSkillMd", {
|
|
252
253
|
enumerable: true,
|
|
253
|
-
get: function () { return
|
|
254
|
+
get: function () { return chunkTLK7HDJD_cjs.parseSkillMd; }
|
|
254
255
|
});
|
|
255
256
|
Object.defineProperty(exports, "runGeneratedMCP", {
|
|
256
257
|
enumerable: true,
|
|
257
|
-
get: function () { return
|
|
258
|
+
get: function () { return chunkTLK7HDJD_cjs.runGeneratedMCP; }
|
|
258
259
|
});
|
|
259
260
|
Object.defineProperty(exports, "runMcpServer", {
|
|
260
261
|
enumerable: true,
|
|
261
|
-
get: function () { return
|
|
262
|
+
get: function () { return chunkTLK7HDJD_cjs.runMcpServer; }
|
|
262
263
|
});
|
|
263
264
|
Object.defineProperty(exports, "scan", {
|
|
264
265
|
enumerable: true,
|
|
265
|
-
get: function () { return
|
|
266
|
+
get: function () { return chunkTLK7HDJD_cjs.scan; }
|
|
266
267
|
});
|
|
267
268
|
Object.defineProperty(exports, "scanForTools", {
|
|
268
269
|
enumerable: true,
|
|
269
|
-
get: function () { return
|
|
270
|
+
get: function () { return chunkTLK7HDJD_cjs.scanForTools; }
|
|
270
271
|
});
|
|
271
272
|
Object.defineProperty(exports, "scanSkillResources", {
|
|
272
273
|
enumerable: true,
|
|
273
|
-
get: function () { return
|
|
274
|
+
get: function () { return chunkTLK7HDJD_cjs.scanSkillResources; }
|
|
274
275
|
});
|
|
275
276
|
Object.defineProperty(exports, "validateFrontmatter", {
|
|
276
277
|
enumerable: true,
|
|
277
|
-
get: function () { return
|
|
278
|
+
get: function () { return chunkTLK7HDJD_cjs.validateFrontmatter; }
|
|
278
279
|
});
|
|
279
280
|
Object.defineProperty(exports, "BudgetManager", {
|
|
280
281
|
enumerable: true,
|
|
281
|
-
get: function () { return
|
|
282
|
+
get: function () { return chunk4UX3TSYX_cjs.BudgetManager; }
|
|
282
283
|
});
|
|
283
284
|
Object.defineProperty(exports, "EventLog", {
|
|
284
285
|
enumerable: true,
|
|
285
|
-
get: function () { return
|
|
286
|
+
get: function () { return chunk4UX3TSYX_cjs.EventLog; }
|
|
286
287
|
});
|
|
287
288
|
Object.defineProperty(exports, "Metrics", {
|
|
288
289
|
enumerable: true,
|
|
289
|
-
get: function () { return
|
|
290
|
+
get: function () { return chunk4UX3TSYX_cjs.Metrics; }
|
|
290
291
|
});
|
|
291
292
|
Object.defineProperty(exports, "PTCRuntime", {
|
|
292
293
|
enumerable: true,
|
|
293
|
-
get: function () { return
|
|
294
|
+
get: function () { return chunk4UX3TSYX_cjs.PTCRuntime; }
|
|
294
295
|
});
|
|
295
296
|
Object.defineProperty(exports, "PolicyDeniedError", {
|
|
296
297
|
enumerable: true,
|
|
297
|
-
get: function () { return
|
|
298
|
+
get: function () { return chunk4UX3TSYX_cjs.PolicyDeniedError; }
|
|
298
299
|
});
|
|
299
300
|
Object.defineProperty(exports, "PolicyEngine", {
|
|
300
301
|
enumerable: true,
|
|
301
|
-
get: function () { return
|
|
302
|
+
get: function () { return chunk4UX3TSYX_cjs.PolicyEngine; }
|
|
302
303
|
});
|
|
303
304
|
Object.defineProperty(exports, "SchemaValidationError", {
|
|
304
305
|
enumerable: true,
|
|
305
|
-
get: function () { return
|
|
306
|
+
get: function () { return chunk4UX3TSYX_cjs.SchemaValidationError; }
|
|
306
307
|
});
|
|
307
308
|
Object.defineProperty(exports, "SchemaValidator", {
|
|
308
309
|
enumerable: true,
|
|
309
|
-
get: function () { return
|
|
310
|
+
get: function () { return chunk4UX3TSYX_cjs.SchemaValidator; }
|
|
310
311
|
});
|
|
311
312
|
Object.defineProperty(exports, "Tracing", {
|
|
312
313
|
enumerable: true,
|
|
313
|
-
get: function () { return
|
|
314
|
+
get: function () { return chunk4UX3TSYX_cjs.Tracing; }
|
|
314
315
|
});
|
|
315
316
|
Object.defineProperty(exports, "buildEvidence", {
|
|
316
317
|
enumerable: true,
|
|
317
|
-
get: function () { return
|
|
318
|
+
get: function () { return chunk4UX3TSYX_cjs.buildEvidence; }
|
|
318
319
|
});
|
|
319
320
|
Object.defineProperty(exports, "createLogger", {
|
|
320
321
|
enumerable: true,
|
|
321
|
-
get: function () { return
|
|
322
|
+
get: function () { return chunk4UX3TSYX_cjs.createLogger; }
|
|
322
323
|
});
|
|
323
324
|
Object.defineProperty(exports, "expandToolDescriptorsToRegistryNames", {
|
|
324
325
|
enumerable: true,
|
|
325
|
-
get: function () { return
|
|
326
|
+
get: function () { return chunk4UX3TSYX_cjs.expandToolDescriptorsToRegistryNames; }
|
|
326
327
|
});
|
|
327
328
|
Object.defineProperty(exports, "isNpmToolDescriptor", {
|
|
328
329
|
enumerable: true,
|
|
329
|
-
get: function () { return
|
|
330
|
+
get: function () { return chunk4UX3TSYX_cjs.isNpmToolDescriptor; }
|
|
330
331
|
});
|
|
331
332
|
Object.defineProperty(exports, "loadToolConfig", {
|
|
332
333
|
enumerable: true,
|
|
333
|
-
get: function () { return
|
|
334
|
+
get: function () { return chunk4UX3TSYX_cjs.loadToolConfig; }
|
|
334
335
|
});
|
|
335
336
|
Object.defineProperty(exports, "normalizeToolList", {
|
|
336
337
|
enumerable: true,
|
|
337
|
-
get: function () { return
|
|
338
|
+
get: function () { return chunk4UX3TSYX_cjs.normalizeToolList; }
|
|
338
339
|
});
|
|
339
340
|
Object.defineProperty(exports, "parseNpmToolDescriptor", {
|
|
340
341
|
enumerable: true,
|
|
341
|
-
get: function () { return
|
|
342
|
+
get: function () { return chunk4UX3TSYX_cjs.parseNpmToolDescriptor; }
|
|
342
343
|
});
|
|
343
344
|
Object.defineProperty(exports, "resolveNpmToolDescriptor", {
|
|
344
345
|
enumerable: true,
|
|
345
|
-
get: function () { return
|
|
346
|
+
get: function () { return chunk4UX3TSYX_cjs.resolveNpmToolDescriptor; }
|
|
346
347
|
});
|
|
347
348
|
Object.defineProperty(exports, "resolveToolDescriptor", {
|
|
348
349
|
enumerable: true,
|
|
349
|
-
get: function () { return
|
|
350
|
+
get: function () { return chunk4UX3TSYX_cjs.resolveToolDescriptor; }
|
|
350
351
|
});
|
|
351
352
|
Object.defineProperty(exports, "sanitizeForLog", {
|
|
352
353
|
enumerable: true,
|
|
353
|
-
get: function () { return
|
|
354
|
+
get: function () { return chunk4UX3TSYX_cjs.sanitizeForLog; }
|
|
354
355
|
});
|
|
355
356
|
Object.defineProperty(exports, "summarizeForLog", {
|
|
356
357
|
enumerable: true,
|
|
357
|
-
get: function () { return
|
|
358
|
+
get: function () { return chunk4UX3TSYX_cjs.summarizeForLog; }
|
|
358
359
|
});
|
|
359
360
|
Object.defineProperty(exports, "DEFAULT_INPUT_SCHEMA", {
|
|
360
361
|
enumerable: true,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":"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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"]}
|
|
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"]}
|