@easynet/agent-tool 1.0.25 → 1.0.27

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 (41) hide show
  1. package/dist/api/extension/generateExtensionManifest.d.ts +5 -0
  2. package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -1
  3. package/dist/api/extension/index.d.ts +1 -1
  4. package/dist/api/extension/index.d.ts.map +1 -1
  5. package/dist/api/main.cjs +14 -14
  6. package/dist/api/main.js +3 -3
  7. package/dist/api/runtimeFromConfig.d.ts +4 -2
  8. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  9. package/dist/{chunk-AO2RY5AI.js → chunk-7J2DRVCV.js} +3 -3
  10. package/dist/{chunk-AO2RY5AI.js.map → chunk-7J2DRVCV.js.map} +1 -1
  11. package/dist/{chunk-NA2YBWZJ.cjs → chunk-EJSCDVKD.cjs} +14 -14
  12. package/dist/{chunk-NA2YBWZJ.cjs.map → chunk-EJSCDVKD.cjs.map} +1 -1
  13. package/dist/{chunk-B5CAENK6.cjs → chunk-ETZKGTTF.cjs} +7 -7
  14. package/dist/{chunk-B5CAENK6.cjs.map → chunk-ETZKGTTF.cjs.map} +1 -1
  15. package/dist/{chunk-JEP26OIY.js → chunk-GYUELFVR.js} +3 -3
  16. package/dist/{chunk-JEP26OIY.js.map → chunk-GYUELFVR.js.map} +1 -1
  17. package/dist/{chunk-AOEZBP6L.cjs → chunk-PKUSCCS6.cjs} +70 -12
  18. package/dist/chunk-PKUSCCS6.cjs.map +1 -0
  19. package/dist/{chunk-P5YQNWQT.js → chunk-URXW3CE5.js} +5 -4
  20. package/dist/chunk-URXW3CE5.js.map +1 -0
  21. package/dist/{chunk-SO32CIHJ.js → chunk-UUQGKFSG.js} +69 -11
  22. package/dist/chunk-UUQGKFSG.js.map +1 -0
  23. package/dist/{chunk-5CDN24FP.cjs → chunk-YEZT5HMH.cjs} +11 -10
  24. package/dist/chunk-YEZT5HMH.cjs.map +1 -0
  25. package/dist/index.cjs +58 -49
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +14 -6
  30. package/dist/index.js.map +1 -1
  31. package/dist/tools/function/scanner.d.ts.map +1 -1
  32. package/dist/utils/cli/index.cjs +20 -18
  33. package/dist/utils/cli/index.cjs.map +1 -1
  34. package/dist/utils/cli/index.d.ts.map +1 -1
  35. package/dist/utils/cli/index.js +6 -4
  36. package/dist/utils/cli/index.js.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/chunk-5CDN24FP.cjs.map +0 -1
  39. package/dist/chunk-AOEZBP6L.cjs.map +0 -1
  40. package/dist/chunk-P5YQNWQT.js.map +0 -1
  41. package/dist/chunk-SO32CIHJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts","../src/api/expose/mcpServer.ts"],"names":["enrichSpecWithCanonicalSchema","createServer","createRuntimeFromConfig","DEFAULT_CTX","normalizeToolName","MCP_KIND"],"mappings":"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","file":"chunk-B5CAENK6.cjs","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\" (dots to ~ in path) */\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 { normalizeToolName } from \"../../core/types/ToolSpec.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 * MCP tool names must match SEP-986: A–Z, a–z, 0–9, underscore, dash, dot only.\n * Use normalized tool name (only [a-zA-Z0-9.]).\n */\nfunction toMcpToolName(registryName: string): string {\n return normalizeToolName(registryName);\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 const mcpName = toMcpToolName(spec.name);\n server.registerTool(\n mcpName,\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","createServer","createRuntimeFromConfig","DEFAULT_CTX","normalizeToolName","MCP_KIND"],"mappings":";;;;;;;;AAmBO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAChC;AAGO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC/B;AAGA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAC,CAAA,CAAA;AACpD;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,MAAA,EAAQ,EAAE,WAAA,EAAa,mBAAA,EAAqB,sBAAsB,IAAA;AAAK;AAE3E,CAAA;AACA,IAAM,WAAA,GAAc;AAAA,EAClB,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACvB,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,sBAAsB,IAAA;AAAK;AAE1D,CAAA;AAMO,SAAS,kBAAA,CACd,QAAA,EACA,OAAA,GAA8B,EAAC,EACN;AACzB,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,UAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,OAAA;AACnC,EAAA,MAAM,YAAY,OAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAS,CAAE,IAAIA,+CAA6B,CAAA;AAEnE,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,IAClB,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF;AACF,GACF;AAEA,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,IACzB,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,MACxE,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,uEAAA;AAAA,QACb,oBAAA,EAAsB;AAAA;AACxB;AACF,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,GAAM,GAAA;AAC3C,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,CAAC,CAAA,EAAG,MAAM,CAAA,KAAA,CAAO,GAAG;AAAA,MAClB,GAAA,EAAK;AAAA,QACH,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,qDAAA;AAAA,QACb,WAAA,EAAa,WAAA;AAAA,QACb,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,eAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA;AACV;AACF;AACF;AACF;AACF,KACF;AAAA,IACA,CAAC,CAAA,EAAG,MAAM,CAAA,MAAA,CAAQ,GAAG;AAAA,MACnB,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,yBAAA;AAAA,QACT,WAAA,EAAa,gGAAA;AAAA,QACb,WAAA,EAAa,YAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA;AACV;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,aAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,cAAa;AAAE,WAC1D;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,aAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,aAAY;AAAE;AACzD;AACF;AACF;AACF,GACF;AAEA,EAAA,MAAM,gBAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAChC,IAAA,aAAA,CAAc,IAAA,CAAK,CAAC,GAAA,EAAK,CAAA,CAAE,WAAqB,CAAC,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA;AAClC,IAAA,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,IAAI,EAAE,CAAA,GAAI;AAAA,MACjC,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA;AAAA,QAC5B,WAAA,EAAa,CAAA,cAAA,EAAiB,CAAA,CAAE,IAAI,CAAA,6DAAA,CAAA;AAAA,QACpC,WAAA,EAAa,UAAU,GAAG,CAAA,CAAA;AAAA,QAC1B,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAA;AAAG;AAChD;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,aAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,cAAa;AAAE,WAC1D;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,0CAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,aAAY;AAAE;AACzD;AACF;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,IACvB,KAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,MAAA,CAAO,WAAA,CAAY,aAAa;AAAA;AAC3C,GACF;AACF;;;AC3JA,IAAM,WAAA,GAA2B;AAAA,EAC/B,SAAA,EAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACvE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,EAC1B,WAAA,EAAa;AAAA,IACX,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAC9C,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY;AAAA;AAE3B,CAAA;AAEA,SAAS,UAAU,GAAA,EAAwC;AACzD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,GAAA,CAAI,GAAG,MAAA,EAAQ,CAAC,UAAU,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,MAAA,MAAM,MAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAClD,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAK,EAAG;AACf,QAAA,OAAA,CAAQ,EAAE,CAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAY,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,QAAA,CAAS,GAAA,EAAqB,MAAA,EAAgB,IAAA,EAAqB;AAC1E,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAC5D,EAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B;AAGA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AACrD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAeO,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AAa9B;AASO,SAAS,uBAAA,CACd,OAAA,EACA,OAAA,GAAoC,EAAC,EACT;AAC5B,EAAA,MAAM,YAAY,OAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3D,EAAA,MAAM,aAAa,OAAA,CAAQ,kBAAA,KAAuB,OAAO,EAAE,GAAG,WAAA,EAAY,CAAA,CAAA;AAE1E,EAAA,MAAM,MAAA,GAASC,iBAAA,CAAa,OAAO,GAAA,EAAsB,GAAA,KAAwB;AAC/E,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AACvB,IAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAClC,IAAA,MAAM,IAAA,GAAO,QAAA,GAAY,IAAA,KAAS,QAAA,GAAW,EAAA,GAAK,KAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,IAAK,GAAA,GAAO,IAAA;AAEvF,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,MAAA,KAAW,KAAA,KAAU,IAAA,KAAS,GAAA,IAAO,SAAS,UAAA,CAAA,EAAa;AACjE,QAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,aAAA,CAAA,GAAkB,eAAA;AACzD,QAAA,MAAM,IAAA,GAAO,cAAc,QAAQ,CAAA;AACnC,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,4BAA4B,CAAA;AACjE,QAAA,GAAA,CAAI,IAAI,IAAI,CAAA;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAI,MAAA,KAAW,KAAA,KAAU,IAAA,KAAS,eAAA,IAAmB,SAAS,OAAA,CAAA,EAAU;AAC1E,QAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,OAAA,CAAQ,WAAA,EAAY,EAAG;AAAA,UACrD,KAAA,EAAO,UAAA;AAAA,UACP,OAAA,EAAS,OAAA;AAAA,UACT,UAAU,QAAA,IAAY,KAAA;AAAA,SACvB,CAAA;AACD,QAAA,QAAA,CAAS,GAAA,EAAK,KAAK,IAAI,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,IAAA,KAAS,QAAA,EAAU;AAC7C,QAAA,MAAM,EAAE,6BAAA,EAAAD,8BAAAA,EAA8B,GAAI,MAAM,OAAO,qCAA0C,CAAA;AACjG,QAAA,MAAM,QAAQ,OAAA,CAAQ,WAAA,GAAc,QAAA,EAAS,CAAE,IAAIA,8BAA6B,CAAA;AAChF,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9B,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,aAAa,CAAA,CAAE;AAAA,SACjB,CAAE,CAAA;AACF,QAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,IAAA,KAAS,SAAA,EAAW;AAC/C,QAAA,MAAM,IAAA,GAAQ,MAAM,SAAA,CAAU,GAAG,CAAA;AACjC,QAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,QAAA,MAAM,IAAA,GAAO,IAAA,EAAM,IAAA,IAAQ,EAAC;AAC5B,QAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG;AAC5C,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,OAAO,mCAAA,EAAqC,IAAA,EAAM,eAAe,CAAA;AACtF,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,UAC3B,EAAE,IAAA,EAAM,IAAA,CAAK,MAAK,EAAG,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,UAC9C;AAAA,SACF;AACA,QAAA,IAAI,OAAO,EAAA,EAAI;AACb,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAC5C,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,KAAK,GAAA,EAAK;AAAA,UACjB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,aAAA;AAAA,UAChC,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA;AAAA,UACpB,OAAA,EAAS,OAAO,KAAA,EAAO;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ;AAC3F,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AACzC,QAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,MAAM,UAAU,GAAG,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,OAAO,mBAAA,EAAqB,IAAA,EAAM,eAAe,CAAA;AACtE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,UAC3B,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,EAAC,EAAG,SAAS,SAAA,EAAU;AAAA,UACvD;AAAA,SACF;AACA,QAAA,IAAI,OAAO,EAAA,EAAI;AACb,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAC5C,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,KAAK,GAAA,EAAK;AAAA,UACjB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,aAAA;AAAA,UAChC,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA;AAAA,UACpB,OAAA,EAAS,OAAO,KAAA,EAAO;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,OAAO,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,IAC5D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,OAAO,OAAA,EAAS,IAAA,EAAM,kBAAkB,CAAA;AAAA,IAC/D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,uBAAA,CACd,MAAA,EACA,OAAA,GAA4C,EAAC,EACJ;AACzC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC7B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM;AAC9B,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,QAAA,IAAY,MAAM,IAAA,IAAQ,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAChF,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,IACpC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAmCA,eAAsB,iBAAA,CACpB,eAAA,EACA,OAAA,GAAoC,EAAC,EACT;AAC5B,EAAA,MAAM,OAAA,GACJ,QAAA,IAAY,eAAA,IAAmB,OAAO,eAAA,CAAgB,MAAA,KAAW,UAAA,GAC5D,eAAA,GAAA,CACA,MAAME,yCAAA,CAAwB,eAAuC,CAAA,EAAG,OAAA;AAC/E,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,OAAA,EAAS,OAAO,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,CAAQ,WAAA,EAAY,EAAG;AAAA,IAC5D,KAAA,EAAO,QAAQ,KAAA,IAAS,UAAA;AAAA,IACxB,OAAA,EAAS,QAAQ,OAAA,IAAW,OAAA;AAAA,IAC5B,UAAU,OAAA,CAAQ;AAAA,GACnB,CAAA;AACD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA,EAAQ,CAAC,UAAA,KAAe,uBAAA,CAAwB,QAAQ,UAAU;AAAA,GACpE;AACF;;;AC9PA,IAAMC,YAAAA,GAA2B;AAAA,EAC/B,SAAA,EAAW,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACtE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,EAC1B,WAAA,EAAa;AAAA,IACX,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAC9C,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY;AAAA;AAE3B,CAAA;AA6BA,SAAS,cAAc,YAAA,EAA8B;AACnD,EAAA,OAAOC,oCAAkB,YAAY,CAAA;AACvC;AAMA,eAAe,wBAAA,CACb,SACA,OAAA,EACmH;AACnH,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,yCAAyC,CAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,YAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,OAAA;AACnC,EAAA,MAAM,aAAa,OAAA,CAAQ,kBAAA,KAAuB,OAAO,EAAE,GAAGD,YAAAA,EAAY,CAAA,CAAA;AAE1E,EAAA,MAAM,SAAS,IAAI,SAAA,CAAU,EAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,EAAS;AAEhC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,MAAA,CAAO,YAAA;AAAA,MACL,OAAA;AAAA,MACA;AAAA,QACE,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAAA,QACnD,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,OAAO,IAAA,CAAK;AAAA,OACd;AAAA,MACA,OAAO,IAAA,KAAkB;AACvB,QAAA,MAAM,MAAM,UAAA,EAAW;AACvB,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,UAC3B,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAC,EAAG,OAAA,EAASE,0BAAA,EAAS;AAAA,UACvD;AAAA,SACF;AACA,QAAA,IAAI,OAAO,EAAA,EAAI;AACb,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,QAC5E;AACA,QAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,GAAA,EAAK,OAAA,IAAW,aAAA,EAAe,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM;AAAA;AAChF,WACF;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAmBA,eAAsB,eAAA,CACpB,eAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,MAAM,OAAA,GACJ,QAAA,IAAY,eAAA,IAAmB,OAAO,eAAA,CAAgB,MAAA,KAAW,UAAA,GAC5D,eAAA,GAAA,CACA,MAAMH,yCAAA,CAAwB,eAAuC,CAAA,EAAG,OAAA;AAC/E,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OAAO,2CAA2C,CAAA;AAEzF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,wBAAA,CAAyB,SAAS,OAAO,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAM,YAAA,GAAe;AACnB,MAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,MAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAgBO,SAAS,8BAAA,CACd,eAAA,EACA,OAAA,GAA4B,EAAC,EACiC;AAC9D,EAAA,IAAI,QAAA,IAAY,eAAA,IAAmB,OAAO,eAAA,CAAgB,WAAW,UAAA,EAAY;AAC/E,IAAA,MAAM,OAAA,GAAU,eAAA;AAChB,IAAA,OAAO,eAAe,qBAAA,CACpB,GAAA,EACA,GAAA,EACA,UAAA,EACe;AACf,MAAA,MAAM,EAAE,6BAAA,EAA8B,GAAI,MAAM,OAAO,oDAAoD,CAAA;AAC3G,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,wBAAA,CAAyB,SAAS,OAAO,CAAA;AAClE,MAAA,MAAM,YAAY,IAAI,6BAAA,CAA8B,EAAE,kBAAA,EAAoB,QAAW,CAAA;AACrF,MAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,MAAA,MAAM,UAAU,MAAY;AAC1B,QAAA,SAAA,CAAU,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAChC,QAAA,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC7B,QAAA,GAAA,CAAI,cAAA,CAAe,SAAS,OAAO,CAAA;AACnC,QAAA,GAAA,CAAI,cAAA,CAAe,UAAU,OAAO,CAAA;AAAA,MACtC,CAAA;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,SAAS,OAAO,CAAA;AACzB,MAAA,GAAA,CAAI,IAAA,CAAK,UAAU,OAAO,CAAA;AAC1B,MAAA,MAAM,SAAA,CAAU,aAAA;AAAA,QAChB,GAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACA,CAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,YAA+C;AACrD,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAMA,0CAAwB,eAAuC,CAAA;AACzF,IAAA,OAAO,8BAAA,CAA+B,SAAS,OAAO,CAAA;AAAA,EACxD,CAAA,GAAG;AACL;AAyBA,eAAsB,6BAAA,CACpB,eAAA,EACA,OAAA,GAAgD,EAAC,EACT;AACxC,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,MAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,GAAA;AAC7B,EAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,MAAM,OAAO,6CAA6C,CAAA;AAC1F,EAAA,MAAM,OAAA,GACJ,QAAA,IAAY,eAAA,IAAmB,OAAO,gBAAgB,MAAA,KAAW,UAAA,GAC7D,8BAAA,CAA+B,eAAA,EAA+B,OAAO,CAAA,GACrE,MAAM,8BAAA,CAA+B,iBAAyC,OAAO,CAAA;AAC3F,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,EAAE,IAAA,EAAM,CAAA;AACxC,EAAA,GAAA,CAAI,IAAA,CAAK,MAAM,OAAO,CAAA;AAEtB,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,UAAA,EAAqB,UAAA,EAA6D;AAC7F,MAAA,MAAM,IAAI,UAAA,IAAc,IAAA;AACxB,MAAA,MAAM,IAAI,UAAA,IAAc,IAAA;AACxB,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,MAAM,MAAA,GAAU,GAAA,CAEb,MAAA,CAAO,CAAA,EAAG,GAAG,MAAM;AACpB,UAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,UAAA,MAAM,UAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,IAAQ,MAAA,IAAU,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,CAAA;AAC5E,UAAA,OAAA,CAAQ,EAAE,GAAA,EAAK,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,EAAM,UAAA,EAAY,CAAA;AAAA,QACvE,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAMA,eAAsB,qBAAA,CACpB,OAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAA,EAAS,OAAO,CAAA;AACrD,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,OAAO,MAAA;AACT","file":"chunk-ETZKGTTF.cjs","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\" (dots to ~ in path) */\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 { normalizeToolName } from \"../../core/types/ToolSpec.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 * MCP tool names must match SEP-986: A–Z, a–z, 0–9, underscore, dash, dot only.\n * Use normalized tool name (only [a-zA-Z0-9.]).\n */\nfunction toMcpToolName(registryName: string): string {\n return normalizeToolName(registryName);\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 const mcpName = toMcpToolName(spec.name);\n server.registerTool(\n mcpName,\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,4 +1,4 @@
1
- import { createRuntimeFromConfig, MCP_KIND } from './chunk-SO32CIHJ.js';
1
+ import { createRuntimeFromConfig, MCP_KIND } from './chunk-UUQGKFSG.js';
2
2
  import { enrichSpecWithCanonicalSchema } from './chunk-3MUOBLNB.js';
3
3
  import { normalizeToolName } from './chunk-KDB3MY2H.js';
4
4
  import { createServer } from 'http';
@@ -470,5 +470,5 @@ async function runMCPServerOverStdio(runtime, options = {}) {
470
470
  }
471
471
 
472
472
  export { createHttpService, createMCPServer, createMCPServerStreamableHttp, createMCPStreamableHttpHandler, runMCPServerOverStdio };
473
- //# sourceMappingURL=chunk-JEP26OIY.js.map
474
- //# sourceMappingURL=chunk-JEP26OIY.js.map
473
+ //# sourceMappingURL=chunk-GYUELFVR.js.map
474
+ //# sourceMappingURL=chunk-GYUELFVR.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-JEP26OIY.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\" (dots to ~ in path) */\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 { normalizeToolName } from \"../../core/types/ToolSpec.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 * MCP tool names must match SEP-986: A–Z, a–z, 0–9, underscore, dash, dot only.\n * Use normalized tool name (only [a-zA-Z0-9.]).\n */\nfunction toMcpToolName(registryName: string): string {\n return normalizeToolName(registryName);\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 const mcpName = toMcpToolName(spec.name);\n server.registerTool(\n mcpName,\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-GYUELFVR.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\" (dots to ~ in path) */\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 { normalizeToolName } from \"../../core/types/ToolSpec.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 * MCP tool names must match SEP-986: A–Z, a–z, 0–9, underscore, dash, dot only.\n * Use normalized tool name (only [a-zA-Z0-9.]).\n */\nfunction toMcpToolName(registryName: string): string {\n return normalizeToolName(registryName);\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 const mcpName = toMcpToolName(spec.name);\n server.registerTool(\n mcpName,\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"]}
@@ -1731,7 +1731,7 @@ async function importFromCache(packageRoot) {
1731
1731
  fileUrl
1732
1732
  );
1733
1733
  }
1734
- var requireFromPackage = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-AOEZBP6L.cjs', document.baseURI).href)));
1734
+ var requireFromPackage = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-PKUSCCS6.cjs', document.baseURI).href)));
1735
1735
  function getProjectRequire() {
1736
1736
  const cwd = process.cwd();
1737
1737
  if (fs.existsSync(path.join(cwd, "package.json"))) return module$1.createRequire(path.join(cwd, "package.json"));
@@ -1818,6 +1818,44 @@ function parseNpmDescriptor(entry) {
1818
1818
  const version = rest.slice(at + 1).split("#")[0]?.trim() || "latest";
1819
1819
  return { packageName, version };
1820
1820
  }
1821
+ function loadExtensionFromToolYamlNodeModules(configFilePath, stepLog) {
1822
+ const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1823
+ if (!fs.existsSync(localPath)) return null;
1824
+ const config = loadToolConfig(localPath);
1825
+ const tools = config.tools;
1826
+ if (!Array.isArray(tools) || tools.length === 0) return null;
1827
+ const configDir = path.dirname(localPath);
1828
+ const packageJsonPath = path.join(configDir, "package.json");
1829
+ if (!fs.existsSync(packageJsonPath)) return null;
1830
+ const configRequire = module$1.createRequire(packageJsonPath);
1831
+ if (stepLog) stepLog("Trying tool.yaml npm entries from node_modules");
1832
+ for (const entry of tools) {
1833
+ const entryStr = String(entry).trim();
1834
+ const parsed = parseNpmDescriptor(entryStr);
1835
+ if (!parsed) continue;
1836
+ try {
1837
+ const mod = configRequire(parsed.packageName);
1838
+ const fn = getRegisterFn(mod);
1839
+ if (typeof fn === "function") {
1840
+ const resolvedVersion = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire) ?? "latest";
1841
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1842
+ }
1843
+ } catch {
1844
+ continue;
1845
+ }
1846
+ }
1847
+ return null;
1848
+ }
1849
+ function getInstalledPackageVersionFromRequire(packageName, req) {
1850
+ try {
1851
+ const pkgJsonPath = req.resolve(`${packageName}/package.json`);
1852
+ const json = fs.readFileSync(pkgJsonPath, "utf-8");
1853
+ const pkg = JSON.parse(json);
1854
+ return pkg.version ?? null;
1855
+ } catch {
1856
+ return null;
1857
+ }
1858
+ }
1821
1859
  function loadExtensionFromToolYamlCache(configFilePath, stepLog) {
1822
1860
  const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1823
1861
  if (!fs.existsSync(localPath)) return null;
@@ -1904,6 +1942,16 @@ function createRuntimeFromConfigSync(options = {}) {
1904
1942
  return { runtime: runtime3, registry };
1905
1943
  }
1906
1944
  if (options.configFilePath) {
1945
+ const extensionFromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, stepLog);
1946
+ if (extensionFromNodeModules) {
1947
+ if (stepLog) stepLog("Registered extension from tool.yaml list (node_modules)");
1948
+ const prefix = npmDescriptorToRegistryPrefix(extensionFromNodeModules.descriptor, extensionFromNodeModules.resolvedVersion);
1949
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1950
+ const coreAdapter = extensionFromNodeModules.register(reg, options.coreTools);
1951
+ const runtime3 = new PTCRuntime({ registry });
1952
+ runtime3.registerAdapter(coreAdapter);
1953
+ return { runtime: runtime3, registry };
1954
+ }
1907
1955
  if (stepLog) stepLog("No extension in node_modules, loading from tool.yaml cache");
1908
1956
  const extensionCache = loadExtensionFromToolYamlCache(options.configFilePath, stepLog);
1909
1957
  if (extensionCache) {
@@ -1923,22 +1971,32 @@ function createRuntimeFromConfigSync(options = {}) {
1923
1971
  return { runtime, registry };
1924
1972
  }
1925
1973
  async function createRuntimeFromConfig(options = {}) {
1926
- const syncResult = createRuntimeFromConfigSync(options);
1927
- if (options.coreTools !== void 0 && options.configFilePath && syncResult.registry.snapshot().length === 0) {
1928
- if (options.stepLog) options.stepLog("No extension from sync, trying async cache load");
1929
- const extension = await loadExtensionFromToolYamlCacheAsync(options.configFilePath, options.stepLog);
1930
- if (extension) {
1931
- if (options.stepLog) options.stepLog("Registered extension from async cache");
1974
+ if (options.coreTools !== void 0 && options.configFilePath) {
1975
+ const fromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, options.stepLog);
1976
+ if (fromNodeModules) {
1977
+ if (options.stepLog) options.stepLog("Registered extension from tool.yaml list (node_modules)");
1978
+ const registry = new chunkTOSPHMYU_cjs.ToolRegistry();
1979
+ const prefix = npmDescriptorToRegistryPrefix(fromNodeModules.descriptor, fromNodeModules.resolvedVersion);
1980
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1981
+ const coreAdapter = fromNodeModules.register(reg, options.coreTools);
1982
+ const runtime = new PTCRuntime({ registry });
1983
+ runtime.registerAdapter(coreAdapter);
1984
+ return { runtime, registry };
1985
+ }
1986
+ if (options.stepLog) options.stepLog("Loading extension from tool.yaml cache (dynamic: npm pack + import)");
1987
+ const fromCache = await loadExtensionFromToolYamlCacheAsync(options.configFilePath, options.stepLog);
1988
+ if (fromCache) {
1989
+ if (options.stepLog) options.stepLog("Registered extension from cache");
1932
1990
  const registry = new chunkTOSPHMYU_cjs.ToolRegistry();
1933
- const prefix = npmDescriptorToRegistryPrefix(extension.descriptor, extension.resolvedVersion);
1991
+ const prefix = npmDescriptorToRegistryPrefix(fromCache.descriptor, fromCache.resolvedVersion);
1934
1992
  const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1935
- const coreAdapter = extension.register(reg, options.coreTools);
1993
+ const coreAdapter = fromCache.register(reg, options.coreTools);
1936
1994
  const runtime = new PTCRuntime({ registry });
1937
1995
  runtime.registerAdapter(coreAdapter);
1938
1996
  return { runtime, registry };
1939
1997
  }
1940
1998
  }
1941
- return syncResult;
1999
+ return createRuntimeFromConfigSync(options);
1942
2000
  }
1943
2001
 
1944
2002
  // src/tools/mcp/types.ts
@@ -1981,5 +2039,5 @@ exports.resolveSandboxedPath = resolveSandboxedPath;
1981
2039
  exports.resolveToolDescriptor = resolveToolDescriptor;
1982
2040
  exports.sanitizeForLog = sanitizeForLog;
1983
2041
  exports.summarizeForLog = summarizeForLog;
1984
- //# sourceMappingURL=chunk-AOEZBP6L.cjs.map
1985
- //# sourceMappingURL=chunk-AOEZBP6L.cjs.map
2042
+ //# sourceMappingURL=chunk-PKUSCCS6.cjs.map
2043
+ //# sourceMappingURL=chunk-PKUSCCS6.cjs.map