@pancake-apps/server 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -583,10 +583,29 @@ async function createServer(config) {
583
583
  return new Promise((resolve3) => {
584
584
  const httpServer = app.listen(config.port, config.host, () => {
585
585
  if (config.config?.debug) {
586
- console.log(`Pancake server "${config.name}" running on http://${config.host}:${config.port}`);
587
- console.log(` MCP endpoint: ${mcpRoute}`);
588
- console.log(` UI endpoint: /ui/:viewName`);
589
- console.log(` Tools registered: ${config.tools.size}`);
586
+ const baseUrl = `http://localhost:${config.port}`;
587
+ const viewNames = config.viewNames ?? [];
588
+ const actionNames = config.actionNames ?? [];
589
+ const dataNames = config.dataNames ?? [];
590
+ console.log("");
591
+ console.log(` \x1B[1m\x1B[32m\u2713\x1B[0m \x1B[1m${config.name}\x1B[0m is running`);
592
+ console.log("");
593
+ console.log(` \x1B[2m\u279C\x1B[0m \x1B[1mServer:\x1B[0m ${baseUrl}`);
594
+ console.log(` \x1B[2m\u279C\x1B[0m \x1B[1mMCP:\x1B[0m ${baseUrl}${mcpRoute}`);
595
+ if (viewNames.length > 0) {
596
+ console.log(` \x1B[2m\u279C\x1B[0m \x1B[1mViews:\x1B[0m ${viewNames.map((v) => `${baseUrl}/ui/${v}`).join("\n ")}`);
597
+ }
598
+ console.log("");
599
+ console.log(` \x1B[2mRegistered:\x1B[0m`);
600
+ console.log(` ${viewNames.length} view${viewNames.length !== 1 ? "s" : ""}${viewNames.length > 0 ? ` (${viewNames.join(", ")})` : ""}`);
601
+ console.log(` ${actionNames.length} action${actionNames.length !== 1 ? "s" : ""}${actionNames.length > 0 ? ` (${actionNames.join(", ")})` : ""}`);
602
+ console.log(` ${dataNames.length} data fetcher${dataNames.length !== 1 ? "s" : ""}${dataNames.length > 0 ? ` (${dataNames.join(", ")})` : ""}`);
603
+ console.log("");
604
+ console.log(` \x1B[2mNext steps:\x1B[0m`);
605
+ console.log(` \x1B[36m1.\x1B[0m Open a view in your browser: ${baseUrl}/ui/${viewNames[0] || "yourView"}`);
606
+ console.log(` \x1B[36m2.\x1B[0m Connect an MCP client to: ${baseUrl}${mcpRoute}`);
607
+ console.log(` \x1B[36m3.\x1B[0m Or use Claude Desktop with this server URL`);
608
+ console.log("");
590
609
  }
591
610
  resolve3({
592
611
  close: () => new Promise((resolveClose) => {
@@ -838,7 +857,10 @@ function createApp(config) {
838
857
  events,
839
858
  port,
840
859
  host,
841
- transport
860
+ transport,
861
+ viewNames: Object.keys(config.views ?? {}),
862
+ actionNames: Object.keys(config.actions ?? {}),
863
+ dataNames: Object.keys(config.data ?? {})
842
864
  };
843
865
  if (config.config) {
844
866
  const cfg = {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/mcp.ts","../src/server/dev-proxy.ts","../src/server/routes.ts","../src/server/stdio.ts","../src/server/index.ts","../src/view.ts","../src/action.ts","../src/data.ts","../src/tool.ts","../src/normalizers.ts","../src/app.ts","../src/helpers.ts","../src/discovery/index.ts"],"names":["Router","path","fs","visibilityToAudience","Server","ListToolsRequestSchema","getUIResourceUri","CallToolRequestSchema","ListResourcesRequestSchema","ReadResourceRequestSchema","StdioServerTransport","express","startStdioServer","resolve","zodToJsonSchema","createServer","path2","fsSync","fs2"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { RequestHandler } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * MCP handler configuration\n */\ninterface McpHandlerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n executeTool: (toolName: string, input: unknown, metadata?: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * MCP JSON-RPC request structure\n */\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * MCP JSON-RPC response structure\n */\ninterface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * Convert visibility to MCP audience format\n */\nfunction visibilityToAudience(visibility: 'model' | 'app' | 'both'): string[] {\n switch (visibility) {\n case 'model':\n return ['assistant'];\n case 'app':\n return ['user'];\n case 'both':\n default:\n return ['assistant', 'user'];\n }\n}\n\n/**\n * Create an Express handler for MCP JSON-RPC requests\n */\nexport function createMcpHandler(config: McpHandlerConfig): RequestHandler {\n return async (req, res) => {\n const request = req.body as JsonRpcRequest;\n\n if (request.jsonrpc !== '2.0') {\n res.status(400).json({\n jsonrpc: '2.0',\n id: request.id ?? null,\n error: { code: -32600, message: 'Invalid Request: Not JSON-RPC 2.0' },\n });\n return;\n }\n\n try {\n const result = await handleMethod(config, request.method, request.params ?? {});\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n res.json(response);\n } catch (error) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : 'Internal error',\n data: error instanceof Error ? { stack: error.stack } : undefined,\n },\n };\n res.json(response);\n }\n };\n}\n\n/**\n * Handle MCP method calls\n */\nasync function handleMethod(\n config: McpHandlerConfig,\n method: string,\n params: Record<string, unknown>\n): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n resources: {},\n },\n serverInfo: {\n name: config.name,\n version: config.version,\n },\n };\n\n case 'tools/list':\n return {\n tools: Array.from(config.tools.values())\n // Filter out app-only tools (they shouldn't be visible to the model)\n .filter((tool) => tool.visibility !== 'app')\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n audience: visibilityToAudience(tool.visibility),\n },\n _meta: tool.ui\n ? {\n ui: {\n visibility: visibilityToAudience(tool.visibility),\n resourceUri: getUIResourceUri(tool.name, tool.category),\n },\n }\n : undefined,\n })),\n };\n\n case 'tools/call': {\n const toolName = params['name'] as string;\n const args = (params['arguments'] as Record<string, unknown>) ?? {};\n\n const result = await config.executeTool(toolName, args);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ],\n structuredContent: result,\n };\n }\n\n case 'resources/list':\n return {\n resources: Array.from(config.uiResources.values()).map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n mimeType: 'text/html;profile=mcp-app',\n _meta: {\n ui: {\n prefersBorder: resource.definition.prefersBorder,\n autoResize: resource.definition.autoResize,\n csp: resource.definition.csp,\n },\n },\n })),\n };\n\n case 'resources/read': {\n const uri = params['uri'] as string;\n const resource = config.uiResources.get(uri);\n\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n // Read actual file content\n let htmlContent: string;\n const htmlPath = resource.definition.html;\n\n if (htmlPath.trim().startsWith('<')) {\n // Inline HTML\n htmlContent = htmlPath;\n } else {\n // File path - read content\n const fsPromises = await import('node:fs/promises');\n const pathModule = await import('node:path');\n const fullPath = pathModule.resolve(process.cwd(), htmlPath);\n htmlContent = await fsPromises.readFile(fullPath, 'utf-8');\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: 'text/html',\n text: htmlContent,\n },\n ],\n };\n }\n\n case 'notifications/initialized':\n case 'ping':\n return {};\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n}\n\n/**\n * Get the UI resource URI for a tool\n */\nfunction getUIResourceUri(toolName: string, category: string): string {\n // Extract the name without prefix\n const name = toolName.replace(/^(view|action|data|tool):/, '');\n return `pancake://ui/${category}/${name}`;\n}\n","import type { RequestHandler } from 'express';\nimport type { DevServerConfig } from '../types/app.js';\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n return process.env['NODE_ENV'] !== 'production';\n}\n\n/**\n * Create a proxy middleware for Vite dev server\n */\nexport function createViteProxy(config: DevServerConfig): RequestHandler {\n const vitePort = config.vitePort ?? 5173;\n const viteUrl = `http://localhost:${vitePort}`;\n\n // Paths to proxy to Vite\n const vitePaths = [\n '/@vite/',\n '/@react-refresh',\n '/assets/',\n '/src/',\n '/__vite_ping',\n '/@fs/',\n '/node_modules/.vite/',\n ];\n\n return async (req, res, next) => {\n const shouldProxy = vitePaths.some((p) => req.path.startsWith(p));\n\n if (!shouldProxy) {\n next();\n return;\n }\n\n try {\n // Dynamically import node-fetch for proxying\n const targetUrl = `${viteUrl}${req.url}`;\n const response = await fetch(targetUrl, {\n method: req.method,\n headers: {\n ...Object.fromEntries(\n Object.entries(req.headers).filter(([key]) =>\n !['host', 'connection'].includes(key.toLowerCase())\n )\n ),\n } as Record<string, string>,\n });\n\n // Copy response headers\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n res.status(response.status);\n\n // Stream response body\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) {\n res.end();\n return;\n }\n res.write(Buffer.from(value));\n return pump();\n };\n await pump();\n } else {\n res.end();\n }\n } catch (error) {\n // Vite might not be running, pass through\n if (isDevelopment()) {\n console.warn(`[Pancake] Vite proxy failed for ${req.path}:`, error);\n }\n next();\n }\n };\n}\n\n/**\n * Generate HTML template with Vite HMR support\n */\nexport function generateHMRTemplate(serverUrl: string, viewName: string): string {\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>${viewName}</title>\n <base href=\"${serverUrl}/\" />\n <script type=\"module\">\n import { injectIntoGlobalHook } from \"${serverUrl}/@react-refresh\";\n injectIntoGlobalHook(window);\n window.$RefreshReg$ = () => {};\n window.$RefreshSig$ = () => (type) => type;\n window.__vite_plugin_react_preamble_installed__ = true;\n </script>\n <script type=\"module\" src=\"${serverUrl}/@vite/client\"></script>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\">\n // Initialize Pancake client before loading the view\n import('${serverUrl}/src/pancake-init.ts')\n .then(async (mod) => {\n if (mod.init) await mod.init();\n })\n .catch(() => {\n // pancake-init.ts might not exist, that's ok\n })\n .finally(() => {\n import('${serverUrl}/src/views/${viewName}/index.tsx')\n .catch(() => import('${serverUrl}/src/views/${viewName}.tsx'))\n .catch(() => import('${serverUrl}/src/views/${viewName}/index.ts'))\n .catch(() => import('${serverUrl}/src/views/${viewName}.ts'))\n .catch((err) => {\n console.error('Failed to load view:', err);\n document.body.innerHTML = '<pre style=\"color: red;\">Failed to load view: ' + err.message + '</pre>';\n });\n });\n </script>\n </body>\n</html>`;\n}\n","import { Router } from 'express';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { DevServerConfig } from '../types/app.js';\nimport { generateHMRTemplate, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create routes for serving UI resources\n */\nexport function createUIRoutes(\n uiResources: Map<string, UIResource>,\n devServerConfig?: DevServerConfig\n): Router {\n const router = Router();\n\n // Serve UI by name\n router.get('/:category/:name', async (req, res) => {\n const { category, name } = req.params;\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (!resource) {\n res.status(404).json({ error: `UI not found: ${category}/${name}` });\n return;\n }\n\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Short form: /ui/:name (defaults to view category)\n router.get('/:name', async (req, res) => {\n const { name } = req.params;\n\n // Try view first, then action, then tool\n for (const category of ['view', 'action', 'tool']) {\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (resource) {\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n return;\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n }\n\n res.status(404).json({ error: `UI not found: ${name}` });\n });\n\n return router;\n}\n\n/**\n * Get HTML content for a UI definition\n */\nasync function getUIHtml(\n ui: UIDefinition,\n viewName: string,\n devServerConfig?: DevServerConfig\n): Promise<string> {\n // In development mode, generate HMR template\n if (isDevelopment() && devServerConfig) {\n const vitePort = devServerConfig.vitePort ?? 5173;\n return generateHMRTemplate(`http://localhost:${vitePort}`, viewName);\n }\n\n // Check if html is inline (starts with <)\n if (ui.html.trim().startsWith('<')) {\n return ui.html;\n }\n\n // Otherwise, read from file\n const htmlPath = path.resolve(process.cwd(), ui.html);\n const content = await fs.readFile(htmlPath, 'utf-8');\n return content;\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Stdio server configuration\n */\ninterface StdioServerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n executeTool: (toolName: string, input: unknown, metadata?: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Convert visibility to MCP audience format\n */\nfunction visibilityToAudience(visibility: 'model' | 'app' | 'both'): string[] {\n switch (visibility) {\n case 'model':\n return ['assistant'];\n case 'app':\n return ['user'];\n case 'both':\n default:\n return ['assistant', 'user'];\n }\n}\n\n/**\n * Start the MCP server using stdio transport\n */\nexport async function startStdioServer(\n config: StdioServerConfig\n): Promise<{ close: () => Promise<void> }> {\n const server = new Server(\n {\n name: config.name,\n version: config.version,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n );\n\n // Handle list tools\n server.setRequestHandler(\n ListToolsRequestSchema,\n async () => {\n return {\n tools: Array.from(config.tools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n audience: visibilityToAudience(tool.visibility),\n },\n _meta: tool.ui\n ? {\n ui: {\n visibility: visibilityToAudience(tool.visibility),\n resourceUri: getUIResourceUri(tool.name, tool.category),\n },\n }\n : undefined,\n })),\n };\n }\n );\n\n // Handle call tool\n server.setRequestHandler(\n CallToolRequestSchema,\n async (request) => {\n const { name, arguments: args = {} } = request.params;\n const result = await config.executeTool(name, args);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ],\n structuredContent: result,\n };\n }\n );\n\n // Handle list resources\n server.setRequestHandler(\n ListResourcesRequestSchema,\n async () => {\n return {\n resources: Array.from(config.uiResources.values()).map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n mimeType: 'text/html;profile=mcp-app',\n _meta: {\n ui: {\n prefersBorder: resource.definition.prefersBorder,\n autoResize: resource.definition.autoResize,\n csp: resource.definition.csp,\n },\n },\n })),\n };\n }\n );\n\n // Handle read resource\n server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n const { uri } = request.params;\n const resource = config.uiResources.get(uri);\n\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: 'text/html',\n text: resource.definition.html,\n },\n ],\n };\n }\n );\n\n // Connect to stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return {\n close: async () => {\n await server.close();\n },\n };\n}\n\n/**\n * Get the UI resource URI for a tool\n */\nfunction getUIResourceUri(toolName: string, category: string): string {\n const name = toolName.replace(/^(view|action|data|tool):/, '');\n return `pancake://ui/${category}/${name}`;\n}\n","import express, { type Express } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { EventMap, CorsConfig, DevServerConfig } from '../types/app.js';\nimport type { ToolContext } from '../types/context.js';\nimport { createMcpHandler } from './mcp.js';\nimport { createUIRoutes } from './routes.js';\nimport { createViteProxy, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Middleware chain interface\n */\ninterface MiddlewareChain {\n execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown>;\n}\n\n/**\n * Event emitter interface\n */\ninterface TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void;\n}\n\n/**\n * Server configuration\n */\nexport interface ServerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n middlewareChain: MiddlewareChain;\n events: TypedEventEmitter<EventMap>;\n config?: {\n cors?: CorsConfig;\n debug?: boolean;\n serverRoute?: string;\n devServer?: DevServerConfig;\n };\n port: number;\n host: string;\n transport: 'http' | 'stdio' | 'sse';\n}\n\n/**\n * Generate a unique request ID\n */\nfunction generateRequestId(): string {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Create the server instance\n */\nexport async function createServer(config: ServerConfig): Promise<{ close: () => Promise<void> }> {\n const app: Express = express();\n\n // Middleware\n app.use(express.json());\n\n // CORS handling\n if (config.config?.cors) {\n const corsConfig = config.config.cors;\n app.use((req, res, next) => {\n const origin = corsConfig.origin;\n if (origin === true) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof origin === 'string') {\n res.setHeader('Access-Control-Allow-Origin', origin);\n } else if (Array.isArray(origin)) {\n const requestOrigin = req.headers.origin;\n if (requestOrigin && origin.includes(requestOrigin)) {\n res.setHeader('Access-Control-Allow-Origin', requestOrigin);\n }\n }\n\n if (corsConfig.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n if (corsConfig.methods) {\n res.setHeader('Access-Control-Allow-Methods', corsConfig.methods.join(', '));\n }\n if (corsConfig.allowedHeaders) {\n res.setHeader('Access-Control-Allow-Headers', corsConfig.allowedHeaders.join(', '));\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return;\n }\n\n next();\n });\n }\n\n // Development mode: Vite HMR proxy\n if (isDevelopment() && config.config?.devServer) {\n const viteProxy = createViteProxy(config.config.devServer);\n app.use(viteProxy);\n }\n\n // UI serving routes\n const uiRoutes = createUIRoutes(config.uiResources, config.config?.devServer);\n app.use('/ui', uiRoutes);\n\n // Tool execution helper\n const executeTool = async (\n toolName: string,\n input: unknown,\n metadata: Record<string, unknown> = {}\n ): Promise<unknown> => {\n const tool = config.tools.get(toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n const ctx: ToolContext = {\n requestId: generateRequestId(),\n toolName,\n metadata,\n };\n\n const startTime = Date.now();\n\n try {\n const result = await config.middlewareChain.execute(\n { toolName, input, metadata },\n () => tool.handler(input, ctx)\n );\n\n config.events.emit('tool:success', {\n toolName,\n result,\n durationMs: Date.now() - startTime,\n });\n\n return result;\n } catch (error) {\n config.events.emit('tool:error', {\n toolName,\n error: error as Error,\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n };\n\n // MCP endpoint\n const mcpRoute = config.config?.serverRoute ?? '/mcp';\n const mcpHandler = createMcpHandler({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n app.post(mcpRoute, mcpHandler);\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', name: config.name, version: config.version });\n });\n\n // Start server based on transport\n if (config.transport === 'stdio') {\n // Import and start stdio transport\n const { startStdioServer } = await import('./stdio.js');\n return startStdioServer({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n }\n\n // HTTP server\n return new Promise((resolve) => {\n const httpServer = app.listen(config.port, config.host, () => {\n if (config.config?.debug) {\n console.log(`Pancake server \"${config.name}\" running on http://${config.host}:${config.port}`);\n console.log(` MCP endpoint: ${mcpRoute}`);\n console.log(` UI endpoint: /ui/:viewName`);\n console.log(` Tools registered: ${config.tools.size}`);\n }\n\n resolve({\n close: () => new Promise((resolveClose) => {\n httpServer.close(() => resolveClose());\n }),\n });\n });\n });\n}\n","import type { ViewConfig } from './types/view.js';\n\n/**\n * Check if a value is a ViewConfig\n */\nexport function isViewConfig(value: unknown): value is ViewConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'ui' in value\n );\n}\n","import type { ActionConfig } from './types/action.js';\n\n/**\n * Check if a value is an ActionConfig\n */\nexport function isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import type { DataConfig } from './types/data.js';\n\n/**\n * Check if a value is a DataConfig\n */\nexport function isDataConfig(value: unknown): value is DataConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value &&\n !('ui' in value) // No UI means it's data, not view\n );\n}\n","import type { ToolConfig } from './types/tool.js';\n\n/**\n * Check if a value is a ToolConfig\n */\nexport function isToolConfig(value: unknown): value is ToolConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'name' in value &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport type { z } from 'zod';\nimport type { ViewConfig } from './types/view.js';\nimport type { ActionConfig } from './types/action.js';\nimport type { DataConfig } from './types/data.js';\nimport type { ToolConfig, InternalTool } from './types/tool.js';\nimport type { ToolContext } from './types/context.js';\nimport { isViewConfig } from './view.js';\nimport { isActionConfig } from './action.js';\nimport { isDataConfig } from './data.js';\nimport { isToolConfig } from './tool.js';\n\n/**\n * Convert a Zod schema to JSON Schema, handling undefined schemas\n */\nfunction toJsonSchema(schema: z.ZodType | undefined): Record<string, unknown> {\n if (!schema) {\n return { type: 'object', properties: {} };\n }\n return zodToJsonSchema(schema) as Record<string, unknown>;\n}\n\n/**\n * Normalize a view config to an internal tool\n */\nexport function normalizeView(\n name: string,\n config: ViewConfig\n): InternalTool {\n const toolName = `view:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.data),\n handler: async (input: unknown, ctx: ToolContext) => {\n if (config.handler) {\n // Validate input with Zod schema if defined\n const validated = config.input ? config.input.parse(input) : input;\n return config.handler(validated, {\n ...ctx,\n viewName: name,\n });\n }\n // Views without handlers just return empty data\n return {};\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'view',\n };\n}\n\n/**\n * Normalize an action config to an internal tool\n */\nexport function normalizeAction(\n name: string,\n config: ActionConfig\n): InternalTool {\n const toolName = `action:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n actionName: name,\n });\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'action',\n };\n}\n\n/**\n * Normalize a data config to an internal tool\n */\nexport function normalizeData(\n name: string,\n config: DataConfig\n): InternalTool {\n const toolName = `data:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n dataName: name,\n });\n },\n ui: undefined, // Data fetchers don't have UI\n visibility: config.visibility ?? 'both',\n category: 'data',\n };\n}\n\n/**\n * Normalize a tool config to an internal tool\n */\nexport function normalizeTool(\n name: string,\n config: ToolConfig\n): InternalTool {\n return {\n name: config.name || name,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, ctx);\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'tool',\n };\n}\n\n/**\n * Normalize any config to an internal tool based on its type\n */\nexport function normalizeAny(\n name: string,\n config: unknown,\n category?: 'view' | 'action' | 'data' | 'tool'\n): InternalTool {\n if (isViewConfig(config) || category === 'view') {\n return normalizeView(name, config as ViewConfig);\n }\n\n if (isActionConfig(config) || category === 'action') {\n return normalizeAction(name, config as ActionConfig);\n }\n\n if (isDataConfig(config) || category === 'data') {\n return normalizeData(name, config as DataConfig);\n }\n\n if (isToolConfig(config) || category === 'tool') {\n return normalizeTool(name, config as ToolConfig);\n }\n\n throw new Error(\n `Unable to normalize config for \"${name}\". ` +\n `Ensure it has the required properties (description, input, output, handler, etc.).`\n );\n}\n","import type { RequestHandler } from 'express';\nimport type {\n AppConfig,\n App,\n StartOptions,\n Middleware,\n EventMap,\n Plugin,\n PluginContext,\n} from './types/app.js';\nimport type { InternalTool } from './types/tool.js';\nimport type { UIDefinition } from './types/protocol.js';\nimport { normalizeView, normalizeAction, normalizeData, normalizeTool } from './normalizers.js';\n\n/**\n * Event emitter for typed events\n */\nclass TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n private listeners = new Map<keyof TEvents, Set<(payload: unknown) => void>>();\n\n on<K extends keyof TEvents>(\n event: K,\n handler: (payload: TEvents[K]) => void\n ): () => void {\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as (payload: unknown) => void);\n this.listeners.set(event, handlers);\n\n return () => handlers.delete(handler as (payload: unknown) => void);\n }\n\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(payload);\n }\n }\n }\n}\n\n/**\n * Middleware chain implementation\n */\nclass MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n constructor(initial?: Middleware[]) {\n if (initial) {\n this.middlewares = [...initial];\n }\n }\n\n add(middleware: Middleware): void {\n this.middlewares.push(middleware);\n }\n\n async execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown> {\n const state = new Map<string, unknown>();\n const middlewareCtx = { ...ctx, state };\n let index = 0;\n let result: unknown;\n\n const next = async (): Promise<void> => {\n if (index < this.middlewares.length) {\n const mw = this.middlewares[index++];\n await mw(middlewareCtx, next);\n } else {\n result = await handler();\n }\n };\n\n await next();\n return result;\n }\n}\n\n/**\n * Plugin manager for running lifecycle hooks\n */\nclass PluginManager {\n constructor(private plugins: Plugin[] = []) {}\n\n async runHook<K extends 'onInit' | 'onStart' | 'onShutdown'>(\n hook: K,\n context: PluginContext\n ): Promise<void> {\n for (const plugin of this.plugins) {\n const fn = plugin[hook];\n if (typeof fn === 'function') {\n await fn.call(plugin, context);\n }\n }\n }\n}\n\n/**\n * UI resource manager\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create a Pancake application.\n *\n * @example\n * ```ts\n * import { createApp, defineView, defineAction, defineData } from '@pancake-apps/server';\n * import { z } from 'zod';\n *\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * hello: defineView({\n * description: 'Greeting view',\n * input: z.object({ name: z.string() }),\n * ui: { html: './views/hello.html' },\n * }),\n * },\n * actions: {\n * save: defineAction({\n * description: 'Save data',\n * input: z.object({ data: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ data }) => ({ success: true }),\n * }),\n * },\n * });\n *\n * app.start({ port: 3000 });\n * ```\n */\nexport function createApp(config: AppConfig): App {\n // Validate config\n if (!config.name) {\n throw new Error('App name is required');\n }\n if (!config.version) {\n throw new Error('App version is required');\n }\n\n // Initialize event emitter\n const events = new TypedEventEmitter<EventMap>();\n\n // Initialize middleware chain\n const middlewareChain = new MiddlewareChain(config.middleware);\n\n // Initialize plugin manager\n const pluginManager = new PluginManager(config.plugins);\n\n // Normalize all definitions to internal tools\n const tools = new Map<string, InternalTool>();\n const uiResources = new Map<string, UIResource>();\n\n // Register views\n for (const [name, viewConfig] of Object.entries(config.views ?? {})) {\n const tool = normalizeView(name, viewConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource\n if (tool.ui) {\n const uri = `pancake://ui/view/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register actions\n for (const [name, actionConfig] of Object.entries(config.actions ?? {})) {\n const tool = normalizeAction(name, actionConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/action/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register data fetchers\n for (const [name, dataConfig] of Object.entries(config.data ?? {})) {\n const tool = normalizeData(name, dataConfig);\n tools.set(tool.name, tool);\n }\n\n // Register low-level tools\n for (const [name, toolConfig] of Object.entries(config.tools ?? {})) {\n const tool = normalizeTool(name, toolConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/tool/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Emit init event\n events.emit('app:init', { config });\n\n // Server state\n let server: { close: () => Promise<void> } | null = null;\n\n // Create app instance\n const app: App = {\n async start(options: StartOptions = {}) {\n const port = options.port ?? 3000;\n const host = options.host ?? '0.0.0.0';\n const transport = options.transport ?? 'http';\n\n // Run plugin onInit hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onInit', { app: config, plugin });\n }\n\n // Dynamically import server implementation to avoid bundling express in builds\n // that don't need it\n const { createServer } = await import('./server/index.js');\n\n const serverConfig: Parameters<typeof createServer>[0] = {\n name: config.name,\n version: config.version,\n tools,\n uiResources,\n middlewareChain,\n events,\n port,\n host,\n transport,\n };\n if (config.config) {\n const cfg: NonNullable<typeof serverConfig.config> = {};\n if (config.config.cors !== undefined) cfg.cors = config.config.cors;\n if (config.config.debug !== undefined) cfg.debug = config.config.debug;\n if (config.config.serverRoute !== undefined) cfg.serverRoute = config.config.serverRoute;\n if (config.config.devServer !== undefined) cfg.devServer = config.config.devServer;\n serverConfig.config = cfg;\n }\n server = await createServer(serverConfig);\n\n // Run plugin onStart hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onStart', { app: config, plugin });\n }\n\n events.emit('app:start', { port, transport });\n },\n\n async stop() {\n if (server) {\n // Run plugin onShutdown hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onShutdown', { app: config, plugin });\n }\n\n await server.close();\n server = null;\n events.emit('app:shutdown', { graceful: true });\n }\n },\n\n handler(): RequestHandler {\n // Return a placeholder that will be replaced when server starts\n // For integrating with existing Express apps\n return async (_req, _res, next) => {\n next();\n };\n },\n\n async handleRequest(_req: Request): Promise<Response> {\n // For serverless/edge environments\n return new Response('Not implemented', { status: 501 });\n },\n\n use(middleware: Middleware) {\n middlewareChain.add(middleware);\n },\n\n on<K extends keyof EventMap>(\n event: K,\n handler: (payload: EventMap[K]) => void\n ): () => void {\n return events.on(event, handler);\n },\n };\n\n return app;\n}\n","import type { ViewConfig, ActionConfig, DataConfig, ToolConfig } from './types/index.js';\n\n/**\n * Define a view with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myView = defineView({\n * description: 'A greeting view',\n * input: z.object({ name: z.string() }),\n * data: z.object({ greeting: z.string() }),\n * handler: async ({ name }) => ({ greeting: `Hello ${name}!` }),\n * ui: { html: './views/greeting.html' },\n * });\n */\nexport function defineView<T extends ViewConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define an action with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myAction = defineAction({\n * description: 'Send a notification',\n * input: z.object({ message: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ message }) => {\n * await sendNotification(message);\n * return { success: true };\n * },\n * });\n */\nexport function defineAction<T extends ActionConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a data fetcher with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myData = defineData({\n * description: 'Fetch user profile',\n * input: z.object({ userId: z.string() }),\n * output: z.object({ name: z.string(), email: z.string() }),\n * handler: async ({ userId }) => {\n * return await fetchUser(userId);\n * },\n * });\n */\nexport function defineData<T extends DataConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a low-level tool with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myTool = defineTool({\n * description: 'A custom tool',\n * parameters: z.object({ query: z.string() }),\n * handler: async ({ query }) => {\n * return { content: [{ type: 'text', text: `Result for: ${query}` }] };\n * },\n * });\n */\nexport function defineTool<T extends ToolConfig>(config: T): T {\n return config;\n}\n","import * as fs from 'node:fs/promises';\nimport * as fsSync from 'node:fs';\nimport * as path from 'node:path';\nimport type { ViewConfig, ViewMetadata, DiscoveredView } from '../types/view.js';\n\n/**\n * Discover views from a directory.\n *\n * Supports two patterns:\n * 1. Flat files: `views/hello.html` + `views/hello.json`\n * 2. Folder-based: `views/hello/index.html` + `views/hello/metadata.json`\n *\n * @example\n * ```ts\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * ...discoverViews('./src/views'),\n * },\n * });\n * ```\n */\nexport function discoverViews(dir: string): Record<string, ViewConfig> {\n // Return a synchronous-looking object that will be populated\n // We need to use a synchronous approach for the API\n const views: Record<string, ViewConfig> = {};\n\n // Synchronous discovery using Node.js fs sync methods\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = fsSync.readdirSync(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if (fileExistsSync(indexHtml) && fileExistsSync(metadataJson)) {\n const metadata = parseMetadataSync(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (fileExistsSync(metadataPath)) {\n const metadata = parseMetadataSync(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n // Directory might not exist, return empty\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Async version of discoverViews for dynamic usage\n */\nexport async function discoverViewsAsync(dir: string): Promise<Record<string, ViewConfig>> {\n const views: Record<string, ViewConfig> = {};\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if ((await fileExists(indexHtml)) && (await fileExists(metadataJson))) {\n const metadata = await parseMetadata(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (await fileExists(metadataPath)) {\n const metadata = await parseMetadata(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Check if a file exists (async)\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a file exists (sync)\n */\nfunction fileExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Parse metadata JSON file (async)\n */\nasync function parseMetadata(filePath: string): Promise<ViewMetadata> {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Parse metadata JSON file (sync)\n */\nfunction parseMetadataSync(filePath: string): ViewMetadata {\n const content = fsSync.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Create a ViewConfig from discovered files\n */\nfunction createViewFromDiscovery(\n name: string,\n htmlPath: string,\n metadata: ViewMetadata\n): ViewConfig {\n return {\n description: metadata.description,\n // Note: input/data from JSON are JSON Schema, not Zod\n // We'll need to handle this specially in the normalizer\n visibility: metadata.visibility ?? 'both',\n ui: {\n html: htmlPath,\n name,\n },\n };\n}\n\nexport type { DiscoveredView, ViewMetadata };\n"]}
1
+ {"version":3,"sources":["../src/server/mcp.ts","../src/server/dev-proxy.ts","../src/server/routes.ts","../src/server/stdio.ts","../src/server/index.ts","../src/view.ts","../src/action.ts","../src/data.ts","../src/tool.ts","../src/normalizers.ts","../src/app.ts","../src/helpers.ts","../src/discovery/index.ts"],"names":["Router","path","fs","visibilityToAudience","Server","ListToolsRequestSchema","getUIResourceUri","CallToolRequestSchema","ListResourcesRequestSchema","ReadResourceRequestSchema","StdioServerTransport","express","startStdioServer","resolve","zodToJsonSchema","createServer","path2","fsSync","fs2"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { RequestHandler } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * MCP handler configuration\n */\ninterface McpHandlerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n executeTool: (toolName: string, input: unknown, metadata?: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * MCP JSON-RPC request structure\n */\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * MCP JSON-RPC response structure\n */\ninterface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * Convert visibility to MCP audience format\n */\nfunction visibilityToAudience(visibility: 'model' | 'app' | 'both'): string[] {\n switch (visibility) {\n case 'model':\n return ['assistant'];\n case 'app':\n return ['user'];\n case 'both':\n default:\n return ['assistant', 'user'];\n }\n}\n\n/**\n * Create an Express handler for MCP JSON-RPC requests\n */\nexport function createMcpHandler(config: McpHandlerConfig): RequestHandler {\n return async (req, res) => {\n const request = req.body as JsonRpcRequest;\n\n if (request.jsonrpc !== '2.0') {\n res.status(400).json({\n jsonrpc: '2.0',\n id: request.id ?? null,\n error: { code: -32600, message: 'Invalid Request: Not JSON-RPC 2.0' },\n });\n return;\n }\n\n try {\n const result = await handleMethod(config, request.method, request.params ?? {});\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n res.json(response);\n } catch (error) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : 'Internal error',\n data: error instanceof Error ? { stack: error.stack } : undefined,\n },\n };\n res.json(response);\n }\n };\n}\n\n/**\n * Handle MCP method calls\n */\nasync function handleMethod(\n config: McpHandlerConfig,\n method: string,\n params: Record<string, unknown>\n): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n resources: {},\n },\n serverInfo: {\n name: config.name,\n version: config.version,\n },\n };\n\n case 'tools/list':\n return {\n tools: Array.from(config.tools.values())\n // Filter out app-only tools (they shouldn't be visible to the model)\n .filter((tool) => tool.visibility !== 'app')\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n audience: visibilityToAudience(tool.visibility),\n },\n _meta: tool.ui\n ? {\n ui: {\n visibility: visibilityToAudience(tool.visibility),\n resourceUri: getUIResourceUri(tool.name, tool.category),\n },\n }\n : undefined,\n })),\n };\n\n case 'tools/call': {\n const toolName = params['name'] as string;\n const args = (params['arguments'] as Record<string, unknown>) ?? {};\n\n const result = await config.executeTool(toolName, args);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ],\n structuredContent: result,\n };\n }\n\n case 'resources/list':\n return {\n resources: Array.from(config.uiResources.values()).map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n mimeType: 'text/html;profile=mcp-app',\n _meta: {\n ui: {\n prefersBorder: resource.definition.prefersBorder,\n autoResize: resource.definition.autoResize,\n csp: resource.definition.csp,\n },\n },\n })),\n };\n\n case 'resources/read': {\n const uri = params['uri'] as string;\n const resource = config.uiResources.get(uri);\n\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n // Read actual file content\n let htmlContent: string;\n const htmlPath = resource.definition.html;\n\n if (htmlPath.trim().startsWith('<')) {\n // Inline HTML\n htmlContent = htmlPath;\n } else {\n // File path - read content\n const fsPromises = await import('node:fs/promises');\n const pathModule = await import('node:path');\n const fullPath = pathModule.resolve(process.cwd(), htmlPath);\n htmlContent = await fsPromises.readFile(fullPath, 'utf-8');\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: 'text/html',\n text: htmlContent,\n },\n ],\n };\n }\n\n case 'notifications/initialized':\n case 'ping':\n return {};\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n}\n\n/**\n * Get the UI resource URI for a tool\n */\nfunction getUIResourceUri(toolName: string, category: string): string {\n // Extract the name without prefix\n const name = toolName.replace(/^(view|action|data|tool):/, '');\n return `pancake://ui/${category}/${name}`;\n}\n","import type { RequestHandler } from 'express';\nimport type { DevServerConfig } from '../types/app.js';\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n return process.env['NODE_ENV'] !== 'production';\n}\n\n/**\n * Create a proxy middleware for Vite dev server\n */\nexport function createViteProxy(config: DevServerConfig): RequestHandler {\n const vitePort = config.vitePort ?? 5173;\n const viteUrl = `http://localhost:${vitePort}`;\n\n // Paths to proxy to Vite\n const vitePaths = [\n '/@vite/',\n '/@react-refresh',\n '/assets/',\n '/src/',\n '/__vite_ping',\n '/@fs/',\n '/node_modules/.vite/',\n ];\n\n return async (req, res, next) => {\n const shouldProxy = vitePaths.some((p) => req.path.startsWith(p));\n\n if (!shouldProxy) {\n next();\n return;\n }\n\n try {\n // Dynamically import node-fetch for proxying\n const targetUrl = `${viteUrl}${req.url}`;\n const response = await fetch(targetUrl, {\n method: req.method,\n headers: {\n ...Object.fromEntries(\n Object.entries(req.headers).filter(([key]) =>\n !['host', 'connection'].includes(key.toLowerCase())\n )\n ),\n } as Record<string, string>,\n });\n\n // Copy response headers\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n res.status(response.status);\n\n // Stream response body\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) {\n res.end();\n return;\n }\n res.write(Buffer.from(value));\n return pump();\n };\n await pump();\n } else {\n res.end();\n }\n } catch (error) {\n // Vite might not be running, pass through\n if (isDevelopment()) {\n console.warn(`[Pancake] Vite proxy failed for ${req.path}:`, error);\n }\n next();\n }\n };\n}\n\n/**\n * Generate HTML template with Vite HMR support\n */\nexport function generateHMRTemplate(serverUrl: string, viewName: string): string {\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>${viewName}</title>\n <base href=\"${serverUrl}/\" />\n <script type=\"module\">\n import { injectIntoGlobalHook } from \"${serverUrl}/@react-refresh\";\n injectIntoGlobalHook(window);\n window.$RefreshReg$ = () => {};\n window.$RefreshSig$ = () => (type) => type;\n window.__vite_plugin_react_preamble_installed__ = true;\n </script>\n <script type=\"module\" src=\"${serverUrl}/@vite/client\"></script>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\">\n // Initialize Pancake client before loading the view\n import('${serverUrl}/src/pancake-init.ts')\n .then(async (mod) => {\n if (mod.init) await mod.init();\n })\n .catch(() => {\n // pancake-init.ts might not exist, that's ok\n })\n .finally(() => {\n import('${serverUrl}/src/views/${viewName}/index.tsx')\n .catch(() => import('${serverUrl}/src/views/${viewName}.tsx'))\n .catch(() => import('${serverUrl}/src/views/${viewName}/index.ts'))\n .catch(() => import('${serverUrl}/src/views/${viewName}.ts'))\n .catch((err) => {\n console.error('Failed to load view:', err);\n document.body.innerHTML = '<pre style=\"color: red;\">Failed to load view: ' + err.message + '</pre>';\n });\n });\n </script>\n </body>\n</html>`;\n}\n","import { Router } from 'express';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { DevServerConfig } from '../types/app.js';\nimport { generateHMRTemplate, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create routes for serving UI resources\n */\nexport function createUIRoutes(\n uiResources: Map<string, UIResource>,\n devServerConfig?: DevServerConfig\n): Router {\n const router = Router();\n\n // Serve UI by name\n router.get('/:category/:name', async (req, res) => {\n const { category, name } = req.params;\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (!resource) {\n res.status(404).json({ error: `UI not found: ${category}/${name}` });\n return;\n }\n\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Short form: /ui/:name (defaults to view category)\n router.get('/:name', async (req, res) => {\n const { name } = req.params;\n\n // Try view first, then action, then tool\n for (const category of ['view', 'action', 'tool']) {\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (resource) {\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n return;\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n }\n\n res.status(404).json({ error: `UI not found: ${name}` });\n });\n\n return router;\n}\n\n/**\n * Get HTML content for a UI definition\n */\nasync function getUIHtml(\n ui: UIDefinition,\n viewName: string,\n devServerConfig?: DevServerConfig\n): Promise<string> {\n // In development mode, generate HMR template\n if (isDevelopment() && devServerConfig) {\n const vitePort = devServerConfig.vitePort ?? 5173;\n return generateHMRTemplate(`http://localhost:${vitePort}`, viewName);\n }\n\n // Check if html is inline (starts with <)\n if (ui.html.trim().startsWith('<')) {\n return ui.html;\n }\n\n // Otherwise, read from file\n const htmlPath = path.resolve(process.cwd(), ui.html);\n const content = await fs.readFile(htmlPath, 'utf-8');\n return content;\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Stdio server configuration\n */\ninterface StdioServerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n executeTool: (toolName: string, input: unknown, metadata?: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Convert visibility to MCP audience format\n */\nfunction visibilityToAudience(visibility: 'model' | 'app' | 'both'): string[] {\n switch (visibility) {\n case 'model':\n return ['assistant'];\n case 'app':\n return ['user'];\n case 'both':\n default:\n return ['assistant', 'user'];\n }\n}\n\n/**\n * Start the MCP server using stdio transport\n */\nexport async function startStdioServer(\n config: StdioServerConfig\n): Promise<{ close: () => Promise<void> }> {\n const server = new Server(\n {\n name: config.name,\n version: config.version,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n );\n\n // Handle list tools\n server.setRequestHandler(\n ListToolsRequestSchema,\n async () => {\n return {\n tools: Array.from(config.tools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n audience: visibilityToAudience(tool.visibility),\n },\n _meta: tool.ui\n ? {\n ui: {\n visibility: visibilityToAudience(tool.visibility),\n resourceUri: getUIResourceUri(tool.name, tool.category),\n },\n }\n : undefined,\n })),\n };\n }\n );\n\n // Handle call tool\n server.setRequestHandler(\n CallToolRequestSchema,\n async (request) => {\n const { name, arguments: args = {} } = request.params;\n const result = await config.executeTool(name, args);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ],\n structuredContent: result,\n };\n }\n );\n\n // Handle list resources\n server.setRequestHandler(\n ListResourcesRequestSchema,\n async () => {\n return {\n resources: Array.from(config.uiResources.values()).map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n mimeType: 'text/html;profile=mcp-app',\n _meta: {\n ui: {\n prefersBorder: resource.definition.prefersBorder,\n autoResize: resource.definition.autoResize,\n csp: resource.definition.csp,\n },\n },\n })),\n };\n }\n );\n\n // Handle read resource\n server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n const { uri } = request.params;\n const resource = config.uiResources.get(uri);\n\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: 'text/html',\n text: resource.definition.html,\n },\n ],\n };\n }\n );\n\n // Connect to stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return {\n close: async () => {\n await server.close();\n },\n };\n}\n\n/**\n * Get the UI resource URI for a tool\n */\nfunction getUIResourceUri(toolName: string, category: string): string {\n const name = toolName.replace(/^(view|action|data|tool):/, '');\n return `pancake://ui/${category}/${name}`;\n}\n","import express, { type Express } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { EventMap, CorsConfig, DevServerConfig } from '../types/app.js';\nimport type { ToolContext } from '../types/context.js';\nimport { createMcpHandler } from './mcp.js';\nimport { createUIRoutes } from './routes.js';\nimport { createViteProxy, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Middleware chain interface\n */\ninterface MiddlewareChain {\n execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown>;\n}\n\n/**\n * Event emitter interface\n */\ninterface TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void;\n}\n\n/**\n * Server configuration\n */\nexport interface ServerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n middlewareChain: MiddlewareChain;\n events: TypedEventEmitter<EventMap>;\n config?: {\n cors?: CorsConfig;\n debug?: boolean;\n serverRoute?: string;\n devServer?: DevServerConfig;\n };\n port: number;\n host: string;\n transport: 'http' | 'stdio' | 'sse';\n // Names for debug output\n viewNames?: string[];\n actionNames?: string[];\n dataNames?: string[];\n}\n\n/**\n * Generate a unique request ID\n */\nfunction generateRequestId(): string {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Create the server instance\n */\nexport async function createServer(config: ServerConfig): Promise<{ close: () => Promise<void> }> {\n const app: Express = express();\n\n // Middleware\n app.use(express.json());\n\n // CORS handling\n if (config.config?.cors) {\n const corsConfig = config.config.cors;\n app.use((req, res, next) => {\n const origin = corsConfig.origin;\n if (origin === true) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof origin === 'string') {\n res.setHeader('Access-Control-Allow-Origin', origin);\n } else if (Array.isArray(origin)) {\n const requestOrigin = req.headers.origin;\n if (requestOrigin && origin.includes(requestOrigin)) {\n res.setHeader('Access-Control-Allow-Origin', requestOrigin);\n }\n }\n\n if (corsConfig.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n if (corsConfig.methods) {\n res.setHeader('Access-Control-Allow-Methods', corsConfig.methods.join(', '));\n }\n if (corsConfig.allowedHeaders) {\n res.setHeader('Access-Control-Allow-Headers', corsConfig.allowedHeaders.join(', '));\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return;\n }\n\n next();\n });\n }\n\n // Development mode: Vite HMR proxy\n if (isDevelopment() && config.config?.devServer) {\n const viteProxy = createViteProxy(config.config.devServer);\n app.use(viteProxy);\n }\n\n // UI serving routes\n const uiRoutes = createUIRoutes(config.uiResources, config.config?.devServer);\n app.use('/ui', uiRoutes);\n\n // Tool execution helper\n const executeTool = async (\n toolName: string,\n input: unknown,\n metadata: Record<string, unknown> = {}\n ): Promise<unknown> => {\n const tool = config.tools.get(toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n const ctx: ToolContext = {\n requestId: generateRequestId(),\n toolName,\n metadata,\n };\n\n const startTime = Date.now();\n\n try {\n const result = await config.middlewareChain.execute(\n { toolName, input, metadata },\n () => tool.handler(input, ctx)\n );\n\n config.events.emit('tool:success', {\n toolName,\n result,\n durationMs: Date.now() - startTime,\n });\n\n return result;\n } catch (error) {\n config.events.emit('tool:error', {\n toolName,\n error: error as Error,\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n };\n\n // MCP endpoint\n const mcpRoute = config.config?.serverRoute ?? '/mcp';\n const mcpHandler = createMcpHandler({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n app.post(mcpRoute, mcpHandler);\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', name: config.name, version: config.version });\n });\n\n // Start server based on transport\n if (config.transport === 'stdio') {\n // Import and start stdio transport\n const { startStdioServer } = await import('./stdio.js');\n return startStdioServer({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n }\n\n // HTTP server\n return new Promise((resolve) => {\n const httpServer = app.listen(config.port, config.host, () => {\n if (config.config?.debug) {\n const baseUrl = `http://localhost:${config.port}`;\n const viewNames = config.viewNames ?? [];\n const actionNames = config.actionNames ?? [];\n const dataNames = config.dataNames ?? [];\n\n console.log('');\n console.log(` \\x1b[1m\\x1b[32m✓\\x1b[0m \\x1b[1m${config.name}\\x1b[0m is running`);\n console.log('');\n console.log(` \\x1b[2m➜\\x1b[0m \\x1b[1mServer:\\x1b[0m ${baseUrl}`);\n console.log(` \\x1b[2m➜\\x1b[0m \\x1b[1mMCP:\\x1b[0m ${baseUrl}${mcpRoute}`);\n if (viewNames.length > 0) {\n console.log(` \\x1b[2m➜\\x1b[0m \\x1b[1mViews:\\x1b[0m ${viewNames.map(v => `${baseUrl}/ui/${v}`).join('\\n ')}`);\n }\n console.log('');\n console.log(` \\x1b[2mRegistered:\\x1b[0m`);\n console.log(` ${viewNames.length} view${viewNames.length !== 1 ? 's' : ''}${viewNames.length > 0 ? ` (${viewNames.join(', ')})` : ''}`);\n console.log(` ${actionNames.length} action${actionNames.length !== 1 ? 's' : ''}${actionNames.length > 0 ? ` (${actionNames.join(', ')})` : ''}`);\n console.log(` ${dataNames.length} data fetcher${dataNames.length !== 1 ? 's' : ''}${dataNames.length > 0 ? ` (${dataNames.join(', ')})` : ''}`);\n console.log('');\n console.log(` \\x1b[2mNext steps:\\x1b[0m`);\n console.log(` \\x1b[36m1.\\x1b[0m Open a view in your browser: ${baseUrl}/ui/${viewNames[0] || 'yourView'}`);\n console.log(` \\x1b[36m2.\\x1b[0m Connect an MCP client to: ${baseUrl}${mcpRoute}`);\n console.log(` \\x1b[36m3.\\x1b[0m Or use Claude Desktop with this server URL`);\n console.log('');\n }\n\n resolve({\n close: () => new Promise((resolveClose) => {\n httpServer.close(() => resolveClose());\n }),\n });\n });\n });\n}\n","import type { ViewConfig } from './types/view.js';\n\n/**\n * Check if a value is a ViewConfig\n */\nexport function isViewConfig(value: unknown): value is ViewConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'ui' in value\n );\n}\n","import type { ActionConfig } from './types/action.js';\n\n/**\n * Check if a value is an ActionConfig\n */\nexport function isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import type { DataConfig } from './types/data.js';\n\n/**\n * Check if a value is a DataConfig\n */\nexport function isDataConfig(value: unknown): value is DataConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value &&\n !('ui' in value) // No UI means it's data, not view\n );\n}\n","import type { ToolConfig } from './types/tool.js';\n\n/**\n * Check if a value is a ToolConfig\n */\nexport function isToolConfig(value: unknown): value is ToolConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'name' in value &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport type { z } from 'zod';\nimport type { ViewConfig } from './types/view.js';\nimport type { ActionConfig } from './types/action.js';\nimport type { DataConfig } from './types/data.js';\nimport type { ToolConfig, InternalTool } from './types/tool.js';\nimport type { ToolContext } from './types/context.js';\nimport { isViewConfig } from './view.js';\nimport { isActionConfig } from './action.js';\nimport { isDataConfig } from './data.js';\nimport { isToolConfig } from './tool.js';\n\n/**\n * Convert a Zod schema to JSON Schema, handling undefined schemas\n */\nfunction toJsonSchema(schema: z.ZodType | undefined): Record<string, unknown> {\n if (!schema) {\n return { type: 'object', properties: {} };\n }\n return zodToJsonSchema(schema) as Record<string, unknown>;\n}\n\n/**\n * Normalize a view config to an internal tool\n */\nexport function normalizeView(\n name: string,\n config: ViewConfig\n): InternalTool {\n const toolName = `view:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.data),\n handler: async (input: unknown, ctx: ToolContext) => {\n if (config.handler) {\n // Validate input with Zod schema if defined\n const validated = config.input ? config.input.parse(input) : input;\n return config.handler(validated, {\n ...ctx,\n viewName: name,\n });\n }\n // Views without handlers just return empty data\n return {};\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'view',\n };\n}\n\n/**\n * Normalize an action config to an internal tool\n */\nexport function normalizeAction(\n name: string,\n config: ActionConfig\n): InternalTool {\n const toolName = `action:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n actionName: name,\n });\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'action',\n };\n}\n\n/**\n * Normalize a data config to an internal tool\n */\nexport function normalizeData(\n name: string,\n config: DataConfig\n): InternalTool {\n const toolName = `data:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n dataName: name,\n });\n },\n ui: undefined, // Data fetchers don't have UI\n visibility: config.visibility ?? 'both',\n category: 'data',\n };\n}\n\n/**\n * Normalize a tool config to an internal tool\n */\nexport function normalizeTool(\n name: string,\n config: ToolConfig\n): InternalTool {\n return {\n name: config.name || name,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, ctx);\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'tool',\n };\n}\n\n/**\n * Normalize any config to an internal tool based on its type\n */\nexport function normalizeAny(\n name: string,\n config: unknown,\n category?: 'view' | 'action' | 'data' | 'tool'\n): InternalTool {\n if (isViewConfig(config) || category === 'view') {\n return normalizeView(name, config as ViewConfig);\n }\n\n if (isActionConfig(config) || category === 'action') {\n return normalizeAction(name, config as ActionConfig);\n }\n\n if (isDataConfig(config) || category === 'data') {\n return normalizeData(name, config as DataConfig);\n }\n\n if (isToolConfig(config) || category === 'tool') {\n return normalizeTool(name, config as ToolConfig);\n }\n\n throw new Error(\n `Unable to normalize config for \"${name}\". ` +\n `Ensure it has the required properties (description, input, output, handler, etc.).`\n );\n}\n","import type { RequestHandler } from 'express';\nimport type {\n AppConfig,\n App,\n StartOptions,\n Middleware,\n EventMap,\n Plugin,\n PluginContext,\n} from './types/app.js';\nimport type { InternalTool } from './types/tool.js';\nimport type { UIDefinition } from './types/protocol.js';\nimport { normalizeView, normalizeAction, normalizeData, normalizeTool } from './normalizers.js';\n\n/**\n * Event emitter for typed events\n */\nclass TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n private listeners = new Map<keyof TEvents, Set<(payload: unknown) => void>>();\n\n on<K extends keyof TEvents>(\n event: K,\n handler: (payload: TEvents[K]) => void\n ): () => void {\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as (payload: unknown) => void);\n this.listeners.set(event, handlers);\n\n return () => handlers.delete(handler as (payload: unknown) => void);\n }\n\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(payload);\n }\n }\n }\n}\n\n/**\n * Middleware chain implementation\n */\nclass MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n constructor(initial?: Middleware[]) {\n if (initial) {\n this.middlewares = [...initial];\n }\n }\n\n add(middleware: Middleware): void {\n this.middlewares.push(middleware);\n }\n\n async execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown> {\n const state = new Map<string, unknown>();\n const middlewareCtx = { ...ctx, state };\n let index = 0;\n let result: unknown;\n\n const next = async (): Promise<void> => {\n if (index < this.middlewares.length) {\n const mw = this.middlewares[index++];\n await mw(middlewareCtx, next);\n } else {\n result = await handler();\n }\n };\n\n await next();\n return result;\n }\n}\n\n/**\n * Plugin manager for running lifecycle hooks\n */\nclass PluginManager {\n constructor(private plugins: Plugin[] = []) {}\n\n async runHook<K extends 'onInit' | 'onStart' | 'onShutdown'>(\n hook: K,\n context: PluginContext\n ): Promise<void> {\n for (const plugin of this.plugins) {\n const fn = plugin[hook];\n if (typeof fn === 'function') {\n await fn.call(plugin, context);\n }\n }\n }\n}\n\n/**\n * UI resource manager\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create a Pancake application.\n *\n * @example\n * ```ts\n * import { createApp, defineView, defineAction, defineData } from '@pancake-apps/server';\n * import { z } from 'zod';\n *\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * hello: defineView({\n * description: 'Greeting view',\n * input: z.object({ name: z.string() }),\n * ui: { html: './views/hello.html' },\n * }),\n * },\n * actions: {\n * save: defineAction({\n * description: 'Save data',\n * input: z.object({ data: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ data }) => ({ success: true }),\n * }),\n * },\n * });\n *\n * app.start({ port: 3000 });\n * ```\n */\nexport function createApp(config: AppConfig): App {\n // Validate config\n if (!config.name) {\n throw new Error('App name is required');\n }\n if (!config.version) {\n throw new Error('App version is required');\n }\n\n // Initialize event emitter\n const events = new TypedEventEmitter<EventMap>();\n\n // Initialize middleware chain\n const middlewareChain = new MiddlewareChain(config.middleware);\n\n // Initialize plugin manager\n const pluginManager = new PluginManager(config.plugins);\n\n // Normalize all definitions to internal tools\n const tools = new Map<string, InternalTool>();\n const uiResources = new Map<string, UIResource>();\n\n // Register views\n for (const [name, viewConfig] of Object.entries(config.views ?? {})) {\n const tool = normalizeView(name, viewConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource\n if (tool.ui) {\n const uri = `pancake://ui/view/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register actions\n for (const [name, actionConfig] of Object.entries(config.actions ?? {})) {\n const tool = normalizeAction(name, actionConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/action/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register data fetchers\n for (const [name, dataConfig] of Object.entries(config.data ?? {})) {\n const tool = normalizeData(name, dataConfig);\n tools.set(tool.name, tool);\n }\n\n // Register low-level tools\n for (const [name, toolConfig] of Object.entries(config.tools ?? {})) {\n const tool = normalizeTool(name, toolConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/tool/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Emit init event\n events.emit('app:init', { config });\n\n // Server state\n let server: { close: () => Promise<void> } | null = null;\n\n // Create app instance\n const app: App = {\n async start(options: StartOptions = {}) {\n const port = options.port ?? 3000;\n const host = options.host ?? '0.0.0.0';\n const transport = options.transport ?? 'http';\n\n // Run plugin onInit hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onInit', { app: config, plugin });\n }\n\n // Dynamically import server implementation to avoid bundling express in builds\n // that don't need it\n const { createServer } = await import('./server/index.js');\n\n const serverConfig: Parameters<typeof createServer>[0] = {\n name: config.name,\n version: config.version,\n tools,\n uiResources,\n middlewareChain,\n events,\n port,\n host,\n transport,\n viewNames: Object.keys(config.views ?? {}),\n actionNames: Object.keys(config.actions ?? {}),\n dataNames: Object.keys(config.data ?? {}),\n };\n if (config.config) {\n const cfg: NonNullable<typeof serverConfig.config> = {};\n if (config.config.cors !== undefined) cfg.cors = config.config.cors;\n if (config.config.debug !== undefined) cfg.debug = config.config.debug;\n if (config.config.serverRoute !== undefined) cfg.serverRoute = config.config.serverRoute;\n if (config.config.devServer !== undefined) cfg.devServer = config.config.devServer;\n serverConfig.config = cfg;\n }\n server = await createServer(serverConfig);\n\n // Run plugin onStart hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onStart', { app: config, plugin });\n }\n\n events.emit('app:start', { port, transport });\n },\n\n async stop() {\n if (server) {\n // Run plugin onShutdown hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onShutdown', { app: config, plugin });\n }\n\n await server.close();\n server = null;\n events.emit('app:shutdown', { graceful: true });\n }\n },\n\n handler(): RequestHandler {\n // Return a placeholder that will be replaced when server starts\n // For integrating with existing Express apps\n return async (_req, _res, next) => {\n next();\n };\n },\n\n async handleRequest(_req: Request): Promise<Response> {\n // For serverless/edge environments\n return new Response('Not implemented', { status: 501 });\n },\n\n use(middleware: Middleware) {\n middlewareChain.add(middleware);\n },\n\n on<K extends keyof EventMap>(\n event: K,\n handler: (payload: EventMap[K]) => void\n ): () => void {\n return events.on(event, handler);\n },\n };\n\n return app;\n}\n","import type { ViewConfig, ActionConfig, DataConfig, ToolConfig } from './types/index.js';\n\n/**\n * Define a view with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myView = defineView({\n * description: 'A greeting view',\n * input: z.object({ name: z.string() }),\n * data: z.object({ greeting: z.string() }),\n * handler: async ({ name }) => ({ greeting: `Hello ${name}!` }),\n * ui: { html: './views/greeting.html' },\n * });\n */\nexport function defineView<T extends ViewConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define an action with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myAction = defineAction({\n * description: 'Send a notification',\n * input: z.object({ message: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ message }) => {\n * await sendNotification(message);\n * return { success: true };\n * },\n * });\n */\nexport function defineAction<T extends ActionConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a data fetcher with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myData = defineData({\n * description: 'Fetch user profile',\n * input: z.object({ userId: z.string() }),\n * output: z.object({ name: z.string(), email: z.string() }),\n * handler: async ({ userId }) => {\n * return await fetchUser(userId);\n * },\n * });\n */\nexport function defineData<T extends DataConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a low-level tool with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myTool = defineTool({\n * description: 'A custom tool',\n * parameters: z.object({ query: z.string() }),\n * handler: async ({ query }) => {\n * return { content: [{ type: 'text', text: `Result for: ${query}` }] };\n * },\n * });\n */\nexport function defineTool<T extends ToolConfig>(config: T): T {\n return config;\n}\n","import * as fs from 'node:fs/promises';\nimport * as fsSync from 'node:fs';\nimport * as path from 'node:path';\nimport type { ViewConfig, ViewMetadata, DiscoveredView } from '../types/view.js';\n\n/**\n * Discover views from a directory.\n *\n * Supports two patterns:\n * 1. Flat files: `views/hello.html` + `views/hello.json`\n * 2. Folder-based: `views/hello/index.html` + `views/hello/metadata.json`\n *\n * @example\n * ```ts\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * ...discoverViews('./src/views'),\n * },\n * });\n * ```\n */\nexport function discoverViews(dir: string): Record<string, ViewConfig> {\n // Return a synchronous-looking object that will be populated\n // We need to use a synchronous approach for the API\n const views: Record<string, ViewConfig> = {};\n\n // Synchronous discovery using Node.js fs sync methods\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = fsSync.readdirSync(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if (fileExistsSync(indexHtml) && fileExistsSync(metadataJson)) {\n const metadata = parseMetadataSync(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (fileExistsSync(metadataPath)) {\n const metadata = parseMetadataSync(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n // Directory might not exist, return empty\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Async version of discoverViews for dynamic usage\n */\nexport async function discoverViewsAsync(dir: string): Promise<Record<string, ViewConfig>> {\n const views: Record<string, ViewConfig> = {};\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if ((await fileExists(indexHtml)) && (await fileExists(metadataJson))) {\n const metadata = await parseMetadata(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (await fileExists(metadataPath)) {\n const metadata = await parseMetadata(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Check if a file exists (async)\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a file exists (sync)\n */\nfunction fileExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Parse metadata JSON file (async)\n */\nasync function parseMetadata(filePath: string): Promise<ViewMetadata> {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Parse metadata JSON file (sync)\n */\nfunction parseMetadataSync(filePath: string): ViewMetadata {\n const content = fsSync.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Create a ViewConfig from discovered files\n */\nfunction createViewFromDiscovery(\n name: string,\n htmlPath: string,\n metadata: ViewMetadata\n): ViewConfig {\n return {\n description: metadata.description,\n // Note: input/data from JSON are JSON Schema, not Zod\n // We'll need to handle this specially in the normalizer\n visibility: metadata.visibility ?? 'both',\n ui: {\n html: htmlPath,\n name,\n },\n };\n}\n\nexport type { DiscoveredView, ViewMetadata };\n"]}
package/dist/index.js CHANGED
@@ -229,7 +229,7 @@ function createApp(config) {
229
229
  for (const plugin of config.plugins ?? []) {
230
230
  await pluginManager.runHook("onInit", { app: config, plugin });
231
231
  }
232
- const { createServer } = await import('./server-3KHS3VCE.js');
232
+ const { createServer } = await import('./server-Z5QP7DSX.js');
233
233
  const serverConfig = {
234
234
  name: config.name,
235
235
  version: config.version,
@@ -239,7 +239,10 @@ function createApp(config) {
239
239
  events,
240
240
  port,
241
241
  host,
242
- transport
242
+ transport,
243
+ viewNames: Object.keys(config.views ?? {}),
244
+ actionNames: Object.keys(config.actions ?? {}),
245
+ dataNames: Object.keys(config.data ?? {})
243
246
  };
244
247
  if (config.config) {
245
248
  const cfg = {};
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/view.ts","../src/action.ts","../src/data.ts","../src/tool.ts","../src/normalizers.ts","../src/app.ts","../src/helpers.ts","../src/discovery/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ViewConfig } from './types/view.js';\n\n/**\n * Check if a value is a ViewConfig\n */\nexport function isViewConfig(value: unknown): value is ViewConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'ui' in value\n );\n}\n","import type { ActionConfig } from './types/action.js';\n\n/**\n * Check if a value is an ActionConfig\n */\nexport function isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import type { DataConfig } from './types/data.js';\n\n/**\n * Check if a value is a DataConfig\n */\nexport function isDataConfig(value: unknown): value is DataConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value &&\n !('ui' in value) // No UI means it's data, not view\n );\n}\n","import type { ToolConfig } from './types/tool.js';\n\n/**\n * Check if a value is a ToolConfig\n */\nexport function isToolConfig(value: unknown): value is ToolConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'name' in value &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport type { z } from 'zod';\nimport type { ViewConfig } from './types/view.js';\nimport type { ActionConfig } from './types/action.js';\nimport type { DataConfig } from './types/data.js';\nimport type { ToolConfig, InternalTool } from './types/tool.js';\nimport type { ToolContext } from './types/context.js';\nimport { isViewConfig } from './view.js';\nimport { isActionConfig } from './action.js';\nimport { isDataConfig } from './data.js';\nimport { isToolConfig } from './tool.js';\n\n/**\n * Convert a Zod schema to JSON Schema, handling undefined schemas\n */\nfunction toJsonSchema(schema: z.ZodType | undefined): Record<string, unknown> {\n if (!schema) {\n return { type: 'object', properties: {} };\n }\n return zodToJsonSchema(schema) as Record<string, unknown>;\n}\n\n/**\n * Normalize a view config to an internal tool\n */\nexport function normalizeView(\n name: string,\n config: ViewConfig\n): InternalTool {\n const toolName = `view:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.data),\n handler: async (input: unknown, ctx: ToolContext) => {\n if (config.handler) {\n // Validate input with Zod schema if defined\n const validated = config.input ? config.input.parse(input) : input;\n return config.handler(validated, {\n ...ctx,\n viewName: name,\n });\n }\n // Views without handlers just return empty data\n return {};\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'view',\n };\n}\n\n/**\n * Normalize an action config to an internal tool\n */\nexport function normalizeAction(\n name: string,\n config: ActionConfig\n): InternalTool {\n const toolName = `action:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n actionName: name,\n });\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'action',\n };\n}\n\n/**\n * Normalize a data config to an internal tool\n */\nexport function normalizeData(\n name: string,\n config: DataConfig\n): InternalTool {\n const toolName = `data:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n dataName: name,\n });\n },\n ui: undefined, // Data fetchers don't have UI\n visibility: config.visibility ?? 'both',\n category: 'data',\n };\n}\n\n/**\n * Normalize a tool config to an internal tool\n */\nexport function normalizeTool(\n name: string,\n config: ToolConfig\n): InternalTool {\n return {\n name: config.name || name,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, ctx);\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'tool',\n };\n}\n\n/**\n * Normalize any config to an internal tool based on its type\n */\nexport function normalizeAny(\n name: string,\n config: unknown,\n category?: 'view' | 'action' | 'data' | 'tool'\n): InternalTool {\n if (isViewConfig(config) || category === 'view') {\n return normalizeView(name, config as ViewConfig);\n }\n\n if (isActionConfig(config) || category === 'action') {\n return normalizeAction(name, config as ActionConfig);\n }\n\n if (isDataConfig(config) || category === 'data') {\n return normalizeData(name, config as DataConfig);\n }\n\n if (isToolConfig(config) || category === 'tool') {\n return normalizeTool(name, config as ToolConfig);\n }\n\n throw new Error(\n `Unable to normalize config for \"${name}\". ` +\n `Ensure it has the required properties (description, input, output, handler, etc.).`\n );\n}\n","import type { RequestHandler } from 'express';\nimport type {\n AppConfig,\n App,\n StartOptions,\n Middleware,\n EventMap,\n Plugin,\n PluginContext,\n} from './types/app.js';\nimport type { InternalTool } from './types/tool.js';\nimport type { UIDefinition } from './types/protocol.js';\nimport { normalizeView, normalizeAction, normalizeData, normalizeTool } from './normalizers.js';\n\n/**\n * Event emitter for typed events\n */\nclass TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n private listeners = new Map<keyof TEvents, Set<(payload: unknown) => void>>();\n\n on<K extends keyof TEvents>(\n event: K,\n handler: (payload: TEvents[K]) => void\n ): () => void {\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as (payload: unknown) => void);\n this.listeners.set(event, handlers);\n\n return () => handlers.delete(handler as (payload: unknown) => void);\n }\n\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(payload);\n }\n }\n }\n}\n\n/**\n * Middleware chain implementation\n */\nclass MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n constructor(initial?: Middleware[]) {\n if (initial) {\n this.middlewares = [...initial];\n }\n }\n\n add(middleware: Middleware): void {\n this.middlewares.push(middleware);\n }\n\n async execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown> {\n const state = new Map<string, unknown>();\n const middlewareCtx = { ...ctx, state };\n let index = 0;\n let result: unknown;\n\n const next = async (): Promise<void> => {\n if (index < this.middlewares.length) {\n const mw = this.middlewares[index++];\n await mw(middlewareCtx, next);\n } else {\n result = await handler();\n }\n };\n\n await next();\n return result;\n }\n}\n\n/**\n * Plugin manager for running lifecycle hooks\n */\nclass PluginManager {\n constructor(private plugins: Plugin[] = []) {}\n\n async runHook<K extends 'onInit' | 'onStart' | 'onShutdown'>(\n hook: K,\n context: PluginContext\n ): Promise<void> {\n for (const plugin of this.plugins) {\n const fn = plugin[hook];\n if (typeof fn === 'function') {\n await fn.call(plugin, context);\n }\n }\n }\n}\n\n/**\n * UI resource manager\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create a Pancake application.\n *\n * @example\n * ```ts\n * import { createApp, defineView, defineAction, defineData } from '@pancake-apps/server';\n * import { z } from 'zod';\n *\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * hello: defineView({\n * description: 'Greeting view',\n * input: z.object({ name: z.string() }),\n * ui: { html: './views/hello.html' },\n * }),\n * },\n * actions: {\n * save: defineAction({\n * description: 'Save data',\n * input: z.object({ data: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ data }) => ({ success: true }),\n * }),\n * },\n * });\n *\n * app.start({ port: 3000 });\n * ```\n */\nexport function createApp(config: AppConfig): App {\n // Validate config\n if (!config.name) {\n throw new Error('App name is required');\n }\n if (!config.version) {\n throw new Error('App version is required');\n }\n\n // Initialize event emitter\n const events = new TypedEventEmitter<EventMap>();\n\n // Initialize middleware chain\n const middlewareChain = new MiddlewareChain(config.middleware);\n\n // Initialize plugin manager\n const pluginManager = new PluginManager(config.plugins);\n\n // Normalize all definitions to internal tools\n const tools = new Map<string, InternalTool>();\n const uiResources = new Map<string, UIResource>();\n\n // Register views\n for (const [name, viewConfig] of Object.entries(config.views ?? {})) {\n const tool = normalizeView(name, viewConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource\n if (tool.ui) {\n const uri = `pancake://ui/view/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register actions\n for (const [name, actionConfig] of Object.entries(config.actions ?? {})) {\n const tool = normalizeAction(name, actionConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/action/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register data fetchers\n for (const [name, dataConfig] of Object.entries(config.data ?? {})) {\n const tool = normalizeData(name, dataConfig);\n tools.set(tool.name, tool);\n }\n\n // Register low-level tools\n for (const [name, toolConfig] of Object.entries(config.tools ?? {})) {\n const tool = normalizeTool(name, toolConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/tool/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Emit init event\n events.emit('app:init', { config });\n\n // Server state\n let server: { close: () => Promise<void> } | null = null;\n\n // Create app instance\n const app: App = {\n async start(options: StartOptions = {}) {\n const port = options.port ?? 3000;\n const host = options.host ?? '0.0.0.0';\n const transport = options.transport ?? 'http';\n\n // Run plugin onInit hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onInit', { app: config, plugin });\n }\n\n // Dynamically import server implementation to avoid bundling express in builds\n // that don't need it\n const { createServer } = await import('./server/index.js');\n\n const serverConfig: Parameters<typeof createServer>[0] = {\n name: config.name,\n version: config.version,\n tools,\n uiResources,\n middlewareChain,\n events,\n port,\n host,\n transport,\n };\n if (config.config) {\n const cfg: NonNullable<typeof serverConfig.config> = {};\n if (config.config.cors !== undefined) cfg.cors = config.config.cors;\n if (config.config.debug !== undefined) cfg.debug = config.config.debug;\n if (config.config.serverRoute !== undefined) cfg.serverRoute = config.config.serverRoute;\n if (config.config.devServer !== undefined) cfg.devServer = config.config.devServer;\n serverConfig.config = cfg;\n }\n server = await createServer(serverConfig);\n\n // Run plugin onStart hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onStart', { app: config, plugin });\n }\n\n events.emit('app:start', { port, transport });\n },\n\n async stop() {\n if (server) {\n // Run plugin onShutdown hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onShutdown', { app: config, plugin });\n }\n\n await server.close();\n server = null;\n events.emit('app:shutdown', { graceful: true });\n }\n },\n\n handler(): RequestHandler {\n // Return a placeholder that will be replaced when server starts\n // For integrating with existing Express apps\n return async (_req, _res, next) => {\n next();\n };\n },\n\n async handleRequest(_req: Request): Promise<Response> {\n // For serverless/edge environments\n return new Response('Not implemented', { status: 501 });\n },\n\n use(middleware: Middleware) {\n middlewareChain.add(middleware);\n },\n\n on<K extends keyof EventMap>(\n event: K,\n handler: (payload: EventMap[K]) => void\n ): () => void {\n return events.on(event, handler);\n },\n };\n\n return app;\n}\n","import type { ViewConfig, ActionConfig, DataConfig, ToolConfig } from './types/index.js';\n\n/**\n * Define a view with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myView = defineView({\n * description: 'A greeting view',\n * input: z.object({ name: z.string() }),\n * data: z.object({ greeting: z.string() }),\n * handler: async ({ name }) => ({ greeting: `Hello ${name}!` }),\n * ui: { html: './views/greeting.html' },\n * });\n */\nexport function defineView<T extends ViewConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define an action with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myAction = defineAction({\n * description: 'Send a notification',\n * input: z.object({ message: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ message }) => {\n * await sendNotification(message);\n * return { success: true };\n * },\n * });\n */\nexport function defineAction<T extends ActionConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a data fetcher with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myData = defineData({\n * description: 'Fetch user profile',\n * input: z.object({ userId: z.string() }),\n * output: z.object({ name: z.string(), email: z.string() }),\n * handler: async ({ userId }) => {\n * return await fetchUser(userId);\n * },\n * });\n */\nexport function defineData<T extends DataConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a low-level tool with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myTool = defineTool({\n * description: 'A custom tool',\n * parameters: z.object({ query: z.string() }),\n * handler: async ({ query }) => {\n * return { content: [{ type: 'text', text: `Result for: ${query}` }] };\n * },\n * });\n */\nexport function defineTool<T extends ToolConfig>(config: T): T {\n return config;\n}\n","import * as fs from 'node:fs/promises';\nimport * as fsSync from 'node:fs';\nimport * as path from 'node:path';\nimport type { ViewConfig, ViewMetadata, DiscoveredView } from '../types/view.js';\n\n/**\n * Discover views from a directory.\n *\n * Supports two patterns:\n * 1. Flat files: `views/hello.html` + `views/hello.json`\n * 2. Folder-based: `views/hello/index.html` + `views/hello/metadata.json`\n *\n * @example\n * ```ts\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * ...discoverViews('./src/views'),\n * },\n * });\n * ```\n */\nexport function discoverViews(dir: string): Record<string, ViewConfig> {\n // Return a synchronous-looking object that will be populated\n // We need to use a synchronous approach for the API\n const views: Record<string, ViewConfig> = {};\n\n // Synchronous discovery using Node.js fs sync methods\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = fsSync.readdirSync(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if (fileExistsSync(indexHtml) && fileExistsSync(metadataJson)) {\n const metadata = parseMetadataSync(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (fileExistsSync(metadataPath)) {\n const metadata = parseMetadataSync(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n // Directory might not exist, return empty\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Async version of discoverViews for dynamic usage\n */\nexport async function discoverViewsAsync(dir: string): Promise<Record<string, ViewConfig>> {\n const views: Record<string, ViewConfig> = {};\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if ((await fileExists(indexHtml)) && (await fileExists(metadataJson))) {\n const metadata = await parseMetadata(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (await fileExists(metadataPath)) {\n const metadata = await parseMetadata(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Check if a file exists (async)\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a file exists (sync)\n */\nfunction fileExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Parse metadata JSON file (async)\n */\nasync function parseMetadata(filePath: string): Promise<ViewMetadata> {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Parse metadata JSON file (sync)\n */\nfunction parseMetadataSync(filePath: string): ViewMetadata {\n const content = fsSync.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Create a ViewConfig from discovered files\n */\nfunction createViewFromDiscovery(\n name: string,\n htmlPath: string,\n metadata: ViewMetadata\n): ViewConfig {\n return {\n description: metadata.description,\n // Note: input/data from JSON are JSON Schema, not Zod\n // We'll need to handle this specially in the normalizer\n visibility: metadata.visibility ?? 'both',\n ui: {\n html: htmlPath,\n name,\n },\n };\n}\n\nexport type { DiscoveredView, ViewMetadata };\n"]}
1
+ {"version":3,"sources":["../src/view.ts","../src/action.ts","../src/data.ts","../src/tool.ts","../src/normalizers.ts","../src/app.ts","../src/helpers.ts","../src/discovery/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ViewConfig } from './types/view.js';\n\n/**\n * Check if a value is a ViewConfig\n */\nexport function isViewConfig(value: unknown): value is ViewConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'ui' in value\n );\n}\n","import type { ActionConfig } from './types/action.js';\n\n/**\n * Check if a value is an ActionConfig\n */\nexport function isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import type { DataConfig } from './types/data.js';\n\n/**\n * Check if a value is a DataConfig\n */\nexport function isDataConfig(value: unknown): value is DataConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value &&\n !('ui' in value) // No UI means it's data, not view\n );\n}\n","import type { ToolConfig } from './types/tool.js';\n\n/**\n * Check if a value is a ToolConfig\n */\nexport function isToolConfig(value: unknown): value is ToolConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'name' in value &&\n 'description' in value &&\n 'input' in value &&\n 'output' in value &&\n 'handler' in value\n );\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport type { z } from 'zod';\nimport type { ViewConfig } from './types/view.js';\nimport type { ActionConfig } from './types/action.js';\nimport type { DataConfig } from './types/data.js';\nimport type { ToolConfig, InternalTool } from './types/tool.js';\nimport type { ToolContext } from './types/context.js';\nimport { isViewConfig } from './view.js';\nimport { isActionConfig } from './action.js';\nimport { isDataConfig } from './data.js';\nimport { isToolConfig } from './tool.js';\n\n/**\n * Convert a Zod schema to JSON Schema, handling undefined schemas\n */\nfunction toJsonSchema(schema: z.ZodType | undefined): Record<string, unknown> {\n if (!schema) {\n return { type: 'object', properties: {} };\n }\n return zodToJsonSchema(schema) as Record<string, unknown>;\n}\n\n/**\n * Normalize a view config to an internal tool\n */\nexport function normalizeView(\n name: string,\n config: ViewConfig\n): InternalTool {\n const toolName = `view:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.data),\n handler: async (input: unknown, ctx: ToolContext) => {\n if (config.handler) {\n // Validate input with Zod schema if defined\n const validated = config.input ? config.input.parse(input) : input;\n return config.handler(validated, {\n ...ctx,\n viewName: name,\n });\n }\n // Views without handlers just return empty data\n return {};\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'view',\n };\n}\n\n/**\n * Normalize an action config to an internal tool\n */\nexport function normalizeAction(\n name: string,\n config: ActionConfig\n): InternalTool {\n const toolName = `action:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n actionName: name,\n });\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'action',\n };\n}\n\n/**\n * Normalize a data config to an internal tool\n */\nexport function normalizeData(\n name: string,\n config: DataConfig\n): InternalTool {\n const toolName = `data:${name}`;\n\n return {\n name: toolName,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, {\n ...ctx,\n dataName: name,\n });\n },\n ui: undefined, // Data fetchers don't have UI\n visibility: config.visibility ?? 'both',\n category: 'data',\n };\n}\n\n/**\n * Normalize a tool config to an internal tool\n */\nexport function normalizeTool(\n name: string,\n config: ToolConfig\n): InternalTool {\n return {\n name: config.name || name,\n description: config.description,\n inputSchema: toJsonSchema(config.input),\n outputSchema: toJsonSchema(config.output),\n handler: async (input: unknown, ctx: ToolContext) => {\n // Validate input with Zod schema\n const validated = config.input.parse(input);\n return config.handler(validated, ctx);\n },\n ui: config.ui,\n visibility: config.visibility ?? 'both',\n category: 'tool',\n };\n}\n\n/**\n * Normalize any config to an internal tool based on its type\n */\nexport function normalizeAny(\n name: string,\n config: unknown,\n category?: 'view' | 'action' | 'data' | 'tool'\n): InternalTool {\n if (isViewConfig(config) || category === 'view') {\n return normalizeView(name, config as ViewConfig);\n }\n\n if (isActionConfig(config) || category === 'action') {\n return normalizeAction(name, config as ActionConfig);\n }\n\n if (isDataConfig(config) || category === 'data') {\n return normalizeData(name, config as DataConfig);\n }\n\n if (isToolConfig(config) || category === 'tool') {\n return normalizeTool(name, config as ToolConfig);\n }\n\n throw new Error(\n `Unable to normalize config for \"${name}\". ` +\n `Ensure it has the required properties (description, input, output, handler, etc.).`\n );\n}\n","import type { RequestHandler } from 'express';\nimport type {\n AppConfig,\n App,\n StartOptions,\n Middleware,\n EventMap,\n Plugin,\n PluginContext,\n} from './types/app.js';\nimport type { InternalTool } from './types/tool.js';\nimport type { UIDefinition } from './types/protocol.js';\nimport { normalizeView, normalizeAction, normalizeData, normalizeTool } from './normalizers.js';\n\n/**\n * Event emitter for typed events\n */\nclass TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n private listeners = new Map<keyof TEvents, Set<(payload: unknown) => void>>();\n\n on<K extends keyof TEvents>(\n event: K,\n handler: (payload: TEvents[K]) => void\n ): () => void {\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as (payload: unknown) => void);\n this.listeners.set(event, handlers);\n\n return () => handlers.delete(handler as (payload: unknown) => void);\n }\n\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(payload);\n }\n }\n }\n}\n\n/**\n * Middleware chain implementation\n */\nclass MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n constructor(initial?: Middleware[]) {\n if (initial) {\n this.middlewares = [...initial];\n }\n }\n\n add(middleware: Middleware): void {\n this.middlewares.push(middleware);\n }\n\n async execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown> {\n const state = new Map<string, unknown>();\n const middlewareCtx = { ...ctx, state };\n let index = 0;\n let result: unknown;\n\n const next = async (): Promise<void> => {\n if (index < this.middlewares.length) {\n const mw = this.middlewares[index++];\n await mw(middlewareCtx, next);\n } else {\n result = await handler();\n }\n };\n\n await next();\n return result;\n }\n}\n\n/**\n * Plugin manager for running lifecycle hooks\n */\nclass PluginManager {\n constructor(private plugins: Plugin[] = []) {}\n\n async runHook<K extends 'onInit' | 'onStart' | 'onShutdown'>(\n hook: K,\n context: PluginContext\n ): Promise<void> {\n for (const plugin of this.plugins) {\n const fn = plugin[hook];\n if (typeof fn === 'function') {\n await fn.call(plugin, context);\n }\n }\n }\n}\n\n/**\n * UI resource manager\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create a Pancake application.\n *\n * @example\n * ```ts\n * import { createApp, defineView, defineAction, defineData } from '@pancake-apps/server';\n * import { z } from 'zod';\n *\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * hello: defineView({\n * description: 'Greeting view',\n * input: z.object({ name: z.string() }),\n * ui: { html: './views/hello.html' },\n * }),\n * },\n * actions: {\n * save: defineAction({\n * description: 'Save data',\n * input: z.object({ data: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ data }) => ({ success: true }),\n * }),\n * },\n * });\n *\n * app.start({ port: 3000 });\n * ```\n */\nexport function createApp(config: AppConfig): App {\n // Validate config\n if (!config.name) {\n throw new Error('App name is required');\n }\n if (!config.version) {\n throw new Error('App version is required');\n }\n\n // Initialize event emitter\n const events = new TypedEventEmitter<EventMap>();\n\n // Initialize middleware chain\n const middlewareChain = new MiddlewareChain(config.middleware);\n\n // Initialize plugin manager\n const pluginManager = new PluginManager(config.plugins);\n\n // Normalize all definitions to internal tools\n const tools = new Map<string, InternalTool>();\n const uiResources = new Map<string, UIResource>();\n\n // Register views\n for (const [name, viewConfig] of Object.entries(config.views ?? {})) {\n const tool = normalizeView(name, viewConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource\n if (tool.ui) {\n const uri = `pancake://ui/view/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register actions\n for (const [name, actionConfig] of Object.entries(config.actions ?? {})) {\n const tool = normalizeAction(name, actionConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/action/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Register data fetchers\n for (const [name, dataConfig] of Object.entries(config.data ?? {})) {\n const tool = normalizeData(name, dataConfig);\n tools.set(tool.name, tool);\n }\n\n // Register low-level tools\n for (const [name, toolConfig] of Object.entries(config.tools ?? {})) {\n const tool = normalizeTool(name, toolConfig);\n tools.set(tool.name, tool);\n\n // Register UI resource if present\n if (tool.ui) {\n const uri = `pancake://ui/tool/${name}`;\n uiResources.set(uri, {\n name,\n uri,\n definition: tool.ui,\n });\n }\n }\n\n // Emit init event\n events.emit('app:init', { config });\n\n // Server state\n let server: { close: () => Promise<void> } | null = null;\n\n // Create app instance\n const app: App = {\n async start(options: StartOptions = {}) {\n const port = options.port ?? 3000;\n const host = options.host ?? '0.0.0.0';\n const transport = options.transport ?? 'http';\n\n // Run plugin onInit hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onInit', { app: config, plugin });\n }\n\n // Dynamically import server implementation to avoid bundling express in builds\n // that don't need it\n const { createServer } = await import('./server/index.js');\n\n const serverConfig: Parameters<typeof createServer>[0] = {\n name: config.name,\n version: config.version,\n tools,\n uiResources,\n middlewareChain,\n events,\n port,\n host,\n transport,\n viewNames: Object.keys(config.views ?? {}),\n actionNames: Object.keys(config.actions ?? {}),\n dataNames: Object.keys(config.data ?? {}),\n };\n if (config.config) {\n const cfg: NonNullable<typeof serverConfig.config> = {};\n if (config.config.cors !== undefined) cfg.cors = config.config.cors;\n if (config.config.debug !== undefined) cfg.debug = config.config.debug;\n if (config.config.serverRoute !== undefined) cfg.serverRoute = config.config.serverRoute;\n if (config.config.devServer !== undefined) cfg.devServer = config.config.devServer;\n serverConfig.config = cfg;\n }\n server = await createServer(serverConfig);\n\n // Run plugin onStart hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onStart', { app: config, plugin });\n }\n\n events.emit('app:start', { port, transport });\n },\n\n async stop() {\n if (server) {\n // Run plugin onShutdown hooks\n for (const plugin of config.plugins ?? []) {\n await pluginManager.runHook('onShutdown', { app: config, plugin });\n }\n\n await server.close();\n server = null;\n events.emit('app:shutdown', { graceful: true });\n }\n },\n\n handler(): RequestHandler {\n // Return a placeholder that will be replaced when server starts\n // For integrating with existing Express apps\n return async (_req, _res, next) => {\n next();\n };\n },\n\n async handleRequest(_req: Request): Promise<Response> {\n // For serverless/edge environments\n return new Response('Not implemented', { status: 501 });\n },\n\n use(middleware: Middleware) {\n middlewareChain.add(middleware);\n },\n\n on<K extends keyof EventMap>(\n event: K,\n handler: (payload: EventMap[K]) => void\n ): () => void {\n return events.on(event, handler);\n },\n };\n\n return app;\n}\n","import type { ViewConfig, ActionConfig, DataConfig, ToolConfig } from './types/index.js';\n\n/**\n * Define a view with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myView = defineView({\n * description: 'A greeting view',\n * input: z.object({ name: z.string() }),\n * data: z.object({ greeting: z.string() }),\n * handler: async ({ name }) => ({ greeting: `Hello ${name}!` }),\n * ui: { html: './views/greeting.html' },\n * });\n */\nexport function defineView<T extends ViewConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define an action with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myAction = defineAction({\n * description: 'Send a notification',\n * input: z.object({ message: z.string() }),\n * output: z.object({ success: z.boolean() }),\n * handler: async ({ message }) => {\n * await sendNotification(message);\n * return { success: true };\n * },\n * });\n */\nexport function defineAction<T extends ActionConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a data fetcher with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myData = defineData({\n * description: 'Fetch user profile',\n * input: z.object({ userId: z.string() }),\n * output: z.object({ name: z.string(), email: z.string() }),\n * handler: async ({ userId }) => {\n * return await fetchUser(userId);\n * },\n * });\n */\nexport function defineData<T extends DataConfig>(config: T): T {\n return config;\n}\n\n/**\n * Define a low-level tool with full type inference.\n * This is an identity function that provides type checking and autocomplete.\n *\n * @example\n * const myTool = defineTool({\n * description: 'A custom tool',\n * parameters: z.object({ query: z.string() }),\n * handler: async ({ query }) => {\n * return { content: [{ type: 'text', text: `Result for: ${query}` }] };\n * },\n * });\n */\nexport function defineTool<T extends ToolConfig>(config: T): T {\n return config;\n}\n","import * as fs from 'node:fs/promises';\nimport * as fsSync from 'node:fs';\nimport * as path from 'node:path';\nimport type { ViewConfig, ViewMetadata, DiscoveredView } from '../types/view.js';\n\n/**\n * Discover views from a directory.\n *\n * Supports two patterns:\n * 1. Flat files: `views/hello.html` + `views/hello.json`\n * 2. Folder-based: `views/hello/index.html` + `views/hello/metadata.json`\n *\n * @example\n * ```ts\n * const app = createApp({\n * name: 'my-app',\n * version: '1.0.0',\n * views: {\n * ...discoverViews('./src/views'),\n * },\n * });\n * ```\n */\nexport function discoverViews(dir: string): Record<string, ViewConfig> {\n // Return a synchronous-looking object that will be populated\n // We need to use a synchronous approach for the API\n const views: Record<string, ViewConfig> = {};\n\n // Synchronous discovery using Node.js fs sync methods\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = fsSync.readdirSync(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if (fileExistsSync(indexHtml) && fileExistsSync(metadataJson)) {\n const metadata = parseMetadataSync(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (fileExistsSync(metadataPath)) {\n const metadata = parseMetadataSync(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n // Directory might not exist, return empty\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Async version of discoverViews for dynamic usage\n */\nexport async function discoverViewsAsync(dir: string): Promise<Record<string, ViewConfig>> {\n const views: Record<string, ViewConfig> = {};\n const absoluteDir = path.resolve(process.cwd(), dir);\n\n try {\n const entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Pattern 2: views/xxx/index.html + metadata.json\n const indexHtml = path.join(absoluteDir, entry.name, 'index.html');\n const metadataJson = path.join(absoluteDir, entry.name, 'metadata.json');\n\n if ((await fileExists(indexHtml)) && (await fileExists(metadataJson))) {\n const metadata = await parseMetadata(metadataJson);\n views[entry.name] = createViewFromDiscovery(entry.name, indexHtml, metadata);\n }\n } else if (entry.name.endsWith('.html')) {\n // Pattern 1: views/xxx.html + xxx.json\n const baseName = entry.name.replace('.html', '');\n const metadataPath = path.join(absoluteDir, `${baseName}.json`);\n const htmlPath = path.join(absoluteDir, entry.name);\n\n if (await fileExists(metadataPath)) {\n const metadata = await parseMetadata(metadataPath);\n views[baseName] = createViewFromDiscovery(baseName, htmlPath, metadata);\n }\n }\n }\n } catch (error) {\n console.warn(`[Pancake] Could not discover views from ${dir}:`, error);\n }\n\n return views;\n}\n\n/**\n * Check if a file exists (async)\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a file exists (sync)\n */\nfunction fileExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Parse metadata JSON file (async)\n */\nasync function parseMetadata(filePath: string): Promise<ViewMetadata> {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Parse metadata JSON file (sync)\n */\nfunction parseMetadataSync(filePath: string): ViewMetadata {\n const content = fsSync.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as ViewMetadata;\n}\n\n/**\n * Create a ViewConfig from discovered files\n */\nfunction createViewFromDiscovery(\n name: string,\n htmlPath: string,\n metadata: ViewMetadata\n): ViewConfig {\n return {\n description: metadata.description,\n // Note: input/data from JSON are JSON Schema, not Zod\n // We'll need to handle this specially in the normalizer\n visibility: metadata.visibility ?? 'both',\n ui: {\n html: htmlPath,\n name,\n },\n };\n}\n\nexport type { DiscoveredView, ViewMetadata };\n"]}
@@ -407,10 +407,29 @@ async function createServer(config) {
407
407
  return new Promise((resolve2) => {
408
408
  const httpServer = app.listen(config.port, config.host, () => {
409
409
  if (config.config?.debug) {
410
- console.log(`Pancake server "${config.name}" running on http://${config.host}:${config.port}`);
411
- console.log(` MCP endpoint: ${mcpRoute}`);
412
- console.log(` UI endpoint: /ui/:viewName`);
413
- console.log(` Tools registered: ${config.tools.size}`);
410
+ const baseUrl = `http://localhost:${config.port}`;
411
+ const viewNames = config.viewNames ?? [];
412
+ const actionNames = config.actionNames ?? [];
413
+ const dataNames = config.dataNames ?? [];
414
+ console.log("");
415
+ console.log(` \x1B[1m\x1B[32m\u2713\x1B[0m \x1B[1m${config.name}\x1B[0m is running`);
416
+ console.log("");
417
+ console.log(` \x1B[2m\u279C\x1B[0m \x1B[1mServer:\x1B[0m ${baseUrl}`);
418
+ console.log(` \x1B[2m\u279C\x1B[0m \x1B[1mMCP:\x1B[0m ${baseUrl}${mcpRoute}`);
419
+ if (viewNames.length > 0) {
420
+ console.log(` \x1B[2m\u279C\x1B[0m \x1B[1mViews:\x1B[0m ${viewNames.map((v) => `${baseUrl}/ui/${v}`).join("\n ")}`);
421
+ }
422
+ console.log("");
423
+ console.log(` \x1B[2mRegistered:\x1B[0m`);
424
+ console.log(` ${viewNames.length} view${viewNames.length !== 1 ? "s" : ""}${viewNames.length > 0 ? ` (${viewNames.join(", ")})` : ""}`);
425
+ console.log(` ${actionNames.length} action${actionNames.length !== 1 ? "s" : ""}${actionNames.length > 0 ? ` (${actionNames.join(", ")})` : ""}`);
426
+ console.log(` ${dataNames.length} data fetcher${dataNames.length !== 1 ? "s" : ""}${dataNames.length > 0 ? ` (${dataNames.join(", ")})` : ""}`);
427
+ console.log("");
428
+ console.log(` \x1B[2mNext steps:\x1B[0m`);
429
+ console.log(` \x1B[36m1.\x1B[0m Open a view in your browser: ${baseUrl}/ui/${viewNames[0] || "yourView"}`);
430
+ console.log(` \x1B[36m2.\x1B[0m Connect an MCP client to: ${baseUrl}${mcpRoute}`);
431
+ console.log(` \x1B[36m3.\x1B[0m Or use Claude Desktop with this server URL`);
432
+ console.log("");
414
433
  }
415
434
  resolve2({
416
435
  close: () => new Promise((resolveClose) => {
@@ -422,5 +441,5 @@ async function createServer(config) {
422
441
  }
423
442
 
424
443
  export { createServer };
425
- //# sourceMappingURL=server-3KHS3VCE.js.map
426
- //# sourceMappingURL=server-3KHS3VCE.js.map
444
+ //# sourceMappingURL=server-Z5QP7DSX.js.map
445
+ //# sourceMappingURL=server-Z5QP7DSX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/mcp.ts","../src/server/dev-proxy.ts","../src/server/routes.ts","../src/server/index.ts"],"names":["resolve"],"mappings":";;;;;;;AAmDA,SAAS,qBAAqB,UAAA,EAAgD;AAC5E,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,WAAW,CAAA;AAAA,IACrB,KAAK,KAAA;AACH,MAAA,OAAO,CAAC,MAAM,CAAA;AAAA,IAChB,KAAK,MAAA;AAAA,IACL;AACE,MAAA,OAAO,CAAC,aAAa,MAAM,CAAA;AAAA;AAEjC;AAKO,SAAS,iBAAiB,MAAA,EAA0C;AACzE,EAAA,OAAO,OAAO,KAAK,GAAA,KAAQ;AACzB,IAAA,MAAM,UAAU,GAAA,CAAI,IAAA;AAEpB,IAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC7B,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,OAAA,EAAS,KAAA;AAAA,QACT,EAAA,EAAI,QAAQ,EAAA,IAAM,IAAA;AAAA,QAClB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,mCAAA;AAAoC,OACrE,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,MAAA,EAAQ,QAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA;AAC9E,MAAA,MAAM,QAAA,GAA4B;AAAA,QAChC,OAAA,EAAS,KAAA;AAAA,QACT,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAA4B;AAAA,QAChC,OAAA,EAAS,KAAA;AAAA,QACT,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gBAAA;AAAA,UAClD,MAAM,KAAA,YAAiB,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,OAAM,GAAI;AAAA;AAC1D,OACF;AACA,MAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AACF;AAKA,eAAe,YAAA,CACb,MAAA,EACA,MAAA,EACA,MAAA,EACkB;AAClB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,YAAA;AAAA,QACjB,YAAA,EAAc;AAAA,UACZ,OAAO,EAAC;AAAA,UACR,WAAW;AAAC,SACd;AAAA,QACA,UAAA,EAAY;AAAA,UACV,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAS,MAAA,CAAO;AAAA;AAClB,OACF;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAEpC,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,UAAA,KAAe,KAAK,CAAA,CAC1C,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UACd,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAA,EAAa;AAAA,YACX,QAAA,EAAU,oBAAA,CAAqB,IAAA,CAAK,UAAU;AAAA,WAChD;AAAA,UACA,KAAA,EAAO,KAAK,EAAA,GACR;AAAA,YACE,EAAA,EAAI;AAAA,cACF,UAAA,EAAY,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA;AAAA,cAChD,WAAA,EAAa,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,KAAK,QAAQ;AAAA;AACxD,WACF,GACA;AAAA,SACN,CAAE;AAAA,OACN;AAAA,IAEF,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,QAAA,GAAW,OAAO,MAAM,CAAA;AAC9B,MAAA,MAAM,IAAA,GAAQ,MAAA,CAAO,WAAW,CAAA,IAAiC,EAAC;AAElE,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,WAAA,CAAY,UAAU,IAAI,CAAA;AAEtD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA;AAC7B,SACF;AAAA,QACA,iBAAA,EAAmB;AAAA,OACrB;AAAA,IACF;AAAA,IAEA,KAAK,gBAAA;AACH,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,UACpE,KAAK,QAAA,CAAS,GAAA;AAAA,UACd,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,QAAA,EAAU,2BAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,EAAA,EAAI;AAAA,cACF,aAAA,EAAe,SAAS,UAAA,CAAW,aAAA;AAAA,cACnC,UAAA,EAAY,SAAS,UAAA,CAAW,UAAA;AAAA,cAChC,GAAA,EAAK,SAAS,UAAA,CAAW;AAAA;AAC3B;AACF,SACF,CAAE;AAAA,OACJ;AAAA,IAEF,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAE3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAAA,MAC9C;AAGA,MAAA,IAAI,WAAA;AACJ,MAAA,MAAM,QAAA,GAAW,SAAS,UAAA,CAAW,IAAA;AAErC,MAAA,IAAI,QAAA,CAAS,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAEnC,QAAA,WAAA,GAAc,QAAA;AAAA,MAChB,CAAA,MAAO;AAEL,QAAA,MAAM,UAAA,GAAa,MAAM,OAAO,aAAkB,CAAA;AAClD,QAAA,MAAM,UAAA,GAAa,MAAM,OAAO,MAAW,CAAA;AAC3C,QAAA,MAAM,WAAW,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,QAAQ,CAAA;AAC3D,QAAA,WAAA,GAAc,MAAM,UAAA,CAAW,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,MAC3D;AAEA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR;AAAA,YACE,GAAA;AAAA,YACA,QAAA,EAAU,WAAA;AAAA,YACV,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAAA,IAEA,KAAK,2BAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,EAAC;AAAA,IAEV;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA;AAEjD;AAKA,SAAS,gBAAA,CAAiB,UAAkB,QAAA,EAA0B;AAEpE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,2BAAA,EAA6B,EAAE,CAAA;AAC7D,EAAA,OAAO,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACzC;;;AChOO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,KAAM,YAAA;AACrC;AAKO,SAAS,gBAAgB,MAAA,EAAyC;AACvE,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,IAAA;AACpC,EAAA,MAAM,OAAA,GAAU,oBAAoB,QAAQ,CAAA,CAAA;AAG5C,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AAC/B,IAAA,MAAM,WAAA,GAAc,UAAU,IAAA,CAAK,CAAC,MAAM,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAEhE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,EAAK;AACL,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,EAAG,IAAI,GAAG,CAAA,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,QACtC,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,GAAG,MAAA,CAAO,WAAA;AAAA,YACR,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,MAAA;AAAA,cAAO,CAAC,CAAC,GAAG,CAAA,KACtC,CAAC,CAAC,MAAA,EAAQ,YAAY,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa;AAAA;AACpD;AACF;AACF,OACD,CAAA;AAGD,MAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvC,QAAA,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MAC1B,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,MAAM,CAAA;AAG1B,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,QAAA,MAAM,OAAO,YAA2B;AACtC,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,GAAA,CAAI,GAAA,EAAI;AACR,YAAA;AAAA,UACF;AACA,UAAA,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5B,UAAA,OAAO,IAAA,EAAK;AAAA,QACd,CAAA;AACA,QAAA,MAAM,IAAA,EAAK;AAAA,MACb,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,GAAA,EAAI;AAAA,MACV;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,eAAc,EAAG;AACnB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,GAAA,CAAI,IAAI,KAAK,KAAK,CAAA;AAAA,MACpE;AACA,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AACF;AAKO,SAAS,mBAAA,CAAoB,WAAmB,QAAA,EAA0B;AAC/E,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAKI,QAAQ,CAAA;AAAA,gBAAA,EACH,SAAS,CAAA;AAAA;AAAA,4CAAA,EAEmB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAMtB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAM1B,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAQL,SAAS,cAAc,QAAQ,CAAA;AAAA,iCAAA,EAChB,SAAS,cAAc,QAAQ,CAAA;AAAA,iCAAA,EAC/B,SAAS,cAAc,QAAQ,CAAA;AAAA,iCAAA,EAC/B,SAAS,cAAc,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AASlE;;;AC5GO,SAAS,cAAA,CACd,aACA,eAAA,EACQ;AACR,EAAA,MAAM,SAAS,MAAA,EAAO;AAGtB,EAAA,MAAA,CAAO,GAAA,CAAI,kBAAA,EAAoB,OAAO,GAAA,EAAK,GAAA,KAAQ;AACjD,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,GAAA,CAAI,MAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,CAAA;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,SAAA,CAAU,QAAA,CAAS,UAAA,EAAY,MAAM,eAAe,CAAA;AACvE,MAAA,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,KAAA,EAAO,mBAAA;AAAA,QACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC/D,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAO,GAAA,EAAK,GAAA,KAAQ;AACvC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,GAAA,CAAI,MAAA;AAGrB,IAAA,KAAA,MAAW,QAAA,IAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA,EAAG;AACjD,MAAA,MAAM,GAAA,GAAM,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEpC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,MAAM,SAAA,CAAU,QAAA,CAAS,UAAA,EAAY,MAAM,eAAe,CAAA;AACvE,UAAA,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC1B,UAAA;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,YACnB,KAAA,EAAO,mBAAA;AAAA,YACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC/D,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,CAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAKA,eAAe,SAAA,CACb,EAAA,EACA,QAAA,EACA,eAAA,EACiB;AAEjB,EAAA,IAAI,aAAA,MAAmB,eAAA,EAAiB;AACtC,IAAA,MAAM,QAAA,GAAW,gBAAgB,QAAA,IAAY,IAAA;AAC7C,IAAA,OAAO,mBAAA,CAAoB,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA;AAAA,EACrE;AAGA,EAAA,IAAI,GAAG,IAAA,CAAK,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAClC,IAAA,OAAO,EAAA,CAAG,IAAA;AAAA,EACZ;AAGA,EAAA,MAAM,WAAgB,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,GAAG,IAAI,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,MAAS,EAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACnD,EAAA,OAAO,OAAA;AACT;;;ACrCA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACjF;AAKA,eAAsB,aAAa,MAAA,EAA+D;AAChG,EAAA,MAAM,MAAe,OAAA,EAAQ;AAG7B,EAAA,GAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,CAAA;AAGtB,EAAA,IAAI,MAAA,CAAO,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,IAAA;AACjC,IAAA,GAAA,CAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AAC1B,MAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,GAAG,CAAA;AAAA,MAClD,CAAA,MAAA,IAAW,OAAO,MAAA,KAAW,QAAA,EAAU;AACrC,QAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,MAAM,CAAA;AAAA,MACrD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAChC,QAAA,MAAM,aAAA,GAAgB,IAAI,OAAA,CAAQ,MAAA;AAClC,QAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AACnD,UAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,aAAa,CAAA;AAAA,QAC5D;AAAA,MACF;AAEA,MAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,QAAA,GAAA,CAAI,SAAA,CAAU,oCAAoC,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,GAAA,CAAI,UAAU,8BAAA,EAAgC,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC7E;AACA,MAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,QAAA,GAAA,CAAI,UAAU,8BAAA,EAAgC,UAAA,CAAW,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACpF;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,EAAI;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,EAAK;AAAA,IACP,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,aAAA,EAAc,IAAK,MAAA,CAAO,MAAA,EAAQ,SAAA,EAAW;AAC/C,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AACzD,IAAA,GAAA,CAAI,IAAI,SAAS,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,WAAW,cAAA,CAAe,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC5E,EAAA,GAAA,CAAI,GAAA,CAAI,OAAO,QAAQ,CAAA;AAGvB,EAAA,MAAM,cAAc,OAClB,QAAA,EACA,KAAA,EACA,QAAA,GAAoC,EAAC,KAChB;AACrB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,GAAA,GAAmB;AAAA,MACvB,WAAW,iBAAA,EAAkB;AAAA,MAC7B,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,OAAA;AAAA,QAC1C,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,QAC5B,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG;AAAA,OAC/B;AAEA,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,cAAA,EAAgB;AAAA,QACjC,QAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,YAAA,EAAc;AAAA,QAC/B,QAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC1B,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,EAAQ,WAAA,IAAe,MAAA;AAC/C,EAAA,MAAM,aAAa,gBAAA,CAAiB;AAAA,IAClC,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB;AAAA,GACD,CAAA;AACD,EAAA,GAAA,CAAI,IAAA,CAAK,UAAU,UAAU,CAAA;AAG7B,EAAA,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,CAAC,IAAA,EAAM,GAAA,KAAQ;AAChC,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,EACvE,CAAC,CAAA;AAGD,EAAA,IAAI,MAAA,CAAO,cAAc,OAAA,EAAS;AAEhC,IAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,MAAM,OAAO,qBAAY,CAAA;AACtD,IAAA,OAAO,gBAAA,CAAiB;AAAA,MACtB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB;AAAA,KACD,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,aAAa,GAAA,CAAI,MAAA,CAAO,OAAO,IAAA,EAAM,MAAA,CAAO,MAAM,MAAM;AAC5D,MAAA,IAAI,MAAA,CAAO,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,OAAA,GAAU,CAAA,iBAAA,EAAoB,MAAA,CAAO,IAAI,CAAA,CAAA;AAC/C,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,EAAC;AACvC,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,EAAC;AAC3C,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,EAAC;AAEvC,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAoC,MAAA,CAAO,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAC/E,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gDAAA,EAA8C,OAAO,CAAA,CAAE,CAAA;AACnE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gDAAA,EAA8C,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAC9E,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gDAAA,EAA8C,SAAA,CAAU,GAAA,CAAI,OAAK,CAAA,EAAG,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,kBAAkB,CAAC,CAAA,CAAE,CAAA;AAAA,QAC/H;AACA,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,QAAA,OAAA,CAAQ,IAAI,CAAA,2BAAA,CAA6B,CAAA;AACzC,QAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,SAAA,CAAU,MAAM,QAAQ,SAAA,CAAU,MAAA,KAAW,IAAI,GAAA,GAAM,EAAE,GAAG,SAAA,CAAU,MAAA,GAAS,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,KAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AACzI,QAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,WAAA,CAAY,MAAM,UAAU,WAAA,CAAY,MAAA,KAAW,IAAI,GAAA,GAAM,EAAE,GAAG,WAAA,CAAY,MAAA,GAAS,IAAI,CAAA,EAAA,EAAK,WAAA,CAAY,KAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AACnJ,QAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,SAAA,CAAU,MAAM,gBAAgB,SAAA,CAAU,MAAA,KAAW,IAAI,GAAA,GAAM,EAAE,GAAG,SAAA,CAAU,MAAA,GAAS,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,KAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AACjJ,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,QAAA,OAAA,CAAQ,IAAI,CAAA,2BAAA,CAA6B,CAAA;AACzC,QAAA,OAAA,CAAQ,GAAA,CAAI,sDAAsD,OAAO,CAAA,IAAA,EAAO,UAAU,CAAC,CAAA,IAAK,UAAU,CAAA,CAAE,CAAA;AAC5G,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gDAAA,EAAmD,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AACnF,QAAA,OAAA,CAAQ,IAAI,CAAA,gEAAA,CAAkE,CAAA;AAC9E,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,MAChB;AAEA,MAAAA,QAAAA,CAAQ;AAAA,QACN,KAAA,EAAO,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAA,KAAiB;AACzC,UAAA,UAAA,CAAW,KAAA,CAAM,MAAM,YAAA,EAAc,CAAA;AAAA,QACvC,CAAC;AAAA,OACF,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH","file":"server-Z5QP7DSX.js","sourcesContent":["import type { RequestHandler } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * MCP handler configuration\n */\ninterface McpHandlerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n executeTool: (toolName: string, input: unknown, metadata?: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * MCP JSON-RPC request structure\n */\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * MCP JSON-RPC response structure\n */\ninterface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * Convert visibility to MCP audience format\n */\nfunction visibilityToAudience(visibility: 'model' | 'app' | 'both'): string[] {\n switch (visibility) {\n case 'model':\n return ['assistant'];\n case 'app':\n return ['user'];\n case 'both':\n default:\n return ['assistant', 'user'];\n }\n}\n\n/**\n * Create an Express handler for MCP JSON-RPC requests\n */\nexport function createMcpHandler(config: McpHandlerConfig): RequestHandler {\n return async (req, res) => {\n const request = req.body as JsonRpcRequest;\n\n if (request.jsonrpc !== '2.0') {\n res.status(400).json({\n jsonrpc: '2.0',\n id: request.id ?? null,\n error: { code: -32600, message: 'Invalid Request: Not JSON-RPC 2.0' },\n });\n return;\n }\n\n try {\n const result = await handleMethod(config, request.method, request.params ?? {});\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n res.json(response);\n } catch (error) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : 'Internal error',\n data: error instanceof Error ? { stack: error.stack } : undefined,\n },\n };\n res.json(response);\n }\n };\n}\n\n/**\n * Handle MCP method calls\n */\nasync function handleMethod(\n config: McpHandlerConfig,\n method: string,\n params: Record<string, unknown>\n): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n resources: {},\n },\n serverInfo: {\n name: config.name,\n version: config.version,\n },\n };\n\n case 'tools/list':\n return {\n tools: Array.from(config.tools.values())\n // Filter out app-only tools (they shouldn't be visible to the model)\n .filter((tool) => tool.visibility !== 'app')\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n audience: visibilityToAudience(tool.visibility),\n },\n _meta: tool.ui\n ? {\n ui: {\n visibility: visibilityToAudience(tool.visibility),\n resourceUri: getUIResourceUri(tool.name, tool.category),\n },\n }\n : undefined,\n })),\n };\n\n case 'tools/call': {\n const toolName = params['name'] as string;\n const args = (params['arguments'] as Record<string, unknown>) ?? {};\n\n const result = await config.executeTool(toolName, args);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ],\n structuredContent: result,\n };\n }\n\n case 'resources/list':\n return {\n resources: Array.from(config.uiResources.values()).map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n mimeType: 'text/html;profile=mcp-app',\n _meta: {\n ui: {\n prefersBorder: resource.definition.prefersBorder,\n autoResize: resource.definition.autoResize,\n csp: resource.definition.csp,\n },\n },\n })),\n };\n\n case 'resources/read': {\n const uri = params['uri'] as string;\n const resource = config.uiResources.get(uri);\n\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n // Read actual file content\n let htmlContent: string;\n const htmlPath = resource.definition.html;\n\n if (htmlPath.trim().startsWith('<')) {\n // Inline HTML\n htmlContent = htmlPath;\n } else {\n // File path - read content\n const fsPromises = await import('node:fs/promises');\n const pathModule = await import('node:path');\n const fullPath = pathModule.resolve(process.cwd(), htmlPath);\n htmlContent = await fsPromises.readFile(fullPath, 'utf-8');\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: 'text/html',\n text: htmlContent,\n },\n ],\n };\n }\n\n case 'notifications/initialized':\n case 'ping':\n return {};\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n}\n\n/**\n * Get the UI resource URI for a tool\n */\nfunction getUIResourceUri(toolName: string, category: string): string {\n // Extract the name without prefix\n const name = toolName.replace(/^(view|action|data|tool):/, '');\n return `pancake://ui/${category}/${name}`;\n}\n","import type { RequestHandler } from 'express';\nimport type { DevServerConfig } from '../types/app.js';\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n return process.env['NODE_ENV'] !== 'production';\n}\n\n/**\n * Create a proxy middleware for Vite dev server\n */\nexport function createViteProxy(config: DevServerConfig): RequestHandler {\n const vitePort = config.vitePort ?? 5173;\n const viteUrl = `http://localhost:${vitePort}`;\n\n // Paths to proxy to Vite\n const vitePaths = [\n '/@vite/',\n '/@react-refresh',\n '/assets/',\n '/src/',\n '/__vite_ping',\n '/@fs/',\n '/node_modules/.vite/',\n ];\n\n return async (req, res, next) => {\n const shouldProxy = vitePaths.some((p) => req.path.startsWith(p));\n\n if (!shouldProxy) {\n next();\n return;\n }\n\n try {\n // Dynamically import node-fetch for proxying\n const targetUrl = `${viteUrl}${req.url}`;\n const response = await fetch(targetUrl, {\n method: req.method,\n headers: {\n ...Object.fromEntries(\n Object.entries(req.headers).filter(([key]) =>\n !['host', 'connection'].includes(key.toLowerCase())\n )\n ),\n } as Record<string, string>,\n });\n\n // Copy response headers\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n res.status(response.status);\n\n // Stream response body\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) {\n res.end();\n return;\n }\n res.write(Buffer.from(value));\n return pump();\n };\n await pump();\n } else {\n res.end();\n }\n } catch (error) {\n // Vite might not be running, pass through\n if (isDevelopment()) {\n console.warn(`[Pancake] Vite proxy failed for ${req.path}:`, error);\n }\n next();\n }\n };\n}\n\n/**\n * Generate HTML template with Vite HMR support\n */\nexport function generateHMRTemplate(serverUrl: string, viewName: string): string {\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>${viewName}</title>\n <base href=\"${serverUrl}/\" />\n <script type=\"module\">\n import { injectIntoGlobalHook } from \"${serverUrl}/@react-refresh\";\n injectIntoGlobalHook(window);\n window.$RefreshReg$ = () => {};\n window.$RefreshSig$ = () => (type) => type;\n window.__vite_plugin_react_preamble_installed__ = true;\n </script>\n <script type=\"module\" src=\"${serverUrl}/@vite/client\"></script>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\">\n // Initialize Pancake client before loading the view\n import('${serverUrl}/src/pancake-init.ts')\n .then(async (mod) => {\n if (mod.init) await mod.init();\n })\n .catch(() => {\n // pancake-init.ts might not exist, that's ok\n })\n .finally(() => {\n import('${serverUrl}/src/views/${viewName}/index.tsx')\n .catch(() => import('${serverUrl}/src/views/${viewName}.tsx'))\n .catch(() => import('${serverUrl}/src/views/${viewName}/index.ts'))\n .catch(() => import('${serverUrl}/src/views/${viewName}.ts'))\n .catch((err) => {\n console.error('Failed to load view:', err);\n document.body.innerHTML = '<pre style=\"color: red;\">Failed to load view: ' + err.message + '</pre>';\n });\n });\n </script>\n </body>\n</html>`;\n}\n","import { Router } from 'express';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { DevServerConfig } from '../types/app.js';\nimport { generateHMRTemplate, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create routes for serving UI resources\n */\nexport function createUIRoutes(\n uiResources: Map<string, UIResource>,\n devServerConfig?: DevServerConfig\n): Router {\n const router = Router();\n\n // Serve UI by name\n router.get('/:category/:name', async (req, res) => {\n const { category, name } = req.params;\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (!resource) {\n res.status(404).json({ error: `UI not found: ${category}/${name}` });\n return;\n }\n\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Short form: /ui/:name (defaults to view category)\n router.get('/:name', async (req, res) => {\n const { name } = req.params;\n\n // Try view first, then action, then tool\n for (const category of ['view', 'action', 'tool']) {\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (resource) {\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n return;\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n }\n\n res.status(404).json({ error: `UI not found: ${name}` });\n });\n\n return router;\n}\n\n/**\n * Get HTML content for a UI definition\n */\nasync function getUIHtml(\n ui: UIDefinition,\n viewName: string,\n devServerConfig?: DevServerConfig\n): Promise<string> {\n // In development mode, generate HMR template\n if (isDevelopment() && devServerConfig) {\n const vitePort = devServerConfig.vitePort ?? 5173;\n return generateHMRTemplate(`http://localhost:${vitePort}`, viewName);\n }\n\n // Check if html is inline (starts with <)\n if (ui.html.trim().startsWith('<')) {\n return ui.html;\n }\n\n // Otherwise, read from file\n const htmlPath = path.resolve(process.cwd(), ui.html);\n const content = await fs.readFile(htmlPath, 'utf-8');\n return content;\n}\n","import express, { type Express } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { EventMap, CorsConfig, DevServerConfig } from '../types/app.js';\nimport type { ToolContext } from '../types/context.js';\nimport { createMcpHandler } from './mcp.js';\nimport { createUIRoutes } from './routes.js';\nimport { createViteProxy, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Middleware chain interface\n */\ninterface MiddlewareChain {\n execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown>;\n}\n\n/**\n * Event emitter interface\n */\ninterface TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void;\n}\n\n/**\n * Server configuration\n */\nexport interface ServerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n middlewareChain: MiddlewareChain;\n events: TypedEventEmitter<EventMap>;\n config?: {\n cors?: CorsConfig;\n debug?: boolean;\n serverRoute?: string;\n devServer?: DevServerConfig;\n };\n port: number;\n host: string;\n transport: 'http' | 'stdio' | 'sse';\n // Names for debug output\n viewNames?: string[];\n actionNames?: string[];\n dataNames?: string[];\n}\n\n/**\n * Generate a unique request ID\n */\nfunction generateRequestId(): string {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Create the server instance\n */\nexport async function createServer(config: ServerConfig): Promise<{ close: () => Promise<void> }> {\n const app: Express = express();\n\n // Middleware\n app.use(express.json());\n\n // CORS handling\n if (config.config?.cors) {\n const corsConfig = config.config.cors;\n app.use((req, res, next) => {\n const origin = corsConfig.origin;\n if (origin === true) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof origin === 'string') {\n res.setHeader('Access-Control-Allow-Origin', origin);\n } else if (Array.isArray(origin)) {\n const requestOrigin = req.headers.origin;\n if (requestOrigin && origin.includes(requestOrigin)) {\n res.setHeader('Access-Control-Allow-Origin', requestOrigin);\n }\n }\n\n if (corsConfig.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n if (corsConfig.methods) {\n res.setHeader('Access-Control-Allow-Methods', corsConfig.methods.join(', '));\n }\n if (corsConfig.allowedHeaders) {\n res.setHeader('Access-Control-Allow-Headers', corsConfig.allowedHeaders.join(', '));\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return;\n }\n\n next();\n });\n }\n\n // Development mode: Vite HMR proxy\n if (isDevelopment() && config.config?.devServer) {\n const viteProxy = createViteProxy(config.config.devServer);\n app.use(viteProxy);\n }\n\n // UI serving routes\n const uiRoutes = createUIRoutes(config.uiResources, config.config?.devServer);\n app.use('/ui', uiRoutes);\n\n // Tool execution helper\n const executeTool = async (\n toolName: string,\n input: unknown,\n metadata: Record<string, unknown> = {}\n ): Promise<unknown> => {\n const tool = config.tools.get(toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n const ctx: ToolContext = {\n requestId: generateRequestId(),\n toolName,\n metadata,\n };\n\n const startTime = Date.now();\n\n try {\n const result = await config.middlewareChain.execute(\n { toolName, input, metadata },\n () => tool.handler(input, ctx)\n );\n\n config.events.emit('tool:success', {\n toolName,\n result,\n durationMs: Date.now() - startTime,\n });\n\n return result;\n } catch (error) {\n config.events.emit('tool:error', {\n toolName,\n error: error as Error,\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n };\n\n // MCP endpoint\n const mcpRoute = config.config?.serverRoute ?? '/mcp';\n const mcpHandler = createMcpHandler({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n app.post(mcpRoute, mcpHandler);\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', name: config.name, version: config.version });\n });\n\n // Start server based on transport\n if (config.transport === 'stdio') {\n // Import and start stdio transport\n const { startStdioServer } = await import('./stdio.js');\n return startStdioServer({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n }\n\n // HTTP server\n return new Promise((resolve) => {\n const httpServer = app.listen(config.port, config.host, () => {\n if (config.config?.debug) {\n const baseUrl = `http://localhost:${config.port}`;\n const viewNames = config.viewNames ?? [];\n const actionNames = config.actionNames ?? [];\n const dataNames = config.dataNames ?? [];\n\n console.log('');\n console.log(` \\x1b[1m\\x1b[32m✓\\x1b[0m \\x1b[1m${config.name}\\x1b[0m is running`);\n console.log('');\n console.log(` \\x1b[2m➜\\x1b[0m \\x1b[1mServer:\\x1b[0m ${baseUrl}`);\n console.log(` \\x1b[2m➜\\x1b[0m \\x1b[1mMCP:\\x1b[0m ${baseUrl}${mcpRoute}`);\n if (viewNames.length > 0) {\n console.log(` \\x1b[2m➜\\x1b[0m \\x1b[1mViews:\\x1b[0m ${viewNames.map(v => `${baseUrl}/ui/${v}`).join('\\n ')}`);\n }\n console.log('');\n console.log(` \\x1b[2mRegistered:\\x1b[0m`);\n console.log(` ${viewNames.length} view${viewNames.length !== 1 ? 's' : ''}${viewNames.length > 0 ? ` (${viewNames.join(', ')})` : ''}`);\n console.log(` ${actionNames.length} action${actionNames.length !== 1 ? 's' : ''}${actionNames.length > 0 ? ` (${actionNames.join(', ')})` : ''}`);\n console.log(` ${dataNames.length} data fetcher${dataNames.length !== 1 ? 's' : ''}${dataNames.length > 0 ? ` (${dataNames.join(', ')})` : ''}`);\n console.log('');\n console.log(` \\x1b[2mNext steps:\\x1b[0m`);\n console.log(` \\x1b[36m1.\\x1b[0m Open a view in your browser: ${baseUrl}/ui/${viewNames[0] || 'yourView'}`);\n console.log(` \\x1b[36m2.\\x1b[0m Connect an MCP client to: ${baseUrl}${mcpRoute}`);\n console.log(` \\x1b[36m3.\\x1b[0m Or use Claude Desktop with this server URL`);\n console.log('');\n }\n\n resolve({\n close: () => new Promise((resolveClose) => {\n httpServer.close(() => resolveClose());\n }),\n });\n });\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pancake-apps/server",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Pancake SDK server framework for building AI tool UIs",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/mcp.ts","../src/server/dev-proxy.ts","../src/server/routes.ts","../src/server/index.ts"],"names":["resolve"],"mappings":";;;;;;;AAmDA,SAAS,qBAAqB,UAAA,EAAgD;AAC5E,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,WAAW,CAAA;AAAA,IACrB,KAAK,KAAA;AACH,MAAA,OAAO,CAAC,MAAM,CAAA;AAAA,IAChB,KAAK,MAAA;AAAA,IACL;AACE,MAAA,OAAO,CAAC,aAAa,MAAM,CAAA;AAAA;AAEjC;AAKO,SAAS,iBAAiB,MAAA,EAA0C;AACzE,EAAA,OAAO,OAAO,KAAK,GAAA,KAAQ;AACzB,IAAA,MAAM,UAAU,GAAA,CAAI,IAAA;AAEpB,IAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC7B,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,OAAA,EAAS,KAAA;AAAA,QACT,EAAA,EAAI,QAAQ,EAAA,IAAM,IAAA;AAAA,QAClB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,mCAAA;AAAoC,OACrE,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,MAAA,EAAQ,QAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA;AAC9E,MAAA,MAAM,QAAA,GAA4B;AAAA,QAChC,OAAA,EAAS,KAAA;AAAA,QACT,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAA4B;AAAA,QAChC,OAAA,EAAS,KAAA;AAAA,QACT,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gBAAA;AAAA,UAClD,MAAM,KAAA,YAAiB,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,OAAM,GAAI;AAAA;AAC1D,OACF;AACA,MAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AACF;AAKA,eAAe,YAAA,CACb,MAAA,EACA,MAAA,EACA,MAAA,EACkB;AAClB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,YAAA;AAAA,QACjB,YAAA,EAAc;AAAA,UACZ,OAAO,EAAC;AAAA,UACR,WAAW;AAAC,SACd;AAAA,QACA,UAAA,EAAY;AAAA,UACV,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAS,MAAA,CAAO;AAAA;AAClB,OACF;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAEpC,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,UAAA,KAAe,KAAK,CAAA,CAC1C,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UACd,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAA,EAAa;AAAA,YACX,QAAA,EAAU,oBAAA,CAAqB,IAAA,CAAK,UAAU;AAAA,WAChD;AAAA,UACA,KAAA,EAAO,KAAK,EAAA,GACR;AAAA,YACE,EAAA,EAAI;AAAA,cACF,UAAA,EAAY,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA;AAAA,cAChD,WAAA,EAAa,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,KAAK,QAAQ;AAAA;AACxD,WACF,GACA;AAAA,SACN,CAAE;AAAA,OACN;AAAA,IAEF,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,QAAA,GAAW,OAAO,MAAM,CAAA;AAC9B,MAAA,MAAM,IAAA,GAAQ,MAAA,CAAO,WAAW,CAAA,IAAiC,EAAC;AAElE,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,WAAA,CAAY,UAAU,IAAI,CAAA;AAEtD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA;AAC7B,SACF;AAAA,QACA,iBAAA,EAAmB;AAAA,OACrB;AAAA,IACF;AAAA,IAEA,KAAK,gBAAA;AACH,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,UACpE,KAAK,QAAA,CAAS,GAAA;AAAA,UACd,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,QAAA,EAAU,2BAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,EAAA,EAAI;AAAA,cACF,aAAA,EAAe,SAAS,UAAA,CAAW,aAAA;AAAA,cACnC,UAAA,EAAY,SAAS,UAAA,CAAW,UAAA;AAAA,cAChC,GAAA,EAAK,SAAS,UAAA,CAAW;AAAA;AAC3B;AACF,SACF,CAAE;AAAA,OACJ;AAAA,IAEF,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAE3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAAA,MAC9C;AAGA,MAAA,IAAI,WAAA;AACJ,MAAA,MAAM,QAAA,GAAW,SAAS,UAAA,CAAW,IAAA;AAErC,MAAA,IAAI,QAAA,CAAS,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAEnC,QAAA,WAAA,GAAc,QAAA;AAAA,MAChB,CAAA,MAAO;AAEL,QAAA,MAAM,UAAA,GAAa,MAAM,OAAO,aAAkB,CAAA;AAClD,QAAA,MAAM,UAAA,GAAa,MAAM,OAAO,MAAW,CAAA;AAC3C,QAAA,MAAM,WAAW,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,QAAQ,CAAA;AAC3D,QAAA,WAAA,GAAc,MAAM,UAAA,CAAW,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,MAC3D;AAEA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR;AAAA,YACE,GAAA;AAAA,YACA,QAAA,EAAU,WAAA;AAAA,YACV,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAAA,IAEA,KAAK,2BAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,EAAC;AAAA,IAEV;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA;AAEjD;AAKA,SAAS,gBAAA,CAAiB,UAAkB,QAAA,EAA0B;AAEpE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,2BAAA,EAA6B,EAAE,CAAA;AAC7D,EAAA,OAAO,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACzC;;;AChOO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,KAAM,YAAA;AACrC;AAKO,SAAS,gBAAgB,MAAA,EAAyC;AACvE,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,IAAA;AACpC,EAAA,MAAM,OAAA,GAAU,oBAAoB,QAAQ,CAAA,CAAA;AAG5C,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AAC/B,IAAA,MAAM,WAAA,GAAc,UAAU,IAAA,CAAK,CAAC,MAAM,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAEhE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,EAAK;AACL,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,EAAG,IAAI,GAAG,CAAA,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,QACtC,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,GAAG,MAAA,CAAO,WAAA;AAAA,YACR,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,MAAA;AAAA,cAAO,CAAC,CAAC,GAAG,CAAA,KACtC,CAAC,CAAC,MAAA,EAAQ,YAAY,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa;AAAA;AACpD;AACF;AACF,OACD,CAAA;AAGD,MAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvC,QAAA,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MAC1B,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,MAAM,CAAA;AAG1B,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,QAAA,MAAM,OAAO,YAA2B;AACtC,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,GAAA,CAAI,GAAA,EAAI;AACR,YAAA;AAAA,UACF;AACA,UAAA,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5B,UAAA,OAAO,IAAA,EAAK;AAAA,QACd,CAAA;AACA,QAAA,MAAM,IAAA,EAAK;AAAA,MACb,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,GAAA,EAAI;AAAA,MACV;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,eAAc,EAAG;AACnB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,GAAA,CAAI,IAAI,KAAK,KAAK,CAAA;AAAA,MACpE;AACA,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AACF;AAKO,SAAS,mBAAA,CAAoB,WAAmB,QAAA,EAA0B;AAC/E,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAKI,QAAQ,CAAA;AAAA,gBAAA,EACH,SAAS,CAAA;AAAA;AAAA,4CAAA,EAEmB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAMtB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAM1B,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAQL,SAAS,cAAc,QAAQ,CAAA;AAAA,iCAAA,EAChB,SAAS,cAAc,QAAQ,CAAA;AAAA,iCAAA,EAC/B,SAAS,cAAc,QAAQ,CAAA;AAAA,iCAAA,EAC/B,SAAS,cAAc,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AASlE;;;AC5GO,SAAS,cAAA,CACd,aACA,eAAA,EACQ;AACR,EAAA,MAAM,SAAS,MAAA,EAAO;AAGtB,EAAA,MAAA,CAAO,GAAA,CAAI,kBAAA,EAAoB,OAAO,GAAA,EAAK,GAAA,KAAQ;AACjD,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,GAAA,CAAI,MAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,CAAA;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,SAAA,CAAU,QAAA,CAAS,UAAA,EAAY,MAAM,eAAe,CAAA;AACvE,MAAA,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,KAAA,EAAO,mBAAA;AAAA,QACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC/D,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAO,GAAA,EAAK,GAAA,KAAQ;AACvC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,GAAA,CAAI,MAAA;AAGrB,IAAA,KAAA,MAAW,QAAA,IAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA,EAAG;AACjD,MAAA,MAAM,GAAA,GAAM,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEpC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,MAAM,SAAA,CAAU,QAAA,CAAS,UAAA,EAAY,MAAM,eAAe,CAAA;AACvE,UAAA,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC1B,UAAA;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,YACnB,KAAA,EAAO,mBAAA;AAAA,YACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC/D,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,CAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAKA,eAAe,SAAA,CACb,EAAA,EACA,QAAA,EACA,eAAA,EACiB;AAEjB,EAAA,IAAI,aAAA,MAAmB,eAAA,EAAiB;AACtC,IAAA,MAAM,QAAA,GAAW,gBAAgB,QAAA,IAAY,IAAA;AAC7C,IAAA,OAAO,mBAAA,CAAoB,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA;AAAA,EACrE;AAGA,EAAA,IAAI,GAAG,IAAA,CAAK,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAClC,IAAA,OAAO,EAAA,CAAG,IAAA;AAAA,EACZ;AAGA,EAAA,MAAM,WAAgB,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,GAAG,IAAI,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,MAAS,EAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACnD,EAAA,OAAO,OAAA;AACT;;;ACzCA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACjF;AAKA,eAAsB,aAAa,MAAA,EAA+D;AAChG,EAAA,MAAM,MAAe,OAAA,EAAQ;AAG7B,EAAA,GAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,CAAA;AAGtB,EAAA,IAAI,MAAA,CAAO,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,IAAA;AACjC,IAAA,GAAA,CAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AAC1B,MAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,GAAG,CAAA;AAAA,MAClD,CAAA,MAAA,IAAW,OAAO,MAAA,KAAW,QAAA,EAAU;AACrC,QAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,MAAM,CAAA;AAAA,MACrD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAChC,QAAA,MAAM,aAAA,GAAgB,IAAI,OAAA,CAAQ,MAAA;AAClC,QAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AACnD,UAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,aAAa,CAAA;AAAA,QAC5D;AAAA,MACF;AAEA,MAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,QAAA,GAAA,CAAI,SAAA,CAAU,oCAAoC,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,GAAA,CAAI,UAAU,8BAAA,EAAgC,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC7E;AACA,MAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,QAAA,GAAA,CAAI,UAAU,8BAAA,EAAgC,UAAA,CAAW,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACpF;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,EAAI;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,EAAK;AAAA,IACP,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,aAAA,EAAc,IAAK,MAAA,CAAO,MAAA,EAAQ,SAAA,EAAW;AAC/C,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AACzD,IAAA,GAAA,CAAI,IAAI,SAAS,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,WAAW,cAAA,CAAe,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC5E,EAAA,GAAA,CAAI,GAAA,CAAI,OAAO,QAAQ,CAAA;AAGvB,EAAA,MAAM,cAAc,OAClB,QAAA,EACA,KAAA,EACA,QAAA,GAAoC,EAAC,KAChB;AACrB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,GAAA,GAAmB;AAAA,MACvB,WAAW,iBAAA,EAAkB;AAAA,MAC7B,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,OAAA;AAAA,QAC1C,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,QAC5B,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG;AAAA,OAC/B;AAEA,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,cAAA,EAAgB;AAAA,QACjC,QAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,YAAA,EAAc;AAAA,QAC/B,QAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC1B,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,EAAQ,WAAA,IAAe,MAAA;AAC/C,EAAA,MAAM,aAAa,gBAAA,CAAiB;AAAA,IAClC,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB;AAAA,GACD,CAAA;AACD,EAAA,GAAA,CAAI,IAAA,CAAK,UAAU,UAAU,CAAA;AAG7B,EAAA,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,CAAC,IAAA,EAAM,GAAA,KAAQ;AAChC,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,EACvE,CAAC,CAAA;AAGD,EAAA,IAAI,MAAA,CAAO,cAAc,OAAA,EAAS;AAEhC,IAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,MAAM,OAAO,qBAAY,CAAA;AACtD,IAAA,OAAO,gBAAA,CAAiB;AAAA,MACtB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB;AAAA,KACD,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,aAAa,GAAA,CAAI,MAAA,CAAO,OAAO,IAAA,EAAM,MAAA,CAAO,MAAM,MAAM;AAC5D,MAAA,IAAI,MAAA,CAAO,QAAQ,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,MAAA,CAAO,IAAI,CAAA,oBAAA,EAAuB,OAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC7F,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AACzC,QAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAC1C,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,MACxD;AAEA,MAAAA,QAAAA,CAAQ;AAAA,QACN,KAAA,EAAO,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAA,KAAiB;AACzC,UAAA,UAAA,CAAW,KAAA,CAAM,MAAM,YAAA,EAAc,CAAA;AAAA,QACvC,CAAC;AAAA,OACF,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH","file":"server-3KHS3VCE.js","sourcesContent":["import type { RequestHandler } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * MCP handler configuration\n */\ninterface McpHandlerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n executeTool: (toolName: string, input: unknown, metadata?: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * MCP JSON-RPC request structure\n */\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * MCP JSON-RPC response structure\n */\ninterface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * Convert visibility to MCP audience format\n */\nfunction visibilityToAudience(visibility: 'model' | 'app' | 'both'): string[] {\n switch (visibility) {\n case 'model':\n return ['assistant'];\n case 'app':\n return ['user'];\n case 'both':\n default:\n return ['assistant', 'user'];\n }\n}\n\n/**\n * Create an Express handler for MCP JSON-RPC requests\n */\nexport function createMcpHandler(config: McpHandlerConfig): RequestHandler {\n return async (req, res) => {\n const request = req.body as JsonRpcRequest;\n\n if (request.jsonrpc !== '2.0') {\n res.status(400).json({\n jsonrpc: '2.0',\n id: request.id ?? null,\n error: { code: -32600, message: 'Invalid Request: Not JSON-RPC 2.0' },\n });\n return;\n }\n\n try {\n const result = await handleMethod(config, request.method, request.params ?? {});\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n res.json(response);\n } catch (error) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : 'Internal error',\n data: error instanceof Error ? { stack: error.stack } : undefined,\n },\n };\n res.json(response);\n }\n };\n}\n\n/**\n * Handle MCP method calls\n */\nasync function handleMethod(\n config: McpHandlerConfig,\n method: string,\n params: Record<string, unknown>\n): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n resources: {},\n },\n serverInfo: {\n name: config.name,\n version: config.version,\n },\n };\n\n case 'tools/list':\n return {\n tools: Array.from(config.tools.values())\n // Filter out app-only tools (they shouldn't be visible to the model)\n .filter((tool) => tool.visibility !== 'app')\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n audience: visibilityToAudience(tool.visibility),\n },\n _meta: tool.ui\n ? {\n ui: {\n visibility: visibilityToAudience(tool.visibility),\n resourceUri: getUIResourceUri(tool.name, tool.category),\n },\n }\n : undefined,\n })),\n };\n\n case 'tools/call': {\n const toolName = params['name'] as string;\n const args = (params['arguments'] as Record<string, unknown>) ?? {};\n\n const result = await config.executeTool(toolName, args);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ],\n structuredContent: result,\n };\n }\n\n case 'resources/list':\n return {\n resources: Array.from(config.uiResources.values()).map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n mimeType: 'text/html;profile=mcp-app',\n _meta: {\n ui: {\n prefersBorder: resource.definition.prefersBorder,\n autoResize: resource.definition.autoResize,\n csp: resource.definition.csp,\n },\n },\n })),\n };\n\n case 'resources/read': {\n const uri = params['uri'] as string;\n const resource = config.uiResources.get(uri);\n\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n // Read actual file content\n let htmlContent: string;\n const htmlPath = resource.definition.html;\n\n if (htmlPath.trim().startsWith('<')) {\n // Inline HTML\n htmlContent = htmlPath;\n } else {\n // File path - read content\n const fsPromises = await import('node:fs/promises');\n const pathModule = await import('node:path');\n const fullPath = pathModule.resolve(process.cwd(), htmlPath);\n htmlContent = await fsPromises.readFile(fullPath, 'utf-8');\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: 'text/html',\n text: htmlContent,\n },\n ],\n };\n }\n\n case 'notifications/initialized':\n case 'ping':\n return {};\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n}\n\n/**\n * Get the UI resource URI for a tool\n */\nfunction getUIResourceUri(toolName: string, category: string): string {\n // Extract the name without prefix\n const name = toolName.replace(/^(view|action|data|tool):/, '');\n return `pancake://ui/${category}/${name}`;\n}\n","import type { RequestHandler } from 'express';\nimport type { DevServerConfig } from '../types/app.js';\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n return process.env['NODE_ENV'] !== 'production';\n}\n\n/**\n * Create a proxy middleware for Vite dev server\n */\nexport function createViteProxy(config: DevServerConfig): RequestHandler {\n const vitePort = config.vitePort ?? 5173;\n const viteUrl = `http://localhost:${vitePort}`;\n\n // Paths to proxy to Vite\n const vitePaths = [\n '/@vite/',\n '/@react-refresh',\n '/assets/',\n '/src/',\n '/__vite_ping',\n '/@fs/',\n '/node_modules/.vite/',\n ];\n\n return async (req, res, next) => {\n const shouldProxy = vitePaths.some((p) => req.path.startsWith(p));\n\n if (!shouldProxy) {\n next();\n return;\n }\n\n try {\n // Dynamically import node-fetch for proxying\n const targetUrl = `${viteUrl}${req.url}`;\n const response = await fetch(targetUrl, {\n method: req.method,\n headers: {\n ...Object.fromEntries(\n Object.entries(req.headers).filter(([key]) =>\n !['host', 'connection'].includes(key.toLowerCase())\n )\n ),\n } as Record<string, string>,\n });\n\n // Copy response headers\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n res.status(response.status);\n\n // Stream response body\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) {\n res.end();\n return;\n }\n res.write(Buffer.from(value));\n return pump();\n };\n await pump();\n } else {\n res.end();\n }\n } catch (error) {\n // Vite might not be running, pass through\n if (isDevelopment()) {\n console.warn(`[Pancake] Vite proxy failed for ${req.path}:`, error);\n }\n next();\n }\n };\n}\n\n/**\n * Generate HTML template with Vite HMR support\n */\nexport function generateHMRTemplate(serverUrl: string, viewName: string): string {\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>${viewName}</title>\n <base href=\"${serverUrl}/\" />\n <script type=\"module\">\n import { injectIntoGlobalHook } from \"${serverUrl}/@react-refresh\";\n injectIntoGlobalHook(window);\n window.$RefreshReg$ = () => {};\n window.$RefreshSig$ = () => (type) => type;\n window.__vite_plugin_react_preamble_installed__ = true;\n </script>\n <script type=\"module\" src=\"${serverUrl}/@vite/client\"></script>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\">\n // Initialize Pancake client before loading the view\n import('${serverUrl}/src/pancake-init.ts')\n .then(async (mod) => {\n if (mod.init) await mod.init();\n })\n .catch(() => {\n // pancake-init.ts might not exist, that's ok\n })\n .finally(() => {\n import('${serverUrl}/src/views/${viewName}/index.tsx')\n .catch(() => import('${serverUrl}/src/views/${viewName}.tsx'))\n .catch(() => import('${serverUrl}/src/views/${viewName}/index.ts'))\n .catch(() => import('${serverUrl}/src/views/${viewName}.ts'))\n .catch((err) => {\n console.error('Failed to load view:', err);\n document.body.innerHTML = '<pre style=\"color: red;\">Failed to load view: ' + err.message + '</pre>';\n });\n });\n </script>\n </body>\n</html>`;\n}\n","import { Router } from 'express';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { DevServerConfig } from '../types/app.js';\nimport { generateHMRTemplate, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Create routes for serving UI resources\n */\nexport function createUIRoutes(\n uiResources: Map<string, UIResource>,\n devServerConfig?: DevServerConfig\n): Router {\n const router = Router();\n\n // Serve UI by name\n router.get('/:category/:name', async (req, res) => {\n const { category, name } = req.params;\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (!resource) {\n res.status(404).json({ error: `UI not found: ${category}/${name}` });\n return;\n }\n\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Short form: /ui/:name (defaults to view category)\n router.get('/:name', async (req, res) => {\n const { name } = req.params;\n\n // Try view first, then action, then tool\n for (const category of ['view', 'action', 'tool']) {\n const uri = `pancake://ui/${category}/${name}`;\n const resource = uiResources.get(uri);\n\n if (resource) {\n try {\n const html = await getUIHtml(resource.definition, name, devServerConfig);\n res.type('html').send(html);\n return;\n } catch (error) {\n res.status(500).json({\n error: 'Failed to load UI',\n details: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n }\n\n res.status(404).json({ error: `UI not found: ${name}` });\n });\n\n return router;\n}\n\n/**\n * Get HTML content for a UI definition\n */\nasync function getUIHtml(\n ui: UIDefinition,\n viewName: string,\n devServerConfig?: DevServerConfig\n): Promise<string> {\n // In development mode, generate HMR template\n if (isDevelopment() && devServerConfig) {\n const vitePort = devServerConfig.vitePort ?? 5173;\n return generateHMRTemplate(`http://localhost:${vitePort}`, viewName);\n }\n\n // Check if html is inline (starts with <)\n if (ui.html.trim().startsWith('<')) {\n return ui.html;\n }\n\n // Otherwise, read from file\n const htmlPath = path.resolve(process.cwd(), ui.html);\n const content = await fs.readFile(htmlPath, 'utf-8');\n return content;\n}\n","import express, { type Express } from 'express';\nimport type { InternalTool } from '../types/tool.js';\nimport type { UIDefinition } from '../types/protocol.js';\nimport type { EventMap, CorsConfig, DevServerConfig } from '../types/app.js';\nimport type { ToolContext } from '../types/context.js';\nimport { createMcpHandler } from './mcp.js';\nimport { createUIRoutes } from './routes.js';\nimport { createViteProxy, isDevelopment } from './dev-proxy.js';\n\n/**\n * UI resource for serving\n */\ninterface UIResource {\n name: string;\n uri: string;\n definition: UIDefinition;\n}\n\n/**\n * Middleware chain interface\n */\ninterface MiddlewareChain {\n execute(\n ctx: { toolName: string; input: unknown; metadata: Record<string, unknown> },\n handler: () => Promise<unknown>\n ): Promise<unknown>;\n}\n\n/**\n * Event emitter interface\n */\ninterface TypedEventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void;\n}\n\n/**\n * Server configuration\n */\nexport interface ServerConfig {\n name: string;\n version: string;\n tools: Map<string, InternalTool>;\n uiResources: Map<string, UIResource>;\n middlewareChain: MiddlewareChain;\n events: TypedEventEmitter<EventMap>;\n config?: {\n cors?: CorsConfig;\n debug?: boolean;\n serverRoute?: string;\n devServer?: DevServerConfig;\n };\n port: number;\n host: string;\n transport: 'http' | 'stdio' | 'sse';\n}\n\n/**\n * Generate a unique request ID\n */\nfunction generateRequestId(): string {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Create the server instance\n */\nexport async function createServer(config: ServerConfig): Promise<{ close: () => Promise<void> }> {\n const app: Express = express();\n\n // Middleware\n app.use(express.json());\n\n // CORS handling\n if (config.config?.cors) {\n const corsConfig = config.config.cors;\n app.use((req, res, next) => {\n const origin = corsConfig.origin;\n if (origin === true) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof origin === 'string') {\n res.setHeader('Access-Control-Allow-Origin', origin);\n } else if (Array.isArray(origin)) {\n const requestOrigin = req.headers.origin;\n if (requestOrigin && origin.includes(requestOrigin)) {\n res.setHeader('Access-Control-Allow-Origin', requestOrigin);\n }\n }\n\n if (corsConfig.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n if (corsConfig.methods) {\n res.setHeader('Access-Control-Allow-Methods', corsConfig.methods.join(', '));\n }\n if (corsConfig.allowedHeaders) {\n res.setHeader('Access-Control-Allow-Headers', corsConfig.allowedHeaders.join(', '));\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return;\n }\n\n next();\n });\n }\n\n // Development mode: Vite HMR proxy\n if (isDevelopment() && config.config?.devServer) {\n const viteProxy = createViteProxy(config.config.devServer);\n app.use(viteProxy);\n }\n\n // UI serving routes\n const uiRoutes = createUIRoutes(config.uiResources, config.config?.devServer);\n app.use('/ui', uiRoutes);\n\n // Tool execution helper\n const executeTool = async (\n toolName: string,\n input: unknown,\n metadata: Record<string, unknown> = {}\n ): Promise<unknown> => {\n const tool = config.tools.get(toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n const ctx: ToolContext = {\n requestId: generateRequestId(),\n toolName,\n metadata,\n };\n\n const startTime = Date.now();\n\n try {\n const result = await config.middlewareChain.execute(\n { toolName, input, metadata },\n () => tool.handler(input, ctx)\n );\n\n config.events.emit('tool:success', {\n toolName,\n result,\n durationMs: Date.now() - startTime,\n });\n\n return result;\n } catch (error) {\n config.events.emit('tool:error', {\n toolName,\n error: error as Error,\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n };\n\n // MCP endpoint\n const mcpRoute = config.config?.serverRoute ?? '/mcp';\n const mcpHandler = createMcpHandler({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n app.post(mcpRoute, mcpHandler);\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', name: config.name, version: config.version });\n });\n\n // Start server based on transport\n if (config.transport === 'stdio') {\n // Import and start stdio transport\n const { startStdioServer } = await import('./stdio.js');\n return startStdioServer({\n name: config.name,\n version: config.version,\n tools: config.tools,\n uiResources: config.uiResources,\n executeTool,\n });\n }\n\n // HTTP server\n return new Promise((resolve) => {\n const httpServer = app.listen(config.port, config.host, () => {\n if (config.config?.debug) {\n console.log(`Pancake server \"${config.name}\" running on http://${config.host}:${config.port}`);\n console.log(` MCP endpoint: ${mcpRoute}`);\n console.log(` UI endpoint: /ui/:viewName`);\n console.log(` Tools registered: ${config.tools.size}`);\n }\n\n resolve({\n close: () => new Promise((resolveClose) => {\n httpServer.close(() => resolveClose());\n }),\n });\n });\n });\n}\n"]}