{"version":3,"sources":["../src/cli-doctor.ts","../src/cli.ts"],"names":[],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * `whatsapp doctor` — environment diagnosis for `@ar-agents/whatsapp`.\n *\n * Checks Node, WHATSAPP_ACCESS_TOKEN, WHATSAPP_PHONE_NUMBER_ID, peer deps,\n * and pings the Meta Graph API to verify the credentials. Lists the 6\n * registered tools and the `scopedTo` mode pattern.\n *\n * No third-party CLI deps. ANSI inlined; respects NO_COLOR.\n */\n\nconst C = {\n  reset: \"\\x1b[0m\",\n  dim: \"\\x1b[2m\",\n  red: \"\\x1b[31m\",\n  green: \"\\x1b[32m\",\n  yellow: \"\\x1b[33m\",\n  cyan: \"\\x1b[36m\",\n  bold: \"\\x1b[1m\",\n};\nconst NO_COLOR = process.env.NO_COLOR != null || !process.stdout.isTTY;\nconst c = (color: keyof typeof C, s: string) =>\n  NO_COLOR ? s : `${C[color]}${s}${C.reset}`;\n\ntype CheckResult =\n  | { kind: \"ok\"; line: string; detail?: string }\n  | { kind: \"warn\"; line: string; detail?: string }\n  | { kind: \"fail\"; line: string; detail?: string };\n\nfunction fmt(r: CheckResult): string {\n  const icon =\n    r.kind === \"ok\" ? c(\"green\", \"✓\") : r.kind === \"warn\" ? c(\"yellow\", \"⚠\") : c(\"red\", \"✗\");\n  const detail = r.detail ? `\\n  ${c(\"dim\", \"→ \" + r.detail)}` : \"\";\n  return `${icon} ${r.line}${detail}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Checks\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction checkNode(): CheckResult {\n  const major = Number(process.versions.node.split(\".\")[0]);\n  if (major >= 20) return { kind: \"ok\", line: `Node ${process.versions.node} (>= 20.0.0)` };\n  return {\n    kind: \"fail\",\n    line: `Node ${process.versions.node} too old`,\n    detail: \"@ar-agents/whatsapp requires Node 20+. Edge Runtime + Bun also supported.\",\n  };\n}\n\nfunction checkAccessToken(): CheckResult {\n  const t = process.env.WHATSAPP_ACCESS_TOKEN?.trim();\n  if (!t) {\n    return {\n      kind: \"fail\",\n      line: \"WHATSAPP_ACCESS_TOKEN not set\",\n      detail:\n        \"Get a permanent token at developers.facebook.com → your app → WhatsApp → API Setup → System User. Permanent tokens start with EAA…\",\n    };\n  }\n  if (t.startsWith(\"EAA\")) {\n    return { kind: \"ok\", line: \"WHATSAPP_ACCESS_TOKEN set (EAA prefix → Meta token)\" };\n  }\n  return {\n    kind: \"warn\",\n    line: \"WHATSAPP_ACCESS_TOKEN set, but unexpected prefix\",\n    detail: `Expected EAA…, got \"${t.slice(0, 6)}…\". Meta tokens start with EAA. If you generated a temporary \"User Access Token\" you need a System User token for production.`,\n  };\n}\n\nfunction checkPhoneNumberId(): CheckResult {\n  const id = process.env.WHATSAPP_PHONE_NUMBER_ID?.trim();\n  if (!id) {\n    return {\n      kind: \"fail\",\n      line: \"WHATSAPP_PHONE_NUMBER_ID not set\",\n      detail:\n        \"Find it at developers.facebook.com → WhatsApp → API Setup → 'From' phone number → the long numeric ID below the phone number, NOT the phone number itself.\",\n    };\n  }\n  if (!/^\\d+$/.test(id)) {\n    return {\n      kind: \"fail\",\n      line: `WHATSAPP_PHONE_NUMBER_ID is not numeric (got: ${id.slice(0, 8)}…)`,\n      detail:\n        \"This must be the numeric phone-number-id from Meta, not the +E.164 phone number itself.\",\n    };\n  }\n  return { kind: \"ok\", line: `WHATSAPP_PHONE_NUMBER_ID set (${id.length} digits)` };\n}\n\nasync function probeGraphApi(token: string, phoneId: string): Promise<CheckResult> {\n  const url = `https://graph.facebook.com/v23.0/${phoneId}?fields=id,display_phone_number,verified_name,quality_rating`;\n  try {\n    const res = await fetch(url, {\n      headers: { Authorization: `Bearer ${token}` },\n    });\n    if (res.status === 401) {\n      return {\n        kind: \"fail\",\n        line: \"Token rejected by Meta (401 Unauthorized)\",\n        detail:\n          \"Token is invalid, expired, or scoped to a different app. System User tokens don't expire; user tokens expire in 60 days.\",\n      };\n    }\n    if (res.status === 404) {\n      return {\n        kind: \"fail\",\n        line: \"Phone-number-id not found (404)\",\n        detail:\n          \"The token is valid but doesn't have access to this phone-number-id. Confirm it matches your WABA.\",\n      };\n    }\n    if (!res.ok) {\n      return {\n        kind: \"fail\",\n        line: `Meta Graph API responded with HTTP ${res.status}`,\n        detail: \"Unexpected status — check Meta status / token / phone-number-id.\",\n      };\n    }\n    const me = (await res.json()) as {\n      id?: string;\n      display_phone_number?: string;\n      verified_name?: string;\n      quality_rating?: string;\n    };\n    return {\n      kind: \"ok\",\n      line: \"Authenticated against graph.facebook.com\",\n      detail: `phone ${me.display_phone_number ?? \"?\"} · \"${me.verified_name ?? \"?\"}\" · quality ${me.quality_rating ?? \"?\"}`,\n    };\n  } catch (err) {\n    return {\n      kind: \"fail\",\n      line: \"Could not reach graph.facebook.com\",\n      detail: err instanceof Error ? err.message : \"Unknown network error.\",\n    };\n  }\n}\n\nasync function checkPeerDep(name: string, required: boolean): Promise<CheckResult> {\n  try {\n    await import(name);\n    return { kind: \"ok\", line: `${name} installed` };\n  } catch {\n    return {\n      kind: required ? \"fail\" : \"warn\",\n      line: `${name} not installed`,\n      detail: required ? `Required: pnpm add ${name}` : \"Optional.\",\n    };\n  }\n}\n\nfunction checkWebhookSecret(): CheckResult {\n  const s = process.env.WHATSAPP_APP_SECRET?.trim();\n  if (!s) {\n    return {\n      kind: \"warn\",\n      line: \"WHATSAPP_APP_SECRET not set\",\n      detail:\n        \"Required by verifyWebhookSignature(). Find it at developers.facebook.com → your app → Settings → Basic → App Secret.\",\n    };\n  }\n  if (s.length !== 32) {\n    return {\n      kind: \"warn\",\n      line: `WHATSAPP_APP_SECRET set but unexpected length (${s.length} chars)`,\n      detail: \"Meta App Secrets are typically 32 hex chars. Double-check the paste.\",\n    };\n  }\n  return { kind: \"ok\", line: `WHATSAPP_APP_SECRET set (32 chars)` };\n}\n\nfunction checkVerifyToken(): CheckResult {\n  const v = process.env.WHATSAPP_VERIFY_TOKEN?.trim();\n  if (!v) {\n    return {\n      kind: \"warn\",\n      line: \"WHATSAPP_VERIFY_TOKEN not set\",\n      detail:\n        \"Required for the webhook subscription handshake (verifyWebhookSubscription). Pick any random string and paste it both in your env and in the Meta webhook setup form.\",\n    };\n  }\n  return { kind: \"ok\", line: `WHATSAPP_VERIFY_TOKEN set` };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Manifest summary\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype Manifest = {\n  package: string;\n  version: string;\n  tools: Array<{ name: string }>;\n};\n\nasync function loadManifest(): Promise<Manifest | null> {\n  const fs = await import(\"node:fs/promises\");\n  for (const rel of [\"../tools.manifest.json\", \"../../tools.manifest.json\"]) {\n    try {\n      const url = new URL(rel, import.meta.url);\n      const text = await fs.readFile(url, \"utf-8\");\n      return JSON.parse(text) as Manifest;\n    } catch {\n      // try next\n    }\n  }\n  return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Main\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport async function runDoctor(): Promise<number> {\n  const lines: string[] = [];\n  lines.push(\"\");\n  lines.push(c(\"bold\", `${c(\"cyan\", \"@ar-agents/whatsapp\")} doctor`));\n  lines.push(c(\"dim\", \"  diagnosing your environment\"));\n  lines.push(\"\");\n\n  lines.push(fmt(checkNode()));\n  const tokenCheck = checkAccessToken();\n  lines.push(fmt(tokenCheck));\n  const phoneCheck = checkPhoneNumberId();\n  lines.push(fmt(phoneCheck));\n\n  if (tokenCheck.kind !== \"fail\" && phoneCheck.kind === \"ok\") {\n    const probe = await probeGraphApi(\n      process.env.WHATSAPP_ACCESS_TOKEN!.trim(),\n      process.env.WHATSAPP_PHONE_NUMBER_ID!.trim(),\n    );\n    lines.push(fmt(probe));\n  }\n\n  lines.push(fmt(checkWebhookSecret()));\n  lines.push(fmt(checkVerifyToken()));\n  lines.push(fmt(await checkPeerDep(\"ai\", true)));\n  lines.push(fmt(await checkPeerDep(\"zod\", true)));\n\n  lines.push(\"\");\n\n  const manifest = await loadManifest();\n  if (manifest) {\n    lines.push(c(\"bold\", `Tools registered: ${manifest.tools.length}`));\n    for (const tool of manifest.tools) {\n      lines.push(`  ${c(\"dim\", \"→\")} ${tool.name}`);\n    }\n    lines.push(\"\");\n    lines.push(\n      c(\n        \"yellow\",\n        \"scopedTo mode: bind outbound tools to a single sender by passing { phoneNumberId, scopedTo } to whatsappTools(). Recommended when an agent serves only one customer thread.\",\n      ),\n    );\n  } else {\n    lines.push(\n      fmt({\n        kind: \"warn\",\n        line: \"Could not load tools.manifest.json\",\n        detail: \"Reinstall the package — shipping is incomplete.\",\n      }),\n    );\n  }\n\n  lines.push(\"\");\n\n  process.stdout.write(lines.join(\"\\n\") + \"\\n\");\n  return lines.some((l) => l.includes(\"✗\")) ? 1 : 0;\n}\n","/**\n * CLI dispatcher for `@ar-agents/whatsapp`. Subcommands:\n *\n *   whatsapp doctor    — diagnose env, ping Meta Graph, list tools\n *   whatsapp help      — print usage\n *   whatsapp version   — print installed version\n *\n * Exit codes: 0 = ok or warn-only, 1 = at least one fail.\n */\n\nimport { runDoctor } from \"./cli-doctor\";\n\nconst HELP = `\\\n@ar-agents/whatsapp CLI\n\nCommands:\n  doctor               Diagnose your environment (Node, token, phone-id, peer deps, tools)\n  help                 Print this message\n  version              Print the installed package version\n\nEnvironment:\n  WHATSAPP_ACCESS_TOKEN     Required — Meta System User access token (EAA…).\n  WHATSAPP_PHONE_NUMBER_ID  Required — numeric phone-number-id from Meta.\n  WHATSAPP_APP_SECRET       Required for verifyWebhookSignature() (32 hex chars).\n  WHATSAPP_VERIFY_TOKEN     Required for the webhook subscription handshake.\n\nDocs: https://github.com/ar-agents/ar-agents/tree/main/packages/whatsapp\n`;\n\nasync function readVersion(): Promise<string> {\n  for (const rel of [\"../package.json\", \"../../package.json\"]) {\n    try {\n      const url = new URL(rel, import.meta.url);\n      const fs = await import(\"node:fs/promises\");\n      const text = await fs.readFile(url, \"utf-8\");\n      const pkg = JSON.parse(text) as { version?: string };\n      if (pkg.version) return pkg.version;\n    } catch {\n      // try next\n    }\n  }\n  return \"unknown\";\n}\n\nexport async function runCli(argv: string[]): Promise<number> {\n  const [, , cmd] = argv;\n\n  if (!cmd || cmd === \"help\" || cmd === \"--help\" || cmd === \"-h\") {\n    process.stdout.write(HELP);\n    return 0;\n  }\n\n  if (cmd === \"version\" || cmd === \"--version\" || cmd === \"-v\") {\n    process.stdout.write(`@ar-agents/whatsapp ${await readVersion()}\\n`);\n    return 0;\n  }\n\n  if (cmd === \"doctor\") return runDoctor();\n\n  process.stderr.write(`Unknown command: ${cmd}\\n\\nRun \\`whatsapp help\\` for usage.\\n`);\n  return 2;\n}\n"]}