{"version":3,"file":"hub.mjs","names":["createServer","URL","err","#autoActivateGraceMs","#extensions","#activeId","#autoActivateTimer","unrefTimer","getRecordProperty","MCP_INSTRUCTIONS"],"sources":["../../shared/dist/index.js","../src/asset-utils.ts","../src/config.ts","../src/security.ts","../src/asset-http-server.ts","../src/asset-store.ts","../src/extension-registry.ts","../src/extension-socket.ts","../src/instructions.md?raw","../src/request.ts","../src/tools.ts","../src/websocket-server.ts","../src/hub.ts"],"sourcesContent":["import { z } from \"zod\";\n//#region src/mcp/constants.ts\nconst MCP_PORT_CANDIDATES = [\n\t6220,\n\t7431,\n\t8127\n];\nconst MCP_MAX_PAYLOAD_BYTES = 4 * 1024 * 1024;\nconst MCP_TOOL_INLINE_BUDGET_BYTES = 64 * 1024;\nconst MCP_TOOL_TIMEOUT_MS = 15e3;\nconst MCP_AUTO_ACTIVATE_GRACE_MS = 1500;\nconst MCP_MAX_ASSET_BYTES = 8 * 1024 * 1024;\nconst MCP_MAX_ASSET_STORE_BYTES = 256 * 1024 * 1024;\nconst MCP_MAX_CONCURRENT_ASSET_UPLOADS = 4;\nconst MCP_MAX_EXTENSION_CONNECTIONS = 16;\nconst MCP_ASSET_TTL_MS = 720 * 60 * 60 * 1e3;\nconst MCP_HASH_HEX_LENGTH = 8;\nconst MCP_HASH_PATTERN = new RegExp(`^[a-f0-9]{8}$`, \"i\");\n//#endregion\n//#region src/mcp/errors.ts\nconst TEMPAD_MCP_ERROR_CODES = {\n\tNO_ACTIVE_EXTENSION: \"NO_ACTIVE_EXTENSION\",\n\tEXTENSION_TIMEOUT: \"EXTENSION_TIMEOUT\",\n\tEXTENSION_DISCONNECTED: \"EXTENSION_DISCONNECTED\",\n\tINVALID_SELECTION: \"INVALID_SELECTION\",\n\tNODE_NOT_VISIBLE: \"NODE_NOT_VISIBLE\",\n\tASSET_SERVER_NOT_CONFIGURED: \"ASSET_SERVER_NOT_CONFIGURED\",\n\tTRANSPORT_NOT_CONNECTED: \"TRANSPORT_NOT_CONNECTED\"\n};\nconst TempadMcpErrorPayloadSchema = z.object({\n\tcode: z.enum(TEMPAD_MCP_ERROR_CODES).optional(),\n\tmessage: z.string().min(1)\n}).strict();\n//#endregion\n//#region src/mcp/tool-result.ts\nconst TOOL_RESULT_OUTCOME_ERROR = \"Tool results must contain exactly one defined payload or error.\";\nfunction hasToolResultOutcome(result) {\n\treturn result.payload !== void 0 !== (result.error !== void 0);\n}\n//#endregion\n//#region src/mcp/browser-gateway.ts\nconst TEMPAD_MCP_BROWSER_SOURCE = \"tempad-dev:mcp\";\nconst TEMPAD_MCP_BROWSER_PROTOCOL_VERSION = 1;\nconst TEMPAD_MCP_SESSION_PORT_NAME = \"tempad-mcp-session\";\nconst TEMPAD_MCP_FIGMA_ORIGIN = \"https://www.figma.com\";\nconst MCP_MAX_ASSET_BASE64_LENGTH = 4 * Math.ceil(MCP_MAX_ASSET_BYTES / 3);\nconst MessageBaseSchema = z.object({\n\tsource: z.literal(TEMPAD_MCP_BROWSER_SOURCE),\n\tversion: z.literal(1)\n}).strict();\nconst PageMessageBaseSchema = MessageBaseSchema.extend({ sessionId: z.string().min(1) }).strict();\nfunction messageSchema(base, type, shape) {\n\treturn base.extend({\n\t\ttype: z.literal(type),\n\t\t...shape\n\t}).strict();\n}\nconst AssetMetadataSchema = z.object({\n\theight: z.number().int().positive().optional(),\n\tthemeable: z.boolean().optional(),\n\twidth: z.number().int().positive().optional()\n}).strict();\nconst AssetUploadPayloadSchema = z.object({\n\tbase64: z.string().min(1).max(MCP_MAX_ASSET_BASE64_LENGTH),\n\thash: z.string().regex(MCP_HASH_PATTERN),\n\tmetadata: AssetMetadataSchema.optional(),\n\tmimeType: z.string().min(1)\n}).strict();\nconst PageEnableMessageSchema = messageSchema(PageMessageBaseSchema, \"mcp.enable\", {});\nconst PageDisableMessageSchema = messageSchema(PageMessageBaseSchema, \"mcp.disable\", {});\nconst PageActivateSessionMessageSchema = messageSchema(PageMessageBaseSchema, \"mcp.activateSession\", {});\nconst PageToolResultMessageSchema = messageSchema(PageMessageBaseSchema, \"mcp.toolResult\", {\n\tcallId: z.string().min(1),\n\terror: TempadMcpErrorPayloadSchema.optional(),\n\tpayload: z.unknown().optional()\n});\nconst PageAssetUploadMessageSchema = messageSchema(PageMessageBaseSchema, \"mcp.uploadAsset\", {\n\tpayload: AssetUploadPayloadSchema,\n\trequestId: z.string().min(1)\n});\nconst PageToBridgeMessageSchema = z.discriminatedUnion(\"type\", [\n\tPageEnableMessageSchema,\n\tPageDisableMessageSchema,\n\tPageActivateSessionMessageSchema,\n\tPageToolResultMessageSchema,\n\tPageAssetUploadMessageSchema\n]).refine((message) => {\n\treturn message.type !== \"mcp.toolResult\" || hasToolResultOutcome(message);\n}, { message: TOOL_RESULT_OUTCOME_ERROR });\nconst McpBrowserStateStatusSchema = z.enum([\n\t\"disabled\",\n\t\"connecting\",\n\t\"connected\",\n\t\"error\"\n]);\nconst McpBrowserStatePayloadSchema = z.object({\n\tactiveSessionId: z.string().nullable(),\n\tassetServerUrl: z.string().nullable().optional(),\n\terrorMessage: z.string().nullable(),\n\tsessionCount: z.number().nonnegative(),\n\tsessionId: z.string(),\n\tstatus: McpBrowserStateStatusSchema\n}).strict();\nconst BridgeStateMessageSchema = messageSchema(MessageBaseSchema, \"mcp.state\", { payload: McpBrowserStatePayloadSchema });\nconst BridgeToolCallMessageSchema = messageSchema(MessageBaseSchema, \"mcp.toolCall\", {\n\tcallId: z.string().min(1),\n\tpayload: z.object({\n\t\targs: z.unknown().optional(),\n\t\tname: z.string()\n\t}).strict()\n});\nconst BridgeAssetUploadResultMessageSchema = messageSchema(MessageBaseSchema, \"mcp.assetUploadResult\", {\n\terror: TempadMcpErrorPayloadSchema.optional(),\n\trequestId: z.string().min(1),\n\tsessionId: z.string().min(1)\n});\nconst BridgeToPageMessageSchema = z.discriminatedUnion(\"type\", [\n\tBridgeStateMessageSchema,\n\tBridgeToolCallMessageSchema,\n\tBridgeAssetUploadResultMessageSchema\n]);\nfunction createParser(schema) {\n\treturn (data) => {\n\t\tconst result = schema.safeParse(data);\n\t\treturn result.success ? result.data : null;\n\t};\n}\nconst parsePageToBridgeMessage = createParser(PageToBridgeMessageSchema);\nconst parseBridgeToPageMessage = createParser(BridgeToPageMessageSchema);\n//#endregion\n//#region src/mcp/install.ts\nconst SERVER_NAME = \"tempad-dev\";\nconst SERVER_COMMAND = \"npx\";\nconst SERVER_ARGS = [\"-y\", \"@tempad-dev/mcp@latest\"];\nconst REPOSITORY = \"ecomfe/tempad-dev\";\nconst MARKETPLACE_NAME = \"tempad-dev\";\nconst PLUGIN_NAME = \"tempad-dev\";\nconst SKILL_URL = \"https://github.com/ecomfe/tempad-dev/tree/main/skill\";\nconst SKILL_INSTALL_COMMAND = `npx skills add ${SKILL_URL}`;\nconst stdioConfig = {\n\ttype: \"stdio\",\n\tcommand: SERVER_COMMAND,\n\targs: [...SERVER_ARGS]\n};\nconst commandConfig = {\n\tcommand: SERVER_COMMAND,\n\targs: [...SERVER_ARGS]\n};\nfunction toBase64(input) {\n\tif (typeof globalThis.btoa === \"function\") return globalThis.btoa(input);\n\tconst bufferLike = globalThis.Buffer;\n\tif (bufferLike) return bufferLike.from(input, \"utf8\").toString(\"base64\");\n\tthrow new Error(\"Base64 encoding not supported in this environment.\");\n}\nfunction buildVscodeDeepLink() {\n\treturn `vscode:mcp/install?${encodeURIComponent(JSON.stringify({\n\t\tname: SERVER_NAME,\n\t\t...stdioConfig\n\t}))}`;\n}\nfunction buildCursorConfigBase64() {\n\treturn encodeURIComponent(toBase64(JSON.stringify(commandConfig)));\n}\nfunction buildCursorDeepLink() {\n\treturn `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(SERVER_NAME)}&config=${buildCursorConfigBase64()}`;\n}\nfunction buildTraeDeepLink(protocol) {\n\treturn `${protocol}://trae.ai-ide/mcp-import?type=stdio&name=${encodeURIComponent(SERVER_NAME)}&config=${buildCursorConfigBase64()}`;\n}\nfunction buildCodexConfigSnippet() {\n\treturn [\n\t\t`[mcp_servers.${SERVER_NAME}]`,\n\t\t`command = ${JSON.stringify(SERVER_COMMAND)}`,\n\t\t`args = [${SERVER_ARGS.map((arg) => JSON.stringify(arg)).join(\", \")}]`\n\t].join(\"\\n\");\n}\nfunction buildMcpConfigSnippet() {\n\treturn JSON.stringify({ mcpServers: { [SERVER_NAME]: commandConfig } }, null, 2);\n}\nconst OPENCODE_CONFIG_SNIPPET = JSON.stringify({\n\t$schema: \"https://opencode.ai/config.json\",\n\tmcp: { [SERVER_NAME]: {\n\t\ttype: \"local\",\n\t\tcommand: [SERVER_COMMAND, ...SERVER_ARGS]\n\t} }\n}, null, 2);\nfunction buildCliCommand(prefix) {\n\tconst args = `${SERVER_COMMAND} ${SERVER_ARGS.join(\" \")}`;\n\tif (prefix === \"claude\") return `claude mcp add --transport stdio \"${SERVER_NAME}\" -- ${args}`;\n\tif (prefix === \"gemini\") return `gemini mcp add --scope user \"${SERVER_NAME}\" ${args}`;\n\tif (prefix === \"vscode\") return `code --add-mcp '${JSON.stringify({\n\t\tname: SERVER_NAME,\n\t\t...commandConfig\n\t})}'`;\n\treturn `codex mcp add \"${SERVER_NAME}\" -- ${args}`;\n}\nfunction buildPluginSetupCommand(prefix) {\n\tif (prefix === \"claude\") return [`claude plugin marketplace add ${REPOSITORY}`, `claude plugin install ${PLUGIN_NAME}@${MARKETPLACE_NAME}`].join(\" && \");\n\treturn [`codex plugin marketplace add ${REPOSITORY} --ref main`, `codex plugin add ${PLUGIN_NAME}@${MARKETPLACE_NAME}`].join(\" && \");\n}\nfunction buildPluginSetupDeepLink(prefix) {\n\tconst prompt = `Install the TemPad Dev agent plugin by running this command, then confirm that its MCP server and figma-design-to-code skill are available:\\n\\n${buildPluginSetupCommand(prefix)}`;\n\treturn `${prefix === \"claude\" ? \"claude-cli://open?q=\" : \"codex://new?prompt=\"}${encodeURIComponent(prompt)}`;\n}\nfunction buildSkillInstallCommand(...agents) {\n\treturn `${SKILL_INSTALL_COMMAND} --global ${agents.map((agent) => `--agent ${agent}`).join(\" \")}`;\n}\nfunction getMcpClientCopyPayload(client, variant = \"primary\") {\n\tif (variant === \"alternate\" && client.alternateCopyText && client.alternateCopyKind) return {\n\t\ttext: client.alternateCopyText,\n\t\tkind: client.alternateCopyKind\n\t};\n\tif (!client.copyText) return null;\n\treturn {\n\t\ttext: client.copyText,\n\t\tkind: client.copyKind === \"config\" ? \"config\" : \"command\"\n\t};\n}\nfunction getNextMcpClientCopyVariant(client, currentVariant = \"primary\") {\n\tif (!client.alternateCopyText || !client.alternateCopyKind) return \"primary\";\n\treturn currentVariant === \"alternate\" ? \"primary\" : \"alternate\";\n}\nconst MCP_SERVER = {\n\tname: SERVER_NAME,\n\tcommand: SERVER_COMMAND,\n\targs: [...SERVER_ARGS]\n};\nconst MCP_DEFAULT_CONFIG_SNIPPET = JSON.stringify({ [SERVER_NAME]: commandConfig }, null, 2);\nconst MCP_SERVERS_CONFIG_SNIPPET = buildMcpConfigSnippet();\nconst AGENT_SKILL_INSTALL_COMMAND = SKILL_INSTALL_COMMAND;\nconst MCP_CLIENTS_BY_ID = {\n\tvscode: {\n\t\tid: \"vscode\",\n\t\tname: \"VS Code\",\n\t\tbrandColor: \"#0098ff\",\n\t\tsupportsDeepLink: true,\n\t\tdeepLink: buildVscodeDeepLink()\n\t},\n\tcursor: {\n\t\tid: \"cursor\",\n\t\tname: \"Cursor\",\n\t\tbrandColor: [\"#000\", \"#fff\"],\n\t\tsupportsDeepLink: true,\n\t\tdeepLink: buildCursorDeepLink()\n\t},\n\tclaude: {\n\t\tid: \"claude\",\n\t\tname: \"Claude Code\",\n\t\tbrandColor: \"#D97757\",\n\t\tsupportsDeepLink: false,\n\t\tcopyText: buildCliCommand(\"claude\"),\n\t\tcopyKind: \"command\"\n\t},\n\tcodex: {\n\t\tid: \"codex\",\n\t\tname: \"Codex\",\n\t\tbrandColor: [\"#0d0d0d\", \"#fff\"],\n\t\tsupportsDeepLink: false,\n\t\tcopyText: buildCliCommand(\"codex\"),\n\t\tcopyKind: \"command\",\n\t\talternateCopyText: buildCodexConfigSnippet(),\n\t\talternateCopyKind: \"config\"\n\t},\n\tgemini: {\n\t\tid: \"gemini\",\n\t\tname: \"Gemini\",\n\t\tbrandColor: \"#4e6ef2\",\n\t\tsupportsDeepLink: false,\n\t\tcopyText: buildCliCommand(\"gemini\"),\n\t\tcopyKind: \"command\",\n\t\talternateCopyText: buildMcpConfigSnippet(),\n\t\talternateCopyKind: \"config\"\n\t},\n\topencode: {\n\t\tid: \"opencode\",\n\t\tname: \"OpenCode\",\n\t\tbrandColor: [\"#211e1e\", \"#f1ecec\"],\n\t\tsupportsDeepLink: false,\n\t\tcopyText: OPENCODE_CONFIG_SNIPPET,\n\t\tcopyKind: \"config\"\n\t},\n\ttrae: {\n\t\tid: \"trae\",\n\t\tname: \"TRAE\",\n\t\tbrandColor: [\"#0fdc78\", \"#32f08c\"],\n\t\tsupportsDeepLink: true,\n\t\tdeepLink: buildTraeDeepLink(\"trae\"),\n\t\tfallbackDeepLink: buildTraeDeepLink(\"trae-cn\")\n\t}\n};\nconst MCP_CLIENTS = [\n\tMCP_CLIENTS_BY_ID.vscode,\n\tMCP_CLIENTS_BY_ID.cursor,\n\tMCP_CLIENTS_BY_ID.claude,\n\tMCP_CLIENTS_BY_ID.codex,\n\tMCP_CLIENTS_BY_ID.gemini,\n\tMCP_CLIENTS_BY_ID.opencode,\n\tMCP_CLIENTS_BY_ID.trae\n];\nconst AGENT_INTEGRATIONS_BY_ID = {\n\tcodex: {\n\t\tid: \"codex\",\n\t\tname: \"Codex\",\n\t\tactions: [{\n\t\t\tid: \"plugin-prompt\",\n\t\t\tlabel: \"Plugin install\",\n\t\t\tkind: \"deep-link\",\n\t\t\tvalue: buildPluginSetupDeepLink(\"codex\")\n\t\t}, {\n\t\t\tid: \"plugin-cli\",\n\t\t\tlabel: \"Plugin CLI\",\n\t\t\tkind: \"command\",\n\t\t\tvalue: buildPluginSetupCommand(\"codex\")\n\t\t}]\n\t},\n\tcursor: {\n\t\tid: \"cursor\",\n\t\tname: \"Cursor\",\n\t\tactions: [\n\t\t\t{\n\t\t\t\tid: \"mcp-deep-link\",\n\t\t\t\tlabel: \"MCP install\",\n\t\t\t\tkind: \"deep-link\",\n\t\t\t\tvalue: MCP_CLIENTS_BY_ID.cursor.deepLink ?? \"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"mcp-config\",\n\t\t\t\tlabel: \"MCP config\",\n\t\t\t\tkind: \"config\",\n\t\t\t\tvalue: buildMcpConfigSnippet()\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"skill-cli\",\n\t\t\t\tlabel: \"Agent skill\",\n\t\t\t\tkind: \"command\",\n\t\t\t\tvalue: buildSkillInstallCommand(\"cursor\")\n\t\t\t}\n\t\t]\n\t},\n\tclaude: {\n\t\tid: \"claude\",\n\t\tname: \"Claude Code\",\n\t\tactions: [{\n\t\t\tid: \"plugin-prompt\",\n\t\t\tlabel: \"Plugin install\",\n\t\t\tkind: \"deep-link\",\n\t\t\tvalue: buildPluginSetupDeepLink(\"claude\")\n\t\t}, {\n\t\t\tid: \"plugin-cli\",\n\t\t\tlabel: \"Plugin CLI\",\n\t\t\tkind: \"command\",\n\t\t\tvalue: buildPluginSetupCommand(\"claude\")\n\t\t}]\n\t},\n\tgemini: {\n\t\tid: \"gemini\",\n\t\tname: \"Gemini\",\n\t\tactions: [{\n\t\t\tid: \"mcp-cli\",\n\t\t\tlabel: \"MCP CLI\",\n\t\t\tkind: \"command\",\n\t\t\tvalue: buildCliCommand(\"gemini\")\n\t\t}, {\n\t\t\tid: \"skill-cli\",\n\t\t\tlabel: \"Agent skill\",\n\t\t\tkind: \"command\",\n\t\t\tvalue: `gemini skills install ${SKILL_URL}`\n\t\t}]\n\t},\n\tvscode: {\n\t\tid: \"vscode\",\n\t\tname: \"VS Code\",\n\t\tactions: [\n\t\t\t{\n\t\t\t\tid: \"mcp-deep-link\",\n\t\t\t\tlabel: \"MCP install\",\n\t\t\t\tkind: \"deep-link\",\n\t\t\t\tvalue: MCP_CLIENTS_BY_ID.vscode.deepLink ?? \"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"mcp-cli\",\n\t\t\t\tlabel: \"MCP CLI\",\n\t\t\t\tkind: \"command\",\n\t\t\t\tvalue: buildCliCommand(\"vscode\")\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"skill-cli\",\n\t\t\t\tlabel: \"Agent skill\",\n\t\t\t\tkind: \"command\",\n\t\t\t\tvalue: buildSkillInstallCommand(\"github-copilot\")\n\t\t\t}\n\t\t]\n\t},\n\topencode: {\n\t\tid: \"opencode\",\n\t\tname: \"OpenCode\",\n\t\tactions: [{\n\t\t\tid: \"mcp-config\",\n\t\t\tlabel: \"MCP config\",\n\t\t\tkind: \"config\",\n\t\t\tvalue: OPENCODE_CONFIG_SNIPPET\n\t\t}, {\n\t\t\tid: \"skill-cli\",\n\t\t\tlabel: \"Agent skill\",\n\t\t\tkind: \"command\",\n\t\t\tvalue: buildSkillInstallCommand(\"opencode\")\n\t\t}]\n\t},\n\ttrae: {\n\t\tid: \"trae\",\n\t\tname: \"TRAE\",\n\t\tactions: [{\n\t\t\tid: \"mcp-deep-link\",\n\t\t\tlabel: \"MCP install\",\n\t\t\tkind: \"deep-link\",\n\t\t\tvalue: MCP_CLIENTS_BY_ID.trae.deepLink ?? \"\",\n\t\t\tfallbackValue: MCP_CLIENTS_BY_ID.trae.fallbackDeepLink\n\t\t}, {\n\t\t\tid: \"skill-cli\",\n\t\t\tlabel: \"Agent skill\",\n\t\t\tkind: \"command\",\n\t\t\tvalue: buildSkillInstallCommand(\"trae\", \"trae-cn\")\n\t\t}]\n\t}\n};\nconst AGENT_INTEGRATIONS = [\n\tAGENT_INTEGRATIONS_BY_ID.codex,\n\tAGENT_INTEGRATIONS_BY_ID.cursor,\n\tAGENT_INTEGRATIONS_BY_ID.claude,\n\tAGENT_INTEGRATIONS_BY_ID.gemini,\n\tAGENT_INTEGRATIONS_BY_ID.vscode,\n\tAGENT_INTEGRATIONS_BY_ID.opencode,\n\tAGENT_INTEGRATIONS_BY_ID.trae\n];\n//#endregion\n//#region src/mcp/protocol.ts\nconst RegisteredMessageSchema = z.object({\n\ttype: z.literal(\"registered\"),\n\tid: z.string().min(1)\n}).strict();\nconst StateMessageSchema = z.object({\n\ttype: z.literal(\"state\"),\n\tactiveId: z.string().nullable(),\n\tassetServerUrl: z.string().url()\n}).strict();\nconst ToolCallPayloadSchema = z.object({\n\tname: z.string(),\n\targs: z.unknown()\n}).strict();\nconst ToolCallMessageSchema = z.object({\n\ttype: z.literal(\"toolCall\"),\n\tid: z.string().min(1),\n\tpayload: ToolCallPayloadSchema\n}).strict();\nconst MessageToExtensionSchema = z.discriminatedUnion(\"type\", [\n\tRegisteredMessageSchema,\n\tStateMessageSchema,\n\tToolCallMessageSchema\n]);\nconst ActivateMessageSchema = z.object({ type: z.literal(\"activate\") }).strict();\nconst ToolResultMessageSchema = z.object({\n\ttype: z.literal(\"toolResult\"),\n\tid: z.string().min(1),\n\tpayload: z.unknown().optional(),\n\terror: TempadMcpErrorPayloadSchema.optional()\n}).strict().refine(hasToolResultOutcome, { message: TOOL_RESULT_OUTCOME_ERROR });\nconst PingMessageSchema = z.object({ type: z.literal(\"ping\") }).strict();\nconst MessageFromExtensionSchema = z.union([\n\tActivateMessageSchema,\n\tToolResultMessageSchema,\n\tPingMessageSchema\n]);\nfunction parseJsonWithSchema(data, schema) {\n\tlet parsed;\n\ttry {\n\t\tparsed = JSON.parse(data);\n\t} catch {\n\t\treturn null;\n\t}\n\tconst result = schema.safeParse(parsed);\n\treturn result.success ? result.data : null;\n}\nfunction parseMessageToExtension(data) {\n\treturn parseJsonWithSchema(data, MessageToExtensionSchema);\n}\nfunction parseMessageFromExtension(data) {\n\treturn parseJsonWithSchema(data, MessageFromExtensionSchema);\n}\n//#endregion\n//#region src/mcp/responses.ts\nconst ENCODER = new TextEncoder();\nfunction utf8Bytes(value) {\n\treturn ENCODER.encode(serializeUtf8Value(value)).length;\n}\nfunction measureCallToolResultBytes(result) {\n\treturn utf8Bytes(result);\n}\nfunction buildGetCodeToolResult(payload) {\n\tconst summary = [];\n\tconst codeSize = utf8Bytes(payload.code);\n\tsummary.push(`Generated \\`${payload.lang}\\` snippet (${formatBytes(codeSize)}).`);\n\tif (payload.warnings?.length) summary.push(...payload.warnings.map((warning) => warning.message));\n\tsummary.push(payload.assets?.length ? `Assets attached: ${payload.assets.length}. Download bytes from each asset.url.` : \"No binary assets were attached to this response.\");\n\tconst tokenCount = payload.tokens ? Object.keys(payload.tokens).length : 0;\n\tif (tokenCount) summary.push(`Token references included: ${tokenCount}.`);\n\tsummary.push(\"Read structuredContent for the full code string and metadata.\");\n\treturn buildTextToolResult(summary.join(\"\\n\"), payload);\n}\nfunction buildGetStructureToolResult(payload) {\n\tconst roots = payload.roots.length;\n\tconst nodeCount = countOutlineNodes(payload.roots);\n\treturn buildTextToolResult(`${roots === 0 ? \"No structure nodes were returned.\" : `Returned structure outline with ${formatCount(roots, \"root\")} and ${formatCount(nodeCount, \"node\")}.`}\\nRead structuredContent for the full outline payload.`, payload);\n}\nfunction buildGetTokenDefsToolResult(payload) {\n\tconst count = Object.keys(payload).length;\n\treturn buildTextToolResult(`${count === 0 ? \"No token definitions were resolved.\" : `Resolved ${formatCount(count, \"token definition\")}.`}\\nRead structuredContent for token values and aliases.`, payload);\n}\nfunction buildGetScreenshotToolResult(payload) {\n\treturn buildTextToolResult(`${describeScreenshot(payload)} - Download: ${payload.asset.url}`, payload);\n}\nfunction buildGetAssetsToolResult(payload) {\n\tconst summary = [];\n\tsummary.push(payload.assets.length ? `Resolved ${formatCount(payload.assets.length, \"asset\")}.` : \"No assets were resolved for the requested hashes.\");\n\tif (payload.missing.length) summary.push(`Missing: ${payload.missing.join(\", \")}`);\n\tsummary.push(\"Download bytes from each asset.url.\");\n\treturn buildTextToolResult(summary.join(\"\\n\"), payload);\n}\nfunction buildTextToolResult(text, structuredContent) {\n\treturn {\n\t\tcontent: [{\n\t\t\ttype: \"text\",\n\t\t\ttext\n\t\t}],\n\t\tstructuredContent\n\t};\n}\nfunction serializeUtf8Value(value) {\n\tif (typeof value === \"string\") return value;\n\treturn JSON.stringify(value, null, 0) ?? \"undefined\";\n}\nfunction countOutlineNodes(nodes) {\n\tlet count = 0;\n\tconst stack = [...nodes];\n\twhile (stack.length) {\n\t\tconst current = stack.pop();\n\t\tif (!current) continue;\n\t\tcount += 1;\n\t\tif (current.children?.length) stack.push(...current.children);\n\t}\n\treturn count;\n}\nfunction formatBytes(bytes) {\n\tif (bytes < 1024) return `${bytes} B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\nfunction formatCount(count, singular) {\n\treturn `${count} ${count === 1 ? singular : `${singular}s`}`;\n}\nfunction describeScreenshot(result) {\n\treturn `Screenshot ${result.width}x${result.height} @${result.scale}x (${formatBytes(result.bytes)})`;\n}\n//#endregion\n//#region src/mcp/tools.ts\nconst AssetDescriptorSchema = z.object({\n\thash: z.string().regex(MCP_HASH_PATTERN),\n\turl: z.string().url(),\n\tmimeType: z.string().min(1),\n\tsize: z.number().int().nonnegative(),\n\twidth: z.number().int().positive().optional(),\n\theight: z.number().int().positive().optional(),\n\tthemeable: z.boolean().optional()\n});\nconst GetCodeParametersSchema = z.object({\n\tnodeId: z.string().describe(\"Optional target node id; omit to use the current single selection when pulling the baseline snapshot.\").optional(),\n\tpreferredLang: z.enum([\"jsx\", \"vue\"]).describe(\"Preferred output language to bias the snapshot; otherwise uses the design’s hint/detected language, then falls back to JSX.\").optional(),\n\tresolveTokens: z.boolean().describe(\"Inline token values instead of references for quick renders; default false returns token metadata so you can map into your theming system. When true, values are resolved per-node (mode-aware).\").optional(),\n\tvectorMode: z.enum([\"smart\", \"snapshot\"]).describe(\"Vector output mode. `smart` (default) emits `<svg data-src=\\\"...\\\">` placeholders in code and preserves themeable instance color on the emitted SVG root markup for downstream adaptation; if asset upload fails after export, the tool may inline the SVG as a fallback to preserve source of truth. `snapshot` preserves vector assets for fidelity. Final vector delivery may still be adapted to the Host app’s SVG policy.\").optional()\n});\nconst GetTokenDefsParametersSchema = z.object({\n\tnames: z.array(z.string().regex(/^--[a-zA-Z0-9-_]+$/)).min(1).describe(\"Canonical token names (CSS variable form) from Object.keys(get_code.tokens) or your own list to resolve, e.g., --color-primary.\"),\n\tincludeAllModes: z.boolean().describe(\"Include all token modes (light/dark/etc.) instead of just the active one to mirror responsive tokens; default false.\").optional()\n});\nconst GetScreenshotParametersSchema = z.object({ nodeId: z.string().describe(\"Optional node id to screenshot; defaults to the current single selection. Useful when layout/overlap is uncertain (auto-layout none/inferred).\").optional() });\nconst GetStructureParametersSchema = z.object({\n\tnodeId: z.string().describe(\"Optional node id to outline; defaults to the current single selection. Useful when auto-layout hints are none/inferred or you need explicit geometry for refactors.\").optional(),\n\toptions: z.object({ depth: z.number().int().positive().describe(\"Limit traversal depth; defaults to full tree (subject to safety caps).\").optional() }).optional()\n});\nconst GetAssetsParametersSchema = z.object({ hashes: z.array(z.string().regex(MCP_HASH_PATTERN)).min(1).describe(\"Asset hashes returned from get_code (or other tools) to download/resolve exact bytes for rasterized images or SVGs before routing through your asset pipeline.\") });\nconst GetAssetsResultSchema = z.object({\n\tassets: z.array(AssetDescriptorSchema),\n\tmissing: z.array(z.string().regex(MCP_HASH_PATTERN))\n});\n//#endregion\nexport { AGENT_INTEGRATIONS, AGENT_INTEGRATIONS_BY_ID, AGENT_SKILL_INSTALL_COMMAND, ActivateMessageSchema, AssetDescriptorSchema, BridgeToPageMessageSchema, GetAssetsParametersSchema, GetAssetsResultSchema, GetCodeParametersSchema, GetScreenshotParametersSchema, GetStructureParametersSchema, GetTokenDefsParametersSchema, MCP_ASSET_TTL_MS, MCP_AUTO_ACTIVATE_GRACE_MS, MCP_CLIENTS, MCP_CLIENTS_BY_ID, MCP_DEFAULT_CONFIG_SNIPPET, MCP_HASH_HEX_LENGTH, MCP_HASH_PATTERN, MCP_MAX_ASSET_BYTES, MCP_MAX_ASSET_STORE_BYTES, MCP_MAX_CONCURRENT_ASSET_UPLOADS, MCP_MAX_EXTENSION_CONNECTIONS, MCP_MAX_PAYLOAD_BYTES, MCP_PORT_CANDIDATES, MCP_SERVER, MCP_SERVERS_CONFIG_SNIPPET, MCP_TOOL_INLINE_BUDGET_BYTES, MCP_TOOL_TIMEOUT_MS, McpBrowserStatePayloadSchema, MessageFromExtensionSchema, MessageToExtensionSchema, PageToBridgeMessageSchema, PingMessageSchema, RegisteredMessageSchema, StateMessageSchema, TEMPAD_MCP_BROWSER_PROTOCOL_VERSION, TEMPAD_MCP_BROWSER_SOURCE, TEMPAD_MCP_ERROR_CODES, TEMPAD_MCP_FIGMA_ORIGIN, TEMPAD_MCP_SESSION_PORT_NAME, TempadMcpErrorPayloadSchema, ToolCallMessageSchema, ToolCallPayloadSchema, ToolResultMessageSchema, buildGetAssetsToolResult, buildGetCodeToolResult, buildGetScreenshotToolResult, buildGetStructureToolResult, buildGetTokenDefsToolResult, getMcpClientCopyPayload, getNextMcpClientCopyVariant, measureCallToolResultBytes, parseBridgeToPageMessage, parseMessageFromExtension, parseMessageToExtension, parsePageToBridgeMessage, utf8Bytes };\n","import { MCP_HASH_HEX_LENGTH } from '@tempad-dev/shared'\n\nconst HASH_FILENAME_PATTERN = new RegExp(\n  `^([a-f0-9]{${MCP_HASH_HEX_LENGTH}})(?:\\\\.[a-z0-9]+)?$`,\n  'i'\n)\n\nconst MIME_EXTENSION_OVERRIDES = new Map<string, string>([['image/jpeg', 'jpg']])\nconst SAFE_IMAGE_EXTENSION_PATTERN = /^[a-z0-9-]+$/\n\nexport function normalizeMimeType(mimeType: string | undefined): string {\n  if (!mimeType) return 'application/octet-stream'\n  const [normalized] = mimeType.split(';', 1)\n  return (normalized || 'application/octet-stream').trim().toLowerCase()\n}\n\nexport function getImageExtension(mimeType: string): string {\n  const normalized = normalizeMimeType(mimeType)\n  if (!normalized.startsWith('image/')) return ''\n  const override = MIME_EXTENSION_OVERRIDES.get(normalized)\n  if (override) return `.${override}`\n  const subtype = normalized.slice('image/'.length)\n  if (!subtype) return ''\n  const ext = subtype.split('+', 1)[0] || subtype\n  if (!SAFE_IMAGE_EXTENSION_PATTERN.test(ext)) return ''\n  return `.${ext}`\n}\n\nexport function buildAssetFilename(hash: string, mimeType: string): string {\n  const ext = getImageExtension(mimeType)\n  return ext ? `${hash}${ext}` : hash\n}\n\nexport function getHashFromAssetFilename(filename: string): string | null {\n  const match = HASH_FILENAME_PATTERN.exec(filename)\n  return match ? match[1] : null\n}\n","import {\n  MCP_AUTO_ACTIVATE_GRACE_MS,\n  MCP_ASSET_TTL_MS,\n  MCP_MAX_ASSET_BYTES,\n  MCP_MAX_ASSET_STORE_BYTES,\n  MCP_MAX_CONCURRENT_ASSET_UPLOADS,\n  MCP_MAX_EXTENSION_CONNECTIONS,\n  MCP_MAX_PAYLOAD_BYTES,\n  MCP_PORT_CANDIDATES,\n  MCP_TOOL_TIMEOUT_MS\n} from '@tempad-dev/shared'\n\nfunction parsePositiveInt(envValue: string | undefined, fallback: number): number {\n  const parsed = envValue ? Number.parseInt(envValue, 10) : Number.NaN\n  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback\n}\n\nfunction parseNonNegativeInt(envValue: string | undefined, fallback: number): number {\n  const parsed = envValue ? Number.parseInt(envValue, 10) : Number.NaN\n  return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback\n}\n\nfunction resolveToolTimeoutMs(): number {\n  return parsePositiveInt(process.env.TEMPAD_MCP_TOOL_TIMEOUT, MCP_TOOL_TIMEOUT_MS)\n}\n\nfunction resolveAutoActivateGraceMs(): number {\n  return parsePositiveInt(process.env.TEMPAD_MCP_AUTO_ACTIVATE_GRACE, MCP_AUTO_ACTIVATE_GRACE_MS)\n}\n\nfunction resolveMaxAssetSizeBytes(): number {\n  return parsePositiveInt(process.env.TEMPAD_MCP_MAX_ASSET_BYTES, MCP_MAX_ASSET_BYTES)\n}\n\nfunction resolveAssetTtlMs(): number {\n  return parseNonNegativeInt(process.env.TEMPAD_MCP_ASSET_TTL_MS, MCP_ASSET_TTL_MS)\n}\n\nfunction resolveMaxAssetStoreBytes(): number {\n  return parsePositiveInt(process.env.TEMPAD_MCP_MAX_ASSET_STORE_BYTES, MCP_MAX_ASSET_STORE_BYTES)\n}\n\nfunction resolveMaxConcurrentAssetUploads(): number {\n  return parsePositiveInt(\n    process.env.TEMPAD_MCP_MAX_CONCURRENT_ASSET_UPLOADS,\n    MCP_MAX_CONCURRENT_ASSET_UPLOADS\n  )\n}\n\nfunction resolveMaxExtensionConnections(): number {\n  return parsePositiveInt(\n    process.env.TEMPAD_MCP_MAX_EXTENSION_CONNECTIONS,\n    MCP_MAX_EXTENSION_CONNECTIONS\n  )\n}\n\nexport function getMcpServerConfig() {\n  return {\n    wsPortCandidates: [...MCP_PORT_CANDIDATES],\n    toolTimeoutMs: resolveToolTimeoutMs(),\n    maxPayloadBytes: MCP_MAX_PAYLOAD_BYTES,\n    autoActivateGraceMs: resolveAutoActivateGraceMs(),\n    maxAssetSizeBytes: resolveMaxAssetSizeBytes(),\n    maxAssetStoreBytes: resolveMaxAssetStoreBytes(),\n    maxConcurrentAssetUploads: resolveMaxConcurrentAssetUploads(),\n    maxExtensionConnections: resolveMaxExtensionConnections(),\n    allowedExtensionOrigins: process.env.TEMPAD_MCP_ALLOWED_EXTENSION_ORIGINS,\n    assetTtlMs: resolveAssetTtlMs()\n  }\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto'\n\nconst CHROME_EXTENSION_ORIGIN_PATTERN = /^chrome-extension:\\/\\/[a-p]{32}$/\n\nexport type ExtensionOriginPolicy = {\n  exactOrigins: ReadonlySet<string>\n  mode: 'any-extension' | 'exact'\n}\n\nexport function createCapabilityToken(): string {\n  return randomBytes(32).toString('base64url')\n}\n\nexport function createExtensionOriginPolicy(value: string | undefined): ExtensionOriginPolicy {\n  const configuredOrigins = (value ?? '')\n    .split(',')\n    .map((origin) => origin.trim().toLowerCase())\n    .filter(Boolean)\n  const invalidOrigin = configuredOrigins.find((origin) => !isChromeExtensionOrigin(origin))\n  if (invalidOrigin) {\n    throw new Error(`Invalid allowed extension Origin: ${invalidOrigin}`)\n  }\n  const exactOrigins = new Set(configuredOrigins)\n\n  return {\n    exactOrigins,\n    mode: exactOrigins.size ? 'exact' : 'any-extension'\n  }\n}\n\nexport function isAllowedExtensionOrigin(\n  origin: string | undefined,\n  policy: ExtensionOriginPolicy\n): boolean {\n  if (!origin) return false\n  const normalized = origin.toLowerCase()\n  if (!isChromeExtensionOrigin(normalized)) return false\n  return policy.mode === 'any-extension' || policy.exactOrigins.has(normalized)\n}\n\nexport function isAllowedWebSocketRequest(\n  origin: string | undefined,\n  requestUrl: string | undefined,\n  policy: ExtensionOriginPolicy\n): boolean {\n  if (!isAllowedExtensionOrigin(origin, policy)) return false\n  if (!requestUrl) return false\n\n  try {\n    const baseUrl = 'ws://127.0.0.1'\n    const url = new URL(requestUrl, baseUrl)\n    return url.origin === baseUrl && url.pathname === '/' && url.search === ''\n  } catch {\n    return false\n  }\n}\n\nexport function secretsEqual(candidate: string, expected: string): boolean {\n  const candidateBuffer = Buffer.from(candidate)\n  const expectedBuffer = Buffer.from(expected)\n  return (\n    candidateBuffer.length === expectedBuffer.length &&\n    timingSafeEqual(candidateBuffer, expectedBuffer)\n  )\n}\n\nfunction isChromeExtensionOrigin(origin: string): boolean {\n  return CHROME_EXTENSION_ORIGIN_PATTERN.test(origin)\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\n\nimport { MCP_HASH_HEX_LENGTH } from '@tempad-dev/shared'\nimport { nanoid } from 'nanoid'\nimport { createHash } from 'node:crypto'\nimport {\n  createReadStream,\n  createWriteStream,\n  existsSync,\n  renameSync,\n  statSync,\n  unlinkSync\n} from 'node:fs'\nimport { createServer } from 'node:http'\nimport { join } from 'node:path'\nimport { pipeline, Transform } from 'node:stream'\nimport { URL } from 'node:url'\n\nimport type { AssetStore } from './asset-store'\nimport type { AssetRecord } from './types'\n\nimport { buildAssetFilename, getHashFromAssetFilename, normalizeMimeType } from './asset-utils'\nimport { getMcpServerConfig } from './config'\nimport {\n  createCapabilityToken,\n  createExtensionOriginPolicy,\n  isAllowedExtensionOrigin,\n  secretsEqual\n} from './security'\nimport { ASSET_DIR, log } from './shared'\n\nconst LOOPBACK_HOST = '127.0.0.1'\nconst HASH_HEX_PATTERN = new RegExp(`^[a-f0-9]{${MCP_HASH_HEX_LENGTH}}$`, 'i')\nconst ASSET_REQUEST_TIMEOUT_MS = 15_000\nconst ASSET_HEADERS_TIMEOUT_MS = 5_000\nconst ASSET_KEEP_ALIVE_TIMEOUT_MS = 5_000\nconst ASSET_MAX_HEADERS = 32\nconst ASSET_MAX_CONNECTIONS = 128\nconst ASSET_MAX_CONCURRENT_DOWNLOADS = 128\n\nexport interface AssetHttpServerOptions {\n  accessToken?: string\n  maxAssetSizeBytes?: number\n  maxAssetStoreBytes?: number\n  maxConcurrentUploads?: number\n  authorizeExtensionOrigin?: (origin: string) => boolean\n}\n\nexport interface AssetHttpServer {\n  start(): Promise<void>\n  stop(): void\n  getBaseUrl(): string\n}\n\nexport function createAssetHttpServer(\n  store: AssetStore,\n  options: AssetHttpServerOptions = {}\n): AssetHttpServer {\n  const config = getMcpServerConfig()\n  const accessToken = options.accessToken ?? createCapabilityToken()\n  const maxAssetSizeBytes = options.maxAssetSizeBytes ?? config.maxAssetSizeBytes\n  const maxAssetStoreBytes = options.maxAssetStoreBytes ?? config.maxAssetStoreBytes\n  const maxConcurrentUploads = options.maxConcurrentUploads ?? config.maxConcurrentAssetUploads\n  const originPolicy = createExtensionOriginPolicy(config.allowedExtensionOrigins)\n  const server = createServer(handleRequest)\n  server.requestTimeout = ASSET_REQUEST_TIMEOUT_MS\n  server.headersTimeout = ASSET_HEADERS_TIMEOUT_MS\n  server.keepAliveTimeout = ASSET_KEEP_ALIVE_TIMEOUT_MS\n  server.maxHeadersCount = ASSET_MAX_HEADERS\n  server.maxConnections = ASSET_MAX_CONNECTIONS\n  let port: number | null = null\n  let activeDownloads = 0\n  let activeUploads = 0\n  let reservedUploadBytes = 0\n\n  async function start(): Promise<void> {\n    if (port !== null) return\n    await new Promise<void>((resolve, reject) => {\n      const onError = (error: Error) => {\n        server.off('listening', onListening)\n        reject(error)\n      }\n      const onListening = () => {\n        server.off('error', onError)\n        const address = server.address()\n        if (address && typeof address === 'object') {\n          port = address.port\n          resolve()\n        } else {\n          reject(new Error('Failed to determine HTTP server port.'))\n        }\n      }\n      server.once('error', onError)\n      server.once('listening', onListening)\n      server.listen(0, LOOPBACK_HOST)\n    })\n    log.info({ port }, 'Asset HTTP server ready.')\n  }\n\n  function stop(): void {\n    if (port === null) return\n    server.close()\n    port = null\n  }\n\n  function getBaseUrl(): string {\n    if (port === null) throw new Error('Asset HTTP server is not running.')\n    return `http://${LOOPBACK_HOST}:${port}/${accessToken}`\n  }\n\n  function handleRequest(req: IncomingMessage, res: ServerResponse): void {\n    const startedAt = Date.now()\n    res.on('finish', () => {\n      log.info(\n        {\n          method: req.method,\n          route: redactAssetRequestUrl(req.url),\n          status: res.statusCode,\n          durationMs: Date.now() - startedAt\n        },\n        'HTTP asset request completed.'\n      )\n    })\n\n    if (!req.url) {\n      sendError(res, 400, 'Missing URL')\n      return\n    }\n\n    const url = new URL(req.url, getBaseUrl())\n    const segments = url.pathname.split('/').filter(Boolean)\n    if (\n      segments.length !== 3 ||\n      !secretsEqual(segments[0] ?? '', accessToken) ||\n      segments[1] !== 'assets'\n    ) {\n      sendError(res, 404, 'Not Found')\n      return\n    }\n\n    const origin = getHeader(req, 'origin')\n    if (\n      origin &&\n      (!isAllowedExtensionOrigin(origin, originPolicy) ||\n        (options.authorizeExtensionOrigin && !options.authorizeExtensionOrigin(origin)))\n    ) {\n      sendError(res, 403, 'Forbidden')\n      return\n    }\n\n    if (origin) {\n      res.setHeader('Access-Control-Allow-Origin', origin)\n      res.setHeader('Vary', 'Origin')\n      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')\n      res.setHeader(\n        'Access-Control-Allow-Headers',\n        'Content-Type, X-Asset-Width, X-Asset-Height, X-Asset-Themeable'\n      )\n    }\n\n    if (req.method === 'OPTIONS') {\n      res.writeHead(204)\n      res.end()\n      return\n    }\n\n    const filename = segments[2]\n    const hash = getHashFromAssetFilename(filename)\n    if (!hash) {\n      sendError(res, 404, 'Not Found')\n      return\n    }\n\n    if (req.method === 'POST') {\n      handleUpload(req, res, hash)\n      return\n    }\n\n    if (req.method === 'GET') {\n      handleDownload(req, res, hash)\n      return\n    }\n\n    sendError(res, 405, 'Method Not Allowed')\n  }\n\n  function handleDownload(req: IncomingMessage, res: ServerResponse, hash: string): void {\n    const record = store.get(hash)\n    if (!record) {\n      sendError(res, 404, 'Asset Not Found')\n      return\n    }\n\n    let stat\n    try {\n      stat = statSync(record.filePath)\n    } catch (error) {\n      const err = error as NodeJS.ErrnoException\n      if (err.code === 'ENOENT') {\n        store.remove(hash, { removeFile: false })\n        sendError(res, 404, 'Asset Not Found')\n      } else {\n        log.error({ error, hash }, 'Failed to stat asset file.')\n        sendError(res, 500, 'Internal Server Error')\n      }\n      return\n    }\n\n    if (activeDownloads >= ASSET_MAX_CONCURRENT_DOWNLOADS) {\n      res.setHeader('Connection', 'close')\n      sendError(res, 429, 'Too Many Concurrent Downloads')\n      return\n    }\n\n    activeDownloads += 1\n    let released = false\n    const release = () => {\n      if (released) return\n      released = true\n      activeDownloads -= 1\n    }\n    res.once('finish', release)\n    res.once('close', release)\n    res.setTimeout(ASSET_REQUEST_TIMEOUT_MS, () => res.destroy())\n\n    res.writeHead(200, {\n      'Content-Type': record.mimeType,\n      'Content-Length': stat.size.toString(),\n      'Cache-Control': 'private, max-age=31536000, immutable',\n      'Content-Disposition': `attachment; filename=\"${buildAssetFilename(hash, record.mimeType)}\"`,\n      'Content-Security-Policy': \"default-src 'none'; sandbox\",\n      'Referrer-Policy': 'no-referrer',\n      'X-Content-Type-Options': 'nosniff'\n    })\n\n    const stream = createReadStream(record.filePath)\n    stream.on('error', (error) => {\n      log.warn({ error, hash }, 'Failed to stream asset file.')\n      if (!res.headersSent) {\n        sendError(res, 500, 'Internal Server Error')\n      } else {\n        res.end()\n      }\n    })\n    stream.on('open', () => {\n      store.touch(hash)\n    })\n    stream.pipe(res)\n  }\n\n  function handleUpload(req: IncomingMessage, res: ServerResponse, hash: string): void {\n    if (!HASH_HEX_PATTERN.test(hash)) {\n      req.resume()\n      sendError(res, 400, 'Invalid Hash')\n      return\n    }\n\n    const declaredSize = parseContentLength(req)\n    if (declaredSize === 'invalid') {\n      req.resume()\n      sendError(res, 400, 'Invalid Content-Length')\n      return\n    }\n    if (declaredSize !== null && declaredSize > maxAssetSizeBytes) {\n      req.resume()\n      sendError(res, 413, 'Payload Too Large')\n      return\n    }\n\n    const mimeType = normalizeMimeType(getHeader(req, 'content-type'))\n    const filename = buildAssetFilename(hash, mimeType)\n    const filePath = join(ASSET_DIR, filename)\n\n    const width = parseInt(getHeader(req, 'x-asset-width') ?? '', 10)\n    const height = parseInt(getHeader(req, 'x-asset-height') ?? '', 10)\n    const themeable = getHeader(req, 'x-asset-themeable') === 'true'\n    const metadata: NonNullable<AssetRecord['metadata']> = {}\n    if (Number.isFinite(width) && width > 0) metadata.width = width\n    if (Number.isFinite(height) && height > 0) metadata.height = height\n    if (themeable) metadata.themeable = true\n    const assetMetadata = Object.keys(metadata).length ? metadata : undefined\n\n    const existing = store.get(hash)\n    if (existing) {\n      let existingPath = existing.filePath\n      if (!existsSync(existingPath) && existsSync(filePath)) {\n        existing.filePath = filePath\n        existingPath = filePath\n      }\n\n      if (existsSync(existingPath)) {\n        if (existingPath !== filePath) {\n          try {\n            renameSync(existingPath, filePath)\n            existing.filePath = filePath\n          } catch (error) {\n            log.warn({ error, hash }, 'Failed to rename existing asset to include extension.')\n          }\n        }\n\n        // Drain request to ensure connection is clean\n        req.resume()\n\n        if (assetMetadata) {\n          existing.metadata = {\n            ...existing.metadata,\n            ...assetMetadata\n          }\n        }\n        if (existing.mimeType !== mimeType) existing.mimeType = mimeType\n        existing.lastAccess = Date.now()\n        store.upsert(existing)\n        sendJson(res, 200, { message: 'Asset Already Exists' })\n        return\n      }\n    }\n\n    if (activeUploads >= maxConcurrentUploads) {\n      req.resume()\n      res.setHeader('Connection', 'close')\n      sendError(res, 429, 'Too Many Concurrent Uploads')\n      return\n    }\n\n    const reservationBytes = declaredSize ?? maxAssetSizeBytes\n    if (\n      getStoredAssetBytes(store, hash) + reservedUploadBytes + reservationBytes >\n      maxAssetStoreBytes\n    ) {\n      req.resume()\n      sendError(res, 507, 'Asset Store Quota Exceeded')\n      return\n    }\n\n    const tmpPath = `${filePath}.tmp.${nanoid()}`\n    const writeStream = createWriteStream(tmpPath)\n    const hasher = createHash('sha256')\n    let size = 0\n    activeUploads += 1\n    reservedUploadBytes += reservationBytes\n\n    const cleanup = () => {\n      if (existsSync(tmpPath)) {\n        try {\n          unlinkSync(tmpPath)\n        } catch (e) {\n          log.warn({ error: e, tmpPath }, 'Failed to cleanup temp file.')\n        }\n      }\n    }\n\n    const monitor = new Transform({\n      transform(chunk, encoding, callback) {\n        size += chunk.length\n        if (size > maxAssetSizeBytes) {\n          callback(new Error('PayloadTooLarge'))\n          return\n        }\n        hasher.update(chunk)\n        callback(null, chunk)\n      }\n    })\n\n    pipeline(req, monitor, writeStream, (err) => {\n      activeUploads -= 1\n      reservedUploadBytes -= reservationBytes\n      if (err) {\n        cleanup()\n        if (err.message === 'PayloadTooLarge') {\n          sendError(res, 413, 'Payload Too Large')\n        } else if (err.code === 'ERR_STREAM_PREMATURE_CLOSE') {\n          log.warn({ hash }, 'Upload request closed prematurely.')\n          sendError(res, 400, 'Upload Incomplete')\n        } else {\n          log.error({ error: err, hash }, 'Upload pipeline failed.')\n          if (!res.headersSent) {\n            sendError(res, 500, 'Internal Server Error')\n          }\n        }\n        return\n      }\n\n      const computedHash = hasher.digest('hex').slice(0, MCP_HASH_HEX_LENGTH)\n      if (computedHash !== hash) {\n        cleanup()\n        sendError(res, 400, 'Hash Mismatch')\n        return\n      }\n\n      if (getStoredAssetBytes(store, hash) + reservedUploadBytes + size > maxAssetStoreBytes) {\n        cleanup()\n        sendError(res, 507, 'Asset Store Quota Exceeded')\n        return\n      }\n\n      try {\n        renameSync(tmpPath, filePath)\n      } catch (error) {\n        log.error({ error, hash }, 'Failed to rename temp file to asset.')\n        cleanup()\n        sendError(res, 500, 'Internal Server Error')\n        return\n      }\n\n      store.upsert({\n        hash,\n        filePath,\n        mimeType,\n        size,\n        metadata: assetMetadata\n      })\n      log.info({ hash, size }, 'Stored uploaded asset via HTTP.')\n      sendJson(res, 201, { message: 'Created', hash, size })\n    })\n  }\n\n  function redactAssetRequestUrl(requestUrl: string | undefined): string | undefined {\n    if (!requestUrl) return requestUrl\n    try {\n      const url = new URL(requestUrl, `http://${LOOPBACK_HOST}`)\n      const segments = url.pathname.split('/').filter(Boolean)\n      if (segments.length >= 1 && secretsEqual(segments[0] ?? '', accessToken)) {\n        segments[0] = '<capability>'\n      }\n      return `/${segments.join('/')}`\n    } catch {\n      return '<invalid>'\n    }\n  }\n\n  function sendError(\n    res: ServerResponse,\n    status: number,\n    message: string,\n    details?: Record<string, unknown>\n  ): void {\n    sendJson(res, status, { error: message, ...details })\n  }\n\n  function sendJson(res: ServerResponse, status: number, payload: Record<string, unknown>): void {\n    if (!res.headersSent) {\n      res.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8' })\n    }\n    res.end(JSON.stringify(payload))\n  }\n\n  return {\n    start,\n    stop,\n    getBaseUrl\n  }\n}\n\nfunction getHeader(req: IncomingMessage, name: string): string | undefined {\n  const value = req.headers[name]\n  return Array.isArray(value) ? value[0] : value\n}\n\nfunction parseContentLength(req: IncomingMessage): number | null | 'invalid' {\n  const value = getHeader(req, 'content-length')\n  if (value === undefined) return null\n  if (!/^\\d+$/.test(value)) return 'invalid'\n  const parsed = Number(value)\n  return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : 'invalid'\n}\n\nfunction getStoredAssetBytes(store: AssetStore, excludeHash?: string): number {\n  return store.list().reduce((total, record) => {\n    if (record.hash === excludeHash) return total\n    return Number.isFinite(record.size) && record.size > 0 ? total + record.size : total\n  }, 0)\n}\n","import { existsSync, readFileSync, rmSync, writeFileSync, readdirSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { AssetRecord } from './types'\n\nimport { getHashFromAssetFilename } from './asset-utils'\nimport { ASSET_DIR, ensureDir, ensureFile, log } from './shared'\n\nconst INDEX_FILENAME = 'assets.json'\nconst DEFAULT_INDEX_PATH = join(ASSET_DIR, INDEX_FILENAME)\n\nexport interface AssetStoreOptions {\n  indexPath?: string\n}\n\nexport interface AssetStore {\n  list(): AssetRecord[]\n  has(hash: string): boolean\n  get(hash: string): AssetRecord | undefined\n  getMany(hashes: string[]): AssetRecord[]\n  upsert(\n    input: Omit<AssetRecord, 'uploadedAt' | 'lastAccess'> &\n      Partial<Pick<AssetRecord, 'uploadedAt' | 'lastAccess'>>\n  ): AssetRecord\n  touch(hash: string): AssetRecord | undefined\n  remove(hash: string, opts?: { removeFile?: boolean }): void\n  reconcile(): void\n  flush(): void\n}\n\nfunction readIndex(indexPath: string): AssetRecord[] {\n  if (!existsSync(indexPath)) return []\n  try {\n    const raw = readFileSync(indexPath, 'utf8').trim()\n    if (!raw) return []\n    const parsed = JSON.parse(raw)\n    return Array.isArray(parsed) ? (parsed as AssetRecord[]) : []\n  } catch (error) {\n    log.warn({ error, indexPath }, 'Failed to read asset catalog; starting fresh.')\n    return []\n  }\n}\n\nfunction writeIndex(indexPath: string, values: AssetRecord[]): void {\n  const payload = JSON.stringify(values, null, 2)\n  writeFileSync(indexPath, payload, 'utf8')\n}\n\nexport function createAssetStore(options: AssetStoreOptions = {}): AssetStore {\n  ensureDir(ASSET_DIR)\n  const indexPath = options.indexPath ?? DEFAULT_INDEX_PATH\n  ensureFile(indexPath)\n  const records = new Map<string, AssetRecord>()\n  let persistTimer: NodeJS.Timeout | null = null\n\n  function loadExisting(): void {\n    const list = readIndex(indexPath)\n    for (const record of list) {\n      if (record?.hash && record?.filePath) {\n        records.set(record.hash, record)\n      }\n    }\n  }\n\n  function persist(): void {\n    if (persistTimer) return\n    persistTimer = setTimeout(() => {\n      persistTimer = null\n      writeIndex(indexPath, [...records.values()])\n    }, 5000)\n    if (typeof persistTimer.unref === 'function') {\n      persistTimer.unref()\n    }\n  }\n\n  function flush(): void {\n    if (persistTimer) {\n      clearTimeout(persistTimer)\n      persistTimer = null\n    }\n    writeIndex(indexPath, [...records.values()])\n  }\n\n  function list(): AssetRecord[] {\n    return [...records.values()]\n  }\n\n  function has(hash: string): boolean {\n    return records.has(hash)\n  }\n\n  function get(hash: string): AssetRecord | undefined {\n    return records.get(hash)\n  }\n\n  function getMany(hashes: string[]): AssetRecord[] {\n    return hashes\n      .map((hash) => records.get(hash))\n      .filter((record): record is AssetRecord => !!record)\n  }\n\n  function upsert(\n    input: Omit<AssetRecord, 'uploadedAt' | 'lastAccess'> &\n      Partial<Pick<AssetRecord, 'uploadedAt' | 'lastAccess'>>\n  ): AssetRecord {\n    const now = Date.now()\n    const record: AssetRecord = {\n      ...input,\n      uploadedAt: input.uploadedAt ?? now,\n      lastAccess: input.lastAccess ?? now\n    }\n    records.set(record.hash, record)\n    persist()\n    return record\n  }\n\n  function touch(hash: string): AssetRecord | undefined {\n    const existing = records.get(hash)\n    if (!existing) return undefined\n    existing.lastAccess = Date.now()\n    persist()\n    return existing\n  }\n\n  function remove(hash: string, { removeFile = true } = {}): void {\n    const record = records.get(hash)\n    if (!record) return\n    records.delete(hash)\n    persist()\n\n    if (removeFile) {\n      try {\n        rmSync(record.filePath, { force: true })\n      } catch (error) {\n        log.warn({ hash, error }, 'Failed to remove asset file on delete.')\n      }\n    }\n  }\n\n  function reconcile(): void {\n    let changed = false\n    for (const [hash, record] of records) {\n      if (!existsSync(record.filePath)) {\n        records.delete(hash)\n        changed = true\n      }\n    }\n\n    try {\n      const files = readdirSync(ASSET_DIR)\n      const now = Date.now()\n      for (const file of files) {\n        if (file === INDEX_FILENAME) continue\n\n        // Cleanup stale tmp files (> 1 hour)\n        if (file.includes('.tmp.')) {\n          try {\n            const filePath = join(ASSET_DIR, file)\n            const stat = statSync(filePath)\n            if (now - stat.mtimeMs > 3600 * 1000) {\n              rmSync(filePath, { force: true })\n              log.info({ file }, 'Cleaned up stale temp file.')\n            }\n          } catch (e) {\n            // Ignore errors during cleanup\n            log.debug({ error: e, file }, 'Failed to cleanup stale temp file.')\n          }\n          continue\n        }\n\n        const hash = getHashFromAssetFilename(file)\n        if (!hash) continue\n\n        if (!records.has(hash)) {\n          const filePath = join(ASSET_DIR, file)\n          try {\n            const stat = statSync(filePath)\n            records.set(hash, {\n              hash,\n              filePath,\n              mimeType: 'application/octet-stream',\n              size: stat.size,\n              uploadedAt: stat.birthtimeMs,\n              lastAccess: stat.atimeMs\n            })\n            changed = true\n            log.info({ hash }, 'Recovered orphan asset file.')\n          } catch (e) {\n            log.warn({ error: e, file }, 'Failed to stat orphan file.')\n          }\n        }\n      }\n    } catch (error) {\n      log.warn({ error }, 'Failed to scan asset directory for orphans.')\n    }\n\n    if (changed) flush()\n  }\n\n  loadExisting()\n  reconcile()\n\n  return {\n    list,\n    has,\n    get,\n    getMany,\n    upsert,\n    touch,\n    remove,\n    reconcile,\n    flush\n  }\n}\n","import type { ExtensionConnection } from './types'\n\ntype TimeoutHandle = ReturnType<typeof setTimeout>\n\nexport class ExtensionRegistry {\n  readonly #autoActivateGraceMs: number\n  readonly #extensions: ExtensionConnection[] = []\n  #activeId: string | null = null\n  #autoActivateTimer: TimeoutHandle | null = null\n\n  constructor(autoActivateGraceMs: number) {\n    this.#autoActivateGraceMs = autoActivateGraceMs\n  }\n\n  get size(): number {\n    return this.#extensions.length\n  }\n\n  add(extension: ExtensionConnection): void {\n    if (this.#extensions.some(({ id }) => id === extension.id)) {\n      throw new Error(`Extension connection already registered: ${extension.id}`)\n    }\n    this.#extensions.push(extension)\n  }\n\n  remove(id: string): { extension: ExtensionConnection; wasActive: boolean } | null {\n    const index = this.#extensions.findIndex((extension) => extension.id === id)\n    if (index < 0) return null\n    this.clearAutoActivation()\n    const extension = this.#extensions[index]!\n    this.#extensions.splice(index, 1)\n    const wasActive = this.#activeId === id\n    if (wasActive) this.#activeId = null\n    return { extension, wasActive }\n  }\n\n  activate(id: string): boolean {\n    const target = this.#extensions.find((extension) => extension.id === id)\n    if (!target) return false\n\n    const active = this.getActive()\n    if (active && active.id !== target.id && active.origin !== target.origin) return false\n\n    this.#activeId = id\n    return true\n  }\n\n  getActive(): ExtensionConnection | undefined {\n    return this.#extensions.find((extension) => extension.id === this.#activeId)\n  }\n\n  getActiveId(): string | null {\n    return this.#activeId\n  }\n\n  list(): readonly ExtensionConnection[] {\n    return this.#extensions\n  }\n\n  scheduleAutoActivation(onActivated: (id: string) => void): void {\n    this.clearAutoActivation()\n    if (this.#extensions.length !== 1 || this.getActive()) return\n\n    const targetId = this.#extensions[0]!.id\n    this.#autoActivateTimer = setTimeout(() => {\n      this.#autoActivateTimer = null\n      if (this.#extensions.length !== 1 || this.getActiveId() || !this.activate(targetId)) return\n      onActivated(targetId)\n    }, this.#autoActivateGraceMs)\n    unrefTimer(this.#autoActivateTimer)\n  }\n\n  clearAutoActivation(): void {\n    if (!this.#autoActivateTimer) return\n    clearTimeout(this.#autoActivateTimer)\n    this.#autoActivateTimer = null\n  }\n\n  dispose(): void {\n    this.clearAutoActivation()\n  }\n}\n\nfunction unrefTimer(timer: TimeoutHandle): void {\n  if (typeof timer !== 'object' || timer === null) return\n  const handle = timer as NodeJS.Timeout\n  if (typeof handle.unref === 'function') handle.unref()\n}\n","import type { TempadMcpErrorPayload } from '@tempad-dev/shared'\nimport type { RawData, WebSocket } from 'ws'\n\nimport { MessageFromExtensionSchema, type RegisteredMessage } from '@tempad-dev/shared'\n\nimport type { ExtensionRegistry } from './extension-registry'\nimport type { ExtensionConnection } from './types'\n\ntype ExtensionProtocolWarning =\n  | { extensionId: string; kind: 'binary' }\n  | { error: unknown; extensionId: string; kind: 'json' | 'schema' }\n\ntype AttachExtensionSocketOptions = {\n  createId: () => string\n  origin: string\n  registry: ExtensionRegistry\n  onActivationRejected?: (extensionId: string, activeExtensionId: string) => void\n  onActivated?: (extensionId: string) => void\n  onAutoActivated?: (extensionId: string) => void\n  onConnected?: (extensionId: string) => void\n  onDisconnected?: (extensionId: string, wasActive: boolean) => void\n  onProtocolWarning?: (warning: ExtensionProtocolWarning) => void\n  onSocketError?: (extensionId: string, error: Error) => void\n  onStateChange: () => void\n  onToolError: (requestId: string, extensionId: string, error: TempadMcpErrorPayload) => void\n  onToolResult: (requestId: string, extensionId: string, payload: unknown) => void\n}\n\nexport function attachExtensionSocket(\n  ws: WebSocket,\n  options: AttachExtensionSocketOptions\n): ExtensionConnection {\n  const extension: ExtensionConnection = {\n    id: options.createId(),\n    origin: options.origin.toLowerCase(),\n    ws\n  }\n  options.registry.add(extension)\n  options.onConnected?.(extension.id)\n\n  const registered: RegisteredMessage = { id: extension.id, type: 'registered' }\n  ws.send(JSON.stringify(registered))\n  options.onStateChange()\n  scheduleAutoActivation(options)\n\n  ws.on('message', (raw: RawData, isBinary: boolean) => {\n    if (isBinary) {\n      options.onProtocolWarning?.({ extensionId: extension.id, kind: 'binary' })\n      return\n    }\n\n    let parsedJson: unknown\n    try {\n      parsedJson = JSON.parse(rawDataToBuffer(raw).toString('utf-8'))\n    } catch (error) {\n      options.onProtocolWarning?.({ error, extensionId: extension.id, kind: 'json' })\n      return\n    }\n\n    const parseResult = MessageFromExtensionSchema.safeParse(parsedJson)\n    if (!parseResult.success) {\n      options.onProtocolWarning?.({\n        error: parseResult.error.flatten(),\n        extensionId: extension.id,\n        kind: 'schema'\n      })\n      return\n    }\n\n    const message = parseResult.data\n    switch (message.type) {\n      case 'activate':\n        if (options.registry.activate(extension.id)) {\n          options.onActivated?.(extension.id)\n          options.onStateChange()\n          scheduleAutoActivation(options)\n        } else {\n          const activeExtensionId = options.registry.getActiveId()\n          if (activeExtensionId) {\n            options.onActivationRejected?.(extension.id, activeExtensionId)\n          }\n        }\n        break\n      case 'toolResult':\n        if (message.error !== undefined) {\n          options.onToolError(message.id, extension.id, message.error)\n        } else {\n          options.onToolResult(message.id, extension.id, message.payload)\n        }\n        break\n      case 'ping':\n        break\n    }\n  })\n\n  ws.on('error', (error) => {\n    options.onSocketError?.(extension.id, error)\n  })\n\n  ws.once('close', () => {\n    const removed = options.registry.remove(extension.id)\n    if (!removed) return\n    options.onDisconnected?.(extension.id, removed.wasActive)\n    options.onStateChange()\n    scheduleAutoActivation(options)\n  })\n\n  return extension\n}\n\nfunction scheduleAutoActivation(options: AttachExtensionSocketOptions): void {\n  options.registry.scheduleAutoActivation((extensionId) => {\n    options.onAutoActivated?.(extensionId)\n    options.onStateChange()\n  })\n}\n\nfunction rawDataToBuffer(raw: RawData): Buffer {\n  if (typeof raw === 'string') return Buffer.from(raw)\n  if (Buffer.isBuffer(raw)) return raw\n  if (raw instanceof ArrayBuffer) return Buffer.from(raw)\n  return Buffer.concat(raw)\n}\n","export default \"You are connected to a Figma design file via TemPad Dev MCP.\\n\\nTreat tool outputs as design facts. Refactor only to match the user’s repo conventions; do not invent key style values.\\n\\nRules:\\n\\n- Never output any `data-hint-*` attributes from tool outputs (hints only).\\n- If `get_code` warns `depth-cap`, keep the returned parent code as composition evidence and use returned `data-hint-id` values to choose narrower `get_code` follow-ups.\\n- If `get_code` warns `shell`, read the inline code comment for omitted direct child ids, then call `get_code` for those ids in order and fill the results back into the returned shell.\\n- Use `get_structure` only to resolve layout/overlap uncertainty; do not derive numeric values from images.\\n- Tokens: `get_code.tokens` keys are canonical names (`--...`). Multi‑mode values use `${collectionName}:${modeName}`. Nodes may hint per-node overrides via `data-hint-variable-mode=\\\"Collection=Mode;...\\\"`.\\n- Vectors: `vectorMode=smart` is the default. Treat the emitted markup as the source of truth for the current response; vector code is emitted as `<svg data-src=\\\"...\\\">` placeholders, but if asset upload fails after export the tool may inline the SVG as a fallback to preserve source of truth.\\n- Themeable vectors: `themeable=true` means the SVG can safely adopt one contextual color channel. In `smart` mode, that color is typically already evidenced on the emitted `svg` root markup for the placeholder. It does not mean the SVG exposes multiple independent color parameters.\\n- Assets: download bytes via `asset.url`. Asset resources are not exposed via MCP `resources/read`. Use `asset.themeable` only when an SVG still needs repo asset handling after you account for the Host app's vector policy.\\n\"","import type { TempadMcpErrorCode } from '@tempad-dev/shared'\n\nimport { TEMPAD_MCP_ERROR_CODES } from '@tempad-dev/shared'\nimport { nanoid } from 'nanoid'\n\nimport type { PendingToolCall } from './types'\n\nimport { log } from './shared'\n\nconst pendingCalls = new Map<string, PendingToolCall>()\n\nfunction createToolError(\n  code: TempadMcpErrorCode,\n  message: string\n): Error & { code: TempadMcpErrorCode } {\n  const err = new Error(message) as Error & { code: TempadMcpErrorCode }\n  err.code = code\n  return err\n}\n\nexport function register<T>(\n  extensionId: string,\n  timeout: number\n): { promise: Promise<T>; requestId: string } {\n  const requestId = nanoid()\n  const promise = new Promise<T>((resolve, reject) => {\n    const timer = setTimeout(() => {\n      pendingCalls.delete(requestId)\n      reject(\n        createToolError(\n          TEMPAD_MCP_ERROR_CODES.EXTENSION_TIMEOUT,\n          `Extension did not respond within ${timeout / 1000}s.`\n        )\n      )\n    }, timeout)\n\n    pendingCalls.set(requestId, {\n      resolve: resolve as (value: unknown) => void,\n      reject,\n      timer,\n      extensionId\n    })\n  })\n  return { promise, requestId }\n}\n\nexport function resolve(requestId: string, extensionId: string, payload: unknown): void {\n  const call = pendingCalls.get(requestId)\n  if (call) {\n    if (call.extensionId !== extensionId) {\n      log.warn(\n        { reqId: requestId, expectedExtId: call.extensionId, receivedExtId: extensionId },\n        'Ignored tool result from the wrong extension.'\n      )\n      return\n    }\n    const { timer, resolve: finish } = call\n    clearTimeout(timer)\n    finish(payload)\n    pendingCalls.delete(requestId)\n  } else {\n    log.warn({ reqId: requestId }, 'Received result for unknown/timed-out call.')\n  }\n}\n\nexport function reject(requestId: string, extensionId: string, error: Error): void {\n  const call = pendingCalls.get(requestId)\n  if (call) {\n    if (call.extensionId !== extensionId) {\n      log.warn(\n        { reqId: requestId, expectedExtId: call.extensionId, receivedExtId: extensionId },\n        'Ignored tool error from the wrong extension.'\n      )\n      return\n    }\n    const { timer, reject: fail } = call\n    clearTimeout(timer)\n    fail(error)\n    pendingCalls.delete(requestId)\n  } else {\n    log.warn({ reqId: requestId }, 'Received error for unknown/timed-out call.')\n  }\n}\n\nexport function cleanupForExtension(extensionId: string): void {\n  for (const [reqId, call] of pendingCalls.entries()) {\n    const { timer, reject: fail, extensionId: extId } = call\n    if (extId === extensionId) {\n      clearTimeout(timer)\n      fail(\n        createToolError(\n          TEMPAD_MCP_ERROR_CODES.EXTENSION_DISCONNECTED,\n          'Extension disconnected before providing a result.'\n        )\n      )\n      pendingCalls.delete(reqId)\n      log.warn({ reqId, extId: extensionId }, 'Rejected pending call from disconnected extension.')\n    }\n  }\n}\n\nexport function cleanupAll(): void {\n  pendingCalls.forEach((call, reqId) => {\n    const { timer, reject: fail } = call\n    clearTimeout(timer)\n    fail(new Error('Hub is shutting down.'))\n    log.debug({ reqId }, 'Rejected pending tool call due to shutdown.')\n  })\n  pendingCalls.clear()\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type {\n  GetAssetsResult,\n  GetScreenshotResult,\n  TempadMcpErrorCode,\n  ToolName,\n  ToolResponseLike,\n  ToolResultMap,\n  ToolSchema\n} from '@tempad-dev/shared'\nimport type { ZodType } from 'zod'\n\nimport {\n  MCP_TOOL_INLINE_BUDGET_BYTES,\n  buildGetAssetsToolResult,\n  buildGetCodeToolResult,\n  buildGetScreenshotToolResult,\n  buildGetStructureToolResult,\n  buildGetTokenDefsToolResult,\n  GetAssetsParametersSchema,\n  GetAssetsResultSchema,\n  GetCodeParametersSchema,\n  GetScreenshotParametersSchema,\n  GetStructureParametersSchema,\n  GetTokenDefsParametersSchema,\n  TEMPAD_MCP_ERROR_CODES,\n  measureCallToolResultBytes,\n  type TempadMcpErrorPayload\n} from '@tempad-dev/shared'\n\nexport type {\n  AssetDescriptor,\n  GetAssetsParametersInput,\n  GetAssetsResult,\n  GetCodeParametersInput,\n  GetCodeResult,\n  GetScreenshotParametersInput,\n  GetScreenshotResult,\n  GetStructureParametersInput,\n  GetStructureResult,\n  GetTokenDefsParametersInput,\n  GetTokenDefsResult,\n  TokenEntry,\n  ToolName,\n  ToolResultMap,\n  ToolSchema\n} from '@tempad-dev/shared'\n\ntype BaseToolMetadata<Name extends ToolName, Schema extends ZodType> = ToolSchema<Name> & {\n  parameters: Schema\n  format?: (payload: ToolResultMap[Name]) => CallToolResult\n}\n\ntype ExtensionToolMetadata<Name extends ToolName, Schema extends ZodType> = BaseToolMetadata<\n  Name,\n  Schema\n> & {\n  target: 'extension'\n}\n\ntype HubToolMetadata<Name extends ToolName, Schema extends ZodType> = BaseToolMetadata<\n  Name,\n  Schema\n> & {\n  target: 'hub'\n  outputSchema?: ZodType\n}\n\nconst CONNECTIVITY_ERROR_CODES = new Set<TempadMcpErrorCode>([\n  TEMPAD_MCP_ERROR_CODES.NO_ACTIVE_EXTENSION,\n  TEMPAD_MCP_ERROR_CODES.EXTENSION_TIMEOUT,\n  TEMPAD_MCP_ERROR_CODES.EXTENSION_DISCONNECTED,\n  TEMPAD_MCP_ERROR_CODES.ASSET_SERVER_NOT_CONFIGURED,\n  TEMPAD_MCP_ERROR_CODES.TRANSPORT_NOT_CONNECTED\n])\n\nconst SELECTION_ERROR_CODES = new Set<TempadMcpErrorCode>([\n  TEMPAD_MCP_ERROR_CODES.INVALID_SELECTION,\n  TEMPAD_MCP_ERROR_CODES.NODE_NOT_VISIBLE\n])\nconst KNOWN_ERROR_CODES = new Set<string>(Object.values(TEMPAD_MCP_ERROR_CODES))\n\nconst CONNECTIVITY_TROUBLESHOOTING_LINES = [\n  'Troubleshooting:',\n  '- In Figma, open TemPad Dev panel and enable the MCP server in Preferences → Agent integration.',\n  '- If multiple Figma tabs are open, click the MCP badge to activate this tab.',\n  '- Keep the Figma tab active/foreground while using the MCP server.'\n]\n\nconst SELECTION_TROUBLESHOOTING_LINE = 'Tip: Select exactly one visible node, or pass nodeId.'\n\nfunction getRecordProperty(record: unknown, key: string): unknown {\n  if (!record || typeof record !== 'object') {\n    return undefined\n  }\n  return Reflect.get(record, key)\n}\n\nfunction extTool<Name extends ToolName, Schema extends ZodType>(\n  definition: ExtensionToolMetadata<Name, Schema>\n): ExtensionToolMetadata<Name, Schema> {\n  return definition\n}\n\nfunction hubTool<Name extends ToolName, Schema extends ZodType>(\n  definition: HubToolMetadata<Name, Schema>\n): HubToolMetadata<Name, Schema> {\n  return definition\n}\n\nexport const TOOL_DEFS = [\n  extTool({\n    name: 'get_code',\n    description:\n      'High-fidelity code snapshot for nodeId/current single selection (omit nodeId to use selection): JSX/Vue markup + Tailwind-like classes, plus assets/tokens metadata and codegen config. `vectorMode=smart` (default) emits `<svg data-src=\"...\">` placeholders in code and preserves themeable instance color on the emitted SVG root markup for downstream adaptation; if asset upload fails after export, the tool may inline the SVG as a fallback to preserve source of truth. `vectorMode=snapshot` preserves vector assets for fidelity. Host apps should still refactor vector delivery to repo policy where needed (existing icon/component primitives, import-time SVG transforms, inline SVG, or asset-backed SVG usage). SVG asset metadata may include `themeable=true`, meaning the exported asset can safely adopt one contextual color channel. Start here, then refactor into repo conventions while preserving values/intent; strip any data-hint-* attributes (hints only). If warnings include depth-cap, use returned data-hint-id values to continue with narrower get_code calls. If warnings include shell, read the inline comment for omitted direct child ids and fetch them in order. If warnings include auto-layout (inferred), use get_structure to confirm hierarchy/overlap (do not derive numeric values from pixels). Tokens are keyed by canonical names like `--color-primary` (multi-mode keys use `${collection}:${mode}`; node overrides may appear as data-hint-variable-mode).',\n    parameters: GetCodeParametersSchema,\n    target: 'extension',\n    format: createCodeToolResponse\n  }),\n  extTool({\n    name: 'get_token_defs',\n    description:\n      'Resolve canonical token names to literal values (optionally including all modes) for tokens referenced by get_code.',\n    parameters: GetTokenDefsParametersSchema,\n    target: 'extension',\n    format: createTokenDefsToolResponse,\n    exposed: false\n  }),\n  extTool({\n    name: 'get_screenshot',\n    description:\n      'Capture a rendered PNG screenshot for nodeId/current single selection for visual verification (layering/overlap/masks/effects).',\n    parameters: GetScreenshotParametersSchema,\n    target: 'extension',\n    format: createScreenshotToolResponse,\n    exposed: false\n  }),\n  extTool({\n    name: 'get_structure',\n    description:\n      'Get a compact structural + geometry outline for nodeId/current single selection to understand hierarchy and layout intent.',\n    parameters: GetStructureParametersSchema,\n    target: 'extension',\n    format: createStructureToolResponse\n  }),\n  hubTool({\n    name: 'get_assets',\n    description:\n      'Resolve asset hashes to downloadable URLs and metadata for assets referenced by tool responses. SVG asset metadata may include `themeable=true` when the underlying vector can safely adopt one contextual color channel.',\n    parameters: GetAssetsParametersSchema,\n    target: 'hub',\n    outputSchema: GetAssetsResultSchema,\n    exposed: false\n  })\n] as const\n\nfunction extractToolErrorCode(error: unknown): TempadMcpErrorCode | undefined {\n  const code = getRecordProperty(error, 'code')\n  if (isTempadMcpErrorCode(code)) return code\n  const cause = getRecordProperty(error, 'cause')\n  const causeCode = getRecordProperty(cause, 'code')\n  if (isTempadMcpErrorCode(causeCode)) return causeCode\n  return undefined\n}\n\nfunction isTempadMcpErrorCode(value: unknown): value is TempadMcpErrorCode {\n  return typeof value === 'string' && KNOWN_ERROR_CODES.has(value)\n}\n\nfunction extractToolErrorMessage(error: unknown): string {\n  if (error instanceof Error) return error.message || 'Unknown error occurred.'\n  if (typeof error === 'string') return error\n  if (error && typeof error === 'object') {\n    const candidate = error as Partial<TempadMcpErrorPayload & Record<string, unknown>>\n    if (typeof candidate.message === 'string' && candidate.message.trim()) return candidate.message\n  }\n  return 'Unknown error occurred.'\n}\n\nfunction createToolErrorResponse(toolName: string, error: unknown): CallToolResult {\n  const message = extractToolErrorMessage(error)\n  const code = extractToolErrorCode(error)\n  const codeLabel = code ? ` [${code}]` : ''\n  const troubleshooting = buildTroubleshootingText(code, message)\n\n  return {\n    isError: true,\n    content: [\n      {\n        type: 'text' as const,\n        text: `Tool \"${toolName}\" failed${codeLabel}: ${message}${troubleshooting}`\n      }\n    ]\n  }\n}\n\nfunction buildTroubleshootingText(code: TempadMcpErrorCode | undefined, message: string): string {\n  const help: string[] = []\n\n  if (isConnectivityToolError(code, message)) {\n    help.push(...CONNECTIVITY_TROUBLESHOOTING_LINES)\n  }\n\n  if (isSelectionToolError(code, message)) {\n    help.push(SELECTION_TROUBLESHOOTING_LINE)\n  }\n\n  return help.length ? `\\n\\n${help.join('\\n')}` : ''\n}\n\nfunction isConnectivityToolError(code: TempadMcpErrorCode | undefined, message: string): boolean {\n  return (\n    (code ? CONNECTIVITY_ERROR_CODES.has(code) : false) ||\n    /no active tempad dev extension/i.test(message) ||\n    /asset server url is not configured/i.test(message) ||\n    /websocket/i.test(message)\n  )\n}\n\nfunction isSelectionToolError(code: TempadMcpErrorCode | undefined, message: string): boolean {\n  return (\n    (code ? SELECTION_ERROR_CODES.has(code) : false) ||\n    /select exactly one visible node/i.test(message) ||\n    /no visible node found/i.test(message)\n  )\n}\n\nexport function createCodeToolResponse(payload: ToolResultMap['get_code']): CallToolResult {\n  if (!isCodeResult(payload)) {\n    throw new Error('Invalid get_code payload received from extension.')\n  }\n\n  return toCallToolResult(buildGetCodeToolResult(payload))\n}\n\nexport function createStructureToolResponse(\n  payload: ToolResultMap['get_structure']\n): CallToolResult {\n  if (!isStructureResult(payload)) {\n    throw new Error('Invalid get_structure payload received from extension.')\n  }\n\n  return toCallToolResult(buildGetStructureToolResult(payload))\n}\n\nexport function createTokenDefsToolResponse(\n  payload: ToolResultMap['get_token_defs']\n): CallToolResult {\n  if (!isTokenDefsResult(payload)) {\n    throw new Error('Invalid get_token_defs payload received from extension.')\n  }\n\n  return toCallToolResult(buildGetTokenDefsToolResult(payload))\n}\n\nexport function createScreenshotToolResponse(\n  payload: ToolResultMap['get_screenshot']\n): CallToolResult {\n  if (!isScreenshotResult(payload)) {\n    throw new Error('Invalid get_screenshot payload received from extension.')\n  }\n\n  return toCallToolResult(buildGetScreenshotToolResult(payload))\n}\n\nfunction isScreenshotResult(payload: unknown): payload is GetScreenshotResult {\n  if (typeof payload !== 'object' || !payload) return false\n  const candidate = payload as Partial<GetScreenshotResult & Record<string, unknown>>\n  return (\n    typeof candidate.asset === 'object' &&\n    candidate.asset !== null &&\n    typeof candidate.width === 'number' &&\n    typeof candidate.height === 'number' &&\n    typeof candidate.scale === 'number' &&\n    typeof candidate.bytes === 'number' &&\n    typeof candidate.format === 'string'\n  )\n}\n\nfunction isCodeResult(payload: unknown): payload is ToolResultMap['get_code'] {\n  if (typeof payload !== 'object' || !payload) return false\n  const candidate = payload as Partial<ToolResultMap['get_code'] & Record<string, unknown>>\n  return (\n    typeof candidate.code === 'string' &&\n    typeof candidate.lang === 'string' &&\n    (candidate.assets === undefined || Array.isArray(candidate.assets))\n  )\n}\n\nfunction isStructureResult(payload: unknown): payload is ToolResultMap['get_structure'] {\n  if (typeof payload !== 'object' || !payload) return false\n  const candidate = payload as Partial<ToolResultMap['get_structure'] & Record<string, unknown>>\n  return Array.isArray(candidate.roots)\n}\n\nfunction isTokenDefsResult(payload: unknown): payload is ToolResultMap['get_token_defs'] {\n  if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return false\n  for (const value of Object.values(payload as Record<string, unknown>)) {\n    if (!value || typeof value !== 'object') return false\n    const token = value as Partial<Record<'kind' | 'value', unknown>>\n    if (typeof token.kind !== 'string') return false\n    if (token.value === undefined) return false\n  }\n  return true\n}\n\nexport function coercePayloadToToolResponse(payload: unknown): CallToolResult {\n  if (\n    payload &&\n    typeof payload === 'object' &&\n    Array.isArray((payload as CallToolResult).content)\n  ) {\n    return payload as CallToolResult\n  }\n\n  return {\n    content: [\n      {\n        type: 'text' as const,\n        text: typeof payload === 'string' ? payload : JSON.stringify(payload, null, 2)\n      }\n    ]\n  }\n}\n\nexport function createAssetsToolResponse(payload: GetAssetsResult): CallToolResult {\n  return toCallToolResult(buildGetAssetsToolResult(payload))\n}\n\nexport function createInlineBudgetExceededToolResponse(\n  toolName: ToolName,\n  actualBytes: number\n): CallToolResult {\n  const guidance = getBudgetRetryGuidance(toolName)\n  return {\n    isError: true,\n    content: [\n      {\n        type: 'text' as const,\n        text: `Tool \"${toolName}\" exceeded the 64 KiB inline budget (${actualBytes} UTF-8 bytes > ${MCP_TOOL_INLINE_BUDGET_BYTES}). ${guidance}`\n      }\n    ]\n  }\n}\n\nexport function isWithinInlineBudget(result: ToolResponseLike): boolean {\n  return measureCallToolResultBytes(result) <= MCP_TOOL_INLINE_BUDGET_BYTES\n}\n\nfunction toCallToolResult(result: ToolResponseLike): CallToolResult {\n  return result as CallToolResult\n}\n\nfunction getBudgetRetryGuidance(toolName: ToolName): string {\n  switch (toolName) {\n    case 'get_code':\n      return 'Reduce selection size or request a smaller nodeId subtree and retry.'\n    case 'get_structure':\n      return 'Reduce selection size or pass a smaller depth and retry.'\n    case 'get_token_defs':\n      return 'Reduce requested names or split them into smaller batches and retry.'\n    case 'get_screenshot':\n      return 'Reduce selection size or scale and retry.'\n    case 'get_assets':\n      return 'Request fewer hashes in a single call and retry.'\n    default:\n      return 'Retry with a narrower request.'\n  }\n}\n\nexport { createToolErrorResponse }\n","import { WebSocketServer } from 'ws'\n\nimport type { ExtensionOriginPolicy } from './security'\n\nimport { isAllowedWebSocketRequest } from './security'\n\ntype StartExtensionWebSocketServerOptions = {\n  maxPayloadBytes: number\n  maxConnections: number\n  originPolicy: ExtensionOriginPolicy\n  portCandidates: readonly number[]\n  onConnectionLimit?: (limit: number) => void\n  onPortInUse?: (port: number) => void\n  onRejectedHandshake?: (origin: string | undefined, path: string | undefined) => void\n}\n\nexport async function startExtensionWebSocketServer({\n  maxPayloadBytes,\n  maxConnections,\n  originPolicy,\n  portCandidates,\n  onPortInUse,\n  onConnectionLimit,\n  onRejectedHandshake\n}: StartExtensionWebSocketServerOptions): Promise<{\n  port: number\n  server: WebSocketServer\n}> {\n  for (const candidate of portCandidates) {\n    const server = new WebSocketServer({\n      host: '127.0.0.1',\n      port: candidate,\n      maxPayload: maxPayloadBytes,\n      verifyClient: (info: { origin: string; req: { url?: string } }) => {\n        if (server.clients.size >= maxConnections) {\n          onConnectionLimit?.(maxConnections)\n          return false\n        }\n        const allowed = isAllowedWebSocketRequest(info.origin, info.req.url, originPolicy)\n        if (!allowed) onRejectedHandshake?.(info.origin, info.req.url)\n        return allowed\n      }\n    })\n\n    try {\n      await waitForListening(server)\n      return { server, port: resolveListeningPort(server, candidate) }\n    } catch (error) {\n      server.close()\n      const errno = error as NodeJS.ErrnoException\n      if (errno.code === 'EADDRINUSE') {\n        onPortInUse?.(candidate)\n        continue\n      }\n      throw errno\n    }\n  }\n\n  throw new Error(\n    `Unable to start WebSocket server on candidate ports: ${portCandidates.join(', ')}.`\n  )\n}\n\nfunction waitForListening(server: WebSocketServer): Promise<void> {\n  return new Promise((resolve, reject) => {\n    const onError = (error: NodeJS.ErrnoException) => {\n      server.off('listening', onListening)\n      reject(error)\n    }\n    const onListening = () => {\n      server.off('error', onError)\n      resolve()\n    }\n    server.once('error', onError)\n    server.once('listening', onListening)\n  })\n}\n\nfunction resolveListeningPort(server: WebSocketServer, candidate: number): number {\n  const address = server.address()\n  return address && typeof address === 'object' ? address.port : candidate\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type {\n  AssetDescriptor,\n  GetAssetsParametersInput,\n  GetAssetsResult,\n  StateMessage,\n  ToolCallMessage,\n  ToolName,\n  ToolResultMap\n} from '@tempad-dev/shared'\nimport type { ZodType } from 'zod'\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n  GetAssetsResultSchema,\n  MCP_TOOL_INLINE_BUDGET_BYTES,\n  TEMPAD_MCP_ERROR_CODES,\n  measureCallToolResultBytes,\n  type TempadMcpErrorCode\n} from '@tempad-dev/shared'\nimport { randomUUID } from 'node:crypto'\nimport { existsSync, rmSync, chmodSync } from 'node:fs'\nimport { connect, createServer } from 'node:net'\nimport lockfile from 'proper-lockfile'\nimport { WebSocketServer } from 'ws'\n\nimport type { AssetRecord } from './types'\n\nimport { createAssetHttpServer } from './asset-http-server'\nimport { createAssetStore } from './asset-store'\nimport { buildAssetFilename } from './asset-utils'\nimport { getMcpServerConfig } from './config'\nimport { ExtensionRegistry } from './extension-registry'\nimport { attachExtensionSocket } from './extension-socket'\nimport MCP_INSTRUCTIONS from './instructions.md?raw'\nimport { register, resolve, reject, cleanupForExtension, cleanupAll } from './request'\nimport { createExtensionOriginPolicy } from './security'\nimport {\n  HUB_BUSY_EXIT_CODE,\n  HUB_LOCK_PATH,\n  HUB_LOCK_STALE_MS,\n  HUB_LOCK_UPDATE_MS,\n  PACKAGE_VERSION,\n  log,\n  RUNTIME_DIR,\n  SOCK_PATH,\n  ensureDir\n} from './shared'\nimport {\n  TOOL_DEFS,\n  coercePayloadToToolResponse,\n  createAssetsToolResponse,\n  createInlineBudgetExceededToolResponse,\n  createToolErrorResponse\n} from './tools'\nimport { startExtensionWebSocketServer } from './websocket-server'\n\nconst SHUTDOWN_TIMEOUT = 2000\nconst SOCKET_PROBE_TIMEOUT_MS = 300\nconst {\n  wsPortCandidates,\n  toolTimeoutMs,\n  maxPayloadBytes,\n  maxExtensionConnections,\n  autoActivateGraceMs,\n  assetTtlMs,\n  allowedExtensionOrigins\n} = getMcpServerConfig()\nconst extensionOriginPolicy = createExtensionOriginPolicy(allowedExtensionOrigins)\n\nlog.info({ version: PACKAGE_VERSION }, 'TemPad MCP Hub starting...')\n\nconst extensionRegistry = new ExtensionRegistry(autoActivateGraceMs)\nlet consumerCount = 0\ntype TimeoutHandle = ReturnType<typeof setTimeout>\nlet selectedWsPort = 0\nlet releaseHubLock: (() => Promise<void>) | null = null\nlet shuttingDown = false\nlet wss: WebSocketServer | null = null\nconst consumerSessions = new Set<McpServer>()\ntype RegisterToolOptions = Parameters<McpServer['registerTool']>[1]\ntype McpInputSchema = RegisterToolOptions['inputSchema']\ntype McpOutputSchema = RegisterToolOptions['outputSchema']\ntype ToolResponse = CallToolResult\ntype SchemaOutput<Schema extends ZodType> = Schema['_output']\ntype ToolMetadataEntry = (typeof TOOL_DEFS)[number]\ntype ExtensionToolMetadata = Extract<ToolMetadataEntry, { target: 'extension' }>\ntype HubToolMetadata = Extract<ToolMetadataEntry, { target: 'hub' }>\n\ntype HubToolWithHandler<T extends HubToolMetadata = HubToolMetadata> = T & {\n  handler: (args: SchemaOutput<T['parameters']>) => Promise<ToolResponse>\n}\n\nfunction getRecordProperty(record: unknown, key: string): unknown {\n  if (!record || typeof record !== 'object') {\n    return undefined\n  }\n  return Reflect.get(record, key)\n}\n\ntype SocketProbeResult = 'live' | 'missing' | { staleCode: string }\n\nfunction classifySocketProbeError(error: NodeJS.ErrnoException): SocketProbeResult | null {\n  if (error.code === 'ENOENT') return 'missing'\n  if (error.code === 'ECONNREFUSED' || error.code === 'ENOTSOCK') {\n    return { staleCode: error.code }\n  }\n  return null\n}\n\nfunction probeHubSocket(): Promise<SocketProbeResult> {\n  return new Promise((resolve, reject) => {\n    let settled = false\n    let socket: ReturnType<typeof connect> | null = null\n\n    function finish(callback: () => void): void {\n      if (settled) return\n      settled = true\n      clearTimeout(timer)\n      if (socket) {\n        socket.removeAllListeners()\n        socket.destroy()\n      }\n      callback()\n    }\n\n    const timer = setTimeout(() => {\n      finish(() =>\n        reject(new Error(`Timed out probing Hub socket after ${SOCKET_PROBE_TIMEOUT_MS}ms.`))\n      )\n    }, SOCKET_PROBE_TIMEOUT_MS)\n    function fail(error: NodeJS.ErrnoException): void {\n      const result = classifySocketProbeError(error)\n      finish(() => (result ? resolve(result) : reject(error)))\n    }\n\n    try {\n      socket = connect(SOCK_PATH)\n      socket.once('connect', () => finish(() => resolve('live')))\n      socket.once('error', fail)\n    } catch (error) {\n      fail(error as NodeJS.ErrnoException)\n    }\n  })\n}\n\nasync function acquireHubLock(): Promise<() => Promise<void>> {\n  try {\n    return await lockfile.lock(HUB_LOCK_PATH, {\n      retries: 0,\n      stale: HUB_LOCK_STALE_MS,\n      update: HUB_LOCK_UPDATE_MS,\n      onCompromised: (err) => {\n        log.error({ err }, 'Hub lifecycle lock was compromised. Exiting.')\n        process.exit(1)\n      }\n    })\n  } catch (error) {\n    log.info({ err: error }, 'Another Hub owns the lifecycle lock. Exiting.')\n    process.exit(HUB_BUSY_EXIT_CODE)\n  }\n}\n\nasync function releaseHubLockIfNeeded(): Promise<void> {\n  if (!releaseHubLock) return\n  const release = releaseHubLock\n  releaseHubLock = null\n  try {\n    await release()\n  } catch (err) {\n    log.warn({ err }, 'Failed to release Hub lifecycle lock.')\n  }\n}\n\nasync function probeSocketPath(): Promise<SocketProbeResult> {\n  return process.platform === 'win32' || existsSync(SOCK_PATH) ? await probeHubSocket() : 'missing'\n}\n\nasync function exitExistingHub(): Promise<never> {\n  await releaseHubLockIfNeeded()\n  log.info({ sock: SOCK_PATH }, 'Existing Hub is reachable. Exiting.')\n  process.exit(HUB_BUSY_EXIT_CODE)\n}\n\nasync function cleanSocketPath(): Promise<void> {\n  const probe = await probeSocketPath()\n\n  if (probe === 'live') {\n    return await exitExistingHub()\n  }\n  if (probe === 'missing' || process.platform === 'win32') {\n    return\n  }\n  log.warn({ sock: SOCK_PATH, code: probe.staleCode }, 'Removing stale socket file.')\n  rmSync(SOCK_PATH)\n}\n\ntype RegisteredToolDefinition = ExtensionToolMetadata | HubToolWithHandler\n\nfunction enrichToolDefinition(tool: ToolMetadataEntry): RegisteredToolDefinition {\n  if (tool.target === 'extension') {\n    return tool\n  }\n\n  switch (tool.name) {\n    case 'get_assets':\n      return {\n        ...tool,\n        handler: handleGetAssets\n      } satisfies HubToolWithHandler\n    default:\n      throw new Error('No handler configured for hub tool.')\n  }\n}\n\nconst TOOL_DEFINITIONS: ReadonlyArray<RegisteredToolDefinition> = TOOL_DEFS.map((tool) =>\n  enrichToolDefinition(tool)\n)\n\ntype RegisteredTool = (typeof TOOL_DEFINITIONS)[number]\ntype ExtensionTool = Extract<RegisteredTool, { target: 'extension' }>\ntype HubOnlyTool = Extract<RegisteredTool, { target: 'hub' }>\n\nfunction createCodedError(code: TempadMcpErrorCode, message: string): Error & { code: string } {\n  const err = new Error(message) as Error & { code: string }\n  err.code = code\n  return err\n}\n\nfunction coerceToolError(error: unknown): Error {\n  if (error instanceof Error) return error\n  if (typeof error === 'string') return new Error(error)\n  const messageValue = getRecordProperty(error, 'message')\n  const codeValue = getRecordProperty(error, 'code')\n  if (error && typeof error === 'object') {\n    const message = typeof messageValue === 'string' ? messageValue : safeStringify(error)\n    const err = new Error(message) as Error & { code?: string }\n    if (typeof codeValue === 'string') err.code = codeValue\n    return err\n  }\n  return new Error(String(error))\n}\n\nfunction safeStringify(input: unknown): string {\n  try {\n    return JSON.stringify(input)\n  } catch {\n    return String(input)\n  }\n}\n\nfunction hasFormatter(tool: RegisteredToolDefinition): tool is ExtensionTool & {\n  format: (payload: unknown) => ToolResponse\n} {\n  return tool.target === 'extension' && 'format' in tool\n}\n\ntype ToolDefinitionByName = {\n  [T in RegisteredToolDefinition as T['name']]: T\n}\n\nconst TOOL_BY_NAME: ToolDefinitionByName = Object.fromEntries(\n  TOOL_DEFINITIONS.map((tool) => [tool.name, tool] as const)\n) as ToolDefinitionByName\n\nfunction getToolDefinition<Name extends ToolName>(name: Name): ToolDefinitionByName[Name] {\n  return TOOL_BY_NAME[name]\n}\n\nconst assetStore = createAssetStore()\nconst assetHttpServer = createAssetHttpServer(assetStore, {\n  authorizeExtensionOrigin: (origin) =>\n    extensionRegistry.getActive()?.origin === origin.toLowerCase()\n})\n\nfunction scheduleAssetCleanup(): void {\n  if (assetTtlMs <= 0) {\n    log.info('Asset TTL cleanup disabled (TEMPAD_MCP_ASSET_TTL_MS=0).')\n    return\n  }\n  pruneExpiredAssets(assetTtlMs)\n  const intervalMs = Math.min(assetTtlMs, 24 * 60 * 60 * 1000)\n  const timer = setInterval(() => {\n    pruneExpiredAssets(assetTtlMs)\n  }, intervalMs)\n  unrefTimer(timer)\n  log.info({ ttlMs: assetTtlMs, intervalMs }, 'Asset TTL cleanup enabled.')\n}\n\nfunction pruneExpiredAssets(ttlMs: number): void {\n  const now = Date.now()\n  let removed = 0\n  let checked = 0\n  for (const record of assetStore.list()) {\n    checked += 1\n    const lastAccess = Number.isFinite(record.lastAccess) ? record.lastAccess : record.uploadedAt\n    if (!lastAccess) continue\n    if (now - lastAccess > ttlMs) {\n      assetStore.remove(record.hash)\n      removed += 1\n    }\n  }\n  log.info({ checked, removed, ttlMs }, 'Asset TTL sweep completed.')\n}\n\nfunction buildAssetDescriptor(record: AssetRecord): AssetDescriptor {\n  const filename = buildAssetFilename(record.hash, record.mimeType)\n  return {\n    hash: record.hash,\n    url: `${assetHttpServer.getBaseUrl()}/assets/${filename}`,\n    mimeType: record.mimeType,\n    size: record.size,\n    width: record.metadata?.width,\n    height: record.metadata?.height,\n    ...(record.metadata?.themeable ? { themeable: true } : {})\n  }\n}\n\nfunction createMcpServer(): McpServer {\n  const mcp = new McpServer(\n    { name: 'tempad-dev', title: 'TemPad Dev', version: PACKAGE_VERSION },\n    MCP_INSTRUCTIONS ? { instructions: MCP_INSTRUCTIONS } : undefined\n  )\n\n  const registered: string[] = []\n  for (const tool of TOOL_DEFINITIONS) {\n    if ('exposed' in tool && tool.exposed === false) continue\n    registerTool(mcp, tool)\n    registered.push(tool.name)\n  }\n  log.info({ tools: registered }, 'Registered tools.')\n\n  return mcp\n}\n\nfunction registerTool(mcp: McpServer, tool: RegisteredTool): void {\n  if (tool.target === 'extension') {\n    registerProxiedTool(mcp, tool)\n  } else {\n    registerLocalTool(mcp, tool)\n  }\n}\n\nfunction registerProxiedTool<T extends ExtensionTool>(mcp: McpServer, tool: T): void {\n  type Name = T['name']\n  type Result = ToolResultMap[Name]\n\n  const registerToolFn = mcp.registerTool.bind(mcp) as (\n    name: string,\n    options: { description: string; inputSchema: ZodType; outputSchema?: ZodType },\n    handler: (args: unknown) => Promise<CallToolResult>\n  ) => unknown\n\n  const schema = tool.parameters\n  const handler = async (args: unknown) => {\n    let requestId: string | undefined\n    try {\n      const parsedArgs = schema.parse(args)\n      const activeExt = extensionRegistry.getActive()\n      if (!activeExt) {\n        throw createCodedError(\n          TEMPAD_MCP_ERROR_CODES.NO_ACTIVE_EXTENSION,\n          'No active TemPad Dev extension available.'\n        )\n      }\n\n      const registration = register<Result>(activeExt.id, toolTimeoutMs)\n      requestId = registration.requestId\n\n      const message: ToolCallMessage = {\n        type: 'toolCall',\n        id: registration.requestId,\n        payload: {\n          name: tool.name,\n          args: parsedArgs\n        }\n      }\n      activeExt.ws.send(JSON.stringify(message))\n      log.info(\n        { tool: tool.name, req: registration.requestId, extId: activeExt.id },\n        'Forwarded tool call.'\n      )\n\n      const payload = await registration.promise\n      return createToolResponse(tool.name, payload)\n    } catch (error) {\n      const normalized = coerceToolError(error)\n      log.error(\n        {\n          tool: tool.name,\n          req: requestId,\n          code: getRecordProperty(normalized, 'code'),\n          message: normalized.message\n        },\n        'Tool invocation failed.'\n      )\n      return createToolErrorResponse(tool.name, normalized)\n    }\n  }\n\n  registerToolFn(\n    tool.name,\n    {\n      description: tool.description,\n      inputSchema: schema as unknown as McpInputSchema\n    },\n    handler\n  )\n}\n\nfunction registerLocalTool(mcp: McpServer, tool: HubOnlyTool): void {\n  const schema = tool.parameters\n  const handler = tool.handler\n\n  const registerToolFn = mcp.registerTool.bind(mcp) as (\n    name: string,\n    options: { description: string; inputSchema: ZodType; outputSchema?: ZodType },\n    handler: (args: unknown) => Promise<CallToolResult>\n  ) => unknown\n\n  const registrationOptions: {\n    description: string\n    inputSchema: McpInputSchema\n    outputSchema?: McpOutputSchema\n  } = {\n    description: tool.description,\n    inputSchema: schema as unknown as McpInputSchema\n  }\n\n  if (tool.outputSchema) {\n    registrationOptions.outputSchema = tool.outputSchema as unknown as McpOutputSchema\n  }\n\n  const registerHandler = async (args: unknown) => {\n    try {\n      const parsed = schema.parse(args)\n      return await handler(parsed)\n    } catch (error) {\n      log.error({ tool: tool.name, error }, 'Local tool invocation failed.')\n      return createToolErrorResponse(tool.name, error)\n    }\n  }\n\n  registerToolFn(tool.name, registrationOptions, registerHandler)\n}\n\nfunction createToolResponse<Name extends ToolName>(\n  toolName: Name,\n  payload: ToolResultMap[Name]\n): ToolResponse {\n  const rawResult = (() => {\n    const definition = getToolDefinition(toolName)\n    if (definition && hasFormatter(definition)) {\n      try {\n        const formatter = definition.format as (input: ToolResultMap[Name]) => ToolResponse\n        return formatter(payload)\n      } catch (error) {\n        log.warn({ tool: toolName, error }, 'Failed to format tool result; returning raw payload.')\n        return coercePayloadToToolResponse(payload)\n      }\n    }\n\n    return coercePayloadToToolResponse(payload)\n  })()\n\n  const resultBytes = measureCallToolResultBytes(rawResult)\n  if (resultBytes > MCP_TOOL_INLINE_BUDGET_BYTES) {\n    log.warn(\n      { tool: toolName, resultBytes, inlineBudgetBytes: MCP_TOOL_INLINE_BUDGET_BYTES },\n      'Tool result exceeded inline budget; returning compact error response.'\n    )\n    return createInlineBudgetExceededToolResponse(toolName, resultBytes)\n  }\n\n  return rawResult\n}\n\nasync function handleGetAssets({ hashes }: GetAssetsParametersInput): Promise<ToolResponse> {\n  if (hashes.length > 100) {\n    throw new Error('Too many hashes requested. Limit is 100.')\n  }\n  const unique = Array.from(new Set(hashes))\n  const records = assetStore.getMany(unique).filter((record) => {\n    if (existsSync(record.filePath)) return true\n    assetStore.remove(record.hash, { removeFile: false })\n    return false\n  })\n  const found = new Set(records.map((record) => record.hash))\n  const payload: GetAssetsResult = GetAssetsResultSchema.parse({\n    assets: records.map((record) => buildAssetDescriptor(record)),\n    missing: unique.filter((hash) => !found.has(hash))\n  })\n\n  return createAssetsToolResponse(payload)\n}\n\nfunction unrefTimer(timer: TimeoutHandle): void {\n  if (typeof timer === 'object' && timer !== null) {\n    const handle = timer as NodeJS.Timeout\n    if (typeof handle.unref === 'function') {\n      handle.unref()\n    }\n  }\n}\n\nfunction broadcastState(): void {\n  const activeId = extensionRegistry.getActiveId()\n  const message: StateMessage = {\n    type: 'state',\n    activeId,\n    assetServerUrl: assetHttpServer.getBaseUrl()\n  }\n  extensionRegistry.list().forEach((ext) => ext.ws.send(JSON.stringify(message)))\n  log.debug({ activeId, count: extensionRegistry.size }, 'Broadcasted state.')\n}\n\nfunction shutdown(): void {\n  if (shuttingDown) return\n  shuttingDown = true\n  log.info('Hub is shutting down...')\n  consumerSessions.forEach((session) => {\n    session.close().catch((err) => {\n      log.warn({ err }, 'Failed to close MCP session during shutdown.')\n    })\n  })\n  consumerSessions.clear()\n  assetStore.flush()\n  extensionRegistry.dispose()\n  assetHttpServer.stop()\n  netServer.close(() => log.info('Net server closed.'))\n  wss?.close(() => log.info('WebSocket server closed.'))\n  cleanupAll()\n  void releaseHubLockIfNeeded()\n  const timer = setTimeout(() => {\n    log.warn('Shutdown timed out. Forcing exit.')\n    process.exit(1)\n  }, SHUTDOWN_TIMEOUT)\n  unrefTimer(timer)\n}\n\nconst netServer = createServer((sock) => {\n  const mcp = createMcpServer()\n  consumerSessions.add(mcp)\n  consumerCount++\n  log.info(`Consumer connected. Total: ${consumerCount}`)\n  const transport = new StdioServerTransport(sock, sock)\n  mcp.connect(transport).catch((err) => {\n    log.error({ err }, 'Failed to attach MCP transport.')\n    consumerSessions.delete(mcp)\n    mcp.close().catch((closeErr) => log.warn({ err: closeErr }, 'MCP session close failed.'))\n    transport.close().catch((closeErr) => log.warn({ err: closeErr }, 'Transport close failed.'))\n    sock.destroy()\n  })\n  sock.on('error', (err) => {\n    log.warn({ err }, 'Consumer socket error.')\n    transport.close().catch((closeErr) => log.warn({ err: closeErr }, 'Transport close failed.'))\n  })\n  sock.on('close', async () => {\n    await transport\n      .close()\n      .catch((closeErr) => log.warn({ err: closeErr }, 'Transport close failed.'))\n    await mcp.close().catch((closeErr) => log.warn({ err: closeErr }, 'MCP session close failed.'))\n    consumerSessions.delete(mcp)\n    consumerCount--\n    log.info(`Consumer disconnected. Remaining: ${consumerCount}`)\n    if (consumerCount === 0) {\n      log.info('Last consumer disconnected. Shutting down.')\n      shutdown()\n    }\n  })\n})\n\nasync function initializeHubRuntime(): Promise<void> {\n  ensureDir(RUNTIME_DIR)\n  if ((await probeSocketPath()) === 'live') {\n    await exitExistingHub()\n  }\n  releaseHubLock = await acquireHubLock()\n  await cleanSocketPath()\n  await assetHttpServer.start()\n  scheduleAssetCleanup()\n}\n\nfunction listenConsumerSocket(): Promise<void> {\n  return new Promise((resolve, reject) => {\n    const cleanup = () => {\n      netServer.off('error', onError)\n      netServer.off('listening', onListening)\n    }\n    const onError = (err: Error) => {\n      cleanup()\n      reject(err)\n    }\n    const onListening = () => {\n      cleanup()\n      try {\n        if (process.platform !== 'win32') chmodSync(SOCK_PATH, 0o600)\n      } catch (err) {\n        netServer.close()\n        reject(err)\n        return\n      }\n      log.info({ sock: SOCK_PATH }, 'Hub socket ready.')\n      resolve()\n    }\n    netServer.once('error', onError)\n    netServer.once('listening', onListening)\n    netServer.listen(SOCK_PATH)\n  })\n}\n\nasync function startWebSocketServer(): Promise<{ server: WebSocketServer; port: number }> {\n  return startExtensionWebSocketServer({\n    maxConnections: maxExtensionConnections,\n    maxPayloadBytes,\n    originPolicy: extensionOriginPolicy,\n    portCandidates: wsPortCandidates,\n    onPortInUse: (port) => {\n      log.warn({ port }, 'WebSocket port in use, trying next candidate.')\n    },\n    onConnectionLimit: (limit) => {\n      log.warn({ limit }, 'Rejected WebSocket handshake at the extension connection limit.')\n    },\n    onRejectedHandshake: (origin, path) => {\n      log.warn(\n        { origin: origin || '<missing>', path: path || '<missing>' },\n        'Rejected unauthorized WebSocket handshake.'\n      )\n    }\n  })\n}\n\nasync function startHubRuntime(): Promise<WebSocketServer> {\n  await initializeHubRuntime()\n  await listenConsumerSocket()\n  netServer.on('error', (err) => {\n    log.error({ err }, 'Net server error.')\n    process.exit(1)\n  })\n  const startedWebSocket = await startWebSocketServer()\n  wss = startedWebSocket.server\n  selectedWsPort = startedWebSocket.port\n  return startedWebSocket.server\n}\n\nasync function abortStartup(error: unknown): Promise<never> {\n  log.error({ err: error }, 'Failed to initialize Hub runtime.')\n  assetHttpServer.stop()\n  await releaseHubLockIfNeeded()\n  process.exit(1)\n}\n\nconst activeWss = await startHubRuntime().catch(abortStartup)\n\n// Add an error handler to prevent crashes from port conflicts, etc.\nactiveWss.on('error', (err) => {\n  log.error({ err }, 'WebSocket server critical error. Exiting.')\n  process.exit(1)\n})\n\nactiveWss.on('connection', (ws, request) => {\n  attachExtensionSocket(ws, {\n    createId: randomUUID,\n    origin: request.headers.origin ?? '',\n    registry: extensionRegistry,\n    onActivationRejected: (extensionId, activeExtensionId) => {\n      log.warn(\n        { activeId: activeExtensionId, id: extensionId },\n        'Rejected activation from a different extension Origin.'\n      )\n    },\n    onActivated: (extensionId) => {\n      log.info({ id: extensionId }, 'Extension activated.')\n    },\n    onAutoActivated: (extensionId) => {\n      log.info({ id: extensionId }, 'Auto-activated sole extension after grace period.')\n    },\n    onConnected: (extensionId) => {\n      log.info({ id: extensionId }, `Extension connected. Total: ${extensionRegistry.size}`)\n    },\n    onDisconnected: (extensionId, wasActive) => {\n      log.info({ id: extensionId }, `Extension disconnected. Remaining: ${extensionRegistry.size}`)\n      cleanupForExtension(extensionId)\n      if (wasActive) log.warn({ id: extensionId }, 'Active extension disconnected.')\n    },\n    onProtocolWarning: (warning) => {\n      if (warning.kind === 'binary') {\n        log.warn({ extId: warning.extensionId }, 'Unexpected binary message received.')\n      } else if (warning.kind === 'json') {\n        log.warn({ err: warning.error, extId: warning.extensionId }, 'Failed to parse message.')\n      } else {\n        log.warn({ error: warning.error, extId: warning.extensionId }, 'Invalid message shape.')\n      }\n    },\n    onSocketError: (extensionId, error) => {\n      log.warn({ err: error, extId: extensionId }, 'Extension WebSocket error.')\n    },\n    onStateChange: broadcastState,\n    onToolError: (requestId, extensionId, error) => {\n      const normalized = coerceToolError(error)\n      log.warn(\n        {\n          toolReq: requestId,\n          extId: extensionId,\n          code: getRecordProperty(normalized, 'code'),\n          message: normalized.message\n        },\n        'Received tool error from extension.'\n      )\n      reject(requestId, extensionId, normalized)\n    },\n    onToolResult: (requestId, extensionId, payload) => {\n      resolve(requestId, extensionId, payload)\n    }\n  })\n})\n\nlog.info(\n  { port: selectedWsPort, extensionOriginPolicy: extensionOriginPolicy.mode },\n  'WebSocket server ready.'\n)\n\nprocess.on('SIGINT', shutdown)\nprocess.on('SIGTERM', shutdown)\n"],"mappings":"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"}