@atomixstudio/mcp 1.0.33 → 1.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/dist/chunk-426RNS3G.js +1782 -0
- package/dist/chunk-426RNS3G.js.map +1 -0
- package/dist/figma-bridge-protocol.d.ts +4 -3
- package/dist/figma-bridge-protocol.js +1 -1
- package/dist/index.js +1020 -1006
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-CE6J5MJX.js +0 -49
- package/dist/chunk-CE6J5MJX.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../atomix-sync-core/src/types.ts","../../atomix-sync-core/src/fetch.ts","../../atomix-sync-core/src/sync.ts","../../atomix-sync-core/src/diff.ts","../../atomix-sync-core/src/rules.ts","../../atomix-sync-core/src/formats/css.ts","../../atomix-sync-core/src/formats/scss.ts","../../atomix-sync-core/src/formats/less.ts","../../atomix-sync-core/src/formats/json.ts","../../atomix-sync-core/src/formats/ts.ts","../../atomix-sync-core/src/formats/js.ts","../../atomix-sync-core/src/formats/swift.ts","../../atomix-sync-core/src/formats/kotlin.ts","../../atomix-sync-core/src/formats/dart.ts","../../atomix-sync-core/src/response.ts","../../atomix-sync-core/src/tokens.ts","../../atomix-sync-core/src/config.ts","../../figma-tools/src/build-payloads.ts"],"sourcesContent":["/**\n * Atomix MCP Server - User Design System Mode\n * \n * A minimal MCP server that serves design tokens from a user's\n * Atomix Design System via the public API.\n * \n * Usage:\n * npx @atomixstudio/mcp --ds-id <id> --atomix-token <token>\n * \n * Tools:\n * - getToken: Get a specific token by path\n * - listTokens: List tokens in a category\n * - searchTokens: Search for tokens by name or value\n * - validateUsage: Check if a value follows the design system\n * - getAIToolRules: Generate AI coding rules for this design system\n * - exportMCPConfig: Generate MCP configuration files\n * - getSetupInstructions: Get setup guide for AI tools\n * - syncAll: Sync tokens, AI rules, skills, and dependencies manifest (icons, fonts)\n * \n * @see https://atomix.studio\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\n// Import from core library\nimport {\n fetchDesignSystem,\n getTokenByPath,\n flattenTokens,\n searchTokens,\n getTokenStats,\n compareDesignSystems,\n generateCSSOutput,\n generateSCSSOutput,\n generateLessOutput,\n generateJSONOutput,\n generateTSOutput,\n generateJSOutput,\n generateSwiftOutput,\n generateKotlinOutput,\n generateDartOutput,\n diffTokens,\n formatSyncResponse,\n detectGovernanceChangesByFoundation,\n syncRulesFiles,\n type DesignSystemData,\n type OutputFormat,\n type RulesFileResult,\n type DiffResult,\n} from \"@atomixstudio/sync-core\";\nimport {\n buildFigmaPayloadsFromDS,\n type FigmaTextStylePayload,\n type FigmaDropShadow,\n} from \"@atomix/figma-tools\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { execSync } from \"child_process\";\nimport { platform } from \"os\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport { normalizeBridgeMethod, isAllowedMethod } from \"./figma-bridge-protocol.js\";\n\n// ============================================\n// FIGMA BRIDGE (in-process; plugin connects to this MCP server)\n// ============================================\n\nconst FIGMA_BRIDGE_PORT = Number(process.env.FIGMA_BRIDGE_PORT) || 8765;\nconst FIGMA_BRIDGE_HOST = process.env.FIGMA_BRIDGE_HOST || \"127.0.0.1\";\nconst FIGMA_BRIDGE_TIMEOUT_MS = 15_000;\nconst FIGMA_BRIDGE_TOKEN = process.env.FIGMA_BRIDGE_TOKEN || null;\n\n/** Single source of truth for Figma connection steps. Bridge runs inside this MCP server. */\nconst FIGMA_CONNECTION_INSTRUCTIONS = {\n installAndRun: \"In Figma: Open Plugins and run the Atomix plugin (Atomix Token Extractor). If it's not installed yet, install it from the Figma Community or your team's plugin library, then run it.\",\n connect: \"In the plugin UI, tap **Connect** and wait until the status shows \\\"Connected\\\".\",\n startBridge: \"The Figma bridge runs with this MCP server. Ensure your AI environment has this MCP server running (e.g. in MCP settings), then in Figma run the Atomix plugin and tap Connect.\",\n};\n\nlet bridgeWss: WebSocketServer | null = null;\nlet pluginWs: WebSocket | null = null;\nconst pendingBridgeRequests = new Map<\n string,\n { resolve: (v: unknown) => void; reject: (e: Error) => void; timeout: ReturnType<typeof setTimeout> }\n>();\n\n/** Release port so this MCP can bind; ensures the plugin connects to this process, not a stale one. */\nfunction ensureFigmaBridgePortFree(port: number): void {\n const portStr = String(port);\n const ourPid = String(process.pid);\n try {\n if (platform() === \"win32\") {\n const out = execSync(`netstat -ano`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const pids = new Set<string>();\n for (const line of out.split(/\\r?\\n/)) {\n if (line.includes(`:${portStr}`) && line.includes(\"LISTENING\")) {\n const parts = line.trim().split(/\\s+/);\n const pid = parts[parts.length - 1];\n if (/^\\d+$/.test(pid) && pid !== ourPid) pids.add(pid);\n }\n }\n for (const pid of pids) {\n try {\n execSync(`taskkill /PID ${pid} /F`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n console.error(`[atomix-mcp] Freed Figma bridge port ${port} (killed PID ${pid})`);\n } catch (_) {\n // Process may already be gone\n }\n }\n } else {\n const out = execSync(`lsof -ti :${portStr}`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n if (!out) return;\n const pids = out.split(/\\s+/).filter((p) => p && p !== ourPid);\n for (const pid of pids) {\n try {\n execSync(`kill -9 ${pid}`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n console.error(`[atomix-mcp] Freed Figma bridge port ${port} (killed PID ${pid})`);\n } catch (_) {\n // Process may already be gone\n }\n }\n }\n } catch {\n // lsof exits non-zero when nothing uses the port; netstat can fail in edge cases — ignore\n }\n}\n\nfunction startFigmaBridge(): void {\n if (bridgeWss) return;\n try {\n ensureFigmaBridgePortFree(FIGMA_BRIDGE_PORT);\n bridgeWss = new WebSocketServer({\n host: FIGMA_BRIDGE_HOST,\n port: FIGMA_BRIDGE_PORT,\n clientTracking: true,\n });\n bridgeWss.on(\"connection\", (ws: WebSocket, req) => {\n const url = req.url || \"\";\n const params = new URLSearchParams(url.startsWith(\"/\") ? url.slice(1) : url);\n const token = params.get(\"token\");\n const role = params.get(\"role\");\n\n if (FIGMA_BRIDGE_TOKEN && token !== FIGMA_BRIDGE_TOKEN) {\n ws.close(4003 as number, \"Invalid or missing bridge token\");\n return;\n }\n if (role !== \"plugin\") {\n ws.close(4002 as number, \"Only role=plugin is accepted (bridge runs in MCP server)\");\n return;\n }\n if (pluginWs) {\n try { pluginWs.close(); } catch (_) { /* ignore */ }\n pluginWs = null;\n }\n pluginWs = ws;\n\n ws.on(\"message\", (raw: Buffer | string) => {\n const text = typeof raw === \"string\" ? raw : raw.toString(\"utf8\");\n let msg: unknown;\n try {\n msg = JSON.parse(text);\n } catch {\n return;\n }\n const parsed = msg as { type?: string; id?: string; result?: unknown; error?: string };\n if (parsed?.type === \"ping\" && typeof parsed.id === \"string\") {\n try {\n ws.send(JSON.stringify({ type: \"pong\", id: parsed.id }));\n } catch (_) { /* ignore */ }\n return;\n }\n if (typeof parsed.id === \"string\" && (\"result\" in parsed || \"error\" in parsed)) {\n const pending = pendingBridgeRequests.get(parsed.id);\n if (pending) {\n clearTimeout(pending.timeout);\n pendingBridgeRequests.delete(parsed.id);\n if (parsed.error) pending.reject(new Error(parsed.error));\n else pending.resolve(parsed.result);\n }\n }\n });\n\n ws.on(\"close\", () => {\n if (pluginWs === ws) pluginWs = null;\n });\n ws.on(\"error\", () => {\n if (pluginWs === ws) pluginWs = null;\n });\n });\n bridgeWss.on(\"listening\", () => {\n console.error(`[atomix-mcp] Figma bridge listening on ws://${FIGMA_BRIDGE_HOST}:${FIGMA_BRIDGE_PORT} (local only)`);\n if (FIGMA_BRIDGE_TOKEN) {\n console.error(\"[atomix-mcp] Figma bridge token required (FIGMA_BRIDGE_TOKEN)\");\n }\n });\n bridgeWss.on(\"error\", (err) => {\n console.error(\"[atomix-mcp] Figma bridge server error:\", err);\n });\n } catch (err) {\n console.error(\"[atomix-mcp] Failed to start Figma bridge:\", err);\n }\n}\n\nfunction closeFigmaBridge(): void {\n if (pluginWs) {\n try {\n pluginWs.close();\n } catch (_) {\n /* ignore */\n }\n pluginWs = null;\n }\n if (bridgeWss) {\n try {\n bridgeWss.close();\n } catch (_) {\n /* ignore */\n }\n bridgeWss = null;\n }\n}\n\n/** True if the plugin is connected to the in-process bridge. */\nfunction isBridgeReachable(): Promise<boolean> {\n return Promise.resolve(!!(pluginWs && pluginWs.readyState === WebSocket.OPEN));\n}\n\nfunction sendBridgeRequest(\n method: string,\n params?: Record<string, unknown>,\n timeoutMs: number = FIGMA_BRIDGE_TIMEOUT_MS\n): Promise<unknown> {\n const normalized = normalizeBridgeMethod(method);\n if (!isAllowedMethod(normalized)) {\n return Promise.reject(new Error(`Bridge method not allowed: ${method}`));\n }\n const ws = pluginWs;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(\n new Error(\"Figma plugin not connected. Open Figma, run Atomix plugin, and tap Connect.\")\n );\n }\n const id = `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (pendingBridgeRequests.delete(id)) {\n reject(new Error(\"Figma bridge timeout. \" + FIGMA_CONNECTION_INSTRUCTIONS.startBridge + \" Then \" + FIGMA_CONNECTION_INSTRUCTIONS.connect));\n }\n }, timeoutMs);\n pendingBridgeRequests.set(id, { resolve, reject, timeout });\n try {\n ws.send(JSON.stringify({ id, method: normalized, params }));\n } catch (e) {\n pendingBridgeRequests.delete(id);\n clearTimeout(timeout);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n}\n\n// ============================================\n// CLI ARGUMENTS (for MCP server configuration)\n// ============================================\n\nfunction parseArgs(): { dsId: string | null; apiKey: string | null; accessToken: string | null; apiBase: string | null } {\n const args = process.argv.slice(2);\n let dsId: string | null = null;\n let apiKey: string | null = null;\n let accessToken: string | null = null;\n let apiBase: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ds-id\" && args[i + 1]) {\n dsId = args[i + 1];\n i++;\n } else if (args[i] === \"--api-key\" && args[i + 1]) {\n apiKey = args[i + 1];\n i++;\n } else if (args[i] === \"--atomix-token\" && args[i + 1]) {\n accessToken = args[i + 1];\n i++;\n } else if (args[i] === \"--api-base\" && args[i + 1]) {\n apiBase = args[i + 1];\n i++;\n }\n }\n\n return { dsId, apiKey, accessToken, apiBase };\n}\n\nconst cliArgs = parseArgs();\nconst { dsId, apiKey, accessToken } = cliArgs;\nconst apiBase = cliArgs.apiBase || \"https://atomix.studio\";\n\n// ============================================\n// CACHED DATA (for MCP server)\n// ============================================\n\nlet cachedData: DesignSystemData | null = null;\nlet cachedETag: string | null = null;\n/** Pro Figma for this DS = owner's tier; set after first successful fetch from meta.mcpTier. */\nlet cachedMcpTier: \"free\" | \"pro\" | null = null;\n/** When true, args missing or token/ds-id did not match API; we return no tools/prompts/resources. */\nlet authFailedNoTools = false;\n\n/** True only when both --ds-id and --atomix-token are present. Required for ANY tools/prompts/resources. */\nfunction hasValidAuthConfig(): boolean {\n return !!(dsId && accessToken);\n}\n\n/** Message thrown so the AI tool shows \"requires authentication\" / error state instead of \"No tools, prompts, or resources\". */\nconst AUTH_REQUIRED_MESSAGE =\n \"Atomix MCP requires authentication. Add both --ds-id and --atomix-token to your MCP config (Settings → MCP), then restart your AI tool. Get your token from Atomix Studio: Export modal or Settings → Regenerate Atomix access token.\";\nlet lastChangeSummary: string | null = null;\n\n/** Figma sync tool: free tier. Design-in-Figma tools are plugin-only (run-sync-steps / run-design-steps). */\nconst FIGMA_SYNC_TOOL_NAME = \"syncToFigma\";\n\n// Store affected tokens from last sync for /refactor command\ninterface LastSyncAffectedTokens {\n modified: Array<{ token: string; oldValue: string; newValue: string }>;\n removed: Array<{ token: string; lastValue: string }>;\n added: string[];\n format: string; // \"css\" | \"scss\" | \"swift\" | \"kotlin\" | \"dart\" etc.\n timestamp: string;\n}\nlet lastSyncAffectedTokens: LastSyncAffectedTokens | null = null;\n\n// Helper to get last change summary (MCP-specific, tracks changes for prompts)\nfunction getLastChangeSummary(): string | null {\n return lastChangeSummary;\n}\n\n// Update change summary when fetching (for MCP prompts)\nasync function updateChangeSummary(freshData: DesignSystemData) {\n if (cachedData) {\n const changes = compareDesignSystems(cachedData, freshData);\n lastChangeSummary = changes.summary;\n if (changes.hasChanges) {\n console.error(`[mcp-user] Design system changes detected:\\n${changes.summary}`);\n }\n }\n}\n\n/** Validation result for one file after sync write. */\ninterface SyncValidationEntry {\n path: string;\n status: \"OK\" | \"FAIL\";\n detail: string;\n}\n\n/** Validate token file after write: file exists and contains at least expectedMinVariables (for css/scss/less). */\nfunction validateTokenFileAfterWrite(\n outputPath: string,\n format: string,\n expectedMinVariables: number\n): SyncValidationEntry {\n if (!fs.existsSync(outputPath)) {\n return { path: outputPath, status: \"FAIL\", detail: \"File not found after write.\" };\n }\n const content = fs.readFileSync(outputPath, \"utf-8\");\n if (!content || content.trim().length === 0) {\n return { path: outputPath, status: \"FAIL\", detail: \"File is empty after write.\" };\n }\n if ([\"css\", \"scss\", \"less\"].includes(format)) {\n const varPattern = /(--[a-zA-Z0-9-]+):\\s*[^;]+;/g;\n let count = 0;\n let m: RegExpExecArray | null;\n while ((m = varPattern.exec(content)) !== null) count++;\n if (count < expectedMinVariables) {\n return {\n path: outputPath,\n status: \"FAIL\",\n detail: `Expected at least ${expectedMinVariables} variables; found ${count}.`,\n };\n }\n return { path: outputPath, status: \"OK\", detail: `${count} variables written.` };\n }\n return { path: outputPath, status: \"OK\", detail: \"File written (non-CSS format).\" };\n}\n\n/** Format validation entries into a single block for the sync response. */\nfunction formatValidationBlock(entries: SyncValidationEntry[]): string {\n if (entries.length === 0) return \"\";\n const displayPath = (p: string) => (p.startsWith(\"(\") ? p : path.relative(process.cwd(), p));\n const lines = [\n \"\",\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\n \"VALIDATION (confirm sync succeeded)\",\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\n ...entries.map((e) => ` ${displayPath(e.path)}: ${e.status} — ${e.detail}`),\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\n/** Fetch design system for MCP; uses cache and updates cachedData/cachedETag/cachedMcpTier. Access token is mandatory. */\nasync function fetchDesignSystemForMCP(forceRefresh = false): Promise<DesignSystemData> {\n if (!dsId) throw new Error(\"Missing --ds-id. Usage: npx @atomixstudio/mcp --ds-id <id> --atomix-token <token>\");\n if (!accessToken) throw new Error(\"Missing --atomix-token. Get your token from the Export modal or Settings.\");\n if (forceRefresh) {\n cachedData = null;\n cachedETag = null;\n }\n const result = await fetchDesignSystem({\n dsId,\n accessToken: accessToken,\n apiBase: apiBase ?? undefined,\n etag: forceRefresh ? undefined : cachedETag ?? undefined,\n forceRefresh,\n });\n if (result.status === 304 && cachedData) return cachedData;\n if (result.status === 304 || !result.data) throw new Error(\"No design system data (304 or null)\");\n cachedData = result.data;\n cachedETag = result.etag;\n cachedMcpTier = result.data.meta.mcpTier ?? null;\n await updateChangeSummary(result.data);\n return result.data;\n}\n\n// ============================================\n// TOKEN UTILITIES\n// ============================================\n\nconst TOKEN_CATEGORIES = [\"colors\", \"typography\", \"spacing\", \"sizing\", \"shadows\", \"radius\", \"borders\", \"motion\", \"zIndex\"] as const;\ntype TokenCategory = typeof TOKEN_CATEGORIES[number];\n\n/** Infer font-family role from typeset key (e.g. \"display-2xl\" -> \"display\", \"body-md\" -> \"body\", \"displayXl\" -> \"display\"). */\nfunction typesetKeyToFontFamilyRole(key: string): \"display\" | \"heading\" | \"body\" | \"mono\" {\n const prefix = (key.split(\"-\")[0] ?? key).toLowerCase();\n if (prefix === \"display\" || prefix.startsWith(\"display\")) return \"display\";\n if (prefix === \"heading\" || prefix.startsWith(\"heading\")) return \"heading\";\n if (prefix === \"mono\" || prefix.startsWith(\"mono\")) return \"mono\";\n if (prefix.startsWith(\"body\")) return \"body\";\n return \"body\";\n}\n\n/** Build full list of typesets from exported typography with CSS var names for 1:1 typeset.css generation. */\nfunction buildTypesetsList(typography: Record<string, unknown>, cssPrefix = \"atmx\"): Array<{\n key: string;\n cssClass: string;\n fontFamilyVar: string;\n fontFamilyVarName?: string;\n fontFamilyValue?: string;\n fontSizeVar: string;\n fontWeightVar: string;\n lineHeightVar: string;\n letterSpacingVar?: string;\n textTransformVar?: string;\n textDecorationVar?: string;\n hasTextTransform: boolean;\n hasTextDecoration: boolean;\n}> {\n const fontSize = typography.fontSize as Record<string, string> | undefined;\n if (!fontSize || typeof fontSize !== \"object\") return [];\n\n const fontFamily = (typography.fontFamily as Record<string, string>) ?? {};\n const fontWeight = (typography.fontWeight as Record<string, number | string>) ?? {};\n const lineHeight = (typography.lineHeight as Record<string, number>) ?? {};\n const letterSpacing = (typography.letterSpacing as Record<string, string>) ?? {};\n const textTransform = (typography.textTransform as Record<string, string>) ?? {};\n const textDecoration = (typography.textDecoration as Record<string, string>) ?? {};\n const p = cssPrefix ? `${cssPrefix}-` : \"\";\n\n const typesets: Array<{\n key: string;\n cssClass: string;\n fontFamilyVar: string;\n fontFamilyVarName?: string;\n fontFamilyValue?: string;\n fontSizeVar: string;\n fontWeightVar: string;\n lineHeightVar: string;\n letterSpacingVar?: string;\n textTransformVar?: string;\n textDecorationVar?: string;\n hasTextTransform: boolean;\n hasTextDecoration: boolean;\n }> = [];\n\n for (const key of Object.keys(fontSize)) {\n const role = typesetKeyToFontFamilyRole(key);\n const familyName = fontFamily[role] ?? fontFamily.body;\n const fontFamilyVarName = familyName ? `--${p}typography-font-family-${role}` : undefined;\n const fontFamilyVar = familyName ? `var(${fontFamilyVarName})` : \"\";\n\n const keyKebab = key.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n typesets.push({\n key,\n cssClass: `.typeset-${keyKebab}`,\n fontFamilyVar: fontFamilyVar || \"inherit\",\n fontFamilyVarName,\n fontFamilyValue: familyName,\n fontSizeVar: `var(--${p}typography-${key}-size)`,\n fontWeightVar: `var(--${p}typography-${key}-weight)`,\n lineHeightVar: `var(--${p}typography-${key}-line-height)`,\n letterSpacingVar: letterSpacing[key] != null ? `var(--${p}typography-${key}-letter-spacing)` : undefined,\n textTransformVar: textTransform[key] != null ? `var(--${p}typography-${key}-text-transform)` : undefined,\n textDecorationVar: textDecoration[key] != null ? `var(--${p}typography-${key}-text-decoration)` : undefined,\n hasTextTransform: key in textTransform,\n hasTextDecoration: key in textDecoration,\n });\n }\n\n return typesets;\n}\n\n// Token utilities are imported from core library - no local implementations needed\n\n// ============================================\n// MCP SERVER SETUP\n// ============================================\n\nconst server = new Server(\n {\n name: \"atomix-mcp-user\",\n version: \"1.0.30\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n }\n);\n\n// ============================================\n// TOOL DEFINITIONS\n// ============================================\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n // Strict: --ds-id and --atomix-token MUST both be present for ANY tools\n if (!hasValidAuthConfig()) {\n authFailedNoTools = true;\n console.error(\"[Atomix MCP] Missing --ds-id or --atomix-token. Add both to your MCP config.\");\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n // Resolve tier once so free users don't see Pro Figma tools (null = not yet fetched → treat as free for gating)\n if (cachedMcpTier === null) {\n try {\n // Force full fetch (no 304) on first resolution so we always get meta.mcpTier from the API\n await fetchDesignSystemForMCP(true);\n if (cachedMcpTier === \"pro\") {\n console.error(\"[Atomix MCP] Resolved tier = pro.\");\n } else if (cachedMcpTier === \"free\") {\n console.error(\"[Atomix MCP] Resolved tier = free. syncToFigma and /--sync-to-figma are available.\");\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n authFailedNoTools = true;\n console.error(\n \"[Atomix MCP] Design system not loaded: ds-id or token invalid or API error. No tools will be shown.\",\n msg.includes(\"401\")\n ? \" Token invalid or expired. Regenerate in Atomix Studio (Settings → Regenerate Atomix access token), update your MCP config, then restart your AI tool.\"\n : msg.includes(\"403\")\n ? \" You do not have access to this design system (owner or invited guest).\"\n : msg.includes(\"404\")\n ? \" Design system not found (invalid ds-id).\"\n : msg\n );\n }\n }\n if (authFailedNoTools) {\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n const toolsList = [\n {\n name: \"getToken\",\n description: \"Get a specific design token by its path. Returns the value and CSS variable name.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Token path in dot notation (e.g., 'colors.brand.primary', 'spacing.scale.md')\",\n },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"listTokens\",\n description: \"List all tokens in a category (colors, typography, spacing, sizing, shadows, radius, borders, motion, zIndex).\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n enum: TOKEN_CATEGORIES,\n description: \"Token category to list\",\n },\n subcategory: {\n type: \"string\",\n description: \"Optional subcategory (e.g., 'brand' for colors, 'scale' for spacing)\",\n },\n },\n required: [\"category\"],\n },\n },\n {\n name: \"searchTokens\",\n description: \"Search for tokens by name or value.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (matches token paths or values)\",\n },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"listTypesets\",\n description: \"List every typography typeset in the design system with full CSS variable names. Use this when building typeset.css so you emit one class per typeset and include all properties (font-family, font-size, font-weight, line-height, letter-spacing, text-transform, text-decoration) for 1:1 match. Do not skip any typesets.\",\n inputSchema: {\n type: \"object\",\n properties: {\n cssPrefix: {\n type: \"string\",\n description: \"CSS variable prefix (default: atmx). Use the same prefix as the synced tokens file.\",\n },\n },\n required: [],\n },\n },\n {\n name: \"validateUsage\",\n description: \"Check if a CSS value follows the design system. Detects hardcoded values that should use tokens.\",\n inputSchema: {\n type: \"object\",\n properties: {\n value: {\n type: \"string\",\n description: \"CSS value to validate (e.g., '#ff0000', '16px', 'rgb(0,112,97)')\",\n },\n context: {\n type: \"string\",\n enum: [\"color\", \"spacing\", \"radius\", \"shadow\", \"typography\", \"any\"],\n description: \"Context of the value to help find the right token\",\n },\n },\n required: [\"value\"],\n },\n },\n {\n name: \"getAIToolRules\",\n description: \"Generate design system rules for AI coding tools (Cursor, Copilot, Windsurf, etc.).\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"generic\", \"all\"],\n description: \"AI tool to generate rules for. Use 'all' to get rules for all tools.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"exportMCPConfig\",\n description: \"Generate MCP configuration file for AI tools.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\", \"all\"],\n description: \"AI tool to generate MCP config for.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"getSetupInstructions\",\n description: \"Get detailed setup instructions for a specific AI tool.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"claude-desktop\", \"generic\"],\n description: \"AI tool to get setup instructions for.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"syncAll\",\n description: \"Sync tokens, AI rules, skills (.cursor/skills/atomix-ds/SKILL.md), and atomix-dependencies.json. Use dryRun: true first to report what would change without writing; then dryRun: false to apply. Response includes a VALIDATION section—agent must check it to confirm success. Optional: output (default ./tokens.css), format (default css), skipTokens (if true, only skills and manifest), dryRun (if true, report only; no files written).\",\n inputSchema: {\n type: \"object\",\n properties: {\n output: {\n type: \"string\",\n description: \"Token file path (e.g. ./tokens.css). Default: ./tokens.css. Ignored if skipTokens is true.\",\n },\n format: {\n type: \"string\",\n enum: [\"css\", \"scss\", \"less\", \"json\", \"ts\", \"js\", \"swift\", \"kotlin\", \"dart\"],\n description: \"Token output format. Default: css. Ignored if skipTokens is true.\",\n },\n skipTokens: {\n type: \"boolean\",\n description: \"If true, skip token file and rules sync; only write skills and dependencies manifest. Default: false.\",\n },\n dryRun: {\n type: \"boolean\",\n description: \"If true, compute and return what would be written (paths, token counts, diff summary) but do NOT write any files. Call with dryRun: false to apply. Default: false.\",\n },\n },\n required: [],\n },\n },\n {\n name: \"getDependencies\",\n description: \"Get suggested dependencies for this design system (icon package, fonts, SKILL.md, token files). Use with /--get-started prompt. Optional platform and stack for tailored suggestions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n platform: {\n type: \"string\",\n enum: [\"web\", \"ios\", \"android\"],\n description: \"Target platform (web, ios, android). Optional.\",\n },\n stack: {\n type: \"string\",\n description: \"Stack or framework (e.g. react, vue, next, swift, kotlin). Optional.\",\n },\n },\n required: [],\n },\n },\n {\n name: \"syncToFigma\",\n description: \"Push the owner's design system to Figma: creates color variable collection (Light/Dark), color and paint styles, number variables (spacing, radius, borders, sizing, breakpoints), text styles, and shadow effect styles. Uses local WebSocket bridge and Atomix Figma plugin (no Figma REST API). No arguments. If the bridge is not running, the response includes agentInstruction to start it; only if that fails should the user start the bridge and connect the plugin. Call this when the user asks to 'sync to Figma' or 'push DS to Figma'.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n },\n ];\n return { tools: toolsList };\n});\n\n// ============================================\n// TOOL HANDLERS\n// ============================================\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (!hasValidAuthConfig() || authFailedNoTools) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"MCP access requires valid --ds-id and --atomix-token. Add both to your MCP config and restart your AI tool. No tools are available until then.\",\n }],\n isError: true,\n };\n }\n\n try {\n // Force refresh for syncAll to ensure we get the latest data\n const shouldForceRefresh = name === \"syncAll\";\n const data = await fetchDesignSystemForMCP(shouldForceRefresh);\n\n async function performTokenSyncAndRules(\n designSystemData: DesignSystemData,\n tokenOutput: string,\n tokenFormat: OutputFormat,\n dryRun: boolean\n ): Promise<{ responseText: string; rulesResults: RulesFileResult[]; validation: SyncValidationEntry[] }> {\n const output = tokenOutput;\n const format = tokenFormat;\n const outputPath = path.resolve(process.cwd(), output);\n const fileExists = fs.existsSync(outputPath);\n const deprecatedTokens: Map<string, string> = new Map();\n const existingTokens: Map<string, string> = new Map();\n if (fileExists && [\"css\", \"scss\", \"less\"].includes(format)) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n const oldVarPattern = /(?:^|\\n)\\s*(?:\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*\\/\\s*)?(--[a-zA-Z0-9-]+):\\s*([^;]+);/gm;\n let match;\n while ((match = oldVarPattern.exec(oldContent)) !== null) {\n const varName = match[1];\n const varValue = match[2].trim();\n existingTokens.set(varName, varValue);\n if (!(varName in designSystemData.cssVariables)) deprecatedTokens.set(varName, varValue);\n }\n }\n const mergedCssVariables = { ...designSystemData.cssVariables };\n const darkModeColors = (designSystemData.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n let newContent: string;\n switch (format) {\n case \"css\": newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"scss\": newContent = generateSCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"less\": newContent = generateLessOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"json\": newContent = generateJSONOutput(designSystemData.tokens); break;\n case \"js\": newContent = generateJSOutput(designSystemData.tokens); break;\n case \"ts\": newContent = generateTSOutput(designSystemData.tokens); break;\n case \"swift\": newContent = generateSwiftOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"kotlin\": newContent = generateKotlinOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"dart\": newContent = generateDartOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n default: newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n }\n const tokenCount = Object.keys(mergedCssVariables).length;\n const dsTokenCount = Object.keys(designSystemData.cssVariables).length;\n const deprecatedCount = deprecatedTokens.size;\n let changes: Array<{ key: string; old: string; new: string }> = [];\n let diff: DiffResult | undefined;\n if (fileExists && [\"css\", \"scss\", \"less\"].includes(format)) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n diff = diffTokens(oldContent, mergedCssVariables, format as OutputFormat, darkModeColors?.dark);\n const lightChanges = diff.added.length + diff.modified.length;\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length;\n const totalChanges = lightChanges + darkChanges + deprecatedCount;\n if (totalChanges === 0 && !dryRun) {\n const lastUpdated = designSystemData.meta.exportedAt ? new Date(designSystemData.meta.exportedAt).toLocaleString() : \"N/A\";\n lastSyncAffectedTokens = { modified: [], removed: [], added: [], format, timestamp: new Date().toISOString() };\n return {\n responseText: `✓ Already up to date (checked DB v${designSystemData.meta.version}, exported ${lastUpdated}).\\n\\nFile: ${output}\\nTokens: ${tokenCount}\\nVersion: ${designSystemData.meta.version}\\nLast updated: ${lastUpdated}`,\n rulesResults: [],\n validation: [{ path: outputPath, status: \"OK\", detail: \"No changes needed; file already up to date.\" }],\n };\n }\n if (totalChanges === 0 && dryRun) {\n lastSyncAffectedTokens = { modified: [], removed: [], added: [], format, timestamp: new Date().toISOString() };\n return {\n responseText: `[DRY RUN] Already up to date (checked DB v${designSystemData.meta.version}). No changes would be written.\\n\\nFile: ${output}\\nTokens: ${tokenCount}\\nVersion: ${designSystemData.meta.version}`,\n rulesResults: [],\n validation: [{ path: \"(dry run)\", status: \"OK\", detail: \"No files written.\" }],\n };\n }\n changes = [...diff.modified, ...diff.modifiedDark];\n const removedTokensWithValues: Array<{ token: string; lastValue: string }> = [];\n for (const [token, value] of deprecatedTokens.entries()) removedTokensWithValues.push({ token, lastValue: value });\n lastSyncAffectedTokens = {\n modified: [...diff.modified, ...diff.modifiedDark].map(m => ({ token: m.key, oldValue: m.old, newValue: m.new })),\n removed: removedTokensWithValues,\n added: [...diff.added, ...diff.addedDark],\n format,\n timestamp: new Date().toISOString(),\n };\n }\n\n if (dryRun) {\n const added = diff ? diff.added.length + diff.addedDark.length : 0;\n const modified = diff ? diff.modified.length + diff.modifiedDark.length : 0;\n const changeLine = fileExists && diff\n ? ` Changes: ${added} added, ${modified} modified`\n : !fileExists\n ? ` New file would be created with ${tokenCount} tokens.`\n : \"\";\n const report = [\n \"[DRY RUN] No files were written. The following would be written if you run syncAll with dryRun: false.\",\n \"\",\n \"Token file:\",\n ` Path: ${output}`,\n ` Format: ${format}`,\n ` Tokens: ${tokenCount} (${deprecatedCount} deprecated preserved)`,\n changeLine,\n \"\",\n \"Rules: .cursorrules (or existing rules files in project)\",\n \"\",\n \"Call syncAll again with dryRun: false to apply.\",\n ].filter(Boolean).join(\"\\n\");\n return {\n responseText: report,\n rulesResults: [],\n validation: [{ path: \"(dry run)\", status: \"OK\", detail: \"No files written.\" }],\n };\n }\n\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true });\n fs.writeFileSync(outputPath, newContent);\n const validation: SyncValidationEntry[] = [];\n validation.push(validateTokenFileAfterWrite(outputPath, format, tokenCount));\n\n let rulesResults: RulesFileResult[] = [];\n try {\n rulesResults = await syncRulesFiles({\n dsId: dsId!,\n apiKey: apiKey ?? undefined,\n apiBase: apiBase ?? undefined,\n rulesDir: process.cwd(),\n });\n for (const r of rulesResults) {\n const fullPath = path.resolve(process.cwd(), r.path);\n validation.push({\n path: fullPath,\n status: r.success && fs.existsSync(fullPath) ? \"OK\" : \"FAIL\",\n detail: r.success ? \"Written.\" : (r.error || \"Write failed.\"),\n });\n }\n } catch (error) {\n console.error(`[syncAll] Failed to sync rules: ${error}`);\n }\n const governanceChanges = cachedData ? detectGovernanceChangesByFoundation(cachedData, designSystemData) : [];\n const response = formatSyncResponse({\n data: designSystemData,\n output,\n format,\n dsTokenCount,\n deprecatedCount,\n deprecatedTokens,\n diff,\n changes,\n fileExists,\n rulesResults,\n governanceChanges,\n changeSummary: getLastChangeSummary(),\n hasRefactorRecommendation: !!lastSyncAffectedTokens?.removed.length,\n deprecatedTokenCount: lastSyncAffectedTokens?.removed.length || 0,\n });\n return { responseText: response, rulesResults, validation };\n }\n\n switch (name) {\n case \"getToken\": {\n const path = args?.path as string;\n const value = getTokenByPath(data.tokens, path);\n \n if (value === undefined) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Token not found: ${path}`,\n suggestion: \"Use listTokens or searchTokens to find available tokens.\",\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n // Find CSS variable for this path\n const cssVarKey = `--atmx-${path.replace(/\\./g, \"-\")}`;\n const cssVar = data.cssVariables[cssVarKey];\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n path,\n value,\n cssVariable: cssVar || `var(${cssVarKey})`,\n usage: `style={{ property: \"var(${cssVarKey})\" }}`,\n }, null, 2),\n }],\n };\n }\n\n case \"listTokens\": {\n const category = args?.category as TokenCategory;\n const subcategory = args?.subcategory as string | undefined;\n \n let tokensToList: unknown = data.tokens[category];\n \n if (subcategory && tokensToList && typeof tokensToList === \"object\") {\n tokensToList = getTokenByPath(tokensToList as Record<string, unknown>, subcategory);\n }\n\n if (!tokensToList) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Category not found: ${category}${subcategory ? `.${subcategory}` : \"\"}`,\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n const flat = flattenTokens(tokensToList);\n \n // Enhance tokens with CSS variable names\n const tokensWithCssVars = flat.map(({ path, value }) => {\n // Construct the full path for CSS variable lookup\n const fullPath = subcategory \n ? `${category}.${subcategory}.${path}` \n : `${category}.${path}`;\n \n // Find CSS variable in cssVariables\n let cssVar: string | undefined;\n \n if (category === \"colors\" && subcategory === \"static.brand\") {\n // Brand colors use pattern: --atmx-color-brand-{key}\n // Path is already just the key (e.g., \"testis\", \"primary\")\n cssVar = data.cssVariables[`--atmx-color-brand-${path}`];\n } else if (category === \"colors\" && subcategory?.startsWith(\"modes.\")) {\n // Mode colors use pattern: --atmx-color-{key}\n // Path is already the semantic key (e.g., \"bg-page\", \"text-primary\")\n cssVar = data.cssVariables[`--atmx-color-${path}`];\n } else {\n // For other tokens, try the standard pattern\n const cssVarKey = `--atmx-${fullPath.replace(/\\./g, \"-\")}`;\n cssVar = data.cssVariables[cssVarKey];\n }\n \n return {\n path: fullPath,\n value,\n cssVariable: cssVar || undefined,\n };\n });\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n category,\n subcategory,\n count: tokensWithCssVars.length,\n tokens: tokensWithCssVars.slice(0, 50), // Limit to 50 for readability\n truncated: tokensWithCssVars.length > 50,\n }, null, 2),\n }],\n };\n }\n\n case \"searchTokens\": {\n const query = args?.query as string;\n const results = searchTokens(data.tokens, query);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n query,\n count: results.length,\n results: results.slice(0, 30),\n truncated: results.length > 30,\n }, null, 2),\n }],\n };\n }\n\n case \"listTypesets\": {\n const typography = data.tokens.typography as Record<string, unknown> | undefined;\n const cssPrefix = (args?.cssPrefix as string) || \"atmx\";\n const typesets = typography ? buildTypesetsList(typography, cssPrefix) : [];\n const underlineThickness = typography?.underlineThickness as string | undefined;\n const underlineOffset = typography?.underlineOffset as string | undefined;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n count: typesets.length,\n typesets,\n instruction: \"Emit one CSS rule per typeset using the cssClass and the listed var() properties. Include font-family, font-size, font-weight, line-height; add letter-spacing when present; add text-transform and text-decoration when hasTextTransform/hasTextDecoration are true so the result is 1:1 with the design system. The synced token file quotes font names that contain spaces; no override is needed in the typeset file. For native (iOS/Android) projects, font names with spaces must be quoted or use the platform's canonical font name in theme or resource files.\",\n ...(underlineThickness != null && underlineOffset != null && {\n underlineVars: {\n thickness: `var(--${cssPrefix}-typography-underline-thickness)`,\n offset: `var(--${cssPrefix}-typography-underline-offset)`,\n },\n }),\n }, null, 2),\n }],\n };\n }\n\n case \"validateUsage\": {\n const value = args?.value as string;\n const context = (args?.context as string) || \"any\";\n \n // Check if value is a hardcoded color\n const isHexColor = /^#[0-9A-Fa-f]{3,8}$/.test(value);\n const isRgbColor = /^rgb\\(|^rgba\\(|^hsl\\(/.test(value);\n const isPixelValue = /^\\d+px$/.test(value);\n \n if (!isHexColor && !isRgbColor && !isPixelValue) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: true,\n message: \"Value appears to be using tokens or is not a design token value.\",\n }, null, 2),\n }],\n };\n }\n\n // Search for matching tokens\n const matches = searchTokens(data.tokens, value);\n \n if (matches.length > 0) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. Use a token instead.\",\n matchingTokens: matches.slice(0, 5),\n suggestion: `Use var(--atmx-${matches[0].path.replace(/\\./g, \"-\")}) instead of ${value}`,\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. No exact token match found.\",\n suggestion: `Consider adding this value to the design system or use the closest token.`,\n context,\n }, null, 2),\n }],\n };\n }\n\n case \"getAIToolRules\": {\n const tool = args?.tool as string;\n \n // Fetch rules from the API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool === \"all\" ? \"all\" : tool}`;\n console.error(`[getAIToolRules] Fetching: ${rulesUrl}`);\n \n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n \n try {\n const response = await fetch(rulesUrl, { headers });\n console.error(`[getAIToolRules] Response status: ${response.status}`);\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[getAIToolRules] Error response: ${errorText}`);\n throw new Error(`Failed to fetch rules: ${response.status} - ${errorText}`);\n }\n\n const rules = await response.json() as { rules?: string[]; categories?: Record<string, string[]> };\n console.error(`[getAIToolRules] Got ${rules.rules?.length || 0} rules`);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(rules, null, 2),\n }],\n };\n } catch (fetchError) {\n console.error(`[getAIToolRules] Fetch error:`, fetchError);\n throw fetchError;\n }\n }\n\n case \"exportMCPConfig\": {\n const tool = args?.tool as string;\n \n // Generate MCP config locally (access token is mandatory)\n const serverName = data.meta.name.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n const npxArgs = [\"@atomixstudio/mcp@latest\"];\n if (dsId) npxArgs.push(\"--ds-id\", dsId);\n if (accessToken) npxArgs.push(\"--atomix-token\", accessToken);\n\n const config = {\n mcpServers: {\n [serverName]: {\n command: \"npx\",\n args: npxArgs,\n },\n },\n };\n\n const configs: Record<string, { path: string; content: string }> = {\n cursor: { path: \".cursor/mcp.json\", content: JSON.stringify(config, null, 2) },\n \"claude-desktop\": { path: \"claude_desktop_config.json\", content: JSON.stringify(config, null, 2) },\n windsurf: { path: \".windsurf/mcp.json\", content: JSON.stringify(config, null, 2) },\n continue: { path: \".continue/config.json\", content: JSON.stringify({ models: [], mcpServers: [{ name: serverName, command: \"npx\", args: npxArgs }] }, null, 2) },\n vscode: { path: \".vscode/settings.json\", content: JSON.stringify({ \"mcp.servers\": config.mcpServers }, null, 2) },\n };\n\n if (tool === \"all\") {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n message: \"MCP configurations for all tools\",\n configs: Object.entries(configs).map(([t, c]) => ({\n tool: t,\n path: c.path,\n content: JSON.parse(c.content),\n })),\n }, null, 2),\n }],\n };\n }\n\n const selectedConfig = configs[tool as keyof typeof configs];\n if (!selectedConfig) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(configs),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n tool,\n path: selectedConfig.path,\n content: JSON.parse(selectedConfig.content),\n instructions: `Create the file at ${selectedConfig.path} with the content above, then restart your IDE.`,\n }, null, 2),\n }],\n };\n }\n\n case \"getSetupInstructions\": {\n const tool = args?.tool as string;\n \n const instructions: Record<string, string> = {\n cursor: `# MCP Setup\n\n1. Create your MCP config file in the project (e.g. \\`.cursor/mcp.json\\` for Cursor)\n2. Add the MCP configuration (use exportMCPConfig to get it)\n3. Restart your IDE\n4. Verify by asking: \"What design tokens are available?\"\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n copilot: `# Copilot Setup\n\n1. Create a Copilot instructions file in your project (e.g. \\`.github/copilot-instructions.md\\`)\n2. Use getAIToolRules({ tool: \"copilot\" }) to get the content\n3. Enable custom instructions in your editor (e.g. \\`github.copilot.chat.codeGeneration.useInstructionFiles\\`: true in settings)\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n windsurf: `# Windsurf Setup\n\n1. Create \\`.windsurf/mcp.json\\` in your project root\n2. Create \\`.windsurfrules\\` with rules from getAIToolRules\n3. Restart Windsurf Editor\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n cline: `# Cline Setup\n\n1. Create \\`.clinerules\\` in your project root\n2. Cline auto-detects MCP from .cursor/mcp.json\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n continue: `# Continue Setup\n\n1. Create/edit \\`.continue/config.json\\`\n2. Add mcpServers configuration\n3. Restart VS Code\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n zed: `# Zed Setup\n\n1. Create \\`.zed/assistant/rules.md\\` in your project\n2. Use getAIToolRules({ tool: \"zed\" }) for content\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n \"claude-desktop\": `# Claude Desktop Setup\n\n1. Find your Claude config:\n - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json\n - Windows: %APPDATA%\\\\Claude\\\\claude_desktop_config.json\n2. Add MCP server configuration\n3. Restart Claude Desktop\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n generic: `# Generic AI Tool Setup\n\n1. Create AI_GUIDELINES.md in your project root\n2. Use getAIToolRules({ tool: \"generic\" }) for content\n3. Reference in your prompts or context\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n };\n\n const instruction = instructions[tool];\n if (!instruction) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(instructions),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: instruction,\n }],\n };\n }\n\n case \"syncAll\": {\n const skipTokens = args?.skipTokens === true;\n const dryRun = args?.dryRun === true;\n const output = (args?.output as string) || \"./tokens.css\";\n const format = (args?.format as OutputFormat) || \"css\";\n const parts: string[] = [dryRun ? \"[DRY RUN] syncAll report (no files written).\" : \"✓ syncAll complete.\"];\n let tokenResponseText = \"\";\n const allValidation: SyncValidationEntry[] = [];\n\n if (!skipTokens) {\n const result = await performTokenSyncAndRules(data, output, format, dryRun);\n tokenResponseText = result.responseText;\n allValidation.push(...result.validation);\n if (!dryRun && result.rulesResults.length > 0) {\n parts.push(`Rules: ${result.rulesResults.map(r => r.path).join(\", \")}`);\n }\n if (dryRun) {\n parts.push(`Would write tokens: ${output} (${format})`);\n } else {\n parts.push(`Tokens: ${output} (${format})`);\n }\n }\n\n const dsVersion = String(data.meta.version ?? \"1.0.0\");\n const dsExportedAt = (data.meta as { exportedAt?: string }).exportedAt;\n const skillsDir = path.resolve(process.cwd(), \".cursor/skills/atomix-ds\");\n const skillPath1 = path.join(skillsDir, \"SKILL.md\");\n const manifestPath = path.resolve(process.cwd(), \"atomix-dependencies.json\");\n\n if (dryRun) {\n parts.push(\"Would write skills: .cursor/skills/atomix-ds/SKILL.md\");\n parts.push(\"Would write manifest: atomix-dependencies.json\");\n const reportText = [parts.join(\"\\n\"), tokenResponseText].filter(Boolean).join(\"\\n\\n---\\n\\n\");\n return {\n content: [{ type: \"text\", text: `syncAllResult: DRY_RUN (no files written)\\n\\n${reportText}` }],\n };\n }\n\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n const genericWithVersion = injectSkillVersion(GENERIC_SKILL_MD, dsVersion, dsExportedAt);\n fs.writeFileSync(skillPath1, genericWithVersion);\n allValidation.push({ path: skillPath1, status: fs.existsSync(skillPath1) ? \"OK\" : \"FAIL\", detail: \"Written.\" });\n parts.push(\"Skills: .cursor/skills/atomix-ds/SKILL.md (synced at DS v\" + dsVersion + \")\");\n const tokens = data.tokens as Record<string, unknown>;\n const typography = tokens?.typography as Record<string, unknown> | undefined;\n const fontFamily = typography?.fontFamily as Record<string, string> | undefined;\n const fontNames: string[] = [];\n if (fontFamily) {\n for (const key of [\"display\", \"heading\", \"body\"]) {\n const v = fontFamily[key];\n if (typeof v === \"string\" && v && !fontNames.includes(v)) fontNames.push(v);\n }\n }\n const icons = tokens?.icons as { library?: string; libraryPackage?: string; nativePackage?: string; style?: string; strokeWidth?: string } | undefined;\n const ICON_PACKAGES: Record<string, { web: string; native: string }> = {\n lucide: { web: \"lucide-react\", native: \"lucide-react-native\" },\n heroicons: { web: \"@heroicons/react\", native: \"heroicons-react-native\" },\n phosphor: { web: \"phosphor-react\", native: \"phosphor-react-native\" },\n };\n const lib = icons?.library || \"lucide\";\n const iconPkgs = ICON_PACKAGES[lib] || ICON_PACKAGES.lucide;\n const manifest = {\n designSystem: { name: data.meta.name, version: data.meta.version },\n tokenFile: skipTokens ? undefined : output,\n iconLibrary: {\n package: iconPkgs.web,\n nativePackage: iconPkgs.native,\n strokeWidthToken: icons?.strokeWidth != null ? \"icons.strokeWidth\" : undefined,\n strokeWidthValue: icons?.strokeWidth,\n },\n fonts: { families: fontNames },\n skills: {\n skill: \".cursor/skills/atomix-ds/SKILL.md\",\n syncedAtVersion: data.meta.version ?? \"1.0.0\",\n },\n };\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\n allValidation.push({ path: manifestPath, status: fs.existsSync(manifestPath) ? \"OK\" : \"FAIL\", detail: \"Written.\" });\n parts.push(\"Manifest: atomix-dependencies.json (icons, fonts, skill paths)\");\n const summary = parts.join(\"\\n\");\n const validationBlock = formatValidationBlock(allValidation);\n const hasFailure = allValidation.some((e) => e.status === \"FAIL\");\n const resultLine = hasFailure\n ? \"syncAllResult: FAIL — Check VALIDATION section below. Do not report success to the user.\\n\\n\"\n : \"syncAllResult: OK\\n\\n\";\n const fullText = resultLine + (tokenResponseText\n ? `${summary}\\n\\n---\\n\\n${tokenResponseText}${validationBlock}`\n : `${summary}${validationBlock}`);\n return {\n content: [{ type: \"text\", text: fullText }],\n };\n }\n\n case \"getDependencies\": {\n const platform = args?.platform as string | undefined;\n const stack = args?.stack as string | undefined;\n const tokens = data.tokens as Record<string, unknown>;\n const typography = tokens?.typography as Record<string, unknown> | undefined;\n const fontFamily = typography?.fontFamily as Record<string, string> | undefined;\n const fontNames: string[] = [];\n if (fontFamily) {\n for (const key of [\"display\", \"heading\", \"body\"]) {\n const v = fontFamily[key];\n if (typeof v === \"string\" && v && !fontNames.includes(v)) fontNames.push(v);\n }\n }\n const icons = tokens?.icons as { library?: string; libraryPackage?: string; nativePackage?: string; style?: string; strokeWidth?: string } | undefined;\n const ICON_PACKAGES: Record<string, { web: string; native: string }> = {\n lucide: { web: \"lucide-react\", native: \"lucide-react-native\" },\n heroicons: { web: \"@heroicons/react\", native: \"heroicons-react-native\" },\n phosphor: { web: \"phosphor-react\", native: \"phosphor-react-native\" },\n };\n const lib = icons?.library || \"lucide\";\n const iconPkgs = ICON_PACKAGES[lib] || ICON_PACKAGES.lucide;\n const payload = {\n iconLibrary: {\n package: iconPkgs.web,\n nativePackage: iconPkgs.native,\n strokeWidthToken: icons?.strokeWidth != null ? \"icons.strokeWidth\" : undefined,\n strokeWidthValue: icons?.strokeWidth,\n performanceHint: \"Use individual SVG imports for tree-shaking. Apply the design system's icon tokens: sizing via getToken('sizing.icon.sm') or listTokens('sizing'), and stroke width via getToken('icons.strokeWidth') when the DS defines it. Do not use hardcoded sizes or stroke widths.\",\n },\n fonts: {\n families: fontNames,\n performanceHint: \"Link fonts via URL (e.g. Google Fonts <link> or CSS @import); no need to download font files or add them to the repo. Prefer font-display: swap when possible. You must also build a complete typeset CSS: call listTypesets to get every typeset from the design system, then emit one CSS class per typeset (do not skip any). For each class set font-family, font-size, font-weight, line-height, letter-spacing; when the typeset has text-transform or text-decoration, set those too so the result is 1:1 with the DS. Use the CSS variable names returned by listTypesets. Do not create a file that only contains a font import.\",\n },\n skill: {\n path: \".cursor/skills/atomix-ds/SKILL.md\",\n content: GENERIC_SKILL_MD,\n },\n tokenFiles: {\n files: [\"tokens.css\", \"tokens.json\"],\n copyInstructions: \"Call the syncAll MCP tool to create the token file, skills, and atomix-dependencies.json; do not only suggest the user run sync later.\",\n },\n showcase: platform === \"web\" || !platform\n ? {\n path: \"atomix-setup-showcase.html\",\n template: SHOWCASE_HTML_TEMPLATE,\n substitutionInstructions: \"Replace placeholders with values from the synced token file. MCP/sync/export use the --atmx- prefix. {{TOKENS_CSS_PATH}} = path to the synced token file (e.g. ./tokens.css, same as syncAll output). {{TYPESETS_LINK}} = if a typeset CSS file was created (e.g. typesets.css), the full tag e.g. <link rel=\\\"stylesheet\\\" href=\\\"typesets.css\\\">, otherwise empty string. {{DS_NAME}} = design system name. {{BRAND_PRIMARY_VAR}} = var(--atmx-color-brand-primary). {{BRAND_PRIMARY_FOREGROUND_VAR}} = var(--atmx-color-brand-primary-foreground). {{HEADING_FONT_VAR}} = var(--atmx-typography-font-family-heading) or var(--atmx-typography-font-family-display). {{FONT_FAMILY_VAR}} = var(--atmx-typography-font-family-body). {{LARGEST_DISPLAY_TYPESET_CLASS}} = largest display typeset class from listTypesets (display role, largest font size; e.g. typeset-display-2xl or typeset-display-bold), or empty string if no typeset file. {{BODY_TYPESET_CLASS}} = typeset class for body text from listTypesets (e.g. typeset-body-md), or empty string if no typeset file. {{FONT_LINK_TAG}} = Google Fonts <link> for the font, or empty string. Do not invent CSS variable names; use only vars that exist in the export.\",\n }\n : undefined,\n meta: {\n dsName: data.meta.name,\n platform: platform ?? undefined,\n stack: stack ?? undefined,\n designSystemVersion: data.meta.version ?? \"1.0.0\",\n designSystemExportedAt: (data.meta as { exportedAt?: string }).exportedAt,\n },\n };\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n }],\n };\n }\n\n case \"syncToFigma\": {\n const payloads = buildFigmaPayloadsFromDS(data);\n const out: {\n colorVariables?: unknown;\n paintStyles?: unknown;\n numberVariables?: unknown;\n textStyles?: unknown;\n effectStyles?: unknown;\n error?: string;\n /** True when bridge is not reachable; agent should try to start it first. */\n bridgeNotRunning?: boolean;\n /** Instruction for the agent: start the bridge, then call syncToFigma again. */\n agentInstruction?: string;\n /** Fallback for the user if the agent cannot start the bridge or sync still fails. */\n userInstruction?: string;\n summary?: string;\n numberVariablesHint?: string;\n motionEasingNote?: string;\n figmaPayload?: {\n colorVariableCollections: Array<{ collectionName: string; modes: string[]; variables: Array<{ name: string; values?: Record<string, string>; aliasByMode?: Record<string, string> }>; applyScopes: boolean }>;\n paintStyles: Array<{ name: string; color: string }>;\n textStyles: FigmaTextStylePayload[];\n numberVariableCollections: Array<{ collectionName: string; categoryKey: string; variables: Array<{ name: string; value: number }>; scopes: string[] }>;\n effectStyles: Array<{ name: string; effects: FigmaDropShadow[] }>;\n };\n } = {};\n const agentStartBridge = `The Figma bridge runs with this MCP server. Ensure your AI environment has this MCP server configured and running, then in Figma run the Atomix plugin and tap Connect. Then call **syncToFigma** again.`;\n const userSteps = [\n FIGMA_CONNECTION_INSTRUCTIONS.startBridge,\n FIGMA_CONNECTION_INSTRUCTIONS.installAndRun,\n FIGMA_CONNECTION_INSTRUCTIONS.connect,\n \"Then run Sync to Figma again.\",\n ].join(\" \");\n try {\n const reachable = await isBridgeReachable();\n if (!reachable) {\n out.bridgeNotRunning = true;\n out.agentInstruction = agentStartBridge;\n out.userInstruction = `If the bridge still does not connect: ${userSteps}`;\n out.figmaPayload = {\n colorVariableCollections: payloads.colorVariableCollections,\n paintStyles: payloads.paintStyles,\n textStyles: payloads.textStyles,\n numberVariableCollections: payloads.numberVariableCollections,\n effectStyles: payloads.effectStyles,\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(out, null, 2) }],\n };\n }\n const colorResults: Array<{ collectionName: string; result?: unknown }> = [];\n for (const coll of payloads.colorVariableCollections) {\n if (coll.variables.length > 0) {\n const result = await sendBridgeRequest(\"create_color_variables\", {\n collectionName: coll.collectionName,\n modes: coll.modes,\n variables: coll.variables,\n removeVariablesNotInPayload: true,\n applyScopes: coll.applyScopes,\n });\n colorResults.push({ collectionName: coll.collectionName, result });\n }\n }\n if (colorResults.length > 0) {\n out.colorVariables = colorResults.length === 1 ? colorResults[0].result : colorResults;\n }\n if (payloads.paintStyles.length > 0) {\n out.paintStyles = await sendBridgeRequest(\"create_paint_styles\", {\n styles: payloads.paintStyles,\n removePaintStylesNotInPayload: true,\n });\n }\n if (payloads.numberVariableCollections.length > 0) {\n const numberResults: Array<{ categoryKey: string; result?: unknown; error?: string }> = [];\n try {\n for (const coll of payloads.numberVariableCollections) {\n const result = await sendBridgeRequest(\"create_number_variables\", {\n collectionName: coll.collectionName,\n variables: coll.variables.map((v) => ({ name: v.name, value: v.value })),\n scopes: coll.scopes,\n removeVariablesNotInPayload: true,\n });\n numberResults.push({ categoryKey: coll.categoryKey, result });\n }\n out.numberVariables = numberResults;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n out.numberVariables = { error: msg };\n if (msg.includes(\"Method not allowed\") && msg.includes(\"create_number_variables\")) {\n out.numberVariablesHint = \"Number variables require the latest Atomix Figma plugin and bridge. Rebuild the plugin and bridge, reload the plugin in Figma, restart the bridge, then sync again.\";\n }\n }\n }\n if (payloads.textStyles.length > 0) {\n out.textStyles = await sendBridgeRequest(\"create_text_styles\", {\n styles: payloads.textStyles,\n removeTextStylesNotInPayload: true,\n });\n }\n if (payloads.effectStyles.length > 0) {\n out.effectStyles = await sendBridgeRequest(\"create_effect_styles\", {\n styles: payloads.effectStyles,\n removeShadowStylesNotInPayload: true,\n });\n }\n out.figmaPayload = {\n colorVariableCollections: payloads.colorVariableCollections,\n paintStyles: payloads.paintStyles,\n textStyles: payloads.textStyles,\n numberVariableCollections: payloads.numberVariableCollections,\n effectStyles: payloads.effectStyles,\n };\n } catch (e) {\n out.error = e instanceof Error ? e.message : String(e);\n out.figmaPayload = {\n colorVariableCollections: payloads.colorVariableCollections,\n paintStyles: payloads.paintStyles,\n textStyles: payloads.textStyles,\n numberVariableCollections: payloads.numberVariableCollections,\n effectStyles: payloads.effectStyles,\n };\n const errMsg = out.error.toLowerCase();\n const connectionFailure = errMsg.includes(\"econnrefused\") || errMsg.includes(\"bridge timeout\") || errMsg.includes(\"websocket\") || errMsg.includes(\"network\");\n if (connectionFailure) {\n out.bridgeNotRunning = true;\n out.agentInstruction = agentStartBridge;\n out.userInstruction = `If the bridge still does not connect: ${userSteps}`;\n } else if (errMsg.includes(\"plugin not connected\") || errMsg.includes(\"figma plugin\")) {\n out.userInstruction = `${FIGMA_CONNECTION_INSTRUCTIONS.installAndRun} ${FIGMA_CONNECTION_INSTRUCTIONS.connect}`;\n }\n }\n const textStylesResult = out.textStyles as { failed?: number; failures?: Array<{ name: string; reason: string }>; created?: number; updated?: number } | undefined;\n if (textStylesResult?.failed && textStylesResult.failures?.length) {\n const firstReason = textStylesResult.failures[0].reason;\n out.summary = `Text styles: ${textStylesResult.failed} could not be created. ${firstReason}`;\n }\n if (out.numberVariablesHint) {\n out.summary = [out.summary, out.numberVariablesHint].filter(Boolean).join(\" \");\n }\n // Build a change summary from bridge results (created/updated/removed) so the chat highlights what changed\n const summaryParts: string[] = [];\n const colorResult = out.colorVariables as\n | { variableNames?: string[]; removed?: number; removedNames?: string[] }\n | Array<{ collectionName: string; result?: { variableNames?: string[]; removed?: number; removedNames?: string[] } }>\n | undefined;\n if (colorResult) {\n const results = Array.isArray(colorResult) ? colorResult : [{ result: colorResult }];\n let totalSynced = 0;\n let totalRemoved = 0;\n for (const r of results) {\n const res = (r as { result?: { variableNames?: string[]; removed?: number } }).result;\n if (res?.variableNames?.length) totalSynced += res.variableNames.length;\n if ((res?.removed ?? 0) > 0) totalRemoved += res!.removed ?? 0;\n }\n if (totalSynced > 0 || totalRemoved > 0) {\n const parts: string[] = [];\n if (totalSynced > 0) parts.push(`${totalSynced} synced`);\n if (totalRemoved > 0) parts.push(`${totalRemoved} removed`);\n summaryParts.push(`Colors: ${parts.join(\", \")}.`);\n }\n }\n const paintResult = out.paintStyles as { created?: number; updated?: number; removed?: number; createdNames?: string[]; updatedNames?: string[]; removedNames?: string[] } | undefined;\n if (paintResult) {\n const c = paintResult.created ?? 0;\n const u = paintResult.updated ?? 0;\n const r = paintResult.removed ?? 0;\n if (c + u + r > 0) {\n const parts: string[] = [];\n if (c > 0) parts.push(`${c} created`);\n if (u > 0) parts.push(`${u} updated`);\n if (r > 0) parts.push(`${r} removed`);\n summaryParts.push(`Paint styles: ${parts.join(\", \")}.`);\n }\n }\n const effectResult = out.effectStyles as { created?: number; updated?: number; removed?: number; createdNames?: string[]; updatedNames?: string[]; removedNames?: string[] } | undefined;\n if (effectResult) {\n const c = effectResult.created ?? 0;\n const u = effectResult.updated ?? 0;\n const r = effectResult.removed ?? 0;\n if (c + u + r > 0) {\n const parts: string[] = [];\n if (c > 0) parts.push(`${c} created`);\n if (u > 0) parts.push(`${u} updated`);\n if (r > 0) parts.push(`${r} removed`);\n summaryParts.push(`Effect styles (shadows): ${parts.join(\", \")}.`);\n if (effectResult.removedNames?.length) {\n summaryParts.push(`Removed: ${effectResult.removedNames.join(\", \")}.`);\n }\n }\n }\n const numResult = out.numberVariables as Array<{ categoryKey: string; result?: { variableNames?: string[]; removed?: number; removedNames?: string[] } }> | undefined;\n if (Array.isArray(numResult)) {\n const total = numResult.reduce((acc, r) => acc + (r.result?.variableNames?.length ?? 0), 0);\n const totalRemoved = numResult.reduce((acc, r) => acc + (r.result?.removed ?? 0), 0);\n if (total > 0 || totalRemoved > 0) {\n const parts: string[] = [];\n if (total > 0) parts.push(`${total} synced`);\n if (totalRemoved > 0) parts.push(`${totalRemoved} removed`);\n summaryParts.push(`Number variables: ${parts.join(\", \")}.`);\n }\n }\n const textStylesWithRemoved = out.textStyles as { created?: number; updated?: number; removed?: number; removedNames?: string[] } | undefined;\n if (textStylesWithRemoved && (textStylesWithRemoved.created ?? 0) + (textStylesWithRemoved.updated ?? 0) + (textStylesWithRemoved.removed ?? 0) > 0) {\n const c = textStylesWithRemoved.created ?? 0;\n const u = textStylesWithRemoved.updated ?? 0;\n const r = textStylesWithRemoved.removed ?? 0;\n const parts: string[] = [];\n if (c > 0) parts.push(`${c} created`);\n if (u > 0) parts.push(`${u} updated`);\n if (r > 0) parts.push(`${r} removed`);\n summaryParts.push(`Text styles: ${parts.join(\", \")}.`);\n }\n if (summaryParts.length > 0 && !out.error) {\n out.summary = [out.summary, summaryParts.join(\" \")].filter(Boolean).join(\" \");\n }\n out.motionEasingNote = \"Motion easing tokens are not synced as Figma styles; Figma has no reusable easing style. Easing is only used in prototype transitions (e.g. smart animate). Duration/easing remain available as number variables (duration) or in export JSON.\";\n const responseText = out.summary ? `${out.summary}\\n\\n${JSON.stringify(out, null, 2)}` : JSON.stringify(out, null, 2);\n return {\n content: [{\n type: \"text\",\n text: responseText,\n }],\n ...(out.error ? { isError: true } : {}),\n };\n }\n\n\n default:\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${name}`,\n availableTools: [\"getToken\", \"listTokens\", \"listTypesets\", \"searchTokens\", \"validateUsage\", \"getAIToolRules\", \"exportMCPConfig\", \"getSetupInstructions\", \"syncAll\", \"getDependencies\", \"syncToFigma\"],\n }, null, 2),\n }],\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n let suggestion = \"Check your MCP server configuration.\";\n \n if (errorMessage.includes(\"Missing --ds-id\")) {\n suggestion = \"Add --ds-id <your-design-system-id> to your MCP server configuration.\";\n } else if (errorMessage.includes(\"Failed to fetch\")) {\n const statusMatch = errorMessage.match(/Failed to fetch design system: (\\d+)/);\n if (statusMatch) {\n const status = statusMatch[1];\n if (status === \"404\") {\n suggestion = `Design system ID \"${dsId}\" not found. Verify the ID is correct or the design system has been published.`;\n } else if (status === \"401\" || status === \"403\") {\n suggestion = \"Add --atomix-token <your-token> from the Export modal or Settings → Regenerate.\";\n } else {\n suggestion = `API request failed (${status}). Check your network connection and API base URL (${apiBase}).`;\n }\n } else {\n suggestion = `Failed to connect to API at ${apiBase}. Check your network connection.`;\n }\n }\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: errorMessage,\n suggestion,\n configured: {\n dsId: dsId || \"not set\",\n apiBase: apiBase || \"not set\",\n hasApiKey: !!apiKey,\n },\n }, null, 2),\n }],\n isError: true,\n };\n }\n});\n\n// ============================================\n// SKILL VERSIONING (inject DS version so AI can suggest syncAll when behind)\n// ============================================\n\nfunction injectSkillVersion(content: string, version: string, exportedAt: string | undefined): string {\n const endOfFrontmatter = content.indexOf(\"\\n---\\n\", 3);\n if (endOfFrontmatter === -1) return content;\n const before = content.slice(0, endOfFrontmatter);\n const after = content.slice(endOfFrontmatter);\n const versionLines = `atomixDsVersion: \"${version}\"\\natomixDsExportedAt: \"${exportedAt ?? \"\"}\"\\n`;\n return before + \"\\n\" + versionLines + after;\n}\n\n// ============================================\n// GENERIC SKILL.MD (coding-platform agnostic)\n// ============================================\n\nconst GENERIC_SKILL_MD = `---\nname: atomix-ds\ndescription: Use the Atomix design system for UI, tokens, and styles. Fetch rules and tokens via MCP tools; never hardcode design values.\n---\n\n# Atomix Design System\n\nUse this skill when editing UI, design system files, or when the user asks to follow the project's design system. Your job is to **get the relevant data from the design system via MCP** and apply it—not to guess or invent values.\n\n## Goal\n\nComplete the user's task using the design system as the single source of truth. Every color, spacing, typography, radius, shadow, or sizing value must come from the MCP tools (tokens or governance rules). Do not hardcode hex codes, pixel values, or font names.\n\n## When to use\n\n- Building or editing UI components, pages, or styles\n- Working in design system or token files (e.g. \\`tokens.css\\`, theme files)\n- User asks to \"follow the design system\", \"use tokens\", or \"match the DS\"\n- Validating or refactoring existing code, UI or visual design for token compliance\n\n## How to get design system data\n\n**1. Governance rules (how to use tokens in code)** \nCall **getAIToolRules** with the tool id for your current environment: \\`cursor\\`, \\`windsurf\\`, \\`copilot\\`, \\`cline\\`, \\`continue\\`, \\`zed\\`, or \\`generic\\`. \nExample: \\`getAIToolRules({ tool: \"cursor\" })\\`. \nAlternatively use the **/--rules** prompt or the resource \\`atomix://rules/<tool>\\`.\n\n**2. Token values (what to use in code)** \n- **getToken(path)** — One token by path (e.g. \\`colors.brand.primary\\`, \\`typography.fontSize.lg\\`, \\`sizing.icon.sm\\`, \\`icons.strokeWidth\\`). Icon stroke width is at \\`icons.strokeWidth\\` when the design system defines it.\n- **listTokens(category)** — All tokens in a category: \\`colors\\`, \\`typography\\`, \\`spacing\\`, \\`sizing\\`, \\`shadows\\`, \\`radius\\`, \\`borders\\`, \\`motion\\`, \\`zIndex\\`. For icon config (e.g. stroke width), use \\`getToken(\"icons.strokeWidth\")\\` since \\`icons\\` is not a list category.\n- **searchTokens(query)** — Find tokens by name or value.\n\n**3. Validation** \n- **validateUsage(value, context)** — Check if a CSS/value should use a token instead (e.g. \\`validateUsage(\"#007061\", \"color\")\\`).\n\n**4. Syncing tokens to a file** \n- **syncAll({ output?, format?, skipTokens? })** — Syncs tokens to a file, AI rules, skills (.cursor/skills/atomix-ds/*), and atomix-dependencies.json. Default output \\`./tokens.css\\`, format \\`css\\`. Use \\`skipTokens: true\\` to only write skills and manifest.\n\nUse the returned rules and token paths/values when generating or editing code. Prefer CSS variables (e.g. \\`var(--atmx-*)\\`) or the exact token references from the tools.\n\n## Best practices\n\n- **Fetch first:** Before writing UI or styles, call getAIToolRules and/or getToken/listTokens so you know the exact tokens and conventions.\n- **Icons:** Apply the design system's icon tokens when rendering icons: sizing via \\`getToken(\"sizing.icon.sm\")\\` or \\`listTokens(\"sizing\")\\`, and stroke width via \\`getToken(\"icons.strokeWidth\")\\` when the DS defines it; do not use hardcoded sizes or stroke widths.\n- **Typography:** Use typography tokens from the DS for any text. When creating global typeset CSS, call **listTypesets** and emit one CSS class per typeset (do not skip any); include text-transform and text-decoration when present for 1:1 match.\n- **No guessing:** If a value is not in the rules or token list, use searchTokens or listTokens to find the closest match rather than inventing a value.\n- **Version check:** If this skill file has frontmatter \\`atomixDsVersion\\`, compare it to the design system version from **getDependencies** (\\`meta.designSystemVersion\\`). If the design system is newer, suggest the user run **syncAll** to update skills and tokens.\n`;\n\n// ============================================\n// SETUP SHOWCASE HTML (exact structure for get-started web)\n// ============================================\n// Placeholders: {{TOKENS_CSS_PATH}}, {{TYPESETS_LINK}}, {{DS_NAME}}, {{BRAND_PRIMARY_VAR}}, {{BRAND_PRIMARY_FOREGROUND_VAR}}, {{HEADING_FONT_VAR}}, {{FONT_FAMILY_VAR}}, {{LARGEST_DISPLAY_TYPESET_CLASS}}, {{BODY_TYPESET_CLASS}}, {{FONT_LINK_TAG}}\n// All var placeholders must be replaced with actual token var() from the synced file (prefix is --atmx- per MCP/sync/export). No made-up CSS vars.\nconst SHOWCASE_HTML_TEMPLATE = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Setup complete — {{DS_NAME}}</title>\n {{FONT_LINK_TAG}}\n <link rel=\"stylesheet\" href=\"{{TOKENS_CSS_PATH}}\">\n {{TYPESETS_LINK}}\n <style>\n * { box-sizing: border-box; }\n body {\n margin: 0;\n font-family: {{FONT_FAMILY_VAR}}, system-ui, sans-serif;\n background: {{BRAND_PRIMARY_VAR}};\n color: {{BRAND_PRIMARY_FOREGROUND_VAR}};\n min-height: 100vh;\n padding: 2rem;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .wrap { width: 375px; max-width: 100%; }\n .icon { width: 2rem; height: 2rem; margin: 0 0 1rem; }\n h1 {\n font-family: {{HEADING_FONT_VAR}}, {{FONT_FAMILY_VAR}}, system-ui, sans-serif;\n font-size: clamp(3rem, 4vw, 5rem);\n font-weight: 700;\n margin: 0 0 0.75rem;\n line-height: 1.2;\n }\n .lead { margin: 0 0 1.5rem; font-size: 1rem; line-height: 1.5; opacity: 0.95; }\n .now { margin: 1.5rem 0 0; font-size: 0.875rem; line-height: 1.6; opacity: 0.95; text-align: left; }\n .now strong { display: block; margin-bottom: 0.5rem; }\n .now ul { margin: 0; padding-left: 1.25rem; }\n .tips { margin-top: 1.5rem; font-size: 0.875rem; line-height: 1.6; opacity: 0.9; }\n .tips a { color: inherit; text-decoration: underline; }\n </style>\n</head>\n<body class=\"{{BODY_TYPESET_CLASS}}\">\n <div class=\"wrap\">\n <div class=\"icon\" aria-hidden=\"true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"44\" height=\"44\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <h1 class=\"{{LARGEST_DISPLAY_TYPESET_CLASS}}\">You're all set with {{DS_NAME}}</h1>\n <p class=\"lead\">This page uses your design system: brand primary as background, headline and body typesets, and an icon.</p>\n <div class=\"now\">\n <strong>What you can do now:</strong>\n <ul>\n <li>Ask your agent to build your designs using the design system tokens</li>\n <li>Build components and pages that use <code>var(--atmx-*)</code> for colors, spacing, and typography</li>\n <li>Run <code>/--rules</code> to load governance rules; run <code>/--sync</code> and <code>/--refactor</code> after you change tokens in Atomix Studio</li>\n </ul>\n </div>\n <p class=\"tips\">Keep the source of truth at <a href=\"https://atomix.studio\" target=\"_blank\" rel=\"noopener\">atomix.studio</a> — avoid editing token values in this repo.</p>\n </div>\n</body>\n</html>\n`;\n\n// ============================================\n// RESOURCE HANDLERS\n// ============================================\n\nconst AI_TOOLS = [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"generic\"] as const;\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n if (!hasValidAuthConfig() || authFailedNoTools) {\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n try {\n await fetchDesignSystemForMCP();\n // Return empty list so resources are hidden in UI; AI can still read atomix://hello and atomix://rules/<tool> via ReadResource.\n return { resources: [] };\n } catch {\n authFailedNoTools = true;\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n // Only atomix://setup is available when args missing or auth failed (so user can see how to configure)\n if (uri === \"atomix://setup\") {\n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: `# Configure Atomix MCP\n\nAdd \\`--ds-id\\` and \\`--atomix-token\\` to your MCP server config (both required).\n\nExample (\\`.cursor/mcp.json\\`):\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\", \"--ds-id\", \"<your-ds-id>\", \"--atomix-token\", \"<your-token>\"]\n }\n }\n}\n\\`\\`\\`\n\nGet your DS ID and token from the Export modal or Settings → Regenerate Atomix access token.`,\n }],\n };\n }\n\n if (!hasValidAuthConfig() || authFailedNoTools) {\n throw new Error(\"MCP access requires valid --ds-id and --atomix-token. Add both to your MCP config and restart your AI tool. See atomix://setup for instructions.\");\n }\n\n const data = await fetchDesignSystemForMCP();\n const stats = getTokenStats(data);\n\n // Welcome resource\n if (uri === \"atomix://hello\") {\n const welcome = generateWelcomeMessage(data, stats);\n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: welcome,\n }],\n };\n }\n\n // Rules resources\n const rulesMatch = uri.match(/^atomix:\\/\\/rules\\/(.+)$/);\n if (rulesMatch) {\n const tool = rulesMatch[1];\n if (!AI_TOOLS.includes(tool as typeof AI_TOOLS[number])) {\n throw new Error(`Unknown tool: ${tool}. Available: ${AI_TOOLS.join(\", \")}`);\n }\n\n // Fetch rules from API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch rules: ${response.status}`);\n }\n\n const rulesData = await response.json() as { content?: string; tool?: string };\n \n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: rulesData.content || JSON.stringify(rulesData, null, 2),\n }],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n});\n\n// ============================================\n// PROMPTS - Auto-suggest hello on connection\n// ============================================\n\nserver.setRequestHandler(ListPromptsRequestSchema, async () => {\n if (!hasValidAuthConfig()) {\n authFailedNoTools = true;\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n if (cachedMcpTier === null && !authFailedNoTools) {\n try {\n await fetchDesignSystemForMCP(true);\n } catch {\n authFailedNoTools = true;\n }\n }\n if (authFailedNoTools) {\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n const prompts = [\n { name: \"--hello\", description: \"Get started with this design system - overview, tokens, and tools. Run this first!\" },\n { name: \"--get-started\", description: \"Get started with design system in project. Three phases: scan, report and ask, then create only after you approve.\" },\n { name: \"--rules\", description: \"Get the design system governance rules for your AI coding tool (default: cursor).\" },\n { name: \"--sync\", description: \"Sync tokens, AI rules, skills files, and dependencies manifest (icons, fonts). Use /--refactor to migrate deprecated tokens.\" },\n { name: \"--refactor\", description: \"Migrate deprecated tokens in codebase. Run after /--sync.\" },\n { name: \"--sync-to-figma\", description: \"Push this design system to Figma (variables, color + typography styles). Uses local bridge + plugin; no Figma token.\" },\n ];\n return { prompts };\n});\n\nserver.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (!hasValidAuthConfig() || authFailedNoTools) {\n return {\n description: \"MCP Server Configuration Required\",\n messages: [{\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: \"MCP access requires valid --ds-id and --atomix-token. Add both to your MCP config and restart your AI tool. No tools or prompts are available until then.\",\n },\n }],\n };\n }\n\n // Map -- prompt names to internal handler names (works across AI tools)\n const canonicalName =\n name === \"--hello\" ? \"hello\"\n : name === \"--get-started\" ? \"atomix-setup\"\n : name === \"--rules\" ? \"design-system-rules\"\n : name === \"--sync\" ? \"sync\"\n : name === \"--refactor\" ? \"refactor\"\n : (name === \"--sync-to-figma\" || name === \"syncToFigma\") ? \"sync-to-figma\"\n : name;\n\n // Try to fetch design system, but handle gracefully if not configured\n // Force refresh for sync and refactor prompts to ensure we get latest data from DB\n const shouldForceRefresh = canonicalName === \"sync\" || canonicalName === \"refactor\";\n let data: DesignSystemData | null = null;\n let stats: ReturnType<typeof getTokenStats> | null = null;\n \n try {\n data = await fetchDesignSystemForMCP(shouldForceRefresh);\n stats = getTokenStats(data);\n } catch (error) {\n // If design system fetch fails, return helpful error message\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n \n if (errorMessage.includes(\"Missing --ds-id\")) {\n // Missing ds-id configuration\n return {\n description: \"MCP Server Configuration Required\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `The MCP server isn't configured. To use design system prompts, you need to configure the server with:\n- \\`--ds-id\\`: Your design system ID (get it from https://atomix.studio/ds/[your-ds-id])\n- \\`--atomix-token\\`: Your access token (get it from the Export modal or Settings → Regenerate Atomix access token)\n\nBoth are required. Configure the MCP server in your AI tool's MCP settings, then restart your AI tool.`,\n },\n },\n ],\n };\n } else if (errorMessage.includes(\"Failed to fetch\")) {\n // API fetch failed - show actual error details\n const statusMatch = errorMessage.match(/Failed to fetch design system: (\\d+) (.+)/);\n const status = statusMatch ? statusMatch[1] : \"unknown\";\n const details = statusMatch ? statusMatch[2] : errorMessage;\n \n let helpText = `**Error:** Failed to fetch design system from ${apiBase}/api/ds/${dsId}/tokens\\n\\n`;\n helpText += `**Status:** ${status}\\n`;\n helpText += `**Details:** ${details}\\n\\n`;\n \n if (status === \"404\") {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Design system ID \"${dsId}\" doesn't exist\\n`;\n helpText += `- API base URL \"${apiBase}\" is incorrect\\n`;\n helpText += `- Design system hasn't been published yet\\n\\n`;\n helpText += `**Solution:** Verify the design system ID and API base URL in your MCP server configuration.`;\n } else if (status === \"401\" || status === \"403\") {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Missing or invalid access token\\n`;\n helpText += `- You don't have access to this design system (owner or invited guest only)\\n\\n`;\n helpText += `**Solution:** Add \\`--atomix-token <your-token>\\` from the Export modal or Settings → Regenerate.`;\n } else {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Network connection issue\\n`;\n helpText += `- API server is down\\n`;\n helpText += `- CORS or firewall blocking the request\\n\\n`;\n helpText += `**Solution:** Check your network connection and verify the API base URL is accessible.`;\n }\n \n return {\n description: \"Design System Fetch Failed\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: helpText,\n },\n },\n ],\n };\n }\n // Re-throw other errors\n throw error;\n }\n\n // Helper to build category prompt with metadata and AI rules\n const buildCategoryPrompt = (category: string, instructions: string): string => {\n const lines: string[] = [];\n \n // Header with DS info\n lines.push(`## Design System Information`);\n lines.push(`- **Name**: ${data!.meta.name}`);\n lines.push(`- **Version**: ${data!.meta.version || \"1.0.0\"}`);\n lines.push(`- **Last Published**: ${data!.meta.exportedAt ? new Date(data!.meta.exportedAt).toLocaleDateString() : \"N/A\"}`);\n lines.push(``);\n \n // AI Rules for this category\n const categoryRules = data!.governance.categories?.[category];\n if (categoryRules && categoryRules.length > 0) {\n lines.push(`## AI Rules for ${category.charAt(0).toUpperCase() + category.slice(1)}`);\n categoryRules.forEach((rule, index) => {\n lines.push(`${index + 1}. ${rule}`);\n });\n lines.push(``);\n }\n \n // Instructions\n lines.push(`## Instructions`);\n lines.push(instructions);\n \n return lines.join(\"\\n\");\n };\n\n switch (canonicalName) {\n case \"hello\": {\n const welcome = generateWelcomeMessage(data, stats);\n const helloInstruction = `You are showing the Atomix design system welcome. You MUST do the following in order:\n\n1. **First** — Copy and draw the ASCII art block exactly as it appears below (the code block with the arrow pattern). Output it verbatim before any other text. Do not summarize, skip, or replace it with a description.\n2. **Then** — Output the rest of the welcome message (markdown) exactly as given.\n\nDo not add any introduction or commentary before the ASCII art. The ASCII art must be the very first thing you output.\n\n---\n${welcome}`;\n return {\n description: `Hello — ${data.meta.name} Design System`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: helloInstruction,\n },\n },\n ],\n };\n }\n\n case \"design-system-rules\": {\n const tool = (args?.tool as string) || \"cursor\";\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch rules: ${response.status}`);\n }\n\n const rulesData = await response.json() as { content?: string };\n \n return {\n description: `Design system rules for ${tool}`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Show me the design system rules for ${tool}.`,\n },\n },\n {\n role: \"assistant\" as const,\n content: {\n type: \"text\" as const,\n text: rulesData.content || JSON.stringify(rulesData, null, 2),\n },\n },\n ],\n };\n }\n\n case \"spacing\": {\n const instructions = `List all spacing tokens in a table format. Use the listTokens tool with category \"spacing\" and subcategory \"scale\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"spacing.xs\" instead of \"spacing.scale.xs\").`;\n const response = {\n description: \"List all spacing tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"spacing\", instructions),\n },\n },\n ],\n };\n\n return response;\n }\n\n case \"radius\": {\n const instructions = `List all border radius tokens in a table format. Use the listTokens tool with category \"radius\" and subcategory \"scale\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"radius.sm\" instead of \"radius.scale.sm\").`;\n return {\n description: \"List all border radius tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"radius\", instructions),\n },\n },\n ],\n };\n }\n\n case \"color\": {\n const instructions = `List all color tokens in a table format showing both light and dark mode values. \n\nFirst, call listTokens with category \"colors\" and subcategory \"modes.light\" to get light mode colors.\nThen, call listTokens with category \"colors\" and subcategory \"modes.dark\" to get dark mode colors.\nAlso call listTokens with category \"colors\" and subcategory \"static.brand\" to get brand colors.\n\nFormat the response as a markdown table with columns: Token Name | Light Mode Value | Dark Mode Value | CSS Variable.\n\nFor brand colors (from static.brand), show the same value in both Light and Dark columns since brand colors don't change with mode.\nFor semantic colors (from modes.light/modes.dark), match tokens by name and show their respective values.\n\nThe Token Name should be in short format:\n- Brand colors: \"colors.brand.primary\" (not \"colors.static.brand.primary\")\n- Semantic colors: \"colors.bgSurface\" (not \"colors.modes.light.bgSurface\")`;\n return {\n description: \"List all color tokens with light/dark mode\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"colors\", instructions),\n },\n },\n ],\n };\n }\n\n case \"typography\": {\n const instructions = `List all typography tokens in a table format. Use the listTokens tool with category \"typography\" (no subcategory needed). Format the response as a markdown table with columns: Token Name | Value | CSS Variable. Group tokens by type (fontSize, fontWeight, lineHeight, etc.) with section headers.`;\n return {\n description: \"List all typography tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"typography\", instructions),\n },\n },\n ],\n };\n }\n\n case \"shadow\": {\n const instructions = `List all shadow/elevation tokens in a table format. Use the listTokens tool with category \"shadows\" and subcategory \"elevation\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"shadows.elevation.md\" is fine as-is).`;\n return {\n description: \"List all shadow/elevation tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"shadows\", instructions),\n },\n },\n ],\n };\n }\n\n case \"border\": {\n const instructions = `List all border width tokens in a table format. Use the listTokens tool with category \"borders\" and subcategory \"width\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"borders.width.sm\" is fine as-is).`;\n return {\n description: \"List all border width tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"borders\", instructions),\n },\n },\n ],\n };\n }\n\n case \"sizing\": {\n const instructions = `List all sizing tokens in a table format. Call listTokens twice:\n1. category \"sizing\" and subcategory \"height\" for component heights\n2. category \"sizing\" and subcategory \"icon\" for icon sizes\n\nFormat the response as a markdown table with columns: Token Name | Value | CSS Variable. Group by type (height vs icon) with section headers.`;\n return {\n description: \"List all sizing tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"sizing\", instructions),\n },\n },\n ],\n };\n }\n\n case \"motion\": {\n const instructions = `List all motion tokens in a table format. Call listTokens twice:\n1. category \"motion\" and subcategory \"duration\" for duration tokens\n2. category \"motion\" and subcategory \"easing\" for easing tokens\n\nFormat the response as a markdown table with columns: Token Name | Value | CSS Variable. Group by type (duration vs easing) with section headers.`;\n return {\n description: \"List all motion tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"motion\", instructions),\n },\n },\n ],\n };\n }\n\n case \"sync\": {\n const output = (args?.output as string) || \"./tokens.css\";\n const format = (args?.format as string) || \"css\";\n return {\n description: \"Sync tokens, rules, skills, and dependencies manifest\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Call the syncAll tool now. Use output=\"${output}\" and format=\"${format}\". This syncs tokens, AI rules, skills (.cursor/skills/atomix-ds/*), and atomix-dependencies.json. Execute immediately - do not search or ask questions.`,\n },\n },\n ],\n };\n }\n\n case \"sync-to-figma\": {\n return {\n description: \"Push design system to Figma via MCP tool\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Call the MCP tool **syncToFigma** now (no arguments). It pushes the design system into the open Figma file via the built-in bridge and Atomix plugin. Do not use the Figma REST API or external scripts. If the response includes \\`bridgeNotRunning\\` and \\`agentInstruction\\`, ensure your AI environment has this MCP server running, then in Figma run the Atomix plugin and tap Connect, then call syncToFigma again. Only if that fails, tell the user: (1) Ensure this MCP server is configured and running in your AI tool. (2) In Figma, open and run the Atomix plugin, then tap **Connect**. (3) Run Sync to Figma again. After a successful sync, report the **summary** from the response (what was created, updated, or removed)—do not say \"we added the whole design system\" when only some items changed.`,\n },\n },\n ],\n };\n }\n\n case \"refactor\": {\n // Recompute deprecated tokens from fresh DB vs local token file (not stale in-memory state)\n const refactorOutput = (args?.output as string) || \"./tokens.css\";\n const refactorFormat = (args?.format as string) || \"css\";\n const refactorOutputPath = path.resolve(process.cwd(), refactorOutput);\n const refactorFileExists = fs.existsSync(refactorOutputPath);\n\n if (!data) {\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [{\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `Failed to fetch design system from DB. Check your --ds-id and --atomix-token configuration.` },\n }],\n };\n }\n\n if (!refactorFileExists) {\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [{\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `No token file found at \\`${refactorOutput}\\`. Please run \\`/--sync\\` first to create your token file, then run \\`/--refactor\\` to scan your codebase for deprecated token usage.` },\n }],\n };\n }\n\n // Compute deprecated: tokens in local file but NOT in fresh DB export\n const deprecatedTokens: Map<string, string> = new Map();\n if ([\"css\", \"scss\", \"less\"].includes(refactorFormat)) {\n const oldContent = fs.readFileSync(refactorOutputPath, \"utf-8\");\n const oldVarPattern = /(?:^|\\n)\\s*(?:\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*\\/\\s*)?(--[a-zA-Z0-9-]+):\\s*([^;]+);/gm;\n let match;\n while ((match = oldVarPattern.exec(oldContent)) !== null) {\n const varName = match[1];\n const varValue = match[2].trim();\n if (!(varName in data.cssVariables)) deprecatedTokens.set(varName, varValue);\n }\n }\n\n const dsVersion = data.meta.version ?? \"?\";\n const dsExportedAt = data.meta.exportedAt ? new Date(data.meta.exportedAt).toLocaleString() : \"N/A\";\n\n if (deprecatedTokens.size === 0) {\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [{\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `✓ No deprecated tokens found.\\n\\nYour token file \\`${refactorOutput}\\` is aligned with the design system (v${dsVersion}, exported ${dsExportedAt}). No tokens need migration.` },\n }],\n };\n }\n\n const format = refactorFormat;\n const isNativeFormat = [\"swift\", \"kotlin\", \"dart\"].includes(format);\n const removed = Array.from(deprecatedTokens.entries()).map(([token, lastValue]) => ({ token, lastValue }));\n\n let searchPatterns = \"\";\n let fileExtensions = \"\";\n \n if (isNativeFormat) {\n const nativeTokens = removed.map(r => {\n const withoutPrefix = r.token.replace(/^--atmx-/, \"\");\n const camelCase = withoutPrefix.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n const pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n return { css: r.token, camel: camelCase, pascal: pascalCase, lastValue: r.lastValue };\n });\n \n if (format === \"swift\") {\n fileExtensions = \".swift files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.*.${t.camel}\\` (was: ${t.lastValue})`).join(\"\\n\");\n } else if (format === \"kotlin\") {\n fileExtensions = \".kt files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.*.${t.pascal}\\` (was: ${t.lastValue})`).join(\"\\n\");\n } else {\n fileExtensions = \".dart files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.${t.camel}\\` (was: ${t.lastValue})`).join(\"\\n\");\n }\n } else {\n fileExtensions = \".tsx, .ts, .jsx, .js, .css, .scss, .less, .vue, .svelte files\";\n searchPatterns = removed.map(r => \n ` • \\`var(${r.token})\\` or \\`\"${r.token}\"\\` (was: ${r.lastValue})`\n ).join(\"\\n\");\n }\n\n const instructions = `Scan the codebase for deprecated design tokens and help update them.\n\n## Design System (fresh from DB)\n- **Version:** ${dsVersion}\n- **Last exported:** ${dsExportedAt}\n- **Token file:** ${refactorOutput}\n\n## Deprecated Tokens (${removed.length})\n\nThe following tokens exist in your local token file but have been removed from the design system:\n\n${searchPatterns}\n\n## Instructions\n\n1. **Search** for these patterns in ${fileExtensions}:\n - Skip node_modules, dist, build, .next, .git directories\n - Look for both \\`var(--token)\\` and direct string references\n\n2. **Report findings** in this format:\n \\`\\`\\`\n 📄 path/to/file.tsx\n Line 42: background: var(--atmx-color-deprecated);\n Line 78: const color = \"--atmx-color-deprecated\";\n \\`\\`\\`\n\n3. **After listing all findings**, ask:\n > \"Found X instances of deprecated tokens in Y files. Would you like me to update them?\"\n > \n > For each deprecated token, I'll suggest the closest equivalent from the current design system.\n\n4. **If user confirms**:\n - Show the proposed replacement for each instance\n - Apply changes only after user approves\n - For tokens with no clear replacement, ask user which token to use\n\n## Important\n\n- Do NOT make any changes without explicit user confirmation\n- Show before → after for each change\n- If you can't find a suitable replacement token, ask the user\n\n## Available Token Categories\n\nUse \\`/color\\`, \\`/spacing\\`, \\`/radius\\`, \\`/typography\\`, \\`/shadow\\`, \\`/border\\`, \\`/sizing\\`, \\`/motion\\` to see current tokens if you need to find replacements.`;\n\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: instructions,\n },\n },\n ],\n };\n }\n\n case \"atomix-setup\": {\n const setupInstructions = `You are running **/--get-started** (get started with design system). Three phases only.\n\n**Rule:** Do not create, write, or modify any file until Phase 3 and only after the user has explicitly approved (e.g. \"Yes\", \"Yes for all\", \"Go ahead\").\n\n## Todo list (required)\n\n- Create a todo list at the start: Phase 1, Phase 2, Phase 3. Work step by step; do not run Phase 3 until the user has replied with approval. Mark items completed as you go.\n\n## Phase 1 – Scan\n\n- Resolve platform/stack: infer from the project (e.g. package.json, build.gradle, Xcode) or ask once: \"Which platform? (e.g. web, Android, iOS)\" and if relevant \"Which stack? (e.g. React, Vue, Next, Swift, Kotlin).\" Do not assume a default.\n- Call **getDependencies** with \\`platform\\` and optional \\`stack\\`. If it fails, tell the user the design system could not be reached and stop.\n- Scan the repo for: .cursor/skills/atomix-ds/SKILL.md, a tokens file (e.g. tokens.css or src/tokens.css), icon package from getDependencies, font links. **Web:** note any existing CSS (globals.css, main.css, Tailwind, etc.). **Native:** note any theme/style files (SwiftUI, Android themes, Compose).\n- Build two lists: **Suggested** (from getDependencies minus what exists) and **Already present**. Include: icon package, font links, skill (.cursor/skills/atomix-ds/SKILL.md), token files; for web, also include the **showcase page** (atomix-setup-showcase.html) if getDependencies returned a \\`showcase\\` object.\n- Do not write, create, or add anything in Phase 1.\n\n## Phase 2 – Report and ask\n\n- Reply with: **Suggested:** [list] and **Already present:** [list].\n- Ask exactly once: \"Do you want me to add the suggested items? (Yes for all, or say which ones.)\"\n- **Stop.** Wait for the user to reply. Do not run Phase 3 in this response.\n\n## Phase 3 – Create (only after user approval)\n\n- Run only when the user has said yes (all or specific items).\n- For each approved item:\n - **Skill:** Write the skill content from getDependencies \\`skill.content\\` to \\`skill.path\\` (.cursor/skills/atomix-ds/SKILL.md).\n - **Token file:** Call **syncAll** with \\`output\\` set to the path (e.g. \"./src/tokens.css\" or \"./tokens.css\"). syncAll also writes skills and atomix-dependencies.json. You must call syncAll; do not only suggest the user run it later.\n - **Icon package:** Install per getDependencies. When rendering icons, apply the design system's icon tokens: use getToken(\\`sizing.icon.*\\`) or listTokens(\\`sizing\\`) for size, and getToken(\\`icons.strokeWidth\\`) for stroke width when the DS defines it; do not use hardcoded sizes or stroke widths.\n - **Fonts and typeset:** Add font links (e.g. \\`<link>\\` or \\`@import\\` from Google Fonts). Then build a **complete typeset CSS**: call **listTypesets** to get every typeset from the owner's design system (do not skip any). Emit **one CSS rule per typeset** using the \\`cssClass\\` and the \\`fontFamilyVar\\`, \\`fontSizeVar\\`, \\`fontWeightVar\\`, \\`lineHeightVar\\` (and \\`letterSpacingVar\\`, \\`textTransformVar\\`, \\`textDecorationVar\\` when present) returned by listTypesets. Include text-transform and text-decoration when the typeset has them so the result is **1:1** with the design system. The typeset file must define the full type scale—not only a font import. Do not create a CSS file that contains only a font import.\n - **Showcase page (web only):** If platform is web and getDependencies returned a \\`showcase\\` object, create the file at \\`showcase.path\\` using \\`showcase.template\\`. Replace every placeholder per \\`showcase.substitutionInstructions\\`: TOKENS_CSS_PATH, TYPESETS_LINK (if you created a typeset CSS file, use the full \\`<link rel=\\\"stylesheet\\\" href=\\\"…\\\">\\` tag; otherwise empty string), DS_NAME, BRAND_PRIMARY_VAR (page background), BRAND_PRIMARY_FOREGROUND_VAR (text on brand), HEADING_FONT_VAR (h1 fallback), FONT_FAMILY_VAR (body fallback), LARGEST_DISPLAY_TYPESET_CLASS (largest display typeset from listTypesets) and BODY_TYPESET_CLASS (e.g. typeset-body-md; leave empty if no typeset file), FONT_LINK_TAG. Use only CSS variable names that exist in the synced token file. Do not change the HTML structure. After creating the file, launch it in the default browser (e.g. \\`open atomix-setup-showcase.html\\` on macOS, \\`xdg-open atomix-setup-showcase.html\\` on Linux, or the equivalent on Windows).\n- Report only what you actually created or updated. Do not claim the token file was added if you did not call syncAll.\n- **After reporting – styles/theme:**\n - **Web:** If the project already has at least one CSS file: recommend how to integrate Atomix (e.g. import the synced tokens file, use \\`var(--atmx-*)\\`). Do not suggest a new global CSS. Only if there is **no** CSS file at all, ask once: \"There are no CSS files yet. Do you want me to build a global typeset from the design system?\" If yes, create a CSS file that includes: (1) font \\`@import\\` or document that a font link is needed, and (2) **typeset rules**—call **listTypesets** and emit **one CSS class per typeset** (do not skip any). For each class set font-family, font-size, font-weight, line-height, letter-spacing; when the typeset has text-transform or text-decoration, set those too for a 1:1 match. Use the CSS variable names returned by listTypesets. The output must not be only a font import; it must define every typeset with every style detail from the design system.\n - **iOS/Android:** If the project already has theme/style files: recommend how to integrate Atomix tokens. Do not suggest a new global theme. Only if there is **no** theme/style at all, ask once: \"There's no theme/style setup yet. Do you want a minimal token-based theme?\" and add only if the user says yes.\n\nCreate your todo list first, then Phase 1 (resolve platform/stack, call getDependencies, scan, build lists), then Phase 2 (report and ask). Do not perform Phase 3 until the user replies.`;\n return {\n description: \"Get started with design system in project (/--get-started). Create todo list; Phase 1 scan, Phase 2 report and ask, Phase 3 create only after user approval.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: setupInstructions,\n },\n },\n ],\n };\n }\n\n default:\n throw new Error(`Unknown prompt: ${name}`);\n }\n});\n\nfunction generateWelcomeMessage(data: DesignSystemData, stats: ReturnType<typeof getTokenStats>): string {\n const tokenSummary = Object.entries(stats.byCategory)\n .map(([cat, count]) => `${cat}: ${count}`)\n .join(\", \");\n\n const asciiArt = `\n\\`\\`\\`\n ↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘ \n\\`\\`\\`\n`;\n\n return `${asciiArt}\n# Welcome to ${data.meta.name}\n\n## Design System Overview\n\n| Metric | Value |\n|--------|-------|\n| Name | ${data.meta.name} |\n| DS ID | ${dsId} |\n| Total Tokens | ${stats.total} |\n| CSS Variables | ${stats.cssVariables} |\n| Governance Rules | ${stats.governanceRules} |\n| Version | ${data.meta.version || 1} |\n\n### Token breakdown\n\n${tokenSummary}\n\n---\n\n## Essential commands\n\n| Command | What to expect |\n|---------|----------------|\n| **/--hello** | Get started - overview, tokens, and tools. Run this first! |\n| **/--get-started** | Get started with design system in project. Three phases; creates files only after you approve. |\n| **/--rules** | Governance rules for your AI tool (e.g. Cursor, Copilot, Windsurf). |\n| **/--sync** | Sync tokens, rules, skills, and dependencies manifest (icons, fonts). Safe: adds new, updates existing, marks deprecated. |\n| **/--sync-to-figma** | Push design system to Figma (variables, paint/text/effect styles). Uses built-in bridge + Atomix plugin; connect plugin in Figma then run. Available on all tiers. |\n| **/--refactor** | Migrate deprecated tokens in codebase. Run after /--sync. |\n\n**Suggested next step:** Run **/--get-started** to set up global styles, icons, fonts, and token files; the AI will list options and ask before adding anything.\n\n---\n\n*Atomix Studio — https://atomix.studio | DS: https://atomix.studio/ds/${dsId}*\n`;\n}\n\n\n// ============================================\n// START SERVER\n// ============================================\n\nasync function startServer() {\n if (!dsId) {\n console.error(\"Error: Missing --ds-id argument\");\n console.error(\"Usage: npx @atomixstudio/mcp@latest --ds-id <id> --atomix-token <token>\");\n console.error(\"Get your DS ID and Atomix access token from account settings.\");\n console.error(\"\");\n process.exit(1);\n }\n if (!accessToken) {\n console.error(\"Error: Missing --atomix-token argument\");\n console.error(\"Usage: npx @atomixstudio/mcp@latest --ds-id <id> --atomix-token <token>\");\n console.error(\"Get your DS ID and Atomix access token from account settings.\");\n console.error(\"\");\n process.exit(1);\n }\n\n startFigmaBridge();\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error(`Atomix MCP Server started for design system: ${dsId}`);\n console.error(`Atomix MCP API base: ${apiBase}`);\n console.error(\n \"If you switched MCP config (e.g. free vs pro DS), restart your AI tool so this process uses the new --ds-id and --atomix-token.\"\n );\n}\n\nfunction onShutdown(): void {\n closeFigmaBridge();\n}\n\nprocess.on(\"SIGINT\", onShutdown);\nprocess.on(\"SIGTERM\", onShutdown);\n\n// When the MCP client disconnects by closing the pipe, close the Figma bridge\n// so the WebSocket server and plugin connection are torn down reliably.\nprocess.stdin.on(\"end\", onShutdown);\nprocess.stdin.on(\"close\", onShutdown);\n\n// Start MCP server (no CLI commands - this is MCP-only)\nasync function main() {\n await startServer();\n}\n\nmain().catch((error) => {\n console.error(\"Failed:\", error);\n process.exit(1);\n});\n\n","/**\n * Core Types for Atomix Sync\n * \n * Shared types used across CLI and MCP implementations.\n */\n\nexport interface ExportedTokens {\n tokens: {\n colors: {\n static: { brand: Record<string, string> };\n modes: { light: Record<string, string>; dark: Record<string, string> };\n };\n typography: Record<string, unknown>;\n spacing: { scale: Record<string, string> };\n sizing: { height: Record<string, string>; icon: Record<string, string> };\n shadows: { elevation: Record<string, string> };\n radius: { scale: Record<string, string> };\n borders: { width: Record<string, string> };\n motion: { duration: Record<string, string>; easing: Record<string, string> };\n zIndex: Record<string, number>;\n };\n cssVariables: Record<string, string>;\n governance: {\n rules: string[];\n categories: Record<string, string[]>;\n };\n meta: {\n name: string;\n version: number;\n exportedAt: string;\n /** Set when request used Bearer MCP token; DS owner tier for Pro Figma gating. */\n mcpTier?: \"free\" | \"pro\";\n };\n}\n\nexport interface DesignSystemData {\n tokens: ExportedTokens[\"tokens\"];\n cssVariables: Record<string, string>;\n governance: ExportedTokens[\"governance\"];\n meta: ExportedTokens[\"meta\"];\n}\n\nexport type OutputFormat = \n | \"css\" | \"scss\" | \"less\" // Web CSS-based\n | \"json\" | \"ts\" | \"js\" // Web JS-based\n | \"swift\" | \"kotlin\" | \"dart\"; // Native mobile\n\nexport interface AtomixConfig {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n output: string;\n format: OutputFormat;\n // For future codebase scanning\n include?: string[]; // Glob patterns to include\n exclude?: string[]; // Glob patterns to exclude\n}\n\nexport interface SyncOptions {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n output: string;\n format: OutputFormat;\n yes?: boolean; // Auto-confirm\n rules?: boolean; // Also sync rules files\n rulesDir?: string; // Directory for rules files\n etag?: string; // Cached ETag for conditional requests\n}\n\nexport interface SyncResult {\n success: boolean;\n tokenCount: number;\n deprecatedCount: number;\n etag?: string;\n status?: 200 | 304;\n changes?: DiffResult;\n error?: string;\n}\n\nexport interface DiffResult {\n added: string[];\n modified: Array<{ key: string; old: string; new: string }>;\n removed: string[];\n addedDark: string[];\n modifiedDark: Array<{ key: string; old: string; new: string }>;\n removedDark: string[];\n}\n\nexport interface ChangeSummary {\n hasChanges: boolean;\n versionChanged: boolean;\n timestampChanged: boolean;\n addedTokens: string[];\n removedTokens: string[];\n modifiedTokens: Array<{ token: string; oldValue: string; newValue: string }>;\n governanceChanged: boolean;\n summary: string;\n}\n\nexport interface FetchOptions {\n dsId: string;\n apiKey?: string;\n /** MCP access token; when set, sent as Authorization: Bearer (takes precedence over apiKey for auth). */\n accessToken?: string;\n apiBase?: string;\n etag?: string; // Send If-None-Match header\n forceRefresh?: boolean;\n}\n\nexport interface FetchResult {\n data: DesignSystemData | null; // null if 304 Not Modified\n etag: string;\n status: 200 | 304;\n}\n\n// Default file patterns for codebase scanning\nexport const DEFAULT_INCLUDE = [\n \"**/*.tsx\", // React TypeScript components\n \"**/*.jsx\", // React JavaScript components\n \"**/*.ts\", // TypeScript files\n \"**/*.js\", // JavaScript files\n \"**/*.css\", // CSS stylesheets\n \"**/*.scss\", // SASS files\n \"**/*.less\", // Less files\n \"**/*.vue\", // Vue components\n \"**/*.svelte\", // Svelte components\n \"**/*.astro\", // Astro components\n];\n\nexport const DEFAULT_EXCLUDE = [\n \"node_modules/**\",\n \"dist/**\",\n \"build/**\",\n \".next/**\",\n \".nuxt/**\",\n \".git/**\",\n \"coverage/**\",\n \"**/*.min.js\",\n \"**/*.min.css\",\n \"**/*.d.ts\", // Type definitions\n \"**/*.test.*\", // Test files\n \"**/*.spec.*\", // Spec files\n];\n","/**\n * Fetch Design System Data\n * \n * Handles fetching design system tokens from API with ETag support.\n */\n\nimport type { DesignSystemData, ExportedTokens, FetchOptions, FetchResult, ChangeSummary } from './types.js';\n\n/**\n * Generate ETag from design system metadata\n */\nexport function generateETag(meta: { version: number; updatedAt: string }): string {\n const hash = `${meta.version}-${meta.updatedAt}`;\n return `\"v${hash}\"`; // ETag format: \"v1.0-2024-01-01T00:00:00Z\"\n}\n\n/**\n * Compare two design systems and return change summary\n */\nexport function compareDesignSystems(\n cached: DesignSystemData,\n fresh: DesignSystemData\n): ChangeSummary {\n const changes: ChangeSummary = {\n hasChanges: false,\n versionChanged: false,\n timestampChanged: false,\n addedTokens: [],\n removedTokens: [],\n modifiedTokens: [],\n governanceChanged: false,\n summary: \"\",\n };\n\n // Compare metadata\n if (cached.meta.version !== fresh.meta.version) {\n changes.versionChanged = true;\n changes.hasChanges = true;\n }\n\n if (cached.meta.exportedAt !== fresh.meta.exportedAt) {\n changes.timestampChanged = true;\n changes.hasChanges = true;\n }\n\n // Compare CSS variables (includes all tokens: spacing, typography, colors, etc.)\n const cachedVars = Object.keys(cached.cssVariables);\n const freshVars = Object.keys(fresh.cssVariables);\n\n // Find added tokens (all categories)\n for (const varName of freshVars) {\n if (!(varName in cached.cssVariables)) {\n changes.addedTokens.push(varName);\n changes.hasChanges = true;\n }\n }\n\n // Find removed tokens (all categories)\n for (const varName of cachedVars) {\n if (!(varName in fresh.cssVariables)) {\n changes.removedTokens.push(varName);\n changes.hasChanges = true;\n }\n }\n\n // Find modified tokens (all categories)\n for (const varName of cachedVars) {\n if (varName in fresh.cssVariables) {\n const oldValue = cached.cssVariables[varName];\n const newValue = fresh.cssVariables[varName];\n if (oldValue !== newValue) {\n changes.modifiedTokens.push({\n token: varName,\n oldValue,\n newValue,\n });\n changes.hasChanges = true;\n }\n }\n }\n\n // Compare dark mode colors (stored separately in tokens.colors.modes.dark)\n // These are NOT in cssVariables, so we need to compare them separately\n const cachedDark = (cached.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n const freshDark = (fresh.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n const cachedDarkColors = cachedDark?.dark || {};\n const freshDarkColors = freshDark?.dark || {};\n \n const cachedDarkKeys = Object.keys(cachedDarkColors);\n const freshDarkKeys = Object.keys(freshDarkColors);\n\n // Detect CSS variable prefix from existing cssVariables (fallback to --atmx-color-)\n const firstColorVar = cachedVars.find(v => v.includes(\"-color-\")) || freshVars.find(v => v.includes(\"-color-\"));\n const prefixMatch = firstColorVar?.match(/^(--[a-z]+-color-)/);\n const colorPrefix = prefixMatch ? prefixMatch[1] : \"--atmx-color-\";\n\n // Find added dark mode colors\n for (const key of freshDarkKeys) {\n if (!(key in cachedDarkColors)) {\n const cssVarName = `${colorPrefix}${key}`;\n // Only add if not already in the list (avoid duplicates)\n if (!changes.addedTokens.includes(cssVarName)) {\n changes.addedTokens.push(cssVarName);\n changes.hasChanges = true;\n }\n }\n }\n\n // Find removed dark mode colors\n for (const key of cachedDarkKeys) {\n if (!(key in freshDarkColors)) {\n const cssVarName = `${colorPrefix}${key}`;\n if (!changes.removedTokens.includes(cssVarName)) {\n changes.removedTokens.push(cssVarName);\n changes.hasChanges = true;\n }\n }\n }\n\n // Find modified dark mode colors\n for (const key of cachedDarkKeys) {\n if (key in freshDarkColors) {\n const oldValue = cachedDarkColors[key];\n const newValue = freshDarkColors[key];\n if (oldValue !== newValue) {\n const cssVarName = `${colorPrefix}${key}`;\n // Check if we already have this token in modified list (might be a light mode change too)\n const existingIndex = changes.modifiedTokens.findIndex(m => m.token === cssVarName);\n if (existingIndex >= 0) {\n // Update existing entry to show both light and dark changes\n changes.modifiedTokens[existingIndex].oldValue += ` | dark: ${oldValue}`;\n changes.modifiedTokens[existingIndex].newValue += ` | dark: ${newValue}`;\n } else {\n // Add new dark mode-only change\n changes.modifiedTokens.push({\n token: `${cssVarName} (dark mode)`,\n oldValue,\n newValue,\n });\n changes.hasChanges = true;\n }\n }\n }\n }\n\n // Compare governance rules (AI guide changes)\n // Compare both the rules array and categories object\n const cachedGovernance = cached.governance || { rules: [], categories: {} };\n const freshGovernance = fresh.governance || { rules: [], categories: {} };\n \n const cachedRules = cachedGovernance.rules || [];\n const freshRules = freshGovernance.rules || [];\n const cachedCategories = cachedGovernance.categories || {};\n const freshCategories = freshGovernance.categories || {};\n \n // Compare rules array (deep comparison)\n const cachedRulesStr = JSON.stringify(cachedRules.sort());\n const freshRulesStr = JSON.stringify(freshRules.sort());\n \n // Compare categories object (deep comparison)\n const cachedCategoriesStr = JSON.stringify(cachedCategories, Object.keys(cachedCategories).sort());\n const freshCategoriesStr = JSON.stringify(freshCategories, Object.keys(freshCategories).sort());\n \n if (cachedRulesStr !== freshRulesStr || cachedCategoriesStr !== freshCategoriesStr) {\n changes.governanceChanged = true;\n changes.hasChanges = true;\n }\n\n // Build summary text\n const summaryLines: string[] = [];\n \n if (!changes.hasChanges) {\n summaryLines.push(\"✓ No changes detected - design system is up to date\");\n } else {\n summaryLines.push(\"📦 Design System Changes Detected:\");\n summaryLines.push(\"\");\n\n if (changes.versionChanged) {\n summaryLines.push(` Version: ${cached.meta.version} → ${fresh.meta.version}`);\n }\n\n if (changes.timestampChanged) {\n const cachedDate = new Date(cached.meta.exportedAt).toLocaleString();\n const freshDate = new Date(fresh.meta.exportedAt).toLocaleString();\n summaryLines.push(` Published: ${cachedDate} → ${freshDate}`);\n }\n\n if (changes.addedTokens.length > 0) {\n summaryLines.push(` ➕ Added: ${changes.addedTokens.length} token(s)`);\n if (changes.addedTokens.length <= 10) {\n changes.addedTokens.forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n } else {\n changes.addedTokens.slice(0, 10).forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n summaryLines.push(` ... and ${changes.addedTokens.length - 10} more`);\n }\n }\n\n if (changes.removedTokens.length > 0) {\n summaryLines.push(` ➖ Removed: ${changes.removedTokens.length} token(s)`);\n if (changes.removedTokens.length <= 10) {\n changes.removedTokens.forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n } else {\n changes.removedTokens.slice(0, 10).forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n summaryLines.push(` ... and ${changes.removedTokens.length - 10} more`);\n }\n }\n\n if (changes.modifiedTokens.length > 0) {\n summaryLines.push(` 🔄 Modified: ${changes.modifiedTokens.length} token(s)`);\n if (changes.modifiedTokens.length <= 10) {\n changes.modifiedTokens.forEach(({ token, oldValue, newValue }) => {\n summaryLines.push(` ${token}:`);\n summaryLines.push(` - ${oldValue}`);\n summaryLines.push(` + ${newValue}`);\n });\n } else {\n changes.modifiedTokens.slice(0, 5).forEach(({ token, oldValue, newValue }) => {\n summaryLines.push(` ${token}:`);\n summaryLines.push(` - ${oldValue}`);\n summaryLines.push(` + ${newValue}`);\n });\n summaryLines.push(` ... and ${changes.modifiedTokens.length - 5} more`);\n }\n }\n\n if (changes.governanceChanged) {\n summaryLines.push(` 📝 AI guide updated`);\n }\n }\n\n changes.summary = summaryLines.join(\"\\n\");\n return changes;\n}\n\n/**\n * Detect which foundations have governance changes\n * \n * Compares cached vs fresh governance data and returns an array of foundation names\n * that have changed (e.g., [\"general\", \"colors\", \"typography\"]).\n * \n * @param cached - Previously cached design system data\n * @param fresh - Freshly fetched design system data\n * @returns Array of foundation names that have governance changes\n */\nexport function detectGovernanceChangesByFoundation(\n cached: DesignSystemData,\n fresh: DesignSystemData\n): string[] {\n const changes: string[] = [];\n \n const cachedGov = cached.governance || { rules: [], categories: {} };\n const freshGov = fresh.governance || { rules: [], categories: {} };\n \n // Check general rules (rules array)\n const cachedRulesStr = JSON.stringify((cachedGov.rules || []).sort());\n const freshRulesStr = JSON.stringify((freshGov.rules || []).sort());\n if (cachedRulesStr !== freshRulesStr) {\n changes.push(\"general\");\n }\n \n // Check foundation-specific rules (categories object)\n const cachedCategories = cachedGov.categories || {};\n const freshCategories = freshGov.categories || {};\n \n const allFoundationKeys = new Set([\n ...Object.keys(cachedCategories),\n ...Object.keys(freshCategories),\n ]);\n \n for (const foundation of allFoundationKeys) {\n const cachedRules = cachedCategories[foundation] || [];\n const freshRules = freshCategories[foundation] || [];\n const cachedRulesStr = JSON.stringify(cachedRules.sort());\n const freshRulesStr = JSON.stringify(freshRules.sort());\n \n if (cachedRulesStr !== freshRulesStr) {\n changes.push(foundation);\n }\n }\n \n return changes;\n}\n\n/**\n * Fetch design system from API with ETag support\n */\nexport async function fetchDesignSystem(options: FetchOptions): Promise<FetchResult> {\n const { dsId, apiKey, accessToken, apiBase = \"https://atomixstudio.eu\", etag, forceRefresh = false } = options;\n\n if (!dsId) {\n throw new Error(\"Missing dsId. Usage: fetchDesignSystem({ dsId: '...' })\");\n }\n\n const url = `${apiBase}/api/ds/${dsId}/tokens?format=export`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n } else if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n \n // Send If-None-Match if we have cached ETag\n if (etag) {\n headers[\"if-none-match\"] = etag;\n }\n\n const response = await fetch(url, { headers });\n \n if (response.status === 304) {\n // Not Modified - return null data, same ETag\n return {\n data: null,\n etag: etag!,\n status: 304,\n };\n }\n \n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to fetch design system: ${response.status} ${text}`);\n }\n\n const data = await response.json() as ExportedTokens;\n \n // Extract ETag from response header or generate from meta\n const responseETag = response.headers.get('etag');\n const finalETag = responseETag || generateETag({ version: data.meta.version, updatedAt: data.meta.exportedAt });\n \n // Transform to DesignSystemData format\n const designSystemData: DesignSystemData = {\n tokens: data.tokens,\n cssVariables: data.cssVariables,\n governance: data.governance,\n meta: data.meta,\n };\n \n return {\n data: designSystemData,\n etag: finalETag,\n status: 200,\n };\n}\n","/**\n * Core Sync Function\n * \n * Unified sync logic used by both CLI and MCP.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { SyncOptions, SyncResult, DesignSystemData, OutputFormat, DiffResult } from './types.js';\nimport { fetchDesignSystem } from './fetch.js';\nimport { diffTokens } from './diff.js';\nimport { syncRulesFiles } from './rules.js';\nimport {\n generateCSSOutput,\n generateSCSSOutput,\n generateLessOutput,\n generateJSONOutput,\n generateTSOutput,\n generateJSOutput,\n generateSwiftOutput,\n generateKotlinOutput,\n generateDartOutput,\n} from './formats/index.js';\n\n/**\n * Sync design tokens to a local file\n */\nexport async function syncTokens(options: SyncOptions): Promise<SyncResult> {\n const {\n dsId,\n apiKey,\n apiBase = \"https://atomixstudio.eu\",\n output,\n format,\n yes = false,\n rules = true, // Default to true (sync rules by default)\n rulesDir,\n etag, // Optional cached ETag\n } = options;\n\n try {\n // Fetch design system with ETag support\n const fetchResult = await fetchDesignSystem({\n dsId,\n apiKey,\n apiBase,\n etag,\n forceRefresh: true,\n });\n\n // Handle 304 Not Modified\n if (fetchResult.status === 304) {\n return {\n success: true,\n tokenCount: 0,\n deprecatedCount: 0,\n etag: fetchResult.etag,\n status: 304,\n };\n }\n\n if (!fetchResult.data) {\n return {\n success: false,\n tokenCount: 0,\n deprecatedCount: 0,\n error: \"No data returned from API\",\n };\n }\n\n const data = fetchResult.data;\n\n // Check if file exists first to detect deprecated tokens\n const outputPath = path.resolve(process.cwd(), output);\n const fileExists = fs.existsSync(outputPath);\n \n // Read old file if it exists\n const deprecatedTokens: Map<string, string> = new Map();\n const existingTokens: Map<string, string> = new Map();\n \n if (fileExists) {\n if ([\"css\", \"scss\", \"less\"].includes(format)) {\n // For CSS-based formats, extract CSS variables\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n // Improved regex: handles comments before variables, supports uppercase/numbers in prefix\n const oldVarPattern = /(?:^|\\n)\\s*(?:\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*\\/\\s*)?(--[a-zA-Z0-9-]+):\\s*([^;]+);/gm;\n let match;\n while ((match = oldVarPattern.exec(oldContent)) !== null) {\n const varName = match[1];\n const varValue = match[2].trim();\n \n existingTokens.set(varName, varValue);\n \n // Mark as deprecated if NOT in design system (kept for backward compatibility)\n if (!(varName in data.cssVariables)) {\n deprecatedTokens.set(varName, varValue);\n }\n }\n } else if ([\"swift\", \"kotlin\", \"dart\"].includes(format)) {\n // For native formats, extract tokens and convert to CSS variable names\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n let tokenPattern: RegExp;\n \n if (format === \"swift\") {\n tokenPattern = /static\\s+let\\s+(\\w+)\\s*=\\s*[^;]+;/g;\n } else if (format === \"kotlin\") {\n tokenPattern = /val\\s+(\\w+)\\s*=\\s*[^;]+/g;\n } else {\n tokenPattern = /static\\s+const\\s+(\\w+)\\s*=\\s*[^;]+;/g;\n }\n \n let match;\n while ((match = tokenPattern.exec(oldContent)) !== null) {\n const nativeName = match[1];\n // Convert native name to CSS variable name (approximate)\n const kebab = nativeName\n .replace(/([A-Z])/g, \"-$1\")\n .toLowerCase()\n .replace(/^-/, \"\");\n const cssVarName = `--atmx-${kebab}`;\n \n existingTokens.set(cssVarName, \"\");\n \n // Mark as deprecated if NOT in design system\n if (!(cssVarName in data.cssVariables)) {\n deprecatedTokens.set(cssVarName, \"\");\n }\n }\n }\n }\n \n // Always use DS tokens (deprecated tokens are kept via generateXOutput functions)\n const mergedCssVariables = { ...data.cssVariables };\n\n // Generate new content based on format\n // Get dark mode colors for CSS output\n const darkModeColors = (data.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n // Use mergedCssVariables for CSS-based formats (supports merge mode)\n let newContent: string;\n switch (format) {\n case \"css\":\n newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"scss\":\n newContent = generateSCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"less\":\n newContent = generateLessOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"json\":\n newContent = generateJSONOutput(data.tokens);\n break;\n case \"js\":\n newContent = generateJSOutput(data.tokens);\n break;\n case \"ts\":\n newContent = generateTSOutput(data.tokens);\n break;\n case \"swift\":\n newContent = generateSwiftOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"kotlin\":\n newContent = generateKotlinOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"dart\":\n newContent = generateDartOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n default:\n newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n }\n\n // CSS-based formats support diffing\n const supportsDiff = [\"css\", \"scss\", \"less\"].includes(format);\n const deprecatedCount = deprecatedTokens.size;\n let diffResult: DiffResult | undefined;\n \n if (fileExists && supportsDiff) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n diffResult = diffTokens(oldContent, mergedCssVariables, format as OutputFormat, darkModeColors?.dark);\n\n // Count changes (deprecated tokens are kept, not removed)\n const lightChanges = diffResult.added.length + diffResult.modified.length;\n const darkChanges = diffResult.addedDark.length + diffResult.modifiedDark.length;\n const totalChanges = lightChanges + darkChanges + deprecatedCount;\n\n if (totalChanges === 0) {\n // Already up to date - return early\n return {\n success: true,\n tokenCount: Object.keys(mergedCssVariables).length,\n deprecatedCount,\n etag: fetchResult.etag,\n status: 200,\n changes: diffResult,\n };\n }\n }\n\n // Write file\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n fs.writeFileSync(outputPath, newContent);\n\n // Sync rules files if requested\n let rulesResults;\n if (rules) {\n rulesResults = await syncRulesFiles({\n dsId,\n apiKey,\n apiBase,\n rulesDir,\n });\n }\n\n return {\n success: true,\n tokenCount: Object.keys(mergedCssVariables).length,\n deprecatedCount,\n etag: fetchResult.etag,\n status: 200,\n changes: diffResult,\n };\n } catch (error) {\n return {\n success: false,\n tokenCount: 0,\n deprecatedCount: 0,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","/**\n * Diff Logic\n * \n * Functions for comparing token files and detecting changes.\n */\n\nimport type { OutputFormat, DiffResult } from './types.js';\n\nexport function diffTokens(\n oldContent: string,\n newCssVars: Record<string, string>,\n format: OutputFormat,\n newDarkVars?: Record<string, string>\n): DiffResult {\n const added: string[] = [];\n const modified: Array<{ key: string; old: string; new: string }> = [];\n const removed: string[] = [];\n const addedDark: string[] = [];\n const modifiedDark: Array<{ key: string; old: string; new: string }> = [];\n const removedDark: string[] = [];\n\n // CSS-based formats (css, scss, less) all use CSS variables\n if (format === \"css\" || format === \"scss\" || format === \"less\") {\n // Split old content into light mode (:root) and dark mode (.dark) sections\n // Find the :root section\n const rootMatch = oldContent.match(/:root\\s*\\{([^}]*)\\}/);\n const darkMatch = oldContent.match(/\\.dark[^{]*\\{([^}]*)\\}/);\n \n // Parse light mode variables from :root\n const oldLightVars: Record<string, string> = {};\n if (rootMatch) {\n const rootContent = rootMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(rootContent)) !== null) {\n oldLightVars[match[1]] = match[2].trim();\n }\n } else {\n // Fallback: parse everything (old behavior for files without sections)\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(oldContent)) !== null) {\n // Only take the first occurrence to get light mode values\n if (!(match[1] in oldLightVars)) {\n oldLightVars[match[1]] = match[2].trim();\n }\n }\n }\n\n // Parse dark mode variables from .dark\n const oldDarkVars: Record<string, string> = {};\n if (darkMatch) {\n const darkContent = darkMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(darkContent)) !== null) {\n oldDarkVars[match[1]] = match[2].trim();\n }\n }\n\n // Compare light mode\n for (const [key, value] of Object.entries(newCssVars)) {\n if (!(key in oldLightVars)) {\n added.push(key);\n } else if (oldLightVars[key] !== value) {\n modified.push({ key, old: oldLightVars[key], new: value });\n }\n }\n\n for (const key of Object.keys(oldLightVars)) {\n if (!(key in newCssVars)) {\n removed.push(key);\n }\n }\n\n // Compare dark mode if new dark vars provided\n if (newDarkVars && Object.keys(newDarkVars).length > 0) {\n // Generate the expected CSS variable names for dark mode\n // newDarkVars keys are like \"bg-page\", need to match \"--atmx-color-bg-page\"\n const firstKey = Object.keys(newCssVars)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n\n for (const [key, value] of Object.entries(newDarkVars)) {\n const cssVarName = `${prefix}color-${key}`;\n if (!(cssVarName in oldDarkVars)) {\n addedDark.push(cssVarName);\n } else if (oldDarkVars[cssVarName] !== value) {\n modifiedDark.push({ key: cssVarName, old: oldDarkVars[cssVarName], new: value });\n }\n }\n\n for (const key of Object.keys(oldDarkVars)) {\n // Extract the short key from --atmx-color-bg-page -> bg-page\n const shortKey = key.replace(new RegExp(`^${prefix}color-`), \"\");\n if (!(shortKey in newDarkVars)) {\n removedDark.push(key);\n }\n }\n }\n }\n\n return { added, modified, removed, addedDark, modifiedDark, removedDark };\n}\n","/**\n * Rules File Syncing\n * \n * Functions for syncing AI tool rules files.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface SyncRulesOptions {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n rulesDir?: string;\n}\n\nexport interface RulesFileResult {\n tool: string;\n filename: string;\n path: string;\n success: boolean;\n error?: string;\n}\n\nexport async function syncRulesFiles(options: SyncRulesOptions): Promise<RulesFileResult[]> {\n const { dsId, apiKey, apiBase = \"https://atomixstudio.eu\", rulesDir = process.cwd() } = options;\n \n const rulesDirResolved = path.resolve(process.cwd(), rulesDir);\n \n // Detect which AI tools are likely in use based on existing files\n const toolsToSync: Array<{ tool: string; filename: string; dir?: string }> = [\n { tool: \"cursor\", filename: \".cursorrules\" },\n { tool: \"windsurf\", filename: \".windsurfrules\" },\n { tool: \"cline\", filename: \".clinerules\" },\n { tool: \"continue\", filename: \".continuerules\" },\n { tool: \"copilot\", filename: \"copilot-instructions.md\", dir: \".github\" },\n { tool: \"generic\", filename: \"AI_GUIDELINES.md\" },\n ];\n \n // Check which tools have existing files or should be created\n const existingTools = toolsToSync.filter(t => {\n const filePath = t.dir \n ? path.join(rulesDirResolved, t.dir, t.filename)\n : path.join(rulesDirResolved, t.filename);\n return fs.existsSync(filePath);\n });\n \n // If no existing rules files, create .cursorrules by default\n const toolsToWrite = existingTools.length > 0 \n ? existingTools \n : [{ tool: \"cursor\", filename: \".cursorrules\" }];\n \n const results: RulesFileResult[] = [];\n \n for (const { tool, filename, dir } of toolsToWrite) {\n try {\n // Fetch rules from API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n \n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: `Failed to fetch ${tool} rules: ${response.status}`,\n });\n continue;\n }\n \n const rulesData = await response.json() as { content?: string };\n if (!rulesData.content) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: `No content for ${tool} rules`,\n });\n continue;\n }\n \n // Write the file\n const targetDir = dir ? path.join(rulesDirResolved, dir) : rulesDirResolved;\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n \n const filePath = path.join(targetDir, filename);\n fs.writeFileSync(filePath, rulesData.content);\n \n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: true,\n });\n } catch (error) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n \n return results;\n}\n","/**\n * CSS Format Generator\n * \n * Generates CSS output with CSS custom properties and dark mode support.\n */\n\nexport function generateCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"/* Atomix Design System Tokens\",\n \" * Auto-generated - do not edit manually\",\n ` * Synced: ${new Date().toISOString()}`,\n \" *\",\n \" * WARNING: This file is completely rewritten on each sync.\",\n \" * Only CSS custom properties (variables) are preserved.\",\n \" * Custom CSS rules (selectors, classes, etc.) will be lost.\",\n \" * Keep custom CSS in a separate file.\",\n \" */\",\n \"\",\n \"/* Light mode (default) */\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` /* DEPRECATED */ ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode overrides if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"/* Dark mode */\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n // Detect prefix from cssVariables keys\n const firstKey = sortedKeys[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n // Sort dark mode keys for consistent output\n const sortedDarkKeys = Object.keys(darkModeColors).sort();\n for (const key of sortedDarkKeys) {\n // Dark mode colors are stored with keys like \"bg-page\", \"text-primary\"\n // Convert to CSS variable names: --atmx-color-bg-page\n lines.push(` ${prefix}color-${key}: ${darkModeColors[key]};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * SCSS Format Generator\n * \n * Generates SCSS output with CSS variables and SCSS variables.\n */\n\nexport function generateSCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` // DEPRECATED ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = sortedKeys[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// SCSS Variables (light mode values)\");\n \n // Include deprecated tokens in SCSS variables too\n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n const scssVar = \"$\" + key.replace(/^--/, \"\");\n if (deprecated) {\n lines.push(`// DEPRECATED ${scssVar}: ${value};`);\n } else {\n lines.push(`${scssVar}: ${value};`);\n }\n }\n \n // Add dark mode SCSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// SCSS Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const scssVar = `$${prefix}-color-${key}-dark`;\n lines.push(`${scssVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * Less Format Generator\n * \n * Generates Less output with CSS variables and Less variables.\n */\n\nexport function generateLessOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` // DEPRECATED ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// Less Variables (light mode values)\");\n \n for (const [key, value] of Object.entries(cssVariables)) {\n const lessVar = \"@\" + key.replace(/^--/, \"\");\n lines.push(`${lessVar}: ${value};`);\n }\n \n // Add dark mode Less variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Less Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const lessVar = `@${prefix}-color-${key}-dark`;\n lines.push(`${lessVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * JSON Format Generator\n * \n * Generates JSON output with raw token structure.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateJSONOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return JSON.stringify(tokens, null, 2);\n}\n","/**\n * TypeScript Format Generator\n * \n * Generates TypeScript output with types.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateTSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)} as const;\n\nexport type Tokens = typeof tokens;\n`;\n}\n","/**\n * JavaScript Format Generator\n * \n * Generates JavaScript ES module output.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateJSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)};\n`;\n}\n","/**\n * Swift Format Generator\n * \n * Generates Swift/SwiftUI output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToSwiftColor(hex: string): string {\n // #RRGGBB or #RRGGBBAA\n const clean = hex.replace(\"#\", \"\");\n if (clean.length === 3) {\n // #RGB -> #RRGGBB\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(hex: 0x${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(hex: 0x${clean})`;\n }\n if (clean.length === 8) {\n // #RRGGBBAA\n const rgb = clean.substring(0, 6);\n const alpha = parseInt(clean.substring(6, 8), 16) / 255;\n return `Color(hex: 0x${rgb}).opacity(${alpha.toFixed(2)})`;\n }\n return `Color.clear // Could not parse: ${hex}`;\n}\n\nexport function generateSwiftOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import SwiftUI\",\n \"\",\n \"// MARK: - Color Extension for Hex\",\n \"extension Color {\",\n \" init(hex: UInt, alpha: Double = 1.0) {\",\n \" self.init(\",\n \" .sRGB,\",\n \" red: Double((hex >> 16) & 0xFF) / 255.0,\",\n \" green: Double((hex >> 8) & 0xFF) / 255.0,\",\n \" blue: Double(hex & 0xFF) / 255.0,\",\n \" opacity: alpha\",\n \" )\",\n \" }\",\n \"}\",\n \"\",\n \"// MARK: - Design Tokens\",\n \"enum DesignTokens {\",\n \"\",\n \" // MARK: Colors (Light Mode)\",\n \" enum Colors {\"\n ];\n\n // Group by category, including deprecated tokens\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toSwiftName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n } else {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // MARK: Colors (Dark Mode)\");\n lines.push(\" enum ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" // MARK: Spacing\");\n lines.push(\" enum Spacing {\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toSwiftName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n } else {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Typography\");\n lines.push(\" enum Typography {\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toSwiftName(key);\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n } else if (key.includes(\"weight\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n } else if (key.includes(\"family\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Other\");\n lines.push(\" enum Other {\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toSwiftName(key);\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n }\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n } else {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Kotlin Format Generator\n * \n * Generates Kotlin/Jetpack Compose output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toKotlinName(cssVar: string): string {\n // --atmx-color-brand-primary → ColorBrandPrimary\n const camel = toSwiftName(cssVar);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToKotlinColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n // RRGGBBAA -> AARRGGBB for Android\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Color.Transparent // Could not parse: ${hex}`;\n}\n\nexport function generateKotlinOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"package com.atomix.design\",\n \"\",\n \"import androidx.compose.ui.graphics.Color\",\n \"import androidx.compose.ui.unit.dp\",\n \"import androidx.compose.ui.unit.sp\",\n \"\",\n \"object DesignTokens {\",\n \"\",\n \" // Light mode colors\",\n \" object Colors {\"\n ];\n\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toKotlinName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n } else {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Dark mode colors\");\n lines.push(\" object ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `Color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" object Spacing {\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toKotlinName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n lines.push(` val ${name} = ${numValue}.dp`);\n } else {\n lines.push(` val ${name} = ${numValue}.dp`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Typography {\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toKotlinName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.sp`);\n }\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Other {\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toKotlinName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n }\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.dp`);\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Dart Format Generator\n * \n * Generates Dart/Flutter output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toDartName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary (same as Swift)\n return toSwiftName(cssVar);\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToDartColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Colors.transparent // Could not parse: ${hex}`;\n}\n\nexport function generateDartOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import 'package:flutter/material.dart';\",\n \"\",\n \"class DesignTokens {\",\n \" DesignTokens._();\",\n \"\",\n \" // Colors (Light Mode)\"\n ];\n\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toDartName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n } else {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n }\n\n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Colors (Dark Mode)\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}Dark`;\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Spacing\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toDartName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n lines.push(` static const double ${name} = ${numValue};`);\n } else {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Typography\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toDartName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Other\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toDartName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n }\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n }\n\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Format sync response for CLI and MCP\n * \n * Single source of truth for sync output formatting.\n * This ensures MCP and CLI have identical response formats.\n */\n\nimport * as path from \"path\";\nimport type { DesignSystemData, DiffResult } from './types.js';\nimport type { RulesFileResult } from './rules.js';\n\nexport interface FormatSyncResponseOptions {\n // Core data\n data: DesignSystemData;\n output: string;\n format: string;\n \n // Token counts\n dsTokenCount: number;\n deprecatedCount: number;\n deprecatedTokens: Map<string, string>;\n \n // Changes\n diff?: DiffResult;\n changes?: Array<{ key: string; old: string; new: string }>;\n fileExists: boolean;\n \n // Rules\n rulesResults?: RulesFileResult[];\n \n // Governance changes\n governanceChanges?: string[];\n changeSummary?: string | null;\n \n // Refactor info\n hasRefactorRecommendation?: boolean;\n deprecatedTokenCount?: number;\n}\n\n/**\n * Format enhanced sync response text\n * \n * Generates a comprehensive response with explicit lists of:\n * - Deprecated tokens (with values)\n * - New tokens\n * - Modified files (output + rules files)\n * - AI rules changes by foundation\n * - Detailed changes summary\n * - Refactor recommendations\n */\nexport function formatSyncResponse(options: FormatSyncResponseOptions): string {\n const {\n data,\n output,\n format,\n dsTokenCount,\n deprecatedCount,\n deprecatedTokens,\n diff,\n changes = [],\n fileExists,\n rulesResults = [],\n governanceChanges = [],\n changeSummary,\n hasRefactorRecommendation = false,\n deprecatedTokenCount = 0,\n } = options;\n\n const lastUpdated = data.meta.exportedAt \n ? new Date(data.meta.exportedAt).toLocaleString()\n : \"N/A\";\n\n let response = `✓ Synced ${dsTokenCount} tokens to ${output}\\n`;\n response += `Format: ${format}\\n`;\n response += `Design System: ${data.meta.name} (v${data.meta.version})\\n`;\n if (deprecatedCount > 0) {\n response += `Tokens: ${dsTokenCount} active, ${deprecatedCount} deprecated (run /refactor to migrate)\\n`;\n } else {\n response += `Tokens: ${dsTokenCount}\\n`;\n }\n response += `Version: ${data.meta.version}\\n`;\n response += `Last updated: ${lastUpdated}\\n`;\n\n // ============================================\n // SECTION 1: DEPRECATED TOKENS (Explicit List)\n // ============================================\n if (deprecatedCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📋 DEPRECATED TOKENS (${deprecatedCount})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `These tokens are no longer in the design system but are preserved in your file for backward compatibility.\\n`;\n response += `Run \\`/refactor\\` to find and migrate usage in your codebase.\\n\\n`;\n \n const deprecatedTokenList = Array.from(deprecatedTokens.keys()).sort();\n deprecatedTokenList.forEach((token, index) => {\n const value = deprecatedTokens.get(token);\n response += ` ${index + 1}. ${token}`;\n if (value) {\n response += ` = ${value}`;\n }\n response += `\\n`;\n });\n }\n\n // ============================================\n // SECTION 2: NEW TOKENS (Explicit List)\n // ============================================\n const newTokenList: string[] = [];\n if (diff) {\n newTokenList.push(...diff.added, ...diff.addedDark);\n }\n\n // Also include tokens from change summary if available\n if (changeSummary && changeSummary.includes(\"➕ Added:\")) {\n const addedSection = changeSummary.match(/➕ Added: \\d+ token\\(s\\)([\\s\\S]*?)(?=➖|🔄|📝|$)/);\n if (addedSection) {\n const addedLines = addedSection[0].match(/ - (--[^\\n]+)/g) || [];\n addedLines.forEach(line => {\n const token = line.replace(/ - /, \"\").trim();\n if (token && !newTokenList.includes(token)) {\n newTokenList.push(token);\n }\n });\n }\n }\n\n if (newTokenList.length > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `✨ NEW TOKENS (${newTokenList.length})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n newTokenList.sort().forEach((token, index) => {\n response += ` ${index + 1}. ${token}\\n`;\n });\n }\n\n // ============================================\n // SECTION 3: MODIFIED FILES (Explicit List)\n // ============================================\n const modifiedFiles: string[] = [output];\n\n // Add rules files that were synced\n rulesResults.forEach(result => {\n if (result.success) {\n const fullPath = path.resolve(process.cwd(), result.path);\n if (!modifiedFiles.includes(fullPath)) {\n modifiedFiles.push(fullPath);\n }\n }\n });\n\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📁 MODIFIED FILES (${modifiedFiles.length})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n modifiedFiles.forEach((file, index) => {\n const relativePath = path.relative(process.cwd(), file);\n response += ` ${index + 1}. ${relativePath}\\n`;\n });\n\n // ============================================\n // SECTION 4: AI RULES CHANGES (By Foundation)\n // ============================================\n if (governanceChanges.length > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📝 AI RULES CHANGES\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `The following AI guidance sections have been updated:\\n\\n`;\n \n // Capitalize foundation names\n const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n \n governanceChanges.forEach((foundation, index) => {\n const displayName = foundation === \"general\" \n ? \"General Rules\" \n : capitalize(foundation);\n response += ` ${index + 1}. ${displayName}\\n`;\n });\n \n response += `\\nThese changes are reflected in your AI tool rules files (e.g., .cursorrules).\\n`;\n response += `Review the updated rules files to see the new guidance.\\n`;\n }\n\n // ============================================\n // SECTION 5: DETAILED CHANGES (Keep existing)\n // ============================================\n if (diff) {\n const lightChanges = diff.added.length + diff.modified.length;\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length;\n \n if (lightChanges > 0 || darkChanges > 0 || deprecatedCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📊 DETAILED CHANGES\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n \n const lightSummary = lightChanges > 0 ? `Light: ${diff.modified.length} modified, ${diff.added.length} added` : \"\";\n const darkSummary = darkChanges > 0 ? `Dark: ${diff.modifiedDark.length} modified, ${diff.addedDark.length} added` : \"\";\n const deprecatedSummary = deprecatedCount > 0 ? `${deprecatedCount} deprecated (use /refactor)` : \"\";\n const diffSummary = [lightSummary, darkSummary, deprecatedSummary].filter(Boolean).join(\" | \");\n response += `${diffSummary}\\n`;\n \n if (changes.length > 0 && changes.length <= 10) {\n response += \"\\nModified tokens:\\n\";\n for (const { key, old: oldVal, new: newVal } of changes) {\n response += ` ${key}: ${oldVal} → ${newVal}\\n`;\n }\n }\n }\n } else if (!fileExists) {\n response += `\\n(New file created)\\n`;\n }\n\n // ============================================\n // SECTION 6: REFACTOR RECOMMENDATION\n // ============================================\n if (hasRefactorRecommendation && deprecatedTokenCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `💡 NEXT STEP\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `${deprecatedTokenCount} token(s) have been deprecated.\\n`;\n response += `Your codebase may still reference these deprecated tokens.\\n\\n`;\n response += `Run \\`/refactor\\` to:\\n`;\n response += ` • Scan your codebase for deprecated token usage\\n`;\n response += ` • See which files need updates\\n`;\n response += ` • Review and apply changes with your confirmation\\n`;\n }\n\n return response;\n}\n","/**\n * Token Utilities\n * \n * Functions for working with design tokens.\n */\n\nimport type { DesignSystemData } from './types.js';\n\nexport function getTokenByPath(tokens: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = tokens;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\nexport function flattenTokens(obj: unknown, prefix = \"\"): Array<{ path: string; value: unknown }> {\n const results: Array<{ path: string; value: unknown }> = [];\n\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n for (const [key, value] of Object.entries(obj)) {\n const newPath = prefix ? `${prefix}.${key}` : key;\n \n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n results.push(...flattenTokens(value, newPath));\n } else {\n results.push({ path: newPath, value });\n }\n }\n }\n\n return results;\n}\n\nexport function searchTokens(tokens: Record<string, unknown>, query: string): Array<{ path: string; value: unknown }> {\n const flat = flattenTokens(tokens);\n const lowerQuery = query.toLowerCase();\n \n return flat.filter(({ path, value }) => {\n const pathMatch = path.toLowerCase().includes(lowerQuery);\n const valueMatch = String(value).toLowerCase().includes(lowerQuery);\n return pathMatch || valueMatch;\n });\n}\n\nexport function countTokens(tokens: Record<string, unknown>, prefix = \"\"): number {\n let count = 0;\n for (const [key, value] of Object.entries(tokens)) {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n count += countTokens(value as Record<string, unknown>, `${prefix}${key}.`);\n } else if (value !== undefined && value !== null) {\n count++;\n }\n }\n return count;\n}\n\nexport function getTokenStats(data: DesignSystemData): {\n total: number;\n byCategory: Record<string, number>;\n cssVariables: number;\n governanceRules: number;\n} {\n const byCategory: Record<string, number> = {};\n let total = 0;\n\n for (const [category, value] of Object.entries(data.tokens)) {\n if (value && typeof value === \"object\") {\n const count = countTokens(value as Record<string, unknown>);\n byCategory[category] = count;\n total += count;\n }\n }\n\n return {\n total,\n byCategory,\n cssVariables: Object.keys(data.cssVariables).length,\n governanceRules: data.governance.rules.length,\n };\n}\n","/**\n * Config Management\n * \n * Functions for loading and managing .atomixrc configuration.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { AtomixConfig, DEFAULT_INCLUDE, DEFAULT_EXCLUDE } from './types.js';\n\nexport { DEFAULT_INCLUDE, DEFAULT_EXCLUDE } from './types.js';\n\nexport function findConfig(): AtomixConfig | null {\n const configNames = [\".atomixrc\", \".atomixrc.json\", \"atomix.config.json\"];\n const cwd = process.cwd();\n \n for (const name of configNames) {\n const configPath = path.join(cwd, name);\n if (fs.existsSync(configPath)) {\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n return JSON.parse(content) as AtomixConfig;\n } catch {\n console.error(`Error parsing ${name}`);\n }\n }\n }\n return null;\n}\n","/**\n * Build Figma variable + paint + text + effect style payloads from design system tokens.\n * Single source for sync-to-Figma (MCP and in-plugin).\n */\n\nimport type {\n FigmaSyncDSInput,\n FigmaSyncPayloads,\n FigmaTextStylePayload,\n FigmaDropShadow,\n FigmaSyncStep,\n StoredColorsForFigmaRefs,\n FigmaColorVariable,\n} from \"./types.js\";\n\n/** Fallback prefix map for DS that don't provide _groupPrefix (e.g. legacy). Group names can be removed/renamed in DS. */\nconst LEGACY_GROUP_PREFIX: Record<string, string> = {\n background: \"bg\",\n text: \"text\",\n icon: \"icon\",\n border: \"border\",\n brand: \"brand\",\n action: \"action\",\n feedback: \"feedback\",\n};\n\nconst RESERVED_COLOR_KEYS = new Set<string>([\"customScales\", \"neutral\"]);\n\n/** Group order from stored colors: use _groupOrder when set, otherwise derive from object keys (so DS can remove/rename groups). */\nfunction getColorGroupOrder(storedColors: StoredColorsForFigmaRefs): string[] {\n if (Array.isArray(storedColors._groupOrder) && storedColors._groupOrder.length > 0) {\n return storedColors._groupOrder;\n }\n return Object.keys(storedColors).filter(\n (k) => !k.startsWith(\"_\") && !RESERVED_COLOR_KEYS.has(k) && typeof storedColors[k] === \"object\"\n );\n}\n\n/** Prefix for export key (e.g. \"bg\" for \"bg-page\"). Prefer DS _groupPrefix; else legacy map; else groupName. */\nfunction getGroupPrefix(storedColors: StoredColorsForFigmaRefs, groupName: string): string {\n const custom = (storedColors as { _groupPrefix?: Record<string, string> })._groupPrefix;\n if (custom && typeof custom[groupName] === \"string\") return custom[groupName];\n return LEGACY_GROUP_PREFIX[groupName] ?? groupName;\n}\n\n/**\n * Use exact scale name from API/DB; only capitalize first letter for Figma display. No mapping or invented names.\n */\nfunction refScaleToFigmaDisplayName(scaleFromRef: string): string {\n const s = scaleFromRef.trim();\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\n/**\n * Convert stored reference (e.g. \"brand.600\", \"radix.gray.50\", \"new.coral\") to Figma primitive variable name.\n * Returns null if the result is not in the primitives set (e.g. radix scale not synced as a scale).\n * Red vs redDark stay distinct: red.900 -> \"Red / 900\", redDark.900 -> \"RedDark / 900\" (schema names).\n */\nfunction referenceToFigmaPrimitiveName(\n ref: string,\n primitiveNames: Set<string>\n): string | null {\n if (!ref || typeof ref !== \"string\") return null;\n const r = ref.trim();\n // Use exact names from DB: e.g. \"Brand / 600\", \"Neutral / 50\", \"Red / 900\", \"RedDark / 900\"\n const scaleStep = /^([a-zA-Z]+)\\.(\\d+|[a-z]+)$/.exec(r);\n if (scaleStep) {\n const [, scale, step] = scaleStep;\n const scaleDisplay = refScaleToFigmaDisplayName(scale);\n const name = `${scaleDisplay} / ${step}`;\n return primitiveNames.has(name) ? name : null;\n }\n // radix.*: use family name as-is (e.g. \"Gray / 50\", \"GrayDark / 950\", \"RedDark / 800\")\n const radixMatch = /^radix\\.([a-zA-Z]+)\\.(\\d+)$/.exec(r);\n if (radixMatch) {\n const [, family, step] = radixMatch;\n const scaleName = refScaleToFigmaDisplayName(family);\n const name = `${scaleName} / ${step}`;\n return primitiveNames.has(name) ? name : null;\n }\n // new.coral, oneOff.coral -> \"One-off / coral\"\n const oneOffMatch = /^(?:new|oneOff)\\.(.+)$/.exec(r);\n if (oneOffMatch) {\n const name = `One-off / ${oneOffMatch[1]}`;\n return primitiveNames.has(name) ? name : null;\n }\n // whiteAlpha.200, blackAlpha.300\n const whiteAlpha = /^whiteAlpha\\.(.+)$/.exec(r);\n if (whiteAlpha) {\n const name = `WhiteAlpha / ${whiteAlpha[1]}`;\n return primitiveNames.has(name) ? name : null;\n }\n const blackAlpha = /^blackAlpha\\.(.+)$/.exec(r);\n if (blackAlpha) {\n const name = `BlackAlpha / ${blackAlpha[1]}`;\n return primitiveNames.has(name) ? name : null;\n }\n return null;\n}\n\n/**\n * Parse reference string to Figma scale name (e.g. \"gray.50\" -> \"Gray\", \"redDark.900\" -> \"RedDark\").\n * Uses schema scale names; dark refs stay distinct so we create both \"Red\" and \"RedDark\" primitives.\n */\nfunction referenceToScaleName(ref: string): string | null {\n if (!ref || typeof ref !== \"string\") return null;\n const r = ref.trim();\n const scaleStep = /^([a-zA-Z]+)\\.(\\d+|[a-z]+)$/.exec(r);\n if (scaleStep) return refScaleToFigmaDisplayName(scaleStep[1]);\n const radixMatch = /^radix\\.([a-zA-Z]+)\\.(\\d+)$/.exec(r);\n if (radixMatch) return refScaleToFigmaDisplayName(radixMatch[1]);\n return null;\n}\n\n/**\n * Collect scale names referenced by any semantic (so we can ensure full scale is in primitives).\n */\nfunction getReferencedScaleNames(storedColors: StoredColorsForFigmaRefs): Set<string> {\n const names = new Set<string>();\n const groupOrder = getColorGroupOrder(storedColors);\n for (const groupName of groupOrder) {\n const group = storedColors[groupName];\n if (!group || typeof group !== \"object\") continue;\n const keys = Object.keys(group).filter((k) => !k.startsWith(\"_\") && k !== \"governance\");\n for (const key of keys) {\n const value = (group as Record<string, unknown>)[key];\n if (value === undefined || typeof value !== \"object\" || value === null) continue;\n const theme = value as { light?: { reference?: string }; dark?: { reference?: string } };\n const lightScale = theme.light?.reference ? referenceToScaleName(theme.light.reference) : null;\n const darkScale = theme.dark?.reference ? referenceToScaleName(theme.dark.reference) : null;\n if (lightScale) names.add(lightScale);\n if (darkScale) names.add(darkScale);\n }\n }\n return names;\n}\n\n/**\n * Get full scale steps (step -> hex) from stored colors only. No Radix/API fallback.\n * Neutral from storedColors.neutral.steps; others from customScales (exact name match from DB).\n */\nfunction getFullScaleFromStored(\n storedColors: StoredColorsForFigmaRefs,\n scaleName: string\n): Record<string, string> | null {\n const key = scaleName.toLowerCase();\n if (key === \"neutral\" || key === \"gray\") {\n const neutral = storedColors.neutral as { steps?: Record<string, { hex?: string }> } | undefined;\n if (!neutral?.steps || typeof neutral.steps !== \"object\") return null;\n const out: Record<string, string> = {};\n for (const [step, stepValue] of Object.entries(neutral.steps)) {\n const hex = stepValue?.hex;\n if (typeof hex === \"string\" && /^#?[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/i.test(hex)) {\n out[step] = hex.startsWith(\"#\") ? hex : `#${hex}`;\n }\n }\n return Object.keys(out).length > 0 ? out : null;\n }\n const customScales = storedColors.customScales as Array<{ name?: string; steps?: Record<string, { hex?: string }> }> | undefined;\n if (Array.isArray(customScales)) {\n const keyNorm = key.replace(/\\s+/g, \"\");\n const scale = customScales.find(\n (s) => s.name?.toLowerCase() === key || s.name?.toLowerCase().replace(/\\s+/g, \"\") === keyNorm\n );\n if (scale?.steps && typeof scale.steps === \"object\") {\n const out: Record<string, string> = {};\n for (const [step, stepValue] of Object.entries(scale.steps)) {\n const hex = stepValue?.hex;\n if (typeof hex === \"string\" && /^#?[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/i.test(hex)) {\n out[step] = hex.startsWith(\"#\") ? hex : `#${hex}`;\n }\n }\n if (Object.keys(out).length > 0) return out;\n }\n }\n return null;\n}\n\n/**\n * Build map: export key -> { Light?, Dark? } primitive names from stored refs (exact names from DB).\n */\nfunction buildSemanticRefMap(\n storedColors: StoredColorsForFigmaRefs,\n primitiveNames: Set<string>\n): Record<string, { Light?: string; Dark?: string }> {\n const out: Record<string, { Light?: string; Dark?: string }> = {};\n const groupOrder = getColorGroupOrder(storedColors);\n for (const groupName of groupOrder) {\n const group = storedColors[groupName];\n if (!group || typeof group !== \"object\") continue;\n const prefix = getGroupPrefix(storedColors, groupName);\n const rowOrder = Array.isArray((group as { _rowOrder?: string[] })._rowOrder)\n ? (group as { _rowOrder: string[] })._rowOrder\n : undefined;\n const keys = Array.isArray(rowOrder)\n ? rowOrder\n : Object.keys(group).filter((k) => !k.startsWith(\"_\") && k !== \"governance\");\n const toKebab = prefix === \"action\" || prefix === \"brand\" || prefix === \"feedback\";\n for (const key of keys) {\n const value = (group as Record<string, unknown>)[key];\n if (value === undefined || typeof value !== \"object\" || value === null) continue;\n const theme = value as { light?: { reference?: string }; dark?: { reference?: string } };\n let cssKey: string = key === \"app\" ? \"page\" : key;\n if (toKebab) {\n cssKey = String(key).replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n }\n const fullKey = `${prefix}-${cssKey}`;\n const lightRef = theme.light?.reference ? referenceToFigmaPrimitiveName(theme.light.reference, primitiveNames) : null;\n const darkRef = theme.dark?.reference ? referenceToFigmaPrimitiveName(theme.dark.reference, primitiveNames) : null;\n if (lightRef || darkRef) {\n out[fullKey] = {};\n if (lightRef) out[fullKey].Light = lightRef;\n if (darkRef) out[fullKey].Dark = darkRef;\n }\n }\n }\n return out;\n}\n\n/** Derive Figma variable/style name with grouping from any export key. */\nexport function figmaColorNameWithGroup(key: string): string {\n if (key.includes(\"/\")) {\n const [group, ...rest] = key.split(\"/\");\n const name = rest.join(\"/\").trim();\n if (!name) return key;\n const groupDisplay = group.charAt(0).toUpperCase() + group.slice(1).toLowerCase();\n return `${groupDisplay} / ${name}`;\n }\n const firstDash = key.indexOf(\"-\");\n if (firstDash <= 0) return key;\n const group = key.slice(0, firstDash);\n const name = key.slice(firstDash + 1);\n const groupDisplay = group.charAt(0).toUpperCase() + group.slice(1).toLowerCase();\n return `${groupDisplay} / ${name}`;\n}\n\nconst FIGMA_SHADOW_ORDER: Record<string, number> = {\n none: 0,\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n \"2xl\": 6,\n focus: 7,\n};\n\nfunction tokenValueToNumber(s: string): number {\n if (typeof s !== \"string\" || !s.trim()) return 0;\n const t = s.trim();\n if (t.endsWith(\"rem\")) {\n const n = parseFloat(t.replace(/rem$/, \"\"));\n return Number.isFinite(n) ? Math.round(n * 16) : 0;\n }\n if (t.endsWith(\"px\")) {\n const n = parseFloat(t.replace(/px$/, \"\"));\n return Number.isFinite(n) ? Math.round(n) : 0;\n }\n const n = parseFloat(t);\n return Number.isFinite(n) ? n : 0;\n}\n\nfunction parseBoxShadowToFigmaEffect(shadowStr: string): FigmaDropShadow | null {\n const s = shadowStr.trim();\n if (!s || s.toLowerCase() === \"none\") return null;\n const parsePx = (x: string): number => (typeof x === \"string\" ? parseFloat(x.replace(/px$/i, \"\")) : NaN);\n const colorMatch = s.match(/(rgba?\\s*\\([^)]+\\)|#[0-9A-Fa-f]{3,8})\\s*$/i);\n const colorStr = colorMatch ? colorMatch[1].trim() : undefined;\n const rest = (colorMatch ? s.slice(0, colorMatch.index) : s).trim();\n const parts = rest ? rest.split(/\\s+/) : [];\n if (parts.length < 3) return null;\n const offsetX = parsePx(parts[0]);\n const offsetY = parsePx(parts[1]);\n const blur = parsePx(parts[2]);\n let spread = 0;\n if (parts.length >= 4) spread = parsePx(parts[3]);\n let r = 0,\n g = 0,\n b = 0,\n a = 0.1;\n if (colorStr) {\n const rgbaMatch = colorStr.match(/rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n if (rgbaMatch) {\n r = Number(rgbaMatch[1]) / 255;\n g = Number(rgbaMatch[2]) / 255;\n b = Number(rgbaMatch[3]) / 255;\n a = rgbaMatch[4] != null ? parseFloat(rgbaMatch[4]) : 1;\n } else {\n const hexMatch = colorStr.match(/^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/);\n if (hexMatch) {\n r = parseInt(hexMatch[1].slice(0, 2), 16) / 255;\n g = parseInt(hexMatch[1].slice(2, 4), 16) / 255;\n b = parseInt(hexMatch[1].slice(4, 6), 16) / 255;\n a = hexMatch[2] ? parseInt(hexMatch[2], 16) / 255 : 0.1;\n }\n }\n }\n if (!Number.isFinite(offsetX) || !Number.isFinite(offsetY) || !Number.isFinite(blur)) return null;\n return {\n type: \"DROP_SHADOW\",\n offset: { x: offsetX, y: offsetY },\n radius: Math.max(0, blur),\n spread: Number.isFinite(spread) ? spread : 0,\n color: { r, g, b, a },\n visible: true,\n blendMode: \"NORMAL\",\n };\n}\n\nfunction parseBoxShadowToFigmaEffects(shadowStr: string): FigmaDropShadow[] {\n const s = (shadowStr || \"\").trim();\n if (!s || s.toLowerCase() === \"none\") return [];\n const out: FigmaDropShadow[] = [];\n const segments = s.split(/\\s*,\\s*/);\n for (const seg of segments) {\n const effect = parseBoxShadowToFigmaEffect(seg.trim());\n if (effect) out.push(effect);\n }\n return out;\n}\n\nexport function colorTo8DigitHex(color: string): string | null {\n if (!color || typeof color !== \"string\") return null;\n const s = color.trim();\n const rgbaMatch = s.match(/rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n if (rgbaMatch) {\n const r = Math.max(0, Math.min(255, parseInt(rgbaMatch[1], 10)));\n const g = Math.max(0, Math.min(255, parseInt(rgbaMatch[2], 10)));\n const b = Math.max(0, Math.min(255, parseInt(rgbaMatch[3], 10)));\n const a = rgbaMatch[4] != null ? Math.max(0, Math.min(1, parseFloat(rgbaMatch[4]))) : 1;\n const aByte = Math.round(a * 255);\n const hex = \"#\" + [r, g, b, aByte].map((n) => n.toString(16).padStart(2, \"0\")).join(\"\").toUpperCase();\n return hex;\n }\n const hexMatch = s.match(/^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/i);\n if (hexMatch) {\n const rgb = hexMatch[1];\n const aa = hexMatch[2] ?? \"FF\";\n return `#${rgb}${aa}`.toUpperCase();\n }\n return null;\n}\n\nfunction typesetKeyToFontFamilyRole(key: string): \"display\" | \"heading\" | \"body\" | \"mono\" {\n const prefix = (key.split(\"-\")[0] ?? key).toLowerCase();\n if (prefix === \"display\" || prefix.startsWith(\"display\")) return \"display\";\n if (prefix === \"heading\" || prefix.startsWith(\"heading\")) return \"heading\";\n if (prefix === \"mono\" || prefix.startsWith(\"mono\")) return \"mono\";\n if (prefix.startsWith(\"body\")) return \"body\";\n return \"body\";\n}\n\n/**\n * Build Figma variable + paint + text style payloads from design system data.\n * Input shape: { tokens, meta } (e.g. from ExportedTokens or sync-core DesignSystemData).\n */\nexport function buildFigmaPayloadsFromDS(data: FigmaSyncDSInput): FigmaSyncPayloads {\n const tokens = data.tokens as Record<string, unknown>;\n const colors = tokens?.colors as {\n static?: { brand?: Record<string, string> };\n modes?: { light?: Record<string, string>; dark?: Record<string, string> };\n alphaScales?: { whiteAlpha?: Record<string, string>; blackAlpha?: Record<string, string> };\n scales?: Record<string, Record<string, string>>;\n oneOffs?: Array<{ id: string; name: string; hex: string }>;\n } | undefined;\n const typography = tokens?.typography as Record<string, unknown> | undefined;\n\n const hexRe = /^#?[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/;\n const modes: string[] = [];\n if (colors?.modes) {\n const light = colors.modes.light ?? {};\n const dark = colors.modes.dark ?? {};\n if (Object.keys(light).length > 0) modes.push(\"Light\");\n if (Object.keys(dark).length > 0 && !modes.includes(\"Dark\")) modes.push(\"Dark\");\n }\n if (modes.length === 0) modes.push(\"Light\");\n\n /** Primitives collection uses a single mode named \"Value\" (column header in Figma); Radix and semantics use full modes. */\n const primitiveModes = [\"Value\"];\n\n const dsName = data.meta?.name;\n const collectionPrefix = dsName ? `${dsName} ` : \"\";\n\n const referencedScaleNames =\n data.storedColors ? getReferencedScaleNames(data.storedColors) : new Set<string>();\n // ----- Primitives: \"[DS name] Colors Primitives\" (no scopes, variables only) -----\n const primitiveVariables: Array<{ name: string; values: Record<string, string> }> = [];\n const primitiveNames = new Set<string>();\n /** Hex (normalized 8-char) -> \"One-off / name\" for linking semantics that use one-off hex but lack ref. */\n const oneOffHexToFigmaName = new Map<string, string>();\n\n const alphaScales = colors?.alphaScales;\n if (alphaScales?.whiteAlpha && typeof alphaScales.whiteAlpha === \"object\") {\n for (const [step, value] of Object.entries(alphaScales.whiteAlpha)) {\n if (typeof value !== \"string\") continue;\n const hex = colorTo8DigitHex(value);\n if (!hex || !hexRe.test(hex)) continue;\n const figmaName = `WhiteAlpha / ${step}`;\n if (primitiveNames.has(figmaName)) continue;\n primitiveNames.add(figmaName);\n const values: Record<string, string> = {};\n for (const m of primitiveModes) values[m] = hex;\n primitiveVariables.push({ name: figmaName, values });\n }\n }\n if (alphaScales?.blackAlpha && typeof alphaScales.blackAlpha === \"object\") {\n for (const [step, value] of Object.entries(alphaScales.blackAlpha)) {\n if (typeof value !== \"string\") continue;\n const hex = colorTo8DigitHex(value);\n if (!hex || !hexRe.test(hex)) continue;\n const figmaName = `BlackAlpha / ${step}`;\n if (primitiveNames.has(figmaName)) continue;\n primitiveNames.add(figmaName);\n const values: Record<string, string> = {};\n for (const m of primitiveModes) values[m] = hex;\n primitiveVariables.push({ name: figmaName, values });\n }\n }\n // Custom scales (brand, neutral, accent, etc.) — include all steps from export\n if (colors?.scales && typeof colors.scales === \"object\") {\n for (const [scaleName, steps] of Object.entries(colors.scales)) {\n if (!steps || typeof steps !== \"object\") continue;\n let groupDisplay = scaleName.charAt(0).toUpperCase() + scaleName.slice(1);\n if (scaleName.toLowerCase() === \"neutral\" && data.storedColors) {\n const neutral = data.storedColors.neutral as { baseHueFamily?: string } | undefined;\n if (neutral?.baseHueFamily) {\n groupDisplay = refScaleToFigmaDisplayName(neutral.baseHueFamily);\n }\n }\n for (const [step, hexVal] of Object.entries(steps)) {\n if (typeof hexVal !== \"string\") continue;\n const hex = colorTo8DigitHex(hexVal) ?? (hexRe.test(hexVal) ? hexVal : null);\n if (!hex || !hexRe.test(hex)) continue;\n const figmaName = `${groupDisplay} / ${step}`;\n if (primitiveNames.has(figmaName)) continue;\n primitiveNames.add(figmaName);\n const values: Record<string, string> = {};\n for (const m of primitiveModes) values[m] = hex;\n primitiveVariables.push({ name: figmaName, values });\n }\n }\n }\n // Referenced scales: from stored data first, then getRadixScale for scales the DB refs point to\n // (e.g. refs say \"radix.grayDark.50\" — grayDark isn't in stored/customScales, so we need getRadixScale for hex data)\n const radixVariables: Array<{ name: string; values: Record<string, string> }> = [];\n const radixCollectionName = `${collectionPrefix}Colors Radix`;\n\n for (const scaleName of referencedScaleNames) {\n if (primitiveNames.has(`${scaleName} / 50`) || primitiveNames.has(`${scaleName} / 100`)) continue;\n const fromStored = data.storedColors\n ? getFullScaleFromStored(data.storedColors, scaleName)\n : null;\n const scaleData = fromStored ?? data.getRadixScale?.(scaleName) ?? null;\n if (!scaleData) continue;\n for (const [step, hexVal] of Object.entries(scaleData)) {\n const figmaName = `${scaleName} / ${step}`;\n if (primitiveNames.has(figmaName)) continue;\n const hex = colorTo8DigitHex(hexVal) ?? (hexRe.test(hexVal) ? hexVal : null);\n if (!hex || !hexRe.test(hex)) continue;\n primitiveNames.add(figmaName);\n const values: Record<string, string> = {};\n for (const m of primitiveModes) values[m] = hex;\n primitiveVariables.push({ name: figmaName, values });\n }\n }\n // One-off colors; track hex -> Figma name so semantics can alias when value matches\n if (colors?.oneOffs && Array.isArray(colors.oneOffs)) {\n for (const oneOff of colors.oneOffs) {\n if (!oneOff || typeof oneOff !== \"object\" || typeof oneOff.hex !== \"string\") continue;\n const hex = colorTo8DigitHex(oneOff.hex) ?? (hexRe.test(oneOff.hex) ? oneOff.hex : null);\n if (!hex || !hexRe.test(hex)) continue;\n const name = typeof oneOff.name === \"string\" && oneOff.name ? oneOff.name : oneOff.id ?? \"unnamed\";\n const figmaName = `One-off / ${name}`;\n if (primitiveNames.has(figmaName)) continue;\n primitiveNames.add(figmaName);\n const values: Record<string, string> = {};\n for (const m of primitiveModes) values[m] = hex;\n primitiveVariables.push({ name: figmaName, values });\n const normalizedHex = hex.replace(/^#/, \"\").toUpperCase();\n const key8 = normalizedHex.length === 6 ? normalizedHex + \"FF\" : normalizedHex;\n oneOffHexToFigmaName.set(key8, figmaName);\n }\n }\n\n // ----- Semantic -> primitive ref map (from stored colors) -----\n const semanticRefMap =\n data.storedColors && primitiveNames.size > 0\n ? buildSemanticRefMap(data.storedColors, primitiveNames)\n : {};\n\n // ----- Semantics: \"[DS name] Colors\" (with scopes; link to primitives via alias when ref available) -----\n const semanticVariables: FigmaColorVariable[] = [];\n const semanticNames = new Set<string>();\n const primitivesCollectionName = `${collectionPrefix}Colors Primitives`;\n\n if (colors?.modes) {\n const light = colors.modes.light ?? {};\n const dark = colors.modes.dark ?? {};\n const orderedKeys = [...Object.keys(light)];\n for (const k of Object.keys(dark)) {\n if (!orderedKeys.includes(k)) orderedKeys.push(k);\n }\n for (const key of orderedKeys) {\n const lightVal = light[key];\n const darkVal = dark[key];\n const lightHex =\n typeof lightVal === \"string\" ? colorTo8DigitHex(lightVal) ?? (hexRe.test(lightVal) ? lightVal : null) : null;\n if (lightHex && hexRe.test(lightHex)) {\n const figmaName = figmaColorNameWithGroup(key);\n if (semanticNames.has(figmaName)) continue;\n semanticNames.add(figmaName);\n const darkHex =\n typeof darkVal === \"string\" ? colorTo8DigitHex(darkVal) ?? (hexRe.test(darkVal) ? darkVal : null) : null;\n const refs = semanticRefMap[key];\n const values: Record<string, string> = {\n ...(modes.includes(\"Light\") && { Light: lightHex }),\n ...(modes.includes(\"Dark\") && { Dark: darkHex && hexRe.test(darkHex) ? darkHex : lightHex }),\n };\n const aliasByMode: Record<string, string> = {};\n for (const m of modes) {\n const aliasFromRef = m === \"Light\" ? refs?.Light : refs?.Dark;\n if (aliasFromRef && primitiveNames.has(aliasFromRef)) {\n aliasByMode[m] = aliasFromRef;\n continue;\n }\n const hexForMode = m === \"Light\" ? lightHex : (darkHex && hexRe.test(darkHex) ? darkHex : lightHex);\n const norm = hexForMode.replace(/^#/, \"\").toUpperCase();\n const key8 = norm.length === 6 ? norm + \"FF\" : norm;\n const oneOffAlias = oneOffHexToFigmaName.get(key8);\n if (oneOffAlias) {\n aliasByMode[m] = oneOffAlias;\n }\n }\n semanticVariables.push({\n name: figmaName,\n values,\n ...(Object.keys(aliasByMode).length > 0 ? { aliasByMode } : {}),\n });\n }\n }\n }\n if (colors?.static?.brand && typeof colors.static.brand === \"object\") {\n for (const [key, hex] of Object.entries(colors.static.brand)) {\n if (typeof hex !== \"string\" || !hexRe.test(hex)) continue;\n const figmaName = figmaColorNameWithGroup(`brand/${key}`);\n if (semanticNames.has(figmaName)) continue;\n semanticNames.add(figmaName);\n const values: Record<string, string> = {};\n for (const m of modes) values[m] = hex;\n semanticVariables.push({ name: figmaName, values });\n }\n }\n\n const colorVariableCollections: FigmaSyncPayloads[\"colorVariableCollections\"] = [];\n if (primitiveVariables.length > 0) {\n colorVariableCollections.push({\n collectionName: primitivesCollectionName,\n modes: primitiveModes,\n variables: primitiveVariables,\n applyScopes: false,\n });\n }\n if (radixVariables.length > 0) {\n colorVariableCollections.push({\n collectionName: radixCollectionName,\n modes,\n variables: radixVariables,\n applyScopes: false,\n });\n }\n if (semanticVariables.length > 0) {\n const primitiveCollections: string[] = [];\n if (primitiveVariables.length > 0) primitiveCollections.push(primitivesCollectionName);\n if (radixVariables.length > 0) primitiveCollections.push(radixCollectionName);\n colorVariableCollections.push({\n collectionName: `${collectionPrefix}Colors Semantic`,\n modes,\n variables: semanticVariables,\n applyScopes: true,\n ...(primitiveCollections.length > 1\n ? { primitiveCollectionNames: primitiveCollections }\n : primitiveCollections.length === 1\n ? { primitiveCollectionName: primitiveCollections[0] }\n : {}),\n });\n }\n\n const paintStyles: Array<{ name: string; color: string }> = [];\n\n const textStyles: FigmaTextStylePayload[] = [];\n const sizeToPx = (val: string | number, basePx = 16): number => {\n if (typeof val === \"number\") return Math.round(val);\n const s = String(val).trim();\n const pxMatch = s.match(/^([\\d.]+)\\s*px$/i);\n if (pxMatch) return Math.round(parseFloat(pxMatch[1]));\n const remMatch = s.match(/^([\\d.]+)\\s*rem$/i);\n if (remMatch) return Math.round(parseFloat(remMatch[1]) * basePx);\n const n = parseFloat(s);\n if (Number.isFinite(n)) return n <= 0 ? basePx : n < 50 ? Math.round(n * basePx) : Math.round(n);\n return basePx;\n };\n const letterSpacingToPx = (val: string | number | undefined, fontSizePx: number): number | undefined => {\n if (val === undefined || val === null) return undefined;\n if (typeof val === \"number\") return Math.round(val);\n const s = String(val).trim();\n const pxMatch = s.match(/^([-\\d.]+)\\s*px$/i);\n if (pxMatch) return Math.round(parseFloat(pxMatch[1]));\n const emMatch = s.match(/^([-\\d.]+)\\s*em$/i);\n if (emMatch) return Math.round(parseFloat(emMatch[1]) * fontSizePx);\n const n = parseFloat(s);\n return Number.isFinite(n) ? Math.round(n) : undefined;\n };\n const firstFont = (obj: unknown): string => {\n if (typeof obj === \"string\") {\n const primary = obj.split(\",\")[0].trim().replace(/^['\"]|['\"]$/g, \"\");\n return primary || \"Inter\";\n }\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n const v =\n (obj as Record<string, unknown>).body ??\n (obj as Record<string, unknown>).heading ??\n (obj as Record<string, unknown>).display ??\n Object.values(obj as object)[0];\n return firstFont(v);\n }\n return \"Inter\";\n };\n const toFontFamilyString = (val: unknown): string => {\n if (typeof val === \"string\") {\n const s = val.trim().replace(/^[\"']|[\"']$/g, \"\");\n return s || \"Inter\";\n }\n return firstFont(val);\n };\n\n const fontFamilyMap = (typography?.fontFamily as Record<string, string> | undefined) ?? {};\n const defaultFontFamily = typography ? firstFont(typography.fontFamily ?? \"Inter\") : \"Inter\";\n const fontSizeMap = typography?.fontSize as Record<string, string> | undefined;\n const fontWeightMap = typography?.fontWeight as Record<string, number | string> | undefined;\n const lineHeightMap = typography?.lineHeight as Record<string, number> | undefined;\n const letterSpacingMap = typography?.letterSpacing as Record<string, string> | undefined;\n const textTransformMap = typography?.textTransform as Record<string, \"uppercase\" | \"lowercase\" | \"capitalize\" | \"none\"> | undefined;\n const textDecorationMap = typography?.textDecoration as Record<string, \"underline\" | \"none\"> | undefined;\n\n if (fontSizeMap && typeof fontSizeMap === \"object\" && Object.keys(fontSizeMap).length > 0) {\n for (const [key, sizeVal] of Object.entries(fontSizeMap)) {\n const fontSize = sizeToPx(sizeVal);\n if (fontSize <= 0) continue;\n const role = typesetKeyToFontFamilyRole(key);\n const fontFamily = toFontFamilyString(\n fontFamilyMap[role] ?? fontFamilyMap.body ?? fontFamilyMap.heading ?? fontFamilyMap.display ?? defaultFontFamily\n );\n const lh = lineHeightMap && typeof lineHeightMap === \"object\" ? lineHeightMap[key] : undefined;\n const weight = fontWeightMap && typeof fontWeightMap === \"object\" ? fontWeightMap[key] : undefined;\n const fontWeight = weight != null ? String(weight) : \"400\";\n const letterSpacingPx = letterSpacingToPx(\n letterSpacingMap && typeof letterSpacingMap === \"object\" ? letterSpacingMap[key] : undefined,\n fontSize\n );\n const textTransform = textTransformMap && typeof textTransformMap === \"object\" ? textTransformMap[key] : undefined;\n const textDecoration = textDecorationMap && typeof textDecorationMap === \"object\" ? textDecorationMap[key] : undefined;\n const namePart = key.replace(/-/g, \" / \");\n const style: FigmaTextStylePayload = {\n name: namePart.startsWith(\"Typography\") ? namePart : `Typography / ${namePart}`,\n fontFamily,\n fontWeight,\n fontSize,\n lineHeightUnit: \"PERCENT\",\n letterSpacingUnit: \"PIXELS\",\n ...(letterSpacingPx !== undefined && letterSpacingPx !== 0 ? { letterSpacingValue: letterSpacingPx } : {}),\n };\n if (lh != null && typeof lh === \"number\" && lh > 0) {\n style.lineHeightValue = lh >= 10 ? Math.round((lh / fontSize) * 100) : Math.round(lh * 100);\n } else {\n style.lineHeightValue = 150;\n }\n if (textTransform === \"uppercase\") style.textCase = \"UPPER\";\n else if (textTransform === \"lowercase\") style.textCase = \"LOWER\";\n else if (textTransform === \"capitalize\") style.textCase = \"TITLE\";\n else style.textCase = \"ORIGINAL\";\n if (textDecoration === \"underline\") style.textDecoration = \"UNDERLINE\";\n else style.textDecoration = \"NONE\";\n textStyles.push(style);\n }\n }\n const textStylesMap = typography?.textStyles as Record<\n string,\n { fontSize?: string; lineHeight?: string; fontWeight?: string }\n > | undefined;\n if (textStyles.length === 0 && textStylesMap && typeof textStylesMap === \"object\") {\n for (const [styleName, style] of Object.entries(textStylesMap)) {\n if (!style || typeof style !== \"object\") continue;\n const fontSize = sizeToPx(style.fontSize ?? \"1rem\");\n const lhStr = style.lineHeight;\n const lineHeightUnitless =\n lhStr != null ? (lhStr.endsWith(\"%\") ? parseFloat(lhStr) / 100 : sizeToPx(lhStr) / fontSize) : 1.5;\n const payload: FigmaTextStylePayload = {\n name: styleName.startsWith(\"Typography\") ? styleName : `Typography / ${styleName.replace(/\\//g, \" / \")}`,\n fontFamily: defaultFontFamily,\n fontWeight: String(style.fontWeight ?? \"400\"),\n fontSize,\n lineHeightUnit: \"PERCENT\",\n lineHeightValue: Math.round((Number.isFinite(lineHeightUnitless) ? lineHeightUnitless : 1.5) * 100),\n letterSpacingUnit: \"PIXELS\",\n textCase: \"ORIGINAL\",\n textDecoration: \"NONE\",\n };\n textStyles.push(payload);\n }\n }\n textStyles.sort((a, b) => {\n if (a.fontSize !== b.fontSize) return a.fontSize - b.fontSize;\n return (a.name || \"\").localeCompare(b.name || \"\");\n });\n\n const numberVariableCollections: Array<{\n collectionName: string;\n categoryKey: string;\n variables: Array<{ name: string; value: number }>;\n scopes: string[];\n }> = [];\n\n const spacing = tokens?.spacing as { scale?: Record<string, string> } | undefined;\n if (spacing?.scale && typeof spacing.scale === \"object\") {\n const vars: Array<{ name: string; value: number }> = [];\n for (const [key, val] of Object.entries(spacing.scale)) {\n const n = tokenValueToNumber(val);\n if (n >= 0) vars.push({ name: `Spacing / ${key}`, value: n });\n }\n vars.sort((a, b) => a.value - b.value);\n if (vars.length > 0)\n numberVariableCollections.push({\n collectionName: `${collectionPrefix}Spacing`,\n categoryKey: \"Spacing\",\n variables: vars,\n scopes: [\"GAP\"],\n });\n }\n const radius = tokens?.radius as { scale?: Record<string, string> } | undefined;\n if (radius?.scale && typeof radius.scale === \"object\") {\n const vars: Array<{ name: string; value: number }> = [];\n for (const [key, val] of Object.entries(radius.scale)) {\n const n = tokenValueToNumber(val);\n if (n >= 0) vars.push({ name: `Radius / ${key}`, value: n });\n }\n vars.sort((a, b) => a.value - b.value);\n if (vars.length > 0)\n numberVariableCollections.push({\n collectionName: `${collectionPrefix}Radius`,\n categoryKey: \"Radius\",\n variables: vars,\n scopes: [\"CORNER_RADIUS\"],\n });\n }\n const borders = tokens?.borders as { width?: Record<string, string> } | undefined;\n if (borders?.width && typeof borders.width === \"object\") {\n const vars: Array<{ name: string; value: number }> = [];\n for (const [key, val] of Object.entries(borders.width)) {\n const n = tokenValueToNumber(val);\n if (n >= 0) vars.push({ name: `Borders / ${key}`, value: n });\n }\n vars.sort((a, b) => a.value - b.value);\n if (vars.length > 0)\n numberVariableCollections.push({\n collectionName: `${collectionPrefix}Borders`,\n categoryKey: \"Borders\",\n variables: vars,\n scopes: [\"STROKE_FLOAT\"],\n });\n }\n const sizing = tokens?.sizing as { height?: Record<string, string>; icon?: Record<string, string> } | undefined;\n const sizingVariables: Array<{ name: string; value: number }> = [];\n if (sizing?.height && typeof sizing.height === \"object\") {\n for (const [key, val] of Object.entries(sizing.height)) {\n const n = tokenValueToNumber(val);\n if (n >= 0) sizingVariables.push({ name: `Height / ${key}`, value: n });\n }\n }\n if (sizing?.icon && typeof sizing.icon === \"object\") {\n for (const [key, val] of Object.entries(sizing.icon)) {\n const n = tokenValueToNumber(val);\n if (n >= 0) sizingVariables.push({ name: `Icon / ${key}`, value: n });\n }\n }\n sizingVariables.sort((a, b) => a.value - b.value);\n if (sizingVariables.length > 0) {\n numberVariableCollections.push({\n collectionName: `${collectionPrefix}Sizing`,\n categoryKey: \"Sizing\",\n variables: sizingVariables,\n scopes: [\"WIDTH_HEIGHT\"],\n });\n }\n const layout = tokens?.layout as { breakpoint?: Record<string, string> } | undefined;\n if (layout?.breakpoint && typeof layout.breakpoint === \"object\") {\n const vars: Array<{ name: string; value: number }> = [];\n for (const [key, val] of Object.entries(layout.breakpoint)) {\n const n = tokenValueToNumber(val);\n if (n >= 0) vars.push({ name: `Breakpoint / ${key}`, value: n });\n }\n vars.sort((a, b) => a.value - b.value);\n if (vars.length > 0)\n numberVariableCollections.push({\n collectionName: `${collectionPrefix}Layout`,\n categoryKey: \"Layout\",\n variables: vars,\n scopes: [\"WIDTH_HEIGHT\"],\n });\n }\n\n const effectStyles: Array<{ name: string; effects: FigmaDropShadow[] }> = [];\n const shadows = tokens?.shadows as { elevation?: Record<string, string>; focus?: string } | undefined;\n if (shadows?.elevation && typeof shadows.elevation === \"object\") {\n for (const [key, val] of Object.entries(shadows.elevation)) {\n if (typeof val !== \"string\") continue;\n const effects = parseBoxShadowToFigmaEffects(val);\n if (effects.length > 0) effectStyles.push({ name: `Shadow / ${key}`, effects });\n }\n }\n if (shadows?.focus && typeof shadows.focus === \"string\") {\n const effects = parseBoxShadowToFigmaEffects(shadows.focus);\n if (effects.length > 0) effectStyles.push({ name: \"Shadow / focus\", effects });\n }\n effectStyles.sort((a, b) => {\n const nameA = a.name.startsWith(\"Shadow / \") ? a.name.slice(9) : a.name;\n const nameB = b.name.startsWith(\"Shadow / \") ? b.name.slice(9) : b.name;\n const orderA = FIGMA_SHADOW_ORDER[nameA] ?? 100;\n const orderB = FIGMA_SHADOW_ORDER[nameB] ?? 100;\n if (orderA !== orderB) return orderA - orderB;\n return nameA.localeCompare(nameB);\n });\n\n return {\n colorVariableCollections,\n paintStyles,\n textStyles,\n numberVariableCollections,\n effectStyles,\n };\n}\n\n/**\n * Expected Figma variable/style names from DS (same naming as sync).\n * Used for readiness checks and resolveFigmaIdsForTokens.\n */\nexport function getExpectedFigmaNamesFromDS(data: FigmaSyncDSInput): {\n colorVariableNames: string[];\n paintStyleNames: string[];\n textStyleNames: string[];\n effectStyleNames: string[];\n numberVariableNames: string[];\n} {\n const payloads = buildFigmaPayloadsFromDS(data);\n const numberVariableNames = payloads.numberVariableCollections.flatMap((c) =>\n c.variables.map((v) => v.name)\n );\n const colorVariableNames = payloads.colorVariableCollections.flatMap((c) =>\n c.variables.map((v) => v.name)\n );\n return {\n colorVariableNames,\n paintStyleNames: payloads.paintStyles.map((s) => s.name),\n textStyleNames: payloads.textStyles.map((s) => s.name),\n effectStyleNames: payloads.effectStyles.map((s) => s.name),\n numberVariableNames,\n };\n}\n\n/**\n * Convert payloads to a flat list of bridge steps for the plugin.\n * Order: create_color_variables (primitives then semantics), create_paint_styles (if any), create_number_variables (per collection), create_text_styles, create_effect_styles.\n */\nexport function buildSyncSteps(payloads: FigmaSyncPayloads): FigmaSyncStep[] {\n const steps: FigmaSyncStep[] = [];\n for (const coll of payloads.colorVariableCollections) {\n if (coll.variables.length > 0) {\n steps.push({\n method: \"create_color_variables\",\n params: {\n collectionName: coll.collectionName,\n modes: coll.modes,\n variables: coll.variables,\n removeVariablesNotInPayload: true,\n applyScopes: coll.applyScopes,\n ...(coll.primitiveCollectionNames?.length\n ? { primitiveCollectionNames: coll.primitiveCollectionNames }\n : coll.primitiveCollectionName\n ? { primitiveCollectionName: coll.primitiveCollectionName }\n : {}),\n },\n });\n }\n }\n if (payloads.paintStyles.length > 0) {\n steps.push({\n method: \"create_paint_styles\",\n params: {\n styles: payloads.paintStyles,\n removePaintStylesNotInPayload: true,\n },\n });\n }\n for (const coll of payloads.numberVariableCollections) {\n steps.push({\n method: \"create_number_variables\",\n params: {\n collectionName: coll.collectionName,\n variables: coll.variables.map((v) => ({ name: v.name, value: v.value })),\n scopes: coll.scopes,\n removeVariablesNotInPayload: true,\n },\n });\n }\n if (payloads.textStyles.length > 0) {\n steps.push({\n method: \"create_text_styles\",\n params: {\n styles: payloads.textStyles,\n removeTextStylesNotInPayload: true,\n },\n });\n }\n if (payloads.effectStyles.length > 0) {\n steps.push({\n method: \"create_effect_styles\",\n params: {\n styles: payloads.effectStyles,\n removeShadowStylesNotInPayload: true,\n },\n });\n }\n return steps;\n}\n"],"mappings":"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","names":["path","cachedRulesStr","freshRulesStr","dsId","apiKey","accessToken","apiBase","toSwiftName","isColorValue","path","group","name","groupDisplay","n","path","fs","resolve","dsId","apiKey","accessToken","apiBase","typesetKeyToFontFamilyRole","path","platform"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../atomix-sync-core/src/types.ts","../../atomix-sync-core/src/fetch.ts","../../atomix-sync-core/src/sync.ts","../../atomix-sync-core/src/diff.ts","../../atomix-sync-core/src/rules.ts","../../atomix-sync-core/src/formats/css.ts","../../atomix-sync-core/src/formats/scss.ts","../../atomix-sync-core/src/formats/less.ts","../../atomix-sync-core/src/formats/json.ts","../../atomix-sync-core/src/formats/ts.ts","../../atomix-sync-core/src/formats/js.ts","../../atomix-sync-core/src/formats/swift.ts","../../atomix-sync-core/src/formats/kotlin.ts","../../atomix-sync-core/src/formats/dart.ts","../../atomix-sync-core/src/response.ts","../../atomix-sync-core/src/tokens.ts","../../atomix-sync-core/src/config.ts"],"sourcesContent":["/**\n * Atomix MCP Server - User Design System Mode\n * \n * A minimal MCP server that serves design tokens from a user's\n * Atomix Design System via the public API.\n * \n * Usage:\n * npx @atomixstudio/mcp --ds-id <id> --atomix-token <token>\n * \n * Tools:\n * - getToken: Get a specific token by path\n * - listTokens: List tokens in a category\n * - searchTokens: Search for tokens by name or value\n * - validateUsage: Check if a value follows the design system\n * - getRules: Get design system governance rules (optional topic filter)\n * - exportMCPConfig: Generate MCP configuration files\n * - getSetupInstructions: Get setup guide for AI tools\n * - syncAll: Sync tokens, AI rules, skills, and dependencies manifest (icons, fonts)\n * \n * @see https://atomix.studio\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\n// Import from core library\nimport {\n fetchDesignSystem,\n getTokenByPath,\n flattenTokens,\n searchTokens,\n getTokenStats,\n compareDesignSystems,\n generateCSSOutput,\n generateSCSSOutput,\n generateLessOutput,\n generateJSONOutput,\n generateTSOutput,\n generateJSOutput,\n generateSwiftOutput,\n generateKotlinOutput,\n generateDartOutput,\n diffTokens,\n formatSyncResponse,\n detectGovernanceChangesByFoundation,\n type DesignSystemData,\n type OutputFormat,\n type RulesFileResult,\n type DiffResult,\n} from \"@atomixstudio/sync-core\";\nimport {\n buildFigmaPayloadsFromDS,\n type FigmaTextStylePayload,\n type FigmaDropShadow,\n FIGMA_DESIGN_CATALOG,\n FIGMA_DESIGN_SKILL_MD,\n formatCatalogForMCP,\n getDesignMethodNames,\n getQueryMethodNames,\n buildResolvers,\n resolveStepParams,\n type FileContextPayload,\n} from \"@atomix/figma-tools\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { execSync } from \"child_process\";\nimport { platform } from \"os\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport { normalizeBridgeMethod, isAllowedMethod } from \"./figma-bridge-protocol.js\";\n\n// ============================================\n// FIGMA BRIDGE (in-process; plugin connects to this MCP server)\n// ============================================\n\nconst FIGMA_BRIDGE_PORT = Number(process.env.FIGMA_BRIDGE_PORT) || 8765;\nconst FIGMA_BRIDGE_HOST = process.env.FIGMA_BRIDGE_HOST || \"127.0.0.1\";\nconst FIGMA_BRIDGE_TIMEOUT_MS = 15_000;\nconst FIGMA_BRIDGE_TOKEN = process.env.FIGMA_BRIDGE_TOKEN || null;\n\n/** Single source of truth for Figma connection steps. Bridge runs inside this MCP server. */\nconst FIGMA_CONNECTION_INSTRUCTIONS = {\n installAndRun: \"In Figma: Open Plugins and run the Atomix plugin (Atomix Token Extractor). If it's not installed yet, install it from the Figma Community or your team's plugin library, then run it.\",\n connect: \"In the plugin UI, tap **Connect** and wait until the status shows \\\"Connected\\\".\",\n startBridge: \"The Figma bridge runs with this MCP server. Ensure your AI environment has this MCP server running (e.g. in MCP settings), then in Figma run the Atomix plugin and tap Connect.\",\n};\n\nlet bridgeWss: WebSocketServer | null = null;\nlet pluginWs: WebSocket | null = null;\nconst pendingBridgeRequests = new Map<\n string,\n { resolve: (v: unknown) => void; reject: (e: Error) => void; timeout: ReturnType<typeof setTimeout> }\n>();\n\n/** Release port so this MCP can bind; ensures the plugin connects to this process, not a stale one. */\nfunction ensureFigmaBridgePortFree(port: number): void {\n const portStr = String(port);\n const ourPid = String(process.pid);\n try {\n if (platform() === \"win32\") {\n const out = execSync(`netstat -ano`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const pids = new Set<string>();\n for (const line of out.split(/\\r?\\n/)) {\n if (line.includes(`:${portStr}`) && line.includes(\"LISTENING\")) {\n const parts = line.trim().split(/\\s+/);\n const pid = parts[parts.length - 1];\n if (/^\\d+$/.test(pid) && pid !== ourPid) pids.add(pid);\n }\n }\n for (const pid of pids) {\n try {\n execSync(`taskkill /PID ${pid} /F`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n console.error(`[atomix-mcp] Freed Figma bridge port ${port} (killed PID ${pid})`);\n } catch (_) {\n // Process may already be gone\n }\n }\n } else {\n const out = execSync(`lsof -ti :${portStr}`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n if (!out) return;\n const pids = out.split(/\\s+/).filter((p) => p && p !== ourPid);\n for (const pid of pids) {\n try {\n execSync(`kill -9 ${pid}`, { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n console.error(`[atomix-mcp] Freed Figma bridge port ${port} (killed PID ${pid})`);\n } catch (_) {\n // Process may already be gone\n }\n }\n }\n } catch {\n // lsof exits non-zero when nothing uses the port; netstat can fail in edge cases — ignore\n }\n}\n\nfunction startFigmaBridge(): void {\n if (bridgeWss) return;\n try {\n ensureFigmaBridgePortFree(FIGMA_BRIDGE_PORT);\n bridgeWss = new WebSocketServer({\n host: FIGMA_BRIDGE_HOST,\n port: FIGMA_BRIDGE_PORT,\n clientTracking: true,\n });\n bridgeWss.on(\"connection\", (ws: WebSocket, req) => {\n const url = req.url || \"\";\n const params = new URLSearchParams(url.startsWith(\"/\") ? url.slice(1) : url);\n const token = params.get(\"token\");\n const role = params.get(\"role\");\n\n if (FIGMA_BRIDGE_TOKEN && token !== FIGMA_BRIDGE_TOKEN) {\n ws.close(4003 as number, \"Invalid or missing bridge token\");\n return;\n }\n if (role !== \"plugin\") {\n ws.close(4002 as number, \"Only role=plugin is accepted (bridge runs in MCP server)\");\n return;\n }\n if (pluginWs) {\n try { pluginWs.close(); } catch (_) { /* ignore */ }\n pluginWs = null;\n }\n pluginWs = ws;\n\n ws.on(\"message\", (raw: Buffer | string) => {\n const text = typeof raw === \"string\" ? raw : raw.toString(\"utf8\");\n let msg: unknown;\n try {\n msg = JSON.parse(text);\n } catch {\n return;\n }\n const parsed = msg as { type?: string; id?: string; result?: unknown; error?: string };\n if (parsed?.type === \"ping\" && typeof parsed.id === \"string\") {\n try {\n ws.send(JSON.stringify({ type: \"pong\", id: parsed.id }));\n } catch (_) { /* ignore */ }\n return;\n }\n if (typeof parsed.id === \"string\" && (\"result\" in parsed || \"error\" in parsed)) {\n const pending = pendingBridgeRequests.get(parsed.id);\n if (pending) {\n clearTimeout(pending.timeout);\n pendingBridgeRequests.delete(parsed.id);\n if (parsed.error) pending.reject(new Error(parsed.error));\n else pending.resolve(parsed.result);\n }\n }\n });\n\n ws.on(\"close\", () => {\n if (pluginWs === ws) pluginWs = null;\n });\n ws.on(\"error\", () => {\n if (pluginWs === ws) pluginWs = null;\n });\n });\n bridgeWss.on(\"listening\", () => {\n console.error(`[atomix-mcp] Figma bridge listening on ws://${FIGMA_BRIDGE_HOST}:${FIGMA_BRIDGE_PORT} (local only)`);\n if (FIGMA_BRIDGE_TOKEN) {\n console.error(\"[atomix-mcp] Figma bridge token required (FIGMA_BRIDGE_TOKEN)\");\n }\n });\n bridgeWss.on(\"error\", (err) => {\n console.error(\"[atomix-mcp] Figma bridge server error:\", err);\n });\n } catch (err) {\n console.error(\"[atomix-mcp] Failed to start Figma bridge:\", err);\n }\n}\n\nfunction closeFigmaBridge(): void {\n if (pluginWs) {\n try {\n pluginWs.close();\n } catch (_) {\n /* ignore */\n }\n pluginWs = null;\n }\n if (bridgeWss) {\n try {\n bridgeWss.close();\n } catch (_) {\n /* ignore */\n }\n bridgeWss = null;\n }\n}\n\n/** True if the plugin is connected to the in-process bridge. */\nfunction isBridgeReachable(): Promise<boolean> {\n return Promise.resolve(!!(pluginWs && pluginWs.readyState === WebSocket.OPEN));\n}\n\nfunction sendBridgeRequest(\n method: string,\n params?: Record<string, unknown>,\n timeoutMs: number = FIGMA_BRIDGE_TIMEOUT_MS\n): Promise<unknown> {\n const normalized = normalizeBridgeMethod(method);\n if (!isAllowedMethod(normalized)) {\n return Promise.reject(new Error(`Bridge method not allowed: ${method}`));\n }\n const ws = pluginWs;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(\n new Error(\"Figma plugin not connected. Open Figma, run Atomix plugin, and tap Connect.\")\n );\n }\n const id = `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (pendingBridgeRequests.delete(id)) {\n reject(new Error(\"Figma bridge timeout. \" + FIGMA_CONNECTION_INSTRUCTIONS.startBridge + \" Then \" + FIGMA_CONNECTION_INSTRUCTIONS.connect));\n }\n }, timeoutMs);\n pendingBridgeRequests.set(id, { resolve, reject, timeout });\n try {\n ws.send(JSON.stringify({ id, method: normalized, params }));\n } catch (e) {\n pendingBridgeRequests.delete(id);\n clearTimeout(timeout);\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n });\n}\n\n// ============================================\n// CLI ARGUMENTS (for MCP server configuration)\n// ============================================\n\nfunction parseArgs(): { dsId: string | null; apiKey: string | null; accessToken: string | null; apiBase: string | null } {\n const args = process.argv.slice(2);\n let dsId: string | null = null;\n let apiKey: string | null = null;\n let accessToken: string | null = null;\n let apiBase: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ds-id\" && args[i + 1]) {\n dsId = args[i + 1];\n i++;\n } else if (args[i] === \"--api-key\" && args[i + 1]) {\n apiKey = args[i + 1];\n i++;\n } else if (args[i] === \"--atomix-token\" && args[i + 1]) {\n accessToken = args[i + 1];\n i++;\n } else if (args[i] === \"--api-base\" && args[i + 1]) {\n apiBase = args[i + 1];\n i++;\n }\n }\n\n return { dsId, apiKey, accessToken, apiBase };\n}\n\nconst cliArgs = parseArgs();\nconst { dsId, apiKey, accessToken } = cliArgs;\nconst apiBase = cliArgs.apiBase || \"https://atomix.studio\";\n\n/** MCP server version; keep in sync with package.json and /npm command. */\nconst MCP_VERSION = \"1.0.34\";\n\n// ============================================\n// CACHED DATA (for MCP server)\n// ============================================\n\nlet cachedData: DesignSystemData | null = null;\nlet cachedETag: string | null = null;\n/** Pro Figma for this DS = owner's tier; set after first successful fetch from meta.mcpTier. */\nlet cachedMcpTier: \"free\" | \"pro\" | null = null;\n/** When true, args missing or token/ds-id did not match API; we return no tools/prompts/resources. */\nlet authFailedNoTools = false;\n\n/** Set after fetch when API reports a newer MCP version; shown in hello and get-started so user can refresh Cursor / clear npx cache. */\nlet mcpUpdateNotice: string | null = null;\n/** When API reports a newer MCP version, stored here so getMcpVersion can return it. */\nlet mcpLatestVersion: string | null = null;\n\n/** Simple semver compare: true if latest > current (each part parsed as number). */\nfunction isVersionNewer(latest: string, current: string): boolean {\n const toParts = (v: string) => v.split(\".\").map((n) => parseInt(n, 10) || 0);\n const a = toParts(latest);\n const b = toParts(current);\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n if (x > y) return true;\n if (x < y) return false;\n }\n return false;\n}\n\n/** True only when both --ds-id and --atomix-token are present. Required for ANY tools/prompts/resources. */\nfunction hasValidAuthConfig(): boolean {\n return !!(dsId && accessToken);\n}\n\n/** Message thrown so the AI tool shows \"requires authentication\" / error state instead of \"No tools, prompts, or resources\". */\nconst AUTH_REQUIRED_MESSAGE =\n \"Atomix MCP requires authentication. Add both --ds-id and --atomix-token to your MCP config (Settings → MCP), then restart your AI tool. Get your token from Atomix Studio: Export modal or Settings → Regenerate Atomix access token.\";\nlet lastChangeSummary: string | null = null;\n\n/** Figma sync tool: free tier. Design-in-Figma tools are plugin-only (run-sync-steps / run-design-steps). */\nconst FIGMA_SYNC_TOOL_NAME = \"syncToFigma\";\n\n// Store affected tokens from last sync for /refactor command\ninterface LastSyncAffectedTokens {\n modified: Array<{ token: string; oldValue: string; newValue: string }>;\n removed: Array<{ token: string; lastValue: string }>;\n added: string[];\n format: string; // \"css\" | \"scss\" | \"swift\" | \"kotlin\" | \"dart\" etc.\n timestamp: string;\n}\nlet lastSyncAffectedTokens: LastSyncAffectedTokens | null = null;\n\n// Helper to get last change summary (MCP-specific, tracks changes for prompts)\nfunction getLastChangeSummary(): string | null {\n return lastChangeSummary;\n}\n\n// Update change summary when fetching (for MCP prompts)\nasync function updateChangeSummary(freshData: DesignSystemData) {\n if (cachedData) {\n const changes = compareDesignSystems(cachedData, freshData);\n lastChangeSummary = changes.summary;\n if (changes.hasChanges) {\n console.error(`[mcp-user] Design system changes detected:\\n${changes.summary}`);\n }\n }\n}\n\n/** Validation result for one file after sync write. */\ninterface SyncValidationEntry {\n path: string;\n status: \"OK\" | \"FAIL\";\n detail: string;\n}\n\n/** Validate token file after write: file exists and contains at least expectedMinVariables (for css/scss/less). */\nfunction validateTokenFileAfterWrite(\n outputPath: string,\n format: string,\n expectedMinVariables: number\n): SyncValidationEntry {\n if (!fs.existsSync(outputPath)) {\n return { path: outputPath, status: \"FAIL\", detail: \"File not found after write.\" };\n }\n const content = fs.readFileSync(outputPath, \"utf-8\");\n if (!content || content.trim().length === 0) {\n return { path: outputPath, status: \"FAIL\", detail: \"File is empty after write.\" };\n }\n if ([\"css\", \"scss\", \"less\"].includes(format)) {\n const varPattern = /(--[a-zA-Z0-9-]+):\\s*[^;]+;/g;\n let count = 0;\n let m: RegExpExecArray | null;\n while ((m = varPattern.exec(content)) !== null) count++;\n if (count < expectedMinVariables) {\n return {\n path: outputPath,\n status: \"FAIL\",\n detail: `Expected at least ${expectedMinVariables} variables; found ${count}.`,\n };\n }\n return { path: outputPath, status: \"OK\", detail: `${count} variables written.` };\n }\n return { path: outputPath, status: \"OK\", detail: \"File written (non-CSS format).\" };\n}\n\n/** Format validation entries into a single block for the sync response. */\nfunction formatValidationBlock(entries: SyncValidationEntry[]): string {\n if (entries.length === 0) return \"\";\n const displayPath = (p: string) => (p.startsWith(\"(\") ? p : path.relative(process.cwd(), p));\n const lines = [\n \"\",\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\n \"VALIDATION (confirm sync succeeded)\",\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\n ...entries.map((e) => ` ${displayPath(e.path)}: ${e.status} — ${e.detail}`),\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\n/** Fetch design system for MCP; uses cache and updates cachedData/cachedETag/cachedMcpTier. Access token is mandatory. */\nasync function fetchDesignSystemForMCP(forceRefresh = false): Promise<DesignSystemData> {\n if (!dsId) throw new Error(\"Missing --ds-id. Usage: npx @atomixstudio/mcp --ds-id <id> --atomix-token <token>\");\n if (!accessToken) throw new Error(\"Missing --atomix-token. Get your token from the Export modal or Settings.\");\n if (forceRefresh) {\n cachedData = null;\n cachedETag = null;\n }\n const result = await fetchDesignSystem({\n dsId,\n accessToken: accessToken,\n apiBase: apiBase ?? undefined,\n etag: forceRefresh ? undefined : cachedETag ?? undefined,\n forceRefresh,\n });\n if (result.status === 304 && cachedData) return cachedData;\n if (result.status === 304 || !result.data) throw new Error(\"No design system data (304 or null)\");\n cachedData = result.data;\n cachedETag = result.etag;\n cachedMcpTier = result.data.meta.mcpTier ?? null;\n const latest = (result.data.meta as { mcpLatestVersion?: string }).mcpLatestVersion;\n if (latest && isVersionNewer(latest, MCP_VERSION)) {\n mcpLatestVersion = latest;\n mcpUpdateNotice = `**MCP update available:** A new Atomix MCP server (v${latest}) is available. You're on v${MCP_VERSION}. To use the new version in Cursor: 1) Quit Cursor completely and reopen, 2) Clear npx cache: \\`rm -rf ~/.npm/_npx\\` (macOS/Linux), 3) Ensure your MCP config uses \\`@atomixstudio/mcp@latest\\` or \\`@atomixstudio/mcp@${latest}\\`. To test a local build before publishing: point MCP to \\`node /path/to/Atom/packages/mcp-user/dist/index.js\\` with \\`--ds-id\\` and \\`--atomix-token\\`.`;\n } else {\n mcpUpdateNotice = null;\n mcpLatestVersion = null;\n }\n await updateChangeSummary(result.data);\n return result.data;\n}\n\n// ============================================\n// TOKEN UTILITIES\n// ============================================\n\nconst TOKEN_CATEGORIES = [\"colors\", \"typography\", \"spacing\", \"sizing\", \"shadows\", \"radius\", \"borders\", \"motion\", \"zIndex\"] as const;\ntype TokenCategory = typeof TOKEN_CATEGORIES[number];\n\n/** Infer font-family role from typeset key (e.g. \"display-2xl\" -> \"display\", \"body-md\" -> \"body\", \"displayXl\" -> \"display\"). */\nfunction typesetKeyToFontFamilyRole(key: string): \"display\" | \"heading\" | \"body\" | \"mono\" {\n const prefix = (key.split(\"-\")[0] ?? key).toLowerCase();\n if (prefix === \"display\" || prefix.startsWith(\"display\")) return \"display\";\n if (prefix === \"heading\" || prefix.startsWith(\"heading\")) return \"heading\";\n if (prefix === \"mono\" || prefix.startsWith(\"mono\")) return \"mono\";\n if (prefix.startsWith(\"body\")) return \"body\";\n return \"body\";\n}\n\n/** Build full list of typesets from exported typography with CSS var names for 1:1 typeset.css generation. */\nfunction buildTypesetsList(typography: Record<string, unknown>, cssPrefix = \"atmx\"): Array<{\n key: string;\n cssClass: string;\n fontFamilyVar: string;\n fontFamilyVarName?: string;\n fontFamilyValue?: string;\n fontSizeVar: string;\n fontWeightVar: string;\n lineHeightVar: string;\n letterSpacingVar?: string;\n textTransformVar?: string;\n textDecorationVar?: string;\n hasTextTransform: boolean;\n hasTextDecoration: boolean;\n}> {\n const fontSize = typography.fontSize as Record<string, string> | undefined;\n if (!fontSize || typeof fontSize !== \"object\") return [];\n\n const fontFamily = (typography.fontFamily as Record<string, string>) ?? {};\n const fontWeight = (typography.fontWeight as Record<string, number | string>) ?? {};\n const lineHeight = (typography.lineHeight as Record<string, number>) ?? {};\n const letterSpacing = (typography.letterSpacing as Record<string, string>) ?? {};\n const textTransform = (typography.textTransform as Record<string, string>) ?? {};\n const textDecoration = (typography.textDecoration as Record<string, string>) ?? {};\n const p = cssPrefix ? `${cssPrefix}-` : \"\";\n\n const typesets: Array<{\n key: string;\n cssClass: string;\n fontFamilyVar: string;\n fontFamilyVarName?: string;\n fontFamilyValue?: string;\n fontSizeVar: string;\n fontWeightVar: string;\n lineHeightVar: string;\n letterSpacingVar?: string;\n textTransformVar?: string;\n textDecorationVar?: string;\n hasTextTransform: boolean;\n hasTextDecoration: boolean;\n }> = [];\n\n for (const key of Object.keys(fontSize)) {\n const role = typesetKeyToFontFamilyRole(key);\n const familyName = fontFamily[role] ?? fontFamily.body;\n const fontFamilyVarName = familyName ? `--${p}typography-font-family-${role}` : undefined;\n const fontFamilyVar = familyName ? `var(${fontFamilyVarName})` : \"\";\n\n const keyKebab = key.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n typesets.push({\n key,\n cssClass: `.typeset-${keyKebab}`,\n fontFamilyVar: fontFamilyVar || \"inherit\",\n fontFamilyVarName,\n fontFamilyValue: familyName,\n fontSizeVar: `var(--${p}typography-${key}-size)`,\n fontWeightVar: `var(--${p}typography-${key}-weight)`,\n lineHeightVar: `var(--${p}typography-${key}-line-height)`,\n letterSpacingVar: letterSpacing[key] != null ? `var(--${p}typography-${key}-letter-spacing)` : undefined,\n textTransformVar: textTransform[key] != null ? `var(--${p}typography-${key}-text-transform)` : undefined,\n textDecorationVar: textDecoration[key] != null ? `var(--${p}typography-${key}-text-decoration)` : undefined,\n hasTextTransform: key in textTransform,\n hasTextDecoration: key in textDecoration,\n });\n }\n\n return typesets;\n}\n\n// Token utilities are imported from core library - no local implementations needed\n\n// ============================================\n// MCP SERVER SETUP\n// ============================================\n\nconst server = new Server(\n {\n name: \"atomix-mcp-user\",\n version: MCP_VERSION,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n }\n);\n\n// ============================================\n// TOOL DEFINITIONS\n// ============================================\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n // Strict: --ds-id and --atomix-token MUST both be present for ANY tools\n if (!hasValidAuthConfig()) {\n authFailedNoTools = true;\n console.error(\"[Atomix MCP] Missing --ds-id or --atomix-token. Add both to your MCP config.\");\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n // Resolve tier once so free users don't see Pro Figma tools (null = not yet fetched → treat as free for gating)\n if (cachedMcpTier === null) {\n try {\n // Force full fetch (no 304) on first resolution so we always get meta.mcpTier from the API\n await fetchDesignSystemForMCP(true);\n if (cachedMcpTier === \"pro\") {\n console.error(\"[Atomix MCP] Resolved tier = pro.\");\n } else if (cachedMcpTier === \"free\") {\n console.error(\"[Atomix MCP] Resolved tier = free. syncToFigma and /--sync-to-figma are available.\");\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n authFailedNoTools = true;\n console.error(\n \"[Atomix MCP] Design system not loaded: ds-id or token invalid or API error. No tools will be shown.\",\n msg.includes(\"401\")\n ? \" Token invalid or expired. Regenerate in Atomix Studio (Settings → Regenerate Atomix access token), update your MCP config, then restart your AI tool.\"\n : msg.includes(\"403\")\n ? \" You do not have access to this design system (owner or invited guest).\"\n : msg.includes(\"404\")\n ? \" Design system not found (invalid ds-id).\"\n : msg\n );\n }\n }\n if (authFailedNoTools) {\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n const toolsList: Array<{ name: string; description: string; inputSchema: Record<string, unknown> }> = [\n {\n name: \"getToken\",\n description: \"Get a specific design token by its path. Returns the value and CSS variable name.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Token path in dot notation (e.g., 'colors.brand.primary', 'spacing.scale.md')\",\n },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"listTokens\",\n description: \"List all tokens in a category (colors, typography, spacing, sizing, shadows, radius, borders, motion, zIndex).\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n enum: TOKEN_CATEGORIES,\n description: \"Token category to list\",\n },\n subcategory: {\n type: \"string\",\n description: \"Optional subcategory (e.g., 'brand' for colors, 'scale' for spacing)\",\n },\n },\n required: [\"category\"],\n },\n },\n {\n name: \"searchTokens\",\n description: \"Search for tokens by name or value.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (matches token paths or values)\",\n },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"listTypesets\",\n description: \"List every typography typeset in the design system with full CSS variable names. Use this when building typeset.css so you emit one class per typeset and include all properties (font-family, font-size, font-weight, line-height, letter-spacing, text-transform, text-decoration) for 1:1 match. Do not skip any typesets.\",\n inputSchema: {\n type: \"object\",\n properties: {\n cssPrefix: {\n type: \"string\",\n description: \"CSS variable prefix (default: atmx). Use the same prefix as the synced tokens file.\",\n },\n },\n required: [],\n },\n },\n {\n name: \"validateUsage\",\n description: \"Check if a CSS value follows the design system. Detects hardcoded values that should use tokens.\",\n inputSchema: {\n type: \"object\",\n properties: {\n value: {\n type: \"string\",\n description: \"CSS value to validate (e.g., '#ff0000', '16px', 'rgb(0,112,97)')\",\n },\n context: {\n type: \"string\",\n enum: [\"color\", \"spacing\", \"radius\", \"shadow\", \"typography\", \"any\"],\n description: \"Context of the value to help find the right token\",\n },\n },\n required: [\"value\"],\n },\n },\n {\n name: \"getRules\",\n description: \"Get design system governance rules. Optionally filter by topic (colors, typo, motion, icons, layout, visual). Call at session start or before writing visual code.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n enum: [\"colors\", \"typo\", \"typography\", \"motion\", \"icons\", \"layout\", \"visual\", \"style\"],\n description: \"Optional. Filter rules by topic: colors, typo/typography, motion, icons, layout, or visual/style (color, border, radius, shadows, icons). Omit for all rules.\",\n },\n },\n },\n },\n {\n name: \"exportMCPConfig\",\n description: \"Generate MCP configuration file for AI tools.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\", \"all\"],\n description: \"AI tool to generate MCP config for.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"getSetupInstructions\",\n description: \"Get detailed setup instructions for a specific AI tool.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"claude-desktop\", \"generic\"],\n description: \"AI tool to get setup instructions for.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"syncAll\",\n description: \"Sync tokens, AI rules, skills (.cursor/skills/atomix-ds/SKILL.md and figma-design-SKILL.md), and atomix-dependencies.json. All paths are resolved under workspaceRoot so files are written inside the project repo (committable). Use dryRun: true first to report what would change without writing; then dryRun: false to apply. Optional: workspaceRoot (project root; default: ATOMIX_PROJECT_ROOT env or process.cwd()), output (default ./tokens.css), format (default css), skipTokens, dryRun.\",\n inputSchema: {\n type: \"object\",\n properties: {\n workspaceRoot: {\n type: \"string\",\n description: \"Absolute path to the project/repo root. Skills and manifest are written under this path so they can be committed. If omitted, uses ATOMIX_PROJECT_ROOT env var, then process.cwd().\",\n },\n output: {\n type: \"string\",\n description: \"Token file path (e.g. ./tokens.css). Default: ./tokens.css. Ignored if skipTokens is true.\",\n },\n format: {\n type: \"string\",\n enum: [\"css\", \"scss\", \"less\", \"json\", \"ts\", \"js\", \"swift\", \"kotlin\", \"dart\"],\n description: \"Token output format. Default: css. Ignored if skipTokens is true.\",\n },\n skipTokens: {\n type: \"boolean\",\n description: \"If true, skip token file and rules sync; only write skills and dependencies manifest. Default: false.\",\n },\n dryRun: {\n type: \"boolean\",\n description: \"If true, compute and return what would be written (paths, token counts, diff summary) but do NOT write any files. Call with dryRun: false to apply. Default: false.\",\n },\n },\n required: [],\n },\n },\n {\n name: \"getDependencies\",\n description: \"Get suggested dependencies for this design system (icon package, fonts, SKILL.md, token files). Use with /--get-started prompt. Optional platform and stack for tailored suggestions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n platform: {\n type: \"string\",\n enum: [\"web\", \"ios\", \"android\"],\n description: \"Target platform (web, ios, android). Optional.\",\n },\n stack: {\n type: \"string\",\n description: \"Stack or framework (e.g. react, vue, next, swift, kotlin). Optional.\",\n },\n },\n required: [],\n },\n },\n {\n name: \"getMcpVersion\",\n description: \"Return the current Atomix MCP server version (e.g. 1.0.33) and, if known, the latest available from the API. Call this whenever the user asks about MCP version, Atomix MCP version, what version of the MCP server they are using, or whether an update is available. Prefer this over explaining the MCP protocol spec version.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n },\n {\n name: \"syncToFigma\",\n description: \"Push the owner's design system to Figma: creates color variable collection (Light/Dark), color and paint styles, number variables (spacing, radius, borders, sizing, breakpoints), text styles, and shadow effect styles. Uses local WebSocket bridge and Atomix Figma plugin (no Figma REST API). No arguments. If the bridge is not running, the response includes agentInstruction to start it; only if that fails should the user start the bridge and connect the plugin. Call this when the user asks to 'sync to Figma' or 'push DS to Figma'.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n },\n ];\n\n if (cachedMcpTier === \"pro\") {\n toolsList.push({\n name: \"designInFigma\",\n description:\n \"Design UI in the connected Figma file using the design system tokens. \" +\n \"Call with action:'catalog' to discover available bridge methods, their parameters, and the file's variables/styles. \" +\n \"Call with action:'query' to read from Figma: get_selection (current selection), get_node_info (nodeId), get_design_screenshot (frameId; returns PNG image for review). \" +\n \"Call with action:'execute' and an array of steps to create the design on canvas. \" +\n \"Requires the Atomix Figma plugin to be connected.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n action: {\n type: \"string\",\n enum: [\"catalog\", \"query\", \"execute\"],\n description: \"catalog = discover methods + file context; query = read selection/node/screenshot; execute = run design steps\",\n },\n queryMethod: {\n type: \"string\",\n description: \"Required when action is 'query'. One of: get_selection, get_node_info, get_document_info, get_design_screenshot, get_figma_variables_and_styles, list_local_components, get_component_catalog, get_variable_collection_modes, get_frame_variable_mode.\",\n },\n queryParams: {\n type: \"object\",\n description: \"Optional params for query. get_node_info needs { nodeId }. get_design_screenshot needs { frameId } and optional { scale }.\",\n },\n steps: {\n type: \"array\",\n description: \"Required when action is 'execute'. Array of { method, params } design commands.\",\n items: {\n type: \"object\",\n properties: {\n method: { type: \"string\" },\n params: { type: \"object\" },\n },\n required: [\"method\"],\n },\n },\n },\n required: [\"action\"],\n },\n });\n }\n\n return { tools: toolsList };\n});\n\n// ============================================\n// TOOL HANDLERS\n// ============================================\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (!hasValidAuthConfig() || authFailedNoTools) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"MCP access requires valid --ds-id and --atomix-token. Add both to your MCP config and restart your AI tool. No tools are available until then.\",\n }],\n isError: true,\n };\n }\n\n // getMcpVersion does not need design system fetch; return current (and latest if known) so the agent can answer \"what version am I on?\"\n if (name === \"getMcpVersion\") {\n const out: { version: string; name: string; latestVersion?: string; updateAvailable?: boolean } = {\n version: MCP_VERSION,\n name: \"atomix-mcp-user\",\n };\n if (mcpLatestVersion) {\n out.latestVersion = mcpLatestVersion;\n out.updateAvailable = true;\n }\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(out, null, 2) }],\n };\n }\n\n try {\n // Force refresh for syncAll to ensure we get the latest data\n const shouldForceRefresh = name === \"syncAll\";\n const data = await fetchDesignSystemForMCP(shouldForceRefresh);\n\n async function performTokenSyncAndRules(\n designSystemData: DesignSystemData,\n tokenOutput: string,\n tokenFormat: OutputFormat,\n dryRun: boolean,\n projectRoot: string\n ): Promise<{\n responseText: string;\n rulesResults: RulesFileResult[];\n validation: SyncValidationEntry[];\n tokenSyncChangeSummary?: { fileExisted: boolean; previousVarCount?: number; currentVarCount: number };\n }> {\n const output = tokenOutput;\n const format = tokenFormat;\n const outputPath = path.resolve(projectRoot, output);\n const fileExists = fs.existsSync(outputPath);\n const deprecatedTokens: Map<string, string> = new Map();\n const existingTokens: Map<string, string> = new Map();\n if (fileExists && [\"css\", \"scss\", \"less\"].includes(format)) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n const oldVarPattern = /(?:^|\\n)\\s*(?:\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*\\/\\s*)?(--[a-zA-Z0-9-]+):\\s*([^;]+);/gm;\n let match;\n while ((match = oldVarPattern.exec(oldContent)) !== null) {\n const varName = match[1];\n const varValue = match[2].trim();\n existingTokens.set(varName, varValue);\n if (!(varName in designSystemData.cssVariables)) deprecatedTokens.set(varName, varValue);\n }\n }\n const mergedCssVariables = { ...designSystemData.cssVariables };\n const darkModeColors = (designSystemData.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n let newContent: string;\n switch (format) {\n case \"css\": newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"scss\": newContent = generateSCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"less\": newContent = generateLessOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"json\": newContent = generateJSONOutput(designSystemData.tokens); break;\n case \"js\": newContent = generateJSOutput(designSystemData.tokens); break;\n case \"ts\": newContent = generateTSOutput(designSystemData.tokens); break;\n case \"swift\": newContent = generateSwiftOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"kotlin\": newContent = generateKotlinOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n case \"dart\": newContent = generateDartOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens); break;\n default: newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n }\n const tokenCount = Object.keys(mergedCssVariables).length;\n const dsTokenCount = Object.keys(designSystemData.cssVariables).length;\n const deprecatedCount = deprecatedTokens.size;\n let changes: Array<{ key: string; old: string; new: string }> = [];\n let diff: DiffResult | undefined;\n if (fileExists && [\"css\", \"scss\", \"less\"].includes(format)) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n diff = diffTokens(oldContent, mergedCssVariables, format as OutputFormat, darkModeColors?.dark);\n const lightChanges = diff.added.length + diff.modified.length;\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length;\n const totalChanges = lightChanges + darkChanges + deprecatedCount;\n if (totalChanges === 0 && !dryRun) {\n const lastUpdated = designSystemData.meta.exportedAt ? new Date(designSystemData.meta.exportedAt).toLocaleString() : \"N/A\";\n lastSyncAffectedTokens = { modified: [], removed: [], added: [], format, timestamp: new Date().toISOString() };\n return {\n responseText: `✓ Already up to date (checked DB v${designSystemData.meta.version}, exported ${lastUpdated}).\\n\\nFile: ${output}\\nTokens: ${tokenCount}\\nVersion: ${designSystemData.meta.version}\\nLast updated: ${lastUpdated}`,\n rulesResults: [],\n validation: [{ path: outputPath, status: \"OK\", detail: \"No changes needed; file already up to date.\" }],\n };\n }\n if (totalChanges === 0 && dryRun) {\n lastSyncAffectedTokens = { modified: [], removed: [], added: [], format, timestamp: new Date().toISOString() };\n return {\n responseText: `[DRY RUN] Already up to date (checked DB v${designSystemData.meta.version}). No changes would be written.\\n\\nFile: ${output}\\nTokens: ${tokenCount}\\nVersion: ${designSystemData.meta.version}`,\n rulesResults: [],\n validation: [{ path: \"(dry run)\", status: \"OK\", detail: \"No files written.\" }],\n };\n }\n changes = [...diff.modified, ...diff.modifiedDark];\n const removedTokensWithValues: Array<{ token: string; lastValue: string }> = [];\n for (const [token, value] of deprecatedTokens.entries()) removedTokensWithValues.push({ token, lastValue: value });\n lastSyncAffectedTokens = {\n modified: [...diff.modified, ...diff.modifiedDark].map(m => ({ token: m.key, oldValue: m.old, newValue: m.new })),\n removed: removedTokensWithValues,\n added: [...diff.added, ...diff.addedDark],\n format,\n timestamp: new Date().toISOString(),\n };\n }\n\n if (dryRun) {\n const added = diff ? diff.added.length + diff.addedDark.length : 0;\n const modified = diff ? diff.modified.length + diff.modifiedDark.length : 0;\n const changeLine = fileExists && diff\n ? ` Changes: ${added} added, ${modified} modified`\n : !fileExists\n ? ` New file would be created with ${tokenCount} tokens.`\n : \"\";\n const report = [\n \"[DRY RUN] No files were written. The following would be written if you run syncAll with dryRun: false.\",\n \"\",\n \"Token file:\",\n ` Path: ${output}`,\n ` Format: ${format}`,\n ` Tokens: ${tokenCount} (${deprecatedCount} deprecated preserved)`,\n changeLine,\n \"\",\n \"Would write skills: .cursor/skills/atomix-ds/SKILL.md, .cursor/skills/atomix-ds/figma-design-SKILL.md\",\n \"\",\n \"Call syncAll again with dryRun: false to apply.\",\n ].filter(Boolean).join(\"\\n\");\n return {\n responseText: report,\n rulesResults: [],\n validation: [{ path: \"(dry run)\", status: \"OK\", detail: \"No files written.\" }],\n };\n }\n\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true });\n fs.writeFileSync(outputPath, newContent);\n const validation: SyncValidationEntry[] = [];\n validation.push(validateTokenFileAfterWrite(outputPath, format, tokenCount));\n\n const rulesResults: RulesFileResult[] = [];\n const governanceChanges = cachedData ? detectGovernanceChangesByFoundation(cachedData, designSystemData) : [];\n const response = formatSyncResponse({\n data: designSystemData,\n output,\n format,\n dsTokenCount,\n deprecatedCount,\n deprecatedTokens,\n diff,\n changes,\n fileExists,\n rulesResults,\n governanceChanges,\n changeSummary: getLastChangeSummary(),\n hasRefactorRecommendation: !!lastSyncAffectedTokens?.removed.length,\n deprecatedTokenCount: lastSyncAffectedTokens?.removed.length || 0,\n });\n const tokenSyncChangeSummary =\n fileExists && [\"css\", \"scss\", \"less\"].includes(format)\n ? { fileExisted: true, previousVarCount: existingTokens.size, currentVarCount: tokenCount }\n : { fileExisted: false, previousVarCount: undefined as number | undefined, currentVarCount: tokenCount };\n return { responseText: response, rulesResults, validation, tokenSyncChangeSummary };\n }\n\n switch (name) {\n case \"getToken\": {\n const path = args?.path as string;\n const value = getTokenByPath(data.tokens, path);\n \n if (value === undefined) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Token not found: ${path}`,\n suggestion: \"Use listTokens or searchTokens to find available tokens.\",\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n // Find CSS variable for this path\n const cssVarKey = `--atmx-${path.replace(/\\./g, \"-\")}`;\n const cssVar = data.cssVariables[cssVarKey];\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n path,\n value,\n cssVariable: cssVar || `var(${cssVarKey})`,\n usage: `style={{ property: \"var(${cssVarKey})\" }}`,\n }, null, 2),\n }],\n };\n }\n\n case \"listTokens\": {\n const category = args?.category as TokenCategory;\n const subcategory = args?.subcategory as string | undefined;\n \n let tokensToList: unknown = data.tokens[category];\n \n if (subcategory && tokensToList && typeof tokensToList === \"object\") {\n tokensToList = getTokenByPath(tokensToList as Record<string, unknown>, subcategory);\n }\n\n if (!tokensToList) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Category not found: ${category}${subcategory ? `.${subcategory}` : \"\"}`,\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n const flat = flattenTokens(tokensToList);\n \n // Enhance tokens with CSS variable names\n const tokensWithCssVars = flat.map(({ path, value }) => {\n // Construct the full path for CSS variable lookup\n const fullPath = subcategory \n ? `${category}.${subcategory}.${path}` \n : `${category}.${path}`;\n \n // Find CSS variable in cssVariables\n let cssVar: string | undefined;\n \n if (category === \"colors\" && subcategory === \"static.brand\") {\n // Brand colors use pattern: --atmx-color-brand-{key}\n // Path is already just the key (e.g., \"testis\", \"primary\")\n cssVar = data.cssVariables[`--atmx-color-brand-${path}`];\n } else if (category === \"colors\" && subcategory?.startsWith(\"modes.\")) {\n // Mode colors use pattern: --atmx-color-{key}\n // Path is already the semantic key (e.g., \"bg-page\", \"text-primary\")\n cssVar = data.cssVariables[`--atmx-color-${path}`];\n } else {\n // For other tokens, try the standard pattern\n const cssVarKey = `--atmx-${fullPath.replace(/\\./g, \"-\")}`;\n cssVar = data.cssVariables[cssVarKey];\n }\n \n return {\n path: fullPath,\n value,\n cssVariable: cssVar || undefined,\n };\n });\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n category,\n subcategory,\n count: tokensWithCssVars.length,\n tokens: tokensWithCssVars.slice(0, 50), // Limit to 50 for readability\n truncated: tokensWithCssVars.length > 50,\n }, null, 2),\n }],\n };\n }\n\n case \"searchTokens\": {\n const query = args?.query as string;\n const results = searchTokens(data.tokens, query);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n query,\n count: results.length,\n results: results.slice(0, 30),\n truncated: results.length > 30,\n }, null, 2),\n }],\n };\n }\n\n case \"listTypesets\": {\n const typography = data.tokens.typography as Record<string, unknown> | undefined;\n const cssPrefix = (args?.cssPrefix as string) || \"atmx\";\n const typesets = typography ? buildTypesetsList(typography, cssPrefix) : [];\n const underlineThickness = typography?.underlineThickness as string | undefined;\n const underlineOffset = typography?.underlineOffset as string | undefined;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n count: typesets.length,\n typesets,\n instruction: \"Emit one CSS rule per typeset using the cssClass and the listed var() properties. Include font-family, font-size, font-weight, line-height; add letter-spacing when present; add text-transform and text-decoration when hasTextTransform/hasTextDecoration are true so the result is 1:1 with the design system. The synced token file quotes font names that contain spaces; no override is needed in the typeset file. For native (iOS/Android) projects, font names with spaces must be quoted or use the platform's canonical font name in theme or resource files.\",\n ...(underlineThickness != null && underlineOffset != null && {\n underlineVars: {\n thickness: `var(--${cssPrefix}-typography-underline-thickness)`,\n offset: `var(--${cssPrefix}-typography-underline-offset)`,\n },\n }),\n }, null, 2),\n }],\n };\n }\n\n case \"validateUsage\": {\n const value = args?.value as string;\n const context = (args?.context as string) || \"any\";\n \n // Check if value is a hardcoded color\n const isHexColor = /^#[0-9A-Fa-f]{3,8}$/.test(value);\n const isRgbColor = /^rgb\\(|^rgba\\(|^hsl\\(/.test(value);\n const isPixelValue = /^\\d+px$/.test(value);\n \n if (!isHexColor && !isRgbColor && !isPixelValue) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: true,\n message: \"Value appears to be using tokens or is not a design token value.\",\n }, null, 2),\n }],\n };\n }\n\n // Search for matching tokens\n const matches = searchTokens(data.tokens, value);\n \n if (matches.length > 0) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. Use a token instead.\",\n matchingTokens: matches.slice(0, 5),\n suggestion: `Use var(--atmx-${matches[0].path.replace(/\\./g, \"-\")}) instead of ${value}`,\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. No exact token match found.\",\n suggestion: `Consider adding this value to the design system or use the closest token.`,\n context,\n }, null, 2),\n }],\n };\n }\n\n case \"getRules\": {\n const topicRaw = args?.topic as string | undefined;\n const topic = topicRaw?.toLowerCase().trim();\n\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=json`;\n console.error(`[getRules] Fetching: ${rulesUrl}${topic ? ` topic=${topic}` : \"\"}`);\n\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n\n try {\n const response = await fetch(rulesUrl, { headers });\n console.error(`[getRules] Response status: ${response.status}`);\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[getRules] Error response: ${errorText}`);\n throw new Error(`Failed to fetch rules: ${response.status} - ${errorText}`);\n }\n\n const payload = await response.json() as { rules?: string[]; categories?: Record<string, string[]> };\n const categories = payload.categories ?? {};\n const allRules = payload.rules ?? [];\n\n if (!topic) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ rules: allRules, categories }, null, 2) }],\n };\n }\n\n const topicToCategories: Record<string, string[]> = {\n colors: [\"general\", \"colors\"],\n typo: [\"general\", \"typography\"],\n typography: [\"general\", \"typography\"],\n motion: [\"general\", \"motion\"],\n icons: [\"general\", \"icons\"],\n layout: [\"general\", \"spacing\", \"sizing\", \"layout\"],\n visual: [\"general\", \"colors\", \"borders\", \"radius\", \"shadows\", \"icons\"],\n style: [\"general\", \"colors\", \"borders\", \"radius\", \"shadows\", \"icons\"],\n };\n const categoryKeys = topicToCategories[topic];\n if (!categoryKeys) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ rules: allRules, categories }, null, 2) }],\n };\n }\n\n const filteredCategories: Record<string, string[]> = {};\n const filteredRules: string[] = [];\n for (const key of categoryKeys) {\n const list = categories[key];\n if (list && list.length > 0) {\n filteredCategories[key] = list;\n filteredRules.push(...list);\n }\n }\n console.error(`[getRules] Got ${filteredRules.length} rules for topic=${topic}`);\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ rules: filteredRules, categories: filteredCategories }, null, 2),\n }],\n };\n } catch (fetchError) {\n console.error(`[getRules] Fetch error:`, fetchError);\n throw fetchError;\n }\n }\n\n case \"exportMCPConfig\": {\n const tool = args?.tool as string;\n \n // Generate MCP config locally (access token is mandatory)\n const serverName = data.meta.name.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n const npxArgs = [\"@atomixstudio/mcp@latest\"];\n if (dsId) npxArgs.push(\"--ds-id\", dsId);\n if (accessToken) npxArgs.push(\"--atomix-token\", accessToken);\n\n const config = {\n mcpServers: {\n [serverName]: {\n command: \"npx\",\n args: npxArgs,\n },\n },\n };\n\n const configs: Record<string, { path: string; content: string }> = {\n cursor: { path: \".cursor/mcp.json\", content: JSON.stringify(config, null, 2) },\n \"claude-desktop\": { path: \"claude_desktop_config.json\", content: JSON.stringify(config, null, 2) },\n windsurf: { path: \".windsurf/mcp.json\", content: JSON.stringify(config, null, 2) },\n continue: { path: \".continue/config.json\", content: JSON.stringify({ models: [], mcpServers: [{ name: serverName, command: \"npx\", args: npxArgs }] }, null, 2) },\n vscode: { path: \".vscode/settings.json\", content: JSON.stringify({ \"mcp.servers\": config.mcpServers }, null, 2) },\n };\n\n if (tool === \"all\") {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n message: \"MCP configurations for all tools\",\n configs: Object.entries(configs).map(([t, c]) => ({\n tool: t,\n path: c.path,\n content: JSON.parse(c.content),\n })),\n }, null, 2),\n }],\n };\n }\n\n const selectedConfig = configs[tool as keyof typeof configs];\n if (!selectedConfig) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(configs),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n tool,\n path: selectedConfig.path,\n content: JSON.parse(selectedConfig.content),\n instructions: `Create the file at ${selectedConfig.path} with the content above, then restart your IDE.`,\n }, null, 2),\n }],\n };\n }\n\n case \"getSetupInstructions\": {\n const tool = args?.tool as string;\n \n const instructions: Record<string, string> = {\n cursor: `# MCP Setup\n\n1. Create your MCP config file in the project (e.g. \\`.cursor/mcp.json\\` for Cursor)\n2. Add the MCP configuration (use exportMCPConfig to get it)\n3. Restart your IDE\n4. Verify by asking: \"What design tokens are available?\"\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n copilot: `# Copilot Setup\n\n1. Create a Copilot instructions file in your project (e.g. \\`.github/copilot-instructions.md\\`)\n2. Run /--sync to write the skill; call getRules() when you need governance rules\n3. Enable custom instructions in your editor (e.g. \\`github.copilot.chat.codeGeneration.useInstructionFiles\\`: true in settings)\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n windsurf: `# Windsurf Setup\n\n1. Create \\`.windsurf/mcp.json\\` in your project root\n2. Run /--sync to write the skill; call getRules() when you need governance rules\n3. Restart Windsurf Editor\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n cline: `# Cline Setup\n\n1. Create \\`.clinerules\\` in your project root\n2. Cline auto-detects MCP from .cursor/mcp.json\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n continue: `# Continue Setup\n\n1. Create/edit \\`.continue/config.json\\`\n2. Add mcpServers configuration\n3. Restart VS Code\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n zed: `# Zed Setup\n\n1. Create \\`.zed/assistant/rules.md\\` in your project\n2. Run /--sync to write the skill; call getRules() for governance rules\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n \"claude-desktop\": `# Claude Desktop Setup\n\n1. Find your Claude config:\n - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json\n - Windows: %APPDATA%\\\\Claude\\\\claude_desktop_config.json\n2. Add MCP server configuration\n3. Restart Claude Desktop\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n generic: `# Generic AI Tool Setup\n\n1. Run /--sync to write the skill (.cursor/skills/atomix-ds/SKILL.md)\n2. Call getRules() when you need governance rules; reference in your prompts or context\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n };\n\n const instruction = instructions[tool];\n if (!instruction) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(instructions),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: instruction,\n }],\n };\n }\n\n case \"syncAll\": {\n const skipTokens = args?.skipTokens === true;\n const dryRun = args?.dryRun === true;\n const output = (args?.output as string) || \"./tokens.css\";\n const format = (args?.format as OutputFormat) || \"css\";\n const projectRoot = path.resolve(\n (args?.workspaceRoot as string) || process.env.ATOMIX_PROJECT_ROOT || process.cwd()\n );\n const parts: string[] = [dryRun ? \"[DRY RUN] syncAll report (no files written).\" : \"✓ syncAll complete.\"];\n let tokenResponseText = \"\";\n const allValidation: SyncValidationEntry[] = [];\n let tokenSyncChangeSummary: { fileExisted: boolean; previousVarCount?: number; currentVarCount: number } | undefined;\n\n if (!skipTokens) {\n const result = await performTokenSyncAndRules(data, output, format, dryRun, projectRoot);\n tokenResponseText = result.responseText;\n allValidation.push(...result.validation);\n tokenSyncChangeSummary = result.tokenSyncChangeSummary;\n if (dryRun) {\n parts.push(`Would write tokens: ${output} (${format})`);\n } else {\n parts.push(`Tokens: ${output} (${format})`);\n }\n }\n\n const dsVersion = String(data.meta.version ?? \"1.0.0\");\n const dsExportedAt = (data.meta as { exportedAt?: string }).exportedAt;\n const skillsDir = path.resolve(projectRoot, \".cursor/skills/atomix-ds\");\n const manifestPath = path.resolve(projectRoot, \"atomix-dependencies.json\");\n const dependencySkills = getSyncDependencySkills(data, dsVersion, dsExportedAt);\n\n if (dryRun) {\n const skillList = dependencySkills.map((s) => s.path).join(\", \");\n parts.push(`Would write skills: ${skillList}`);\n parts.push(\"Would write manifest: atomix-dependencies.json\");\n const reportText = [parts.join(\"\\n\"), tokenResponseText].filter(Boolean).join(\"\\n\\n---\\n\\n\");\n return {\n content: [{ type: \"text\", text: `syncAllResult: DRY_RUN (no files written)\\n\\n${reportText}` }],\n };\n }\n\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n const skillsWritten: Array<{ path: string; shortName: string; from: string }> = [];\n for (const sk of dependencySkills) {\n const absPath = path.resolve(projectRoot, sk.path);\n const existed = fs.existsSync(absPath);\n const prevVersion = existed ? readSkillVersionFromFile(absPath) : null;\n const fromLabel = existed ? (prevVersion ? `DS v${prevVersion}` : \"existing\") : \"missing\";\n fs.writeFileSync(absPath, sk.content);\n allValidation.push({ path: absPath, status: fs.existsSync(absPath) ? \"OK\" : \"FAIL\", detail: \"Written.\" });\n skillsWritten.push({ path: sk.path, shortName: sk.shortName, from: fromLabel });\n }\n const skillShortNames = skillsWritten.map((s) => s.shortName).join(\" + \");\n parts.push(`Skills: ${skillShortNames} (DS v${dsVersion})`);\n\n const tokens = data.tokens as Record<string, unknown>;\n const typography = tokens?.typography as Record<string, unknown> | undefined;\n const fontFamily = typography?.fontFamily as Record<string, string> | undefined;\n const fontNames: string[] = [];\n if (fontFamily) {\n for (const key of [\"display\", \"heading\", \"body\"]) {\n const v = fontFamily[key];\n if (typeof v === \"string\" && v && !fontNames.includes(v)) fontNames.push(v);\n }\n }\n const icons = tokens?.icons as { library?: string; libraryPackage?: string; nativePackage?: string; style?: string; strokeWidth?: string } | undefined;\n const ICON_PACKAGES: Record<string, { web: string; native: string }> = {\n lucide: { web: \"lucide-react\", native: \"lucide-react-native\" },\n heroicons: { web: \"@heroicons/react\", native: \"heroicons-react-native\" },\n phosphor: { web: \"phosphor-react\", native: \"phosphor-react-native\" },\n };\n const lib = icons?.library || \"lucide\";\n const iconPkgs = ICON_PACKAGES[lib] || ICON_PACKAGES.lucide;\n const skillsManifestEntry: Record<string, string> = { skill: \".cursor/skills/atomix-ds/SKILL.md\", syncedAtVersion: String(data.meta.version ?? \"1.0.0\") };\n if (dependencySkills.some((s) => s.shortName === \"figma-design-SKILL.md\")) {\n skillsManifestEntry.figmaDesignSkill = \".cursor/skills/atomix-ds/figma-design-SKILL.md\";\n }\n const manifest = {\n designSystem: { name: data.meta.name, version: data.meta.version },\n tokenFile: skipTokens ? undefined : output,\n iconLibrary: {\n package: iconPkgs.web,\n nativePackage: iconPkgs.native,\n strokeWidthToken: icons?.strokeWidth != null ? \"icons.strokeWidth\" : undefined,\n strokeWidthValue: icons?.strokeWidth,\n },\n fonts: { families: fontNames },\n skills: skillsManifestEntry,\n };\n const manifestExisted = fs.existsSync(manifestPath);\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\n allValidation.push({ path: manifestPath, status: fs.existsSync(manifestPath) ? \"OK\" : \"FAIL\", detail: \"Written.\" });\n parts.push(\"Manifest: atomix-dependencies.json (icons, fonts, skill paths)\");\n\n const changeRows: Array<{ what: string; from: string; to: string }> = [];\n if (!skipTokens && tokenSyncChangeSummary) {\n const fromStr = tokenSyncChangeSummary.fileExisted && tokenSyncChangeSummary.previousVarCount != null\n ? `${tokenSyncChangeSummary.previousVarCount} tokens in ${output}`\n : \"missing\";\n changeRows.push({\n what: \"Tokens\",\n from: fromStr,\n to: `${tokenSyncChangeSummary.currentVarCount} tokens in ${output} (${format})`,\n });\n }\n const skillsFrom = skillsWritten.length ? (skillsWritten.every((s) => s.from === \"missing\") ? \"missing\" : \"updated\") : \"\";\n if (skillsWritten.length > 0) {\n changeRows.push({\n what: \"Skills\",\n from: skillsFrom,\n to: `${skillShortNames} (DS v${dsVersion})`,\n });\n }\n changeRows.push({\n what: \"Manifest\",\n from: manifestExisted ? \"existing\" : \"missing\",\n to: \"atomix-dependencies.json\",\n });\n if (lastSyncAffectedTokens && (lastSyncAffectedTokens.modified.length > 0 || lastSyncAffectedTokens.added.length > 0 || lastSyncAffectedTokens.removed.length > 0)) {\n const mod = lastSyncAffectedTokens.modified;\n const add = lastSyncAffectedTokens.added;\n const rem = lastSyncAffectedTokens.removed;\n const tokenNames = [\n ...mod.map((m) => m.token),\n ...add,\n ...rem.map((r) => r.token),\n ];\n const fromParts = [];\n if (mod.length) fromParts.push(`${mod.length} modified`);\n if (add.length) fromParts.push(`${add.length} added`);\n if (rem.length) fromParts.push(`${rem.length} removed`);\n const toDetail = tokenNames.length <= 8 ? tokenNames.join(\", \") : `${tokenNames.length} tokens (${tokenNames.slice(0, 4).join(\", \")}...)`;\n changeRows.push({\n what: \"Token changes (this run)\",\n from: fromParts.join(\", \") || \"—\",\n to: toDetail,\n });\n if (mod.length > 0 && mod.length <= 15) {\n mod.forEach((m) => {\n changeRows.push({ what: ` ${m.token}`, from: m.oldValue, to: m.newValue });\n });\n }\n }\n\n const changesList =\n \"Report the following changes to the user (From → To). Do not mention what did not change.\\n\\n\" +\n \"**Changes applied**\\n\\n\" +\n changeRows.map((r) => `• **${r.what}:** ${r.from} → ${r.to}`).join(\"\\n\");\n\n const summary = parts.join(\"\\n\");\n const validationBlock = formatValidationBlock(allValidation);\n const hasFailure = allValidation.some((e) => e.status === \"FAIL\");\n const resultLine = hasFailure\n ? \"syncAllResult: FAIL — Check VALIDATION section below. Do not report success to the user.\\n\\n\"\n : \"syncAllResult: OK\\n\\n\";\n const fullText = resultLine + changesList + \"\\n\\n\" + (tokenResponseText ? `---\\n\\n${tokenResponseText}` : \"\") + validationBlock;\n return {\n content: [{ type: \"text\", text: fullText }],\n };\n }\n\n case \"getDependencies\": {\n const platform = args?.platform as string | undefined;\n const stack = args?.stack as string | undefined;\n const tokens = data.tokens as Record<string, unknown>;\n const typography = tokens?.typography as Record<string, unknown> | undefined;\n const fontFamily = typography?.fontFamily as Record<string, string> | undefined;\n const fontNames: string[] = [];\n if (fontFamily) {\n for (const key of [\"display\", \"heading\", \"body\"]) {\n const v = fontFamily[key];\n if (typeof v === \"string\" && v && !fontNames.includes(v)) fontNames.push(v);\n }\n }\n const icons = tokens?.icons as { library?: string; libraryPackage?: string; nativePackage?: string; style?: string; strokeWidth?: string } | undefined;\n const ICON_PACKAGES: Record<string, { web: string; native: string }> = {\n lucide: { web: \"lucide-react\", native: \"lucide-react-native\" },\n heroicons: { web: \"@heroicons/react\", native: \"heroicons-react-native\" },\n phosphor: { web: \"phosphor-react\", native: \"phosphor-react-native\" },\n };\n const lib = icons?.library || \"lucide\";\n const iconPkgs = ICON_PACKAGES[lib] || ICON_PACKAGES.lucide;\n const payload = {\n iconLibrary: {\n package: iconPkgs.web,\n nativePackage: iconPkgs.native,\n strokeWidthToken: icons?.strokeWidth != null ? \"icons.strokeWidth\" : undefined,\n strokeWidthValue: icons?.strokeWidth,\n performanceHint: \"Use individual SVG imports for tree-shaking. Apply the design system's icon tokens: sizing via getToken('sizing.icon.sm') or listTokens('sizing'), and stroke width via getToken('icons.strokeWidth') when the DS defines it. Do not use hardcoded sizes or stroke widths.\",\n },\n fonts: {\n families: fontNames,\n performanceHint: \"Link fonts via URL (e.g. Google Fonts <link> or CSS @import); no need to download font files or add them to the repo. Prefer font-display: swap when possible. You must also build a complete typeset CSS: call listTypesets to get every typeset from the design system, then emit one CSS class per typeset (do not skip any). For each class set font-family, font-size, font-weight, line-height, letter-spacing; when the typeset has text-transform or text-decoration, set those too so the result is 1:1 with the DS. Use the CSS variable names returned by listTypesets. Do not create a file that only contains a font import.\",\n },\n skill: (() => {\n const list = getSyncDependencySkills(data, String(data.meta.version ?? \"1.0.0\"), (data.meta as { exportedAt?: string }).exportedAt);\n const generic = list.find((s) => s.shortName === \"SKILL.md\");\n return generic ? { path: generic.path, content: GENERIC_SKILL_MD } : { path: \".cursor/skills/atomix-ds/SKILL.md\", content: GENERIC_SKILL_MD };\n })(),\n ...(getEffectiveTier() === \"pro\"\n ? {\n skillFigmaDesign: {\n path: \".cursor/skills/atomix-ds/figma-design-SKILL.md\",\n content: FIGMA_DESIGN_SKILL_MD,\n },\n }\n : {}),\n tokenFiles: {\n files: [\"tokens.css\", \"tokens.json\"],\n copyInstructions: \"Call the syncAll MCP tool to create the token file, skills, and atomix-dependencies.json; do not only suggest the user run sync later.\",\n },\n showcase: platform === \"web\" || !platform\n ? {\n path: \"atomix-setup-showcase.html\",\n template: SHOWCASE_HTML_TEMPLATE,\n substitutionInstructions: \"The synced token file (from syncAll) always uses the --atmx- prefix for every CSS variable. Keep all var(--atmx-*) references in the template; do not remove or change the prefix. Replace placeholders with values from the synced token file. {{TOKENS_CSS_PATH}} = path to the synced token file (e.g. ./tokens.css). {{TYPESETS_LINK}} = if a typeset CSS file was created, the full <link rel=\\\\\\\"stylesheet\\\\\\\" href=\\\\\\\"typesets.css\\\\\\\"> tag, otherwise empty string. {{DS_NAME}} = design system name. {{HEADING_FONT_VAR}} = var(--atmx-typography-font-family-heading) or var(--atmx-typography-font-family-display). {{FONT_FAMILY_VAR}} = var(--atmx-typography-font-family-body). {{LARGEST_DISPLAY_TYPESET_CLASS}} = largest display typeset class from listTypesets (display role, largest font size; e.g. typeset-display-2xl), or empty string if no typeset file. {{LARGEST_BODY_TYPESET_CLASS}} = largest body typeset class from listTypesets (body role, largest font size; e.g. typeset-body-lg), or empty string if no typeset file. {{BODY_TYPESET_CLASS}} = default body typeset class from listTypesets (e.g. typeset-body-md), or empty string. {{FONT_LINK_TAG}} = Google Fonts <link> for the font, or empty string. {{BRAND_PRIMARY_VAR}} = var(--atmx-color-brand-primary). Icon on circle uses luminance of brand primary (script sets white or black); no semantic foreground var. {{BUTTON_PADDING_VAR}} = var(--atmx-spacing-scale-md) or closest spacing token for button padding. {{BUTTON_HEIGHT_VAR}} = var(--atmx-sizing-height-md) or closest height token. {{BUTTON_RADIUS_VAR}} = var(--atmx-radius-scale-md) or var(--atmx-radius-scale-lg). {{CIRCLE_PADDING_VAR}} = var(--atmx-spacing-scale-md) or var(--atmx-spacing-scale-sm) for icon circle padding. {{ICON_SIZE_VAR}} = var(--atmx-sizing-icon-md) or var(--atmx-sizing-icon-lg). {{CHECK_ICON_SVG}} = inline SVG for Check icon from the design system icon library (getDependencies.iconLibrary.package: lucide-react, @heroicons/react, or phosphor-react). Use 24x24 viewBox; stroke=\\\\\\\"currentColor\\\\\\\" for Lucide/Heroicons, fill=\\\\\\\"currentColor\\\\\\\" for Phosphor so the script can set icon color by luminance. If unavailable, use: <svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" viewBox=\\\\\\\"0 0 24 24\\\\\\\" fill=\\\\\\\"none\\\\\\\" stroke=\\\\\\\"currentColor\\\\\\\" stroke-width=\\\\\\\"2\\\\\\\" stroke-linecap=\\\\\\\"round\\\\\\\" stroke-linejoin=\\\\\\\"round\\\\\\\"><path d=\\\\\\\"M20 6L9 17l-5-5\\\\\\\"/></svg>. Do not invent CSS variable names; use only vars that exist in the export.\",\n }\n : undefined,\n meta: {\n dsName: data.meta.name,\n platform: platform ?? undefined,\n stack: stack ?? undefined,\n designSystemVersion: data.meta.version ?? \"1.0.0\",\n designSystemExportedAt: (data.meta as { exportedAt?: string }).exportedAt,\n },\n };\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n }],\n };\n }\n\n case \"syncToFigma\": {\n const payloads = buildFigmaPayloadsFromDS(data);\n const out: {\n colorVariables?: unknown;\n paintStyles?: unknown;\n numberVariables?: unknown;\n textStyles?: unknown;\n effectStyles?: unknown;\n error?: string;\n /** True when bridge is not reachable; agent should try to start it first. */\n bridgeNotRunning?: boolean;\n /** Instruction for the agent: start the bridge, then call syncToFigma again. */\n agentInstruction?: string;\n /** Fallback for the user if the agent cannot start the bridge or sync still fails. */\n userInstruction?: string;\n summary?: string;\n numberVariablesHint?: string;\n motionEasingNote?: string;\n figmaPayload?: {\n colorVariableCollections: Array<{ collectionName: string; modes: string[]; variables: Array<{ name: string; values?: Record<string, string>; aliasByMode?: Record<string, string> }>; applyScopes: boolean }>;\n paintStyles: Array<{ name: string; color: string }>;\n textStyles: FigmaTextStylePayload[];\n numberVariableCollections: Array<{ collectionName: string; categoryKey: string; variables: Array<{ name: string; value: number }>; scopes: string[] }>;\n effectStyles: Array<{ name: string; effects: FigmaDropShadow[] }>;\n };\n } = {};\n const agentStartBridge = `The Figma bridge runs with this MCP server. Ensure your AI environment has this MCP server configured and running, then in Figma run the Atomix plugin and tap Connect. Then call **syncToFigma** again.`;\n const userSteps = [\n FIGMA_CONNECTION_INSTRUCTIONS.startBridge,\n FIGMA_CONNECTION_INSTRUCTIONS.installAndRun,\n FIGMA_CONNECTION_INSTRUCTIONS.connect,\n \"Then run Sync to Figma again.\",\n ].join(\" \");\n try {\n const reachable = await isBridgeReachable();\n if (!reachable) {\n out.bridgeNotRunning = true;\n out.agentInstruction = agentStartBridge;\n out.userInstruction = `If the bridge still does not connect: ${userSteps}`;\n out.figmaPayload = {\n colorVariableCollections: payloads.colorVariableCollections,\n paintStyles: payloads.paintStyles,\n textStyles: payloads.textStyles,\n numberVariableCollections: payloads.numberVariableCollections,\n effectStyles: payloads.effectStyles,\n };\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(out, null, 2) }],\n };\n }\n const colorResults: Array<{ collectionName: string; result?: unknown }> = [];\n for (const coll of payloads.colorVariableCollections) {\n if (coll.variables.length > 0) {\n const result = await sendBridgeRequest(\"create_color_variables\", {\n collectionName: coll.collectionName,\n modes: coll.modes,\n variables: coll.variables,\n removeVariablesNotInPayload: true,\n applyScopes: coll.applyScopes,\n });\n colorResults.push({ collectionName: coll.collectionName, result });\n }\n }\n if (colorResults.length > 0) {\n out.colorVariables = colorResults.length === 1 ? colorResults[0].result : colorResults;\n }\n if (payloads.paintStyles.length > 0) {\n out.paintStyles = await sendBridgeRequest(\"create_paint_styles\", {\n styles: payloads.paintStyles,\n removePaintStylesNotInPayload: true,\n });\n }\n if (payloads.numberVariableCollections.length > 0) {\n const numberResults: Array<{ categoryKey: string; result?: unknown; error?: string }> = [];\n try {\n for (const coll of payloads.numberVariableCollections) {\n const result = await sendBridgeRequest(\"create_number_variables\", {\n collectionName: coll.collectionName,\n variables: coll.variables.map((v) => ({ name: v.name, value: v.value })),\n scopes: coll.scopes,\n removeVariablesNotInPayload: true,\n });\n numberResults.push({ categoryKey: coll.categoryKey, result });\n }\n out.numberVariables = numberResults;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n out.numberVariables = { error: msg };\n if (msg.includes(\"Method not allowed\") && msg.includes(\"create_number_variables\")) {\n out.numberVariablesHint = \"Number variables require the latest Atomix Figma plugin and bridge. Rebuild the plugin and bridge, reload the plugin in Figma, restart the bridge, then sync again.\";\n }\n }\n }\n if (payloads.textStyles.length > 0) {\n out.textStyles = await sendBridgeRequest(\"create_text_styles\", {\n styles: payloads.textStyles,\n removeTextStylesNotInPayload: true,\n });\n }\n if (payloads.effectStyles.length > 0) {\n out.effectStyles = await sendBridgeRequest(\"create_effect_styles\", {\n styles: payloads.effectStyles,\n removeShadowStylesNotInPayload: true,\n });\n }\n out.figmaPayload = {\n colorVariableCollections: payloads.colorVariableCollections,\n paintStyles: payloads.paintStyles,\n textStyles: payloads.textStyles,\n numberVariableCollections: payloads.numberVariableCollections,\n effectStyles: payloads.effectStyles,\n };\n } catch (e) {\n out.error = e instanceof Error ? e.message : String(e);\n out.figmaPayload = {\n colorVariableCollections: payloads.colorVariableCollections,\n paintStyles: payloads.paintStyles,\n textStyles: payloads.textStyles,\n numberVariableCollections: payloads.numberVariableCollections,\n effectStyles: payloads.effectStyles,\n };\n const errMsg = out.error.toLowerCase();\n const connectionFailure = errMsg.includes(\"econnrefused\") || errMsg.includes(\"bridge timeout\") || errMsg.includes(\"websocket\") || errMsg.includes(\"network\");\n if (connectionFailure) {\n out.bridgeNotRunning = true;\n out.agentInstruction = agentStartBridge;\n out.userInstruction = `If the bridge still does not connect: ${userSteps}`;\n } else if (errMsg.includes(\"plugin not connected\") || errMsg.includes(\"figma plugin\")) {\n out.userInstruction = `${FIGMA_CONNECTION_INSTRUCTIONS.installAndRun} ${FIGMA_CONNECTION_INSTRUCTIONS.connect}`;\n }\n }\n const textStylesResult = out.textStyles as { failed?: number; failures?: Array<{ name: string; reason: string }>; created?: number; updated?: number } | undefined;\n if (textStylesResult?.failed && textStylesResult.failures?.length) {\n const firstReason = textStylesResult.failures[0].reason;\n out.summary = `Text styles: ${textStylesResult.failed} could not be created. ${firstReason}`;\n }\n if (out.numberVariablesHint) {\n out.summary = [out.summary, out.numberVariablesHint].filter(Boolean).join(\" \");\n }\n // Build a change summary from bridge results (created/updated/removed) so the chat highlights what changed\n const summaryParts: string[] = [];\n const colorResult = out.colorVariables as\n | { variableNames?: string[]; removed?: number; removedNames?: string[] }\n | Array<{ collectionName: string; result?: { variableNames?: string[]; removed?: number; removedNames?: string[] } }>\n | undefined;\n if (colorResult) {\n const results = Array.isArray(colorResult) ? colorResult : [{ result: colorResult }];\n let totalSynced = 0;\n let totalRemoved = 0;\n for (const r of results) {\n const res = (r as { result?: { variableNames?: string[]; removed?: number } }).result;\n if (res?.variableNames?.length) totalSynced += res.variableNames.length;\n if ((res?.removed ?? 0) > 0) totalRemoved += res!.removed ?? 0;\n }\n if (totalSynced > 0 || totalRemoved > 0) {\n const parts: string[] = [];\n if (totalSynced > 0) parts.push(`${totalSynced} synced`);\n if (totalRemoved > 0) parts.push(`${totalRemoved} removed`);\n summaryParts.push(`Colors: ${parts.join(\", \")}.`);\n }\n }\n const paintResult = out.paintStyles as { created?: number; updated?: number; removed?: number; createdNames?: string[]; updatedNames?: string[]; removedNames?: string[] } | undefined;\n if (paintResult) {\n const c = paintResult.created ?? 0;\n const u = paintResult.updated ?? 0;\n const r = paintResult.removed ?? 0;\n if (c + u + r > 0) {\n const parts: string[] = [];\n if (c > 0) parts.push(`${c} created`);\n if (u > 0) parts.push(`${u} updated`);\n if (r > 0) parts.push(`${r} removed`);\n summaryParts.push(`Paint styles: ${parts.join(\", \")}.`);\n }\n }\n const effectResult = out.effectStyles as { created?: number; updated?: number; removed?: number; createdNames?: string[]; updatedNames?: string[]; removedNames?: string[] } | undefined;\n if (effectResult) {\n const c = effectResult.created ?? 0;\n const u = effectResult.updated ?? 0;\n const r = effectResult.removed ?? 0;\n if (c + u + r > 0) {\n const parts: string[] = [];\n if (c > 0) parts.push(`${c} created`);\n if (u > 0) parts.push(`${u} updated`);\n if (r > 0) parts.push(`${r} removed`);\n summaryParts.push(`Effect styles (shadows): ${parts.join(\", \")}.`);\n if (effectResult.removedNames?.length) {\n summaryParts.push(`Removed: ${effectResult.removedNames.join(\", \")}.`);\n }\n }\n }\n const numResult = out.numberVariables as Array<{ categoryKey: string; result?: { variableNames?: string[]; removed?: number; removedNames?: string[] } }> | undefined;\n if (Array.isArray(numResult)) {\n const total = numResult.reduce((acc, r) => acc + (r.result?.variableNames?.length ?? 0), 0);\n const totalRemoved = numResult.reduce((acc, r) => acc + (r.result?.removed ?? 0), 0);\n if (total > 0 || totalRemoved > 0) {\n const parts: string[] = [];\n if (total > 0) parts.push(`${total} synced`);\n if (totalRemoved > 0) parts.push(`${totalRemoved} removed`);\n summaryParts.push(`Number variables: ${parts.join(\", \")}.`);\n }\n }\n const textStylesWithRemoved = out.textStyles as { created?: number; updated?: number; removed?: number; removedNames?: string[] } | undefined;\n if (textStylesWithRemoved && (textStylesWithRemoved.created ?? 0) + (textStylesWithRemoved.updated ?? 0) + (textStylesWithRemoved.removed ?? 0) > 0) {\n const c = textStylesWithRemoved.created ?? 0;\n const u = textStylesWithRemoved.updated ?? 0;\n const r = textStylesWithRemoved.removed ?? 0;\n const parts: string[] = [];\n if (c > 0) parts.push(`${c} created`);\n if (u > 0) parts.push(`${u} updated`);\n if (r > 0) parts.push(`${r} removed`);\n summaryParts.push(`Text styles: ${parts.join(\", \")}.`);\n }\n if (summaryParts.length > 0 && !out.error) {\n out.summary = [out.summary, summaryParts.join(\" \")].filter(Boolean).join(\" \");\n }\n out.motionEasingNote = \"Motion easing tokens are not synced as Figma styles; Figma has no reusable easing style. Easing is only used in prototype transitions (e.g. smart animate). Duration/easing remain available as number variables (duration) or in export JSON.\";\n const responseText = out.summary ? `${out.summary}\\n\\n${JSON.stringify(out, null, 2)}` : JSON.stringify(out, null, 2);\n return {\n content: [{\n type: \"text\",\n text: responseText,\n }],\n ...(out.error ? { isError: true } : {}),\n };\n }\n\n case \"designInFigma\": {\n // Pro-gated. Catalog + resolvers from @atomix/figma-tools (shared with Design tab). Keep in sync.\n if (cachedMcpTier !== \"pro\") {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"designInFigma requires a Pro subscription. Upgrade at https://atomix.studio\" }, null, 2) }],\n isError: true,\n };\n }\n const action = args?.action as string | undefined;\n if (action === \"catalog\") {\n try {\n const reachable = await isBridgeReachable();\n let fileCtx: FileContextPayload | undefined;\n if (reachable) {\n try {\n const raw = await sendBridgeRequest(\"get_figma_variables_and_styles\", {});\n fileCtx = raw as FileContextPayload;\n } catch { /* proceed without file context */ }\n }\n const localVars: string[] = [];\n const libVars: string[] = [];\n const textStyleNames: string[] = [];\n const effectStyleNames: string[] = [];\n if (fileCtx) {\n for (const coll of fileCtx.variableCollections ?? []) {\n for (const v of coll.variables) localVars.push(v.name);\n }\n for (const coll of fileCtx.variableCollectionsLibrary ?? []) {\n for (const v of coll.variables) libVars.push(v.name);\n }\n for (const s of fileCtx.textStyles ?? []) textStyleNames.push(s.name);\n for (const s of fileCtx.effectStyles ?? []) effectStyleNames.push(s.name);\n }\n const catalogPayload = formatCatalogForMCP(FIGMA_DESIGN_CATALOG, {\n localVariables: localVars,\n libraryVariables: libVars,\n textStyles: textStyleNames,\n effectStyles: effectStyleNames,\n });\n\n let designAssets: unknown = undefined;\n if (reachable) {\n try {\n const raw = await sendBridgeRequest(\"get_component_catalog\", {});\n if (raw && typeof raw === \"object\") {\n designAssets = raw;\n }\n } catch { /* proceed without design assets catalog */ }\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n ...catalogPayload,\n pluginConnected: reachable,\n ...(designAssets ? { designAssets } : {}),\n ...(reachable ? {\n queryMethods: getQueryMethodNames(),\n queryHint: \"Use action:'query' with queryMethod (e.g. get_selection, get_node_info, get_design_screenshot) and optional queryParams to read selection, node details, or a frame screenshot for review.\",\n } : {}),\n ...(reachable ? {} : { hint: \"Figma plugin not connected. Open Figma, run Atomix plugin, and tap Connect.\" }),\n }, null, 2),\n }],\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { content: [{ type: \"text\", text: JSON.stringify({ error: msg }, null, 2) }], isError: true };\n }\n }\n if (action === \"query\") {\n const queryMethodRaw = args?.queryMethod as string | undefined;\n const queryParams = (args?.queryParams as Record<string, unknown>) ?? {};\n if (!queryMethodRaw || typeof queryMethodRaw !== \"string\") {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"query requires queryMethod (e.g. get_selection, get_node_info, get_design_screenshot)\" }, null, 2) }],\n isError: true,\n };\n }\n const queryMethod = queryMethodRaw.replace(/[A-Z]/g, (c: string) => `_${c.toLowerCase()}`);\n const allowedQueryMethods = new Set(getQueryMethodNames());\n if (!allowedQueryMethods.has(queryMethod)) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: `Unknown query method \"${queryMethod}\". Allowed: ${[...allowedQueryMethods].join(\", \")}` }, null, 2) }],\n isError: true,\n };\n }\n try {\n const reachable = await isBridgeReachable();\n if (!reachable) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: \"Figma plugin not connected.\",\n bridgeNotRunning: true,\n agentInstruction: \"Run the Atomix plugin in Figma and tap Connect, then call designInFigma with action:'query' again.\",\n }, null, 2),\n }],\n isError: true,\n };\n }\n const result = await sendBridgeRequest(queryMethod, queryParams);\n // sendBridgeRequest resolves with the bridge's result payload directly (e.g. { count, nodes } for get_selection)\n const content: Array<{ type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string }> = [];\n const summary: Record<string, unknown> = { method: queryMethod, success: true };\n if (result && typeof result === \"object\" && \"imageBase64\" in result && typeof (result as { imageBase64: string }).imageBase64 === \"string\") {\n summary.screenshot = \"included below (base64 PNG)\";\n summary.format = (result as { format?: string }).format ?? \"PNG\";\n summary.scale = (result as { scale?: number }).scale;\n content.push({ type: \"text\", text: JSON.stringify(summary, null, 2) });\n content.push({\n type: \"image\",\n data: (result as { imageBase64: string }).imageBase64,\n mimeType: \"image/png\",\n });\n } else {\n summary.result = result;\n content.push({ type: \"text\", text: JSON.stringify(summary, null, 2) });\n }\n return { content };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { content: [{ type: \"text\", text: JSON.stringify({ method: queryMethod, success: false, error: msg }, null, 2) }], isError: true };\n }\n }\n if (action === \"execute\") {\n const rawSteps = args?.steps as Array<{ method: string; params?: Record<string, unknown> }> | undefined;\n if (!rawSteps || !Array.isArray(rawSteps) || rawSteps.length === 0) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"steps array is required for action:'execute'\" }, null, 2) }],\n isError: true,\n };\n }\n try {\n const reachable = await isBridgeReachable();\n if (!reachable) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: \"Figma plugin not connected.\",\n bridgeNotRunning: true,\n agentInstruction: \"Run the Atomix plugin in Figma and tap Connect, then call designInFigma again.\",\n }, null, 2),\n }],\n isError: true,\n };\n }\n\n const designMethods = new Set([\n ...getDesignMethodNames(),\n \"list_local_components\",\n \"get_component_catalog\",\n \"get_design_screenshot\",\n \"get_variable_collection_modes\",\n \"get_frame_variable_mode\",\n ]);\n const warnings: Array<{ step: number; method: string; issue: string }> = [];\n\n let fileCtx: FileContextPayload | undefined;\n try {\n const raw = await sendBridgeRequest(\"get_figma_variables_and_styles\", {});\n fileCtx = raw as FileContextPayload;\n } catch { /* proceed without resolution */ }\n\n const resolvers = fileCtx ? buildResolvers(fileCtx) : null;\n\n const isFigmaNodeId = (s: string) => /^\\d+:\\d+$/.test(s);\n let rootFrameId: string | null = null;\n let lastCreatedFrameNodeId: string | null = null;\n const namedNodeIds = new Map<string, string>();\n const results: Array<{ step: number; method: string; result?: unknown; error?: string }> = [];\n\n for (let i = 0; i < rawSteps.length; i++) {\n const step = rawSteps[i];\n const method = (step.method ?? \"\").replace(/[A-Z]/g, (c: string) => `_${c.toLowerCase()}`);\n\n if (!designMethods.has(method)) {\n warnings.push({ step: i, method, issue: `Unknown method \"${method}\" — skipped` });\n continue;\n }\n\n let params: Record<string, unknown> = { ...(step.params ?? {}) };\n if (resolvers) {\n params = resolveStepParams(params, resolvers);\n }\n\n if (rootFrameId) {\n const parentId = params.parentId as string | undefined;\n const frameId = params.frameId as string | undefined;\n if (typeof parentId === \"string\" && !isFigmaNodeId(parentId)) {\n params.parentId = namedNodeIds.get(parentId) ?? rootFrameId;\n }\n if (typeof frameId === \"string\" && !isFigmaNodeId(frameId)) {\n params.frameId = namedNodeIds.get(frameId) ?? rootFrameId;\n }\n if (method === \"finalize_design_frame\" && !params.frameId) {\n params.frameId = rootFrameId;\n }\n const needsParent = method.startsWith(\"design_create_\") || method === \"design_create_component\";\n if (needsParent && !params.parentId) {\n params.parentId = rootFrameId;\n }\n }\n\n const nodeId = params.nodeId as string | undefined;\n if (typeof nodeId === \"string\" && nodeId && !isFigmaNodeId(nodeId)) {\n const resolved = namedNodeIds.get(nodeId) ?? lastCreatedFrameNodeId ?? rootFrameId;\n params.nodeId = resolved ?? nodeId;\n }\n const needsNode = [\n \"design_set_auto_layout\", \"design_set_layout_sizing\", \"design_set_effects\",\n \"design_set_strokes\", \"design_resize_node\", \"design_set_resize_constraints\",\n \"design_set_layout_constraints\", \"design_set_node_position\", \"design_set_text_properties\",\n ].includes(method);\n if (needsNode && !params.nodeId) {\n params.nodeId = lastCreatedFrameNodeId ?? rootFrameId;\n }\n\n const childId = params.childId as string | undefined;\n if (typeof childId === \"string\" && childId && !isFigmaNodeId(childId)) {\n params.childId = namedNodeIds.get(childId) ?? childId;\n }\n\n try {\n const response = await sendBridgeRequest(method, params);\n const res = response as Record<string, unknown>;\n\n if (method === \"create_design_placeholder\" && typeof res?.frameId === \"string\") {\n rootFrameId = res.frameId as string;\n }\n const isCreateMethod = method.startsWith(\"design_create_\") || method === \"design_convert_to_component\" || method === \"design_combine_as_variants\" || method === \"design_create_frame_from_preset\" || method === \"design_group_nodes\";\n if (isCreateMethod && typeof res?.nodeId === \"string\") {\n const createdNodeId = res.nodeId as string;\n if (method === \"design_create_frame\" || method === \"design_create_frame_from_preset\") {\n lastCreatedFrameNodeId = createdNodeId;\n if (!rootFrameId && res?.isRoot === true) {\n rootFrameId = createdNodeId;\n }\n }\n const stepName = (step.params?.name as string) ?? \"\";\n if (stepName) namedNodeIds.set(stepName, createdNodeId);\n }\n\n results.push({ step: i, method, result: response });\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : String(e);\n results.push({ step: i, method, error: errMsg });\n if (!rootFrameId && (method === \"design_create_frame\" || method === \"create_design_placeholder\")) break;\n }\n }\n\n const errorCount = results.filter((r) => r.error).length;\n const success = errorCount === 0;\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n success,\n stepsExecuted: results.length,\n errors: errorCount,\n warnings,\n results,\n }, null, 2),\n }],\n ...(errorCount > 0 ? { isError: true } : {}),\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { content: [{ type: \"text\", text: JSON.stringify({ error: msg }, null, 2) }], isError: true };\n }\n }\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"action must be 'catalog', 'query', or 'execute'\" }, null, 2) }],\n isError: true,\n };\n }\n\n default:\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${name}`,\n availableTools: [\"getToken\", \"listTokens\", \"listTypesets\", \"searchTokens\", \"validateUsage\", \"getRules\", \"exportMCPConfig\", \"getSetupInstructions\", \"syncAll\", \"getDependencies\", \"getMcpVersion\", \"syncToFigma\", \"designInFigma\"],\n }, null, 2),\n }],\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n let suggestion = \"Check your MCP server configuration.\";\n \n if (errorMessage.includes(\"Missing --ds-id\")) {\n suggestion = \"Add --ds-id <your-design-system-id> to your MCP server configuration.\";\n } else if (errorMessage.includes(\"Failed to fetch\")) {\n const statusMatch = errorMessage.match(/Failed to fetch design system: (\\d+)/);\n if (statusMatch) {\n const status = statusMatch[1];\n if (status === \"404\") {\n suggestion = `Design system ID \"${dsId}\" not found. Verify the ID is correct or the design system has been published.`;\n } else if (status === \"401\" || status === \"403\") {\n suggestion = \"Add --atomix-token <your-token> from the Export modal or Settings → Regenerate.\";\n } else {\n suggestion = `API request failed (${status}). Check your network connection and API base URL (${apiBase}).`;\n }\n } else {\n suggestion = `Failed to connect to API at ${apiBase}. Check your network connection.`;\n }\n }\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: errorMessage,\n suggestion,\n configured: {\n dsId: dsId || \"not set\",\n apiBase: apiBase || \"not set\",\n hasApiKey: !!apiKey,\n },\n }, null, 2),\n }],\n isError: true,\n };\n }\n});\n\n// ============================================\n// SYNC DEPENDENCIES (single source of truth; tier-aware; reused by syncAll and getDependencies)\n// ============================================\n\n/** Tier from API: meta.mcpTier (Pro includes DS owner + pro guestlist). */\nfunction getEffectiveTier(): \"free\" | \"pro\" | null {\n return cachedMcpTier;\n}\n\n/** Skills to write on sync. Pro tier gets generic + Figma design skill; free gets generic only. */\nfunction getSyncDependencySkills(\n data: DesignSystemData,\n dsVersion: string,\n dsExportedAt: string | undefined\n): Array<{ path: string; content: string; shortName: string }> {\n const tier = getEffectiveTier();\n const skills: Array<{ path: string; content: string; shortName: string }> = [];\n const genericWithVersion = injectSkillVersion(GENERIC_SKILL_MD, dsVersion, dsExportedAt);\n skills.push({\n path: \".cursor/skills/atomix-ds/SKILL.md\",\n content: genericWithVersion,\n shortName: \"SKILL.md\",\n });\n if (tier === \"pro\") {\n const figmaSkillWithFrontmatter = `---\nname: atomix-figma-design\ndescription: Figma design skill — create high-quality, token-bound designs in Figma from any reference (screenshots, images, code snippets, URLs). Covers mobile, web, token application, and component/variant creation. Use with syncToFigma and designInFigma MCP tools when the Atomix plugin is connected.\n---\n${FIGMA_DESIGN_SKILL_MD}`;\n const figmaSkillWithVersion = injectSkillVersion(figmaSkillWithFrontmatter, dsVersion, dsExportedAt);\n skills.push({\n path: \".cursor/skills/atomix-ds/figma-design-SKILL.md\",\n content: figmaSkillWithVersion,\n shortName: \"figma-design-SKILL.md\",\n });\n }\n return skills;\n}\n\n/** Read existing skill version from frontmatter if present. */\nfunction readSkillVersionFromFile(filePath: string): string | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n const match = raw.match(/atomixDsVersion:\\s*[\"']([^\"']+)[\"']/);\n return match ? match[1] : null;\n } catch {\n return null;\n }\n}\n\n// ============================================\n// SKILL VERSIONING (inject DS version so AI can suggest syncAll when behind)\n// ============================================\n\nfunction injectSkillVersion(content: string, version: string, exportedAt: string | undefined): string {\n const endOfFrontmatter = content.indexOf(\"\\n---\\n\", 3);\n if (endOfFrontmatter === -1) return content;\n const before = content.slice(0, endOfFrontmatter);\n const after = content.slice(endOfFrontmatter);\n const versionLines = `atomixDsVersion: \"${version}\"\\natomixDsExportedAt: \"${exportedAt ?? \"\"}\"\\n`;\n return before + \"\\n\" + versionLines + after;\n}\n\n// ============================================\n// GENERIC SKILL.MD (coding-platform agnostic)\n// ============================================\n\nconst GENERIC_SKILL_MD = `---\nname: atomix-ds\ndescription: Use the project's design system tokens semantically when building or editing any UI. Covers everyday tasks — creating components, building pages, styling forms, theming, dark mode, responsive layouts, adding icons, choosing colors, setting type, adjusting spacing, and applying motion. Works with any platform or framework (web, React Native, iOS, Android, Flutter, etc.). Fetch token values and governance rules via MCP tools (getToken, listTokens, searchTokens, getRules, validateUsage). Tokens include colors, typography, spacing, sizing, radius, shadows, borders, motion, z-index, and icons. Never hardcode visual values — always resolve from the design system first.\n---\n\n# Atomix Design System\n\n**Prerequisite:** Load rules first before anything else — call getRules() at the start of the session or before writing any visual code.\n\nThis project uses a design system with semantic tokens. **Before writing any visual code**, fetch the relevant tokens and governance rules from the MCP tools below. The design system is the single source of truth — do not guess, invent, or hardcode visual values.\n\n## When to use\n\nUse this skill for everyday design and frontend tasks:\n\n**Building UI**\n- Creating a component (button, card, input, modal, nav, sidebar, table, list, badge, tooltip…)\n- Laying out a page, screen, or view\n- Building a form, dialog, popover, or overlay\n- Adding a header, footer, hero section, or onboarding flow\n\n**Styling & theming**\n- Choosing colors for backgrounds, text, borders, icons, or interactive states\n- Setting typography — font family, size, weight, line height, letter spacing\n- Adjusting spacing, padding, margins, or gaps between elements\n- Applying border radius, shadows, or elevation to surfaces\n- Adding hover, focus, active, disabled, or loading states\n- Setting up dark mode, light mode, or theme switching\n- Configuring responsive or adaptive layouts\n\n**Working with assets**\n- Rendering icons (sizing and stroke width are defined by the design system)\n- Implementing designs from Figma, mockups, screenshots, or design specs\n- Translating a design handoff into code\n\n**Maintenance**\n- Refactoring hardcoded values to use tokens\n- Auditing code for design system compliance\n- Updating styles after a design system version change\n\nIf the task has no visual output (pure logic, data, APIs, DevOps), this skill is not needed.\n\n## Semantic token usage\n\nTokens have two layers — **primitives** (raw scales) and **semantic** (purpose-driven). Always prefer semantic tokens because they adapt to themes and modes automatically.\n\n| Intent | Use semantic token | Avoid raw primitive |\n|--------|-------------------|---------------------|\n| Page background | \\`bg-page\\` | \\`neutral.50\\` |\n| Card surface | \\`bg-surface\\` | \\`white\\` |\n| Primary text | \\`text-primary\\` | \\`neutral.900\\` |\n| Muted text | \\`text-muted\\` | \\`neutral.500\\` |\n| Default border | \\`border-default\\` | \\`neutral.200\\` |\n| Brand action | \\`brand.primary\\` | \\`green.600\\` |\n| Error state | \\`status.error\\` | \\`red.500\\` |\n\nCall \\`getRules\\` for the full mapping of semantic tokens to primitives in each theme.\n\nWhen a semantic token doesn't exist for your use case, use the closest primitive from \\`listTokens\\` — but document why so the team can promote it to a semantic token later.\n\n## How to fetch design system data\n\n### 1. Governance rules — always fetch first\n\n\\`getRules()\\` — optionally with a topic: \\`colors\\`, \\`typo\\`, \\`motion\\`, \\`icons\\`, \\`layout\\`, or \\`visual\\` (color, border, radius, shadows, icons). Returns how tokens should be applied — naming conventions, variable format, and semantic mappings.\n\n### 2. Token values — by task\n\n| I need… | MCP call |\n|---------|----------|\n| A specific token | \\`getToken(\"colors.brand.primary\")\\` or \\`getToken(\"spacing.scale.md\")\\` |\n| All tokens in a category | \\`listTokens(\"colors\")\\` — categories: \\`colors\\`, \\`typography\\`, \\`spacing\\`, \\`sizing\\`, \\`shadows\\`, \\`radius\\`, \\`borders\\`, \\`motion\\`, \\`zIndex\\` |\n| Search by name or value | \\`searchTokens(\"primary\")\\` or \\`searchTokens(\"bold\")\\` |\n| Icon size or stroke | \\`getToken(\"sizing.icon.sm\")\\` for dimensions, \\`getToken(\"icons.strokeWidth\")\\` for stroke |\n| Typeset classes | \\`listTypesets()\\` — emit one class per typeset; include text-transform and text-decoration for 1:1 match |\n\n### 3. Validation\n\n\\`validateUsage(\"#007061\", \"color\")\\` — checks if a raw value should be a token. Run this on any value you suspect is hardcoded.\n\n### 4. Syncing tokens to a file\n\n\\`syncAll({ output?, format?, skipTokens? })\\` — writes tokens to a file (default \\`./tokens.css\\`), skills (.cursor/skills/atomix-ds/SKILL.md and figma-design-SKILL.md), and manifest. Use \\`skipTokens: true\\` to only write skills and manifest.\n\n## Workflow\n\n1. **Fetch rules** — call \\`getRules\\` once per session (or with a topic when working on a specific area).\n2. **Fetch tokens** — call \\`getToken\\`, \\`listTokens\\`, or \\`searchTokens\\` for the values you need.\n3. **Apply semantically** — use token references or CSS variables (\\`var(--atmx-*)\\`) depending on your platform. Choose the semantic token that matches the *purpose*, not just the visual appearance.\n4. **Self-check** — scan your output for hardcoded hex codes, pixel values, rem/em literals, duration strings, or font names. If found, replace with the matching token.\n\n## Common mistakes\n\nDo not hardcode visual values. Always resolve from the design system:\n\n- A hex color (\\`#007061\\`, \\`#333\\`) → call \\`getToken\\` or \\`searchTokens\\` for the matching color token\n- A pixel/rem value (\\`16px\\`, \\`1.5rem\\`) → use the spacing, sizing, or radius token\n- A font name (\\`\"Inter\"\\`, \\`\"SF Pro\"\\`) → use the typography font-family token\n- A duration (\\`200ms\\`, \\`0.3s\\`) → use the motion duration token\n- A numeric weight (\\`600\\`, \\`700\\`) → use the typography font-weight token\n- A shadow string (\\`0 4px 6px rgba(…)\\`) → use the shadow elevation token\n\nIf no token matches, call \\`searchTokens\\` to find the closest option. Never invent a token path.\n\n## Best practices\n\n- **Fetch first:** Always call getRules and/or listTokens before writing any styles, regardless of platform or framework.\n- **Semantic over primitive:** Prefer tokens that describe purpose (\\`text-primary\\`, \\`bg-surface\\`) over tokens that describe appearance (\\`neutral.900\\`, \\`white\\`).\n- **Icons:** Size via \\`getToken(\"sizing.icon.sm\")\\`; stroke width via \\`getToken(\"icons.strokeWidth\")\\` when the DS defines it.\n- **Typography:** Use **typeset classes** (e.g. from \\`typesets.css\\` or \\`listTypesets()\\` output — \\`typeset-heading-h1\\`, \\`typeset-body-md-regular\\`, etc.) for all text; do not re-declare font-family, font-size, font-weight, line-height, or letter-spacing in component CSS, which duplicates the design system. For global typeset output, call **listTypesets** and emit every entry; include text-transform and text-decoration for 1:1 match.\n- **No guessing:** If a value is not in the rules or token list, call searchTokens or listTokens to find the closest match.\n- **Platform agnostic:** Token values work across CSS, Tailwind, React Native, SwiftUI, Compose, Flutter, and any style system. Use the output format appropriate to your platform.\n- **Version check:** If this file has frontmatter \\`atomixDsVersion\\`, compare to the version from **getDependencies** (\\`meta.designSystemVersion\\`). If the DS is newer, suggest running **syncAll** to update.\n\n## Strict mode and patterns\n\n- **Strict mode:** NO arbitrary values (e.g. \\`bg-[#ff0000]\\` forbidden). NO hardcoded colors — use CSS variables and semantic tokens only. NO hardcoded pixel values — use spacing/sizing tokens only. NO hardcoded typography — use typography typeset tokens only. Token vocabulary only — if a value is not in the design system, do not use it.\n- **CSS variables:** All tokens follow \\`--atmx-{category}-{subcategory}-{token}\\`. Correct: \\`backgroundColor: \"var(--atmx-color-bg-surface)\"\\`, \\`borderRadius: \"var(--atmx-radius-scale-md)\"\\`. Wrong: hex, raw px.\n- **Dark mode:** Colors switch in dark mode when using CSS variables; \\`.dark\\` on root toggles color variables.\n- **Button pattern:** Height and padding use sizing/spacing tokens; typography from typeset tokens; radius and border from tokens; transition from motion tokens; primary/secondary/ghost use action color tokens (e.g. \\`--atmx-color-action-primary\\`, \\`--atmx-color-action-on-primary\\`).\n`;\n\n// ============================================\n// SETUP SHOWCASE HTML (exact structure for get-started web)\n// ============================================\n// Placeholders: {{TOKENS_CSS_PATH}}, {{TYPESETS_LINK}}, {{DS_NAME}}, {{HEADING_FONT_VAR}}, {{FONT_FAMILY_VAR}}, {{LARGEST_DISPLAY_TYPESET_CLASS}}, {{LARGEST_BODY_TYPESET_CLASS}}, {{BODY_TYPESET_CLASS}}, {{FONT_LINK_TAG}}, {{BRAND_PRIMARY_VAR}}, {{BUTTON_PADDING_VAR}}, {{BUTTON_HEIGHT_VAR}}, {{BUTTON_RADIUS_VAR}}, {{CIRCLE_PADDING_VAR}}, {{ICON_SIZE_VAR}}, {{CHECK_ICON_SVG}}\n// Icon on circle uses luminance of brand primary (script sets .icon-circle.dark-icon or .light-icon) — no semantic foreground var. Semantic colors (bg-page, text-primary) hardcoded as var(--atmx-color-*). Other placeholders = token var() from synced file (prefix --atmx-).\nconst SHOWCASE_HTML_TEMPLATE = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Setup complete — {{DS_NAME}}</title>\n {{FONT_LINK_TAG}}\n <link rel=\"stylesheet\" href=\"{{TOKENS_CSS_PATH}}\">\n {{TYPESETS_LINK}}\n <style>\n * { box-sizing: border-box; }\n body {\n margin: 0;\n font-family: {{FONT_FAMILY_VAR}}, system-ui, sans-serif;\n background: var(--atmx-color-bg-page);\n color: var(--atmx-color-text-primary);\n min-height: 100vh;\n padding: var(--atmx-spacing-scale-2xl);\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .wrap { width: 375px; max-width: 100%; }\n .top-row {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: var(--atmx-spacing-scale-lg);\n }\n .top-row .mode-toggle { margin-bottom: 0; }\n .icon-circle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: calc({{ICON_SIZE_VAR}} + 2 * {{CIRCLE_PADDING_VAR}});\n height: calc({{ICON_SIZE_VAR}} + 2 * {{CIRCLE_PADDING_VAR}});\n padding: {{CIRCLE_PADDING_VAR}};\n background: {{BRAND_PRIMARY_VAR}};\n border-radius: 50%;\n }\n .icon-circle.light-icon { color: #fff; }\n .icon-circle.dark-icon { color: #000; }\n .icon-circle svg {\n width: {{ICON_SIZE_VAR}};\n height: {{ICON_SIZE_VAR}};\n flex-shrink: 0;\n }\n .mode-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: {{BUTTON_PADDING_VAR}};\n height: {{BUTTON_HEIGHT_VAR}};\n border-radius: {{BUTTON_RADIUS_VAR}};\n background: var(--atmx-color-bg-surface);\n color: var(--atmx-color-text-primary);\n border: 1px solid var(--atmx-color-border-default);\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n cursor: pointer;\n margin-bottom: var(--atmx-spacing-scale-xl);\n }\n .mode-toggle:hover {\n background: var(--atmx-color-bg-muted);\n }\n h1 {\n font-family: {{HEADING_FONT_VAR}}, {{FONT_FAMILY_VAR}}, system-ui, sans-serif;\n margin: 0 0 var(--atmx-spacing-scale-md);\n line-height: 1.2;\n }\n .lead {\n margin: 0 0 var(--atmx-spacing-scale-xl);\n opacity: 0.95;\n }\n .now { margin: var(--atmx-spacing-scale-xl) 0 0; opacity: 0.95; text-align: left; }\n .now strong { display: block; margin-bottom: var(--atmx-spacing-scale-sm); }\n .now ul { margin: 0; padding-left: var(--atmx-spacing-scale-xl); }\n .tips { margin-top: var(--atmx-spacing-scale-xl); opacity: 0.9; }\n .tips a { color: inherit; text-decoration: underline; }\n code {\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n font-size: 0.8125rem;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n background: var(--atmx-color-bg-muted);\n }\n </style>\n</head>\n<body class=\"{{BODY_TYPESET_CLASS}}\">\n <div class=\"wrap\">\n <div class=\"top-row\">\n <div class=\"icon-circle\" aria-hidden=\"true\">\n {{CHECK_ICON_SVG}}\n </div>\n <button type=\"button\" class=\"mode-toggle\" id=\"mode-toggle\" aria-label=\"Toggle light or dark mode\">Dark</button>\n </div>\n <h1 class=\"{{LARGEST_DISPLAY_TYPESET_CLASS}}\">You're all set with {{DS_NAME}}</h1>\n <p class=\"lead {{LARGEST_BODY_TYPESET_CLASS}}\">This page uses your design system: semantic colors (mode-aware), headline and body typesets, and an icon.</p>\n <div class=\"now {{LARGEST_BODY_TYPESET_CLASS}}\">\n <strong>What you can do now:</strong>\n <ul>\n <li>Ask your agent to build your designs using the design system tokens</li>\n <li>Build components and pages that use <code>var(--atmx-*)</code> for colors, spacing, and typography</li>\n <li>Run <code>/--rules</code> to load governance rules (or call getRules); run <code>/--sync</code> and <code>/--refactor</code> after you change tokens in Atomix Studio</li>\n </ul>\n </div>\n <p class=\"tips {{LARGEST_BODY_TYPESET_CLASS}}\">Keep the source of truth at <a href=\"https://atomix.studio\" target=\"_blank\" rel=\"noopener\">atomix.studio</a> — avoid editing token values in this repo.</p>\n </div>\n <script>\n (function() {\n var root = document.documentElement;\n var btn = document.getElementById('mode-toggle');\n var circle = document.querySelector('.icon-circle');\n function hexToRgb(hex) {\n var m = hex.slice(1).match(/.{2}/g);\n return m ? m.map(function(x) { return parseInt(x, 16) / 255; }) : [0, 0, 0];\n }\n function relativeLuminance(r, g, b) {\n var srgb = function(x) { return x <= 0.03928 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); };\n return 0.2126 * srgb(r) + 0.7152 * srgb(g) + 0.0722 * srgb(b);\n }\n function setIconContrast() {\n if (!circle) return;\n var bg = getComputedStyle(circle).backgroundColor;\n var r = 0, g = 0, b = 0;\n var rgbMatch = bg.match(/rgb\\\\(?\\\\s*(\\\\d+)\\\\s*,\\\\s*(\\\\d+)\\\\s*,\\\\s*(\\\\d+)\\\\s*\\\\)?/);\n if (rgbMatch) {\n r = parseInt(rgbMatch[1], 10) / 255;\n g = parseInt(rgbMatch[2], 10) / 255;\n b = parseInt(rgbMatch[3], 10) / 255;\n } else if (bg.indexOf('#') === 0) {\n var parts = hexToRgb(bg);\n r = parts[0]; g = parts[1]; b = parts[2];\n } else return;\n var L = relativeLuminance(r, g, b);\n circle.classList.remove('light-icon', 'dark-icon');\n circle.classList.add(L > 0.179 ? 'dark-icon' : 'light-icon');\n }\n function updateLabel() {\n var isDark = root.classList.contains('dark');\n btn.textContent = isDark ? 'Light' : 'Dark';\n btn.setAttribute('aria-label', isDark ? 'Switch to light mode' : 'Switch to dark mode');\n }\n btn.addEventListener('click', function() {\n root.classList.toggle('dark');\n root.setAttribute('data-theme', root.classList.contains('dark') ? 'dark' : 'light');\n updateLabel();\n setIconContrast();\n });\n if (root.classList.contains('dark') || root.getAttribute('data-theme') === 'dark') {\n root.classList.add('dark');\n root.setAttribute('data-theme', 'dark');\n }\n updateLabel();\n setIconContrast();\n })();\n </script>\n</body>\n</html>\n`;\n\n// ============================================\n// RESOURCE HANDLERS\n// ============================================\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n if (!hasValidAuthConfig() || authFailedNoTools) {\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n try {\n await fetchDesignSystemForMCP();\n // Return empty list so resources are hidden in UI; AI can still read atomix://hello and atomix://rules or atomix://rules/<topic> via ReadResource.\n return { resources: [] };\n } catch {\n authFailedNoTools = true;\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n // Only atomix://setup is available when args missing or auth failed (so user can see how to configure)\n if (uri === \"atomix://setup\") {\n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: `# Configure Atomix MCP\n\nAdd \\`--ds-id\\` and \\`--atomix-token\\` to your MCP server config (both required).\n\nExample (\\`.cursor/mcp.json\\`):\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\", \"--ds-id\", \"<your-ds-id>\", \"--atomix-token\", \"<your-token>\"]\n }\n }\n}\n\\`\\`\\`\n\nGet your DS ID and token from the Export modal or Settings → Regenerate Atomix access token.`,\n }],\n };\n }\n\n if (!hasValidAuthConfig() || authFailedNoTools) {\n throw new Error(\"MCP access requires valid --ds-id and --atomix-token. Add both to your MCP config and restart your AI tool. See atomix://setup for instructions.\");\n }\n\n const data = await fetchDesignSystemForMCP();\n const stats = getTokenStats(data);\n\n // Welcome resource\n if (uri === \"atomix://hello\") {\n const welcome = generateWelcomeMessage(data, stats);\n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: welcome,\n }],\n };\n }\n\n // Rules resources: atomix://rules or atomix://rules/{topic}\n const rulesMatch = uri.match(/^atomix:\\/\\/rules(?:\\/(.+))?$/);\n if (rulesMatch) {\n const topicRaw = rulesMatch[1]?.toLowerCase().trim();\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=json`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) throw new Error(`Failed to fetch rules: ${response.status}`);\n const payload = await response.json() as { rules?: string[]; categories?: Record<string, string[]> };\n const categories = payload.categories ?? {};\n const allRules = payload.rules ?? [];\n const topicToCategories: Record<string, string[]> = {\n colors: [\"general\", \"colors\"],\n typo: [\"general\", \"typography\"],\n typography: [\"general\", \"typography\"],\n motion: [\"general\", \"motion\"],\n icons: [\"general\", \"icons\"],\n layout: [\"general\", \"spacing\", \"sizing\", \"layout\"],\n visual: [\"general\", \"colors\", \"borders\", \"radius\", \"shadows\", \"icons\"],\n style: [\"general\", \"colors\", \"borders\", \"radius\", \"shadows\", \"icons\"],\n };\n if (!topicRaw || !topicToCategories[topicRaw]) {\n return {\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify({ rules: allRules, categories }, null, 2) }],\n };\n }\n const categoryKeys = topicToCategories[topicRaw];\n const filteredCategories: Record<string, string[]> = {};\n const filteredRules: string[] = [];\n for (const key of categoryKeys) {\n const list = categories[key];\n if (list?.length) {\n filteredCategories[key] = list;\n filteredRules.push(...list);\n }\n }\n return {\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify({ rules: filteredRules, categories: filteredCategories }, null, 2) }],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n});\n\n// ============================================\n// PROMPTS - Auto-suggest hello on connection\n// ============================================\n\nserver.setRequestHandler(ListPromptsRequestSchema, async () => {\n if (!hasValidAuthConfig()) {\n authFailedNoTools = true;\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n if (cachedMcpTier === null && !authFailedNoTools) {\n try {\n await fetchDesignSystemForMCP(true);\n } catch {\n authFailedNoTools = true;\n }\n }\n if (authFailedNoTools) {\n throw new Error(AUTH_REQUIRED_MESSAGE);\n }\n const prompts: Array<{ name: string; description: string }> = [\n { name: \"--hello\", description: \"Get started with this design system - overview, tokens, and tools. Run this first!\" },\n { name: \"--get-started\", description: \"Get started with design system in project. Three phases: scan, report and ask, then create only after you approve.\" },\n { name: \"--rules\", description: \"Get design system governance rules (optionally by topic: colors, typo, motion, icons, layout, visual).\" },\n { name: \"--sync\", description: \"Sync tokens, AI rules, skills files, and dependencies manifest (icons, fonts). Use /--refactor to migrate deprecated tokens.\" },\n { name: \"--refactor\", description: \"Migrate deprecated tokens in codebase. Run after /--sync.\" },\n { name: \"--sync-to-figma\", description: \"Push this design system to Figma (variables, color + typography styles). Uses local bridge + plugin; no Figma token.\" },\n ];\n if (cachedMcpTier === \"pro\") {\n prompts.push({ name: \"--design-in-figma\", description: \"Load Figma design skill and use designInFigma tool to design UI in the connected Figma file. Pro only.\" });\n }\n return { prompts };\n});\n\nserver.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (!hasValidAuthConfig() || authFailedNoTools) {\n return {\n description: \"MCP Server Configuration Required\",\n messages: [{\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: \"MCP access requires valid --ds-id and --atomix-token. Add both to your MCP config and restart your AI tool. No tools or prompts are available until then.\",\n },\n }],\n };\n }\n\n // Map -- prompt names to internal handler names (works across AI tools)\n const canonicalName =\n name === \"--hello\" ? \"hello\"\n : name === \"--get-started\" ? \"atomix-setup\"\n : name === \"--rules\" ? \"design-system-rules\"\n : name === \"--sync\" ? \"sync\"\n : name === \"--refactor\" ? \"refactor\"\n : (name === \"--sync-to-figma\" || name === \"syncToFigma\") ? \"sync-to-figma\"\n : (name === \"--design-in-figma\" || name === \"designInFigma\") ? \"design-in-figma\"\n : name;\n\n // Try to fetch design system, but handle gracefully if not configured\n // Force refresh for all MCP prompts so each command gets latest data from DB (no stale cache)\n const shouldForceRefresh = [\n \"hello\",\n \"atomix-setup\", // --get-started\n \"design-system-rules\", // --rules\n \"sync\",\n \"refactor\",\n \"sync-to-figma\",\n \"design-in-figma\",\n ].includes(canonicalName);\n let data: DesignSystemData | null = null;\n let stats: ReturnType<typeof getTokenStats> | null = null;\n \n try {\n data = await fetchDesignSystemForMCP(shouldForceRefresh);\n stats = getTokenStats(data);\n } catch (error) {\n // If design system fetch fails, return helpful error message\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n \n if (errorMessage.includes(\"Missing --ds-id\")) {\n // Missing ds-id configuration\n return {\n description: \"MCP Server Configuration Required\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `The MCP server isn't configured. To use design system prompts, you need to configure the server with:\n- \\`--ds-id\\`: Your design system ID (get it from https://atomix.studio/ds/[your-ds-id])\n- \\`--atomix-token\\`: Your access token (get it from the Export modal or Settings → Regenerate Atomix access token)\n\nBoth are required. Configure the MCP server in your AI tool's MCP settings, then restart your AI tool.`,\n },\n },\n ],\n };\n } else if (errorMessage.includes(\"Failed to fetch\")) {\n // API fetch failed - show actual error details\n const statusMatch = errorMessage.match(/Failed to fetch design system: (\\d+) (.+)/);\n const status = statusMatch ? statusMatch[1] : \"unknown\";\n const details = statusMatch ? statusMatch[2] : errorMessage;\n \n let helpText = `**Error:** Failed to fetch design system from ${apiBase}/api/ds/${dsId}/tokens\\n\\n`;\n helpText += `**Status:** ${status}\\n`;\n helpText += `**Details:** ${details}\\n\\n`;\n \n if (status === \"404\") {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Design system ID \"${dsId}\" doesn't exist\\n`;\n helpText += `- API base URL \"${apiBase}\" is incorrect\\n`;\n helpText += `- Design system hasn't been published yet\\n\\n`;\n helpText += `**Solution:** Verify the design system ID and API base URL in your MCP server configuration.`;\n } else if (status === \"401\" || status === \"403\") {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Missing or invalid access token\\n`;\n helpText += `- You don't have access to this design system (owner or invited guest only)\\n\\n`;\n helpText += `**Solution:** Add \\`--atomix-token <your-token>\\` from the Export modal or Settings → Regenerate.`;\n } else {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Network connection issue\\n`;\n helpText += `- API server is down\\n`;\n helpText += `- CORS or firewall blocking the request\\n\\n`;\n helpText += `**Solution:** Check your network connection and verify the API base URL is accessible.`;\n }\n \n return {\n description: \"Design System Fetch Failed\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: helpText,\n },\n },\n ],\n };\n }\n // Re-throw other errors\n throw error;\n }\n\n // Helper to build category prompt with metadata and AI rules\n const buildCategoryPrompt = (category: string, instructions: string): string => {\n const lines: string[] = [];\n \n // Header with DS info\n lines.push(`## Design System Information`);\n lines.push(`- **Name**: ${data!.meta.name}`);\n lines.push(`- **Version**: ${data!.meta.version || \"1.0.0\"}`);\n lines.push(`- **Last Published**: ${data!.meta.exportedAt ? new Date(data!.meta.exportedAt).toLocaleDateString() : \"N/A\"}`);\n lines.push(``);\n \n // AI Rules for this category\n const categoryRules = data!.governance.categories?.[category];\n if (categoryRules && categoryRules.length > 0) {\n lines.push(`## AI Rules for ${category.charAt(0).toUpperCase() + category.slice(1)}`);\n categoryRules.forEach((rule, index) => {\n lines.push(`${index + 1}. ${rule}`);\n });\n lines.push(``);\n }\n \n // Instructions\n lines.push(`## Instructions`);\n lines.push(instructions);\n \n return lines.join(\"\\n\");\n };\n\n /** Append MCP update notice to the first text message so every prompt shows it when the API reports a newer version. */\n function withMcpNotice<T extends { description: string; messages: unknown[] }>(res: T): T {\n if (!mcpUpdateNotice || res.messages.length === 0) return res;\n const first = res.messages[0] as { role: string; content?: { type: string; text?: string } };\n if (first?.content?.type === \"text\" && typeof first.content.text === \"string\") {\n return {\n ...res,\n messages: [\n { ...first, content: { ...first.content, text: first.content.text + \"\\n\\n---\\n\\n\" + mcpUpdateNotice } },\n ...res.messages.slice(1),\n ],\n } as T;\n }\n return res;\n }\n\n switch (canonicalName) {\n case \"hello\": {\n const welcome = generateWelcomeMessage(data, stats);\n const helloInstruction = `You are showing the Atomix design system welcome. You MUST do the following in order:\n\n1. **First** — Copy and draw the ASCII art block exactly as it appears below (the code block with the arrow pattern). Output it verbatim before any other text. Do not summarize, skip, or replace it with a description.\n2. **Then** — Output the rest of the welcome message (markdown) exactly as given.\n\nDo not add any introduction or commentary before the ASCII art. The ASCII art must be the very first thing you output.\n\n---\n${welcome}`;\n return withMcpNotice({\n description: `Hello — ${data.meta.name} Design System`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: helloInstruction,\n },\n },\n ],\n });\n }\n\n case \"design-system-rules\": {\n const topic = (args?.topic as string)?.toLowerCase().trim();\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=json`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) throw new Error(`Failed to fetch rules: ${response.status}`);\n const payload = await response.json() as { rules?: string[]; categories?: Record<string, string[]> };\n const categories = payload.categories ?? {};\n const allRules = payload.rules ?? [];\n const topicToCategories: Record<string, string[]> = {\n colors: [\"general\", \"colors\"],\n typo: [\"general\", \"typography\"],\n typography: [\"general\", \"typography\"],\n motion: [\"general\", \"motion\"],\n icons: [\"general\", \"icons\"],\n layout: [\"general\", \"spacing\", \"sizing\", \"layout\"],\n visual: [\"general\", \"colors\", \"borders\", \"radius\", \"shadows\", \"icons\"],\n style: [\"general\", \"colors\", \"borders\", \"radius\", \"shadows\", \"icons\"],\n };\n let rulesText: string;\n if (topic && topicToCategories[topic]) {\n const categoryKeys = topicToCategories[topic];\n const filteredCategories: Record<string, string[]> = {};\n const filteredRules: string[] = [];\n for (const key of categoryKeys) {\n const list = categories[key];\n if (list?.length) {\n filteredCategories[key] = list;\n filteredRules.push(...list);\n }\n }\n rulesText = JSON.stringify({ rules: filteredRules, categories: filteredCategories }, null, 2);\n } else {\n rulesText = JSON.stringify({ rules: allRules, categories }, null, 2);\n }\n return withMcpNotice({\n description: topic ? `Design system rules (topic: ${topic})` : \"Design system rules\",\n messages: [\n { role: \"user\" as const, content: { type: \"text\" as const, text: topic ? `Show me the design system rules for topic: ${topic}.` : \"Show me the design system rules.\" } },\n { role: \"assistant\" as const, content: { type: \"text\" as const, text: rulesText } },\n ],\n });\n }\n\n case \"spacing\": {\n const instructions = `List all spacing tokens in a table format. Use the listTokens tool with category \"spacing\" and subcategory \"scale\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"spacing.xs\" instead of \"spacing.scale.xs\").`;\n return withMcpNotice({\n description: \"List all spacing tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"spacing\", instructions),\n },\n },\n ],\n });\n }\n\n case \"radius\": {\n const instructions = `List all border radius tokens in a table format. Use the listTokens tool with category \"radius\" and subcategory \"scale\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"radius.sm\" instead of \"radius.scale.sm\").`;\n return withMcpNotice({\n description: \"List all border radius tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"radius\", instructions),\n },\n },\n ],\n });\n }\n\n case \"color\": {\n const instructions = `List all color tokens in a table format showing both light and dark mode values. \n\nFirst, call listTokens with category \"colors\" and subcategory \"modes.light\" to get light mode colors.\nThen, call listTokens with category \"colors\" and subcategory \"modes.dark\" to get dark mode colors.\nAlso call listTokens with category \"colors\" and subcategory \"static.brand\" to get brand colors.\n\nFormat the response as a markdown table with columns: Token Name | Light Mode Value | Dark Mode Value | CSS Variable.\n\nFor brand colors (from static.brand), show the same value in both Light and Dark columns since brand colors don't change with mode.\nFor semantic colors (from modes.light/modes.dark), match tokens by name and show their respective values.\n\nThe Token Name should be in short format:\n- Brand colors: \"colors.brand.primary\" (not \"colors.static.brand.primary\")\n- Semantic colors: \"colors.bgSurface\" (not \"colors.modes.light.bgSurface\")`;\n return withMcpNotice({\n description: \"List all color tokens with light/dark mode\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"colors\", instructions),\n },\n },\n ],\n });\n }\n\n case \"typography\": {\n const instructions = `List all typography tokens in a table format. Use the listTokens tool with category \"typography\" (no subcategory needed). Format the response as a markdown table with columns: Token Name | Value | CSS Variable. Group tokens by type (fontSize, fontWeight, lineHeight, etc.) with section headers.`;\n return withMcpNotice({\n description: \"List all typography tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"typography\", instructions),\n },\n },\n ],\n });\n }\n\n case \"shadow\": {\n const instructions = `List all shadow/elevation tokens in a table format. Use the listTokens tool with category \"shadows\" and subcategory \"elevation\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"shadows.elevation.md\" is fine as-is).`;\n return withMcpNotice({\n description: \"List all shadow/elevation tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"shadows\", instructions),\n },\n },\n ],\n });\n }\n\n case \"border\": {\n const instructions = `List all border width tokens in a table format. Use the listTokens tool with category \"borders\" and subcategory \"width\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"borders.width.sm\" is fine as-is).`;\n return withMcpNotice({\n description: \"List all border width tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"borders\", instructions),\n },\n },\n ],\n });\n }\n\n case \"sizing\": {\n const instructions = `List all sizing tokens in a table format. Call listTokens twice:\n1. category \"sizing\" and subcategory \"height\" for component heights\n2. category \"sizing\" and subcategory \"icon\" for icon sizes\n\nFormat the response as a markdown table with columns: Token Name | Value | CSS Variable. Group by type (height vs icon) with section headers.`;\n return withMcpNotice({\n description: \"List all sizing tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"sizing\", instructions),\n },\n },\n ],\n });\n }\n\n case \"motion\": {\n const instructions = `List all motion tokens in a table format. Call listTokens twice:\n1. category \"motion\" and subcategory \"duration\" for duration tokens\n2. category \"motion\" and subcategory \"easing\" for easing tokens\n\nFormat the response as a markdown table with columns: Token Name | Value | CSS Variable. Group by type (duration vs easing) with section headers.`;\n return withMcpNotice({\n description: \"List all motion tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"motion\", instructions),\n },\n },\n ],\n });\n }\n\n case \"sync\": {\n const output = (args?.output as string) || \"./tokens.css\";\n const format = (args?.format as string) || \"css\";\n const workspaceRoot = args?.workspaceRoot as string | undefined;\n const rootHint = workspaceRoot\n ? ` Use workspaceRoot: \"${workspaceRoot}\" so files are written inside the repo.`\n : \" If the project root is known, pass workspaceRoot with its absolute path so skills and manifest are written inside the repo (committable).\";\n return withMcpNotice({\n description: \"Sync tokens, rules, skills, and dependencies manifest\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Call the syncAll tool now. Use output=\"${output}\" and format=\"${format}\".${rootHint} This syncs tokens, AI rules, skills (.cursor/skills/atomix-ds/*), and atomix-dependencies.json. Execute immediately - do not search or ask questions.`,\n },\n },\n ],\n });\n }\n\n case \"sync-to-figma\": {\n return withMcpNotice({\n description: \"Push design system to Figma via MCP tool\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Call the MCP tool **syncToFigma** now (no arguments). It pushes the design system into the open Figma file via the built-in bridge and Atomix plugin. Do not use the Figma REST API or external scripts. If the response includes \\`bridgeNotRunning\\` and \\`agentInstruction\\`, ensure your AI environment has this MCP server running, then in Figma run the Atomix plugin and tap Connect, then call syncToFigma again. Only if that fails, tell the user: (1) Ensure this MCP server is configured and running in your AI tool. (2) In Figma, open and run the Atomix plugin, then tap **Connect**. (3) Run Sync to Figma again. After a successful sync, report the **summary** from the response (what was created, updated, or removed)—do not say \"we added the whole design system\" when only some items changed.`,\n },\n },\n ],\n });\n }\n\n case \"design-in-figma\": {\n if (getEffectiveTier() !== \"pro\") {\n return withMcpNotice({\n description: \"Design in Figma (Pro required)\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: \"designInFigma requires a Pro subscription. Upgrade at https://atomix.studio to use Design in Figma.\",\n },\n },\n ],\n });\n }\n if (!data) {\n return withMcpNotice({\n description: \"Design in Figma\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: \"Failed to fetch design system. Check your --ds-id and --atomix-token configuration, then try /--design-in-figma again.\",\n },\n },\n ],\n });\n }\n const figmaSkillPath = path.resolve(process.cwd(), \".cursor/skills/atomix-ds/figma-design-SKILL.md\");\n const skillExists = fs.existsSync(figmaSkillPath);\n const currentVersion = String(data!.meta.version ?? \"1.0.0\");\n const fileVersion = skillExists ? readSkillVersionFromFile(figmaSkillPath) : null;\n const isOutdated = !skillExists || fileVersion === null || fileVersion !== currentVersion;\n if (isOutdated) {\n return withMcpNotice({\n description: \"Figma design skill missing or outdated\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: skillExists\n ? `The Figma design skill at \\`.cursor/skills/atomix-ds/figma-design-SKILL.md\\` is outdated (design system version ${currentVersion}). Run **/--sync** to update the skill and other design system files, then run **/--design-in-figma** again.`\n : `The Figma design skill is missing. Run **/--sync** to write \\`.cursor/skills/atomix-ds/figma-design-SKILL.md\\` (and other design system files), then run **/--design-in-figma** again.`,\n },\n },\n ],\n });\n }\n return withMcpNotice({\n description: \"Load Figma design skill and use designInFigma tool\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `You are using **/--design-in-figma**: load the Figma design skill below and use the **designInFigma** MCP tool to design UI in the connected Figma file.\n\n**Instructions:**\n1. Treat the following as the Figma design skill (advisory and generative UI on the Figma canvas). Follow it when creating or editing designs.\n2. Call **designInFigma** with \\`action: \"catalog\"\\` first to discover available bridge methods, file variables/styles, and query/execute capabilities.\n3. Use \\`action: \"query\"\\` to read from Figma (e.g. get_selection, get_node_info, get_design_screenshot).\n4. Use \\`action: \"execute\"\\` with an array of steps to create or modify the design on the canvas.\n5. If the response includes \\`bridgeNotRunning\\` or \\`pluginConnected: false\\`, tell the user to run the Atomix plugin in Figma and tap Connect, then try again.\n\n---\n\n## Figma design skill\n\n${FIGMA_DESIGN_SKILL_MD}`,\n },\n },\n ],\n });\n }\n\n case \"refactor\": {\n // Recompute deprecated tokens from fresh DB vs local token file (not stale in-memory state)\n const refactorOutput = (args?.output as string) || \"./tokens.css\";\n const refactorFormat = (args?.format as string) || \"css\";\n const refactorOutputPath = path.resolve(process.cwd(), refactorOutput);\n const refactorFileExists = fs.existsSync(refactorOutputPath);\n\n if (!data) {\n return withMcpNotice({\n description: \"Refactor codebase for deprecated tokens\",\n messages: [{\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `Failed to fetch design system from DB. Check your --ds-id and --atomix-token configuration.` },\n }],\n });\n }\n\n if (!refactorFileExists) {\n return withMcpNotice({\n description: \"Refactor codebase for deprecated tokens\",\n messages: [{\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `No token file found at \\`${refactorOutput}\\`. Please run \\`/--sync\\` first to create your token file, then run \\`/--refactor\\` to scan your codebase for deprecated token usage.` },\n }],\n });\n }\n\n // Compute deprecated: tokens in local file but NOT in fresh DB export\n const deprecatedTokens: Map<string, string> = new Map();\n if ([\"css\", \"scss\", \"less\"].includes(refactorFormat)) {\n const oldContent = fs.readFileSync(refactorOutputPath, \"utf-8\");\n const oldVarPattern = /(?:^|\\n)\\s*(?:\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*\\/\\s*)?(--[a-zA-Z0-9-]+):\\s*([^;]+);/gm;\n let match;\n while ((match = oldVarPattern.exec(oldContent)) !== null) {\n const varName = match[1];\n const varValue = match[2].trim();\n if (!(varName in data.cssVariables)) deprecatedTokens.set(varName, varValue);\n }\n }\n\n const dsVersion = data.meta.version ?? \"?\";\n const dsExportedAt = data.meta.exportedAt ? new Date(data.meta.exportedAt).toLocaleString() : \"N/A\";\n\n if (deprecatedTokens.size === 0) {\n return withMcpNotice({\n description: \"Refactor codebase for deprecated tokens\",\n messages: [{\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `✓ No deprecated tokens found.\\n\\nYour token file \\`${refactorOutput}\\` is aligned with the design system (v${dsVersion}, exported ${dsExportedAt}). No tokens need migration.` },\n }],\n });\n }\n\n const format = refactorFormat;\n const isNativeFormat = [\"swift\", \"kotlin\", \"dart\"].includes(format);\n const removed = Array.from(deprecatedTokens.entries()).map(([token, lastValue]) => ({ token, lastValue }));\n\n let searchPatterns = \"\";\n let fileExtensions = \"\";\n \n if (isNativeFormat) {\n const nativeTokens = removed.map(r => {\n const withoutPrefix = r.token.replace(/^--atmx-/, \"\");\n const camelCase = withoutPrefix.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n const pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n return { css: r.token, camel: camelCase, pascal: pascalCase, lastValue: r.lastValue };\n });\n \n if (format === \"swift\") {\n fileExtensions = \".swift files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.*.${t.camel}\\` (was: ${t.lastValue})`).join(\"\\n\");\n } else if (format === \"kotlin\") {\n fileExtensions = \".kt files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.*.${t.pascal}\\` (was: ${t.lastValue})`).join(\"\\n\");\n } else {\n fileExtensions = \".dart files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.${t.camel}\\` (was: ${t.lastValue})`).join(\"\\n\");\n }\n } else {\n fileExtensions = \".tsx, .ts, .jsx, .js, .css, .scss, .less, .vue, .svelte files\";\n searchPatterns = removed.map(r => \n ` • \\`var(${r.token})\\` or \\`\"${r.token}\"\\` (was: ${r.lastValue})`\n ).join(\"\\n\");\n }\n\n const instructions = `Scan the codebase for deprecated design tokens and help update them.\n\n## Design System (fresh from DB)\n- **Version:** ${dsVersion}\n- **Last exported:** ${dsExportedAt}\n- **Token file:** ${refactorOutput}\n\n## Deprecated Tokens (${removed.length})\n\nThe following tokens exist in your local token file but have been removed from the design system:\n\n${searchPatterns}\n\n## Instructions\n\n1. **Search** for these patterns in ${fileExtensions}:\n - Skip node_modules, dist, build, .next, .git directories\n - Look for both \\`var(--token)\\` and direct string references\n\n2. **Report findings** in this format:\n \\`\\`\\`\n 📄 path/to/file.tsx\n Line 42: background: var(--atmx-color-deprecated);\n Line 78: const color = \"--atmx-color-deprecated\";\n \\`\\`\\`\n\n3. **After listing all findings**, ask:\n > \"Found X instances of deprecated tokens in Y files. Would you like me to update them?\"\n > \n > For each deprecated token, I'll suggest the closest equivalent from the current design system.\n\n4. **If user confirms**:\n - Show the proposed replacement for each instance\n - Apply changes only after user approves\n - For tokens with no clear replacement, ask user which token to use\n\n## Important\n\n- Do NOT make any changes without explicit user confirmation\n- Show before → after for each change\n- If you can't find a suitable replacement token, ask the user\n\n## Available Token Categories\n\nUse \\`/color\\`, \\`/spacing\\`, \\`/radius\\`, \\`/typography\\`, \\`/shadow\\`, \\`/border\\`, \\`/sizing\\`, \\`/motion\\` to see current tokens if you need to find replacements.`;\n\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: instructions,\n },\n },\n ],\n };\n }\n\n case \"atomix-setup\": {\n const setupInstructions = `You are running **/--get-started** (get started with design system). Three phases only.\n\n**Rule:** Do not create, write, or modify any file until Phase 3 and only after the user has explicitly approved (e.g. \"Yes\", \"Yes for all\", \"Go ahead\").\n\n## Todo list (required)\n\n- Create a todo list at the start: Phase 1, Phase 2, Phase 3. Work step by step; do not run Phase 3 until the user has replied with approval. Mark items completed as you go.\n\n## Phase 1 – Scan\n\n- Resolve platform/stack: infer from the project (e.g. package.json, build.gradle, Xcode) or ask once: \"Which platform? (e.g. web, Android, iOS)\" and if relevant \"Which stack? (e.g. React, Vue, Next, Swift, Kotlin).\" Do not assume a default.\n- Call **getDependencies** with \\`platform\\` and optional \\`stack\\`. If it fails, tell the user the design system could not be reached and stop.\n- Scan the repo for: .cursor/skills/atomix-ds/SKILL.md, .cursor/skills/atomix-ds/figma-design-SKILL.md, a tokens file (e.g. tokens.css or src/tokens.css), icon package from getDependencies, font links. **Web:** note any existing CSS (globals.css, main.css, Tailwind, etc.). **Native:** note any theme/style files (SwiftUI, Android themes, Compose).\n- Build two lists: **Suggested** (from getDependencies minus what exists) and **Already present**. Include: icon package, font links, skills (SKILL.md and figma-design-SKILL.md), token files; for web, also include the **showcase page** (atomix-setup-showcase.html) if getDependencies returned a \\`showcase\\` object.\n- Do not write, create, or add anything in Phase 1.\n\n## Phase 2 – Report and ask\n\n- Reply with: **Suggested:** [list] and **Already present:** [list].\n- Ask exactly once: \"Do you want me to add the suggested items? (Yes for all, or say which ones.)\"\n- **Stop.** Wait for the user to reply. Do not run Phase 3 in this response.\n\n## Phase 3 – Create (only after user approval)\n\n- Run only when the user has said yes (all or specific items).\n- For each approved item:\n - **Skills:** Prefer calling **syncAll** (it writes both skills into the repo). If writing manually, write getDependencies \\`skill.content\\` to \\`skill.path\\` and \\`skillFigmaDesign.content\\` to \\`skillFigmaDesign.path\\` under the project root.\n - **Token file and skills in repo:** Call **syncAll** with \\`output\\` set to the path (e.g. \"./src/tokens.css\" or \"./tokens.css\") and **workspaceRoot** set to the absolute path of the current project/workspace root. This ensures .cursor/skills/atomix-ds/SKILL.md, .cursor/skills/atomix-ds/figma-design-SKILL.md, and atomix-dependencies.json are written inside the repo so they can be committed. You must call syncAll; do not only suggest the user run it later.\n - **Icon package:** Install per getDependencies. When rendering icons, apply the design system's icon tokens: use getToken(\\`sizing.icon.*\\`) or listTokens(\\`sizing\\`) for size, and getToken(\\`icons.strokeWidth\\`) for stroke width when the DS defines it; do not use hardcoded sizes or stroke widths.\n - **Fonts and typeset:** Add font links (e.g. \\`<link>\\` or \\`@import\\` from Google Fonts). Then build a **complete typeset CSS**: call **listTypesets** to get every typeset from the owner's design system (do not skip any). Emit **one CSS rule per typeset** using the \\`cssClass\\` and the \\`fontFamilyVar\\`, \\`fontSizeVar\\`, \\`fontWeightVar\\`, \\`lineHeightVar\\` (and \\`letterSpacingVar\\`, \\`textTransformVar\\`, \\`textDecorationVar\\` when present) returned by listTypesets. Include text-transform and text-decoration when the typeset has them so the result is **1:1** with the design system. The typeset file must define the full type scale—not only a font import. Do not create a CSS file that contains only a font import.\n - **Showcase page (web only):** If platform is web and getDependencies returned a \\`showcase\\` object, create the file at \\`showcase.path\\` using \\`showcase.template\\`. Replace every placeholder per \\`showcase.substitutionInstructions\\`: TOKENS_CSS_PATH, TYPESETS_LINK, DS_NAME, HEADING_FONT_VAR, FONT_FAMILY_VAR, LARGEST_DISPLAY_TYPESET_CLASS, LARGEST_BODY_TYPESET_CLASS, BODY_TYPESET_CLASS, FONT_LINK_TAG, BRAND_PRIMARY_VAR, BUTTON_PADDING_VAR, BUTTON_HEIGHT_VAR, BUTTON_RADIUS_VAR, CIRCLE_PADDING_VAR, ICON_SIZE_VAR, CHECK_ICON_SVG (inline SVG from the design system icon library). The page uses semantic colors (mode-aware) and a Dark/Light toggle. Use only CSS variable names that exist in the synced token file. Do not change the HTML structure. After creating the file, launch it in the default browser (e.g. \\`open atomix-setup-showcase.html\\` on macOS, \\`xdg-open atomix-setup-showcase.html\\` on Linux, or the equivalent on Windows).\n- Report only what you actually created or updated. Do not claim the token file was added if you did not call syncAll.\n- **After reporting – styles/theme:**\n - **Web:** If the project already has at least one CSS file: recommend how to integrate Atomix (e.g. import the synced tokens file, use \\`var(--atmx-*)\\`). Do not suggest a new global CSS. Only if there is **no** CSS file at all, ask once: \"There are no CSS files yet. Do you want me to build a global typeset from the design system?\" If yes, create a CSS file that includes: (1) font \\`@import\\` or document that a font link is needed, and (2) **typeset rules**—call **listTypesets** and emit **one CSS class per typeset** (do not skip any). For each class set font-family, font-size, font-weight, line-height, letter-spacing; when the typeset has text-transform or text-decoration, set those too for a 1:1 match. Use the CSS variable names returned by listTypesets. The output must not be only a font import; it must define every typeset with every style detail from the design system.\n - **iOS/Android:** If the project already has theme/style files: recommend how to integrate Atomix tokens. Do not suggest a new global theme. Only if there is **no** theme/style at all, ask once: \"There's no theme/style setup yet. Do you want a minimal token-based theme?\" and add only if the user says yes.\n\nCreate your todo list first, then Phase 1 (resolve platform/stack, call getDependencies, scan, build lists), then Phase 2 (report and ask). Do not perform Phase 3 until the user replies.`;\n return withMcpNotice({\n description: \"Get started with design system in project (/--get-started). Create todo list; Phase 1 scan, Phase 2 report and ask, Phase 3 create only after user approval.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: setupInstructions,\n },\n },\n ],\n });\n }\n\n default:\n throw new Error(`Unknown prompt: ${name}`);\n }\n});\n\nfunction generateWelcomeMessage(data: DesignSystemData, stats: ReturnType<typeof getTokenStats>): string {\n const tokenSummary = Object.entries(stats.byCategory)\n .map(([cat, count]) => `${cat}: ${count}`)\n .join(\", \");\n\n const asciiArt = `\n\\`\\`\\`\n ↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘ \n\\`\\`\\`\n`;\n\n return `${asciiArt}\n# Welcome to ${data.meta.name}\n\n## Design System Overview\n\n| Metric | Value |\n|--------|-------|\n| Name | ${data.meta.name} |\n| DS ID | ${dsId} |\n| Total Tokens | ${stats.total} |\n| CSS Variables | ${stats.cssVariables} |\n| Governance Rules | ${stats.governanceRules} |\n| Version | ${data.meta.version || 1} |\n\n### Token breakdown\n\n${tokenSummary}\n\n---\n\n## Essential commands\n\n| Command | What to expect |\n|---------|----------------|\n| **/--hello** | Get started - overview, tokens, and tools. Run this first! |\n| **/--get-started** | Get started with design system in project. Three phases; creates files only after you approve. |\n| **/--rules** | Governance rules for your AI tool (e.g. Cursor, Copilot, Windsurf). |\n| **/--sync** | Sync tokens, rules, skills, and dependencies manifest (icons, fonts). Safe: adds new, updates existing, marks deprecated. |\n| **/--sync-to-figma** | Push design system to Figma (variables, paint/text/effect styles). Uses built-in bridge + Atomix plugin; connect plugin in Figma then run. Available on all tiers. |\n| **/--design-in-figma** | Design in Figma: loads Figma design skill and use designInFigma tool (catalog, query, execute). Pro only. |\n| **/--refactor** | Migrate deprecated tokens in codebase. Run after /--sync. |\n\n**Suggested next step:** Run **/--get-started** to set up global styles, icons, fonts, and token files; the AI will list options and ask before adding anything.\n\n---\n\n*Atomix Studio — https://atomix.studio | DS: https://atomix.studio/ds/${dsId}*\n`;\n}\n\n\n// ============================================\n// START SERVER\n// ============================================\n\nasync function startServer() {\n if (!dsId) {\n console.error(\"Error: Missing --ds-id argument\");\n console.error(\"Usage: npx @atomixstudio/mcp@latest --ds-id <id> --atomix-token <token>\");\n console.error(\"Get your DS ID and Atomix access token from account settings.\");\n console.error(\"\");\n process.exit(1);\n }\n if (!accessToken) {\n console.error(\"Error: Missing --atomix-token argument\");\n console.error(\"Usage: npx @atomixstudio/mcp@latest --ds-id <id> --atomix-token <token>\");\n console.error(\"Get your DS ID and Atomix access token from account settings.\");\n console.error(\"\");\n process.exit(1);\n }\n\n startFigmaBridge();\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error(`Atomix MCP Server started for design system: ${dsId}`);\n console.error(`Atomix MCP API base: ${apiBase}`);\n console.error(\n \"If you switched MCP config (e.g. free vs pro DS), restart your AI tool so this process uses the new --ds-id and --atomix-token.\"\n );\n}\n\nfunction onShutdown(): void {\n closeFigmaBridge();\n}\n\nprocess.on(\"SIGINT\", onShutdown);\nprocess.on(\"SIGTERM\", onShutdown);\n\n// When the MCP is disabled in the AI tool (or the client closes the pipe), we close\n// the Figma bridge so the plugin's WebSocket closes and the plugin UI shows disconnected.\n// For that to happen, the AI tool must terminate this process or close stdin when the user\n// disables this MCP (even if other MCPs remain enabled).\nprocess.stdin.on(\"end\", onShutdown);\nprocess.stdin.on(\"close\", onShutdown);\n\n// Start MCP server (no CLI commands - this is MCP-only)\nasync function main() {\n await startServer();\n}\n\nmain().catch((error) => {\n console.error(\"Failed:\", error);\n process.exit(1);\n});\n\n","/**\n * Core Types for Atomix Sync\n * \n * Shared types used across CLI and MCP implementations.\n */\n\nexport interface ExportedTokens {\n tokens: {\n colors: {\n static: { brand: Record<string, string> };\n modes: { light: Record<string, string>; dark: Record<string, string> };\n };\n typography: Record<string, unknown>;\n spacing: { scale: Record<string, string> };\n sizing: { height: Record<string, string>; icon: Record<string, string> };\n shadows: { elevation: Record<string, string> };\n radius: { scale: Record<string, string> };\n borders: { width: Record<string, string> };\n motion: { duration: Record<string, string>; easing: Record<string, string> };\n zIndex: Record<string, number>;\n };\n cssVariables: Record<string, string>;\n governance: {\n rules: string[];\n categories: Record<string, string[]>;\n };\n meta: {\n name: string;\n version: number;\n exportedAt: string;\n /** Set when request used Bearer MCP token; DS owner tier for Pro Figma gating. */\n mcpTier?: \"free\" | \"pro\";\n /** Latest @atomixstudio/mcp version; MCP uses this to show \"update available\" and testing tips. */\n mcpLatestVersion?: string;\n };\n}\n\nexport interface DesignSystemData {\n tokens: ExportedTokens[\"tokens\"];\n cssVariables: Record<string, string>;\n governance: ExportedTokens[\"governance\"];\n meta: ExportedTokens[\"meta\"];\n}\n\nexport type OutputFormat = \n | \"css\" | \"scss\" | \"less\" // Web CSS-based\n | \"json\" | \"ts\" | \"js\" // Web JS-based\n | \"swift\" | \"kotlin\" | \"dart\"; // Native mobile\n\nexport interface AtomixConfig {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n output: string;\n format: OutputFormat;\n // For future codebase scanning\n include?: string[]; // Glob patterns to include\n exclude?: string[]; // Glob patterns to exclude\n}\n\nexport interface SyncOptions {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n output: string;\n format: OutputFormat;\n yes?: boolean; // Auto-confirm\n rules?: boolean; // Also sync rules files\n rulesDir?: string; // Directory for rules files\n etag?: string; // Cached ETag for conditional requests\n}\n\nexport interface SyncResult {\n success: boolean;\n tokenCount: number;\n deprecatedCount: number;\n etag?: string;\n status?: 200 | 304;\n changes?: DiffResult;\n error?: string;\n}\n\nexport interface DiffResult {\n added: string[];\n modified: Array<{ key: string; old: string; new: string }>;\n removed: string[];\n addedDark: string[];\n modifiedDark: Array<{ key: string; old: string; new: string }>;\n removedDark: string[];\n}\n\nexport interface ChangeSummary {\n hasChanges: boolean;\n versionChanged: boolean;\n timestampChanged: boolean;\n addedTokens: string[];\n removedTokens: string[];\n modifiedTokens: Array<{ token: string; oldValue: string; newValue: string }>;\n governanceChanged: boolean;\n summary: string;\n}\n\nexport interface FetchOptions {\n dsId: string;\n apiKey?: string;\n /** MCP access token; when set, sent as Authorization: Bearer (takes precedence over apiKey for auth). */\n accessToken?: string;\n apiBase?: string;\n etag?: string; // Send If-None-Match header\n forceRefresh?: boolean;\n}\n\nexport interface FetchResult {\n data: DesignSystemData | null; // null if 304 Not Modified\n etag: string;\n status: 200 | 304;\n}\n\n// Default file patterns for codebase scanning\nexport const DEFAULT_INCLUDE = [\n \"**/*.tsx\", // React TypeScript components\n \"**/*.jsx\", // React JavaScript components\n \"**/*.ts\", // TypeScript files\n \"**/*.js\", // JavaScript files\n \"**/*.css\", // CSS stylesheets\n \"**/*.scss\", // SASS files\n \"**/*.less\", // Less files\n \"**/*.vue\", // Vue components\n \"**/*.svelte\", // Svelte components\n \"**/*.astro\", // Astro components\n];\n\nexport const DEFAULT_EXCLUDE = [\n \"node_modules/**\",\n \"dist/**\",\n \"build/**\",\n \".next/**\",\n \".nuxt/**\",\n \".git/**\",\n \"coverage/**\",\n \"**/*.min.js\",\n \"**/*.min.css\",\n \"**/*.d.ts\", // Type definitions\n \"**/*.test.*\", // Test files\n \"**/*.spec.*\", // Spec files\n];\n","/**\n * Fetch Design System Data\n * \n * Handles fetching design system tokens from API with ETag support.\n */\n\nimport type { DesignSystemData, ExportedTokens, FetchOptions, FetchResult, ChangeSummary } from './types.js';\n\n/**\n * Generate ETag from design system metadata\n */\nexport function generateETag(meta: { version: number; updatedAt: string }): string {\n const hash = `${meta.version}-${meta.updatedAt}`;\n return `\"v${hash}\"`; // ETag format: \"v1.0-2024-01-01T00:00:00Z\"\n}\n\n/**\n * Compare two design systems and return change summary\n */\nexport function compareDesignSystems(\n cached: DesignSystemData,\n fresh: DesignSystemData\n): ChangeSummary {\n const changes: ChangeSummary = {\n hasChanges: false,\n versionChanged: false,\n timestampChanged: false,\n addedTokens: [],\n removedTokens: [],\n modifiedTokens: [],\n governanceChanged: false,\n summary: \"\",\n };\n\n // Compare metadata\n if (cached.meta.version !== fresh.meta.version) {\n changes.versionChanged = true;\n changes.hasChanges = true;\n }\n\n if (cached.meta.exportedAt !== fresh.meta.exportedAt) {\n changes.timestampChanged = true;\n changes.hasChanges = true;\n }\n\n // Compare CSS variables (includes all tokens: spacing, typography, colors, etc.)\n const cachedVars = Object.keys(cached.cssVariables);\n const freshVars = Object.keys(fresh.cssVariables);\n\n // Find added tokens (all categories)\n for (const varName of freshVars) {\n if (!(varName in cached.cssVariables)) {\n changes.addedTokens.push(varName);\n changes.hasChanges = true;\n }\n }\n\n // Find removed tokens (all categories)\n for (const varName of cachedVars) {\n if (!(varName in fresh.cssVariables)) {\n changes.removedTokens.push(varName);\n changes.hasChanges = true;\n }\n }\n\n // Find modified tokens (all categories)\n for (const varName of cachedVars) {\n if (varName in fresh.cssVariables) {\n const oldValue = cached.cssVariables[varName];\n const newValue = fresh.cssVariables[varName];\n if (oldValue !== newValue) {\n changes.modifiedTokens.push({\n token: varName,\n oldValue,\n newValue,\n });\n changes.hasChanges = true;\n }\n }\n }\n\n // Compare dark mode colors (stored separately in tokens.colors.modes.dark)\n // These are NOT in cssVariables, so we need to compare them separately\n const cachedDark = (cached.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n const freshDark = (fresh.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n const cachedDarkColors = cachedDark?.dark || {};\n const freshDarkColors = freshDark?.dark || {};\n \n const cachedDarkKeys = Object.keys(cachedDarkColors);\n const freshDarkKeys = Object.keys(freshDarkColors);\n\n // Detect CSS variable prefix from existing cssVariables (fallback to --atmx-color-)\n const firstColorVar = cachedVars.find(v => v.includes(\"-color-\")) || freshVars.find(v => v.includes(\"-color-\"));\n const prefixMatch = firstColorVar?.match(/^(--[a-z]+-color-)/);\n const colorPrefix = prefixMatch ? prefixMatch[1] : \"--atmx-color-\";\n\n // Find added dark mode colors\n for (const key of freshDarkKeys) {\n if (!(key in cachedDarkColors)) {\n const cssVarName = `${colorPrefix}${key}`;\n // Only add if not already in the list (avoid duplicates)\n if (!changes.addedTokens.includes(cssVarName)) {\n changes.addedTokens.push(cssVarName);\n changes.hasChanges = true;\n }\n }\n }\n\n // Find removed dark mode colors\n for (const key of cachedDarkKeys) {\n if (!(key in freshDarkColors)) {\n const cssVarName = `${colorPrefix}${key}`;\n if (!changes.removedTokens.includes(cssVarName)) {\n changes.removedTokens.push(cssVarName);\n changes.hasChanges = true;\n }\n }\n }\n\n // Find modified dark mode colors\n for (const key of cachedDarkKeys) {\n if (key in freshDarkColors) {\n const oldValue = cachedDarkColors[key];\n const newValue = freshDarkColors[key];\n if (oldValue !== newValue) {\n const cssVarName = `${colorPrefix}${key}`;\n // Check if we already have this token in modified list (might be a light mode change too)\n const existingIndex = changes.modifiedTokens.findIndex(m => m.token === cssVarName);\n if (existingIndex >= 0) {\n // Update existing entry to show both light and dark changes\n changes.modifiedTokens[existingIndex].oldValue += ` | dark: ${oldValue}`;\n changes.modifiedTokens[existingIndex].newValue += ` | dark: ${newValue}`;\n } else {\n // Add new dark mode-only change\n changes.modifiedTokens.push({\n token: `${cssVarName} (dark mode)`,\n oldValue,\n newValue,\n });\n changes.hasChanges = true;\n }\n }\n }\n }\n\n // Compare governance rules (AI guide changes)\n // Compare both the rules array and categories object\n const cachedGovernance = cached.governance || { rules: [], categories: {} };\n const freshGovernance = fresh.governance || { rules: [], categories: {} };\n \n const cachedRules = cachedGovernance.rules || [];\n const freshRules = freshGovernance.rules || [];\n const cachedCategories = cachedGovernance.categories || {};\n const freshCategories = freshGovernance.categories || {};\n \n // Compare rules array (deep comparison)\n const cachedRulesStr = JSON.stringify(cachedRules.sort());\n const freshRulesStr = JSON.stringify(freshRules.sort());\n \n // Compare categories object (deep comparison)\n const cachedCategoriesStr = JSON.stringify(cachedCategories, Object.keys(cachedCategories).sort());\n const freshCategoriesStr = JSON.stringify(freshCategories, Object.keys(freshCategories).sort());\n \n if (cachedRulesStr !== freshRulesStr || cachedCategoriesStr !== freshCategoriesStr) {\n changes.governanceChanged = true;\n changes.hasChanges = true;\n }\n\n // Build summary text\n const summaryLines: string[] = [];\n \n if (!changes.hasChanges) {\n summaryLines.push(\"✓ No changes detected - design system is up to date\");\n } else {\n summaryLines.push(\"📦 Design System Changes Detected:\");\n summaryLines.push(\"\");\n\n if (changes.versionChanged) {\n summaryLines.push(` Version: ${cached.meta.version} → ${fresh.meta.version}`);\n }\n\n if (changes.timestampChanged) {\n const cachedDate = new Date(cached.meta.exportedAt).toLocaleString();\n const freshDate = new Date(fresh.meta.exportedAt).toLocaleString();\n summaryLines.push(` Published: ${cachedDate} → ${freshDate}`);\n }\n\n if (changes.addedTokens.length > 0) {\n summaryLines.push(` ➕ Added: ${changes.addedTokens.length} token(s)`);\n if (changes.addedTokens.length <= 10) {\n changes.addedTokens.forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n } else {\n changes.addedTokens.slice(0, 10).forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n summaryLines.push(` ... and ${changes.addedTokens.length - 10} more`);\n }\n }\n\n if (changes.removedTokens.length > 0) {\n summaryLines.push(` ➖ Removed: ${changes.removedTokens.length} token(s)`);\n if (changes.removedTokens.length <= 10) {\n changes.removedTokens.forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n } else {\n changes.removedTokens.slice(0, 10).forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n summaryLines.push(` ... and ${changes.removedTokens.length - 10} more`);\n }\n }\n\n if (changes.modifiedTokens.length > 0) {\n summaryLines.push(` 🔄 Modified: ${changes.modifiedTokens.length} token(s)`);\n if (changes.modifiedTokens.length <= 10) {\n changes.modifiedTokens.forEach(({ token, oldValue, newValue }) => {\n summaryLines.push(` ${token}:`);\n summaryLines.push(` - ${oldValue}`);\n summaryLines.push(` + ${newValue}`);\n });\n } else {\n changes.modifiedTokens.slice(0, 5).forEach(({ token, oldValue, newValue }) => {\n summaryLines.push(` ${token}:`);\n summaryLines.push(` - ${oldValue}`);\n summaryLines.push(` + ${newValue}`);\n });\n summaryLines.push(` ... and ${changes.modifiedTokens.length - 5} more`);\n }\n }\n\n if (changes.governanceChanged) {\n summaryLines.push(` 📝 AI guide updated`);\n }\n }\n\n changes.summary = summaryLines.join(\"\\n\");\n return changes;\n}\n\n/**\n * Detect which foundations have governance changes\n * \n * Compares cached vs fresh governance data and returns an array of foundation names\n * that have changed (e.g., [\"general\", \"colors\", \"typography\"]).\n * \n * @param cached - Previously cached design system data\n * @param fresh - Freshly fetched design system data\n * @returns Array of foundation names that have governance changes\n */\nexport function detectGovernanceChangesByFoundation(\n cached: DesignSystemData,\n fresh: DesignSystemData\n): string[] {\n const changes: string[] = [];\n \n const cachedGov = cached.governance || { rules: [], categories: {} };\n const freshGov = fresh.governance || { rules: [], categories: {} };\n \n // Check general rules (rules array)\n const cachedRulesStr = JSON.stringify((cachedGov.rules || []).sort());\n const freshRulesStr = JSON.stringify((freshGov.rules || []).sort());\n if (cachedRulesStr !== freshRulesStr) {\n changes.push(\"general\");\n }\n \n // Check foundation-specific rules (categories object)\n const cachedCategories = cachedGov.categories || {};\n const freshCategories = freshGov.categories || {};\n \n const allFoundationKeys = new Set([\n ...Object.keys(cachedCategories),\n ...Object.keys(freshCategories),\n ]);\n \n for (const foundation of allFoundationKeys) {\n const cachedRules = cachedCategories[foundation] || [];\n const freshRules = freshCategories[foundation] || [];\n const cachedRulesStr = JSON.stringify(cachedRules.sort());\n const freshRulesStr = JSON.stringify(freshRules.sort());\n \n if (cachedRulesStr !== freshRulesStr) {\n changes.push(foundation);\n }\n }\n \n return changes;\n}\n\n/**\n * Fetch design system from API with ETag support\n */\nexport async function fetchDesignSystem(options: FetchOptions): Promise<FetchResult> {\n const { dsId, apiKey, accessToken, apiBase = \"https://atomix.studio\", etag, forceRefresh = false } = options;\n\n if (!dsId) {\n throw new Error(\"Missing dsId. Usage: fetchDesignSystem({ dsId: '...' })\");\n }\n\n const url = `${apiBase}/api/ds/${dsId}/tokens?format=export`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n } else if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n \n // Send If-None-Match if we have cached ETag\n if (etag) {\n headers[\"if-none-match\"] = etag;\n }\n\n const response = await fetch(url, { headers });\n \n if (response.status === 304) {\n // Not Modified - return null data, same ETag\n return {\n data: null,\n etag: etag!,\n status: 304,\n };\n }\n \n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to fetch design system: ${response.status} ${text}`);\n }\n\n const data = await response.json() as ExportedTokens;\n \n // Extract ETag from response header or generate from meta\n const responseETag = response.headers.get('etag');\n const finalETag = responseETag || generateETag({ version: data.meta.version, updatedAt: data.meta.exportedAt });\n \n // Transform to DesignSystemData format\n const designSystemData: DesignSystemData = {\n tokens: data.tokens,\n cssVariables: data.cssVariables,\n governance: data.governance,\n meta: data.meta,\n };\n \n return {\n data: designSystemData,\n etag: finalETag,\n status: 200,\n };\n}\n","/**\n * Core Sync Function\n * \n * Unified sync logic used by both CLI and MCP.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { SyncOptions, SyncResult, DesignSystemData, OutputFormat, DiffResult } from './types.js';\nimport { fetchDesignSystem } from './fetch.js';\nimport { diffTokens } from './diff.js';\nimport { syncRulesFiles } from './rules.js';\nimport {\n generateCSSOutput,\n generateSCSSOutput,\n generateLessOutput,\n generateJSONOutput,\n generateTSOutput,\n generateJSOutput,\n generateSwiftOutput,\n generateKotlinOutput,\n generateDartOutput,\n} from './formats/index.js';\n\n/**\n * Sync design tokens to a local file\n */\nexport async function syncTokens(options: SyncOptions): Promise<SyncResult> {\n const {\n dsId,\n apiKey,\n apiBase = \"https://atomix.studio\",\n output,\n format,\n yes = false,\n rules = true, // Default to true (sync rules by default)\n rulesDir,\n etag, // Optional cached ETag\n } = options;\n\n try {\n // Fetch design system with ETag support\n const fetchResult = await fetchDesignSystem({\n dsId,\n apiKey,\n apiBase,\n etag,\n forceRefresh: true,\n });\n\n // Handle 304 Not Modified\n if (fetchResult.status === 304) {\n return {\n success: true,\n tokenCount: 0,\n deprecatedCount: 0,\n etag: fetchResult.etag,\n status: 304,\n };\n }\n\n if (!fetchResult.data) {\n return {\n success: false,\n tokenCount: 0,\n deprecatedCount: 0,\n error: \"No data returned from API\",\n };\n }\n\n const data = fetchResult.data;\n\n // Check if file exists first to detect deprecated tokens\n const outputPath = path.resolve(process.cwd(), output);\n const fileExists = fs.existsSync(outputPath);\n \n // Read old file if it exists\n const deprecatedTokens: Map<string, string> = new Map();\n const existingTokens: Map<string, string> = new Map();\n \n if (fileExists) {\n if ([\"css\", \"scss\", \"less\"].includes(format)) {\n // For CSS-based formats, extract CSS variables\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n // Improved regex: handles comments before variables, supports uppercase/numbers in prefix\n const oldVarPattern = /(?:^|\\n)\\s*(?:\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*\\/\\s*)?(--[a-zA-Z0-9-]+):\\s*([^;]+);/gm;\n let match;\n while ((match = oldVarPattern.exec(oldContent)) !== null) {\n const varName = match[1];\n const varValue = match[2].trim();\n \n existingTokens.set(varName, varValue);\n \n // Mark as deprecated if NOT in design system (kept for backward compatibility)\n if (!(varName in data.cssVariables)) {\n deprecatedTokens.set(varName, varValue);\n }\n }\n } else if ([\"swift\", \"kotlin\", \"dart\"].includes(format)) {\n // For native formats, extract tokens and convert to CSS variable names\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n let tokenPattern: RegExp;\n \n if (format === \"swift\") {\n tokenPattern = /static\\s+let\\s+(\\w+)\\s*=\\s*[^;]+;/g;\n } else if (format === \"kotlin\") {\n tokenPattern = /val\\s+(\\w+)\\s*=\\s*[^;]+/g;\n } else {\n tokenPattern = /static\\s+const\\s+(\\w+)\\s*=\\s*[^;]+;/g;\n }\n \n let match;\n while ((match = tokenPattern.exec(oldContent)) !== null) {\n const nativeName = match[1];\n // Convert native name to CSS variable name (approximate)\n const kebab = nativeName\n .replace(/([A-Z])/g, \"-$1\")\n .toLowerCase()\n .replace(/^-/, \"\");\n const cssVarName = `--atmx-${kebab}`;\n \n existingTokens.set(cssVarName, \"\");\n \n // Mark as deprecated if NOT in design system\n if (!(cssVarName in data.cssVariables)) {\n deprecatedTokens.set(cssVarName, \"\");\n }\n }\n }\n }\n \n // Always use DS tokens (deprecated tokens are kept via generateXOutput functions)\n const mergedCssVariables = { ...data.cssVariables };\n\n // Generate new content based on format\n // Get dark mode colors for CSS output\n const darkModeColors = (data.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n // Use mergedCssVariables for CSS-based formats (supports merge mode)\n let newContent: string;\n switch (format) {\n case \"css\":\n newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"scss\":\n newContent = generateSCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"less\":\n newContent = generateLessOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"json\":\n newContent = generateJSONOutput(data.tokens);\n break;\n case \"js\":\n newContent = generateJSOutput(data.tokens);\n break;\n case \"ts\":\n newContent = generateTSOutput(data.tokens);\n break;\n case \"swift\":\n newContent = generateSwiftOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"kotlin\":\n newContent = generateKotlinOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"dart\":\n newContent = generateDartOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n default:\n newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n }\n\n // CSS-based formats support diffing\n const supportsDiff = [\"css\", \"scss\", \"less\"].includes(format);\n const deprecatedCount = deprecatedTokens.size;\n let diffResult: DiffResult | undefined;\n \n if (fileExists && supportsDiff) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n diffResult = diffTokens(oldContent, mergedCssVariables, format as OutputFormat, darkModeColors?.dark);\n\n // Count changes (deprecated tokens are kept, not removed)\n const lightChanges = diffResult.added.length + diffResult.modified.length;\n const darkChanges = diffResult.addedDark.length + diffResult.modifiedDark.length;\n const totalChanges = lightChanges + darkChanges + deprecatedCount;\n\n if (totalChanges === 0) {\n // Already up to date - return early\n return {\n success: true,\n tokenCount: Object.keys(mergedCssVariables).length,\n deprecatedCount,\n etag: fetchResult.etag,\n status: 200,\n changes: diffResult,\n };\n }\n }\n\n // Write file\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n fs.writeFileSync(outputPath, newContent);\n\n // Sync rules files if requested\n let rulesResults;\n if (rules) {\n rulesResults = await syncRulesFiles({\n dsId,\n apiKey,\n apiBase,\n rulesDir,\n });\n }\n\n return {\n success: true,\n tokenCount: Object.keys(mergedCssVariables).length,\n deprecatedCount,\n etag: fetchResult.etag,\n status: 200,\n changes: diffResult,\n };\n } catch (error) {\n return {\n success: false,\n tokenCount: 0,\n deprecatedCount: 0,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","/**\n * Diff Logic\n * \n * Functions for comparing token files and detecting changes.\n */\n\nimport type { OutputFormat, DiffResult } from './types.js';\n\nexport function diffTokens(\n oldContent: string,\n newCssVars: Record<string, string>,\n format: OutputFormat,\n newDarkVars?: Record<string, string>\n): DiffResult {\n const added: string[] = [];\n const modified: Array<{ key: string; old: string; new: string }> = [];\n const removed: string[] = [];\n const addedDark: string[] = [];\n const modifiedDark: Array<{ key: string; old: string; new: string }> = [];\n const removedDark: string[] = [];\n\n // CSS-based formats (css, scss, less) all use CSS variables\n if (format === \"css\" || format === \"scss\" || format === \"less\") {\n // Split old content into light mode (:root) and dark mode (.dark) sections\n // Find the :root section\n const rootMatch = oldContent.match(/:root\\s*\\{([^}]*)\\}/);\n const darkMatch = oldContent.match(/\\.dark[^{]*\\{([^}]*)\\}/);\n \n // Parse light mode variables from :root\n const oldLightVars: Record<string, string> = {};\n if (rootMatch) {\n const rootContent = rootMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(rootContent)) !== null) {\n oldLightVars[match[1]] = match[2].trim();\n }\n } else {\n // Fallback: parse everything (old behavior for files without sections)\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(oldContent)) !== null) {\n // Only take the first occurrence to get light mode values\n if (!(match[1] in oldLightVars)) {\n oldLightVars[match[1]] = match[2].trim();\n }\n }\n }\n\n // Parse dark mode variables from .dark\n const oldDarkVars: Record<string, string> = {};\n if (darkMatch) {\n const darkContent = darkMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(darkContent)) !== null) {\n oldDarkVars[match[1]] = match[2].trim();\n }\n }\n\n // Compare light mode\n for (const [key, value] of Object.entries(newCssVars)) {\n if (!(key in oldLightVars)) {\n added.push(key);\n } else if (oldLightVars[key] !== value) {\n modified.push({ key, old: oldLightVars[key], new: value });\n }\n }\n\n for (const key of Object.keys(oldLightVars)) {\n if (!(key in newCssVars)) {\n removed.push(key);\n }\n }\n\n // Compare dark mode if new dark vars provided\n if (newDarkVars && Object.keys(newDarkVars).length > 0) {\n // Generate the expected CSS variable names for dark mode\n // newDarkVars keys are like \"bg-page\", need to match \"--atmx-color-bg-page\"\n const firstKey = Object.keys(newCssVars)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n\n for (const [key, value] of Object.entries(newDarkVars)) {\n const cssVarName = `${prefix}color-${key}`;\n if (!(cssVarName in oldDarkVars)) {\n addedDark.push(cssVarName);\n } else if (oldDarkVars[cssVarName] !== value) {\n modifiedDark.push({ key: cssVarName, old: oldDarkVars[cssVarName], new: value });\n }\n }\n\n for (const key of Object.keys(oldDarkVars)) {\n // Extract the short key from --atmx-color-bg-page -> bg-page\n const shortKey = key.replace(new RegExp(`^${prefix}color-`), \"\");\n if (!(shortKey in newDarkVars)) {\n removedDark.push(key);\n }\n }\n }\n }\n\n return { added, modified, removed, addedDark, modifiedDark, removedDark };\n}\n","/**\n * Rules File Syncing\n * \n * Functions for syncing AI tool rules files.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface SyncRulesOptions {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n rulesDir?: string;\n}\n\nexport interface RulesFileResult {\n tool: string;\n filename: string;\n path: string;\n success: boolean;\n error?: string;\n}\n\nexport async function syncRulesFiles(options: SyncRulesOptions): Promise<RulesFileResult[]> {\n const { dsId, apiKey, apiBase = \"https://atomix.studio\", rulesDir = process.cwd() } = options;\n \n const rulesDirResolved = path.resolve(process.cwd(), rulesDir);\n \n // Detect which AI tools are likely in use based on existing files\n const toolsToSync: Array<{ tool: string; filename: string; dir?: string }> = [\n { tool: \"cursor\", filename: \".cursorrules\" },\n { tool: \"windsurf\", filename: \".windsurfrules\" },\n { tool: \"cline\", filename: \".clinerules\" },\n { tool: \"continue\", filename: \".continuerules\" },\n { tool: \"copilot\", filename: \"copilot-instructions.md\", dir: \".github\" },\n { tool: \"generic\", filename: \"AI_GUIDELINES.md\" },\n ];\n \n // Check which tools have existing files or should be created\n const existingTools = toolsToSync.filter(t => {\n const filePath = t.dir \n ? path.join(rulesDirResolved, t.dir, t.filename)\n : path.join(rulesDirResolved, t.filename);\n return fs.existsSync(filePath);\n });\n \n // If no existing rules files, create .cursorrules by default\n const toolsToWrite = existingTools.length > 0 \n ? existingTools \n : [{ tool: \"cursor\", filename: \".cursorrules\" }];\n \n const results: RulesFileResult[] = [];\n \n for (const { tool, filename, dir } of toolsToWrite) {\n try {\n // Fetch rules from API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n \n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: `Failed to fetch ${tool} rules: ${response.status}`,\n });\n continue;\n }\n \n const rulesData = await response.json() as { content?: string };\n if (!rulesData.content) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: `No content for ${tool} rules`,\n });\n continue;\n }\n \n // Write the file\n const targetDir = dir ? path.join(rulesDirResolved, dir) : rulesDirResolved;\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n \n const filePath = path.join(targetDir, filename);\n fs.writeFileSync(filePath, rulesData.content);\n \n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: true,\n });\n } catch (error) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n \n return results;\n}\n","/**\n * CSS Format Generator\n * \n * Generates CSS output with CSS custom properties and dark mode support.\n */\n\nexport function generateCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"/* Atomix Design System Tokens\",\n \" * Auto-generated - do not edit manually\",\n ` * Synced: ${new Date().toISOString()}`,\n \" *\",\n \" * WARNING: This file is completely rewritten on each sync.\",\n \" * Only CSS custom properties (variables) are preserved.\",\n \" * Custom CSS rules (selectors, classes, etc.) will be lost.\",\n \" * Keep custom CSS in a separate file.\",\n \" */\",\n \"\",\n \"/* Light mode (default) */\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` /* DEPRECATED */ ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode overrides if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"/* Dark mode */\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n // Detect prefix from cssVariables keys\n const firstKey = sortedKeys[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n // Sort dark mode keys for consistent output\n const sortedDarkKeys = Object.keys(darkModeColors).sort();\n for (const key of sortedDarkKeys) {\n // Dark mode colors are stored with keys like \"bg-page\", \"text-primary\"\n // Convert to CSS variable names: --atmx-color-bg-page\n lines.push(` ${prefix}color-${key}: ${darkModeColors[key]};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * SCSS Format Generator\n * \n * Generates SCSS output with CSS variables and SCSS variables.\n */\n\nexport function generateSCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` // DEPRECATED ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = sortedKeys[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// SCSS Variables (light mode values)\");\n \n // Include deprecated tokens in SCSS variables too\n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n const scssVar = \"$\" + key.replace(/^--/, \"\");\n if (deprecated) {\n lines.push(`// DEPRECATED ${scssVar}: ${value};`);\n } else {\n lines.push(`${scssVar}: ${value};`);\n }\n }\n \n // Add dark mode SCSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// SCSS Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const scssVar = `$${prefix}-color-${key}-dark`;\n lines.push(`${scssVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * Less Format Generator\n * \n * Generates Less output with CSS variables and Less variables.\n */\n\nexport function generateLessOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` // DEPRECATED ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// Less Variables (light mode values)\");\n \n for (const [key, value] of Object.entries(cssVariables)) {\n const lessVar = \"@\" + key.replace(/^--/, \"\");\n lines.push(`${lessVar}: ${value};`);\n }\n \n // Add dark mode Less variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Less Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const lessVar = `@${prefix}-color-${key}-dark`;\n lines.push(`${lessVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * JSON Format Generator\n * \n * Generates JSON output with raw token structure.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateJSONOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return JSON.stringify(tokens, null, 2);\n}\n","/**\n * TypeScript Format Generator\n * \n * Generates TypeScript output with types.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateTSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)} as const;\n\nexport type Tokens = typeof tokens;\n`;\n}\n","/**\n * JavaScript Format Generator\n * \n * Generates JavaScript ES module output.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateJSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)};\n`;\n}\n","/**\n * Swift Format Generator\n * \n * Generates Swift/SwiftUI output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToSwiftColor(hex: string): string {\n // #RRGGBB or #RRGGBBAA\n const clean = hex.replace(\"#\", \"\");\n if (clean.length === 3) {\n // #RGB -> #RRGGBB\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(hex: 0x${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(hex: 0x${clean})`;\n }\n if (clean.length === 8) {\n // #RRGGBBAA\n const rgb = clean.substring(0, 6);\n const alpha = parseInt(clean.substring(6, 8), 16) / 255;\n return `Color(hex: 0x${rgb}).opacity(${alpha.toFixed(2)})`;\n }\n return `Color.clear // Could not parse: ${hex}`;\n}\n\nexport function generateSwiftOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import SwiftUI\",\n \"\",\n \"// MARK: - Color Extension for Hex\",\n \"extension Color {\",\n \" init(hex: UInt, alpha: Double = 1.0) {\",\n \" self.init(\",\n \" .sRGB,\",\n \" red: Double((hex >> 16) & 0xFF) / 255.0,\",\n \" green: Double((hex >> 8) & 0xFF) / 255.0,\",\n \" blue: Double(hex & 0xFF) / 255.0,\",\n \" opacity: alpha\",\n \" )\",\n \" }\",\n \"}\",\n \"\",\n \"// MARK: - Design Tokens\",\n \"enum DesignTokens {\",\n \"\",\n \" // MARK: Colors (Light Mode)\",\n \" enum Colors {\"\n ];\n\n // Group by category, including deprecated tokens\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toSwiftName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n } else {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // MARK: Colors (Dark Mode)\");\n lines.push(\" enum ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" // MARK: Spacing\");\n lines.push(\" enum Spacing {\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toSwiftName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n } else {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Typography\");\n lines.push(\" enum Typography {\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toSwiftName(key);\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n } else if (key.includes(\"weight\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n } else if (key.includes(\"family\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Other\");\n lines.push(\" enum Other {\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toSwiftName(key);\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n }\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n } else {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Kotlin Format Generator\n * \n * Generates Kotlin/Jetpack Compose output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toKotlinName(cssVar: string): string {\n // --atmx-color-brand-primary → ColorBrandPrimary\n const camel = toSwiftName(cssVar);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToKotlinColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n // RRGGBBAA -> AARRGGBB for Android\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Color.Transparent // Could not parse: ${hex}`;\n}\n\nexport function generateKotlinOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"package com.atomix.design\",\n \"\",\n \"import androidx.compose.ui.graphics.Color\",\n \"import androidx.compose.ui.unit.dp\",\n \"import androidx.compose.ui.unit.sp\",\n \"\",\n \"object DesignTokens {\",\n \"\",\n \" // Light mode colors\",\n \" object Colors {\"\n ];\n\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toKotlinName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n } else {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Dark mode colors\");\n lines.push(\" object ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `Color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" object Spacing {\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toKotlinName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n lines.push(` val ${name} = ${numValue}.dp`);\n } else {\n lines.push(` val ${name} = ${numValue}.dp`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Typography {\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toKotlinName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.sp`);\n }\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Other {\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toKotlinName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n }\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.dp`);\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Dart Format Generator\n * \n * Generates Dart/Flutter output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toDartName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary (same as Swift)\n return toSwiftName(cssVar);\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToDartColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Colors.transparent // Could not parse: ${hex}`;\n}\n\nexport function generateDartOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import 'package:flutter/material.dart';\",\n \"\",\n \"class DesignTokens {\",\n \" DesignTokens._();\",\n \"\",\n \" // Colors (Light Mode)\"\n ];\n\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toDartName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n } else {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n }\n\n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Colors (Dark Mode)\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}Dark`;\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Spacing\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toDartName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n lines.push(` static const double ${name} = ${numValue};`);\n } else {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Typography\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toDartName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Other\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toDartName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n }\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n }\n\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Format sync response for CLI and MCP\n * \n * Single source of truth for sync output formatting.\n * This ensures MCP and CLI have identical response formats.\n */\n\nimport * as path from \"path\";\nimport type { DesignSystemData, DiffResult } from './types.js';\nimport type { RulesFileResult } from './rules.js';\n\nexport interface FormatSyncResponseOptions {\n // Core data\n data: DesignSystemData;\n output: string;\n format: string;\n \n // Token counts\n dsTokenCount: number;\n deprecatedCount: number;\n deprecatedTokens: Map<string, string>;\n \n // Changes\n diff?: DiffResult;\n changes?: Array<{ key: string; old: string; new: string }>;\n fileExists: boolean;\n \n // Rules\n rulesResults?: RulesFileResult[];\n \n // Governance changes\n governanceChanges?: string[];\n changeSummary?: string | null;\n \n // Refactor info\n hasRefactorRecommendation?: boolean;\n deprecatedTokenCount?: number;\n}\n\n/**\n * Format enhanced sync response text\n * \n * Generates a comprehensive response with explicit lists of:\n * - Deprecated tokens (with values)\n * - New tokens\n * - Modified files (output + rules files)\n * - AI rules changes by foundation\n * - Detailed changes summary\n * - Refactor recommendations\n */\nexport function formatSyncResponse(options: FormatSyncResponseOptions): string {\n const {\n data,\n output,\n format,\n dsTokenCount,\n deprecatedCount,\n deprecatedTokens,\n diff,\n changes = [],\n fileExists,\n rulesResults = [],\n governanceChanges = [],\n changeSummary,\n hasRefactorRecommendation = false,\n deprecatedTokenCount = 0,\n } = options;\n\n const lastUpdated = data.meta.exportedAt \n ? new Date(data.meta.exportedAt).toLocaleString()\n : \"N/A\";\n\n let response = `✓ Synced ${dsTokenCount} tokens to ${output}\\n`;\n response += `Format: ${format}\\n`;\n response += `Design System: ${data.meta.name} (v${data.meta.version})\\n`;\n if (deprecatedCount > 0) {\n response += `Tokens: ${dsTokenCount} active, ${deprecatedCount} deprecated (run /refactor to migrate)\\n`;\n } else {\n response += `Tokens: ${dsTokenCount}\\n`;\n }\n response += `Version: ${data.meta.version}\\n`;\n response += `Last updated: ${lastUpdated}\\n`;\n\n // ============================================\n // SECTION 1: DEPRECATED TOKENS (Explicit List)\n // ============================================\n if (deprecatedCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📋 DEPRECATED TOKENS (${deprecatedCount})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `These tokens are no longer in the design system but are preserved in your file for backward compatibility.\\n`;\n response += `Run \\`/refactor\\` to find and migrate usage in your codebase.\\n\\n`;\n \n const deprecatedTokenList = Array.from(deprecatedTokens.keys()).sort();\n deprecatedTokenList.forEach((token, index) => {\n const value = deprecatedTokens.get(token);\n response += ` ${index + 1}. ${token}`;\n if (value) {\n response += ` = ${value}`;\n }\n response += `\\n`;\n });\n }\n\n // ============================================\n // SECTION 2: NEW TOKENS (Explicit List)\n // ============================================\n const newTokenList: string[] = [];\n if (diff) {\n newTokenList.push(...diff.added, ...diff.addedDark);\n }\n\n // Also include tokens from change summary if available\n if (changeSummary && changeSummary.includes(\"➕ Added:\")) {\n const addedSection = changeSummary.match(/➕ Added: \\d+ token\\(s\\)([\\s\\S]*?)(?=➖|🔄|📝|$)/);\n if (addedSection) {\n const addedLines = addedSection[0].match(/ - (--[^\\n]+)/g) || [];\n addedLines.forEach(line => {\n const token = line.replace(/ - /, \"\").trim();\n if (token && !newTokenList.includes(token)) {\n newTokenList.push(token);\n }\n });\n }\n }\n\n if (newTokenList.length > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `✨ NEW TOKENS (${newTokenList.length})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n newTokenList.sort().forEach((token, index) => {\n response += ` ${index + 1}. ${token}\\n`;\n });\n }\n\n // ============================================\n // SECTION 3: MODIFIED FILES (Explicit List)\n // ============================================\n const modifiedFiles: string[] = [output];\n\n // Add rules files that were synced\n rulesResults.forEach(result => {\n if (result.success) {\n const fullPath = path.resolve(process.cwd(), result.path);\n if (!modifiedFiles.includes(fullPath)) {\n modifiedFiles.push(fullPath);\n }\n }\n });\n\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📁 MODIFIED FILES (${modifiedFiles.length})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n modifiedFiles.forEach((file, index) => {\n const relativePath = path.relative(process.cwd(), file);\n response += ` ${index + 1}. ${relativePath}\\n`;\n });\n\n // ============================================\n // SECTION 4: AI RULES CHANGES (By Foundation)\n // ============================================\n if (governanceChanges.length > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📝 AI RULES CHANGES\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `The following AI guidance sections have been updated:\\n\\n`;\n \n // Capitalize foundation names\n const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n \n governanceChanges.forEach((foundation, index) => {\n const displayName = foundation === \"general\" \n ? \"General Rules\" \n : capitalize(foundation);\n response += ` ${index + 1}. ${displayName}\\n`;\n });\n \n response += `\\nThese changes are reflected in the design system governance; run /--sync to update the skill and call getRules for the latest rules.\\n`;\n }\n\n // ============================================\n // SECTION 5: DETAILED CHANGES (Keep existing)\n // ============================================\n if (diff) {\n const lightChanges = diff.added.length + diff.modified.length;\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length;\n \n if (lightChanges > 0 || darkChanges > 0 || deprecatedCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📊 DETAILED CHANGES\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n \n const lightSummary = lightChanges > 0 ? `Light: ${diff.modified.length} modified, ${diff.added.length} added` : \"\";\n const darkSummary = darkChanges > 0 ? `Dark: ${diff.modifiedDark.length} modified, ${diff.addedDark.length} added` : \"\";\n const deprecatedSummary = deprecatedCount > 0 ? `${deprecatedCount} deprecated (use /refactor)` : \"\";\n const diffSummary = [lightSummary, darkSummary, deprecatedSummary].filter(Boolean).join(\" | \");\n response += `${diffSummary}\\n`;\n \n if (changes.length > 0 && changes.length <= 10) {\n response += \"\\nModified tokens:\\n\";\n for (const { key, old: oldVal, new: newVal } of changes) {\n response += ` ${key}: ${oldVal} → ${newVal}\\n`;\n }\n }\n }\n } else if (!fileExists) {\n response += `\\n(New file created)\\n`;\n }\n\n // ============================================\n // SECTION 6: REFACTOR RECOMMENDATION\n // ============================================\n if (hasRefactorRecommendation && deprecatedTokenCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `💡 NEXT STEP\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `${deprecatedTokenCount} token(s) have been deprecated.\\n`;\n response += `Your codebase may still reference these deprecated tokens.\\n\\n`;\n response += `Run \\`/refactor\\` to:\\n`;\n response += ` • Scan your codebase for deprecated token usage\\n`;\n response += ` • See which files need updates\\n`;\n response += ` • Review and apply changes with your confirmation\\n`;\n }\n\n return response;\n}\n","/**\n * Token Utilities\n * \n * Functions for working with design tokens.\n */\n\nimport type { DesignSystemData } from './types.js';\n\nexport function getTokenByPath(tokens: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = tokens;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\nexport function flattenTokens(obj: unknown, prefix = \"\"): Array<{ path: string; value: unknown }> {\n const results: Array<{ path: string; value: unknown }> = [];\n\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n for (const [key, value] of Object.entries(obj)) {\n const newPath = prefix ? `${prefix}.${key}` : key;\n \n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n results.push(...flattenTokens(value, newPath));\n } else {\n results.push({ path: newPath, value });\n }\n }\n }\n\n return results;\n}\n\nexport function searchTokens(tokens: Record<string, unknown>, query: string): Array<{ path: string; value: unknown }> {\n const flat = flattenTokens(tokens);\n const lowerQuery = query.toLowerCase();\n \n return flat.filter(({ path, value }) => {\n const pathMatch = path.toLowerCase().includes(lowerQuery);\n const valueMatch = String(value).toLowerCase().includes(lowerQuery);\n return pathMatch || valueMatch;\n });\n}\n\nexport function countTokens(tokens: Record<string, unknown>, prefix = \"\"): number {\n let count = 0;\n for (const [key, value] of Object.entries(tokens)) {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n count += countTokens(value as Record<string, unknown>, `${prefix}${key}.`);\n } else if (value !== undefined && value !== null) {\n count++;\n }\n }\n return count;\n}\n\nexport function getTokenStats(data: DesignSystemData): {\n total: number;\n byCategory: Record<string, number>;\n cssVariables: number;\n governanceRules: number;\n} {\n const byCategory: Record<string, number> = {};\n let total = 0;\n\n for (const [category, value] of Object.entries(data.tokens)) {\n if (value && typeof value === \"object\") {\n const count = countTokens(value as Record<string, unknown>);\n byCategory[category] = count;\n total += count;\n }\n }\n\n return {\n total,\n byCategory,\n cssVariables: Object.keys(data.cssVariables).length,\n governanceRules: data.governance.rules.length,\n };\n}\n","/**\n * Config Management\n * \n * Functions for loading and managing .atomixrc configuration.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { AtomixConfig, DEFAULT_INCLUDE, DEFAULT_EXCLUDE } from './types.js';\n\nexport { DEFAULT_INCLUDE, DEFAULT_EXCLUDE } from './types.js';\n\nexport function findConfig(): AtomixConfig | null {\n const configNames = [\".atomixrc\", \".atomixrc.json\", \"atomix.config.json\"];\n const cwd = process.cwd();\n \n for (const name of configNames) {\n const configPath = path.join(cwd, name);\n if (fs.existsSync(configPath)) {\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n return JSON.parse(content) as AtomixConfig;\n } catch {\n console.error(`Error parsing ${name}`);\n }\n }\n }\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AexBP,YAAYA,WAAU;AbIf,SAAS,aAAa,MAAsD;AACjF,QAAM,OAAO,GAAG,KAAK,OAAO,IAAI,KAAK,SAAS;AAC9C,SAAO,KAAK,IAAI;AAClB;AAKO,SAAS,qBACd,QACA,OACe;AACf,QAAM,UAAyB;IAC7B,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;IAClB,aAAa,CAAC;IACd,eAAe,CAAC;IAChB,gBAAgB,CAAC;IACjB,mBAAmB;IACnB,SAAS;EACX;AAGA,MAAI,OAAO,KAAK,YAAY,MAAM,KAAK,SAAS;AAC9C,YAAQ,iBAAiB;AACzB,YAAQ,aAAa;EACvB;AAEA,MAAI,OAAO,KAAK,eAAe,MAAM,KAAK,YAAY;AACpD,YAAQ,mBAAmB;AAC3B,YAAQ,aAAa;EACvB;AAGA,QAAM,aAAa,OAAO,KAAK,OAAO,YAAY;AAClD,QAAM,YAAY,OAAO,KAAK,MAAM,YAAY;AAGhD,aAAW,WAAW,WAAW;AAC/B,QAAI,EAAE,WAAW,OAAO,eAAe;AACrC,cAAQ,YAAY,KAAK,OAAO;AAChC,cAAQ,aAAa;IACvB;EACF;AAGA,aAAW,WAAW,YAAY;AAChC,QAAI,EAAE,WAAW,MAAM,eAAe;AACpC,cAAQ,cAAc,KAAK,OAAO;AAClC,cAAQ,aAAa;IACvB;EACF;AAGA,aAAW,WAAW,YAAY;AAChC,QAAI,WAAW,MAAM,cAAc;AACjC,YAAM,WAAW,OAAO,aAAa,OAAO;AAC5C,YAAM,WAAW,MAAM,aAAa,OAAO;AAC3C,UAAI,aAAa,UAAU;AACzB,gBAAQ,eAAe,KAAK;UAC1B,OAAO;UACP;UACA;QACF,CAAC;AACD,gBAAQ,aAAa;MACvB;IACF;EACF;AAIA,QAAM,aAAc,OAAO,QAAQ,QAAoC;AACvE,QAAM,YAAa,MAAM,QAAQ,QAAoC;AAErE,QAAM,mBAAmB,YAAY,QAAQ,CAAC;AAC9C,QAAM,kBAAkB,WAAW,QAAQ,CAAC;AAE5C,QAAM,iBAAiB,OAAO,KAAK,gBAAgB;AACnD,QAAM,gBAAgB,OAAO,KAAK,eAAe;AAGjD,QAAM,gBAAgB,WAAW,KAAK,CAAA,MAAK,EAAE,SAAS,SAAS,CAAC,KAAK,UAAU,KAAK,CAAA,MAAK,EAAE,SAAS,SAAS,CAAC;AAC9G,QAAM,cAAc,eAAe,MAAM,oBAAoB;AAC7D,QAAM,cAAc,cAAc,YAAY,CAAC,IAAI;AAGnD,aAAW,OAAO,eAAe;AAC/B,QAAI,EAAE,OAAO,mBAAmB;AAC9B,YAAM,aAAa,GAAG,WAAW,GAAG,GAAG;AAEvC,UAAI,CAAC,QAAQ,YAAY,SAAS,UAAU,GAAG;AAC7C,gBAAQ,YAAY,KAAK,UAAU;AACnC,gBAAQ,aAAa;MACvB;IACF;EACF;AAGA,aAAW,OAAO,gBAAgB;AAChC,QAAI,EAAE,OAAO,kBAAkB;AAC7B,YAAM,aAAa,GAAG,WAAW,GAAG,GAAG;AACvC,UAAI,CAAC,QAAQ,cAAc,SAAS,UAAU,GAAG;AAC/C,gBAAQ,cAAc,KAAK,UAAU;AACrC,gBAAQ,aAAa;MACvB;IACF;EACF;AAGA,aAAW,OAAO,gBAAgB;AAChC,QAAI,OAAO,iBAAiB;AAC1B,YAAM,WAAW,iBAAiB,GAAG;AACrC,YAAM,WAAW,gBAAgB,GAAG;AACpC,UAAI,aAAa,UAAU;AACzB,cAAM,aAAa,GAAG,WAAW,GAAG,GAAG;AAEvC,cAAM,gBAAgB,QAAQ,eAAe,UAAU,CAAA,MAAK,EAAE,UAAU,UAAU;AAClF,YAAI,iBAAiB,GAAG;AAEtB,kBAAQ,eAAe,aAAa,EAAE,YAAY,YAAY,QAAQ;AACtE,kBAAQ,eAAe,aAAa,EAAE,YAAY,YAAY,QAAQ;QACxE,OAAO;AAEL,kBAAQ,eAAe,KAAK;YAC1B,OAAO,GAAG,UAAU;YACpB;YACA;UACF,CAAC;AACD,kBAAQ,aAAa;QACvB;MACF;IACF;EACF;AAIA,QAAM,mBAAmB,OAAO,cAAc,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE;AAC1E,QAAM,kBAAkB,MAAM,cAAc,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE;AAExE,QAAM,cAAc,iBAAiB,SAAS,CAAC;AAC/C,QAAM,aAAa,gBAAgB,SAAS,CAAC;AAC7C,QAAM,mBAAmB,iBAAiB,cAAc,CAAC;AACzD,QAAM,kBAAkB,gBAAgB,cAAc,CAAC;AAGvD,QAAM,iBAAiB,KAAK,UAAU,YAAY,KAAK,CAAC;AACxD,QAAM,gBAAgB,KAAK,UAAU,WAAW,KAAK,CAAC;AAGtD,QAAM,sBAAsB,KAAK,UAAU,kBAAkB,OAAO,KAAK,gBAAgB,EAAE,KAAK,CAAC;AACjG,QAAM,qBAAqB,KAAK,UAAU,iBAAiB,OAAO,KAAK,eAAe,EAAE,KAAK,CAAC;AAE9F,MAAI,mBAAmB,iBAAiB,wBAAwB,oBAAoB;AAClF,YAAQ,oBAAoB;AAC5B,YAAQ,aAAa;EACvB;AAGA,QAAM,eAAyB,CAAC;AAEhC,MAAI,CAAC,QAAQ,YAAY;AACvB,iBAAa,KAAK,0DAAqD;EACzE,OAAO;AACL,iBAAa,KAAK,2CAAoC;AACtD,iBAAa,KAAK,EAAE;AAEpB,QAAI,QAAQ,gBAAgB;AAC1B,mBAAa,KAAK,cAAc,OAAO,KAAK,OAAO,WAAM,MAAM,KAAK,OAAO,EAAE;IAC/E;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,YAAM,aAAa,IAAI,KAAK,OAAO,KAAK,UAAU,EAAE,eAAe;AACnE,YAAM,YAAY,IAAI,KAAK,MAAM,KAAK,UAAU,EAAE,eAAe;AACjE,mBAAa,KAAK,gBAAgB,UAAU,WAAM,SAAS,EAAE;IAC/D;AAEA,QAAI,QAAQ,YAAY,SAAS,GAAG;AAClC,mBAAa,KAAK,mBAAc,QAAQ,YAAY,MAAM,WAAW;AACrE,UAAI,QAAQ,YAAY,UAAU,IAAI;AACpC,gBAAQ,YAAY,QAAQ,CAAA,UAAS;AACnC,uBAAa,KAAK,SAAS,KAAK,EAAE;QACpC,CAAC;MACH,OAAO;AACL,gBAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAA,UAAS;AAChD,uBAAa,KAAK,SAAS,KAAK,EAAE;QACpC,CAAC;AACD,qBAAa,KAAK,eAAe,QAAQ,YAAY,SAAS,EAAE,OAAO;MACzE;IACF;AAEA,QAAI,QAAQ,cAAc,SAAS,GAAG;AACpC,mBAAa,KAAK,qBAAgB,QAAQ,cAAc,MAAM,WAAW;AACzE,UAAI,QAAQ,cAAc,UAAU,IAAI;AACtC,gBAAQ,cAAc,QAAQ,CAAA,UAAS;AACrC,uBAAa,KAAK,SAAS,KAAK,EAAE;QACpC,CAAC;MACH,OAAO;AACL,gBAAQ,cAAc,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAA,UAAS;AAClD,uBAAa,KAAK,SAAS,KAAK,EAAE;QACpC,CAAC;AACD,qBAAa,KAAK,eAAe,QAAQ,cAAc,SAAS,EAAE,OAAO;MAC3E;IACF;AAEA,QAAI,QAAQ,eAAe,SAAS,GAAG;AACrC,mBAAa,KAAK,yBAAkB,QAAQ,eAAe,MAAM,WAAW;AAC5E,UAAI,QAAQ,eAAe,UAAU,IAAI;AACvC,gBAAQ,eAAe,QAAQ,CAAC,EAAE,OAAO,UAAU,SAAS,MAAM;AAChE,uBAAa,KAAK,OAAO,KAAK,GAAG;AACjC,uBAAa,KAAK,WAAW,QAAQ,EAAE;AACvC,uBAAa,KAAK,WAAW,QAAQ,EAAE;QACzC,CAAC;MACH,OAAO;AACL,gBAAQ,eAAe,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,UAAU,SAAS,MAAM;AAC5E,uBAAa,KAAK,OAAO,KAAK,GAAG;AACjC,uBAAa,KAAK,WAAW,QAAQ,EAAE;AACvC,uBAAa,KAAK,WAAW,QAAQ,EAAE;QACzC,CAAC;AACD,qBAAa,KAAK,eAAe,QAAQ,eAAe,SAAS,CAAC,OAAO;MAC3E;IACF;AAEA,QAAI,QAAQ,mBAAmB;AAC7B,mBAAa,KAAK,8BAAuB;IAC3C;EACF;AAEA,UAAQ,UAAU,aAAa,KAAK,IAAI;AACxC,SAAO;AACT;AAYO,SAAS,oCACd,QACA,OACU;AACV,QAAM,UAAoB,CAAC;AAE3B,QAAM,YAAY,OAAO,cAAc,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE;AACnE,QAAM,WAAW,MAAM,cAAc,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE;AAGjE,QAAM,iBAAiB,KAAK,WAAW,UAAU,SAAS,CAAC,GAAG,KAAK,CAAC;AACpE,QAAM,gBAAgB,KAAK,WAAW,SAAS,SAAS,CAAC,GAAG,KAAK,CAAC;AAClE,MAAI,mBAAmB,eAAe;AACpC,YAAQ,KAAK,SAAS;EACxB;AAGA,QAAM,mBAAmB,UAAU,cAAc,CAAC;AAClD,QAAM,kBAAkB,SAAS,cAAc,CAAC;AAEhD,QAAM,oBAAoB,oBAAI,IAAI;IAChC,GAAG,OAAO,KAAK,gBAAgB;IAC/B,GAAG,OAAO,KAAK,eAAe;EAChC,CAAC;AAED,aAAW,cAAc,mBAAmB;AAC1C,UAAM,cAAc,iBAAiB,UAAU,KAAK,CAAC;AACrD,UAAM,aAAa,gBAAgB,UAAU,KAAK,CAAC;AACnD,UAAMC,kBAAiB,KAAK,UAAU,YAAY,KAAK,CAAC;AACxD,UAAMC,iBAAgB,KAAK,UAAU,WAAW,KAAK,CAAC;AAEtD,QAAID,oBAAmBC,gBAAe;AACpC,cAAQ,KAAK,UAAU;IACzB;EACF;AAEA,SAAO;AACT;AAKA,eAAsB,kBAAkB,SAA6C;AACnF,QAAM,EAAE,MAAAC,OAAM,QAAAC,SAAQ,aAAAC,cAAa,SAAAC,WAAU,yBAAyB,MAAM,eAAe,MAAM,IAAI;AAErG,MAAI,CAACH,OAAM;AACT,UAAM,IAAI,MAAM,yDAAyD;EAC3E;AAEA,QAAM,MAAM,GAAGG,QAAO,WAAWH,KAAI;AACrC,QAAM,UAAkC;IACtC,gBAAgB;EAClB;AAEA,MAAIE,cAAa;AACf,YAAQ,eAAe,IAAI,UAAUA,YAAW;EAClD,WAAWD,SAAQ;AACjB,YAAQ,WAAW,IAAIA;EACzB;AAGA,MAAI,MAAM;AACR,YAAQ,eAAe,IAAI;EAC7B;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,CAAC;AAE7C,MAAI,SAAS,WAAW,KAAK;AAE3B,WAAO;MACL,MAAM;MACN;MACA,QAAQ;IACV;EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,kCAAkC,SAAS,MAAM,IAAI,IAAI,EAAE;EAC7E;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,QAAM,eAAe,SAAS,QAAQ,IAAI,MAAM;AAChD,QAAM,YAAY,gBAAgB,aAAa,EAAE,SAAS,KAAK,KAAK,SAAS,WAAW,KAAK,KAAK,WAAW,CAAC;AAG9G,QAAM,mBAAqC;IACzC,QAAQ,KAAK;IACb,cAAc,KAAK;IACnB,YAAY,KAAK;IACjB,MAAM,KAAK;EACb;AAEA,SAAO;IACL,MAAM;IACN,MAAM;IACN,QAAQ;EACV;AACF;AEzVO,SAAS,WACd,YACA,YACA,QACA,aACY;AACZ,QAAM,QAAkB,CAAC;AACzB,QAAM,WAA6D,CAAC;AACpE,QAAM,UAAoB,CAAC;AAC3B,QAAM,YAAsB,CAAC;AAC7B,QAAM,eAAiE,CAAC;AACxE,QAAM,cAAwB,CAAC;AAG/B,MAAI,WAAW,SAAS,WAAW,UAAU,WAAW,QAAQ;AAG9D,UAAM,YAAY,WAAW,MAAM,qBAAqB;AACxD,UAAM,YAAY,WAAW,MAAM,wBAAwB;AAG3D,UAAM,eAAuC,CAAC;AAC9C,QAAI,WAAW;AACb,YAAM,cAAc,UAAU,CAAC;AAC/B,YAAM,WAAW;AACjB,UAAI;AACJ,cAAQ,QAAQ,SAAS,KAAK,WAAW,OAAO,MAAM;AACpD,qBAAa,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,KAAK;MACzC;IACF,OAAO;AAEL,YAAM,WAAW;AACjB,UAAI;AACJ,cAAQ,QAAQ,SAAS,KAAK,UAAU,OAAO,MAAM;AAEnD,YAAI,EAAE,MAAM,CAAC,KAAK,eAAe;AAC/B,uBAAa,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,KAAK;QACzC;MACF;IACF;AAGA,UAAM,cAAsC,CAAC;AAC7C,QAAI,WAAW;AACb,YAAM,cAAc,UAAU,CAAC;AAC/B,YAAM,WAAW;AACjB,UAAI;AACJ,cAAQ,QAAQ,SAAS,KAAK,WAAW,OAAO,MAAM;AACpD,oBAAY,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,KAAK;MACxC;IACF;AAGA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,UAAI,EAAE,OAAO,eAAe;AAC1B,cAAM,KAAK,GAAG;MAChB,WAAW,aAAa,GAAG,MAAM,OAAO;AACtC,iBAAS,KAAK,EAAE,KAAK,KAAK,aAAa,GAAG,GAAG,KAAK,MAAM,CAAC;MAC3D;IACF;AAEA,eAAW,OAAO,OAAO,KAAK,YAAY,GAAG;AAC3C,UAAI,EAAE,OAAO,aAAa;AACxB,gBAAQ,KAAK,GAAG;MAClB;IACF;AAGA,QAAI,eAAe,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AAGtD,YAAM,WAAW,OAAO,KAAK,UAAU,EAAE,CAAC,KAAK;AAC/C,YAAM,cAAc,SAAS,MAAM,cAAc;AACjD,YAAM,SAAS,cAAc,YAAY,CAAC,IAAI;AAE9C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,cAAM,aAAa,GAAG,MAAM,SAAS,GAAG;AACxC,YAAI,EAAE,cAAc,cAAc;AAChC,oBAAU,KAAK,UAAU;QAC3B,WAAW,YAAY,UAAU,MAAM,OAAO;AAC5C,uBAAa,KAAK,EAAE,KAAK,YAAY,KAAK,YAAY,UAAU,GAAG,KAAK,MAAM,CAAC;QACjF;MACF;AAEA,iBAAW,OAAO,OAAO,KAAK,WAAW,GAAG;AAE1C,cAAM,WAAW,IAAI,QAAQ,IAAI,OAAO,IAAI,MAAM,QAAQ,GAAG,EAAE;AAC/D,YAAI,EAAE,YAAY,cAAc;AAC9B,sBAAY,KAAK,GAAG;QACtB;MACF;IACF;EACF;AAEA,SAAO,EAAE,OAAO,UAAU,SAAS,WAAW,cAAc,YAAY;AAC1E;AEjGO,SAAS,kBACd,cACA,gBACA,mBAAwC,oBAAI,IAAI,GACxC;AACR,QAAM,QAAQ;IACZ;IACA;IACA,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC;IACtC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACF;AAGA,QAAM,UAAU,oBAAI,IAAoD;AAGxE,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,YAAQ,IAAI,KAAK,EAAE,OAAO,YAAY,MAAM,CAAC;EAC/C;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AACrD,YAAQ,IAAI,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC;EAC9C;AAGA,QAAM,aAAa,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK;AAEnD,aAAW,OAAO,YAAY;AAC5B,UAAM,EAAE,OAAO,WAAW,IAAI,QAAQ,IAAI,GAAG;AAC7C,QAAI,YAAY;AACd,YAAM,KAAK,sBAAsB,GAAG,KAAK,KAAK,GAAG;IACnD,OAAO;AACL,YAAM,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG;IAClC;EACF;AAEA,QAAM,KAAK,GAAG;AAGd,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,QAAQ;AACnB,UAAM,KAAK,uBAAyB;AAGpC,UAAM,WAAW,WAAW,CAAC,KAAK;AAClC,UAAM,cAAc,SAAS,MAAM,cAAc;AACjD,UAAM,SAAS,cAAc,YAAY,CAAC,IAAI;AAG9C,UAAM,iBAAiB,OAAO,KAAK,cAAc,EAAE,KAAK;AACxD,eAAW,OAAO,gBAAgB;AAGhC,YAAM,KAAK,KAAK,MAAM,SAAS,GAAG,KAAK,eAAe,GAAG,CAAC,GAAG;IAC/D;AAEA,UAAM,KAAK,GAAG;EAChB;AAEA,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;ACzEO,SAAS,mBACd,cACA,gBACA,mBAAwC,oBAAI,IAAI,GACxC;AACR,QAAM,QAAQ;IACZ;IACA;IACA,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC;IACtC;IACA;IACA;IACA;EACF;AAGA,QAAM,UAAU,oBAAI,IAAoD;AAGxE,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,YAAQ,IAAI,KAAK,EAAE,OAAO,YAAY,MAAM,CAAC;EAC/C;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AACrD,YAAQ,IAAI,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC;EAC9C;AAGA,QAAM,aAAa,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK;AAEnD,aAAW,OAAO,YAAY;AAC5B,UAAM,EAAE,OAAO,WAAW,IAAI,QAAQ,IAAI,GAAG;AAC7C,QAAI,YAAY;AACd,YAAM,KAAK,mBAAmB,GAAG,KAAK,KAAK,GAAG;IAChD,OAAO;AACL,YAAM,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG;IAClC;EACF;AAEA,QAAM,KAAK,GAAG;AAGd,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,cAAc;AACzB,UAAM,KAAK,QAAQ;AACnB,UAAM,KAAK,uBAAyB;AAEpC,UAAM,WAAW,WAAW,CAAC,KAAK;AAClC,UAAM,cAAc,SAAS,MAAM,cAAc;AACjD,UAAM,SAAS,cAAc,YAAY,CAAC,IAAI;AAE9C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,YAAM,KAAK,KAAK,MAAM,SAAS,GAAG,KAAK,KAAK,GAAG;IACjD;AAEA,UAAM,KAAK,GAAG;EAChB;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uCAAuC;AAGlD,aAAW,OAAO,YAAY;AAC5B,UAAM,EAAE,OAAO,WAAW,IAAI,QAAQ,IAAI,GAAG;AAC7C,UAAM,UAAU,MAAM,IAAI,QAAQ,OAAO,EAAE;AAC3C,QAAI,YAAY;AACd,YAAM,KAAK,iBAAiB,OAAO,KAAK,KAAK,GAAG;IAClD,OAAO;AACL,YAAM,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG;IACpC;EACF;AAGA,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,sCAAsC;AAEjD,UAAM,WAAW,OAAO,KAAK,YAAY,EAAE,CAAC,KAAK;AACjD,UAAM,cAAc,SAAS,MAAM,cAAc;AACjD,UAAM,SAAS,cAAc,YAAY,CAAC,IAAI;AAE9C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,YAAM,UAAU,IAAI,MAAM,UAAU,GAAG;AACvC,YAAM,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG;IACpC;EACF;AAEA,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AC5FO,SAAS,mBACd,cACA,gBACA,mBAAwC,oBAAI,IAAI,GACxC;AACR,QAAM,QAAQ;IACZ;IACA;IACA,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC;IACtC;IACA;IACA;IACA;EACF;AAGA,QAAM,UAAU,oBAAI,IAAoD;AAGxE,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,YAAQ,IAAI,KAAK,EAAE,OAAO,YAAY,MAAM,CAAC;EAC/C;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AACrD,YAAQ,IAAI,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC;EAC9C;AAGA,QAAM,aAAa,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK;AAEnD,aAAW,OAAO,YAAY;AAC5B,UAAM,EAAE,OAAO,WAAW,IAAI,QAAQ,IAAI,GAAG;AAC7C,QAAI,YAAY;AACd,YAAM,KAAK,mBAAmB,GAAG,KAAK,KAAK,GAAG;IAChD,OAAO;AACL,YAAM,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG;IAClC;EACF;AAEA,QAAM,KAAK,GAAG;AAGd,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,cAAc;AACzB,UAAM,KAAK,QAAQ;AACnB,UAAM,KAAK,uBAAyB;AAEpC,UAAM,WAAW,OAAO,KAAK,YAAY,EAAE,CAAC,KAAK;AACjD,UAAM,cAAc,SAAS,MAAM,cAAc;AACjD,UAAM,SAAS,cAAc,YAAY,CAAC,IAAI;AAE9C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,YAAM,KAAK,KAAK,MAAM,SAAS,GAAG,KAAK,KAAK,GAAG;IACjD;AAEA,UAAM,KAAK,GAAG;EAChB;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uCAAuC;AAElD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,UAAM,UAAU,MAAM,IAAI,QAAQ,OAAO,EAAE;AAC3C,UAAM,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG;EACpC;AAGA,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,sCAAsC;AAEjD,UAAM,WAAW,OAAO,KAAK,YAAY,EAAE,CAAC,KAAK;AACjD,UAAM,cAAc,SAAS,MAAM,cAAc;AACjD,UAAM,SAAS,cAAc,YAAY,CAAC,IAAI;AAE9C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,YAAM,UAAU,IAAI,MAAM,UAAU,GAAG;AACvC,YAAM,KAAK,GAAG,OAAO,KAAK,KAAK,GAAG;IACpC;EACF;AAEA,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;ACpFO,SAAS,mBAAmB,QAA0C;AAC3E,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;ACFO,SAAS,iBAAiB,QAA0C;AACzE,SAAO;;cAEI,oBAAI,KAAK,GAAE,YAAY,CAAC;;wBAEb,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;;;;AAIvD;ACTO,SAAS,iBAAiB,QAA0C;AACzE,SAAO;;cAEI,oBAAI,KAAK,GAAE,YAAY,CAAC;;wBAEb,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;;AAEvD;ACRA,SAAS,YAAY,QAAwB;AAE3C,SAAO,OACJ,QAAQ,YAAY,EAAE,EACtB,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AACnD;AAEA,SAAS,aAAa,OAAwB;AAC5C,SAAO,sBAAsB,KAAK,KAAK,KAChC,OAAO,KAAK,KAAK,KACjB,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,gBAAgB,KAAqB;AAE5C,QAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE;AACjC,MAAI,MAAM,WAAW,GAAG;AAEtB,UAAM,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;AAC7C,WAAO,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;EAC9C;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,gBAAgB,KAAK;EAC9B;AACA,MAAI,MAAM,WAAW,GAAG;AAEtB,UAAM,MAAM,MAAM,UAAU,GAAG,CAAC;AAChC,UAAM,QAAQ,SAAS,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI;AACpD,WAAO,gBAAgB,GAAG,aAAa,MAAM,QAAQ,CAAC,CAAC;EACzD;AACA,SAAO,mCAAmC,GAAG;AAC/C;AAEO,SAAS,oBACd,cACA,gBACA,mBAAwC,oBAAI,IAAI,GACxC;AACR,QAAM,QAAQ;IACZ;IACA;IACA,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC;IACtC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACF;AAGA,QAAM,SAA2C,CAAC;AAClD,QAAM,UAA4C,CAAC;AACnD,QAAM,aAA+C,CAAC;AACtD,QAAM,QAA0C,CAAC;AAGjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,UAAM,eAAe;AACrB,QAAI,IAAI,SAAS,SAAS,EAAG,QAAO,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAC1D,IAAI,SAAS,WAAW,EAAG,SAAQ,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAClE,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,QAAQ,EAAG,YAAW,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;QACtG,OAAM,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;EAC5C;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AACrD,UAAM,eAAe;AACrB,QAAI,IAAI,SAAS,SAAS,EAAG,QAAO,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAC1D,IAAI,SAAS,WAAW,EAAG,SAAQ,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAClE,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,QAAQ,EAAG,YAAW,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;QACtG,OAAM,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;EAC5C;AAGA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC9C,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC/C,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAClD,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAE7C,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,QAAQ;AAC/C,UAAM,OAAO,YAAY,GAAG;AAC5B,QAAI,aAAa,KAAK,GAAG;AACvB,UAAI,cAAc;AAChB,cAAM,KAAK,kGAAkG;AAC7G,cAAM,KAAK,sBAAsB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE;MACrE,OAAO;AACL,cAAM,KAAK,sBAAsB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE;MACrE;IACF;EACF;AAEA,QAAM,KAAK,OAAO;AAGlB,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iCAAiC;AAC5C,UAAM,KAAK,uBAAuB;AAElC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,YAAM,OAAO,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAA,MAAK,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7F,UAAI,aAAa,KAAK,GAAG;AACvB,cAAM,KAAK,sBAAsB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE;MACrE;IACF;AAEA,UAAM,KAAK,OAAO;EACpB;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,oBAAoB;AAE/B,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,SAAS;AAChD,UAAM,OAAO,YAAY,GAAG;AAC5B,UAAM,WAAW,WAAW,KAAK;AACjC,QAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,UAAI,cAAc;AAChB,cAAM,KAAK,kGAAkG;AAC7G,cAAM,KAAK,sBAAsB,IAAI,eAAe,QAAQ,EAAE;MAChE,OAAO;AACL,cAAM,KAAK,sBAAsB,IAAI,eAAe,QAAQ,EAAE;MAChE;IACF;EACF;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,yBAAyB;AACpC,QAAM,KAAK,uBAAuB;AAElC,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,YAAY;AACnD,UAAM,OAAO,YAAY,GAAG;AAC5B,QAAI,cAAc;AAChB,YAAM,KAAK,kGAAkG;IAC/G;AACA,QAAI,IAAI,SAAS,MAAM,GAAG;AACxB,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,KAAK,sBAAsB,IAAI,eAAe,QAAQ,EAAE;MAChE;IACF,WAAW,IAAI,SAAS,QAAQ,GAAG;AACjC,YAAM,KAAK,sBAAsB,IAAI,OAAO,KAAK,GAAG;IACtD,WAAW,IAAI,SAAS,QAAQ,GAAG;AACjC,YAAM,KAAK,sBAAsB,IAAI,OAAO,KAAK,GAAG;IACtD;EACF;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,kBAAkB;AAE7B,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,OAAO;AAC9C,UAAM,OAAO,YAAY,GAAG;AAC5B,QAAI,cAAc;AAChB,YAAM,KAAK,kGAAkG;IAC/G;AACA,QAAI,aAAa,KAAK,GAAG;AACvB,YAAM,KAAK,sBAAsB,IAAI,MAAM,gBAAgB,KAAK,CAAC,EAAE;IACrE,OAAO;AACL,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,KAAK,sBAAsB,IAAI,eAAe,QAAQ,EAAE;MAChE,OAAO;AACL,cAAM,KAAK,sBAAsB,IAAI,OAAO,KAAK,GAAG;MACtD;IACF;EACF;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AC/LA,SAASG,aAAY,QAAwB;AAC3C,SAAO,OACJ,QAAQ,YAAY,EAAE,EACtB,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AACnD;AAEA,SAAS,aAAa,QAAwB;AAE5C,QAAM,QAAQA,aAAY,MAAM;AAChC,SAAO,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AACtD;AAEA,SAASC,cAAa,OAAwB;AAC5C,SAAO,sBAAsB,KAAK,KAAK,KAChC,OAAO,KAAK,KAAK,KACjB,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,iBAAiB,KAAqB;AAC7C,QAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE,EAAE,YAAY;AAC/C,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;AAC7C,WAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;EAC3C;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,aAAa,KAAK;EAC3B;AACA,MAAI,MAAM,WAAW,GAAG;AAEtB,UAAM,MAAM,MAAM,UAAU,GAAG,CAAC;AAChC,UAAM,QAAQ,MAAM,UAAU,GAAG,CAAC;AAClC,WAAO,WAAW,KAAK,GAAG,GAAG;EAC/B;AACA,SAAO,yCAAyC,GAAG;AACrD;AAEO,SAAS,qBACd,cACA,gBACA,mBAAwC,oBAAI,IAAI,GACxC;AACR,QAAM,QAAQ;IACZ;IACA;IACA,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC;IACtC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACF;AAEA,QAAM,SAA2C,CAAC;AAClD,QAAM,UAA4C,CAAC;AACnD,QAAM,aAA+C,CAAC;AACtD,QAAM,QAA0C,CAAC;AAGjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,UAAM,eAAe;AACrB,QAAI,IAAI,SAAS,SAAS,EAAG,QAAO,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAC1D,IAAI,SAAS,WAAW,EAAG,SAAQ,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAClE,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,QAAQ,EAAG,YAAW,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;QACtG,OAAM,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;EAC5C;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AACrD,UAAM,eAAe;AACrB,QAAI,IAAI,SAAS,SAAS,EAAG,QAAO,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAC1D,IAAI,SAAS,WAAW,EAAG,SAAQ,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAClE,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,QAAQ,EAAG,YAAW,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;QACtG,OAAM,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;EAC5C;AAGA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC9C,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC/C,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAClD,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAE7C,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,QAAQ;AAC/C,UAAM,OAAO,aAAa,GAAG;AAC7B,QAAIA,cAAa,KAAK,GAAG;AACvB,UAAI,cAAc;AAChB,cAAM,KAAK,2EAA2E;AACtF,cAAM,KAAK,eAAe,IAAI,MAAM,iBAAiB,KAAK,CAAC,EAAE;MAC/D,OAAO;AACL,cAAM,KAAK,eAAe,IAAI,MAAM,iBAAiB,KAAK,CAAC,EAAE;MAC/D;IACF;EACF;AAEA,QAAM,KAAK,OAAO;AAGlB,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,yBAAyB;AACpC,UAAM,KAAK,yBAAyB;AAEpC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,YAAM,OAAO,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAA,MAAK,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7F,UAAIA,cAAa,KAAK,GAAG;AACvB,cAAM,KAAK,eAAe,IAAI,MAAM,iBAAiB,KAAK,CAAC,EAAE;MAC/D;IACF;AAEA,UAAM,KAAK,OAAO;EACpB;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,sBAAsB;AAEjC,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,SAAS;AAChD,UAAM,OAAO,aAAa,GAAG;AAC7B,UAAM,WAAW,WAAW,KAAK;AACjC,QAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,UAAI,cAAc;AAChB,cAAM,KAAK,2EAA2E;AACtF,cAAM,KAAK,eAAe,IAAI,MAAM,QAAQ,KAAK;MACnD,OAAO;AACL,cAAM,KAAK,eAAe,IAAI,MAAM,QAAQ,KAAK;MACnD;IACF;EACF;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,yBAAyB;AAEpC,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,YAAY;AACnD,UAAM,OAAO,aAAa,GAAG;AAC7B,QAAI,cAAc;AAChB,YAAM,KAAK,2EAA2E;IACxF;AACA,QAAI,IAAI,SAAS,MAAM,GAAG;AACxB,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,KAAK,eAAe,IAAI,MAAM,QAAQ,KAAK;MACnD;IACF,OAAO;AACL,YAAM,KAAK,qBAAqB,IAAI,OAAO,KAAK,GAAG;IACrD;EACF;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oBAAoB;AAE/B,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,OAAO;AAC9C,UAAM,OAAO,aAAa,GAAG;AAC7B,QAAI,cAAc;AAChB,YAAM,KAAK,2EAA2E;IACxF;AACA,QAAIA,cAAa,KAAK,GAAG;AACvB,YAAM,KAAK,eAAe,IAAI,MAAM,iBAAiB,KAAK,CAAC,EAAE;IAC/D,OAAO;AACL,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,KAAK,eAAe,IAAI,MAAM,QAAQ,KAAK;MACnD,OAAO;AACL,cAAM,KAAK,qBAAqB,IAAI,OAAO,KAAK,GAAG;MACrD;IACF;EACF;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AClLA,SAASD,aAAY,QAAwB;AAC3C,SAAO,OACJ,QAAQ,YAAY,EAAE,EACtB,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AACnD;AAEA,SAAS,WAAW,QAAwB;AAE1C,SAAOA,aAAY,MAAM;AAC3B;AAEA,SAASC,cAAa,OAAwB;AAC5C,SAAO,sBAAsB,KAAK,KAAK,KAChC,OAAO,KAAK,KAAK,KACjB,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,eAAe,KAAqB;AAC3C,QAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE,EAAE,YAAY;AAC/C,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;AAC7C,WAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;EAC3C;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,aAAa,KAAK;EAC3B;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,MAAM,MAAM,UAAU,GAAG,CAAC;AAChC,UAAM,QAAQ,MAAM,UAAU,GAAG,CAAC;AAClC,WAAO,WAAW,KAAK,GAAG,GAAG;EAC/B;AACA,SAAO,0CAA0C,GAAG;AACtD;AAEO,SAAS,mBACd,cACA,gBACA,mBAAwC,oBAAI,IAAI,GACxC;AACR,QAAM,QAAQ;IACZ;IACA;IACA,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC;IACtC;IACA;IACA;IACA;IACA;IACA;IACA;EACF;AAEA,QAAM,SAA2C,CAAC;AAClD,QAAM,UAA4C,CAAC;AACnD,QAAM,aAA+C,CAAC;AACtD,QAAM,QAA0C,CAAC;AAGjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,UAAM,eAAe;AACrB,QAAI,IAAI,SAAS,SAAS,EAAG,QAAO,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAC1D,IAAI,SAAS,WAAW,EAAG,SAAQ,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAClE,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,QAAQ,EAAG,YAAW,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;QACtG,OAAM,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;EAC5C;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB,QAAQ,GAAG;AACrD,UAAM,eAAe;AACrB,QAAI,IAAI,SAAS,SAAS,EAAG,QAAO,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAC1D,IAAI,SAAS,WAAW,EAAG,SAAQ,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;aAClE,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,QAAQ,EAAG,YAAW,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;QACtG,OAAM,KAAK,CAAC,KAAK,OAAO,YAAY,CAAC;EAC5C;AAGA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC9C,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC/C,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAClD,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAE7C,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,QAAQ;AAC/C,UAAM,OAAO,WAAW,GAAG;AAC3B,QAAIA,cAAa,KAAK,GAAG;AACvB,UAAI,cAAc;AAChB,cAAM,KAAK,qEAAqE;AAChF,cAAM,KAAK,kBAAkB,IAAI,MAAM,eAAe,KAAK,CAAC,GAAG;MACjE,OAAO;AACL,cAAM,KAAK,kBAAkB,IAAI,MAAM,eAAe,KAAK,CAAC,GAAG;MACjE;IACF;EACF;AAGA,MAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,yBAAyB;AAEpC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,YAAM,OAAO,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAA,MAAK,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7F,UAAIA,cAAa,KAAK,GAAG;AACvB,cAAM,KAAK,kBAAkB,IAAI,MAAM,eAAe,KAAK,CAAC,GAAG;MACjE;IACF;EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,cAAc;AAEzB,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,SAAS;AAChD,UAAM,OAAO,WAAW,GAAG;AAC3B,UAAM,WAAW,WAAW,KAAK;AACjC,QAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,UAAI,cAAc;AAChB,cAAM,KAAK,qEAAqE;AAChF,cAAM,KAAK,yBAAyB,IAAI,MAAM,QAAQ,GAAG;MAC3D,OAAO;AACL,cAAM,KAAK,yBAAyB,IAAI,MAAM,QAAQ,GAAG;MAC3D;IACF;EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB;AAE5B,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,YAAY;AACnD,UAAM,OAAO,WAAW,GAAG;AAC3B,QAAI,cAAc;AAChB,YAAM,KAAK,qEAAqE;IAClF;AACA,QAAI,IAAI,SAAS,MAAM,GAAG;AACxB,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,KAAK,yBAAyB,IAAI,MAAM,QAAQ,GAAG;MAC3D;IACF,OAAO;AACL,YAAM,KAAK,yBAAyB,IAAI,OAAO,KAAK,IAAI;IAC1D;EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,YAAY;AAEvB,aAAW,CAAC,KAAK,OAAO,YAAY,KAAK,OAAO;AAC9C,UAAM,OAAO,WAAW,GAAG;AAC3B,QAAI,cAAc;AAChB,YAAM,KAAK,qEAAqE;IAClF;AACA,QAAIA,cAAa,KAAK,GAAG;AACvB,YAAM,KAAK,kBAAkB,IAAI,MAAM,eAAe,KAAK,CAAC,GAAG;IACjE,OAAO;AACL,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,KAAK,yBAAyB,IAAI,MAAM,QAAQ,GAAG;MAC3D,OAAO;AACL,cAAM,KAAK,yBAAyB,IAAI,OAAO,KAAK,IAAI;MAC1D;IACF;EACF;AAEA,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;ACzHO,SAAS,mBAAmB,SAA4C;AAC7E,QAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA,UAAU,CAAC;IACX;IACA,eAAe,CAAC;IAChB,oBAAoB,CAAC;IACrB;IACA,4BAA4B;IAC5B,uBAAuB;EACzB,IAAI;AAEJ,QAAM,cAAc,KAAK,KAAK,aAC1B,IAAI,KAAK,KAAK,KAAK,UAAU,EAAE,eAAe,IAC9C;AAEJ,MAAI,WAAW,iBAAY,YAAY,cAAc,MAAM;;AAC3D,cAAY,WAAW,MAAM;;AAC7B,cAAY,kBAAkB,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,OAAO;;AACnE,MAAI,kBAAkB,GAAG;AACvB,gBAAY,WAAW,YAAY,YAAY,eAAe;;EAChE,OAAO;AACL,gBAAY,WAAW,YAAY;;EACrC;AACA,cAAY,YAAY,KAAK,KAAK,OAAO;;AACzC,cAAY,iBAAiB,WAAW;;AAKxC,MAAI,kBAAkB,GAAG;AACvB,gBAAY;;;AACZ,gBAAY,gCAAyB,eAAe;;AACpD,gBAAY;;;AACZ,gBAAY;;AACZ,gBAAY;;;AAEZ,UAAM,sBAAsB,MAAM,KAAK,iBAAiB,KAAK,CAAC,EAAE,KAAK;AACrE,wBAAoB,QAAQ,CAAC,OAAO,UAAU;AAC5C,YAAM,QAAQ,iBAAiB,IAAI,KAAK;AACxC,kBAAY,KAAK,QAAQ,CAAC,KAAK,KAAK;AACpC,UAAI,OAAO;AACT,oBAAY,MAAM,KAAK;MACzB;AACA,kBAAY;;IACd,CAAC;EACH;AAKA,QAAM,eAAyB,CAAC;AAChC,MAAI,MAAM;AACR,iBAAa,KAAK,GAAG,KAAK,OAAO,GAAG,KAAK,SAAS;EACpD;AAGA,MAAI,iBAAiB,cAAc,SAAS,eAAU,GAAG;AACvD,UAAM,eAAe,cAAc,MAAM,gDAAgD;AACzF,QAAI,cAAc;AAChB,YAAM,aAAa,aAAa,CAAC,EAAE,MAAM,mBAAmB,KAAK,CAAC;AAClE,iBAAW,QAAQ,CAAA,SAAQ;AACzB,cAAM,QAAQ,KAAK,QAAQ,UAAU,EAAE,EAAE,KAAK;AAC9C,YAAI,SAAS,CAAC,aAAa,SAAS,KAAK,GAAG;AAC1C,uBAAa,KAAK,KAAK;QACzB;MACF,CAAC;IACH;EACF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,gBAAY;;;AACZ,gBAAY,sBAAiB,aAAa,MAAM;;AAChD,gBAAY;;;AACZ,iBAAa,KAAK,EAAE,QAAQ,CAAC,OAAO,UAAU;AAC5C,kBAAY,KAAK,QAAQ,CAAC,KAAK,KAAK;;IACtC,CAAC;EACH;AAKA,QAAM,gBAA0B,CAAC,MAAM;AAGvC,eAAa,QAAQ,CAAA,WAAU;AAC7B,QAAI,OAAO,SAAS;AAClB,YAAM,WAAgB,cAAQ,QAAQ,IAAI,GAAG,OAAO,IAAI;AACxD,UAAI,CAAC,cAAc,SAAS,QAAQ,GAAG;AACrC,sBAAc,KAAK,QAAQ;MAC7B;IACF;EACF,CAAC;AAED,cAAY;;;AACZ,cAAY,6BAAsB,cAAc,MAAM;;AACtD,cAAY;;;AACZ,gBAAc,QAAQ,CAAC,MAAM,UAAU;AACrC,UAAM,eAAoB,eAAS,QAAQ,IAAI,GAAG,IAAI;AACtD,gBAAY,KAAK,QAAQ,CAAC,KAAK,YAAY;;EAC7C,CAAC;AAKD,MAAI,kBAAkB,SAAS,GAAG;AAChC,gBAAY;;;AACZ,gBAAY;;AACZ,gBAAY;;;AACZ,gBAAY;;;AAGZ,UAAM,aAAa,CAAC,QAAgB,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAE7E,sBAAkB,QAAQ,CAAC,YAAY,UAAU;AAC/C,YAAM,cAAc,eAAe,YAC/B,kBACA,WAAW,UAAU;AACzB,kBAAY,KAAK,QAAQ,CAAC,KAAK,WAAW;;IAC5C,CAAC;AAED,gBAAY;;;EACd;AAKA,MAAI,MAAM;AACR,UAAM,eAAe,KAAK,MAAM,SAAS,KAAK,SAAS;AACvD,UAAM,cAAc,KAAK,UAAU,SAAS,KAAK,aAAa;AAE9D,QAAI,eAAe,KAAK,cAAc,KAAK,kBAAkB,GAAG;AAC9D,kBAAY;;;AACZ,kBAAY;;AACZ,kBAAY;;;AAEZ,YAAM,eAAe,eAAe,IAAI,UAAU,KAAK,SAAS,MAAM,cAAc,KAAK,MAAM,MAAM,WAAW;AAChH,YAAM,cAAc,cAAc,IAAI,SAAS,KAAK,aAAa,MAAM,cAAc,KAAK,UAAU,MAAM,WAAW;AACrH,YAAM,oBAAoB,kBAAkB,IAAI,GAAG,eAAe,gCAAgC;AAClG,YAAM,cAAc,CAAC,cAAc,aAAa,iBAAiB,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAC7F,kBAAY,GAAG,WAAW;;AAE1B,UAAI,QAAQ,SAAS,KAAK,QAAQ,UAAU,IAAI;AAC9C,oBAAY;AACZ,mBAAW,EAAE,KAAK,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS;AACvD,sBAAY,KAAK,GAAG,KAAK,MAAM,WAAM,MAAM;;QAC7C;MACF;IACF;EACF,WAAW,CAAC,YAAY;AACtB,gBAAY;;;EACd;AAKA,MAAI,6BAA6B,uBAAuB,GAAG;AACzD,gBAAY;;;AACZ,gBAAY;;AACZ,gBAAY;;;AACZ,gBAAY,GAAG,oBAAoB;;AACnC,gBAAY;;;AACZ,gBAAY;;AACZ,gBAAY;;AACZ,gBAAY;;AACZ,gBAAY;;EACd;AAEA,SAAO;AACT;ACzNO,SAAS,eAAe,QAAiCC,OAAuB;AACrF,QAAM,QAAQA,MAAK,MAAM,GAAG;AAC5B,MAAI,UAAmB;AAEvB,aAAW,QAAQ,OAAO;AACxB,QAAI,WAAW,OAAO,YAAY,YAAY,QAAQ,SAAS;AAC7D,gBAAW,QAAoC,IAAI;IACrD,OAAO;AACL,aAAO;IACT;EACF;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,KAAc,SAAS,IAA6C;AAChG,QAAM,UAAmD,CAAC;AAE1D,MAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACzD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,YAAM,UAAU,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAE9C,UAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,gBAAQ,KAAK,GAAG,cAAc,OAAO,OAAO,CAAC;MAC/C,OAAO;AACL,gBAAQ,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;MACvC;IACF;EACF;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,QAAiC,OAAwD;AACpH,QAAM,OAAO,cAAc,MAAM;AACjC,QAAM,aAAa,MAAM,YAAY;AAErC,SAAO,KAAK,OAAO,CAAC,EAAE,MAAAA,OAAM,MAAM,MAAM;AACtC,UAAM,YAAYA,MAAK,YAAY,EAAE,SAAS,UAAU;AACxD,UAAM,aAAa,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,UAAU;AAClE,WAAO,aAAa;EACtB,CAAC;AACH;AAEO,SAAS,YAAY,QAAiC,SAAS,IAAY;AAChF,MAAI,QAAQ;AACZ,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,eAAS,YAAY,OAAkC,GAAG,MAAM,GAAG,GAAG,GAAG;IAC3E,WAAW,UAAU,UAAa,UAAU,MAAM;AAChD;IACF;EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,MAK5B;AACA,QAAM,aAAqC,CAAC;AAC5C,MAAI,QAAQ;AAEZ,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AAC3D,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,QAAQ,YAAY,KAAgC;AAC1D,iBAAW,QAAQ,IAAI;AACvB,eAAS;IACX;EACF;AAEA,SAAO;IACL;IACA;IACA,cAAc,OAAO,KAAK,KAAK,YAAY,EAAE;IAC7C,iBAAiB,KAAK,WAAW,MAAM;EACzC;AACF;;;AhBhBA,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,OAAO,aAAa,uBAAuB;AAO3C,IAAM,oBAAoB,OAAO,QAAQ,IAAI,iBAAiB,KAAK;AACnE,IAAM,oBAAoB,QAAQ,IAAI,qBAAqB;AAC3D,IAAM,0BAA0B;AAChC,IAAM,qBAAqB,QAAQ,IAAI,sBAAsB;AAG7D,IAAM,gCAAgC;AAAA,EACpC,eAAe;AAAA,EACf,SAAS;AAAA,EACT,aAAa;AACf;AAEA,IAAI,YAAoC;AACxC,IAAI,WAA6B;AACjC,IAAM,wBAAwB,oBAAI,IAGhC;AAGF,SAAS,0BAA0B,MAAoB;AACrD,QAAM,UAAU,OAAO,IAAI;AAC3B,QAAM,SAAS,OAAO,QAAQ,GAAG;AACjC,MAAI;AACF,QAAI,SAAS,MAAM,SAAS;AAC1B,YAAM,MAAM,SAAS,gBAAgB,EAAE,UAAU,QAAQ,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC;AAC1F,YAAM,OAAO,oBAAI,IAAY;AAC7B,iBAAW,QAAQ,IAAI,MAAM,OAAO,GAAG;AACrC,YAAI,KAAK,SAAS,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,WAAW,GAAG;AAC9D,gBAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,gBAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAClC,cAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,OAAQ,MAAK,IAAI,GAAG;AAAA,QACvD;AAAA,MACF;AACA,iBAAW,OAAO,MAAM;AACtB,YAAI;AACF,mBAAS,iBAAiB,GAAG,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC;AACzF,kBAAQ,MAAM,wCAAwC,IAAI,gBAAgB,GAAG,GAAG;AAAA,QAClF,SAAS,GAAG;AAAA,QAEZ;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,MAAM,SAAS,aAAa,OAAO,IAAI,EAAE,UAAU,QAAQ,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC,EAAE,KAAK;AACzG,UAAI,CAAC,IAAK;AACV,YAAM,OAAO,IAAI,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,MAAM;AAC7D,iBAAW,OAAO,MAAM;AACtB,YAAI;AACF,mBAAS,WAAW,GAAG,IAAI,EAAE,UAAU,QAAQ,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC;AAChF,kBAAQ,MAAM,wCAAwC,IAAI,gBAAgB,GAAG,GAAG;AAAA,QAClF,SAAS,GAAG;AAAA,QAEZ;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,mBAAyB;AAChC,MAAI,UAAW;AACf,MAAI;AACF,8BAA0B,iBAAiB;AAC3C,gBAAY,IAAI,gBAAgB;AAAA,MAC9B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB,CAAC;AACD,cAAU,GAAG,cAAc,CAAC,IAAe,QAAQ;AACjD,YAAM,MAAM,IAAI,OAAO;AACvB,YAAM,SAAS,IAAI,gBAAgB,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG;AAC3E,YAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,YAAM,OAAO,OAAO,IAAI,MAAM;AAE9B,UAAI,sBAAsB,UAAU,oBAAoB;AACtD,WAAG,MAAM,MAAgB,iCAAiC;AAC1D;AAAA,MACF;AACA,UAAI,SAAS,UAAU;AACrB,WAAG,MAAM,MAAgB,0DAA0D;AACnF;AAAA,MACF;AACA,UAAI,UAAU;AACZ,YAAI;AAAE,mBAAS,MAAM;AAAA,QAAG,SAAS,GAAG;AAAA,QAAe;AACnD,mBAAW;AAAA,MACb;AACA,iBAAW;AAEX,SAAG,GAAG,WAAW,CAAC,QAAyB;AACzC,cAAM,OAAO,OAAO,QAAQ,WAAW,MAAM,IAAI,SAAS,MAAM;AAChE,YAAI;AACJ,YAAI;AACF,gBAAM,KAAK,MAAM,IAAI;AAAA,QACvB,QAAQ;AACN;AAAA,QACF;AACA,cAAM,SAAS;AACf,YAAI,QAAQ,SAAS,UAAU,OAAO,OAAO,OAAO,UAAU;AAC5D,cAAI;AACF,eAAG,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,UACzD,SAAS,GAAG;AAAA,UAAe;AAC3B;AAAA,QACF;AACA,YAAI,OAAO,OAAO,OAAO,aAAa,YAAY,UAAU,WAAW,SAAS;AAC9E,gBAAM,UAAU,sBAAsB,IAAI,OAAO,EAAE;AACnD,cAAI,SAAS;AACX,yBAAa,QAAQ,OAAO;AAC5B,kCAAsB,OAAO,OAAO,EAAE;AACtC,gBAAI,OAAO,MAAO,SAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,gBACnD,SAAQ,QAAQ,OAAO,MAAM;AAAA,UACpC;AAAA,QACF;AAAA,MACF,CAAC;AAED,SAAG,GAAG,SAAS,MAAM;AACnB,YAAI,aAAa,GAAI,YAAW;AAAA,MAClC,CAAC;AACD,SAAG,GAAG,SAAS,MAAM;AACnB,YAAI,aAAa,GAAI,YAAW;AAAA,MAClC,CAAC;AAAA,IACH,CAAC;AACD,cAAU,GAAG,aAAa,MAAM;AAC9B,cAAQ,MAAM,+CAA+C,iBAAiB,IAAI,iBAAiB,eAAe;AAClH,UAAI,oBAAoB;AACtB,gBAAQ,MAAM,+DAA+D;AAAA,MAC/E;AAAA,IACF,CAAC;AACD,cAAU,GAAG,SAAS,CAAC,QAAQ;AAC7B,cAAQ,MAAM,2CAA2C,GAAG;AAAA,IAC9D,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,MAAM,8CAA8C,GAAG;AAAA,EACjE;AACF;AAEA,SAAS,mBAAyB;AAChC,MAAI,UAAU;AACZ,QAAI;AACF,eAAS,MAAM;AAAA,IACjB,SAAS,GAAG;AAAA,IAEZ;AACA,eAAW;AAAA,EACb;AACA,MAAI,WAAW;AACb,QAAI;AACF,gBAAU,MAAM;AAAA,IAClB,SAAS,GAAG;AAAA,IAEZ;AACA,gBAAY;AAAA,EACd;AACF;AAGA,SAAS,oBAAsC;AAC7C,SAAO,QAAQ,QAAQ,CAAC,EAAE,YAAY,SAAS,eAAe,UAAU,KAAK;AAC/E;AAEA,SAAS,kBACP,QACA,QACA,YAAoB,yBACF;AAClB,QAAM,aAAa,sBAAsB,MAAM;AAC/C,MAAI,CAAC,gBAAgB,UAAU,GAAG;AAChC,WAAO,QAAQ,OAAO,IAAI,MAAM,8BAA8B,MAAM,EAAE,CAAC;AAAA,EACzE;AACA,QAAM,KAAK;AACX,MAAI,CAAC,MAAM,GAAG,eAAe,UAAU,MAAM;AAC3C,WAAO,QAAQ;AAAA,MACb,IAAI,MAAM,6EAA6E;AAAA,IACzF;AAAA,EACF;AACA,QAAM,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACtE,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,UAAU,WAAW,MAAM;AAC/B,UAAI,sBAAsB,OAAO,EAAE,GAAG;AACpC,eAAO,IAAI,MAAM,2BAA2B,8BAA8B,cAAc,WAAW,8BAA8B,OAAO,CAAC;AAAA,MAC3I;AAAA,IACF,GAAG,SAAS;AACZ,0BAAsB,IAAI,IAAI,EAAE,SAAAA,UAAS,QAAQ,QAAQ,CAAC;AAC1D,QAAI;AACF,SAAG,KAAK,KAAK,UAAU,EAAE,IAAI,QAAQ,YAAY,OAAO,CAAC,CAAC;AAAA,IAC5D,SAAS,GAAG;AACV,4BAAsB,OAAO,EAAE;AAC/B,mBAAa,OAAO;AACpB,aAAO,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AAAA,IACtD;AAAA,EACF,CAAC;AACH;AAMA,SAAS,YAAgH;AACvH,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,MAAIC,QAAsB;AAC1B,MAAIC,UAAwB;AAC5B,MAAIC,eAA6B;AACjC,MAAIC,WAAyB;AAE7B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,aAAa,KAAK,IAAI,CAAC,GAAG;AACxC,MAAAH,QAAO,KAAK,IAAI,CAAC;AACjB;AAAA,IACF,WAAW,KAAK,CAAC,MAAM,eAAe,KAAK,IAAI,CAAC,GAAG;AACjD,MAAAC,UAAS,KAAK,IAAI,CAAC;AACnB;AAAA,IACF,WAAW,KAAK,CAAC,MAAM,oBAAoB,KAAK,IAAI,CAAC,GAAG;AACtD,MAAAC,eAAc,KAAK,IAAI,CAAC;AACxB;AAAA,IACF,WAAW,KAAK,CAAC,MAAM,gBAAgB,KAAK,IAAI,CAAC,GAAG;AAClD,MAAAC,WAAU,KAAK,IAAI,CAAC;AACpB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAAH,OAAM,QAAAC,SAAQ,aAAAC,cAAa,SAAAC,SAAQ;AAC9C;AAEA,IAAM,UAAU,UAAU;AAC1B,IAAM,EAAE,MAAM,QAAQ,YAAY,IAAI;AACtC,IAAM,UAAU,QAAQ,WAAW;AAGnC,IAAM,cAAc;AAMpB,IAAI,aAAsC;AAC1C,IAAI,aAA4B;AAEhC,IAAI,gBAAuC;AAE3C,IAAI,oBAAoB;AAGxB,IAAI,kBAAiC;AAErC,IAAI,mBAAkC;AAGtC,SAAS,eAAe,QAAgB,SAA0B;AAChE,QAAM,UAAU,CAAC,MAAc,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,KAAK,CAAC;AAC3E,QAAM,IAAI,QAAQ,MAAM;AACxB,QAAM,IAAI,QAAQ,OAAO;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK;AACrD,UAAM,IAAI,EAAE,CAAC,KAAK;AAClB,UAAM,IAAI,EAAE,CAAC,KAAK;AAClB,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAGA,SAAS,qBAA8B;AACrC,SAAO,CAAC,EAAE,QAAQ;AACpB;AAGA,IAAM,wBACJ;AACF,IAAI,oBAAmC;AAavC,IAAI,yBAAwD;AAG5D,SAAS,uBAAsC;AAC7C,SAAO;AACT;AAGA,eAAe,oBAAoB,WAA6B;AAC9D,MAAI,YAAY;AACd,UAAM,UAAU,qBAAqB,YAAY,SAAS;AAC1D,wBAAoB,QAAQ;AAC5B,QAAI,QAAQ,YAAY;AACtB,cAAQ,MAAM;AAAA,EAA+C,QAAQ,OAAO,EAAE;AAAA,IAChF;AAAA,EACF;AACF;AAUA,SAAS,4BACP,YACA,QACA,sBACqB;AACrB,MAAI,CAAI,cAAW,UAAU,GAAG;AAC9B,WAAO,EAAE,MAAM,YAAY,QAAQ,QAAQ,QAAQ,8BAA8B;AAAA,EACnF;AACA,QAAM,UAAa,gBAAa,YAAY,OAAO;AACnD,MAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC3C,WAAO,EAAE,MAAM,YAAY,QAAQ,QAAQ,QAAQ,6BAA6B;AAAA,EAClF;AACA,MAAI,CAAC,OAAO,QAAQ,MAAM,EAAE,SAAS,MAAM,GAAG;AAC5C,UAAM,aAAa;AACnB,QAAI,QAAQ;AACZ,QAAI;AACJ,YAAQ,IAAI,WAAW,KAAK,OAAO,OAAO,KAAM;AAChD,QAAI,QAAQ,sBAAsB;AAChC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ,qBAAqB,oBAAoB,qBAAqB,KAAK;AAAA,MAC7E;AAAA,IACF;AACA,WAAO,EAAE,MAAM,YAAY,QAAQ,MAAM,QAAQ,GAAG,KAAK,sBAAsB;AAAA,EACjF;AACA,SAAO,EAAE,MAAM,YAAY,QAAQ,MAAM,QAAQ,iCAAiC;AACpF;AAGA,SAAS,sBAAsB,SAAwC;AACrE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,cAAc,CAAC,MAAe,EAAE,WAAW,GAAG,IAAI,IAAS,cAAS,QAAQ,IAAI,GAAG,CAAC;AAC1F,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,WAAM,EAAE,MAAM,EAAE;AAAA,IAC3E;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGA,eAAe,wBAAwB,eAAe,OAAkC;AACtF,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mFAAmF;AAC9G,MAAI,CAAC,YAAa,OAAM,IAAI,MAAM,2EAA2E;AAC7G,MAAI,cAAc;AAChB,iBAAa;AACb,iBAAa;AAAA,EACf;AACA,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC;AAAA,IACA;AAAA,IACA,SAAS,WAAW;AAAA,IACpB,MAAM,eAAe,SAAY,cAAc;AAAA,IAC/C;AAAA,EACF,CAAC;AACD,MAAI,OAAO,WAAW,OAAO,WAAY,QAAO;AAChD,MAAI,OAAO,WAAW,OAAO,CAAC,OAAO,KAAM,OAAM,IAAI,MAAM,qCAAqC;AAChG,eAAa,OAAO;AACpB,eAAa,OAAO;AACpB,kBAAgB,OAAO,KAAK,KAAK,WAAW;AAC5C,QAAM,SAAU,OAAO,KAAK,KAAuC;AACnE,MAAI,UAAU,eAAe,QAAQ,WAAW,GAAG;AACjD,uBAAmB;AACnB,sBAAkB,uDAAuD,MAAM,8BAA8B,WAAW,0NAA0N,MAAM;AAAA,EAC1V,OAAO;AACL,sBAAkB;AAClB,uBAAmB;AAAA,EACrB;AACA,QAAM,oBAAoB,OAAO,IAAI;AACrC,SAAO,OAAO;AAChB;AAMA,IAAM,mBAAmB,CAAC,UAAU,cAAc,WAAW,UAAU,WAAW,UAAU,WAAW,UAAU,QAAQ;AAIzH,SAAS,2BAA2B,KAAsD;AACxF,QAAM,UAAU,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,YAAY;AACtD,MAAI,WAAW,aAAa,OAAO,WAAW,SAAS,EAAG,QAAO;AACjE,MAAI,WAAW,aAAa,OAAO,WAAW,SAAS,EAAG,QAAO;AACjE,MAAI,WAAW,UAAU,OAAO,WAAW,MAAM,EAAG,QAAO;AAC3D,MAAI,OAAO,WAAW,MAAM,EAAG,QAAO;AACtC,SAAO;AACT;AAGA,SAAS,kBAAkB,YAAqC,YAAY,QAczE;AACD,QAAM,WAAW,WAAW;AAC5B,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO,CAAC;AAEvD,QAAM,aAAc,WAAW,cAAyC,CAAC;AACzE,QAAM,aAAc,WAAW,cAAkD,CAAC;AAClF,QAAM,aAAc,WAAW,cAAyC,CAAC;AACzE,QAAM,gBAAiB,WAAW,iBAA4C,CAAC;AAC/E,QAAM,gBAAiB,WAAW,iBAA4C,CAAC;AAC/E,QAAM,iBAAkB,WAAW,kBAA6C,CAAC;AACjF,QAAM,IAAI,YAAY,GAAG,SAAS,MAAM;AAExC,QAAM,WAcD,CAAC;AAEN,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,UAAM,OAAO,2BAA2B,GAAG;AAC3C,UAAM,aAAa,WAAW,IAAI,KAAK,WAAW;AAClD,UAAM,oBAAoB,aAAa,KAAK,CAAC,0BAA0B,IAAI,KAAK;AAChF,UAAM,gBAAgB,aAAa,OAAO,iBAAiB,MAAM;AAEjE,UAAM,WAAW,IAAI,QAAQ,mBAAmB,OAAO,EAAE,YAAY;AACrE,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,UAAU,YAAY,QAAQ;AAAA,MAC9B,eAAe,iBAAiB;AAAA,MAChC;AAAA,MACA,iBAAiB;AAAA,MACjB,aAAa,SAAS,CAAC,cAAc,GAAG;AAAA,MACxC,eAAe,SAAS,CAAC,cAAc,GAAG;AAAA,MAC1C,eAAe,SAAS,CAAC,cAAc,GAAG;AAAA,MAC1C,kBAAkB,cAAc,GAAG,KAAK,OAAO,SAAS,CAAC,cAAc,GAAG,qBAAqB;AAAA,MAC/F,kBAAkB,cAAc,GAAG,KAAK,OAAO,SAAS,CAAC,cAAc,GAAG,qBAAqB;AAAA,MAC/F,mBAAmB,eAAe,GAAG,KAAK,OAAO,SAAS,CAAC,cAAc,GAAG,sBAAsB;AAAA,MAClG,kBAAkB,OAAO;AAAA,MACzB,mBAAmB,OAAO;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAQA,IAAM,SAAS,IAAI;AAAA,EACjB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc;AAAA,MACZ,OAAO,CAAC;AAAA,MACR,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AACF;AAMA,OAAO,kBAAkB,wBAAwB,YAAY;AAE3D,MAAI,CAAC,mBAAmB,GAAG;AACzB,wBAAoB;AACpB,YAAQ,MAAM,8EAA8E;AAC5F,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,MAAI,kBAAkB,MAAM;AAC1B,QAAI;AAEF,YAAM,wBAAwB,IAAI;AAClC,UAAI,kBAAkB,OAAO;AAC3B,gBAAQ,MAAM,mCAAmC;AAAA,MACnD,WAAW,kBAAkB,QAAQ;AACnC,gBAAQ,MAAM,oFAAoF;AAAA,MACpG;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,0BAAoB;AACpB,cAAQ;AAAA,QACN;AAAA,QACA,IAAI,SAAS,KAAK,IACd,gKACA,IAAI,SAAS,KAAK,IAChB,4EACA,IAAI,SAAS,KAAK,IAChB,8CACA;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,MAAI,mBAAmB;AACrB,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AACA,QAAM,YAAgG;AAAA,IAClG;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,UAAU;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,aAAa;AAAA,YACX,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,UAAU;AAAA,MACvB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,WAAW;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,CAAC,SAAS,WAAW,UAAU,UAAU,cAAc,KAAK;AAAA,YAClE,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,QAAQ,cAAc,UAAU,SAAS,UAAU,UAAU,OAAO;AAAA,YACrF,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,kBAAkB,YAAY,YAAY,UAAU,KAAK;AAAA,YAC1E,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,WAAW,YAAY,SAAS,YAAY,OAAO,kBAAkB,SAAS;AAAA,YAC/F,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,eAAe;AAAA,YACb,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM,CAAC,OAAO,QAAQ,QAAQ,QAAQ,MAAM,MAAM,SAAS,UAAU,MAAM;AAAA,YAC3E,aAAa;AAAA,UACf;AAAA,UACA,YAAY;AAAA,YACV,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,UAAU;AAAA,YACR,MAAM;AAAA,YACN,MAAM,CAAC,OAAO,OAAO,SAAS;AAAA,YAC9B,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,OAAO;AAC3B,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,aACE;AAAA,MAKF,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM,CAAC,WAAW,SAAS,SAAS;AAAA,YACpC,aAAa;AAAA,UACf;AAAA,UACA,aAAa;AAAA,YACX,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,aAAa;AAAA,YACX,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO;AAAA,cACL,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,QAAQ,EAAE,MAAM,SAAS;AAAA,gBACzB,QAAQ,EAAE,MAAM,SAAS;AAAA,cAC3B;AAAA,cACA,UAAU,CAAC,QAAQ;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AAEF,SAAO,EAAE,OAAO,UAAU;AAC5B,CAAC;AAMD,OAAO,kBAAkB,uBAAuB,OAAO,YAAY;AACjE,QAAM,EAAE,MAAM,WAAW,KAAK,IAAI,QAAQ;AAE1C,MAAI,CAAC,mBAAmB,KAAK,mBAAmB;AAC9C,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,MACD,SAAS;AAAA,IACX;AAAA,EACF;AAGA,MAAI,SAAS,iBAAiB;AAC5B,UAAM,MAA4F;AAAA,MAChG,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AACA,QAAI,kBAAkB;AACpB,UAAI,gBAAgB;AACpB,UAAI,kBAAkB;AAAA,IACxB;AACA,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,IACzE;AAAA,EACF;AAEA,MAAI;AAEF,UAAM,qBAAqB,SAAS;AACpC,UAAM,OAAO,MAAM,wBAAwB,kBAAkB;AAE7D,mBAAe,yBACb,kBACA,aACA,aACA,QACA,aAMC;AACD,YAAM,SAAS;AACf,YAAM,SAAS;AACf,YAAM,aAAkB,aAAQ,aAAa,MAAM;AACnD,YAAM,aAAgB,cAAW,UAAU;AAC3C,YAAM,mBAAwC,oBAAI,IAAI;AACtD,YAAM,iBAAsC,oBAAI,IAAI;AACpD,UAAI,cAAc,CAAC,OAAO,QAAQ,MAAM,EAAE,SAAS,MAAM,GAAG;AAC1D,cAAM,aAAgB,gBAAa,YAAY,OAAO;AACtD,cAAM,gBAAgB;AACtB,YAAI;AACJ,gBAAQ,QAAQ,cAAc,KAAK,UAAU,OAAO,MAAM;AACxD,gBAAM,UAAU,MAAM,CAAC;AACvB,gBAAM,WAAW,MAAM,CAAC,EAAE,KAAK;AAC/B,yBAAe,IAAI,SAAS,QAAQ;AACpC,cAAI,EAAE,WAAW,iBAAiB,cAAe,kBAAiB,IAAI,SAAS,QAAQ;AAAA,QACzF;AAAA,MACF;AACA,YAAM,qBAAqB,EAAE,GAAG,iBAAiB,aAAa;AAC9D,YAAM,iBAAkB,iBAAiB,QAAQ,QAAoC;AACrF,UAAI;AACJ,cAAQ,QAAQ;AAAA,QACd,KAAK;AAAO,uBAAa,kBAAkB,oBAAoB,gBAAgB,MAAM,gBAAgB;AAAG;AAAA,QACxG,KAAK;AAAQ,uBAAa,mBAAmB,oBAAoB,gBAAgB,MAAM,gBAAgB;AAAG;AAAA,QAC1G,KAAK;AAAQ,uBAAa,mBAAmB,oBAAoB,gBAAgB,MAAM,gBAAgB;AAAG;AAAA,QAC1G,KAAK;AAAQ,uBAAa,mBAAmB,iBAAiB,MAAM;AAAG;AAAA,QACvE,KAAK;AAAM,uBAAa,iBAAiB,iBAAiB,MAAM;AAAG;AAAA,QACnE,KAAK;AAAM,uBAAa,iBAAiB,iBAAiB,MAAM;AAAG;AAAA,QACnE,KAAK;AAAS,uBAAa,oBAAoB,oBAAoB,gBAAgB,MAAM,gBAAgB;AAAG;AAAA,QAC5G,KAAK;AAAU,uBAAa,qBAAqB,oBAAoB,gBAAgB,MAAM,gBAAgB;AAAG;AAAA,QAC9G,KAAK;AAAQ,uBAAa,mBAAmB,oBAAoB,gBAAgB,MAAM,gBAAgB;AAAG;AAAA,QAC1G;AAAS,uBAAa,kBAAkB,oBAAoB,gBAAgB,MAAM,gBAAgB;AAAA,MACpG;AACA,YAAM,aAAa,OAAO,KAAK,kBAAkB,EAAE;AACnD,YAAM,eAAe,OAAO,KAAK,iBAAiB,YAAY,EAAE;AAChE,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,UAA4D,CAAC;AACjE,UAAI;AACJ,UAAI,cAAc,CAAC,OAAO,QAAQ,MAAM,EAAE,SAAS,MAAM,GAAG;AAC1D,cAAM,aAAgB,gBAAa,YAAY,OAAO;AACtD,eAAO,WAAW,YAAY,oBAAoB,QAAwB,gBAAgB,IAAI;AAC9F,cAAM,eAAe,KAAK,MAAM,SAAS,KAAK,SAAS;AACvD,cAAM,cAAc,KAAK,UAAU,SAAS,KAAK,aAAa;AAC9D,cAAM,eAAe,eAAe,cAAc;AAClD,YAAI,iBAAiB,KAAK,CAAC,QAAQ;AACjC,gBAAM,cAAc,iBAAiB,KAAK,aAAa,IAAI,KAAK,iBAAiB,KAAK,UAAU,EAAE,eAAe,IAAI;AACrH,mCAAyB,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAC7G,iBAAO;AAAA,YACL,cAAc,0CAAqC,iBAAiB,KAAK,OAAO,cAAc,WAAW;AAAA;AAAA,QAAe,MAAM;AAAA,UAAa,UAAU;AAAA,WAAc,iBAAiB,KAAK,OAAO;AAAA,gBAAmB,WAAW;AAAA,YAC9N,cAAc,CAAC;AAAA,YACf,YAAY,CAAC,EAAE,MAAM,YAAY,QAAQ,MAAM,QAAQ,8CAA8C,CAAC;AAAA,UACxG;AAAA,QACF;AACA,YAAI,iBAAiB,KAAK,QAAQ;AAChC,mCAAyB,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAC7G,iBAAO;AAAA,YACL,cAAc,6CAA6C,iBAAiB,KAAK,OAAO;AAAA;AAAA,QAA4C,MAAM;AAAA,UAAa,UAAU;AAAA,WAAc,iBAAiB,KAAK,OAAO;AAAA,YAC5M,cAAc,CAAC;AAAA,YACf,YAAY,CAAC,EAAE,MAAM,aAAa,QAAQ,MAAM,QAAQ,oBAAoB,CAAC;AAAA,UAC/E;AAAA,QACF;AACA,kBAAU,CAAC,GAAG,KAAK,UAAU,GAAG,KAAK,YAAY;AACjD,cAAM,0BAAuE,CAAC;AAC9E,mBAAW,CAAC,OAAO,KAAK,KAAK,iBAAiB,QAAQ,EAAG,yBAAwB,KAAK,EAAE,OAAO,WAAW,MAAM,CAAC;AACjH,iCAAyB;AAAA,UACvB,UAAU,CAAC,GAAG,KAAK,UAAU,GAAG,KAAK,YAAY,EAAE,IAAI,QAAM,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,IAAI,EAAE;AAAA,UAChH,SAAS;AAAA,UACT,OAAO,CAAC,GAAG,KAAK,OAAO,GAAG,KAAK,SAAS;AAAA,UACxC;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,QAAQ;AACV,cAAM,QAAQ,OAAO,KAAK,MAAM,SAAS,KAAK,UAAU,SAAS;AACjE,cAAM,WAAW,OAAO,KAAK,SAAS,SAAS,KAAK,aAAa,SAAS;AAC1E,cAAM,aAAa,cAAc,OAC7B,cAAc,KAAK,WAAW,QAAQ,cACtC,CAAC,aACC,oCAAoC,UAAU,aAC9C;AACN,cAAM,SAAS;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,MAAM;AAAA,UACjB,aAAa,MAAM;AAAA,UACnB,aAAa,UAAU,KAAK,eAAe;AAAA,UAC3C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC3B,eAAO;AAAA,UACL,cAAc;AAAA,UACd,cAAc,CAAC;AAAA,UACf,YAAY,CAAC,EAAE,MAAM,aAAa,QAAQ,MAAM,QAAQ,oBAAoB,CAAC;AAAA,QAC/E;AAAA,MACF;AAEA,YAAM,YAAiB,aAAQ,UAAU;AACzC,UAAI,CAAI,cAAW,SAAS,EAAG,CAAG,aAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1E,MAAG,iBAAc,YAAY,UAAU;AACvC,YAAM,aAAoC,CAAC;AAC3C,iBAAW,KAAK,4BAA4B,YAAY,QAAQ,UAAU,CAAC;AAE3E,YAAM,eAAkC,CAAC;AACzC,YAAM,oBAAoB,aAAa,oCAAoC,YAAY,gBAAgB,IAAI,CAAC;AAC5G,YAAM,WAAW,mBAAmB;AAAA,QAClC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,qBAAqB;AAAA,QACpC,2BAA2B,CAAC,CAAC,wBAAwB,QAAQ;AAAA,QAC7D,sBAAsB,wBAAwB,QAAQ,UAAU;AAAA,MAClE,CAAC;AACD,YAAM,yBACJ,cAAc,CAAC,OAAO,QAAQ,MAAM,EAAE,SAAS,MAAM,IACjD,EAAE,aAAa,MAAM,kBAAkB,eAAe,MAAM,iBAAiB,WAAW,IACxF,EAAE,aAAa,OAAO,kBAAkB,QAAiC,iBAAiB,WAAW;AAC3G,aAAO,EAAE,cAAc,UAAU,cAAc,YAAY,uBAAuB;AAAA,IACpF;AAEA,YAAQ,MAAM;AAAA,MACZ,KAAK,YAAY;AACf,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,eAAe,KAAK,QAAQA,KAAI;AAE9C,YAAI,UAAU,QAAW;AACvB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO,oBAAoBA,KAAI;AAAA,gBAC/B,YAAY;AAAA,gBACZ,qBAAqB;AAAA,cACvB,GAAG,MAAM,CAAC;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,cAAM,YAAY,UAAUA,MAAK,QAAQ,OAAO,GAAG,CAAC;AACpD,cAAM,SAAS,KAAK,aAAa,SAAS;AAE1C,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB,MAAAA;AAAA,cACA;AAAA,cACA,aAAa,UAAU,OAAO,SAAS;AAAA,cACvC,OAAO,2BAA2B,SAAS;AAAA,YAC7C,GAAG,MAAM,CAAC;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,cAAc;AACjB,cAAM,WAAW,MAAM;AACvB,cAAM,cAAc,MAAM;AAE1B,YAAI,eAAwB,KAAK,OAAO,QAAQ;AAEhD,YAAI,eAAe,gBAAgB,OAAO,iBAAiB,UAAU;AACnE,yBAAe,eAAe,cAAyC,WAAW;AAAA,QACpF;AAEA,YAAI,CAAC,cAAc;AACjB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO,uBAAuB,QAAQ,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAAA,gBAC7E,qBAAqB;AAAA,cACvB,GAAG,MAAM,CAAC;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,OAAO,cAAc,YAAY;AAGvC,cAAM,oBAAoB,KAAK,IAAI,CAAC,EAAE,MAAAA,OAAM,MAAM,MAAM;AAEtD,gBAAM,WAAW,cACb,GAAG,QAAQ,IAAI,WAAW,IAAIA,KAAI,KAClC,GAAG,QAAQ,IAAIA,KAAI;AAGvB,cAAI;AAEJ,cAAI,aAAa,YAAY,gBAAgB,gBAAgB;AAG3D,qBAAS,KAAK,aAAa,sBAAsBA,KAAI,EAAE;AAAA,UACzD,WAAW,aAAa,YAAY,aAAa,WAAW,QAAQ,GAAG;AAGrE,qBAAS,KAAK,aAAa,gBAAgBA,KAAI,EAAE;AAAA,UACnD,OAAO;AAEL,kBAAM,YAAY,UAAU,SAAS,QAAQ,OAAO,GAAG,CAAC;AACxD,qBAAS,KAAK,aAAa,SAAS;AAAA,UACtC;AAEA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,YACA,aAAa,UAAU;AAAA,UACzB;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB;AAAA,cACA;AAAA,cACA,OAAO,kBAAkB;AAAA,cACzB,QAAQ,kBAAkB,MAAM,GAAG,EAAE;AAAA;AAAA,cACrC,WAAW,kBAAkB,SAAS;AAAA,YACxC,GAAG,MAAM,CAAC;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM,QAAQ,MAAM;AACpB,cAAM,UAAU,aAAa,KAAK,QAAQ,KAAK;AAE/C,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB;AAAA,cACA,OAAO,QAAQ;AAAA,cACf,SAAS,QAAQ,MAAM,GAAG,EAAE;AAAA,cAC5B,WAAW,QAAQ,SAAS;AAAA,YAC9B,GAAG,MAAM,CAAC;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM,aAAa,KAAK,OAAO;AAC/B,cAAM,YAAa,MAAM,aAAwB;AACjD,cAAM,WAAW,aAAa,kBAAkB,YAAY,SAAS,IAAI,CAAC;AAC1E,cAAM,qBAAqB,YAAY;AACvC,cAAM,kBAAkB,YAAY;AACpC,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB,OAAO,SAAS;AAAA,cAChB;AAAA,cACA,aAAa;AAAA,cACb,GAAI,sBAAsB,QAAQ,mBAAmB,QAAQ;AAAA,gBAC3D,eAAe;AAAA,kBACb,WAAW,SAAS,SAAS;AAAA,kBAC7B,QAAQ,SAAS,SAAS;AAAA,gBAC5B;AAAA,cACF;AAAA,YACF,GAAG,MAAM,CAAC;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,QAAQ,MAAM;AACpB,cAAM,UAAW,MAAM,WAAsB;AAG7C,cAAM,aAAa,sBAAsB,KAAK,KAAK;AACnD,cAAM,aAAa,wBAAwB,KAAK,KAAK;AACrD,cAAM,eAAe,UAAU,KAAK,KAAK;AAEzC,YAAI,CAAC,cAAc,CAAC,cAAc,CAAC,cAAc;AAC/C,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,OAAO;AAAA,gBACP,SAAS;AAAA,cACX,GAAG,MAAM,CAAC;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,cAAM,UAAU,aAAa,KAAK,QAAQ,KAAK;AAE/C,YAAI,QAAQ,SAAS,GAAG;AACtB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,gBAAgB,QAAQ,MAAM,GAAG,CAAC;AAAA,gBAClC,YAAY,kBAAkB,QAAQ,CAAC,EAAE,KAAK,QAAQ,OAAO,GAAG,CAAC,gBAAgB,KAAK;AAAA,cACxF,GAAG,MAAM,CAAC;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB;AAAA,cACA,OAAO;AAAA,cACP,SAAS;AAAA,cACT,YAAY;AAAA,cACZ;AAAA,YACF,GAAG,MAAM,CAAC;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,YAAY;AACf,cAAM,WAAW,MAAM;AACvB,cAAM,QAAQ,UAAU,YAAY,EAAE,KAAK;AAE3C,cAAM,WAAW,GAAG,OAAO,WAAW,IAAI;AAC1C,gBAAQ,MAAM,wBAAwB,QAAQ,GAAG,QAAQ,UAAU,KAAK,KAAK,EAAE,EAAE;AAEjF,cAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,YAAI,OAAQ,SAAQ,WAAW,IAAI;AAEnC,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,UAAU,EAAE,QAAQ,CAAC;AAClD,kBAAQ,MAAM,+BAA+B,SAAS,MAAM,EAAE;AAE9D,cAAI,CAAC,SAAS,IAAI;AAChB,kBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,oBAAQ,MAAM,8BAA8B,SAAS,EAAE;AACvD,kBAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,MAAM,SAAS,EAAE;AAAA,UAC5E;AAEA,gBAAM,UAAU,MAAM,SAAS,KAAK;AACpC,gBAAM,aAAa,QAAQ,cAAc,CAAC;AAC1C,gBAAM,WAAW,QAAQ,SAAS,CAAC;AAEnC,cAAI,CAAC,OAAO;AACV,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,YAC5F;AAAA,UACF;AAEA,gBAAM,oBAA8C;AAAA,YAClD,QAAQ,CAAC,WAAW,QAAQ;AAAA,YAC5B,MAAM,CAAC,WAAW,YAAY;AAAA,YAC9B,YAAY,CAAC,WAAW,YAAY;AAAA,YACpC,QAAQ,CAAC,WAAW,QAAQ;AAAA,YAC5B,OAAO,CAAC,WAAW,OAAO;AAAA,YAC1B,QAAQ,CAAC,WAAW,WAAW,UAAU,QAAQ;AAAA,YACjD,QAAQ,CAAC,WAAW,UAAU,WAAW,UAAU,WAAW,OAAO;AAAA,YACrE,OAAO,CAAC,WAAW,UAAU,WAAW,UAAU,WAAW,OAAO;AAAA,UACtE;AACA,gBAAM,eAAe,kBAAkB,KAAK;AAC5C,cAAI,CAAC,cAAc;AACjB,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,YAC5F;AAAA,UACF;AAEA,gBAAM,qBAA+C,CAAC;AACtD,gBAAM,gBAA0B,CAAC;AACjC,qBAAW,OAAO,cAAc;AAC9B,kBAAM,OAAO,WAAW,GAAG;AAC3B,gBAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,iCAAmB,GAAG,IAAI;AAC1B,4BAAc,KAAK,GAAG,IAAI;AAAA,YAC5B;AAAA,UACF;AACA,kBAAQ,MAAM,kBAAkB,cAAc,MAAM,oBAAoB,KAAK,EAAE;AAC/E,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,EAAE,OAAO,eAAe,YAAY,mBAAmB,GAAG,MAAM,CAAC;AAAA,YACxF,CAAC;AAAA,UACH;AAAA,QACF,SAAS,YAAY;AACnB,kBAAQ,MAAM,2BAA2B,UAAU;AACnD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,KAAK,mBAAmB;AACtB,cAAM,OAAO,MAAM;AAGnB,cAAM,aAAa,KAAK,KAAK,KAAK,YAAY,EAAE,QAAQ,cAAc,GAAG;AACzE,cAAM,UAAU,CAAC,0BAA0B;AAC3C,YAAI,KAAM,SAAQ,KAAK,WAAW,IAAI;AACtC,YAAI,YAAa,SAAQ,KAAK,kBAAkB,WAAW;AAE3D,cAAM,SAAS;AAAA,UACb,YAAY;AAAA,YACV,CAAC,UAAU,GAAG;AAAA,cACZ,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAA6D;AAAA,UACjE,QAAQ,EAAE,MAAM,oBAAoB,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAC7E,kBAAkB,EAAE,MAAM,8BAA8B,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UACjG,UAAU,EAAE,MAAM,sBAAsB,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UACjF,UAAU,EAAE,MAAM,yBAAyB,SAAS,KAAK,UAAU,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,MAAM,YAAY,SAAS,OAAO,MAAM,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE;AAAA,UAC/J,QAAQ,EAAE,MAAM,yBAAyB,SAAS,KAAK,UAAU,EAAE,eAAe,OAAO,WAAW,GAAG,MAAM,CAAC,EAAE;AAAA,QAClH;AAEA,YAAI,SAAS,OAAO;AAClB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,SAAS;AAAA,gBACT,SAAS,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO;AAAA,kBAChD,MAAM;AAAA,kBACN,MAAM,EAAE;AAAA,kBACR,SAAS,KAAK,MAAM,EAAE,OAAO;AAAA,gBAC/B,EAAE;AAAA,cACJ,GAAG,MAAM,CAAC;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,iBAAiB,QAAQ,IAA4B;AAC3D,YAAI,CAAC,gBAAgB;AACnB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO,iBAAiB,IAAI;AAAA,gBAC5B,gBAAgB,OAAO,KAAK,OAAO;AAAA,cACrC,GAAG,MAAM,CAAC;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB;AAAA,cACA,MAAM,eAAe;AAAA,cACrB,SAAS,KAAK,MAAM,eAAe,OAAO;AAAA,cAC1C,cAAc,sBAAsB,eAAe,IAAI;AAAA,YACzD,GAAG,MAAM,CAAC;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,cAAM,OAAO,MAAM;AAEnB,cAAM,eAAuC;AAAA,UAC3C,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgBR,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAeT,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAeV,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAcP,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAeV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAcL,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAiBlB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAaX;AAEA,cAAM,cAAc,aAAa,IAAI;AACrC,YAAI,CAAC,aAAa;AAChB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO,iBAAiB,IAAI;AAAA,gBAC5B,gBAAgB,OAAO,KAAK,YAAY;AAAA,cAC1C,GAAG,MAAM,CAAC;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,WAAW;AACd,cAAM,aAAa,MAAM,eAAe;AACxC,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,SAAU,MAAM,UAAqB;AAC3C,cAAM,SAAU,MAAM,UAA2B;AACjD,cAAM,cAAmB;AAAA,UACtB,MAAM,iBAA4B,QAAQ,IAAI,uBAAuB,QAAQ,IAAI;AAAA,QACpF;AACA,cAAM,QAAkB,CAAC,SAAS,iDAAiD,0BAAqB;AACxG,YAAI,oBAAoB;AACxB,cAAM,gBAAuC,CAAC;AAC9C,YAAI;AAEJ,YAAI,CAAC,YAAY;AACf,gBAAM,SAAS,MAAM,yBAAyB,MAAM,QAAQ,QAAQ,QAAQ,WAAW;AACvF,8BAAoB,OAAO;AAC3B,wBAAc,KAAK,GAAG,OAAO,UAAU;AACvC,mCAAyB,OAAO;AAChC,cAAI,QAAQ;AACV,kBAAM,KAAK,uBAAuB,MAAM,KAAK,MAAM,GAAG;AAAA,UACxD,OAAO;AACL,kBAAM,KAAK,WAAW,MAAM,KAAK,MAAM,GAAG;AAAA,UAC5C;AAAA,QACF;AAEA,cAAM,YAAY,OAAO,KAAK,KAAK,WAAW,OAAO;AACrD,cAAM,eAAgB,KAAK,KAAiC;AAC5D,cAAM,YAAiB,aAAQ,aAAa,0BAA0B;AACtE,cAAM,eAAoB,aAAQ,aAAa,0BAA0B;AACzE,cAAM,mBAAmB,wBAAwB,MAAM,WAAW,YAAY;AAE9E,YAAI,QAAQ;AACV,gBAAM,YAAY,iBAAiB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAC/D,gBAAM,KAAK,uBAAuB,SAAS,EAAE;AAC7C,gBAAM,KAAK,gDAAgD;AAC3D,gBAAM,aAAa,CAAC,MAAM,KAAK,IAAI,GAAG,iBAAiB,EAAE,OAAO,OAAO,EAAE,KAAK,aAAa;AAC3F,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM;AAAA;AAAA,EAAgD,UAAU,GAAG,CAAC;AAAA,UAChG;AAAA,QACF;AAEA,YAAI,CAAI,cAAW,SAAS,EAAG,CAAG,aAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1E,cAAM,gBAA0E,CAAC;AACjF,mBAAW,MAAM,kBAAkB;AACjC,gBAAM,UAAe,aAAQ,aAAa,GAAG,IAAI;AACjD,gBAAM,UAAa,cAAW,OAAO;AACrC,gBAAM,cAAc,UAAU,yBAAyB,OAAO,IAAI;AAClE,gBAAM,YAAY,UAAW,cAAc,OAAO,WAAW,KAAK,aAAc;AAChF,UAAG,iBAAc,SAAS,GAAG,OAAO;AACpC,wBAAc,KAAK,EAAE,MAAM,SAAS,QAAW,cAAW,OAAO,IAAI,OAAO,QAAQ,QAAQ,WAAW,CAAC;AACxG,wBAAc,KAAK,EAAE,MAAM,GAAG,MAAM,WAAW,GAAG,WAAW,MAAM,UAAU,CAAC;AAAA,QAChF;AACA,cAAM,kBAAkB,cAAc,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,KAAK;AACxE,cAAM,KAAK,WAAW,eAAe,SAAS,SAAS,GAAG;AAE1D,cAAM,SAAS,KAAK;AACpB,cAAM,aAAa,QAAQ;AAC3B,cAAM,aAAa,YAAY;AAC/B,cAAM,YAAsB,CAAC;AAC7B,YAAI,YAAY;AACd,qBAAW,OAAO,CAAC,WAAW,WAAW,MAAM,GAAG;AAChD,kBAAM,IAAI,WAAW,GAAG;AACxB,gBAAI,OAAO,MAAM,YAAY,KAAK,CAAC,UAAU,SAAS,CAAC,EAAG,WAAU,KAAK,CAAC;AAAA,UAC5E;AAAA,QACF;AACA,cAAM,QAAQ,QAAQ;AACtB,cAAM,gBAAiE;AAAA,UACrE,QAAQ,EAAE,KAAK,gBAAgB,QAAQ,sBAAsB;AAAA,UAC7D,WAAW,EAAE,KAAK,oBAAoB,QAAQ,yBAAyB;AAAA,UACvE,UAAU,EAAE,KAAK,kBAAkB,QAAQ,wBAAwB;AAAA,QACrE;AACA,cAAM,MAAM,OAAO,WAAW;AAC9B,cAAM,WAAW,cAAc,GAAG,KAAK,cAAc;AACrD,cAAM,sBAA8C,EAAE,OAAO,qCAAqC,iBAAiB,OAAO,KAAK,KAAK,WAAW,OAAO,EAAE;AACxJ,YAAI,iBAAiB,KAAK,CAAC,MAAM,EAAE,cAAc,uBAAuB,GAAG;AACzE,8BAAoB,mBAAmB;AAAA,QACzC;AACA,cAAM,WAAW;AAAA,UACf,cAAc,EAAE,MAAM,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,QAAQ;AAAA,UACjE,WAAW,aAAa,SAAY;AAAA,UACpC,aAAa;AAAA,YACX,SAAS,SAAS;AAAA,YAClB,eAAe,SAAS;AAAA,YACxB,kBAAkB,OAAO,eAAe,OAAO,sBAAsB;AAAA,YACrE,kBAAkB,OAAO;AAAA,UAC3B;AAAA,UACA,OAAO,EAAE,UAAU,UAAU;AAAA,UAC7B,QAAQ;AAAA,QACV;AACA,cAAM,kBAAqB,cAAW,YAAY;AAClD,QAAG,iBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAChE,sBAAc,KAAK,EAAE,MAAM,cAAc,QAAW,cAAW,YAAY,IAAI,OAAO,QAAQ,QAAQ,WAAW,CAAC;AAClH,cAAM,KAAK,gEAAgE;AAE3E,cAAM,aAAgE,CAAC;AACvE,YAAI,CAAC,cAAc,wBAAwB;AACzC,gBAAM,UAAU,uBAAuB,eAAe,uBAAuB,oBAAoB,OAC7F,GAAG,uBAAuB,gBAAgB,cAAc,MAAM,KAC9D;AACJ,qBAAW,KAAK;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,YACN,IAAI,GAAG,uBAAuB,eAAe,cAAc,MAAM,KAAK,MAAM;AAAA,UAC9E,CAAC;AAAA,QACH;AACA,cAAM,aAAa,cAAc,SAAU,cAAc,MAAM,CAAC,MAAM,EAAE,SAAS,SAAS,IAAI,YAAY,YAAa;AACvH,YAAI,cAAc,SAAS,GAAG;AAC5B,qBAAW,KAAK;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,YACN,IAAI,GAAG,eAAe,SAAS,SAAS;AAAA,UAC1C,CAAC;AAAA,QACH;AACA,mBAAW,KAAK;AAAA,UACd,MAAM;AAAA,UACN,MAAM,kBAAkB,aAAa;AAAA,UACrC,IAAI;AAAA,QACN,CAAC;AACD,YAAI,2BAA2B,uBAAuB,SAAS,SAAS,KAAK,uBAAuB,MAAM,SAAS,KAAK,uBAAuB,QAAQ,SAAS,IAAI;AAClK,gBAAM,MAAM,uBAAuB;AACnC,gBAAM,MAAM,uBAAuB;AACnC,gBAAM,MAAM,uBAAuB;AACnC,gBAAM,aAAa;AAAA,YACjB,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,YACzB,GAAG;AAAA,YACH,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,UAC3B;AACA,gBAAM,YAAY,CAAC;AACnB,cAAI,IAAI,OAAQ,WAAU,KAAK,GAAG,IAAI,MAAM,WAAW;AACvD,cAAI,IAAI,OAAQ,WAAU,KAAK,GAAG,IAAI,MAAM,QAAQ;AACpD,cAAI,IAAI,OAAQ,WAAU,KAAK,GAAG,IAAI,MAAM,UAAU;AACtD,gBAAM,WAAW,WAAW,UAAU,IAAI,WAAW,KAAK,IAAI,IAAI,GAAG,WAAW,MAAM,YAAY,WAAW,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AACnI,qBAAW,KAAK;AAAA,YACd,MAAM;AAAA,YACN,MAAM,UAAU,KAAK,IAAI,KAAK;AAAA,YAC9B,IAAI;AAAA,UACN,CAAC;AACD,cAAI,IAAI,SAAS,KAAK,IAAI,UAAU,IAAI;AACtC,gBAAI,QAAQ,CAAC,MAAM;AACjB,yBAAW,KAAK,EAAE,MAAM,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,UAAU,IAAI,EAAE,SAAS,CAAC;AAAA,YAC5E,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,cACJ,8HAEA,WAAW,IAAI,CAAC,MAAM,YAAO,EAAE,IAAI,OAAO,EAAE,IAAI,WAAM,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI;AAEzE,cAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,cAAM,kBAAkB,sBAAsB,aAAa;AAC3D,cAAM,aAAa,cAAc,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AAChE,cAAM,aAAa,aACf,sGACA;AACJ,cAAM,WAAW,aAAa,cAAc,UAAU,oBAAoB;AAAA;AAAA,EAAU,iBAAiB,KAAK,MAAM;AAChH,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,SAAS,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,MAEA,KAAK,mBAAmB;AACtB,cAAMC,YAAW,MAAM;AACvB,cAAM,QAAQ,MAAM;AACpB,cAAM,SAAS,KAAK;AACpB,cAAM,aAAa,QAAQ;AAC3B,cAAM,aAAa,YAAY;AAC/B,cAAM,YAAsB,CAAC;AAC7B,YAAI,YAAY;AACd,qBAAW,OAAO,CAAC,WAAW,WAAW,MAAM,GAAG;AAChD,kBAAM,IAAI,WAAW,GAAG;AACxB,gBAAI,OAAO,MAAM,YAAY,KAAK,CAAC,UAAU,SAAS,CAAC,EAAG,WAAU,KAAK,CAAC;AAAA,UAC5E;AAAA,QACF;AACA,cAAM,QAAQ,QAAQ;AACtB,cAAM,gBAAiE;AAAA,UACrE,QAAQ,EAAE,KAAK,gBAAgB,QAAQ,sBAAsB;AAAA,UAC7D,WAAW,EAAE,KAAK,oBAAoB,QAAQ,yBAAyB;AAAA,UACvE,UAAU,EAAE,KAAK,kBAAkB,QAAQ,wBAAwB;AAAA,QACrE;AACA,cAAM,MAAM,OAAO,WAAW;AAC9B,cAAM,WAAW,cAAc,GAAG,KAAK,cAAc;AACrD,cAAM,UAAU;AAAA,UACd,aAAa;AAAA,YACX,SAAS,SAAS;AAAA,YAClB,eAAe,SAAS;AAAA,YACxB,kBAAkB,OAAO,eAAe,OAAO,sBAAsB;AAAA,YACrE,kBAAkB,OAAO;AAAA,YACzB,iBAAiB;AAAA,UACnB;AAAA,UACA,OAAO;AAAA,YACL,UAAU;AAAA,YACV,iBAAiB;AAAA,UACnB;AAAA,UACA,QAAQ,MAAM;AACZ,kBAAM,OAAO,wBAAwB,MAAM,OAAO,KAAK,KAAK,WAAW,OAAO,GAAI,KAAK,KAAiC,UAAU;AAClI,kBAAM,UAAU,KAAK,KAAK,CAAC,MAAM,EAAE,cAAc,UAAU;AAC3D,mBAAO,UAAU,EAAE,MAAM,QAAQ,MAAM,SAAS,iBAAiB,IAAI,EAAE,MAAM,qCAAqC,SAAS,iBAAiB;AAAA,UAC9I,GAAG;AAAA,UACH,GAAI,iBAAiB,MAAM,QACvB;AAAA,YACE,kBAAkB;AAAA,cAChB,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF,IACA,CAAC;AAAA,UACL,YAAY;AAAA,YACV,OAAO,CAAC,cAAc,aAAa;AAAA,YACnC,kBAAkB;AAAA,UACpB;AAAA,UACA,UAAUA,cAAa,SAAS,CAACA,YAC7B;AAAA,YACE,MAAM;AAAA,YACN,UAAU;AAAA,YACV,0BAA0B;AAAA,UAC5B,IACA;AAAA,UACJ,MAAM;AAAA,YACJ,QAAQ,KAAK,KAAK;AAAA,YAClB,UAAUA,aAAY;AAAA,YACtB,OAAO,SAAS;AAAA,YAChB,qBAAqB,KAAK,KAAK,WAAW;AAAA,YAC1C,wBAAyB,KAAK,KAAiC;AAAA,UACjE;AAAA,QACF;AACA,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,UACvC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,cAAM,WAAW,yBAAyB,IAAI;AAC9C,cAAM,MAuBF,CAAC;AACL,cAAM,mBAAmB;AACzB,cAAM,YAAY;AAAA,UAChB,8BAA8B;AAAA,UAC9B,8BAA8B;AAAA,UAC9B,8BAA8B;AAAA,UAC9B;AAAA,QACF,EAAE,KAAK,GAAG;AACV,YAAI;AACF,gBAAM,YAAY,MAAM,kBAAkB;AAC1C,cAAI,CAAC,WAAW;AACd,gBAAI,mBAAmB;AACvB,gBAAI,mBAAmB;AACvB,gBAAI,kBAAkB,yCAAyC,SAAS;AACxE,gBAAI,eAAe;AAAA,cACjB,0BAA0B,SAAS;AAAA,cACnC,aAAa,SAAS;AAAA,cACtB,YAAY,SAAS;AAAA,cACrB,2BAA2B,SAAS;AAAA,cACpC,cAAc,SAAS;AAAA,YACzB;AACA,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,YACzE;AAAA,UACF;AACA,gBAAM,eAAoE,CAAC;AAC3E,qBAAW,QAAQ,SAAS,0BAA0B;AACpD,gBAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,oBAAM,SAAS,MAAM,kBAAkB,0BAA0B;AAAA,gBAC/D,gBAAgB,KAAK;AAAA,gBACrB,OAAO,KAAK;AAAA,gBACZ,WAAW,KAAK;AAAA,gBAChB,6BAA6B;AAAA,gBAC7B,aAAa,KAAK;AAAA,cACpB,CAAC;AACD,2BAAa,KAAK,EAAE,gBAAgB,KAAK,gBAAgB,OAAO,CAAC;AAAA,YACnE;AAAA,UACF;AACA,cAAI,aAAa,SAAS,GAAG;AAC3B,gBAAI,iBAAiB,aAAa,WAAW,IAAI,aAAa,CAAC,EAAE,SAAS;AAAA,UAC5E;AACA,cAAI,SAAS,YAAY,SAAS,GAAG;AACnC,gBAAI,cAAc,MAAM,kBAAkB,uBAAuB;AAAA,cAC/D,QAAQ,SAAS;AAAA,cACjB,+BAA+B;AAAA,YACjC,CAAC;AAAA,UACH;AACA,cAAI,SAAS,0BAA0B,SAAS,GAAG;AACjD,kBAAM,gBAAkF,CAAC;AACzF,gBAAI;AACF,yBAAW,QAAQ,SAAS,2BAA2B;AACrD,sBAAM,SAAS,MAAM,kBAAkB,2BAA2B;AAAA,kBAChE,gBAAgB,KAAK;AAAA,kBACrB,WAAW,KAAK,UAAU,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE;AAAA,kBACvE,QAAQ,KAAK;AAAA,kBACb,6BAA6B;AAAA,gBAC/B,CAAC;AACD,8BAAc,KAAK,EAAE,aAAa,KAAK,aAAa,OAAO,CAAC;AAAA,cAC9D;AACA,kBAAI,kBAAkB;AAAA,YACxB,SAAS,GAAG;AACV,oBAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,kBAAI,kBAAkB,EAAE,OAAO,IAAI;AACnC,kBAAI,IAAI,SAAS,oBAAoB,KAAK,IAAI,SAAS,yBAAyB,GAAG;AACjF,oBAAI,sBAAsB;AAAA,cAC5B;AAAA,YACF;AAAA,UACF;AACA,cAAI,SAAS,WAAW,SAAS,GAAG;AAClC,gBAAI,aAAa,MAAM,kBAAkB,sBAAsB;AAAA,cAC7D,QAAQ,SAAS;AAAA,cACjB,8BAA8B;AAAA,YAChC,CAAC;AAAA,UACH;AACA,cAAI,SAAS,aAAa,SAAS,GAAG;AACpC,gBAAI,eAAe,MAAM,kBAAkB,wBAAwB;AAAA,cACjE,QAAQ,SAAS;AAAA,cACjB,gCAAgC;AAAA,YAClC,CAAC;AAAA,UACH;AACA,cAAI,eAAe;AAAA,YACjB,0BAA0B,SAAS;AAAA,YACnC,aAAa,SAAS;AAAA,YACtB,YAAY,SAAS;AAAA,YACrB,2BAA2B,SAAS;AAAA,YACpC,cAAc,SAAS;AAAA,UACzB;AAAA,QACF,SAAS,GAAG;AACV,cAAI,QAAQ,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,cAAI,eAAe;AAAA,YACjB,0BAA0B,SAAS;AAAA,YACnC,aAAa,SAAS;AAAA,YACtB,YAAY,SAAS;AAAA,YACrB,2BAA2B,SAAS;AAAA,YACpC,cAAc,SAAS;AAAA,UACzB;AACA,gBAAM,SAAS,IAAI,MAAM,YAAY;AACrC,gBAAM,oBAAoB,OAAO,SAAS,cAAc,KAAK,OAAO,SAAS,gBAAgB,KAAK,OAAO,SAAS,WAAW,KAAK,OAAO,SAAS,SAAS;AAC3J,cAAI,mBAAmB;AACrB,gBAAI,mBAAmB;AACvB,gBAAI,mBAAmB;AACvB,gBAAI,kBAAkB,yCAAyC,SAAS;AAAA,UAC1E,WAAW,OAAO,SAAS,sBAAsB,KAAK,OAAO,SAAS,cAAc,GAAG;AACrF,gBAAI,kBAAkB,GAAG,8BAA8B,aAAa,IAAI,8BAA8B,OAAO;AAAA,UAC/G;AAAA,QACF;AACA,cAAM,mBAAmB,IAAI;AAC7B,YAAI,kBAAkB,UAAU,iBAAiB,UAAU,QAAQ;AACjE,gBAAM,cAAc,iBAAiB,SAAS,CAAC,EAAE;AACjD,cAAI,UAAU,gBAAgB,iBAAiB,MAAM,0BAA0B,WAAW;AAAA,QAC5F;AACA,YAAI,IAAI,qBAAqB;AAC3B,cAAI,UAAU,CAAC,IAAI,SAAS,IAAI,mBAAmB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC/E;AAEA,cAAM,eAAyB,CAAC;AAChC,cAAM,cAAc,IAAI;AAIxB,YAAI,aAAa;AACf,gBAAM,UAAU,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,EAAE,QAAQ,YAAY,CAAC;AACnF,cAAI,cAAc;AAClB,cAAI,eAAe;AACnB,qBAAW,KAAK,SAAS;AACvB,kBAAM,MAAO,EAAkE;AAC/E,gBAAI,KAAK,eAAe,OAAQ,gBAAe,IAAI,cAAc;AACjE,iBAAK,KAAK,WAAW,KAAK,EAAG,iBAAgB,IAAK,WAAW;AAAA,UAC/D;AACA,cAAI,cAAc,KAAK,eAAe,GAAG;AACvC,kBAAM,QAAkB,CAAC;AACzB,gBAAI,cAAc,EAAG,OAAM,KAAK,GAAG,WAAW,SAAS;AACvD,gBAAI,eAAe,EAAG,OAAM,KAAK,GAAG,YAAY,UAAU;AAC1D,yBAAa,KAAK,WAAW,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,UAClD;AAAA,QACF;AACA,cAAM,cAAc,IAAI;AACxB,YAAI,aAAa;AACf,gBAAM,IAAI,YAAY,WAAW;AACjC,gBAAM,IAAI,YAAY,WAAW;AACjC,gBAAM,IAAI,YAAY,WAAW;AACjC,cAAI,IAAI,IAAI,IAAI,GAAG;AACjB,kBAAM,QAAkB,CAAC;AACzB,gBAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,gBAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,gBAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,yBAAa,KAAK,iBAAiB,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,UACxD;AAAA,QACF;AACA,cAAM,eAAe,IAAI;AACzB,YAAI,cAAc;AAChB,gBAAM,IAAI,aAAa,WAAW;AAClC,gBAAM,IAAI,aAAa,WAAW;AAClC,gBAAM,IAAI,aAAa,WAAW;AAClC,cAAI,IAAI,IAAI,IAAI,GAAG;AACjB,kBAAM,QAAkB,CAAC;AACzB,gBAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,gBAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,gBAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,yBAAa,KAAK,4BAA4B,MAAM,KAAK,IAAI,CAAC,GAAG;AACjE,gBAAI,aAAa,cAAc,QAAQ;AACrC,2BAAa,KAAK,YAAY,aAAa,aAAa,KAAK,IAAI,CAAC,GAAG;AAAA,YACvE;AAAA,UACF;AAAA,QACF;AACA,cAAM,YAAY,IAAI;AACtB,YAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,gBAAM,QAAQ,UAAU,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,QAAQ,eAAe,UAAU,IAAI,CAAC;AAC1F,gBAAM,eAAe,UAAU,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,QAAQ,WAAW,IAAI,CAAC;AACnF,cAAI,QAAQ,KAAK,eAAe,GAAG;AACjC,kBAAM,QAAkB,CAAC;AACzB,gBAAI,QAAQ,EAAG,OAAM,KAAK,GAAG,KAAK,SAAS;AAC3C,gBAAI,eAAe,EAAG,OAAM,KAAK,GAAG,YAAY,UAAU;AAC1D,yBAAa,KAAK,qBAAqB,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,UAC5D;AAAA,QACF;AACA,cAAM,wBAAwB,IAAI;AAClC,YAAI,0BAA0B,sBAAsB,WAAW,MAAM,sBAAsB,WAAW,MAAM,sBAAsB,WAAW,KAAK,GAAG;AACnJ,gBAAM,IAAI,sBAAsB,WAAW;AAC3C,gBAAM,IAAI,sBAAsB,WAAW;AAC3C,gBAAM,IAAI,sBAAsB,WAAW;AAC3C,gBAAM,QAAkB,CAAC;AACzB,cAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,cAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,cAAI,IAAI,EAAG,OAAM,KAAK,GAAG,CAAC,UAAU;AACpC,uBAAa,KAAK,gBAAgB,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,QACvD;AACA,YAAI,aAAa,SAAS,KAAK,CAAC,IAAI,OAAO;AACzC,cAAI,UAAU,CAAC,IAAI,SAAS,aAAa,KAAK,GAAG,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC9E;AACA,YAAI,mBAAmB;AACvB,cAAM,eAAe,IAAI,UAAU,GAAG,IAAI,OAAO;AAAA;AAAA,EAAO,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC,KAAK,KAAK,UAAU,KAAK,MAAM,CAAC;AACpH,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,UACD,GAAI,IAAI,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,QACvC;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AAEpB,YAAI,kBAAkB,OAAO;AAC3B,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,8EAA8E,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,YACnJ,SAAS;AAAA,UACX;AAAA,QACF;AACA,cAAM,SAAS,MAAM;AACrB,YAAI,WAAW,WAAW;AACxB,cAAI;AACF,kBAAM,YAAY,MAAM,kBAAkB;AAC1C,gBAAI;AACJ,gBAAI,WAAW;AACb,kBAAI;AACF,sBAAM,MAAM,MAAM,kBAAkB,kCAAkC,CAAC,CAAC;AACxE,0BAAU;AAAA,cACZ,QAAQ;AAAA,cAAqC;AAAA,YAC/C;AACA,kBAAM,YAAsB,CAAC;AAC7B,kBAAM,UAAoB,CAAC;AAC3B,kBAAM,iBAA2B,CAAC;AAClC,kBAAM,mBAA6B,CAAC;AACpC,gBAAI,SAAS;AACX,yBAAW,QAAQ,QAAQ,uBAAuB,CAAC,GAAG;AACpD,2BAAW,KAAK,KAAK,UAAW,WAAU,KAAK,EAAE,IAAI;AAAA,cACvD;AACA,yBAAW,QAAQ,QAAQ,8BAA8B,CAAC,GAAG;AAC3D,2BAAW,KAAK,KAAK,UAAW,SAAQ,KAAK,EAAE,IAAI;AAAA,cACrD;AACA,yBAAW,KAAK,QAAQ,cAAc,CAAC,EAAG,gBAAe,KAAK,EAAE,IAAI;AACpE,yBAAW,KAAK,QAAQ,gBAAgB,CAAC,EAAG,kBAAiB,KAAK,EAAE,IAAI;AAAA,YAC1E;AACA,kBAAM,iBAAiB,oBAAoB,sBAAsB;AAAA,cAC/D,gBAAgB;AAAA,cAChB,kBAAkB;AAAA,cAClB,YAAY;AAAA,cACZ,cAAc;AAAA,YAChB,CAAC;AAED,gBAAI,eAAwB;AAC5B,gBAAI,WAAW;AACb,kBAAI;AACF,sBAAM,MAAM,MAAM,kBAAkB,yBAAyB,CAAC,CAAC;AAC/D,oBAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,iCAAe;AAAA,gBACjB;AAAA,cACF,QAAQ;AAAA,cAA8C;AAAA,YACxD;AAEA,mBAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,MAAM;AAAA,gBACN,MAAM,KAAK,UAAU;AAAA,kBACnB,GAAG;AAAA,kBACH,iBAAiB;AAAA,kBACjB,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,kBACvC,GAAI,YAAY;AAAA,oBACd,cAAc,oBAAoB;AAAA,oBAClC,WAAW;AAAA,kBACb,IAAI,CAAC;AAAA,kBACL,GAAI,YAAY,CAAC,IAAI,EAAE,MAAM,8EAA8E;AAAA,gBAC7G,GAAG,MAAM,CAAC;AAAA,cACZ,CAAC;AAAA,YACH;AAAA,UACF,SAAS,GAAG;AACV,kBAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,mBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,KAAK;AAAA,UACrG;AAAA,QACF;AACA,YAAI,WAAW,SAAS;AACtB,gBAAM,iBAAiB,MAAM;AAC7B,gBAAM,cAAe,MAAM,eAA2C,CAAC;AACvE,cAAI,CAAC,kBAAkB,OAAO,mBAAmB,UAAU;AACzD,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,wFAAwF,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,cAC7J,SAAS;AAAA,YACX;AAAA,UACF;AACA,gBAAM,cAAc,eAAe,QAAQ,UAAU,CAAC,MAAc,IAAI,EAAE,YAAY,CAAC,EAAE;AACzF,gBAAM,sBAAsB,IAAI,IAAI,oBAAoB,CAAC;AACzD,cAAI,CAAC,oBAAoB,IAAI,WAAW,GAAG;AACzC,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,yBAAyB,WAAW,eAAe,CAAC,GAAG,mBAAmB,EAAE,KAAK,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,cAC9J,SAAS;AAAA,YACX;AAAA,UACF;AACA,cAAI;AACF,kBAAM,YAAY,MAAM,kBAAkB;AAC1C,gBAAI,CAAC,WAAW;AACd,qBAAO;AAAA,gBACL,SAAS,CAAC;AAAA,kBACR,MAAM;AAAA,kBACN,MAAM,KAAK,UAAU;AAAA,oBACnB,OAAO;AAAA,oBACP,kBAAkB;AAAA,oBAClB,kBAAkB;AAAA,kBACpB,GAAG,MAAM,CAAC;AAAA,gBACZ,CAAC;AAAA,gBACD,SAAS;AAAA,cACX;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,kBAAkB,aAAa,WAAW;AAE/D,kBAAM,UAAqG,CAAC;AAC5G,kBAAM,UAAmC,EAAE,QAAQ,aAAa,SAAS,KAAK;AAC9E,gBAAI,UAAU,OAAO,WAAW,YAAY,iBAAiB,UAAU,OAAQ,OAAmC,gBAAgB,UAAU;AAC1I,sBAAQ,aAAa;AACrB,sBAAQ,SAAU,OAA+B,UAAU;AAC3D,sBAAQ,QAAS,OAA8B;AAC/C,sBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AACrE,sBAAQ,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,MAAO,OAAmC;AAAA,gBAC1C,UAAU;AAAA,cACZ,CAAC;AAAA,YACH,OAAO;AACL,sBAAQ,SAAS;AACjB,sBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,YACvE;AACA,mBAAO,EAAE,QAAQ;AAAA,UACnB,SAAS,GAAG;AACV,kBAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,mBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,QAAQ,aAAa,SAAS,OAAO,OAAO,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,KAAK;AAAA,UAC1I;AAAA,QACF;AACA,YAAI,WAAW,WAAW;AACxB,gBAAM,WAAW,MAAM;AACvB,cAAI,CAAC,YAAY,CAAC,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAClE,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,+CAA+C,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,cACpH,SAAS;AAAA,YACX;AAAA,UACF;AACA,cAAI;AACF,kBAAM,YAAY,MAAM,kBAAkB;AAC1C,gBAAI,CAAC,WAAW;AACd,qBAAO;AAAA,gBACL,SAAS,CAAC;AAAA,kBACR,MAAM;AAAA,kBACN,MAAM,KAAK,UAAU;AAAA,oBACnB,OAAO;AAAA,oBACP,kBAAkB;AAAA,oBAClB,kBAAkB;AAAA,kBACpB,GAAG,MAAM,CAAC;AAAA,gBACZ,CAAC;AAAA,gBACD,SAAS;AAAA,cACX;AAAA,YACF;AAEA,kBAAM,gBAAgB,oBAAI,IAAI;AAAA,cAC5B,GAAG,qBAAqB;AAAA,cACxB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AACD,kBAAM,WAAmE,CAAC;AAE1E,gBAAI;AACJ,gBAAI;AACF,oBAAM,MAAM,MAAM,kBAAkB,kCAAkC,CAAC,CAAC;AACxE,wBAAU;AAAA,YACZ,QAAQ;AAAA,YAAmC;AAE3C,kBAAM,YAAY,UAAU,eAAe,OAAO,IAAI;AAEtD,kBAAM,gBAAgB,CAAC,MAAc,YAAY,KAAK,CAAC;AACvD,gBAAI,cAA6B;AACjC,gBAAI,yBAAwC;AAC5C,kBAAM,eAAe,oBAAI,IAAoB;AAC7C,kBAAM,UAAqF,CAAC;AAE5F,qBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,oBAAM,OAAO,SAAS,CAAC;AACvB,oBAAM,UAAU,KAAK,UAAU,IAAI,QAAQ,UAAU,CAAC,MAAc,IAAI,EAAE,YAAY,CAAC,EAAE;AAEzF,kBAAI,CAAC,cAAc,IAAI,MAAM,GAAG;AAC9B,yBAAS,KAAK,EAAE,MAAM,GAAG,QAAQ,OAAO,mBAAmB,MAAM,mBAAc,CAAC;AAChF;AAAA,cACF;AAEA,kBAAI,SAAkC,EAAE,GAAI,KAAK,UAAU,CAAC,EAAG;AAC/D,kBAAI,WAAW;AACb,yBAAS,kBAAkB,QAAQ,SAAS;AAAA,cAC9C;AAEA,kBAAI,aAAa;AACf,sBAAM,WAAW,OAAO;AACxB,sBAAM,UAAU,OAAO;AACvB,oBAAI,OAAO,aAAa,YAAY,CAAC,cAAc,QAAQ,GAAG;AAC5D,yBAAO,WAAW,aAAa,IAAI,QAAQ,KAAK;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY,YAAY,CAAC,cAAc,OAAO,GAAG;AAC1D,yBAAO,UAAU,aAAa,IAAI,OAAO,KAAK;AAAA,gBAChD;AACA,oBAAI,WAAW,2BAA2B,CAAC,OAAO,SAAS;AACzD,yBAAO,UAAU;AAAA,gBACnB;AACA,sBAAM,cAAc,OAAO,WAAW,gBAAgB,KAAK,WAAW;AACtE,oBAAI,eAAe,CAAC,OAAO,UAAU;AACnC,yBAAO,WAAW;AAAA,gBACpB;AAAA,cACF;AAEA,oBAAM,SAAS,OAAO;AACtB,kBAAI,OAAO,WAAW,YAAY,UAAU,CAAC,cAAc,MAAM,GAAG;AAClE,sBAAM,WAAW,aAAa,IAAI,MAAM,KAAK,0BAA0B;AACvE,uBAAO,SAAS,YAAY;AAAA,cAC9B;AACA,oBAAM,YAAY;AAAA,gBAChB;AAAA,gBAA0B;AAAA,gBAA4B;AAAA,gBACtD;AAAA,gBAAsB;AAAA,gBAAsB;AAAA,gBAC5C;AAAA,gBAAiC;AAAA,gBAA4B;AAAA,cAC/D,EAAE,SAAS,MAAM;AACjB,kBAAI,aAAa,CAAC,OAAO,QAAQ;AAC/B,uBAAO,SAAS,0BAA0B;AAAA,cAC5C;AAEA,oBAAM,UAAU,OAAO;AACvB,kBAAI,OAAO,YAAY,YAAY,WAAW,CAAC,cAAc,OAAO,GAAG;AACrE,uBAAO,UAAU,aAAa,IAAI,OAAO,KAAK;AAAA,cAChD;AAEA,kBAAI;AACF,sBAAM,WAAW,MAAM,kBAAkB,QAAQ,MAAM;AACvD,sBAAM,MAAM;AAEZ,oBAAI,WAAW,+BAA+B,OAAO,KAAK,YAAY,UAAU;AAC9E,gCAAc,IAAI;AAAA,gBACpB;AACA,sBAAM,iBAAiB,OAAO,WAAW,gBAAgB,KAAK,WAAW,iCAAiC,WAAW,gCAAgC,WAAW,qCAAqC,WAAW;AAChN,oBAAI,kBAAkB,OAAO,KAAK,WAAW,UAAU;AACrD,wBAAM,gBAAgB,IAAI;AAC1B,sBAAI,WAAW,yBAAyB,WAAW,mCAAmC;AACpF,6CAAyB;AACzB,wBAAI,CAAC,eAAe,KAAK,WAAW,MAAM;AACxC,oCAAc;AAAA,oBAChB;AAAA,kBACF;AACA,wBAAM,WAAY,KAAK,QAAQ,QAAmB;AAClD,sBAAI,SAAU,cAAa,IAAI,UAAU,aAAa;AAAA,gBACxD;AAEA,wBAAQ,KAAK,EAAE,MAAM,GAAG,QAAQ,QAAQ,SAAS,CAAC;AAAA,cACpD,SAAS,GAAG;AACV,sBAAM,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACxD,wBAAQ,KAAK,EAAE,MAAM,GAAG,QAAQ,OAAO,OAAO,CAAC;AAC/C,oBAAI,CAAC,gBAAgB,WAAW,yBAAyB,WAAW,6BAA8B;AAAA,cACpG;AAAA,YACF;AAEA,kBAAM,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;AAClD,kBAAM,UAAU,eAAe;AAC/B,mBAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,MAAM;AAAA,gBACN,MAAM,KAAK,UAAU;AAAA,kBACnB;AAAA,kBACA,eAAe,QAAQ;AAAA,kBACvB,QAAQ;AAAA,kBACR;AAAA,kBACA;AAAA,gBACF,GAAG,MAAM,CAAC;AAAA,cACZ,CAAC;AAAA,cACD,GAAI,aAAa,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,YAC5C;AAAA,UACF,SAAS,GAAG;AACV,kBAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,mBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,KAAK;AAAA,UACrG;AAAA,QACF;AACA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,kDAAkD,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,UACvH,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA;AACE,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB,OAAO,iBAAiB,IAAI;AAAA,cAC5B,gBAAgB,CAAC,YAAY,cAAc,gBAAgB,gBAAgB,iBAAiB,YAAY,mBAAmB,wBAAwB,WAAW,mBAAmB,iBAAiB,eAAe,eAAe;AAAA,YAClO,GAAG,MAAM,CAAC;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,IACJ;AAAA,EACF,SAAS,OAAO;AACd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,QAAI,aAAa;AAEjB,QAAI,aAAa,SAAS,iBAAiB,GAAG;AAC5C,mBAAa;AAAA,IACf,WAAW,aAAa,SAAS,iBAAiB,GAAG;AACnD,YAAM,cAAc,aAAa,MAAM,sCAAsC;AAC7E,UAAI,aAAa;AACf,cAAM,SAAS,YAAY,CAAC;AAC5B,YAAI,WAAW,OAAO;AACpB,uBAAa,qBAAqB,IAAI;AAAA,QACxC,WAAW,WAAW,SAAS,WAAW,OAAO;AAC/C,uBAAa;AAAA,QACf,OAAO;AACL,uBAAa,uBAAuB,MAAM,sDAAsD,OAAO;AAAA,QACzG;AAAA,MACF,OAAO;AACL,qBAAa,+BAA+B,OAAO;AAAA,MACrD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,UACP;AAAA,UACA,YAAY;AAAA,YACV,MAAM,QAAQ;AAAA,YACd,SAAS,WAAW;AAAA,YACpB,WAAW,CAAC,CAAC;AAAA,UACf;AAAA,QACF,GAAG,MAAM,CAAC;AAAA,MACZ,CAAC;AAAA,MACD,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAOD,SAAS,mBAA0C;AACjD,SAAO;AACT;AAGA,SAAS,wBACP,MACA,WACA,cAC6D;AAC7D,QAAM,OAAO,iBAAiB;AAC9B,QAAM,SAAsE,CAAC;AAC7E,QAAM,qBAAqB,mBAAmB,kBAAkB,WAAW,YAAY;AACvF,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,EACb,CAAC;AACD,MAAI,SAAS,OAAO;AAClB,UAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA,EAIpC,qBAAqB;AACnB,UAAM,wBAAwB,mBAAmB,2BAA2B,WAAW,YAAY;AACnG,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAGA,SAAS,yBAAyB,UAAiC;AACjE,MAAI,CAAI,cAAW,QAAQ,EAAG,QAAO;AACrC,MAAI;AACF,UAAM,MAAS,gBAAa,UAAU,OAAO;AAC7C,UAAM,QAAQ,IAAI,MAAM,qCAAqC;AAC7D,WAAO,QAAQ,MAAM,CAAC,IAAI;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,mBAAmB,SAAiB,SAAiB,YAAwC;AACpG,QAAM,mBAAmB,QAAQ,QAAQ,WAAW,CAAC;AACrD,MAAI,qBAAqB,GAAI,QAAO;AACpC,QAAM,SAAS,QAAQ,MAAM,GAAG,gBAAgB;AAChD,QAAM,QAAQ,QAAQ,MAAM,gBAAgB;AAC5C,QAAM,eAAe,qBAAqB,OAAO;AAAA,uBAA2B,cAAc,EAAE;AAAA;AAC5F,SAAO,SAAS,OAAO,eAAe;AACxC;AAMA,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+HzB,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["path","cachedRulesStr","freshRulesStr","dsId","apiKey","accessToken","apiBase","toSwiftName","isColorValue","path","resolve","dsId","apiKey","accessToken","apiBase","path","platform"]}
|