import type { Command } from "commander"; import { providersAddCommand, providersListCommand, providersRemoveCommand, providersStatusCommand, } from "../commands/providers.js"; import { danger } from "../globals.js"; import { listChatProviders } from "../providers/registry.js"; import { defaultRuntime } from "../runtime.js"; import { hasExplicitOptions } from "./command-options.js"; import { runProviderLogin, runProviderLogout } from "./provider-auth.js"; const optionNamesAdd = [ "provider", "account", "name", "token", "tokenFile", "botToken", "appToken", "signalNumber", "cliPath", "dbPath", "service", "region", "authDir", "httpUrl", "httpHost", "httpPort", "useEnv", ] as const; const optionNamesRemove = ["provider", "account", "delete"] as const; const providerNames = listChatProviders() .map((meta) => meta.id) .join("|"); export function registerProvidersCli(program: Command) { const providers = program .command("providers") .alias("provider") .description("Manage chat provider accounts"); providers .command("list") .description("List configured providers + auth profiles") .option("--no-usage", "Skip provider usage/quota snapshots") .option("--json", "Output JSON", false) .action(async (opts) => { try { await providersListCommand(opts, defaultRuntime); } catch (err) { defaultRuntime.error(String(err)); defaultRuntime.exit(1); } }); providers .command("status") .description("Show gateway provider status (use status --deep for local)") .option("--probe", "Probe provider credentials", false) .option("--timeout ", "Timeout in ms", "10000") .option("--json", "Output JSON", false) .action(async (opts) => { try { await providersStatusCommand(opts, defaultRuntime); } catch (err) { defaultRuntime.error(String(err)); defaultRuntime.exit(1); } }); providers .command("add") .description("Add or update a provider account") .option("--provider ", `Provider (${providerNames})`) .option("--account ", "Account id (default when omitted)") .option("--name ", "Display name for this account") .option("--token ", "Bot token (Telegram/Discord)") .option("--token-file ", "Bot token file (Telegram)") .option("--bot-token ", "Slack bot token (xoxb-...)") .option("--app-token ", "Slack app token (xapp-...)") .option("--signal-number ", "Signal account number (E.164)") .option("--cli-path ", "CLI path (signal-cli or imsg)") .option("--db-path ", "iMessage database path") .option("--service ", "iMessage service (imessage|sms|auto)") .option("--region ", "iMessage region (for SMS)") .option("--auth-dir ", "WhatsApp auth directory override") .option("--http-url ", "Signal HTTP daemon base URL") .option("--http-host ", "Signal HTTP host") .option("--http-port ", "Signal HTTP port") .option("--use-env", "Use env token (default account only)", false) .action(async (opts, command) => { try { const hasFlags = hasExplicitOptions(command, optionNamesAdd); await providersAddCommand(opts, defaultRuntime, { hasFlags }); } catch (err) { defaultRuntime.error(String(err)); defaultRuntime.exit(1); } }); providers .command("remove") .description("Disable or delete a provider account") .option("--provider ", `Provider (${providerNames})`) .option("--account ", "Account id (default when omitted)") .option("--delete", "Delete config entries (no prompt)", false) .action(async (opts, command) => { try { const hasFlags = hasExplicitOptions(command, optionNamesRemove); await providersRemoveCommand(opts, defaultRuntime, { hasFlags }); } catch (err) { defaultRuntime.error(String(err)); defaultRuntime.exit(1); } }); providers .command("login") .description("Link a provider account (WhatsApp Web only)") .option("--provider ", "Provider alias (default: whatsapp)") .option("--account ", "WhatsApp account id (accountId)") .option("--verbose", "Verbose connection logs", false) .action(async (opts) => { try { await runProviderLogin( { provider: opts.provider as string | undefined, account: opts.account as string | undefined, verbose: Boolean(opts.verbose), }, defaultRuntime, ); } catch (err) { defaultRuntime.error(danger(`Provider login failed: ${String(err)}`)); defaultRuntime.exit(1); } }); providers .command("logout") .description("Log out of a provider session (WhatsApp Web only)") .option("--provider ", "Provider alias (default: whatsapp)") .option("--account ", "WhatsApp account id (accountId)") .action(async (opts) => { try { await runProviderLogout( { provider: opts.provider as string | undefined, account: opts.account as string | undefined, }, defaultRuntime, ); } catch (err) { defaultRuntime.error(danger(`Provider logout failed: ${String(err)}`)); defaultRuntime.exit(1); } }); }