@carrierllc/mcp 0.2.19 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +22 -1
  2. package/dist/chunk-ZII4CD4U.js +461 -0
  3. package/dist/chunk-ZII4CD4U.js.map +1 -0
  4. package/dist/cli.js +1294 -105
  5. package/dist/cli.js.map +1 -1
  6. package/dist/index.js +144 -315
  7. package/dist/index.js.map +1 -1
  8. package/package.json +1 -1
  9. package/plugin/carrier/commands/storefront.md +24 -12
  10. package/plugin/carrier/skills/carrier-operations/SKILL.md +4 -1
  11. package/templates/storefront/{next.config.ts → next.config.mjs} +2 -6
  12. package/templates/storefront/public/brand/logo.svg +13 -0
  13. package/templates/storefront/src/app/activate/[orderId]/ActivateClient.tsx +12 -12
  14. package/templates/storefront/src/app/checkout/[templateId]/CheckoutClient.tsx +5 -5
  15. package/templates/storefront/src/app/checkout/success/CheckoutSuccessClient.tsx +29 -29
  16. package/templates/storefront/src/app/checkout/success/page.tsx +1 -1
  17. package/templates/storefront/src/app/contact/page.tsx +33 -25
  18. package/templates/storefront/src/app/dashboard/page.tsx +7 -4
  19. package/templates/storefront/src/app/globals.css +72 -82
  20. package/templates/storefront/src/app/help/page.tsx +22 -17
  21. package/templates/storefront/src/app/layout.tsx +15 -4
  22. package/templates/storefront/src/app/page.tsx +16 -7
  23. package/templates/storefront/src/app/shop/ShopClient.tsx +7 -3
  24. package/templates/storefront/src/app/sign-in/[[...sign-in]]/page.tsx +1 -1
  25. package/templates/storefront/src/app/sign-up/[[...sign-up]]/StorefrontSignUpClient.tsx +16 -16
  26. package/templates/storefront/src/app/sign-up/[[...sign-up]]/page.tsx +1 -1
  27. package/templates/storefront/src/brand.config.ts +3 -3
  28. package/templates/storefront/src/components/faq/FaqSection.tsx +23 -26
  29. package/templates/storefront/src/components/footer/StorefrontFooter.tsx +37 -22
  30. package/templates/storefront/src/components/landing/FinalCTA.tsx +28 -0
  31. package/templates/storefront/src/components/landing/HeroSection.tsx +57 -24
  32. package/templates/storefront/src/components/landing/HowItWorks.tsx +44 -0
  33. package/templates/storefront/src/components/landing/PlanCard.tsx +58 -28
  34. package/templates/storefront/src/components/nav/StorefrontNav.tsx +59 -24
  35. package/templates/storefront/src/components/theme/BrandStyles.tsx +8 -0
  36. package/templates/storefront/src/components/theme/ThemeToggle.tsx +27 -0
  37. package/templates/storefront/src/components/theme/clerk-appearance.ts +33 -35
  38. package/templates/storefront/src/components/theme/theme-provider.tsx +25 -32
  39. package/templates/storefront/src/components/theme/theme-script.tsx +4 -7
  40. package/templates/storefront/src/lib/complete-email-sign-up.ts +3 -3
  41. package/templates/storefront/src/vendor/ui/brand.ts +6 -6
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/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.19\";\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 examples\",\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 oauthFirstUseNote,\n accountLinksNote,\n FLEET_NL_EXAMPLES,\n} from \"./guidance.js\";\nimport { openUrl, SIGN_UP_URL, SIGN_IN_URL, CONSOLE_URL, ONBOARDING_URL } 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 | \"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: \"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 \"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\nfunction parseRpcBody(raw: string): {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean };\n error?: { message?: string };\n} {\n const trimmed = raw.trim();\n if (!trimmed) return {};\n // Streamable HTTP MCP can return SSE (`event: message\\ndata: {...}`)\n // or a bare JSON-RPC object. Accept both.\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n return JSON.parse(trimmed) as {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean };\n error?: { message?: string };\n };\n }\n const dataLine = trimmed\n .split(\"\\n\")\n .map((l) => l.trim())\n .find((l) => l.startsWith(\"data:\"));\n if (!dataLine) return {};\n return JSON.parse(dataLine.slice(5).trim()) as {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean };\n error?: { message?: string };\n };\n}\n\n/**\n * Optional headless NL probe against the remote MCP when a token is present.\n * Streamable HTTP MCP requires initialize → session id → tools/call.\n * A bare tools/call returns 400 \"Mcp-Session-Id header is required\".\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 headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n };\n\n try {\n const initRes = await fetch(MCP_URL, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"carrier-cli\", version: \"0.2.19\" },\n },\n }),\n });\n\n if (initRes.status === 401 || initRes.status === 403) {\n return {\n ok: false,\n text: withNextStep(`MCP returned ${initRes.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 const sessionId = initRes.headers.get(\"mcp-session-id\") ?? initRes.headers.get(\"Mcp-Session-Id\");\n await initRes.arrayBuffer().catch(() => undefined);\n if (!sessionId) {\n return {\n ok: false,\n text: withNextStep(\"MCP initialize did not return a session id.\", [\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 sessionHeaders = { ...headers, \"Mcp-Session-Id\": sessionId };\n await fetch(MCP_URL, {\n method: \"POST\",\n headers: sessionHeaders,\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"notifications/initialized\" }),\n }).catch(() => undefined);\n\n const res = await fetch(MCP_URL, {\n method: \"POST\",\n headers: sessionHeaders,\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 2,\n method: \"tools/call\",\n params: { name: \"carrier_ask\", arguments: { intent } },\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 = parseRpcBody(await res.text());\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":"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","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"]}
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/logo.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","../src/cli/lib/domains.ts","../src/cli/lib/capability.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 { writeStorefrontLogo } from \"./lib/logo.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 { CLI_DOMAINS } from \"./lib/domains.js\";\nimport { runCapability, type CapabilityFlags } from \"./lib/capability.js\";\nimport { openUrl, SIGN_UP_URL, SIGN_IN_URL, CONSOLE_URL, ONBOARDING_URL, MCP_HOME } from \"./lib/urls.js\";\nimport { CARRIER_VERSION } from \"../version.js\";\n\nconst VERSION = CARRIER_VERSION;\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 examples\",\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 const logoSpin = p.spinner();\n logoSpin.start(\"Generating storefront logo\");\n try {\n const logo = await writeStorefrontLogo(target, brand);\n logoSpin.stop(`Logo ready (${logo.source})`);\n ok(logo.path);\n } catch (e: unknown) {\n logoSpin.stop(\"Logo skipped\");\n info(pc.yellow(String(e instanceof Error ? e.message : e)));\n }\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 [\n \"Carrier CLI — status, OAuth-ready MCP install, storefront scaffold, and fleet control.\",\n \"\",\n \"Domains: \" + CLI_DOMAINS.map((d) => d.name).join(\", \"),\n 'Anything they do not cover: carrier ask \"…\"',\n ].join(\"\\n\"),\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.note(\n [\n \"With CARRIER_API_KEY set, every capability also has its own command:\",\n ...CLI_DOMAINS.map((d) => ` carrier ${d.name} --help`.padEnd(34) + pc.dim(d.summary)),\n \"\",\n \" --json raw response on stdout, ready for jq\",\n \" --commit apply a change instead of previewing it\",\n ].join(\"\\n\"),\n \"Domain commands\",\n );\n p.outro(\"\");\n });\n\nprogram\n .command(\"ask\")\n .description(\n 'Natural-language fallback for whatever the domain commands miss: carrier ask \"show fleet health\" (needs CARRIER_API_KEY or OCS token).',\n )\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\n// Discrete commands per capability, grouped by the console's domains.\n// Each one calls a single MCP tool through the same session handshake as `ask`.\n// A space in a command name nests one level: \"sim-status set\" registers as\n// `carrier subscribers sim-status set`, sharing the \"sim-status\" group with\n// its sibling \"sim-status show\".\nfor (const domain of CLI_DOMAINS) {\n const group = program.command(domain.name).description(domain.summary);\n const subgroups = new Map<string, Command>();\n for (const cmd of domain.commands) {\n const parts = cmd.name.split(\" \");\n let parent = group;\n let prefix = \"\";\n for (const part of parts.slice(0, -1)) {\n prefix = prefix ? `${prefix} ${part}` : part;\n let nested = subgroups.get(prefix);\n if (!nested) {\n nested = parent.command(part).description(`${part} subcommands`);\n subgroups.set(prefix, nested);\n }\n parent = nested;\n }\n const sub = parent\n .command(parts[parts.length - 1]!)\n .description(cmd.write ? `${cmd.summary} Dry run unless --commit.` : cmd.summary);\n for (const opt of cmd.options) sub.option(opt.flags, opt.description);\n sub.option(\"--json\", \"Print the raw tool response on stdout and nothing else\");\n if (cmd.write) sub.option(\"--commit\", \"Apply the change instead of previewing it\");\n sub.action(async (opts: Record<string, unknown> & CapabilityFlags) => {\n if (opts.json !== true) header();\n await runCapability(domain, cmd, opts);\n if (opts.json !== true) p.outro(\"\");\n });\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\n\nsite\n .command(\"logo [dir]\")\n .description(\"Generate a storefront logo (SVG always; PNG if an image key is on this box or Carrier).\")\n .action(async (dir: string | undefined) => {\n header();\n const target = resolve(dir ?? \"./storefront\");\n try {\n const brand = await loadStorefrontBrand(target);\n const logo = await writeStorefrontLogo(target, brand);\n ok(`Logo (${logo.source}): ${logo.path}`);\n } catch (e: unknown) {\n fail(String(e instanceof Error ? e.message : e), [\n \"Scaffold first: carrier site create\",\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 { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { generateStorefrontLogo } from \"../../lib/storefront-logo.js\";\nimport type { Brand } from \"./brand.js\";\n\nexport async function writeStorefrontLogo(target: string, brand: Brand): Promise<{ path: string; source: string }> {\n const logo = await generateStorefrontLogo({\n name: brand.name,\n accent: brand.colors.accent,\n tagline: brand.tagline,\n });\n const dir = join(target, \"public\", \"brand\");\n await mkdir(dir, { recursive: true });\n const svgPath = join(dir, \"logo.svg\");\n await writeFile(svgPath, logo.svg, \"utf8\");\n if (logo.pngBase64) {\n await writeFile(join(dir, \"logo.png\"), Buffer.from(logo.pngBase64, \"base64\"));\n }\n return { path: svgPath, source: logo.source };\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 oauthFirstUseNote,\n accountLinksNote,\n FLEET_NL_EXAMPLES,\n} from \"./guidance.js\";\nimport { openUrl, SIGN_UP_URL, SIGN_IN_URL, CONSOLE_URL, ONBOARDING_URL } 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 | \"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: \"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 \"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\";\nimport { CARRIER_VERSION } from \"../../version.js\";\n\nexport interface AskResult {\n ok: boolean;\n text: string;\n}\n\nexport interface McpCallOptions {\n /** Recovery steps appended when the tool itself reports an error. */\n errorHints?: string[];\n}\n\nconst DEFAULT_ERROR_HINTS = [\n \"Re-check the arguments: carrier <domain> <command> --help\",\n \"Or open Claude and ask there with full tool routing\",\n];\n\nfunction parseRpcBody(raw: string): {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean };\n error?: { message?: string };\n} {\n const trimmed = raw.trim();\n if (!trimmed) return {};\n // Streamable HTTP MCP can return SSE (`event: message\\ndata: {...}`)\n // or a bare JSON-RPC object. Accept both.\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n return JSON.parse(trimmed) as {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean };\n error?: { message?: string };\n };\n }\n const dataLine = trimmed\n .split(\"\\n\")\n .map((l) => l.trim())\n .find((l) => l.startsWith(\"data:\"));\n if (!dataLine) return {};\n return JSON.parse(dataLine.slice(5).trim()) as {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean };\n error?: { message?: string };\n };\n}\n\n/**\n * Call one tool on the remote MCP when a headless token is present.\n *\n * Streamable HTTP MCP requires initialize → Mcp-Session-Id → tools/call.\n * A bare tools/call returns 400 \"Mcp-Session-Id header is required\", so every\n * CLI command routes through here instead of posting tools/call on its own.\n */\nexport async function callMcpTool(\n tool: string,\n args: Record<string, unknown>,\n opts: McpCallOptions = {},\n): 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 \"Or run a discrete command: carrier subscribers list --account-id 123\",\n ]),\n };\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n };\n\n try {\n const initRes = await fetch(MCP_URL, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"carrier-cli\", version: CARRIER_VERSION },\n },\n }),\n });\n\n if (initRes.status === 401 || initRes.status === 403) {\n return {\n ok: false,\n text: withNextStep(`MCP returned ${initRes.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 const sessionId = initRes.headers.get(\"mcp-session-id\") ?? initRes.headers.get(\"Mcp-Session-Id\");\n await initRes.arrayBuffer().catch(() => undefined);\n if (!sessionId) {\n return {\n ok: false,\n text: withNextStep(\"MCP initialize did not return a session id.\", [\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 sessionHeaders = { ...headers, \"Mcp-Session-Id\": sessionId };\n await fetch(MCP_URL, {\n method: \"POST\",\n headers: sessionHeaders,\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"notifications/initialized\" }),\n }).catch(() => undefined);\n\n const res = await fetch(MCP_URL, {\n method: \"POST\",\n headers: sessionHeaders,\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 2,\n method: \"tools/call\",\n params: { name: tool, arguments: args },\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 = parseRpcBody(await res.text());\n\n if (json.error?.message) {\n return {\n ok: false,\n text: withNextStep(json.error.message, opts.errorHints ?? DEFAULT_ERROR_HINTS),\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\n/**\n * Natural-language fallback for anything the discrete subcommands do not cover.\n * Same session handshake as every other command — it just targets carrier_ask.\n */\nexport async function carrierAsk(intent: string): Promise<AskResult> {\n return callMcpTool(\n \"carrier_ask\",\n { intent },\n {\n errorHints: [\n \"Rephrase the intent more specifically (include ICCID / MSISDN if relevant)\",\n \"Or use a discrete command: carrier --help lists every domain\",\n ],\n },\n );\n}\n","/**\n * Discrete CLI commands, grouped by the same domains the console uses.\n *\n * Every entry names a real MCP tool and maps CLI flags onto that tool's\n * arguments. `carrier ask` stays as the natural-language fallback; these\n * commands are the deterministic path for the same capabilities.\n *\n * Argument names below MUST match the tool inputSchema in src/tools.ts,\n * src/intelligence.ts and src/tools-backlog.ts. A test asserts that every\n * `tool` here is registered by the server.\n */\n\nexport type CapabilityArgType = \"string\" | \"number\" | \"boolean\";\n\nexport interface CapabilityOption {\n /** Commander flag spec, e.g. \"--iccid <iccid>\". */\n flags: string;\n description: string;\n /** Tool argument name. A dot nests, e.g. \"subscriber.iccid\". */\n arg: string;\n type: CapabilityArgType;\n required?: boolean;\n}\n\nexport interface CapabilityCommand {\n /**\n * Subcommand verb, e.g. \"list\". A single space nests one level, e.g.\n * \"sim-status set\" registers as `carrier subscribers sim-status set`.\n */\n name: string;\n /** MCP tool this verb calls. */\n tool: string;\n summary: string;\n options: readonly CapabilityOption[];\n /**\n * Write or admin tool. Sends dry_run=true unless --commit is passed, so a\n * mistyped ICCID costs a preview instead of a live change.\n */\n write?: boolean;\n /**\n * Fills startDate/endDate with the last 7 UTC days when both are omitted,\n * using the shared OCS window helper. OCS rejects wider windows.\n */\n usageWindow?: boolean;\n /**\n * Tool arg names where at least one must be present. Use for commands with\n * documented alternative identifiers (e.g. --iccid vs --account-id) where\n * neither option can be `required` on its own.\n */\n requireOneOf?: readonly string[];\n}\n\nexport interface CapabilityDomain {\n name: string;\n summary: string;\n commands: readonly CapabilityCommand[];\n}\n\nconst ICCID: CapabilityOption = {\n flags: \"--iccid <iccid>\",\n description: \"Subscriber ICCID\",\n arg: \"iccid\",\n type: \"string\",\n required: true,\n};\n\nconst ACCOUNT_ID = (description: string): CapabilityOption => ({\n flags: \"--account-id <id>\",\n description,\n arg: \"accountId\",\n type: \"number\",\n});\n\nconst RESELLER_ID: CapabilityOption = {\n flags: \"--reseller-id <id>\",\n description: \"Reseller ID (omit for the token owner's reseller)\",\n arg: \"resellerId\",\n type: \"number\",\n};\n\nconst PACKAGE_ID: CapabilityOption = {\n flags: \"--package-id <id>\",\n description: \"Package ID from `carrier packages list`\",\n arg: \"packageId\",\n type: \"number\",\n required: true,\n};\n\nconst TEMPLATE_ID: CapabilityOption = {\n flags: \"--template-id <id>\",\n description: \"Template ID from `carrier templates list`\",\n arg: \"templateId\",\n type: \"number\",\n required: true,\n};\n\nconst PERIOD: readonly CapabilityOption[] = [\n {\n flags: \"--start <date>\",\n description: \"Start date YYYY-MM-DD (default: 7 days ago)\",\n arg: \"startDate\",\n type: \"string\",\n },\n {\n flags: \"--end <date>\",\n description: \"End date YYYY-MM-DD, max 7 days from start (default: today)\",\n arg: \"endDate\",\n type: \"string\",\n },\n];\n\nexport const CLI_DOMAINS: readonly CapabilityDomain[] = [\n {\n name: \"subscribers\",\n summary: \"Look up, inspect and change subscribers.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_subscribers\",\n summary: \"List subscribers. OCS needs at least one of account/iccid/msisdn/imsi.\",\n options: [\n ACCOUNT_ID(\"Filter by account ID\"),\n { flags: \"--iccid <iccid>\", description: \"Filter by ICCID\", arg: \"iccid\", type: \"string\" },\n { flags: \"--msisdn <msisdn>\", description: \"Filter by MSISDN\", arg: \"msisdn\", type: \"string\" },\n { flags: \"--imsi <imsi>\", description: \"Filter by IMSI\", arg: \"imsi\", type: \"string\" },\n { flags: \"--status <status>\", description: \"Filter by status, e.g. ACTIVE\", arg: \"status\", type: \"string\" },\n { flags: \"--limit <n>\", description: \"Max rows to return\", arg: \"limit\", type: \"number\" },\n { flags: \"--offset <n>\", description: \"Pagination offset\", arg: \"offset\", type: \"number\" },\n ],\n },\n {\n name: \"get\",\n tool: \"get_subscriber\",\n summary: \"Full record for one subscriber by ICCID or MSISDN.\",\n options: [\n { flags: \"--iccid <iccid>\", description: \"Subscriber ICCID\", arg: \"iccid\", type: \"string\" },\n { flags: \"--msisdn <msisdn>\", description: \"Subscriber MSISDN\", arg: \"msisdn\", type: \"string\" },\n {\n flags: \"--gz-counter\",\n description: \"Include the green-zone byte counter\",\n arg: \"with_gz_counter\",\n type: \"boolean\",\n },\n ],\n },\n {\n name: \"location\",\n tool: \"get_subscriber_location\",\n summary: \"Last-known location from the most recent cell tower usage.\",\n options: [ICCID],\n },\n {\n name: \"usage\",\n tool: \"subscriber_usage\",\n summary: \"Daily data, voice and SMS usage over a window of up to 7 days.\",\n options: [ICCID, ...PERIOD],\n usageWindow: true,\n },\n {\n name: \"events\",\n tool: \"subscriber_network_events\",\n summary: \"Network attach/detach events over a window of up to 7 days.\",\n options: [ICCID, ...PERIOD],\n usageWindow: true,\n },\n {\n name: \"active-period\",\n tool: \"subscriber_active_period\",\n summary: \"First and last usage dates for one subscriber.\",\n options: [ICCID],\n },\n {\n name: \"esim-status\",\n tool: \"esim_status_per_account\",\n summary: \"eSIM state counts per account: active, suspended, inventory.\",\n options: [ACCOUNT_ID(\"Report on a single account\"), RESELLER_ID],\n },\n {\n name: \"set-status\",\n tool: \"modify_subscriber_status\",\n summary: \"Change a subscriber's status.\",\n options: [\n ICCID,\n {\n flags: \"--status <status>\",\n description: \"New status, e.g. ACTIVE or SUSPENDED\",\n arg: \"status\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"set-balance\",\n tool: \"modify_subscriber_balance\",\n summary: \"Add to or replace a subscriber's balance.\",\n options: [\n ICCID,\n {\n flags: \"--amount <amount>\",\n description: \"Amount to add (adapt) or set to (set)\",\n arg: \"amount\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--mode <mode>\",\n description: \"'adapt' adds or subtracts, 'set' replaces\",\n arg: \"mode\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"sim-status show\",\n tool: \"get_sim_provider_status\",\n summary: \"SIM/eSIM status at the SIM provider level, distinct from OCS status.\",\n options: [ICCID],\n },\n {\n name: \"sim-status set\",\n tool: \"change_sim_status\",\n summary: \"Change the SIM/eSIM status at the SIM provider level. DELETED is irreversible.\",\n options: [\n ICCID,\n {\n flags: \"--status <status>\",\n description: \"New SIM status: ENABLED, DISABLED or DELETED (irreversible)\",\n arg: \"simStatus\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"phone-number set\",\n tool: \"affect_subscriber_phone_number\",\n summary: \"Assign a phone number (MSISDN) to a subscriber.\",\n options: [\n ICCID,\n {\n flags: \"--phone-number <e164>\",\n description: \"E.164 phone number to assign, e.g. +31612345678\",\n arg: \"phone_number\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--phone-type <type>\",\n description: \"'fake' for test/dev MSISDNs, 'real' for production\",\n arg: \"phone_type\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"contact set\",\n tool: \"modify_subscriber_contact_info\",\n summary: \"Update contact details on a subscriber. Omitted fields stay unchanged.\",\n options: [\n ICCID,\n { flags: \"--first-name <name>\", description: \"First name\", arg: \"firstName\", type: \"string\" },\n { flags: \"--last-name <name>\", description: \"Last name\", arg: \"lastName\", type: \"string\" },\n { flags: \"--company <name>\", description: \"Company name\", arg: \"company\", type: \"string\" },\n { flags: \"--email <email>\", description: \"Email address\", arg: \"email\", type: \"string\" },\n { flags: \"--phone-number <number>\", description: \"Phone number\", arg: \"phoneNumber\", type: \"string\" },\n ],\n write: true,\n },\n {\n name: \"mobile-plan set\",\n tool: \"modify_subscriber_mobile_plan\",\n summary: \"Change the mobile pricing plan a subscriber is billed under.\",\n options: [\n ICCID,\n {\n flags: \"--plan-id <id>\",\n description: \"Mobile pricing plan ID\",\n arg: \"mobile_plan_id\",\n type: \"number\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"voip-plan set\",\n tool: \"modify_subscriber_voip_plan\",\n summary: \"Change the VoIP pricing plan assigned to a subscriber.\",\n options: [\n ICCID,\n {\n flags: \"--plan-id <id>\",\n description: \"VoIP pricing plan ID\",\n arg: \"voip_plan_id\",\n type: \"number\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"traffic set\",\n tool: \"set_subscriber_traffic_restrictions\",\n summary: \"Enable or disable data, calls and SMS per traffic type. Omit a flag to leave it unchanged.\",\n options: [\n ICCID,\n { flags: \"--data <bool>\", description: \"Allow data traffic (true or false)\", arg: \"dataAllowed\", type: \"boolean\" },\n { flags: \"--moc <bool>\", description: \"Allow outbound calls (true or false)\", arg: \"mocAllowed\", type: \"boolean\" },\n { flags: \"--mtc <bool>\", description: \"Allow inbound calls (true or false)\", arg: \"mtcAllowed\", type: \"boolean\" },\n { flags: \"--sms <bool>\", description: \"Allow outbound SMS (true or false)\", arg: \"smsMoAllowed\", type: \"boolean\" },\n ],\n write: true,\n },\n {\n name: \"bitrate show\",\n tool: \"hlr_get_bitrate\",\n summary: \"Current HLR-level bandwidth cap for a subscriber.\",\n options: [ICCID],\n },\n {\n name: \"bitrate set\",\n tool: \"hlr_set_bitrate\",\n summary: \"Set an HLR-level bandwidth cap. Pass a numeric bps value or an OCS level.\",\n options: [\n ICCID,\n {\n flags: \"--bitrate <bps>\",\n description: \"Max bitrate in bits per second (0 removes the limit)\",\n arg: \"bitrate\",\n type: \"number\",\n },\n {\n flags: \"--bitrate-string <level>\",\n description: \"OCS bitrate level, e.g. KB_256, KB_1024, UNLIMITED (instead of --bitrate)\",\n arg: \"bitrate_string\",\n type: \"string\",\n },\n ],\n write: true,\n requireOneOf: [\"bitrate\", \"bitrate_string\"],\n },\n {\n name: \"greenzone reset\",\n tool: \"reset_subscriber_gz_counter\",\n summary: \"Reset the Green Zone byte counter to zero. Irreversible.\",\n options: [ICCID],\n write: true,\n },\n {\n name: \"cell-location\",\n tool: \"get_subscriber_location_by_cell_id\",\n summary: \"Resolve a raw cell tower tuple to coordinates (Bridge4IP GeoSense).\",\n options: [\n {\n flags: \"--radio-type <type>\",\n description: \"Radio type: 2G, 3G, 4G, 5G or NB-IoT\",\n arg: \"radio_type\",\n type: \"string\",\n required: true,\n },\n { flags: \"--mcc <mcc>\", description: \"Mobile Country Code\", arg: \"mcc\", type: \"number\", required: true },\n { flags: \"--mnc <mnc>\", description: \"Mobile Network Code\", arg: \"mnc\", type: \"number\", required: true },\n { flags: \"--lac <lac>\", description: \"Location Area Code\", arg: \"lac\", type: \"number\", required: true },\n { flags: \"--cell-id <id>\", description: \"Cell tower ID (strongly recommended)\", arg: \"cell_id\", type: \"number\" },\n {\n flags: \"--signal-strength <dbm>\",\n description: \"Signal strength in dBm, e.g. -89 (improves accuracy)\",\n arg: \"signal_strength\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"packages\",\n summary: \"Packages assigned to a subscriber.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_subscriber_packages\",\n summary: \"Packages on one subscriber, with allowance and expiry.\",\n options: [ICCID],\n },\n {\n name: \"assign\",\n tool: \"assign_package\",\n summary: \"Assign a one-time package from a template.\",\n options: [\n { ...ICCID, required: false },\n {\n flags: \"--template-id <id>\",\n description: \"Package template ID from `carrier templates list`\",\n arg: \"packageTemplateId\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--account-id <id>\",\n description: \"Auto-pick a free eSIM from this account instead of using --iccid\",\n arg: \"account_for_subs\",\n type: \"number\",\n },\n ],\n write: true,\n requireOneOf: [\"iccid\", \"account_for_subs\"],\n },\n {\n name: \"set-status\",\n tool: \"modify_package_status\",\n summary: \"Activate or deactivate one package without deleting it.\",\n options: [\n ICCID,\n PACKAGE_ID,\n {\n flags: \"--status <status>\",\n description: \"New package status, e.g. ACTIVE or INACTIVE\",\n arg: \"status\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"set-expiry\",\n tool: \"modify_package_expiry\",\n summary: \"Move a package's expiry date. Pass an absolute date or a day count.\",\n options: [\n ICCID,\n PACKAGE_ID,\n {\n flags: \"--expires <date>\",\n description: \"Absolute expiry, ISO 8601 (e.g. 2026-06-01)\",\n arg: \"expirationDate\",\n type: \"string\",\n },\n {\n flags: \"--validity-days <n>\",\n description: \"Days from now until expiry (instead of --expires)\",\n arg: \"validity_days\",\n type: \"number\",\n },\n ],\n write: true,\n },\n {\n name: \"set-limits\",\n tool: \"modify_package_limits\",\n summary: \"Change data, voice or SMS ceilings on an assigned package.\",\n options: [\n ICCID,\n PACKAGE_ID,\n {\n flags: \"--limits <json>\",\n description: 'New limits as JSON, e.g. \\'{\"dataLimit\":5368709120}\\'',\n arg: \"limits\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"assign-recurring\",\n tool: \"assign_recurring_package\",\n summary: \"Assign an auto-renewing package from a recurring-enabled template.\",\n options: [\n ICCID,\n {\n flags: \"--template-id <id>\",\n description: \"Recurring package template ID from `carrier templates list`\",\n arg: \"packageTemplateId\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--activate-at-first-use\",\n description: \"Activate on first network usage (instead of --start-time)\",\n arg: \"activation_at_first_use\",\n type: \"boolean\",\n },\n {\n flags: \"--start-time <iso>\",\n description: \"Scheduled activation, ISO 8601 UTC (instead of --activate-at-first-use)\",\n arg: \"start_time_utc\",\n type: \"string\",\n },\n ],\n write: true,\n },\n {\n name: \"recurring set\",\n tool: \"stop_resume_recurring_package\",\n summary: \"Pause or restart the auto-renewal of a recurring package.\",\n options: [\n ICCID,\n PACKAGE_ID,\n {\n flags: \"--action <action>\",\n description: \"'stop' halts future renewals, 'resume' re-enables them\",\n arg: \"action\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"active-period set\",\n tool: \"modify_subscriber_package_active_period\",\n summary: \"Move the start and/or end of a package's active period.\",\n options: [\n ICCID,\n {\n flags: \"--package-id <id>\",\n description: \"Package ID from `carrier packages list`\",\n arg: \"package_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--start <date>\",\n description: \"New start date, ISO 8601 (e.g. 2026-09-01)\",\n arg: \"start_date\",\n type: \"string\",\n },\n {\n flags: \"--end <date>\",\n description: \"New end date, ISO 8601 (e.g. 2026-09-30)\",\n arg: \"end_date\",\n type: \"string\",\n },\n ],\n write: true,\n requireOneOf: [\"start_date\", \"end_date\"],\n },\n {\n name: \"clean\",\n tool: \"clean_all_packages\",\n summary: \"Remove ALL packages from a subscriber. Irreversible.\",\n options: [ICCID],\n write: true,\n },\n {\n name: \"delete\",\n tool: \"delete_subscriber_package\",\n summary: \"Permanently remove one package from a subscriber.\",\n options: [ICCID, PACKAGE_ID],\n write: true,\n },\n ],\n },\n {\n name: \"templates\",\n summary: \"The package template catalog.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_package_templates\",\n summary: \"Browse package templates available for assignment.\",\n options: [ACCOUNT_ID(\"Filter templates visible to one account\")],\n },\n {\n name: \"create\",\n tool: \"create_package_template\",\n summary: \"Create a package template from a JSON configuration.\",\n options: [\n {\n flags: \"--template <json>\",\n description: 'Template config as JSON, e.g. \\'{\"name\":\"Europe 5GB\",\"dataLimit\":5368709120}\\'',\n arg: \"template\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"set-core\",\n tool: \"modify_template_core\",\n summary: \"Change name, limits, price, validity or zone on a template.\",\n options: [\n TEMPLATE_ID,\n {\n flags: \"--changes <json>\",\n description: 'Core fields as JSON, e.g. \\'{\"name\":\"Europe 5GB\"}\\'',\n arg: \"changes\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"set-recurring\",\n tool: \"modify_template_recurring\",\n summary: \"Change auto-renewal settings on a template.\",\n options: [\n TEMPLATE_ID,\n {\n flags: \"--changes <json>\",\n description: 'Recurring fields as JSON, e.g. \\'{\"periodicity\":\"monthly\"}\\'',\n arg: \"changes\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"set-throttling\",\n tool: \"modify_template_throttling\",\n summary: \"Change throttling thresholds. Applies to existing packages too.\",\n options: [\n TEMPLATE_ID,\n {\n flags: \"--changes <json>\",\n description: 'Throttling fields as JSON, e.g. \\'{\"throttlingActive\":true}\\'',\n arg: \"changes\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n ],\n },\n {\n name: \"zones\",\n summary: \"Location zones and destination lists.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_detailed_location_zones\",\n summary: \"Location zones with countries and operators. Prefer this over `elements`.\",\n options: [RESELLER_ID],\n },\n {\n name: \"elements\",\n tool: \"list_location_zones\",\n summary: \"Raw zone elements. Upstream OCS returns malformed rows for some zones.\",\n options: [\n {\n flags: \"--zone-id <id>\",\n description: \"Filter to one location zone\",\n arg: \"locationZoneId\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"create\",\n tool: \"create_location_zone\",\n summary: \"Create a location zone from a JSON configuration.\",\n options: [\n {\n flags: \"--zone <json>\",\n description: 'Zone config as JSON, e.g. \\'{\"name\":\"Europe\",\"countries\":[\"NL\",\"DE\"]}\\'',\n arg: \"zone\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"network-profile set\",\n tool: \"change_network_profile_of_location_zone\",\n summary: \"Attach or change the network profile on an existing location zone.\",\n options: [\n {\n flags: \"--zone-id <id>\",\n description: \"Location zone ID from `carrier zones list`\",\n arg: \"location_zone_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--network-profile-id <id>\",\n description: \"Network profile ID from `carrier network-profiles list`\",\n arg: \"network_profile_id\",\n type: \"number\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"destinations\",\n tool: \"list_destination_lists\",\n summary: \"Destination list catalog for voice and SMS packages.\",\n options: [RESELLER_ID],\n },\n {\n name: \"prefixes\",\n tool: \"list_destination_prefixes\",\n summary: \"Dialling prefixes inside one destination list.\",\n options: [\n {\n flags: \"--destination-list-id <id>\",\n description: \"Destination list ID from `carrier zones destinations`\",\n arg: \"destinationListId\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"steering\",\n summary: \"Network steering lists and operator preference.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_steering_lists\",\n summary: \"Steering lists configured for this reseller.\",\n options: [RESELLER_ID],\n },\n {\n name: \"assign\",\n tool: \"modify_subscriber_steering_list\",\n summary: \"Assign a steering list to a subscriber. Follow with `push`.\",\n options: [\n ICCID,\n {\n flags: \"--list-id <id>\",\n description: \"Steering list ID from `carrier steering list`\",\n arg: \"steeringListId\",\n type: \"number\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"push\",\n tool: \"push_steering_to_subscriber\",\n summary: \"Push the assigned operator preference list to the device now.\",\n options: [ICCID],\n write: true,\n },\n ],\n },\n {\n name: \"accounts\",\n summary: \"Reseller accounts: balances and subscriber moves.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_reseller_accounts\",\n summary: \"Accounts under a reseller with name, balance and type.\",\n options: [RESELLER_ID],\n },\n {\n name: \"balance set\",\n tool: \"modify_account_balance\",\n summary: \"Add to or replace an account's monetary balance.\",\n options: [\n { ...ACCOUNT_ID(\"Account ID from `carrier accounts list`\"), required: true },\n {\n flags: \"--amount <amount>\",\n description: \"Amount to add (adapt) or set to (set)\",\n arg: \"amount\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--mode <mode>\",\n description: \"'adapt' adds or subtracts, 'set' replaces\",\n arg: \"mode\",\n type: \"string\",\n required: true,\n },\n ],\n write: true,\n },\n {\n name: \"move-subscribers\",\n tool: \"move_subscriber_range_to_account\",\n summary: \"Move a contiguous ICCID range of subscribers to another account.\",\n options: [\n {\n flags: \"--iccid-from <iccid>\",\n description: \"Start ICCID of the range (inclusive)\",\n arg: \"iccidFrom\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--iccid-to <iccid>\",\n description: \"End ICCID of the range (inclusive)\",\n arg: \"iccidTo\",\n type: \"string\",\n required: true,\n },\n { ...ACCOUNT_ID(\"Target account ID from `carrier accounts list`\"), required: true },\n ],\n write: true,\n },\n ],\n },\n {\n name: \"reseller\",\n summary: \"The reseller the token belongs to.\",\n commands: [\n {\n name: \"show\",\n tool: \"get_reseller_info\",\n summary: \"Full reseller record: balance, pricing plans, contact and traffic config.\",\n options: [RESELLER_ID],\n },\n ],\n },\n {\n name: \"tariff\",\n summary: \"Wholesale tariffs: mobile and VoIP rates.\",\n commands: [\n {\n name: \"show\",\n tool: \"get_tariff\",\n summary: \"Per-country wholesale rates for data, voice and SMS.\",\n options: [RESELLER_ID],\n },\n {\n name: \"voip\",\n tool: \"list_subscriber_voip_tariff\",\n summary: \"VoIP tariff catalog for a reseller.\",\n options: [\n {\n flags: \"--reseller-id <id>\",\n description: \"Reseller ID (omit for the token owner's reseller)\",\n arg: \"reseller_id\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"voip-rules\",\n tool: \"list_voip_tariff_rule\",\n summary: \"Rate rules inside one VoIP plan.\",\n options: [\n {\n flags: \"--voip-plan-id <id>\",\n description: \"VoIP plan ID from `carrier tariff voip`\",\n arg: \"voip_plan_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n ],\n },\n {\n name: \"sms\",\n summary: \"Mobile-terminated SMS to subscribers.\",\n commands: [\n {\n name: \"send\",\n tool: \"send_sms\",\n summary: \"Send an MT SMS to one subscriber.\",\n options: [\n ICCID,\n {\n flags: \"--msisdn <msisdn>\",\n description: \"Target MSISDN in E.164 format\",\n arg: \"msisdn\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--message <text>\",\n description: \"SMS text (160 chars GSM-7; 70 with emoji or non-Latin scripts)\",\n arg: \"message\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--sender <sender>\",\n description: \"Sender ID or number shown on the device\",\n arg: \"sender\",\n type: \"string\",\n },\n ],\n write: true,\n },\n ],\n },\n {\n name: \"sponsors\",\n summary: \"Sponsor networks backing the eSIM profiles.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_sponsors\",\n summary: \"Sponsor carriers available to this reseller.\",\n options: [RESELLER_ID],\n },\n ],\n },\n {\n name: \"network-profiles\",\n summary: \"Roaming configuration profiles for zones and provisioning.\",\n commands: [\n {\n name: \"list\",\n tool: \"list_network_profiles\",\n summary: \"Network profiles available to this reseller.\",\n options: [],\n },\n ],\n },\n {\n name: \"webhooks\",\n summary: \"Bridge4IP webhook and relay flag status.\",\n commands: [\n {\n name: \"show\",\n tool: \"carrier_webhook_config\",\n summary: \"Current relay flags (LU, Gy, VoIP, calls+SMS) and notification webhooks.\",\n options: [\n {\n flags: \"--reseller-id <id>\",\n description: \"Reseller ID (omit for the token owner's reseller)\",\n arg: \"reseller_id\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"intelligence\",\n summary: \"Composite reports over the fleet.\",\n commands: [\n {\n name: \"fleet-health\",\n tool: \"fleet_health\",\n summary: \"eSIM counts, low-balance accounts and what needs attention.\",\n options: [ACCOUNT_ID(\"Report on a single account\")],\n },\n {\n name: \"diagnose\",\n tool: \"diagnose_subscriber\",\n summary: \"Why one subscriber is offline, throttled or failing to attach.\",\n options: [ICCID],\n },\n {\n name: \"anomalies\",\n tool: \"detect_usage_anomalies\",\n summary: \"Usage spikes and burn rates that exhaust the package early.\",\n options: [ICCID],\n },\n {\n name: \"churn\",\n tool: \"churn_risk\",\n summary: \"Churn risk score with contributing factors.\",\n options: [ICCID],\n },\n {\n name: \"optimize\",\n tool: \"optimize_package\",\n summary: \"Better-fitting package for one subscriber, with the saving.\",\n options: [ICCID],\n },\n {\n name: \"coverage\",\n tool: \"audit_network_coverage\",\n summary: \"Networks subscribers actually attach to, against your steering lists.\",\n options: [\n ACCOUNT_ID(\"Report on a single account\"),\n { flags: \"--limit <n>\", description: \"Subscribers to sample (default 50)\", arg: \"limit\", type: \"number\" },\n ],\n },\n {\n name: \"high-cost\",\n tool: \"high_cost_subscribers\",\n summary: \"Subscribers whose consumption erodes the margin.\",\n options: [\n ACCOUNT_ID(\"Report on a single account\"),\n { flags: \"--limit <n>\", description: \"Subscribers to analyse (default 100)\", arg: \"limit\", type: \"number\" },\n {\n flags: \"--threshold-pct <n>\",\n description: \"Usage percentage that flags a subscriber (default 80)\",\n arg: \"thresholdPct\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"marketing\",\n tool: \"marketing_intelligence\",\n summary: \"Where subscribers and revenue concentrate, and which markets grow.\",\n options: [ACCOUNT_ID(\"Report on a single account\")],\n },\n {\n name: \"country-entry\",\n tool: \"detect_country_entry\",\n summary: \"Country a subscriber is in now, optionally diffed against the last known one.\",\n options: [\n { ...ICCID, arg: \"subscriber.iccid\" },\n {\n flags: \"--expected-country <iso2>\",\n description: \"Last known ISO 3166-1 alpha-2 country, e.g. NL\",\n arg: \"expectedCountry\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n];\n\n/** Every tool the discrete commands can reach. */\nexport function capabilityToolNames(): string[] {\n return CLI_DOMAINS.flatMap((d) => d.commands.map((c) => c.tool));\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { clampUsagePeriod, lastNDaysPeriod, OCS_MAX_USAGE_WINDOW_DAYS } from \"@carrier/ocs-client\";\nimport { callMcpTool } from \"./ask.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport type { CapabilityCommand, CapabilityDomain, CapabilityOption } from \"./domains.js\";\n\n/** Flags commander adds to every capability command on top of the registry. */\nexport interface CapabilityFlags {\n json?: boolean;\n commit?: boolean;\n}\n\n/** Longest printable body before we tell the reader to use --json. */\nconst MAX_PRETTY_CHARS = 8000;\n\n/**\n * The property commander stores an option under: the long flag, camel-cased.\n * \"--threshold-pct <n>\" → \"thresholdPct\".\n */\nexport function optionKey(flags: string): string {\n const long = flags.split(/[ ,|]+/).find((t) => t.startsWith(\"--\"));\n if (!long) throw new Error(`Option \"${flags}\" has no long flag`);\n return long\n .replace(/^--/, \"\")\n .split(\"-\")\n .map((part, i) => (i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))\n .join(\"\");\n}\n\n/** Write `value` at a dot path, creating the intermediate objects. */\nfunction setArg(target: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(\".\");\n let node = target;\n for (const part of parts.slice(0, -1)) {\n const next = node[part];\n if (typeof next !== \"object\" || next === null) node[part] = {};\n node = node[part] as Record<string, unknown>;\n }\n node[parts[parts.length - 1]!] = value;\n}\n\nfunction coerce(opt: CapabilityOption, raw: unknown): { value?: unknown; error?: string } {\n if (opt.type === \"boolean\") {\n // Plain flags (no value) parse to `true`; value-taking boolean flags like\n // \"--data <bool>\" carry an explicit \"true\"/\"false\" so tri-state tools can\n // tell \"set to false\" apart from \"leave unchanged\".\n if (raw === true) return { value: true };\n const text = String(raw).toLowerCase();\n if (text === \"true\") return { value: true };\n if (text === \"false\") return { value: false };\n return { error: `${opt.flags} expects true or false, got \"${String(raw)}\"` };\n }\n if (opt.type === \"number\") {\n const n = Number(raw);\n if (!Number.isFinite(n)) return { error: `${opt.flags} expects a number, got \"${String(raw)}\"` };\n return { value: n };\n }\n return { value: String(raw) };\n}\n\nexport interface BuiltArgs {\n args: Record<string, unknown>;\n errors: string[];\n notes: string[];\n}\n\n/** Map parsed commander options onto the tool's argument shape. */\nexport function buildToolArgs(\n cmd: CapabilityCommand,\n opts: Record<string, unknown>,\n): BuiltArgs {\n const args: Record<string, unknown> = {};\n const errors: string[] = [];\n const notes: string[] = [];\n\n for (const opt of cmd.options) {\n const raw = opts[optionKey(opt.flags)];\n if (raw === undefined || raw === false) {\n if (opt.required) errors.push(`Missing required ${opt.flags}`);\n continue;\n }\n const { value, error } = coerce(opt, raw);\n if (error) errors.push(error);\n else setArg(args, opt.arg, value);\n }\n\n if (cmd.requireOneOf && !cmd.requireOneOf.some((name) => args[name] !== undefined)) {\n const flags = cmd.options.filter((opt) => cmd.requireOneOf!.includes(opt.arg)).map((opt) => opt.flags);\n errors.push(`Pass one of: ${flags.join(\", \")}`);\n }\n\n if (cmd.usageWindow) {\n const start = args.startDate as string | undefined;\n const end = args.endDate as string | undefined;\n if (!start && !end) {\n const window = lastNDaysPeriod();\n args.startDate = window.start;\n args.endDate = window.end;\n notes.push(`Window defaulted to ${window.start} … ${window.end} (last ${OCS_MAX_USAGE_WINDOW_DAYS} days).`);\n } else if (!start || !end) {\n errors.push(\"Pass both --start and --end, or neither for the last 7 days\");\n } else {\n const clamped = clampUsagePeriod(start, end);\n if (clamped.start !== start) {\n notes.push(\n `Start moved to ${clamped.start} — OCS rejects windows wider than ${OCS_MAX_USAGE_WINDOW_DAYS} days.`,\n );\n }\n args.startDate = clamped.start;\n args.endDate = clamped.end;\n }\n }\n\n if (cmd.write) args.dry_run = true;\n return { args, errors, notes };\n}\n\n/**\n * Run one domain subcommand against the remote MCP.\n *\n * Write tools preview as a dry run unless --commit is passed, so a mistyped\n * ICCID costs nothing.\n */\nexport async function runCapability(\n domain: CapabilityDomain,\n cmd: CapabilityCommand,\n opts: Record<string, unknown> & CapabilityFlags,\n): Promise<void> {\n const label = `${domain.name} ${cmd.name}`;\n // --json keeps stdout pipeable: diagnostics go to stderr, no spinner, no frame.\n const quiet = opts.json === true;\n const { args, errors, notes } = buildToolArgs(cmd, opts);\n\n if (cmd.write && opts.commit === true) delete args.dry_run;\n\n if (errors.length) {\n const message = withNextStep(`Cannot run \\`carrier ${label}\\`.`, [\n ...errors,\n `See every flag: carrier ${label} --help`,\n ]);\n if (quiet) console.error(message);\n else p.log.error(message);\n process.exitCode = 1;\n return;\n }\n\n const dryRun = cmd.write === true && args.dry_run === true;\n const warnings = dryRun\n ? [...notes, \"Dry run — nothing changes. Re-run with --commit to apply.\"]\n : notes;\n for (const note of warnings) {\n if (quiet) console.error(note);\n else p.log.info(pc.dim(note));\n }\n\n const s = quiet ? null : p.spinner();\n s?.start(`Calling ${cmd.tool}`);\n const result = await callMcpTool(cmd.tool, args, {\n errorHints: [\n `Check the arguments: carrier ${label} --help`,\n 'Or describe the task in words: carrier ask \"…\"',\n ],\n });\n s?.stop(result.ok ? \"Done\" : \"Failed\");\n\n if (!result.ok) {\n if (quiet) console.error(result.text);\n else p.log.error(result.text);\n process.exitCode = 1;\n return;\n }\n\n if (quiet) {\n process.stdout.write(`${result.text}\\n`);\n return;\n }\n\n const body =\n result.text.length > MAX_PRETTY_CHARS\n ? `${result.text.slice(0, MAX_PRETTY_CHARS)}\\n…truncated. Re-run with --json for the whole response.`\n : result.text;\n p.note(body, cmd.tool);\n}\n"],"mappings":"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","names":["p","pc","resolve","join","existsSync","join","p","resolve","spawn","spawn","join","join","join","mkdir","writeFile","join","join","mkdir","writeFile","join","join","homedir","join","join","homedir","plugin","ok","pc","text","p","ok","pc","p","pc","text","note","pc","pc","resolve"]}