@carrierllc/mcp 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/lib/plugin.ts","../src/cli/lib/paths.ts","../src/cli/lib/urls.ts","../src/cli/lib/whitelabel.ts","../src/cli/lib/logo.ts","../src/cli/lib/dash.ts","../src/cli/lib/status.ts","../src/cli/lib/guidance.ts","../src/cli/lib/home.ts","../src/cli/lib/auth.ts","../src/cli/lib/credentials.ts","../src/cli/lib/ask.ts","../src/cli/lib/signup.ts","../src/cli/lib/domains.ts","../src/cli/lib/capability.ts","../src/cli/lib/rest.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 {\n isTargetId,\n probeAll,\n rankTargets,\n rollback,\n TARGET_IDS,\n type TargetId,\n} from \"./lib/deploy-targets.js\";\nimport { formatProbes, repairPlanFor, verifyStorefront } from \"./lib/verify-storefront.js\";\nimport {\n configureClerkInstance,\n provisionClerk,\n storefrontClerkUrls,\n} from \"./lib/clerk.js\";\nimport { clerkCliDeps } from \"./lib/clerk-cli.js\";\nimport { mergeEnvLocal } from \"./lib/storefront-secrets.js\";\nimport { renderTui } from \"@carrier/screens\";\nimport {\n buildDashScreen,\n DASH_DOMAINS,\n DASH_TOOL,\n isDashDomain,\n screenFromStructured,\n} from \"./lib/dash.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 withNextStep,\n} from \"./lib/guidance.js\";\nimport { runHome, printStatus } from \"./lib/home.js\";\nimport { carrierAsk, callMcpTool } from \"./lib/ask.js\";\nimport { login as oauthLogin, logout as oauthLogout } from \"./lib/auth.js\";\nimport { signup as headlessSignup, type SignupIO } from \"./lib/signup.js\";\nimport { CLI_DOMAINS } from \"./lib/domains.js\";\nimport { runCapability, runRawTool, 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\n/**\n * Resolve which target to build for before building, because Cloudflare needs a\n * different build script (`cf:build`) than everything else. With no explicit\n * preference this is the same target the deploy step will pick.\n */\nasync function resolveBuildTarget(\n storefront: string,\n preferred?: TargetId,\n): Promise<TargetId> {\n if (preferred) return preferred;\n const ranked = rankTargets(await probeAll(storefront));\n return ranked[0]?.id ?? \"cloudflare\";\n}\n\nasync function maybeBuildDeploy(\n target: string,\n brand: Brand,\n opts: {\n install: boolean;\n build: boolean;\n deploy: boolean;\n preferred?: TargetId;\n pushSecrets?: boolean;\n clerk?: boolean;\n verify?: boolean;\n autofixAgent?: boolean;\n customDomain?: boolean;\n },\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 const buildTarget = await resolveBuildTarget(target, opts.preferred);\n\n if (opts.clerk) await runClerkStep(target, brand);\n\n if (opts.build) {\n const s = p.spinner();\n s.start(`Building storefront for ${buildTarget}`);\n const okb = await buildSite(target, buildTarget);\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\");\n const r = await deploySite(target, brand, {\n preferred: opts.preferred,\n pushSecrets: opts.pushSecrets,\n customDomain: opts.customDomain,\n });\n s.stop(r.ok ? `Deployed to ${r.target}: ${r.url ?? r.projectName}` : \"Deploy skipped\");\n\n if (!r.ok) {\n if (r.reason) info(pc.yellow(r.reason));\n const hints = r.statuses\n .filter((t) => !t.ready && t.reason)\n .map((t) => `${t.label}: ${t.reason}`);\n p.note(\n [...(hints.length ? hints : [\"Log in to a supported host, then retry.\"]), `Then: carrier site deploy ${target}`].join(\"\\n\"),\n \"Next\",\n );\n return;\n }\n\n if (r.secrets) {\n if (r.secrets.pushed.length) info(pc.dim(`Secrets staged: ${r.secrets.pushed.join(\", \")}`));\n if (r.secrets.failed.length) {\n info(pc.yellow(`Secrets that failed to stage: ${r.secrets.failed.join(\", \")}`));\n }\n }\n // The catalog pages throw without this, and the failure only shows at runtime.\n if (!r.secrets?.pushed.includes(\"CARRIER_API_KEY\")) {\n info(\n pc.yellow(\n \"CARRIER_API_KEY was not staged — / and /shop will return 500. Set it in .env.local and redeploy.\",\n ),\n );\n }\n if (r.url) info(pc.green(r.url));\n\n // Second Clerk pass: only now does the deployed origin exist to whitelist.\n if (opts.clerk && r.url) {\n const secretKey = process.env.CLERK_SECRET_KEY?.trim();\n if (secretKey) {\n const { allowedOrigins, redirectUrls } = storefrontClerkUrls(r.url, brand.domain);\n const configured = await configureClerkInstance(secretKey, { allowedOrigins, redirectUrls });\n if (configured.applied.length) {\n info(pc.dim(`Clerk now allows the deployed origin (${configured.applied.length} settings)`));\n }\n for (const f of configured.failed) info(pc.yellow(`Clerk ${f.step}: ${f.reason}`));\n }\n }\n\n if (opts.verify !== false && r.url && r.target) {\n await verifyAndRepair(target, brand, r.url, r.target, r.projectName, opts);\n }\n }\n}\n\n/**\n * Confirm the deployed storefront serves, and repair it once if it does not.\n *\n * Bounded on purpose: probe, one deterministic repair, re-probe, then stop. A\n * loop here would hammer a host while an operator is not watching, and the\n * second failure of the same repair means the diagnosis was wrong, not that it\n * needs another go.\n */\nasync function verifyAndRepair(\n storefront: string,\n brand: Brand,\n url: string,\n targetId: TargetId,\n projectName: string,\n opts: { preferred?: TargetId; pushSecrets?: boolean; autofixAgent?: boolean },\n): Promise<void> {\n const s = p.spinner();\n s.start(\"Verifying the deployed storefront\");\n let result = await verifyStorefront(url, storefront, process.env);\n s.stop(result.ok ? \"Storefront is serving\" : `Storefront is not serving — ${result.diagnosis}`);\n info(pc.dim(formatProbes(result.probes)));\n\n if (result.ok) return;\n info(pc.yellow(result.summary));\n\n const plan = repairPlanFor(result.diagnosis);\n if (!plan) {\n if (result.diagnosis === \"unclassified\" && opts.autofixAgent) {\n p.note(\n [\n \"No deterministic repair matches this symptom.\",\n `Probes: ${formatProbes(result.probes)}`,\n `URL: ${url}`,\n \"Re-run with an agent that can read the host logs, or inspect manually.\",\n ].join(\"\\n\"),\n \"Needs investigation\",\n );\n }\n process.exitCode = 1;\n return;\n }\n\n const rs = p.spinner();\n rs.start(`Repairing: ${plan.note}`);\n if (plan.runClerk) await runClerkStep(storefront, brand, url);\n if (plan.rebuild) {\n const rebuilt = await buildSite(storefront, targetId);\n if (!rebuilt) {\n rs.stop(\"Repair failed at the rebuild step\");\n process.exitCode = 1;\n return;\n }\n }\n const redeploy = await deploySite(storefront, brand, {\n preferred: targetId,\n pushSecrets: opts.pushSecrets !== false,\n });\n rs.stop(redeploy.ok ? \"Repaired and redeployed\" : \"Redeploy failed\");\n\n if (!redeploy.ok) {\n info(pc.yellow(redeploy.reason ?? \"Redeploy failed.\"));\n process.exitCode = 1;\n return;\n }\n\n result = await verifyStorefront(redeploy.url ?? url, storefront, process.env);\n info(pc.dim(formatProbes(result.probes)));\n if (result.ok) {\n info(pc.green(\"Storefront is serving after repair.\"));\n return;\n }\n\n // The repair did not take. Put the previous version back rather than leaving\n // a known-broken site live.\n info(pc.yellow(`Still failing after one repair: ${result.summary}`));\n const rb = await rollback(targetId, storefront, projectName);\n info(rb.ok ? pc.yellow(\"Rolled back to the previous version.\") : pc.yellow(rb.reason ?? \"No rollback available.\"));\n process.exitCode = 1;\n}\n\n/**\n * Provision Clerk, write the keys locally, and configure the instance.\n *\n * Called twice in a full deploy, and the split matters. Pre-build, so the\n * publishable key is in `.env.local` before Next inlines it. Post-deploy, so\n * the real `*.workers.dev` origin can be whitelisted — before the deploy that\n * URL does not exist yet, and the earlier single call passed `undefined`, which\n * meant the deployed origin was never allowed.\n */\nasync function runClerkStep(storefront: string, brand: Brand, deployedUrl?: string): Promise<void> {\n const s = p.spinner();\n s.start(\"Provisioning Clerk\");\n const result = await provisionClerk({\n name: brand.name,\n domain: brand.domain,\n env: process.env,\n storefront,\n cli: clerkCliDeps(),\n });\n\n if (!result.ok || !result.credentials) {\n s.stop(\"Clerk not configured\");\n if (result.reason) info(pc.yellow(result.reason));\n if (result.guidance) p.note(result.guidance.join(\"\\n\"), \"Set up Clerk\");\n return;\n }\n\n const { credentials } = result;\n s.stop(\n {\n platform: `Clerk application created (${credentials.applicationId ?? \"new\"})`,\n \"cli-keyless\": \"Clerk keyless application minted — claim it at dashboard.clerk.com to keep it\",\n discovered: \"Clerk keys found on this machine\",\n manual: \"Clerk not configured\",\n }[result.tier],\n );\n\n const written = await mergeEnvLocal(storefront, {\n NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: credentials.publishableKey,\n CLERK_SECRET_KEY: credentials.secretKey,\n });\n if (written.length) info(pc.dim(`Wrote to .env.local: ${written.join(\", \")}`));\n\n const { allowedOrigins, redirectUrls } = storefrontClerkUrls(deployedUrl, brand.domain);\n const configured = await configureClerkInstance(credentials.secretKey, {\n allowedOrigins,\n redirectUrls,\n });\n if (configured.applied.length) info(pc.dim(`Clerk configured: ${configured.applied.length} settings`));\n for (const f of configured.failed) info(pc.yellow(`Clerk ${f.step}: ${f.reason}`));\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\nprogram\n .command(\"login\")\n .description(\"Sign in from this terminal. Opens a browser once, then refreshes silently.\")\n .action(async () => {\n header();\n const s = p.spinner();\n s.start(\"Waiting for browser sign-in\");\n try {\n const r = await oauthLogin({\n openBrowser: (url) => openUrl(url),\n onUrl: (url) => s.message(`Sign in at ${url.slice(0, 60)}…`),\n });\n s.stop(r.ok ? \"Signed in\" : \"Failed\");\n if (!r.ok) {\n p.log.error(r.message);\n process.exitCode = 1;\n return;\n }\n p.note(\n [`Scope: ${r.scope ?? \"read write\"}`, \"\", \"Try it: carrier intelligence fleet-health\"].join(\"\\n\"),\n \"Signed in\",\n );\n } catch (e) {\n s.stop(\"Failed\");\n p.log.error(\n withNextStep(e instanceof Error ? e.message : String(e), [\n \"Check outbound HTTPS to mcp.carrier.llc\",\n \"Headless/CI instead: export CARRIER_API_KEY=ak_…\",\n ]),\n );\n process.exitCode = 1;\n }\n p.outro(\"\");\n });\n\n/**\n * Clack prompts adapted to `SignupIO`.\n *\n * Clack reports cancellation with a symbol rather than by throwing, so every\n * value is checked with `p.isCancel` and mapped to null. Missing that turns a\n * ctrl-C into the literal string \"Symbol(clack:cancel)\" submitted as someone's\n * first name.\n */\nfunction clackSignupIO(): SignupIO {\n return {\n async text(message, opts) {\n const value = await p.text({ message, ...(opts?.placeholder ? { placeholder: opts.placeholder } : {}) });\n return p.isCancel(value) ? null : String(value ?? \"\").trim();\n },\n async password(message) {\n const value = await p.password({ message });\n return p.isCancel(value) ? null : String(value ?? \"\");\n },\n async confirm(message) {\n const value = await p.confirm({ message });\n return p.isCancel(value) ? null : Boolean(value);\n },\n step(message) {\n // A clack spinner cannot run here: this flow prompts between steps, and a\n // live spinner and a prompt fight for the same lines.\n p.log.step(message);\n },\n note(body, title) {\n p.note(body, title);\n },\n };\n}\n\nprogram\n .command(\"signup\")\n .description(\"Create a Carrier account from this terminal, then sign in.\")\n .action(async () => {\n header();\n const result = await headlessSignup({ io: clackSignupIO() });\n\n if (!result.ok) {\n if (result.cancelled) {\n p.log.info(result.message);\n } else {\n p.log.error(result.message);\n process.exitCode = 1;\n }\n p.outro(\"\");\n return;\n }\n\n p.note(\n [\n `Account: ${result.email ?? \"created\"}`,\n `Organization: ${result.organizationName ?? result.organizationId ?? \"created\"}`,\n ].join(\"\\n\"),\n \"Signed up\",\n );\n\n // The account exists but this terminal holds no credential yet. Sign in\n // here rather than printing \"now run carrier login\": the browser hop is\n // one round trip either way, and stopping short would leave the command\n // half-finished at the exact moment it looks done.\n const s = p.spinner();\n s.start(\"Signing in\");\n try {\n const login = await oauthLogin({\n openBrowser: (url) => openUrl(url),\n onUrl: (url) => s.message(`Finish sign-in at ${url.slice(0, 60)}\\u2026`),\n });\n s.stop(login.ok ? \"Signed in\" : \"Sign-in did not finish\");\n if (login.ok) {\n p.note(\"Try it: carrier intelligence fleet-health\", \"Next\");\n } else {\n p.log.warn(withNextStep(login.message, [\"Sign in when ready: carrier login\"]));\n }\n } catch (e) {\n s.stop(\"Sign-in did not finish\");\n p.log.warn(\n withNextStep(e instanceof Error ? e.message : String(e), [\n \"Your account exists — sign in when ready: carrier login\",\n ]),\n );\n }\n p.outro(\"\");\n });\n\nprogram\n .command(\"logout\")\n .description(\"Forget the stored sign-in on this machine.\")\n .action(async () => {\n header();\n await oauthLogout();\n p.log.success(\"Signed out.\");\n p.outro(\"\");\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show the account, org and scopes the current credential resolves to.\")\n .option(\"--json\", \"Print the raw response on stdout and nothing else\")\n .action(async (opts: { json?: boolean }) => {\n if (!opts.json) header();\n const s = opts.json ? null : p.spinner();\n s?.start(\"Calling environment_info\");\n const r = await callMcpTool(\"environment_info\", {}, {\n errorHints: [\"Sign in first: carrier login\", \"Or export CARRIER_API_KEY=ak_…\"],\n });\n s?.stop(r.ok ? \"Done\" : \"Failed\");\n if (!r.ok) {\n if (opts.json) console.error(r.text);\n else p.log.error(r.text);\n process.exitCode = 1;\n return;\n }\n if (opts.json) {\n process.stdout.write(`${r.text}\\n`);\n return;\n }\n p.note(r.text, \"environment_info\");\n p.outro(\"\");\n });\n\nconst connectCmd = program.command(\"connect\").description(\"Stripe Connect onboarding and status.\");\n\nconnectCmd\n .command(\"status\")\n .description(\"Show the authenticated operator's Stripe Connect status.\")\n .option(\"--json\", \"Print raw JSON\")\n .action(async (opts: { json?: boolean }) => {\n if (!opts.json) header();\n const r = await callMcpTool(\"stripe_connect_status\", {}, {\n errorHints: [\"Sign in first: carrier login\", \"Start onboarding: carrier connect begin\"],\n });\n if (!r.ok) {\n if (opts.json) console.error(r.text); else p.log.error(r.text);\n process.exitCode = 1;\n return;\n }\n if (opts.json) process.stdout.write(`${r.text}\n`);\n else { p.note(r.text, \"Stripe Connect\"); p.outro(\"\"); }\n });\n\nconnectCmd\n .command(\"begin\")\n .description(\"Start or resume Stripe Connect onboarding and open the secure Stripe flow.\")\n .option(\"--type <type>\", \"Connected account type: express or standard\", \"express\")\n .option(\"--no-open\", \"Print the onboarding URL instead of opening it\")\n .action(async (opts: { type: string; open: boolean }) => {\n header();\n if (!['express', 'standard'].includes(opts.type)) {\n p.log.error(\"--type must be express or standard\"); process.exitCode = 2; return;\n }\n const r = await callMcpTool(\"stripe_connect_begin\", { account_type: opts.type }, {\n errorHints: [\"Sign in first: carrier login\", \"Check status: carrier connect status\"],\n });\n if (!r.ok) { p.log.error(r.text); process.exitCode = 1; return; }\n let data: { onboarding_url?: string; account_id?: string; account_created?: boolean } = {};\n try { data = JSON.parse(r.text) as typeof data; } catch { /* show raw below */ }\n if (!data.onboarding_url) { p.log.error(r.text); process.exitCode = 1; return; }\n if (opts.open) {\n const opened = await openUrl(data.onboarding_url);\n if (opened.ok) ok(opened.hint); else p.note(data.onboarding_url, \"Open this secure Stripe URL\");\n } else {\n process.stdout.write(`${data.onboarding_url}\\n`);\n }\n p.note([\n `Account: ${data.account_id ?? \"created by Stripe\"}`,\n data.account_created ? \"A new connected account was created.\" : \"Resuming the existing account.\",\n \"After Stripe: carrier connect status\",\n ].join(\"\\n\"), \"Onboarding\");\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 in a browser (headless: carrier signup)\"],\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(\n cmd.write\n ? `${cmd.summary} Dry run unless --commit.`\n : cmd.requireConfirm\n ? `${cmd.summary} Refuses without --confirm.`\n : cmd.summary,\n );\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 // REST endpoints answer 202 with a single-use token the caller re-sends,\n // which is how apps/api gates its destructive routes.\n if (cmd.transport === \"rest\") {\n sub.option(\"--confirm-token <token>\", \"Token from a prior 202, to confirm this call\");\n }\n // No dry_run on the tool, so there is nothing to preview: the flag is the\n // only thing standing between a typo and a real change.\n if (cmd.requireConfirm) sub.option(\"--confirm\", \"Required. This call takes effect immediately.\");\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\n// Escape hatch. The generated commands cover every tool the server registered\n// when they were last generated; this covers the remainder — a tool added\n// since, or one whose schema the generator flattened badly.\nprogram\n .command(\"tool <name>\")\n .description(\"Call one MCP tool directly, by name, with raw arguments\")\n .option(\n \"--arg <key=value>\",\n \"One tool argument. Repeat for more. Dots nest: context.iccid=8931…\",\n (value: string, prev: string[]) => [...prev, value],\n [] as string[],\n )\n .option(\"--json\", \"Print the raw tool response on stdout and nothing else\")\n .action(async (name: string, o: { arg: string[] } & CapabilityFlags) => {\n if (o.json !== true) header();\n await runRawTool(name, o.arg, o);\n if (o.json !== true) p.outro(\"\");\n });\n\nprogram\n .command(\"dash [domain]\")\n .description(`Render a status screen in the terminal: ${DASH_DOMAINS.join(\" | \")}`)\n .option(\"--json\", \"Emit the screen model as JSON instead of drawing it\")\n .option(\"--no-color\", \"Plain text, safe to pipe\")\n .option(\"--width <n>\", \"Terminal width override\")\n .action(async (domain: string | undefined, o: { json?: boolean; color?: boolean; width?: string }) => {\n const target = domain ?? \"fleet\";\n if (!isDashDomain(target)) {\n fail(`Unknown dashboard \"${target}\".`, [`Available: ${DASH_DOMAINS.join(\", \")}`]);\n process.exitCode = 1;\n return;\n }\n const tool = DASH_TOOL[target];\n if (!tool) {\n fail(`\\`carrier dash ${target}\\` reads local state, not a tool.`, [\n \"Run it from a storefront directory: carrier site deploy --no-secrets\",\n ]);\n process.exitCode = 1;\n return;\n }\n if (!o.json) header();\n const result = await callMcpTool(tool, {}, {\n errorHints: [`Check auth: carrier status`, `Or ask in words: carrier ask \"…\"`],\n });\n if (!result.ok) {\n fail(result.text, [\"carrier status\"]);\n process.exitCode = 1;\n return;\n }\n // Prefer a screen the server already built — that is the whole point of the\n // shared model. Fall back to deriving one from a JSON payload; prose cannot\n // drive a screen and is reported honestly as no data.\n let payload: unknown;\n try {\n payload = JSON.parse(result.text);\n } catch {\n payload = undefined;\n }\n const screen = screenFromStructured(result.structured) ?? buildDashScreen(target, payload);\n if (o.json) {\n process.stdout.write(`${JSON.stringify(screen, null, 2)}\\n`);\n return;\n }\n process.stdout.write(\n `${renderTui(screen, {\n color: o.color !== false,\n width: o.width ? Number(o.width) : process.stdout.columns,\n })}\\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 whichever host is available on this box.\")\n .option(\"--name <name>\", \"Project/worker name (defaults from brand)\")\n .option(`--target <target>`, `Force a host: ${TARGET_IDS.join(\" | \")}`)\n .option(\"--no-secrets\", \"Skip staging runtime secrets on the host\")\n .option(\"--clerk\", \"Provision and configure Clerk before building\")\n .option(\"--no-verify\", \"Skip the post-deploy check that the site actually serves\")\n .option(\"--autofix-agent\", \"On an unrecognised failure, print an agent-ready diagnosis bundle\")\n .option(\"--domain\", \"Route the brand domain to the deployment (Cloudflare provisions DNS + cert)\")\n .action(\n async (\n dir: string | undefined,\n o: {\n name?: string;\n target?: string;\n secrets?: boolean;\n clerk?: boolean;\n verify?: boolean;\n autofixAgent?: boolean;\n domain?: boolean;\n },\n ) => {\n header();\n const target = resolve(dir ?? \"./storefront\");\n if (o.target && !isTargetId(o.target)) {\n fail(`Unknown target \"${o.target}\".`, [`Supported: ${TARGET_IDS.join(\", \")}`]);\n process.exitCode = 1;\n return;\n }\n try {\n const brand = await loadStorefrontBrand(target, o.name ? { name: o.name } : undefined);\n await maybeBuildDeploy(target, brand, {\n install: true,\n build: true,\n deploy: true,\n preferred: o.target as TargetId | undefined,\n pushSecrets: o.secrets !== false,\n clerk: o.clerk === true,\n verify: o.verify !== false,\n autofixAgent: o.autofixAgent === true,\n customDomain: o.domain === true,\n });\n } catch (e: unknown) {\n fail(String(e instanceof Error ? e.message : e), [\n \"Scaffold first: carrier site create\",\n \"Check host logins: carrier site targets\",\n ]);\n process.exitCode = 1;\n return;\n }\n p.outro(\"\");\n },\n );\nsite\n .command(\"targets [dir]\")\n .description(\"Show which deploy hosts are installed, logged in, and ready.\")\n .action(async (dir: string | undefined) => {\n header();\n const storefront = resolve(dir ?? \"./storefront\");\n const statuses = await probeAll(storefront);\n const ranked = rankTargets(statuses);\n const rows = statuses.map((s) => {\n const mark = s.ready ? pc.green(\"ready\") : pc.dim(\"not ready\");\n const detail = s.ready\n ? [s.account, s.configured ? \"configured\" : undefined].filter(Boolean).join(\", \")\n : (s.reason ?? \"\");\n return `${s.label.padEnd(20)} ${mark} ${pc.dim(detail)}`;\n });\n p.note(rows.join(\"\\n\"), \"Deploy hosts\");\n info(\n ranked.length\n ? pc.green(`Default on this box: ${ranked[0].label}`)\n : pc.yellow(\"No host is ready — log in to one, then re-run.\"),\n );\n p.outro(\"\");\n });\nsite\n .command(\"clerk [dir]\")\n .description(\"Create or discover a Clerk instance and configure it for the storefront.\")\n .option(\"--name <name>\", \"Application name (defaults from brand)\")\n .option(\"--production\", \"Also create a production instance (Platform API only)\")\n .option(\"--no-create\", \"Never create a new application; only reuse existing keys\")\n .option(\"--url <url>\", \"Deployed URL to whitelist as an origin/redirect\")\n .action(\n async (\n dir: string | undefined,\n o: { name?: string; production?: boolean; create?: boolean; url?: string },\n ) => {\n header();\n const storefront = resolve(dir ?? \"./storefront\");\n try {\n const brand = await loadStorefrontBrand(storefront, o.name ? { name: o.name } : undefined);\n const result = await provisionClerk({\n name: o.name ?? brand.name,\n domain: brand.domain,\n production: o.production === true,\n noCreate: o.create === false,\n env: process.env,\n storefront,\n cli: clerkCliDeps(),\n });\n if (!result.ok || !result.credentials) {\n if (result.reason) info(pc.yellow(result.reason));\n p.note((result.guidance ?? []).join(\"\\n\"), \"Set up Clerk\");\n process.exitCode = 1;\n return;\n }\n const written = await mergeEnvLocal(storefront, {\n NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: result.credentials.publishableKey,\n CLERK_SECRET_KEY: result.credentials.secretKey,\n });\n info(\n result.tier === \"platform\"\n ? pc.green(`Created Clerk application ${result.credentials.applicationId ?? \"\"}`.trim())\n : pc.green(\"Reused Clerk keys already on this machine\"),\n );\n if (written.length) info(pc.dim(`Wrote to .env.local: ${written.join(\", \")}`));\n\n const { allowedOrigins, redirectUrls } = storefrontClerkUrls(o.url, brand.domain);\n const configured = await configureClerkInstance(result.credentials.secretKey, {\n allowedOrigins,\n redirectUrls,\n });\n if (configured.applied.length) {\n p.note(configured.applied.join(\"\\n\"), \"Applied to the Clerk instance\");\n }\n for (const f of configured.failed) info(pc.yellow(`${f.step}: ${f.reason}`));\n } catch (e: unknown) {\n fail(String(e instanceof Error ? e.message : e), [\"Scaffold first: carrier site create\"]);\n process.exitCode = 1;\n return;\n }\n p.outro(\"\");\n },\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","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 { 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\";\n/** Carrier REST API, for the capabilities MCP does not expose. */\nexport const API_URL = \"https://api.carrier.llc\";\nexport const MCP_HOME = \"https://mcp.carrier.llc\";\nexport const SIGN_UP_URL = \"https://accounts.carrier.llc/sign-up\";\n/**\n * Clerk Frontend API. Read-only from the CLI: `carrier signup` posts to\n * `apps/api`, which is the only place the sign-up rate limit can be enforced,\n * and reads `/v1/environment` here to learn whether consent must be collected.\n */\nexport const CLERK_FAPI_URL = \"https://clerk.carrier.llc\";\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 {\n billingScreen,\n fleetScreen,\n greenzoneScreen,\n packagesScreen,\n renderTui,\n storefrontScreen,\n subscribersScreen,\n usageScreen,\n walletScreen,\n type Screen,\n} from \"@carrier/screens\";\n\n/**\n * `carrier dash` — the terminal half of the screen kit.\n *\n * Each domain reuses the same builder the MCP panel uses, so the terminal and\n * the rendered panel cannot drift: if a number is wrong in one it is wrong in\n * both, which is a far better failure than the two disagreeing silently. That\n * disagreement is exactly what went unnoticed in `fleet_health_app`.\n *\n * Data comes from the MCP tools through the existing capability layer, so this\n * adds a rendering surface, not a second API client.\n */\n\nexport const DASH_DOMAINS = [\n \"fleet\",\n \"subscribers\",\n \"usage\",\n \"packages\",\n \"billing\",\n \"wallet\",\n \"greenzone\",\n \"storefront\",\n] as const;\n\nexport type DashDomain = (typeof DASH_DOMAINS)[number];\n\nexport function isDashDomain(value: string): value is DashDomain {\n return (DASH_DOMAINS as readonly string[]).includes(value);\n}\n\n/**\n * Tool that backs each domain.\n *\n * `fleet` deliberately calls the `_app` variant: it returns the built `Screen`\n * in `structuredContent`, so the terminal renders the very object the panel\n * renders. The prose `fleet_health` returns markdown, which a screen cannot be\n * reconstructed from without inventing a parser — the sort of second\n * implementation that let the panel and the report disagree in the first place.\n */\nexport const DASH_TOOL: Record<DashDomain, string> = {\n fleet: \"fleet_health_app\",\n subscribers: \"list_subscribers\",\n usage: \"subscriber_usage\",\n packages: \"list_package_templates\",\n billing: \"billing_events\",\n wallet: \"wallet_balance\",\n greenzone: \"greenzone_whitelist_list\",\n storefront: \"\",\n};\n\n/** A `Screen` the server already built, if the tool returned one. */\nexport function screenFromStructured(structured: unknown): Screen | undefined {\n const rec = structured as { screen?: unknown } | undefined;\n const screen = rec?.screen as Screen | undefined;\n if (screen && typeof screen === \"object\" && Array.isArray(screen.sections) && screen.title) {\n return screen;\n }\n return undefined;\n}\n\nconst num = (value: unknown, fallback = 0): number => {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n};\n\nconst str = (value: unknown, fallback = \"\"): string =>\n value === undefined || value === null ? fallback : String(value);\n\n/** Pull the first array found under any of `keys`, or a bare array. */\nfunction rows(payload: unknown, keys: string[]): Record<string, unknown>[] {\n if (Array.isArray(payload)) return payload as Record<string, unknown>[];\n const rec = (payload ?? {}) as Record<string, unknown>;\n for (const key of keys) {\n const candidate = rec[key];\n if (Array.isArray(candidate)) return candidate as Record<string, unknown>[];\n }\n return [];\n}\n\n/**\n * Build the screen for a domain from that domain's tool payload.\n *\n * Unknown or unexpected payloads produce an empty screen rather than a guess —\n * the renderer then says plainly that nothing came back, which is the honest\n * result and the one that makes a broken data path visible.\n */\nexport function buildDashScreen(domain: DashDomain, payload: unknown): Screen {\n switch (domain) {\n case \"fleet\": {\n const accounts = rows(payload, [\"accounts\", \"account\"]);\n return fleetScreen({\n active: num((payload as Record<string, unknown>)?.active),\n suspended: num((payload as Record<string, unknown>)?.suspended),\n inventory: num((payload as Record<string, unknown>)?.inventory),\n other: num((payload as Record<string, unknown>)?.other),\n accounts: accounts.map((a) => ({\n name: str(a.name ?? a.accountId, \"?\"),\n balance: num(a.balance),\n active: num(a.active),\n suspended: num(a.suspended),\n inventory: num(a.inventory),\n other: num(a.other),\n packageOnly: Boolean(a.packageOnly),\n })),\n });\n }\n case \"subscribers\":\n return subscribersScreen(\n rows(payload, [\"subscribers\", \"subscriber\", \"data\"]).map((s) => ({\n iccid: str(s.iccid ?? s.ICCID, \"?\"),\n msisdn: s.msisdn ? str(s.msisdn) : undefined,\n status: str(s.status ?? s.statusStr, \"unknown\"),\n account: s.accountName ? str(s.accountName) : undefined,\n dataUsedBytes: s.dataUsed === undefined ? undefined : num(s.dataUsed),\n })),\n );\n case \"usage\":\n return usageScreen({\n subject: str((payload as Record<string, unknown>)?.subject, \"Subscriber\"),\n timeline: rows(payload, [\"timeline\", \"days\", \"usage\"]).map((p) => ({\n date: str(p.date ?? p.day, \"?\"),\n bytes: num(p.bytes ?? p.dataUsed),\n })),\n countries: rows(payload, [\"countries\"]).map((c) => ({\n country: str(c.country ?? c.countryName, \"?\"),\n bytes: num(c.bytes ?? c.dataUsed),\n })),\n });\n case \"packages\":\n return packagesScreen(\n rows(payload, [\"template\", \"templates\", \"data\"]).map((t) => ({\n name: str(t.prepaidpackagetemplatename ?? t.name, \"?\"),\n id: str(t.prepaidpackagetemplateid ?? t.id, \"?\"),\n dataLimitBytes: t.databyte === undefined ? undefined : num(t.databyte),\n validityDays: t.perioddays === undefined ? undefined : num(t.perioddays),\n price: t.cost === undefined ? undefined : num(t.cost),\n recurring: Boolean(t.recurring),\n })),\n );\n case \"billing\":\n return billingScreen({\n balance: (payload as Record<string, unknown>)?.balance === undefined\n ? undefined\n : num((payload as Record<string, unknown>).balance),\n currency: str((payload as Record<string, unknown>)?.currency, \"\"),\n events: rows(payload, [\"events\", \"data\"]).map((e) => ({\n date: str(e.date ?? e.timestamp, \"?\"),\n description: str(e.description ?? e.type, \"—\"),\n amount: num(e.amount),\n })),\n });\n case \"wallet\": {\n const p = (payload ?? {}) as Record<string, unknown>;\n return walletScreen({\n balance: num(p.balance),\n currency: str(p.currency, \"\"),\n autoTopupEnabled: Boolean(p.autoTopupEnabled ?? p.auto_topup_enabled),\n threshold: p.threshold === undefined ? undefined : num(p.threshold),\n credits: p.credits === undefined ? undefined : num(p.credits),\n });\n }\n case \"greenzone\":\n return greenzoneScreen(\n rows(payload, [\"entries\", \"whitelist\", \"data\"]).map((e) => ({\n value: str(e.value ?? e.prefix ?? e.destination, \"?\"),\n note: e.note ? str(e.note) : undefined,\n })),\n );\n case \"storefront\": {\n const p = (payload ?? {}) as Record<string, unknown>;\n return storefrontScreen({\n brand: str(p.brand ?? p.project, \"storefront\"),\n url: p.url ? str(p.url) : undefined,\n target: p.target ? str(p.target) : undefined,\n verified: p.verified === undefined ? null : Boolean(p.verified),\n diagnosis: p.diagnosis ? str(p.diagnosis) : undefined,\n secretsStaged: Array.isArray(p.secrets_staged) ? (p.secrets_staged as string[]) : undefined,\n plans: p.plans === undefined ? undefined : num(p.plans),\n });\n }\n }\n}\n\n/** Render a domain screen for the terminal. */\nexport function renderDash(\n domain: DashDomain,\n payload: unknown,\n opts: { width?: number; color?: boolean } = {},\n): string {\n return renderTui(buildDashScreen(domain, payload), opts);\n}\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 from the environment only (synchronous). */\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 { createHash, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { AddressInfo } from \"node:net\";\nimport { MCP_HOME } from \"./urls.js\";\nimport {\n clearCredentials,\n isExpired,\n readCredentials,\n writeCredentials,\n type StoredCredentials,\n} from \"./credentials.js\";\n\n/**\n * Interactive OAuth 2.1 login against the Carrier MCP authorization server.\n *\n * The server already speaks the full MCP OAuth profile — Dynamic Client\n * Registration, PKCE S256, authorization_code + refresh_token, and public\n * clients (`token_endpoint_auth_methods_supported` includes \"none\"). That is\n * exactly what an installed CLI needs, so this registers itself at runtime\n * rather than shipping a baked-in client_id.\n *\n * Access tokens live 15 minutes, so silent refresh is not a nicety: without it\n * the CLI would demand a browser every quarter of an hour.\n */\n\nconst DISCOVERY_PATH = \"/.well-known/oauth-authorization-server\";\nconst CLIENT_NAME = \"Carrier CLI\";\nconst DEFAULT_SCOPE = \"read write\";\n\n/** Ports tried in order for the loopback redirect. */\nconst CALLBACK_PORTS = [3118, 3119, 8976, 8977, 0];\n\nexport interface AuthServerMetadata {\n issuer: string;\n authorization_endpoint: string;\n token_endpoint: string;\n registration_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface LoginResult {\n ok: boolean;\n /** Safe to print — never contains a token. */\n message: string;\n scope?: string;\n}\n\nexport async function discover(base = MCP_HOME): Promise<AuthServerMetadata> {\n const res = await fetch(`${base}${DISCOVERY_PATH}`, {\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) throw new Error(`OAuth discovery failed (${res.status}) at ${base}${DISCOVERY_PATH}`);\n const meta = (await res.json()) as AuthServerMetadata;\n if (!meta.authorization_endpoint || !meta.token_endpoint) {\n throw new Error(\"OAuth discovery returned no authorization or token endpoint\");\n }\n return meta;\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction pkcePair(): { verifier: string; challenge: string } {\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\n/** Constant-time compare so a returned `state` cannot be probed byte by byte. */\nfunction sameState(a: string, b: string): boolean {\n const left = Buffer.from(a);\n const right = Buffer.from(b);\n if (left.length !== right.length) return false;\n return timingSafeEqual(left, right);\n}\n\nasync function registerClient(\n meta: AuthServerMetadata,\n redirectUri: string,\n): Promise<string> {\n if (!meta.registration_endpoint) {\n throw new Error(\"This server does not support dynamic client registration\");\n }\n const res = await fetch(meta.registration_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n body: JSON.stringify({\n client_name: CLIENT_NAME,\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n // Installed apps cannot keep a secret; register as a public client.\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }),\n });\n if (!res.ok) {\n const body = (await res.text().catch(() => \"\")).slice(0, 200);\n throw new Error(`Client registration failed (${res.status}). ${body}`);\n }\n const json = (await res.json()) as { client_id?: string };\n if (!json.client_id) throw new Error(\"Client registration returned no client_id\");\n return json.client_id;\n}\n\ninterface CallbackServer {\n redirectUri: string;\n /** Resolves with the authorization code once the browser hits /callback. */\n waitForCode: (expectedState: string, timeoutMs: number) => Promise<string>;\n close: () => void;\n}\n\n/** Escapes text dropped into the loopback callback page — some of it (the\n * OAuth `error` param) comes straight off the request URL. */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction page(title: string, detail: string): string {\n const safeTitle = escapeHtml(title);\n const safeDetail = escapeHtml(detail);\n return `<!doctype html><meta charset=\"utf-8\"><title>${safeTitle}</title>\n<body style=\"font-family:system-ui,sans-serif;max-width:32rem;margin:20vh auto;text-align:center\">\n<h1 style=\"font-size:1.25rem\">${safeTitle}</h1><p style=\"color:#555\">${safeDetail}</p></body>`;\n}\n\nasync function startCallbackServer(): Promise<CallbackServer> {\n let resolveCode: ((code: string) => void) | undefined;\n let rejectCode: ((err: Error) => void) | undefined;\n let expected = \"\";\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== \"/callback\") {\n res.writeHead(404).end();\n return;\n }\n const err = url.searchParams.get(\"error\");\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\") ?? \"\";\n\n if (err) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(page(\"Sign-in failed\", err));\n rejectCode?.(new Error(`Authorization server returned \"${err}\"`));\n return;\n }\n if (!code || !expected || !sameState(state, expected)) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(page(\"Sign-in failed\", \"The redirect did not match this login attempt.\"));\n rejectCode?.(new Error(\"State mismatch — ignoring the redirect\"));\n return;\n }\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(page(\"You're signed in\", \"Close this tab and return to your terminal.\"));\n resolveCode?.(code);\n });\n\n let bound = false;\n let lastErr: unknown;\n for (const port of CALLBACK_PORTS) {\n try {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => {\n server.removeListener(\"error\", reject);\n resolve();\n });\n });\n bound = true;\n break;\n } catch (e) {\n lastErr = e;\n }\n }\n if (!bound) {\n throw new Error(\n `Could not bind a local callback port (tried ${CALLBACK_PORTS.filter(Boolean).join(\", \")}): ${\n lastErr instanceof Error ? lastErr.message : String(lastErr)\n }`,\n );\n }\n\n const { port } = server.address() as AddressInfo;\n return {\n redirectUri: `http://localhost:${port}/callback`,\n // `close()` alone only stops new connections; a keep-alive socket from the\n // browser would hold the event loop open and the CLI would never exit.\n waitForCode: (expectedState, timeoutMs) => {\n expected = expectedState;\n return new Promise<string>((resolve, reject) => {\n // Left running, this timer keeps the process alive for the full\n // timeout after a successful login — the CLI would appear to hang.\n const timer = setTimeout(\n () => reject(new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s waiting for the browser`)),\n timeoutMs,\n );\n resolveCode = (code) => {\n clearTimeout(timer);\n resolve(code);\n };\n rejectCode = (err) => {\n clearTimeout(timer);\n reject(err);\n };\n });\n },\n close: () => {\n server.closeAllConnections();\n server.close();\n },\n };\n}\n\ninterface TokenResponse {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n error?: string;\n error_description?: string;\n}\n\nasync function postToken(\n meta: AuthServerMetadata,\n body: Record<string, string>,\n): Promise<TokenResponse> {\n const res = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams(body).toString(),\n });\n const json = (await res.json().catch(() => ({}))) as TokenResponse;\n if (!res.ok || json.error) {\n throw new Error(json.error_description || json.error || `Token endpoint returned ${res.status}`);\n }\n if (!json.access_token) throw new Error(\"Token endpoint returned no access_token\");\n return json;\n}\n\nfunction store(meta: AuthServerMetadata, token: TokenResponse, clientId: string): StoredCredentials {\n return {\n issuer: meta.issuer,\n accessToken: token.access_token!,\n refreshToken: token.refresh_token,\n expiresAt: Date.now() + (token.expires_in ?? 900) * 1000,\n scope: token.scope,\n clientId,\n };\n}\n\n/**\n * Full interactive login. `openBrowser` is injected so the caller owns the UX\n * (and tests can drive it without a browser).\n */\nexport async function login(opts: {\n openBrowser: (url: string) => Promise<unknown>;\n onUrl?: (url: string) => void;\n timeoutMs?: number;\n}): Promise<LoginResult> {\n const meta = await discover();\n const server = await startCallbackServer();\n try {\n const existing = await readCredentials();\n const clientId =\n existing?.clientId && existing.issuer === meta.issuer\n ? existing.clientId\n : await registerClient(meta, server.redirectUri);\n\n const { verifier, challenge } = pkcePair();\n const state = base64url(randomBytes(16));\n\n const authUrl = new URL(meta.authorization_endpoint);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", server.redirectUri);\n authUrl.searchParams.set(\"scope\", pickScope(meta));\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"code_challenge\", challenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\n // Arm the callback listener BEFORE the browser is opened. Doing it after\n // is a race: a fast redirect arrives while the handler still has no\n // expected state, gets rejected as a mismatch, and the CLI then waits for\n // a code that already came and went.\n const pendingCode = server.waitForCode(state, opts.timeoutMs ?? 300_000);\n // The redirect can fail before anything awaits `pendingCode` (a rejected\n // state arrives while the browser is still being opened). Mark it handled\n // so that surfaces as a normal rejection below, not an unhandled one.\n pendingCode.catch(() => undefined);\n\n opts.onUrl?.(authUrl.toString());\n await opts.openBrowser(authUrl.toString());\n\n const code = await pendingCode;\n const token = await postToken(meta, {\n grant_type: \"authorization_code\",\n code,\n redirect_uri: server.redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n });\n\n await writeCredentials(store(meta, token, clientId));\n return { ok: true, message: \"Signed in.\", scope: token.scope };\n } finally {\n server.close();\n }\n}\n\nfunction pickScope(meta: AuthServerMetadata): string {\n const supported = meta.scopes_supported ?? [];\n if (!supported.length) return DEFAULT_SCOPE;\n // Ask only for what we need; `admin` requires MFA step-up server-side.\n return DEFAULT_SCOPE.split(\" \")\n .filter((s) => supported.includes(s))\n .join(\" \") || supported[0]!;\n}\n\n/**\n * Return a usable access token from the credential store, refreshing first when\n * it is at or near expiry. Returns null when the user has never logged in.\n */\nexport async function getAccessToken(): Promise<string | null> {\n const creds = await readCredentials();\n if (!creds) return null;\n if (!isExpired(creds)) return creds.accessToken;\n if (!creds.refreshToken || !creds.clientId) return null;\n\n try {\n const meta = await discover();\n const token = await postToken(meta, {\n grant_type: \"refresh_token\",\n refresh_token: creds.refreshToken,\n client_id: creds.clientId,\n });\n const next = store(meta, token, creds.clientId);\n // Servers may omit a rotated refresh token; keep the old one if so.\n if (!next.refreshToken) next.refreshToken = creds.refreshToken;\n await writeCredentials(next);\n return next.accessToken;\n } catch {\n // A dead refresh token should read as \"logged out\", not as a hard failure.\n return null;\n }\n}\n\nexport async function logout(): Promise<void> {\n await clearCredentials();\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { chmod, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\n\n/**\n * On-disk store for `carrier login` credentials.\n *\n * Deliberately a 0600 file rather than the macOS Keychain. The Keychain write\n * path (`security add-generic-password -w <secret>`) puts the secret in argv,\n * where any process running `ps` can read it — worse than a mode-0600 file in a\n * mode-0700 directory. This is the same choice gh, aws and gcloud make.\n */\n\nexport interface StoredCredentials {\n /** OAuth issuer these tokens belong to; a mismatch means the store is stale. */\n issuer: string;\n accessToken: string;\n refreshToken?: string;\n /** Epoch ms when the access token expires. */\n expiresAt: number;\n scope?: string;\n /** Dynamic-registration client id, reused across logins on this machine. */\n clientId?: string;\n}\n\nexport function carrierHome(): string {\n return process.env.CARRIER_HOME?.trim() || join(homedir(), \".carrier\");\n}\n\nfunction credentialsPath(): string {\n return join(carrierHome(), \"credentials.json\");\n}\n\nexport async function readCredentials(): Promise<StoredCredentials | null> {\n try {\n const raw = await readFile(credentialsPath(), \"utf8\");\n const parsed = JSON.parse(raw) as StoredCredentials;\n if (!parsed?.accessToken || typeof parsed.accessToken !== \"string\") return null;\n return parsed;\n } catch {\n // Absent or unreadable is simply \"not logged in\".\n return null;\n }\n}\n\nexport async function writeCredentials(creds: StoredCredentials): Promise<void> {\n const dir = carrierHome();\n await mkdir(dir, { recursive: true, mode: 0o700 });\n // mkdir's mode is ignored when the directory already exists, so set it explicitly.\n await chmod(dir, 0o700).catch(() => undefined);\n const file = credentialsPath();\n await writeFile(file, `${JSON.stringify(creds, null, 2)}\\n`, { mode: 0o600 });\n await chmod(file, 0o600).catch(() => undefined);\n}\n\nexport async function clearCredentials(): Promise<void> {\n await rm(credentialsPath(), { force: true });\n}\n\n/** True when the access token is missing or within `skewMs` of expiry. */\nexport function isExpired(creds: StoredCredentials, skewMs = 60_000): boolean {\n if (!creds.expiresAt) return false;\n return Date.now() >= creds.expiresAt - skewMs;\n}\n\n/**\n * Never let a token reach a terminal or a log. Used on any string that might\n * have been built from a credential before it is printed.\n */\nexport function redact(text: string): string {\n return text\n .replace(/\\b(ak_|sk_|rt_)[A-Za-z0-9._-]{6,}/g, \"$1***\")\n .replace(/\\bBearer\\s+[A-Za-z0-9._-]{8,}/gi, \"Bearer ***\");\n}\n","import { MCP_URL } from \"./urls.js\";\nimport { resolveCliToken } from \"./status.js\";\nimport { getAccessToken } from \"./auth.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { CARRIER_VERSION } from \"../../version.js\";\n\nexport interface AskResult {\n ok: boolean;\n text: string;\n /**\n * `structuredContent` from the tool result, when it sent any.\n *\n * UI-enabled tools return their data here rather than only as prose, which is\n * what lets `carrier dash` render the very same screen object the MCP panel\n * renders instead of re-deriving it from formatted text.\n */\n structured?: unknown;\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\n// ---------------------------------------------------------------------------\n// Client-side deadline (issue #663)\n//\n// Without this the CLI inherits fetch's absence of a default timeout, so a\n// wedged tool (get_tariff, ~2-3 MB) hangs the terminal with zero output —\n// killed manually at 200s in the issue report.\n//\n// 45s, chosen from measured latency:\n// - discrete tool calls return in 0.5-1.5s;\n// - the largest known-good MCP result (233 KB) took 0.75s;\n// - `carrier intelligence fleet-health`, the slowest legitimate command,\n// fans out over several OCS calls and measured 1.47s / 2.84s / 1.47s here;\n// `marketing` 2.70s, `coverage` 1.98s.\n// The slowest real command is under 3s, so 45s is ~15x headroom.\n//\n// It is deliberately LONGER than the server's 20s OCS deadline: the server may\n// legitimately make several sequential OCS calls per tool (intelligence\n// composites), plus handshake and transport. Giving the outer layer a shorter\n// budget would cut off work the inner layer still considers healthy, and would\n// hide the server's specific, actionable OCS timeout message behind a generic\n// client one. Inner deadline fires first for a single wedged upstream; the\n// outer one is the backstop for anything the server itself cannot bound.\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MCP_TIMEOUT_MS = 45_000;\n\nexport function mcpTimeoutMs(): number {\n const parsed = Number(process.env.CARRIER_MCP_TIMEOUT_MS);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_MCP_TIMEOUT_MS;\n}\n\n/** Shared deadline for the whole initialize → tools/call handshake. */\nexport class McpTimeoutError extends Error {\n constructor(public readonly timeoutMs: number) {\n super(`timed out after ${Math.round(timeoutMs / 1000)}s`);\n this.name = \"McpTimeoutError\";\n }\n}\n\nfunction isTimeoutish(err: unknown): boolean {\n return (\n err instanceof McpTimeoutError ||\n (err instanceof Error &&\n (err.name === \"AbortError\" || err.name === \"TimeoutError\"))\n );\n}\n\nfunction parseRpcBody(raw: string): {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean; structuredContent?: unknown };\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; structuredContent?: unknown };\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; structuredContent?: unknown };\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 // An env credential resolves synchronously and MUST stay that way: awaiting\n // here would defer creation of the deadline timer below past the caller's\n // first tick, which is exactly what the #663 timeout tests drive. Only the\n // stored-login path — which has to touch disk and maybe refresh — awaits.\n const token = resolveCliToken() ?? (await getAccessToken());\n if (!token) {\n return {\n ok: false,\n text: withNextStep(\"Not signed in.\", [\n \"Sign in from this terminal: carrier login\",\n \"No account yet? carrier open signup\",\n \"Headless/CI instead: export CARRIER_API_KEY=ak_… from Console → Settings → API Keys\",\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 // #663 — one deadline covers the whole handshake (initialize → notify →\n // tools/call → body read). Aborting the controller tears down whichever\n // request is in flight; the race guarantees we return even if it does not.\n const timeoutMs = mcpTimeoutMs();\n const controller = new AbortController();\n let deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<never>((_resolve, reject) => {\n deadlineTimer = setTimeout(() => {\n controller.abort();\n reject(new McpTimeoutError(timeoutMs));\n }, timeoutMs);\n });\n const signal = controller.signal;\n\n try {\n return await Promise.race([\n (async (): Promise<AskResult> => {\n const initRes = await fetch(MCP_URL, {\n method: \"POST\",\n headers,\n signal,\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 =\n 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 signal,\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 signal,\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 {\n ok: !json.result?.isError,\n text,\n structured: json.result?.structuredContent,\n };\n })(),\n deadline,\n ]);\n } catch (e: unknown) {\n if (isTimeoutish(e)) {\n const secs = Math.round(timeoutMs / 1000);\n return {\n ok: false,\n text: withNextStep(\n `MCP call to ${tool} timed out after ${secs}s (no response).`,\n [\n \"The tool is likely returning more data than the MCP transport can deliver — see issue #663\",\n \"Narrow the request (a specific --account-id / --iccid returns far less than a whole-fleet call)\",\n `Raise the deadline for one slow call: CARRIER_MCP_TIMEOUT_MS=${timeoutMs * 2} carrier …`,\n \"Confirm the service is up: check network access to https://mcp.carrier.llc/mcp\",\n \"Or open Claude and ask there with full tool routing\",\n ],\n ),\n };\n }\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 } finally {\n if (deadlineTimer !== undefined) clearTimeout(deadlineTimer);\n }\n}\n\nconst ASK_ERROR_HINTS = [\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 * What `carrier_ask` answers with. It is a router: it names the tool to call and\n * the params to call it with, and deliberately does not execute anything itself\n * (\"carrier_ask does not auto-execute — the caller makes the explicit tool\n * call\"). In the CLI, we are that caller.\n */\ninterface AskRouting {\n match?: string;\n resolved_tool?: string;\n resolved_params?: Record<string, unknown>;\n confirm_required?: boolean;\n /** Present instead of resolved_tool when the intent matched more than one tool. */\n candidates?: Array<{ tool?: string; reason?: string }>;\n clarifying_question?: string;\n}\n\n/** The routing envelope arrives as JSON in a text part; anything else is prose. */\nfunction parseRouting(text: string): AskRouting | undefined {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\")) return undefined;\n try {\n const parsed = JSON.parse(trimmed) as AskRouting;\n if (!parsed || typeof parsed !== \"object\") return undefined;\n const routes = typeof parsed.resolved_tool === \"string\" && parsed.resolved_tool;\n const asksBack = typeof parsed.clarifying_question === \"string\" || Array.isArray(parsed.candidates);\n return routes || asksBack ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Natural-language fallback for anything the discrete subcommands do not cover.\n * Two hops: carrier_ask resolves the intent to a tool, then we call that tool.\n * Without the second hop the user gets routing JSON instead of their answer.\n */\nexport async function carrierAsk(intent: string): Promise<AskResult> {\n const routed = await callMcpTool(\"carrier_ask\", { intent }, { errorHints: ASK_ERROR_HINTS });\n if (!routed.ok) return routed;\n\n const routing = parseRouting(routed.text);\n // Not a routing envelope — carrier_ask answered directly, so pass it through.\n if (!routing) return routed;\n\n // Nothing resolved — surface the question, not the envelope.\n if (!routing.resolved_tool) {\n const candidates = (routing.candidates ?? [])\n .map((c) => (c.tool ? `Candidate: ${c.tool}${c.reason ? ` — ${c.reason}` : \"\"}` : undefined))\n .filter((s): s is string => Boolean(s));\n return {\n ok: false,\n text: withNextStep(routing.clarifying_question?.trim() || \"Carrier could not tell which tool you meant.\", [\n ...candidates,\n ...ASK_ERROR_HINTS,\n ]),\n };\n }\n\n const tool = routing.resolved_tool;\n const args = routing.resolved_params ?? {};\n\n if (routing.match && routing.match !== \"confirmed\") {\n return {\n ok: false,\n text: withNextStep(`Carrier could not confirm what you meant (match: ${routing.match}).`, [\n `Closest tool: ${tool}`,\n ...ASK_ERROR_HINTS,\n ]),\n };\n }\n\n // Money- and service-affecting tools are never fired from a guessed intent.\n if (routing.confirm_required) {\n return {\n ok: false,\n text: withNextStep(`\"${intent}\" resolves to ${tool}, which changes live service or billing.`, [\n `Params: ${JSON.stringify(args)}`,\n \"Run the matching discrete command so every flag is explicit and reviewable\",\n \"carrier --help lists every domain\",\n ]),\n };\n }\n\n return callMcpTool(tool, args, { errorHints: ASK_ERROR_HINTS });\n}\n","import { API_URL, CLERK_FAPI_URL } from \"./urls.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { CARRIER_VERSION } from \"../../version.js\";\n\n/**\n * Headless account creation.\n *\n * `carrier signup` used to open a browser, which made the terminal able to do\n * everything with a Carrier account except get one. This runs the whole thing\n * in the shell: collect the details, create the account, verify the emailed\n * code, land in an organization.\n *\n * The Clerk calls go through `apps/api`, not straight to Clerk. That is where\n * the sign-up rate limit lives, and a limit the CLI enforces on itself is not a\n * limit — the attacker has the CLI too. The one thing read directly from Clerk\n * is `/v1/environment`, because it is public, unauthenticated configuration and\n * the answer decides what this command must ask the human before it starts.\n *\n * Consent is the reason that check is not optional. Sending `legal_accepted`\n * unconditionally would record a consent nobody was shown; omitting it when the\n * instance requires it fails the sign-up with a Clerk error nobody can act on.\n * So: read the setting, and when consent is required, show the actual terms and\n * privacy URLs and make acceptance an explicit answer.\n *\n * This is NOT `lib/clerk.ts`. That file provisions Clerk *applications* for\n * white-label storefronts through the Platform API — a different API with a\n * different lifecycle that happens to share a vendor name.\n */\n\n/** Prompt surface, injected so the flow is testable without a terminal. */\nexport interface SignupIO {\n /** Free text. Returns null when the user cancels. */\n text(message: string, opts?: { placeholder?: string }): Promise<string | null>;\n /** Masked entry. Returns null when the user cancels. */\n password(message: string): Promise<string | null>;\n /** Yes/no. Returns null when the user cancels. */\n confirm(message: string): Promise<boolean | null>;\n /** Progress line; optional so tests can ignore it. */\n step?(message: string): void;\n /** Block of context, e.g. the consent links. */\n note?(body: string, title?: string): void;\n}\n\nexport interface SignupResult {\n ok: boolean;\n /** Safe to print — never contains a password or client token. */\n message: string;\n email?: string;\n organizationId?: string;\n organizationName?: string;\n /** True when the user backed out; the caller should not treat it as failure. */\n cancelled?: boolean;\n}\n\nexport interface SignupOptions {\n io: SignupIO;\n fetchImpl?: typeof fetch;\n apiUrl?: string;\n clerkUrl?: string;\n /** Attempts allowed at the emailed code before giving up. */\n maxCodeAttempts?: number;\n}\n\n/** What `/v1/environment` tells us that changes this command's behaviour. */\nexport interface SignupEnvironment {\n legalConsentRequired: boolean;\n captchaEnabled: boolean;\n termsUrl?: string;\n privacyUrl?: string;\n}\n\nconst DEFAULT_MAX_CODE_ATTEMPTS = 3;\n\ninterface ClerkEnvironmentResponse {\n user_settings?: {\n sign_up?: { legal_consent_enabled?: boolean; captcha_enabled?: boolean };\n };\n display_config?: { terms_url?: string | null; privacy_policy_url?: string | null };\n}\n\nexport function parseEnvironment(raw: unknown): SignupEnvironment {\n const env = (raw ?? {}) as ClerkEnvironmentResponse;\n const signUp = env.user_settings?.sign_up ?? {};\n const display = env.display_config ?? {};\n const result: SignupEnvironment = {\n legalConsentRequired: signUp.legal_consent_enabled === true,\n captchaEnabled: signUp.captcha_enabled === true,\n };\n if (display.terms_url) result.termsUrl = display.terms_url;\n if (display.privacy_policy_url) result.privacyUrl = display.privacy_policy_url;\n return result;\n}\n\nexport async function readSignupEnvironment(\n fetchImpl: typeof fetch,\n clerkUrl: string,\n): Promise<SignupEnvironment> {\n const url =\n `${clerkUrl}/v1/environment` +\n `?__clerk_api_version=2025-04-10&_clerk_js_version=5.0.0`;\n const res = await fetchImpl(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) throw new Error(`Clerk environment returned ${res.status}`);\n return parseEnvironment(await res.json());\n}\n\n/** Good enough to catch a typo before a round trip; Clerk does the real check. */\nfunction looksLikeEmail(value: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\n}\n\ninterface ApiErrorBody {\n error?: string;\n code?: string;\n retry_after_seconds?: number;\n}\n\n/**\n * Read an error out of an `apps/api` response.\n *\n * Only the `error` string is ever surfaced. The request body that produced it\n * holds a password and a client token, so nothing else from this exchange is\n * safe to print.\n */\nasync function apiError(res: Response): Promise<{ message: string; code?: string }> {\n let body: ApiErrorBody = {};\n try {\n body = (await res.json()) as ApiErrorBody;\n } catch {\n // Non-JSON error page: the status is all we can honestly report.\n }\n const out: { message: string; code?: string } = {\n message: body.error ?? `Carrier API returned ${res.status}`,\n };\n if (body.code) out.code = body.code;\n if (res.status === 429 && body.retry_after_seconds) {\n const hours = Math.ceil(body.retry_after_seconds / 3600);\n out.message += ` Try again in about ${hours}h, or sign up in a browser: carrier open signup`;\n }\n return out;\n}\n\nfunction cancelled(): SignupResult {\n return { ok: false, cancelled: true, message: \"Sign-up cancelled.\" };\n}\n\nexport async function signup(opts: SignupOptions): Promise<SignupResult> {\n const io = opts.io;\n const fetchImpl = opts.fetchImpl ?? fetch;\n const apiUrl = opts.apiUrl ?? API_URL;\n const clerkUrl = opts.clerkUrl ?? CLERK_FAPI_URL;\n const maxAttempts = opts.maxCodeAttempts ?? DEFAULT_MAX_CODE_ATTEMPTS;\n\n let environment: SignupEnvironment;\n try {\n environment = await readSignupEnvironment(fetchImpl, clerkUrl);\n } catch (e) {\n return {\n ok: false,\n message: withNextStep(\n `Could not read sign-up settings: ${e instanceof Error ? e.message : String(e)}`,\n [\n \"Verify outbound HTTPS to clerk.carrier.llc\",\n \"Sign up in a browser instead: carrier open signup\",\n ],\n ),\n };\n }\n\n // A CAPTCHA is a browser challenge by construction. Failing here beats\n // collecting a password and a name first and failing on the create call.\n if (environment.captchaEnabled) {\n return {\n ok: false,\n message: withNextStep(\"Sign-up on this instance requires a CAPTCHA, which needs a browser.\", [\n \"Sign up in a browser: carrier open signup\",\n \"Then come back and run: carrier login\",\n ]),\n };\n }\n\n const email = await io.text(\"Email address\");\n if (email === null) return cancelled();\n if (!looksLikeEmail(email.trim())) {\n return { ok: false, message: `\"${email.trim()}\" does not look like an email address.` };\n }\n\n const firstName = await io.text(\"First name\");\n if (firstName === null) return cancelled();\n const lastName = await io.text(\"Last name\");\n if (lastName === null) return cancelled();\n const password = await io.password(\"Password\");\n if (password === null) return cancelled();\n\n let legalAccepted = false;\n if (environment.legalConsentRequired) {\n io.note?.(\n [\n `Terms: ${environment.termsUrl ?? \"https://carrier.llc/terms\"}`,\n `Privacy: ${environment.privacyUrl ?? \"https://carrier.llc/privacy\"}`,\n ].join(\"\\n\"),\n \"Before you continue\",\n );\n const accepted = await io.confirm(\"Do you accept the terms and privacy policy?\");\n if (accepted === null) return cancelled();\n if (!accepted) {\n return { ok: false, message: \"An account cannot be created without accepting the terms.\" };\n }\n legalAccepted = true;\n }\n\n const headers = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `carrier-cli/${CARRIER_VERSION}`,\n };\n\n io.step?.(\"Creating your account\");\n let started: { sign_up_id: string; client_token: string; verification_required: boolean };\n try {\n const res = await fetchImpl(`${apiUrl}/v1/signup`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n email_address: email.trim(),\n password,\n first_name: firstName.trim(),\n last_name: lastName.trim(),\n ...(legalAccepted ? { legal_accepted: true } : {}),\n }),\n });\n if (!res.ok) {\n const err = await apiError(res);\n return {\n ok: false,\n message: withNextStep(err.message, [\n \"Already have an account? carrier login\",\n \"Or sign up in a browser: carrier open signup\",\n ]),\n };\n }\n const body = (await res.json()) as {\n data?: { sign_up_id?: string; client_token?: string; verification_required?: boolean };\n };\n if (!body.data?.sign_up_id || !body.data.client_token) {\n return { ok: false, message: \"Sign-up started but the response was incomplete.\" };\n }\n started = {\n sign_up_id: body.data.sign_up_id,\n client_token: body.data.client_token,\n verification_required: body.data.verification_required !== false,\n };\n } catch (e) {\n return {\n ok: false,\n message: withNextStep(\n `Could not reach the Carrier API: ${e instanceof Error ? e.message : String(e)}`,\n [\"Verify outbound HTTPS to api.carrier.llc\"],\n ),\n };\n }\n\n if (started.verification_required) {\n io.note?.(`We sent a code to ${email.trim()}.`, \"Check your email\");\n }\n\n let lastError = \"Verification failed.\";\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const code = await io.text(\"Verification code\", { placeholder: \"123456\" });\n if (code === null) return cancelled();\n\n io.step?.(\"Verifying\");\n let res: Response;\n try {\n res = await fetchImpl(`${apiUrl}/v1/signup/verify`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n sign_up_id: started.sign_up_id,\n client_token: started.client_token,\n code: code.trim(),\n }),\n });\n } catch (e) {\n return {\n ok: false,\n message: withNextStep(\n `Could not reach the Carrier API: ${e instanceof Error ? e.message : String(e)}`,\n [\"Your account may exist — try: carrier login\"],\n ),\n };\n }\n\n if (res.ok) {\n const body = (await res.json()) as {\n data?: { organization_id?: string; organization_name?: string; email_address?: string };\n };\n const result: SignupResult = {\n ok: true,\n message: \"Account created.\",\n email: body.data?.email_address ?? email.trim(),\n };\n if (body.data?.organization_id) result.organizationId = body.data.organization_id;\n if (body.data?.organization_name) result.organizationName = body.data.organization_name;\n return result;\n }\n\n const err = await apiError(res);\n lastError = err.message;\n // Only a wrong code is worth another go. Anything else — an expired code, a\n // rate limit, a Clerk outage — will fail the same way on every retry, and\n // asking again would just walk the user into the attempt ceiling.\n if (err.code !== \"form_code_incorrect\") {\n return {\n ok: false,\n message: withNextStep(err.message, [\n \"Your account may already exist — try: carrier login\",\n \"Or finish in a browser: carrier open signup\",\n ]),\n };\n }\n if (attempt < maxAttempts) io.note?.(\"That code was not right. Try again.\", \"Incorrect code\");\n }\n\n return {\n ok: false,\n message: withNextStep(lastError, [\n `No attempts left after ${maxAttempts} tries.`,\n \"Start over: carrier signup\",\n \"Or finish in a browser: carrier open signup\",\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 * A few capabilities have no MCP tool at all — minting an `ak_` key is the\n * clearest case, since it has to work before the caller holds a credential any\n * tool call could use. Those carry `transport: \"rest\"` and name a Carrier REST\n * path instead. They stay in this registry so `carrier --help` lists one\n * surface, not two.\n *\n * `carrier onboard` is the other one, for the same reason: it runs before the\n * account has an OCS token, which is what every MCP tool call needs. It has no\n * `portal` verb on purpose — connecting by OCS portal login hands a plaintext\n * portal password to a sandboxed browser, so it stays a console-only flow.\n *\n * The domains above the `<generated:catalog-domains>` sentinel are hand-written\n * and stay that way. Everything between the sentinels comes from\n * `scripts/generate-domains.mjs`, which reads the built server's own catalog, so\n * every registered tool has a command. Edit the generator, not the region, and\n * re-run it whenever the server gains or renames a tool:\n *\n * pnpm -F @carrierllc/mcp-server build\n * pnpm -F @carrierllc/mcp generate:domains\n *\n * `catalog-command-parity.test.js` fails if that is ever skipped.\n *\n * This file must stay import-free. Two tests transpile it on its own and load\n * it as a data URL, which cannot resolve a relative import.\n */\n\n/**\n * Flag value types. The two array forms take one comma-separated value, which\n * is how a tool taking `string[]` or `number[]` reaches the command line.\n */\nexport type CapabilityArgType = \"string\" | \"number\" | \"boolean\" | \"string[]\" | \"number[]\";\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 type RestMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\n/** Shared by both transports. */\ninterface CapabilityCommandBase {\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 summary: string;\n options: readonly CapabilityOption[];\n /**\n * Write or admin capability. On the MCP transport this sends dry_run=true\n * unless --commit is passed; on REST, where there is no dry_run field to\n * send, --commit is what makes the request leave the machine at all. Either\n * way a 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 * Refuse to run without --confirm. For tools that change something real but\n * carry no dry_run, confirm or confirm_token argument of their own — sending\n * `dry_run` to one of those is worse than useless, because the tool ignores\n * the field and does the thing. The flag is a CLI gate: nothing is added to\n * the arguments, the call simply does not happen without it.\n */\n requireConfirm?: boolean;\n}\n\n/** The default: one command, one MCP tool. */\nexport interface McpCapabilityCommand extends CapabilityCommandBase {\n transport?: \"mcp\";\n /** MCP tool this verb calls. */\n tool: string;\n}\n\n/**\n * A capability the MCP server does not expose, served by `apps/api` instead.\n *\n * `restPath` may carry `{argName}` placeholders; each is filled from the built\n * argument of the same name and removed from the body. Whatever is left goes\n * out as a JSON body, or as a query string on GET and DELETE.\n */\nexport interface RestCapabilityCommand extends CapabilityCommandBase {\n transport: \"rest\";\n restMethod: RestMethod;\n /** Path under the API origin, e.g. \"/v1/api-keys\". Must exist in openapi.ts. */\n restPath: string;\n}\n\nexport type CapabilityCommand = McpCapabilityCommand | RestCapabilityCommand;\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 {\n flags: \"--activation-code <code>\",\n description: \"Filter by eSIM activation code\",\n arg: \"activationCode\",\n type: \"string\",\n },\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 // OCS rejects an unfiltered list. Catch it here so the user gets the\n // flags to pass instead of a raw schema-validation dump from the tool.\n requireOneOf: [\"accountId\", \"iccid\", \"msisdn\", \"imsi\", \"activationCode\"],\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: [\n RESELLER_ID,\n {\n flags: \"--verbose <bool>\",\n description: \"Return the full OCS zone shape instead of the compact projection\",\n arg: \"verbose\",\n type: \"boolean\",\n },\n ],\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 required: true,\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 required: true,\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: [\n RESELLER_ID,\n {\n flags: \"--country <name|iso2>\",\n description: \"Filter to one country: ISO2 (\\\"nl\\\") or name (\\\"Netherlands\\\")\",\n arg: \"country\",\n type: \"string\",\n },\n {\n flags: \"--traffic-type <type>\",\n description: \"Filter to data, voice or sms\",\n arg: \"trafficType\",\n type: \"string\",\n },\n {\n flags: \"--verbose <bool>\",\n description: \"Return the full OCS rule shape instead of the compact projection\",\n arg: \"verbose\",\n type: \"boolean\",\n },\n ],\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 name: \"api-keys\",\n summary: \"Mint Carrier API keys (ak_…) for headless and CI use\",\n commands: [\n {\n name: \"create\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/api-keys\",\n summary:\n \"Create an org API key. The secret is shown once and never stored by the CLI.\",\n options: [\n {\n flags: \"--name <name>\",\n description: \"Label for the key, max 64 characters\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--description <text>\",\n description: \"Optional note, max 256 characters\",\n arg: \"description\",\n type: \"string\",\n },\n {\n flags: \"--seconds-until-expiration <n>\",\n description: \"Expiry in seconds, 60 to 31536000. Omit for a key that does not expire.\",\n arg: \"secondsUntilExpiration\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"onboard\",\n summary: \"Connect a new account to OCS without opening a browser\",\n commands: [\n {\n name: \"status\",\n transport: \"rest\",\n restMethod: \"GET\",\n restPath: \"/v1/onboarding\",\n summary: \"Show how far onboarding has got. Same state the console renders.\",\n options: [],\n },\n {\n name: \"org\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/org\",\n summary: \"Record who the operator is (step 1).\",\n options: [\n {\n flags: \"--name <name>\",\n description: \"Operator name, max 128 characters\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--website <url>\",\n description: \"Public site, if there is one\",\n arg: \"website\",\n type: \"string\",\n },\n {\n flags: \"--country <iso2>\",\n description: \"ISO 3166-1 alpha-2 country, e.g. NL\",\n arg: \"country\",\n type: \"string\",\n },\n {\n flags: \"--operator-type <type>\",\n description: \"How the operator describes itself, e.g. mvno\",\n arg: \"operatorType\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"connect\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/ocs-connect\",\n summary:\n \"Connect your own eSIMVault token (step 2, BYO). Verified against OCS, then stored encrypted; the token is never echoed back.\",\n options: [\n {\n flags: \"--token <token>\",\n description:\n \"eSIMVault API token. A flag lands in shell history — prefer a leading space, or run this once from a fresh shell.\",\n arg: \"token\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"managed\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/managed-account\",\n summary:\n \"Let Carrier provision the OCS sub-account instead (step 2, the primary path). Idempotent, and clears any BYO token.\",\n options: [],\n },\n {\n name: \"plan\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/plan\",\n summary: \"Record the starting plan template (step 3).\",\n options: [\n {\n flags: \"--template-id <id>\",\n description: \"Package template to start from\",\n arg: \"templateId\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--display-name <name>\",\n description: \"What customers will see the plan called\",\n arg: \"displayName\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"plan-skip\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/plan/skip\",\n summary: \"Skip the plan step and come back to it later (step 3).\",\n options: [],\n },\n {\n name: \"test-esim\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/test-esim\",\n summary:\n \"Read back one eSIM from the connected fleet (step 4). Nothing is provisioned; a demo ICCID with a reason comes back if OCS has nothing to show.\",\n options: [],\n },\n {\n name: \"complete\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/complete\",\n summary: \"Mark onboarding done (step 5).\",\n options: [],\n },\n ],\n },\n // <generated:catalog-domains>\n // Generated from the MCP catalog by scripts/generate-domains.mjs. Do not edit by hand:\n // rebuild the server, re-run the generator, and review the diff.\n {\n name: \"billing\",\n summary: \"Carrier plan credits, spend thresholds and rate-limit state\",\n commands: [\n {\n name: \"events\",\n tool: \"billing_events\",\n summary: \"View recent billing threshold events: notifications, invoice triggers, hard cap alerts, and overage pauses.\",\n options: [\n {\n flags: \"--limit <n>\",\n description: \"Maximum number of events to return (default: 20, max: 50).\",\n arg: \"limit\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"configure\",\n tool: \"configure_billing\",\n summary: \"Configure your billing preferences: enable/disable overages, set billing thresholds (bill shock prevention), configure notification percentages, and set hard spending caps.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--overages-enabled <bool>\",\n description: \"Enable or disable auto-billed overages when monthly credits are exhausted.\",\n arg: \"overages_enabled\",\n type: \"boolean\",\n },\n {\n flags: \"--billing-threshold-cents <n>\",\n description: \"Amount in cents at which an invoice is automatically generated (e.g., 10000 = $100).\",\n arg: \"billing_threshold_cents\",\n type: \"number\",\n },\n {\n flags: \"--hard-cap-cents <n>\",\n description: \"Maximum overage spend in cents before overages are paused (0 = no cap).\",\n arg: \"hard_cap_cents\",\n type: \"number\",\n },\n {\n flags: \"--auto-pause-on-cap <bool>\",\n description: \"Whether to automatically pause overages when hard cap is reached.\",\n arg: \"auto_pause_on_cap\",\n type: \"boolean\",\n },\n {\n flags: \"--notify-at-pct <list>\",\n description: \"Percentage thresholds at which to send notifications (e.g., [50, 80, 95, 100]). Comma-separated.\",\n arg: \"notify_at_pct\",\n type: \"number[]\",\n },\n {\n flags: \"--notification-email <email>\",\n description: \"Email address for billing threshold notifications.\",\n arg: \"notification_email\",\n type: \"string\",\n },\n {\n flags: \"--notification-phone <phone>\",\n description: \"E.164 phone number for SMS billing threshold notifications via Twilio (e.g. +14155552671).\",\n arg: \"notification_phone\",\n type: \"string\",\n },\n {\n flags: \"--webhook-url <url>\",\n description: \"Webhook URL for billing threshold events.\",\n arg: \"webhook_url\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"credits\",\n tool: \"credit_balance\",\n summary: \"Read how much of this Carrier MCP plan is left: credits remaining, daily free credits, overage state, volume discount tier, and billing threshold state.\",\n options: [],\n },\n {\n name: \"plans\",\n tool: \"pricing_plans\",\n summary: \"View all available Carrier MCP pricing plans with credit allotments, features, overage rates, and volume discount tiers.\",\n options: [],\n },\n {\n name: \"projection\",\n tool: \"usage_projection\",\n summary: \"Project your credit usage and costs for the remainder of the billing period based on current consumption rate.\",\n options: [\n {\n flags: \"--days-to-project <n>\",\n description: \"Number of days to project forward (default: remaining days in month).\",\n arg: \"days_to_project\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"rate-limit\",\n tool: \"rate_limit_status\",\n summary: \"Inspect Bridge4IP OCS rate-limit governor state — bucket fill levels, per-endpoint limits, and 80% alert thresholds.\",\n options: [\n {\n flags: \"--endpoint <endpoint>\",\n description: \"OCS method name in camelCase (e.g. 'subscriberUsageOverPeriod').\",\n arg: \"endpoint\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"wallet\",\n summary: \"The Carrier prepaid wallet: balance and top-ups\",\n commands: [\n {\n name: \"balance\",\n tool: \"wallet_balance\",\n summary: \"Read the caller organisation's Carrier prepaid wallet: current balance and auto-top-up settings.\",\n options: [],\n },\n {\n name: \"topup\",\n tool: \"wallet_topup_checkout\",\n summary: \"Create a Stripe Checkout link so a human can top up the Carrier prepaid wallet by card.\",\n options: [\n {\n flags: \"--pack <pack>\",\n description: \"Pack id (pack_500/pack_1000/pack_2500/pack_5000) or exact EUR-cents amount.\",\n arg: \"pack\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"auto-topup\",\n tool: \"wallet_auto_topup\",\n summary: \"Charge the organisation's saved card off-session, right now, and credit the Carrier prepaid wallet with the pack.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--pack-cents <n>\",\n description: \"Override pack amount in EUR cents (must match a catalog pack).\",\n arg: \"pack_cents\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"stripe\",\n summary: \"Money in the operator's connected Stripe account\",\n commands: [\n {\n name: \"balance\",\n tool: \"stripe_connect_balance\",\n summary: \"Read the money sitting in the operator's connected Stripe account: available and pending, split per currency.\",\n options: [],\n },\n {\n name: \"payouts\",\n tool: \"stripe_connect_payouts\",\n summary: \"List money Stripe has already sent from the operator's connected account to their bank, newest first.\",\n options: [\n {\n flags: \"--limit <n>\",\n description: \"Number of payouts to return. Default 10.\",\n arg: \"limit\",\n type: \"number\",\n },\n {\n flags: \"--status <status>\",\n description: \"Filter by payout status. One of: pending, paid, failed, canceled, in_transit.\",\n arg: \"status\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"disputes\",\n tool: \"stripe_connect_dispute_list\",\n summary: \"List chargebacks customers have raised with their bank against the operator's connected Stripe account.\",\n options: [\n {\n flags: \"--limit <n>\",\n description: \"limit (number). Default 10.\",\n arg: \"limit\",\n type: \"number\",\n },\n {\n flags: \"--status <status>\",\n description: \"Filter by dispute status (e.g. needs_response, under_review).\",\n arg: \"status\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"refund\",\n tool: \"stripe_connect_refund\",\n summary: \"Refund money to a customer on one charge in the operator's connected Stripe account.\",\n options: [\n {\n flags: \"--charge-id <id>\",\n description: \"Stripe charge ID (ch_...).\",\n arg: \"charge_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--amount-cents <n>\",\n description: \"Partial refund amount in cents.\",\n arg: \"amount_cents\",\n type: \"number\",\n },\n {\n flags: \"--reason <reason>\",\n description: \"reason (string). One of: duplicate, fraudulent, requested_by_customer.\",\n arg: \"reason\",\n type: \"string\",\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"Confirmation token from previous call.\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"radar\",\n summary: \"Stripe Radar fraud reviews and value lists\",\n commands: [\n {\n name: \"reviews\",\n tool: \"radar_review_list\",\n summary: \"List the Stripe Radar fraud reviews waiting on a manual approve/decline decision, newest first.\",\n options: [\n {\n flags: \"--open-only <bool>\",\n description: \"If true, only returns open (undecided) reviews. Default true.\",\n arg: \"open_only\",\n type: \"boolean\",\n },\n {\n flags: \"--limit <n>\",\n description: \"limit (number). Default 10.\",\n arg: \"limit\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"approve\",\n tool: \"radar_review_approve\",\n summary: \"Clear a Stripe Radar fraud review so the held charge is captured and the money is taken.\",\n options: [\n {\n flags: \"--review-id <id>\",\n description: \"Stripe Radar review ID (prv_...).\",\n arg: \"review_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"confirm token (string).\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"decline\",\n tool: \"radar_review_decline\",\n summary: \"Close a Stripe Radar fraud review as fraudulent, so the held charge is blocked and the customer is never billed.\",\n options: [\n {\n flags: \"--review-id <id>\",\n description: \"review id (string).\",\n arg: \"review_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"confirm token (string).\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"rule-toggle\",\n tool: \"radar_rule_toggle\",\n summary: \"Report a Stripe Radar rule's state. Stripe exposes no API to change it, so this changes nothing.\",\n options: [\n {\n flags: \"--rule-id <id>\",\n description: \"Stripe Radar rule ID.\",\n arg: \"rule_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--enabled <bool>\",\n description: \"true = enable, false = disable.\",\n arg: \"enabled\",\n type: \"boolean\",\n required: true,\n },\n ],\n },\n {\n name: \"value-list add\",\n tool: \"radar_value_list_add\",\n summary: \"Add one value to an existing Stripe Radar value list, changing how every future charge is scored.\",\n options: [\n {\n flags: \"--value-list-id <id>\",\n description: \"Stripe Radar value list ID (rsl_...).\",\n arg: \"value_list_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--value <value>\",\n description: \"The value to add (email, IP address, country code, etc.).\",\n arg: \"value\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"confirm token (string).\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"greenzone\",\n summary: \"The Bridge4IP Greenzone whitelist\",\n commands: [\n {\n name: \"list\",\n tool: \"greenzone_whitelist_list\",\n summary: \"List current Greenzone whitelist entries from the KV cache.\",\n options: [\n {\n flags: \"--from-portal <bool>\",\n description: \"When true, return Kapture steps to read live portal state instead of KV cache.\",\n arg: \"from_portal\",\n type: \"boolean\",\n },\n ],\n },\n {\n name: \"add\",\n tool: \"greenzone_whitelist_add\",\n summary: \"Add a host or IP to the Greenzone whitelist. Needs Kapture running in the operator's own Chrome — without it the dry run still returns the portal steps to follow by hand.\",\n write: true,\n options: [\n {\n flags: \"--host <host>\",\n description: \"Hostname to whitelist (e.g. 'example.com').\",\n arg: \"host\",\n type: \"string\",\n },\n {\n flags: \"--ip <ip>\",\n description: \"IP address or CIDR to whitelist (e.g. '203.0.113.0/24').\",\n arg: \"ip\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"remove\",\n tool: \"greenzone_whitelist_remove\",\n summary: \"Remove a host or IP from the Greenzone whitelist. Needs Kapture running in the operator's own Chrome — without it the dry run still returns the portal steps to follow by hand.\",\n write: true,\n options: [\n {\n flags: \"--host <host>\",\n description: \"Hostname to remove from whitelist.\",\n arg: \"host\",\n type: \"string\",\n },\n {\n flags: \"--ip <ip>\",\n description: \"IP address or CIDR to remove from whitelist.\",\n arg: \"ip\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"agent\",\n summary: \"Steel browsing agents: one-off tasks and cron schedules\",\n commands: [\n {\n name: \"ask\",\n tool: \"ui_agent_ask\",\n summary: \"Send a plain-language task to a Steel browsing agent, which drives a real browser on the open web — navigating pages, searching via Tavily, extracting content, filling forms outside the OCS portal.\",\n write: true,\n options: [\n {\n flags: \"--prompt <prompt>\",\n description: \"Natural-language task description for the Steel browsing agent.\",\n arg: \"prompt\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--max-steps <n>\",\n description: \"Maximum agent steps (1–30, default 15).\",\n arg: \"max_steps\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"status\",\n tool: \"ui_agent_status\",\n summary: \"Poll the status of a Steel browser agent task dispatched by ui_agent_ask or any ui_* tool.\",\n options: [\n {\n flags: \"--task-id <id>\",\n description: \"Steel task ID returned by ui_agent_ask or any ui_* tool dispatch.\",\n arg: \"task_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"pending\",\n tool: \"ui_agent_list_pending\",\n summary: \"Returns all Steel browser automation tasks that are currently paused waiting for human input (stop_reason 'ask').\",\n options: [],\n },\n {\n name: \"reply\",\n tool: \"ui_agent_reply\",\n summary: \"Resumes a Steel browser automation task that paused with stop_reason 'ask'.\",\n options: [\n {\n flags: \"--task-id <id>\",\n description: \"Steel task ID to resume (from ui_agent_list_pending).\",\n arg: \"task_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--reply <reply>\",\n description: \"Your answer to the agent's question (e.g. a 2FA code or confirmation).\",\n arg: \"reply\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"usage\",\n tool: \"ui_agent_usage\",\n summary: \"Returns an estimated Anthropic API cost for Steel agent tasks dispatched this calendar month.\",\n options: [],\n },\n {\n name: \"schedule list\",\n tool: \"ui_agent_schedule_list\",\n summary: \"Lists all Steel recurring schedules stored in KV.\",\n options: [],\n },\n {\n name: \"schedule create\",\n tool: \"ui_agent_schedule_create\",\n summary: \"Creates a recurring Steel agent run on a cron schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Human-readable name for this schedule.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--cron <cron>\",\n description: \"Standard 5-field cron expression (minute hour day month weekday).\",\n arg: \"cron\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--prompt-template <template>\",\n description: \"Agent prompt/task template the Steel agent will execute on each run.\",\n arg: \"prompt_template\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"schedule pause\",\n tool: \"ui_agent_schedule_pause\",\n summary: \"Pauses an active Steel recurring schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--schedule-id <id>\",\n description: \"ID of the schedule to pause.\",\n arg: \"schedule_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"schedule resume\",\n tool: \"ui_agent_schedule_resume\",\n summary: \"Resumes a paused Steel recurring schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--schedule-id <id>\",\n description: \"ID of the schedule to resume.\",\n arg: \"schedule_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"schedule delete\",\n tool: \"ui_agent_schedule_delete\",\n summary: \"Permanently deletes a Steel recurring schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--schedule-id <id>\",\n description: \"ID of the schedule to delete.\",\n arg: \"schedule_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n ],\n },\n {\n name: \"portal\",\n summary: \"OCS portal changes that only exist in the web UI, driven by Kapture\",\n commands: [\n {\n name: \"account create\",\n tool: \"ui_create_account\",\n summary: \"Creates a new sub-account under the reseller via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Name for the new account.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--description <description>\",\n description: \"Optional description.\",\n arg: \"description\",\n type: \"string\",\n },\n {\n flags: \"--initial-balance <n>\",\n description: \"Initial balance in account currency (default 0).\",\n arg: \"initial_balance\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"steering build\",\n tool: \"ui_build_steering_list\",\n summary: \"Change which mobile operators sit on a steering list that already exists, by driving the OCS web dashboard — the OCS REST API cannot edit list membership.\",\n write: true,\n options: [\n {\n flags: \"--steering-list-id <n>\",\n description: \"ID of the steering list to modify.\",\n arg: \"steering_list_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--add-operators <list>\",\n description: \"MCC-MNC codes to add (e.g. ['20801', '26201']). Comma-separated.\",\n arg: \"add_operators\",\n type: \"string[]\",\n },\n {\n flags: \"--remove-operators <list>\",\n description: \"MCC-MNC codes to remove. Comma-separated.\",\n arg: \"remove_operators\",\n type: \"string[]\",\n },\n {\n flags: \"--operator-type <type>\",\n description: \"Whether operators are priority or excluded. One of: priority, excluded. Default \\\"priority\\\".\",\n arg: \"operator_type\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"steering create\",\n tool: \"ui_create_steering_list\",\n summary: \"Create a new, empty network steering list (OPLMN preference set) by driving the OCS web dashboard, because the OCS REST API cannot create one.\",\n write: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Name for the new steering list.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--description <description>\",\n description: \"Optional description for the steering list.\",\n arg: \"description\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"steering set-account\",\n tool: \"ui_set_account_steering_list\",\n summary: \"Assigns or removes a steering list at the account level via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--account-id <n>\",\n description: \"Account ID to assign the steering list to.\",\n arg: \"account_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--steering-list-id <n>\",\n description: \"Steering list ID to assign (0 to remove/unset).\",\n arg: \"steering_list_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n {\n name: \"destinations create\",\n tool: \"ui_create_destination_list\",\n summary: \"Creates a new destination list (named set of phone number prefixes for MOC call permissions) via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Name for the new destination list.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--prefixes <list>\",\n description: \"Phone number prefixes to include (e.g. ['+31', '+49']). Comma-separated.\",\n arg: \"prefixes\",\n type: \"string[]\",\n },\n {\n flags: \"--description <description>\",\n description: \"Optional description.\",\n arg: \"description\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"destinations edit\",\n tool: \"ui_edit_destination_list\",\n summary: \"Edits an existing destination list via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--destination-list-id <n>\",\n description: \"ID of the destination list to edit.\",\n arg: \"destination_list_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--add-prefixes <list>\",\n description: \"Prefixes to add. Comma-separated.\",\n arg: \"add_prefixes\",\n type: \"string[]\",\n },\n {\n flags: \"--remove-prefixes <list>\",\n description: \"Prefixes to remove. Comma-separated.\",\n arg: \"remove_prefixes\",\n type: \"string[]\",\n },\n {\n flags: \"--new-name <name>\",\n description: \"Rename the destination list.\",\n arg: \"new_name\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"destinations delete\",\n tool: \"ui_delete_destination_list\",\n summary: \"Delete a destination list — a named set of phone-number prefixes — by driving the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--destination-list-id <n>\",\n description: \"ID of the destination list to delete.\",\n arg: \"destination_list_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n {\n name: \"zones edit\",\n tool: \"ui_edit_location_zone\",\n summary: \"Edits an existing location zone via the OCS web dashboard. `create_location_zone` is available via API; edit is UI-only.\",\n write: true,\n options: [\n {\n flags: \"--zone-id <n>\",\n description: \"ID of the location zone to edit.\",\n arg: \"zone_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--new-name <name>\",\n description: \"Rename the location zone.\",\n arg: \"new_name\",\n type: \"string\",\n },\n {\n flags: \"--add-countries <list>\",\n description: \"ISO country codes to add (e.g. ['NL', 'DE']). Comma-separated.\",\n arg: \"add_countries\",\n type: \"string[]\",\n },\n {\n flags: \"--remove-countries <list>\",\n description: \"ISO country codes to remove. Comma-separated.\",\n arg: \"remove_countries\",\n type: \"string[]\",\n },\n ],\n },\n {\n name: \"zones delete\",\n tool: \"ui_delete_location_zone\",\n summary: \"Delete a location zone by driving the OCS web dashboard, because the OCS REST API can create a zone (`create_location_zone`) but not remove one.\",\n write: true,\n options: [\n {\n flags: \"--zone-id <n>\",\n description: \"ID of the location zone to delete.\",\n arg: \"zone_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n {\n name: \"templates delete\",\n tool: \"ui_delete_package_template\",\n summary: \"Remove a package template from the reseller's product catalogue for good, by driving the OCS web dashboard — the OCS REST API cannot delete a template.\",\n write: true,\n options: [\n {\n flags: \"--template-id <n>\",\n description: \"ID of the package template to delete.\",\n arg: \"template_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n ],\n },\n {\n name: \"events\",\n summary: \"Buffered OCS event history per subscriber\",\n commands: [\n {\n name: \"ocs\",\n tool: \"list_recent_ocs_events\",\n summary: \"Return the last N OCS events buffered for a given ICCID.\",\n options: [\n {\n flags: \"--iccid <iccid>\",\n description: \"ICCID, 19 or 20 digits, ITU-T E.118 format.\",\n arg: \"iccid\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--limit <n>\",\n description: \"Max events to return, newest first. Default 20.\",\n arg: \"limit\",\n type: \"number\",\n },\n {\n flags: \"--event-types <list>\",\n description: \"Filter to specific event types. Comma-separated.\",\n arg: \"event_types\",\n type: \"string[]\",\n },\n {\n flags: \"--since <since>\",\n description: \"ISO-8601 timestamp; only events after this point.\",\n arg: \"since\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"countries\",\n tool: \"subscriber_country_history\",\n summary: \"Return cross-border movement history for a subscriber from Relay LU events.\",\n options: [\n {\n flags: \"--subscriber-id <id>\",\n description: \"Subscriber ICCID (19–20 digits, ITU-T E.118).\",\n arg: \"subscriberId\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--limit <n>\",\n description: \"Maximum number of events to return, newest first (default 20, max 50). Default 20.\",\n arg: \"limit\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"depletion\",\n tool: \"subscriber_depletion_events\",\n summary: \"Look up bundle depletion events for a subscriber (or list recent fleet-wide depletions).\",\n options: [\n {\n flags: \"--subscriber-id <id>\",\n description: \"OCS subscriber ID to look up.\",\n arg: \"subscriberId\",\n type: \"string\",\n },\n {\n flags: \"--since <since>\",\n description: \"ISO-8601 timestamp — only return events at or after this time (for single-subscriber lookup).\",\n arg: \"since\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"panels\",\n summary: \"MCP UI surfaces. A terminal sees the underlying data, not the panel.\",\n commands: [\n {\n name: \"fleet\",\n tool: \"fleet_health_app\",\n summary: \"Fleet overview as a UI panel. Prefer `carrier intelligence fleet-health` in a terminal; use --json to read the panel's data.\",\n options: [\n {\n flags: \"--account-id <n>\",\n description: \"Filter to a specific account (omit for all).\",\n arg: \"accountId\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"topup\",\n tool: \"balance_topup_form\",\n summary: \"Adjust the OCS account balance behind one subscriber. Previews unless --preview false.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--iccid <iccid>\",\n description: \"The subscriber ICCID for the account lookup.\",\n arg: \"iccid\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--delta <n>\",\n description: \"Amount to add (positive) or deduct (negative) from the account balance.\",\n arg: \"delta\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--preview <bool>\",\n description: \"If true, return preview without writing. Default true.\",\n arg: \"preview\",\n type: \"boolean\",\n },\n ],\n },\n {\n name: \"provision\",\n tool: \"provision_esim_wizard\",\n summary: \"Step through the provisioning wizard. Pass --step confirm to execute; every earlier step only reads.\",\n options: [\n {\n flags: \"--step <step>\",\n description: \"Current wizard step. One of: init, select-package, preview, confirm.\",\n arg: \"step\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--wizard-id <id>\",\n description: \"Wizard session ID (absent on init).\",\n arg: \"wizardId\",\n type: \"string\",\n },\n {\n flags: \"--subscriber-iccid <iccid>\",\n description: \"Subscriber ICCID (required for select-package).\",\n arg: \"subscriber_iccid\",\n type: \"string\",\n },\n {\n flags: \"--package-template-id <n>\",\n description: \"Package template ID (required for preview).\",\n arg: \"package_template_id\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"env\",\n summary: \"This environment: credentials, catalog and machine-readable context\",\n commands: [\n {\n name: \"info\",\n tool: \"environment_info\",\n summary: \"View your Carrier environment configuration — active organization, reseller details, connected services, and deployment environment.\",\n options: [],\n },\n {\n name: \"credentials\",\n tool: \"credential_status\",\n summary: \"Report on the stored eSIMVault credential without changing it: whether a token is present, whether it is encrypted, how old it is, and whether rotation is recommended (over 90 days).\",\n options: [],\n },\n {\n name: \"rotate\",\n tool: \"rotate_credentials\",\n summary: \"Replace the stored eSIMVault API token with one you supply.\",\n options: [\n {\n flags: \"--new-token <token>\",\n description: \"New eSIMVault API token to encrypt and store.\",\n arg: \"new_token\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm <bool>\",\n description: \"Confirm rotation — this will replace the current token immediately.\",\n arg: \"confirm\",\n type: \"boolean\",\n required: true,\n },\n ],\n },\n {\n name: \"catalog\",\n tool: \"service_catalog\",\n summary: \"Browse the Carrier service catalog — discover available services, their requirements, endpoints, and documentation.\",\n options: [\n {\n flags: \"--category <category>\",\n description: \"Filter services by category. One of: connectivity, analytics, marketplace, coverage, billing, integration, dashboard.\",\n arg: \"category\",\n type: \"string\",\n },\n {\n flags: \"--tier <tier>\",\n description: \"Filter services accessible at this tier level. One of: free, pro, enterprise.\",\n arg: \"tier\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"llm-context\",\n tool: \"llm_context\",\n summary: \"Generate a comprehensive LLM context document describing your Carrier environment, available tools, current tier, usage patterns, and best practices.\",\n options: [\n {\n flags: \"--format <format>\",\n description: \"Output format for the context document (default: markdown). One of: markdown, json, yaml.\",\n arg: \"format\",\n type: \"string\",\n },\n {\n flags: \"--include-examples <bool>\",\n description: \"Include example tool invocations (default: true).\",\n arg: \"include_examples\",\n type: \"boolean\",\n },\n ],\n },\n {\n name: \"describe\",\n tool: \"carrier_ask_describe\",\n summary: \"Get full documentation for any registered Carrier MCP tool: description, parameters, 2-3 example invocations, required scope, destructive flag, and guidance.\",\n options: [\n {\n flags: \"--tool-name <name>\",\n description: \"The exact MCP tool name to describe (e.g. 'assign_package', 'hlr_set_bitrate').\",\n arg: \"tool_name\",\n type: \"string\",\n required: true,\n },\n ],\n },\n ],\n },\n {\n name: \"brand\",\n summary: \"Storefront brand assets\",\n commands: [\n {\n name: \"logo\",\n tool: \"generate_storefront_logo\",\n summary: \"Generate a storefront logo (SVG always; PNG when an image key is configured on the Carrier worker).\",\n options: [\n {\n flags: \"--name <name>\",\n description: \"Brand / shop name, e.g. Bananas.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--accent <accent>\",\n description: \"Accent hex, e.g. #FF8A00.\",\n arg: \"accent\",\n type: \"string\",\n },\n {\n flags: \"--tagline <tagline>\",\n description: \"Optional tagline for AI-enhanced marks.\",\n arg: \"tagline\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n // </generated:catalog-domains>\n];\n\n/**\n * Every MCP tool the discrete commands can reach.\n *\n * REST-transport commands name no tool and are absent by design — the parity\n * test that consumes this must not expect them.\n */\nexport function capabilityToolNames(): string[] {\n return CLI_DOMAINS.flatMap((d) =>\n d.commands.filter((c) => c.transport !== \"rest\").map((c) => (c as McpCapabilityCommand).tool),\n );\n}\n\n/** Every REST endpoint the discrete commands can reach, as \"METHOD /path\". */\nexport function capabilityRestEndpoints(): Array<{ method: RestMethod; path: string }> {\n return CLI_DOMAINS.flatMap((d) =>\n d.commands\n .filter((c): c is RestCapabilityCommand => c.transport === \"rest\")\n .map((c) => ({ method: c.restMethod, path: c.restPath })),\n );\n}\n\n/** Label for a command in spinners, notes and errors. */\nexport function capabilityTarget(cmd: CapabilityCommand): string {\n return cmd.transport === \"rest\" ? `${cmd.restMethod} ${cmd.restPath}` : cmd.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 { callRestEndpoint } from \"./rest.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { capabilityTarget } from \"./domains.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 /** Second-call token for REST endpoints that answered 202. */\n confirmToken?: string;\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 if (opt.type === \"string[]\" || opt.type === \"number[]\") {\n // One flag, commas inside. A list tool argument has no other shape a shell\n // can pass without quoting rules nobody remembers.\n const items = String(raw)\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (!items.length) return { error: `${opt.flags} expects a comma-separated list, got \"${String(raw)}\"` };\n if (opt.type === \"string[]\") return { value: items };\n const numbers = items.map(Number);\n const bad = items.find((_, i) => !Number.isFinite(numbers[i]!));\n if (bad !== undefined) return { error: `${opt.flags} expects numbers, got \"${bad}\"` };\n return { value: numbers };\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 // dry_run is an MCP tool argument. REST endpoints have no such field, so\n // sending it would either 400 or be silently ignored — on a write, silently\n // ignored means the change lands. There, --commit is the gate instead.\n if (cmd.write && cmd.transport !== \"rest\") args.dry_run = true;\n return { args, errors, notes };\n}\n\n/**\n * Keep already-structured tool responses unchanged, but make text-only MCP\n * successes valid JSON so every --json stdout value can be consumed by jq.\n */\nexport function formatJsonOutput(text: string): string {\n try {\n JSON.parse(text);\n return text;\n } catch {\n return JSON.stringify(text);\n }\n}\n\n/**\n * Run one domain subcommand against whichever transport it names.\n *\n * Write commands preview unless --commit is passed, so a mistyped ICCID costs\n * nothing: MCP tools by sending dry_run, REST endpoints by printing the request\n * without sending it.\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 // Tools with no dry_run, confirm or confirm_token of their own do the thing on\n // the first call. --confirm is read straight off `opts` rather than through\n // CapabilityFlags, because a tool with a real `confirm` argument registers the\n // same flag as a value-taking option; `requireConfirm` and that argument are\n // mutually exclusive, and the generator refuses to emit both.\n if (cmd.requireConfirm && opts.confirm !== true) {\n errors.push(`${capabilityTarget(cmd)} has no preview mode. Pass --confirm to run it for real.`);\n }\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 if (cmd.transport === \"rest\" && cmd.write && opts.commit !== true) {\n const preview = [\n `${cmd.restMethod} ${cmd.restPath}`,\n JSON.stringify(args, null, 2),\n \"\",\n \"Dry run — nothing sent. Re-run with --commit to apply.\",\n ].join(\"\\n\");\n if (quiet) process.stdout.write(`${formatJsonOutput(preview)}\\n`);\n else p.note(preview, `carrier ${label}`);\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 target = capabilityTarget(cmd);\n const errorHints = [\n `Check the arguments: carrier ${label} --help`,\n 'Or describe the task in words: carrier ask \"…\"',\n ];\n\n const s = quiet ? null : p.spinner();\n s?.start(`Calling ${target}`);\n const result =\n cmd.transport === \"rest\"\n ? await callRestEndpoint(cmd.restMethod, cmd.restPath, args, {\n errorHints,\n confirmToken: opts.confirmToken,\n })\n : await callMcpTool(cmd.tool, args, { errorHints });\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(`${formatJsonOutput(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, target);\n}\n\n/**\n * Read one `--arg` value.\n *\n * JSON where JSON is unambiguous, text otherwise. A number is only taken as a\n * number when it round-trips exactly: an ICCID is 19 digits of significant\n * decimal, which a double silently rounds, and the tool would then look up a\n * subscriber nobody asked about.\n */\nfunction parseArgValue(text: string): unknown {\n if (text === \"true\") return true;\n if (text === \"false\") return false;\n if (text === \"null\") return null;\n if (/^[[{\"]/.test(text)) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n if (/^-?\\d+(?:\\.\\d+)?$/.test(text)) {\n const n = Number(text);\n if (Number.isFinite(n) && String(n) === text) return n;\n }\n return text;\n}\n\n/**\n * Call one tool by name with raw arguments.\n *\n * Every registered tool has a generated command, but a command is only as good\n * as the schema it was built from, and a tool added since the last\n * `generate:domains` run has no command at all. This is the floor under that:\n * whatever the registry misses, `carrier tool <name>` still reaches.\n *\n * Nothing is validated beyond the key=value shape. The server rejects a bad\n * argument with a better message than the CLI could guess, and `dry_run` is not\n * injected — pass `--arg dry_run=true` to preview.\n */\nexport async function runRawTool(\n name: string,\n pairs: string[],\n opts: CapabilityFlags,\n): Promise<void> {\n const quiet = opts.json === true;\n const args: Record<string, unknown> = {};\n const errors: string[] = [];\n\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq < 1) {\n errors.push(`--arg ${pair} is not key=value`);\n continue;\n }\n setArg(args, pair.slice(0, eq), parseArgValue(pair.slice(eq + 1)));\n }\n\n if (errors.length) {\n const message = withNextStep(`Cannot call \\`${name}\\`.`, [\n ...errors,\n \"Arguments look like: --arg iccid=8931000000000000000 --arg limit=20\",\n ]);\n if (quiet) console.error(message);\n else p.log.error(message);\n process.exitCode = 1;\n return;\n }\n\n const s = quiet ? null : p.spinner();\n s?.start(`Calling ${name}`);\n const result = await callMcpTool(name, args, {\n errorHints: [\n \"List every tool this server registers: carrier env catalog\",\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(`${formatJsonOutput(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, name);\n}\n","import { API_URL } from \"./urls.js\";\nimport { getAccessToken } from \"./auth.js\";\nimport { redact } from \"./credentials.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { mcpTimeoutMs, type AskResult } from \"./ask.js\";\nimport { CARRIER_VERSION } from \"../../version.js\";\nimport type { RestMethod } from \"./domains.js\";\n\nexport interface RestCallOptions {\n /** Recovery steps appended when the endpoint itself reports an error. */\n errorHints?: string[];\n /** Second-call token from a prior 202, sent as X-Confirm-Token. */\n confirmToken?: 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\n/**\n * Bearer for `apps/api`, which is Clerk-only.\n *\n * `resolveCliToken()` from status.ts is deliberately NOT reused here: it falls\n * back to ESIMVAULT_API_TOKEN / CARRIER_OCS_API_TOKEN, and `apps/api/src/auth.ts`\n * accepts none of those — an OCS token would come back as a bare 401 that reads\n * like an expired login rather than the wrong credential entirely.\n */\nfunction resolveApiKey(): string | null {\n return (\n process.env.CARRIER_API_KEY?.trim() ||\n process.env.CARRIER_ORG_API_KEY?.trim() ||\n null\n );\n}\n\nfunction ocsTokenOnly(): boolean {\n return Boolean(\n process.env.ESIMVAULT_API_TOKEN?.trim() || process.env.CARRIER_OCS_API_TOKEN?.trim(),\n );\n}\n\n/** Fill `{name}` placeholders from args; return the rest for body or query. */\nfunction applyPath(\n path: string,\n args: Record<string, unknown>,\n): { path: string; rest: Record<string, unknown>; missing: string[] } {\n const rest = { ...args };\n const missing: string[] = [];\n const filled = path.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = rest[name];\n if (value === undefined || value === null || value === \"\") {\n missing.push(name);\n return `{${name}}`;\n }\n delete rest[name];\n return encodeURIComponent(String(value));\n });\n return { path: filled, rest, missing };\n}\n\nfunction queryString(args: Record<string, unknown>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(args)) {\n if (value === undefined || value === null) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction bodyText(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return \"\";\n try {\n const parsed = JSON.parse(trimmed) as { error?: unknown; message?: unknown };\n if (typeof parsed.error === \"string\") return parsed.error;\n if (typeof parsed.message === \"string\") return parsed.message;\n return trimmed;\n } catch {\n return trimmed;\n }\n}\n\n/**\n * Call one Carrier REST endpoint, returning the same shape as `callMcpTool` so\n * `runCapability` stays a single branch.\n *\n * The 202 + `confirm_token` handshake in `apps/api/src/confirm-token.ts` is\n * surfaced, not followed: the point of that protocol is that a human re-issues\n * the call, so auto-retrying it here would defeat the gate.\n */\nexport async function callRestEndpoint(\n method: RestMethod,\n path: string,\n args: Record<string, unknown>,\n opts: RestCallOptions = {},\n): Promise<AskResult> {\n const token = resolveApiKey() ?? (await getAccessToken());\n if (!token) {\n return {\n ok: false,\n text: withNextStep(\n ocsTokenOnly()\n ? \"Not signed in. An eSIMVault/OCS token is set, but the Carrier API only accepts Carrier credentials.\"\n : \"Not signed in.\",\n [\n \"Sign in from this terminal: carrier login\",\n \"No account yet? carrier open signup\",\n \"Headless/CI instead: export CARRIER_API_KEY=ak_… from Console → Settings → API Keys\",\n ],\n ),\n };\n }\n\n const { path: resolvedPath, rest, missing } = applyPath(path, args);\n if (missing.length) {\n return {\n ok: false,\n text: withNextStep(`Cannot build ${method} ${path}.`, [\n `Missing path value(s): ${missing.join(\", \")}`,\n \"See every flag: carrier <domain> <command> --help\",\n ]),\n };\n }\n\n const sendsBody = method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n const url = `${API_URL}${resolvedPath}${sendsBody ? \"\" : queryString(rest)}`;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n Accept: \"application/json\",\n \"User-Agent\": `carrier-cli/${CARRIER_VERSION}`,\n };\n if (sendsBody) headers[\"Content-Type\"] = \"application/json\";\n if (opts.confirmToken) headers[\"X-Confirm-Token\"] = opts.confirmToken;\n\n const timeoutMs = mcpTimeoutMs();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method,\n headers,\n signal: controller.signal,\n body: sendsBody ? JSON.stringify(rest) : undefined,\n });\n const raw = await res.text();\n\n // Two-step confirm. The token is single-use and expires in ~2 minutes.\n if (res.status === 202) {\n let confirmToken: string | undefined;\n let expires: number | undefined;\n let message = \"\";\n try {\n const parsed = JSON.parse(raw) as {\n confirm_token?: string;\n expires_in_seconds?: number;\n message?: string;\n };\n confirmToken = parsed.confirm_token;\n expires = parsed.expires_in_seconds;\n message = parsed.message ?? \"\";\n } catch {\n // Not JSON — fall through to the generic hint below.\n }\n return {\n ok: false,\n text: withNextStep(\n message || `${method} ${path} needs an explicit confirmation.`,\n confirmToken\n ? [\n `Re-run the same command with: --confirm-token ${confirmToken}`,\n `The token is single-use and expires in ${expires ?? 120}s.`,\n ]\n : [\"The server asked for confirmation but returned no token — retry the command.\"],\n ),\n };\n }\n\n if (res.status === 401 || res.status === 403) {\n return {\n ok: false,\n text: withNextStep(\n `Carrier API returned ${res.status} (auth rejected).`,\n [\n \"Confirm CARRIER_API_KEY is a valid org key (ak_…) from app.carrier.llc\",\n \"Or sign in from this terminal: carrier login\",\n ...(res.status === 403 ? [\"A 403 here usually means the key lacks write scope.\"] : []),\n ],\n ),\n };\n }\n\n if (!res.ok) {\n return {\n ok: false,\n text: withNextStep(\n redact(`${method} ${path} failed (${res.status}). ${bodyText(raw).slice(0, 500)}`),\n opts.errorHints ?? DEFAULT_ERROR_HINTS,\n ),\n };\n }\n\n // 2xx. Hand the body back untouched so --json stays pipeable; whatever the\n // endpoint chose to return, including a one-time secret, is the caller's.\n return { ok: true, text: raw.trim() || JSON.stringify({ status: res.status }) };\n } catch (e: unknown) {\n const aborted = e instanceof Error && (e.name === \"AbortError\" || e.name === \"TimeoutError\");\n if (aborted) {\n const secs = Math.round(timeoutMs / 1000);\n return {\n ok: false,\n text: withNextStep(`${method} ${path} timed out after ${secs}s (no response).`, [\n `Raise the deadline for one slow call: CARRIER_MCP_TIMEOUT_MS=${timeoutMs * 2} carrier …`,\n \"Confirm the service is up: check network access to https://api.carrier.llc\",\n ]),\n };\n }\n const msg = e instanceof Error ? e.message : String(e);\n return {\n ok: false,\n text: withNextStep(redact(`Could not reach the Carrier API: ${msg}`), [\n \"Verify outbound HTTPS to api.carrier.llc\",\n \"Use the interactive Claude path while offline from this machine\",\n ]),\n };\n } finally {\n clearTimeout(timer);\n }\n}\n"],"mappings":"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","names":["p","pc","resolve","join","join","join","join","writeFile","join","join","writeFile","p","homedir","join","join","homedir","plugin","ok","pc","homedir","join","mkdir","readFile","writeFile","text","text","port","resolve","text","p","ok","pc","password","p","pc","DEFAULT_ERROR_HINTS","text","note","pc","pc","resolve","login","rows","mark"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/lib/plugin.ts","../src/cli/lib/paths.ts","../src/cli/lib/urls.ts","../src/cli/lib/whitelabel.ts","../src/cli/lib/logo.ts","../src/cli/lib/dash.ts","../src/cli/lib/status.ts","../src/cli/lib/guidance.ts","../src/cli/lib/home.ts","../src/cli/lib/auth.ts","../src/cli/lib/credentials.ts","../src/cli/lib/ask.ts","../src/cli/lib/signup.ts","../src/cli/lib/domains.ts","../src/cli/lib/capability.ts","../src/cli/lib/rest.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 {\n isTargetId,\n probeAll,\n rankTargets,\n rollback,\n TARGET_IDS,\n type TargetId,\n} from \"./lib/deploy-targets.js\";\nimport { formatProbes, repairPlanFor, verifyStorefront } from \"./lib/verify-storefront.js\";\nimport {\n configureClerkInstance,\n provisionClerk,\n storefrontClerkUrls,\n} from \"./lib/clerk.js\";\nimport { clerkCliDeps } from \"./lib/clerk-cli.js\";\nimport { mergeEnvLocal } from \"./lib/storefront-secrets.js\";\nimport { renderTui } from \"@carrier/screens\";\nimport {\n buildDashScreen,\n DASH_DOMAINS,\n DASH_TOOL,\n isDashDomain,\n screenFromStructured,\n} from \"./lib/dash.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 withNextStep,\n} from \"./lib/guidance.js\";\nimport { runHome, printStatus } from \"./lib/home.js\";\nimport { carrierAsk, callMcpTool } from \"./lib/ask.js\";\nimport { login as oauthLogin, logout as oauthLogout } from \"./lib/auth.js\";\nimport { signup as headlessSignup, type SignupIO } from \"./lib/signup.js\";\nimport { CLI_DOMAINS } from \"./lib/domains.js\";\nimport { runCapability, runRawTool, 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\n/**\n * Resolve which target to build for before building, because Cloudflare needs a\n * different build script (`cf:build`) than everything else. With no explicit\n * preference this is the same target the deploy step will pick.\n */\nasync function resolveBuildTarget(\n storefront: string,\n preferred?: TargetId,\n): Promise<TargetId> {\n if (preferred) return preferred;\n const ranked = rankTargets(await probeAll(storefront));\n return ranked[0]?.id ?? \"cloudflare\";\n}\n\nasync function maybeBuildDeploy(\n target: string,\n brand: Brand,\n opts: {\n install: boolean;\n build: boolean;\n deploy: boolean;\n preferred?: TargetId;\n pushSecrets?: boolean;\n clerk?: boolean;\n verify?: boolean;\n autofixAgent?: boolean;\n customDomain?: boolean;\n },\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 const buildTarget = await resolveBuildTarget(target, opts.preferred);\n\n if (opts.clerk) await runClerkStep(target, brand);\n\n if (opts.build) {\n const s = p.spinner();\n s.start(`Building storefront for ${buildTarget}`);\n const okb = await buildSite(target, buildTarget);\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\");\n const r = await deploySite(target, brand, {\n preferred: opts.preferred,\n pushSecrets: opts.pushSecrets,\n customDomain: opts.customDomain,\n });\n s.stop(r.ok ? `Deployed to ${r.target}: ${r.url ?? r.projectName}` : \"Deploy skipped\");\n\n if (!r.ok) {\n if (r.reason) info(pc.yellow(r.reason));\n const hints = r.statuses\n .filter((t) => !t.ready && t.reason)\n .map((t) => `${t.label}: ${t.reason}`);\n p.note(\n [...(hints.length ? hints : [\"Log in to a supported host, then retry.\"]), `Then: carrier site deploy ${target}`].join(\"\\n\"),\n \"Next\",\n );\n return;\n }\n\n if (r.secrets) {\n if (r.secrets.pushed.length) info(pc.dim(`Secrets staged: ${r.secrets.pushed.join(\", \")}`));\n if (r.secrets.failed.length) {\n info(pc.yellow(`Secrets that failed to stage: ${r.secrets.failed.join(\", \")}`));\n }\n }\n // The catalog pages throw without this, and the failure only shows at runtime.\n if (!r.secrets?.pushed.includes(\"CARRIER_API_KEY\")) {\n info(\n pc.yellow(\n \"CARRIER_API_KEY was not staged — / and /shop will return 500. Set it in .env.local and redeploy.\",\n ),\n );\n }\n if (r.url) info(pc.green(r.url));\n\n // Second Clerk pass: only now does the deployed origin exist to whitelist.\n if (opts.clerk && r.url) {\n const secretKey = process.env.CLERK_SECRET_KEY?.trim();\n if (secretKey) {\n const { allowedOrigins, redirectUrls } = storefrontClerkUrls(r.url, brand.domain);\n const configured = await configureClerkInstance(secretKey, { allowedOrigins, redirectUrls });\n if (configured.applied.length) {\n info(pc.dim(`Clerk now allows the deployed origin (${configured.applied.length} settings)`));\n }\n for (const f of configured.failed) info(pc.yellow(`Clerk ${f.step}: ${f.reason}`));\n }\n }\n\n if (opts.verify !== false && r.url && r.target) {\n await verifyAndRepair(target, brand, r.url, r.target, r.projectName, opts);\n }\n }\n}\n\n/**\n * Confirm the deployed storefront serves, and repair it once if it does not.\n *\n * Bounded on purpose: probe, one deterministic repair, re-probe, then stop. A\n * loop here would hammer a host while an operator is not watching, and the\n * second failure of the same repair means the diagnosis was wrong, not that it\n * needs another go.\n */\nasync function verifyAndRepair(\n storefront: string,\n brand: Brand,\n url: string,\n targetId: TargetId,\n projectName: string,\n opts: { preferred?: TargetId; pushSecrets?: boolean; autofixAgent?: boolean },\n): Promise<void> {\n const s = p.spinner();\n s.start(\"Verifying the deployed storefront\");\n let result = await verifyStorefront(url, storefront, process.env);\n s.stop(result.ok ? \"Storefront is serving\" : `Storefront is not serving — ${result.diagnosis}`);\n info(pc.dim(formatProbes(result.probes)));\n\n if (result.ok) return;\n info(pc.yellow(result.summary));\n\n const plan = repairPlanFor(result.diagnosis);\n if (!plan) {\n if (result.diagnosis === \"unclassified\" && opts.autofixAgent) {\n p.note(\n [\n \"No deterministic repair matches this symptom.\",\n `Probes: ${formatProbes(result.probes)}`,\n `URL: ${url}`,\n \"Re-run with an agent that can read the host logs, or inspect manually.\",\n ].join(\"\\n\"),\n \"Needs investigation\",\n );\n }\n process.exitCode = 1;\n return;\n }\n\n const rs = p.spinner();\n rs.start(`Repairing: ${plan.note}`);\n if (plan.runClerk) await runClerkStep(storefront, brand, url);\n if (plan.rebuild) {\n const rebuilt = await buildSite(storefront, targetId);\n if (!rebuilt) {\n rs.stop(\"Repair failed at the rebuild step\");\n process.exitCode = 1;\n return;\n }\n }\n const redeploy = await deploySite(storefront, brand, {\n preferred: targetId,\n pushSecrets: opts.pushSecrets !== false,\n });\n rs.stop(redeploy.ok ? \"Repaired and redeployed\" : \"Redeploy failed\");\n\n if (!redeploy.ok) {\n info(pc.yellow(redeploy.reason ?? \"Redeploy failed.\"));\n process.exitCode = 1;\n return;\n }\n\n result = await verifyStorefront(redeploy.url ?? url, storefront, process.env);\n info(pc.dim(formatProbes(result.probes)));\n if (result.ok) {\n info(pc.green(\"Storefront is serving after repair.\"));\n return;\n }\n\n // The repair did not take. Put the previous version back rather than leaving\n // a known-broken site live.\n info(pc.yellow(`Still failing after one repair: ${result.summary}`));\n const rb = await rollback(targetId, storefront, projectName);\n info(rb.ok ? pc.yellow(\"Rolled back to the previous version.\") : pc.yellow(rb.reason ?? \"No rollback available.\"));\n process.exitCode = 1;\n}\n\n/**\n * Provision Clerk, write the keys locally, and configure the instance.\n *\n * Called twice in a full deploy, and the split matters. Pre-build, so the\n * publishable key is in `.env.local` before Next inlines it. Post-deploy, so\n * the real `*.workers.dev` origin can be whitelisted — before the deploy that\n * URL does not exist yet, and the earlier single call passed `undefined`, which\n * meant the deployed origin was never allowed.\n */\nasync function runClerkStep(storefront: string, brand: Brand, deployedUrl?: string): Promise<void> {\n const s = p.spinner();\n s.start(\"Provisioning Clerk\");\n const result = await provisionClerk({\n name: brand.name,\n domain: brand.domain,\n env: process.env,\n storefront,\n cli: clerkCliDeps(),\n });\n\n if (!result.ok || !result.credentials) {\n s.stop(\"Clerk not configured\");\n if (result.reason) info(pc.yellow(result.reason));\n if (result.guidance) p.note(result.guidance.join(\"\\n\"), \"Set up Clerk\");\n return;\n }\n\n const { credentials } = result;\n s.stop(\n {\n platform: `Clerk application created (${credentials.applicationId ?? \"new\"})`,\n \"cli-keyless\": \"Clerk keyless application minted — claim it at dashboard.clerk.com to keep it\",\n discovered: \"Clerk keys found on this machine\",\n manual: \"Clerk not configured\",\n }[result.tier],\n );\n\n const written = await mergeEnvLocal(storefront, {\n NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: credentials.publishableKey,\n CLERK_SECRET_KEY: credentials.secretKey,\n });\n if (written.length) info(pc.dim(`Wrote to .env.local: ${written.join(\", \")}`));\n\n const { allowedOrigins, redirectUrls } = storefrontClerkUrls(deployedUrl, brand.domain);\n const configured = await configureClerkInstance(credentials.secretKey, {\n allowedOrigins,\n redirectUrls,\n });\n if (configured.applied.length) info(pc.dim(`Clerk configured: ${configured.applied.length} settings`));\n for (const f of configured.failed) info(pc.yellow(`Clerk ${f.step}: ${f.reason}`));\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\nprogram\n .command(\"login\")\n .description(\"Sign in from this terminal. Opens a browser once, then refreshes silently.\")\n .action(async () => {\n header();\n const s = p.spinner();\n s.start(\"Waiting for browser sign-in\");\n try {\n const r = await oauthLogin({\n openBrowser: (url) => openUrl(url),\n onUrl: (url) => s.message(`Sign in at ${url.slice(0, 60)}…`),\n });\n s.stop(r.ok ? \"Signed in\" : \"Failed\");\n if (!r.ok) {\n p.log.error(r.message);\n process.exitCode = 1;\n return;\n }\n p.note(\n [`Scope: ${r.scope ?? \"read write\"}`, \"\", \"Try it: carrier intelligence fleet-health\"].join(\"\\n\"),\n \"Signed in\",\n );\n } catch (e) {\n s.stop(\"Failed\");\n p.log.error(\n withNextStep(e instanceof Error ? e.message : String(e), [\n \"Check outbound HTTPS to mcp.carrier.llc\",\n \"Headless/CI instead: export CARRIER_API_KEY=ak_…\",\n ]),\n );\n process.exitCode = 1;\n }\n p.outro(\"\");\n });\n\n/**\n * Clack prompts adapted to `SignupIO`.\n *\n * Clack reports cancellation with a symbol rather than by throwing, so every\n * value is checked with `p.isCancel` and mapped to null. Missing that turns a\n * ctrl-C into the literal string \"Symbol(clack:cancel)\" submitted as someone's\n * first name.\n */\nfunction clackSignupIO(): SignupIO {\n return {\n async text(message, opts) {\n const value = await p.text({ message, ...(opts?.placeholder ? { placeholder: opts.placeholder } : {}) });\n return p.isCancel(value) ? null : String(value ?? \"\").trim();\n },\n async password(message) {\n const value = await p.password({ message });\n return p.isCancel(value) ? null : String(value ?? \"\");\n },\n async confirm(message) {\n const value = await p.confirm({ message });\n return p.isCancel(value) ? null : Boolean(value);\n },\n step(message) {\n // A clack spinner cannot run here: this flow prompts between steps, and a\n // live spinner and a prompt fight for the same lines.\n p.log.step(message);\n },\n note(body, title) {\n p.note(body, title);\n },\n };\n}\n\nprogram\n .command(\"signup\")\n .description(\"Create a Carrier account from this terminal, then sign in.\")\n .action(async () => {\n header();\n const result = await headlessSignup({ io: clackSignupIO() });\n\n if (!result.ok) {\n if (result.cancelled) {\n p.log.info(result.message);\n } else {\n p.log.error(result.message);\n process.exitCode = 1;\n }\n p.outro(\"\");\n return;\n }\n\n p.note(\n [\n `Account: ${result.email ?? \"created\"}`,\n `Organization: ${result.organizationName ?? result.organizationId ?? \"created\"}`,\n ].join(\"\\n\"),\n \"Signed up\",\n );\n\n // The account exists but this terminal holds no credential yet. Sign in\n // here rather than printing \"now run carrier login\": the browser hop is\n // one round trip either way, and stopping short would leave the command\n // half-finished at the exact moment it looks done.\n const s = p.spinner();\n s.start(\"Signing in\");\n try {\n const login = await oauthLogin({\n openBrowser: (url) => openUrl(url),\n onUrl: (url) => s.message(`Finish sign-in at ${url.slice(0, 60)}\\u2026`),\n });\n s.stop(login.ok ? \"Signed in\" : \"Sign-in did not finish\");\n if (login.ok) {\n p.note(\"Try it: carrier intelligence fleet-health\", \"Next\");\n } else {\n p.log.warn(withNextStep(login.message, [\"Sign in when ready: carrier login\"]));\n }\n } catch (e) {\n s.stop(\"Sign-in did not finish\");\n p.log.warn(\n withNextStep(e instanceof Error ? e.message : String(e), [\n \"Your account exists — sign in when ready: carrier login\",\n ]),\n );\n }\n p.outro(\"\");\n });\n\nprogram\n .command(\"logout\")\n .description(\"Forget the stored sign-in on this machine.\")\n .action(async () => {\n header();\n await oauthLogout();\n p.log.success(\"Signed out.\");\n p.outro(\"\");\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show the account, org and scopes the current credential resolves to.\")\n .option(\"--json\", \"Print the raw response on stdout and nothing else\")\n .action(async (opts: { json?: boolean }) => {\n if (!opts.json) header();\n const s = opts.json ? null : p.spinner();\n s?.start(\"Calling environment_info\");\n const r = await callMcpTool(\"environment_info\", {}, {\n errorHints: [\"Sign in first: carrier login\", \"Or export CARRIER_API_KEY=ak_…\"],\n });\n s?.stop(r.ok ? \"Done\" : \"Failed\");\n if (!r.ok) {\n if (opts.json) console.error(r.text);\n else p.log.error(r.text);\n process.exitCode = 1;\n return;\n }\n if (opts.json) {\n process.stdout.write(`${r.text}\\n`);\n return;\n }\n p.note(r.text, \"environment_info\");\n p.outro(\"\");\n });\n\nconst connectCmd = program.command(\"connect\").description(\"Stripe Connect onboarding and status.\");\n\nconnectCmd\n .command(\"status\")\n .description(\"Show the authenticated operator's Stripe Connect status.\")\n .option(\"--json\", \"Print raw JSON\")\n .action(async (opts: { json?: boolean }) => {\n if (!opts.json) header();\n const r = await callMcpTool(\"stripe_connect_status\", {}, {\n errorHints: [\"Sign in first: carrier login\", \"Start onboarding: carrier connect begin\"],\n });\n if (!r.ok) {\n if (opts.json) console.error(r.text); else p.log.error(r.text);\n process.exitCode = 1;\n return;\n }\n if (opts.json) process.stdout.write(`${r.text}\n`);\n else { p.note(r.text, \"Stripe Connect\"); p.outro(\"\"); }\n });\n\nconnectCmd\n .command(\"begin\")\n .description(\"Start or resume Stripe Connect onboarding and open the secure Stripe flow.\")\n .option(\"--type <type>\", \"Connected account type: express or standard\", \"express\")\n .option(\"--no-open\", \"Print the onboarding URL instead of opening it\")\n .action(async (opts: { type: string; open: boolean }) => {\n header();\n if (!['express', 'standard'].includes(opts.type)) {\n p.log.error(\"--type must be express or standard\"); process.exitCode = 2; return;\n }\n const r = await callMcpTool(\"stripe_connect_begin\", { account_type: opts.type }, {\n errorHints: [\"Sign in first: carrier login\", \"Check status: carrier connect status\"],\n });\n if (!r.ok) { p.log.error(r.text); process.exitCode = 1; return; }\n let data: { onboarding_url?: string; account_id?: string; account_created?: boolean } = {};\n try { data = JSON.parse(r.text) as typeof data; } catch { /* show raw below */ }\n if (!data.onboarding_url) { p.log.error(r.text); process.exitCode = 1; return; }\n if (opts.open) {\n const opened = await openUrl(data.onboarding_url);\n if (opened.ok) ok(opened.hint); else p.note(data.onboarding_url, \"Open this secure Stripe URL\");\n } else {\n process.stdout.write(`${data.onboarding_url}\\n`);\n }\n p.note([\n `Account: ${data.account_id ?? \"created by Stripe\"}`,\n data.account_created ? \"A new connected account was created.\" : \"Resuming the existing account.\",\n \"After Stripe: carrier connect status\",\n ].join(\"\\n\"), \"Onboarding\");\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 in a browser (headless: carrier signup)\"],\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(\n cmd.write\n ? `${cmd.summary} Dry run unless --commit.`\n : cmd.requireConfirm\n ? `${cmd.summary} Refuses without --confirm.`\n : cmd.summary,\n );\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 // REST endpoints answer 202 with a single-use token the caller re-sends,\n // which is how apps/api gates its destructive routes.\n if (cmd.transport === \"rest\") {\n sub.option(\"--confirm-token <token>\", \"Token from a prior 202, to confirm this call\");\n }\n // No dry_run on the tool, so there is nothing to preview: the flag is the\n // only thing standing between a typo and a real change.\n if (cmd.requireConfirm) sub.option(\"--confirm\", \"Required. This call takes effect immediately.\");\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\n// Escape hatch. The generated commands cover every tool the server registered\n// when they were last generated; this covers the remainder — a tool added\n// since, or one whose schema the generator flattened badly.\nprogram\n .command(\"tool <name>\")\n .description(\"Call one MCP tool directly, by name, with raw arguments\")\n .option(\n \"--arg <key=value>\",\n \"One tool argument. Repeat for more. Dots nest: context.iccid=8931…\",\n (value: string, prev: string[]) => [...prev, value],\n [] as string[],\n )\n .option(\"--json\", \"Print the raw tool response on stdout and nothing else\")\n .action(async (name: string, o: { arg: string[] } & CapabilityFlags) => {\n if (o.json !== true) header();\n await runRawTool(name, o.arg, o);\n if (o.json !== true) p.outro(\"\");\n });\n\nprogram\n .command(\"dash [domain]\")\n .description(`Render a status screen in the terminal: ${DASH_DOMAINS.join(\" | \")}`)\n .option(\"--json\", \"Emit the screen model as JSON instead of drawing it\")\n .option(\"--no-color\", \"Plain text, safe to pipe\")\n .option(\"--width <n>\", \"Terminal width override\")\n .action(async (domain: string | undefined, o: { json?: boolean; color?: boolean; width?: string }) => {\n const target = domain ?? \"fleet\";\n if (!isDashDomain(target)) {\n fail(`Unknown dashboard \"${target}\".`, [`Available: ${DASH_DOMAINS.join(\", \")}`]);\n process.exitCode = 1;\n return;\n }\n const tool = DASH_TOOL[target];\n if (!tool) {\n fail(`\\`carrier dash ${target}\\` reads local state, not a tool.`, [\n \"Run it from a storefront directory: carrier site deploy --no-secrets\",\n ]);\n process.exitCode = 1;\n return;\n }\n if (!o.json) header();\n const result = await callMcpTool(tool, {}, {\n errorHints: [`Check auth: carrier status`, `Or ask in words: carrier ask \"…\"`],\n });\n if (!result.ok) {\n fail(result.text, [\"carrier status\"]);\n process.exitCode = 1;\n return;\n }\n // Prefer a screen the server already built — that is the whole point of the\n // shared model. Fall back to deriving one from a JSON payload; prose cannot\n // drive a screen and is reported honestly as no data.\n let payload: unknown;\n try {\n payload = JSON.parse(result.text);\n } catch {\n payload = undefined;\n }\n const screen = screenFromStructured(result.structured) ?? buildDashScreen(target, payload);\n if (o.json) {\n process.stdout.write(`${JSON.stringify(screen, null, 2)}\\n`);\n return;\n }\n process.stdout.write(\n `${renderTui(screen, {\n color: o.color !== false,\n width: o.width ? Number(o.width) : process.stdout.columns,\n })}\\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 whichever host is available on this box.\")\n .option(\"--name <name>\", \"Project/worker name (defaults from brand)\")\n .option(`--target <target>`, `Force a host: ${TARGET_IDS.join(\" | \")}`)\n .option(\"--no-secrets\", \"Skip staging runtime secrets on the host\")\n .option(\"--clerk\", \"Provision and configure Clerk before building\")\n .option(\"--no-verify\", \"Skip the post-deploy check that the site actually serves\")\n .option(\"--autofix-agent\", \"On an unrecognised failure, print an agent-ready diagnosis bundle\")\n .option(\"--domain\", \"Route the brand domain to the deployment (Cloudflare provisions DNS + cert)\")\n .action(\n async (\n dir: string | undefined,\n o: {\n name?: string;\n target?: string;\n secrets?: boolean;\n clerk?: boolean;\n verify?: boolean;\n autofixAgent?: boolean;\n domain?: boolean;\n },\n ) => {\n header();\n const target = resolve(dir ?? \"./storefront\");\n if (o.target && !isTargetId(o.target)) {\n fail(`Unknown target \"${o.target}\".`, [`Supported: ${TARGET_IDS.join(\", \")}`]);\n process.exitCode = 1;\n return;\n }\n try {\n const brand = await loadStorefrontBrand(target, o.name ? { name: o.name } : undefined);\n await maybeBuildDeploy(target, brand, {\n install: true,\n build: true,\n deploy: true,\n preferred: o.target as TargetId | undefined,\n pushSecrets: o.secrets !== false,\n clerk: o.clerk === true,\n verify: o.verify !== false,\n autofixAgent: o.autofixAgent === true,\n customDomain: o.domain === true,\n });\n } catch (e: unknown) {\n fail(String(e instanceof Error ? e.message : e), [\n \"Scaffold first: carrier site create\",\n \"Check host logins: carrier site targets\",\n ]);\n process.exitCode = 1;\n return;\n }\n p.outro(\"\");\n },\n );\nsite\n .command(\"targets [dir]\")\n .description(\"Show which deploy hosts are installed, logged in, and ready.\")\n .action(async (dir: string | undefined) => {\n header();\n const storefront = resolve(dir ?? \"./storefront\");\n const statuses = await probeAll(storefront);\n const ranked = rankTargets(statuses);\n const rows = statuses.map((s) => {\n const mark = s.ready ? pc.green(\"ready\") : pc.dim(\"not ready\");\n const detail = s.ready\n ? [s.account, s.configured ? \"configured\" : undefined].filter(Boolean).join(\", \")\n : (s.reason ?? \"\");\n return `${s.label.padEnd(20)} ${mark} ${pc.dim(detail)}`;\n });\n p.note(rows.join(\"\\n\"), \"Deploy hosts\");\n info(\n ranked.length\n ? pc.green(`Default on this box: ${ranked[0].label}`)\n : pc.yellow(\"No host is ready — log in to one, then re-run.\"),\n );\n p.outro(\"\");\n });\nsite\n .command(\"clerk [dir]\")\n .description(\"Create or discover a Clerk instance and configure it for the storefront.\")\n .option(\"--name <name>\", \"Application name (defaults from brand)\")\n .option(\"--production\", \"Also create a production instance (Platform API only)\")\n .option(\"--no-create\", \"Never create a new application; only reuse existing keys\")\n .option(\"--url <url>\", \"Deployed URL to whitelist as an origin/redirect\")\n .action(\n async (\n dir: string | undefined,\n o: { name?: string; production?: boolean; create?: boolean; url?: string },\n ) => {\n header();\n const storefront = resolve(dir ?? \"./storefront\");\n try {\n const brand = await loadStorefrontBrand(storefront, o.name ? { name: o.name } : undefined);\n const result = await provisionClerk({\n name: o.name ?? brand.name,\n domain: brand.domain,\n production: o.production === true,\n noCreate: o.create === false,\n env: process.env,\n storefront,\n cli: clerkCliDeps(),\n });\n if (!result.ok || !result.credentials) {\n if (result.reason) info(pc.yellow(result.reason));\n p.note((result.guidance ?? []).join(\"\\n\"), \"Set up Clerk\");\n process.exitCode = 1;\n return;\n }\n const written = await mergeEnvLocal(storefront, {\n NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: result.credentials.publishableKey,\n CLERK_SECRET_KEY: result.credentials.secretKey,\n });\n info(\n result.tier === \"platform\"\n ? pc.green(`Created Clerk application ${result.credentials.applicationId ?? \"\"}`.trim())\n : pc.green(\"Reused Clerk keys already on this machine\"),\n );\n if (written.length) info(pc.dim(`Wrote to .env.local: ${written.join(\", \")}`));\n\n const { allowedOrigins, redirectUrls } = storefrontClerkUrls(o.url, brand.domain);\n const configured = await configureClerkInstance(result.credentials.secretKey, {\n allowedOrigins,\n redirectUrls,\n });\n if (configured.applied.length) {\n p.note(configured.applied.join(\"\\n\"), \"Applied to the Clerk instance\");\n }\n for (const f of configured.failed) info(pc.yellow(`${f.step}: ${f.reason}`));\n } catch (e: unknown) {\n fail(String(e instanceof Error ? e.message : e), [\"Scaffold first: carrier site create\"]);\n process.exitCode = 1;\n return;\n }\n p.outro(\"\");\n },\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","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 { 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\";\n/** Carrier REST API, for the capabilities MCP does not expose. */\nexport const API_URL = \"https://api.carrier.llc\";\nexport const MCP_HOME = \"https://mcp.carrier.llc\";\nexport const SIGN_UP_URL = \"https://accounts.carrier.llc/sign-up\";\n/**\n * Clerk Frontend API. Read-only from the CLI: `carrier signup` posts to\n * `apps/api`, which is the only place the sign-up rate limit can be enforced,\n * and reads `/v1/environment` here to learn whether consent must be collected.\n */\nexport const CLERK_FAPI_URL = \"https://clerk.carrier.llc\";\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 {\n billingScreen,\n fleetScreen,\n greenzoneScreen,\n packagesScreen,\n renderTui,\n storefrontScreen,\n subscribersScreen,\n usageScreen,\n walletScreen,\n type Screen,\n} from \"@carrier/screens\";\n\n/**\n * `carrier dash` — the terminal half of the screen kit.\n *\n * Each domain reuses the same builder the MCP panel uses, so the terminal and\n * the rendered panel cannot drift: if a number is wrong in one it is wrong in\n * both, which is a far better failure than the two disagreeing silently. That\n * disagreement is exactly what went unnoticed in `fleet_health_app`.\n *\n * Data comes from the MCP tools through the existing capability layer, so this\n * adds a rendering surface, not a second API client.\n */\n\nexport const DASH_DOMAINS = [\n \"fleet\",\n \"subscribers\",\n \"usage\",\n \"packages\",\n \"billing\",\n \"wallet\",\n \"greenzone\",\n \"storefront\",\n] as const;\n\nexport type DashDomain = (typeof DASH_DOMAINS)[number];\n\nexport function isDashDomain(value: string): value is DashDomain {\n return (DASH_DOMAINS as readonly string[]).includes(value);\n}\n\n/**\n * Tool that backs each domain.\n *\n * `fleet` deliberately calls the `_app` variant: it returns the built `Screen`\n * in `structuredContent`, so the terminal renders the very object the panel\n * renders. The prose `fleet_health` returns markdown, which a screen cannot be\n * reconstructed from without inventing a parser — the sort of second\n * implementation that let the panel and the report disagree in the first place.\n */\nexport const DASH_TOOL: Record<DashDomain, string> = {\n fleet: \"fleet_health_app\",\n subscribers: \"list_subscribers\",\n usage: \"subscriber_usage\",\n packages: \"list_package_templates\",\n billing: \"billing_events\",\n wallet: \"wallet_balance\",\n greenzone: \"greenzone_whitelist_list\",\n storefront: \"\",\n};\n\n/** A `Screen` the server already built, if the tool returned one. */\nexport function screenFromStructured(structured: unknown): Screen | undefined {\n const rec = structured as { screen?: unknown } | undefined;\n const screen = rec?.screen as Screen | undefined;\n if (screen && typeof screen === \"object\" && Array.isArray(screen.sections) && screen.title) {\n return screen;\n }\n return undefined;\n}\n\nconst num = (value: unknown, fallback = 0): number => {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n};\n\nconst str = (value: unknown, fallback = \"\"): string =>\n value === undefined || value === null ? fallback : String(value);\n\n/** Pull the first array found under any of `keys`, or a bare array. */\nfunction rows(payload: unknown, keys: string[]): Record<string, unknown>[] {\n if (Array.isArray(payload)) return payload as Record<string, unknown>[];\n const rec = (payload ?? {}) as Record<string, unknown>;\n for (const key of keys) {\n const candidate = rec[key];\n if (Array.isArray(candidate)) return candidate as Record<string, unknown>[];\n }\n return [];\n}\n\n/**\n * Build the screen for a domain from that domain's tool payload.\n *\n * Unknown or unexpected payloads produce an empty screen rather than a guess —\n * the renderer then says plainly that nothing came back, which is the honest\n * result and the one that makes a broken data path visible.\n */\nexport function buildDashScreen(domain: DashDomain, payload: unknown): Screen {\n switch (domain) {\n case \"fleet\": {\n const accounts = rows(payload, [\"accounts\", \"account\"]);\n return fleetScreen({\n active: num((payload as Record<string, unknown>)?.active),\n suspended: num((payload as Record<string, unknown>)?.suspended),\n inventory: num((payload as Record<string, unknown>)?.inventory),\n other: num((payload as Record<string, unknown>)?.other),\n accounts: accounts.map((a) => ({\n name: str(a.name ?? a.accountId, \"?\"),\n balance: num(a.balance),\n active: num(a.active),\n suspended: num(a.suspended),\n inventory: num(a.inventory),\n other: num(a.other),\n packageOnly: Boolean(a.packageOnly),\n })),\n });\n }\n case \"subscribers\":\n return subscribersScreen(\n rows(payload, [\"subscribers\", \"subscriber\", \"data\"]).map((s) => ({\n iccid: str(s.iccid ?? s.ICCID, \"?\"),\n msisdn: s.msisdn ? str(s.msisdn) : undefined,\n status: str(s.status ?? s.statusStr, \"unknown\"),\n account: s.accountName ? str(s.accountName) : undefined,\n dataUsedBytes: s.dataUsed === undefined ? undefined : num(s.dataUsed),\n })),\n );\n case \"usage\":\n return usageScreen({\n subject: str((payload as Record<string, unknown>)?.subject, \"Subscriber\"),\n timeline: rows(payload, [\"timeline\", \"days\", \"usage\"]).map((p) => ({\n date: str(p.date ?? p.day, \"?\"),\n bytes: num(p.bytes ?? p.dataUsed),\n })),\n countries: rows(payload, [\"countries\"]).map((c) => ({\n country: str(c.country ?? c.countryName, \"?\"),\n bytes: num(c.bytes ?? c.dataUsed),\n })),\n });\n case \"packages\":\n return packagesScreen(\n rows(payload, [\"template\", \"templates\", \"data\"]).map((t) => ({\n name: str(t.prepaidpackagetemplatename ?? t.name, \"?\"),\n id: str(t.prepaidpackagetemplateid ?? t.id, \"?\"),\n dataLimitBytes: t.databyte === undefined ? undefined : num(t.databyte),\n validityDays: t.perioddays === undefined ? undefined : num(t.perioddays),\n price: t.cost === undefined ? undefined : num(t.cost),\n recurring: Boolean(t.recurring),\n })),\n );\n case \"billing\":\n return billingScreen({\n balance: (payload as Record<string, unknown>)?.balance === undefined\n ? undefined\n : num((payload as Record<string, unknown>).balance),\n currency: str((payload as Record<string, unknown>)?.currency, \"\"),\n events: rows(payload, [\"events\", \"data\"]).map((e) => ({\n date: str(e.date ?? e.timestamp, \"?\"),\n description: str(e.description ?? e.type, \"—\"),\n amount: num(e.amount),\n })),\n });\n case \"wallet\": {\n const p = (payload ?? {}) as Record<string, unknown>;\n return walletScreen({\n balance: num(p.balance),\n currency: str(p.currency, \"\"),\n autoTopupEnabled: Boolean(p.autoTopupEnabled ?? p.auto_topup_enabled),\n threshold: p.threshold === undefined ? undefined : num(p.threshold),\n credits: p.credits === undefined ? undefined : num(p.credits),\n });\n }\n case \"greenzone\":\n return greenzoneScreen(\n rows(payload, [\"entries\", \"whitelist\", \"data\"]).map((e) => ({\n value: str(e.value ?? e.prefix ?? e.destination, \"?\"),\n note: e.note ? str(e.note) : undefined,\n })),\n );\n case \"storefront\": {\n const p = (payload ?? {}) as Record<string, unknown>;\n return storefrontScreen({\n brand: str(p.brand ?? p.project, \"storefront\"),\n url: p.url ? str(p.url) : undefined,\n target: p.target ? str(p.target) : undefined,\n verified: p.verified === undefined ? null : Boolean(p.verified),\n diagnosis: p.diagnosis ? str(p.diagnosis) : undefined,\n secretsStaged: Array.isArray(p.secrets_staged) ? (p.secrets_staged as string[]) : undefined,\n plans: p.plans === undefined ? undefined : num(p.plans),\n });\n }\n }\n}\n\n/** Render a domain screen for the terminal. */\nexport function renderDash(\n domain: DashDomain,\n payload: unknown,\n opts: { width?: number; color?: boolean } = {},\n): string {\n return renderTui(buildDashScreen(domain, payload), opts);\n}\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 from the environment only (synchronous). */\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 { createHash, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { AddressInfo } from \"node:net\";\nimport { MCP_HOME } from \"./urls.js\";\nimport {\n clearCredentials,\n isExpired,\n readCredentials,\n writeCredentials,\n type StoredCredentials,\n} from \"./credentials.js\";\n\n/**\n * Interactive OAuth 2.1 login against the Carrier MCP authorization server.\n *\n * The server already speaks the full MCP OAuth profile — Dynamic Client\n * Registration, PKCE S256, authorization_code + refresh_token, and public\n * clients (`token_endpoint_auth_methods_supported` includes \"none\"). That is\n * exactly what an installed CLI needs, so this registers itself at runtime\n * rather than shipping a baked-in client_id.\n *\n * Access tokens live 15 minutes, so silent refresh is not a nicety: without it\n * the CLI would demand a browser every quarter of an hour.\n */\n\nconst DISCOVERY_PATH = \"/.well-known/oauth-authorization-server\";\nconst CLIENT_NAME = \"Carrier CLI\";\nconst DEFAULT_SCOPE = \"read write\";\n\n/** Ports tried in order for the loopback redirect. */\nconst CALLBACK_PORTS = [3118, 3119, 8976, 8977, 0];\n\nexport interface AuthServerMetadata {\n issuer: string;\n authorization_endpoint: string;\n token_endpoint: string;\n registration_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface LoginResult {\n ok: boolean;\n /** Safe to print — never contains a token. */\n message: string;\n scope?: string;\n}\n\nexport async function discover(base = MCP_HOME): Promise<AuthServerMetadata> {\n const res = await fetch(`${base}${DISCOVERY_PATH}`, {\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) throw new Error(`OAuth discovery failed (${res.status}) at ${base}${DISCOVERY_PATH}`);\n const meta = (await res.json()) as AuthServerMetadata;\n if (!meta.authorization_endpoint || !meta.token_endpoint) {\n throw new Error(\"OAuth discovery returned no authorization or token endpoint\");\n }\n return meta;\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction pkcePair(): { verifier: string; challenge: string } {\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\n/** Constant-time compare so a returned `state` cannot be probed byte by byte. */\nfunction sameState(a: string, b: string): boolean {\n const left = Buffer.from(a);\n const right = Buffer.from(b);\n if (left.length !== right.length) return false;\n return timingSafeEqual(left, right);\n}\n\nasync function registerClient(\n meta: AuthServerMetadata,\n redirectUri: string,\n): Promise<string> {\n if (!meta.registration_endpoint) {\n throw new Error(\"This server does not support dynamic client registration\");\n }\n const res = await fetch(meta.registration_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n body: JSON.stringify({\n client_name: CLIENT_NAME,\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n // Installed apps cannot keep a secret; register as a public client.\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }),\n });\n if (!res.ok) {\n const body = (await res.text().catch(() => \"\")).slice(0, 200);\n throw new Error(`Client registration failed (${res.status}). ${body}`);\n }\n const json = (await res.json()) as { client_id?: string };\n if (!json.client_id) throw new Error(\"Client registration returned no client_id\");\n return json.client_id;\n}\n\ninterface CallbackServer {\n redirectUri: string;\n /** Resolves with the authorization code once the browser hits /callback. */\n waitForCode: (expectedState: string, timeoutMs: number) => Promise<string>;\n close: () => void;\n}\n\n/** Escapes text dropped into the loopback callback page — some of it (the\n * OAuth `error` param) comes straight off the request URL. */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction page(title: string, detail: string): string {\n const safeTitle = escapeHtml(title);\n const safeDetail = escapeHtml(detail);\n return `<!doctype html><meta charset=\"utf-8\"><title>${safeTitle}</title>\n<body style=\"font-family:system-ui,sans-serif;max-width:32rem;margin:20vh auto;text-align:center\">\n<h1 style=\"font-size:1.25rem\">${safeTitle}</h1><p style=\"color:#555\">${safeDetail}</p></body>`;\n}\n\nasync function startCallbackServer(): Promise<CallbackServer> {\n let resolveCode: ((code: string) => void) | undefined;\n let rejectCode: ((err: Error) => void) | undefined;\n let expected = \"\";\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== \"/callback\") {\n res.writeHead(404).end();\n return;\n }\n const err = url.searchParams.get(\"error\");\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\") ?? \"\";\n\n if (err) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(page(\"Sign-in failed\", err));\n rejectCode?.(new Error(`Authorization server returned \"${err}\"`));\n return;\n }\n if (!code || !expected || !sameState(state, expected)) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(page(\"Sign-in failed\", \"The redirect did not match this login attempt.\"));\n rejectCode?.(new Error(\"State mismatch — ignoring the redirect\"));\n return;\n }\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(page(\"You're signed in\", \"Close this tab and return to your terminal.\"));\n resolveCode?.(code);\n });\n\n let bound = false;\n let lastErr: unknown;\n for (const port of CALLBACK_PORTS) {\n try {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => {\n server.removeListener(\"error\", reject);\n resolve();\n });\n });\n bound = true;\n break;\n } catch (e) {\n lastErr = e;\n }\n }\n if (!bound) {\n throw new Error(\n `Could not bind a local callback port (tried ${CALLBACK_PORTS.filter(Boolean).join(\", \")}): ${\n lastErr instanceof Error ? lastErr.message : String(lastErr)\n }`,\n );\n }\n\n const { port } = server.address() as AddressInfo;\n return {\n redirectUri: `http://localhost:${port}/callback`,\n // `close()` alone only stops new connections; a keep-alive socket from the\n // browser would hold the event loop open and the CLI would never exit.\n waitForCode: (expectedState, timeoutMs) => {\n expected = expectedState;\n return new Promise<string>((resolve, reject) => {\n // Left running, this timer keeps the process alive for the full\n // timeout after a successful login — the CLI would appear to hang.\n const timer = setTimeout(\n () => reject(new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s waiting for the browser`)),\n timeoutMs,\n );\n resolveCode = (code) => {\n clearTimeout(timer);\n resolve(code);\n };\n rejectCode = (err) => {\n clearTimeout(timer);\n reject(err);\n };\n });\n },\n close: () => {\n server.closeAllConnections();\n server.close();\n },\n };\n}\n\ninterface TokenResponse {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n error?: string;\n error_description?: string;\n}\n\nasync function postToken(\n meta: AuthServerMetadata,\n body: Record<string, string>,\n): Promise<TokenResponse> {\n const res = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams(body).toString(),\n });\n const json = (await res.json().catch(() => ({}))) as TokenResponse;\n if (!res.ok || json.error) {\n throw new Error(json.error_description || json.error || `Token endpoint returned ${res.status}`);\n }\n if (!json.access_token) throw new Error(\"Token endpoint returned no access_token\");\n return json;\n}\n\nfunction store(meta: AuthServerMetadata, token: TokenResponse, clientId: string): StoredCredentials {\n return {\n issuer: meta.issuer,\n accessToken: token.access_token!,\n refreshToken: token.refresh_token,\n expiresAt: Date.now() + (token.expires_in ?? 900) * 1000,\n scope: token.scope,\n clientId,\n };\n}\n\n/**\n * Full interactive login. `openBrowser` is injected so the caller owns the UX\n * (and tests can drive it without a browser).\n */\nexport async function login(opts: {\n openBrowser: (url: string) => Promise<unknown>;\n onUrl?: (url: string) => void;\n timeoutMs?: number;\n}): Promise<LoginResult> {\n const meta = await discover();\n const server = await startCallbackServer();\n try {\n const existing = await readCredentials();\n const clientId =\n existing?.clientId && existing.issuer === meta.issuer\n ? existing.clientId\n : await registerClient(meta, server.redirectUri);\n\n const { verifier, challenge } = pkcePair();\n const state = base64url(randomBytes(16));\n\n const authUrl = new URL(meta.authorization_endpoint);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", server.redirectUri);\n authUrl.searchParams.set(\"scope\", pickScope(meta));\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"code_challenge\", challenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\n // Arm the callback listener BEFORE the browser is opened. Doing it after\n // is a race: a fast redirect arrives while the handler still has no\n // expected state, gets rejected as a mismatch, and the CLI then waits for\n // a code that already came and went.\n const pendingCode = server.waitForCode(state, opts.timeoutMs ?? 300_000);\n // The redirect can fail before anything awaits `pendingCode` (a rejected\n // state arrives while the browser is still being opened). Mark it handled\n // so that surfaces as a normal rejection below, not an unhandled one.\n pendingCode.catch(() => undefined);\n\n opts.onUrl?.(authUrl.toString());\n await opts.openBrowser(authUrl.toString());\n\n const code = await pendingCode;\n const token = await postToken(meta, {\n grant_type: \"authorization_code\",\n code,\n redirect_uri: server.redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n });\n\n await writeCredentials(store(meta, token, clientId));\n return { ok: true, message: \"Signed in.\", scope: token.scope };\n } finally {\n server.close();\n }\n}\n\nfunction pickScope(meta: AuthServerMetadata): string {\n const supported = meta.scopes_supported ?? [];\n if (!supported.length) return DEFAULT_SCOPE;\n // Ask only for what we need; `admin` requires MFA step-up server-side.\n return DEFAULT_SCOPE.split(\" \")\n .filter((s) => supported.includes(s))\n .join(\" \") || supported[0]!;\n}\n\n/**\n * Return a usable access token from the credential store, refreshing first when\n * it is at or near expiry. Returns null when the user has never logged in.\n */\nexport async function getAccessToken(): Promise<string | null> {\n const creds = await readCredentials();\n if (!creds) return null;\n if (!isExpired(creds)) return creds.accessToken;\n if (!creds.refreshToken || !creds.clientId) return null;\n\n try {\n const meta = await discover();\n const token = await postToken(meta, {\n grant_type: \"refresh_token\",\n refresh_token: creds.refreshToken,\n client_id: creds.clientId,\n });\n const next = store(meta, token, creds.clientId);\n // Servers may omit a rotated refresh token; keep the old one if so.\n if (!next.refreshToken) next.refreshToken = creds.refreshToken;\n await writeCredentials(next);\n return next.accessToken;\n } catch {\n // A dead refresh token should read as \"logged out\", not as a hard failure.\n return null;\n }\n}\n\nexport async function logout(): Promise<void> {\n await clearCredentials();\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { chmod, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\n\n/**\n * On-disk store for `carrier login` credentials.\n *\n * Deliberately a 0600 file rather than the macOS Keychain. The Keychain write\n * path (`security add-generic-password -w <secret>`) puts the secret in argv,\n * where any process running `ps` can read it — worse than a mode-0600 file in a\n * mode-0700 directory. This is the same choice gh, aws and gcloud make.\n */\n\nexport interface StoredCredentials {\n /** OAuth issuer these tokens belong to; a mismatch means the store is stale. */\n issuer: string;\n accessToken: string;\n refreshToken?: string;\n /** Epoch ms when the access token expires. */\n expiresAt: number;\n scope?: string;\n /** Dynamic-registration client id, reused across logins on this machine. */\n clientId?: string;\n}\n\nexport function carrierHome(): string {\n return process.env.CARRIER_HOME?.trim() || join(homedir(), \".carrier\");\n}\n\nfunction credentialsPath(): string {\n return join(carrierHome(), \"credentials.json\");\n}\n\nexport async function readCredentials(): Promise<StoredCredentials | null> {\n try {\n const raw = await readFile(credentialsPath(), \"utf8\");\n const parsed = JSON.parse(raw) as StoredCredentials;\n if (!parsed?.accessToken || typeof parsed.accessToken !== \"string\") return null;\n return parsed;\n } catch {\n // Absent or unreadable is simply \"not logged in\".\n return null;\n }\n}\n\nexport async function writeCredentials(creds: StoredCredentials): Promise<void> {\n const dir = carrierHome();\n await mkdir(dir, { recursive: true, mode: 0o700 });\n // mkdir's mode is ignored when the directory already exists, so set it explicitly.\n await chmod(dir, 0o700).catch(() => undefined);\n const file = credentialsPath();\n await writeFile(file, `${JSON.stringify(creds, null, 2)}\\n`, { mode: 0o600 });\n await chmod(file, 0o600).catch(() => undefined);\n}\n\nexport async function clearCredentials(): Promise<void> {\n await rm(credentialsPath(), { force: true });\n}\n\n/** True when the access token is missing or within `skewMs` of expiry. */\nexport function isExpired(creds: StoredCredentials, skewMs = 60_000): boolean {\n if (!creds.expiresAt) return false;\n return Date.now() >= creds.expiresAt - skewMs;\n}\n\n/**\n * Never let a token reach a terminal or a log. Used on any string that might\n * have been built from a credential before it is printed.\n */\nexport function redact(text: string): string {\n return text\n .replace(/\\b(ak_|sk_|rt_)[A-Za-z0-9._-]{6,}/g, \"$1***\")\n .replace(/\\bBearer\\s+[A-Za-z0-9._-]{8,}/gi, \"Bearer ***\");\n}\n","import { MCP_URL } from \"./urls.js\";\nimport { resolveCliToken } from \"./status.js\";\nimport { getAccessToken } from \"./auth.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { CARRIER_VERSION } from \"../../version.js\";\n\nexport interface AskResult {\n ok: boolean;\n text: string;\n /**\n * `structuredContent` from the tool result, when it sent any.\n *\n * UI-enabled tools return their data here rather than only as prose, which is\n * what lets `carrier dash` render the very same screen object the MCP panel\n * renders instead of re-deriving it from formatted text.\n */\n structured?: unknown;\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\n// ---------------------------------------------------------------------------\n// Client-side deadline (issue #663)\n//\n// Without this the CLI inherits fetch's absence of a default timeout, so a\n// wedged tool (get_tariff, ~2-3 MB) hangs the terminal with zero output —\n// killed manually at 200s in the issue report.\n//\n// 45s, chosen from measured latency:\n// - discrete tool calls return in 0.5-1.5s;\n// - the largest known-good MCP result (233 KB) took 0.75s;\n// - `carrier intelligence fleet-health`, the slowest legitimate command,\n// fans out over several OCS calls and measured 1.47s / 2.84s / 1.47s here;\n// `marketing` 2.70s, `coverage` 1.98s.\n// The slowest real command is under 3s, so 45s is ~15x headroom.\n//\n// It is deliberately LONGER than the server's 20s OCS deadline: the server may\n// legitimately make several sequential OCS calls per tool (intelligence\n// composites), plus handshake and transport. Giving the outer layer a shorter\n// budget would cut off work the inner layer still considers healthy, and would\n// hide the server's specific, actionable OCS timeout message behind a generic\n// client one. Inner deadline fires first for a single wedged upstream; the\n// outer one is the backstop for anything the server itself cannot bound.\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MCP_TIMEOUT_MS = 45_000;\n\nexport function mcpTimeoutMs(): number {\n const parsed = Number(process.env.CARRIER_MCP_TIMEOUT_MS);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_MCP_TIMEOUT_MS;\n}\n\n/** Shared deadline for the whole initialize → tools/call handshake. */\nexport class McpTimeoutError extends Error {\n constructor(public readonly timeoutMs: number) {\n super(`timed out after ${Math.round(timeoutMs / 1000)}s`);\n this.name = \"McpTimeoutError\";\n }\n}\n\nfunction isTimeoutish(err: unknown): boolean {\n return (\n err instanceof McpTimeoutError ||\n (err instanceof Error &&\n (err.name === \"AbortError\" || err.name === \"TimeoutError\"))\n );\n}\n\nfunction parseRpcBody(raw: string): {\n result?: { content?: Array<{ type?: string; text?: string }>; isError?: boolean; structuredContent?: unknown };\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; structuredContent?: unknown };\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; structuredContent?: unknown };\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 // An env credential resolves synchronously and MUST stay that way: awaiting\n // here would defer creation of the deadline timer below past the caller's\n // first tick, which is exactly what the #663 timeout tests drive. Only the\n // stored-login path — which has to touch disk and maybe refresh — awaits.\n const token = resolveCliToken() ?? (await getAccessToken());\n if (!token) {\n return {\n ok: false,\n text: withNextStep(\"Not signed in.\", [\n \"Sign in from this terminal: carrier login\",\n \"No account yet? carrier open signup\",\n \"Headless/CI instead: export CARRIER_API_KEY=ak_… from Console → Settings → API Keys\",\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 // #663 — one deadline covers the whole handshake (initialize → notify →\n // tools/call → body read). Aborting the controller tears down whichever\n // request is in flight; the race guarantees we return even if it does not.\n const timeoutMs = mcpTimeoutMs();\n const controller = new AbortController();\n let deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<never>((_resolve, reject) => {\n deadlineTimer = setTimeout(() => {\n controller.abort();\n reject(new McpTimeoutError(timeoutMs));\n }, timeoutMs);\n });\n const signal = controller.signal;\n\n try {\n return await Promise.race([\n (async (): Promise<AskResult> => {\n const initRes = await fetch(MCP_URL, {\n method: \"POST\",\n headers,\n signal,\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 =\n 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 signal,\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 signal,\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 {\n ok: !json.result?.isError,\n text,\n structured: json.result?.structuredContent,\n };\n })(),\n deadline,\n ]);\n } catch (e: unknown) {\n if (isTimeoutish(e)) {\n const secs = Math.round(timeoutMs / 1000);\n return {\n ok: false,\n text: withNextStep(\n `MCP call to ${tool} timed out after ${secs}s (no response).`,\n [\n \"The tool is likely returning more data than the MCP transport can deliver — see issue #663\",\n \"Narrow the request (a specific --account-id / --iccid returns far less than a whole-fleet call)\",\n `Raise the deadline for one slow call: CARRIER_MCP_TIMEOUT_MS=${timeoutMs * 2} carrier …`,\n \"Confirm the service is up: check network access to https://mcp.carrier.llc/mcp\",\n \"Or open Claude and ask there with full tool routing\",\n ],\n ),\n };\n }\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 } finally {\n if (deadlineTimer !== undefined) clearTimeout(deadlineTimer);\n }\n}\n\nconst ASK_ERROR_HINTS = [\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 * What `carrier_ask` answers with. It is a router: it names the tool to call and\n * the params to call it with, and deliberately does not execute anything itself\n * (\"carrier_ask does not auto-execute — the caller makes the explicit tool\n * call\"). In the CLI, we are that caller.\n */\ninterface AskRouting {\n match?: string;\n resolved_tool?: string;\n resolved_params?: Record<string, unknown>;\n confirm_required?: boolean;\n /** Present instead of resolved_tool when the intent matched more than one tool. */\n candidates?: Array<{ tool?: string; reason?: string }>;\n clarifying_question?: string;\n}\n\n/** The routing envelope arrives as JSON in a text part; anything else is prose. */\nfunction parseRouting(text: string): AskRouting | undefined {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\")) return undefined;\n try {\n const parsed = JSON.parse(trimmed) as AskRouting;\n if (!parsed || typeof parsed !== \"object\") return undefined;\n const routes = typeof parsed.resolved_tool === \"string\" && parsed.resolved_tool;\n const asksBack = typeof parsed.clarifying_question === \"string\" || Array.isArray(parsed.candidates);\n return routes || asksBack ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Natural-language fallback for anything the discrete subcommands do not cover.\n * Two hops: carrier_ask resolves the intent to a tool, then we call that tool.\n * Without the second hop the user gets routing JSON instead of their answer.\n */\nexport async function carrierAsk(intent: string): Promise<AskResult> {\n const routed = await callMcpTool(\"carrier_ask\", { intent }, { errorHints: ASK_ERROR_HINTS });\n if (!routed.ok) return routed;\n\n const routing = parseRouting(routed.text);\n // Not a routing envelope — carrier_ask answered directly, so pass it through.\n if (!routing) return routed;\n\n // Nothing resolved — surface the question, not the envelope.\n if (!routing.resolved_tool) {\n const candidates = (routing.candidates ?? [])\n .map((c) => (c.tool ? `Candidate: ${c.tool}${c.reason ? ` — ${c.reason}` : \"\"}` : undefined))\n .filter((s): s is string => Boolean(s));\n return {\n ok: false,\n text: withNextStep(routing.clarifying_question?.trim() || \"Carrier could not tell which tool you meant.\", [\n ...candidates,\n ...ASK_ERROR_HINTS,\n ]),\n };\n }\n\n const tool = routing.resolved_tool;\n const args = routing.resolved_params ?? {};\n\n if (routing.match && routing.match !== \"confirmed\") {\n return {\n ok: false,\n text: withNextStep(`Carrier could not confirm what you meant (match: ${routing.match}).`, [\n `Closest tool: ${tool}`,\n ...ASK_ERROR_HINTS,\n ]),\n };\n }\n\n // Money- and service-affecting tools are never fired from a guessed intent.\n if (routing.confirm_required) {\n return {\n ok: false,\n text: withNextStep(`\"${intent}\" resolves to ${tool}, which changes live service or billing.`, [\n `Params: ${JSON.stringify(args)}`,\n \"Run the matching discrete command so every flag is explicit and reviewable\",\n \"carrier --help lists every domain\",\n ]),\n };\n }\n\n return callMcpTool(tool, args, { errorHints: ASK_ERROR_HINTS });\n}\n","import { API_URL, CLERK_FAPI_URL } from \"./urls.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { CARRIER_VERSION } from \"../../version.js\";\n\n/**\n * Headless account creation.\n *\n * `carrier signup` used to open a browser, which made the terminal able to do\n * everything with a Carrier account except get one. This runs the whole thing\n * in the shell: collect the details, create the account, verify the emailed\n * code, land in an organization.\n *\n * The Clerk calls go through `apps/api`, not straight to Clerk. That is where\n * the sign-up rate limit lives, and a limit the CLI enforces on itself is not a\n * limit — the attacker has the CLI too. The one thing read directly from Clerk\n * is `/v1/environment`, because it is public, unauthenticated configuration and\n * the answer decides what this command must ask the human before it starts.\n *\n * Consent is the reason that check is not optional. Sending `legal_accepted`\n * unconditionally would record a consent nobody was shown; omitting it when the\n * instance requires it fails the sign-up with a Clerk error nobody can act on.\n * So: read the setting, and when consent is required, show the actual terms and\n * privacy URLs and make acceptance an explicit answer.\n *\n * This is NOT `lib/clerk.ts`. That file provisions Clerk *applications* for\n * white-label storefronts through the Platform API — a different API with a\n * different lifecycle that happens to share a vendor name.\n */\n\n/** Prompt surface, injected so the flow is testable without a terminal. */\nexport interface SignupIO {\n /** Free text. Returns null when the user cancels. */\n text(message: string, opts?: { placeholder?: string }): Promise<string | null>;\n /** Masked entry. Returns null when the user cancels. */\n password(message: string): Promise<string | null>;\n /** Yes/no. Returns null when the user cancels. */\n confirm(message: string): Promise<boolean | null>;\n /** Progress line; optional so tests can ignore it. */\n step?(message: string): void;\n /** Block of context, e.g. the consent links. */\n note?(body: string, title?: string): void;\n}\n\nexport interface SignupResult {\n ok: boolean;\n /** Safe to print — never contains a password or client token. */\n message: string;\n email?: string;\n organizationId?: string;\n organizationName?: string;\n /** True when the user backed out; the caller should not treat it as failure. */\n cancelled?: boolean;\n}\n\nexport interface SignupOptions {\n io: SignupIO;\n fetchImpl?: typeof fetch;\n apiUrl?: string;\n clerkUrl?: string;\n /** Attempts allowed at the emailed code before giving up. */\n maxCodeAttempts?: number;\n}\n\n/** What `/v1/environment` tells us that changes this command's behaviour. */\nexport interface SignupEnvironment {\n legalConsentRequired: boolean;\n captchaEnabled: boolean;\n termsUrl?: string;\n privacyUrl?: string;\n}\n\nconst DEFAULT_MAX_CODE_ATTEMPTS = 3;\n\ninterface ClerkEnvironmentResponse {\n user_settings?: {\n sign_up?: { legal_consent_enabled?: boolean; captcha_enabled?: boolean };\n };\n display_config?: { terms_url?: string | null; privacy_policy_url?: string | null };\n}\n\nexport function parseEnvironment(raw: unknown): SignupEnvironment {\n const env = (raw ?? {}) as ClerkEnvironmentResponse;\n const signUp = env.user_settings?.sign_up ?? {};\n const display = env.display_config ?? {};\n const result: SignupEnvironment = {\n legalConsentRequired: signUp.legal_consent_enabled === true,\n captchaEnabled: signUp.captcha_enabled === true,\n };\n if (display.terms_url) result.termsUrl = display.terms_url;\n if (display.privacy_policy_url) result.privacyUrl = display.privacy_policy_url;\n return result;\n}\n\nexport async function readSignupEnvironment(\n fetchImpl: typeof fetch,\n clerkUrl: string,\n): Promise<SignupEnvironment> {\n const url =\n `${clerkUrl}/v1/environment` +\n `?__clerk_api_version=2025-04-10&_clerk_js_version=5.0.0`;\n const res = await fetchImpl(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) throw new Error(`Clerk environment returned ${res.status}`);\n return parseEnvironment(await res.json());\n}\n\n/** Good enough to catch a typo before a round trip; Clerk does the real check. */\nfunction looksLikeEmail(value: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\n}\n\ninterface ApiErrorBody {\n error?: string;\n code?: string;\n retry_after_seconds?: number;\n}\n\n/**\n * Read an error out of an `apps/api` response.\n *\n * Only the `error` string is ever surfaced. The request body that produced it\n * holds a password and a client token, so nothing else from this exchange is\n * safe to print.\n */\nasync function apiError(res: Response): Promise<{ message: string; code?: string }> {\n let body: ApiErrorBody = {};\n try {\n body = (await res.json()) as ApiErrorBody;\n } catch {\n // Non-JSON error page: the status is all we can honestly report.\n }\n const out: { message: string; code?: string } = {\n message: body.error ?? `Carrier API returned ${res.status}`,\n };\n if (body.code) out.code = body.code;\n if (res.status === 429 && body.retry_after_seconds) {\n const hours = Math.ceil(body.retry_after_seconds / 3600);\n out.message += ` Try again in about ${hours}h, or sign up in a browser: carrier open signup`;\n }\n return out;\n}\n\nfunction cancelled(): SignupResult {\n return { ok: false, cancelled: true, message: \"Sign-up cancelled.\" };\n}\n\nexport async function signup(opts: SignupOptions): Promise<SignupResult> {\n const io = opts.io;\n const fetchImpl = opts.fetchImpl ?? fetch;\n const apiUrl = opts.apiUrl ?? API_URL;\n const clerkUrl = opts.clerkUrl ?? CLERK_FAPI_URL;\n const maxAttempts = opts.maxCodeAttempts ?? DEFAULT_MAX_CODE_ATTEMPTS;\n\n let environment: SignupEnvironment;\n try {\n environment = await readSignupEnvironment(fetchImpl, clerkUrl);\n } catch (e) {\n return {\n ok: false,\n message: withNextStep(\n `Could not read sign-up settings: ${e instanceof Error ? e.message : String(e)}`,\n [\n \"Verify outbound HTTPS to clerk.carrier.llc\",\n \"Sign up in a browser instead: carrier open signup\",\n ],\n ),\n };\n }\n\n // A CAPTCHA is a browser challenge by construction. Failing here beats\n // collecting a password and a name first and failing on the create call.\n if (environment.captchaEnabled) {\n return {\n ok: false,\n message: withNextStep(\"Sign-up on this instance requires a CAPTCHA, which needs a browser.\", [\n \"Sign up in a browser: carrier open signup\",\n \"Then come back and run: carrier login\",\n ]),\n };\n }\n\n const email = await io.text(\"Email address\");\n if (email === null) return cancelled();\n if (!looksLikeEmail(email.trim())) {\n return { ok: false, message: `\"${email.trim()}\" does not look like an email address.` };\n }\n\n const firstName = await io.text(\"First name\");\n if (firstName === null) return cancelled();\n const lastName = await io.text(\"Last name\");\n if (lastName === null) return cancelled();\n const password = await io.password(\"Password\");\n if (password === null) return cancelled();\n\n let legalAccepted = false;\n if (environment.legalConsentRequired) {\n io.note?.(\n [\n `Terms: ${environment.termsUrl ?? \"https://carrier.llc/terms\"}`,\n `Privacy: ${environment.privacyUrl ?? \"https://carrier.llc/privacy\"}`,\n ].join(\"\\n\"),\n \"Before you continue\",\n );\n const accepted = await io.confirm(\"Do you accept the terms and privacy policy?\");\n if (accepted === null) return cancelled();\n if (!accepted) {\n return { ok: false, message: \"An account cannot be created without accepting the terms.\" };\n }\n legalAccepted = true;\n }\n\n const headers = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `carrier-cli/${CARRIER_VERSION}`,\n };\n\n io.step?.(\"Creating your account\");\n let started: { sign_up_id: string; client_token: string; verification_required: boolean };\n try {\n const res = await fetchImpl(`${apiUrl}/v1/signup`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n email_address: email.trim(),\n password,\n first_name: firstName.trim(),\n last_name: lastName.trim(),\n ...(legalAccepted ? { legal_accepted: true } : {}),\n }),\n });\n if (!res.ok) {\n const err = await apiError(res);\n return {\n ok: false,\n message: withNextStep(err.message, [\n \"Already have an account? carrier login\",\n \"Or sign up in a browser: carrier open signup\",\n ]),\n };\n }\n const body = (await res.json()) as {\n data?: { sign_up_id?: string; client_token?: string; verification_required?: boolean };\n };\n if (!body.data?.sign_up_id || !body.data.client_token) {\n return { ok: false, message: \"Sign-up started but the response was incomplete.\" };\n }\n started = {\n sign_up_id: body.data.sign_up_id,\n client_token: body.data.client_token,\n verification_required: body.data.verification_required !== false,\n };\n } catch (e) {\n return {\n ok: false,\n message: withNextStep(\n `Could not reach the Carrier API: ${e instanceof Error ? e.message : String(e)}`,\n [\"Verify outbound HTTPS to api.carrier.llc\"],\n ),\n };\n }\n\n if (started.verification_required) {\n io.note?.(`We sent a code to ${email.trim()}.`, \"Check your email\");\n }\n\n let lastError = \"Verification failed.\";\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const code = await io.text(\"Verification code\", { placeholder: \"123456\" });\n if (code === null) return cancelled();\n\n io.step?.(\"Verifying\");\n let res: Response;\n try {\n res = await fetchImpl(`${apiUrl}/v1/signup/verify`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n sign_up_id: started.sign_up_id,\n client_token: started.client_token,\n code: code.trim(),\n }),\n });\n } catch (e) {\n return {\n ok: false,\n message: withNextStep(\n `Could not reach the Carrier API: ${e instanceof Error ? e.message : String(e)}`,\n [\"Your account may exist — try: carrier login\"],\n ),\n };\n }\n\n if (res.ok) {\n const body = (await res.json()) as {\n data?: { organization_id?: string; organization_name?: string; email_address?: string };\n };\n const result: SignupResult = {\n ok: true,\n message: \"Account created.\",\n email: body.data?.email_address ?? email.trim(),\n };\n if (body.data?.organization_id) result.organizationId = body.data.organization_id;\n if (body.data?.organization_name) result.organizationName = body.data.organization_name;\n return result;\n }\n\n const err = await apiError(res);\n lastError = err.message;\n // Only a wrong code is worth another go. Anything else — an expired code, a\n // rate limit, a Clerk outage — will fail the same way on every retry, and\n // asking again would just walk the user into the attempt ceiling.\n if (err.code !== \"form_code_incorrect\") {\n return {\n ok: false,\n message: withNextStep(err.message, [\n \"Your account may already exist — try: carrier login\",\n \"Or finish in a browser: carrier open signup\",\n ]),\n };\n }\n if (attempt < maxAttempts) io.note?.(\"That code was not right. Try again.\", \"Incorrect code\");\n }\n\n return {\n ok: false,\n message: withNextStep(lastError, [\n `No attempts left after ${maxAttempts} tries.`,\n \"Start over: carrier signup\",\n \"Or finish in a browser: carrier open signup\",\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 * A few capabilities have no MCP tool at all — minting an `ak_` key is the\n * clearest case, since it has to work before the caller holds a credential any\n * tool call could use. Those carry `transport: \"rest\"` and name a Carrier REST\n * path instead. They stay in this registry so `carrier --help` lists one\n * surface, not two.\n *\n * `carrier onboard` is the other one, for the same reason: it runs before the\n * account has an OCS token, which is what every MCP tool call needs. It has no\n * `portal` verb on purpose — connecting by OCS portal login hands a plaintext\n * portal password to a sandboxed browser, so it stays a console-only flow.\n *\n * The domains above the `<generated:catalog-domains>` sentinel are hand-written\n * and stay that way. Everything between the sentinels comes from\n * `scripts/generate-domains.mjs`, which reads the built server's own catalog, so\n * every registered tool has a command. Edit the generator, not the region, and\n * re-run it whenever the server gains or renames a tool:\n *\n * pnpm -F @carrierllc/mcp-server build\n * pnpm -F @carrierllc/mcp generate:domains\n *\n * `catalog-command-parity.test.js` fails if that is ever skipped.\n *\n * This file must stay import-free. Two tests transpile it on its own and load\n * it as a data URL, which cannot resolve a relative import.\n */\n\n/**\n * Flag value types. The two array forms take one comma-separated value, which\n * is how a tool taking `string[]` or `number[]` reaches the command line.\n */\nexport type CapabilityArgType = \"string\" | \"number\" | \"boolean\" | \"string[]\" | \"number[]\";\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 type RestMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\n/** Shared by both transports. */\ninterface CapabilityCommandBase {\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 summary: string;\n options: readonly CapabilityOption[];\n /**\n * Write or admin capability. On the MCP transport this sends dry_run=true\n * unless --commit is passed; on REST, where there is no dry_run field to\n * send, --commit is what makes the request leave the machine at all. Either\n * way a 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 * Refuse to run without --confirm. For tools that change something real but\n * carry no dry_run, confirm or confirm_token argument of their own — sending\n * `dry_run` to one of those is worse than useless, because the tool ignores\n * the field and does the thing. The flag is a CLI gate: nothing is added to\n * the arguments, the call simply does not happen without it.\n */\n requireConfirm?: boolean;\n}\n\n/** The default: one command, one MCP tool. */\nexport interface McpCapabilityCommand extends CapabilityCommandBase {\n transport?: \"mcp\";\n /** MCP tool this verb calls. */\n tool: string;\n}\n\n/**\n * A capability the MCP server does not expose, served by `apps/api` instead.\n *\n * `restPath` may carry `{argName}` placeholders; each is filled from the built\n * argument of the same name and removed from the body. Whatever is left goes\n * out as a JSON body, or as a query string on GET and DELETE.\n */\nexport interface RestCapabilityCommand extends CapabilityCommandBase {\n transport: \"rest\";\n restMethod: RestMethod;\n /** Path under the API origin, e.g. \"/v1/api-keys\". Must exist in openapi.ts. */\n restPath: string;\n}\n\nexport type CapabilityCommand = McpCapabilityCommand | RestCapabilityCommand;\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 {\n flags: \"--activation-code <code>\",\n description: \"Filter by eSIM activation code\",\n arg: \"activationCode\",\n type: \"string\",\n },\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 // OCS rejects an unfiltered list. Catch it here so the user gets the\n // flags to pass instead of a raw schema-validation dump from the tool.\n requireOneOf: [\"accountId\", \"iccid\", \"msisdn\", \"imsi\", \"activationCode\"],\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: [\n RESELLER_ID,\n {\n flags: \"--verbose <bool>\",\n description: \"Return the full OCS zone shape instead of the compact projection\",\n arg: \"verbose\",\n type: \"boolean\",\n },\n ],\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 required: true,\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 required: true,\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: [\n RESELLER_ID,\n {\n flags: \"--country <name|iso2>\",\n description: \"Filter to one country: ISO2 (\\\"nl\\\") or name (\\\"Netherlands\\\")\",\n arg: \"country\",\n type: \"string\",\n },\n {\n flags: \"--traffic-type <type>\",\n description: \"Filter to data, voice or sms\",\n arg: \"trafficType\",\n type: \"string\",\n },\n {\n flags: \"--verbose <bool>\",\n description: \"Return the full OCS rule shape instead of the compact projection\",\n arg: \"verbose\",\n type: \"boolean\",\n },\n ],\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 name: \"api-keys\",\n summary: \"Mint Carrier API keys (ak_…) for headless and CI use\",\n commands: [\n {\n name: \"create\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/api-keys\",\n summary:\n \"Create an org API key. The secret is shown once and never stored by the CLI.\",\n options: [\n {\n flags: \"--name <name>\",\n description: \"Label for the key, max 64 characters\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--description <text>\",\n description: \"Optional note, max 256 characters\",\n arg: \"description\",\n type: \"string\",\n },\n {\n flags: \"--seconds-until-expiration <n>\",\n description: \"Expiry in seconds, 60 to 31536000. Omit for a key that does not expire.\",\n arg: \"secondsUntilExpiration\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"onboard\",\n summary: \"Connect a new account to OCS without opening a browser\",\n commands: [\n {\n name: \"status\",\n transport: \"rest\",\n restMethod: \"GET\",\n restPath: \"/v1/onboarding\",\n summary: \"Show how far onboarding has got. Same state the console renders.\",\n options: [],\n },\n {\n name: \"org\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/org\",\n summary: \"Record who the operator is (step 1).\",\n options: [\n {\n flags: \"--name <name>\",\n description: \"Operator name, max 128 characters\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--website <url>\",\n description: \"Public site, if there is one\",\n arg: \"website\",\n type: \"string\",\n },\n {\n flags: \"--country <iso2>\",\n description: \"ISO 3166-1 alpha-2 country, e.g. NL\",\n arg: \"country\",\n type: \"string\",\n },\n {\n flags: \"--operator-type <type>\",\n description: \"How the operator describes itself, e.g. mvno\",\n arg: \"operatorType\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"connect\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/ocs-connect\",\n summary:\n \"Connect your own eSIMVault token (step 2, BYO). Verified against OCS, then stored encrypted; the token is never echoed back.\",\n options: [\n {\n flags: \"--token <token>\",\n description:\n \"eSIMVault API token. A flag lands in shell history — prefer a leading space, or run this once from a fresh shell.\",\n arg: \"token\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"managed\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/managed-account\",\n summary:\n \"Let Carrier provision the OCS sub-account instead (step 2, the primary path). Idempotent, and clears any BYO token.\",\n options: [],\n },\n {\n name: \"plan\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/plan\",\n summary: \"Record the starting plan template (step 3).\",\n options: [\n {\n flags: \"--template-id <id>\",\n description: \"Package template to start from\",\n arg: \"templateId\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--display-name <name>\",\n description: \"What customers will see the plan called\",\n arg: \"displayName\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"plan-skip\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/plan/skip\",\n summary: \"Skip the plan step and come back to it later (step 3).\",\n options: [],\n },\n {\n name: \"test-esim\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/test-esim\",\n summary:\n \"Read back one eSIM from the connected fleet (step 4). Nothing is provisioned; a demo ICCID with a reason comes back if OCS has nothing to show.\",\n options: [],\n },\n {\n name: \"complete\",\n transport: \"rest\",\n restMethod: \"POST\",\n restPath: \"/v1/onboarding/complete\",\n summary: \"Mark onboarding done (step 5).\",\n options: [],\n },\n ],\n },\n // <generated:catalog-domains>\n // Generated from the MCP catalog by scripts/generate-domains.mjs. Do not edit by hand:\n // rebuild the server, re-run the generator, and review the diff.\n {\n name: \"billing\",\n summary: \"Carrier plan credits, spend thresholds and rate-limit state\",\n commands: [\n {\n name: \"events\",\n tool: \"billing_events\",\n summary: \"View recent billing threshold events: notifications, invoice triggers, hard cap alerts, and overage pauses.\",\n options: [\n {\n flags: \"--limit <n>\",\n description: \"Maximum number of events to return (default: 20, max: 50).\",\n arg: \"limit\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"configure\",\n tool: \"configure_billing\",\n summary: \"Configure your billing preferences: enable/disable overages, set billing thresholds (bill shock prevention), configure notification percentages, and set hard spending caps.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--overages-enabled <bool>\",\n description: \"Enable or disable auto-billed overages when monthly credits are exhausted.\",\n arg: \"overages_enabled\",\n type: \"boolean\",\n },\n {\n flags: \"--billing-threshold-cents <n>\",\n description: \"Amount in cents at which an invoice is automatically generated (e.g., 10000 = $100).\",\n arg: \"billing_threshold_cents\",\n type: \"number\",\n },\n {\n flags: \"--hard-cap-cents <n>\",\n description: \"Maximum overage spend in cents before overages are paused (0 = no cap).\",\n arg: \"hard_cap_cents\",\n type: \"number\",\n },\n {\n flags: \"--auto-pause-on-cap <bool>\",\n description: \"Whether to automatically pause overages when hard cap is reached.\",\n arg: \"auto_pause_on_cap\",\n type: \"boolean\",\n },\n {\n flags: \"--notify-at-pct <list>\",\n description: \"Percentage thresholds at which to send notifications (e.g., [50, 80, 95, 100]). Comma-separated.\",\n arg: \"notify_at_pct\",\n type: \"number[]\",\n },\n {\n flags: \"--notification-email <email>\",\n description: \"Email address for billing threshold notifications.\",\n arg: \"notification_email\",\n type: \"string\",\n },\n {\n flags: \"--notification-phone <phone>\",\n description: \"E.164 phone number for SMS billing threshold notifications via Twilio (e.g. +14155552671).\",\n arg: \"notification_phone\",\n type: \"string\",\n },\n {\n flags: \"--webhook-url <url>\",\n description: \"Webhook URL for billing threshold events.\",\n arg: \"webhook_url\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"credits\",\n tool: \"credit_balance\",\n summary: \"Read how much of this Carrier MCP plan is left: credits remaining, daily free credits, overage state, volume discount tier, and billing threshold state.\",\n options: [],\n },\n {\n name: \"plans\",\n tool: \"pricing_plans\",\n summary: \"View all available Carrier MCP pricing plans with credit allotments, features, overage rates, and volume discount tiers.\",\n options: [],\n },\n {\n name: \"projection\",\n tool: \"usage_projection\",\n summary: \"Project your credit usage and costs for the remainder of the billing period based on current consumption rate.\",\n options: [\n {\n flags: \"--days-to-project <n>\",\n description: \"Number of days to project forward (default: remaining days in month).\",\n arg: \"days_to_project\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"rate-limit\",\n tool: \"rate_limit_status\",\n summary: \"Inspect Bridge4IP OCS rate-limit governor state — bucket fill levels, per-endpoint limits, and 80% alert thresholds.\",\n options: [\n {\n flags: \"--endpoint <endpoint>\",\n description: \"OCS method name in camelCase (e.g. 'subscriberUsageOverPeriod').\",\n arg: \"endpoint\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"wallet\",\n summary: \"The Carrier prepaid wallet: balance and top-ups\",\n commands: [\n {\n name: \"balance\",\n tool: \"wallet_balance\",\n summary: \"Read the caller organisation's Carrier prepaid wallet: current balance and auto-top-up settings.\",\n options: [],\n },\n {\n name: \"topup\",\n tool: \"wallet_topup_checkout\",\n summary: \"Create a Stripe Checkout link so a human can top up the Carrier prepaid wallet by card.\",\n options: [\n {\n flags: \"--pack <pack>\",\n description: \"Pack id (pack_500/pack_1000/pack_2500/pack_5000) or exact EUR-cents amount.\",\n arg: \"pack\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"auto-topup\",\n tool: \"wallet_auto_topup\",\n summary: \"Charge the organisation's saved card off-session, right now, and credit the Carrier prepaid wallet with the pack.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--pack-cents <n>\",\n description: \"Override pack amount in EUR cents (must match a catalog pack).\",\n arg: \"pack_cents\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"stripe\",\n summary: \"Money in the operator's connected Stripe account\",\n commands: [\n {\n name: \"balance\",\n tool: \"stripe_connect_balance\",\n summary: \"Read the money sitting in the operator's connected Stripe account: available and pending, split per currency.\",\n options: [],\n },\n {\n name: \"payouts\",\n tool: \"stripe_connect_payouts\",\n summary: \"List money Stripe has already sent from the operator's connected account to their bank, newest first.\",\n options: [\n {\n flags: \"--limit <n>\",\n description: \"Number of payouts to return. Default 10.\",\n arg: \"limit\",\n type: \"number\",\n },\n {\n flags: \"--status <status>\",\n description: \"Filter by payout status. One of: pending, paid, failed, canceled, in_transit.\",\n arg: \"status\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"disputes\",\n tool: \"stripe_connect_dispute_list\",\n summary: \"List chargebacks customers have raised with their bank against the operator's connected Stripe account.\",\n options: [\n {\n flags: \"--limit <n>\",\n description: \"limit (number). Default 10.\",\n arg: \"limit\",\n type: \"number\",\n },\n {\n flags: \"--status <status>\",\n description: \"Filter by dispute status (e.g. needs_response, under_review).\",\n arg: \"status\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"refund\",\n tool: \"stripe_connect_refund\",\n summary: \"Refund money to a customer on one charge in the operator's connected Stripe account.\",\n options: [\n {\n flags: \"--charge-id <id>\",\n description: \"Stripe charge ID (ch_...).\",\n arg: \"charge_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--amount-cents <n>\",\n description: \"Partial refund amount in cents.\",\n arg: \"amount_cents\",\n type: \"number\",\n },\n {\n flags: \"--reason <reason>\",\n description: \"reason (string). One of: duplicate, fraudulent, requested_by_customer.\",\n arg: \"reason\",\n type: \"string\",\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"Confirmation token from previous call.\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"radar\",\n summary: \"Stripe Radar fraud reviews and value lists\",\n commands: [\n {\n name: \"reviews\",\n tool: \"radar_review_list\",\n summary: \"List the Stripe Radar fraud reviews waiting on a manual approve/decline decision, newest first.\",\n options: [\n {\n flags: \"--open-only <bool>\",\n description: \"If true, only returns open (undecided) reviews. Default true.\",\n arg: \"open_only\",\n type: \"boolean\",\n },\n {\n flags: \"--limit <n>\",\n description: \"limit (number). Default 10.\",\n arg: \"limit\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"approve\",\n tool: \"radar_review_approve\",\n summary: \"Clear a Stripe Radar fraud review so the held charge is captured and the money is taken.\",\n options: [\n {\n flags: \"--review-id <id>\",\n description: \"Stripe Radar review ID (prv_...).\",\n arg: \"review_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"confirm token (string).\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"decline\",\n tool: \"radar_review_decline\",\n summary: \"Close a Stripe Radar fraud review as fraudulent, so the held charge is blocked and the customer is never billed.\",\n options: [\n {\n flags: \"--review-id <id>\",\n description: \"review id (string).\",\n arg: \"review_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"confirm token (string).\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"rule-toggle\",\n tool: \"radar_rule_toggle\",\n summary: \"Report a Stripe Radar rule's state. Stripe exposes no API to change it, so this changes nothing.\",\n options: [\n {\n flags: \"--rule-id <id>\",\n description: \"Stripe Radar rule ID.\",\n arg: \"rule_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--enabled <bool>\",\n description: \"true = enable, false = disable.\",\n arg: \"enabled\",\n type: \"boolean\",\n required: true,\n },\n ],\n },\n {\n name: \"value-list add\",\n tool: \"radar_value_list_add\",\n summary: \"Add one value to an existing Stripe Radar value list, changing how every future charge is scored.\",\n options: [\n {\n flags: \"--value-list-id <id>\",\n description: \"Stripe Radar value list ID (rsl_...).\",\n arg: \"value_list_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--value <value>\",\n description: \"The value to add (email, IP address, country code, etc.).\",\n arg: \"value\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm-token <token>\",\n description: \"confirm token (string).\",\n arg: \"confirm_token\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"greenzone\",\n summary: \"The Bridge4IP Greenzone whitelist\",\n commands: [\n {\n name: \"list\",\n tool: \"greenzone_whitelist_list\",\n summary: \"List current Greenzone whitelist entries from the KV cache.\",\n options: [\n {\n flags: \"--from-portal <bool>\",\n description: \"When true, return Kapture steps to read live portal state instead of KV cache.\",\n arg: \"from_portal\",\n type: \"boolean\",\n },\n ],\n },\n {\n name: \"add\",\n tool: \"greenzone_whitelist_add\",\n summary: \"Add a host or IP to the Greenzone whitelist. Needs Kapture running in the operator's own Chrome — without it the dry run still returns the portal steps to follow by hand.\",\n write: true,\n options: [\n {\n flags: \"--host <host>\",\n description: \"Hostname to whitelist (e.g. 'example.com').\",\n arg: \"host\",\n type: \"string\",\n },\n {\n flags: \"--ip <ip>\",\n description: \"IP address or CIDR to whitelist (e.g. '203.0.113.0/24').\",\n arg: \"ip\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"remove\",\n tool: \"greenzone_whitelist_remove\",\n summary: \"Remove a host or IP from the Greenzone whitelist. Needs Kapture running in the operator's own Chrome — without it the dry run still returns the portal steps to follow by hand.\",\n write: true,\n options: [\n {\n flags: \"--host <host>\",\n description: \"Hostname to remove from whitelist.\",\n arg: \"host\",\n type: \"string\",\n },\n {\n flags: \"--ip <ip>\",\n description: \"IP address or CIDR to remove from whitelist.\",\n arg: \"ip\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"agent\",\n summary: \"Steel browsing agents: one-off tasks and cron schedules\",\n commands: [\n {\n name: \"ask\",\n tool: \"ui_agent_ask\",\n summary: \"Send a plain-language task to a Steel browsing agent, which drives a real browser on the open web — navigating pages, searching via Tavily, extracting content, filling forms outside the OCS portal.\",\n write: true,\n options: [\n {\n flags: \"--prompt <prompt>\",\n description: \"Natural-language task description for the Steel browsing agent.\",\n arg: \"prompt\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--max-steps <n>\",\n description: \"Maximum agent steps (1–30, default 15).\",\n arg: \"max_steps\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"status\",\n tool: \"ui_agent_status\",\n summary: \"Poll the status of a Steel browser agent task dispatched by ui_agent_ask or any ui_* tool.\",\n options: [\n {\n flags: \"--task-id <id>\",\n description: \"Steel task ID returned by ui_agent_ask or any ui_* tool dispatch.\",\n arg: \"task_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"pending\",\n tool: \"ui_agent_list_pending\",\n summary: \"Returns all Steel browser automation tasks that are currently paused waiting for human input (stop_reason 'ask').\",\n options: [],\n },\n {\n name: \"reply\",\n tool: \"ui_agent_reply\",\n summary: \"Resumes a Steel browser automation task that paused with stop_reason 'ask'.\",\n options: [\n {\n flags: \"--task-id <id>\",\n description: \"Steel task ID to resume (from ui_agent_list_pending).\",\n arg: \"task_id\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--reply <reply>\",\n description: \"Your answer to the agent's question (e.g. a 2FA code or confirmation).\",\n arg: \"reply\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"usage\",\n tool: \"ui_agent_usage\",\n summary: \"Returns an estimated Anthropic API cost for Steel agent tasks dispatched this calendar month.\",\n options: [],\n },\n {\n name: \"schedule list\",\n tool: \"ui_agent_schedule_list\",\n summary: \"Lists all Steel recurring schedules stored in KV.\",\n options: [],\n },\n {\n name: \"schedule create\",\n tool: \"ui_agent_schedule_create\",\n summary: \"Creates a recurring Steel agent run on a cron schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Human-readable name for this schedule.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--cron <cron>\",\n description: \"Standard 5-field cron expression (minute hour day month weekday).\",\n arg: \"cron\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--prompt-template <template>\",\n description: \"Agent prompt/task template the Steel agent will execute on each run.\",\n arg: \"prompt_template\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"schedule pause\",\n tool: \"ui_agent_schedule_pause\",\n summary: \"Pauses an active Steel recurring schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--schedule-id <id>\",\n description: \"ID of the schedule to pause.\",\n arg: \"schedule_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"schedule resume\",\n tool: \"ui_agent_schedule_resume\",\n summary: \"Resumes a paused Steel recurring schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--schedule-id <id>\",\n description: \"ID of the schedule to resume.\",\n arg: \"schedule_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"schedule delete\",\n tool: \"ui_agent_schedule_delete\",\n summary: \"Permanently deletes a Steel recurring schedule.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--schedule-id <id>\",\n description: \"ID of the schedule to delete.\",\n arg: \"schedule_id\",\n type: \"string\",\n required: true,\n },\n ],\n },\n ],\n },\n {\n name: \"portal\",\n summary: \"OCS portal changes that only exist in the web UI, driven by Kapture\",\n commands: [\n {\n name: \"account create\",\n tool: \"ui_create_account\",\n summary: \"Creates a new sub-account under the reseller via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Name for the new account.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--description <description>\",\n description: \"Optional description.\",\n arg: \"description\",\n type: \"string\",\n },\n {\n flags: \"--initial-balance <n>\",\n description: \"Initial balance in account currency (default 0).\",\n arg: \"initial_balance\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"steering build\",\n tool: \"ui_build_steering_list\",\n summary: \"Change which mobile operators sit on a steering list that already exists, by driving the OCS web dashboard — the OCS REST API cannot edit list membership.\",\n write: true,\n options: [\n {\n flags: \"--steering-list-id <n>\",\n description: \"ID of the steering list to modify.\",\n arg: \"steering_list_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--add-operators <list>\",\n description: \"MCC-MNC codes to add (e.g. ['20801', '26201']). Comma-separated.\",\n arg: \"add_operators\",\n type: \"string[]\",\n },\n {\n flags: \"--remove-operators <list>\",\n description: \"MCC-MNC codes to remove. Comma-separated.\",\n arg: \"remove_operators\",\n type: \"string[]\",\n },\n {\n flags: \"--operator-type <type>\",\n description: \"Whether operators are priority or excluded. One of: priority, excluded. Default \\\"priority\\\".\",\n arg: \"operator_type\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"steering create\",\n tool: \"ui_create_steering_list\",\n summary: \"Create a new, empty network steering list (OPLMN preference set) by driving the OCS web dashboard, because the OCS REST API cannot create one.\",\n write: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Name for the new steering list.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--description <description>\",\n description: \"Optional description for the steering list.\",\n arg: \"description\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"steering set-account\",\n tool: \"ui_set_account_steering_list\",\n summary: \"Assigns or removes a steering list at the account level via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--account-id <n>\",\n description: \"Account ID to assign the steering list to.\",\n arg: \"account_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--steering-list-id <n>\",\n description: \"Steering list ID to assign (0 to remove/unset).\",\n arg: \"steering_list_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n {\n name: \"relay request\",\n tool: \"ui_request_reseller_relay_change\",\n summary: \"Drafts the parent-reseller/support request for reseller relay flags that are visible but read-only in the OCS portal at the current account tier.\",\n options: [\n {\n flags: \"--reseller-id <n>\",\n description: \"Reseller id; defaults to the authenticated reseller.\",\n arg: \"reseller_id\",\n type: \"number\",\n },\n {\n flags: \"--relay-gy <bool>\",\n description: \"Desired Relay Gy state.\",\n arg: \"relay_gy\",\n type: \"boolean\",\n },\n {\n flags: \"--relay-calls-sms <bool>\",\n description: \"Desired calls/SMS relay state.\",\n arg: \"relay_calls_sms\",\n type: \"boolean\",\n },\n {\n flags: \"--relay-voip <bool>\",\n description: \"Desired VoIP relay state.\",\n arg: \"relay_voip\",\n type: \"boolean\",\n },\n {\n flags: \"--reason <reason>\",\n description: \"Operational reason for the requested change.\",\n arg: \"reason\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"destinations create\",\n tool: \"ui_create_destination_list\",\n summary: \"Creates a new destination list (named set of phone number prefixes for MOC call permissions) via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--name <name>\",\n description: \"Name for the new destination list.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--prefixes <list>\",\n description: \"Phone number prefixes to include (e.g. ['+31', '+49']). Comma-separated.\",\n arg: \"prefixes\",\n type: \"string[]\",\n },\n {\n flags: \"--description <description>\",\n description: \"Optional description.\",\n arg: \"description\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"destinations edit\",\n tool: \"ui_edit_destination_list\",\n summary: \"Edits an existing destination list via the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--destination-list-id <n>\",\n description: \"ID of the destination list to edit.\",\n arg: \"destination_list_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--add-prefixes <list>\",\n description: \"Prefixes to add. Comma-separated.\",\n arg: \"add_prefixes\",\n type: \"string[]\",\n },\n {\n flags: \"--remove-prefixes <list>\",\n description: \"Prefixes to remove. Comma-separated.\",\n arg: \"remove_prefixes\",\n type: \"string[]\",\n },\n {\n flags: \"--new-name <name>\",\n description: \"Rename the destination list.\",\n arg: \"new_name\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"destinations delete\",\n tool: \"ui_delete_destination_list\",\n summary: \"Delete a destination list — a named set of phone-number prefixes — by driving the OCS web dashboard.\",\n write: true,\n options: [\n {\n flags: \"--destination-list-id <n>\",\n description: \"ID of the destination list to delete.\",\n arg: \"destination_list_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n {\n name: \"zones edit\",\n tool: \"ui_edit_location_zone\",\n summary: \"Edits an existing location zone via the OCS web dashboard. `create_location_zone` is available via API; edit is UI-only.\",\n write: true,\n options: [\n {\n flags: \"--zone-id <n>\",\n description: \"ID of the location zone to edit.\",\n arg: \"zone_id\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--new-name <name>\",\n description: \"Rename the location zone.\",\n arg: \"new_name\",\n type: \"string\",\n },\n {\n flags: \"--add-countries <list>\",\n description: \"ISO country codes to add (e.g. ['NL', 'DE']). Comma-separated.\",\n arg: \"add_countries\",\n type: \"string[]\",\n },\n {\n flags: \"--remove-countries <list>\",\n description: \"ISO country codes to remove. Comma-separated.\",\n arg: \"remove_countries\",\n type: \"string[]\",\n },\n ],\n },\n {\n name: \"zones delete\",\n tool: \"ui_delete_location_zone\",\n summary: \"Delete a location zone by driving the OCS web dashboard, because the OCS REST API can create a zone (`create_location_zone`) but not remove one.\",\n write: true,\n options: [\n {\n flags: \"--zone-id <n>\",\n description: \"ID of the location zone to delete.\",\n arg: \"zone_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n {\n name: \"templates delete\",\n tool: \"ui_delete_package_template\",\n summary: \"Remove a package template from the reseller's product catalogue for good, by driving the OCS web dashboard — the OCS REST API cannot delete a template.\",\n write: true,\n options: [\n {\n flags: \"--template-id <n>\",\n description: \"ID of the package template to delete.\",\n arg: \"template_id\",\n type: \"number\",\n required: true,\n },\n ],\n },\n ],\n },\n {\n name: \"events\",\n summary: \"Buffered OCS event history per subscriber\",\n commands: [\n {\n name: \"ocs\",\n tool: \"list_recent_ocs_events\",\n summary: \"Return the last N OCS events buffered for a given ICCID.\",\n options: [\n {\n flags: \"--iccid <iccid>\",\n description: \"ICCID, 19 or 20 digits, ITU-T E.118 format.\",\n arg: \"iccid\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--limit <n>\",\n description: \"Max events to return, newest first. Default 20.\",\n arg: \"limit\",\n type: \"number\",\n },\n {\n flags: \"--event-types <list>\",\n description: \"Filter to specific event types. Comma-separated.\",\n arg: \"event_types\",\n type: \"string[]\",\n },\n {\n flags: \"--since <since>\",\n description: \"ISO-8601 timestamp; only events after this point.\",\n arg: \"since\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"countries\",\n tool: \"subscriber_country_history\",\n summary: \"Return cross-border movement history for a subscriber from Relay LU events.\",\n options: [\n {\n flags: \"--subscriber-id <id>\",\n description: \"Subscriber ICCID (19–20 digits, ITU-T E.118).\",\n arg: \"subscriberId\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--limit <n>\",\n description: \"Maximum number of events to return, newest first (default 20, max 50). Default 20.\",\n arg: \"limit\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"depletion\",\n tool: \"subscriber_depletion_events\",\n summary: \"Look up bundle depletion events for a subscriber (or list recent fleet-wide depletions).\",\n options: [\n {\n flags: \"--subscriber-id <id>\",\n description: \"OCS subscriber ID to look up.\",\n arg: \"subscriberId\",\n type: \"string\",\n },\n {\n flags: \"--since <since>\",\n description: \"ISO-8601 timestamp — only return events at or after this time (for single-subscriber lookup).\",\n arg: \"since\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n {\n name: \"panels\",\n summary: \"MCP UI surfaces. A terminal sees the underlying data, not the panel.\",\n commands: [\n {\n name: \"fleet\",\n tool: \"fleet_health_app\",\n summary: \"Fleet overview as a UI panel. Prefer `carrier intelligence fleet-health` in a terminal; use --json to read the panel's data.\",\n options: [\n {\n flags: \"--account-id <n>\",\n description: \"Filter to a specific account (omit for all).\",\n arg: \"accountId\",\n type: \"number\",\n },\n ],\n },\n {\n name: \"topup\",\n tool: \"balance_topup_form\",\n summary: \"Adjust the OCS account balance behind one subscriber. Previews unless --preview false.\",\n requireConfirm: true,\n options: [\n {\n flags: \"--iccid <iccid>\",\n description: \"The subscriber ICCID for the account lookup.\",\n arg: \"iccid\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--delta <n>\",\n description: \"Amount to add (positive) or deduct (negative) from the account balance.\",\n arg: \"delta\",\n type: \"number\",\n required: true,\n },\n {\n flags: \"--preview <bool>\",\n description: \"If true, return preview without writing. Default true.\",\n arg: \"preview\",\n type: \"boolean\",\n },\n ],\n },\n {\n name: \"provision\",\n tool: \"provision_esim_wizard\",\n summary: \"Step through the provisioning wizard. Pass --step confirm to execute; every earlier step only reads.\",\n options: [\n {\n flags: \"--step <step>\",\n description: \"Current wizard step. One of: init, select-package, preview, confirm.\",\n arg: \"step\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--wizard-id <id>\",\n description: \"Wizard session ID (absent on init).\",\n arg: \"wizardId\",\n type: \"string\",\n },\n {\n flags: \"--subscriber-iccid <iccid>\",\n description: \"Subscriber ICCID (required for select-package).\",\n arg: \"subscriber_iccid\",\n type: \"string\",\n },\n {\n flags: \"--package-template-id <n>\",\n description: \"Package template ID (required for preview).\",\n arg: \"package_template_id\",\n type: \"number\",\n },\n ],\n },\n ],\n },\n {\n name: \"env\",\n summary: \"This environment: credentials, catalog and machine-readable context\",\n commands: [\n {\n name: \"info\",\n tool: \"environment_info\",\n summary: \"View your Carrier environment configuration — active organization, reseller details, connected services, and deployment environment.\",\n options: [],\n },\n {\n name: \"credentials\",\n tool: \"credential_status\",\n summary: \"Report on the stored eSIMVault credential without changing it: whether a token is present, whether it is encrypted, how old it is, and whether rotation is recommended (over 90 days).\",\n options: [],\n },\n {\n name: \"rotate\",\n tool: \"rotate_credentials\",\n summary: \"Replace the stored eSIMVault API token with one you supply.\",\n options: [\n {\n flags: \"--new-token <token>\",\n description: \"New eSIMVault API token to encrypt and store.\",\n arg: \"new_token\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--confirm <bool>\",\n description: \"Confirm rotation — this will replace the current token immediately.\",\n arg: \"confirm\",\n type: \"boolean\",\n required: true,\n },\n ],\n },\n {\n name: \"catalog\",\n tool: \"service_catalog\",\n summary: \"Browse the Carrier service catalog — discover available services, their requirements, endpoints, and documentation.\",\n options: [\n {\n flags: \"--category <category>\",\n description: \"Filter services by category. One of: connectivity, analytics, marketplace, coverage, billing, integration, dashboard.\",\n arg: \"category\",\n type: \"string\",\n },\n {\n flags: \"--tier <tier>\",\n description: \"Filter services accessible at this tier level. One of: free, pro, enterprise.\",\n arg: \"tier\",\n type: \"string\",\n },\n ],\n },\n {\n name: \"llm-context\",\n tool: \"llm_context\",\n summary: \"Generate a comprehensive LLM context document describing your Carrier environment, available tools, current tier, usage patterns, and best practices.\",\n options: [\n {\n flags: \"--format <format>\",\n description: \"Output format for the context document (default: markdown). One of: markdown, json, yaml.\",\n arg: \"format\",\n type: \"string\",\n },\n {\n flags: \"--include-examples <bool>\",\n description: \"Include example tool invocations (default: true).\",\n arg: \"include_examples\",\n type: \"boolean\",\n },\n ],\n },\n {\n name: \"describe\",\n tool: \"carrier_ask_describe\",\n summary: \"Get full documentation for any registered Carrier MCP tool: description, parameters, 2-3 example invocations, required scope, destructive flag, and guidance.\",\n options: [\n {\n flags: \"--tool-name <name>\",\n description: \"The exact MCP tool name to describe (e.g. 'assign_package', 'hlr_set_bitrate').\",\n arg: \"tool_name\",\n type: \"string\",\n required: true,\n },\n ],\n },\n ],\n },\n {\n name: \"brand\",\n summary: \"Storefront brand assets\",\n commands: [\n {\n name: \"logo\",\n tool: \"generate_storefront_logo\",\n summary: \"Generate a storefront logo (SVG always; PNG when an image key is configured on the Carrier worker).\",\n options: [\n {\n flags: \"--name <name>\",\n description: \"Brand / shop name, e.g. Bananas.\",\n arg: \"name\",\n type: \"string\",\n required: true,\n },\n {\n flags: \"--accent <accent>\",\n description: \"Accent hex, e.g. #FF8A00.\",\n arg: \"accent\",\n type: \"string\",\n },\n {\n flags: \"--tagline <tagline>\",\n description: \"Optional tagline for AI-enhanced marks.\",\n arg: \"tagline\",\n type: \"string\",\n },\n ],\n },\n ],\n },\n // </generated:catalog-domains>\n];\n\n/**\n * Every MCP tool the discrete commands can reach.\n *\n * REST-transport commands name no tool and are absent by design — the parity\n * test that consumes this must not expect them.\n */\nexport function capabilityToolNames(): string[] {\n return CLI_DOMAINS.flatMap((d) =>\n d.commands.filter((c) => c.transport !== \"rest\").map((c) => (c as McpCapabilityCommand).tool),\n );\n}\n\n/** Every REST endpoint the discrete commands can reach, as \"METHOD /path\". */\nexport function capabilityRestEndpoints(): Array<{ method: RestMethod; path: string }> {\n return CLI_DOMAINS.flatMap((d) =>\n d.commands\n .filter((c): c is RestCapabilityCommand => c.transport === \"rest\")\n .map((c) => ({ method: c.restMethod, path: c.restPath })),\n );\n}\n\n/** Label for a command in spinners, notes and errors. */\nexport function capabilityTarget(cmd: CapabilityCommand): string {\n return cmd.transport === \"rest\" ? `${cmd.restMethod} ${cmd.restPath}` : cmd.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 { callRestEndpoint } from \"./rest.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { capabilityTarget } from \"./domains.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 /** Second-call token for REST endpoints that answered 202. */\n confirmToken?: string;\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 if (opt.type === \"string[]\" || opt.type === \"number[]\") {\n // One flag, commas inside. A list tool argument has no other shape a shell\n // can pass without quoting rules nobody remembers.\n const items = String(raw)\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (!items.length) return { error: `${opt.flags} expects a comma-separated list, got \"${String(raw)}\"` };\n if (opt.type === \"string[]\") return { value: items };\n const numbers = items.map(Number);\n const bad = items.find((_, i) => !Number.isFinite(numbers[i]!));\n if (bad !== undefined) return { error: `${opt.flags} expects numbers, got \"${bad}\"` };\n return { value: numbers };\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 // dry_run is an MCP tool argument. REST endpoints have no such field, so\n // sending it would either 400 or be silently ignored — on a write, silently\n // ignored means the change lands. There, --commit is the gate instead.\n if (cmd.write && cmd.transport !== \"rest\") args.dry_run = true;\n return { args, errors, notes };\n}\n\n/**\n * Keep already-structured tool responses unchanged, but make text-only MCP\n * successes valid JSON so every --json stdout value can be consumed by jq.\n */\nexport function formatJsonOutput(text: string): string {\n try {\n JSON.parse(text);\n return text;\n } catch {\n return JSON.stringify(text);\n }\n}\n\n/**\n * Run one domain subcommand against whichever transport it names.\n *\n * Write commands preview unless --commit is passed, so a mistyped ICCID costs\n * nothing: MCP tools by sending dry_run, REST endpoints by printing the request\n * without sending it.\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 // Tools with no dry_run, confirm or confirm_token of their own do the thing on\n // the first call. --confirm is read straight off `opts` rather than through\n // CapabilityFlags, because a tool with a real `confirm` argument registers the\n // same flag as a value-taking option; `requireConfirm` and that argument are\n // mutually exclusive, and the generator refuses to emit both.\n if (cmd.requireConfirm && opts.confirm !== true) {\n errors.push(`${capabilityTarget(cmd)} has no preview mode. Pass --confirm to run it for real.`);\n }\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 if (cmd.transport === \"rest\" && cmd.write && opts.commit !== true) {\n const preview = [\n `${cmd.restMethod} ${cmd.restPath}`,\n JSON.stringify(args, null, 2),\n \"\",\n \"Dry run — nothing sent. Re-run with --commit to apply.\",\n ].join(\"\\n\");\n if (quiet) process.stdout.write(`${formatJsonOutput(preview)}\\n`);\n else p.note(preview, `carrier ${label}`);\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 target = capabilityTarget(cmd);\n const errorHints = [\n `Check the arguments: carrier ${label} --help`,\n 'Or describe the task in words: carrier ask \"…\"',\n ];\n\n const s = quiet ? null : p.spinner();\n s?.start(`Calling ${target}`);\n const result =\n cmd.transport === \"rest\"\n ? await callRestEndpoint(cmd.restMethod, cmd.restPath, args, {\n errorHints,\n confirmToken: opts.confirmToken,\n })\n : await callMcpTool(cmd.tool, args, { errorHints });\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(`${formatJsonOutput(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, target);\n}\n\n/**\n * Read one `--arg` value.\n *\n * JSON where JSON is unambiguous, text otherwise. A number is only taken as a\n * number when it round-trips exactly: an ICCID is 19 digits of significant\n * decimal, which a double silently rounds, and the tool would then look up a\n * subscriber nobody asked about.\n */\nfunction parseArgValue(text: string): unknown {\n if (text === \"true\") return true;\n if (text === \"false\") return false;\n if (text === \"null\") return null;\n if (/^[[{\"]/.test(text)) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n if (/^-?\\d+(?:\\.\\d+)?$/.test(text)) {\n const n = Number(text);\n if (Number.isFinite(n) && String(n) === text) return n;\n }\n return text;\n}\n\n/**\n * Call one tool by name with raw arguments.\n *\n * Every registered tool has a generated command, but a command is only as good\n * as the schema it was built from, and a tool added since the last\n * `generate:domains` run has no command at all. This is the floor under that:\n * whatever the registry misses, `carrier tool <name>` still reaches.\n *\n * Nothing is validated beyond the key=value shape. The server rejects a bad\n * argument with a better message than the CLI could guess, and `dry_run` is not\n * injected — pass `--arg dry_run=true` to preview.\n */\nexport async function runRawTool(\n name: string,\n pairs: string[],\n opts: CapabilityFlags,\n): Promise<void> {\n const quiet = opts.json === true;\n const args: Record<string, unknown> = {};\n const errors: string[] = [];\n\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq < 1) {\n errors.push(`--arg ${pair} is not key=value`);\n continue;\n }\n setArg(args, pair.slice(0, eq), parseArgValue(pair.slice(eq + 1)));\n }\n\n if (errors.length) {\n const message = withNextStep(`Cannot call \\`${name}\\`.`, [\n ...errors,\n \"Arguments look like: --arg iccid=8931000000000000000 --arg limit=20\",\n ]);\n if (quiet) console.error(message);\n else p.log.error(message);\n process.exitCode = 1;\n return;\n }\n\n const s = quiet ? null : p.spinner();\n s?.start(`Calling ${name}`);\n const result = await callMcpTool(name, args, {\n errorHints: [\n \"List every tool this server registers: carrier env catalog\",\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(`${formatJsonOutput(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, name);\n}\n","import { API_URL } from \"./urls.js\";\nimport { getAccessToken } from \"./auth.js\";\nimport { redact } from \"./credentials.js\";\nimport { withNextStep } from \"./guidance.js\";\nimport { mcpTimeoutMs, type AskResult } from \"./ask.js\";\nimport { CARRIER_VERSION } from \"../../version.js\";\nimport type { RestMethod } from \"./domains.js\";\n\nexport interface RestCallOptions {\n /** Recovery steps appended when the endpoint itself reports an error. */\n errorHints?: string[];\n /** Second-call token from a prior 202, sent as X-Confirm-Token. */\n confirmToken?: 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\n/**\n * Bearer for `apps/api`, which is Clerk-only.\n *\n * `resolveCliToken()` from status.ts is deliberately NOT reused here: it falls\n * back to ESIMVAULT_API_TOKEN / CARRIER_OCS_API_TOKEN, and `apps/api/src/auth.ts`\n * accepts none of those — an OCS token would come back as a bare 401 that reads\n * like an expired login rather than the wrong credential entirely.\n */\nfunction resolveApiKey(): string | null {\n return (\n process.env.CARRIER_API_KEY?.trim() ||\n process.env.CARRIER_ORG_API_KEY?.trim() ||\n null\n );\n}\n\nfunction ocsTokenOnly(): boolean {\n return Boolean(\n process.env.ESIMVAULT_API_TOKEN?.trim() || process.env.CARRIER_OCS_API_TOKEN?.trim(),\n );\n}\n\n/** Fill `{name}` placeholders from args; return the rest for body or query. */\nfunction applyPath(\n path: string,\n args: Record<string, unknown>,\n): { path: string; rest: Record<string, unknown>; missing: string[] } {\n const rest = { ...args };\n const missing: string[] = [];\n const filled = path.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = rest[name];\n if (value === undefined || value === null || value === \"\") {\n missing.push(name);\n return `{${name}}`;\n }\n delete rest[name];\n return encodeURIComponent(String(value));\n });\n return { path: filled, rest, missing };\n}\n\nfunction queryString(args: Record<string, unknown>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(args)) {\n if (value === undefined || value === null) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction bodyText(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return \"\";\n try {\n const parsed = JSON.parse(trimmed) as { error?: unknown; message?: unknown };\n if (typeof parsed.error === \"string\") return parsed.error;\n if (typeof parsed.message === \"string\") return parsed.message;\n return trimmed;\n } catch {\n return trimmed;\n }\n}\n\n/**\n * Call one Carrier REST endpoint, returning the same shape as `callMcpTool` so\n * `runCapability` stays a single branch.\n *\n * The 202 + `confirm_token` handshake in `apps/api/src/confirm-token.ts` is\n * surfaced, not followed: the point of that protocol is that a human re-issues\n * the call, so auto-retrying it here would defeat the gate.\n */\nexport async function callRestEndpoint(\n method: RestMethod,\n path: string,\n args: Record<string, unknown>,\n opts: RestCallOptions = {},\n): Promise<AskResult> {\n const token = resolveApiKey() ?? (await getAccessToken());\n if (!token) {\n return {\n ok: false,\n text: withNextStep(\n ocsTokenOnly()\n ? \"Not signed in. An eSIMVault/OCS token is set, but the Carrier API only accepts Carrier credentials.\"\n : \"Not signed in.\",\n [\n \"Sign in from this terminal: carrier login\",\n \"No account yet? carrier open signup\",\n \"Headless/CI instead: export CARRIER_API_KEY=ak_… from Console → Settings → API Keys\",\n ],\n ),\n };\n }\n\n const { path: resolvedPath, rest, missing } = applyPath(path, args);\n if (missing.length) {\n return {\n ok: false,\n text: withNextStep(`Cannot build ${method} ${path}.`, [\n `Missing path value(s): ${missing.join(\", \")}`,\n \"See every flag: carrier <domain> <command> --help\",\n ]),\n };\n }\n\n const sendsBody = method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n const url = `${API_URL}${resolvedPath}${sendsBody ? \"\" : queryString(rest)}`;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n Accept: \"application/json\",\n \"User-Agent\": `carrier-cli/${CARRIER_VERSION}`,\n };\n if (sendsBody) headers[\"Content-Type\"] = \"application/json\";\n if (opts.confirmToken) headers[\"X-Confirm-Token\"] = opts.confirmToken;\n\n const timeoutMs = mcpTimeoutMs();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method,\n headers,\n signal: controller.signal,\n body: sendsBody ? JSON.stringify(rest) : undefined,\n });\n const raw = await res.text();\n\n // Two-step confirm. The token is single-use and expires in ~2 minutes.\n if (res.status === 202) {\n let confirmToken: string | undefined;\n let expires: number | undefined;\n let message = \"\";\n try {\n const parsed = JSON.parse(raw) as {\n confirm_token?: string;\n expires_in_seconds?: number;\n message?: string;\n };\n confirmToken = parsed.confirm_token;\n expires = parsed.expires_in_seconds;\n message = parsed.message ?? \"\";\n } catch {\n // Not JSON — fall through to the generic hint below.\n }\n return {\n ok: false,\n text: withNextStep(\n message || `${method} ${path} needs an explicit confirmation.`,\n confirmToken\n ? [\n `Re-run the same command with: --confirm-token ${confirmToken}`,\n `The token is single-use and expires in ${expires ?? 120}s.`,\n ]\n : [\"The server asked for confirmation but returned no token — retry the command.\"],\n ),\n };\n }\n\n if (res.status === 401 || res.status === 403) {\n return {\n ok: false,\n text: withNextStep(\n `Carrier API returned ${res.status} (auth rejected).`,\n [\n \"Confirm CARRIER_API_KEY is a valid org key (ak_…) from app.carrier.llc\",\n \"Or sign in from this terminal: carrier login\",\n ...(res.status === 403 ? [\"A 403 here usually means the key lacks write scope.\"] : []),\n ],\n ),\n };\n }\n\n if (!res.ok) {\n return {\n ok: false,\n text: withNextStep(\n redact(`${method} ${path} failed (${res.status}). ${bodyText(raw).slice(0, 500)}`),\n opts.errorHints ?? DEFAULT_ERROR_HINTS,\n ),\n };\n }\n\n // 2xx. Hand the body back untouched so --json stays pipeable; whatever the\n // endpoint chose to return, including a one-time secret, is the caller's.\n return { ok: true, text: raw.trim() || JSON.stringify({ status: res.status }) };\n } catch (e: unknown) {\n const aborted = e instanceof Error && (e.name === \"AbortError\" || e.name === \"TimeoutError\");\n if (aborted) {\n const secs = Math.round(timeoutMs / 1000);\n return {\n ok: false,\n text: withNextStep(`${method} ${path} timed out after ${secs}s (no response).`, [\n `Raise the deadline for one slow call: CARRIER_MCP_TIMEOUT_MS=${timeoutMs * 2} carrier …`,\n \"Confirm the service is up: check network access to https://api.carrier.llc\",\n ]),\n };\n }\n const msg = e instanceof Error ? e.message : String(e);\n return {\n ok: false,\n text: withNextStep(redact(`Could not reach the Carrier API: ${msg}`), [\n \"Verify outbound HTTPS to api.carrier.llc\",\n \"Use the interactive Claude path while offline from this machine\",\n ]),\n };\n } finally {\n clearTimeout(timer);\n }\n}\n"],"mappings":"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","names":["p","pc","resolve","join","join","join","join","writeFile","join","join","writeFile","p","homedir","join","join","homedir","plugin","ok","pc","homedir","join","mkdir","readFile","writeFile","text","text","port","resolve","text","p","ok","pc","password","p","pc","DEFAULT_ERROR_HINTS","text","note","pc","pc","resolve","login","rows","mark"]}