@carrierllc/mcp 0.2.17 → 0.2.18
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 +21 -1
- package/dist/cli.js +881 -80
- package/dist/cli.js.map +1 -1
- package/dist/index.js +177 -22
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
- package/plugin/.claude-plugin/marketplace.json +2 -2
- package/plugin/carrier/.claude-plugin/plugin.json +1 -1
- package/plugin/carrier/README.md +31 -4
- package/plugin/carrier/agents/carrier-billing-auditor.md +1 -1
- package/plugin/carrier/commands/billing.md +8 -1
- package/plugin/carrier/commands/provision.md +18 -8
- package/plugin/carrier/commands/wallet.md +31 -0
- package/plugin/carrier/skills/carrier-operations/SKILL.md +12 -5
- package/templates/storefront/src/app/activate/[orderId]/ActivateClient.tsx +125 -0
- package/templates/storefront/src/app/activate/[orderId]/page.tsx +16 -12
- package/templates/storefront/src/app/api/checkout/claim/route.ts +30 -0
- package/templates/storefront/src/app/api/checkout/guest/route.ts +91 -0
- package/templates/storefront/src/app/api/profile/phone/route.ts +40 -0
- package/templates/storefront/src/app/checkout/[templateId]/CheckoutClient.tsx +71 -13
- package/templates/storefront/src/app/checkout/success/CheckoutSuccessClient.tsx +415 -0
- package/templates/storefront/src/app/checkout/success/page.tsx +59 -0
- package/templates/storefront/src/app/sign-up/[[...sign-up]]/StorefrontSignUpClient.tsx +199 -0
- package/templates/storefront/src/app/sign-up/[[...sign-up]]/page.tsx +18 -3
- package/templates/storefront/src/lib/checkout-order-claim.ts +127 -0
- package/templates/storefront/src/lib/complete-email-sign-up.ts +50 -0
- package/templates/storefront/src/lib/verify-checkout-session.ts +53 -0
- package/templates/storefront/src/middleware.ts +6 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/lib/brand.ts","../src/cli/lib/plugin.ts","../src/cli/lib/paths.ts","../src/cli/lib/fsx.ts","../src/cli/lib/exec.ts","../src/cli/lib/whitelabel.ts","../src/cli/lib/site.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { resolve } from \"node:path\";\nimport { Brand, CARRIER_BRAND, deriveAccentDark } from \"./lib/brand.js\";\nimport { installPlugin, manualCommands, pluginStatus, MCP_URL } from \"./lib/plugin.js\";\nimport { scaffoldStorefront } from \"./lib/whitelabel.js\";\nimport { buildSite, deploySite, installDeps, loadStorefrontBrand, slug } from \"./lib/site.js\";\nimport { exists } from \"./lib/fsx.js\";\n\nconst VERSION = \"0.2.17\";\n\nfunction header(): void {\n p.intro(`${pc.bold(pc.yellow(\"◆ carrier\"))} ${pc.dim(\"· the Stripe of telecom — CLI v\" + VERSION)}`);\n}\n\nfunction ok(msg: string): void {\n p.log.success(pc.green(msg));\n}\nfunction info(msg: string): void {\n p.log.info(msg);\n}\n\n/** Interactive brand capture, seeded from Carrier defaults. */\nasync function promptBrand(seed: Brand): Promise<Brand> {\n const name = (await p.text({\n message: \"Brand name\",\n placeholder: seed.name,\n defaultValue: seed.name,\n })) as string;\n if (p.isCancel(name)) process.exit(0);\n\n const domain = (await p.text({\n message: \"Domain\",\n placeholder: seed.domain,\n defaultValue: seed.domain,\n })) as string;\n if (p.isCancel(domain)) process.exit(0);\n\n const accent = (await p.text({\n message: \"Accent color (hex)\",\n placeholder: seed.colors.accent,\n defaultValue: seed.colors.accent,\n })) as string;\n if (p.isCancel(accent)) process.exit(0);\n\n const supportEmail = (await p.text({\n message: \"Support email\",\n placeholder: `support@${domain}`,\n defaultValue: `support@${domain}`,\n })) as string;\n if (p.isCancel(supportEmail)) process.exit(0);\n\n const accentDark = deriveAccentDark(accent, seed);\n const isCarrier = name === CARRIER_BRAND.name && domain === CARRIER_BRAND.domain;\n return {\n ...seed,\n name,\n legalName: name,\n tagline: isCarrier ? seed.tagline : `Mobile connectivity by ${name}.`,\n domain,\n supportEmail,\n supportUrl: `https://${domain}/help`,\n supportWhatsapp: isCarrier ? seed.supportWhatsapp : \"\",\n social: isCarrier ? seed.social : {},\n colors: { ...seed.colors, accent, accentDark },\n };\n}\n\nasync function doPluginInstall(): Promise<void> {\n const s = p.spinner();\n s.start(\"Installing Carrier Claude Code plugin\");\n const r = await installPlugin();\n s.stop(\"Plugin staged\");\n ok(`Plugin → ${r.copiedTo}`);\n info(\n `MCP: ${r.mcpAdded ? pc.green(\"registered\") : pc.yellow(\"manual\")} · ` +\n `marketplace: ${r.marketplaceAdded ? pc.green(\"added\") : pc.yellow(\"manual\")} · ` +\n `install: ${r.pluginInstalled ? pc.green(\"done\") : pc.yellow(\"manual\")}`,\n );\n if (!r.claudeFound || r.notes.length) {\n p.note(manualCommands().join(\"\\n\"), \"Finish wiring (run in your terminal)\");\n if (r.notes.length) info(pc.dim(r.notes.join(\"\\n\")));\n }\n}\n\nasync function doSiteCreate(target: string, brand: Brand): Promise<void> {\n const s = p.spinner();\n s.start(`Scaffolding ${brand.name} storefront → ${target}`);\n await scaffoldStorefront(target, brand);\n s.stop(\"Storefront scaffolded\");\n ok(`Created ${target} (white-labeled: ${brand.name}, accent ${brand.colors.accent})`);\n}\n\nasync function maybeBuildDeploy(target: string, brand: Brand, opts: { install: boolean; build: boolean; deploy: boolean }): Promise<void> {\n if (opts.install) {\n const s = p.spinner();\n s.start(\"Installing storefront dependencies\");\n const oki = await installDeps(target);\n s.stop(oki ? \"Dependencies installed\" : \"Dependency install reported errors\");\n if (!oki) return;\n }\n if (opts.build) {\n const s = p.spinner();\n s.start(\"Building storefront (next build)\");\n const okb = await buildSite(target);\n s.stop(okb ? \"Build succeeded\" : \"Build failed — see output above\");\n if (!okb) return;\n }\n if (opts.deploy) {\n const s = p.spinner();\n s.start(\"Deploying to Cloudflare Workers\");\n const r = await deploySite(target, brand);\n s.stop(r.ok ? `Deployed: ${r.projectName}` : \"Deploy skipped\");\n if (!r.ok && r.reason) info(pc.yellow(r.reason));\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"carrier\")\n .description(\"Carrier CLI — install the Claude Code plugin and roll out a white-labeled eSIM storefront.\")\n .version(VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Interactive: install the plugin AND scaffold/deploy a storefront.\")\n .option(\"--dir <path>\", \"Storefront output directory\", \"./storefront\")\n .option(\"--yes\", \"Use Carrier defaults, no prompts\")\n .action(async (o: { dir: string; yes?: boolean }) => {\n header();\n await doPluginInstall();\n\n const brand = o.yes ? CARRIER_BRAND : await promptBrand(CARRIER_BRAND);\n const target = resolve(o.dir);\n if (await exists(target)) {\n const go = await p.confirm({ message: `${target} exists — write into it anyway?`, initialValue: false });\n if (p.isCancel(go) || !go) {\n p.outro(\"Stopped. Re-run with --dir <new path>.\");\n return;\n }\n }\n await doSiteCreate(target, brand);\n\n let install = !!o.yes;\n let build = !!o.yes;\n let deploy = false;\n if (!o.yes) {\n const next = await p.select({\n message: \"Roll it out now?\",\n options: [\n { value: \"build\", label: \"Install deps + build\" },\n { value: \"deploy\", label: \"Install + build + deploy to Cloudflare Workers\" },\n { value: \"none\", label: \"Just scaffold — I'll build later\" },\n ],\n initialValue: \"build\",\n });\n if (p.isCancel(next)) process.exit(0);\n install = next !== \"none\";\n build = next !== \"none\";\n deploy = next === \"deploy\";\n }\n await maybeBuildDeploy(target, brand, { install, build, deploy });\n\n p.note(\n [\n `cd ${o.dir}`,\n `Edit src/brand.config.ts to re-brand anytime`,\n `pnpm dev # local preview`,\n `MCP endpoint: ${MCP_URL}`,\n ].join(\"\\n\"),\n \"Next\",\n );\n p.outro(pc.green(\"Done. Your connectivity business is wired.\"));\n });\n\nconst plugin = program.command(\"plugin\").description(\"Manage the Carrier Claude Code plugin.\");\nplugin\n .command(\"install\")\n .description(\"Install/register the Carrier plugin + MCP into Claude Code.\")\n .action(async () => {\n header();\n await doPluginInstall();\n p.outro(pc.green(\"Plugin ready. Restart Claude Code to load it.\"));\n });\nplugin\n .command(\"status\")\n .description(\"Show plugin install status.\")\n .action(async () => {\n const st = await pluginStatus();\n header();\n info(st.installed ? pc.green(`Installed v${st.version ?? \"?\"} → ${st.dir}`) : pc.yellow(`Not installed (${st.dir})`));\n p.outro(\"\");\n });\n\nconst site = program.command(\"site\").description(\"Scaffold and deploy a white-labeled storefront.\");\nsite\n .command(\"create [dir]\")\n .description(\"Scaffold a white-labeled storefront from the Mango template.\")\n .option(\"--name <name>\", \"Brand name\")\n .option(\"--domain <domain>\", \"Domain\")\n .option(\"--accent <hex>\", \"Accent color\")\n .option(\"--yes\", \"Carrier defaults, no prompts\")\n .action(async (dir: string | undefined, o: { name?: string; domain?: string; accent?: string; yes?: boolean }) => {\n header();\n let brand: Brand = { ...CARRIER_BRAND };\n if (o.name || o.domain || o.accent) {\n const name = o.name ?? brand.name;\n const domain = o.domain ?? (o.name ? `${slug(o.name)}.com` : brand.domain);\n const isCarrier = name === CARRIER_BRAND.name && domain === CARRIER_BRAND.domain;\n brand = {\n ...brand,\n name,\n domain,\n legalName: o.name ?? brand.legalName,\n tagline: o.name ? `Mobile connectivity by ${o.name}.` : brand.tagline,\n supportEmail: `support@${domain}`,\n supportUrl: `https://${domain}/help`,\n supportWhatsapp: isCarrier ? brand.supportWhatsapp : \"\",\n social: isCarrier ? brand.social : {},\n colors: {\n ...brand.colors,\n accent: o.accent ?? brand.colors.accent,\n accentDark: o.accent ? deriveAccentDark(o.accent) : brand.colors.accentDark,\n },\n };\n } else if (!o.yes) {\n brand = await promptBrand(CARRIER_BRAND);\n }\n const target = resolve(dir ?? \"./storefront\");\n if (await exists(target)) {\n const go = await p.confirm({ message: `${target} exists — write into it anyway?`, initialValue: false });\n if (p.isCancel(go) || !go) {\n p.outro(\"Stopped. Re-run with a different directory.\");\n return;\n }\n }\n await doSiteCreate(target, brand);\n p.outro(pc.green(`Scaffolded. cd ${dir ?? \"storefront\"} && pnpm install && pnpm dev`));\n });\nsite\n .command(\"deploy [dir]\")\n .description(\"Build + deploy a storefront to Cloudflare Workers.\")\n .option(\"--name <name>\", \"Cloudflare Worker name (defaults from brand)\")\n .action(async (dir: string | undefined, o: { name?: string }) => {\n header();\n const target = resolve(dir ?? \"./storefront\");\n const brand = await loadStorefrontBrand(target, o.name ? { name: o.name } : undefined);\n await maybeBuildDeploy(target, brand, { install: true, build: true, deploy: true });\n p.outro(\"\");\n });\n\nprogram.parseAsync(process.argv).catch((e: unknown) => {\n console.error(pc.red(String(e instanceof Error ? e.message : e)));\n process.exit(1);\n});\n","/**\n * Brand config — the single white-label surface for the storefront.\n * Carrier defaults; overridable interactively or via `carrier site create --brand`.\n */\nexport interface Brand {\n name: string;\n legalName: string;\n tagline: string;\n domain: string;\n supportEmail: string;\n supportUrl: string;\n supportWhatsapp: string;\n colors: {\n /** Page background (deepest ink). */\n bg: string;\n /** Primary accent. */\n accent: string;\n /** Accent pressed/dark. */\n accentDark: string;\n /** Primary text. */\n text: string;\n };\n social: {\n x?: string;\n linkedin?: string;\n instagram?: string;\n tiktok?: string;\n };\n /** MCP control-plane endpoint the storefront's API talks to. */\n carrierApiUrl: string;\n}\n\nexport const CARRIER_BRAND: Brand = {\n name: \"Carrier\",\n legalName: \"Lifecycle Innovations Limited\",\n tagline: \"Programmable connectivity, on demand.\",\n domain: \"carrier.llc\",\n supportEmail: \"support@carrier.llc\",\n supportUrl: \"https://carrier.llc/help\",\n supportWhatsapp: \"+17864604829\",\n colors: {\n bg: \"#080C16\",\n accent: \"#FF6B35\",\n accentDark: \"#D9461C\",\n text: \"#F5F1EA\",\n },\n social: {\n x: \"@carrier_llc\",\n instagram: \"@carrier.llc\",\n tiktok: \"@carrier.llc\",\n },\n carrierApiUrl: \"https://api.carrier.llc\",\n};\n\nconst CARRIER_ACCENT_LIGHT = \"#FFB088\";\nconst CARRIER_ACCENT_GRADIENT_START = \"#FF7A45\";\n\nfunction hexToRgb(hex: string): [number, number, number] | null {\n const h = hex.replace(/^#/, \"\");\n if (!/^[0-9a-fA-F]{6}$/.test(h)) return null;\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\nfunction rgbToHex(r: number, g: number, b: number, lower = false): string {\n const fmt = (n: number) =>\n Math.max(0, Math.min(255, Math.round(n)))\n .toString(16)\n .padStart(2, \"0\");\n const out = `#${fmt(r)}${fmt(g)}${fmt(b)}`;\n return lower ? out : out.toUpperCase();\n}\n\nfunction mixHexWithWhite(hex: string, whiteRatio: number): string {\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n const mix = (n: number) => n + (255 - n) * whiteRatio;\n return rgbToHex(mix(rgb[0]), mix(rgb[1]), mix(rgb[2]));\n}\n\nfunction darkenHex(hex: string, factor: number): string {\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n const scale = (n: number) => n * factor;\n return rgbToHex(scale(rgb[0]), scale(rgb[1]), scale(rgb[2]), true);\n}\n\n/** Derive a darker pressed-state accent; keeps the Carrier default pair when accent is unchanged. */\nexport function deriveAccentDark(accent: string, seed: Brand = CARRIER_BRAND): string {\n if (accent.toUpperCase() === seed.colors.accent.toUpperCase()) return seed.colors.accentDark;\n const rgb = hexToRgb(accent);\n if (!rgb) return accent;\n const scale = (n: number) => Math.max(0, Math.min(255, Math.round(n * 0.75)));\n return rgbToHex(scale(rgb[0]), scale(rgb[1]), scale(rgb[2]));\n}\n\n/** Derive a lighter accent for glows and `--brand-accent-light`. */\nexport function deriveAccentLight(accent: string, seed: Brand = CARRIER_BRAND): string {\n if (accent.toUpperCase() === seed.colors.accent.toUpperCase()) return CARRIER_ACCENT_LIGHT;\n return mixHexWithWhite(accent, 0.45);\n}\n\n/** Derive the lighter hero-gradient stop paired with accent. */\nexport function deriveAccentGradientStart(accent: string, seed: Brand = CARRIER_BRAND): string {\n if (accent.toUpperCase() === seed.colors.accent.toUpperCase()) return CARRIER_ACCENT_GRADIENT_START;\n return mixHexWithWhite(accent, 0.08);\n}\n\n/** Tree-wide hex swaps for accent-derived template colors (gradients, mango scale, CSS vars). */\nexport function deriveAccentPaletteSubs(accent: string, accentDark: string): Array<[string, string]> {\n if (accent.toUpperCase() === CARRIER_BRAND.colors.accent.toUpperCase()) return [];\n const accentLight = deriveAccentLight(accent);\n const gradientStart = deriveAccentGradientStart(accent);\n return [\n [\"#FF6B35\", accent],\n [\"#D9461C\", accentDark],\n [\"#FFB088\", accentLight],\n [\"#FF7A45\", gradientStart],\n [\"#fff4ef\", mixHexWithWhite(accent, 0.94).toLowerCase()],\n [\"#ffe0d0\", mixHexWithWhite(accent, 0.85).toLowerCase()],\n [\"#ffbfa0\", mixHexWithWhite(accent, 0.7).toLowerCase()],\n [\"#ff9970\", mixHexWithWhite(accent, 0.55).toLowerCase()],\n [\"#ff7d4d\", mixHexWithWhite(accent, 0.4).toLowerCase()],\n [\"#b33a17\", darkenHex(accentDark, 0.75)],\n [\"#8a2d12\", darkenHex(accentDark, 0.58)],\n [\"#5e1e0c\", darkenHex(accentDark, 0.4)],\n [\"#3a1107\", darkenHex(accentDark, 0.25)],\n ];\n}\n\n/** Serialize a brand to the `src/brand.config.ts` the storefront imports. */\nexport function renderBrandConfig(brand: Brand): string {\n return `// Auto-generated by @carrierllc/mcp — edit freely to re-brand this storefront.\n// This is the single white-label surface: name, copy, colors, domain, support.\nexport interface Brand {\n name: string;\n legalName: string;\n tagline: string;\n domain: string;\n supportEmail: string;\n supportUrl: string;\n colors: { bg: string; accent: string; accentDark: string; text: string };\n social: { x?: string; linkedin?: string };\n carrierApiUrl: string;\n}\n\nexport const brand: Brand = ${JSON.stringify(brand, null, 2)};\n\nexport default brand;\n`;\n}\n\n/** Serialize a brand to a `.env.local` for the storefront. */\nexport function renderEnv(brand: Brand): string {\n return [\n `# Generated by @carrierllc/mcp`,\n `NEXT_PUBLIC_BRAND_NAME=${JSON.stringify(brand.name)}`,\n `NEXT_PUBLIC_CARRIER_API_URL=${JSON.stringify(brand.carrierApiUrl)}`,\n `# Clerk (fill in from your Clerk dashboard to enable auth + checkout)`,\n `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=`,\n `CLERK_SECRET_KEY=`,\n ``,\n ].join(\"\\n\");\n}\n","import { join } from \"node:path\";\nimport { claudeHome, installedPluginDir, pluginManifestDir, pluginSourceDir } from \"./paths.js\";\nimport { copyTree, exists, readFile } from \"./fsx.js\";\nimport { run, which } from \"./exec.js\";\n\nexport const MCP_NAME = \"carrier\";\nexport const MCP_URL = \"https://mcp.carrier.llc/mcp\";\n\nexport interface InstallReport {\n copiedTo: string;\n marketplaceAdded: boolean;\n pluginInstalled: boolean;\n mcpAdded: boolean;\n claudeFound: boolean;\n notes: string[];\n}\n\n/**\n * Install the bundled Carrier Claude Code plugin:\n * 1. copy plugin → ~/.claude/plugins/carrier\n * 2. best-effort register marketplace + install via the `claude` CLI\n * 3. best-effort register the Carrier MCP server (HTTP + OAuth)\n * Best-effort steps never hard-fail; a manual fallback is always reported.\n */\nexport async function installPlugin(): Promise<InstallReport> {\n const marketplace = pluginSourceDir();\n const pluginRoot = pluginManifestDir();\n const dest = installedPluginDir();\n const notes: string[] = [];\n\n if (!(await exists(pluginRoot))) {\n throw new Error(`Bundled plugin not found at ${pluginRoot}. Reinstall @carrierllc/mcp.`);\n }\n\n // Fallback drop-in is the plugin itself (carrier/), not the marketplace wrapper.\n await copyTree(pluginRoot, dest);\n\n const claudeFound = await which(\"claude\");\n let marketplaceAdded = false;\n let pluginInstalled = false;\n let mcpAdded = false;\n\n if (claudeFound) {\n const mkt = await run(\"claude\", [\"plugin\", \"marketplace\", \"add\", marketplace]);\n marketplaceAdded = (mkt.ok && !/✘|failed|error/i.test(mkt.stdout + mkt.stderr)) || /already/i.test(mkt.stderr + mkt.stdout);\n if (!marketplaceAdded) notes.push(`marketplace add: ${(mkt.stderr || mkt.stdout).trim().slice(0, 200)}`);\n\n // `claude plugin install` exits 0 even on failure — gate on output text, not just exit code.\n const inst = await run(\"claude\", [\"plugin\", \"install\", \"carrier@carrier\"]);\n const instOut = inst.stdout + inst.stderr;\n pluginInstalled =\n /✔|success(fully)? installed|already (installed|enabled)/i.test(instOut) && !/✘|failed/i.test(instOut);\n if (!pluginInstalled) notes.push(`plugin install: ${instOut.replace(/\\s+/g, \" \").trim().slice(0, 200)}`);\n\n const mcp = await run(\"claude\", [\"mcp\", \"add\", \"--transport\", \"http\", MCP_NAME, MCP_URL]);\n mcpAdded = mcp.ok || /already|exists/i.test(mcp.stderr + mcp.stdout);\n if (!mcpAdded) notes.push(`mcp add: ${(mcp.stderr || mcp.stdout).trim().slice(0, 200)}`);\n } else {\n notes.push(\"`claude` CLI not on PATH — plugin copied; finish wiring with the manual commands below.\");\n }\n\n return { copiedTo: dest, marketplaceAdded, pluginInstalled, mcpAdded, claudeFound, notes };\n}\n\nexport async function pluginStatus(): Promise<{ installed: boolean; version?: string; dir: string }> {\n const dir = installedPluginDir();\n const manifest = join(dir, \".claude-plugin\", \"plugin.json\");\n if (!(await exists(manifest))) return { installed: false, dir };\n try {\n const json = JSON.parse(await readFile(manifest, \"utf8\")) as { version?: string };\n return { installed: true, version: json.version, dir };\n } catch {\n return { installed: true, dir };\n }\n}\n\nexport function manualCommands(): string[] {\n return [\n `claude plugin marketplace add ${pluginSourceDir()}`,\n `claude plugin install carrier@carrier`,\n `claude mcp add --transport http ${MCP_NAME} ${MCP_URL}`,\n ];\n}\n\nexport { claudeHome };\n","import { fileURLToPath } from \"node:url\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\n\n/**\n * Package root = the installed @carrierllc/mcp directory.\n * dist/index.js lives at <root>/dist/index.js, so root is one level up.\n * The bundled `plugin/` and `templates/` dirs are shipped alongside `dist`.\n */\nexport function packageRoot(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n // When bundled, `here` is <root>/dist. During ts-node/source runs it is <root>/src/lib.\n for (const candidate of [resolve(here, \"..\"), resolve(here, \"..\", \"..\")]) {\n if (existsSync(join(candidate, \"plugin\")) && existsSync(join(candidate, \"templates\"))) {\n return candidate;\n }\n }\n return resolve(here, \"..\");\n}\n\n/** Marketplace root — passed to `claude plugin marketplace add`. */\nexport function pluginSourceDir(): string {\n return join(packageRoot(), \"plugin\");\n}\n\n/** Plugin root (the `carrier/` subdir of the marketplace) — used for the file-copy\n * fallback and reading the plugin manifest. Claude Code rejects a marketplace that\n * points a plugin at its own root (`source: \".\"`), so the plugin lives one level in. */\nexport function pluginManifestDir(): string {\n return join(packageRoot(), \"plugin\", \"carrier\");\n}\n\nexport function storefrontTemplateDir(): string {\n return join(packageRoot(), \"templates\", \"storefront\");\n}\n\n/** ~/.claude — Claude Code's user config home. */\nexport function claudeHome(): string {\n return process.env.CLAUDE_CONFIG_DIR\n ? resolve(process.env.CLAUDE_CONFIG_DIR)\n : join(homedir(), \".claude\");\n}\n\nexport function claudePluginsDir(): string {\n return join(claudeHome(), \"plugins\");\n}\n\nexport function installedPluginDir(): string {\n return join(claudePluginsDir(), \"carrier\");\n}\n","import { cp, mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst SKIP = new Set([\n \"node_modules\",\n \".next\",\n \".turbo\",\n \".vercel\",\n \"dist\",\n \".git\",\n \"test-results\",\n \"playwright-report\",\n]);\n\nconst cpFilter = (s: string) => {\n const base = s.split(\"/\").pop() ?? \"\";\n return !SKIP.has(base);\n};\n\n/** Recursively copy a directory's contents into `dest`, skipping build artifacts and VCS noise. */\nexport async function copyTree(src: string, dest: string): Promise<void> {\n await mkdir(dest, { recursive: true });\n for (const entry of await readdir(src, { withFileTypes: true })) {\n if (SKIP.has(entry.name)) continue;\n await cp(join(src, entry.name), join(dest, entry.name), {\n recursive: true,\n filter: cpFilter,\n });\n }\n}\n\n/** Remove paths under `dest` that are absent from `src` (mirror sync after `copyTree`). */\nexport async function pruneTree(src: string, dest: string): Promise<void> {\n if (!(await isDir(dest))) return;\n for (const entry of await readdir(dest, { withFileTypes: true })) {\n if (SKIP.has(entry.name)) continue;\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (!existsSync(srcPath)) {\n await rm(destPath, { recursive: true, force: true });\n continue;\n }\n if (entry.isDirectory() && (await isDir(srcPath))) await pruneTree(srcPath, destPath);\n }\n}\n\n/** Walk every file under `dir` and yield absolute paths. */\nexport async function* walk(dir: string): AsyncGenerator<string> {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n if (SKIP.has(entry.name)) continue;\n const full = join(dir, entry.name);\n if (entry.isDirectory()) yield* walk(full);\n else yield full;\n }\n}\n\nconst TEXT_EXT = new Set([\n \".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\",\n \".json\", \".css\", \".md\", \".mdx\", \".html\", \".txt\",\n \".env\", \".example\", \".yml\", \".yaml\", \".toml\",\n]);\n\nexport function isTextFile(path: string): boolean {\n const dot = path.lastIndexOf(\".\");\n if (dot === -1) return false;\n return TEXT_EXT.has(path.slice(dot));\n}\n\n/** Apply ordered [find, replace] string substitutions to every text file under `dir`. */\nexport async function replaceInTree(\n dir: string,\n subs: ReadonlyArray<readonly [from: string | RegExp, to: string]>,\n): Promise<number> {\n let touched = 0;\n for await (const file of walk(dir)) {\n if (!isTextFile(file)) continue;\n const before = await readFile(file, \"utf8\");\n let after = before;\n for (const [from, to] of subs) {\n after = typeof from === \"string\" ? after.split(from).join(to) : after.replace(from, to);\n }\n if (after !== before) {\n await writeFile(file, after);\n touched++;\n }\n }\n return touched;\n}\n\nexport async function exists(p: string): Promise<boolean> {\n return existsSync(p);\n}\n\nexport async function isDir(p: string): Promise<boolean> {\n try {\n return (await stat(p)).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport { writeFile, mkdir, readFile, readdir };\n","import { spawn } from \"node:child_process\";\n\nexport interface RunResult {\n ok: boolean;\n code: number | null;\n stdout: string;\n stderr: string;\n}\n\n/** Run a command, capturing output. Never throws — inspect `.ok`. */\nexport function run(cmd: string, args: string[], opts: { cwd?: string } = {}): Promise<RunResult> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { cwd: opts.cwd, shell: false });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (d) => (stdout += d.toString()));\n child.stderr?.on(\"data\", (d) => (stderr += d.toString()));\n child.on(\"error\", () => resolve({ ok: false, code: null, stdout, stderr }));\n child.on(\"close\", (code) => resolve({ ok: code === 0, code, stdout, stderr }));\n });\n}\n\n/** Run a command inheriting stdio (for long, user-visible tasks like installs/builds). */\nexport function runInherit(cmd: string, args: string[], opts: { cwd?: string } = {}): Promise<RunResult> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { cwd: opts.cwd, shell: false, stdio: \"inherit\" });\n child.on(\"error\", () => resolve({ ok: false, code: null, stdout: \"\", stderr: \"\" }));\n child.on(\"close\", (code) => resolve({ ok: code === 0, code, stdout: \"\", stderr: \"\" }));\n });\n}\n\n/** True if a binary is resolvable on PATH. */\nexport async function which(bin: string): Promise<boolean> {\n const probe = process.platform === \"win32\" ? \"where\" : \"which\";\n const r = await run(probe, [bin]);\n return r.ok && r.stdout.trim().length > 0;\n}\n","import { join } from \"node:path\";\nimport { storefrontTemplateDir } from \"./paths.js\";\nimport { Brand, deriveAccentLight, deriveAccentPaletteSubs, renderEnv } from \"./brand.js\";\nimport { copyTree, exists, pruneTree, readFile, replaceInTree, writeFile } from \"./fsx.js\";\n\n/**\n * Scaffold a white-labeled storefront from the bundled Mango-derived template.\n *\n * Strategy: the template's own `src/brand.config.ts` is the canonical schema the\n * components consume (it carries extra fields like supportWhatsapp/accentLight).\n * We PATCH its values in place rather than regenerate it, so we never drop a field\n * a component depends on. Tree-wide replacements are limited to unambiguous tokens\n * (visible \"Mango\" copy, the 🥭 mark, and hex colors) — never the `carrier.llc`\n * apex, which is also the real api./mcp. control-plane host.\n */\n/** Keep non-empty Clerk keys from a prior `.env.local` when re-scaffolding. */\nfunction preserveClerkFromEnv(existing: string, fresh: string): string {\n let out = fresh;\n for (const key of [\"NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY\", \"CLERK_SECRET_KEY\"] as const) {\n const line = existing.split(\"\\n\").find((l) => l.startsWith(`${key}=`));\n if (!line) continue;\n const value = line.slice(key.length + 1);\n if (!value.trim()) continue;\n out = out.replace(new RegExp(`^${key}=.*$`, \"m\"), `${key}=${value}`);\n }\n return out;\n}\n\nexport async function scaffoldStorefront(target: string, brand: Brand): Promise<void> {\n const template = storefrontTemplateDir();\n if (!(await exists(template))) {\n throw new Error(\n `Storefront template not found at ${template}. The @carrierllc/mcp package may be corrupt — reinstall it.`,\n );\n }\n\n const envPath = join(target, \".env.local\");\n const existingEnv = (await exists(envPath)) ? await readFile(envPath, \"utf8\") : undefined;\n\n await copyTree(template, target);\n await pruneTree(template, target);\n\n // Tree-wide, unambiguous swaps only.\n const subs: Array<[string, string]> = [\n [\"Mango\", brand.name],\n [\"🥭\", \"\"],\n ];\n // Hex colors are safe to swap globally (they appear in globals.css + brand.config).\n subs.push(...deriveAccentPaletteSubs(brand.colors.accent, brand.colors.accentDark));\n if (brand.colors.bg.toUpperCase() !== \"#080C16\") subs.push([\"#080C16\", brand.colors.bg]);\n if (brand.colors.text.toUpperCase() !== \"#F5F1EA\") subs.push([\"#F5F1EA\", brand.colors.text]);\n await replaceInTree(target, subs);\n\n // Patch the canonical brand.config.ts field values in place.\n await patchBrandConfig(join(target, \"src\", \"brand.config.ts\"), brand);\n\n // Runtime env (brand name + control-plane URL).\n const envBody = existingEnv ? preserveClerkFromEnv(existingEnv, renderEnv(brand)) : renderEnv(brand);\n await writeFile(envPath, envBody);\n\n // npm strips nested .npmrc on publish, so (re)write it for standalone installs —\n // lets `pnpm install` work even when the storefront is created inside a workspace.\n await writeFile(join(target, \".npmrc\"), \"ignore-workspace-root-check=true\\n\");\n}\n\n/** Field-scoped value patches against the template's brand.config.ts — preserves its schema. */\nasync function patchBrandConfig(path: string, brand: Brand): Promise<void> {\n if (!(await exists(path))) return;\n let src = await readFile(path, \"utf8\");\n\n const setField = (field: string, value: string): void => {\n // matches ` field: \"...\"` or ` field: process.env.X ?? \"...\"` — replaces the LAST quoted literal on that key's line\n const re = new RegExp(`(\\\\b${field}:\\\\s*(?:[^\"\\\\n]*\\\\?\\\\?\\\\s*)?)\"[^\"]*\"`);\n src = src.replace(re, `$1${JSON.stringify(value)}`);\n };\n\n setField(\"name\", brand.name);\n setField(\"legalName\", brand.legalName);\n setField(\"tagline\", brand.tagline);\n setField(\"domain\", brand.domain);\n setField(\"supportUrl\", brand.supportUrl);\n setField(\"supportEmail\", brand.supportEmail);\n setField(\"supportWhatsapp\", brand.supportWhatsapp);\n setField(\"accent\", brand.colors.accent);\n setField(\"accentDark\", brand.colors.accentDark);\n setField(\"accentLight\", deriveAccentLight(brand.colors.accent));\n setField(\"bg\", brand.colors.bg);\n\n const socialEntries = Object.entries(brand.social).filter(([, v]) => v);\n const socialBody = socialEntries.map(([k, v]) => ` ${k}: ${JSON.stringify(v)},`).join(\"\\n\");\n src = src.replace(\n /social:\\s*\\{[^}]*\\}/s,\n socialEntries.length ? `social: {\\n${socialBody}\\n }` : \"social: {}\",\n );\n\n await writeFile(path, src);\n}\n","import { join } from \"node:path\";\nimport { Brand, CARRIER_BRAND } from \"./brand.js\";\nimport { exists, readFile } from \"./fsx.js\";\nimport { runInherit, which } from \"./exec.js\";\n\nfunction slug(s: string): string {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40) || \"storefront\";\n}\n\n/** Install storefront deps. Uses npm to stay independent of the pnpm workspace. */\nexport async function installDeps(target: string): Promise<boolean> {\n const pkgMgr = (await which(\"pnpm\")) ? \"pnpm\" : \"npm\";\n const r = await runInherit(pkgMgr, [\"install\"], { cwd: target });\n return r.ok;\n}\n\nexport async function buildSite(target: string): Promise<boolean> {\n const pkgMgr = (await which(\"pnpm\")) ? \"pnpm\" : \"npm\";\n // cf:build runs `next build` internally (via OpenNext) then emits the\n // .open-next/worker.js bundle that deploySite ships to Cloudflare.\n const r = await runInherit(pkgMgr, [\"run\", \"cf:build\"], { cwd: target });\n return r.ok;\n}\n\n/** Read white-label name from a scaffolded storefront (falls back to Carrier defaults). */\nexport async function loadStorefrontBrand(\n target: string,\n overrides?: { name?: string },\n): Promise<Brand> {\n const configPath = join(target, \"src\", \"brand.config.ts\");\n if (!(await exists(configPath))) {\n return { ...CARRIER_BRAND, ...overrides };\n }\n const src = await readFile(configPath, \"utf8\");\n const pick = (field: string, fallback: string): string => {\n const m = src.match(new RegExp(`\\\\b${field}:\\\\s*(?:[^\"\\\\n]*\\\\?\\\\?\\\\s*)?\"([^\"]*)\"`));\n return m?.[1] ?? fallback;\n };\n return {\n ...CARRIER_BRAND,\n name: overrides?.name ?? pick(\"name\", CARRIER_BRAND.name),\n domain: pick(\"domain\", CARRIER_BRAND.domain),\n supportEmail: pick(\"supportEmail\", CARRIER_BRAND.supportEmail),\n supportUrl: pick(\"supportUrl\", CARRIER_BRAND.supportUrl),\n tagline: pick(\"tagline\", CARRIER_BRAND.tagline),\n legalName: pick(\"legalName\", CARRIER_BRAND.legalName),\n colors: {\n ...CARRIER_BRAND.colors,\n accent: pick(\"accent\", CARRIER_BRAND.colors.accent),\n accentDark: pick(\"accentDark\", CARRIER_BRAND.colors.accentDark),\n bg: pick(\"bg\", CARRIER_BRAND.colors.bg),\n text: pick(\"text\", CARRIER_BRAND.colors.text),\n },\n carrierApiUrl: CARRIER_BRAND.carrierApiUrl,\n };\n}\n\n/**\n * Deploy the OpenNext build to Cloudflare Workers via wrangler.\n * Returns false (with guidance) when wrangler is absent or unauthenticated.\n */\nexport async function deploySite(\n target: string,\n brand: Brand,\n): Promise<{ ok: boolean; projectName: string; reason?: string }> {\n const projectName = slug(brand.name);\n const workerBundle = join(target, \".open-next\", \"worker.js\");\n if (!(await exists(workerBundle))) {\n return {\n ok: false,\n projectName,\n reason:\n \"No OpenNext build found — run `carrier site deploy` (build step) or `pnpm run build` in the storefront first.\",\n };\n }\n if (!(await which(\"wrangler\")) && !(await which(\"npx\"))) {\n return { ok: false, projectName, reason: \"wrangler/npx not found — install wrangler to deploy.\" };\n }\n const bin = (await which(\"wrangler\")) ? \"wrangler\" : \"npx\";\n const args =\n bin === \"wrangler\"\n ? [\"deploy\", \"--name\", projectName]\n : [\"wrangler\", \"deploy\", \"--name\", projectName];\n const r = await runInherit(bin, args, { cwd: target });\n return r.ok\n ? { ok: true, projectName }\n : { ok: false, projectName, reason: \"wrangler deploy failed — run `wrangler login` then retry `carrier site deploy`.\" };\n}\n\nexport { slug };\n"],"mappings":";;;AACA,SAAS,eAAe;AACxB,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,WAAAA,gBAAe;;;AC4BjB,IAAM,gBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AACjB;AAEA,IAAM,uBAAuB;AAC7B,IAAM,gCAAgC;AAEtC,SAAS,SAAS,KAA8C;AAC9D,QAAM,IAAI,IAAI,QAAQ,MAAM,EAAE;AAC9B,MAAI,CAAC,mBAAmB,KAAK,CAAC,EAAG,QAAO;AACxC,SAAO,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;AAC/F;AAEA,SAAS,SAAS,GAAW,GAAW,GAAW,QAAQ,OAAe;AACxE,QAAM,MAAM,CAAC,MACX,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EACrC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB,QAAM,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACxC,SAAO,QAAQ,MAAM,IAAI,YAAY;AACvC;AAEA,SAAS,gBAAgB,KAAa,YAA4B;AAChE,QAAM,MAAM,SAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,MAAM,CAAC,MAAc,KAAK,MAAM,KAAK;AAC3C,SAAO,SAAS,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;AACvD;AAEA,SAAS,UAAU,KAAa,QAAwB;AACtD,QAAM,MAAM,SAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,CAAC,MAAc,IAAI;AACjC,SAAO,SAAS,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI;AACnE;AAGO,SAAS,iBAAiB,QAAgB,OAAc,eAAuB;AACpF,MAAI,OAAO,YAAY,MAAM,KAAK,OAAO,OAAO,YAAY,EAAG,QAAO,KAAK,OAAO;AAClF,QAAM,MAAM,SAAS,MAAM;AAC3B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,CAAC,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AAC5E,SAAO,SAAS,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;AAC7D;AAGO,SAAS,kBAAkB,QAAgB,OAAc,eAAuB;AACrF,MAAI,OAAO,YAAY,MAAM,KAAK,OAAO,OAAO,YAAY,EAAG,QAAO;AACtE,SAAO,gBAAgB,QAAQ,IAAI;AACrC;AAGO,SAAS,0BAA0B,QAAgB,OAAc,eAAuB;AAC7F,MAAI,OAAO,YAAY,MAAM,KAAK,OAAO,OAAO,YAAY,EAAG,QAAO;AACtE,SAAO,gBAAgB,QAAQ,IAAI;AACrC;AAGO,SAAS,wBAAwB,QAAgB,YAA6C;AACnG,MAAI,OAAO,YAAY,MAAM,cAAc,OAAO,OAAO,YAAY,EAAG,QAAO,CAAC;AAChF,QAAM,cAAc,kBAAkB,MAAM;AAC5C,QAAM,gBAAgB,0BAA0B,MAAM;AACtD,SAAO;AAAA,IACL,CAAC,WAAW,MAAM;AAAA,IAClB,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,WAAW,WAAW;AAAA,IACvB,CAAC,WAAW,aAAa;AAAA,IACzB,CAAC,WAAW,gBAAgB,QAAQ,IAAI,EAAE,YAAY,CAAC;AAAA,IACvD,CAAC,WAAW,gBAAgB,QAAQ,IAAI,EAAE,YAAY,CAAC;AAAA,IACvD,CAAC,WAAW,gBAAgB,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,IACtD,CAAC,WAAW,gBAAgB,QAAQ,IAAI,EAAE,YAAY,CAAC;AAAA,IACvD,CAAC,WAAW,gBAAgB,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,IACtD,CAAC,WAAW,UAAU,YAAY,IAAI,CAAC;AAAA,IACvC,CAAC,WAAW,UAAU,YAAY,IAAI,CAAC;AAAA,IACvC,CAAC,WAAW,UAAU,YAAY,GAAG,CAAC;AAAA,IACtC,CAAC,WAAW,UAAU,YAAY,IAAI,CAAC;AAAA,EACzC;AACF;AAyBO,SAAS,UAAU,OAAsB;AAC9C,SAAO;AAAA,IACL;AAAA,IACA,0BAA0B,KAAK,UAAU,MAAM,IAAI,CAAC;AAAA,IACpD,+BAA+B,KAAK,UAAU,MAAM,aAAa,CAAC;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AClKA,SAAS,QAAAC,aAAY;;;ACArB,SAAS,qBAAqB;AAC9B,SAAS,SAAS,MAAM,eAAe;AACvC,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAOjB,SAAS,cAAsB;AACpC,QAAM,OAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEnD,aAAW,aAAa,CAAC,QAAQ,MAAM,IAAI,GAAG,QAAQ,MAAM,MAAM,IAAI,CAAC,GAAG;AACxE,QAAI,WAAW,KAAK,WAAW,QAAQ,CAAC,KAAK,WAAW,KAAK,WAAW,WAAW,CAAC,GAAG;AACrF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,IAAI;AAC3B;AAGO,SAAS,kBAA0B;AACxC,SAAO,KAAK,YAAY,GAAG,QAAQ;AACrC;AAKO,SAAS,oBAA4B;AAC1C,SAAO,KAAK,YAAY,GAAG,UAAU,SAAS;AAChD;AAEO,SAAS,wBAAgC;AAC9C,SAAO,KAAK,YAAY,GAAG,aAAa,YAAY;AACtD;AAGO,SAAS,aAAqB;AACnC,SAAO,QAAQ,IAAI,oBACf,QAAQ,QAAQ,IAAI,iBAAiB,IACrC,KAAK,QAAQ,GAAG,SAAS;AAC/B;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,WAAW,GAAG,SAAS;AACrC;AAEO,SAAS,qBAA6B;AAC3C,SAAO,KAAK,iBAAiB,GAAG,SAAS;AAC3C;;;AClDA,SAAS,IAAI,OAAO,SAAS,UAAU,IAAI,MAAM,iBAAiB;AAClE,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAErB,IAAM,OAAO,oBAAI,IAAI;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,WAAW,CAAC,MAAc;AAC9B,QAAM,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AACnC,SAAO,CAAC,KAAK,IAAI,IAAI;AACvB;AAGA,eAAsB,SAAS,KAAa,MAA6B;AACvE,QAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,aAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG;AAC1B,UAAM,GAAGA,MAAK,KAAK,MAAM,IAAI,GAAGA,MAAK,MAAM,MAAM,IAAI,GAAG;AAAA,MACtD,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAGA,eAAsB,UAAU,KAAa,MAA6B;AACxE,MAAI,CAAE,MAAM,MAAM,IAAI,EAAI;AAC1B,aAAW,SAAS,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC,GAAG;AAChE,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG;AAC1B,UAAM,UAAUA,MAAK,KAAK,MAAM,IAAI;AACpC,UAAM,WAAWA,MAAK,MAAM,MAAM,IAAI;AACtC,QAAI,CAACD,YAAW,OAAO,GAAG;AACxB,YAAM,GAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD;AAAA,IACF;AACA,QAAI,MAAM,YAAY,KAAM,MAAM,MAAM,OAAO,EAAI,OAAM,UAAU,SAAS,QAAQ;AAAA,EACtF;AACF;AAGA,gBAAuB,KAAK,KAAqC;AAC/D,aAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG;AAC1B,UAAM,OAAOC,MAAK,KAAK,MAAM,IAAI;AACjC,QAAI,MAAM,YAAY,EAAG,QAAO,KAAK,IAAI;AAAA,QACpC,OAAM;AAAA,EACb;AACF;AAEA,IAAM,WAAW,oBAAI,IAAI;AAAA,EACvB;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACtC;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAS;AAAA,EACzC;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAS;AACvC,CAAC;AAEM,SAAS,WAAW,MAAuB;AAChD,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,SAAS,IAAI,KAAK,MAAM,GAAG,CAAC;AACrC;AAGA,eAAsB,cACpB,KACA,MACiB;AACjB,MAAI,UAAU;AACd,mBAAiB,QAAQ,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,WAAW,IAAI,EAAG;AACvB,UAAM,SAAS,MAAM,SAAS,MAAM,MAAM;AAC1C,QAAI,QAAQ;AACZ,eAAW,CAAC,MAAM,EAAE,KAAK,MAAM;AAC7B,cAAQ,OAAO,SAAS,WAAW,MAAM,MAAM,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,MAAM,EAAE;AAAA,IACxF;AACA,QAAI,UAAU,QAAQ;AACpB,YAAM,UAAU,MAAM,KAAK;AAC3B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,OAAOC,IAA6B;AACxD,SAAOF,YAAWE,EAAC;AACrB;AAEA,eAAsB,MAAMA,IAA6B;AACvD,MAAI;AACF,YAAQ,MAAM,KAAKA,EAAC,GAAG,YAAY;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACpGA,SAAS,aAAa;AAUf,SAAS,IAAI,KAAa,MAAgB,OAAyB,CAAC,GAAuB;AAChG,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC;AAC9D,QAAI,SAAS;AACb,QAAI,SAAS;AACb,UAAM,QAAQ,GAAG,QAAQ,CAAC,MAAO,UAAU,EAAE,SAAS,CAAE;AACxD,UAAM,QAAQ,GAAG,QAAQ,CAAC,MAAO,UAAU,EAAE,SAAS,CAAE;AACxD,UAAM,GAAG,SAAS,MAAMA,SAAQ,EAAE,IAAI,OAAO,MAAM,MAAM,QAAQ,OAAO,CAAC,CAAC;AAC1E,UAAM,GAAG,SAAS,CAAC,SAASA,SAAQ,EAAE,IAAI,SAAS,GAAG,MAAM,QAAQ,OAAO,CAAC,CAAC;AAAA,EAC/E,CAAC;AACH;AAGO,SAAS,WAAW,KAAa,MAAgB,OAAyB,CAAC,GAAuB;AACvG,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,KAAK,KAAK,KAAK,OAAO,OAAO,OAAO,UAAU,CAAC;AAChF,UAAM,GAAG,SAAS,MAAMA,SAAQ,EAAE,IAAI,OAAO,MAAM,MAAM,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;AAClF,UAAM,GAAG,SAAS,CAAC,SAASA,SAAQ,EAAE,IAAI,SAAS,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;AAAA,EACvF,CAAC;AACH;AAGA,eAAsB,MAAM,KAA+B;AACzD,QAAM,QAAQ,QAAQ,aAAa,UAAU,UAAU;AACvD,QAAM,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC;AAChC,SAAO,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS;AAC1C;;;AH/BO,IAAM,WAAW;AACjB,IAAM,UAAU;AAkBvB,eAAsB,gBAAwC;AAC5D,QAAM,cAAc,gBAAgB;AACpC,QAAM,aAAa,kBAAkB;AACrC,QAAM,OAAO,mBAAmB;AAChC,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,UAAM,IAAI,MAAM,+BAA+B,UAAU,8BAA8B;AAAA,EACzF;AAGA,QAAM,SAAS,YAAY,IAAI;AAE/B,QAAM,cAAc,MAAM,MAAM,QAAQ;AACxC,MAAI,mBAAmB;AACvB,MAAI,kBAAkB;AACtB,MAAI,WAAW;AAEf,MAAI,aAAa;AACf,UAAM,MAAM,MAAM,IAAI,UAAU,CAAC,UAAU,eAAe,OAAO,WAAW,CAAC;AAC7E,uBAAoB,IAAI,MAAM,CAAC,kBAAkB,KAAK,IAAI,SAAS,IAAI,MAAM,KAAM,WAAW,KAAK,IAAI,SAAS,IAAI,MAAM;AAC1H,QAAI,CAAC,iBAAkB,OAAM,KAAK,qBAAqB,IAAI,UAAU,IAAI,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAGvG,UAAM,OAAO,MAAM,IAAI,UAAU,CAAC,UAAU,WAAW,iBAAiB,CAAC;AACzE,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,sBACE,2DAA2D,KAAK,OAAO,KAAK,CAAC,YAAY,KAAK,OAAO;AACvG,QAAI,CAAC,gBAAiB,OAAM,KAAK,mBAAmB,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAEvG,UAAM,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,OAAO,eAAe,QAAQ,UAAU,OAAO,CAAC;AACxF,eAAW,IAAI,MAAM,kBAAkB,KAAK,IAAI,SAAS,IAAI,MAAM;AACnE,QAAI,CAAC,SAAU,OAAM,KAAK,aAAa,IAAI,UAAU,IAAI,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACzF,OAAO;AACL,UAAM,KAAK,8FAAyF;AAAA,EACtG;AAEA,SAAO,EAAE,UAAU,MAAM,kBAAkB,iBAAiB,UAAU,aAAa,MAAM;AAC3F;AAEA,eAAsB,eAA+E;AACnG,QAAM,MAAM,mBAAmB;AAC/B,QAAM,WAAWC,MAAK,KAAK,kBAAkB,aAAa;AAC1D,MAAI,CAAE,MAAM,OAAO,QAAQ,EAAI,QAAO,EAAE,WAAW,OAAO,IAAI;AAC9D,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,MAAM,SAAS,UAAU,MAAM,CAAC;AACxD,WAAO,EAAE,WAAW,MAAM,SAAS,KAAK,SAAS,IAAI;AAAA,EACvD,QAAQ;AACN,WAAO,EAAE,WAAW,MAAM,IAAI;AAAA,EAChC;AACF;AAEO,SAAS,iBAA2B;AACzC,SAAO;AAAA,IACL,iCAAiC,gBAAgB,CAAC;AAAA,IAClD;AAAA,IACA,mCAAmC,QAAQ,IAAI,OAAO;AAAA,EACxD;AACF;;;AIlFA,SAAS,QAAAC,aAAY;AAgBrB,SAAS,qBAAqB,UAAkB,OAAuB;AACrE,MAAI,MAAM;AACV,aAAW,OAAO,CAAC,qCAAqC,kBAAkB,GAAY;AACpF,UAAM,OAAO,SAAS,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,GAAG,CAAC;AACrE,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,KAAK,MAAM,IAAI,SAAS,CAAC;AACvC,QAAI,CAAC,MAAM,KAAK,EAAG;AACnB,UAAM,IAAI,QAAQ,IAAI,OAAO,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACrE;AACA,SAAO;AACT;AAEA,eAAsB,mBAAmB,QAAgB,OAA6B;AACpF,QAAM,WAAW,sBAAsB;AACvC,MAAI,CAAE,MAAM,OAAO,QAAQ,GAAI;AAC7B,UAAM,IAAI;AAAA,MACR,oCAAoC,QAAQ;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,UAAUC,MAAK,QAAQ,YAAY;AACzC,QAAM,cAAe,MAAM,OAAO,OAAO,IAAK,MAAM,SAAS,SAAS,MAAM,IAAI;AAEhF,QAAM,SAAS,UAAU,MAAM;AAC/B,QAAM,UAAU,UAAU,MAAM;AAGhC,QAAM,OAAgC;AAAA,IACpC,CAAC,SAAS,MAAM,IAAI;AAAA,IACpB,CAAC,aAAM,EAAE;AAAA,EACX;AAEA,OAAK,KAAK,GAAG,wBAAwB,MAAM,OAAO,QAAQ,MAAM,OAAO,UAAU,CAAC;AAClF,MAAI,MAAM,OAAO,GAAG,YAAY,MAAM,UAAW,MAAK,KAAK,CAAC,WAAW,MAAM,OAAO,EAAE,CAAC;AACvF,MAAI,MAAM,OAAO,KAAK,YAAY,MAAM,UAAW,MAAK,KAAK,CAAC,WAAW,MAAM,OAAO,IAAI,CAAC;AAC3F,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,iBAAiBA,MAAK,QAAQ,OAAO,iBAAiB,GAAG,KAAK;AAGpE,QAAM,UAAU,cAAc,qBAAqB,aAAa,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK;AACnG,QAAM,UAAU,SAAS,OAAO;AAIhC,QAAM,UAAUA,MAAK,QAAQ,QAAQ,GAAG,oCAAoC;AAC9E;AAGA,eAAe,iBAAiB,MAAc,OAA6B;AACzE,MAAI,CAAE,MAAM,OAAO,IAAI,EAAI;AAC3B,MAAI,MAAM,MAAM,SAAS,MAAM,MAAM;AAErC,QAAM,WAAW,CAAC,OAAe,UAAwB;AAEvD,UAAM,KAAK,IAAI,OAAO,OAAO,KAAK,sCAAsC;AACxE,UAAM,IAAI,QAAQ,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EACpD;AAEA,WAAS,QAAQ,MAAM,IAAI;AAC3B,WAAS,aAAa,MAAM,SAAS;AACrC,WAAS,WAAW,MAAM,OAAO;AACjC,WAAS,UAAU,MAAM,MAAM;AAC/B,WAAS,cAAc,MAAM,UAAU;AACvC,WAAS,gBAAgB,MAAM,YAAY;AAC3C,WAAS,mBAAmB,MAAM,eAAe;AACjD,WAAS,UAAU,MAAM,OAAO,MAAM;AACtC,WAAS,cAAc,MAAM,OAAO,UAAU;AAC9C,WAAS,eAAe,kBAAkB,MAAM,OAAO,MAAM,CAAC;AAC9D,WAAS,MAAM,MAAM,OAAO,EAAE;AAE9B,QAAM,gBAAgB,OAAO,QAAQ,MAAM,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AACtE,QAAM,aAAa,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI;AAC7F,QAAM,IAAI;AAAA,IACR;AAAA,IACA,cAAc,SAAS;AAAA,EAAc,UAAU;AAAA,OAAU;AAAA,EAC3D;AAEA,QAAM,UAAU,MAAM,GAAG;AAC3B;;;AChGA,SAAS,QAAAC,aAAY;AAKrB,SAAS,KAAK,GAAmB;AAC/B,SAAO,EACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE,KAAK;AACrB;AAGA,eAAsB,YAAY,QAAkC;AAClE,QAAM,SAAU,MAAM,MAAM,MAAM,IAAK,SAAS;AAChD,QAAM,IAAI,MAAM,WAAW,QAAQ,CAAC,SAAS,GAAG,EAAE,KAAK,OAAO,CAAC;AAC/D,SAAO,EAAE;AACX;AAEA,eAAsB,UAAU,QAAkC;AAChE,QAAM,SAAU,MAAM,MAAM,MAAM,IAAK,SAAS;AAGhD,QAAM,IAAI,MAAM,WAAW,QAAQ,CAAC,OAAO,UAAU,GAAG,EAAE,KAAK,OAAO,CAAC;AACvE,SAAO,EAAE;AACX;AAGA,eAAsB,oBACpB,QACA,WACgB;AAChB,QAAM,aAAaC,MAAK,QAAQ,OAAO,iBAAiB;AACxD,MAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,WAAO,EAAE,GAAG,eAAe,GAAG,UAAU;AAAA,EAC1C;AACA,QAAM,MAAM,MAAM,SAAS,YAAY,MAAM;AAC7C,QAAM,OAAO,CAAC,OAAe,aAA6B;AACxD,UAAM,IAAI,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,uCAAuC,CAAC;AAClF,WAAO,IAAI,CAAC,KAAK;AAAA,EACnB;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,cAAc,IAAI;AAAA,IACxD,QAAQ,KAAK,UAAU,cAAc,MAAM;AAAA,IAC3C,cAAc,KAAK,gBAAgB,cAAc,YAAY;AAAA,IAC7D,YAAY,KAAK,cAAc,cAAc,UAAU;AAAA,IACvD,SAAS,KAAK,WAAW,cAAc,OAAO;AAAA,IAC9C,WAAW,KAAK,aAAa,cAAc,SAAS;AAAA,IACpD,QAAQ;AAAA,MACN,GAAG,cAAc;AAAA,MACjB,QAAQ,KAAK,UAAU,cAAc,OAAO,MAAM;AAAA,MAClD,YAAY,KAAK,cAAc,cAAc,OAAO,UAAU;AAAA,MAC9D,IAAI,KAAK,MAAM,cAAc,OAAO,EAAE;AAAA,MACtC,MAAM,KAAK,QAAQ,cAAc,OAAO,IAAI;AAAA,IAC9C;AAAA,IACA,eAAe,cAAc;AAAA,EAC/B;AACF;AAMA,eAAsB,WACpB,QACA,OACgE;AAChE,QAAM,cAAc,KAAK,MAAM,IAAI;AACnC,QAAM,eAAeA,MAAK,QAAQ,cAAc,WAAW;AAC3D,MAAI,CAAE,MAAM,OAAO,YAAY,GAAI;AACjC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,QACE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,CAAE,MAAM,MAAM,UAAU,KAAM,CAAE,MAAM,MAAM,KAAK,GAAI;AACvD,WAAO,EAAE,IAAI,OAAO,aAAa,QAAQ,4DAAuD;AAAA,EAClG;AACA,QAAM,MAAO,MAAM,MAAM,UAAU,IAAK,aAAa;AACrD,QAAM,OACJ,QAAQ,aACJ,CAAC,UAAU,UAAU,WAAW,IAChC,CAAC,YAAY,UAAU,UAAU,WAAW;AAClD,QAAM,IAAI,MAAM,WAAW,KAAK,MAAM,EAAE,KAAK,OAAO,CAAC;AACrD,SAAO,EAAE,KACL,EAAE,IAAI,MAAM,YAAY,IACxB,EAAE,IAAI,OAAO,aAAa,QAAQ,uFAAkF;AAC1H;;;APhFA,IAAM,UAAU;AAEhB,SAAS,SAAe;AACtB,EAAE,QAAM,GAAG,GAAG,KAAK,GAAG,OAAO,gBAAW,CAAC,CAAC,IAAI,GAAG,IAAI,4CAAoC,OAAO,CAAC,EAAE;AACrG;AAEA,SAAS,GAAG,KAAmB;AAC7B,EAAE,MAAI,QAAQ,GAAG,MAAM,GAAG,CAAC;AAC7B;AACA,SAAS,KAAK,KAAmB;AAC/B,EAAE,MAAI,KAAK,GAAG;AAChB;AAGA,eAAe,YAAY,MAA6B;AACtD,QAAM,OAAQ,MAAQ,OAAK;AAAA,IACzB,SAAS;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,EACrB,CAAC;AACD,MAAM,WAAS,IAAI,EAAG,SAAQ,KAAK,CAAC;AAEpC,QAAM,SAAU,MAAQ,OAAK;AAAA,IAC3B,SAAS;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,EACrB,CAAC;AACD,MAAM,WAAS,MAAM,EAAG,SAAQ,KAAK,CAAC;AAEtC,QAAM,SAAU,MAAQ,OAAK;AAAA,IAC3B,SAAS;AAAA,IACT,aAAa,KAAK,OAAO;AAAA,IACzB,cAAc,KAAK,OAAO;AAAA,EAC5B,CAAC;AACD,MAAM,WAAS,MAAM,EAAG,SAAQ,KAAK,CAAC;AAEtC,QAAM,eAAgB,MAAQ,OAAK;AAAA,IACjC,SAAS;AAAA,IACT,aAAa,WAAW,MAAM;AAAA,IAC9B,cAAc,WAAW,MAAM;AAAA,EACjC,CAAC;AACD,MAAM,WAAS,YAAY,EAAG,SAAQ,KAAK,CAAC;AAE5C,QAAM,aAAa,iBAAiB,QAAQ,IAAI;AAChD,QAAM,YAAY,SAAS,cAAc,QAAQ,WAAW,cAAc;AAC1E,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,WAAW;AAAA,IACX,SAAS,YAAY,KAAK,UAAU,0BAA0B,IAAI;AAAA,IAClE;AAAA,IACA;AAAA,IACA,YAAY,WAAW,MAAM;AAAA,IAC7B,iBAAiB,YAAY,KAAK,kBAAkB;AAAA,IACpD,QAAQ,YAAY,KAAK,SAAS,CAAC;AAAA,IACnC,QAAQ,EAAE,GAAG,KAAK,QAAQ,QAAQ,WAAW;AAAA,EAC/C;AACF;AAEA,eAAe,kBAAiC;AAC9C,QAAM,IAAM,UAAQ;AACpB,IAAE,MAAM,uCAAuC;AAC/C,QAAM,IAAI,MAAM,cAAc;AAC9B,IAAE,KAAK,eAAe;AACtB,KAAG,iBAAY,EAAE,QAAQ,EAAE;AAC3B;AAAA,IACE,QAAQ,EAAE,WAAW,GAAG,MAAM,YAAY,IAAI,GAAG,OAAO,QAAQ,CAAC,wBAC/C,EAAE,mBAAmB,GAAG,MAAM,OAAO,IAAI,GAAG,OAAO,QAAQ,CAAC,oBAChE,EAAE,kBAAkB,GAAG,MAAM,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC;AAAA,EAC1E;AACA,MAAI,CAAC,EAAE,eAAe,EAAE,MAAM,QAAQ;AACpC,IAAE,OAAK,eAAe,EAAE,KAAK,IAAI,GAAG,sCAAsC;AAC1E,QAAI,EAAE,MAAM,OAAQ,MAAK,GAAG,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,EACrD;AACF;AAEA,eAAe,aAAa,QAAgB,OAA6B;AACvE,QAAM,IAAM,UAAQ;AACpB,IAAE,MAAM,eAAe,MAAM,IAAI,sBAAiB,MAAM,EAAE;AAC1D,QAAM,mBAAmB,QAAQ,KAAK;AACtC,IAAE,KAAK,uBAAuB;AAC9B,KAAG,WAAW,MAAM,oBAAoB,MAAM,IAAI,YAAY,MAAM,OAAO,MAAM,GAAG;AACtF;AAEA,eAAe,iBAAiB,QAAgB,OAAc,MAA4E;AACxI,MAAI,KAAK,SAAS;AAChB,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,oCAAoC;AAC5C,UAAM,MAAM,MAAM,YAAY,MAAM;AACpC,MAAE,KAAK,MAAM,2BAA2B,oCAAoC;AAC5E,QAAI,CAAC,IAAK;AAAA,EACZ;AACA,MAAI,KAAK,OAAO;AACd,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,kCAAkC;AAC1C,UAAM,MAAM,MAAM,UAAU,MAAM;AAClC,MAAE,KAAK,MAAM,oBAAoB,sCAAiC;AAClE,QAAI,CAAC,IAAK;AAAA,EACZ;AACA,MAAI,KAAK,QAAQ;AACf,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,iCAAiC;AACzC,UAAM,IAAI,MAAM,WAAW,QAAQ,KAAK;AACxC,MAAE,KAAK,EAAE,KAAK,aAAa,EAAE,WAAW,KAAK,gBAAgB;AAC7D,QAAI,CAAC,EAAE,MAAM,EAAE,OAAQ,MAAK,GAAG,OAAO,EAAE,MAAM,CAAC;AAAA,EACjD;AACF;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,iGAA4F,EACxG,QAAQ,OAAO;AAElB,QACG,QAAQ,MAAM,EACd,YAAY,mEAAmE,EAC/E,OAAO,gBAAgB,+BAA+B,cAAc,EACpE,OAAO,SAAS,kCAAkC,EAClD,OAAO,OAAO,MAAsC;AACnD,SAAO;AACP,QAAM,gBAAgB;AAEtB,QAAM,QAAQ,EAAE,MAAM,gBAAgB,MAAM,YAAY,aAAa;AACrE,QAAM,SAASC,SAAQ,EAAE,GAAG;AAC5B,MAAI,MAAM,OAAO,MAAM,GAAG;AACxB,UAAM,KAAK,MAAQ,UAAQ,EAAE,SAAS,GAAG,MAAM,wCAAmC,cAAc,MAAM,CAAC;AACvG,QAAM,WAAS,EAAE,KAAK,CAAC,IAAI;AACzB,MAAE,QAAM,wCAAwC;AAChD;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAa,QAAQ,KAAK;AAEhC,MAAI,UAAU,CAAC,CAAC,EAAE;AAClB,MAAI,QAAQ,CAAC,CAAC,EAAE;AAChB,MAAI,SAAS;AACb,MAAI,CAAC,EAAE,KAAK;AACV,UAAM,OAAO,MAAQ,SAAO;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,SAAS,OAAO,uBAAuB;AAAA,QAChD,EAAE,OAAO,UAAU,OAAO,iDAAiD;AAAA,QAC3E,EAAE,OAAO,QAAQ,OAAO,wCAAmC;AAAA,MAC7D;AAAA,MACA,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,IAAI,EAAG,SAAQ,KAAK,CAAC;AACpC,cAAU,SAAS;AACnB,YAAQ,SAAS;AACjB,aAAS,SAAS;AAAA,EACpB;AACA,QAAM,iBAAiB,QAAQ,OAAO,EAAE,SAAS,OAAO,OAAO,CAAC;AAEhE,EAAE;AAAA,IACA;AAAA,MACE,MAAM,EAAE,GAAG;AAAA,MACX;AAAA,MACA;AAAA,MACA,iBAAiB,OAAO;AAAA,IAC1B,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AACA,EAAE,QAAM,GAAG,MAAM,4CAA4C,CAAC;AAChE,CAAC;AAEH,IAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,wCAAwC;AAC7F,OACG,QAAQ,SAAS,EACjB,YAAY,6DAA6D,EACzE,OAAO,YAAY;AAClB,SAAO;AACP,QAAM,gBAAgB;AACtB,EAAE,QAAM,GAAG,MAAM,+CAA+C,CAAC;AACnE,CAAC;AACH,OACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,OAAO,YAAY;AAClB,QAAM,KAAK,MAAM,aAAa;AAC9B,SAAO;AACP,OAAK,GAAG,YAAY,GAAG,MAAM,cAAc,GAAG,WAAW,GAAG,WAAM,GAAG,GAAG,EAAE,IAAI,GAAG,OAAO,kBAAkB,GAAG,GAAG,GAAG,CAAC;AACpH,EAAE,QAAM,EAAE;AACZ,CAAC;AAEH,IAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,iDAAiD;AAClG,KACG,QAAQ,cAAc,EACtB,YAAY,8DAA8D,EAC1E,OAAO,iBAAiB,YAAY,EACpC,OAAO,qBAAqB,QAAQ,EACpC,OAAO,kBAAkB,cAAc,EACvC,OAAO,SAAS,8BAA8B,EAC9C,OAAO,OAAO,KAAyB,MAA0E;AAChH,SAAO;AACP,MAAI,QAAe,EAAE,GAAG,cAAc;AACtC,MAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ;AAClC,UAAM,OAAO,EAAE,QAAQ,MAAM;AAC7B,UAAM,SAAS,EAAE,WAAW,EAAE,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,MAAM;AACnE,UAAM,YAAY,SAAS,cAAc,QAAQ,WAAW,cAAc;AAC1E,YAAQ;AAAA,MACN,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,WAAW,EAAE,QAAQ,MAAM;AAAA,MAC3B,SAAS,EAAE,OAAO,0BAA0B,EAAE,IAAI,MAAM,MAAM;AAAA,MAC9D,cAAc,WAAW,MAAM;AAAA,MAC/B,YAAY,WAAW,MAAM;AAAA,MAC7B,iBAAiB,YAAY,MAAM,kBAAkB;AAAA,MACrD,QAAQ,YAAY,MAAM,SAAS,CAAC;AAAA,MACpC,QAAQ;AAAA,QACN,GAAG,MAAM;AAAA,QACT,QAAQ,EAAE,UAAU,MAAM,OAAO;AAAA,QACjC,YAAY,EAAE,SAAS,iBAAiB,EAAE,MAAM,IAAI,MAAM,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,EACF,WAAW,CAAC,EAAE,KAAK;AACjB,YAAQ,MAAM,YAAY,aAAa;AAAA,EACzC;AACA,QAAM,SAASA,SAAQ,OAAO,cAAc;AAC5C,MAAI,MAAM,OAAO,MAAM,GAAG;AACxB,UAAM,KAAK,MAAQ,UAAQ,EAAE,SAAS,GAAG,MAAM,wCAAmC,cAAc,MAAM,CAAC;AACvG,QAAM,WAAS,EAAE,KAAK,CAAC,IAAI;AACzB,MAAE,QAAM,6CAA6C;AACrD;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAa,QAAQ,KAAK;AAChC,EAAE,QAAM,GAAG,MAAM,kBAAkB,OAAO,YAAY,8BAA8B,CAAC;AACvF,CAAC;AACH,KACG,QAAQ,cAAc,EACtB,YAAY,oDAAoD,EAChE,OAAO,iBAAiB,8CAA8C,EACtE,OAAO,OAAO,KAAyB,MAAyB;AAC/D,SAAO;AACP,QAAM,SAASA,SAAQ,OAAO,cAAc;AAC5C,QAAM,QAAQ,MAAM,oBAAoB,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,MAAS;AACrF,QAAM,iBAAiB,QAAQ,OAAO,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,KAAK,CAAC;AAClF,EAAE,QAAM,EAAE;AACZ,CAAC;AAEH,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,MAAe;AACrD,UAAQ,MAAM,GAAG,IAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAChE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["resolve","join","existsSync","join","p","resolve","join","join","join","join","join","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/lib/brand.ts","../src/cli/lib/plugin.ts","../src/cli/lib/paths.ts","../src/cli/lib/fsx.ts","../src/cli/lib/exec.ts","../src/cli/lib/urls.ts","../src/cli/lib/whitelabel.ts","../src/cli/lib/site.ts","../src/cli/lib/status.ts","../src/cli/lib/guidance.ts","../src/cli/lib/home.ts","../src/cli/lib/ask.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { resolve } from \"node:path\";\nimport { Brand, CARRIER_BRAND, deriveAccentDark } from \"./lib/brand.js\";\nimport {\n installPlugin,\n installAuthGuidance,\n manualCommands,\n MCP_URL,\n} from \"./lib/plugin.js\";\nimport { scaffoldStorefront } from \"./lib/whitelabel.js\";\nimport { buildSite, deploySite, installDeps, loadStorefrontBrand, slug } from \"./lib/site.js\";\nimport { exists } from \"./lib/fsx.js\";\nimport { gatherStatus } from \"./lib/status.js\";\nimport {\n formatStatusBlock,\n formatNextSteps,\n formatNlExamples,\n oauthFirstUseNote,\n accountLinksNote,\n} from \"./lib/guidance.js\";\nimport { runHome, printStatus } from \"./lib/home.js\";\nimport { carrierAsk } from \"./lib/ask.js\";\nimport { openUrl, SIGN_UP_URL, SIGN_IN_URL, CONSOLE_URL, ONBOARDING_URL, MCP_HOME } from \"./lib/urls.js\";\n\nconst VERSION = \"0.2.18\";\n\nfunction header(): void {\n p.intro(`${pc.bold(pc.yellow(\"◆ carrier\"))} ${pc.dim(\"· the Stripe of telecom — CLI v\" + VERSION)}`);\n}\n\nfunction ok(msg: string): void {\n p.log.success(pc.green(msg));\n}\nfunction info(msg: string): void {\n p.log.info(msg);\n}\nfunction fail(msg: string, next: string[]): void {\n p.log.error(msg);\n p.note(next.map((s) => `→ ${s}`).join(\"\\n\"), \"What to do next\");\n}\n\n/** Interactive brand capture, seeded from Carrier defaults. */\nasync function promptBrand(seed: Brand): Promise<Brand> {\n const name = (await p.text({\n message: \"Brand name\",\n placeholder: seed.name,\n defaultValue: seed.name,\n })) as string;\n if (p.isCancel(name)) process.exit(0);\n\n const domain = (await p.text({\n message: \"Domain\",\n placeholder: seed.domain,\n defaultValue: seed.domain,\n })) as string;\n if (p.isCancel(domain)) process.exit(0);\n\n const accent = (await p.text({\n message: \"Accent color (hex)\",\n placeholder: seed.colors.accent,\n defaultValue: seed.colors.accent,\n })) as string;\n if (p.isCancel(accent)) process.exit(0);\n\n const supportEmail = (await p.text({\n message: \"Support email\",\n placeholder: `support@${domain}`,\n defaultValue: `support@${domain}`,\n })) as string;\n if (p.isCancel(supportEmail)) process.exit(0);\n\n const accentDark = deriveAccentDark(accent, seed);\n const isCarrier = name === CARRIER_BRAND.name && domain === CARRIER_BRAND.domain;\n return {\n ...seed,\n name,\n legalName: name,\n tagline: isCarrier ? seed.tagline : `Mobile connectivity by ${name}.`,\n domain,\n supportEmail,\n supportUrl: `https://${domain}/help`,\n supportWhatsapp: isCarrier ? seed.supportWhatsapp : \"\",\n social: isCarrier ? seed.social : {},\n colors: { ...seed.colors, accent, accentDark },\n };\n}\n\nasync function doPluginInstall(): Promise<void> {\n const s = p.spinner();\n s.start(\"Installing Carrier Claude Code plugin + zero-cred MCP\");\n let r;\n try {\n r = await installPlugin();\n } catch (e: unknown) {\n s.stop(\"Install failed\");\n fail(String(e instanceof Error ? e.message : e), [\n \"Reinstall the package: npm i -g @carrierllc/mcp (or npx @carrierllc/mcp)\",\n \"Or finish manually with the commands under `carrier plugin install` help\",\n `Sign up anytime: ${SIGN_UP_URL}`,\n ]);\n return;\n }\n s.stop(\"Plugin staged\");\n ok(`Plugin → ${r.copiedTo}`);\n info(\n `MCP: ${r.mcpAdded ? pc.green(\"registered\") : pc.yellow(\"manual\")} · ` +\n `marketplace: ${r.marketplaceAdded ? pc.green(\"added\") : pc.yellow(\"manual\")} · ` +\n `install: ${r.pluginInstalled ? pc.green(\"done\") : pc.yellow(\"manual\")}`,\n );\n p.note(installAuthGuidance().join(\"\\n\"), \"OAuth on first use (Entry A)\");\n if (!r.claudeFound || r.notes.length) {\n p.note(manualCommands().join(\"\\n\"), \"Finish wiring (run in your terminal)\");\n if (r.notes.length) info(pc.dim(r.notes.join(\"\\n\")));\n p.note(\n [\n \"You can still create an account now:\",\n ` carrier open signup`,\n \"Then open Claude and talk to your fleet — browser OAuth completes auth.\",\n ].join(\"\\n\"),\n \"Next\",\n );\n } else {\n p.note(\n [\n \"Open Claude Code and say something like:\",\n ' \"Show my fleet health\"',\n \"First call opens the browser for sign-in / sign-up. No token paste.\",\n \"\",\n \"More prompts: carrier → Talk to fleet\",\n ].join(\"\\n\"),\n \"Talk to your fleet\",\n );\n }\n}\n\nasync function doSiteCreate(target: string, brand: Brand): Promise<void> {\n const s = p.spinner();\n s.start(`Scaffolding ${brand.name} storefront → ${target}`);\n try {\n await scaffoldStorefront(target, brand);\n } catch (e: unknown) {\n s.stop(\"Scaffold failed\");\n fail(String(e instanceof Error ? e.message : e), [\n \"Pick a free directory: carrier site create ./my-storefront\",\n \"Ensure the package templates shipped with @carrierllc/mcp\",\n \"Still stuck? carrier open console\",\n ]);\n throw e;\n }\n s.stop(\"Storefront scaffolded\");\n ok(`Created ${target} (white-labeled: ${brand.name}, accent ${brand.colors.accent})`);\n}\n\nasync function maybeBuildDeploy(\n target: string,\n brand: Brand,\n opts: { install: boolean; build: boolean; deploy: boolean },\n): Promise<void> {\n if (opts.install) {\n const s = p.spinner();\n s.start(\"Installing storefront dependencies\");\n const oki = await installDeps(target);\n s.stop(oki ? \"Dependencies installed\" : \"Dependency install reported errors\");\n if (!oki) {\n p.note(\n [\n `cd ${target} && pnpm install`,\n \"Fix any Node/pnpm version issues, then retry build\",\n ].join(\"\\n\"),\n \"Next\",\n );\n return;\n }\n }\n if (opts.build) {\n const s = p.spinner();\n s.start(\"Building storefront (next build)\");\n const okb = await buildSite(target);\n s.stop(okb ? \"Build succeeded\" : \"Build failed — see output above\");\n if (!okb) {\n p.note(\n [`cd ${target}`, \"pnpm build\", \"Check env keys in .env.local if the build mentions Clerk\"].join(\"\\n\"),\n \"Next\",\n );\n return;\n }\n }\n if (opts.deploy) {\n const s = p.spinner();\n s.start(\"Deploying to Cloudflare Workers\");\n const r = await deploySite(target, brand);\n s.stop(r.ok ? `Deployed: ${r.projectName}` : \"Deploy skipped\");\n if (!r.ok && r.reason) {\n info(pc.yellow(r.reason));\n p.note(\n [\n \"Install wrangler and login: npx wrangler login\",\n `Then: carrier site deploy ${target}`,\n ].join(\"\\n\"),\n \"Next\",\n );\n }\n }\n}\n\nasync function interactiveSiteCreate(): Promise<void> {\n const brand = await promptBrand(CARRIER_BRAND);\n const dir = (await p.text({\n message: \"Output directory\",\n placeholder: \"./storefront\",\n defaultValue: \"./storefront\",\n })) as string;\n if (p.isCancel(dir)) return;\n const target = resolve(dir);\n if (await exists(target)) {\n const go = await p.confirm({ message: `${target} exists — write into it anyway?`, initialValue: false });\n if (p.isCancel(go) || !go) {\n p.outro(\"Stopped. Re-run with a different directory.\");\n return;\n }\n }\n await doSiteCreate(target, brand);\n p.outro(pc.green(`Scaffolded. cd ${dir} && pnpm install && pnpm dev`));\n}\n\nconst program = new Command();\n\nprogram\n .name(\"carrier\")\n .description(\n \"Carrier CLI — clear TUI for non-developers: status, OAuth-ready MCP install, storefront scaffold, and fleet NL helpers.\",\n )\n .version(VERSION)\n .action(async () => {\n header();\n await runHome({\n onInstall: doPluginInstall,\n onSiteCreate: interactiveSiteCreate,\n });\n });\n\nprogram\n .command(\"init\")\n .description(\"Interactive home: status, install plugin+MCP (OAuth on first use), optional storefront.\")\n .option(\"--dir <path>\", \"Storefront output directory\", \"./storefront\")\n .option(\"--yes\", \"Use Carrier defaults, no prompts (plugin + scaffold + build)\")\n .option(\"--full\", \"After install, continue into storefront scaffold (default interactive path offers both)\")\n .action(async (o: { dir: string; yes?: boolean; full?: boolean }) => {\n header();\n\n if (o.yes) {\n await doPluginInstall();\n const brand = CARRIER_BRAND;\n const target = resolve(o.dir);\n if (await exists(target)) {\n info(pc.yellow(`${target} exists — writing into it (--yes).`));\n }\n await doSiteCreate(target, brand);\n await maybeBuildDeploy(target, brand, { install: true, build: true, deploy: false });\n p.note(oauthFirstUseNote(), \"Auth\");\n p.note(\n [\n `cd ${o.dir}`,\n `Edit src/brand.config.ts to re-brand anytime`,\n `pnpm dev # local preview`,\n `MCP endpoint: ${MCP_URL}`,\n 'In Claude: \"Show my fleet health\" (browser OAuth on first use)',\n ].join(\"\\n\"),\n \"Next\",\n );\n p.outro(pc.green(\"Done. Your connectivity business is wired.\"));\n return;\n }\n\n // Default init = first-class TUI home (status + auth helpers + optional scaffold).\n // --full jumps straight into classic plugin+storefront wizard after a status line.\n if (o.full) {\n const st = await gatherStatus();\n printStatus(st);\n await doPluginInstall();\n\n const brand = await promptBrand(CARRIER_BRAND);\n const target = resolve(o.dir);\n if (await exists(target)) {\n const go = await p.confirm({ message: `${target} exists — write into it anyway?`, initialValue: false });\n if (p.isCancel(go) || !go) {\n p.outro(\"Stopped. Re-run with --dir <new path>.\");\n return;\n }\n }\n await doSiteCreate(target, brand);\n\n const next = await p.select({\n message: \"Roll it out now?\",\n options: [\n { value: \"build\", label: \"Install deps + build\" },\n { value: \"deploy\", label: \"Install + build + deploy to Cloudflare Workers\" },\n { value: \"none\", label: \"Just scaffold — I'll build later\" },\n ],\n initialValue: \"build\",\n });\n if (p.isCancel(next)) process.exit(0);\n await maybeBuildDeploy(target, brand, {\n install: next !== \"none\",\n build: next !== \"none\",\n deploy: next === \"deploy\",\n });\n\n p.note(oauthFirstUseNote(), \"Auth\");\n p.note(\n [\n `cd ${o.dir}`,\n `Edit src/brand.config.ts to re-brand anytime`,\n `pnpm dev # local preview`,\n `MCP endpoint: ${MCP_URL}`,\n ].join(\"\\n\"),\n \"Next\",\n );\n p.outro(pc.green(\"Done. Your connectivity business is wired.\"));\n return;\n }\n\n await runHome({\n onInstall: doPluginInstall,\n onSiteCreate: async () => {\n const brand = await promptBrand(CARRIER_BRAND);\n const target = resolve(o.dir);\n if (await exists(target)) {\n const go = await p.confirm({ message: `${target} exists — write into it anyway?`, initialValue: false });\n if (p.isCancel(go) || !go) {\n p.log.info(\"Skipped storefront. Pick Install or Exit from the menu, or re-run with --dir.\");\n return;\n }\n }\n await doSiteCreate(target, brand);\n const next = await p.select({\n message: \"Roll it out now?\",\n options: [\n { value: \"build\", label: \"Install deps + build\" },\n { value: \"deploy\", label: \"Install + build + deploy to Cloudflare Workers\" },\n { value: \"none\", label: \"Just scaffold — I'll build later\" },\n ],\n initialValue: \"build\",\n });\n if (p.isCancel(next)) return;\n await maybeBuildDeploy(target, brand, {\n install: next !== \"none\",\n build: next !== \"none\",\n deploy: next === \"deploy\",\n });\n p.note(\n [\n `cd ${o.dir}`,\n `pnpm dev`,\n `MCP: ${MCP_URL} · OAuth on first use in Claude`,\n ].join(\"\\n\"),\n \"Next\",\n );\n },\n });\n });\n\nconst plugin = program.command(\"plugin\").description(\"Manage the Carrier Claude Code plugin.\");\nplugin\n .command(\"install\")\n .description(\"Install/register the Carrier plugin + zero-cred MCP (OAuth on first use).\")\n .action(async () => {\n header();\n await doPluginInstall();\n p.outro(pc.green(\"Plugin ready. Restart Claude Code, then talk to your fleet.\"));\n });\nplugin\n .command(\"status\")\n .description(\"Show plugin + MCP registration + auth next steps.\")\n .action(async () => {\n header();\n const st = await gatherStatus();\n printStatus(st);\n p.note(oauthFirstUseNote(), \"Auth\");\n p.outro(\"\");\n });\n\nprogram\n .command(\"status\")\n .description(\"Show MCP / plugin / auth status and next steps.\")\n .action(async () => {\n header();\n const s = p.spinner();\n s.start(\"Checking status\");\n const st = await gatherStatus();\n s.stop(\"Done\");\n p.note(formatStatusBlock(st), \"Status\");\n p.note(formatNextSteps(st), \"Next steps\");\n p.note(oauthFirstUseNote(), \"Auth\");\n p.outro(\"\");\n });\n\nconst openCmd = program.command(\"open\").description(\"Open Carrier account / product URLs in your browser.\");\nfor (const [name, url, desc] of [\n [\"signup\", SIGN_UP_URL, \"Create a Carrier account (Clerk sign-up)\"],\n [\"signin\", SIGN_IN_URL, \"Sign in to Carrier\"],\n [\"console\", CONSOLE_URL, \"Open the Carrier console\"],\n [\"onboarding\", ONBOARDING_URL, \"Open console onboarding (link OCS / managed)\"],\n [\"mcp\", MCP_HOME, \"Open mcp.carrier.llc product page\"],\n] as const) {\n openCmd\n .command(name)\n .description(desc)\n .action(async () => {\n header();\n const r = await openUrl(url);\n if (r.ok) ok(r.hint);\n else {\n p.log.warn(r.hint);\n p.note(url, \"Open this URL\");\n }\n p.note(accountLinksNote(), \"Account links\");\n p.outro(\"\");\n });\n}\n\nprogram\n .command(\"examples\")\n .description(\"Print natural-language fleet prompts for Claude / MCP.\")\n .action(async () => {\n header();\n p.note(formatNlExamples(), \"Talk to fleet — paste into Claude\");\n p.note(\n [\n \"After `carrier plugin install` (or this menu → Install):\",\n \" 1. Open Claude Code\",\n ' 2. Say: \"Show my fleet health\"',\n \" 3. Browser opens for sign-in/sign-up on first use\",\n \"\",\n \"Slash commands: /carrier:fleet /carrier:status /carrier:wallet /carrier:onboard\",\n ].join(\"\\n\"),\n \"How\",\n );\n p.outro(\"\");\n });\n\nprogram\n .command(\"ask\")\n .description('Optional headless NL: carrier ask \"show fleet health\" (needs CARRIER_API_KEY or OCS token).')\n .argument(\"<intent...>\", \"Natural-language intent\")\n .action(async (parts: string[]) => {\n header();\n const intent = parts.join(\" \").trim();\n if (!intent) {\n fail(\"Missing intent.\", [\n 'carrier ask \"show fleet health\"',\n \"Or use Claude interactively (no token): carrier plugin install\",\n ]);\n process.exitCode = 1;\n return;\n }\n const s = p.spinner();\n s.start(\"Asking Carrier MCP…\");\n const result = await carrierAsk(intent);\n s.stop(result.ok ? \"Done\" : \"Failed\");\n if (result.ok) {\n p.note(result.text.slice(0, 6000), \"Answer\");\n p.outro(\"\");\n } else {\n p.log.error(result.text);\n p.outro(pc.yellow(\"See next steps above.\"));\n process.exitCode = 1;\n }\n });\n\nconst site = program.command(\"site\").description(\"Scaffold and deploy a white-labeled storefront.\");\nsite\n .command(\"create [dir]\")\n .description(\"Scaffold a white-labeled storefront from the Mango template.\")\n .option(\"--name <name>\", \"Brand name\")\n .option(\"--domain <domain>\", \"Domain\")\n .option(\"--accent <hex>\", \"Accent color\")\n .option(\"--yes\", \"Carrier defaults, no prompts\")\n .action(async (dir: string | undefined, o: { name?: string; domain?: string; accent?: string; yes?: boolean }) => {\n header();\n let brand: Brand = { ...CARRIER_BRAND };\n if (o.name || o.domain || o.accent) {\n const name = o.name ?? brand.name;\n const domain = o.domain ?? (o.name ? `${slug(o.name)}.com` : brand.domain);\n const isCarrier = name === CARRIER_BRAND.name && domain === CARRIER_BRAND.domain;\n brand = {\n ...brand,\n name,\n domain,\n legalName: o.name ?? brand.legalName,\n tagline: o.name ? `Mobile connectivity by ${o.name}.` : brand.tagline,\n supportEmail: `support@${domain}`,\n supportUrl: `https://${domain}/help`,\n supportWhatsapp: isCarrier ? brand.supportWhatsapp : \"\",\n social: isCarrier ? brand.social : {},\n colors: {\n ...brand.colors,\n accent: o.accent ?? brand.colors.accent,\n accentDark: o.accent ? deriveAccentDark(o.accent) : brand.colors.accentDark,\n },\n };\n } else if (!o.yes) {\n brand = await promptBrand(CARRIER_BRAND);\n }\n const target = resolve(dir ?? \"./storefront\");\n if (await exists(target)) {\n const go = await p.confirm({ message: `${target} exists — write into it anyway?`, initialValue: false });\n if (p.isCancel(go) || !go) {\n p.outro(\"Stopped. Re-run with a different directory.\");\n return;\n }\n }\n try {\n await doSiteCreate(target, brand);\n } catch {\n process.exitCode = 1;\n return;\n }\n p.outro(pc.green(`Scaffolded. cd ${dir ?? \"storefront\"} && pnpm install && pnpm dev`));\n });\nsite\n .command(\"deploy [dir]\")\n .description(\"Build + deploy a storefront to Cloudflare Workers.\")\n .option(\"--name <name>\", \"Cloudflare Worker name (defaults from brand)\")\n .action(async (dir: string | undefined, o: { name?: string }) => {\n header();\n const target = resolve(dir ?? \"./storefront\");\n try {\n const brand = await loadStorefrontBrand(target, o.name ? { name: o.name } : undefined);\n await maybeBuildDeploy(target, brand, { install: true, build: true, deploy: true });\n } catch (e: unknown) {\n fail(String(e instanceof Error ? e.message : e), [\n \"Scaffold first: carrier site create\",\n \"Ensure wrangler is logged in for deploy\",\n ]);\n process.exitCode = 1;\n return;\n }\n p.outro(\"\");\n });\n\nprogram.parseAsync(process.argv).catch((e: unknown) => {\n console.error(pc.red(String(e instanceof Error ? e.message : e)));\n console.error(\n pc.dim(\n [\n \"\",\n \"What to do next:\",\n \" → carrier status\",\n \" → carrier open signup\",\n \" → carrier plugin install\",\n \" → carrier --help\",\n ].join(\"\\n\"),\n ),\n );\n process.exit(1);\n});\n","/**\n * Brand config — the single white-label surface for the storefront.\n * Carrier defaults; overridable interactively or via `carrier site create --brand`.\n */\nexport interface Brand {\n name: string;\n legalName: string;\n tagline: string;\n domain: string;\n supportEmail: string;\n supportUrl: string;\n supportWhatsapp: string;\n colors: {\n /** Page background (deepest ink). */\n bg: string;\n /** Primary accent. */\n accent: string;\n /** Accent pressed/dark. */\n accentDark: string;\n /** Primary text. */\n text: string;\n };\n social: {\n x?: string;\n linkedin?: string;\n instagram?: string;\n tiktok?: string;\n };\n /** MCP control-plane endpoint the storefront's API talks to. */\n carrierApiUrl: string;\n}\n\nexport const CARRIER_BRAND: Brand = {\n name: \"Carrier\",\n legalName: \"Lifecycle Innovations Limited\",\n tagline: \"Programmable connectivity, on demand.\",\n domain: \"carrier.llc\",\n supportEmail: \"support@carrier.llc\",\n supportUrl: \"https://carrier.llc/help\",\n supportWhatsapp: \"+17864604829\",\n colors: {\n bg: \"#080C16\",\n accent: \"#FF6B35\",\n accentDark: \"#D9461C\",\n text: \"#F5F1EA\",\n },\n social: {\n x: \"@carrier_llc\",\n instagram: \"@carrier.llc\",\n tiktok: \"@carrier.llc\",\n },\n carrierApiUrl: \"https://api.carrier.llc\",\n};\n\nconst CARRIER_ACCENT_LIGHT = \"#FFB088\";\nconst CARRIER_ACCENT_GRADIENT_START = \"#FF7A45\";\n\nfunction hexToRgb(hex: string): [number, number, number] | null {\n const h = hex.replace(/^#/, \"\");\n if (!/^[0-9a-fA-F]{6}$/.test(h)) return null;\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\nfunction rgbToHex(r: number, g: number, b: number, lower = false): string {\n const fmt = (n: number) =>\n Math.max(0, Math.min(255, Math.round(n)))\n .toString(16)\n .padStart(2, \"0\");\n const out = `#${fmt(r)}${fmt(g)}${fmt(b)}`;\n return lower ? out : out.toUpperCase();\n}\n\nfunction mixHexWithWhite(hex: string, whiteRatio: number): string {\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n const mix = (n: number) => n + (255 - n) * whiteRatio;\n return rgbToHex(mix(rgb[0]), mix(rgb[1]), mix(rgb[2]));\n}\n\nfunction darkenHex(hex: string, factor: number): string {\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n const scale = (n: number) => n * factor;\n return rgbToHex(scale(rgb[0]), scale(rgb[1]), scale(rgb[2]), true);\n}\n\n/** Derive a darker pressed-state accent; keeps the Carrier default pair when accent is unchanged. */\nexport function deriveAccentDark(accent: string, seed: Brand = CARRIER_BRAND): string {\n if (accent.toUpperCase() === seed.colors.accent.toUpperCase()) return seed.colors.accentDark;\n const rgb = hexToRgb(accent);\n if (!rgb) return accent;\n const scale = (n: number) => Math.max(0, Math.min(255, Math.round(n * 0.75)));\n return rgbToHex(scale(rgb[0]), scale(rgb[1]), scale(rgb[2]));\n}\n\n/** Derive a lighter accent for glows and `--brand-accent-light`. */\nexport function deriveAccentLight(accent: string, seed: Brand = CARRIER_BRAND): string {\n if (accent.toUpperCase() === seed.colors.accent.toUpperCase()) return CARRIER_ACCENT_LIGHT;\n return mixHexWithWhite(accent, 0.45);\n}\n\n/** Derive the lighter hero-gradient stop paired with accent. */\nexport function deriveAccentGradientStart(accent: string, seed: Brand = CARRIER_BRAND): string {\n if (accent.toUpperCase() === seed.colors.accent.toUpperCase()) return CARRIER_ACCENT_GRADIENT_START;\n return mixHexWithWhite(accent, 0.08);\n}\n\n/** Tree-wide hex swaps for accent-derived template colors (gradients, mango scale, CSS vars). */\nexport function deriveAccentPaletteSubs(accent: string, accentDark: string): Array<[string, string]> {\n if (accent.toUpperCase() === CARRIER_BRAND.colors.accent.toUpperCase()) return [];\n const accentLight = deriveAccentLight(accent);\n const gradientStart = deriveAccentGradientStart(accent);\n return [\n [\"#FF6B35\", accent],\n [\"#D9461C\", accentDark],\n [\"#FFB088\", accentLight],\n [\"#FF7A45\", gradientStart],\n [\"#fff4ef\", mixHexWithWhite(accent, 0.94).toLowerCase()],\n [\"#ffe0d0\", mixHexWithWhite(accent, 0.85).toLowerCase()],\n [\"#ffbfa0\", mixHexWithWhite(accent, 0.7).toLowerCase()],\n [\"#ff9970\", mixHexWithWhite(accent, 0.55).toLowerCase()],\n [\"#ff7d4d\", mixHexWithWhite(accent, 0.4).toLowerCase()],\n [\"#b33a17\", darkenHex(accentDark, 0.75)],\n [\"#8a2d12\", darkenHex(accentDark, 0.58)],\n [\"#5e1e0c\", darkenHex(accentDark, 0.4)],\n [\"#3a1107\", darkenHex(accentDark, 0.25)],\n ];\n}\n\n/** Serialize a brand to the `src/brand.config.ts` the storefront imports. */\nexport function renderBrandConfig(brand: Brand): string {\n return `// Auto-generated by @carrierllc/mcp — edit freely to re-brand this storefront.\n// This is the single white-label surface: name, copy, colors, domain, support.\nexport interface Brand {\n name: string;\n legalName: string;\n tagline: string;\n domain: string;\n supportEmail: string;\n supportUrl: string;\n colors: { bg: string; accent: string; accentDark: string; text: string };\n social: { x?: string; linkedin?: string };\n carrierApiUrl: string;\n}\n\nexport const brand: Brand = ${JSON.stringify(brand, null, 2)};\n\nexport default brand;\n`;\n}\n\n/** Serialize a brand to a `.env.local` for the storefront. */\nexport function renderEnv(brand: Brand): string {\n return [\n `# Generated by @carrierllc/mcp`,\n `NEXT_PUBLIC_BRAND_NAME=${JSON.stringify(brand.name)}`,\n `NEXT_PUBLIC_CARRIER_API_URL=${JSON.stringify(brand.carrierApiUrl)}`,\n `# Clerk (fill in from your Clerk dashboard to enable auth + checkout)`,\n `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=`,\n `CLERK_SECRET_KEY=`,\n ``,\n ].join(\"\\n\");\n}\n","import { join } from \"node:path\";\nimport { claudeHome, installedPluginDir, pluginManifestDir, pluginSourceDir } from \"./paths.js\";\nimport { copyTree, exists, readFile } from \"./fsx.js\";\nimport { run, which } from \"./exec.js\";\nimport { MCP_URL } from \"./urls.js\";\n\nexport const MCP_NAME = \"carrier\";\nexport { MCP_URL };\n\nexport interface InstallReport {\n copiedTo: string;\n marketplaceAdded: boolean;\n pluginInstalled: boolean;\n mcpAdded: boolean;\n claudeFound: boolean;\n notes: string[];\n}\n\n/**\n * Install the bundled Carrier Claude Code plugin:\n * 1. copy plugin → ~/.claude/plugins/carrier\n * 2. best-effort register marketplace + install via the `claude` CLI\n * 3. best-effort register the Carrier MCP server (HTTP + OAuth, zero-cred URL)\n * Best-effort steps never hard-fail; a manual fallback is always reported.\n *\n * Entry A: the MCP URL needs no pre-shared token. First tool use in Claude\n * opens Clerk OAuth (sign-up / sign-in). Operators never paste API keys for\n * the interactive path.\n */\nexport async function installPlugin(): Promise<InstallReport> {\n const marketplace = pluginSourceDir();\n const pluginRoot = pluginManifestDir();\n const dest = installedPluginDir();\n const notes: string[] = [];\n\n if (!(await exists(pluginRoot))) {\n throw new Error(`Bundled plugin not found at ${pluginRoot}. Reinstall @carrierllc/mcp.`);\n }\n\n // Fallback drop-in is the plugin itself (carrier/), not the marketplace wrapper.\n await copyTree(pluginRoot, dest);\n\n const claudeFound = await which(\"claude\");\n let marketplaceAdded = false;\n let pluginInstalled = false;\n let mcpAdded = false;\n\n if (claudeFound) {\n const mkt = await run(\"claude\", [\"plugin\", \"marketplace\", \"add\", marketplace]);\n marketplaceAdded = (mkt.ok && !/✘|failed|error/i.test(mkt.stdout + mkt.stderr)) || /already/i.test(mkt.stderr + mkt.stdout);\n if (!marketplaceAdded) notes.push(`marketplace add: ${(mkt.stderr || mkt.stdout).trim().slice(0, 200)}`);\n\n // `claude plugin install` exits 0 even on failure — gate on output text, not just exit code.\n const inst = await run(\"claude\", [\"plugin\", \"install\", \"carrier@carrier\"]);\n const instOut = inst.stdout + inst.stderr;\n pluginInstalled =\n /✔|success(fully)? installed|already (installed|enabled)/i.test(instOut) && !/✘|failed/i.test(instOut);\n if (!pluginInstalled) notes.push(`plugin install: ${instOut.replace(/\\s+/g, \" \").trim().slice(0, 200)}`);\n\n const mcp = await run(\"claude\", [\"mcp\", \"add\", \"--transport\", \"http\", MCP_NAME, MCP_URL]);\n mcpAdded = mcp.ok || /already|exists/i.test(mcp.stderr + mcp.stdout);\n if (!mcpAdded) notes.push(`mcp add: ${(mcp.stderr || mcp.stdout).trim().slice(0, 200)}`);\n } else {\n notes.push(\"`claude` CLI not on PATH — plugin copied; finish wiring with the manual commands below.\");\n }\n\n return { copiedTo: dest, marketplaceAdded, pluginInstalled, mcpAdded, claudeFound, notes };\n}\n\nexport async function pluginStatus(): Promise<{ installed: boolean; version?: string; dir: string }> {\n const dir = installedPluginDir();\n const manifest = join(dir, \".claude-plugin\", \"plugin.json\");\n if (!(await exists(manifest))) return { installed: false, dir };\n try {\n const json = JSON.parse(await readFile(manifest, \"utf8\")) as { version?: string };\n return { installed: true, version: json.version, dir };\n } catch {\n return { installed: true, dir };\n }\n}\n\nexport function manualCommands(): string[] {\n return [\n `claude plugin marketplace add ${pluginSourceDir()}`,\n `claude plugin install carrier@carrier`,\n `claude mcp add --transport http ${MCP_NAME} ${MCP_URL}`,\n ];\n}\n\n/** Post-install copy for non-developers (OAuth-on-first-use / zero-cred). */\nexport function installAuthGuidance(): string[] {\n return [\n `MCP URL (zero credentials): ${MCP_URL}`,\n \"OAuth on first use: when Claude first calls Carrier, your browser opens\",\n \" Clerk sign-in / sign-up (Google, GitHub, or email). No API token to paste.\",\n \"Stuck on auth? claude mcp auth carrier\",\n \"Headless/CI only: org API key (ak_…) from https://app.carrier.llc → Settings → API Keys\",\n ];\n}\n\nexport { claudeHome };\n","import { fileURLToPath } from \"node:url\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\n\n/**\n * Package root = the installed @carrierllc/mcp directory.\n * dist/index.js lives at <root>/dist/index.js, so root is one level up.\n * The bundled `plugin/` and `templates/` dirs are shipped alongside `dist`.\n */\nexport function packageRoot(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n // When bundled, `here` is <root>/dist. During ts-node/source runs it is <root>/src/lib.\n for (const candidate of [resolve(here, \"..\"), resolve(here, \"..\", \"..\")]) {\n if (existsSync(join(candidate, \"plugin\")) && existsSync(join(candidate, \"templates\"))) {\n return candidate;\n }\n }\n return resolve(here, \"..\");\n}\n\n/** Marketplace root — passed to `claude plugin marketplace add`. */\nexport function pluginSourceDir(): string {\n return join(packageRoot(), \"plugin\");\n}\n\n/** Plugin root (the `carrier/` subdir of the marketplace) — used for the file-copy\n * fallback and reading the plugin manifest. Claude Code rejects a marketplace that\n * points a plugin at its own root (`source: \".\"`), so the plugin lives one level in. */\nexport function pluginManifestDir(): string {\n return join(packageRoot(), \"plugin\", \"carrier\");\n}\n\nexport function storefrontTemplateDir(): string {\n return join(packageRoot(), \"templates\", \"storefront\");\n}\n\n/** ~/.claude — Claude Code's user config home. */\nexport function claudeHome(): string {\n return process.env.CLAUDE_CONFIG_DIR\n ? resolve(process.env.CLAUDE_CONFIG_DIR)\n : join(homedir(), \".claude\");\n}\n\nexport function claudePluginsDir(): string {\n return join(claudeHome(), \"plugins\");\n}\n\nexport function installedPluginDir(): string {\n return join(claudePluginsDir(), \"carrier\");\n}\n","import { cp, mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst SKIP = new Set([\n \"node_modules\",\n \".next\",\n \".turbo\",\n \".vercel\",\n \"dist\",\n \".git\",\n \"test-results\",\n \"playwright-report\",\n]);\n\nconst cpFilter = (s: string) => {\n const base = s.split(\"/\").pop() ?? \"\";\n return !SKIP.has(base);\n};\n\n/** Recursively copy a directory's contents into `dest`, skipping build artifacts and VCS noise. */\nexport async function copyTree(src: string, dest: string): Promise<void> {\n await mkdir(dest, { recursive: true });\n for (const entry of await readdir(src, { withFileTypes: true })) {\n if (SKIP.has(entry.name)) continue;\n await cp(join(src, entry.name), join(dest, entry.name), {\n recursive: true,\n filter: cpFilter,\n });\n }\n}\n\n/** Remove paths under `dest` that are absent from `src` (mirror sync after `copyTree`). */\nexport async function pruneTree(src: string, dest: string): Promise<void> {\n if (!(await isDir(dest))) return;\n for (const entry of await readdir(dest, { withFileTypes: true })) {\n if (SKIP.has(entry.name)) continue;\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (!existsSync(srcPath)) {\n await rm(destPath, { recursive: true, force: true });\n continue;\n }\n if (entry.isDirectory() && (await isDir(srcPath))) await pruneTree(srcPath, destPath);\n }\n}\n\n/** Walk every file under `dir` and yield absolute paths. */\nexport async function* walk(dir: string): AsyncGenerator<string> {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n if (SKIP.has(entry.name)) continue;\n const full = join(dir, entry.name);\n if (entry.isDirectory()) yield* walk(full);\n else yield full;\n }\n}\n\nconst TEXT_EXT = new Set([\n \".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\",\n \".json\", \".css\", \".md\", \".mdx\", \".html\", \".txt\",\n \".env\", \".example\", \".yml\", \".yaml\", \".toml\",\n]);\n\nexport function isTextFile(path: string): boolean {\n const dot = path.lastIndexOf(\".\");\n if (dot === -1) return false;\n return TEXT_EXT.has(path.slice(dot));\n}\n\n/** Apply ordered [find, replace] string substitutions to every text file under `dir`. */\nexport async function replaceInTree(\n dir: string,\n subs: ReadonlyArray<readonly [from: string | RegExp, to: string]>,\n): Promise<number> {\n let touched = 0;\n for await (const file of walk(dir)) {\n if (!isTextFile(file)) continue;\n const before = await readFile(file, \"utf8\");\n let after = before;\n for (const [from, to] of subs) {\n after = typeof from === \"string\" ? after.split(from).join(to) : after.replace(from, to);\n }\n if (after !== before) {\n await writeFile(file, after);\n touched++;\n }\n }\n return touched;\n}\n\nexport async function exists(p: string): Promise<boolean> {\n return existsSync(p);\n}\n\nexport async function isDir(p: string): Promise<boolean> {\n try {\n return (await stat(p)).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport { writeFile, mkdir, readFile, readdir };\n","import { spawn } from \"node:child_process\";\n\nexport interface RunResult {\n ok: boolean;\n code: number | null;\n stdout: string;\n stderr: string;\n}\n\n/** Run a command, capturing output. Never throws — inspect `.ok`. */\nexport function run(\n cmd: string,\n args: string[],\n opts: { cwd?: string; timeoutMs?: number } = {},\n): Promise<RunResult> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { cwd: opts.cwd, shell: false });\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n const finish = (result: RunResult) => {\n if (settled) return;\n settled = true;\n resolve(result);\n };\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (opts.timeoutMs && opts.timeoutMs > 0) {\n timer = setTimeout(() => {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n /* ignore */\n }\n finish({\n ok: false,\n code: null,\n stdout,\n stderr: stderr || `timeout after ${opts.timeoutMs}ms`,\n });\n }, opts.timeoutMs);\n }\n child.stdout?.on(\"data\", (d) => (stdout += d.toString()));\n child.stderr?.on(\"data\", (d) => (stderr += d.toString()));\n child.on(\"error\", () => {\n if (timer) clearTimeout(timer);\n finish({ ok: false, code: null, stdout, stderr });\n });\n child.on(\"close\", (code) => {\n if (timer) clearTimeout(timer);\n finish({ ok: code === 0, code, stdout, stderr });\n });\n });\n}\n\n/** Run a command inheriting stdio (for long, user-visible tasks like installs/builds). */\nexport function runInherit(cmd: string, args: string[], opts: { cwd?: string } = {}): Promise<RunResult> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { cwd: opts.cwd, shell: false, stdio: \"inherit\" });\n child.on(\"error\", () => resolve({ ok: false, code: null, stdout: \"\", stderr: \"\" }));\n child.on(\"close\", (code) => resolve({ ok: code === 0, code, stdout: \"\", stderr: \"\" }));\n });\n}\n\n/** True if a binary is resolvable on PATH. */\nexport async function which(bin: string): Promise<boolean> {\n const probe = process.platform === \"win32\" ? \"where\" : \"which\";\n const r = await run(probe, [bin]);\n return r.ok && r.stdout.trim().length > 0;\n}\n","import { spawn } from \"node:child_process\";\nimport { run } from \"./exec.js\";\n\n/** Canonical public surfaces (Entry A = MCP URL, zero credentials). */\nexport const MCP_URL = \"https://mcp.carrier.llc/mcp\";\nexport const MCP_HOME = \"https://mcp.carrier.llc\";\nexport const SIGN_UP_URL = \"https://accounts.carrier.llc/sign-up\";\nexport const SIGN_IN_URL = \"https://accounts.carrier.llc/sign-in\";\nexport const CONSOLE_URL = \"https://app.carrier.llc\";\nexport const ONBOARDING_URL = \"https://app.carrier.llc/onboarding\";\nexport const BILLING_URL = \"https://accounts.carrier.llc/user/billing\";\nexport const DOCS_URL = \"https://mcp.carrier.llc/docs\";\n\n/** Open a URL in the system browser (best-effort; never throws). */\nexport async function openUrl(url: string): Promise<{ ok: boolean; hint: string }> {\n const platform = process.platform;\n if (platform === \"darwin\") {\n const r = await run(\"open\", [url]);\n return r.ok\n ? { ok: true, hint: `Opened ${url}` }\n : { ok: false, hint: `Could not open browser. Visit:\\n ${url}` };\n }\n if (platform === \"win32\") {\n // `start` is a shell builtin; use cmd.exe.\n const r = await run(\"cmd\", [\"/c\", \"start\", \"\", url]);\n return r.ok\n ? { ok: true, hint: `Opened ${url}` }\n : { ok: false, hint: `Could not open browser. Visit:\\n ${url}` };\n }\n // Linux / other: try xdg-open, then free-desktop `open`.\n for (const bin of [\"xdg-open\", \"open\"]) {\n const r = await run(bin, [url]);\n if (r.ok) return { ok: true, hint: `Opened ${url}` };\n }\n // Last resort: detach spawn without waiting (some WSL setups hang).\n try {\n spawn(\"xdg-open\", [url], { detached: true, stdio: \"ignore\" }).unref();\n return { ok: true, hint: `Launched browser for ${url}` };\n } catch {\n return { ok: false, hint: `Could not open browser. Visit:\\n ${url}` };\n }\n}\n","import { join } from \"node:path\";\nimport { storefrontTemplateDir } from \"./paths.js\";\nimport { Brand, deriveAccentLight, deriveAccentPaletteSubs, renderEnv } from \"./brand.js\";\nimport { copyTree, exists, pruneTree, readFile, replaceInTree, writeFile } from \"./fsx.js\";\n\n/**\n * Scaffold a white-labeled storefront from the bundled Mango-derived template.\n *\n * Strategy: the template's own `src/brand.config.ts` is the canonical schema the\n * components consume (it carries extra fields like supportWhatsapp/accentLight).\n * We PATCH its values in place rather than regenerate it, so we never drop a field\n * a component depends on. Tree-wide replacements are limited to unambiguous tokens\n * (visible \"Mango\" copy, the 🥭 mark, and hex colors) — never the `carrier.llc`\n * apex, which is also the real api./mcp. control-plane host.\n */\n/** Keep non-empty Clerk keys from a prior `.env.local` when re-scaffolding. */\nfunction preserveClerkFromEnv(existing: string, fresh: string): string {\n let out = fresh;\n for (const key of [\"NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY\", \"CLERK_SECRET_KEY\"] as const) {\n const line = existing.split(\"\\n\").find((l) => l.startsWith(`${key}=`));\n if (!line) continue;\n const value = line.slice(key.length + 1);\n if (!value.trim()) continue;\n out = out.replace(new RegExp(`^${key}=.*$`, \"m\"), `${key}=${value}`);\n }\n return out;\n}\n\nexport async function scaffoldStorefront(target: string, brand: Brand): Promise<void> {\n const template = storefrontTemplateDir();\n if (!(await exists(template))) {\n throw new Error(\n `Storefront template not found at ${template}. The @carrierllc/mcp package may be corrupt — reinstall it.`,\n );\n }\n\n const envPath = join(target, \".env.local\");\n const existingEnv = (await exists(envPath)) ? await readFile(envPath, \"utf8\") : undefined;\n\n await copyTree(template, target);\n await pruneTree(template, target);\n\n // Tree-wide, unambiguous swaps only.\n const subs: Array<[string, string]> = [\n [\"Mango\", brand.name],\n [\"🥭\", \"\"],\n ];\n // Hex colors are safe to swap globally (they appear in globals.css + brand.config).\n subs.push(...deriveAccentPaletteSubs(brand.colors.accent, brand.colors.accentDark));\n if (brand.colors.bg.toUpperCase() !== \"#080C16\") subs.push([\"#080C16\", brand.colors.bg]);\n if (brand.colors.text.toUpperCase() !== \"#F5F1EA\") subs.push([\"#F5F1EA\", brand.colors.text]);\n await replaceInTree(target, subs);\n\n // Patch the canonical brand.config.ts field values in place.\n await patchBrandConfig(join(target, \"src\", \"brand.config.ts\"), brand);\n\n // Runtime env (brand name + control-plane URL).\n const envBody = existingEnv ? preserveClerkFromEnv(existingEnv, renderEnv(brand)) : renderEnv(brand);\n await writeFile(envPath, envBody);\n\n // npm strips nested .npmrc on publish, so (re)write it for standalone installs —\n // lets `pnpm install` work even when the storefront is created inside a workspace.\n await writeFile(join(target, \".npmrc\"), \"ignore-workspace-root-check=true\\n\");\n}\n\n/** Field-scoped value patches against the template's brand.config.ts — preserves its schema. */\nasync function patchBrandConfig(path: string, brand: Brand): Promise<void> {\n if (!(await exists(path))) return;\n let src = await readFile(path, \"utf8\");\n\n const setField = (field: string, value: string): void => {\n // matches ` field: \"...\"` or ` field: process.env.X ?? \"...\"` — replaces the LAST quoted literal on that key's line\n const re = new RegExp(`(\\\\b${field}:\\\\s*(?:[^\"\\\\n]*\\\\?\\\\?\\\\s*)?)\"[^\"]*\"`);\n src = src.replace(re, `$1${JSON.stringify(value)}`);\n };\n\n setField(\"name\", brand.name);\n setField(\"legalName\", brand.legalName);\n setField(\"tagline\", brand.tagline);\n setField(\"domain\", brand.domain);\n setField(\"supportUrl\", brand.supportUrl);\n setField(\"supportEmail\", brand.supportEmail);\n setField(\"supportWhatsapp\", brand.supportWhatsapp);\n setField(\"accent\", brand.colors.accent);\n setField(\"accentDark\", brand.colors.accentDark);\n setField(\"accentLight\", deriveAccentLight(brand.colors.accent));\n setField(\"bg\", brand.colors.bg);\n\n const socialEntries = Object.entries(brand.social).filter(([, v]) => v);\n const socialBody = socialEntries.map(([k, v]) => ` ${k}: ${JSON.stringify(v)},`).join(\"\\n\");\n src = src.replace(\n /social:\\s*\\{[^}]*\\}/s,\n socialEntries.length ? `social: {\\n${socialBody}\\n }` : \"social: {}\",\n );\n\n await writeFile(path, src);\n}\n","import { join } from \"node:path\";\nimport { Brand, CARRIER_BRAND } from \"./brand.js\";\nimport { exists, readFile } from \"./fsx.js\";\nimport { runInherit, which } from \"./exec.js\";\n\nfunction slug(s: string): string {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40) || \"storefront\";\n}\n\n/** Install storefront deps. Uses npm to stay independent of the pnpm workspace. */\nexport async function installDeps(target: string): Promise<boolean> {\n const pkgMgr = (await which(\"pnpm\")) ? \"pnpm\" : \"npm\";\n const r = await runInherit(pkgMgr, [\"install\"], { cwd: target });\n return r.ok;\n}\n\nexport async function buildSite(target: string): Promise<boolean> {\n const pkgMgr = (await which(\"pnpm\")) ? \"pnpm\" : \"npm\";\n // cf:build runs `next build` internally (via OpenNext) then emits the\n // .open-next/worker.js bundle that deploySite ships to Cloudflare.\n const r = await runInherit(pkgMgr, [\"run\", \"cf:build\"], { cwd: target });\n return r.ok;\n}\n\n/** Read white-label name from a scaffolded storefront (falls back to Carrier defaults). */\nexport async function loadStorefrontBrand(\n target: string,\n overrides?: { name?: string },\n): Promise<Brand> {\n const configPath = join(target, \"src\", \"brand.config.ts\");\n if (!(await exists(configPath))) {\n return { ...CARRIER_BRAND, ...overrides };\n }\n const src = await readFile(configPath, \"utf8\");\n const pick = (field: string, fallback: string): string => {\n const m = src.match(new RegExp(`\\\\b${field}:\\\\s*(?:[^\"\\\\n]*\\\\?\\\\?\\\\s*)?\"([^\"]*)\"`));\n return m?.[1] ?? fallback;\n };\n return {\n ...CARRIER_BRAND,\n name: overrides?.name ?? pick(\"name\", CARRIER_BRAND.name),\n domain: pick(\"domain\", CARRIER_BRAND.domain),\n supportEmail: pick(\"supportEmail\", CARRIER_BRAND.supportEmail),\n supportUrl: pick(\"supportUrl\", CARRIER_BRAND.supportUrl),\n tagline: pick(\"tagline\", CARRIER_BRAND.tagline),\n legalName: pick(\"legalName\", CARRIER_BRAND.legalName),\n colors: {\n ...CARRIER_BRAND.colors,\n accent: pick(\"accent\", CARRIER_BRAND.colors.accent),\n accentDark: pick(\"accentDark\", CARRIER_BRAND.colors.accentDark),\n bg: pick(\"bg\", CARRIER_BRAND.colors.bg),\n text: pick(\"text\", CARRIER_BRAND.colors.text),\n },\n carrierApiUrl: CARRIER_BRAND.carrierApiUrl,\n };\n}\n\n/**\n * Deploy the OpenNext build to Cloudflare Workers via wrangler.\n * Returns false (with guidance) when wrangler is absent or unauthenticated.\n */\nexport async function deploySite(\n target: string,\n brand: Brand,\n): Promise<{ ok: boolean; projectName: string; reason?: string }> {\n const projectName = slug(brand.name);\n const workerBundle = join(target, \".open-next\", \"worker.js\");\n if (!(await exists(workerBundle))) {\n return {\n ok: false,\n projectName,\n reason:\n \"No OpenNext build found — run `carrier site deploy` (build step) or `pnpm run build` in the storefront first.\",\n };\n }\n if (!(await which(\"wrangler\")) && !(await which(\"npx\"))) {\n return { ok: false, projectName, reason: \"wrangler/npx not found — install wrangler to deploy.\" };\n }\n const bin = (await which(\"wrangler\")) ? \"wrangler\" : \"npx\";\n const args =\n bin === \"wrangler\"\n ? [\"deploy\", \"--name\", projectName]\n : [\"wrangler\", \"deploy\", \"--name\", projectName];\n const r = await runInherit(bin, args, { cwd: target });\n return r.ok\n ? { ok: true, projectName }\n : { ok: false, projectName, reason: \"wrangler deploy failed — run `wrangler login` then retry `carrier site deploy`.\" };\n}\n\nexport { slug };\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { pluginStatus, MCP_NAME, MCP_URL } from \"./plugin.js\";\nimport { run, which } from \"./exec.js\";\nimport { exists, readFile } from \"./fsx.js\";\nimport { claudeHome } from \"./paths.js\";\n\nexport type AuthMode = \"oauth-first-use\" | \"api-key\" | \"ocs-token\" | \"none\";\n\nexport interface CarrierStatus {\n pluginInstalled: boolean;\n pluginVersion?: string;\n pluginDir: string;\n claudeFound: boolean;\n /** True when config or `claude mcp list` reports a carrier server. */\n mcpRegistered: boolean;\n /** True when registered MCP points at the production zero-cred URL. */\n mcpUrlMatches: boolean;\n mcpDetail?: string;\n /** Env credential present for headless `carrier ask` / stdio. */\n tokenPresent: boolean;\n tokenKind: \"api-key\" | \"ocs-token\" | \"none\";\n authMode: AuthMode;\n /** Human-readable next steps — always non-empty. */\n nextSteps: string[];\n}\n\nfunction detectEnvToken(): { present: boolean; kind: \"api-key\" | \"ocs-token\" | \"none\" } {\n const api =\n process.env.CARRIER_API_KEY?.trim() ||\n process.env.CARRIER_ORG_API_KEY?.trim() ||\n \"\";\n if (api.startsWith(\"ak_\") || api.length > 0) {\n return { present: true, kind: \"api-key\" };\n }\n const ocs =\n process.env.ESIMVAULT_API_TOKEN?.trim() ||\n process.env.CARRIER_OCS_API_TOKEN?.trim() ||\n \"\";\n if (ocs) return { present: true, kind: \"ocs-token\" };\n return { present: false, kind: \"none\" };\n}\n\ntype McpEntry = { url?: string; type?: string; command?: string; args?: string[] };\ntype McpHit = { registered: boolean; urlMatches: boolean; detail?: string; rank: number };\n\nfunction rankHit(name: string, url: string): number {\n // Higher is better — prefer exact \"carrier\" + production URL.\n let rank = 0;\n if (name.toLowerCase() === MCP_NAME) rank += 100;\n else if (/^carrier[-_]?/i.test(name) && !/test|staging|stg|dev|local/i.test(name)) rank += 40;\n else if (/carrier/i.test(name) && !/test|staging|stg|dev|local/i.test(name)) rank += 20;\n else if (/carrier/i.test(name)) rank += 5; // test/staging variants\n if (url === MCP_URL || url.includes(\"https://mcp.carrier.llc/mcp\")) rank += 50;\n else if (/mcp\\.carrier\\.llc/i.test(url)) rank += 25;\n return rank;\n}\n\nfunction scanMcpServers(servers: Record<string, McpEntry> | undefined): McpHit | null {\n if (!servers || typeof servers !== \"object\") return null;\n let best: McpHit | null = null;\n for (const [name, entry] of Object.entries(servers)) {\n if (!/carrier/i.test(name) && !(typeof entry?.url === \"string\" && /carrier\\.llc/i.test(entry.url))) {\n continue;\n }\n const url = typeof entry?.url === \"string\" ? entry.url : \"\";\n const rank = rankHit(name, url);\n if (rank < 20 && !url.includes(\"mcp.carrier.llc\")) {\n // Ignore pure test/staging name matches without a production URL.\n continue;\n }\n const urlMatches = url === MCP_URL || url.includes(\"https://mcp.carrier.llc/mcp\");\n const hit: McpHit = {\n registered: true,\n urlMatches,\n detail: url ? `${name}: ${url}` : `${name}: ${entry?.command ?? \"configured\"}`,\n rank,\n };\n if (!best || hit.rank > best.rank) best = hit;\n }\n return best;\n}\n\n/** Fast path: read Claude config files instead of spawning a health probe. */\nasync function probeMcpFromConfig(): Promise<{\n hit: { registered: boolean; urlMatches: boolean; detail?: string } | null;\n /** True when we successfully parsed at least one Claude config file. */\n configSeen: boolean;\n}> {\n const candidates = [\n join(homedir(), \".claude.json\"),\n join(claudeHome(), \"settings.json\"),\n join(claudeHome(), \".mcp.json\"),\n join(process.cwd(), \".mcp.json\"),\n ];\n let best: McpHit | null = null;\n let configSeen = false;\n for (const file of candidates) {\n if (!(await exists(file))) continue;\n try {\n const json = JSON.parse(await readFile(file, \"utf8\")) as {\n mcpServers?: Record<string, McpEntry>;\n projects?: Record<string, { mcpServers?: Record<string, McpEntry> }>;\n };\n configSeen = true;\n const direct = scanMcpServers(json.mcpServers);\n if (direct && (!best || direct.rank > best.rank)) best = direct;\n if (json.projects) {\n for (const proj of Object.values(json.projects)) {\n const hit = scanMcpServers(proj?.mcpServers);\n if (hit && (!best || hit.rank > best.rank)) best = hit;\n }\n }\n } catch {\n /* ignore malformed */\n }\n }\n if (!best) return { hit: null, configSeen };\n return {\n hit: { registered: best.registered, urlMatches: best.urlMatches, detail: best.detail },\n configSeen,\n };\n}\n\n/**\n * Probe Claude Code for a registered Carrier MCP.\n * Prefers local config files; only shells out to `claude mcp list` when no config is readable.\n */\nexport async function probeMcpRegistration(): Promise<{\n registered: boolean;\n urlMatches: boolean;\n detail?: string;\n}> {\n const { hit, configSeen } = await probeMcpFromConfig();\n if (hit) return hit;\n // Config present but no production Carrier MCP — trust that over a slow health probe.\n if (configSeen) {\n return {\n registered: false,\n urlMatches: false,\n detail: \"carrier not registered (no production MCP URL in Claude config)\",\n };\n }\n\n const claudeFound = await which(\"claude\");\n if (!claudeFound) {\n return {\n registered: false,\n urlMatches: false,\n detail: \"claude CLI not on PATH\",\n };\n }\n // Health probes can hang when many MCP servers are configured — cap wait.\n const r = await run(\"claude\", [\"mcp\", \"list\"], { timeoutMs: 5_000 });\n const out = `${r.stdout}\\n${r.stderr}`;\n if (!r.ok && !out.trim()) {\n return { registered: false, urlMatches: false, detail: \"claude mcp list failed or timed out\" };\n }\n if (/timeout after/i.test(r.stderr) && !/carrier/i.test(out)) {\n return {\n registered: false,\n urlMatches: false,\n detail: \"claude mcp list timed out — run `claude mcp list` manually\",\n };\n }\n\n // Lines look like: `carrier: https://mcp.carrier.llc/mcp (HTTP) - ✔ Connected`\n // or `carrier: … - ! Needs authentication`\n const lines = out.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n const carrierLine =\n lines.find((l) => new RegExp(`^${MCP_NAME}\\\\s*:`, \"i\").test(l)) ??\n lines.find((l) => /carrier/i.test(l) && /mcp\\.carrier\\.llc/i.test(l));\n\n if (!carrierLine) {\n return { registered: false, urlMatches: false, detail: \"carrier not in claude mcp list\" };\n }\n\n const urlMatches = carrierLine.includes(MCP_URL) || /mcp\\.carrier\\.llc\\/mcp/i.test(carrierLine);\n return { registered: true, urlMatches, detail: carrierLine.slice(0, 200) };\n}\n\nfunction buildNextSteps(s: Omit<CarrierStatus, \"nextSteps\">): string[] {\n const steps: string[] = [];\n\n if (!s.claudeFound) {\n steps.push(\"Install Claude Code (https://claude.ai/code), then re-run: carrier plugin install\");\n } else if (!s.pluginInstalled) {\n steps.push(\"Install the Carrier plugin: carrier plugin install\");\n } else if (!s.mcpRegistered) {\n steps.push(`Register the zero-cred MCP URL: claude mcp add --transport http ${MCP_NAME} ${MCP_URL}`);\n } else if (!s.mcpUrlMatches) {\n steps.push(`Update MCP to production URL: claude mcp add --transport http ${MCP_NAME} ${MCP_URL}`);\n }\n\n if (s.mcpRegistered || s.pluginInstalled) {\n steps.push(\n \"Talk to your fleet in Claude — first tool call opens Clerk OAuth (Google / GitHub / email). No API token needed.\",\n );\n } else {\n steps.push(\"Create a free account (browser): carrier open signup\");\n steps.push(\"Or sign in: carrier open signin\");\n }\n\n if (!s.tokenPresent) {\n steps.push(\n \"Optional headless key: Console → Settings → API Keys (ak_…) then export CARRIER_API_KEY=ak_… for `carrier ask`.\",\n );\n } else {\n steps.push('Try a natural-language fleet query: carrier ask \"show fleet health\"');\n }\n\n steps.push(\"Scaffold a white-label storefront anytime: carrier site create\");\n return steps;\n}\n\n/** Collect install / auth / MCP status for the TUI home and `carrier status`. */\nexport async function gatherStatus(): Promise<CarrierStatus> {\n const [plugin, mcp, claudeFound] = await Promise.all([\n pluginStatus(),\n probeMcpRegistration(),\n which(\"claude\"),\n ]);\n const token = detectEnvToken();\n\n let authMode: AuthMode = \"none\";\n if (token.kind === \"api-key\") authMode = \"api-key\";\n else if (token.kind === \"ocs-token\") authMode = \"ocs-token\";\n else if (mcp.registered || plugin.installed) authMode = \"oauth-first-use\";\n\n const base = {\n pluginInstalled: plugin.installed,\n pluginVersion: plugin.version,\n pluginDir: plugin.dir,\n claudeFound,\n mcpRegistered: mcp.registered,\n mcpUrlMatches: mcp.urlMatches,\n mcpDetail: mcp.detail,\n tokenPresent: token.present,\n tokenKind: token.kind,\n authMode,\n };\n\n return { ...base, nextSteps: buildNextSteps(base) };\n}\n\n/** Resolve a bearer-style credential for optional `carrier ask`. */\nexport function resolveCliToken(): string | null {\n const api =\n process.env.CARRIER_API_KEY?.trim() ||\n process.env.CARRIER_ORG_API_KEY?.trim() ||\n \"\";\n if (api) return api;\n const ocs =\n process.env.ESIMVAULT_API_TOKEN?.trim() ||\n process.env.CARRIER_OCS_API_TOKEN?.trim() ||\n \"\";\n return ocs || null;\n}\n","import pc from \"picocolors\";\nimport {\n MCP_URL,\n SIGN_UP_URL,\n SIGN_IN_URL,\n CONSOLE_URL,\n ONBOARDING_URL,\n} from \"./urls.js\";\nimport type { CarrierStatus } from \"./status.js\";\n\n/** Natural-language prompts operators can paste into Claude / MCP clients. */\nexport const FLEET_NL_EXAMPLES: ReadonlyArray<{ label: string; prompt: string }> = [\n { label: \"Fleet health\", prompt: \"Show my fleet health — accounts, eSIMs, low-balance alerts\" },\n { label: \"Subscriber lookup\", prompt: \"Look up subscriber ICCID 8944… and diagnose connectivity\" },\n { label: \"Usage anomalies\", prompt: \"Detect usage anomalies and burn-rate risks this week\" },\n { label: \"Issue from inventory\", prompt: \"Issue 3 free eSIMs from inventory on my account and assign the starter package\" },\n { label: \"Billing check\", prompt: \"What's my platform credit balance and Stripe Connect payout status?\" },\n { label: \"Wallet balance\", prompt: \"What's my managed prepaid wallet balance and auto-top-up status?\" },\n { label: \"Churn risk\", prompt: \"List high churn-risk subscribers with retention ideas\" },\n];\n\n/** Zero-cred Entry A messaging shown after install / on home. */\nexport function oauthFirstUseNote(): string {\n return [\n \"Entry A — zero credentials up front\",\n ` MCP URL: ${MCP_URL}`,\n \" Auth: OAuth on first use (Clerk — Google, GitHub, or email)\",\n \" Token: none required in Claude / Cursor / Windsurf\",\n \"\",\n \"When you first talk to Carrier in your MCP client, the browser opens\",\n \"sign-in/sign-up. After authorize, tools work. Headless? Use an org API key\",\n `(ak_…) from ${CONSOLE_URL} → Settings → API Keys.`,\n ].join(\"\\n\");\n}\n\nexport function formatStatusBlock(st: CarrierStatus): string {\n const yn = (ok: boolean, yes = \"yes\", no = \"no\") => (ok ? pc.green(yes) : pc.yellow(no));\n const authLabel =\n st.authMode === \"oauth-first-use\"\n ? pc.cyan(\"OAuth on first use (no token needed)\")\n : st.authMode === \"api-key\"\n ? pc.green(\"org API key in env (CARRIER_API_KEY)\")\n : st.authMode === \"ocs-token\"\n ? pc.green(\"OCS token in env\")\n : pc.yellow(\"not ready — install MCP or open sign-up\");\n\n return [\n `Claude Code: ${yn(st.claudeFound, \"found\", \"not on PATH\")}`,\n `Plugin: ${st.pluginInstalled ? pc.green(`installed v${st.pluginVersion ?? \"?\"}`) : pc.yellow(\"not installed\")}`,\n `MCP registered:${st.mcpRegistered ? pc.green(\" yes\") : pc.yellow(\" no\")}${st.mcpDetail ? pc.dim(` (${st.mcpDetail})`) : \"\"}`,\n `MCP URL: ${st.mcpUrlMatches ? pc.green(MCP_URL) : pc.yellow(\"not production / missing\")}`,\n `Auth path: ${authLabel}`,\n `Headless token:${st.tokenPresent ? pc.green(` ${st.tokenKind}`) : pc.dim(\" none (optional)\")}`,\n ].join(\"\\n\");\n}\n\nexport function formatNextSteps(st: CarrierStatus): string {\n return st.nextSteps.map((s, i) => ` ${i + 1}. ${s}`).join(\"\\n\");\n}\n\nexport function formatNlExamples(): string {\n return FLEET_NL_EXAMPLES.map((e) => ` • ${pc.bold(e.label)}: \"${e.prompt}\"`).join(\"\\n\");\n}\n\nexport function accountLinksNote(): string {\n return [\n `Sign up: ${SIGN_UP_URL}`,\n `Sign in: ${SIGN_IN_URL}`,\n `Console: ${CONSOLE_URL}`,\n `Onboarding: ${ONBOARDING_URL}`,\n `MCP home: https://mcp.carrier.llc`,\n ].join(\"\\n\");\n}\n\n/** Wrap a failure with recovery guidance — never leave the user with a raw error alone. */\nexport function withNextStep(errorMsg: string, next: string[]): string {\n return [errorMsg, \"\", \"What to do next:\", ...next.map((s) => ` → ${s}`)].join(\"\\n\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { gatherStatus, type CarrierStatus } from \"./status.js\";\nimport {\n formatStatusBlock,\n formatNextSteps,\n formatNlExamples,\n oauthFirstUseNote,\n accountLinksNote,\n FLEET_NL_EXAMPLES,\n} from \"./guidance.js\";\nimport { openUrl, SIGN_UP_URL, SIGN_IN_URL, CONSOLE_URL, ONBOARDING_URL, MCP_HOME } from \"./urls.js\";\nimport { carrierAsk } from \"./ask.js\";\nimport { resolveCliToken } from \"./status.js\";\n\nexport type HomeAction =\n | \"refresh\"\n | \"install\"\n | \"signup\"\n | \"signin\"\n | \"console\"\n | \"onboarding\"\n | \"examples\"\n | \"ask\"\n | \"site\"\n | \"exit\";\n\nfunction mark(ok: boolean): string {\n return ok ? pc.green(\"●\") : pc.yellow(\"○\");\n}\n\n/** Print status + always-on next steps (used by home and `carrier status`). */\nexport function printStatus(st: CarrierStatus): void {\n p.note(formatStatusBlock(st), \"Status\");\n p.note(formatNextSteps(st), \"Next steps\");\n}\n\nexport async function showHomeStatus(): Promise<CarrierStatus> {\n const s = p.spinner();\n s.start(\"Checking Claude plugin + MCP registration\");\n const st = await gatherStatus();\n s.stop(\"Status ready\");\n printStatus(st);\n return st;\n}\n\nasync function openAndReport(url: string, label: string): Promise<void> {\n const r = await openUrl(url);\n if (r.ok) p.log.success(r.hint);\n else {\n p.log.warn(r.hint);\n p.note(url, label);\n }\n}\n\n/**\n * First-class interactive home for non-developers.\n * Loops until the user exits or picks a command that continues outside the menu.\n */\nexport async function runHome(opts: {\n onInstall: () => Promise<void>;\n onSiteCreate: () => Promise<void>;\n}): Promise<void> {\n let st = await showHomeStatus();\n p.note(oauthFirstUseNote(), \"How auth works\");\n\n for (;;) {\n const hasToken = !!resolveCliToken();\n const choice = await p.select({\n message: \"What do you want to do?\",\n options: [\n {\n value: \"refresh\" as const,\n label: `${mark(st.mcpRegistered && st.pluginInstalled)} Refresh status`,\n hint: \"Re-check plugin + MCP\",\n },\n {\n value: \"install\" as const,\n label: `${mark(st.pluginInstalled && st.mcpRegistered)} Install / re-register plugin + MCP`,\n hint: \"Zero-cred URL · OAuth on first use\",\n },\n {\n value: \"signup\" as const,\n label: \"Open sign-up\",\n hint: \"Create a Carrier account (Google / GitHub / email)\",\n },\n {\n value: \"signin\" as const,\n label: \"Open sign-in\",\n hint: \"Existing account\",\n },\n {\n value: \"console\" as const,\n label: \"Open console\",\n hint: CONSOLE_URL,\n },\n {\n value: \"onboarding\" as const,\n label: \"Open onboarding (link OCS / managed setup)\",\n hint: ONBOARDING_URL,\n },\n {\n value: \"examples\" as const,\n label: \"Talk to fleet — NL examples for Claude\",\n hint: \"Copy-paste prompts\",\n },\n {\n value: \"ask\" as const,\n label: hasToken\n ? \"Ask the fleet (carrier ask)\"\n : \"Ask the fleet (needs CARRIER_API_KEY)\",\n hint: hasToken ? \"Uses env token\" : \"Optional headless path\",\n },\n {\n value: \"site\" as const,\n label: \"Scaffold white-label storefront\",\n hint: \"carrier site create\",\n },\n { value: \"exit\" as const, label: \"Exit\" },\n ],\n });\n\n if (p.isCancel(choice) || choice === \"exit\") {\n p.outro(pc.dim(\"Run `carrier` anytime for this menu. Talk to your fleet in Claude.\"));\n return;\n }\n\n switch (choice as HomeAction) {\n case \"refresh\":\n st = await showHomeStatus();\n break;\n case \"install\":\n await opts.onInstall();\n p.note(oauthFirstUseNote(), \"OAuth on first use\");\n st = await showHomeStatus();\n break;\n case \"signup\":\n await openAndReport(SIGN_UP_URL, \"Sign-up URL\");\n p.log.info(\"After sign-up, return here or open Claude and talk to Carrier — OAuth may already be done.\");\n break;\n case \"signin\":\n await openAndReport(SIGN_IN_URL, \"Sign-in URL\");\n break;\n case \"console\":\n await openAndReport(CONSOLE_URL, \"Console\");\n break;\n case \"onboarding\":\n await openAndReport(ONBOARDING_URL, \"Onboarding\");\n p.log.info(\"Link OCS credentials (BYO) or finish managed setup, then use Claude MCP.\");\n break;\n case \"examples\":\n p.note(formatNlExamples(), \"Paste into Claude (with Carrier MCP connected)\");\n p.note(\n [\n \"In Claude Code after install:\",\n ' \"Show my fleet health\"',\n \" /carrier:fleet\",\n \" /carrier:status\",\n \"\",\n `MCP home: ${MCP_HOME}`,\n ].join(\"\\n\"),\n \"Talk to fleet\",\n );\n // Offer to open MCP product page\n {\n const go = await p.confirm({\n message: \"Open mcp.carrier.llc in the browser?\",\n initialValue: false,\n });\n if (!p.isCancel(go) && go) await openAndReport(MCP_HOME, \"MCP home\");\n }\n break;\n case \"ask\": {\n if (!resolveCliToken()) {\n p.log.warn(\"No CARRIER_API_KEY / OCS token in env.\");\n p.note(\n [\n \"Interactive (recommended): install MCP, open Claude, ask in plain English.\",\n \"Headless: Console → Settings → API Keys → export CARRIER_API_KEY=ak_…\",\n \"\",\n \"Example prompts:\",\n ...FLEET_NL_EXAMPLES.slice(0, 3).map((e) => ` carrier ask \"${e.prompt}\"`),\n ].join(\"\\n\"),\n \"How to ask\",\n );\n break;\n }\n const intent = await p.text({\n message: \"What should Carrier do?\",\n placeholder: \"show fleet health\",\n });\n if (p.isCancel(intent) || !String(intent).trim()) break;\n const spin = p.spinner();\n spin.start(\"Asking Carrier MCP…\");\n const result = await carrierAsk(String(intent).trim());\n spin.stop(result.ok ? \"Answer\" : \"Could not complete ask\");\n if (result.ok) p.note(result.text.slice(0, 4000), \"carrier ask\");\n else p.log.error(result.text);\n break;\n }\n case \"site\":\n await opts.onSiteCreate();\n return;\n default:\n break;\n }\n }\n}\n\nexport { accountLinksNote };\n","import { MCP_URL } from \"./urls.js\";\nimport { resolveCliToken } from \"./status.js\";\nimport { withNextStep } from \"./guidance.js\";\n\nexport interface AskResult {\n ok: boolean;\n text: string;\n}\n\n/**\n * Optional headless NL probe against the remote MCP when a token is present.\n * Uses JSON-RPC tools/call → carrier_ask. Soft-fails with next steps on any error.\n */\nexport async function carrierAsk(intent: string): Promise<AskResult> {\n const token = resolveCliToken();\n if (!token) {\n return {\n ok: false,\n text: withNextStep(\"No headless token in the environment.\", [\n \"Interactive path: open Claude and say your intent — OAuth runs on first use.\",\n \"Or export CARRIER_API_KEY=ak_… from Console → Settings → API Keys.\",\n 'Then retry: carrier ask \"show fleet health\"',\n ]),\n };\n }\n\n const body = {\n jsonrpc: \"2.0\",\n id: 1,\n method: \"tools/call\",\n params: {\n name: \"carrier_ask\",\n arguments: { intent },\n },\n };\n\n try {\n const res = await fetch(MCP_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n },\n body: JSON.stringify(body),\n });\n\n if (res.status === 401 || res.status === 403) {\n return {\n ok: false,\n text: withNextStep(`MCP returned ${res.status} (auth rejected).`, [\n \"Confirm CARRIER_API_KEY is a valid org key (ak_…) from app.carrier.llc\",\n \"Or complete OCS onboarding: https://app.carrier.llc/onboarding\",\n \"Interactive: use Claude + OAuth instead of a headless key\",\n ]),\n };\n }\n\n if (!res.ok) {\n const snippet = (await res.text().catch(() => \"\")).slice(0, 240);\n return {\n ok: false,\n text: withNextStep(`MCP call failed (${res.status}). ${snippet}`, [\n \"Check network access to https://mcp.carrier.llc/mcp\",\n \"Retry later, or use Claude with the registered MCP (OAuth path)\",\n ]),\n };\n }\n\n const json = (await res.json()) as {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean };\n error?: { message?: string };\n };\n\n if (json.error?.message) {\n return {\n ok: false,\n text: withNextStep(json.error.message, [\n \"Rephrase the intent more specifically (include ICCID / MSISDN if relevant)\",\n \"Or open Claude and ask there with full tool routing\",\n ]),\n };\n }\n\n const parts = json.result?.content ?? [];\n const text =\n parts\n .map((p) => p.text)\n .filter(Boolean)\n .join(\"\\n\")\n .trim() || JSON.stringify(json.result ?? json, null, 2);\n\n return { ok: !json.result?.isError, text };\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n ok: false,\n text: withNextStep(`Could not reach MCP: ${msg}`, [\n \"Verify outbound HTTPS to mcp.carrier.llc\",\n \"Use the interactive Claude path while offline from this machine\",\n ]),\n };\n }\n}\n"],"mappings":";;;AACA,SAAS,eAAe;AACxB,YAAYA,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,WAAAC,gBAAe;;;AC4BjB,IAAM,gBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AACjB;AAEA,IAAM,uBAAuB;AAC7B,IAAM,gCAAgC;AAEtC,SAAS,SAAS,KAA8C;AAC9D,QAAM,IAAI,IAAI,QAAQ,MAAM,EAAE;AAC9B,MAAI,CAAC,mBAAmB,KAAK,CAAC,EAAG,QAAO;AACxC,SAAO,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;AAC/F;AAEA,SAAS,SAAS,GAAW,GAAW,GAAW,QAAQ,OAAe;AACxE,QAAM,MAAM,CAAC,MACX,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EACrC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB,QAAM,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACxC,SAAO,QAAQ,MAAM,IAAI,YAAY;AACvC;AAEA,SAAS,gBAAgB,KAAa,YAA4B;AAChE,QAAM,MAAM,SAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,MAAM,CAAC,MAAc,KAAK,MAAM,KAAK;AAC3C,SAAO,SAAS,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;AACvD;AAEA,SAAS,UAAU,KAAa,QAAwB;AACtD,QAAM,MAAM,SAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,CAAC,MAAc,IAAI;AACjC,SAAO,SAAS,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI;AACnE;AAGO,SAAS,iBAAiB,QAAgB,OAAc,eAAuB;AACpF,MAAI,OAAO,YAAY,MAAM,KAAK,OAAO,OAAO,YAAY,EAAG,QAAO,KAAK,OAAO;AAClF,QAAM,MAAM,SAAS,MAAM;AAC3B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,CAAC,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AAC5E,SAAO,SAAS,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;AAC7D;AAGO,SAAS,kBAAkB,QAAgB,OAAc,eAAuB;AACrF,MAAI,OAAO,YAAY,MAAM,KAAK,OAAO,OAAO,YAAY,EAAG,QAAO;AACtE,SAAO,gBAAgB,QAAQ,IAAI;AACrC;AAGO,SAAS,0BAA0B,QAAgB,OAAc,eAAuB;AAC7F,MAAI,OAAO,YAAY,MAAM,KAAK,OAAO,OAAO,YAAY,EAAG,QAAO;AACtE,SAAO,gBAAgB,QAAQ,IAAI;AACrC;AAGO,SAAS,wBAAwB,QAAgB,YAA6C;AACnG,MAAI,OAAO,YAAY,MAAM,cAAc,OAAO,OAAO,YAAY,EAAG,QAAO,CAAC;AAChF,QAAM,cAAc,kBAAkB,MAAM;AAC5C,QAAM,gBAAgB,0BAA0B,MAAM;AACtD,SAAO;AAAA,IACL,CAAC,WAAW,MAAM;AAAA,IAClB,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,WAAW,WAAW;AAAA,IACvB,CAAC,WAAW,aAAa;AAAA,IACzB,CAAC,WAAW,gBAAgB,QAAQ,IAAI,EAAE,YAAY,CAAC;AAAA,IACvD,CAAC,WAAW,gBAAgB,QAAQ,IAAI,EAAE,YAAY,CAAC;AAAA,IACvD,CAAC,WAAW,gBAAgB,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,IACtD,CAAC,WAAW,gBAAgB,QAAQ,IAAI,EAAE,YAAY,CAAC;AAAA,IACvD,CAAC,WAAW,gBAAgB,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,IACtD,CAAC,WAAW,UAAU,YAAY,IAAI,CAAC;AAAA,IACvC,CAAC,WAAW,UAAU,YAAY,IAAI,CAAC;AAAA,IACvC,CAAC,WAAW,UAAU,YAAY,GAAG,CAAC;AAAA,IACtC,CAAC,WAAW,UAAU,YAAY,IAAI,CAAC;AAAA,EACzC;AACF;AAyBO,SAAS,UAAU,OAAsB;AAC9C,SAAO;AAAA,IACL;AAAA,IACA,0BAA0B,KAAK,UAAU,MAAM,IAAI,CAAC;AAAA,IACpD,+BAA+B,KAAK,UAAU,MAAM,aAAa,CAAC;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AClKA,SAAS,QAAAC,aAAY;;;ACArB,SAAS,qBAAqB;AAC9B,SAAS,SAAS,MAAM,eAAe;AACvC,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAOjB,SAAS,cAAsB;AACpC,QAAM,OAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEnD,aAAW,aAAa,CAAC,QAAQ,MAAM,IAAI,GAAG,QAAQ,MAAM,MAAM,IAAI,CAAC,GAAG;AACxE,QAAI,WAAW,KAAK,WAAW,QAAQ,CAAC,KAAK,WAAW,KAAK,WAAW,WAAW,CAAC,GAAG;AACrF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,IAAI;AAC3B;AAGO,SAAS,kBAA0B;AACxC,SAAO,KAAK,YAAY,GAAG,QAAQ;AACrC;AAKO,SAAS,oBAA4B;AAC1C,SAAO,KAAK,YAAY,GAAG,UAAU,SAAS;AAChD;AAEO,SAAS,wBAAgC;AAC9C,SAAO,KAAK,YAAY,GAAG,aAAa,YAAY;AACtD;AAGO,SAAS,aAAqB;AACnC,SAAO,QAAQ,IAAI,oBACf,QAAQ,QAAQ,IAAI,iBAAiB,IACrC,KAAK,QAAQ,GAAG,SAAS;AAC/B;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,WAAW,GAAG,SAAS;AACrC;AAEO,SAAS,qBAA6B;AAC3C,SAAO,KAAK,iBAAiB,GAAG,SAAS;AAC3C;;;AClDA,SAAS,IAAI,OAAO,SAAS,UAAU,IAAI,MAAM,iBAAiB;AAClE,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAErB,IAAM,OAAO,oBAAI,IAAI;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,WAAW,CAAC,MAAc;AAC9B,QAAM,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AACnC,SAAO,CAAC,KAAK,IAAI,IAAI;AACvB;AAGA,eAAsB,SAAS,KAAa,MAA6B;AACvE,QAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,aAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG;AAC1B,UAAM,GAAGA,MAAK,KAAK,MAAM,IAAI,GAAGA,MAAK,MAAM,MAAM,IAAI,GAAG;AAAA,MACtD,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAGA,eAAsB,UAAU,KAAa,MAA6B;AACxE,MAAI,CAAE,MAAM,MAAM,IAAI,EAAI;AAC1B,aAAW,SAAS,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC,GAAG;AAChE,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG;AAC1B,UAAM,UAAUA,MAAK,KAAK,MAAM,IAAI;AACpC,UAAM,WAAWA,MAAK,MAAM,MAAM,IAAI;AACtC,QAAI,CAACD,YAAW,OAAO,GAAG;AACxB,YAAM,GAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD;AAAA,IACF;AACA,QAAI,MAAM,YAAY,KAAM,MAAM,MAAM,OAAO,EAAI,OAAM,UAAU,SAAS,QAAQ;AAAA,EACtF;AACF;AAGA,gBAAuB,KAAK,KAAqC;AAC/D,aAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG;AAC1B,UAAM,OAAOC,MAAK,KAAK,MAAM,IAAI;AACjC,QAAI,MAAM,YAAY,EAAG,QAAO,KAAK,IAAI;AAAA,QACpC,OAAM;AAAA,EACb;AACF;AAEA,IAAM,WAAW,oBAAI,IAAI;AAAA,EACvB;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACtC;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAS;AAAA,EACzC;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAS;AACvC,CAAC;AAEM,SAAS,WAAW,MAAuB;AAChD,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,SAAS,IAAI,KAAK,MAAM,GAAG,CAAC;AACrC;AAGA,eAAsB,cACpB,KACA,MACiB;AACjB,MAAI,UAAU;AACd,mBAAiB,QAAQ,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,WAAW,IAAI,EAAG;AACvB,UAAM,SAAS,MAAM,SAAS,MAAM,MAAM;AAC1C,QAAI,QAAQ;AACZ,eAAW,CAAC,MAAM,EAAE,KAAK,MAAM;AAC7B,cAAQ,OAAO,SAAS,WAAW,MAAM,MAAM,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,MAAM,EAAE;AAAA,IACxF;AACA,QAAI,UAAU,QAAQ;AACpB,YAAM,UAAU,MAAM,KAAK;AAC3B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,OAAOC,IAA6B;AACxD,SAAOF,YAAWE,EAAC;AACrB;AAEA,eAAsB,MAAMA,IAA6B;AACvD,MAAI;AACF,YAAQ,MAAM,KAAKA,EAAC,GAAG,YAAY;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACpGA,SAAS,aAAa;AAUf,SAAS,IACd,KACA,MACA,OAA6C,CAAC,GAC1B;AACpB,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC;AAC9D,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,WAAsB;AACpC,UAAI,QAAS;AACb,gBAAU;AACV,MAAAA,SAAQ,MAAM;AAAA,IAChB;AACA,QAAI;AACJ,QAAI,KAAK,aAAa,KAAK,YAAY,GAAG;AACxC,cAAQ,WAAW,MAAM;AACvB,YAAI;AACF,gBAAM,KAAK,SAAS;AAAA,QACtB,QAAQ;AAAA,QAER;AACA,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,UAAU,iBAAiB,KAAK,SAAS;AAAA,QACnD,CAAC;AAAA,MACH,GAAG,KAAK,SAAS;AAAA,IACnB;AACA,UAAM,QAAQ,GAAG,QAAQ,CAAC,MAAO,UAAU,EAAE,SAAS,CAAE;AACxD,UAAM,QAAQ,GAAG,QAAQ,CAAC,MAAO,UAAU,EAAE,SAAS,CAAE;AACxD,UAAM,GAAG,SAAS,MAAM;AACtB,UAAI,MAAO,cAAa,KAAK;AAC7B,aAAO,EAAE,IAAI,OAAO,MAAM,MAAM,QAAQ,OAAO,CAAC;AAAA,IAClD,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,MAAO,cAAa,KAAK;AAC7B,aAAO,EAAE,IAAI,SAAS,GAAG,MAAM,QAAQ,OAAO,CAAC;AAAA,IACjD,CAAC;AAAA,EACH,CAAC;AACH;AAGO,SAAS,WAAW,KAAa,MAAgB,OAAyB,CAAC,GAAuB;AACvG,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,KAAK,KAAK,KAAK,OAAO,OAAO,OAAO,UAAU,CAAC;AAChF,UAAM,GAAG,SAAS,MAAMA,SAAQ,EAAE,IAAI,OAAO,MAAM,MAAM,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;AAClF,UAAM,GAAG,SAAS,CAAC,SAASA,SAAQ,EAAE,IAAI,SAAS,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;AAAA,EACvF,CAAC;AACH;AAGA,eAAsB,MAAM,KAA+B;AACzD,QAAM,QAAQ,QAAQ,aAAa,UAAU,UAAU;AACvD,QAAM,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC;AAChC,SAAO,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS;AAC1C;;;ACpEA,SAAS,SAAAC,cAAa;AAIf,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAK9B,eAAsB,QAAQ,KAAqD;AACjF,QAAM,WAAW,QAAQ;AACzB,MAAI,aAAa,UAAU;AACzB,UAAM,IAAI,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC;AACjC,WAAO,EAAE,KACL,EAAE,IAAI,MAAM,MAAM,UAAU,GAAG,GAAG,IAClC,EAAE,IAAI,OAAO,MAAM;AAAA,IAAqC,GAAG,GAAG;AAAA,EACpE;AACA,MAAI,aAAa,SAAS;AAExB,UAAM,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,SAAS,IAAI,GAAG,CAAC;AACnD,WAAO,EAAE,KACL,EAAE,IAAI,MAAM,MAAM,UAAU,GAAG,GAAG,IAClC,EAAE,IAAI,OAAO,MAAM;AAAA,IAAqC,GAAG,GAAG;AAAA,EACpE;AAEA,aAAW,OAAO,CAAC,YAAY,MAAM,GAAG;AACtC,UAAM,IAAI,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC;AAC9B,QAAI,EAAE,GAAI,QAAO,EAAE,IAAI,MAAM,MAAM,UAAU,GAAG,GAAG;AAAA,EACrD;AAEA,MAAI;AACF,IAAAC,OAAM,YAAY,CAAC,GAAG,GAAG,EAAE,UAAU,MAAM,OAAO,SAAS,CAAC,EAAE,MAAM;AACpE,WAAO,EAAE,IAAI,MAAM,MAAM,wBAAwB,GAAG,GAAG;AAAA,EACzD,QAAQ;AACN,WAAO,EAAE,IAAI,OAAO,MAAM;AAAA,IAAqC,GAAG,GAAG;AAAA,EACvE;AACF;;;AJnCO,IAAM,WAAW;AAuBxB,eAAsB,gBAAwC;AAC5D,QAAM,cAAc,gBAAgB;AACpC,QAAM,aAAa,kBAAkB;AACrC,QAAM,OAAO,mBAAmB;AAChC,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,UAAM,IAAI,MAAM,+BAA+B,UAAU,8BAA8B;AAAA,EACzF;AAGA,QAAM,SAAS,YAAY,IAAI;AAE/B,QAAM,cAAc,MAAM,MAAM,QAAQ;AACxC,MAAI,mBAAmB;AACvB,MAAI,kBAAkB;AACtB,MAAI,WAAW;AAEf,MAAI,aAAa;AACf,UAAM,MAAM,MAAM,IAAI,UAAU,CAAC,UAAU,eAAe,OAAO,WAAW,CAAC;AAC7E,uBAAoB,IAAI,MAAM,CAAC,kBAAkB,KAAK,IAAI,SAAS,IAAI,MAAM,KAAM,WAAW,KAAK,IAAI,SAAS,IAAI,MAAM;AAC1H,QAAI,CAAC,iBAAkB,OAAM,KAAK,qBAAqB,IAAI,UAAU,IAAI,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAGvG,UAAM,OAAO,MAAM,IAAI,UAAU,CAAC,UAAU,WAAW,iBAAiB,CAAC;AACzE,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,sBACE,2DAA2D,KAAK,OAAO,KAAK,CAAC,YAAY,KAAK,OAAO;AACvG,QAAI,CAAC,gBAAiB,OAAM,KAAK,mBAAmB,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAEvG,UAAM,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,OAAO,eAAe,QAAQ,UAAU,OAAO,CAAC;AACxF,eAAW,IAAI,MAAM,kBAAkB,KAAK,IAAI,SAAS,IAAI,MAAM;AACnE,QAAI,CAAC,SAAU,OAAM,KAAK,aAAa,IAAI,UAAU,IAAI,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACzF,OAAO;AACL,UAAM,KAAK,8FAAyF;AAAA,EACtG;AAEA,SAAO,EAAE,UAAU,MAAM,kBAAkB,iBAAiB,UAAU,aAAa,MAAM;AAC3F;AAEA,eAAsB,eAA+E;AACnG,QAAM,MAAM,mBAAmB;AAC/B,QAAM,WAAWC,MAAK,KAAK,kBAAkB,aAAa;AAC1D,MAAI,CAAE,MAAM,OAAO,QAAQ,EAAI,QAAO,EAAE,WAAW,OAAO,IAAI;AAC9D,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,MAAM,SAAS,UAAU,MAAM,CAAC;AACxD,WAAO,EAAE,WAAW,MAAM,SAAS,KAAK,SAAS,IAAI;AAAA,EACvD,QAAQ;AACN,WAAO,EAAE,WAAW,MAAM,IAAI;AAAA,EAChC;AACF;AAEO,SAAS,iBAA2B;AACzC,SAAO;AAAA,IACL,iCAAiC,gBAAgB,CAAC;AAAA,IAClD;AAAA,IACA,mCAAmC,QAAQ,IAAI,OAAO;AAAA,EACxD;AACF;AAGO,SAAS,sBAAgC;AAC9C,SAAO;AAAA,IACL,+BAA+B,OAAO;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AKlGA,SAAS,QAAAC,aAAY;AAgBrB,SAAS,qBAAqB,UAAkB,OAAuB;AACrE,MAAI,MAAM;AACV,aAAW,OAAO,CAAC,qCAAqC,kBAAkB,GAAY;AACpF,UAAM,OAAO,SAAS,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,GAAG,CAAC;AACrE,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,KAAK,MAAM,IAAI,SAAS,CAAC;AACvC,QAAI,CAAC,MAAM,KAAK,EAAG;AACnB,UAAM,IAAI,QAAQ,IAAI,OAAO,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACrE;AACA,SAAO;AACT;AAEA,eAAsB,mBAAmB,QAAgB,OAA6B;AACpF,QAAM,WAAW,sBAAsB;AACvC,MAAI,CAAE,MAAM,OAAO,QAAQ,GAAI;AAC7B,UAAM,IAAI;AAAA,MACR,oCAAoC,QAAQ;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,UAAUC,MAAK,QAAQ,YAAY;AACzC,QAAM,cAAe,MAAM,OAAO,OAAO,IAAK,MAAM,SAAS,SAAS,MAAM,IAAI;AAEhF,QAAM,SAAS,UAAU,MAAM;AAC/B,QAAM,UAAU,UAAU,MAAM;AAGhC,QAAM,OAAgC;AAAA,IACpC,CAAC,SAAS,MAAM,IAAI;AAAA,IACpB,CAAC,aAAM,EAAE;AAAA,EACX;AAEA,OAAK,KAAK,GAAG,wBAAwB,MAAM,OAAO,QAAQ,MAAM,OAAO,UAAU,CAAC;AAClF,MAAI,MAAM,OAAO,GAAG,YAAY,MAAM,UAAW,MAAK,KAAK,CAAC,WAAW,MAAM,OAAO,EAAE,CAAC;AACvF,MAAI,MAAM,OAAO,KAAK,YAAY,MAAM,UAAW,MAAK,KAAK,CAAC,WAAW,MAAM,OAAO,IAAI,CAAC;AAC3F,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,iBAAiBA,MAAK,QAAQ,OAAO,iBAAiB,GAAG,KAAK;AAGpE,QAAM,UAAU,cAAc,qBAAqB,aAAa,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK;AACnG,QAAM,UAAU,SAAS,OAAO;AAIhC,QAAM,UAAUA,MAAK,QAAQ,QAAQ,GAAG,oCAAoC;AAC9E;AAGA,eAAe,iBAAiB,MAAc,OAA6B;AACzE,MAAI,CAAE,MAAM,OAAO,IAAI,EAAI;AAC3B,MAAI,MAAM,MAAM,SAAS,MAAM,MAAM;AAErC,QAAM,WAAW,CAAC,OAAe,UAAwB;AAEvD,UAAM,KAAK,IAAI,OAAO,OAAO,KAAK,sCAAsC;AACxE,UAAM,IAAI,QAAQ,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EACpD;AAEA,WAAS,QAAQ,MAAM,IAAI;AAC3B,WAAS,aAAa,MAAM,SAAS;AACrC,WAAS,WAAW,MAAM,OAAO;AACjC,WAAS,UAAU,MAAM,MAAM;AAC/B,WAAS,cAAc,MAAM,UAAU;AACvC,WAAS,gBAAgB,MAAM,YAAY;AAC3C,WAAS,mBAAmB,MAAM,eAAe;AACjD,WAAS,UAAU,MAAM,OAAO,MAAM;AACtC,WAAS,cAAc,MAAM,OAAO,UAAU;AAC9C,WAAS,eAAe,kBAAkB,MAAM,OAAO,MAAM,CAAC;AAC9D,WAAS,MAAM,MAAM,OAAO,EAAE;AAE9B,QAAM,gBAAgB,OAAO,QAAQ,MAAM,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AACtE,QAAM,aAAa,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI;AAC7F,QAAM,IAAI;AAAA,IACR;AAAA,IACA,cAAc,SAAS;AAAA,EAAc,UAAU;AAAA,OAAU;AAAA,EAC3D;AAEA,QAAM,UAAU,MAAM,GAAG;AAC3B;;;AChGA,SAAS,QAAAC,aAAY;AAKrB,SAAS,KAAK,GAAmB;AAC/B,SAAO,EACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE,KAAK;AACrB;AAGA,eAAsB,YAAY,QAAkC;AAClE,QAAM,SAAU,MAAM,MAAM,MAAM,IAAK,SAAS;AAChD,QAAM,IAAI,MAAM,WAAW,QAAQ,CAAC,SAAS,GAAG,EAAE,KAAK,OAAO,CAAC;AAC/D,SAAO,EAAE;AACX;AAEA,eAAsB,UAAU,QAAkC;AAChE,QAAM,SAAU,MAAM,MAAM,MAAM,IAAK,SAAS;AAGhD,QAAM,IAAI,MAAM,WAAW,QAAQ,CAAC,OAAO,UAAU,GAAG,EAAE,KAAK,OAAO,CAAC;AACvE,SAAO,EAAE;AACX;AAGA,eAAsB,oBACpB,QACA,WACgB;AAChB,QAAM,aAAaC,MAAK,QAAQ,OAAO,iBAAiB;AACxD,MAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,WAAO,EAAE,GAAG,eAAe,GAAG,UAAU;AAAA,EAC1C;AACA,QAAM,MAAM,MAAM,SAAS,YAAY,MAAM;AAC7C,QAAM,OAAO,CAAC,OAAe,aAA6B;AACxD,UAAM,IAAI,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,uCAAuC,CAAC;AAClF,WAAO,IAAI,CAAC,KAAK;AAAA,EACnB;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,cAAc,IAAI;AAAA,IACxD,QAAQ,KAAK,UAAU,cAAc,MAAM;AAAA,IAC3C,cAAc,KAAK,gBAAgB,cAAc,YAAY;AAAA,IAC7D,YAAY,KAAK,cAAc,cAAc,UAAU;AAAA,IACvD,SAAS,KAAK,WAAW,cAAc,OAAO;AAAA,IAC9C,WAAW,KAAK,aAAa,cAAc,SAAS;AAAA,IACpD,QAAQ;AAAA,MACN,GAAG,cAAc;AAAA,MACjB,QAAQ,KAAK,UAAU,cAAc,OAAO,MAAM;AAAA,MAClD,YAAY,KAAK,cAAc,cAAc,OAAO,UAAU;AAAA,MAC9D,IAAI,KAAK,MAAM,cAAc,OAAO,EAAE;AAAA,MACtC,MAAM,KAAK,QAAQ,cAAc,OAAO,IAAI;AAAA,IAC9C;AAAA,IACA,eAAe,cAAc;AAAA,EAC/B;AACF;AAMA,eAAsB,WACpB,QACA,OACgE;AAChE,QAAM,cAAc,KAAK,MAAM,IAAI;AACnC,QAAM,eAAeA,MAAK,QAAQ,cAAc,WAAW;AAC3D,MAAI,CAAE,MAAM,OAAO,YAAY,GAAI;AACjC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,QACE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,CAAE,MAAM,MAAM,UAAU,KAAM,CAAE,MAAM,MAAM,KAAK,GAAI;AACvD,WAAO,EAAE,IAAI,OAAO,aAAa,QAAQ,4DAAuD;AAAA,EAClG;AACA,QAAM,MAAO,MAAM,MAAM,UAAU,IAAK,aAAa;AACrD,QAAM,OACJ,QAAQ,aACJ,CAAC,UAAU,UAAU,WAAW,IAChC,CAAC,YAAY,UAAU,UAAU,WAAW;AAClD,QAAM,IAAI,MAAM,WAAW,KAAK,MAAM,EAAE,KAAK,OAAO,CAAC;AACrD,SAAO,EAAE,KACL,EAAE,IAAI,MAAM,YAAY,IACxB,EAAE,IAAI,OAAO,aAAa,QAAQ,uFAAkF;AAC1H;;;AC3FA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AA0BrB,SAAS,iBAA+E;AACtF,QAAM,MACJ,QAAQ,IAAI,iBAAiB,KAAK,KAClC,QAAQ,IAAI,qBAAqB,KAAK,KACtC;AACF,MAAI,IAAI,WAAW,KAAK,KAAK,IAAI,SAAS,GAAG;AAC3C,WAAO,EAAE,SAAS,MAAM,MAAM,UAAU;AAAA,EAC1C;AACA,QAAM,MACJ,QAAQ,IAAI,qBAAqB,KAAK,KACtC,QAAQ,IAAI,uBAAuB,KAAK,KACxC;AACF,MAAI,IAAK,QAAO,EAAE,SAAS,MAAM,MAAM,YAAY;AACnD,SAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AACxC;AAKA,SAAS,QAAQ,MAAc,KAAqB;AAElD,MAAI,OAAO;AACX,MAAI,KAAK,YAAY,MAAM,SAAU,SAAQ;AAAA,WACpC,iBAAiB,KAAK,IAAI,KAAK,CAAC,8BAA8B,KAAK,IAAI,EAAG,SAAQ;AAAA,WAClF,WAAW,KAAK,IAAI,KAAK,CAAC,8BAA8B,KAAK,IAAI,EAAG,SAAQ;AAAA,WAC5E,WAAW,KAAK,IAAI,EAAG,SAAQ;AACxC,MAAI,QAAQ,WAAW,IAAI,SAAS,6BAA6B,EAAG,SAAQ;AAAA,WACnE,qBAAqB,KAAK,GAAG,EAAG,SAAQ;AACjD,SAAO;AACT;AAEA,SAAS,eAAe,SAA8D;AACpF,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,MAAI,OAAsB;AAC1B,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,QAAI,CAAC,WAAW,KAAK,IAAI,KAAK,EAAE,OAAO,OAAO,QAAQ,YAAY,gBAAgB,KAAK,MAAM,GAAG,IAAI;AAClG;AAAA,IACF;AACA,UAAM,MAAM,OAAO,OAAO,QAAQ,WAAW,MAAM,MAAM;AACzD,UAAM,OAAO,QAAQ,MAAM,GAAG;AAC9B,QAAI,OAAO,MAAM,CAAC,IAAI,SAAS,iBAAiB,GAAG;AAEjD;AAAA,IACF;AACA,UAAM,aAAa,QAAQ,WAAW,IAAI,SAAS,6BAA6B;AAChF,UAAM,MAAc;AAAA,MAClB,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ,MAAM,GAAG,IAAI,KAAK,GAAG,KAAK,GAAG,IAAI,KAAK,OAAO,WAAW,YAAY;AAAA,MAC5E;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,KAAM,QAAO;AAAA,EAC5C;AACA,SAAO;AACT;AAGA,eAAe,qBAIZ;AACD,QAAM,aAAa;AAAA,IACjBC,MAAKC,SAAQ,GAAG,cAAc;AAAA,IAC9BD,MAAK,WAAW,GAAG,eAAe;AAAA,IAClCA,MAAK,WAAW,GAAG,WAAW;AAAA,IAC9BA,MAAK,QAAQ,IAAI,GAAG,WAAW;AAAA,EACjC;AACA,MAAI,OAAsB;AAC1B,MAAI,aAAa;AACjB,aAAW,QAAQ,YAAY;AAC7B,QAAI,CAAE,MAAM,OAAO,IAAI,EAAI;AAC3B,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,MAAM,SAAS,MAAM,MAAM,CAAC;AAIpD,mBAAa;AACb,YAAM,SAAS,eAAe,KAAK,UAAU;AAC7C,UAAI,WAAW,CAAC,QAAQ,OAAO,OAAO,KAAK,MAAO,QAAO;AACzD,UAAI,KAAK,UAAU;AACjB,mBAAW,QAAQ,OAAO,OAAO,KAAK,QAAQ,GAAG;AAC/C,gBAAM,MAAM,eAAe,MAAM,UAAU;AAC3C,cAAI,QAAQ,CAAC,QAAQ,IAAI,OAAO,KAAK,MAAO,QAAO;AAAA,QACrD;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,CAAC,KAAM,QAAO,EAAE,KAAK,MAAM,WAAW;AAC1C,SAAO;AAAA,IACL,KAAK,EAAE,YAAY,KAAK,YAAY,YAAY,KAAK,YAAY,QAAQ,KAAK,OAAO;AAAA,IACrF;AAAA,EACF;AACF;AAMA,eAAsB,uBAInB;AACD,QAAM,EAAE,KAAK,WAAW,IAAI,MAAM,mBAAmB;AACrD,MAAI,IAAK,QAAO;AAEhB,MAAI,YAAY;AACd,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,MAAM,QAAQ;AACxC,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,IAAI,UAAU,CAAC,OAAO,MAAM,GAAG,EAAE,WAAW,IAAM,CAAC;AACnE,QAAM,MAAM,GAAG,EAAE,MAAM;AAAA,EAAK,EAAE,MAAM;AACpC,MAAI,CAAC,EAAE,MAAM,CAAC,IAAI,KAAK,GAAG;AACxB,WAAO,EAAE,YAAY,OAAO,YAAY,OAAO,QAAQ,sCAAsC;AAAA,EAC/F;AACA,MAAI,iBAAiB,KAAK,EAAE,MAAM,KAAK,CAAC,WAAW,KAAK,GAAG,GAAG;AAC5D,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAIA,QAAM,QAAQ,IAAI,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACjE,QAAM,cACJ,MAAM,KAAK,CAAC,MAAM,IAAI,OAAO,IAAI,QAAQ,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC,KAC9D,MAAM,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,KAAK,qBAAqB,KAAK,CAAC,CAAC;AAEtE,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,YAAY,OAAO,YAAY,OAAO,QAAQ,iCAAiC;AAAA,EAC1F;AAEA,QAAM,aAAa,YAAY,SAAS,OAAO,KAAK,0BAA0B,KAAK,WAAW;AAC9F,SAAO,EAAE,YAAY,MAAM,YAAY,QAAQ,YAAY,MAAM,GAAG,GAAG,EAAE;AAC3E;AAEA,SAAS,eAAe,GAA+C;AACrE,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAC,EAAE,aAAa;AAClB,UAAM,KAAK,mFAAmF;AAAA,EAChG,WAAW,CAAC,EAAE,iBAAiB;AAC7B,UAAM,KAAK,oDAAoD;AAAA,EACjE,WAAW,CAAC,EAAE,eAAe;AAC3B,UAAM,KAAK,mEAAmE,QAAQ,IAAI,OAAO,EAAE;AAAA,EACrG,WAAW,CAAC,EAAE,eAAe;AAC3B,UAAM,KAAK,iEAAiE,QAAQ,IAAI,OAAO,EAAE;AAAA,EACnG;AAEA,MAAI,EAAE,iBAAiB,EAAE,iBAAiB;AACxC,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,KAAK,sDAAsD;AACjE,UAAM,KAAK,iCAAiC;AAAA,EAC9C;AAEA,MAAI,CAAC,EAAE,cAAc;AACnB,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,KAAK,qEAAqE;AAAA,EAClF;AAEA,QAAM,KAAK,gEAAgE;AAC3E,SAAO;AACT;AAGA,eAAsB,eAAuC;AAC3D,QAAM,CAACE,SAAQ,KAAK,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,IACnD,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,MAAM,QAAQ;AAAA,EAChB,CAAC;AACD,QAAM,QAAQ,eAAe;AAE7B,MAAI,WAAqB;AACzB,MAAI,MAAM,SAAS,UAAW,YAAW;AAAA,WAChC,MAAM,SAAS,YAAa,YAAW;AAAA,WACvC,IAAI,cAAcA,QAAO,UAAW,YAAW;AAExD,QAAM,OAAO;AAAA,IACX,iBAAiBA,QAAO;AAAA,IACxB,eAAeA,QAAO;AAAA,IACtB,WAAWA,QAAO;AAAA,IAClB;AAAA,IACA,eAAe,IAAI;AAAA,IACnB,eAAe,IAAI;AAAA,IACnB,WAAW,IAAI;AAAA,IACf,cAAc,MAAM;AAAA,IACpB,WAAW,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,EAAE,GAAG,MAAM,WAAW,eAAe,IAAI,EAAE;AACpD;AAGO,SAAS,kBAAiC;AAC/C,QAAM,MACJ,QAAQ,IAAI,iBAAiB,KAAK,KAClC,QAAQ,IAAI,qBAAqB,KAAK,KACtC;AACF,MAAI,IAAK,QAAO;AAChB,QAAM,MACJ,QAAQ,IAAI,qBAAqB,KAAK,KACtC,QAAQ,IAAI,uBAAuB,KAAK,KACxC;AACF,SAAO,OAAO;AAChB;;;ACjQA,OAAO,QAAQ;AAWR,IAAM,oBAAsE;AAAA,EACjF,EAAE,OAAO,gBAAgB,QAAQ,kEAA6D;AAAA,EAC9F,EAAE,OAAO,qBAAqB,QAAQ,gEAA2D;AAAA,EACjG,EAAE,OAAO,mBAAmB,QAAQ,uDAAuD;AAAA,EAC3F,EAAE,OAAO,wBAAwB,QAAQ,iFAAiF;AAAA,EAC1H,EAAE,OAAO,iBAAiB,QAAQ,sEAAsE;AAAA,EACxG,EAAE,OAAO,kBAAkB,QAAQ,mEAAmE;AAAA,EACtG,EAAE,OAAO,cAAc,QAAQ,wDAAwD;AACzF;AAGO,SAAS,oBAA4B;AAC1C,SAAO;AAAA,IACL;AAAA,IACA,eAAe,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAe,WAAW;AAAA,EAC5B,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,kBAAkB,IAA2B;AAC3D,QAAM,KAAK,CAACC,KAAa,MAAM,OAAO,KAAK,SAAUA,MAAK,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,EAAE;AACtF,QAAM,YACJ,GAAG,aAAa,oBACZ,GAAG,KAAK,sCAAsC,IAC9C,GAAG,aAAa,YACd,GAAG,MAAM,sCAAsC,IAC/C,GAAG,aAAa,cACd,GAAG,MAAM,kBAAkB,IAC3B,GAAG,OAAO,8CAAyC;AAE7D,SAAO;AAAA,IACL,kBAAkB,GAAG,GAAG,aAAa,SAAS,aAAa,CAAC;AAAA,IAC5D,kBAAkB,GAAG,kBAAkB,GAAG,MAAM,cAAc,GAAG,iBAAiB,GAAG,EAAE,IAAI,GAAG,OAAO,eAAe,CAAC;AAAA,IACrH,kBAAkB,GAAG,gBAAgB,GAAG,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,GAAG,GAAG,YAAY,GAAG,IAAI,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE;AAAA,IAC5H,kBAAkB,GAAG,gBAAgB,GAAG,MAAM,OAAO,IAAI,GAAG,OAAO,0BAA0B,CAAC;AAAA,IAC9F,kBAAkB,SAAS;AAAA,IAC3B,kBAAkB,GAAG,eAAe,GAAG,MAAM,IAAI,GAAG,SAAS,EAAE,IAAI,GAAG,IAAI,kBAAkB,CAAC;AAAA,EAC/F,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,gBAAgB,IAA2B;AACzD,SAAO,GAAG,UAAU,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AACjE;AAEO,SAAS,mBAA2B;AACzC,SAAO,kBAAkB,IAAI,CAAC,MAAM,YAAO,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI;AACzF;AAEO,SAAS,mBAA2B;AACzC,SAAO;AAAA,IACL,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB,cAAc;AAAA,IAC9B;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAGO,SAAS,aAAa,UAAkB,MAAwB;AACrE,SAAO,CAAC,UAAU,IAAI,oBAAoB,GAAG,KAAK,IAAI,CAAC,MAAM,YAAO,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI;AACrF;;;AC7EA,YAAY,OAAO;AACnB,OAAOC,SAAQ;;;ACYf,eAAsB,WAAW,QAAoC;AACnE,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,aAAa,yCAAyC;AAAA,QAC1D;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,OAAO;AAAA,IACX,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,WAAW,EAAE,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,SAAS;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK;AAAA,QAC9B,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,aAAa,gBAAgB,IAAI,MAAM,qBAAqB;AAAA,UAChE;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,WAAW,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,GAAG,GAAG;AAC/D,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,aAAa,oBAAoB,IAAI,MAAM,MAAM,OAAO,IAAI;AAAA,UAChE;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAK7B,QAAI,KAAK,OAAO,SAAS;AACvB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,aAAa,KAAK,MAAM,SAAS;AAAA,UACrC;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,QAAQ,WAAW,CAAC;AACvC,UAAMC,QACJ,MACG,IAAI,CAACC,OAAMA,GAAE,IAAI,EACjB,OAAO,OAAO,EACd,KAAK,IAAI,EACT,KAAK,KAAK,KAAK,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC;AAE1D,WAAO,EAAE,IAAI,CAAC,KAAK,QAAQ,SAAS,MAAAD,MAAK;AAAA,EAC3C,SAAS,GAAY;AACnB,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,aAAa,wBAAwB,GAAG,IAAI;AAAA,QAChD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AD5EA,SAAS,KAAKE,KAAqB;AACjC,SAAOA,MAAKC,IAAG,MAAM,QAAG,IAAIA,IAAG,OAAO,QAAG;AAC3C;AAGO,SAAS,YAAY,IAAyB;AACnD,EAAE,OAAK,kBAAkB,EAAE,GAAG,QAAQ;AACtC,EAAE,OAAK,gBAAgB,EAAE,GAAG,YAAY;AAC1C;AAEA,eAAsB,iBAAyC;AAC7D,QAAM,IAAM,UAAQ;AACpB,IAAE,MAAM,2CAA2C;AACnD,QAAM,KAAK,MAAM,aAAa;AAC9B,IAAE,KAAK,cAAc;AACrB,cAAY,EAAE;AACd,SAAO;AACT;AAEA,eAAe,cAAc,KAAa,OAA8B;AACtE,QAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,MAAI,EAAE,GAAI,CAAE,MAAI,QAAQ,EAAE,IAAI;AAAA,OACzB;AACH,IAAE,MAAI,KAAK,EAAE,IAAI;AACjB,IAAE,OAAK,KAAK,KAAK;AAAA,EACnB;AACF;AAMA,eAAsB,QAAQ,MAGZ;AAChB,MAAI,KAAK,MAAM,eAAe;AAC9B,EAAE,OAAK,kBAAkB,GAAG,gBAAgB;AAE5C,aAAS;AACP,UAAM,WAAW,CAAC,CAAC,gBAAgB;AACnC,UAAM,SAAS,MAAQ,SAAO;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,OAAO,GAAG,KAAK,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAAA,UACtD,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO,GAAG,KAAK,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAAA,UACtD,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO,WACH,gCACA;AAAA,UACJ,MAAM,WAAW,mBAAmB;AAAA,QACtC;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA,EAAE,OAAO,QAAiB,OAAO,OAAO;AAAA,MAC1C;AAAA,IACF,CAAC;AAED,QAAM,WAAS,MAAM,KAAK,WAAW,QAAQ;AAC3C,MAAE,QAAMA,IAAG,IAAI,oEAAoE,CAAC;AACpF;AAAA,IACF;AAEA,YAAQ,QAAsB;AAAA,MAC5B,KAAK;AACH,aAAK,MAAM,eAAe;AAC1B;AAAA,MACF,KAAK;AACH,cAAM,KAAK,UAAU;AACrB,QAAE,OAAK,kBAAkB,GAAG,oBAAoB;AAChD,aAAK,MAAM,eAAe;AAC1B;AAAA,MACF,KAAK;AACH,cAAM,cAAc,aAAa,aAAa;AAC9C,QAAE,MAAI,KAAK,iGAA4F;AACvG;AAAA,MACF,KAAK;AACH,cAAM,cAAc,aAAa,aAAa;AAC9C;AAAA,MACF,KAAK;AACH,cAAM,cAAc,aAAa,SAAS;AAC1C;AAAA,MACF,KAAK;AACH,cAAM,cAAc,gBAAgB,YAAY;AAChD,QAAE,MAAI,KAAK,0EAA0E;AACrF;AAAA,MACF,KAAK;AACH,QAAE,OAAK,iBAAiB,GAAG,gDAAgD;AAC3E,QAAE;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa,QAAQ;AAAA,UACvB,EAAE,KAAK,IAAI;AAAA,UACX;AAAA,QACF;AAEA;AACE,gBAAM,KAAK,MAAQ,UAAQ;AAAA,YACzB,SAAS;AAAA,YACT,cAAc;AAAA,UAChB,CAAC;AACD,cAAI,CAAG,WAAS,EAAE,KAAK,GAAI,OAAM,cAAc,UAAU,UAAU;AAAA,QACrE;AACA;AAAA,MACF,KAAK,OAAO;AACV,YAAI,CAAC,gBAAgB,GAAG;AACtB,UAAE,MAAI,KAAK,wCAAwC;AACnD,UAAE;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,GAAG,kBAAkB,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,kBAAkB,EAAE,MAAM,GAAG;AAAA,YAC3E,EAAE,KAAK,IAAI;AAAA,YACX;AAAA,UACF;AACA;AAAA,QACF;AACA,cAAM,SAAS,MAAQ,OAAK;AAAA,UAC1B,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AACD,YAAM,WAAS,MAAM,KAAK,CAAC,OAAO,MAAM,EAAE,KAAK,EAAG;AAClD,cAAM,OAAS,UAAQ;AACvB,aAAK,MAAM,0BAAqB;AAChC,cAAM,SAAS,MAAM,WAAW,OAAO,MAAM,EAAE,KAAK,CAAC;AACrD,aAAK,KAAK,OAAO,KAAK,WAAW,wBAAwB;AACzD,YAAI,OAAO,GAAI,CAAE,OAAK,OAAO,KAAK,MAAM,GAAG,GAAI,GAAG,aAAa;AAAA,YAC1D,CAAE,MAAI,MAAM,OAAO,IAAI;AAC5B;AAAA,MACF;AAAA,MACA,KAAK;AACH,cAAM,KAAK,aAAa;AACxB;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AACF;;;AXpLA,IAAM,UAAU;AAEhB,SAAS,SAAe;AACtB,EAAE,SAAM,GAAGC,IAAG,KAAKA,IAAG,OAAO,gBAAW,CAAC,CAAC,IAAIA,IAAG,IAAI,4CAAoC,OAAO,CAAC,EAAE;AACrG;AAEA,SAAS,GAAG,KAAmB;AAC7B,EAAE,OAAI,QAAQA,IAAG,MAAM,GAAG,CAAC;AAC7B;AACA,SAAS,KAAK,KAAmB;AAC/B,EAAE,OAAI,KAAK,GAAG;AAChB;AACA,SAAS,KAAK,KAAa,MAAsB;AAC/C,EAAE,OAAI,MAAM,GAAG;AACf,EAAE,QAAK,KAAK,IAAI,CAAC,MAAM,UAAK,CAAC,EAAE,EAAE,KAAK,IAAI,GAAG,iBAAiB;AAChE;AAGA,eAAe,YAAY,MAA6B;AACtD,QAAM,OAAQ,MAAQ,QAAK;AAAA,IACzB,SAAS;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,EACrB,CAAC;AACD,MAAM,YAAS,IAAI,EAAG,SAAQ,KAAK,CAAC;AAEpC,QAAM,SAAU,MAAQ,QAAK;AAAA,IAC3B,SAAS;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,EACrB,CAAC;AACD,MAAM,YAAS,MAAM,EAAG,SAAQ,KAAK,CAAC;AAEtC,QAAM,SAAU,MAAQ,QAAK;AAAA,IAC3B,SAAS;AAAA,IACT,aAAa,KAAK,OAAO;AAAA,IACzB,cAAc,KAAK,OAAO;AAAA,EAC5B,CAAC;AACD,MAAM,YAAS,MAAM,EAAG,SAAQ,KAAK,CAAC;AAEtC,QAAM,eAAgB,MAAQ,QAAK;AAAA,IACjC,SAAS;AAAA,IACT,aAAa,WAAW,MAAM;AAAA,IAC9B,cAAc,WAAW,MAAM;AAAA,EACjC,CAAC;AACD,MAAM,YAAS,YAAY,EAAG,SAAQ,KAAK,CAAC;AAE5C,QAAM,aAAa,iBAAiB,QAAQ,IAAI;AAChD,QAAM,YAAY,SAAS,cAAc,QAAQ,WAAW,cAAc;AAC1E,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,WAAW;AAAA,IACX,SAAS,YAAY,KAAK,UAAU,0BAA0B,IAAI;AAAA,IAClE;AAAA,IACA;AAAA,IACA,YAAY,WAAW,MAAM;AAAA,IAC7B,iBAAiB,YAAY,KAAK,kBAAkB;AAAA,IACpD,QAAQ,YAAY,KAAK,SAAS,CAAC;AAAA,IACnC,QAAQ,EAAE,GAAG,KAAK,QAAQ,QAAQ,WAAW;AAAA,EAC/C;AACF;AAEA,eAAe,kBAAiC;AAC9C,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,uDAAuD;AAC/D,MAAI;AACJ,MAAI;AACF,QAAI,MAAM,cAAc;AAAA,EAC1B,SAAS,GAAY;AACnB,MAAE,KAAK,gBAAgB;AACvB,SAAK,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,GAAG;AAAA,MAC/C;AAAA,MACA;AAAA,MACA,oBAAoB,WAAW;AAAA,IACjC,CAAC;AACD;AAAA,EACF;AACA,IAAE,KAAK,eAAe;AACtB,KAAG,iBAAY,EAAE,QAAQ,EAAE;AAC3B;AAAA,IACE,QAAQ,EAAE,WAAWA,IAAG,MAAM,YAAY,IAAIA,IAAG,OAAO,QAAQ,CAAC,wBAC/C,EAAE,mBAAmBA,IAAG,MAAM,OAAO,IAAIA,IAAG,OAAO,QAAQ,CAAC,oBAChE,EAAE,kBAAkBA,IAAG,MAAM,MAAM,IAAIA,IAAG,OAAO,QAAQ,CAAC;AAAA,EAC1E;AACA,EAAE,QAAK,oBAAoB,EAAE,KAAK,IAAI,GAAG,8BAA8B;AACvE,MAAI,CAAC,EAAE,eAAe,EAAE,MAAM,QAAQ;AACpC,IAAE,QAAK,eAAe,EAAE,KAAK,IAAI,GAAG,sCAAsC;AAC1E,QAAI,EAAE,MAAM,OAAQ,MAAKA,IAAG,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;AACnD,IAAE;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAAA,EACF,OAAO;AACL,IAAE;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,aAAa,QAAgB,OAA6B;AACvE,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,eAAe,MAAM,IAAI,sBAAiB,MAAM,EAAE;AAC1D,MAAI;AACF,UAAM,mBAAmB,QAAQ,KAAK;AAAA,EACxC,SAAS,GAAY;AACnB,MAAE,KAAK,iBAAiB;AACxB,SAAK,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,GAAG;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM;AAAA,EACR;AACA,IAAE,KAAK,uBAAuB;AAC9B,KAAG,WAAW,MAAM,oBAAoB,MAAM,IAAI,YAAY,MAAM,OAAO,MAAM,GAAG;AACtF;AAEA,eAAe,iBACb,QACA,OACA,MACe;AACf,MAAI,KAAK,SAAS;AAChB,UAAM,IAAM,WAAQ;AACpB,MAAE,MAAM,oCAAoC;AAC5C,UAAM,MAAM,MAAM,YAAY,MAAM;AACpC,MAAE,KAAK,MAAM,2BAA2B,oCAAoC;AAC5E,QAAI,CAAC,KAAK;AACR,MAAE;AAAA,QACA;AAAA,UACE,MAAM,MAAM;AAAA,UACZ;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,QACX;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,OAAO;AACd,UAAM,IAAM,WAAQ;AACpB,MAAE,MAAM,kCAAkC;AAC1C,UAAM,MAAM,MAAM,UAAU,MAAM;AAClC,MAAE,KAAK,MAAM,oBAAoB,sCAAiC;AAClE,QAAI,CAAC,KAAK;AACR,MAAE;AAAA,QACA,CAAC,MAAM,MAAM,IAAI,cAAc,0DAA0D,EAAE,KAAK,IAAI;AAAA,QACpG;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,QAAQ;AACf,UAAM,IAAM,WAAQ;AACpB,MAAE,MAAM,iCAAiC;AACzC,UAAM,IAAI,MAAM,WAAW,QAAQ,KAAK;AACxC,MAAE,KAAK,EAAE,KAAK,aAAa,EAAE,WAAW,KAAK,gBAAgB;AAC7D,QAAI,CAAC,EAAE,MAAM,EAAE,QAAQ;AACrB,WAAKA,IAAG,OAAO,EAAE,MAAM,CAAC;AACxB,MAAE;AAAA,QACA;AAAA,UACE;AAAA,UACA,6BAA6B,MAAM;AAAA,QACrC,EAAE,KAAK,IAAI;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,wBAAuC;AACpD,QAAM,QAAQ,MAAM,YAAY,aAAa;AAC7C,QAAM,MAAO,MAAQ,QAAK;AAAA,IACxB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,MAAM,YAAS,GAAG,EAAG;AACrB,QAAM,SAASC,SAAQ,GAAG;AAC1B,MAAI,MAAM,OAAO,MAAM,GAAG;AACxB,UAAM,KAAK,MAAQ,WAAQ,EAAE,SAAS,GAAG,MAAM,wCAAmC,cAAc,MAAM,CAAC;AACvG,QAAM,YAAS,EAAE,KAAK,CAAC,IAAI;AACzB,MAAE,SAAM,6CAA6C;AACrD;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAa,QAAQ,KAAK;AAChC,EAAE,SAAMD,IAAG,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AACvE;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd;AAAA,EACC;AACF,EACC,QAAQ,OAAO,EACf,OAAO,YAAY;AAClB,SAAO;AACP,QAAM,QAAQ;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,EAChB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,yFAAyF,EACrG,OAAO,gBAAgB,+BAA+B,cAAc,EACpE,OAAO,SAAS,8DAA8D,EAC9E,OAAO,UAAU,yFAAyF,EAC1G,OAAO,OAAO,MAAsD;AACnE,SAAO;AAEP,MAAI,EAAE,KAAK;AACT,UAAM,gBAAgB;AACtB,UAAM,QAAQ;AACd,UAAM,SAASC,SAAQ,EAAE,GAAG;AAC5B,QAAI,MAAM,OAAO,MAAM,GAAG;AACxB,WAAKD,IAAG,OAAO,GAAG,MAAM,yCAAoC,CAAC;AAAA,IAC/D;AACA,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,iBAAiB,QAAQ,OAAO,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,MAAM,CAAC;AACnF,IAAE,QAAK,kBAAkB,GAAG,MAAM;AAClC,IAAE;AAAA,MACA;AAAA,QACE,MAAM,EAAE,GAAG;AAAA,QACX;AAAA,QACA;AAAA,QACA,iBAAiB,OAAO;AAAA,QACxB;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AACA,IAAE,SAAMA,IAAG,MAAM,4CAA4C,CAAC;AAC9D;AAAA,EACF;AAIA,MAAI,EAAE,MAAM;AACV,UAAM,KAAK,MAAM,aAAa;AAC9B,gBAAY,EAAE;AACd,UAAM,gBAAgB;AAEtB,UAAM,QAAQ,MAAM,YAAY,aAAa;AAC7C,UAAM,SAASC,SAAQ,EAAE,GAAG;AAC5B,QAAI,MAAM,OAAO,MAAM,GAAG;AACxB,YAAM,KAAK,MAAQ,WAAQ,EAAE,SAAS,GAAG,MAAM,wCAAmC,cAAc,MAAM,CAAC;AACvG,UAAM,YAAS,EAAE,KAAK,CAAC,IAAI;AACzB,QAAE,SAAM,wCAAwC;AAChD;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,QAAQ,KAAK;AAEhC,UAAM,OAAO,MAAQ,UAAO;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,SAAS,OAAO,uBAAuB;AAAA,QAChD,EAAE,OAAO,UAAU,OAAO,iDAAiD;AAAA,QAC3E,EAAE,OAAO,QAAQ,OAAO,wCAAmC;AAAA,MAC7D;AAAA,MACA,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,YAAS,IAAI,EAAG,SAAQ,KAAK,CAAC;AACpC,UAAM,iBAAiB,QAAQ,OAAO;AAAA,MACpC,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,IACnB,CAAC;AAED,IAAE,QAAK,kBAAkB,GAAG,MAAM;AAClC,IAAE;AAAA,MACA;AAAA,QACE,MAAM,EAAE,GAAG;AAAA,QACX;AAAA,QACA;AAAA,QACA,iBAAiB,OAAO;AAAA,MAC1B,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AACA,IAAE,SAAMD,IAAG,MAAM,4CAA4C,CAAC;AAC9D;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,WAAW;AAAA,IACX,cAAc,YAAY;AACxB,YAAM,QAAQ,MAAM,YAAY,aAAa;AAC7C,YAAM,SAASC,SAAQ,EAAE,GAAG;AAC5B,UAAI,MAAM,OAAO,MAAM,GAAG;AACxB,cAAM,KAAK,MAAQ,WAAQ,EAAE,SAAS,GAAG,MAAM,wCAAmC,cAAc,MAAM,CAAC;AACvG,YAAM,YAAS,EAAE,KAAK,CAAC,IAAI;AACzB,UAAE,OAAI,KAAK,+EAA+E;AAC1F;AAAA,QACF;AAAA,MACF;AACA,YAAM,aAAa,QAAQ,KAAK;AAChC,YAAM,OAAO,MAAQ,UAAO;AAAA,QAC1B,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,OAAO,SAAS,OAAO,uBAAuB;AAAA,UAChD,EAAE,OAAO,UAAU,OAAO,iDAAiD;AAAA,UAC3E,EAAE,OAAO,QAAQ,OAAO,wCAAmC;AAAA,QAC7D;AAAA,QACA,cAAc;AAAA,MAChB,CAAC;AACD,UAAM,YAAS,IAAI,EAAG;AACtB,YAAM,iBAAiB,QAAQ,OAAO;AAAA,QACpC,SAAS,SAAS;AAAA,QAClB,OAAO,SAAS;AAAA,QAChB,QAAQ,SAAS;AAAA,MACnB,CAAC;AACD,MAAE;AAAA,QACA;AAAA,UACE,MAAM,EAAE,GAAG;AAAA,UACX;AAAA,UACA,QAAQ,OAAO;AAAA,QACjB,EAAE,KAAK,IAAI;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;AAEH,IAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,wCAAwC;AAC7F,OACG,QAAQ,SAAS,EACjB,YAAY,2EAA2E,EACvF,OAAO,YAAY;AAClB,SAAO;AACP,QAAM,gBAAgB;AACtB,EAAE,SAAMD,IAAG,MAAM,6DAA6D,CAAC;AACjF,CAAC;AACH,OACG,QAAQ,QAAQ,EAChB,YAAY,mDAAmD,EAC/D,OAAO,YAAY;AAClB,SAAO;AACP,QAAM,KAAK,MAAM,aAAa;AAC9B,cAAY,EAAE;AACd,EAAE,QAAK,kBAAkB,GAAG,MAAM;AAClC,EAAE,SAAM,EAAE;AACZ,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,iDAAiD,EAC7D,OAAO,YAAY;AAClB,SAAO;AACP,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,iBAAiB;AACzB,QAAM,KAAK,MAAM,aAAa;AAC9B,IAAE,KAAK,MAAM;AACb,EAAE,QAAK,kBAAkB,EAAE,GAAG,QAAQ;AACtC,EAAE,QAAK,gBAAgB,EAAE,GAAG,YAAY;AACxC,EAAE,QAAK,kBAAkB,GAAG,MAAM;AAClC,EAAE,SAAM,EAAE;AACZ,CAAC;AAEH,IAAM,UAAU,QAAQ,QAAQ,MAAM,EAAE,YAAY,sDAAsD;AAC1G,WAAW,CAAC,MAAM,KAAK,IAAI,KAAK;AAAA,EAC9B,CAAC,UAAU,aAAa,0CAA0C;AAAA,EAClE,CAAC,UAAU,aAAa,oBAAoB;AAAA,EAC5C,CAAC,WAAW,aAAa,0BAA0B;AAAA,EACnD,CAAC,cAAc,gBAAgB,8CAA8C;AAAA,EAC7E,CAAC,OAAO,UAAU,mCAAmC;AACvD,GAAY;AACV,UACG,QAAQ,IAAI,EACZ,YAAY,IAAI,EAChB,OAAO,YAAY;AAClB,WAAO;AACP,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,QAAI,EAAE,GAAI,IAAG,EAAE,IAAI;AAAA,SACd;AACH,MAAE,OAAI,KAAK,EAAE,IAAI;AACjB,MAAE,QAAK,KAAK,eAAe;AAAA,IAC7B;AACA,IAAE,QAAK,iBAAiB,GAAG,eAAe;AAC1C,IAAE,SAAM,EAAE;AAAA,EACZ,CAAC;AACL;AAEA,QACG,QAAQ,UAAU,EAClB,YAAY,wDAAwD,EACpE,OAAO,YAAY;AAClB,SAAO;AACP,EAAE,QAAK,iBAAiB,GAAG,wCAAmC;AAC9D,EAAE;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AACA,EAAE,SAAM,EAAE;AACZ,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,6FAA6F,EACzG,SAAS,eAAe,yBAAyB,EACjD,OAAO,OAAO,UAAoB;AACjC,SAAO;AACP,QAAM,SAAS,MAAM,KAAK,GAAG,EAAE,KAAK;AACpC,MAAI,CAAC,QAAQ;AACX,SAAK,mBAAmB;AAAA,MACtB;AAAA,MACA;AAAA,IACF,CAAC;AACD,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,0BAAqB;AAC7B,QAAM,SAAS,MAAM,WAAW,MAAM;AACtC,IAAE,KAAK,OAAO,KAAK,SAAS,QAAQ;AACpC,MAAI,OAAO,IAAI;AACb,IAAE,QAAK,OAAO,KAAK,MAAM,GAAG,GAAI,GAAG,QAAQ;AAC3C,IAAE,SAAM,EAAE;AAAA,EACZ,OAAO;AACL,IAAE,OAAI,MAAM,OAAO,IAAI;AACvB,IAAE,SAAMA,IAAG,OAAO,uBAAuB,CAAC;AAC1C,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,IAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,iDAAiD;AAClG,KACG,QAAQ,cAAc,EACtB,YAAY,8DAA8D,EAC1E,OAAO,iBAAiB,YAAY,EACpC,OAAO,qBAAqB,QAAQ,EACpC,OAAO,kBAAkB,cAAc,EACvC,OAAO,SAAS,8BAA8B,EAC9C,OAAO,OAAO,KAAyB,MAA0E;AAChH,SAAO;AACP,MAAI,QAAe,EAAE,GAAG,cAAc;AACtC,MAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ;AAClC,UAAM,OAAO,EAAE,QAAQ,MAAM;AAC7B,UAAM,SAAS,EAAE,WAAW,EAAE,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,MAAM;AACnE,UAAM,YAAY,SAAS,cAAc,QAAQ,WAAW,cAAc;AAC1E,YAAQ;AAAA,MACN,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,WAAW,EAAE,QAAQ,MAAM;AAAA,MAC3B,SAAS,EAAE,OAAO,0BAA0B,EAAE,IAAI,MAAM,MAAM;AAAA,MAC9D,cAAc,WAAW,MAAM;AAAA,MAC/B,YAAY,WAAW,MAAM;AAAA,MAC7B,iBAAiB,YAAY,MAAM,kBAAkB;AAAA,MACrD,QAAQ,YAAY,MAAM,SAAS,CAAC;AAAA,MACpC,QAAQ;AAAA,QACN,GAAG,MAAM;AAAA,QACT,QAAQ,EAAE,UAAU,MAAM,OAAO;AAAA,QACjC,YAAY,EAAE,SAAS,iBAAiB,EAAE,MAAM,IAAI,MAAM,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,EACF,WAAW,CAAC,EAAE,KAAK;AACjB,YAAQ,MAAM,YAAY,aAAa;AAAA,EACzC;AACA,QAAM,SAASC,SAAQ,OAAO,cAAc;AAC5C,MAAI,MAAM,OAAO,MAAM,GAAG;AACxB,UAAM,KAAK,MAAQ,WAAQ,EAAE,SAAS,GAAG,MAAM,wCAAmC,cAAc,MAAM,CAAC;AACvG,QAAM,YAAS,EAAE,KAAK,CAAC,IAAI;AACzB,MAAE,SAAM,6CAA6C;AACrD;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,UAAM,aAAa,QAAQ,KAAK;AAAA,EAClC,QAAQ;AACN,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,EAAE,SAAMD,IAAG,MAAM,kBAAkB,OAAO,YAAY,8BAA8B,CAAC;AACvF,CAAC;AACH,KACG,QAAQ,cAAc,EACtB,YAAY,oDAAoD,EAChE,OAAO,iBAAiB,8CAA8C,EACtE,OAAO,OAAO,KAAyB,MAAyB;AAC/D,SAAO;AACP,QAAM,SAASC,SAAQ,OAAO,cAAc;AAC5C,MAAI;AACF,UAAM,QAAQ,MAAM,oBAAoB,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,MAAS;AACrF,UAAM,iBAAiB,QAAQ,OAAO,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,KAAK,CAAC;AAAA,EACpF,SAAS,GAAY;AACnB,SAAK,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,GAAG;AAAA,MAC/C;AAAA,MACA;AAAA,IACF,CAAC;AACD,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,EAAE,SAAM,EAAE;AACZ,CAAC;AAEH,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,MAAe;AACrD,UAAQ,MAAMD,IAAG,IAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAChE,UAAQ;AAAA,IACNA,IAAG;AAAA,MACD;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["p","pc","resolve","join","existsSync","join","p","resolve","spawn","spawn","join","join","join","join","join","homedir","join","join","homedir","plugin","ok","pc","text","p","ok","pc","pc","resolve"]}
|