@sidecar-ai/cli 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/cli/src/index.ts","../../packages/auth/src/core.ts","../../packages/core/src/index.ts","../../packages/compiler/src/analyze.ts","../../packages/compiler/src/ast.ts","../../packages/compiler/src/errors.ts","../../packages/compiler/src/project.ts","../../packages/compiler/src/utils.ts","../../packages/compiler/src/schema.ts","../../packages/compiler/src/widgets.ts","../../packages/compiler/src/build.ts","../../packages/compiler/src/config.ts","../../packages/compiler/src/diagnostics.ts","../../packages/compiler/src/generated.ts","../../packages/compiler/src/plugins.ts","../../packages/compiler/src/identity.ts","../../packages/compiler/src/plugin-components/agents.ts","../../packages/compiler/src/plugin-components/commands.ts","../../packages/compiler/src/plugin-components/hooks.ts","../../packages/compiler/src/plugin-components/passthrough.ts","../../packages/compiler/src/plugin-components/skills.ts","../../packages/compiler/src/prompts.ts","../../packages/compiler/src/resources.ts","../../packages/server/src/index.ts","../../packages/server/src/proxy.ts","../../packages/cli/src/tunnel.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Sidecar command-line interface.\n *\n * The CLI currently provides the vertical slice needed for local development:\n * static inspection, build output generation, and a dev MCP server.\n */\nimport { existsSync, realpathSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createServer } from \"node:http\";\nimport path from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { cwd, exit, stdin, stdout } from \"node:process\";\nimport { tsImport } from \"tsx/esm/api\";\nimport { isSidecarAuth, type SidecarAuth } from \"@sidecar-ai/auth\";\nimport {\n analyzeProjectTools,\n analyzeProjectConfig,\n analyzeProjectPrompts,\n analyzeProjectResources,\n buildProject,\n collectProjectDiagnostics,\n formatDiagnostic,\n type SidecarDiagnostic,\n type SidecarManifest,\n type SidecarTarget,\n} from \"@sidecar-ai/compiler\";\nimport { isSidecarPrompt, isSidecarResource, isSidecarTool, MCP_APP_RESOURCE_MIME_TYPE, type SidecarConfig } from \"@sidecar-ai/core\";\nimport { createSidecarHttpServer, isSidecarProxy, type LoadedPrompt, type LoadedResource, type LoadedTool, type SidecarProxy } from \"@sidecar-ai/server\";\nimport { startTunnel, type TunnelProvider, type TunnelSession } from \"./tunnel.js\";\n\ntype Command = \"build\" | \"check\" | \"dev\" | \"inspect\" | \"preview\" | \"help\";\n\n/** Dispatches the requested CLI command. */\nexport async function main(argv: string[]): Promise<void> {\n const command = (argv[2] ?? \"help\") as Command;\n const rootDir = readOption(argv, \"--cwd\") ?? cwd();\n\n switch (command) {\n case \"build\": {\n const target = readTarget(argv);\n const outDir = readOption(argv, \"--out\") ?? `out/${target}`;\n const plugins = argv.includes(\"--plugins\");\n const strict = argv.includes(\"--strict\");\n const manifest = await buildProject({ rootDir, outDir, plugins, strict, target });\n printDiagnostics(manifest.diagnostics ?? []);\n if (strict && manifest.diagnostics?.length) {\n exit(1);\n }\n console.log(\n `Built ${manifest.tools.length} ${target} tool${manifest.tools.length === 1 ? \"\" : \"s\"}, ` +\n `${manifest.resources.length} resource${manifest.resources.length === 1 ? \"\" : \"s\"}, and ` +\n `${manifest.prompts.length} prompt${manifest.prompts.length === 1 ? \"\" : \"s\"} to ${outDir}.`,\n );\n if (plugins) {\n console.log(\"Built claude-plugin package.\");\n }\n return;\n }\n\n case \"check\": {\n const target = readTarget(argv);\n const config = analyzeProjectConfig(rootDir);\n const tools = await analyzeProjectTools(rootDir, { target });\n const resources = await analyzeProjectResources(rootDir);\n const prompts = await analyzeProjectPrompts(rootDir);\n const diagnostics = await collectProjectDiagnostics(rootDir, {\n tools,\n resources,\n prompts,\n config,\n });\n printDiagnostics(diagnostics);\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"error\") || (argv.includes(\"--strict\") && diagnostics.length > 0)) {\n exit(1);\n }\n if (!diagnostics.length) {\n console.log(\"No Sidecar diagnostics.\");\n }\n return;\n }\n\n case \"dev\": {\n const port = Number(readOption(argv, \"--port\") ?? \"3001\");\n const target = readTarget(argv);\n const tunnelProvider = readTunnelProvider(argv);\n const outDir = `.sidecar/dev/${target}`;\n const manifest = await buildProject({ rootDir, outDir, target });\n printDiagnostics(manifest.diagnostics ?? []);\n const tools = await loadRuntimeTools(rootDir, manifest);\n let tunnel: TunnelSession | undefined;\n if (tunnelProvider) {\n tunnel = await startTunnel({ provider: tunnelProvider, port, path: \"/mcp\" });\n process.env.SIDECAR_MCP_URL = tunnel.mcpUrl;\n }\n\n const loadedAuth = await loadRuntimeAuth(rootDir);\n const runtimeConfig = await loadRuntimeConfig(rootDir);\n const auth = loadedAuth && tunnel ? loadedAuth.withResource(tunnel.mcpUrl) : loadedAuth;\n const proxy = await loadRuntimeProxy(rootDir);\n const resources = await loadResources(rootDir, outDir, manifest);\n const prompts = await loadRuntimePrompts(rootDir, manifest);\n const server = createSidecarHttpServer({\n name: \"sidecar-dev\",\n version: \"0.0.0-dev\",\n path: \"/mcp\",\n auth,\n proxy,\n tools,\n resources,\n prompts,\n capabilities: {\n tools: runtimeConfig?.tools ?? manifest.config.tools,\n resources: runtimeConfig?.resources ?? manifest.config.resources,\n prompts: runtimeConfig?.prompts ?? manifest.config.prompts,\n },\n pagination: runtimeConfig?.pagination ?? {\n pageSize: manifest.config.pagination.pageSize,\n },\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n console.log(`MCP running on Streamable HTTP (${target}) at http://127.0.0.1:${port}/mcp`);\n console.log(`Loaded ${tools.length} tool${tools.length === 1 ? \"\" : \"s\"}, ${resources.length} resource${resources.length === 1 ? \"\" : \"s\"}, and ${prompts.length} prompt${prompts.length === 1 ? \"\" : \"s\"}.`);\n if (tunnel) {\n console.log(`HTTPS tunnel (${tunnel.provider}) ready: ${tunnel.mcpUrl}`);\n console.log(\"Use this HTTPS MCP URL in ChatGPT, Claude, or a Claude plugin install.\");\n }\n });\n\n const shutdown = () => {\n tunnel?.close();\n server.close(() => exit(0));\n };\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n return;\n }\n\n case \"inspect\": {\n const target = readTarget(argv);\n const tools = await analyzeProjectTools(rootDir, { target });\n if (!tools.length) {\n console.log(\"No Sidecar tools found.\");\n return;\n }\n\n for (const tool of tools) {\n console.log(`${tool.id} — ${tool.name} (${tool.variant}, ${tool.target})`);\n console.log(` ${tool.description}`);\n console.log(` source: ${tool.sourceFile}`);\n }\n return;\n }\n\n case \"preview\": {\n if (argv[3] !== \"components\") {\n throw new Error(\"Only `sidecar preview components` is supported right now.\");\n }\n\n await previewComponents({\n rootDir,\n host: readOption(argv, \"--host\") ?? \"chatgpt\",\n port: Number(readOption(argv, \"--port\") ?? \"3102\"),\n compare: readOption(argv, \"--compare\") ?? \"native,openai\",\n componentSet: readPreviewComponentSet(readOption(argv, \"--components\")),\n themes: readPreviewThemes(readOption(argv, \"--theme\")),\n approve: !argv.includes(\"--no-approve\"),\n });\n return;\n }\n\n case \"help\":\n default:\n console.log(`Sidecar\n\nUsage:\n sidecar build [--cwd <dir>] [--target mcp|chatgpt|claude] [--out <dir>] [--plugins] [--strict]\n sidecar check [--cwd <dir>] [--target mcp|chatgpt|claude] [--strict]\n sidecar dev [--cwd <dir>] [--target mcp|chatgpt|claude] [--port <port>] [--tunnel [cloudflared|wrangler]]\n sidecar inspect [--cwd <dir>] [--target mcp|chatgpt|claude]\n sidecar preview components [--cwd <dir>] [--host chatgpt|claude|generic] [--compare native,openai] [--components representative|all] [--theme light|dark|both] [--port <port>] [--no-approve]\n`);\n }\n}\n\n/** Reads and validates the build target profile. */\nfunction readTarget(argv: string[]): SidecarTarget {\n const target = readOption(argv, \"--target\") ?? \"mcp\";\n if (target === \"mcp\" || target === \"chatgpt\" || target === \"claude\") {\n return target;\n }\n throw new Error(`Unsupported Sidecar target \"${target}\". Expected mcp, chatgpt, or claude.`);\n}\n\n/** Options for the component parity preview command. */\ntype ComponentPreviewOptions = {\n rootDir: string;\n host: string;\n port: number;\n compare: string;\n componentSet: ComponentPreviewSet;\n themes: ComponentPreviewTheme[];\n approve: boolean;\n};\n\n/** Component inventory rendered in the preview matrix. */\ntype ComponentPreviewSet = \"representative\" | \"all\";\n\n/** Theme variants rendered by the preview matrix. */\ntype ComponentPreviewTheme = \"light\" | \"dark\";\n\n/** Starts a component matrix preview and optionally records human approval. */\nasync function previewComponents(options: ComponentPreviewOptions): Promise<void> {\n const cliDir = path.dirname(fileURLToPath(import.meta.url));\n const css = await readFile(path.join(cliDir, \"../../native/src/styles.css\"), \"utf8\")\n .catch(() => readFile(path.join(process.cwd(), \"packages/native/src/styles.css\"), \"utf8\"))\n .catch(() => \"\");\n const html = renderComponentPreviewHtml(\n options.host,\n options.compare,\n css,\n options.themes,\n options.componentSet,\n );\n const server = createServer((_request, response) => {\n response.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(html);\n });\n\n await new Promise<void>((resolve) => {\n server.listen(options.port, \"127.0.0.1\", resolve);\n });\n\n const url = `http://127.0.0.1:${options.port}`;\n console.log(`Sidecar component preview running at ${url}`);\n console.log(`Compare set: ${options.compare}`);\n console.log(`Component set: ${options.componentSet}`);\n console.log(`Themes: ${options.themes.join(\", \")}`);\n\n if (!options.approve || !stdin.isTTY) {\n return;\n }\n\n const answer = await askYesNo(\n `Do the shared primitives look equivalent for ${options.host}? [y/N] `,\n );\n if (answer) {\n await writeComponentApproval(options.rootDir, {\n host: options.host,\n compare: options.compare.split(\",\").map((entry) => entry.trim()).filter(Boolean),\n approvedAt: new Date().toISOString(),\n components: previewComponentNames(options.componentSet),\n });\n console.log(\"Recorded component parity approval.\");\n } else {\n console.log(\"No approval recorded.\");\n }\n\n server.close();\n}\n\n/** Component parity approval receipt written by the preview command. */\ntype ComponentApproval = {\n host: string;\n compare: string[];\n approvedAt: string;\n components: string[];\n};\n\n/** Writes a local receipt for maintainers reviewing host recipe parity. */\nasync function writeComponentApproval(rootDir: string, approval: ComponentApproval): Promise<void> {\n const dir = path.join(rootDir, \".sidecar\", \"approvals\");\n await mkdir(dir, { recursive: true });\n await writeFile(\n path.join(dir, `components.${approval.host}.json`),\n `${JSON.stringify(approval, null, 2)}\\n`,\n );\n}\n\n/** Asks a yes/no question on the command line. */\nasync function askYesNo(question: string): Promise<boolean> {\n const readline = createInterface({ input: stdin, output: stdout });\n try {\n const answer = await readline.question(question);\n return answer.trim().toLowerCase() === \"y\" || answer.trim().toLowerCase() === \"yes\";\n } finally {\n readline.close();\n }\n}\n\n/** Renders the static preview matrix used for human parity checks. */\nexport function renderComponentPreviewHtml(\n host: string,\n compare: string,\n css: string,\n themes: readonly ComponentPreviewTheme[],\n componentSet: ComponentPreviewSet,\n): string {\n const themeFrames = themes\n .map((theme) =>\n `<section class=\"theme-panel\">\n <div class=\"theme-label\">${escapeHtml(theme)}</div>\n <iframe title=\"${escapeHtml(theme)} component preview\" srcdoc=\"${escapeHtml(renderComponentPreviewFrame(host, compare, css, theme, componentSet))}\"></iframe>\n </section>`,\n )\n .join(\"\");\n\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\" />\n <title>Sidecar component preview</title>\n <style>\n body { background: #f4f4f5; color: #18181b; font: 14px/1.4 ui-sans-serif, -apple-system, system-ui, \"Segoe UI\", sans-serif; margin: 0; padding: 18px; }\n .preview-shell { display: grid; gap: 18px; }\n .theme-panel { display: grid; gap: 8px; }\n .theme-label { font-size: 12px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }\n iframe { background: transparent; border: 1px solid rgb(0 0 0 / 12%); border-radius: 10px; height: 82vh; min-height: 680px; width: 100%; }\n </style>\n </head>\n <body>\n <main class=\"preview-shell\">${themeFrames}</main>\n </body>\n</html>`;\n}\n\n/** Renders one isolated theme frame so root host/theme selectors work normally. */\nexport function renderComponentPreviewFrame(\n host: string,\n compare: string,\n css: string,\n theme: ComponentPreviewTheme,\n componentSet: ComponentPreviewSet,\n): string {\n const columns = compare.split(\",\").map((entry) => entry.trim()).filter(Boolean);\n const cells = columns\n .map((column) => renderPreviewColumn(column, host, componentSet))\n .join(\"\");\n\n return `<!doctype html>\n<html lang=\"en\" data-sidecar-host=\"${escapeHtml(host)}\" data-sidecar-theme=\"${theme}\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Sidecar component preview</title>\n <style>\n ${css}\n html, body { background: var(--sc-surface); }\n body { padding: 24px; }\n .preview-grid { display: grid; gap: 20px; grid-template-columns: repeat(${Math.max(columns.length, 1)}, minmax(240px, 1fr)); }\n .preview-column { display: flex; flex-direction: column; gap: 14px; }\n .preview-group { border-bottom: 1px solid var(--sc-border); display: grid; gap: 10px; padding-bottom: 14px; }\n .preview-group:last-child { border-bottom: 0; }\n .component-label { color: var(--sc-text-muted); font: 600 11px/1.2 var(--sc-font-sans); text-transform: uppercase; }\n .preview-row { align-items: start; display: grid; gap: 8px; }\n .preview-label { color: var(--sc-text-muted); font: 600 12px/1.2 var(--sc-font-sans); text-transform: uppercase; }\n </style>\n </head>\n <body>\n <main class=\"preview-grid\">${cells}</main>\n </body>\n</html>`;\n}\n\n/** Renders one package/recipe column in the preview matrix. */\nfunction renderPreviewColumn(column: string, host: string, componentSet: ComponentPreviewSet): string {\n const recipe = previewRecipe(column, host);\n const groups = componentSet === \"all\"\n ? renderAllPreviewGroups(recipe)\n : renderRepresentativePreviewGroups(recipe);\n return `<section class=\"preview-column\">\n <div class=\"preview-label\">${escapeHtml(column)}</div>\n ${groups}\n </section>`;\n}\n\n/** Maps preview columns to the recipe they exercise. */\nfunction previewRecipe(column: string, host: string): string {\n switch (column) {\n case \"native\":\n return \"auto\";\n case \"native-chatgpt\":\n case \"openai\":\n return \"chatgpt\";\n case \"native-claude\":\n case \"anthropic\":\n return \"claude\";\n default:\n return host;\n }\n}\n\n/** Renders the default representative component set. */\nfunction renderRepresentativePreviewGroups(recipe: string): string {\n return [\n previewGroup(\"Buttons\", buttonsPreview(recipe)),\n previewGroup(\"Fields\", fieldsPreview(recipe)),\n previewGroup(\"Choices\", choicesPreview(recipe)),\n previewGroup(\"Feedback\", feedbackPreview(recipe)),\n previewGroup(\"Loading\", loadingPreview(recipe)),\n ].join(\"\");\n}\n\n/** Renders the full native shared component set. */\nfunction renderAllPreviewGroups(recipe: string): string {\n return [\n previewGroup(\"Text\", textPreview(recipe)),\n previewGroup(\"Buttons\", buttonsPreview(recipe)),\n previewGroup(\"Links\", linksPreview(recipe)),\n previewGroup(\"Fields\", fieldsPreview(recipe)),\n previewGroup(\"Choice Controls\", choicesPreview(recipe)),\n previewGroup(\"Select\", selectPreview(recipe)),\n previewGroup(\"Feedback\", feedbackPreview(recipe)),\n previewGroup(\"Identity\", identityPreview(recipe)),\n previewGroup(\"Empty State\", emptyPreview(recipe)),\n previewGroup(\"Loading\", loadingPreview(recipe)),\n previewGroup(\"Layout\", layoutPreview(recipe)),\n previewGroup(\"Data\", dataPreview(recipe)),\n previewGroup(\"Media\", mediaPreview(recipe)),\n ].join(\"\");\n}\n\n/** Wraps one preview group with a readable label. */\nfunction previewGroup(label: string, body: string): string {\n return `<div class=\"preview-group\"><div class=\"component-label\">${escapeHtml(label)}</div>${body}</div>`;\n}\n\n/** Text and inline typography examples. */\nfunction textPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <h2 data-sc-component=\"heading\" data-sc-level=\"2\" data-sc-recipe=\"${recipe}\">Heading</h2>\n <p data-sc-component=\"text\" data-sc-recipe=\"${recipe}\">Body text follows the active host typography.</p>\n <p data-sc-component=\"text\" data-sc-tone=\"muted\" data-sc-recipe=\"${recipe}\">Muted supporting text</p>\n <code data-sc-component=\"code\" data-sc-recipe=\"${recipe}\">tool_result.id</code>\n <span data-sc-component=\"shimmer-text\" data-sc-recipe=\"${recipe}\">Shimmer text</span>\n </div>`;\n}\n\n/** Button examples. */\nfunction buttonsPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <button data-sc-component=\"button\" data-sc-color=\"primary\" data-sc-variant=\"solid\" data-sc-size=\"md\" data-sc-pill data-sc-recipe=\"${recipe}\" type=\"button\"><span data-sc-component=\"button-label\">Primary</span></button>\n <button data-sc-component=\"button\" data-sc-color=\"secondary\" data-sc-variant=\"soft\" data-sc-size=\"md\" data-sc-pill data-sc-recipe=\"${recipe}\" type=\"button\"><span data-sc-component=\"button-label\">Secondary</span></button>\n <button data-sc-component=\"button\" data-sc-color=\"danger\" data-sc-variant=\"outline\" data-sc-size=\"md\" data-sc-pill data-sc-recipe=\"${recipe}\" type=\"button\"><span data-sc-component=\"button-label\">Danger</span></button>\n <button data-sc-component=\"button\" data-sc-color=\"secondary\" data-sc-variant=\"ghost\" data-sc-size=\"md\" data-sc-pill data-sc-recipe=\"${recipe}\" type=\"button\"><span data-sc-component=\"button-label\">Ghost</span></button>\n <button data-sc-component=\"button\" data-sc-color=\"primary\" data-sc-variant=\"solid\" data-sc-size=\"md\" data-sc-pill data-sc-loading data-sc-recipe=\"${recipe}\" type=\"button\"><span data-sc-component=\"loading-indicator\" data-sc-recipe=\"${recipe}\" style=\"--sc-indicator-size: 1em;\"></span><span data-sc-component=\"button-label\">Loading</span></button>\n </div>`;\n}\n\n/** Link examples. */\nfunction linksPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <a data-sc-component=\"button\" data-sc-color=\"primary\" data-sc-variant=\"solid\" data-sc-size=\"md\" data-sc-pill data-sc-recipe=\"${recipe}\" href=\"#\"><span data-sc-component=\"button-label\">ButtonLink</span></a>\n <a data-sc-component=\"text-link\" data-sc-primary data-sc-underline data-sc-recipe=\"${recipe}\" href=\"#\">TextLink</a>\n </div>`;\n}\n\n/** Field examples. */\nfunction fieldsPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <div data-sc-component=\"form-field\" data-sc-recipe=\"${recipe}\">\n <label data-sc-component=\"field-label\" data-sc-recipe=\"${recipe}\">FormField label</label>\n <span data-sc-component=\"input-shell\" data-sc-variant=\"outline\" data-sc-size=\"md\" data-sc-recipe=\"${recipe}\"><input data-sc-component=\"input\" value=\"Input\" /></span>\n <p data-sc-component=\"field-description\" data-sc-recipe=\"${recipe}\">Field description</p>\n </div>\n <span data-sc-component=\"input-shell\" data-sc-variant=\"soft\" data-sc-size=\"md\" data-sc-recipe=\"${recipe}\"><span data-sc-component=\"input-adornment\">$</span><input data-sc-component=\"input\" value=\"Soft input\" /></span>\n <textarea data-sc-component=\"textarea\" data-sc-variant=\"outline\" data-sc-size=\"md\" data-sc-recipe=\"${recipe}\">Textarea</textarea>\n <div data-sc-component=\"form-field\" data-sc-invalid data-sc-recipe=\"${recipe}\">\n <span data-sc-component=\"input-shell\" data-sc-invalid data-sc-variant=\"outline\" data-sc-size=\"md\" data-sc-recipe=\"${recipe}\"><input data-sc-component=\"input\" value=\"Invalid\" aria-invalid=\"true\" /></span>\n <p data-sc-component=\"field-error\" data-sc-recipe=\"${recipe}\">Field error</p>\n </div>\n </div>`;\n}\n\n/** Choice-control examples. */\nfunction choicesPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <label data-sc-component=\"checkbox-label\" data-sc-recipe=\"${recipe}\"><button data-sc-component=\"checkbox\" data-sc-checked data-sc-recipe=\"${recipe}\" role=\"checkbox\" aria-checked=\"true\" type=\"button\"></button><span>Checkbox</span></label>\n <label data-sc-component=\"switch-label\" data-sc-recipe=\"${recipe}\"><button data-sc-component=\"switch\" data-sc-checked data-sc-recipe=\"${recipe}\" role=\"switch\" aria-checked=\"true\" type=\"button\"><span data-sc-component=\"switch-thumb\"></span></button><span>Switch</span></label>\n <div data-sc-component=\"radio-group\" data-sc-direction=\"row\" data-sc-recipe=\"${recipe}\" role=\"radiogroup\">\n <button data-sc-component=\"radio-item\" data-sc-checked data-sc-recipe=\"${recipe}\" role=\"radio\" aria-checked=\"true\" type=\"button\"><span data-sc-component=\"radio-indicator\"></span><span data-sc-component=\"radio-label\">List</span></button>\n <button data-sc-component=\"radio-item\" data-sc-recipe=\"${recipe}\" role=\"radio\" aria-checked=\"false\" type=\"button\"><span data-sc-component=\"radio-indicator\"></span><span data-sc-component=\"radio-label\">Grid</span></button>\n </div>\n <div data-sc-component=\"segmented-control\" data-sc-size=\"md\" data-sc-recipe=\"${recipe}\"><button data-sc-component=\"segmented-option\" data-sc-selected type=\"button\">List</button><button data-sc-component=\"segmented-option\" type=\"button\">Grid</button></div>\n <input data-sc-component=\"slider\" data-sc-recipe=\"${recipe}\" type=\"range\" value=\"60\" />\n </div>`;\n}\n\n/** Select examples. */\nfunction selectPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <span data-sc-component=\"select-control\" data-sc-variant=\"outline\" data-sc-size=\"md\" data-sc-selected data-sc-recipe=\"${recipe}\"><span data-sc-component=\"select-control-value\">Selected option</span><span data-sc-component=\"select-dropdown-icon\">▾</span></span>\n <div data-sc-component=\"select\" data-sc-open data-sc-recipe=\"${recipe}\">\n <span data-sc-component=\"select-control\" data-sc-variant=\"outline\" data-sc-size=\"md\" data-sc-selected data-sc-recipe=\"${recipe}\"><span data-sc-component=\"select-control-value\">CSV</span><span data-sc-component=\"select-dropdown-icon\">▾</span></span>\n <div data-sc-component=\"select-list\" data-sc-recipe=\"${recipe}\" role=\"listbox\">\n <button data-sc-component=\"select-option\" data-sc-selected role=\"option\" aria-selected=\"true\" type=\"button\"><span data-sc-component=\"select-option-label\">CSV</span><span data-sc-component=\"select-option-description\">Comma-separated values</span></button>\n <button data-sc-component=\"select-option\" role=\"option\" aria-selected=\"false\" type=\"button\"><span data-sc-component=\"select-option-label\">PDF</span><span data-sc-component=\"select-option-description\">Portable document</span></button>\n </div>\n </div>\n </div>`;\n}\n\n/** Feedback examples. */\nfunction feedbackPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <div data-sc-component=\"alert\" data-sc-color=\"info\" data-sc-variant=\"soft\" data-sc-recipe=\"${recipe}\"><span data-sc-component=\"alert-indicator\">•</span><div data-sc-component=\"alert-content\"><div data-sc-component=\"alert-title\">Alert</div><div data-sc-component=\"alert-description\">Native recipe check</div></div></div>\n <span data-sc-component=\"badge\" data-sc-color=\"success\" data-sc-variant=\"soft\" data-sc-size=\"sm\" data-sc-recipe=\"${recipe}\">Badge</span>\n <span data-sc-component=\"badge\" data-sc-color=\"danger\" data-sc-variant=\"outline\" data-sc-size=\"md\" data-sc-pill data-sc-recipe=\"${recipe}\">Pill badge</span>\n </div>`;\n}\n\n/** Avatar and identity examples. */\nfunction identityPreview(recipe: string): string {\n return `<div data-sc-component=\"avatar-group\" data-sc-recipe=\"${recipe}\">\n <span data-sc-component=\"avatar\" data-sc-color=\"primary\" data-sc-variant=\"solid\" data-sc-recipe=\"${recipe}\" style=\"--sc-avatar-size: 32px;\">SD</span>\n <span data-sc-component=\"avatar\" data-sc-color=\"secondary\" data-sc-variant=\"soft\" data-sc-recipe=\"${recipe}\" style=\"--sc-avatar-size: 32px;\">+3</span>\n </div>`;\n}\n\n/** Empty-message examples. */\nfunction emptyPreview(recipe: string): string {\n return `<div data-sc-component=\"empty-message\" data-sc-fill=\"static\" data-sc-recipe=\"${recipe}\">\n <div data-sc-component=\"empty-message-icon\" data-sc-color=\"secondary\" data-sc-size=\"md\" data-sc-recipe=\"${recipe}\">□</div>\n <div data-sc-component=\"empty-message-title\" data-sc-color=\"secondary\" data-sc-recipe=\"${recipe}\">No results</div>\n <div data-sc-component=\"empty-message-description\">Try another filter.</div>\n <div data-sc-component=\"empty-message-actions\"><button data-sc-component=\"button\" data-sc-color=\"secondary\" data-sc-variant=\"soft\" data-sc-size=\"sm\" data-sc-pill data-sc-recipe=\"${recipe}\" type=\"button\"><span data-sc-component=\"button-label\">Reset</span></button></div>\n </div>`;\n}\n\n/** Loading examples. */\nfunction loadingPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <div data-sc-component=\"loading-dots\" data-sc-recipe=\"${recipe}\"><span></span><span></span><span></span></div>\n <span data-sc-component=\"loading-indicator\" data-sc-recipe=\"${recipe}\" style=\"--sc-indicator-size: 24px;\"></span>\n <span data-sc-component=\"circular-progress\" data-sc-recipe=\"${recipe}\" style=\"--sc-progress-size: 28px;\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"color-mix(in srgb, currentColor 18%, transparent)\" stroke-width=\"2\"></circle><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-dasharray=\"62.8\" stroke-dashoffset=\"18\" stroke-linecap=\"round\" transform=\"rotate(-90 12 12)\"></circle></svg></span>\n <div data-sc-component=\"skeleton\" data-sc-recipe=\"${recipe}\" style=\"width: 100%; height: 24px;\"></div>\n </div>`;\n}\n\n/** Layout primitive examples. */\nfunction layoutPreview(recipe: string): string {\n return `<div data-sc-component=\"stack\" data-sc-gap=\"sm\" data-sc-recipe=\"${recipe}\">\n <div data-sc-component=\"surface\" data-sc-variant=\"card\" data-sc-recipe=\"${recipe}\"><p data-sc-component=\"text\" data-sc-recipe=\"${recipe}\">Card surface</p></div>\n <div data-sc-component=\"surface\" data-sc-variant=\"inset\" data-sc-recipe=\"${recipe}\"><p data-sc-component=\"text\" data-sc-recipe=\"${recipe}\">Inset surface</p></div>\n <div data-sc-component=\"inline\" data-sc-gap=\"sm\" data-sc-recipe=\"${recipe}\"><span data-sc-component=\"badge\" data-sc-recipe=\"${recipe}\">Inline</span><span data-sc-component=\"badge\" data-sc-recipe=\"${recipe}\">Row</span></div>\n <hr data-sc-component=\"divider\" data-sc-recipe=\"${recipe}\" />\n <div data-sc-component=\"tabs\" data-sc-recipe=\"${recipe}\"><div data-sc-component=\"segmented-control\" data-sc-size=\"sm\" data-sc-recipe=\"${recipe}\"><button data-sc-component=\"segmented-option\" data-sc-selected type=\"button\">One</button><button data-sc-component=\"segmented-option\" type=\"button\">Two</button></div></div>\n </div>`;\n}\n\n/** Data display examples. */\nfunction dataPreview(recipe: string): string {\n return `<div class=\"preview-row\">\n <dl data-sc-component=\"key-value\" data-sc-recipe=\"${recipe}\">\n <div data-sc-component=\"key-value-row\"><dt>Status</dt><dd>Ready</dd></div>\n <div data-sc-component=\"key-value-row\"><dt>Target</dt><dd>ChatGPT</dd></div>\n </dl>\n <table data-sc-component=\"table\" data-sc-recipe=\"${recipe}\"><tbody><tr><th>Name</th><td>Sidecar</td></tr><tr><th>Version</th><td>alpha</td></tr></tbody></table>\n <progress data-sc-component=\"progress\" data-sc-recipe=\"${recipe}\" value=\"70\" max=\"100\"></progress>\n </div>`;\n}\n\n/** Media examples. */\nfunction mediaPreview(recipe: string): string {\n return `<svg data-sc-component=\"image\" data-sc-recipe=\"${recipe}\" viewBox=\"0 0 320 120\" role=\"img\" aria-label=\"Preview image\">\n <rect width=\"320\" height=\"120\" rx=\"12\" fill=\"currentColor\" opacity=\"0.08\"></rect>\n <circle cx=\"64\" cy=\"60\" r=\"28\" fill=\"currentColor\" opacity=\"0.18\"></circle>\n <rect x=\"112\" y=\"42\" width=\"150\" height=\"12\" rx=\"6\" fill=\"currentColor\" opacity=\"0.2\"></rect>\n <rect x=\"112\" y=\"66\" width=\"104\" height=\"10\" rx=\"5\" fill=\"currentColor\" opacity=\"0.14\"></rect>\n </svg>`;\n}\n\n/** Returns the components represented in a preview set. */\nexport function previewComponentNames(componentSet: ComponentPreviewSet): string[] {\n if (componentSet === \"representative\") {\n return [\n \"Button\",\n \"Input\",\n \"SelectControl\",\n \"Checkbox\",\n \"Switch\",\n \"RadioGroup\",\n \"SegmentedControl\",\n \"Alert\",\n \"Badge\",\n \"Skeleton\",\n ];\n }\n\n return [\n \"Alert\",\n \"Avatar\",\n \"AvatarGroup\",\n \"Badge\",\n \"Button\",\n \"ButtonLink\",\n \"Checkbox\",\n \"CircularProgress\",\n \"Code\",\n \"CopyButton\",\n \"Divider\",\n \"EmptyMessage\",\n \"FieldDescription\",\n \"FieldError\",\n \"FieldLabel\",\n \"FormField\",\n \"Heading\",\n \"Image\",\n \"Inline\",\n \"Input\",\n \"KeyValue\",\n \"LoadingDots\",\n \"LoadingIndicator\",\n \"Progress\",\n \"RadioGroup\",\n \"SegmentedControl\",\n \"Select\",\n \"SelectControl\",\n \"ShimmerText\",\n \"Skeleton\",\n \"Slider\",\n \"Stack\",\n \"Surface\",\n \"Switch\",\n \"Table\",\n \"Tabs\",\n \"Text\",\n \"Textarea\",\n \"TextLink\",\n ];\n}\n\n/** Parses the component inventory selected for the preview command. */\nexport function readPreviewComponentSet(value: string | undefined): ComponentPreviewSet {\n if (!value || value === \"representative\") {\n return \"representative\";\n }\n if (value === \"all\") {\n return value;\n }\n throw new Error(`Unsupported component preview set \"${value}\". Expected representative or all.`);\n}\n\n/** Parses the theme set selected for the preview command. */\nexport function readPreviewThemes(value: string | undefined): ComponentPreviewTheme[] {\n if (!value || value === \"light\") {\n return [\"light\"];\n }\n if (value === \"dark\") {\n return [\"dark\"];\n }\n if (value === \"both\") {\n return [\"light\", \"dark\"];\n }\n\n const themes = value.split(\",\").map((entry) => entry.trim()).filter(Boolean);\n if (themes.every((theme): theme is ComponentPreviewTheme => theme === \"light\" || theme === \"dark\")) {\n return themes;\n }\n throw new Error(`Unsupported component preview theme \"${value}\". Expected light, dark, both, or a comma-separated light,dark list.`);\n}\n\n/** Escapes user-controlled strings before inserting them into preview HTML. */\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (character) => {\n switch (character) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"\\\"\":\n return \"&quot;\";\n default:\n return \"&#39;\";\n }\n });\n}\n\n/** Reads `--tunnel`, supporting either a bare flag or an explicit provider. */\nfunction readTunnelProvider(argv: string[]): TunnelProvider | undefined {\n const index = argv.indexOf(\"--tunnel\");\n if (index === -1) {\n return undefined;\n }\n\n const value = argv[index + 1];\n if (value === \"cloudflared\" || value === \"wrangler\") {\n return value;\n }\n return \"auto\";\n}\n\n/** Prints diagnostics in an editor-friendly file:line:column format. */\nfunction printDiagnostics(diagnostics: SidecarDiagnostic[]): void {\n for (const diagnostic of diagnostics) {\n console.warn(formatDiagnostic(diagnostic));\n }\n}\n\n/** Loads `auth.ts` at runtime for the dev server when present. */\nasync function loadRuntimeAuth(rootDir: string): Promise<SidecarAuth | undefined> {\n const authPath = path.join(rootDir, \"auth.ts\");\n if (!existsSync(authPath)) {\n return undefined;\n }\n\n const parentURL = pathToFileURL(path.join(rootDir, \"sidecar.config.ts\")).href;\n const tsconfigPath = path.join(rootDir, \"tsconfig.json\");\n const tsconfig = existsSync(tsconfigPath) ? tsconfigPath : false;\n const module = (await tsImport(pathToFileURL(authPath).href, {\n parentURL,\n tsconfig\n })) as { default?: unknown };\n\n if (!isSidecarAuth(module.default)) {\n throw new Error(\"auth.ts must default-export auth({ ... }) from sidecar-ai.\");\n }\n\n return module.default;\n}\n\n/** Loads `proxy.ts` at runtime for the dev server when present. */\nasync function loadRuntimeProxy(rootDir: string): Promise<SidecarProxy | undefined> {\n const proxyPath = path.join(rootDir, \"proxy.ts\");\n if (!existsSync(proxyPath)) {\n return undefined;\n }\n\n const parentURL = pathToFileURL(path.join(rootDir, \"sidecar.config.ts\")).href;\n const tsconfigPath = path.join(rootDir, \"tsconfig.json\");\n const tsconfig = existsSync(tsconfigPath) ? tsconfigPath : false;\n const module = (await tsImport(pathToFileURL(proxyPath).href, {\n parentURL,\n tsconfig\n })) as { default?: unknown };\n\n if (!isSidecarProxy(module.default)) {\n throw new Error(\"proxy.ts must default-export proxy({ ... }) from @sidecar-ai/server/proxy.\");\n }\n\n return module.default;\n}\n\n/** Loads `sidecar.config.ts` at runtime so dev can honor function overrides. */\nasync function loadRuntimeConfig(rootDir: string): Promise<SidecarConfig | undefined> {\n const configPath = path.join(rootDir, \"sidecar.config.ts\");\n if (!existsSync(configPath)) {\n return undefined;\n }\n\n const parentURL = pathToFileURL(configPath).href;\n const tsconfigPath = path.join(rootDir, \"tsconfig.json\");\n const tsconfig = existsSync(tsconfigPath) ? tsconfigPath : false;\n const module = (await tsImport(pathToFileURL(configPath).href, {\n parentURL,\n tsconfig\n })) as { default?: unknown };\n\n if (!module.default || typeof module.default !== \"object\") {\n throw new Error(\"sidecar.config.ts must default-export defineConfig({ ... }) from sidecar-ai.\");\n }\n\n return module.default as SidecarConfig;\n}\n\n/** Imports built-time discovered tools for the dev server. */\nasync function loadRuntimeTools(rootDir: string, manifest: SidecarManifest): Promise<LoadedTool[]> {\n const parentURL = pathToFileURL(path.join(rootDir, \"sidecar.config.ts\")).href;\n const tsconfigPath = path.join(rootDir, \"tsconfig.json\");\n const tsconfig = existsSync(tsconfigPath) ? tsconfigPath : false;\n const loaded: LoadedTool[] = [];\n\n for (const entry of manifest.tools) {\n const sourcePath = path.join(rootDir, entry.sourceFile);\n const module = (await tsImport(pathToFileURL(sourcePath).href, {\n parentURL,\n tsconfig\n })) as { default?: unknown };\n\n if (!isSidecarTool(module.default)) {\n throw new Error(`${entry.sourceFile} did not default-export a Sidecar tool.`);\n }\n\n loaded.push({\n tool: module.default,\n descriptor: entry.descriptor\n });\n }\n\n return loaded;\n}\n\n/** Reads generated widget resources so the dev server can serve them through MCP. */\nasync function loadResources(rootDir: string, outDir: string, manifest: SidecarManifest): Promise<LoadedResource[]> {\n const resources: LoadedResource[] = [];\n for (const entry of manifest.tools) {\n if (!entry.widget?.outputFile) {\n continue;\n }\n\n const text = await readFile(path.join(rootDir, outDir, entry.widget.outputFile), \"utf8\");\n resources.push({\n uri: entry.widget.resourceUri,\n name: entry.name,\n description: entry.widget.options?.description,\n mimeType: MCP_APP_RESOURCE_MIME_TYPE,\n text,\n _meta: entry.widget.resourceMeta\n });\n }\n\n const parentURL = pathToFileURL(path.join(rootDir, \"sidecar.config.ts\")).href;\n const tsconfigPath = path.join(rootDir, \"tsconfig.json\");\n const tsconfig = existsSync(tsconfigPath) ? tsconfigPath : false;\n for (const entry of manifest.resources) {\n const sourcePath = path.join(rootDir, entry.sourceFile);\n const module = (await tsImport(pathToFileURL(sourcePath).href, {\n parentURL,\n tsconfig\n })) as { default?: unknown };\n\n if (!isSidecarResource(module.default)) {\n throw new Error(`${entry.sourceFile} did not default-export a Sidecar resource.`);\n }\n\n resources.push({\n uri: entry.uri,\n descriptor: entry.descriptor,\n resource: module.default,\n });\n }\n\n return resources;\n}\n\n/** Imports build-time discovered prompts for the dev server. */\nasync function loadRuntimePrompts(rootDir: string, manifest: SidecarManifest): Promise<LoadedPrompt[]> {\n const parentURL = pathToFileURL(path.join(rootDir, \"sidecar.config.ts\")).href;\n const tsconfigPath = path.join(rootDir, \"tsconfig.json\");\n const tsconfig = existsSync(tsconfigPath) ? tsconfigPath : false;\n const loaded: LoadedPrompt[] = [];\n\n for (const entry of manifest.prompts) {\n const sourcePath = path.join(rootDir, entry.sourceFile);\n const module = (await tsImport(pathToFileURL(sourcePath).href, {\n parentURL,\n tsconfig\n })) as { default?: unknown };\n\n if (!isSidecarPrompt(module.default)) {\n throw new Error(`${entry.sourceFile} did not default-export a Sidecar prompt.`);\n }\n\n loaded.push({\n prompt: module.default,\n descriptor: entry.descriptor,\n });\n }\n\n return loaded;\n}\n\n/** Reads a simple `--name value` option from argv. */\nfunction readOption(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n if (index === -1) {\n return undefined;\n }\n return argv[index + 1];\n}\n\n/** Returns true when this module is being executed as the CLI entrypoint. */\nfunction isDirectRun(): boolean {\n const entry = process.argv[1];\n if (!entry) {\n return false;\n }\n\n const entryPath = realpathSync.native(entry);\n return import.meta.url === pathToFileURL(entryPath).href;\n}\n\nif (isDirectRun()) {\n main(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n exit(1);\n });\n}\n","/**\n * Provider-agnostic auth helpers for Sidecar MCP servers.\n *\n * Sidecar acts as the OAuth resource server. User code validates bearer tokens\n * in `session()` and returns an `AuthSession` that tools can consume.\n */\nimport type {\n AuthScopeDefinition,\n MaybePromise,\n ToolAuthPolicy,\n} from \"@sidecar-ai/core\";\n\n/** Internal session shape Sidecar expects after provider-specific token validation. */\nexport type AuthSession<\n Claims extends Record<string, unknown> = Record<string, unknown>,\n Extra extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Scope ids present in the accepted access token. */\n scopes: readonly string[];\n /** Human or account identity when the token represents a user. */\n userId?: string;\n /** OAuth subject. Useful when the subject is not a human user id. */\n subject?: string;\n /** OAuth client id when available. */\n clientId?: string;\n /** Token expiry after successful verification. */\n expiresAt?: Date;\n /** Raw bearer token, if the app wants it in tool context. */\n token?: string;\n /** Verified provider claims. */\n claims?: Claims;\n} & Extra;\n\n/** Typed scope object exported from `auth.ts` and imported by tool files. */\nexport type Scope<\n Id extends string = string,\n Session extends AuthSession = AuthSession,\n> = AuthScopeDefinition<Id, Session>;\n\n/** Named set of scopes advertised by an MCP resource server. */\nexport type ScopeCatalog<Session extends AuthSession = AuthSession> = Record<\n string,\n Scope<string, Session>\n>;\n\n/** Fetch request augmented with a safe bearer-token reader. */\nexport type AuthRequest = Request & {\n bearerToken(): string | undefined;\n};\n\n/** Auth failure translated to HTTP challenge data and JSON-RPC error metadata. */\nexport type AuthChallenge = {\n ok: false;\n status: 401 | 403;\n headers: Headers;\n body: {\n error: string;\n error_description?: string;\n };\n};\n\n/** Auth success with the typed application session. */\nexport type AuthSuccess<Session extends AuthSession = AuthSession> = {\n ok: true;\n auth: Session;\n};\n\n/** Result of request-level or tool-level authorization. */\nexport type AuthResult<Session extends AuthSession = AuthSession> =\n | AuthSuccess<Session>\n | AuthChallenge;\n\n/** Definition accepted by `auth()` in an app's reserved `auth.ts` file. */\nexport type AuthDefinition<\n Scopes extends ScopeCatalog,\n Session extends AuthSession,\n> = {\n /** Canonical MCP resource URL. Access tokens must be issued for this audience/resource. */\n resource: string;\n /** OAuth authorization servers that can issue tokens for this MCP resource. */\n authorizationServers: string[];\n /** Scope objects this MCP server advertises and enforces. */\n scopes: Scopes;\n /** Validates the bearer token and returns Sidecar's internal session shape. */\n session(request: AuthRequest): MaybePromise<Session | null | undefined>;\n};\n\n/** Branded auth configuration consumed by Sidecar runtimes. */\nexport type SidecarAuth<\n Scopes extends ScopeCatalog = ScopeCatalog,\n Session extends AuthSession = AuthSession,\n> = Omit<AuthDefinition<Scopes, Session>, \"scopes\"> & {\n readonly kind: \"sidecar.auth\";\n readonly scopes: BindScopeCatalog<Scopes, Session>;\n metadata(): ProtectedResourceMetadata;\n protectedResourceMetadata(): Response;\n withResource(resource: string): SidecarAuth<Scopes, Session>;\n authorizeRequest(request: Request): Promise<AuthResult<Session>>;\n authorizeTool(\n policy: ToolAuthPolicy<Session> | undefined,\n auth: Session,\n ): AuthResult<Session>;\n};\n\n/** OAuth protected resource metadata advertised to MCP clients. */\nexport type ProtectedResourceMetadata = {\n resource: string;\n authorization_servers: string[];\n scopes_supported: string[];\n bearer_methods_supported: [\"header\"];\n};\n\n/** Binds every declared scope object to the session inferred from `auth()`. */\ntype BindScopeCatalog<\n Scopes extends ScopeCatalog,\n Session extends AuthSession,\n> = {\n readonly [Key in keyof Scopes]: Scopes[Key] extends Scope<\n infer Id,\n AuthSession\n >\n ? Scope<Id, Session>\n : never;\n};\n\nconst authBrand = Symbol.for(\"sidecar.auth\");\n\n/** Creates a typed scope object for use in `auth.ts` and `tool.ts`. */\nexport function scope<const Id extends string>(\n id: Id,\n description: string,\n): Scope<Id> {\n if (!id.trim()) {\n throw new SidecarAuthError(\"Scope id is required.\");\n }\n if (!description.trim()) {\n throw new SidecarAuthError(`Scope \"${id}\" must include a description.`);\n }\n\n return Object.freeze({\n kind: \"sidecar.scope\" as const,\n id,\n description,\n });\n}\n\n/**\n * Declares Sidecar auth for an MCP resource server.\n *\n * The returned object handles MCP-facing metadata/challenges while delegating\n * provider-specific token verification to `definition.session`.\n */\nexport function auth<\n const Scopes extends ScopeCatalog,\n Session extends AuthSession,\n>(definition: AuthDefinition<Scopes, Session>): SidecarAuth<Scopes, Session> {\n validateAuthDefinition(definition);\n const scopeIds = new Set(\n Object.values(definition.scopes).map((entry) => entry.id),\n );\n\n return Object.freeze({\n ...definition,\n kind: \"sidecar.auth\" as const,\n scopes: definition.scopes as unknown as BindScopeCatalog<Scopes, Session>,\n [authBrand]: true,\n\n metadata(): ProtectedResourceMetadata {\n return protectedResourceMetadata({\n resource: definition.resource,\n authorizationServers: definition.authorizationServers,\n scopes: definition.scopes,\n });\n },\n\n protectedResourceMetadata(): Response {\n return Response.json(this.metadata());\n },\n\n withResource(resource: string): SidecarAuth<Scopes, Session> {\n return auth({\n ...definition,\n resource,\n });\n },\n\n async authorizeRequest(request: Request): Promise<AuthResult<Session>> {\n const authRequest = createAuthRequest(request);\n if (!authRequest.bearerToken()) {\n return challenge({\n resource: definition.resource,\n description: \"Missing bearer token.\",\n });\n }\n\n const session = await definition.session(authRequest);\n if (!session) {\n return challenge({\n resource: definition.resource,\n description: \"Invalid bearer token.\",\n });\n }\n\n assertSession(session);\n return { ok: true, auth: session };\n },\n\n authorizeTool(\n policy: ToolAuthPolicy<Session> | undefined,\n authSession: Session,\n ): AuthResult<Session> {\n const requiredScopes =\n policy && policy.public !== true && \"scopes\" in policy\n ? (policy.scopes?.map((entry) => entry.id) ?? [])\n : [];\n const unknownScopes = requiredScopes.filter((id) => !scopeIds.has(id));\n if (unknownScopes.length) {\n throw new SidecarAuthError(\n `Tool requires scope${unknownScopes.length === 1 ? \"\" : \"s\"} not declared in auth.ts: ${unknownScopes.join(\", \")}.`,\n );\n }\n\n if (!hasScopes(authSession.scopes, requiredScopes)) {\n return challenge({\n resource: definition.resource,\n scopes: requiredScopes,\n description: \"The authenticated session lacks required tool scopes.\",\n status: 403,\n });\n }\n\n return { ok: true, auth: authSession };\n },\n }) as SidecarAuth<Scopes, Session>;\n}\n\n/** Returns true when a value was produced by `auth()`. */\nexport function isSidecarAuth(value: unknown): value is SidecarAuth {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as Record<symbol, unknown>)[authBrand],\n );\n}\n\n/** Adds `bearerToken()` to a fetch Request without changing the original headers. */\nexport function createAuthRequest(request: Request): AuthRequest {\n return Object.assign(request, {\n bearerToken() {\n return readBearerToken(request);\n },\n });\n}\n\n/** Reads an RFC 6750 bearer token from the Authorization header. */\nexport function readBearerToken(request: Request): string | undefined {\n const authorization = request.headers.get(\"authorization\");\n if (!authorization) {\n return undefined;\n }\n\n const [scheme, token] = authorization.split(/\\s+/, 2);\n const parts = authorization.trim().split(/\\s+/);\n if (parts.length !== 2 || scheme?.toLowerCase() !== \"bearer\" || !token) {\n return undefined;\n }\n\n return token;\n}\n\n/** Builds the protected resource metadata document exposed by HTTP runtimes. */\nexport function protectedResourceMetadata(options: {\n resource: string;\n authorizationServers: string[];\n scopes: ScopeCatalog | Record<string, string>;\n}): ProtectedResourceMetadata {\n return {\n resource: options.resource,\n authorization_servers: options.authorizationServers,\n scopes_supported: Object.values(options.scopes).map((entry) =>\n typeof entry === \"string\" ? entry : entry.id,\n ),\n bearer_methods_supported: [\"header\"],\n };\n}\n\n/** Returns the well-known protected resource metadata URL for an MCP endpoint. */\nexport function protectedResourceMetadataUrl(resource: string): string {\n const url = new URL(resource);\n const path = url.pathname === \"/\" ? \"\" : url.pathname.replace(/\\/+$/, \"\");\n url.pathname = `/.well-known/oauth-protected-resource${path}`;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\n/** Builds a Bearer challenge used for missing, invalid, or insufficient scopes. */\nexport function challenge(options: {\n resource: string;\n resourceMetadata?: string;\n scopes?: readonly string[];\n description?: string;\n status?: 401 | 403;\n}): AuthChallenge {\n const params = [\n options.status === 403 ? `error=\"insufficient_scope\"` : undefined,\n `resource_metadata=${JSON.stringify(options.resourceMetadata ?? protectedResourceMetadataUrl(options.resource))}`,\n options.scopes?.length\n ? `scope=${JSON.stringify(options.scopes.join(\" \"))}`\n : undefined,\n options.description ? `error_description=${JSON.stringify(options.description)}` : undefined,\n ].filter(Boolean);\n\n return {\n ok: false,\n status: options.status ?? 401,\n headers: new Headers({\n \"www-authenticate\": `Bearer ${params.join(\", \")}`,\n }),\n body: {\n error: options.status === 403 ? \"insufficient_scope\" : \"invalid_token\",\n error_description: options.description,\n },\n };\n}\n\n/** Returns true when all required scopes are present in the session. */\nexport function hasScopes(\n actual: readonly string[],\n required: readonly string[],\n): boolean {\n const actualSet = new Set(actual);\n return required.every((requiredScope) => actualSet.has(requiredScope));\n}\n\n/** Error thrown for invalid auth declarations or invalid session objects. */\nexport class SidecarAuthError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SidecarAuthError\";\n }\n}\n\n/** Validates the static shape of an auth declaration. */\nfunction validateAuthDefinition(\n definition: AuthDefinition<ScopeCatalog, AuthSession>,\n): void {\n if (!definition.resource.trim()) {\n throw new SidecarAuthError(\"auth({ resource }) is required.\");\n }\n validateResourceUri(definition.resource);\n if (!definition.authorizationServers.length) {\n throw new SidecarAuthError(\n \"auth({ authorizationServers }) must include at least one authorization server.\",\n );\n }\n for (const authorizationServer of definition.authorizationServers) {\n validateAuthorizationServerUri(authorizationServer);\n }\n}\n\n/** Ensures user-supplied `session()` output has the fields Sidecar needs. */\nfunction assertSession(session: AuthSession): void {\n if (!Array.isArray(session.scopes)) {\n throw new SidecarAuthError(\n \"auth.session() must return an AuthSession with a scopes array.\",\n );\n }\n}\n\n/** Validates the canonical MCP resource URI used for OAuth audience binding. */\nfunction validateResourceUri(resource: string): void {\n let url: URL;\n try {\n url = new URL(resource);\n } catch {\n throw new SidecarAuthError(\"auth({ resource }) must be an absolute URI.\");\n }\n\n if (url.hash) {\n throw new SidecarAuthError(\"auth({ resource }) must not include a URI fragment.\");\n }\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && isLocalHost(url.hostname))) {\n throw new SidecarAuthError(\"auth({ resource }) must use https, except for localhost development.\");\n }\n}\n\n/** Validates OAuth authorization server metadata origins. */\nfunction validateAuthorizationServerUri(value: string): void {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new SidecarAuthError(\"auth({ authorizationServers }) entries must be absolute URLs.\");\n }\n\n if (url.hash) {\n throw new SidecarAuthError(\"auth({ authorizationServers }) entries must not include fragments.\");\n }\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && isLocalHost(url.hostname))) {\n throw new SidecarAuthError(\"auth({ authorizationServers }) entries must use https, except for localhost development.\");\n }\n}\n\n/** Returns true for localhost names accepted in development auth metadata. */\nfunction isLocalHost(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\";\n}\n","/**\n * Core Sidecar authoring primitives.\n *\n * This package intentionally has no host or transport dependency. It defines\n * the stable contracts used by the compiler, MCP runtime, auth package, and\n * widget bridge.\n */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/** JSON-compatible data accepted in MCP structured content and metadata. */\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\n\n/** JSON object shorthand used by MCP content blocks and descriptors. */\nexport type JsonObject = { [key: string]: JsonValue };\n\n/** Value that may be returned synchronously or asynchronously. */\nexport type MaybePromise<T> = T | Promise<T>;\n\n/** MIME type required for HTML MCP Apps resources. */\nexport const MCP_APP_RESOURCE_MIME_TYPE = \"text/html;profile=mcp-app\";\n\n/** Project-level metadata declared from `sidecar.config.ts`. */\nexport type SidecarConfig = {\n /** Human-readable app/server name used in generated manifests. */\n name: string;\n /** Semver-ish app version used in generated manifests and plugin output. */\n version: string;\n /** Short app description used by hosts and generated install docs. */\n description: string;\n /** Server-level MCP resource capabilities. */\n resources?: ResourceCapabilityConfig;\n /** Server-level MCP prompt capabilities. */\n prompts?: PromptCapabilityConfig;\n /** Server-level MCP tool capabilities. */\n tools?: ToolCapabilityConfig;\n /** Cursor pagination defaults for MCP list operations. */\n pagination?: PaginationConfig;\n};\n\n/** MCP list operations that support cursor pagination. */\nexport type McpListOperation =\n | \"tools/list\"\n | \"resources/list\"\n | \"resources/templates/list\"\n | \"prompts/list\";\n\n/** Configures server-level resource capabilities. */\nexport type ResourceCapabilityConfig = {\n /** Whether the runtime accepts `resources/subscribe` and `resources/unsubscribe`. */\n subscribe?: boolean;\n /** Whether the runtime may emit `notifications/resources/list_changed`. */\n listChanged?: boolean;\n};\n\n/** Configures server-level prompt capabilities. */\nexport type PromptCapabilityConfig = {\n /** Whether the runtime may emit `notifications/prompts/list_changed`. */\n listChanged?: boolean;\n};\n\n/** Configures server-level tool capabilities. */\nexport type ToolCapabilityConfig = {\n /** Whether the runtime may emit `notifications/tools/list_changed`. */\n listChanged?: boolean;\n};\n\n/** Context passed to project-level pagination overrides. */\nexport type PaginationContext<Auth = unknown> = {\n operation: McpListOperation;\n cursor?: string;\n pageSize: number;\n auth?: Auth;\n};\n\n/** Input accepted by a project-level pagination override. */\nexport type PaginationOverrideInput<Item = unknown, Auth = unknown> =\n PaginationContext<Auth> & {\n items: readonly Item[];\n };\n\n/** Result returned by a project-level pagination override. */\nexport type PaginationResult<Item = unknown> = {\n items: readonly Item[];\n nextCursor?: string;\n};\n\n/** Custom pagination function used for one or more MCP list operations. */\nexport type PaginationOverride<Item = unknown, Auth = unknown> = (\n input: PaginationOverrideInput<Item, Auth>\n) => MaybePromise<PaginationResult<Item>>;\n\n/** Operation-specific pagination overrides. Specific keys win over `default`. */\nexport type PaginationOverrideMap<Auth = unknown> = {\n default?: PaginationOverride<unknown, Auth>;\n toolsList?: PaginationOverride<unknown, Auth>;\n resourcesList?: PaginationOverride<unknown, Auth>;\n resourceTemplatesList?: PaginationOverride<unknown, Auth>;\n promptsList?: PaginationOverride<unknown, Auth>;\n};\n\n/** Project-level cursor pagination config. */\nexport type PaginationConfig<Auth = unknown> = {\n /** Server-chosen page size. Clients must treat cursors as opaque and must not assume this value. */\n pageSize?: number;\n /** One override for all list operations, or specific overrides keyed by operation. */\n override?: PaginationOverride<unknown, Auth> | PaginationOverrideMap<Auth>;\n};\n\n/** Options accepted by the built-in offset cursor pagination helper. */\nexport type OffsetPaginationOptions<Item> = {\n items: readonly Item[];\n cursor?: string;\n pageSize: number;\n};\n\n/**\n * Paginates an in-memory list with opaque offset cursors.\n *\n * Use this inside `pagination.override` when you want Sidecar's standard\n * cursor behavior after applying app-specific filtering or sorting.\n */\nexport function offsetPagination<Item>(\n options: OffsetPaginationOptions<Item>,\n): PaginationResult<Item> {\n const offset = options.cursor ? decodeOffsetCursor(options.cursor) : 0;\n const pageSize = options.pageSize > 0 ? Math.floor(options.pageSize) : 10;\n const page = options.items.slice(offset, offset + pageSize);\n const nextOffset = offset + page.length;\n return {\n items: page,\n nextCursor: nextOffset < options.items.length\n ? encodeOffsetCursor(nextOffset)\n : undefined,\n };\n}\n\n/** MCP content block variants Sidecar currently normalizes. */\nexport type McpContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | { type: \"resource\"; resource: JsonObject };\n\n/** Minimal JSON Schema shape Sidecar needs for MCP tool descriptors. */\nexport type JsonSchema = {\n $schema?: string;\n type?: string | string[];\n title?: string;\n description?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n additionalProperties?: boolean | JsonSchema;\n items?: JsonSchema;\n enum?: JsonValue[];\n const?: JsonValue;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n default?: JsonValue;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n format?: string;\n};\n\n/** Descriptor-level auth scheme advertised to MCP/App clients. */\nexport type SecurityScheme =\n | { type: \"noauth\" }\n | {\n type: \"oauth2\";\n scopes: string[];\n };\n\n/** MCP tool annotation hints used by hosts to understand tool behavior. */\nexport type ToolAnnotations = {\n /** Human-facing display title. Defaults to the tool name. */\n title?: string;\n /** True when the tool only reads data and has no side effects. */\n readOnlyHint?: boolean;\n /** True when the tool may perform destructive updates. Meaningful only for non-read-only tools. */\n destructiveHint?: boolean;\n /** True when repeating the same call has no extra effect. Meaningful only for non-read-only tools. */\n idempotentHint?: boolean;\n /** True when the tool may interact with external systems outside the current account/control boundary. */\n openWorldHint?: boolean;\n};\n\n/** Shared MCP annotations for resources, resource contents, and prompt content. */\nexport type ResourceAnnotations = {\n /** Intended audience for the annotated content. */\n audience?: readonly (\"user\" | \"assistant\")[];\n /** Relative importance from 0.0 to 1.0. */\n priority?: number;\n /** ISO 8601 timestamp describing when the content last changed. */\n lastModified?: string | Date;\n};\n\n/** Icon metadata supported by MCP resources and prompts. */\nexport type McpIcon = {\n src: string;\n mimeType?: string;\n sizes?: readonly string[];\n};\n\n/** User-friendly input accepted by `resourceResult()`. */\nexport type ResourceResultContentInput<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Text, JSON-compatible data, or bytes returned by the resource. */\n content: string | JsonValue | Uint8Array | ArrayBuffer;\n /** Optional MIME type. Sidecar infers a conservative value when omitted. */\n mimeType?: string;\n /** Optional MCP annotations for this returned content block. */\n annotations?: ResourceAnnotations;\n /** Optional host/client-only metadata emitted as MCP `_meta`. */\n meta?: Meta;\n};\n\n/** Options accepted by `resourceResult()`. */\nexport type ResourceResultInput<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = ResourceResultContentInput<Meta> | readonly ResourceResultContentInput<Meta>[];\n\ndeclare const resourceResultTypeBrand: unique symbol;\n\n/** Branded Sidecar result returned by every resource read. */\nexport type ResourceResult<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n readonly [resourceResultTypeBrand]: true;\n contents: ResourceResultContentInput<Meta>[];\n};\n\n/** MCP resource content emitted on the wire. */\nexport type McpResourceContent =\n | {\n uri: string;\n mimeType?: string;\n text: string;\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n }\n | {\n uri: string;\n mimeType: string;\n blob: string;\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n };\n\n/** Normalized MCP resource read result returned by the runtime. */\nexport type McpResourceReadResult = {\n contents: McpResourceContent[];\n _meta?: Record<string, unknown>;\n};\n\n/** Helper used by resources to return MCP-compliant content. */\nexport type ResourceResultFactory = {\n <Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: ResourceResultInput<Meta>\n ): ResourceResult<Meta>;\n many<Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: readonly ResourceResultContentInput<Meta>[]\n ): ResourceResult<Meta>;\n};\n\n/** Runtime context passed to a resource's `read` method. */\nexport type ResourceContext<Auth = unknown, Services = unknown> = {\n auth: Auth;\n request: ToolRequestContext;\n services: Services;\n log: Logger;\n storage: ScopedStorage;\n env: Readonly<Record<string, string | undefined>>;\n};\n\n/** Author-facing definition accepted by `resource()`. */\nexport type ResourceDefinition<Auth = unknown, Services = unknown> = {\n /** Human-readable name shown to users and clients. */\n name: string;\n /** Optional stable MCP resource URI. Defaults to `sidecar://resources/<folder>`. */\n uri?: string;\n /** Optional display title when the machine-facing name is terse. */\n title?: string;\n /** Optional human-readable description. */\n description?: string;\n /** Optional MIME type advertised from `resources/list` and used as a result default. */\n mimeType?: string;\n /** Optional resource size in bytes. */\n size?: number;\n /** Optional MCP display icons. */\n icons?: readonly McpIcon[];\n /** Optional MCP annotations for the listed resource. */\n annotations?: ResourceAnnotations;\n /** Whether this resource is worth subscribing to when server subscribe is enabled. */\n subscribe?: boolean;\n /** Resource implementation. It may be synchronous or asynchronous. */\n read: (ctx: ResourceContext<Auth, Services>) => MaybePromise<ResourceResult>;\n};\n\n/** Branded Sidecar resource returned by `resource()`. */\nexport type SidecarResource<Auth = unknown, Services = unknown> =\n ResourceDefinition<Auth, Services> & {\n readonly kind: \"sidecar.resource\";\n };\n\n/** MCP descriptor emitted for `resources/list`. */\nexport type McpResourceDescriptor = {\n uri: string;\n name: string;\n title?: string;\n description?: string;\n mimeType?: string;\n size?: number;\n icons?: McpIcon[];\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n};\n\n/** MCP resource template descriptor emitted for `resources/templates/list`. */\nexport type McpResourceTemplateDescriptor = {\n uriTemplate: string;\n name: string;\n title?: string;\n description?: string;\n mimeType?: string;\n icons?: McpIcon[];\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n};\n\n/** Shorthand argument forms accepted by `prompt({ args })`. */\nexport type PromptArgInput =\n | string\n | readonly JsonPrimitive[]\n | {\n description?: string;\n required?: boolean;\n };\n\n/** Prompt argument schema declared in normal TypeScript objects. */\nexport type PromptArgsDefinition = Record<string, PromptArgInput>;\n\n/** MCP prompt argument descriptor emitted for `prompts/list`. */\nexport type McpPromptArgument = {\n name: string;\n description?: string;\n required?: boolean;\n};\n\n/** MCP prompt descriptor emitted for `prompts/list`. */\nexport type McpPromptDescriptor = {\n name: string;\n title?: string;\n description?: string;\n arguments?: McpPromptArgument[];\n icons?: McpIcon[];\n};\n\n/** MCP prompt message content. */\nexport type McpPromptContent = McpContentBlock;\n\n/** MCP prompt message emitted by `prompts/get`. */\nexport type McpPromptMessage = {\n role: \"user\" | \"assistant\";\n content: McpPromptContent;\n};\n\n/** User-friendly value accepted from `prompt().run`. */\nexport type PromptResultInput =\n | string\n | McpPromptMessage\n | McpPromptMessage[]\n | {\n description?: string;\n messages: McpPromptMessage[];\n };\n\n/** Normalized MCP prompt result returned by the runtime. */\nexport type McpPromptResult = {\n description?: string;\n messages: McpPromptMessage[];\n};\n\n/** Runtime context passed to a prompt's `run` method. */\nexport type PromptContext<Auth = unknown, Services = unknown> = {\n auth: Auth;\n request: ToolRequestContext;\n services: Services;\n log: Logger;\n storage: ScopedStorage;\n env: Readonly<Record<string, string | undefined>>;\n};\n\n/** Author-facing definition accepted by `prompt()`. */\nexport type PromptDefinition<\n Args extends Record<string, unknown> = Record<string, unknown>,\n Auth = unknown,\n Services = unknown,\n> = {\n /** Optional MCP prompt machine name. Defaults to the folder name. */\n name?: string;\n /** Human-readable display title. */\n title: string;\n /** Optional human-readable description. */\n description?: string;\n /** Optional simple argument declarations. */\n args?: PromptArgsDefinition;\n /** Optional MCP display icons. */\n icons?: readonly McpIcon[];\n /** Prompt implementation. Returning a string creates one user text message. */\n run: (args: Args, ctx: PromptContext<Auth, Services>) => MaybePromise<PromptResultInput>;\n};\n\n/** Branded Sidecar prompt returned by `prompt()`. */\nexport type SidecarPrompt<\n Args extends Record<string, unknown> = Record<string, unknown>,\n Auth = unknown,\n Services = unknown,\n> = PromptDefinition<Args, Auth, Services> & {\n readonly kind: \"sidecar.prompt\";\n};\n\n/** Controls which callers can see or call a tool. */\nexport type ToolVisibility = {\n model?: boolean;\n widgets?: boolean | string[];\n tools?: boolean | string[];\n};\n\n/** ChatGPT compatibility metadata for tool descriptors. */\nexport type ChatGptToolOptions = {\n /** Short status shown while ChatGPT is invoking the tool. */\n invoking?: string;\n /** Short status shown after ChatGPT has invoked the tool. */\n invoked?: string;\n /** Compatibility hint for legacy ChatGPT clients that allow widget tool calls. */\n widgetAccessible?: boolean;\n /** Compatibility visibility hint for legacy ChatGPT clients. */\n visibility?: \"public\" | \"private\";\n /** Top-level input fields that receive ChatGPT file references. */\n fileParams?: readonly string[];\n};\n\n/** Descriptor target used when filtering host-specific metadata. */\nexport type ToolDescriptorTarget = \"mcp\" | \"chatgpt\" | \"claude\";\n\n/** Widget CSP allowlists emitted on the MCP Apps resource metadata. */\nexport type WidgetCspOptions = {\n /** Domains the widget may contact with fetch/XHR. */\n connectDomains?: readonly string[];\n /** Domains the widget may use for static resources. */\n resourceDomains?: readonly string[];\n /** Origins allowed for subframes. Omit unless the widget embeds iframes. */\n frameDomains?: readonly string[];\n /** Allowed base URI origins. Omit to let hosts enforce the secure default. */\n baseUriDomains?: readonly string[];\n};\n\n/** Browser permissions an MCP Apps host may grant to a widget iframe. */\nexport type WidgetPermissionOptions = {\n camera?: boolean;\n microphone?: boolean;\n geolocation?: boolean;\n clipboardWrite?: boolean;\n};\n\n/** ChatGPT-only widget compatibility options. */\nexport type ChatGptWidgetOptions = {\n /** Dedicated widget origin for broad ChatGPT distribution. */\n domain?: string;\n /** Redirect targets for ChatGPT external-link handling. */\n redirectDomains?: readonly string[];\n};\n\n/** Widget resource metadata declared by `widget(...)` in a sibling widget file. */\nexport type ToolWidgetOptions = {\n /** Host-facing summary of what the rendered widget shows. */\n description?: string;\n /** Whether the widget prefers a host-provided border. */\n prefersBorder?: boolean;\n /** Optional dedicated sandbox origin. Host-specific validation still applies. */\n domain?: string;\n /** Standard MCP Apps CSP allowlists. */\n csp?: WidgetCspOptions;\n /** Standard MCP Apps iframe permission requests. */\n permissions?: WidgetPermissionOptions;\n /** Host-specific widget compatibility metadata. */\n hosts?: {\n chatgpt?: ChatGptWidgetOptions;\n };\n};\n\n/** Host-specific extension options. Keep standard MCP fields primary. */\nexport type ToolHostExtensions = {\n chatgpt?: ChatGptToolOptions;\n};\n\n/** Typed auth scope object imported by tool files. */\nexport type AuthScopeDefinition<\n Id extends string = string,\n Auth = unknown,\n> = {\n readonly kind: \"sidecar.scope\";\n readonly id: Id;\n readonly description: string;\n readonly __auth?: Auth;\n};\n\n/** Per-tool authorization policy. Omitted policy means public tool. */\nexport type ToolAuthPolicy<Auth = unknown> =\n | {\n /** This tool intentionally does not require an authenticated session. */\n public: true;\n authenticated?: never;\n scopes?: never;\n }\n | {\n /** This tool requires a valid authenticated session but no specific scope. */\n authenticated: true;\n public?: false;\n scopes?: never;\n }\n | {\n /** This tool requires an authenticated session with every listed scope. */\n scopes: readonly AuthScopeDefinition<string, Auth>[];\n public?: false;\n authenticated?: true;\n };\n\ndeclare const toolResultTypeBrand: unique symbol;\n\n/** User-friendly content accepted by `toolResult()`. */\nexport type ToolResultContent = string | McpContentBlock | McpContentBlock[];\n\n/** Options for a tool result that only needs model-visible content. */\nexport type TextToolResultInput<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Required model-visible content. Sidecar normalizes strings to MCP text blocks. */\n content: ToolResultContent;\n /** Optional host/widget-only data emitted as MCP `_meta`. */\n meta?: Meta;\n /** Marks the tool result as an error while preserving normal MCP result channels. */\n isError?: boolean;\n /** Omitted for content-only results. */\n structuredContent?: undefined;\n};\n\n/** Options for a tool result with typed structured content. */\nexport type StructuredToolResultInput<\n Structured,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Typed machine-readable output validated against the tool output schema when present. */\n structuredContent: Structured;\n /** Required model-visible content. Sidecar normalizes strings to MCP text blocks. */\n content: ToolResultContent;\n /** Optional host/widget-only data emitted as MCP `_meta`. */\n meta?: Meta;\n /** Marks the tool result as an error while preserving normal MCP result channels. */\n isError?: boolean;\n};\n\n/** Options accepted by `toolResult()`. */\nexport type ToolResultInput<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = [Structured] extends [undefined]\n ? TextToolResultInput<Meta>\n : StructuredToolResultInput<Structured, Meta>;\n\n/** Branded Sidecar result returned by every tool execution. */\nexport type ToolResult<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n readonly [toolResultTypeBrand]: true;\n content: McpContentBlock[];\n _meta?: Meta;\n isError?: boolean;\n} & ([Structured] extends [undefined]\n ? { structuredContent?: Structured }\n : { structuredContent: Structured });\n\n/** Normalized MCP tool result returned by the runtime. */\nexport type McpToolResult = {\n structuredContent?: unknown;\n content: McpContentBlock[];\n _meta?: Record<string, unknown>;\n isError?: boolean;\n};\n\n/** Helper used by tools to return MCP-compliant result envelopes. */\nexport type ToolResultFactory = {\n <Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: TextToolResultInput<Meta>\n ): ToolResult<undefined, Meta>;\n <Structured, Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: StructuredToolResultInput<Structured, Meta>\n ): ToolResult<Structured, Meta>;\n text(text: string): McpContentBlock;\n error<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n >(\n message: string,\n options?: Omit<ToolResultInput<Structured, Meta>, \"content\" | \"isError\">\n ): ToolResult<Structured, Meta>;\n};\n\n/** Logger surface exposed in `ToolContext`. */\nexport type Logger = {\n debug(message: string, data?: Record<string, unknown>): void;\n info(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n};\n\n/** Minimal tracing hook exposed in `ToolContext`. */\nexport type Trace = {\n span<T>(name: string, run: () => MaybePromise<T>): Promise<T>;\n};\n\n/** Tool-scoped storage abstraction for runtimes that provide persistence. */\nexport type ScopedStorage = {\n get<T = unknown>(key: string): Promise<T | undefined>;\n set<T = unknown>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<void>;\n};\n\n/** Request metadata supplied to each tool invocation. */\nexport type ToolRequestContext = {\n id: string;\n signal: AbortSignal;\n host: \"chatgpt\" | \"claude\" | \"unknown\";\n transport: \"streamable-http\" | \"stdio\";\n};\n\n/** Runtime context passed to a tool's `execute` method. */\nexport type ToolContext<Auth = unknown, Services = unknown, Tools = unknown> = {\n auth: Auth;\n request: ToolRequestContext;\n services: Services;\n tools: Tools;\n log: Logger;\n trace: Trace;\n storage: ScopedStorage;\n env: Readonly<Record<string, string | undefined>>;\n};\n\n/** Small subset of Zod-like validation Sidecar can consume without depending on Zod. */\nexport type ZodLikeSchema<T = unknown> = {\n safeParse(value: unknown): { success: true; data: T } | { success: false; error: unknown };\n};\n\n/** Infers a params type from a validator if one is supplied. */\nexport type InferParams<T> = T extends ZodLikeSchema<infer Output> ? Output : T;\n\n/** Function signature for tool execution. */\nexport type ToolExecute<Params, Output, Auth = unknown, Services = unknown, Tools = unknown> = (\n params: Params,\n ctx: ToolContext<Auth, Services, Tools>\n) => MaybePromise<ToolResult<Output>>;\n\n/** Author-facing definition accepted by `tool()`. */\nexport type ToolDefinition<Params = unknown, Output = unknown, Auth = unknown, Services = unknown, Tools = unknown> = {\n /** Human-readable name shown to users and models. */\n name: string;\n /** Optional MCP machine id. If omitted in a reserved tool file, Sidecar uses the folder name. */\n id?: string;\n /** Model-facing description. This should be specific enough for reliable tool selection. */\n description: string;\n /** Optional runtime validation schema. Zod schemas are supported directly. */\n params?: ZodLikeSchema<Params>;\n /** Optional output schema escape hatch. The compiler normally derives this from `execute`. */\n output?: JsonSchema;\n /** MCP tool behavior hints. */\n annotations?: ToolAnnotations;\n /** Optional visibility policy for model, widget, and tool callers. */\n visibility?: ToolVisibility;\n /** Optional host-specific compatibility metadata. */\n hosts?: ToolHostExtensions;\n /** Low-level descriptor metadata escape hatch. Prefer typed fields when available. */\n meta?: Record<string, unknown>;\n /** Optional authorization policy. Tools are public unless this is declared. */\n auth?: ToolAuthPolicy<Auth>;\n /** Tool implementation. It may be synchronous or asynchronous. */\n execute: ToolExecute<Params, Output, Auth, Services, Tools>;\n};\n\n/** Branded Sidecar tool returned by `tool()`. */\nexport type SidecarTool<Params = unknown, Output = unknown, Auth = unknown> = ToolDefinition<Params, Output, Auth> & {\n readonly kind: \"sidecar.tool\";\n};\n\n/** MCP descriptor emitted for `tools/list`. */\nexport type McpToolDescriptor = {\n name: string;\n title?: string;\n description: string;\n inputSchema: JsonSchema;\n outputSchema?: JsonSchema;\n securitySchemes?: SecurityScheme[];\n annotations?: ToolAnnotations;\n _meta?: Record<string, unknown>;\n};\n\n/** Typed skill declaration used by plugin generation. */\nexport type SkillDefinition = {\n /** Stable skill folder/name. */\n name: string;\n /** Short routing description for the host/model. */\n description: string;\n /** Markdown body emitted to SKILL.md. */\n body: string;\n};\n\nconst toolBrand = Symbol.for(\"sidecar.tool\");\nconst toolResultBrand = Symbol.for(\"sidecar.toolResult\");\nconst resourceBrand = Symbol.for(\"sidecar.resource\");\nconst resourceResultBrand = Symbol.for(\"sidecar.resourceResult\");\nconst promptBrand = Symbol.for(\"sidecar.prompt\");\nconst skillBrand = Symbol.for(\"sidecar.skill\");\n\n/**\n * Declares app identity in `sidecar.config.ts`.\n *\n * The compiler reads the object statically, while the helper gives authors\n * editor completions for every supported config field.\n */\nexport function defineConfig(config: SidecarConfig): SidecarConfig {\n if (!config.name.trim()) {\n throw new SidecarDefinitionError(\"Project name is required.\");\n }\n if (!config.version.trim()) {\n throw new SidecarDefinitionError(`Project \"${config.name}\" must include a version.`);\n }\n if (!config.description.trim()) {\n throw new SidecarDefinitionError(`Project \"${config.name}\" must include a description.`);\n }\n\n return Object.freeze({ ...config });\n}\n\n/**\n * Declares a Sidecar MCP tool.\n *\n * The compiler reads this object statically, while the server executes the\n * returned branded value at runtime.\n */\nexport function tool<Params, Output, Auth = unknown>(\n definition: ToolDefinition<Params, Output, Auth>\n): SidecarTool<Params, Output, Auth> {\n if (!definition.name.trim()) {\n throw new SidecarDefinitionError(\"Tool name is required.\");\n }\n if (!definition.description.trim()) {\n throw new SidecarDefinitionError(`Tool \"${definition.name}\" must include a description.`);\n }\n\n return Object.freeze({\n ...definition,\n kind: \"sidecar.tool\" as const,\n [toolBrand]: true\n }) as SidecarTool<Params, Output, Auth>;\n}\n\n/** Returns true when a value was produced by `tool()`. */\nexport function isSidecarTool(value: unknown): value is SidecarTool {\n return Boolean(value && typeof value === \"object\" && (value as Record<symbol, unknown>)[toolBrand]);\n}\n\n/**\n * Declares a Sidecar MCP resource.\n *\n * The compiler fills default URIs from the reserved folder name, while the\n * runtime executes the returned branded value for `resources/read`.\n */\nexport function resource<Auth = unknown, Services = unknown>(\n definition: ResourceDefinition<Auth, Services>\n): SidecarResource<Auth, Services> {\n if (!definition.name.trim()) {\n throw new SidecarDefinitionError(\"Resource name is required.\");\n }\n if (definition.uri) {\n validateResourceUri(definition.uri);\n }\n\n return Object.freeze({\n ...definition,\n kind: \"sidecar.resource\" as const,\n [resourceBrand]: true\n }) as SidecarResource<Auth, Services>;\n}\n\n/** Returns true when a value was produced by `resource()`. */\nexport function isSidecarResource(value: unknown): value is SidecarResource {\n return Boolean(value && typeof value === \"object\" && (value as Record<symbol, unknown>)[resourceBrand]);\n}\n\n/**\n * Declares a Sidecar MCP prompt.\n *\n * The compiler fills default machine names from the reserved folder name and\n * converts `args` into MCP prompt argument descriptors.\n */\nexport function prompt<Args extends Record<string, unknown> = Record<string, unknown>, Auth = unknown>(\n definition: PromptDefinition<Args, Auth>\n): SidecarPrompt<Args, Auth> {\n if (!definition.title.trim()) {\n throw new SidecarDefinitionError(\"Prompt title is required.\");\n }\n\n return Object.freeze({\n ...definition,\n kind: \"sidecar.prompt\" as const,\n [promptBrand]: true\n }) as SidecarPrompt<Args, Auth>;\n}\n\n/** Returns true when a value was produced by `prompt()`. */\nexport function isSidecarPrompt(value: unknown): value is SidecarPrompt {\n return Boolean(value && typeof value === \"object\" && (value as Record<symbol, unknown>)[promptBrand]);\n}\n\n/** Declares a generated skill that can be emitted as `SKILL.md`. */\nexport function skill(definition: SkillDefinition): SkillDefinition {\n if (!definition.name.trim()) {\n throw new SidecarDefinitionError(\"Skill name is required.\");\n }\n if (!definition.description.trim()) {\n throw new SidecarDefinitionError(`Skill \"${definition.name}\" must include a description.`);\n }\n\n return Object.freeze({\n ...definition,\n [skillBrand]: true\n });\n}\n\n/** Factory for standardized tool results and common content blocks. */\nexport const toolResult = Object.assign(\n createToolResult,\n {\n text(text: string): McpContentBlock {\n return { type: \"text\", text };\n },\n error<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n >(\n message: string,\n options: Omit<ToolResultInput<Structured, Meta>, \"content\" | \"isError\"> = {} as Omit<\n ToolResultInput<Structured, Meta>,\n \"content\" | \"isError\"\n >,\n ): ToolResult<Structured, Meta> {\n return createToolResult({\n ...options,\n structuredContent: (options as { structuredContent?: Structured }).structuredContent,\n content: message,\n isError: true\n } as ToolResultInput<Structured, Meta>);\n }\n }\n) as ToolResultFactory;\n\n/** Factory for standardized resource results. */\nexport const resourceResult = Object.assign(\n createResourceResult,\n {\n many<Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: readonly ResourceResultContentInput<Meta>[],\n ): ResourceResult<Meta> {\n return createResourceResult(input);\n },\n },\n) as ResourceResultFactory;\n\n/** Creates and brands one standardized Sidecar tool result. */\nfunction createToolResult<\n Structured,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n>(input: ToolResultInput<Structured, Meta>): ToolResult<Structured, Meta> {\n const resultEnvelope = stripUndefined({\n structuredContent: input.structuredContent,\n content: normalizeRequiredContent(input.content),\n _meta: input.meta,\n isError: input.isError\n }) as unknown as ToolResult<Structured, Meta>;\n\n Object.defineProperty(resultEnvelope, toolResultBrand, {\n enumerable: false,\n value: true\n });\n\n return resultEnvelope;\n}\n\n/** Creates and brands one standardized Sidecar resource result. */\nfunction createResourceResult<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n>(input: ResourceResultInput<Meta>): ResourceResult<Meta> {\n const contents = Array.isArray(input) ? [...input] : [input];\n if (!contents.length) {\n throw new SidecarRuntimeError(\n \"resourceResult(...) must include at least one content item.\",\n \"invalid_resource_result\",\n );\n }\n\n const resultEnvelope = {\n contents,\n } as ResourceResult<Meta>;\n\n Object.defineProperty(resultEnvelope, resourceResultBrand, {\n enumerable: false,\n value: true,\n });\n\n return resultEnvelope;\n}\n\n/** Returns true when a value was produced by `toolResult()`. */\nexport function isToolResult(value: unknown): value is ToolResult {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as Record<symbol, unknown>)[toolResultBrand] === true\n );\n}\n\n/** Returns true when a value was produced by `resourceResult()`. */\nexport function isResourceResult(value: unknown): value is ResourceResult {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as Record<symbol, unknown>)[resourceResultBrand] === true\n );\n}\n\n/** Converts a branded Sidecar tool result into an MCP-compliant tool result. */\nexport function normalizeToolResult(value: unknown): McpToolResult {\n if (!isToolResult(value)) {\n throw new SidecarRuntimeError(\n \"Tool execute() must return toolResult({ structuredContent, content, meta }).\",\n \"invalid_tool_result\",\n );\n }\n\n return stripUndefined({\n structuredContent: value.structuredContent,\n content: value.content ?? [],\n _meta: value._meta,\n isError: value.isError\n });\n}\n\n/** Converts a branded Sidecar resource result into an MCP-compliant read result. */\nexport function normalizeResourceResult(\n value: unknown,\n uri: string,\n defaultMimeType?: string,\n): McpResourceReadResult {\n if (!isResourceResult(value)) {\n throw new SidecarRuntimeError(\n \"Resource read() must return resourceResult(...).\",\n \"invalid_resource_result\",\n );\n }\n\n return {\n contents: value.contents.map((content) =>\n normalizeResourceContent(content, uri, defaultMimeType),\n ),\n };\n}\n\n/** Validates params, runs a tool, and normalizes its result for JSON-RPC. */\nexport async function executeTool<Params, Output>(\n sidecarTool: SidecarTool<Params, Output>,\n params: unknown,\n ctx: ToolContext\n): Promise<McpToolResult> {\n const parsedParams = validateParams(sidecarTool, params);\n const value = await sidecarTool.execute(parsedParams, ctx);\n return normalizeToolResult(value);\n}\n\n/** Reads a resource and normalizes its result for JSON-RPC. */\nexport async function executeResource(\n sidecarResource: SidecarResource,\n ctx: ResourceContext,\n options: { uri: string; mimeType?: string },\n): Promise<McpResourceReadResult> {\n const value = await sidecarResource.read(ctx);\n return normalizeResourceResult(value, options.uri, sidecarResource.mimeType ?? options.mimeType);\n}\n\n/** Runs a prompt and normalizes its messages for JSON-RPC. */\nexport async function executePrompt<Args extends Record<string, unknown>>(\n sidecarPrompt: SidecarPrompt<Args>,\n args: unknown,\n ctx: PromptContext,\n): Promise<McpPromptResult> {\n const parsedArgs = validatePromptArgs(sidecarPrompt, args);\n const value = await sidecarPrompt.run(parsedArgs, ctx);\n return normalizePromptResult(value, sidecarPrompt.description);\n}\n\n/** Builds an MCP descriptor from a Sidecar tool definition. */\nexport function createToolDescriptor(definition: {\n name: string;\n id?: string;\n description: string;\n target?: ToolDescriptorTarget;\n inputSchema?: JsonSchema;\n outputSchema?: JsonSchema;\n annotations?: ToolAnnotations;\n visibility?: ToolVisibility;\n hosts?: ToolHostExtensions;\n meta?: Record<string, unknown>;\n auth?: ToolAuthPolicy<unknown>;\n}): McpToolDescriptor {\n const machineName = definition.id ?? toMachineName(definition.name);\n\n validateToolId(machineName);\n const target = definition.target ?? \"mcp\";\n\n return stripUndefined({\n name: machineName,\n title: definition.name,\n description: definition.description,\n inputSchema: definition.inputSchema ?? emptyObjectSchema(),\n outputSchema: definition.outputSchema,\n securitySchemes: securitySchemes(definition.auth),\n annotations: withAnnotationDefaults(definition.annotations),\n _meta: mergeMeta(\n securitySchemesMeta(definition.auth),\n visibilityMeta(definition.visibility),\n target === \"chatgpt\" ? chatGptToolMeta(definition.hosts?.chatgpt) : undefined,\n definition.meta\n )\n });\n}\n\n/** Builds an MCP resource descriptor from a Sidecar resource definition. */\nexport function createResourceDescriptor(definition: {\n name: string;\n uri: string;\n title?: string;\n description?: string;\n mimeType?: string;\n size?: number;\n icons?: readonly McpIcon[];\n annotations?: ResourceAnnotations;\n meta?: Record<string, unknown>;\n}): McpResourceDescriptor {\n validateResourceUri(definition.uri);\n\n return stripUndefined({\n uri: definition.uri,\n name: definition.name,\n title: definition.title,\n description: definition.description,\n mimeType: definition.mimeType,\n size: definition.size,\n icons: definition.icons ? [...definition.icons] : undefined,\n annotations: normalizeAnnotations(definition.annotations),\n _meta: definition.meta,\n });\n}\n\n/** Builds an MCP prompt descriptor from a Sidecar prompt definition. */\nexport function createPromptDescriptor(definition: {\n name: string;\n title: string;\n description?: string;\n args?: PromptArgsDefinition;\n icons?: readonly McpIcon[];\n}): McpPromptDescriptor {\n validatePromptName(definition.name);\n\n return stripUndefined({\n name: definition.name,\n title: definition.title,\n description: definition.description,\n arguments: promptArguments(definition.args),\n icons: definition.icons ? [...definition.icons] : undefined,\n });\n}\n\n/** Converts a Sidecar auth policy into descriptor security schemes. */\nfunction securitySchemes(policy: ToolAuthPolicy<unknown> | undefined): SecurityScheme[] {\n if (!policy || policy.public === true) {\n return [{ type: \"noauth\" }];\n }\n\n if (\"scopes\" in policy && policy.scopes?.length) {\n return [{ type: \"oauth2\", scopes: policy.scopes.map((entry) => entry.id) }];\n }\n\n return [{ type: \"oauth2\", scopes: [] }];\n}\n\n/** Mirrors security schemes into `_meta` for older Apps clients. */\nfunction securitySchemesMeta(policy: ToolAuthPolicy<unknown> | undefined): Record<string, unknown> {\n return {\n securitySchemes: securitySchemes(policy),\n };\n}\n\n/** Returns scope ids required by a tool's auth policy. */\nexport function toolAuthScopes(toolDefinition: Pick<ToolDefinition, \"auth\">): string[] {\n const authPolicy = toolDefinition.auth;\n if (!authPolicy || authPolicy.public === true || !authPolicy.scopes) {\n return [];\n }\n\n return authPolicy.scopes.map((entry) => entry.id);\n}\n\n/** Converts visibility booleans into the standard MCP Apps `_meta.ui.visibility` list. */\nfunction visibilityMeta(visibility: ToolVisibility | undefined): Record<string, unknown> | undefined {\n if (!visibility) {\n return undefined;\n }\n\n const uiVisibility = [\n visibility.model !== false ? \"model\" : undefined,\n visibility.widgets !== false ? \"app\" : undefined\n ].filter(Boolean) as string[];\n\n return {\n ui: {\n visibility: uiVisibility\n }\n };\n}\n\n/** Converts typed ChatGPT options into optional OpenAI compatibility metadata. */\nfunction chatGptToolMeta(options: ChatGptToolOptions | undefined): Record<string, unknown> | undefined {\n if (!options) {\n return undefined;\n }\n\n return stripUndefined({\n \"openai/widgetAccessible\": options.widgetAccessible,\n \"openai/visibility\": options.visibility,\n \"openai/toolInvocation/invoking\": options.invoking,\n \"openai/toolInvocation/invoked\": options.invoked,\n \"openai/fileParams\": options.fileParams ? [...options.fileParams] : undefined\n });\n}\n\n/** Merges descriptor metadata while preserving nested standard `ui` metadata. */\nfunction mergeMeta(\n ...entries: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> | undefined {\n const merged: Record<string, unknown> = {};\n\n for (const entry of entries) {\n if (!entry) {\n continue;\n }\n\n for (const [key, value] of Object.entries(entry)) {\n if (key === \"ui\" && isRecord(value) && isRecord(merged.ui)) {\n merged.ui = { ...merged.ui, ...value };\n } else {\n merged[key] = value;\n }\n }\n }\n\n return Object.keys(merged).length ? stripUndefined(merged) : undefined;\n}\n\n/** Returns true for plain metadata objects. */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\n/** JSON Schema for a tool with no input parameters. */\nexport function emptyObjectSchema(): JsonSchema {\n return {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: false\n };\n}\n\n/** Converts a human tool name into a stable MCP machine name. */\nexport function toMachineName(name: string): string {\n return name\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[^A-Za-z0-9._-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase();\n}\n\n/** Throws when a machine tool id is not MCP-safe. */\nexport function validateToolId(id: string): void {\n if (\n !/^[A-Za-z0-9._-]{1,128}$/.test(id) ||\n id === \".\" ||\n id === \"..\" ||\n id.includes(\"/..\") ||\n id.includes(\"../\")\n ) {\n throw new SidecarDefinitionError(\n `Invalid tool id \"${id}\". Tool ids must be 1-128 ASCII letters, digits, dots, hyphens, or underscores.`\n );\n }\n}\n\n/** Throws when a resource URI is not a valid absolute URI. */\nexport function validateResourceUri(uri: string): void {\n try {\n const parsed = new URL(uri);\n if (!parsed.protocol || parsed.hash) {\n throw new Error(\"invalid uri\");\n }\n } catch {\n throw new SidecarDefinitionError(\n `Invalid resource uri \"${uri}\". Resource URIs must be absolute and must not include fragments.`\n );\n }\n}\n\n/** Throws when a prompt machine name is not MCP-safe. */\nexport function validatePromptName(name: string): void {\n if (!/^[A-Za-z0-9._-]{1,128}$/.test(name) || name === \".\" || name === \"..\") {\n throw new SidecarDefinitionError(\n `Invalid prompt name \"${name}\". Prompt names must be 1-128 ASCII letters, digits, dots, hyphens, or underscores.`\n );\n }\n}\n\n/** Applies conservative annotation defaults when a tool omits them. */\nexport function withAnnotationDefaults(annotations: ToolAnnotations | undefined): ToolAnnotations {\n const readOnlyHint = annotations?.readOnlyHint ?? false;\n\n return {\n title: annotations?.title,\n readOnlyHint,\n destructiveHint: annotations?.destructiveHint ?? !readOnlyHint,\n idempotentHint: annotations?.idempotentHint ?? false,\n openWorldHint: annotations?.openWorldHint ?? true\n };\n}\n\n/** Error thrown for invalid Sidecar declarations. */\nexport class SidecarDefinitionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SidecarDefinitionError\";\n }\n}\n\n/** Error thrown while executing a tool. */\nexport class SidecarRuntimeError extends Error {\n constructor(message: string, readonly code: string) {\n super(message);\n this.name = \"SidecarRuntimeError\";\n }\n}\n\n/** Runs optional runtime schema validation before tool execution. */\nfunction validateParams<Params>(sidecarTool: SidecarTool<Params>, params: unknown): Params {\n if (!sidecarTool.params) {\n return (params ?? {}) as Params;\n }\n\n const parsed = sidecarTool.params.safeParse(params ?? {});\n if (parsed.success) {\n return parsed.data;\n }\n\n throw new SidecarRuntimeError(`Invalid parameters for tool \"${sidecarTool.name}\".`, \"invalid_tool_params\");\n}\n\n/** Normalizes required user-friendly result content into MCP content blocks. */\nfunction normalizeRequiredContent(content: ToolResultContent): McpContentBlock[] {\n if (typeof content === \"string\") {\n return [toolResult.text(content)];\n }\n const blocks = Array.isArray(content) ? content : [content];\n if (blocks.length > 0) {\n return blocks;\n }\n\n throw new SidecarRuntimeError(\n \"toolResult({ content }) must include at least one MCP content block.\",\n \"invalid_tool_result\",\n );\n}\n\n/** Converts one friendly resource content item to the MCP wire shape. */\nfunction normalizeResourceContent(\n content: ResourceResultContentInput,\n uri: string,\n defaultMimeType?: string,\n): McpResourceContent {\n const annotations = normalizeAnnotations(content.annotations);\n const meta = content.meta;\n if (isBinaryLike(content.content)) {\n return stripUndefined({\n uri,\n mimeType: content.mimeType ?? defaultMimeType ?? \"application/octet-stream\",\n blob: bytesToBase64(content.content),\n annotations,\n _meta: meta,\n });\n }\n\n if (typeof content.content === \"string\") {\n return stripUndefined({\n uri,\n mimeType: content.mimeType ?? defaultMimeType ?? \"text/plain\",\n text: content.content,\n annotations,\n _meta: meta,\n });\n }\n\n return stripUndefined({\n uri,\n mimeType: content.mimeType ?? defaultMimeType ?? \"application/json\",\n text: JSON.stringify(content.content),\n annotations,\n _meta: meta,\n });\n}\n\n/** Returns true for byte containers that MCP resources must expose as base64 blobs. */\nfunction isBinaryLike(value: unknown): value is Uint8Array | ArrayBuffer {\n return value instanceof ArrayBuffer || value instanceof Uint8Array;\n}\n\n/** Encodes bytes as base64 in Node and browser-compatible runtimes. */\nfunction bytesToBase64(value: Uint8Array | ArrayBuffer): string {\n const bytes = value instanceof ArrayBuffer ? new Uint8Array(value) : value;\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\n/** Encodes an offset as an opaque base64url cursor. */\nfunction encodeOffsetCursor(offset: number): string {\n return base64UrlEncode(JSON.stringify({ offset }));\n}\n\n/** Decodes an opaque offset cursor produced by `offsetPagination()`. */\nfunction decodeOffsetCursor(cursor: string): number {\n try {\n const decoded = JSON.parse(base64UrlDecode(cursor)) as { offset?: unknown };\n if (typeof decoded.offset !== \"number\" || !Number.isInteger(decoded.offset) || decoded.offset < 0) {\n throw new Error(\"invalid offset\");\n }\n return decoded.offset;\n } catch {\n throw new SidecarRuntimeError(\"Invalid pagination cursor.\", \"invalid_pagination_cursor\");\n }\n}\n\n/** Base64url-encodes UTF-8 text in Node and browser-compatible runtimes. */\nfunction base64UrlEncode(value: string): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(value, \"utf8\").toString(\"base64url\");\n }\n return btoa(value)\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/g, \"\");\n}\n\n/** Base64url-decodes UTF-8 text in Node and browser-compatible runtimes. */\nfunction base64UrlDecode(value: string): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(value, \"base64url\").toString(\"utf8\");\n }\n const padded = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\")\n .padEnd(Math.ceil(value.length / 4) * 4, \"=\");\n return atob(padded);\n}\n\n/** Converts Date annotations to the protocol's ISO timestamp string. */\nfunction normalizeAnnotations(\n annotations: ResourceAnnotations | undefined,\n): ResourceAnnotations | undefined {\n if (!annotations) {\n return undefined;\n }\n\n return stripUndefined({\n audience: annotations.audience ? [...annotations.audience] : undefined,\n priority: annotations.priority,\n lastModified: annotations.lastModified instanceof Date\n ? annotations.lastModified.toISOString()\n : annotations.lastModified,\n });\n}\n\n/** Converts friendly prompt argument declarations to MCP descriptors. */\nfunction promptArguments(args: PromptArgsDefinition | undefined): McpPromptArgument[] | undefined {\n if (!args) {\n return undefined;\n }\n\n const entries = Object.entries(args).map(([name, value]) => {\n if (typeof value === \"string\") {\n return { name, description: value, required: true };\n }\n if (isReadonlyArray(value)) {\n return {\n name,\n description: value.length\n ? `One of: ${value.map(String).join(\", \")}.`\n : undefined,\n required: true,\n };\n }\n return {\n name,\n description: value.description,\n required: value.required ?? true,\n };\n });\n\n return entries.length ? entries : undefined;\n}\n\n/** Narrows readonly argument enum arrays. */\nfunction isReadonlyArray(value: PromptArgInput): value is readonly JsonPrimitive[] {\n return Array.isArray(value);\n}\n\n/** Validates required prompt arguments before running a prompt. */\nfunction validatePromptArgs<Args extends Record<string, unknown>>(\n promptDefinition: SidecarPrompt<Args>,\n args: unknown,\n): Args {\n const input = args && typeof args === \"object\" && !Array.isArray(args)\n ? args as Record<string, unknown>\n : {};\n for (const argument of promptArguments(promptDefinition.args) ?? []) {\n if (argument.required !== false && !(argument.name in input)) {\n throw new SidecarRuntimeError(\n `Prompt \"${promptDefinition.name ?? promptDefinition.title}\" is missing required argument \"${argument.name}\".`,\n \"invalid_prompt_args\",\n );\n }\n }\n return input as Args;\n}\n\n/** Converts a prompt's friendly return value into MCP messages. */\nfunction normalizePromptResult(value: PromptResultInput, defaultDescription?: string): McpPromptResult {\n if (typeof value === \"string\") {\n return {\n description: defaultDescription,\n messages: [{\n role: \"user\",\n content: toolResult.text(value),\n }],\n };\n }\n\n if (Array.isArray(value)) {\n return {\n description: defaultDescription,\n messages: value,\n };\n }\n\n if (\"messages\" in value) {\n return {\n description: value.description ?? defaultDescription,\n messages: value.messages,\n };\n }\n\n return {\n description: defaultDescription,\n messages: [value],\n };\n}\n\n/** Removes `undefined` keys so JSON serialization matches MCP expectations. */\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n","/** Static analysis for reserved server tool files. */\nimport {\n createToolDescriptor,\n toMachineName,\n type ChatGptToolOptions,\n type ToolHostExtensions,\n type ToolAnnotations,\n type ToolAuthPolicy,\n type ToolVisibility,\n} from \"@sidecar-ai/core\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n type Project,\n SyntaxKind,\n type ArrowFunction,\n type CallExpression,\n type FunctionExpression,\n type MethodDeclaration,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport { createProject } from \"./project.js\";\nimport { getOutputSchema, getParamsSchema } from \"./schema.js\";\nimport type { SidecarToolManifestEntry } from \"./types.js\";\nimport { existsSyncSafe } from \"./utils.js\";\nimport { findWidget, mergeWidgetMeta, readWidgetOptions, widgetMeta, widgetResourceMeta } from \"./widgets.js\";\nimport type { SidecarSourceVariant, SidecarTarget } from \"./types.js\";\n\ntype AuthScopeCatalog = Record<string, { id: string; description: string }>;\n\n/** Finds all Sidecar tool files under `server/` and returns manifest entries. */\nexport async function analyzeProjectTools(\n rootDir: string,\n options: { target?: SidecarTarget } = {},\n): Promise<SidecarToolManifestEntry[]> {\n const target = options.target ?? \"mcp\";\n const toolFiles = await findToolFiles(path.join(rootDir, \"server\"), target);\n if (toolFiles.length === 0) {\n return [];\n }\n\n const project = createProject(rootDir);\n const authScopes = readAuthScopeCatalog(project, rootDir);\n return toolFiles.map((candidate) =>\n analyzeToolFile(project.addSourceFileAtPath(candidate.filePath), rootDir, {\n target,\n variant: candidate.variant,\n authScopes,\n }),\n );\n}\n\n/** Analyzes one `tool.ts` source file into a compiler manifest entry. */\nexport function analyzeToolFile(\n sourceFile: SourceFile,\n rootDir: string,\n options: { target?: SidecarTarget; variant?: SidecarSourceVariant; authScopes?: AuthScopeCatalog } = {},\n): SidecarToolManifestEntry {\n const target = options.target ?? \"mcp\";\n const variant = options.variant ?? \"shared\";\n const definition = findToolDefinition(sourceFile);\n const absoluteFile = sourceFile.getFilePath();\n const directory = path.basename(path.dirname(absoluteFile));\n const name = getRequiredStringProperty(definition, \"name\", sourceFile);\n const id = getOptionalStringProperty(definition, \"id\") ?? toMachineName(directory);\n const description = getRequiredStringProperty(\n definition,\n \"description\",\n sourceFile,\n );\n const annotations = readAnnotations(definition);\n const visibility = readVisibility(definition);\n const hosts = readHosts(definition);\n const auth = readAuthPolicy(definition, options.authScopes ?? {});\n const execute = getExecuteFunction(definition, sourceFile);\n\n const inputSchema = getParamsSchema(definition, execute);\n const outputSchema = getOutputSchema(definition, execute);\n const descriptor = createToolDescriptor({\n name,\n id,\n description,\n target,\n inputSchema,\n outputSchema,\n annotations,\n visibility,\n hosts,\n auth,\n meta: undefined,\n });\n\n validateWidgetHierarchy(sourceFile, absoluteFile, target, variant);\n\n const widget = findWidget(rootDir, absoluteFile, id, target, variant);\n if (widget) {\n const widgetFile = path.join(rootDir, widget.sourceFile);\n const project = sourceFile.getProject();\n const widgetSourceFile =\n project.getSourceFile(widgetFile) ?? project.addSourceFileAtPath(widgetFile);\n widget.options = {\n description,\n ...readWidgetOptions(widgetSourceFile),\n };\n widget.resourceMeta = widgetResourceMeta(widget.options, target);\n descriptor._meta = mergeWidgetMeta(descriptor._meta, widgetMeta(widget.resourceUri, widget.options, target));\n }\n\n return {\n sourceFile: path.relative(rootDir, absoluteFile),\n variant,\n target,\n directory,\n id,\n name,\n description,\n inputSchema,\n outputSchema,\n annotations,\n visibility,\n widget,\n descriptor,\n };\n}\n\n/** Extracts static auth shape for descriptor security-scheme generation. */\nfunction readAuthPolicy(\n definition: ObjectLiteralExpression,\n authScopes: AuthScopeCatalog,\n): ToolAuthPolicy | undefined {\n const initializer = readObjectProperty(definition, \"auth\");\n if (!initializer) {\n return undefined;\n }\n\n const publicValue = readBooleanProperty(initializer, \"public\");\n if (publicValue === true) {\n return { public: true };\n }\n\n const scopesProperty = initializer.getProperty(\"scopes\");\n if (scopesProperty && Node.isPropertyAssignment(scopesProperty)) {\n return { scopes: readScopeReferences(scopesProperty.getInitializer(), authScopes) };\n }\n\n return { authenticated: true };\n}\n\n/** Extracts auth.ts scope declarations so generated descriptors can name required scopes. */\nfunction readAuthScopeCatalog(project: Project, rootDir: string): AuthScopeCatalog {\n const authPath = path.join(rootDir, \"auth.ts\");\n if (!existsSyncSafe(authPath)) {\n return {};\n }\n\n const sourceFile = project.addSourceFileAtPath(authPath);\n const catalog: AuthScopeCatalog = {};\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n if (!isNamedCall(call, \"auth\")) {\n continue;\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n continue;\n }\n\n const scopes = readObjectProperty(definition, \"scopes\");\n if (!scopes) {\n continue;\n }\n\n for (const property of scopes.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const scope = readScopeCall(property.getInitializer());\n if (scope) {\n catalog[property.getName().replace(/^[\"']|[\"']$/g, \"\")] = scope;\n }\n }\n }\n\n return catalog;\n}\n\n/** Reads a tool auth `scopes: [...]` initializer into Sidecar scope placeholders. */\nfunction readScopeReferences(\n initializer: Node | undefined,\n authScopes: AuthScopeCatalog,\n): NonNullable<Extract<ToolAuthPolicy, { scopes: unknown }>[\"scopes\"]> {\n const expression = unwrapExpression(initializer);\n if (!expression || !Node.isArrayLiteralExpression(expression)) {\n return [];\n }\n\n return expression.getElements().flatMap((element) => {\n const direct = readScopeCall(element);\n if (direct) {\n return [{ kind: \"sidecar.scope\" as const, ...direct }];\n }\n\n const name = scopeReferenceName(element);\n const declared = name ? authScopes[name] : undefined;\n if (declared) {\n return [{ kind: \"sidecar.scope\" as const, ...declared }];\n }\n\n const literal = unwrapExpression(element);\n if (literal && Node.isStringLiteral(literal)) {\n return [{\n kind: \"sidecar.scope\" as const,\n id: literal.getLiteralText(),\n description: \"\",\n }];\n }\n\n return [];\n });\n}\n\n/** Reads `scope(\"id\", \"description\")` helper calls without executing auth.ts. */\nfunction readScopeCall(node: Node | undefined): { id: string; description: string } | undefined {\n const expression = unwrapExpression(node);\n if (!expression || !Node.isCallExpression(expression) || !isNamedCall(expression, \"scope\")) {\n return undefined;\n }\n\n const [idArg, descriptionArg] = expression.getArguments();\n if (!idArg || !Node.isStringLiteral(idArg)) {\n return undefined;\n }\n\n return {\n id: idArg.getLiteralText(),\n description: Node.isStringLiteral(descriptionArg) ? descriptionArg.getLiteralText() : \"\",\n };\n}\n\n/** Returns the final property name from references like `scopes.expensesRead`. */\nfunction scopeReferenceName(node: Node): string | undefined {\n const expression = unwrapExpression(node);\n if (!expression || !Node.isPropertyAccessExpression(expression)) {\n return undefined;\n }\n\n return expression.getName();\n}\n\n/** Returns true for direct or namespace-qualified helper calls. */\nfunction isNamedCall(call: CallExpression, name: string): boolean {\n const callee = call.getExpression().getText();\n return callee === name || callee.endsWith(`.${name}`);\n}\n\n/** Enforces Sidecar's hierarchical reserved-file platform rule. */\nfunction validateWidgetHierarchy(\n sourceFile: SourceFile,\n toolFile: string,\n target: SidecarTarget,\n variant: SidecarSourceVariant,\n): void {\n const directory = path.dirname(toolFile);\n const platformWidget =\n target === \"chatgpt\"\n ? \"widget.openai.tsx\"\n : target === \"claude\"\n ? \"widget.anthropic.tsx\"\n : undefined;\n\n if (!platformWidget || variant !== \"shared\") {\n return;\n }\n\n if (existsSyncSafe(path.join(directory, platformWidget))) {\n const expectedTool =\n target === \"chatgpt\" ? \"tool.openai.ts\" : \"tool.anthropic.ts\";\n throw new CompilerError(\n sourceFile,\n `${platformWidget} requires a sibling ${expectedTool}; platform-specific widgets cannot attach to a shared tool.ts.`,\n );\n }\n}\n\n/** Finds immediate server child tool files in deterministic order. */\ntype ToolFileCandidate = {\n filePath: string;\n variant: SidecarSourceVariant;\n};\n\nasync function findToolFiles(serverDir: string, target: SidecarTarget): Promise<ToolFileCandidate[]> {\n if (!existsSyncSafe(serverDir)) {\n return [];\n }\n\n const entries = await readdir(serverDir, { withFileTypes: true });\n const files: ToolFileCandidate[] = [];\n\n for (const entry of entries) {\n const entryPath = path.join(serverDir, entry.name);\n if (entry.isDirectory()) {\n const candidate = selectToolFile(entryPath, target);\n if (candidate) {\n files.push(candidate);\n }\n }\n }\n\n return files.sort((left, right) => left.filePath.localeCompare(right.filePath));\n}\n\n/** Picks the platform-specific tool file for a target, falling back to shared code. */\nfunction selectToolFile(directory: string, target: SidecarTarget): ToolFileCandidate | undefined {\n const candidates =\n target === \"chatgpt\"\n ? [\n { name: \"tool.openai.ts\", variant: \"openai\" as const },\n { name: \"tool.ts\", variant: \"shared\" as const },\n ]\n : target === \"claude\"\n ? [\n { name: \"tool.anthropic.ts\", variant: \"anthropic\" as const },\n { name: \"tool.ts\", variant: \"shared\" as const },\n ]\n : [{ name: \"tool.ts\", variant: \"shared\" as const }];\n\n for (const candidate of candidates) {\n const filePath = path.join(directory, candidate.name);\n if (existsSyncSafe(filePath)) {\n return { filePath, variant: candidate.variant };\n }\n }\n\n return undefined;\n}\n\n/** Locates the default-exported `tool({ ... })` object literal. */\nfunction findToolDefinition(sourceFile: SourceFile): ObjectLiteralExpression {\n const call = resolveDefaultExportCall(sourceFile, \"tool\");\n if (!call) {\n throw new CompilerError(\n sourceFile,\n \"tool.ts must default-export tool({ ... }) or an identifier initialized with tool({ ... }).\",\n );\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(\n sourceFile,\n \"tool(...) must receive one object literal.\",\n );\n }\n\n return definition;\n}\n\n/** Reads the supported `execute` declaration shapes from a tool definition. */\nfunction getExecuteFunction(\n definition: ObjectLiteralExpression,\n sourceFile: SourceFile,\n): MethodDeclaration | ArrowFunction | FunctionExpression {\n const property = definition.getProperty(\"execute\");\n if (!property) {\n throw new CompilerError(\n sourceFile,\n \"tool({ ... }) must include an execute method.\",\n );\n }\n\n if (Node.isMethodDeclaration(property)) {\n return property;\n }\n\n if (Node.isPropertyAssignment(property)) {\n const initializer = property.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) ||\n Node.isFunctionExpression(initializer))\n ) {\n return initializer;\n }\n }\n\n throw new CompilerError(\n sourceFile,\n \"execute must be a method, function expression, or arrow function.\",\n );\n}\n\n/** Reads a required string property from the tool object. */\nfunction getRequiredStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n sourceFile: SourceFile,\n): string {\n const value = getOptionalStringProperty(definition, propertyName);\n if (value === undefined || !value.trim()) {\n throw new CompilerError(\n sourceFile,\n `tool({ ... }) must include a non-empty ${propertyName} string.`,\n );\n }\n return value;\n}\n\n/** Reads an optional string literal property from the tool object. */\nfunction getOptionalStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isStringLiteral(initializer)) {\n return undefined;\n }\n\n return initializer.getLiteralText();\n}\n\n/** Extracts static MCP annotation hints from the tool object. */\nfunction readAnnotations(\n definition: ObjectLiteralExpression,\n): ToolAnnotations | undefined {\n const property = definition.getProperty(\"annotations\");\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n return undefined;\n }\n\n const annotations: ToolAnnotations = {};\n for (const key of [\n \"title\",\n \"readOnlyHint\",\n \"destructiveHint\",\n \"idempotentHint\",\n \"openWorldHint\",\n ] as const) {\n const value = initializer.getProperty(key);\n if (!value || !Node.isPropertyAssignment(value)) {\n continue;\n }\n\n const expression = value.getInitializer();\n if (!expression) {\n continue;\n }\n\n if (key === \"title\" && Node.isStringLiteral(expression)) {\n annotations.title = expression.getLiteralText();\n } else if (\n key !== \"title\" &&\n (expression.getKind() === SyntaxKind.TrueKeyword ||\n expression.getKind() === SyntaxKind.FalseKeyword)\n ) {\n annotations[key] = expression.getKind() === SyntaxKind.TrueKeyword;\n }\n }\n\n return Object.keys(annotations).length ? annotations : undefined;\n}\n\n/** Extracts static Sidecar visibility policy from the tool object. */\nfunction readVisibility(\n definition: ObjectLiteralExpression,\n): ToolVisibility | undefined {\n const initializer = readObjectProperty(definition, \"visibility\");\n if (!initializer) {\n return undefined;\n }\n\n const visibility: ToolVisibility = {};\n for (const key of [\"model\", \"widgets\", \"tools\"] as const) {\n const property = initializer.getProperty(key);\n if (!property || !Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const value = property.getInitializer();\n if (!value) {\n continue;\n }\n\n if (\n value.getKind() === SyntaxKind.TrueKeyword ||\n value.getKind() === SyntaxKind.FalseKeyword\n ) {\n assignVisibility(visibility, key, value.getKind() === SyntaxKind.TrueKeyword);\n } else if (Node.isArrayLiteralExpression(value)) {\n assignVisibility(visibility, key, value\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText()));\n }\n }\n\n return Object.keys(visibility).length ? visibility : undefined;\n}\n\n/** Assigns a visibility property without losing the precise key type. */\nfunction assignVisibility<Key extends keyof ToolVisibility>(\n visibility: ToolVisibility,\n key: Key,\n value: ToolVisibility[Key],\n): void {\n visibility[key] = value;\n}\n\n/** Extracts supported host-specific extension metadata from the tool object. */\nfunction readHosts(\n definition: ObjectLiteralExpression,\n): ToolHostExtensions | undefined {\n const initializer = readObjectProperty(definition, \"hosts\");\n if (!initializer) {\n return undefined;\n }\n\n const chatgpt = readObjectProperty(initializer, \"chatgpt\");\n if (!chatgpt) {\n return undefined;\n }\n\n const options: ChatGptToolOptions = {};\n const invoking = readStringProperty(chatgpt, \"invoking\");\n const invoked = readStringProperty(chatgpt, \"invoked\");\n const visibility = readStringProperty(chatgpt, \"visibility\");\n const widgetAccessible = readBooleanProperty(chatgpt, \"widgetAccessible\");\n const fileParams = readStringArrayProperty(chatgpt, \"fileParams\");\n\n if (invoking) options.invoking = invoking;\n if (invoked) options.invoked = invoked;\n if (visibility === \"public\" || visibility === \"private\") {\n options.visibility = visibility;\n }\n if (widgetAccessible !== undefined) {\n options.widgetAccessible = widgetAccessible;\n }\n if (fileParams) {\n options.fileParams = fileParams;\n }\n\n return Object.keys(options).length ? { chatgpt: options } : undefined;\n}\n\n/** Reads a nested object literal property, unwrapping `satisfies` expressions. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal property from an object literal. */\nfunction readStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads a boolean literal property from an object literal. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n\n if (initializer.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n if (initializer.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n return undefined;\n}\n\n/** Reads a string literal array property from an object literal. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n\n/** Drops undefined properties from small parsed option objects. */\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/** Shared ts-morph helpers for reserved Sidecar files. */\nimport {\n Node,\n type CallExpression,\n type SourceFile,\n type VariableDeclaration,\n} from \"ts-morph\";\n\n/**\n * Resolves a default export into a call to the requested authoring helper.\n *\n * This supports both idiomatic shapes:\n *\n * - `export default tool({ ... })`\n * - `const review = tool({ ... }); export default review`\n */\nexport function resolveDefaultExportCall(\n sourceFile: SourceFile,\n helperName: string,\n): CallExpression | undefined {\n const exportAssignment = sourceFile.getExportAssignment(\n (assignment) => !assignment.isExportEquals(),\n );\n const expression = unwrapExpression(exportAssignment?.getExpression());\n const direct = asHelperCall(expression, helperName);\n if (direct) {\n return direct;\n }\n\n if (!expression || !Node.isIdentifier(expression)) {\n return undefined;\n }\n\n const declaration = findVariableDeclaration(sourceFile, expression.getText());\n const initializer = unwrapExpression(declaration?.getInitializer());\n return asHelperCall(initializer, helperName);\n}\n\n/** Removes TypeScript-only wrappers such as `satisfies` from expressions. */\nexport function unwrapExpression(expression: Node | undefined): Node | undefined {\n if (!expression) {\n return undefined;\n }\n\n if (Node.isSatisfiesExpression(expression) || Node.isAsExpression(expression)) {\n return expression.getExpression();\n }\n\n return expression;\n}\n\n/** Returns a helper call when the expression calls exactly that helper. */\nfunction asHelperCall(\n expression: Node | undefined,\n helperName: string,\n): CallExpression | undefined {\n if (!expression || !Node.isCallExpression(expression)) {\n return undefined;\n }\n\n const callee = expression.getExpression().getText();\n return matchesHelperName(callee, helperName) ? expression : undefined;\n}\n\n/** Finds a top-level variable declaration by identifier name. */\nfunction findVariableDeclaration(\n sourceFile: SourceFile,\n name: string,\n): VariableDeclaration | undefined {\n return sourceFile\n .getVariableDeclarations()\n .find((declaration) => declaration.getName() === name);\n}\n\n/** Checks imported, namespaced, and locally scoped helper call names. */\nfunction matchesHelperName(callee: string, helperName: string): boolean {\n return callee === helperName || callee.endsWith(`.${helperName}`);\n}\n","/** Compiler-specific errors include the source file path in their message. */\nimport type { SourceFile } from \"ts-morph\";\n\n/** Error thrown when a reserved file violates Sidecar's authoring contract. */\nexport class CompilerError extends Error {\n constructor(sourceFile: SourceFile, message: string) {\n super(`${sourceFile.getFilePath()}: ${message}`);\n this.name = \"CompilerError\";\n }\n}\n","/** Shared ts-morph project setup for Sidecar reserved-file analyzers. */\nimport path from \"node:path\";\nimport {\n ModuleKind,\n ModuleResolutionKind,\n Project,\n ScriptTarget,\n} from \"ts-morph\";\nimport { existsSyncSafe } from \"./utils.js\";\n\n/** Creates a ts-morph project using the app tsconfig when available. */\nexport function createProject(rootDir: string): Project {\n const tsconfig = path.join(rootDir, \"tsconfig.json\");\n\n return new Project({\n tsConfigFilePath: existsSyncSafe(tsconfig) ? tsconfig : undefined,\n compilerOptions: existsSyncSafe(tsconfig)\n ? undefined\n : {\n allowJs: false,\n baseUrl: process.cwd(),\n esModuleInterop: true,\n module: ModuleKind.NodeNext,\n moduleResolution: ModuleResolutionKind.NodeNext,\n paths: devSidecarTypePaths(),\n strict: true,\n target: ScriptTarget.ES2022,\n },\n skipAddingFilesFromTsConfig: true,\n });\n}\n\n/** Provides source aliases for repo-local examples before package dist exists. */\nfunction devSidecarTypePaths(): Record<string, string[]> | undefined {\n const repoRoot = process.cwd();\n const corePath = path.join(repoRoot, \"packages\", \"core\", \"src\", \"index.ts\");\n if (!existsSyncSafe(corePath)) {\n return undefined;\n }\n\n return {\n \"sidecar-ai\": [\"packages/sidecar-ai/src/index.ts\"],\n \"@sidecar-ai/core\": [\"packages/core/src/index.ts\"],\n \"@sidecar-ai/client\": [\"packages/client/src/index.ts\"],\n \"@sidecar-ai/react\": [\"packages/react/src/index.ts\"],\n \"@sidecar-ai/native\": [\"packages/native/src/index.ts\"],\n \"@sidecar-ai/native/components\": [\"packages/native/src/components/index.tsx\"],\n \"@sidecar-ai/openai\": [\"packages/openai/src/index.ts\"],\n \"@sidecar-ai/openai/components\": [\"packages/openai/src/components.tsx\"],\n \"@sidecar-ai/anthropic\": [\"packages/anthropic/src/index.ts\"],\n \"@sidecar-ai/anthropic/components\": [\"packages/anthropic/src/components.tsx\"],\n \"@sidecar-ai/anthropic/plugin\": [\"packages/anthropic/src/plugin.ts\"],\n \"@sidecar-ai/anthropic/hooks\": [\"packages/anthropic/src/hooks.ts\"],\n };\n}\n","/** Shared compiler utility helpers. */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/** Safe filesystem existence check wrapped for testability and consistency. */\nexport function existsSyncSafe(filePath: string): boolean {\n return existsSync(filePath);\n}\n\n/** Creates an ESM import specifier from one file location to another. */\nexport function toImportSpecifier(\n fromDir: string,\n toFile: string,\n options: { extension?: \"none\" | \"js\" | \"preserve\" } = {},\n): string {\n const relative = path.relative(fromDir, toFile).replaceAll(path.sep, \"/\");\n const normalized = relative.startsWith(\".\") ? relative : `./${relative}`;\n\n switch (options.extension ?? \"none\") {\n case \"js\":\n return normalized.replace(/\\.(tsx|ts)$/, \".js\");\n case \"preserve\":\n return normalized;\n case \"none\":\n return normalized.replace(/\\.(tsx|ts)$/, \"\");\n }\n}\n\n/** Converts a tool id into a valid JavaScript property identifier. */\nexport function toIdentifier(value: string): string {\n const identifier = value\n .replace(/[^A-Za-z0-9]+(.)/g, (_match, char: string) => char.toUpperCase())\n .replace(/^[^A-Za-z_$]+/, \"\")\n .replace(/[^A-Za-z0-9_$]/g, \"\");\n\n return identifier || \"tool\";\n}\n\n/** Sanitizes a value for use as a path segment. */\nexport function safePathSegment(value: string): string {\n const segment = value.replace(/[^A-Za-z0-9._-]+/g, \"_\");\n if (!segment || segment === \".\" || segment === \"..\") {\n return \"_\";\n }\n return segment;\n}\n\n/** Sanitizes a metadata-provided file stem for generated plugin files. */\nexport function safeFileStem(value: string): string {\n return safePathSegment(value).replace(/^\\.+/, \"_\").replace(/^_+/, \"_\");\n}\n\n/** Escapes a scalar value for simple YAML/frontmatter generation. */\nexport function yamlScalar(value: unknown): string {\n return JSON.stringify(String(value ?? \"\"));\n}\n\n/** Escapes text that will be embedded into HTML. */\nexport function escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\n/** Drops undefined values from JSON-like objects before writing files. */\nexport function stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\n/** Reads a simple string property from a TypeScript object literal string. */\nexport function readObjectString(source: string, key: string): string | undefined {\n const match = source.match(\n new RegExp(`${key}\\\\s*:\\\\s*([\"'\\`])([\\\\s\\\\S]*?)\\\\1`),\n );\n return match?.[2]?.trim();\n}\n\n/** Reads a simple string array property from a TypeScript object literal string. */\nexport function readObjectStringArray(\n source: string,\n key: string,\n): string[] | undefined {\n const match = source.match(new RegExp(`${key}\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`));\n if (!match?.[1]) {\n return undefined;\n }\n\n return [...match[1].matchAll(/[\"']([^\"']+)[\"']/g)]\n .map((item) => item[1]!)\n .filter(Boolean);\n}\n","/** TypeScript and lightweight Zod-to-JSON-Schema extraction. */\nimport { emptyObjectSchema, type JsonSchema } from \"@sidecar-ai/core\";\nimport {\n Node,\n type ArrowFunction,\n type FunctionExpression,\n type MethodDeclaration,\n type ObjectLiteralExpression,\n type PropertyAssignment,\n type Symbol as MorphSymbol,\n type Type,\n} from \"ts-morph\";\n\n/** Supported AST nodes that can execute a Sidecar tool. */\nexport type ExecutableNode = MethodDeclaration | ArrowFunction | FunctionExpression;\n\n/** Builds the input schema from explicit params or the execute param type. */\nexport function getParamsSchema(\n definition: ObjectLiteralExpression,\n execute: ExecutableNode,\n): JsonSchema {\n const explicitParams = definition.getProperty(\"params\");\n if (explicitParams && Node.isPropertyAssignment(explicitParams)) {\n const inferred = getSchemaFromZodProperty(explicitParams);\n if (inferred) {\n return inferred;\n }\n }\n\n const [params] = execute.getParameters();\n if (!params) {\n return emptyObjectSchema();\n }\n\n return typeToJsonSchema(\n params.getType(),\n schemaDescription(params.getSymbol()),\n );\n}\n\n/** Builds the output schema from explicit output or the execute return type. */\nexport function getOutputSchema(\n definition: ObjectLiteralExpression,\n execute: ExecutableNode,\n): JsonSchema | undefined {\n const explicitOutput = definition.getProperty(\"output\");\n if (explicitOutput && Node.isPropertyAssignment(explicitOutput)) {\n return undefined;\n }\n\n const returnType = unwrapToolResultType(unwrapPromiseType(execute.getReturnType()));\n if (returnType.isVoid() || returnType.isUndefined()) {\n return undefined;\n }\n\n return typeToJsonSchema(returnType);\n}\n\n/** Extracts a small JSON Schema subset from `params: z.object(...)`. */\nfunction getSchemaFromZodProperty(\n property: PropertyAssignment,\n): JsonSchema | undefined {\n const initializer = property.getInitializer();\n if (!initializer) {\n return undefined;\n }\n\n if (\n Node.isCallExpression(initializer) &&\n initializer.getExpression().getText().endsWith(\".object\")\n ) {\n const [shape] = initializer.getArguments();\n if (shape && Node.isObjectLiteralExpression(shape)) {\n return zodObjectLiteralToSchema(shape);\n }\n }\n\n return undefined;\n}\n\n/** Converts a Zod object literal shape into JSON Schema. */\nfunction zodObjectLiteralToSchema(shape: ObjectLiteralExpression): JsonSchema {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const property of shape.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const name = property.getName().replace(/^[\"']|[\"']$/g, \"\");\n const initializer = property.getInitializer();\n if (!initializer) {\n continue;\n }\n\n const propertySchema = zodExpressionToSchema(initializer);\n properties[name] = propertySchema.schema;\n if (!propertySchema.optional) {\n required.push(name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n };\n}\n\n/** Converts a supported Zod expression into a property schema. */\nfunction zodExpressionToSchema(expression: Node): {\n schema: JsonSchema;\n optional: boolean;\n} {\n const text = expression.getText();\n const optional = /\\.optional\\(\\)/.test(text) || /\\.default\\(/.test(text);\n const schema: JsonSchema = {};\n\n if (/z\\.string\\(\\)/.test(text)) {\n schema.type = \"string\";\n } else if (/z\\.number\\(\\)/.test(text)) {\n schema.type = \"number\";\n } else if (/z\\.boolean\\(\\)/.test(text)) {\n schema.type = \"boolean\";\n } else if (/z\\.array\\(/.test(text)) {\n schema.type = \"array\";\n schema.items = {};\n } else {\n schema.type = \"object\";\n }\n\n const min = text.match(/\\.min\\((\\d+)/);\n const max = text.match(/\\.max\\((\\d+)/);\n if (schema.type === \"string\") {\n if (min) schema.minLength = Number(min[1]);\n if (max) schema.maxLength = Number(max[1]);\n } else {\n if (min) schema.minimum = Number(min[1]);\n if (max) schema.maximum = Number(max[1]);\n }\n\n if (/\\.int\\(\\)/.test(text)) {\n schema.type = \"integer\";\n }\n\n return { schema, optional };\n}\n\n/** Converts a TypeScript type into a JSON Schema object. */\nfunction typeToJsonSchema(type: Type, description?: string): JsonSchema {\n const withoutUndefined = removeUndefined(type);\n const schema = typeToJsonSchemaInner(withoutUndefined);\n if (description) {\n schema.description = description;\n }\n return schema;\n}\n\n/** Recursively maps TypeScript primitives, unions, arrays, tuples, and objects. */\nfunction typeToJsonSchemaInner(type: Type): JsonSchema {\n if (type.isString() || type.isStringLiteral()) {\n return literalOrPrimitive(type, \"string\");\n }\n if (type.isNumber() || type.isNumberLiteral()) {\n return literalOrPrimitive(type, \"number\");\n }\n if (type.isBoolean() || type.isBooleanLiteral()) {\n return literalOrPrimitive(type, \"boolean\");\n }\n if (type.isNull()) {\n return { type: \"null\" };\n }\n if (type.isArray()) {\n return {\n type: \"array\",\n items: typeToJsonSchema(type.getArrayElementTypeOrThrow()),\n };\n }\n if (type.isTuple()) {\n const elements = type.getTupleElements();\n return {\n type: \"array\",\n items:\n elements.length === 1\n ? typeToJsonSchema(elements[0]!)\n : { anyOf: elements.map((item) => typeToJsonSchema(item)) },\n };\n }\n if (type.isUnion()) {\n const parts = type.getUnionTypes().filter((part) => !part.isUndefined());\n if (parts.every(isLiteralType)) {\n return { enum: parts.map((part) => literalValue(part)) };\n }\n return { anyOf: parts.map((part) => typeToJsonSchema(part)) };\n }\n\n const properties = type.getProperties();\n if (properties.length > 0) {\n return objectTypeToSchema(properties);\n }\n\n return {};\n}\n\n/** Converts object properties into JSON Schema properties and required lists. */\nfunction objectTypeToSchema(properties: MorphSymbol[]): JsonSchema {\n const schemaProperties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const property of properties) {\n const declaration =\n property.getValueDeclaration() ?? property.getDeclarations()[0];\n if (!declaration) {\n continue;\n }\n\n const name = property.getName();\n const rawType = property.getTypeAtLocation(declaration);\n const propertyType = removeUndefined(rawType);\n const propertySchema = typeToJsonSchema(\n propertyType,\n schemaDescription(property),\n );\n schemaProperties[name] = propertySchema;\n\n if (!property.isOptional() && !containsUndefined(rawType)) {\n required.push(name);\n }\n }\n\n return {\n type: \"object\",\n properties: schemaProperties,\n required,\n additionalProperties: false,\n };\n}\n\n/** Returns a literal const schema when possible, otherwise a primitive schema. */\nfunction literalOrPrimitive(\n type: Type,\n primitive: \"string\" | \"number\" | \"boolean\",\n): JsonSchema {\n if (isLiteralType(type)) {\n return { const: literalValue(type) };\n }\n return { type: primitive };\n}\n\n/** Returns true for literal string, number, and boolean types. */\nfunction isLiteralType(type: Type): boolean {\n return (\n type.isStringLiteral() || type.isNumberLiteral() || type.isBooleanLiteral()\n );\n}\n\n/** Reads a JavaScript literal value from a TypeScript literal type. */\nfunction literalValue(type: Type): string | number | boolean {\n if (type.isStringLiteral()) return String(type.getLiteralValue());\n if (type.isNumberLiteral()) return Number(type.getLiteralValue());\n const text = type.getText();\n return text === \"true\";\n}\n\n/** Unwraps `Promise<T>` return types for output schema inference. */\nfunction unwrapPromiseType(type: Type): Type {\n if (!type.getText().startsWith(\"Promise<\")) {\n return type;\n }\n const args = type.getTypeArguments();\n return args[0] ?? type;\n}\n\n/** Extracts the structured content type from Sidecar's required `ToolResult<T>`. */\nfunction unwrapToolResultType(type: Type): Type {\n const aliasName = type.getAliasSymbol()?.getName();\n if (aliasName === \"ToolResult\") {\n const [structured] = type.getAliasTypeArguments();\n return structured ?? type;\n }\n\n const structured = type.getProperty(\"structuredContent\");\n const declaration = structured?.getValueDeclaration() ?? structured?.getDeclarations()[0];\n if (!structured || !declaration) {\n return type;\n }\n\n return removeUndefined(structured.getTypeAtLocation(declaration));\n}\n\n/** Removes `undefined` from simple union types. */\nfunction removeUndefined(type: Type): Type {\n if (!type.isUnion()) {\n return type;\n }\n\n const nonUndefined = type\n .getUnionTypes()\n .filter((part) => !part.isUndefined());\n return nonUndefined.length === 1 ? nonUndefined[0]! : type;\n}\n\n/** Returns true when a union includes `undefined`. */\nfunction containsUndefined(type: Type): boolean {\n return (\n type.isUnion() && type.getUnionTypes().some((part) => part.isUndefined())\n );\n}\n\n/** Reads the first JSDoc description attached to a symbol. */\nfunction schemaDescription(\n symbol: MorphSymbol | undefined,\n): string | undefined {\n if (!symbol) {\n return undefined;\n }\n\n return symbol\n .getDeclarations()\n .flatMap((declaration) => {\n if (Node.isJSDocable(declaration)) {\n return declaration.getJsDocs().map((doc) => doc.getCommentText() ?? \"\");\n }\n return [];\n })\n .find((comment) => comment.trim().length > 0);\n}\n","/** Widget discovery and HTML bundling. */\nimport { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build as esbuild } from \"esbuild\";\nimport postcss from \"postcss\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport type { ChatGptWidgetOptions, ToolWidgetOptions } from \"@sidecar-ai/core\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport type { SidecarSourceVariant, SidecarTarget, SidecarToolManifestEntry, SidecarWidgetManifestEntry } from \"./types.js\";\nimport { escapeHtml, safePathSegment, toImportSpecifier } from \"./utils.js\";\n\n/** Bundles every discovered `widget.tsx` into a content-hashed HTML resource. */\nexport async function buildWidgets(\n rootDir: string,\n outDir: string,\n tools: SidecarToolManifestEntry[],\n): Promise<void> {\n const widgets = tools.filter(\n (\n entry,\n ): entry is SidecarToolManifestEntry & {\n widget: SidecarWidgetManifestEntry;\n } => Boolean(entry.widget),\n );\n if (!widgets.length) {\n return;\n }\n\n const cacheDir = path.join(rootDir, \".sidecar\", \"cache\", \"widgets\");\n await mkdir(cacheDir, { recursive: true });\n const appStyle = await prepareAppStyle(rootDir, cacheDir);\n\n for (const entry of widgets) {\n const sourceFile = path.join(rootDir, entry.widget.sourceFile);\n const safeId = safePathSegment(entry.id);\n const entryFile = path.join(cacheDir, `${safeId}.entry.tsx`);\n const importPath = toImportSpecifier(path.dirname(entryFile), sourceFile);\n\n await writeFile(\n entryFile,\n `import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { SidecarWidgetRoot } from \"@sidecar-ai/react\";\nimport \"@sidecar-ai/native/styles.css\";\n${appStyle ? `import ${JSON.stringify(toImportSpecifier(path.dirname(entryFile), appStyle))};` : \"\"}\nimport Component from ${JSON.stringify(importPath)};\n\ncreateRoot(document.getElementById(\"root\")!).render(\n React.createElement(SidecarWidgetRoot, null, React.createElement(Component))\n);\n`,\n );\n\n const bundled = await esbuild({\n absWorkingDir: rootDir,\n alias: devSidecarBundleAliases(rootDir),\n bundle: true,\n entryPoints: [entryFile],\n format: \"iife\",\n jsx: \"automatic\",\n minify: false,\n nodePaths: [\n path.join(rootDir, \"node_modules\"),\n path.join(process.cwd(), \"node_modules\"),\n ],\n outfile: \"widget.js\",\n platform: \"browser\",\n sourcemap: false,\n write: false,\n });\n\n const javascript = bundled.outputFiles.find((file) => file.path.endsWith(\".js\"))?.text ?? \"\";\n const css = bundled.outputFiles\n .filter((file) => file.path.endsWith(\".css\"))\n .map((file) => file.text)\n .join(\"\\n\");\n const html = renderWidgetHtml(entry.name, javascript, css);\n const hash = createHash(\"sha256\").update(html).digest(\"hex\").slice(0, 12);\n const outputDir = path.join(outDir, \"public\", \"widgets\", safeId);\n const outputFile = path.join(outputDir, `widget.${hash}.html`);\n const resourceUri = `ui://${safeId}/widget.${hash}.html`;\n\n await mkdir(outputDir, { recursive: true });\n await writeFile(outputFile, html);\n\n entry.widget.resourceUri = resourceUri;\n entry.widget.resourceMeta = widgetResourceMeta(entry.widget.options, entry.target);\n entry.widget.outputFile = path.relative(outDir, outputFile);\n entry.descriptor._meta = mergeWidgetMeta(entry.descriptor._meta, widgetMeta(resourceUri, entry.widget.options, entry.target));\n }\n}\n\n/** Provides source aliases when bundling repo-local examples before dist exists. */\nfunction devSidecarBundleAliases(rootDir: string): Record<string, string> | undefined {\n const repoRoot = findSidecarRepoRoot(rootDir) ?? findSidecarRepoRoot(process.cwd());\n if (!repoRoot) {\n return undefined;\n }\n const reactEntry = path.join(repoRoot, \"packages\", \"react\", \"src\", \"index.ts\");\n if (!existsSync(reactEntry)) {\n return undefined;\n }\n\n return {\n \"sidecar-ai\": path.join(repoRoot, \"packages\", \"sidecar-ai\", \"src\", \"index.ts\"),\n \"@sidecar-ai/client\": path.join(repoRoot, \"packages\", \"client\", \"src\", \"index.ts\"),\n \"@sidecar-ai/core\": path.join(repoRoot, \"packages\", \"core\", \"src\", \"index.ts\"),\n \"@sidecar-ai/react\": reactEntry,\n \"@sidecar-ai/native\": path.join(repoRoot, \"packages\", \"native\", \"src\", \"index.ts\"),\n \"@sidecar-ai/native/components\": path.join(repoRoot, \"packages\", \"native\", \"src\", \"components\", \"index.tsx\"),\n \"@sidecar-ai/native/styles.css\": path.join(repoRoot, \"packages\", \"native\", \"src\", \"styles.css\"),\n };\n}\n\n/** Finds the repository root for source aliases used by local workspace tests. */\nfunction findSidecarRepoRoot(startDir: string): string | undefined {\n let current = path.resolve(startDir);\n while (true) {\n if (existsSync(path.join(current, \"packages\", \"core\", \"src\", \"index.ts\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\n/** Copies and optionally processes root `style.css` for widget builds. */\nasync function prepareAppStyle(rootDir: string, cacheDir: string): Promise<string | undefined> {\n const sourceFile = path.join(rootDir, \"style.css\");\n if (!existsSync(sourceFile)) {\n return undefined;\n }\n\n const source = await readFile(sourceFile, \"utf8\");\n const css = await processAppStyle(source, sourceFile);\n const outputFile = path.join(cacheDir, \"style.css\");\n await writeFile(outputFile, css);\n return outputFile;\n}\n\n/** Runs Tailwind/PostCSS only when the app stylesheet needs it. */\nasync function processAppStyle(source: string, from: string): Promise<string> {\n if (!needsPostcss(source)) {\n return source;\n }\n\n const cssSource = source\n .replace(/@import\\s+[\"']tailwindcss[\"'];?/g, \"@tailwind utilities;\")\n .replace(/@import\\s+[\"']@openai\\/apps-sdk-ui\\/css[\"'];?/g, \"\");\n const plugins = [];\n if (cssSource.includes(\"@tailwind\")) {\n const tailwind = await import(\"@tailwindcss/postcss\");\n plugins.push(tailwind.default({ base: path.dirname(from) }));\n }\n\n const autoprefixer = await import(\"autoprefixer\");\n plugins.push(autoprefixer.default());\n\n const result = await postcss(plugins).process(cssSource, {\n from,\n map: false,\n });\n return result.css;\n}\n\n/** Returns true when CSS contains framework directives that esbuild does not own. */\nfunction needsPostcss(source: string): boolean {\n return /@import\\s+[\"']tailwindcss[\"']|@tailwind|@source|@theme|@plugin/.test(source);\n}\n\n/** Finds a sibling `widget.tsx` for a tool file. */\nexport function findWidget(\n rootDir: string,\n toolFile: string,\n id: string,\n target: SidecarTarget = \"mcp\",\n toolVariant: SidecarSourceVariant = \"shared\",\n): SidecarWidgetManifestEntry | undefined {\n const selected = selectWidgetFile(path.dirname(toolFile), target, toolVariant);\n if (!selected) {\n return undefined;\n }\n\n const safeId = safePathSegment(id);\n return {\n sourceFile: path.relative(rootDir, selected.filePath),\n variant: selected.variant,\n resourceUri: `ui://${safeId}/widget.html`,\n };\n}\n\n/** Extracts `widget({ ... }, Component)` metadata from a widget source file. */\nexport function readWidgetOptions(\n sourceFile: SourceFile,\n): ToolWidgetOptions | undefined {\n const definition = findWidgetDefinition(sourceFile);\n if (!definition) {\n return undefined;\n }\n\n const options: ToolWidgetOptions = {};\n const description = readStringProperty(definition, \"description\");\n const prefersBorder = readBooleanProperty(definition, \"prefersBorder\");\n const csp = readWidgetCsp(definition);\n const permissions = readWidgetPermissions(definition);\n const chatgpt = readChatGptWidgetOptions(definition);\n const domain = readStringProperty(definition, \"domain\");\n\n if (description) options.description = description;\n if (prefersBorder !== undefined) options.prefersBorder = prefersBorder;\n if (domain) options.domain = domain;\n if (csp) options.csp = csp;\n if (permissions) options.permissions = permissions;\n if (chatgpt) options.hosts = { chatgpt };\n\n return Object.keys(options).length ? options : undefined;\n}\n\n/** Builds standard tool-to-widget and ChatGPT-compatible metadata for a descriptor. */\nexport function widgetMeta(\n resourceUri: string,\n options: ToolWidgetOptions = {},\n target: SidecarTarget = \"mcp\",\n): Record<string, unknown> {\n const chatgptCsp = {\n connect_domains: options.csp?.connectDomains ? [...options.csp.connectDomains] : [],\n resource_domains: options.csp?.resourceDomains ? [...options.csp.resourceDomains] : [],\n frame_domains: options.csp?.frameDomains ? [...options.csp.frameDomains] : undefined,\n redirect_domains: options.hosts?.chatgpt?.redirectDomains\n ? [...options.hosts.chatgpt.redirectDomains]\n : undefined,\n };\n\n const standard = {\n ui: {\n resourceUri,\n },\n };\n\n if (target !== \"chatgpt\") {\n return standard;\n }\n\n return {\n ...standard,\n \"openai/outputTemplate\": resourceUri,\n \"openai/widgetDescription\": options.description,\n \"openai/widgetDomain\": options.hosts?.chatgpt?.domain,\n \"openai/widgetCSP\": stripUndefined(chatgptCsp),\n };\n}\n\n/** Builds MCP Apps metadata for the `ui://` resource content. */\nexport function widgetResourceMeta(\n options: ToolWidgetOptions = {},\n target: SidecarTarget = \"mcp\",\n): Record<string, unknown> | undefined {\n const csp = stripUndefined({\n connectDomains: options.csp?.connectDomains ? [...options.csp.connectDomains] : [],\n resourceDomains: options.csp?.resourceDomains ? [...options.csp.resourceDomains] : [],\n frameDomains: options.csp?.frameDomains ? [...options.csp.frameDomains] : undefined,\n baseUriDomains: options.csp?.baseUriDomains ? [...options.csp.baseUriDomains] : undefined,\n });\n const permissions = widgetPermissionsMeta(options);\n const ui = stripUndefined({\n csp,\n permissions,\n domain: options.domain ?? (target === \"chatgpt\" ? options.hosts?.chatgpt?.domain : undefined),\n prefersBorder: options.prefersBorder,\n });\n\n return Object.keys(ui).length ? { ui } : undefined;\n}\n\n/** Locates the default-exported widget helper call when a widget uses one. */\nfunction findWidgetDefinition(\n sourceFile: SourceFile,\n): ObjectLiteralExpression | undefined {\n const call = resolveDefaultExportCall(sourceFile, \"widget\");\n if (!call) {\n return undefined;\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(\n sourceFile,\n \"widget(...) must receive its metadata object as the first argument.\",\n );\n }\n\n return definition;\n}\n\n/** Reads standard widget CSP options. */\nfunction readWidgetCsp(\n definition: ObjectLiteralExpression,\n): ToolWidgetOptions[\"csp\"] | undefined {\n const initializer = readObjectProperty(definition, \"csp\");\n if (!initializer) {\n return undefined;\n }\n\n const csp = {\n connectDomains: readStringArrayProperty(initializer, \"connectDomains\"),\n resourceDomains: readStringArrayProperty(initializer, \"resourceDomains\"),\n frameDomains: readStringArrayProperty(initializer, \"frameDomains\"),\n baseUriDomains: readStringArrayProperty(initializer, \"baseUriDomains\"),\n };\n return stripUndefined(csp);\n}\n\n/** Reads standard MCP Apps permission requests. */\nfunction readWidgetPermissions(\n definition: ObjectLiteralExpression,\n): ToolWidgetOptions[\"permissions\"] | undefined {\n const initializer = readObjectProperty(definition, \"permissions\");\n if (!initializer) {\n return undefined;\n }\n\n const permissions = {\n camera: readBooleanProperty(initializer, \"camera\"),\n microphone: readBooleanProperty(initializer, \"microphone\"),\n geolocation: readBooleanProperty(initializer, \"geolocation\"),\n clipboardWrite: readBooleanProperty(initializer, \"clipboardWrite\"),\n };\n return stripUndefined(permissions);\n}\n\n/** Converts boolean permission flags into the standard empty-object shape. */\nfunction widgetPermissionsMeta(options: ToolWidgetOptions): Record<string, unknown> | undefined {\n const permissions = options.permissions;\n if (!permissions) {\n return undefined;\n }\n\n const meta = stripUndefined({\n camera: permissions.camera ? {} : undefined,\n microphone: permissions.microphone ? {} : undefined,\n geolocation: permissions.geolocation ? {} : undefined,\n clipboardWrite: permissions.clipboardWrite ? {} : undefined,\n });\n return Object.keys(meta).length ? meta : undefined;\n}\n\n/** Reads ChatGPT-only widget compatibility options. */\nfunction readChatGptWidgetOptions(\n definition: ObjectLiteralExpression,\n): ChatGptWidgetOptions | undefined {\n const hosts = readObjectProperty(definition, \"hosts\");\n const chatgpt = hosts ? readObjectProperty(hosts, \"chatgpt\") : undefined;\n if (!chatgpt) {\n return undefined;\n }\n\n const options = {\n domain: readStringProperty(chatgpt, \"domain\"),\n redirectDomains: readStringArrayProperty(chatgpt, \"redirectDomains\"),\n };\n return stripUndefined(options);\n}\n\n/** Reads a nested object literal property, unwrapping TS-only expressions. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal property from an object literal. */\nfunction readStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads a boolean literal property from an object literal. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n\n if (initializer.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n if (initializer.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n return undefined;\n}\n\n/** Reads a string literal array property from an object literal. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n\n/** Selects the widget source for a target, preferring platform overrides. */\nfunction selectWidgetFile(\n directory: string,\n target: SidecarTarget,\n toolVariant: SidecarSourceVariant,\n): { filePath: string; variant: SidecarSourceVariant } | undefined {\n if (toolVariant === \"openai\") {\n const filePath = path.join(directory, \"widget.openai.tsx\");\n return existsSync(filePath) ? { filePath, variant: \"openai\" } : undefined;\n }\n\n if (toolVariant === \"anthropic\") {\n const filePath = path.join(directory, \"widget.anthropic.tsx\");\n return existsSync(filePath) ? { filePath, variant: \"anthropic\" } : undefined;\n }\n\n const candidates =\n target === \"chatgpt\" || target === \"claude\" || target === \"mcp\"\n ? [{ name: \"widget.tsx\", variant: \"shared\" as const }]\n : [];\n\n for (const candidate of candidates) {\n const filePath = path.join(directory, candidate.name);\n if (existsSync(filePath)) {\n return { filePath, variant: candidate.variant };\n }\n }\n\n return undefined;\n}\n\n/** Merges widget metadata into existing descriptor metadata without losing `ui`. */\nexport function mergeWidgetMeta(\n existing: Record<string, unknown> | undefined,\n widget: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...(existing ?? {}) };\n for (const [key, value] of Object.entries(widget)) {\n if (key === \"ui\" && isRecord(value) && isRecord(merged.ui)) {\n merged.ui = { ...merged.ui, ...value };\n } else {\n merged[key] = value;\n }\n }\n return merged;\n}\n\n/** Wraps bundled JavaScript in the minimal transparent widget document. */\nfunction renderWidgetHtml(title: string, javascript: string, css = \"\"): 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\" />\n <title>${escapeHtml(title)}</title>\n <style>\n :root { color-scheme: light dark; font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; }\n html, body, #root { min-height: 100%; margin: 0; background: transparent; }\n body { color: CanvasText; }\n * { box-sizing: border-box; }\n ${css}\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n <script>${javascript}</script>\n </body>\n</html>\n`;\n}\n\n/** Returns true for metadata objects that can be shallow-merged. */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\n/** Drops undefined keys from emitted metadata objects. */\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/** Build orchestration for Sidecar projects. */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { analyzeProjectTools } from \"./analyze.js\";\nimport { analyzeProjectConfig } from \"./config.js\";\nimport { collectProjectDiagnostics, formatDiagnostic } from \"./diagnostics.js\";\nimport { writeGeneratedTypes } from \"./generated.js\";\nimport { buildPluginPackages } from \"./plugins.js\";\nimport { analyzeProjectPrompts } from \"./prompts.js\";\nimport { analyzeProjectResources } from \"./resources.js\";\nimport type { BuildProjectOptions, SidecarManifest, SidecarResourceTemplateManifestEntry } from \"./types.js\";\nimport { buildWidgets } from \"./widgets.js\";\n\n/** Builds the MCP output, generated types, and optional plugin packages. */\nexport async function buildProject(\n options: BuildProjectOptions,\n): Promise<SidecarManifest> {\n const rootDir = path.resolve(options.rootDir);\n const target = options.target ?? \"mcp\";\n const config = analyzeProjectConfig(rootDir);\n const tools = await analyzeProjectTools(rootDir, { target });\n const resources = await analyzeProjectResources(rootDir);\n const resourceTemplates: SidecarResourceTemplateManifestEntry[] = [];\n const prompts = await analyzeProjectPrompts(rootDir);\n const diagnostics = await collectProjectDiagnostics(rootDir, {\n tools,\n resources,\n prompts,\n config,\n });\n const errors = diagnostics.filter((diagnostic) => diagnostic.severity === \"error\");\n if (errors.length) {\n throw new Error(errors.map(formatDiagnostic).join(\"\\n\"));\n }\n\n const outDir = resolveInsideRoot(rootDir, options.outDir ?? \"out/mcp\");\n await buildWidgets(rootDir, outDir, tools);\n\n const manifest: SidecarManifest = {\n version: 1,\n target,\n rootDir: \".\",\n generatedAt: new Date().toISOString(),\n config,\n tools,\n resources,\n resourceTemplates,\n prompts,\n diagnostics,\n };\n\n await mkdir(outDir, { recursive: true });\n await writeFile(\n path.join(outDir, \"manifest.sidecar.json\"),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n );\n await writeFile(path.join(outDir, \"README.md\"), renderMcpReadme(manifest));\n await writeGeneratedTypes(rootDir, tools);\n if (options.plugins) {\n await buildPluginPackages(rootDir, path.dirname(outDir), manifest);\n }\n\n return manifest;\n}\n\n/** Resolves build output paths while preventing writes outside the project. */\nfunction resolveInsideRoot(rootDir: string, output: string): string {\n const resolved = path.resolve(rootDir, output);\n const relative = path.relative(rootDir, resolved);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Build output must stay inside the project root: ${output}`);\n }\n return resolved;\n}\n\n/** Renders a short build README with detected tools and install context. */\nfunction renderMcpReadme(manifest: SidecarManifest): string {\n const tools = manifest.tools\n .map((toolEntry) => `- \\`${toolEntry.id}\\`: ${toolEntry.description}`)\n .join(\"\\n\");\n const resources = manifest.resources\n .map((resourceEntry) => `- \\`${resourceEntry.uri}\\`: ${resourceEntry.description ?? resourceEntry.name}`)\n .join(\"\\n\");\n const prompts = manifest.prompts\n .map((promptEntry) => `- \\`${promptEntry.name}\\`: ${promptEntry.description ?? promptEntry.title}`)\n .join(\"\\n\");\n\n return `# Sidecar MCP Build\n\nGenerated by Sidecar.\n\n## Tools\n\n${tools || \"No tools detected.\"}\n\n## Resources\n\n${resources || \"No resources detected.\"}\n\n## Prompts\n\n${prompts || \"No prompts detected.\"}\n\n## Local HTTPS Testing\n\nRun \\`sidecar dev --tunnel\\` from the project root to start the local MCP server on Streamable HTTP and print an HTTPS MCP URL that can be added to ChatGPT, Claude, or a Claude plugin install.\n`;\n}\n","/** Static Sidecar config extraction for build manifests. */\nimport path from \"node:path\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { createProject } from \"./project.js\";\nimport type { SidecarCompilerConfig } from \"./types.js\";\nimport { existsSyncSafe } from \"./utils.js\";\n\n/** Reads the serializable subset of `sidecar.config.ts` without executing app code. */\nexport function analyzeProjectConfig(rootDir: string): SidecarCompilerConfig {\n const configPath = path.join(rootDir, \"sidecar.config.ts\");\n if (!existsSyncSafe(configPath)) {\n return defaultCompilerConfig();\n }\n\n const project = createProject(rootDir);\n const sourceFile = project.addSourceFileAtPath(configPath);\n const call = resolveDefaultExportCall(sourceFile, \"defineConfig\");\n const definition = unwrapExpression(call?.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n return defaultCompilerConfig();\n }\n\n return {\n resources: {\n subscribe: readBooleanNested(definition, \"resources\", \"subscribe\") ?? false,\n listChanged: readBooleanNested(definition, \"resources\", \"listChanged\") ?? false,\n },\n prompts: {\n listChanged: readBooleanNested(definition, \"prompts\", \"listChanged\") ?? false,\n },\n tools: {\n listChanged: readBooleanNested(definition, \"tools\", \"listChanged\") ?? false,\n },\n pagination: {\n pageSize: readNumberNested(definition, \"pagination\", \"pageSize\") ?? 10,\n hasOverride: hasProperty(readObjectProperty(definition, \"pagination\"), \"override\"),\n },\n };\n}\n\n/** Returns compiler defaults when config is absent. */\nexport function defaultCompilerConfig(): SidecarCompilerConfig {\n return {\n resources: {\n subscribe: false,\n listChanged: false,\n },\n prompts: {\n listChanged: false,\n },\n tools: {\n listChanged: false,\n },\n pagination: {\n pageSize: 10,\n hasOverride: false,\n },\n };\n}\n\n/** Reads a boolean nested object property. */\nfunction readBooleanNested(\n definition: ObjectLiteralExpression,\n section: string,\n propertyName: string,\n): boolean | undefined {\n const object = readObjectProperty(definition, section);\n if (!object) {\n return undefined;\n }\n const property = object.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n if (initializer.getKind() === SyntaxKind.TrueKeyword) return true;\n if (initializer.getKind() === SyntaxKind.FalseKeyword) return false;\n return undefined;\n}\n\n/** Reads a number nested object property. */\nfunction readNumberNested(\n definition: ObjectLiteralExpression,\n section: string,\n propertyName: string,\n): number | undefined {\n const object = readObjectProperty(definition, section);\n if (!object) {\n return undefined;\n }\n const property = object.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isNumericLiteral(initializer)\n ? Number(initializer.getLiteralText())\n : undefined;\n}\n\n/** Reads a nested object literal property. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Returns true when an object literal has the named property. */\nfunction hasProperty(\n definition: ObjectLiteralExpression | undefined,\n propertyName: string,\n): boolean {\n return Boolean(definition?.getProperty(propertyName));\n}\n","/** Static diagnostics for Sidecar projects. */\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { JsonSchema } from \"@sidecar-ai/core\";\nimport type {\n SidecarCompilerConfig,\n SidecarPromptManifestEntry,\n SidecarResourceManifestEntry,\n SidecarToolManifestEntry,\n} from \"./types.js\";\n\n/** Diagnostic severity surfaced by the CLI and future editor integrations. */\nexport type DiagnosticSeverity = \"warning\" | \"error\";\n\n/** Stable diagnostic emitted for a concrete project source location. */\nexport type SidecarDiagnostic = {\n severity: DiagnosticSeverity;\n code: string;\n message: string;\n filePath: string;\n line: number;\n column: number;\n hint?: string;\n};\n\n/** Collects project-level warnings that do not block compilation by default. */\nexport async function collectProjectDiagnostics(\n rootDir: string,\n input: SidecarToolManifestEntry[] | {\n tools: SidecarToolManifestEntry[];\n resources?: SidecarResourceManifestEntry[];\n prompts?: SidecarPromptManifestEntry[];\n config?: SidecarCompilerConfig;\n },\n): Promise<SidecarDiagnostic[]> {\n const diagnostics: SidecarDiagnostic[] = [];\n const tools = Array.isArray(input) ? input : input.tools;\n const resources = Array.isArray(input) ? [] : input.resources ?? [];\n const prompts = Array.isArray(input) ? [] : input.prompts ?? [];\n const config = Array.isArray(input) ? undefined : input.config;\n const hasAuthConfig = existsSync(path.join(rootDir, \"auth.ts\"));\n const hasOpenAiAppsSdkUi = canResolveOpenAiAppsSdkUi(rootDir);\n\n for (const entry of tools) {\n const toolPath = path.join(rootDir, entry.sourceFile);\n const toolSource = await readFile(toolPath, \"utf8\");\n diagnostics.push(...diagnoseToolSource(rootDir, entry, toolSource, hasAuthConfig));\n\n if (entry.widget) {\n const widgetPath = path.join(rootDir, entry.widget.sourceFile);\n const widgetSource = await readFile(widgetPath, \"utf8\");\n diagnostics.push(...diagnoseWidgetSource(rootDir, entry, widgetSource, hasOpenAiAppsSdkUi));\n }\n }\n\n for (const entry of resources) {\n const resourcePath = path.join(rootDir, entry.sourceFile);\n const resourceSource = await readFile(resourcePath, \"utf8\");\n diagnostics.push(...diagnoseResourceSource(entry, resourceSource));\n }\n\n for (const entry of prompts) {\n const promptPath = path.join(rootDir, entry.sourceFile);\n const promptSource = await readFile(promptPath, \"utf8\");\n diagnostics.push(...diagnosePromptSource(entry, promptSource));\n }\n\n if (config) {\n diagnostics.push(...diagnoseCapabilities(config, resources));\n }\n\n return diagnostics;\n}\n\n/** Formats diagnostics in a TypeScript-style shape understood by many editors. */\nexport function formatDiagnostic(diagnostic: SidecarDiagnostic): string {\n const location = `${diagnostic.filePath}:${diagnostic.line}:${diagnostic.column}`;\n const hint = diagnostic.hint ? `\\n hint: ${diagnostic.hint}` : \"\";\n return `${location} - ${diagnostic.severity} ${diagnostic.code}: ${diagnostic.message}${hint}`;\n}\n\n/** Emits warnings for one reserved `tool.ts` file. */\nfunction diagnoseToolSource(\n rootDir: string,\n entry: SidecarToolManifestEntry,\n source: string,\n hasAuthConfig: boolean,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n const toolLocation = locate(source, \"tool({\");\n\n if (!entry.description.trim().startsWith(\"Use this when\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_METADATA_DESCRIPTION\",\n message: `Tool \"${entry.id}\" description should start with \"Use this when...\" for better model routing.`,\n filePath: entry.sourceFile,\n ...toolLocation,\n hint: \"Keep the first sentence specific and include explicit disallowed cases when useful.\",\n });\n }\n\n for (const key of [\"readOnlyHint\", \"destructiveHint\", \"openWorldHint\"] as const) {\n if (!(key in (entry.annotations ?? {}))) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_TOOL_ANNOTATION\",\n message: `Tool \"${entry.id}\" should explicitly declare annotations.${key}.`,\n filePath: entry.sourceFile,\n ...toolLocation,\n hint: \"Hosts use these hints to frame approval and safety UX; Sidecar applies conservative defaults only as a fallback.\",\n });\n }\n }\n\n if (/auth\\s*:/.test(source) && !hasAuthConfig && !isIgnored(source, \"SIDECAR_AUTH_MISSING_CONFIG\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_AUTH_MISSING_CONFIG\",\n message: `Tool \"${entry.id}\" declares auth but the project has no reserved auth.ts file.`,\n filePath: entry.sourceFile,\n ...locate(source, \"auth\"),\n hint: \"Add auth.ts at the project root or mark the tool auth policy as public.\",\n });\n }\n\n if (!returnsToolResult(source) && !isIgnored(source, \"SIDECAR_TOOL_RESULT_REQUIRED\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_TOOL_RESULT_REQUIRED\",\n message: `Tool \"${entry.id}\" should return toolResult(...) from execute.`,\n filePath: entry.sourceFile,\n ...locate(source, \"execute\"),\n hint: \"The runtime rejects plain objects so content, structuredContent, and meta always map cleanly to MCP result channels.\",\n });\n }\n\n if (/[\"']openai\\//.test(source) && !/@sidecar-ai\\/openai/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_MAGIC_META\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_MAGIC_META\",\n message: `Tool \"${entry.id}\" uses raw ChatGPT metadata strings.`,\n filePath: entry.sourceFile,\n ...locate(source, \"openai/\"),\n hint: \"Use @sidecar-ai/openai helpers or the typed hosts.chatgpt field so platform metadata stays typed.\",\n });\n }\n\n for (const parameterName of missingParameterDescriptions(entry.inputSchema)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_PARAM_DESCRIPTION\",\n message: `Parameter \"${parameterName}\" on tool \"${entry.id}\" is missing a JSDoc/schema description.`,\n filePath: entry.sourceFile,\n ...locate(source, parameterName),\n hint: \"Add a JSDoc comment to the TypeScript field or provide a schema description.\",\n });\n }\n\n if (looksLikeKnowledgeTool(entry) && !hasCompanyKnowledgeShape(entry.inputSchema) && !isIgnored(source, \"SIDECAR_COMPANY_KNOWLEDGE_SHAPE\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_COMPANY_KNOWLEDGE_SHAPE\",\n message: `Tool \"${entry.id}\" looks like a search/fetch knowledge tool but does not use the expected simple input shape.`,\n filePath: entry.sourceFile,\n ...toolLocation,\n hint: \"Use a string query for search tools or a string id/url for fetch tools, or add // sidecar-ignore SIDECAR_COMPANY_KNOWLEDGE_SHAPE.\",\n });\n }\n\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits warnings for one sibling `widget.tsx` file. */\nfunction diagnoseWidgetSource(\n _rootDir: string,\n entry: SidecarToolManifestEntry,\n source: string,\n hasOpenAiAppsSdkUi: boolean,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n const widgetFile = entry.widget?.sourceFile;\n if (!widgetFile) {\n return diagnostics;\n }\n\n if (/window\\s*\\.\\s*openai|\\(\\s*window\\s+as\\s+[^)]*\\)\\s*\\.\\s*openai/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_RAW_BRIDGE\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_RAW_BRIDGE\",\n message: `Widget for \"${entry.id}\" reads window.openai directly.`,\n filePath: widgetFile,\n ...locate(source, \"openai\"),\n hint: \"Use @sidecar-ai/openai runtime helpers in ChatGPT-only widgets, or @sidecar-ai/native/@sidecar-ai/client for portable behavior.\",\n });\n }\n\n if (entry.widget?.variant !== \"openai\" && /@sidecar-ai\\/openai/.test(source) && !/@sidecar-ai\\/native/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_FALLBACK\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_FALLBACK\",\n message: `Widget for \"${entry.id}\" imports @sidecar-ai/openai without a portable fallback.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/openai\"),\n hint: \"Prefer @sidecar-ai/native for user-facing behavior and reserve @sidecar-ai/openai for typed metadata or explicit ChatGPT-only code paths.\",\n });\n }\n\n if (entry.widget?.variant !== \"openai\" && /@sidecar-ai\\/openai\\/components/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_COMPONENT_CROSS_HOST\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_COMPONENT_CROSS_HOST\",\n message: `Widget for \"${entry.id}\" imports ChatGPT-only components.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/openai/components\"),\n hint: \"Use @sidecar-ai/native for portable primitives. Keep @sidecar-ai/openai/components for widgets intentionally targeted to ChatGPT.\",\n });\n }\n\n if (/@sidecar-ai\\/openai\\/components/.test(source) && !hasOpenAiAppsSdkUi && !isIgnored(source, \"SIDECAR_OPENAI_UI_SDK_MISSING\")) {\n diagnostics.push({\n severity: \"error\",\n code: \"SIDECAR_OPENAI_UI_SDK_MISSING\",\n message: `Widget for \"${entry.id}\" imports @sidecar-ai/openai/components but @openai/apps-sdk-ui is not installed.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/openai/components\"),\n hint: \"Install it with: npm install @openai/apps-sdk-ui\",\n });\n }\n\n if (entry.widget?.variant !== \"anthropic\" && /@sidecar-ai\\/anthropic\\/components/.test(source) && !isIgnored(source, \"SIDECAR_ANTHROPIC_COMPONENT_CROSS_HOST\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_ANTHROPIC_COMPONENT_CROSS_HOST\",\n message: `Widget for \"${entry.id}\" imports Claude-only components.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/anthropic/components\"),\n hint: \"Use @sidecar-ai/native for portable primitives. Keep @sidecar-ai/anthropic/components for widgets intentionally targeted to Claude.\",\n });\n }\n\n if (/\\bPopover\\b/.test(source) && /@sidecar-ai\\/native/.test(source) && !isIgnored(source, \"SIDECAR_NATIVE_NON_PORTABLE_COMPONENT\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_NATIVE_NON_PORTABLE_COMPONENT\",\n message: `Widget for \"${entry.id}\" appears to expect a native Popover.`,\n filePath: widgetFile,\n ...locate(source, \"Popover\"),\n hint: \"Popover is host-specific because Claude inline apps discourage clipped overlay UI. Use @sidecar-ai/openai/components for ChatGPT-only popovers.\",\n });\n }\n\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits warnings for one reserved `resource.ts` file. */\nfunction diagnoseResourceSource(\n entry: SidecarResourceManifestEntry,\n source: string,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n if (!returnsResourceResult(source) && !isIgnored(source, \"SIDECAR_RESOURCE_RESULT_REQUIRED\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_RESOURCE_RESULT_REQUIRED\",\n message: `Resource \"${entry.uri}\" should return resourceResult(...) from read.`,\n filePath: entry.sourceFile,\n ...locate(source, \"read\"),\n hint: \"The runtime rejects plain objects so text/blob content maps cleanly to MCP resource contents.\",\n });\n }\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits warnings for one reserved `prompt.ts` file. */\nfunction diagnosePromptSource(\n entry: SidecarPromptManifestEntry,\n source: string,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n if (!source.includes(\"run\") && !isIgnored(source, \"SIDECAR_PROMPT_RUN_REQUIRED\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_PROMPT_RUN_REQUIRED\",\n message: `Prompt \"${entry.name}\" should include a run method.`,\n filePath: entry.sourceFile,\n ...locate(source, \"prompt({\"),\n hint: \"Prompt run methods return a string for the common case or MCP prompt messages for advanced cases.\",\n });\n }\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits build-time errors when config claims unsupported capability wiring. */\nfunction diagnoseCapabilities(\n config: SidecarCompilerConfig,\n resources: SidecarResourceManifestEntry[],\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n if (!config.resources.subscribe && resources.some((entry) => entry.subscribe)) {\n const entry = resources.find((resource) => resource.subscribe);\n if (entry) {\n diagnostics.push({\n severity: \"error\",\n code: \"SIDECAR_RESOURCE_SUBSCRIBE_DISABLED\",\n message: `Resource \"${entry.uri}\" sets subscribe: true but sidecar.config.ts does not enable resources.subscribe.`,\n filePath: entry.sourceFile,\n line: 1,\n column: 1,\n hint: \"Add resources: { subscribe: true } to sidecar.config.ts or remove subscribe: true from this resource.\",\n });\n }\n }\n return diagnostics;\n}\n\n/** Returns true when the source visibly returns the standardized result helper. */\nfunction returnsToolResult(source: string): boolean {\n return /\\breturn\\s+toolResult(?:\\.\\w+)?\\s*\\(/.test(source);\n}\n\n/** Returns true when the source visibly returns the standardized resource helper. */\nfunction returnsResourceResult(source: string): boolean {\n return /\\breturn\\s+resourceResult(?:\\.\\w+)?\\s*\\(/.test(source);\n}\n\n/** Finds required parameters without model-facing descriptions. */\nfunction missingParameterDescriptions(schema: JsonSchema): string[] {\n const properties = schema.properties ?? {};\n return Object.entries(properties)\n .filter(([, value]) => !value.description?.trim())\n .map(([key]) => key);\n}\n\n/** Returns true for tools named like knowledge search/fetch operations. */\nfunction looksLikeKnowledgeTool(entry: SidecarToolManifestEntry): boolean {\n const text = `${entry.id} ${entry.name}`.toLowerCase();\n return /\\b(search|fetch)\\b/.test(text) || /(^|[._-])(search|fetch)([._-]|$)/.test(text);\n}\n\n/** Checks the minimum predictable shape Sidecar expects for knowledge tools. */\nfunction hasCompanyKnowledgeShape(schema: JsonSchema): boolean {\n const properties = schema.properties ?? {};\n const query = properties.query;\n const url = properties.url;\n const id = properties.id;\n return query?.type === \"string\" || url?.type === \"string\" || id?.type === \"string\";\n}\n\n/** Returns true when the official OpenAI Apps UI SDK is resolvable from the app root. */\nfunction canResolveOpenAiAppsSdkUi(rootDir: string): boolean {\n try {\n createRequire(path.join(rootDir, \"package.json\")).resolve(\"@openai/apps-sdk-ui/css\");\n return true;\n } catch {\n return false;\n }\n}\n\n/** Locates text within a source file using 1-based editor coordinates. */\nfunction locate(source: string, needle: string): { line: number; column: number } {\n const index = Math.max(0, source.indexOf(needle));\n const prefix = source.slice(0, index);\n const lines = prefix.split(\"\\n\");\n return {\n line: lines.length,\n column: (lines.at(-1)?.length ?? 0) + 1,\n };\n}\n\n/** Allows authors to silence a warning with a visible source comment. */\nfunction isIgnored(source: string, code: string): boolean {\n return source.includes(`sidecar-ignore ${code}`) || source.includes(`sidecar-ignore all`);\n}\n","/** Generated widget client writer. */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SidecarToolManifestEntry } from \"./types.js\";\nimport { toIdentifier, toImportSpecifier } from \"./utils.js\";\n\n/** Writes `.sidecar/generated/tools.ts` for typed widget-initiated calls. */\nexport async function writeGeneratedTypes(\n rootDir: string,\n tools: SidecarToolManifestEntry[],\n): Promise<void> {\n const generatedDir = path.join(rootDir, \".sidecar\", \"generated\");\n await mkdir(generatedDir, { recursive: true });\n const appCallableTools = tools.filter(isAppCallable);\n const methodNames = uniqueMethodNames(appCallableTools.map((entry) => toIdentifier(entry.id)));\n\n const imports = appCallableTools\n .map(\n (entry, index) =>\n `import type tool${index} from ${JSON.stringify(toImportSpecifier(generatedDir, path.join(rootDir, entry.sourceFile), { extension: \"js\" }))};`,\n )\n .join(\"\\n\");\n const ids = appCallableTools\n .map((entry, index) => ` ${methodNames[index]}: ${JSON.stringify(entry.id)}`)\n .join(\",\\n\");\n const toolTypes = appCallableTools\n .map(\n (entry, index) =>\n ` ${methodNames[index]}(params: ToolParams<typeof tool${index}>): Promise<ToolOutput<typeof tool${index}>>;`,\n )\n .join(\"\\n\");\n\n await writeFile(\n path.join(generatedDir, \"tools.ts\"),\n `/**\n * Generated Sidecar widget tool client.\n *\n * Do not edit this file directly; it is regenerated by sidecar build and\n * sidecar dev.\n */\n${imports}\nimport { createToolClient } from \"@sidecar-ai/client\";\nimport type { ToolResult } from \"@sidecar-ai/core\";\n\ntype ExecuteOf<T> = T extends { execute: infer Execute } ? Execute : never;\ntype ToolParams<T> = ExecuteOf<T> extends (params: infer Params, ...args: any[]) => unknown ? Params : never;\ntype RawToolOutput<T> = Awaited<ReturnType<Extract<ExecuteOf<T>, (...args: any[]) => unknown>>>;\ntype ToolOutput<T> = RawToolOutput<T> extends ToolResult<infer Structured, any> ? Structured : never;\n\n/** Machine names keyed by widget-friendly method names. */\nexport const toolIds = {\n${ids}\n} as const;\n\n/** Typed callable tools available to widgets. */\nexport type WidgetTools = {\n${toolTypes}\n};\n\n/** Default widget tool client backed by the host bridge. */\nexport const tools = createToolClient<WidgetTools>(toolIds);\n`,\n );\n}\n\n/** Returns true when MCP Apps metadata allows widgets to call the tool. */\nfunction isAppCallable(entry: SidecarToolManifestEntry): boolean {\n const ui = entry.descriptor._meta?.ui;\n if (!ui || typeof ui !== \"object\" || Array.isArray(ui)) {\n return true;\n }\n\n const visibility = (ui as { visibility?: unknown }).visibility;\n return !Array.isArray(visibility) || visibility.includes(\"app\");\n}\n\n/** Ensures generated widget method names cannot silently collide. */\nfunction uniqueMethodNames(names: string[]): string[] {\n const seen = new Map<string, number>();\n return names.map((name) => {\n const count = seen.get(name) ?? 0;\n seen.set(name, count + 1);\n return count === 0 ? name : `${name}${count + 1}`;\n });\n}\n","/** Plugin package generation for Claude desktop hosts. */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { loadProjectIdentity } from \"./identity.js\";\nimport { emitClaudeAgents } from \"./plugin-components/agents.js\";\nimport { copyCommands } from \"./plugin-components/commands.js\";\nimport { copyHooks } from \"./plugin-components/hooks.js\";\nimport { copyClaudePassthroughDirectories } from \"./plugin-components/passthrough.js\";\nimport { copySkills } from \"./plugin-components/skills.js\";\nimport type { ProjectIdentity, SidecarManifest } from \"./types.js\";\nimport { stripUndefined } from \"./utils.js\";\n\n/** Emits all plugin package targets for the current MCP manifest. */\nexport async function buildPluginPackages(\n rootDir: string,\n outRoot: string,\n manifest: SidecarManifest,\n): Promise<void> {\n const identity = await loadProjectIdentity(rootDir);\n await buildClaudePlugin(rootDir, outRoot, identity, manifest);\n}\n\n/** Emits a Claude/Cowork plugin package that references the hosted MCP server. */\nasync function buildClaudePlugin(\n rootDir: string,\n outRoot: string,\n identity: ProjectIdentity,\n manifest: SidecarManifest,\n): Promise<void> {\n const pluginDir = path.join(outRoot, \"claude-plugin\");\n await mkdir(path.join(pluginDir, \".claude-plugin\"), { recursive: true });\n await copySkills(rootDir, path.join(pluginDir, \"skills\"));\n await copyCommands(rootDir, path.join(pluginDir, \"commands\"));\n await copyHooks(rootDir, path.join(pluginDir, \"hooks\"));\n await emitClaudeAgents(rootDir, path.join(pluginDir, \"agents\"));\n await copyClaudePassthroughDirectories(rootDir, pluginDir);\n\n await writeJson(path.join(pluginDir, \".claude-plugin\", \"plugin.json\"), {\n name: identity.slug,\n version: identity.version,\n description: identity.description,\n displayName: identity.name,\n installationPreference: \"available\",\n });\n\n await writeJson(path.join(pluginDir, \"version.json\"), {\n version: identity.version,\n generatedBy: \"sidecar\",\n });\n\n await writeJson(path.join(pluginDir, \".mcp.json\"), {\n mcpServers: {\n [identity.slug]: {\n type: \"http\",\n url: \"${SIDECAR_MCP_URL}\",\n },\n },\n });\n\n await writeJson(path.join(pluginDir, \"settings.json\"), {\n sidecar: {\n tools: manifest.tools.map((entry) => entry.id),\n resources: manifest.resources.map((entry) => entry.uri),\n prompts: manifest.prompts.map((entry) => entry.name),\n },\n });\n\n await writeFile(\n path.join(pluginDir, \"README.md\"),\n `# ${identity.name} Claude Plugin\n\nThis package was generated by Sidecar.\n\nSet \\`SIDECAR_MCP_URL\\` to the hosted MCP endpoint for this app.\n\nFor local testing, run \\`sidecar dev --tunnel\\` and use the printed HTTPS MCP URL.\n\nClaude/Cowork plugin-specific components such as skills, slash commands, agents, hooks, output styles, themes, monitors, assets, and bin scripts will be emitted here when the source project defines them.\n`,\n );\n}\n\n/** Writes formatted JSON while dropping undefined fields. */\nasync function writeJson(\n filePath: string,\n value: Record<string, unknown>,\n): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(\n filePath,\n `${JSON.stringify(stripUndefined(value), null, 2)}\\n`,\n );\n}\n","/** Project identity loading for generated manifests and plugin packages. */\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { toMachineName } from \"@sidecar-ai/core\";\nimport type { ProjectIdentity } from \"./types.js\";\nimport { existsSyncSafe } from \"./utils.js\";\n\n/** Loads project name, slug, version, and description from config/package metadata. */\nexport async function loadProjectIdentity(\n rootDir: string,\n): Promise<ProjectIdentity> {\n const packageJson = await readOptionalJson(path.join(rootDir, \"package.json\"));\n const configText = await readOptionalText(\n path.join(rootDir, \"sidecar.config.ts\"),\n );\n const name =\n readConfigString(configText, \"name\") ??\n packageJson?.name ??\n path.basename(rootDir);\n const version =\n readConfigString(configText, \"version\") ??\n packageJson?.version ??\n \"0.0.0-dev\";\n const description =\n readConfigString(configText, \"description\") ??\n packageJson?.description ??\n `${name} Sidecar app.`;\n\n return {\n name,\n slug: toMachineName(name).replaceAll(\"_\", \"-\"),\n version,\n description,\n };\n}\n\n/** Reads JSON when the file exists. */\nasync function readOptionalJson(\n filePath: string,\n): Promise<Record<string, string> | undefined> {\n if (!existsSyncSafe(filePath)) {\n return undefined;\n }\n\n return JSON.parse(await readFile(filePath, \"utf8\")) as Record<string, string>;\n}\n\n/** Reads text when the file exists. */\nasync function readOptionalText(filePath: string): Promise<string | undefined> {\n if (!existsSyncSafe(filePath)) {\n return undefined;\n }\n\n return readFile(filePath, \"utf8\");\n}\n\n/** Extracts a simple string property from `sidecar.config.ts` without executing it. */\nfunction readConfigString(\n configText: string | undefined,\n key: string,\n): string | undefined {\n if (!configText) {\n return undefined;\n }\n\n const match = configText.match(\n new RegExp(`${key}\\\\s*:\\\\s*[\"'\\`]([^\"'\\`]+)[\"'\\`]`),\n );\n return match?.[1];\n}\n","/** Claude agent generation from typed Sidecar agent files. */\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n existsSyncSafe,\n readObjectString,\n readObjectStringArray,\n safeFileStem,\n stripUndefined,\n yamlScalar,\n} from \"../utils.js\";\n\n/** Emits `agents/*.md` from reserved agent directories. */\nexport async function emitClaudeAgents(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"agents\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n const entries = await readdir(source, { withFileTypes: true });\n const agentDirs = entries.filter(\n (entry) => entry.isDirectory() && existsSyncSafe(path.join(source, entry.name, \"agent.ts\")),\n );\n if (!agentDirs.length) {\n return;\n }\n\n await mkdir(destination, { recursive: true });\n for (const entry of agentDirs) {\n const sourceText = await readFile(path.join(source, entry.name, \"agent.ts\"), \"utf8\");\n const markdown = parseClaudeAgent(\n sourceText,\n entry.name,\n );\n const agentName =\n readObjectString(sourceText, \"name\") ??\n entry.name;\n await writeFile(path.join(destination, `${safeFileStem(agentName)}.md`), markdown);\n }\n}\n\n/** Parses the object-literal agent declaration into Claude markdown. */\nfunction parseClaudeAgent(source: string, fallbackName: string): string {\n const name = readObjectString(source, \"name\") ?? fallbackName;\n const description =\n readObjectString(source, \"description\") ?? `${name} agent.`;\n const prompt = readObjectString(source, \"prompt\") ?? \"\";\n const tools = readObjectStringArray(source, \"tools\");\n const disallowedTools = readObjectStringArray(source, \"disallowedTools\");\n const model = readObjectString(source, \"model\");\n const color = readObjectString(source, \"color\");\n\n const frontmatter = stripUndefined({\n name,\n description,\n model,\n color,\n tools: tools?.join(\", \"),\n \"disallowed-tools\": disallowedTools?.join(\", \"),\n });\n\n return `---\n${Object.entries(frontmatter)\n .map(([key, value]) => `${key}: ${yamlScalar(value)}`)\n .join(\"\\n\")}\n---\n\n${prompt.trim()}\n`;\n}\n","/** Claude slash-command generation from static markdown or typed command files. */\nimport { cp, lstat, mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n existsSyncSafe,\n readObjectString,\n readObjectStringArray,\n safeFileStem,\n stripUndefined,\n yamlScalar,\n} from \"../utils.js\";\n\n/** Copies markdown commands and emits `command.ts` declarations as markdown. */\nexport async function copyCommands(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"commands\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n await mkdir(destination, { recursive: true });\n const entries = await readdir(source, { withFileTypes: true });\n for (const entry of entries) {\n const sourcePath = path.join(source, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n if (await safeCommandCopyFilter(sourcePath)) {\n await cp(sourcePath, path.join(destination, safeFileStem(entry.name.replace(/\\.md$/, \"\")) + \".md\"));\n }\n continue;\n }\n\n if (!entry.isDirectory()) {\n continue;\n }\n\n const dynamicCommand = path.join(sourcePath, \"command.ts\");\n if (existsSyncSafe(dynamicCommand)) {\n const sourceText = await readFile(dynamicCommand, \"utf8\");\n const markdown = parseDynamicCommand(sourceText, entry.name);\n const commandName = readObjectString(sourceText, \"name\") ?? entry.name;\n await writeFile(path.join(destination, `${safeFileStem(commandName)}.md`), markdown);\n continue;\n }\n\n await cp(sourcePath, path.join(destination, entry.name), {\n recursive: true,\n filter: safeCommandCopyFilter,\n });\n }\n}\n\n/** Avoids copying symlinks and common secret files into generated commands. */\nasync function safeCommandCopyFilter(sourcePath: string): Promise<boolean> {\n const basename = path.basename(sourcePath);\n if (basename === \".env\" || basename.startsWith(\".env.\") || basename === \"node_modules\" || basename === \".git\") {\n return false;\n }\n const stat = await lstat(sourcePath);\n return !stat.isSymbolicLink();\n}\n\n/** Parses a typed command declaration into Claude slash-command markdown. */\nfunction parseDynamicCommand(source: string, fallbackName: string): string {\n const name = readObjectString(source, \"name\") ?? fallbackName;\n const description = readObjectString(source, \"description\");\n const prompt = readObjectString(source, \"prompt\") ?? \"\";\n const argumentHint = readObjectString(source, \"argumentHint\");\n const allowedTools = readObjectStringArray(source, \"allowedTools\");\n\n const frontmatter = stripUndefined({\n description,\n \"argument-hint\": argumentHint,\n \"allowed-tools\": allowedTools?.join(\", \"),\n });\n\n const header = Object.keys(frontmatter).length\n ? `---\n${Object.entries(frontmatter)\n .map(([key, value]) => `${key}: ${yamlScalar(value)}`)\n .join(\"\\n\")}\n---\n\n`\n : \"\";\n\n return `${header}${prompt.trim() || `# ${name}`}\\n`;\n}\n","/** Claude hook generation from typed reserved hook files. */\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n Project,\n SyntaxKind,\n type ArrayLiteralExpression,\n type CallExpression,\n type Expression,\n type ObjectLiteralExpression,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"../ast.js\";\nimport { existsSyncSafe, stripUndefined } from \"../utils.js\";\n\ntype HookHandler = Record<string, unknown> & {\n type: \"command\" | \"http\";\n};\n\ntype HookMatcher = {\n matcher?: string;\n hooks: HookHandler[];\n};\n\ntype HookConfig = Record<string, HookMatcher[]>;\n\n/** Emits one merged `hooks.json` from reserved hook directories. */\nexport async function copyHooks(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"hooks\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n const entries = await readdir(source, { withFileTypes: true });\n const hookDirs = entries.filter(\n (entry) => entry.isDirectory() && existsSyncSafe(path.join(source, entry.name, \"hook.ts\")),\n );\n if (!hookDirs.length) {\n return;\n }\n\n const config: HookConfig = {};\n for (const entry of hookDirs) {\n const filePath = path.join(source, entry.name, \"hook.ts\");\n mergeHooks(config, parseHookFile(await readFile(filePath, \"utf8\"), entry.name));\n }\n\n await mkdir(destination, { recursive: true });\n await writeFile(\n path.join(destination, \"hooks.json\"),\n `${JSON.stringify(config, null, 2)}\\n`,\n );\n}\n\n/** Parses a single reserved hook file into Claude hook JSON fragments. */\nfunction parseHookFile(source: string, fallbackName: string): HookConfig {\n const project = new Project({ useInMemoryFileSystem: true });\n const sourceFile = project.createSourceFile(`${fallbackName}.ts`, source);\n const call =\n resolveDefaultExportCall(sourceFile, \"hook\") ??\n resolveDefaultExportCall(sourceFile, \"hooks\");\n if (!call) {\n throw new Error(`hooks/${fallbackName}/hook.ts must default-export hook({ ... }) or hooks({ ... }).`);\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new Error(`hooks/${fallbackName}/hook.ts must default-export hook({ ... }) or hooks({ ... }).`);\n }\n\n const callee = call.getExpression().getText();\n if (callee === \"hook\" || callee.endsWith(\".hook\")) {\n const entry = parseHookDefinition(definition, fallbackName);\n return { [entry.event]: [stripUndefined({ matcher: entry.matcher, hooks: entry.run })] };\n }\n\n if (callee === \"hooks\" || callee.endsWith(\".hooks\")) {\n return parseHooksDefinition(definition, fallbackName);\n }\n\n throw new Error(`hooks/${fallbackName}/hook.ts must default-export hook({ ... }) or hooks({ ... }).`);\n}\n\n/** Parses `hook({ event, matcher, hooks })`. */\nfunction parseHookDefinition(\n definition: ObjectLiteralExpression,\n fallbackName: string,\n): { event: string; matcher?: string; run: HookHandler[] } {\n const event = readStringProperty(definition, \"event\");\n if (!event) {\n throw new Error(`hooks/${fallbackName}/hook.ts must declare an event string.`);\n }\n\n const hooks = readHookArray(definition, \"run\", fallbackName);\n if (!hooks.length) {\n throw new Error(`hooks/${fallbackName}/hook.ts must declare at least one run handler.`);\n }\n\n return {\n event,\n matcher: readStringProperty(definition, \"matcher\"),\n run: hooks,\n };\n}\n\n/** Parses `hooks({ EventName: [{ matcher, run: [...] }] })`. */\nfunction parseHooksDefinition(\n definition: ObjectLiteralExpression,\n fallbackName: string,\n): HookConfig {\n const config: HookConfig = {};\n\n for (const property of definition.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const event = property.getName().replace(/^[\"']|[\"']$/g, \"\");\n const initializer = property.getInitializer();\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n throw new Error(`hooks/${fallbackName}/hook.ts event \"${event}\" must be an array.`);\n }\n\n config[event] = initializer.getElements().map((entry) => {\n if (!Node.isObjectLiteralExpression(entry)) {\n throw new Error(`hooks/${fallbackName}/hook.ts event \"${event}\" entries must be objects.`);\n }\n\n return stripUndefined({\n matcher: readStringProperty(entry, \"matcher\"),\n hooks: readHookArray(entry, \"run\", fallbackName),\n });\n });\n }\n\n return config;\n}\n\n/** Reads a hook handler array from an object literal property. */\nfunction readHookArray(\n definition: ObjectLiteralExpression,\n propertyName: string,\n fallbackName: string,\n): HookHandler[] {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return [];\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n throw new Error(`hooks/${fallbackName}/hook.ts ${propertyName} must be an array.`);\n }\n\n return parseHookHandlers(initializer, fallbackName);\n}\n\n/** Parses hook handlers written as object literals or helper calls. */\nfunction parseHookHandlers(\n handlers: ArrayLiteralExpression,\n fallbackName: string,\n): HookHandler[] {\n return handlers.getElements().map((handler) => parseHookHandler(handler, fallbackName));\n}\n\n/** Parses one command/http hook handler. */\nfunction parseHookHandler(\n handler: Expression,\n fallbackName: string,\n): HookHandler {\n if (Node.isObjectLiteralExpression(handler)) {\n const type = readStringProperty(handler, \"type\");\n if (type !== \"command\" && type !== \"http\") {\n throw new Error(`hooks/${fallbackName}/hook.ts hook handlers need type \"command\" or \"http\".`);\n }\n return objectLiteralToRecord(handler) as HookHandler;\n }\n\n if (Node.isCallExpression(handler)) {\n return parseHookHandlerCall(handler, fallbackName);\n }\n\n throw new Error(`hooks/${fallbackName}/hook.ts hook handlers must be objects or helper calls.`);\n}\n\n/** Parses `commandHook(...)` and `httpHook(...)` helper calls. */\nfunction parseHookHandlerCall(\n handler: CallExpression,\n fallbackName: string,\n): HookHandler {\n const callee = handler.getExpression().getText();\n const [firstArg, optionsArg] = handler.getArguments();\n const first = firstArg ? stringFromExpression(firstArg) : undefined;\n if (!first) {\n throw new Error(`hooks/${fallbackName}/hook.ts hook helper calls require a string first argument.`);\n }\n\n const options =\n optionsArg && Node.isObjectLiteralExpression(optionsArg)\n ? objectLiteralToRecord(optionsArg)\n : {};\n\n if (callee.endsWith(\"commandHook\")) {\n return stripUndefined({\n type: \"command\",\n command: first,\n ...options,\n }) as HookHandler;\n }\n\n if (callee.endsWith(\"httpHook\")) {\n return stripUndefined({\n type: \"http\",\n url: first,\n ...options,\n }) as HookHandler;\n }\n\n throw new Error(`hooks/${fallbackName}/hook.ts uses an unsupported hook helper \"${callee}\".`);\n}\n\n/** Converts a simple object literal into JSON-compatible data. */\nfunction objectLiteralToRecord(object: ObjectLiteralExpression): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n\n for (const property of object.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const key = property.getName().replace(/^[\"']|[\"']$/g, \"\");\n const initializer = property.getInitializer();\n if (!initializer) {\n continue;\n }\n record[key] = valueFromExpression(initializer);\n }\n\n return stripUndefined(record);\n}\n\n/** Reads a simple string property from an object literal. */\nfunction readStringProperty(\n object: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = object.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = property.getInitializer();\n return initializer ? stringFromExpression(initializer) : undefined;\n}\n\n/** Converts supported literal expressions into JSON-compatible values. */\nfunction valueFromExpression(expression: Expression): unknown {\n const string = stringFromExpression(expression);\n if (string !== undefined) {\n return string;\n }\n\n if (expression.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n if (expression.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n if (Node.isNumericLiteral(expression)) {\n return Number(expression.getLiteralText());\n }\n if (Node.isArrayLiteralExpression(expression)) {\n return expression.getElements().map(valueFromExpression);\n }\n if (Node.isObjectLiteralExpression(expression)) {\n return objectLiteralToRecord(expression);\n }\n\n return undefined;\n}\n\n/** Reads string literals and no-substitution template literals. */\nfunction stringFromExpression(expression: Node): string | undefined {\n if (Node.isStringLiteral(expression) || Node.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.getLiteralText();\n }\n return undefined;\n}\n\n/** Merges parsed hook config fragments preserving event order. */\nfunction mergeHooks(target: HookConfig, source: HookConfig): void {\n for (const [event, matchers] of Object.entries(source)) {\n target[event] = [...(target[event] ?? []), ...matchers];\n }\n}\n","/** Claude plugin directory passthrough helpers. */\nimport { cp, lstat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { existsSyncSafe } from \"../utils.js\";\n\n/** Copies Claude-specific directories that Sidecar does not transform yet. */\nexport async function copyClaudePassthroughDirectories(\n rootDir: string,\n pluginDir: string,\n): Promise<void> {\n for (const directory of [\n \"assets\",\n \"bin\",\n \"monitors\",\n \"output-styles\",\n \"themes\",\n ]) {\n const source = path.join(rootDir, directory);\n if (!existsSyncSafe(source)) {\n continue;\n }\n\n await cp(source, path.join(pluginDir, directory), {\n recursive: true,\n filter: safePluginCopyFilter,\n });\n }\n}\n\n/** Avoids accidentally packaging symlinks, env files, or package managers' metadata. */\nasync function safePluginCopyFilter(sourcePath: string): Promise<boolean> {\n const basename = path.basename(sourcePath);\n if (\n basename === \"node_modules\" ||\n basename === \".git\" ||\n basename === \".env\" ||\n basename.startsWith(\".env.\")\n ) {\n return false;\n }\n\n const stat = await lstat(sourcePath);\n return !stat.isSymbolicLink();\n}\n","/** Skill copying and typed skill generation for plugin outputs. */\nimport { existsSync } from \"node:fs\";\nimport { cp, lstat, mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { existsSyncSafe, readObjectString, yamlScalar } from \"../utils.js\";\n\n/** Copies static skills or emits `skill.ts` declarations as `SKILL.md`. */\nexport async function copySkills(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"skills\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n await mkdir(destination, { recursive: true });\n const entries = await readdir(source, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const sourceDir = path.join(source, entry.name);\n const destinationDir = path.join(destination, entry.name);\n const staticSkill = path.join(sourceDir, \"SKILL.md\");\n const dynamicSkill = path.join(sourceDir, \"skill.ts\");\n\n await mkdir(destinationDir, { recursive: true });\n if (existsSync(staticSkill)) {\n await cp(sourceDir, destinationDir, {\n recursive: true,\n filter: async (sourcePath) =>\n !sourcePath.endsWith(`${path.sep}skill.ts`) &&\n await safeSkillCopyFilter(sourcePath),\n });\n } else if (existsSync(dynamicSkill)) {\n const generated = parseDynamicSkill(\n await readFile(dynamicSkill, \"utf8\"),\n entry.name,\n );\n await writeFile(path.join(destinationDir, \"SKILL.md\"), generated);\n }\n }\n}\n\n/** Avoids copying symlinks and common secret files into generated plugins. */\nasync function safeSkillCopyFilter(sourcePath: string): Promise<boolean> {\n const basename = path.basename(sourcePath);\n if (basename === \".env\" || basename.startsWith(\".env.\") || basename === \"node_modules\" || basename === \".git\") {\n return false;\n }\n const stat = await lstat(sourcePath);\n return !stat.isSymbolicLink();\n}\n\n/** Parses a typed skill declaration into a `SKILL.md` document. */\nfunction parseDynamicSkill(source: string, fallbackName: string): string {\n const name = readObjectString(source, \"name\") ?? fallbackName;\n const description =\n readObjectString(source, \"description\") ?? `${name} skill.`;\n const body = readObjectString(source, \"body\") ?? \"\";\n\nreturn `---\nname: ${yamlScalar(name)}\ndescription: ${yamlScalar(description)}\n---\n\n${body.trim()}\n`;\n}\n","/** Static analysis for reserved MCP prompt files. */\nimport {\n createPromptDescriptor,\n type McpIcon,\n type PromptArgInput,\n type PromptArgsDefinition,\n} from \"@sidecar-ai/core\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport { createProject } from \"./project.js\";\nimport type { SidecarPromptManifestEntry } from \"./types.js\";\nimport { existsSyncSafe, safePathSegment } from \"./utils.js\";\n\n/** Finds all Sidecar prompt files under `prompts/`. */\nexport async function analyzeProjectPrompts(rootDir: string): Promise<SidecarPromptManifestEntry[]> {\n const promptFiles = await findPromptFiles(path.join(rootDir, \"prompts\"));\n if (promptFiles.length === 0) {\n return [];\n }\n\n const project = createProject(rootDir);\n return promptFiles.map((filePath) =>\n analyzePromptFile(project.addSourceFileAtPath(filePath), rootDir),\n );\n}\n\n/** Analyzes one `prompt.ts` source file into a compiler manifest entry. */\nexport function analyzePromptFile(\n sourceFile: SourceFile,\n rootDir: string,\n): SidecarPromptManifestEntry {\n const definition = findPromptDefinition(sourceFile);\n const absoluteFile = sourceFile.getFilePath();\n const directory = path.basename(path.dirname(absoluteFile));\n const name = getOptionalStringProperty(definition, \"name\") ?? safePathSegment(directory);\n const title = getRequiredStringProperty(definition, \"title\", sourceFile);\n const description = getOptionalStringProperty(definition, \"description\");\n const args = readArgs(definition);\n const descriptor = createPromptDescriptor({\n name,\n title,\n description,\n args,\n icons: readIcons(definition),\n });\n\n if (!getMethodOrFunctionProperty(definition, \"run\")) {\n throw new CompilerError(sourceFile, \"prompt({ ... }) must include a run method.\");\n }\n\n return {\n sourceFile: path.relative(rootDir, absoluteFile),\n directory,\n name,\n title,\n description,\n args,\n descriptor,\n };\n}\n\n/** Finds immediate `prompts/<name>/prompt.ts` files in deterministic order. */\nasync function findPromptFiles(promptsDir: string): Promise<string[]> {\n if (!existsSyncSafe(promptsDir)) {\n return [];\n }\n\n const entries = await readdir(promptsDir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const filePath = path.join(promptsDir, entry.name, \"prompt.ts\");\n if (existsSyncSafe(filePath)) {\n files.push(filePath);\n }\n }\n return files.sort((left, right) => left.localeCompare(right));\n}\n\n/** Locates the default-exported `prompt({ ... })` object literal. */\nfunction findPromptDefinition(sourceFile: SourceFile): ObjectLiteralExpression {\n const call = resolveDefaultExportCall(sourceFile, \"prompt\");\n if (!call) {\n throw new CompilerError(\n sourceFile,\n \"prompt.ts must default-export prompt({ ... }) or an identifier initialized with prompt({ ... }).\",\n );\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(sourceFile, \"prompt(...) must receive one object literal.\");\n }\n return definition;\n}\n\n/** Reads a required string property from the prompt object. */\nfunction getRequiredStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n sourceFile: SourceFile,\n): string {\n const value = getOptionalStringProperty(definition, propertyName);\n if (value === undefined || !value.trim()) {\n throw new CompilerError(\n sourceFile,\n `prompt({ ... }) must include a non-empty ${propertyName} string.`,\n );\n }\n return value;\n}\n\n/** Reads an optional string literal property. */\nfunction getOptionalStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads `args` into prompt argument descriptors. */\nfunction readArgs(definition: ObjectLiteralExpression): PromptArgsDefinition | undefined {\n const initializer = readObjectProperty(definition, \"args\");\n if (!initializer) {\n return undefined;\n }\n\n const args: PromptArgsDefinition = {};\n for (const property of initializer.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n const value = readArgInput(property.getInitializer());\n if (value !== undefined) {\n args[property.getName().replace(/^[\"']|[\"']$/g, \"\")] = value;\n }\n }\n return Object.keys(args).length ? args : undefined;\n}\n\n/** Reads one supported prompt arg declaration. */\nfunction readArgInput(node: Node | undefined): PromptArgInput | undefined {\n const initializer = unwrapExpression(node);\n if (!initializer) {\n return undefined;\n }\n if (Node.isStringLiteral(initializer)) {\n return initializer.getLiteralText();\n }\n if (Node.isArrayLiteralExpression(initializer)) {\n return initializer\n .getElements()\n .filter(Node.isLiteralExpression)\n .map((element) => element.getLiteralText());\n }\n if (Node.isObjectLiteralExpression(initializer)) {\n return {\n description: getOptionalStringProperty(initializer, \"description\"),\n required: readBooleanProperty(initializer, \"required\"),\n };\n }\n return undefined;\n}\n\n/** Reads an optional boolean literal property. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n if (initializer.getKind() === SyntaxKind.TrueKeyword) return true;\n if (initializer.getKind() === SyntaxKind.FalseKeyword) return false;\n return undefined;\n}\n\n/** Reads a supported method/function property without executing code. */\nfunction getMethodOrFunctionProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): Node | undefined {\n const property = definition.getProperty(propertyName);\n if (Node.isMethodDeclaration(property)) {\n return property;\n }\n if (property && Node.isPropertyAssignment(property)) {\n const initializer = property.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return initializer;\n }\n }\n return undefined;\n}\n\n/** Reads MCP icon metadata from a simple object array. */\nfunction readIcons(definition: ObjectLiteralExpression): McpIcon[] | undefined {\n const property = definition.getProperty(\"icons\");\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n const icons = initializer.getElements().flatMap((element) => {\n const object = unwrapExpression(element);\n if (!object || !Node.isObjectLiteralExpression(object)) {\n return [];\n }\n const src = getOptionalStringProperty(object, \"src\");\n if (!src) {\n return [];\n }\n return [{\n src,\n mimeType: getOptionalStringProperty(object, \"mimeType\"),\n sizes: readStringArrayProperty(object, \"sizes\"),\n }];\n });\n return icons.length ? icons : undefined;\n}\n\n/** Reads a nested object literal property. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal array property. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n","/** Static analysis for reserved MCP resource files. */\nimport {\n createResourceDescriptor,\n type McpIcon,\n type McpResourceDescriptor,\n type ResourceAnnotations,\n} from \"@sidecar-ai/core\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport { createProject } from \"./project.js\";\nimport type { SidecarResourceManifestEntry } from \"./types.js\";\nimport { existsSyncSafe, safePathSegment } from \"./utils.js\";\n\n/** Finds all Sidecar resource files under `resources/`. */\nexport async function analyzeProjectResources(rootDir: string): Promise<SidecarResourceManifestEntry[]> {\n const resourceFiles = await findResourceFiles(path.join(rootDir, \"resources\"));\n if (resourceFiles.length === 0) {\n return [];\n }\n\n const project = createProject(rootDir);\n return resourceFiles.map((filePath) =>\n analyzeResourceFile(project.addSourceFileAtPath(filePath), rootDir),\n );\n}\n\n/** Analyzes one `resource.ts` source file into a compiler manifest entry. */\nexport function analyzeResourceFile(\n sourceFile: SourceFile,\n rootDir: string,\n): SidecarResourceManifestEntry {\n const definition = findResourceDefinition(sourceFile);\n const absoluteFile = sourceFile.getFilePath();\n const directory = path.basename(path.dirname(absoluteFile));\n const defaultUri = `sidecar://resources/${safePathSegment(directory)}`;\n const name = getRequiredStringProperty(definition, \"name\", sourceFile);\n const uri = getOptionalStringProperty(definition, \"uri\") ?? defaultUri;\n const descriptor = createResourceDescriptor({\n uri,\n name,\n title: getOptionalStringProperty(definition, \"title\"),\n description: getOptionalStringProperty(definition, \"description\"),\n mimeType: getOptionalStringProperty(definition, \"mimeType\"),\n size: getOptionalNumberProperty(definition, \"size\"),\n icons: readIcons(definition),\n annotations: readAnnotations(definition),\n });\n\n if (!getMethodOrFunctionProperty(definition, \"read\")) {\n throw new CompilerError(sourceFile, \"resource({ ... }) must include a read method.\");\n }\n\n return {\n sourceFile: path.relative(rootDir, absoluteFile),\n directory,\n uri,\n name,\n title: descriptor.title,\n description: descriptor.description,\n mimeType: descriptor.mimeType,\n size: descriptor.size,\n annotations: descriptor.annotations,\n subscribe: readBooleanProperty(definition, \"subscribe\"),\n descriptor,\n };\n}\n\n/** Finds immediate `resources/<name>/resource.ts` files in deterministic order. */\nasync function findResourceFiles(resourcesDir: string): Promise<string[]> {\n if (!existsSyncSafe(resourcesDir)) {\n return [];\n }\n\n const entries = await readdir(resourcesDir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const filePath = path.join(resourcesDir, entry.name, \"resource.ts\");\n if (existsSyncSafe(filePath)) {\n files.push(filePath);\n }\n }\n return files.sort((left, right) => left.localeCompare(right));\n}\n\n/** Locates the default-exported `resource({ ... })` object literal. */\nfunction findResourceDefinition(sourceFile: SourceFile): ObjectLiteralExpression {\n const call = resolveDefaultExportCall(sourceFile, \"resource\");\n if (!call) {\n throw new CompilerError(\n sourceFile,\n \"resource.ts must default-export resource({ ... }) or an identifier initialized with resource({ ... }).\",\n );\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(sourceFile, \"resource(...) must receive one object literal.\");\n }\n return definition;\n}\n\n/** Reads a required string property from the resource object. */\nfunction getRequiredStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n sourceFile: SourceFile,\n): string {\n const value = getOptionalStringProperty(definition, propertyName);\n if (value === undefined || !value.trim()) {\n throw new CompilerError(\n sourceFile,\n `resource({ ... }) must include a non-empty ${propertyName} string.`,\n );\n }\n return value;\n}\n\n/** Reads an optional string literal property. */\nfunction getOptionalStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads an optional number literal property. */\nfunction getOptionalNumberProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): number | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isNumericLiteral(initializer)\n ? Number(initializer.getLiteralText())\n : undefined;\n}\n\n/** Reads an optional boolean literal property. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n if (initializer.getKind() === SyntaxKind.TrueKeyword) return true;\n if (initializer.getKind() === SyntaxKind.FalseKeyword) return false;\n return undefined;\n}\n\n/** Reads a supported method/function property without executing code. */\nfunction getMethodOrFunctionProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): Node | undefined {\n const property = definition.getProperty(propertyName);\n if (Node.isMethodDeclaration(property)) {\n return property;\n }\n if (property && Node.isPropertyAssignment(property)) {\n const initializer = property.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return initializer;\n }\n }\n return undefined;\n}\n\n/** Extracts static MCP annotations from the resource object. */\nfunction readAnnotations(\n definition: ObjectLiteralExpression,\n): ResourceAnnotations | undefined {\n const initializer = readObjectProperty(definition, \"annotations\");\n if (!initializer) {\n return undefined;\n }\n\n const annotations: ResourceAnnotations = {};\n const audience = readStringArrayProperty(initializer, \"audience\")\n ?.filter((value): value is \"user\" | \"assistant\" => value === \"user\" || value === \"assistant\");\n const priority = getOptionalNumberProperty(initializer, \"priority\");\n const lastModified = getOptionalStringProperty(initializer, \"lastModified\");\n if (audience?.length) annotations.audience = audience;\n if (priority !== undefined) annotations.priority = priority;\n if (lastModified) annotations.lastModified = lastModified;\n return Object.keys(annotations).length ? annotations : undefined;\n}\n\n/** Reads MCP icon metadata from a simple object array. */\nfunction readIcons(definition: ObjectLiteralExpression): McpIcon[] | undefined {\n const property = definition.getProperty(\"icons\");\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n const icons = initializer.getElements().flatMap((element) => {\n const object = unwrapExpression(element);\n if (!object || !Node.isObjectLiteralExpression(object)) {\n return [];\n }\n const src = getOptionalStringProperty(object, \"src\");\n if (!src) {\n return [];\n }\n return [{\n src,\n mimeType: getOptionalStringProperty(object, \"mimeType\"),\n sizes: readStringArrayProperty(object, \"sizes\"),\n }];\n });\n return icons.length ? icons : undefined;\n}\n\n/** Reads a nested object literal property. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal array property. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n","/**\n * Minimal MCP JSON-RPC runtime for Sidecar tools and widget resources.\n *\n * The server package is deliberately small: it maps MCP methods to loaded\n * Sidecar tools, applies optional auth/proxy layers, and serves generated UI\n * resources during development or simple deployments.\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { randomUUID } from \"node:crypto\";\nimport { runProxy, type SidecarProxy } from \"./proxy.js\";\nimport type { SidecarAuth } from \"@sidecar-ai/auth\";\nimport { JSONRPC_VERSION } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { RequestId } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createToolDescriptor,\n executePrompt,\n executeResource,\n executeTool,\n SidecarRuntimeError,\n type JsonObject,\n type JsonSchema,\n type McpListOperation,\n type McpPromptDescriptor,\n type McpPromptResult,\n type McpResourceDescriptor,\n type McpResourceReadResult,\n type McpResourceTemplateDescriptor,\n type McpToolDescriptor,\n type McpToolResult,\n type PaginationConfig,\n type PaginationOverride,\n type PaginationResult,\n type PromptContext,\n type ResourceCapabilityConfig,\n type ResourceContext,\n type SidecarPrompt,\n type SidecarResource,\n type SidecarTool,\n type ToolCapabilityConfig,\n type ToolContext\n} from \"@sidecar-ai/core\";\n\n/** JSON-RPC request shape accepted by the MCP runtime. */\nexport type JsonRpcRequest = {\n jsonrpc: typeof JSONRPC_VERSION;\n id?: RequestId | null;\n method: string;\n params?: unknown;\n};\n\n/** JSON-RPC response shape returned by the MCP runtime. */\nexport type JsonRpcResponse =\n | {\n jsonrpc: typeof JSONRPC_VERSION;\n id: RequestId | null;\n result: unknown;\n }\n | {\n jsonrpc: typeof JSONRPC_VERSION;\n id: RequestId | null;\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n };\n\ntype JsonRpcErrorPayload = Extract<JsonRpcResponse, { error: unknown }>[\"error\"];\n\n/** MCP protocol version Sidecar currently speaks over Streamable HTTP. */\nexport const SIDECAR_MCP_PROTOCOL_VERSION = \"2025-11-25\";\n\n/** Runtime tool plus an optional precomputed descriptor from the compiler. */\nexport type LoadedTool = {\n tool: SidecarTool<any, any, any>;\n descriptor?: McpToolDescriptor;\n};\n\ntype RegisteredTool = LoadedTool & {\n descriptor: McpToolDescriptor;\n descriptorProvided: boolean;\n};\n\ntype RegisteredResource = LoadedResource & {\n descriptor: McpResourceDescriptor;\n};\n\ntype RegisteredPrompt = LoadedPrompt & {\n descriptor: McpPromptDescriptor;\n};\n\n/** HTML/text resource served to MCP Apps clients. */\nexport type LoadedResource = {\n uri: string;\n name?: string;\n description?: string;\n mimeType?: string;\n text?: string;\n _meta?: Record<string, unknown>;\n resource?: SidecarResource;\n descriptor?: McpResourceDescriptor;\n};\n\n/** Runtime prompt plus an optional precomputed descriptor from the compiler. */\nexport type LoadedPrompt = {\n prompt: SidecarPrompt<any, any, any>;\n descriptor?: McpPromptDescriptor;\n};\n\n/** Optional resource template descriptor exposed by `resources/templates/list`. */\nexport type LoadedResourceTemplate = {\n descriptor: McpResourceTemplateDescriptor;\n};\n\n/** Options for the in-memory MCP request dispatcher. */\nexport type SidecarMcpServerOptions = {\n name?: string;\n version?: string;\n tools: LoadedTool[];\n resources?: LoadedResource[];\n resourceTemplates?: LoadedResourceTemplate[];\n prompts?: LoadedPrompt[];\n auth?: SidecarAuth;\n createContext?: (request: JsonRpcRequest) => ToolContext | Promise<ToolContext>;\n maxBodyBytes?: number;\n toolTimeoutMs?: number;\n allowedOrigins?: string[];\n publicUrl?: string;\n capabilities?: {\n tools?: ToolCapabilityConfig;\n resources?: ResourceCapabilityConfig;\n prompts?: { listChanged?: boolean };\n };\n pagination?: PaginationConfig;\n};\n\n/** Additional request context supplied by HTTP adapters. */\nexport type SidecarHandleContext = {\n request?: Request;\n authSession?: unknown;\n};\n\n/** JSON-RPC MCP dispatcher for Sidecar tools and resources. */\nexport class SidecarMcpServer {\n private readonly tools = new Map<string, RegisteredTool>();\n private readonly resources = new Map<string, RegisteredResource>();\n private readonly prompts = new Map<string, RegisteredPrompt>();\n private readonly resourceTemplates: LoadedResourceTemplate[];\n\n constructor(private readonly options: SidecarMcpServerOptions) {\n for (const loaded of options.tools) {\n const descriptorProvided = Boolean(loaded.descriptor);\n const descriptor = loaded.descriptor ?? createToolDescriptor(loaded.tool);\n if (this.tools.has(descriptor.name)) {\n throw new Error(`Duplicate Sidecar tool id \"${descriptor.name}\".`);\n }\n this.tools.set(descriptor.name, { ...loaded, descriptor, descriptorProvided });\n }\n\n for (const resource of options.resources ?? []) {\n if (this.resources.has(resource.uri)) {\n throw new Error(`Duplicate Sidecar resource uri \"${resource.uri}\".`);\n }\n const descriptor = resource.descriptor ?? {\n uri: resource.uri,\n name: resource.name ?? resource.uri,\n description: resource.description,\n mimeType: resource.mimeType,\n _meta: resource._meta,\n };\n this.resources.set(resource.uri, { ...resource, descriptor });\n }\n\n for (const loaded of options.prompts ?? []) {\n const descriptor = loaded.descriptor ?? {\n name: loaded.prompt.name ?? loaded.prompt.title,\n title: loaded.prompt.title,\n description: loaded.prompt.description,\n };\n if (this.prompts.has(descriptor.name)) {\n throw new Error(`Duplicate Sidecar prompt name \"${descriptor.name}\".`);\n }\n this.prompts.set(descriptor.name, { ...loaded, descriptor });\n }\n\n this.resourceTemplates = options.resourceTemplates ?? [];\n }\n\n /** Returns all tool descriptors exposed through `tools/list`. */\n descriptors(): McpToolDescriptor[] {\n return [...this.tools.values()].map((loaded) => loaded.descriptor);\n }\n\n /** Returns all resource descriptors exposed through `resources/list`. */\n resourceDescriptors(): McpResourceDescriptor[] {\n return [...this.resources.values()].map((loaded) => loaded.descriptor);\n }\n\n /** Returns all prompt descriptors exposed through `prompts/list`. */\n promptDescriptors(): McpPromptDescriptor[] {\n return [...this.prompts.values()].map((loaded) => loaded.descriptor);\n }\n\n /** Handles a JSON-RPC request or notification. */\n async handle(\n request: JsonRpcRequest,\n context: SidecarHandleContext = {},\n ): Promise<JsonRpcResponse | undefined> {\n if (request.id === undefined) {\n await this.authorizeEndpoint(context);\n await this.handleNotification(request);\n return undefined;\n }\n\n try {\n const authSession = await this.authorizeEndpoint(context);\n const authorizedContext = { ...context, authSession };\n const result = await this.dispatch(request, authorizedContext);\n return {\n jsonrpc: JSONRPC_VERSION,\n id: request.id,\n result\n };\n } catch (error) {\n return {\n jsonrpc: JSONRPC_VERSION,\n id: request.id,\n error: normalizeError(error)\n };\n }\n }\n\n /** Routes an MCP method to its implementation. */\n private async dispatch(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<unknown> {\n switch (request.method) {\n case \"initialize\":\n return {\n protocolVersion: SIDECAR_MCP_PROTOCOL_VERSION,\n capabilities: this.capabilities(),\n serverInfo: {\n name: this.options.name ?? \"sidecar\",\n version: this.options.version ?? \"0.0.0-dev\"\n }\n };\n\n case \"tools/list\":\n return this.listTools(request, context);\n\n case \"tools/call\":\n return this.callTool(request, context);\n\n case \"resources/list\":\n return this.listResources(request, context);\n\n case \"resources/read\":\n return this.readResource(request, context);\n\n case \"resources/templates/list\":\n return this.listResourceTemplates(request, context);\n\n case \"resources/subscribe\":\n return this.subscribeResource(request);\n\n case \"resources/unsubscribe\":\n return this.unsubscribeResource(request);\n\n case \"prompts/list\":\n return this.listPrompts(request, context);\n\n case \"prompts/get\":\n return this.getPrompt(request, context);\n\n default:\n throw new JsonRpcError(-32601, `Unsupported method \"${request.method}\".`);\n }\n }\n\n /** Builds the MCP server capability object from implemented runtime features. */\n private capabilities(): Record<string, unknown> {\n const configured = this.options.capabilities ?? {};\n return stripUndefined({\n tools: stripUndefined({\n listChanged: configured.tools?.listChanged || undefined,\n }),\n resources: stripUndefined({\n subscribe: configured.resources?.subscribe || undefined,\n listChanged: configured.resources?.listChanged || undefined,\n }),\n prompts: this.prompts.size || configured.prompts?.listChanged\n ? stripUndefined({\n listChanged: configured.prompts?.listChanged || undefined,\n })\n : undefined,\n });\n }\n\n /** Lists tools with MCP cursor pagination. */\n private async listTools(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<{ tools: McpToolDescriptor[]; nextCursor?: string }> {\n const page = await this.paginate(\"tools/list\", this.descriptors(), request, context);\n return stripUndefined({\n tools: [...page.items],\n nextCursor: page.nextCursor,\n });\n }\n\n /** Lists resources with MCP cursor pagination. */\n private async listResources(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<{ resources: McpResourceDescriptor[]; nextCursor?: string }> {\n const page = await this.paginate(\"resources/list\", this.resourceDescriptors(), request, context);\n return stripUndefined({\n resources: [...page.items],\n nextCursor: page.nextCursor,\n });\n }\n\n /** Lists resource templates with MCP cursor pagination. */\n private async listResourceTemplates(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<{ resourceTemplates: McpResourceTemplateDescriptor[]; nextCursor?: string }> {\n const page = await this.paginate(\n \"resources/templates/list\",\n this.resourceTemplates.map((entry) => entry.descriptor),\n request,\n context,\n );\n return stripUndefined({\n resourceTemplates: [...page.items],\n nextCursor: page.nextCursor,\n });\n }\n\n /** Lists prompts with MCP cursor pagination. */\n private async listPrompts(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<{ prompts: McpPromptDescriptor[]; nextCursor?: string }> {\n const page = await this.paginate(\"prompts/list\", this.promptDescriptors(), request, context);\n return stripUndefined({\n prompts: [...page.items],\n nextCursor: page.nextCursor,\n });\n }\n\n /** Applies configured or default cursor pagination to one supported list operation. */\n private async paginate<Item>(\n operation: McpListOperation,\n items: readonly Item[],\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<PaginationResult<Item>> {\n const cursor = readCursorParam(request);\n const pageSize = this.pageSize();\n const override = selectPaginationOverride<Item>(this.options.pagination?.override, operation);\n if (override) {\n return override({\n operation,\n items,\n cursor,\n pageSize,\n auth: context.authSession,\n });\n }\n\n return defaultPagination(items, cursor, pageSize);\n }\n\n /** Returns the server-chosen page size for all built-in list pagination. */\n private pageSize(): number {\n const configured = this.options.pagination?.pageSize;\n return configured && configured > 0 ? Math.floor(configured) : 10;\n }\n\n /** Executes a tool after request-level and tool-level auth checks. */\n private async callTool(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<McpToolResult> {\n const params = request.params as { name?: unknown; arguments?: unknown } | undefined;\n const name = typeof params?.name === \"string\" ? params.name : undefined;\n if (!name) {\n throw new JsonRpcError(-32602, \"tools/call requires params.name.\");\n }\n\n const loaded = this.tools.get(name);\n if (!loaded) {\n throw new JsonRpcError(-32602, `Unknown tool \"${name}\".`);\n }\n\n const authSession = await this.authorizeTool(loaded, context);\n const ctx = this.options.createContext\n ? await this.options.createContext(request)\n : createDefaultContext(request);\n if (authSession !== undefined) {\n ctx.auth = authSession;\n }\n const controller = new AbortController();\n ctx.request = {\n ...ctx.request,\n signal: controller.signal,\n };\n\n const args = loaded.descriptorProvided\n ? validateAgainstSchema(\n loaded.descriptor.inputSchema,\n params?.arguments ?? {},\n `Invalid parameters for tool \"${name}\".`,\n )\n : params?.arguments ?? {};\n const result = await withTimeout(\n executeTool(loaded.tool, args, ctx),\n this.options.toolTimeoutMs,\n controller,\n );\n if (loaded.descriptorProvided) {\n validateAgainstSchema(\n loaded.descriptor.outputSchema,\n result.structuredContent,\n `Invalid structuredContent returned by tool \"${name}\".`,\n );\n }\n return result;\n }\n\n /** Authenticates the whole HTTP MCP request when auth.ts is configured. */\n private async authorizeEndpoint(\n context: SidecarHandleContext,\n ): Promise<unknown | undefined> {\n if (context.authSession !== undefined) {\n return context.authSession;\n }\n if (!this.options.auth) {\n return undefined;\n }\n\n const request = context.request ?? new Request(this.options.auth.resource);\n const requestAuth = await this.options.auth.authorizeRequest(request);\n if (!requestAuth.ok) {\n throw authJsonRpcError(requestAuth);\n }\n\n return requestAuth.auth;\n }\n\n /** Applies Sidecar auth policy for a tool call. */\n private async authorizeTool(\n loaded: RegisteredTool,\n context: SidecarHandleContext,\n ): Promise<unknown | undefined> {\n const policy = loaded.tool.auth;\n\n if (!this.options.auth) {\n if (policy && policy.public !== true) {\n throw new JsonRpcError(\n -32001,\n `Tool \"${loaded.descriptor?.name ?? loaded.tool.name}\" requires auth, but no auth.ts configuration is loaded.`,\n );\n }\n return undefined;\n }\n\n const authSession = context.authSession ?? await this.authorizeEndpoint(context);\n const toolAuth = this.options.auth.authorizeTool(policy, authSession as never);\n if (!toolAuth.ok) {\n throw authJsonRpcError(toolAuth);\n }\n\n return toolAuth.auth;\n }\n\n /** Reads a generated widget or authored resource by URI. */\n private async readResource(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<McpResourceReadResult> {\n const params = request.params as { uri?: unknown } | undefined;\n const uri = typeof params?.uri === \"string\" ? params.uri : undefined;\n if (!uri) {\n throw new JsonRpcError(-32602, \"resources/read requires params.uri.\");\n }\n\n const resource = this.resources.get(uri);\n if (!resource) {\n throw new JsonRpcError(-32002, `Resource not found: \"${uri}\".`, { uri });\n }\n\n if (resource.resource) {\n const toolContext = this.options.createContext\n ? await this.options.createContext(request)\n : createDefaultContext(request);\n if (context.authSession !== undefined) {\n toolContext.auth = context.authSession;\n }\n return executeResource(resource.resource, toResourceContext(toolContext), {\n uri,\n mimeType: resource.descriptor.mimeType,\n });\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: resource.mimeType ?? \"text/plain\",\n text: resource.text ?? \"\",\n _meta: resource._meta\n }\n ]\n };\n }\n\n /** Accepts a resource subscription when server-level support is enabled. */\n private subscribeResource(request: JsonRpcRequest): Record<string, never> {\n if (!this.options.capabilities?.resources?.subscribe) {\n throw new JsonRpcError(-32601, \"Resource subscriptions are not enabled.\");\n }\n const uri = readUriParam(request, \"resources/subscribe\");\n if (!this.resources.has(uri)) {\n throw new JsonRpcError(-32002, `Resource not found: \"${uri}\".`, { uri });\n }\n return {};\n }\n\n /** Accepts a resource unsubscription when server-level support is enabled. */\n private unsubscribeResource(request: JsonRpcRequest): Record<string, never> {\n if (!this.options.capabilities?.resources?.subscribe) {\n throw new JsonRpcError(-32601, \"Resource subscriptions are not enabled.\");\n }\n const uri = readUriParam(request, \"resources/unsubscribe\");\n if (!this.resources.has(uri)) {\n throw new JsonRpcError(-32002, `Resource not found: \"${uri}\".`, { uri });\n }\n return {};\n }\n\n /** Renders one named prompt with validated arguments. */\n private async getPrompt(\n request: JsonRpcRequest,\n context: SidecarHandleContext,\n ): Promise<McpPromptResult> {\n const params = request.params as { name?: unknown; arguments?: unknown } | undefined;\n const name = typeof params?.name === \"string\" ? params.name : undefined;\n if (!name) {\n throw new JsonRpcError(-32602, \"prompts/get requires params.name.\");\n }\n const loaded = this.prompts.get(name);\n if (!loaded) {\n throw new JsonRpcError(-32602, `Unknown prompt \"${name}\".`);\n }\n\n const toolContext = this.options.createContext\n ? await this.options.createContext(request)\n : createDefaultContext(request);\n if (context.authSession !== undefined) {\n toolContext.auth = context.authSession;\n }\n return executePrompt(loaded.prompt, params?.arguments ?? {}, toPromptContext(toolContext));\n }\n\n /** Accepts notifications without side effects for client compatibility. */\n private async handleNotification(_request: JsonRpcRequest): Promise<void> {\n // Notifications intentionally do not produce responses. The v0 server does\n // not need notification side effects yet, but accepting them makes MCP\n // clients less brittle during initialization.\n }\n}\n\n/** Creates an in-memory MCP dispatcher. */\nexport function createSidecarMcpServer(options: SidecarMcpServerOptions): SidecarMcpServer {\n return new SidecarMcpServer(options);\n}\n\n/** Creates a Node HTTP server exposing the MCP dispatcher at one endpoint. */\nexport function createSidecarHttpServer(options: SidecarMcpServerOptions & { path?: string; proxy?: SidecarProxy }) {\n const mcp = createSidecarMcpServer(options);\n const endpoint = options.path ?? \"/mcp\";\n const maxBodyBytes = options.maxBodyBytes ?? 1_000_000;\n\n return createServer(async (request, response) => {\n if (isRejectedOrigin(request, options.allowedOrigins)) {\n response.writeHead(403, { \"content-type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"forbidden_origin\" }));\n return;\n }\n\n const proxyResult = await runProxy(options.proxy, request);\n if (proxyResult) {\n response.writeHead(proxyResult.status, proxyResult.headers);\n response.end(proxyResult.body ?? \"\");\n return;\n }\n\n const pathname = request.url?.split(\"?\")[0];\n if (\n options.auth &&\n request.method === \"GET\" &&\n isProtectedResourceMetadataPath(pathname, endpoint)\n ) {\n response.writeHead(200, { \"content-type\": \"application/json\" });\n response.end(JSON.stringify(options.auth.metadata()));\n return;\n }\n\n if (request.method === \"GET\" && pathname === endpoint) {\n response.writeHead(405, { \"content-type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"sse_not_supported\" }));\n return;\n }\n\n if (request.method !== \"POST\" || pathname !== endpoint) {\n response.writeHead(404, { \"content-type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"not_found\" }));\n return;\n }\n\n try {\n validateProtocolVersion(request);\n validatePostHeaders(request);\n\n const body = await readJson(request, maxBodyBytes);\n if (Array.isArray(body)) {\n throw new JsonRpcHttpError(400, -32600, \"JSON-RPC batches are not supported by MCP Streamable HTTP.\");\n }\n if (isJsonRpcResponseMessage(body)) {\n response.writeHead(202);\n response.end();\n return;\n }\n\n const rpcRequest = assertJsonRpcRequest(body);\n const fetchRequest = toFetchRequest(request, options.publicUrl ?? options.auth?.resource);\n const authSession = options.auth\n ? await authorizeHttpRequest(options.auth, fetchRequest, response)\n : undefined;\n if (options.auth && authSession === AUTH_RESPONSE_SENT) {\n return;\n }\n\n const payload = await mcp.handle(rpcRequest, {\n request: fetchRequest,\n authSession,\n }) ?? null;\n const responses = payload === null ? [] : [payload];\n if (!responses.length) {\n response.writeHead(202);\n response.end();\n return;\n }\n\n const authError = httpAuthError(payload);\n response.writeHead(authError?.status ?? 200, {\n \"content-type\": \"application/json\",\n ...(authError?.headers ?? {}),\n });\n response.end(JSON.stringify(payload));\n } catch (error) {\n const status = error instanceof JsonRpcHttpError ? error.status : 400;\n response.writeHead(status, { \"content-type\": \"application/json\" });\n response.end(\n JSON.stringify({\n jsonrpc: JSONRPC_VERSION,\n id: null,\n error: normalizeHttpError(error)\n })\n );\n }\n });\n}\n\nconst DEFAULT_ALLOWED_ORIGINS = [\n \"https://chatgpt.com\",\n \"https://chat.openai.com\",\n \"https://claude.ai\",\n \"https://*.claude.ai\",\n];\n\n/** Rejects browser-originated requests from invalid or unexpected origins. */\nfunction isRejectedOrigin(request: IncomingMessage, allowedOrigins: string[] = []): boolean {\n const origin = request.headers.origin;\n if (!origin) {\n return false;\n }\n\n const host = request.headers.host ?? \"\";\n let originUrl: URL;\n try {\n originUrl = new URL(origin);\n } catch {\n return true;\n }\n\n if (isLocalHost(host)) {\n return !isLocalHost(originUrl.host);\n }\n\n const requestOrigin = `https://${host}`;\n const allowed = [requestOrigin, ...DEFAULT_ALLOWED_ORIGINS, ...allowedOrigins];\n return !allowed.some((pattern) => matchesOrigin(pattern, originUrl.origin));\n}\n\n/** Returns true for localhost hosts, with or without a port. */\nfunction isLocalHost(host: string): boolean {\n if (host.startsWith(\"[::1]\")) {\n return true;\n }\n\n const hostname = host.split(\":\")[0]?.toLowerCase();\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\";\n}\n\n/** Matches exact origin strings or simple wildcard host patterns. */\nfunction matchesOrigin(pattern: string, origin: string): boolean {\n if (pattern === origin) {\n return true;\n }\n if (!pattern.includes(\"*\")) {\n return false;\n }\n\n const escaped = pattern.split(\"*\").map(escapeRegExp).join(\"[^.]+\");\n return new RegExp(`^${escaped}$`).test(origin);\n}\n\n/** Escapes a string before embedding it in an origin regexp. */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Returns true for the OAuth protected resource metadata endpoints Sidecar serves. */\nfunction isProtectedResourceMetadataPath(\n pathname: string | undefined,\n endpoint: string,\n): boolean {\n return (\n pathname === \"/.well-known/oauth-protected-resource\" ||\n pathname === `/.well-known/oauth-protected-resource${endpoint}`\n );\n}\n\nexport * from \"./proxy.js\";\n\n/** JSON-RPC error with optional structured metadata. */\nexport class JsonRpcError extends Error {\n constructor(readonly code: number, message: string, readonly data?: unknown) {\n super(message);\n this.name = \"JsonRpcError\";\n }\n}\n\n/** JSON-RPC error that must map to a concrete HTTP status. */\nclass JsonRpcHttpError extends JsonRpcError {\n constructor(readonly status: number, code: number, message: string, data?: unknown) {\n super(code, message, data);\n this.name = \"JsonRpcHttpError\";\n }\n}\n\nconst AUTH_RESPONSE_SENT = Symbol(\"sidecar.auth.response-sent\");\n\n/** Performs HTTP request-level auth and writes 401/403 directly. */\nasync function authorizeHttpRequest(\n auth: SidecarAuth,\n request: Request,\n response: ServerResponse,\n): Promise<unknown | typeof AUTH_RESPONSE_SENT> {\n const result = await auth.authorizeRequest(request);\n if (result.ok) {\n return result.auth;\n }\n\n response.writeHead(result.status, {\n \"content-type\": \"application/json\",\n ...headersToRecord(result.headers),\n });\n response.end(\n JSON.stringify({\n jsonrpc: JSONRPC_VERSION,\n id: null,\n error: {\n code: result.status === 401 ? -32001 : -32003,\n message: result.body.error_description ?? result.body.error,\n data: {\n status: result.status,\n body: result.body,\n },\n },\n }),\n );\n return AUTH_RESPONSE_SENT;\n}\n\n/** Creates the default tool context used by tests and the dev server. */\nfunction createDefaultContext(request: JsonRpcRequest): ToolContext {\n const memory = new Map<string, unknown>();\n\n return {\n auth: undefined,\n request: {\n id: String(request.id ?? randomUUID()),\n signal: new AbortController().signal,\n host: \"unknown\",\n transport: \"streamable-http\"\n },\n services: {},\n tools: {},\n log: consoleLogger,\n trace: {\n async span(_name, run) {\n return run();\n }\n },\n storage: {\n async get(key) {\n return memory.get(key) as never;\n },\n async set(key, value) {\n memory.set(key, value);\n },\n async delete(key) {\n memory.delete(key);\n }\n },\n env: process.env\n };\n}\n\n/** Narrows the full tool context into the resource context shape. */\nfunction toResourceContext(ctx: ToolContext): ResourceContext {\n return {\n auth: ctx.auth,\n request: ctx.request,\n services: ctx.services,\n log: ctx.log,\n storage: ctx.storage,\n env: ctx.env,\n };\n}\n\n/** Narrows the full tool context into the prompt context shape. */\nfunction toPromptContext(ctx: ToolContext): PromptContext {\n return {\n auth: ctx.auth,\n request: ctx.request,\n services: ctx.services,\n log: ctx.log,\n storage: ctx.storage,\n env: ctx.env,\n };\n}\n\n/** Reads a pagination cursor from request params. */\nfunction readCursorParam(request: JsonRpcRequest): string | undefined {\n const params = request.params as { cursor?: unknown } | undefined;\n if (params?.cursor === undefined) {\n return undefined;\n }\n if (typeof params.cursor !== \"string\" || !params.cursor) {\n throw new JsonRpcError(-32602, \"Pagination cursor must be a non-empty string.\");\n }\n return params.cursor;\n}\n\n/** Reads a required resource URI from request params. */\nfunction readUriParam(request: JsonRpcRequest, method: string): string {\n const params = request.params as { uri?: unknown } | undefined;\n const uri = typeof params?.uri === \"string\" ? params.uri : undefined;\n if (!uri) {\n throw new JsonRpcError(-32602, `${method} requires params.uri.`);\n }\n return uri;\n}\n\n/** Selects a global or operation-specific pagination override. */\nfunction selectPaginationOverride<Item>(\n override: PaginationConfig[\"override\"] | undefined,\n operation: McpListOperation,\n): PaginationOverride<Item> | undefined {\n if (!override) {\n return undefined;\n }\n if (typeof override === \"function\") {\n return override as PaginationOverride<Item>;\n }\n\n const key = operationToPaginationKey(operation);\n return (override[key] ?? override.default) as PaginationOverride<Item> | undefined;\n}\n\n/** Maps MCP method names to typed config keys. */\nfunction operationToPaginationKey(\n operation: McpListOperation,\n): \"toolsList\" | \"resourcesList\" | \"resourceTemplatesList\" | \"promptsList\" {\n switch (operation) {\n case \"tools/list\":\n return \"toolsList\";\n case \"resources/list\":\n return \"resourcesList\";\n case \"resources/templates/list\":\n return \"resourceTemplatesList\";\n case \"prompts/list\":\n return \"promptsList\";\n }\n}\n\n/** Default opaque-cursor pagination over an in-memory list. */\nfunction defaultPagination<Item>(\n items: readonly Item[],\n cursor: string | undefined,\n pageSize: number,\n): PaginationResult<Item> {\n const offset = cursor ? decodeCursor(cursor) : 0;\n const page = items.slice(offset, offset + pageSize);\n const nextOffset = offset + page.length;\n return {\n items: page,\n nextCursor: nextOffset < items.length ? encodeCursor(nextOffset) : undefined,\n };\n}\n\n/** Encodes a list offset as an opaque base64url cursor. */\nfunction encodeCursor(offset: number): string {\n return Buffer.from(JSON.stringify({ offset }), \"utf8\").toString(\"base64url\");\n}\n\n/** Decodes and validates Sidecar's default opaque cursor. */\nfunction decodeCursor(cursor: string): number {\n try {\n const decoded = JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf8\")) as {\n offset?: unknown;\n };\n const offset = decoded.offset;\n if (!Number.isInteger(offset) || typeof offset !== \"number\" || offset < 0) {\n throw new Error(\"invalid offset\");\n }\n return offset;\n } catch {\n throw new JsonRpcError(-32602, \"Invalid pagination cursor.\");\n }\n}\n\n/** Converts auth challenges into JSON-RPC errors while preserving HTTP metadata. */\nfunction authJsonRpcError(result: Exclude<Awaited<ReturnType<SidecarAuth[\"authorizeRequest\"]>>, { ok: true }>): JsonRpcError {\n return new JsonRpcError(\n result.status === 401 ? -32001 : -32003,\n result.body.error_description ?? result.body.error,\n {\n status: result.status,\n headers: headersToRecord(result.headers),\n body: result.body\n }\n );\n}\n\n/** Rejects unsupported MCP protocol versions when clients send the header. */\nfunction validateProtocolVersion(request: IncomingMessage): void {\n const value = request.headers[\"mcp-protocol-version\"];\n const version = Array.isArray(value) ? value[0] : value;\n if (!version) {\n return;\n }\n\n const supported = new Set([SIDECAR_MCP_PROTOCOL_VERSION]);\n if (!supported.has(version)) {\n throw new JsonRpcHttpError(\n 400,\n -32600,\n `Unsupported MCP-Protocol-Version \"${version}\".`,\n );\n }\n}\n\n/** Enforces Streamable HTTP POST content negotiation before body parsing. */\nfunction validatePostHeaders(request: IncomingMessage): void {\n const contentType = request.headers[\"content-type\"];\n const contentTypeValue = Array.isArray(contentType) ? contentType[0] : contentType;\n if (!contentTypeValue?.toLowerCase().includes(\"application/json\")) {\n throw new JsonRpcHttpError(415, -32600, \"POST Content-Type must be application/json.\");\n }\n\n const accept = request.headers.accept;\n const acceptValue = Array.isArray(accept) ? accept.join(\",\") : accept;\n if (\n !acceptValue ||\n !acceptValue.toLowerCase().includes(\"application/json\") ||\n !acceptValue.toLowerCase().includes(\"text/event-stream\")\n ) {\n throw new JsonRpcHttpError(\n 406,\n -32600,\n \"POST Accept must include application/json and text/event-stream.\",\n );\n }\n}\n\n/** Adds a timeout and abort signal to tool execution. */\nasync function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number | undefined,\n controller: AbortController,\n): Promise<T> {\n if (!timeoutMs || timeoutMs <= 0) {\n return promise;\n }\n\n let timeout: NodeJS.Timeout | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(() => {\n controller.abort();\n reject(new JsonRpcError(-32000, \"Tool execution timed out.\"));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n\n/** Validates simple JSON Schema values used by compiler-generated descriptors. */\nfunction validateAgainstSchema(\n schema: JsonSchema | undefined,\n value: unknown,\n message: string,\n options: { optional?: boolean } = {},\n): unknown {\n if (!schema || (value === undefined && options.optional)) {\n return value;\n }\n\n const failure = schemaFailure(schema, value, \"$\");\n if (failure) {\n throw new JsonRpcError(-32602, message, { validation: failure });\n }\n return value;\n}\n\n/** Returns a readable validation failure for the supported JSON Schema subset. */\nfunction schemaFailure(schema: JsonSchema, value: unknown, path: string): string | undefined {\n if (schema.anyOf?.length && !schema.anyOf.some((entry) => !schemaFailure(entry, value, path))) {\n return `${path} must match one anyOf schema.`;\n }\n if (schema.oneOf?.length && schema.oneOf.filter((entry) => !schemaFailure(entry, value, path)).length !== 1) {\n return `${path} must match exactly one oneOf schema.`;\n }\n if (schema.allOf?.length) {\n for (const entry of schema.allOf) {\n const failure = schemaFailure(entry, value, path);\n if (failure) return failure;\n }\n }\n if (schema.const !== undefined && value !== schema.const) {\n return `${path} must equal ${JSON.stringify(schema.const)}.`;\n }\n if (schema.enum && !schema.enum.some((entry) => JSON.stringify(entry) === JSON.stringify(value))) {\n return `${path} must be one of the declared enum values.`;\n }\n\n if (schema.type) {\n const types = Array.isArray(schema.type) ? schema.type : [schema.type];\n if (!types.some((type) => matchesJsonSchemaType(type, value))) {\n return `${path} must be ${types.join(\" or \")}.`;\n }\n }\n\n if (schema.type === \"object\" || schema.properties || schema.required) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return `${path} must be an object.`;\n }\n const record = value as Record<string, unknown>;\n for (const required of schema.required ?? []) {\n if (!(required in record)) {\n return `${path}.${required} is required.`;\n }\n }\n for (const [key, propertySchema] of Object.entries(schema.properties ?? {})) {\n if (key in record) {\n const failure = schemaFailure(propertySchema, record[key], `${path}.${key}`);\n if (failure) return failure;\n }\n }\n if (schema.additionalProperties === false) {\n const allowed = new Set(Object.keys(schema.properties ?? {}));\n const extra = Object.keys(record).find((key) => !allowed.has(key));\n if (extra) {\n return `${path}.${extra} is not allowed.`;\n }\n }\n }\n\n if (schema.type === \"array\" || schema.items) {\n if (!Array.isArray(value)) {\n return `${path} must be an array.`;\n }\n if (schema.items) {\n for (const [index, entry] of value.entries()) {\n const failure = schemaFailure(schema.items, entry, `${path}[${index}]`);\n if (failure) return failure;\n }\n }\n }\n\n if (typeof value === \"string\") {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n return `${path} is shorter than ${schema.minLength}.`;\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n return `${path} is longer than ${schema.maxLength}.`;\n }\n }\n if (typeof value === \"number\") {\n if (schema.minimum !== undefined && value < schema.minimum) {\n return `${path} is less than ${schema.minimum}.`;\n }\n if (schema.maximum !== undefined && value > schema.maximum) {\n return `${path} is greater than ${schema.maximum}.`;\n }\n }\n\n return undefined;\n}\n\n/** Returns true when a value matches a primitive JSON Schema type. */\nfunction matchesJsonSchemaType(type: string, value: unknown): boolean {\n switch (type) {\n case \"object\":\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n case \"array\":\n return Array.isArray(value);\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"integer\":\n return Number.isInteger(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"null\":\n return value === null;\n default:\n return true;\n }\n}\n\n/** Converts Fetch headers to a plain object for JSON-RPC error metadata. */\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const record: Record<string, string> = {};\n headers.forEach((value, key) => {\n record[key] = value;\n });\n return record;\n}\n\n/** Drops undefined values from JSON-like objects before returning protocol payloads. */\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\n/** Extracts HTTP auth status/headers from a JSON-RPC auth error response. */\nfunction httpAuthError(value: unknown): { status: number; headers: Record<string, string> } | undefined {\n if (!value || typeof value !== \"object\" || !(\"error\" in value)) {\n return undefined;\n }\n\n const error = (value as { error?: { data?: unknown } }).error;\n const data = error?.data;\n if (!data || typeof data !== \"object\") {\n return undefined;\n }\n\n const status = (data as { status?: unknown }).status;\n const headers = (data as { headers?: unknown }).headers;\n if ((status !== 401 && status !== 403) || !headers || typeof headers !== \"object\") {\n return undefined;\n }\n\n return {\n status,\n headers: headers as Record<string, string>,\n };\n}\n\nconst consoleLogger = {\n debug(message: string, data?: Record<string, unknown>) {\n console.debug(message, data ?? \"\");\n },\n info(message: string, data?: Record<string, unknown>) {\n console.info(message, data ?? \"\");\n },\n warn(message: string, data?: Record<string, unknown>) {\n console.warn(message, data ?? \"\");\n },\n error(message: string, data?: Record<string, unknown>) {\n console.error(message, data ?? \"\");\n }\n};\n\n/** Reads and parses a bounded JSON HTTP request body. */\nasync function readJson(request: IncomingMessage, maxBodyBytes: number): Promise<unknown> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.byteLength;\n if (size > maxBodyBytes) {\n throw new JsonRpcHttpError(413, -32600, \"Request body is too large.\");\n }\n chunks.push(buffer);\n }\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n}\n\n/** Converts a Node request into a Fetch Request for auth/session code. */\nfunction toFetchRequest(request: IncomingMessage, baseUrl?: string): Request {\n const headers = new Headers();\n for (const [key, value] of Object.entries(request.headers)) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n headers.append(key, entry);\n }\n } else if (value !== undefined) {\n headers.set(key, value);\n }\n }\n\n const url = baseUrl\n ? new URL(request.url ?? \"/\", baseUrl)\n : new URL(\n request.url ?? \"/\",\n `${headers.get(\"x-forwarded-proto\") ?? \"http\"}://${headers.get(\"host\") ?? \"127.0.0.1\"}`,\n );\n return new Request(url, {\n headers,\n method: request.method\n });\n}\n\n/** Validates an arbitrary value as a JSON-RPC request. */\nfunction assertJsonRpcRequest(value: unknown): JsonRpcRequest {\n if (!value || typeof value !== \"object\") {\n throw new JsonRpcError(-32600, \"Request must be a JSON object.\");\n }\n\n const record = value as Record<string, unknown>;\n if (record.jsonrpc !== JSONRPC_VERSION || typeof record.method !== \"string\") {\n throw new JsonRpcError(-32600, \"Invalid JSON-RPC request.\");\n }\n if (\n \"id\" in record &&\n record.id !== undefined &&\n record.id !== null &&\n typeof record.id !== \"string\" &&\n typeof record.id !== \"number\"\n ) {\n throw new JsonRpcError(-32600, \"JSON-RPC id must be a string, number, or null.\");\n }\n\n return {\n jsonrpc: JSONRPC_VERSION,\n id: typeof record.id === \"string\" || typeof record.id === \"number\" || record.id === null ? record.id : undefined,\n method: record.method,\n params: record.params\n };\n}\n\n/** Returns true for client responses that Streamable HTTP servers may acknowledge. */\nfunction isJsonRpcResponseMessage(value: unknown): boolean {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n if (record.jsonrpc !== JSONRPC_VERSION || !(\"id\" in record) || !(\"result\" in record || \"error\" in record)) {\n return false;\n }\n\n return (\n record.id === null ||\n typeof record.id === \"string\" ||\n typeof record.id === \"number\"\n );\n}\n\n/** Normalizes unknown errors into JSON-RPC error payloads. */\nfunction normalizeError(error: unknown): JsonRpcErrorPayload {\n if (error instanceof JsonRpcError) {\n return {\n code: error.code,\n message: error.message,\n data: error.data\n };\n }\n if (error instanceof SidecarRuntimeError && error.code === \"invalid_pagination_cursor\") {\n return {\n code: -32602,\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return {\n code: -32000,\n message: \"Internal server error.\"\n };\n }\n\n return {\n code: -32000,\n message: \"Unknown server error.\",\n data: error as JsonObject\n };\n}\n\n/** Normalizes transport-level parse/validation errors for HTTP responses. */\nfunction normalizeHttpError(error: unknown): JsonRpcErrorPayload {\n if (error instanceof JsonRpcError) {\n return {\n code: error.code,\n message: error.message,\n data: error.data,\n };\n }\n\n return {\n code: -32700,\n message: \"Invalid JSON request body.\",\n };\n}\n","/**\n * Small HTTP middleware layer for Sidecar MCP servers.\n *\n * Proxy middleware handles transport-adjacent concerns such as origin checks,\n * request ids, and rate limiting. It deliberately does not define auth policy.\n */\nimport { randomUUID } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\n\n/** HTTP response returned by proxy middleware to short-circuit a request. */\nexport type ProxyResult = {\n status: number;\n headers?: Record<string, string>;\n body?: string;\n};\n\n/** Middleware invoked before the MCP request handler. */\nexport type ProxyMiddleware = (request: IncomingMessage) => ProxyResult | undefined | Promise<ProxyResult | undefined>;\n\n/** Ordered proxy middleware configuration. */\nexport type SidecarProxy = {\n readonly kind: \"sidecar.proxy\";\n before: ProxyMiddleware[];\n};\n\nconst proxyBrand = Symbol.for(\"sidecar.proxy\");\n\n/** Creates a proxy middleware container. */\nexport function proxy(options: { before?: ProxyMiddleware[] } = {}): SidecarProxy {\n return {\n kind: \"sidecar.proxy\",\n [proxyBrand]: true,\n before: options.before ?? []\n } as SidecarProxy;\n}\n\n/** Returns true when a value was created by `proxy()`. */\nexport function isSidecarProxy(value: unknown): value is SidecarProxy {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as Record<symbol, unknown>)[proxyBrand] === true,\n );\n}\n\n/** Runs configured proxy middleware until one returns a response. */\nexport async function runProxy(proxyConfig: SidecarProxy | undefined, request: IncomingMessage): Promise<ProxyResult | undefined> {\n for (const middleware of proxyConfig?.before ?? []) {\n const result = await middleware(request);\n if (result) {\n return result;\n }\n }\n\n return undefined;\n}\n\n/** Restricts browser origins for hosted MCP and widget resource requests. */\nexport function origin(options: { allow: string[]; dev?: string[] }): ProxyMiddleware {\n return (request) => {\n const originHeader = request.headers.origin;\n const origin = Array.isArray(originHeader) ? originHeader[0] : originHeader;\n\n if (!origin) {\n return undefined;\n }\n\n const allowed = [...options.allow, ...(process.env.NODE_ENV === \"production\" ? [] : options.dev ?? [])];\n if (allowed.some((pattern) => matchesOrigin(pattern, origin))) {\n return undefined;\n }\n\n return {\n status: 403,\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ error: \"forbidden_origin\" })\n };\n };\n}\n\n/** Adds a request id header value for downstream logging. */\nexport function requestId(header = \"x-sidecar-request-id\"): ProxyMiddleware {\n return (request) => {\n request.headers[header] = randomUUID();\n return undefined;\n };\n}\n\n/** In-memory per-process rate limiter for dev and simple deployments. */\nexport function rateLimit(options: {\n windowMs: number;\n max: number;\n key?: (request: IncomingMessage) => string;\n maxKeys?: number;\n}): ProxyMiddleware {\n const hits = new Map<string, { count: number; resetAt: number }>();\n let lastPrunedAt = 0;\n\n return (request) => {\n const now = Date.now();\n if (now - lastPrunedAt > options.windowMs) {\n pruneExpired(hits, now);\n lastPrunedAt = now;\n }\n\n const key = options.key?.(request) ?? request.socket.remoteAddress ?? \"unknown\";\n const current = hits.get(key);\n\n if (!current || current.resetAt <= now) {\n if (hits.size >= (options.maxKeys ?? 10_000)) {\n pruneExpired(hits, now);\n }\n hits.set(key, { count: 1, resetAt: now + options.windowMs });\n return undefined;\n }\n\n current.count += 1;\n if (current.count <= options.max) {\n return undefined;\n }\n\n return {\n status: 429,\n headers: {\n \"content-type\": \"application/json\",\n \"retry-after\": String(Math.ceil((current.resetAt - now) / 1000))\n },\n body: JSON.stringify({ error: \"rate_limited\" })\n };\n };\n}\n\n/** Removes expired rate-limit buckets so long-running dev servers do not leak keys. */\nfunction pruneExpired(\n hits: Map<string, { count: number; resetAt: number }>,\n now: number,\n): void {\n for (const [key, value] of hits) {\n if (value.resetAt <= now) {\n hits.delete(key);\n }\n }\n}\n\n/** Matches exact origin strings or wildcard dev patterns. */\nfunction matchesOrigin(pattern: string, origin: string): boolean {\n if (pattern === origin || pattern === \"*\") {\n return true;\n }\n\n if (pattern.includes(\"*\")) {\n const escaped = pattern.split(\"*\").map(escapeRegExp).join(\".*\");\n return new RegExp(`^${escaped}$`).test(origin);\n }\n\n return false;\n}\n\n/** Escapes a string before embedding it in a wildcard-origin regexp. */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/** HTTPS tunnel helpers for local MCP development. */\nimport { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\n\n/** Tunnel backend requested by `sidecar dev --tunnel`. */\nexport type TunnelProvider = \"auto\" | \"cloudflared\" | \"wrangler\";\n\n/** Running tunnel process and the public MCP endpoint it exposes. */\nexport type TunnelSession = {\n provider: Exclude<TunnelProvider, \"auto\">;\n publicUrl: string;\n mcpUrl: string;\n close(): void;\n};\n\n/** Options for starting a dev HTTPS tunnel. */\nexport type StartTunnelOptions = {\n provider: TunnelProvider;\n port: number;\n path?: string;\n timeoutMs?: number;\n};\n\n/** Starts an HTTPS tunnel to the local Sidecar dev server. */\nexport async function startTunnel(options: StartTunnelOptions): Promise<TunnelSession> {\n const provider = await resolveProvider(options.provider);\n const localUrl = `http://127.0.0.1:${options.port}`;\n const path = options.path ?? \"/mcp\";\n\n if (provider === \"cloudflared\") {\n return startCloudflared(localUrl, path, options.timeoutMs);\n }\n\n return startWrangler(localUrl, path, options.timeoutMs);\n}\n\n/** Human-readable install guidance for missing tunnel providers. */\nexport function tunnelInstallMessage(provider: TunnelProvider = \"auto\"): string {\n if (provider === \"wrangler\") {\n return [\n \"npx was not found on PATH, so Sidecar cannot run Wrangler quick-start.\",\n \"Install Node.js/npm, or install cloudflared directly:\",\n \" brew install cloudflared\",\n ].join(\"\\n\");\n }\n\n return [\n \"cloudflared was not found on PATH.\",\n \"Install cloudflared for the fastest Sidecar tunnel path:\",\n \" brew install cloudflared\",\n \"Or run with Wrangler explicitly:\",\n \" sidecar dev --tunnel wrangler\",\n ].join(\"\\n\");\n}\n\n/** Picks the first available tunnel provider for `auto`. */\nasync function resolveProvider(provider: TunnelProvider): Promise<Exclude<TunnelProvider, \"auto\">> {\n if (provider === \"cloudflared\") {\n if (hasCommand(\"cloudflared\")) {\n return \"cloudflared\";\n }\n if (await promptForCloudflaredInstall()) {\n await installCloudflared();\n return \"cloudflared\";\n }\n assertNpxAvailable();\n return \"wrangler\";\n }\n\n if (provider === \"wrangler\") {\n assertNpxAvailable();\n return \"wrangler\";\n }\n\n if (hasCommand(\"cloudflared\")) {\n return \"cloudflared\";\n }\n\n const choice = await promptForMissingCloudflared();\n if (choice === \"install\") {\n await installCloudflared();\n return \"cloudflared\";\n }\n if (choice === \"wrangler\") {\n assertNpxAvailable();\n return \"wrangler\";\n }\n\n throw new Error(\"Cancelled HTTPS tunnel startup.\");\n}\n\n/** Prompts for whether to install cloudflared for explicit cloudflared requests. */\nasync function promptForCloudflaredInstall(): Promise<boolean> {\n if (!stdin.isTTY || !stdout.isTTY) {\n throw new Error(tunnelInstallMessage(\"cloudflared\"));\n }\n\n const answer = await question([\n \"cloudflared is not installed.\",\n \"Install cloudflared with Homebrew now? Answer no to continue with npx wrangler. [y/N] \",\n ].join(\"\\n\"));\n return answer.trim().toLowerCase().startsWith(\"y\");\n}\n\n/** Prompts for the dev fallback every time cloudflared is unavailable. */\nasync function promptForMissingCloudflared(): Promise<\"install\" | \"wrangler\" | \"cancel\"> {\n if (!stdin.isTTY || !stdout.isTTY) {\n throw new Error(tunnelInstallMessage(\"auto\"));\n }\n\n const answer = await question([\n \"cloudflared is not installed.\",\n \"Choose how Sidecar should create an HTTPS MCP URL:\",\n \" [i] install cloudflared with Homebrew\",\n \" [w] continue with npx wrangler tunnel quick-start\",\n \" [c] cancel\",\n \"Selection [i/w/c]: \",\n ].join(\"\\n\"));\n const normalized = answer.trim().toLowerCase();\n\n if (normalized === \"i\" || normalized === \"install\") {\n return \"install\";\n }\n if (normalized === \"w\" || normalized === \"wrangler\") {\n return \"wrangler\";\n }\n return \"cancel\";\n}\n\n/** Runs a one-shot prompt and always closes the readline interface. */\nasync function question(prompt: string): Promise<string> {\n const input = createInterface({ input: stdin, output: stdout });\n try {\n return await input.question(prompt);\n } finally {\n input.close();\n }\n}\n\n/** Installs cloudflared through Homebrew when available. */\nasync function installCloudflared(): Promise<void> {\n if (!hasCommand(\"brew\")) {\n throw new Error([\n \"Sidecar can only install cloudflared automatically when Homebrew is available.\",\n \"Install cloudflared manually, then rerun:\",\n \" sidecar dev --tunnel\",\n \"Or continue without installing it:\",\n \" sidecar dev --tunnel wrangler\",\n ].join(\"\\n\"));\n }\n\n await runInherited(\"brew\", [\"install\", \"cloudflared\"]);\n}\n\n/** Ensures npx exists before selecting the Wrangler fallback. */\nfunction assertNpxAvailable(): void {\n if (!hasCommand(\"npx\")) {\n throw new Error(tunnelInstallMessage(\"wrangler\"));\n }\n}\n\n/** Starts a Cloudflare quick tunnel and waits for its public URL. */\nasync function startCloudflared(\n localUrl: string,\n path: string,\n timeoutMs = 20_000,\n): Promise<TunnelSession> {\n const child = spawn(\"cloudflared\", [\"tunnel\", \"--url\", localUrl, \"--no-autoupdate\"], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const publicUrl = await waitForTunnelUrl(child, /https:\\/\\/[a-zA-Z0-9.-]+\\.trycloudflare\\.com/, timeoutMs);\n\n return {\n provider: \"cloudflared\",\n publicUrl,\n mcpUrl: appendPath(publicUrl, path),\n close() {\n child.kill(\"SIGTERM\");\n },\n };\n}\n\n/** Starts a Wrangler quick tunnel and waits for its public URL. */\nasync function startWrangler(\n localUrl: string,\n path: string,\n timeoutMs = 20_000,\n): Promise<TunnelSession> {\n const child = spawn(\"npx\", [\"--yes\", \"wrangler\", \"tunnel\", \"quick-start\", localUrl], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const publicUrl = await waitForTunnelUrl(child, /https:\\/\\/[a-zA-Z0-9.-]+\\.trycloudflare\\.com/, timeoutMs);\n\n return {\n provider: \"wrangler\",\n publicUrl,\n mcpUrl: appendPath(publicUrl, path),\n close() {\n child.kill(\"SIGTERM\");\n },\n };\n}\n\n/** Waits until a spawned tunnel process prints a matching HTTPS URL. */\nfunction waitForTunnelUrl(\n child: ChildProcess,\n pattern: RegExp,\n timeoutMs: number,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n let settled = false;\n const timeout = setTimeout(() => {\n if (!settled) {\n settled = true;\n child.kill(\"SIGTERM\");\n reject(new Error(\"Timed out waiting for HTTPS tunnel URL.\"));\n }\n }, timeoutMs);\n\n const inspect = (chunk: Buffer) => {\n const match = chunk.toString(\"utf8\").match(pattern);\n if (match?.[0] && !settled) {\n settled = true;\n clearTimeout(timeout);\n resolve(match[0]);\n }\n };\n\n child.stdout?.on(\"data\", inspect);\n child.stderr?.on(\"data\", inspect);\n child.once(\"error\", (error) => {\n if (!settled) {\n settled = true;\n clearTimeout(timeout);\n reject(error);\n }\n });\n child.once(\"exit\", (code) => {\n if (!settled) {\n settled = true;\n clearTimeout(timeout);\n reject(new Error(`Tunnel process exited before producing a URL${code === null ? \"\" : ` with code ${code}`}.`));\n }\n });\n });\n}\n\n/** Returns true when a command can be resolved from PATH. */\nfunction hasCommand(command: string): boolean {\n return spawnSync(\"which\", [command], { stdio: \"ignore\" }).status === 0;\n}\n\n/** Runs an installation command with inherited stdio. */\nfunction runInherited(command: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: \"inherit\" });\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`${command} ${args.join(\" \")} exited with code ${code}.`));\n }\n });\n });\n}\n\n/** Appends the MCP endpoint path to a tunnel origin. */\nfunction appendPath(origin: string, path: string): string {\n return `${origin.replace(/\\/+$/, \"\")}/${path.replace(/^\\/+/, \"\")}`;\n}\n"],"mappings":"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","names":["existsSync","mkdir","readFile","writeFile","createServer","path","createInterface","stdin","stdout","path","Node","SyntaxKind","path","stripUndefined","path","Node","structured","existsSync","path","Node","path","existsSync","stripUndefined","Node","isRecord","path","readObjectProperty","readBooleanProperty","Node","SyntaxKind","readStringProperty","readStringArrayProperty","mkdir","writeFile","path","path","Node","SyntaxKind","path","Node","readObjectProperty","SyntaxKind","existsSync","readFile","path","mkdir","writeFile","path","path","mkdir","writeFile","mkdir","writeFile","path","readFile","path","path","readFile","mkdir","readdir","readFile","writeFile","path","path","readdir","mkdir","readFile","writeFile","stripUndefined","mkdir","readdir","readFile","writeFile","path","path","mkdir","readdir","readFile","writeFile","stripUndefined","mkdir","readdir","readFile","writeFile","path","Node","Project","SyntaxKind","path","readdir","readFile","mkdir","writeFile","Project","Node","stripUndefined","readStringProperty","SyntaxKind","cp","lstat","path","path","cp","lstat","existsSync","cp","lstat","mkdir","readdir","readFile","writeFile","path","path","mkdir","readdir","existsSync","cp","readFile","writeFile","lstat","path","mkdir","writeFile","stripUndefined","readdir","path","Node","SyntaxKind","path","getOptionalStringProperty","getRequiredStringProperty","readdir","Node","readObjectProperty","readBooleanProperty","SyntaxKind","readStringArrayProperty","readdir","path","Node","SyntaxKind","path","getRequiredStringProperty","getOptionalStringProperty","readIcons","readAnnotations","getMethodOrFunctionProperty","readBooleanProperty","readdir","Node","SyntaxKind","readObjectProperty","readStringArrayProperty","path","mkdir","writeFile","randomUUID","stripUndefined","randomUUID","path","path","path","readFile","createServer","stdin","mkdir","writeFile","question","createInterface","stdout","escapeHtml","existsSync"]}