@open-wa/wa-automate 5.0.0-alpha.6 → 5.0.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -25,7 +25,7 @@ wa-automate --help
25
25
 
26
26
  ## Documentation
27
27
 
28
- For full guides and API reference, visit the [docs site](https://docs.openwa.dev).
28
+ For full guides and API reference, visit the [docs site](https://openwa.dev).
29
29
 
30
30
  ## License
31
31
 
@@ -574,6 +574,7 @@ async function start(parsedArgs = parseCliArgs()) {
574
574
  authTimeoutMs: typeof config.authTimeout === "number" ? config.authTimeout * 1e3 : void 0,
575
575
  executablePath: executableResolution.executablePath,
576
576
  browserArgs: config.chromiumArgs,
577
+ allowDangerousBrowserArgs: config.allowDangerousBrowserArgs,
577
578
  userDataDir: config.userDataDir,
578
579
  ephemeral: config.ephemeral,
579
580
  logConsole: config.logConsole,
@@ -795,4 +796,4 @@ Object.defineProperty(exports, "start", {
795
796
  }
796
797
  });
797
798
 
798
- //# sourceMappingURL=cli-runtime-B7_3MM0c.cjs.map
799
+ //# sourceMappingURL=cli-runtime-CEFbPQ-1.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-runtime-B7_3MM0c.cjs","names":["ApiServer","eventRegistry","LightpandaDriver","PuppeteerDriver","ClientFacade"],"sources":["../src/server/hono-server.ts","../src/cli/output-sink.ts","../src/cli-runtime.ts"],"sourcesContent":["import { ApiServer, createApiServer as createSharedApiServer } from '@open-wa/api';\nimport type { Config } from '@open-wa/config';\n\nexport class WAServer extends ApiServer {\n constructor(config: Config) {\n super({ config });\n }\n}\n\nexport function createApiServer(config: Config) {\n return createSharedApiServer(config);\n}\n","import boxen from 'boxen';\nimport qrcode from 'qrcode-terminal';\n\nexport type CliOutputLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface CliOutputEntry {\n level: CliOutputLevel;\n message: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface CliStatusUpdate {\n phase:\n | 'boot'\n | 'config.resolved'\n | 'server.starting'\n | 'server.started'\n | 'client.starting'\n | 'launch.auth'\n | 'launch.helpers'\n | 'launch.patch'\n | 'launch.license'\n | 'launch.finalize'\n | 'auth.qr'\n | 'client.ready'\n | 'shutdown.starting'\n | 'shutdown.complete'\n | 'error';\n detail?: string;\n sessionId?: string;\n}\n\nexport interface CliQrPayload {\n qr: string;\n sessionId: string;\n}\n\nexport interface CliOutputSink {\n write(entry: CliOutputEntry): void;\n status(update: CliStatusUpdate): void;\n qr(payload: CliQrPayload): void;\n}\n\nfunction writeToConsole(level: CliOutputLevel, message: string): void {\n if (level === 'warn') {\n console.warn(message);\n return;\n }\n\n if (level === 'error') {\n console.error(message);\n return;\n }\n\n console.log(message);\n}\n\nexport function createConsoleOutputSink(): CliOutputSink {\n return {\n write(entry) {\n writeToConsole(entry.level, entry.message);\n },\n status() {\n // Status updates are semantic signals for richer presenters.\n },\n qr(payload) {\n qrcode.generate(payload.qr, { small: true }, (terminalQrCode) => {\n console.log(\n boxen(terminalQrCode, {\n title: payload.sessionId,\n padding: 1,\n titleAlignment: 'center',\n })\n );\n });\n },\n };\n}\n\nlet activeSink: CliOutputSink = createConsoleOutputSink();\n\nexport function getCliOutputSink(): CliOutputSink {\n return activeSink;\n}\n\nexport function setCliOutputSink(sink: CliOutputSink): void {\n activeSink = sink;\n}\n\nexport function resetCliOutputSink(): void {\n activeSink = createConsoleOutputSink();\n}\n","import { createClient } from '@open-wa/core';\nimport { Client as ClientFacade } from '@open-wa/client';\nimport { LightpandaDriver } from '@open-wa/driver-lightpanda';\nimport { PuppeteerDriver } from '@open-wa/driver-puppeteer';\nimport { eventRegistry } from '@open-wa/schema';\nimport { WAServer } from './server/hono-server';\nimport { resolveConfig, type PartialConfig, type Config, type TrackedConfig } from '@open-wa/config';\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { getCliOutputSink, type CliOutputSink } from './cli/output-sink';\n\nexport interface CliRuntimeResult {\n server: WAServer;\n client: ClientFacade;\n config: Config;\n events: ClientFacade['events'];\n}\n\ninterface RuntimeEventPublisher {\n publish(eventName: string, payload: any): void;\n}\n\nfunction bridgeRuntimeEvents(\n openwaClient: Awaited<ReturnType<typeof createClient>>,\n publishRuntimeEvent: (eventName: string, payload: any) => void,\n): () => void {\n if (typeof openwaClient.events.onAny === 'function' && typeof openwaClient.events.offAny === 'function') {\n openwaClient.events.onAny(publishRuntimeEvent);\n return () => openwaClient.events.offAny(publishRuntimeEvent);\n }\n\n const unsubscribers: Array<() => void> = [];\n const bridgedEvents = new Set(eventRegistry.getAll().map((def) => def.meta.eventName));\n\n bridgedEvents.forEach((eventName) => {\n const handler = (payload: any) => publishRuntimeEvent(eventName, payload);\n openwaClient.events.on(eventName as never, handler);\n unsubscribers.push(() => openwaClient.events.off(eventName as never, handler));\n });\n\n return () => {\n unsubscribers.forEach((unsubscribe) => unsubscribe());\n };\n}\n\nfunction attachLaunchNarration(\n openwaClient: Awaited<ReturnType<typeof createClient>>,\n sink: CliOutputSink,\n sessionId: string,\n): () => void {\n const unsubscribers: Array<() => void> = [];\n const on = (event: string, handler: (...args: any[]) => void) => {\n openwaClient.events.on(event as never, handler);\n unsubscribers.push(() => openwaClient.events.off(event as never, handler));\n };\n\n on('launch.auth.check.before', (event: any) => {\n sink.status({ phase: 'launch.auth', sessionId, detail: `Authenticating (timeout=${event?.details?.timeoutMs ?? '∞'}ms)` });\n });\n\n on('launch.auth.check.after', (event: any) => {\n sink.write({ level: 'info', message: `Auth detected via ${event?.details?.method ?? 'unknown'} (${event?.details?.isAuthenticated ? 'authenticated' : 'not-authenticated'})` });\n });\n\n on('launch.helper.pre_api.before', (event: any) => {\n sink.status({ phase: 'launch.helpers', sessionId, detail: event?.details?.mode === 'scripts' ? 'Injecting pre-API helper assets...' : 'Pre-API helpers already present' });\n });\n\n on('launch.helper.pre_api.after', (event: any) => {\n sink.write({ level: 'info', message: `Pre-API helper phase complete (${event?.details?.mode ?? 'unknown'})` });\n });\n\n on('internal_launch_progress', (event: any) => {\n const prefix = (event?.value || event?.value === 0) ? `${event.value}% ` : '';\n if (event?.text) sink.write({ level: 'info', message: `${prefix}${event.text}`.trim() });\n });\n\n on('critical_internal_message', (event: any) => {\n sink.write({ level: 'warn', message: `Internal launch message: ${event?.text ?? event?.value ?? 'unknown'}` });\n });\n\n on('launch.patch.init.before', (event: any) => {\n if (event?.details?.phase === 'preload') {\n sink.status({ phase: 'launch.patch', sessionId, detail: 'Downloading patches from CDN...' });\n }\n });\n\n on('launch.patch.init.after', (event: any) => {\n if (event?.details?.phase === 'preload') {\n const source = event?.details?.source ?? 'unknown';\n const tag = event?.details?.tag ? ` tag=${event.details.tag}` : '';\n const available = Array.isArray(event?.details?.available) ? event.details.available.length : 0;\n const durationMs = event?.durationMs;\n const durationStr = durationMs ? ` in ${(durationMs / 1000).toFixed(2)}s` : '';\n sink.write({ level: 'info', message: `Downloaded patches${durationStr} (source=${source}, available=${available}${tag})` });\n }\n });\n\n on('patch.init.before', (event: any) => {\n if (event?.details?.phase === 'apply') {\n const count = Array.isArray(event?.details?.patchIds) ? event.details.patchIds.length : 0;\n sink.status({ phase: 'launch.patch', sessionId, detail: `Installing patches (${count} queued)` });\n }\n });\n\n on('patch.apply.before', (event: any) => {\n sink.status({ phase: 'launch.patch', sessionId, detail: `Applying patch: ${event?.details?.patchId ?? 'unknown'}` });\n });\n\n on('patch.apply.after', (event: any) => {\n sink.write({\n level: event?.details?.outcome === 'failed' ? 'warn' : 'info',\n message: `Patch ${event?.details?.patchId ?? 'unknown'}: ${event?.details?.outcome ?? (event?.details?.applied ? 'applied' : 'unknown')}${event?.details?.detail ? ` — ${event.details.detail}` : ''}`,\n });\n });\n\n on('patch.init.after', (event: any) => {\n if (event?.details?.phase === 'apply') {\n const applied = Array.isArray(event?.details?.applied) ? event.details.applied : [];\n const outcome = event?.details?.outcome ?? 'unknown';\n const tag = applied.length > 0 ? applied.join(', ') : outcome;\n const durationMs = event?.durationMs;\n const durationStr = durationMs ? ` in ${(durationMs / 1000).toFixed(2)}s` : '';\n sink.write({\n level: event?.details?.blockingFailure ? 'warn' : 'info',\n message: `Patches Installed${durationStr}: ${tag}`,\n });\n }\n });\n\n on('launch.patch.integrity.before', () => {\n sink.status({ phase: 'launch.patch', sessionId, detail: 'Validating patched runtime...' });\n });\n\n on('launch.patch.integrity.after', (event: any) => {\n sink.write({ level: event?.details?.usable ? 'info' : 'warn', message: `Patched runtime validation: ${event?.details?.usable ? 'usable' : 'failed'}${event?.details?.failureReason ? ` (${event.details.failureReason})` : ''}` });\n });\n\n on('launch.license.check.before', (event: any) => {\n sink.status({ phase: 'launch.license', sessionId, detail: `Checking license (${event?.details?.source ?? 'local'})` });\n });\n\n on('launch.license.check.after', (event: any) => {\n sink.write({ level: event?.details?.blockingFailure ? 'warn' : 'info', message: `License check: ${event?.details?.status ?? 'unknown'}${event?.details?.detail ? ` — ${event.details.detail}` : ''}` });\n });\n\n on('license.inject.before', () => {\n sink.status({ phase: 'launch.license', sessionId, detail: 'Injecting license payload...' });\n });\n\n on('license.inject.after', (event: any) => {\n sink.write({ level: event?.details?.success ? 'info' : 'warn', message: `License inject: ${event?.details?.success ? 'success' : 'failed'}${event?.details?.status ? ` (${event.details.status})` : ''}${event?.details?.detail ? ` — ${event.details.detail}` : ''}` });\n });\n\n on('launch.auth.qr.generated', (event: any) => {\n const qrIndex = event?.details?.qrIndex ?? '?';\n sink.status({ phase: 'launch.auth', sessionId, detail: `QR code generated (#${qrIndex})` });\n });\n\n on('launch.client.finalize.before', (event: any) => {\n sink.status({ phase: 'launch.finalize', sessionId, detail: `Finalizing session (${event?.details?.validationStage ?? 'unknown'})` });\n });\n\n on('launch.client.finalize.after', (event: any) => {\n sink.write({ level: event?.details?.success ? 'info' : 'warn', message: `Finalize: ${event?.details?.outcome ?? 'unknown'}${event?.details?.detail ? ` — ${event.details.detail}` : ''}` });\n });\n\n on('error', (event: any) => {\n const scope = event?.scope ?? 'unknown';\n const msg = event?.error?.message ?? String(event?.error ?? 'unknown error');\n const fatal = event?.fatal ? ' [FATAL]' : '';\n sink.write({ level: 'error', message: `${fatal} ${scope}: ${msg}`.trim() });\n });\n\n return () => {\n unsubscribers.forEach((unsubscribe) => unsubscribe());\n };\n}\n\nconst CHROME_CACHE_FILE = resolve(process.cwd(), '.open-wa', 'chrome-executable-path.json');\n\ninterface ChromePathCacheRecord {\n executablePath?: string;\n updatedAt?: string;\n}\n\ninterface ExecutablePathResolution {\n executablePath?: string;\n source:\n | 'config'\n | 'cache'\n | 'chrome_installation'\n | 'driver_default'\n | 'lightpanda_config'\n | 'lightpanda_sdk_default';\n warning?: string;\n}\n\ninterface DriverSelection {\n driver: PuppeteerDriver | LightpandaDriver;\n engineLabel: 'Puppeteer' | 'Lightpanda';\n executableResolution: ExecutablePathResolution;\n preferLocalChrome: boolean;\n}\n\nexport interface ParsedCliArgs {\n procName: string;\n pm2: boolean;\n forwardedArgs: string[];\n configPath?: string;\n cliOverrides: PartialConfig;\n verbose: boolean;\n unsupportedWarnings: string[];\n}\n\nexport function getChromeCacheFilePath(): string {\n return CHROME_CACHE_FILE;\n}\n\nexport function readChromePathCache(cacheFilePath: string = getChromeCacheFilePath()): ChromePathCacheRecord | undefined {\n if (!existsSync(cacheFilePath)) {\n return undefined;\n }\n\n try {\n const raw = JSON.parse(readFileSync(cacheFilePath, 'utf8')) as ChromePathCacheRecord;\n if (!raw || typeof raw !== 'object') {\n return undefined;\n }\n\n return {\n executablePath: typeof raw.executablePath === 'string' ? raw.executablePath : undefined,\n updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : undefined,\n };\n } catch {\n return undefined;\n }\n}\n\nexport function writeChromePathCache(executablePath: string, cacheFilePath: string = getChromeCacheFilePath()): void {\n mkdirSync(dirname(cacheFilePath), { recursive: true });\n writeFileSync(cacheFilePath, JSON.stringify({ executablePath, updatedAt: new Date().toISOString() }, null, 2), 'utf8');\n}\n\nexport function clearChromePathCache(cacheFilePath: string = getChromeCacheFilePath()): void {\n if (existsSync(cacheFilePath)) {\n rmSync(cacheFilePath, { force: true });\n }\n}\n\nexport function isUsableExecutablePath(executablePath?: string): executablePath is string {\n return !!executablePath && existsSync(executablePath);\n}\n\nfunction getExplicitUseChromePreference(rawConfigs?: TrackedConfig['rawConfigs']): boolean | undefined {\n const explicitConfigSources = [\n rawConfigs?.file,\n rawConfigs?.env,\n rawConfigs?.cli,\n rawConfigs?.programmatic,\n ];\n\n for (let index = explicitConfigSources.length - 1; index >= 0; index -= 1) {\n const source = explicitConfigSources[index];\n if (source?.useChrome !== undefined) {\n return source.useChrome;\n }\n }\n\n return undefined;\n}\n\nexport function shouldPreferLocalChrome(config: Config, rawConfigs?: TrackedConfig['rawConfigs']): boolean {\n if (config.useLightpanda) {\n return false;\n }\n\n if (config.executablePath) {\n return false;\n }\n\n const explicitUseChrome = getExplicitUseChromePreference(rawConfigs);\n if (explicitUseChrome !== undefined) {\n return explicitUseChrome;\n }\n\n return true;\n}\n\nfunction getVal(argv: string[], flag: string): string | undefined {\n const index = argv.findIndex(arg => arg === flag);\n return index !== -1 ? argv[index + 1] : undefined;\n}\n\nexport function parseCliArgs(argv: string[] = process.argv.slice(2)): ParsedCliArgs {\n const cliOverrides: PartialConfig = {};\n const unsupportedWarnings: string[] = [];\n let verbose = false;\n let configPath: string | undefined;\n\n const sessionId = getVal(argv, '--session-id') || 'session';\n cliOverrides.sessionId = sessionId;\n\n const portValue = getVal(argv, '--port') || getVal(argv, '-p');\n if (portValue) cliOverrides.port = parseInt(portValue, 10);\n\n const host = getVal(argv, '--host') || getVal(argv, '-h');\n if (host) cliOverrides.host = host;\n\n const apiKey = getVal(argv, '--api-key') || getVal(argv, '--key') || getVal(argv, '-k');\n if (apiKey) cliOverrides.apiKey = apiKey;\n\n const logLevel = getVal(argv, '--log-level');\n if (logLevel) cliOverrides.logLevel = logLevel;\n\n if (argv.includes('--no-ezqr')) cliOverrides.ezqr = false;\n if (argv.includes('--headful')) cliOverrides.headless = false;\n if (argv.includes('--headless')) cliOverrides.headless = true;\n if (argv.includes('--use-chrome')) cliOverrides.useChrome = true;\n if (argv.includes('--use-lightpanda')) cliOverrides.useLightpanda = true;\n if (argv.includes('--log-console')) cliOverrides.logConsole = true;\n if (argv.includes('--aggressive-garbage-collection')) cliOverrides.aggressiveGarbageCollection = true;\n if (argv.includes('--no-dashboard')) cliOverrides.dashboard = false;\n if (argv.includes('--ephemeral')) cliOverrides.ephemeral = true;\n\n const qrTimeout = getVal(argv, '--qr-timeout');\n if (qrTimeout) cliOverrides.qrTimeout = parseInt(qrTimeout, 10);\n\n const dashboardPort = getVal(argv, '--dashboard-port');\n if (dashboardPort) cliOverrides.dashboardPort = parseInt(dashboardPort, 10);\n\n const licenseKey = getVal(argv, '--license-key') || getVal(argv, '-l');\n if (licenseKey) cliOverrides.licenseKey = licenseKey;\n\n const webhook = getVal(argv, '--webhook') || getVal(argv, '-w');\n if (webhook) cliOverrides.webhook = webhook;\n\n const proxyHost = getVal(argv, '--proxy-host');\n if (proxyHost) cliOverrides.proxyHost = proxyHost;\n\n const proxyToken = getVal(argv, '--proxy-token');\n if (proxyToken) cliOverrides.proxyToken = proxyToken;\n\n const readyWebhook = getVal(argv, '--ready-webhook');\n if (readyWebhook) unsupportedWarnings.push(`--ready-webhook was provided (${readyWebhook}) but ready-webhook delivery is not yet wired in v5 CLI.`);\n\n if (argv.includes('-v') || argv.includes('--verbose')) {\n verbose = true;\n cliOverrides.disableSpins = true;\n cliOverrides.logConsole = true;\n cliOverrides.logLevel = cliOverrides.logLevel || 'debug';\n }\n\n if (argv.includes('--stats')) {\n unsupportedWarnings.push('--stats was provided but swagger-stats parity is not restored; v5 only exposes the compatibility redirect/deprecation route.');\n }\n\n if (argv.includes('--generate-api-docs')) {\n unsupportedWarnings.push('--generate-api-docs was provided; runtime docs are always served from the shared API layer and no separate collection generation step currently runs at CLI boot.');\n }\n\n if (argv.includes('--tunnel')) {\n unsupportedWarnings.push('--tunnel was provided but tunnel setup parity is not yet restored in the v5 CLI.');\n }\n\n if (argv.includes('--chatwoot-url') || argv.includes('--twilio-webhook') || argv.includes('--bot-press-url')) {\n unsupportedWarnings.push('Legacy integration flags (Chatwoot/Twilio/BotPress) were provided but are not yet wired into the v5 CLI boot path.');\n }\n\n if (argv.includes('--use-session-id-in-path')) {\n cliOverrides.sessionId = sessionId;\n }\n\n configPath = getVal(argv, '--config') || getVal(argv, '-c');\n\n const procName = getVal(argv, '--name') || sessionId || '@OPEN-WA EASY API';\n const pm2 = argv.includes('--pm2');\n\n return {\n procName,\n pm2,\n forwardedArgs: argv,\n configPath,\n cliOverrides,\n verbose,\n unsupportedWarnings,\n };\n}\n\nexport async function resolveExecutablePath(\n config: Config,\n options: {\n preferLocalChrome?: boolean;\n cacheFilePath?: string;\n } = {}\n): Promise<ExecutablePathResolution> {\n if (config.executablePath) {\n return {\n executablePath: config.executablePath,\n source: 'config',\n };\n }\n\n const preferLocalChrome = options.preferLocalChrome ?? config.useChrome;\n if (!preferLocalChrome) {\n return {\n source: 'driver_default',\n };\n }\n\n const cacheFilePath = options.cacheFilePath ?? getChromeCacheFilePath();\n const cachedPath = readChromePathCache(cacheFilePath)?.executablePath;\n if (isUsableExecutablePath(cachedPath)) {\n return {\n executablePath: cachedPath,\n source: 'cache',\n };\n }\n\n if (cachedPath) {\n clearChromePathCache(cacheFilePath);\n }\n\n const { Launcher } = await import('chrome-launcher');\n const detectedPath = Launcher.getInstallations().find((installationPath) => isUsableExecutablePath(installationPath));\n\n if (detectedPath) {\n writeChromePathCache(detectedPath, cacheFilePath);\n return {\n executablePath: detectedPath,\n source: 'chrome_installation',\n };\n }\n\n clearChromePathCache(cacheFilePath);\n\n return {\n source: 'driver_default',\n warning: 'Chrome resolution warning: no valid local Chrome installation was found. Falling back to Puppeteer/default driver browser resolution.',\n };\n}\n\nfunction resolveLightpandaExecutablePath(config: Config): ExecutablePathResolution {\n const executablePath = config.lightpanda?.executablePath;\n if (executablePath) {\n return {\n executablePath,\n source: 'lightpanda_config',\n };\n }\n\n return {\n source: 'lightpanda_sdk_default',\n };\n}\n\nasync function selectRuntimeDriver(config: Config, rawConfigs?: TrackedConfig['rawConfigs']): Promise<DriverSelection> {\n if (config.useLightpanda) {\n return {\n driver: new LightpandaDriver(),\n engineLabel: 'Lightpanda',\n executableResolution: resolveLightpandaExecutablePath(config),\n preferLocalChrome: false,\n };\n }\n\n const preferLocalChrome = shouldPreferLocalChrome(config, rawConfigs);\n const executableResolution = await resolveExecutablePath(config, { preferLocalChrome });\n\n return {\n driver: new PuppeteerDriver(),\n engineLabel: 'Puppeteer',\n executableResolution,\n preferLocalChrome,\n };\n}\n\nfunction printStartupSummary(\n config: Config,\n resolution: ExecutablePathResolution,\n preferLocalChrome: boolean,\n engineLabel: DriverSelection['engineLabel'],\n) {\n const host = config.host.includes('http') ? config.host : `http://${config.host}`;\n const sink = getCliOutputSink();\n sink.write({ level: 'info', message: `Easy API session: ${config.sessionId}` });\n sink.write({ level: 'info', message: `Health: ${host}:${config.port}/health` });\n sink.write({ level: 'info', message: `API Explorer: ${host}:${config.port}/api-docs/` });\n sink.write({ level: 'info', message: `Swagger JSON: ${host}:${config.port}/meta/swagger.json` });\n sink.write({ level: 'info', message: `Postman JSON: ${host}:${config.port}/meta/postman.json` });\n sink.write({ level: 'info', message: `Browser mode: ${config.headless ? 'headless' : 'headful'}` });\n sink.write({ level: 'info', message: `Browser engine: ${engineLabel}` });\n if (config.dashboard) {\n sink.write({ level: 'info', message: `Dashboard: ${host}:${config.port}/dashboard/` });\n } else {\n sink.write({ level: 'info', message: 'Dashboard: disabled (--no-dashboard)' });\n }\n if (resolution.source === 'lightpanda_config' && resolution.executablePath) {\n sink.write({ level: 'info', message: `Browser executable: explicit Lightpanda override (${resolution.executablePath})` });\n } else if (resolution.source === 'lightpanda_sdk_default') {\n sink.write({ level: 'info', message: 'Browser executable: Lightpanda SDK managed executable (shared cache/default resolution)' });\n } else if (resolution.source === 'config' && config.executablePath) {\n sink.write({ level: 'info', message: `Browser executable: explicit override (${config.executablePath})` });\n } else if (resolution.source === 'cache') {\n sink.write({ level: 'info', message: `Browser executable: local Chrome from cache (${resolution.executablePath})` });\n } else if (resolution.source === 'chrome_installation') {\n sink.write({ level: 'info', message: `Browser executable: local Chrome detected (${resolution.executablePath})` });\n } else if (preferLocalChrome) {\n sink.write({ level: 'info', message: 'Browser executable: driver default fallback (local Chrome unavailable)' });\n }\n if (config.webhook) {\n sink.write({\n level: 'warn',\n message: `Webhook configured (${config.webhook}) but v5 CLI webhook registration parity is not yet restored.`,\n });\n }\n}\n\nexport async function start(parsedArgs: ParsedCliArgs = parseCliArgs()): Promise<CliRuntimeResult> {\n const { configPath, cliOverrides, verbose, unsupportedWarnings } = parsedArgs;\n const sink = getCliOutputSink();\n\n sink.status({ phase: 'boot' });\n\n const { config, sources, configFilePath, rawConfigs } = await resolveConfig({\n configPath,\n cliOverrides: {\n disableSpins: true,\n apiLifecycle: 'hybrid',\n host: '0.0.0.0',\n port: 8002,\n ...cliOverrides,\n },\n includeRawConfigs: true,\n verbose,\n });\n\n if (verbose) {\n sink.write({ level: 'info', message: `Config sources: ${sources.join(', ')}` });\n if (configFilePath) {\n sink.write({ level: 'info', message: `Config file: ${configFilePath}` });\n }\n }\n\n sink.status({ phase: 'config.resolved', sessionId: config.sessionId });\n\n unsupportedWarnings.forEach((warning) => sink.write({ level: 'warn', message: `Compatibility warning: ${warning}` }));\n\n const driverSelection = await selectRuntimeDriver(config, rawConfigs);\n const { driver, engineLabel, executableResolution, preferLocalChrome } = driverSelection;\n if (executableResolution.warning) {\n sink.write({ level: 'warn', message: executableResolution.warning });\n }\n\n const server = new WAServer(config);\n sink.status({ phase: 'server.starting', sessionId: config.sessionId });\n\n await server.start();\n sink.status({ phase: 'server.started', sessionId: config.sessionId });\n\n printStartupSummary(config, executableResolution, preferLocalChrome, engineLabel);\n\n sink.status({ phase: 'client.starting', sessionId: config.sessionId });\n sink.write({ level: 'info', message: 'Starting WhatsApp Client...' });\n\n const openwaClient = await createClient({\n sessionId: config.sessionId,\n driver,\n deleteSessionDataOnLogout: config.deleteSessionDataOnLogout,\n killClientOnLogout: config.killClientOnLogout,\n sessionDataPath: config.sessionDataPath,\n debug: config.logLevel === 'debug' || verbose || config.logConsole,\n headless: config.headless,\n qrTimeoutMs: typeof config.qrTimeout === 'number' ? config.qrTimeout * 1000 : undefined,\n authTimeoutMs: typeof config.authTimeout === 'number' ? config.authTimeout * 1000 : undefined,\n executablePath: executableResolution.executablePath,\n browserArgs: config.chromiumArgs,\n userDataDir: config.userDataDir,\n ephemeral: config.ephemeral,\n logConsole: config.logConsole,\n logConsoleErrors: config.logConsoleErrors,\n blockCrashLogs: config.blockCrashLogs,\n blockAssets: config.blockAssets,\n safeMode: config.safeMode,\n licenseKey: config.licenseKey as any,\n });\n\n server.setReadinessProvider(() => ({ ...openwaClient.getReadiness(), state: openwaClient.getState() }));\n const detachLaunchNarration = attachLaunchNarration(openwaClient, sink, config.sessionId);\n\n openwaClient.events.on('launch.auth.qr.generated', (event) => {\n const qr = event.details?.qr;\n if (!qr) {\n return;\n }\n\n if (config.qrLogSkip) {\n sink.write({ level: 'info', message: 'New QR Code generated. Not printing in console because qrLogSkip is set to true' });\n } else {\n sink.status({ phase: 'auth.qr', sessionId: config.sessionId, detail: 'QR code generated' });\n sink.qr({ qr, sessionId: config.sessionId });\n }\n\n server.setQR(qr);\n });\n\n const client = new ClientFacade({\n client: openwaClient,\n transport: openwaClient.getTransport(),\n });\n\n server.setClient(client as any);\n\n const runtimeBridgeListeners = new Set<(event: string, value: any) => void>();\n const runtimeEventPublishers: RuntimeEventPublisher[] = [\n {\n publish: (eventName, payload) => {\n runtimeBridgeListeners.forEach((listener) => {\n listener(eventName, payload);\n });\n },\n },\n ];\n\n const publishRuntimeEvent = (eventName: string, payload: any) => {\n runtimeEventPublishers.forEach((publisher) => {\n publisher.publish(eventName, payload);\n });\n };\n\n const detachRuntimeBridge = bridgeRuntimeEvents(openwaClient, publishRuntimeEvent);\n\n // Bridge core events to the socket manager so dashboard clients\n // receive live events when they send register_ev.\n if (typeof server.setEventBridge === 'function') {\n server.setEventBridge({\n onAny: (listener: (event: string, value: any) => void) => {\n runtimeBridgeListeners.add(listener);\n },\n offAny: (listener: (event: string, value: any) => void) => {\n runtimeBridgeListeners.delete(listener);\n },\n });\n }\n\n openwaClient.events.on('launch.browser.init.after', async () => {\n const page = openwaClient.getTransport().getPage();\n if (page) {\n await server.setPage(page as any).catch(() => {});\n }\n });\n\n try {\n await client.start();\n } catch (startError) {\n const msg = startError instanceof Error ? startError.message : String(startError);\n sink.write({ level: 'error', message: `Bootstrap failed: ${msg}` });\n sink.write({ level: 'warn', message: 'Session kept alive for debugging. Browser page is still open.' });\n sink.write({ level: 'warn', message: 'The server is running — use /health and /api-docs to inspect state.' });\n detachLaunchNarration();\n return { server, client, config, events: openwaClient.events };\n }\n\n const readiness = openwaClient.getReadiness();\n sink.status({\n phase: 'client.ready',\n sessionId: config.sessionId,\n detail: `status=${readiness.status}, exposureSafe=${readiness.exposureSafe}`,\n });\n sink.write({\n level: 'info',\n message: `WhatsApp Client ready with state: ${client.getState()} (status=${readiness.status}, exposureSafe=${readiness.exposureSafe})`,\n });\n\n detachLaunchNarration();\n return { server, client, config, events: openwaClient.events };\n}\n\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<CliRuntimeResult | void> {\n const parsedArgs = parseCliArgs(argv);\n\n if (parsedArgs.pm2) {\n const { spawn } = require('child_process');\n const sink = getCliOutputSink();\n const pm2Command = getPm2Command();\n const pm2SpawnOptions = getPm2SpawnOptions();\n try {\n const pm2 = spawn(pm2Command, ['--version'], pm2SpawnOptions);\n\n await new Promise<void>((resolve, reject) => {\n pm2.on('error', reject);\n pm2.on('exit', (code: number | null) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`pm2 probe exited with code ${code ?? 'unknown'}`));\n });\n pm2.stdout.on('data', () => resolve());\n });\n\n const pm2Flags = parsedArgs.forwardedArgs.filter((flag: string) => flag !== '--pm2');\n const cliPath = fileURLToPath(new URL('../dist/cli.cjs', import.meta.url));\n\n spawn(pm2Command, [\n 'start',\n cliPath,\n '--name', parsedArgs.procName,\n '--stop-exit-codes', '88',\n '--',\n ...pm2Flags,\n ], {\n ...pm2SpawnOptions,\n stdio: 'inherit',\n detached: true\n });\n return;\n } catch (error: unknown) {\n if (isCommandNotFoundError(error)) {\n sink.write({ level: 'error', message: 'pm2 not found. Please install with: npm install -g pm2' });\n return;\n }\n throw error;\n }\n }\n\n return await start(parsedArgs);\n}\n\nfunction getPm2Command(): string {\n return process.platform === 'win32' ? 'pm2.cmd' : 'pm2';\n}\n\nfunction getPm2SpawnOptions(): { shell: boolean } {\n return { shell: process.platform === 'win32' };\n}\n\nfunction isCommandNotFoundError(error: unknown): boolean {\n if (typeof error !== 'object' || error === null) {\n return false;\n }\n\n const systemError = error as { code?: unknown; errno?: unknown };\n return systemError.code === 'ENOENT' || systemError.errno === -2;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli-runtime-CEFbPQ-1.cjs","names":["ApiServer","eventRegistry","LightpandaDriver","PuppeteerDriver","ClientFacade"],"sources":["../src/server/hono-server.ts","../src/cli/output-sink.ts","../src/cli-runtime.ts"],"sourcesContent":["import { ApiServer, createApiServer as createSharedApiServer } from '@open-wa/api';\nimport type { Config } from '@open-wa/config';\n\nexport class WAServer extends ApiServer {\n constructor(config: Config) {\n super({ config });\n }\n}\n\nexport function createApiServer(config: Config) {\n return createSharedApiServer(config);\n}\n","import boxen from 'boxen';\nimport qrcode from 'qrcode-terminal';\n\nexport type CliOutputLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface CliOutputEntry {\n level: CliOutputLevel;\n message: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface CliStatusUpdate {\n phase:\n | 'boot'\n | 'config.resolved'\n | 'server.starting'\n | 'server.started'\n | 'client.starting'\n | 'launch.auth'\n | 'launch.helpers'\n | 'launch.patch'\n | 'launch.license'\n | 'launch.finalize'\n | 'auth.qr'\n | 'client.ready'\n | 'shutdown.starting'\n | 'shutdown.complete'\n | 'error';\n detail?: string;\n sessionId?: string;\n}\n\nexport interface CliQrPayload {\n qr: string;\n sessionId: string;\n}\n\nexport interface CliOutputSink {\n write(entry: CliOutputEntry): void;\n status(update: CliStatusUpdate): void;\n qr(payload: CliQrPayload): void;\n}\n\nfunction writeToConsole(level: CliOutputLevel, message: string): void {\n if (level === 'warn') {\n console.warn(message);\n return;\n }\n\n if (level === 'error') {\n console.error(message);\n return;\n }\n\n console.log(message);\n}\n\nexport function createConsoleOutputSink(): CliOutputSink {\n return {\n write(entry) {\n writeToConsole(entry.level, entry.message);\n },\n status() {\n // Status updates are semantic signals for richer presenters.\n },\n qr(payload) {\n qrcode.generate(payload.qr, { small: true }, (terminalQrCode) => {\n console.log(\n boxen(terminalQrCode, {\n title: payload.sessionId,\n padding: 1,\n titleAlignment: 'center',\n })\n );\n });\n },\n };\n}\n\nlet activeSink: CliOutputSink = createConsoleOutputSink();\n\nexport function getCliOutputSink(): CliOutputSink {\n return activeSink;\n}\n\nexport function setCliOutputSink(sink: CliOutputSink): void {\n activeSink = sink;\n}\n\nexport function resetCliOutputSink(): void {\n activeSink = createConsoleOutputSink();\n}\n","import { createClient } from '@open-wa/core';\nimport { Client as ClientFacade } from '@open-wa/client';\nimport { LightpandaDriver } from '@open-wa/driver-lightpanda';\nimport { PuppeteerDriver } from '@open-wa/driver-puppeteer';\nimport { eventRegistry } from '@open-wa/schema';\nimport { WAServer } from './server/hono-server';\nimport { resolveConfig, type PartialConfig, type Config, type TrackedConfig } from '@open-wa/config';\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { getCliOutputSink, type CliOutputSink } from './cli/output-sink';\n\nexport interface CliRuntimeResult {\n server: WAServer;\n client: ClientFacade;\n config: Config;\n events: ClientFacade['events'];\n}\n\ninterface RuntimeEventPublisher {\n publish(eventName: string, payload: any): void;\n}\n\nfunction bridgeRuntimeEvents(\n openwaClient: Awaited<ReturnType<typeof createClient>>,\n publishRuntimeEvent: (eventName: string, payload: any) => void,\n): () => void {\n if (typeof openwaClient.events.onAny === 'function' && typeof openwaClient.events.offAny === 'function') {\n openwaClient.events.onAny(publishRuntimeEvent);\n return () => openwaClient.events.offAny(publishRuntimeEvent);\n }\n\n const unsubscribers: Array<() => void> = [];\n const bridgedEvents = new Set(eventRegistry.getAll().map((def) => def.meta.eventName));\n\n bridgedEvents.forEach((eventName) => {\n const handler = (payload: any) => publishRuntimeEvent(eventName, payload);\n openwaClient.events.on(eventName as never, handler);\n unsubscribers.push(() => openwaClient.events.off(eventName as never, handler));\n });\n\n return () => {\n unsubscribers.forEach((unsubscribe) => unsubscribe());\n };\n}\n\nfunction attachLaunchNarration(\n openwaClient: Awaited<ReturnType<typeof createClient>>,\n sink: CliOutputSink,\n sessionId: string,\n): () => void {\n const unsubscribers: Array<() => void> = [];\n const on = (event: string, handler: (...args: any[]) => void) => {\n openwaClient.events.on(event as never, handler);\n unsubscribers.push(() => openwaClient.events.off(event as never, handler));\n };\n\n on('launch.auth.check.before', (event: any) => {\n sink.status({ phase: 'launch.auth', sessionId, detail: `Authenticating (timeout=${event?.details?.timeoutMs ?? '∞'}ms)` });\n });\n\n on('launch.auth.check.after', (event: any) => {\n sink.write({ level: 'info', message: `Auth detected via ${event?.details?.method ?? 'unknown'} (${event?.details?.isAuthenticated ? 'authenticated' : 'not-authenticated'})` });\n });\n\n on('launch.helper.pre_api.before', (event: any) => {\n sink.status({ phase: 'launch.helpers', sessionId, detail: event?.details?.mode === 'scripts' ? 'Injecting pre-API helper assets...' : 'Pre-API helpers already present' });\n });\n\n on('launch.helper.pre_api.after', (event: any) => {\n sink.write({ level: 'info', message: `Pre-API helper phase complete (${event?.details?.mode ?? 'unknown'})` });\n });\n\n on('internal_launch_progress', (event: any) => {\n const prefix = (event?.value || event?.value === 0) ? `${event.value}% ` : '';\n if (event?.text) sink.write({ level: 'info', message: `${prefix}${event.text}`.trim() });\n });\n\n on('critical_internal_message', (event: any) => {\n sink.write({ level: 'warn', message: `Internal launch message: ${event?.text ?? event?.value ?? 'unknown'}` });\n });\n\n on('launch.patch.init.before', (event: any) => {\n if (event?.details?.phase === 'preload') {\n sink.status({ phase: 'launch.patch', sessionId, detail: 'Downloading patches from CDN...' });\n }\n });\n\n on('launch.patch.init.after', (event: any) => {\n if (event?.details?.phase === 'preload') {\n const source = event?.details?.source ?? 'unknown';\n const tag = event?.details?.tag ? ` tag=${event.details.tag}` : '';\n const available = Array.isArray(event?.details?.available) ? event.details.available.length : 0;\n const durationMs = event?.durationMs;\n const durationStr = durationMs ? ` in ${(durationMs / 1000).toFixed(2)}s` : '';\n sink.write({ level: 'info', message: `Downloaded patches${durationStr} (source=${source}, available=${available}${tag})` });\n }\n });\n\n on('patch.init.before', (event: any) => {\n if (event?.details?.phase === 'apply') {\n const count = Array.isArray(event?.details?.patchIds) ? event.details.patchIds.length : 0;\n sink.status({ phase: 'launch.patch', sessionId, detail: `Installing patches (${count} queued)` });\n }\n });\n\n on('patch.apply.before', (event: any) => {\n sink.status({ phase: 'launch.patch', sessionId, detail: `Applying patch: ${event?.details?.patchId ?? 'unknown'}` });\n });\n\n on('patch.apply.after', (event: any) => {\n sink.write({\n level: event?.details?.outcome === 'failed' ? 'warn' : 'info',\n message: `Patch ${event?.details?.patchId ?? 'unknown'}: ${event?.details?.outcome ?? (event?.details?.applied ? 'applied' : 'unknown')}${event?.details?.detail ? ` — ${event.details.detail}` : ''}`,\n });\n });\n\n on('patch.init.after', (event: any) => {\n if (event?.details?.phase === 'apply') {\n const applied = Array.isArray(event?.details?.applied) ? event.details.applied : [];\n const outcome = event?.details?.outcome ?? 'unknown';\n const tag = applied.length > 0 ? applied.join(', ') : outcome;\n const durationMs = event?.durationMs;\n const durationStr = durationMs ? ` in ${(durationMs / 1000).toFixed(2)}s` : '';\n sink.write({\n level: event?.details?.blockingFailure ? 'warn' : 'info',\n message: `Patches Installed${durationStr}: ${tag}`,\n });\n }\n });\n\n on('launch.patch.integrity.before', () => {\n sink.status({ phase: 'launch.patch', sessionId, detail: 'Validating patched runtime...' });\n });\n\n on('launch.patch.integrity.after', (event: any) => {\n sink.write({ level: event?.details?.usable ? 'info' : 'warn', message: `Patched runtime validation: ${event?.details?.usable ? 'usable' : 'failed'}${event?.details?.failureReason ? ` (${event.details.failureReason})` : ''}` });\n });\n\n on('launch.license.check.before', (event: any) => {\n sink.status({ phase: 'launch.license', sessionId, detail: `Checking license (${event?.details?.source ?? 'local'})` });\n });\n\n on('launch.license.check.after', (event: any) => {\n sink.write({ level: event?.details?.blockingFailure ? 'warn' : 'info', message: `License check: ${event?.details?.status ?? 'unknown'}${event?.details?.detail ? ` — ${event.details.detail}` : ''}` });\n });\n\n on('license.inject.before', () => {\n sink.status({ phase: 'launch.license', sessionId, detail: 'Injecting license payload...' });\n });\n\n on('license.inject.after', (event: any) => {\n sink.write({ level: event?.details?.success ? 'info' : 'warn', message: `License inject: ${event?.details?.success ? 'success' : 'failed'}${event?.details?.status ? ` (${event.details.status})` : ''}${event?.details?.detail ? ` — ${event.details.detail}` : ''}` });\n });\n\n on('launch.auth.qr.generated', (event: any) => {\n const qrIndex = event?.details?.qrIndex ?? '?';\n sink.status({ phase: 'launch.auth', sessionId, detail: `QR code generated (#${qrIndex})` });\n });\n\n on('launch.client.finalize.before', (event: any) => {\n sink.status({ phase: 'launch.finalize', sessionId, detail: `Finalizing session (${event?.details?.validationStage ?? 'unknown'})` });\n });\n\n on('launch.client.finalize.after', (event: any) => {\n sink.write({ level: event?.details?.success ? 'info' : 'warn', message: `Finalize: ${event?.details?.outcome ?? 'unknown'}${event?.details?.detail ? ` — ${event.details.detail}` : ''}` });\n });\n\n on('error', (event: any) => {\n const scope = event?.scope ?? 'unknown';\n const msg = event?.error?.message ?? String(event?.error ?? 'unknown error');\n const fatal = event?.fatal ? ' [FATAL]' : '';\n sink.write({ level: 'error', message: `${fatal} ${scope}: ${msg}`.trim() });\n });\n\n return () => {\n unsubscribers.forEach((unsubscribe) => unsubscribe());\n };\n}\n\nconst CHROME_CACHE_FILE = resolve(process.cwd(), '.open-wa', 'chrome-executable-path.json');\n\ninterface ChromePathCacheRecord {\n executablePath?: string;\n updatedAt?: string;\n}\n\ninterface ExecutablePathResolution {\n executablePath?: string;\n source:\n | 'config'\n | 'cache'\n | 'chrome_installation'\n | 'driver_default'\n | 'lightpanda_config'\n | 'lightpanda_sdk_default';\n warning?: string;\n}\n\ninterface DriverSelection {\n driver: PuppeteerDriver | LightpandaDriver;\n engineLabel: 'Puppeteer' | 'Lightpanda';\n executableResolution: ExecutablePathResolution;\n preferLocalChrome: boolean;\n}\n\nexport interface ParsedCliArgs {\n procName: string;\n pm2: boolean;\n forwardedArgs: string[];\n configPath?: string;\n cliOverrides: PartialConfig;\n verbose: boolean;\n unsupportedWarnings: string[];\n}\n\nexport function getChromeCacheFilePath(): string {\n return CHROME_CACHE_FILE;\n}\n\nexport function readChromePathCache(cacheFilePath: string = getChromeCacheFilePath()): ChromePathCacheRecord | undefined {\n if (!existsSync(cacheFilePath)) {\n return undefined;\n }\n\n try {\n const raw = JSON.parse(readFileSync(cacheFilePath, 'utf8')) as ChromePathCacheRecord;\n if (!raw || typeof raw !== 'object') {\n return undefined;\n }\n\n return {\n executablePath: typeof raw.executablePath === 'string' ? raw.executablePath : undefined,\n updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : undefined,\n };\n } catch {\n return undefined;\n }\n}\n\nexport function writeChromePathCache(executablePath: string, cacheFilePath: string = getChromeCacheFilePath()): void {\n mkdirSync(dirname(cacheFilePath), { recursive: true });\n writeFileSync(cacheFilePath, JSON.stringify({ executablePath, updatedAt: new Date().toISOString() }, null, 2), 'utf8');\n}\n\nexport function clearChromePathCache(cacheFilePath: string = getChromeCacheFilePath()): void {\n if (existsSync(cacheFilePath)) {\n rmSync(cacheFilePath, { force: true });\n }\n}\n\nexport function isUsableExecutablePath(executablePath?: string): executablePath is string {\n return !!executablePath && existsSync(executablePath);\n}\n\nfunction getExplicitUseChromePreference(rawConfigs?: TrackedConfig['rawConfigs']): boolean | undefined {\n const explicitConfigSources = [\n rawConfigs?.file,\n rawConfigs?.env,\n rawConfigs?.cli,\n rawConfigs?.programmatic,\n ];\n\n for (let index = explicitConfigSources.length - 1; index >= 0; index -= 1) {\n const source = explicitConfigSources[index];\n if (source?.useChrome !== undefined) {\n return source.useChrome;\n }\n }\n\n return undefined;\n}\n\nexport function shouldPreferLocalChrome(config: Config, rawConfigs?: TrackedConfig['rawConfigs']): boolean {\n if (config.useLightpanda) {\n return false;\n }\n\n if (config.executablePath) {\n return false;\n }\n\n const explicitUseChrome = getExplicitUseChromePreference(rawConfigs);\n if (explicitUseChrome !== undefined) {\n return explicitUseChrome;\n }\n\n return true;\n}\n\nfunction getVal(argv: string[], flag: string): string | undefined {\n const index = argv.findIndex(arg => arg === flag);\n return index !== -1 ? argv[index + 1] : undefined;\n}\n\nexport function parseCliArgs(argv: string[] = process.argv.slice(2)): ParsedCliArgs {\n const cliOverrides: PartialConfig = {};\n const unsupportedWarnings: string[] = [];\n let verbose = false;\n let configPath: string | undefined;\n\n const sessionId = getVal(argv, '--session-id') || 'session';\n cliOverrides.sessionId = sessionId;\n\n const portValue = getVal(argv, '--port') || getVal(argv, '-p');\n if (portValue) cliOverrides.port = parseInt(portValue, 10);\n\n const host = getVal(argv, '--host') || getVal(argv, '-h');\n if (host) cliOverrides.host = host;\n\n const apiKey = getVal(argv, '--api-key') || getVal(argv, '--key') || getVal(argv, '-k');\n if (apiKey) cliOverrides.apiKey = apiKey;\n\n const logLevel = getVal(argv, '--log-level');\n if (logLevel) cliOverrides.logLevel = logLevel;\n\n if (argv.includes('--no-ezqr')) cliOverrides.ezqr = false;\n if (argv.includes('--headful')) cliOverrides.headless = false;\n if (argv.includes('--headless')) cliOverrides.headless = true;\n if (argv.includes('--use-chrome')) cliOverrides.useChrome = true;\n if (argv.includes('--use-lightpanda')) cliOverrides.useLightpanda = true;\n if (argv.includes('--log-console')) cliOverrides.logConsole = true;\n if (argv.includes('--aggressive-garbage-collection')) cliOverrides.aggressiveGarbageCollection = true;\n if (argv.includes('--no-dashboard')) cliOverrides.dashboard = false;\n if (argv.includes('--ephemeral')) cliOverrides.ephemeral = true;\n\n const qrTimeout = getVal(argv, '--qr-timeout');\n if (qrTimeout) cliOverrides.qrTimeout = parseInt(qrTimeout, 10);\n\n const dashboardPort = getVal(argv, '--dashboard-port');\n if (dashboardPort) cliOverrides.dashboardPort = parseInt(dashboardPort, 10);\n\n const licenseKey = getVal(argv, '--license-key') || getVal(argv, '-l');\n if (licenseKey) cliOverrides.licenseKey = licenseKey;\n\n const webhook = getVal(argv, '--webhook') || getVal(argv, '-w');\n if (webhook) cliOverrides.webhook = webhook;\n\n const proxyHost = getVal(argv, '--proxy-host');\n if (proxyHost) cliOverrides.proxyHost = proxyHost;\n\n const proxyToken = getVal(argv, '--proxy-token');\n if (proxyToken) cliOverrides.proxyToken = proxyToken;\n\n const readyWebhook = getVal(argv, '--ready-webhook');\n if (readyWebhook) unsupportedWarnings.push(`--ready-webhook was provided (${readyWebhook}) but ready-webhook delivery is not yet wired in v5 CLI.`);\n\n if (argv.includes('-v') || argv.includes('--verbose')) {\n verbose = true;\n cliOverrides.disableSpins = true;\n cliOverrides.logConsole = true;\n cliOverrides.logLevel = cliOverrides.logLevel || 'debug';\n }\n\n if (argv.includes('--stats')) {\n unsupportedWarnings.push('--stats was provided but swagger-stats parity is not restored; v5 only exposes the compatibility redirect/deprecation route.');\n }\n\n if (argv.includes('--generate-api-docs')) {\n unsupportedWarnings.push('--generate-api-docs was provided; runtime docs are always served from the shared API layer and no separate collection generation step currently runs at CLI boot.');\n }\n\n if (argv.includes('--tunnel')) {\n unsupportedWarnings.push('--tunnel was provided but tunnel setup parity is not yet restored in the v5 CLI.');\n }\n\n if (argv.includes('--chatwoot-url') || argv.includes('--twilio-webhook') || argv.includes('--bot-press-url')) {\n unsupportedWarnings.push('Legacy integration flags (Chatwoot/Twilio/BotPress) were provided but are not yet wired into the v5 CLI boot path.');\n }\n\n if (argv.includes('--use-session-id-in-path')) {\n cliOverrides.sessionId = sessionId;\n }\n\n configPath = getVal(argv, '--config') || getVal(argv, '-c');\n\n const procName = getVal(argv, '--name') || sessionId || '@OPEN-WA EASY API';\n const pm2 = argv.includes('--pm2');\n\n return {\n procName,\n pm2,\n forwardedArgs: argv,\n configPath,\n cliOverrides,\n verbose,\n unsupportedWarnings,\n };\n}\n\nexport async function resolveExecutablePath(\n config: Config,\n options: {\n preferLocalChrome?: boolean;\n cacheFilePath?: string;\n } = {}\n): Promise<ExecutablePathResolution> {\n if (config.executablePath) {\n return {\n executablePath: config.executablePath,\n source: 'config',\n };\n }\n\n const preferLocalChrome = options.preferLocalChrome ?? config.useChrome;\n if (!preferLocalChrome) {\n return {\n source: 'driver_default',\n };\n }\n\n const cacheFilePath = options.cacheFilePath ?? getChromeCacheFilePath();\n const cachedPath = readChromePathCache(cacheFilePath)?.executablePath;\n if (isUsableExecutablePath(cachedPath)) {\n return {\n executablePath: cachedPath,\n source: 'cache',\n };\n }\n\n if (cachedPath) {\n clearChromePathCache(cacheFilePath);\n }\n\n const { Launcher } = await import('chrome-launcher');\n const detectedPath = Launcher.getInstallations().find((installationPath) => isUsableExecutablePath(installationPath));\n\n if (detectedPath) {\n writeChromePathCache(detectedPath, cacheFilePath);\n return {\n executablePath: detectedPath,\n source: 'chrome_installation',\n };\n }\n\n clearChromePathCache(cacheFilePath);\n\n return {\n source: 'driver_default',\n warning: 'Chrome resolution warning: no valid local Chrome installation was found. Falling back to Puppeteer/default driver browser resolution.',\n };\n}\n\nfunction resolveLightpandaExecutablePath(config: Config): ExecutablePathResolution {\n const executablePath = config.lightpanda?.executablePath;\n if (executablePath) {\n return {\n executablePath,\n source: 'lightpanda_config',\n };\n }\n\n return {\n source: 'lightpanda_sdk_default',\n };\n}\n\nasync function selectRuntimeDriver(config: Config, rawConfigs?: TrackedConfig['rawConfigs']): Promise<DriverSelection> {\n if (config.useLightpanda) {\n return {\n driver: new LightpandaDriver(),\n engineLabel: 'Lightpanda',\n executableResolution: resolveLightpandaExecutablePath(config),\n preferLocalChrome: false,\n };\n }\n\n const preferLocalChrome = shouldPreferLocalChrome(config, rawConfigs);\n const executableResolution = await resolveExecutablePath(config, { preferLocalChrome });\n\n return {\n driver: new PuppeteerDriver(),\n engineLabel: 'Puppeteer',\n executableResolution,\n preferLocalChrome,\n };\n}\n\nfunction printStartupSummary(\n config: Config,\n resolution: ExecutablePathResolution,\n preferLocalChrome: boolean,\n engineLabel: DriverSelection['engineLabel'],\n) {\n const host = config.host.includes('http') ? config.host : `http://${config.host}`;\n const sink = getCliOutputSink();\n sink.write({ level: 'info', message: `Easy API session: ${config.sessionId}` });\n sink.write({ level: 'info', message: `Health: ${host}:${config.port}/health` });\n sink.write({ level: 'info', message: `API Explorer: ${host}:${config.port}/api-docs/` });\n sink.write({ level: 'info', message: `Swagger JSON: ${host}:${config.port}/meta/swagger.json` });\n sink.write({ level: 'info', message: `Postman JSON: ${host}:${config.port}/meta/postman.json` });\n sink.write({ level: 'info', message: `Browser mode: ${config.headless ? 'headless' : 'headful'}` });\n sink.write({ level: 'info', message: `Browser engine: ${engineLabel}` });\n if (config.dashboard) {\n sink.write({ level: 'info', message: `Dashboard: ${host}:${config.port}/dashboard/` });\n } else {\n sink.write({ level: 'info', message: 'Dashboard: disabled (--no-dashboard)' });\n }\n if (resolution.source === 'lightpanda_config' && resolution.executablePath) {\n sink.write({ level: 'info', message: `Browser executable: explicit Lightpanda override (${resolution.executablePath})` });\n } else if (resolution.source === 'lightpanda_sdk_default') {\n sink.write({ level: 'info', message: 'Browser executable: Lightpanda SDK managed executable (shared cache/default resolution)' });\n } else if (resolution.source === 'config' && config.executablePath) {\n sink.write({ level: 'info', message: `Browser executable: explicit override (${config.executablePath})` });\n } else if (resolution.source === 'cache') {\n sink.write({ level: 'info', message: `Browser executable: local Chrome from cache (${resolution.executablePath})` });\n } else if (resolution.source === 'chrome_installation') {\n sink.write({ level: 'info', message: `Browser executable: local Chrome detected (${resolution.executablePath})` });\n } else if (preferLocalChrome) {\n sink.write({ level: 'info', message: 'Browser executable: driver default fallback (local Chrome unavailable)' });\n }\n if (config.webhook) {\n sink.write({\n level: 'warn',\n message: `Webhook configured (${config.webhook}) but v5 CLI webhook registration parity is not yet restored.`,\n });\n }\n}\n\nexport async function start(parsedArgs: ParsedCliArgs = parseCliArgs()): Promise<CliRuntimeResult> {\n const { configPath, cliOverrides, verbose, unsupportedWarnings } = parsedArgs;\n const sink = getCliOutputSink();\n\n sink.status({ phase: 'boot' });\n\n const { config, sources, configFilePath, rawConfigs } = await resolveConfig({\n configPath,\n cliOverrides: {\n disableSpins: true,\n apiLifecycle: 'hybrid',\n host: '0.0.0.0',\n port: 8002,\n ...cliOverrides,\n },\n includeRawConfigs: true,\n verbose,\n });\n\n if (verbose) {\n sink.write({ level: 'info', message: `Config sources: ${sources.join(', ')}` });\n if (configFilePath) {\n sink.write({ level: 'info', message: `Config file: ${configFilePath}` });\n }\n }\n\n sink.status({ phase: 'config.resolved', sessionId: config.sessionId });\n\n unsupportedWarnings.forEach((warning) => sink.write({ level: 'warn', message: `Compatibility warning: ${warning}` }));\n\n const driverSelection = await selectRuntimeDriver(config, rawConfigs);\n const { driver, engineLabel, executableResolution, preferLocalChrome } = driverSelection;\n if (executableResolution.warning) {\n sink.write({ level: 'warn', message: executableResolution.warning });\n }\n\n const server = new WAServer(config);\n sink.status({ phase: 'server.starting', sessionId: config.sessionId });\n\n await server.start();\n sink.status({ phase: 'server.started', sessionId: config.sessionId });\n\n printStartupSummary(config, executableResolution, preferLocalChrome, engineLabel);\n\n sink.status({ phase: 'client.starting', sessionId: config.sessionId });\n sink.write({ level: 'info', message: 'Starting WhatsApp Client...' });\n\n const openwaClient = await createClient({\n sessionId: config.sessionId,\n driver,\n deleteSessionDataOnLogout: config.deleteSessionDataOnLogout,\n killClientOnLogout: config.killClientOnLogout,\n sessionDataPath: config.sessionDataPath,\n debug: config.logLevel === 'debug' || verbose || config.logConsole,\n headless: config.headless,\n qrTimeoutMs: typeof config.qrTimeout === 'number' ? config.qrTimeout * 1000 : undefined,\n authTimeoutMs: typeof config.authTimeout === 'number' ? config.authTimeout * 1000 : undefined,\n executablePath: executableResolution.executablePath,\n browserArgs: config.chromiumArgs,\n allowDangerousBrowserArgs: config.allowDangerousBrowserArgs,\n userDataDir: config.userDataDir,\n ephemeral: config.ephemeral,\n logConsole: config.logConsole,\n logConsoleErrors: config.logConsoleErrors,\n blockCrashLogs: config.blockCrashLogs,\n blockAssets: config.blockAssets,\n safeMode: config.safeMode,\n licenseKey: config.licenseKey as any,\n });\n\n server.setReadinessProvider(() => ({ ...openwaClient.getReadiness(), state: openwaClient.getState() }));\n const detachLaunchNarration = attachLaunchNarration(openwaClient, sink, config.sessionId);\n\n openwaClient.events.on('launch.auth.qr.generated', (event) => {\n const qr = event.details?.qr;\n if (!qr) {\n return;\n }\n\n if (config.qrLogSkip) {\n sink.write({ level: 'info', message: 'New QR Code generated. Not printing in console because qrLogSkip is set to true' });\n } else {\n sink.status({ phase: 'auth.qr', sessionId: config.sessionId, detail: 'QR code generated' });\n sink.qr({ qr, sessionId: config.sessionId });\n }\n\n server.setQR(qr);\n });\n\n const client = new ClientFacade({\n client: openwaClient,\n transport: openwaClient.getTransport(),\n });\n\n server.setClient(client as any);\n\n const runtimeBridgeListeners = new Set<(event: string, value: any) => void>();\n const runtimeEventPublishers: RuntimeEventPublisher[] = [\n {\n publish: (eventName, payload) => {\n runtimeBridgeListeners.forEach((listener) => {\n listener(eventName, payload);\n });\n },\n },\n ];\n\n const publishRuntimeEvent = (eventName: string, payload: any) => {\n runtimeEventPublishers.forEach((publisher) => {\n publisher.publish(eventName, payload);\n });\n };\n\n const detachRuntimeBridge = bridgeRuntimeEvents(openwaClient, publishRuntimeEvent);\n\n // Bridge core events to the socket manager so dashboard clients\n // receive live events when they send register_ev.\n if (typeof server.setEventBridge === 'function') {\n server.setEventBridge({\n onAny: (listener: (event: string, value: any) => void) => {\n runtimeBridgeListeners.add(listener);\n },\n offAny: (listener: (event: string, value: any) => void) => {\n runtimeBridgeListeners.delete(listener);\n },\n });\n }\n\n openwaClient.events.on('launch.browser.init.after', async () => {\n const page = openwaClient.getTransport().getPage();\n if (page) {\n await server.setPage(page as any).catch(() => {});\n }\n });\n\n try {\n await client.start();\n } catch (startError) {\n const msg = startError instanceof Error ? startError.message : String(startError);\n sink.write({ level: 'error', message: `Bootstrap failed: ${msg}` });\n sink.write({ level: 'warn', message: 'Session kept alive for debugging. Browser page is still open.' });\n sink.write({ level: 'warn', message: 'The server is running — use /health and /api-docs to inspect state.' });\n detachLaunchNarration();\n return { server, client, config, events: openwaClient.events };\n }\n\n const readiness = openwaClient.getReadiness();\n sink.status({\n phase: 'client.ready',\n sessionId: config.sessionId,\n detail: `status=${readiness.status}, exposureSafe=${readiness.exposureSafe}`,\n });\n sink.write({\n level: 'info',\n message: `WhatsApp Client ready with state: ${client.getState()} (status=${readiness.status}, exposureSafe=${readiness.exposureSafe})`,\n });\n\n detachLaunchNarration();\n return { server, client, config, events: openwaClient.events };\n}\n\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<CliRuntimeResult | void> {\n const parsedArgs = parseCliArgs(argv);\n\n if (parsedArgs.pm2) {\n const { spawn } = require('child_process');\n const sink = getCliOutputSink();\n const pm2Command = getPm2Command();\n const pm2SpawnOptions = getPm2SpawnOptions();\n try {\n const pm2 = spawn(pm2Command, ['--version'], pm2SpawnOptions);\n\n await new Promise<void>((resolve, reject) => {\n pm2.on('error', reject);\n pm2.on('exit', (code: number | null) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`pm2 probe exited with code ${code ?? 'unknown'}`));\n });\n pm2.stdout.on('data', () => resolve());\n });\n\n const pm2Flags = parsedArgs.forwardedArgs.filter((flag: string) => flag !== '--pm2');\n const cliPath = fileURLToPath(new URL('../dist/cli.cjs', import.meta.url));\n\n spawn(pm2Command, [\n 'start',\n cliPath,\n '--name', parsedArgs.procName,\n '--stop-exit-codes', '88',\n '--',\n ...pm2Flags,\n ], {\n ...pm2SpawnOptions,\n stdio: 'inherit',\n detached: true\n });\n return;\n } catch (error: unknown) {\n if (isCommandNotFoundError(error)) {\n sink.write({ level: 'error', message: 'pm2 not found. Please install with: npm install -g pm2' });\n return;\n }\n throw error;\n }\n }\n\n return await start(parsedArgs);\n}\n\nfunction getPm2Command(): string {\n return process.platform === 'win32' ? 'pm2.cmd' : 'pm2';\n}\n\nfunction getPm2SpawnOptions(): { shell: boolean } {\n return { shell: process.platform === 'win32' };\n}\n\nfunction isCommandNotFoundError(error: unknown): boolean {\n if (typeof error !== 'object' || error === null) {\n return false;\n }\n\n const systemError = error as { code?: unknown; errno?: unknown };\n return systemError.code === 'ENOENT' || systemError.errno === -2;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-runtime-CmpYxFCk.d.cts","names":[],"sources":["../src/server/hono-server.ts","../src/cli-runtime.ts"],"mappings":";;;;;cAGa,QAAA,SAAiB,SAAA;cAChB,MAAA,EAAQ,MAAA;AAAA;;;UCQL,gBAAA;EACb,MAAA,EAAQ,QAAA;EACR,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;AAAA;AAAA,UA8LK,aAAA;EACb,QAAA;EACA,GAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA,EAAc,aAAA;EACd,OAAA;EACA,mBAAA;AAAA;AAAA,iBAkFY,YAAA,CAAa,IAAA,cAAyC,aAAA;AAAA,iBAgOhD,KAAA,CAAM,UAAA,GAAY,aAAA,GAAiC,OAAA,CAAQ,gBAAA;AAAA,iBAgK3D,IAAA,CAAK,IAAA,cAAyC,OAAA,CAAQ,gBAAA"}
1
+ {"version":3,"file":"cli-runtime-CmpYxFCk.d.cts","names":[],"sources":["../src/server/hono-server.ts","../src/cli-runtime.ts"],"mappings":";;;;;cAGa,QAAA,SAAiB,SAAA;cAChB,MAAA,EAAQ,MAAA;AAAA;;;UCQL,gBAAA;EACb,MAAA,EAAQ,QAAA;EACR,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;AAAA;AAAA,UA8LK,aAAA;EACb,QAAA;EACA,GAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA,EAAc,aAAA;EACd,OAAA;EACA,mBAAA;AAAA;AAAA,iBAkFY,YAAA,CAAa,IAAA,cAAyC,aAAA;AAAA,iBAgOhD,KAAA,CAAM,UAAA,GAAY,aAAA,GAAiC,OAAA,CAAQ,gBAAA;AAAA,iBAiK3D,IAAA,CAAK,IAAA,cAAyC,OAAA,CAAQ,gBAAA"}
package/dist/cli.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_cli_runtime = require("./cli-runtime-B7_3MM0c.cjs");
3
+ const require_cli_runtime = require("./cli-runtime-CEFbPQ-1.cjs");
4
4
  //#region src/cli.ts
5
5
  if (require.main === module) require_cli_runtime.main().catch((err) => {
6
6
  require_cli_runtime.getCliOutputSink().write({
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_cli_runtime = require("./cli-runtime-B7_3MM0c.cjs");
2
+ const require_cli_runtime = require("./cli-runtime-CEFbPQ-1.cjs");
3
3
  let _open_wa_api = require("@open-wa/api");
4
4
  let _open_wa_session_sync = require("@open-wa/session-sync");
5
5
  let _open_wa_logger = require("@open-wa/logger");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@open-wa/wa-automate",
3
3
  "type": "module",
4
- "version": "5.0.0-alpha.6",
4
+ "version": "5.0.0-alpha.8",
5
5
  "description": "WhatsApp automation CLI and API server",
6
6
  "main": "./dist/index.cjs",
7
7
  "types": "./dist/index.d.cts",
@@ -9,7 +9,8 @@
9
9
  "wa-automate": "./dist/cli.cjs"
10
10
  },
11
11
  "files": [
12
- "dist"
12
+ "dist",
13
+ "skills"
13
14
  ],
14
15
  "dependencies": {
15
16
  "@elastic/elasticsearch": "^9.2.0",
@@ -18,15 +19,15 @@
18
19
  "chrome-launcher": "^0.15.0",
19
20
  "hono": "^4.12.9",
20
21
  "qrcode-terminal": "^0.12.0",
21
- "@open-wa/driver-lightpanda": "5.0.0-alpha.6",
22
- "@open-wa/core": "5.0.0-alpha.6",
23
- "@open-wa/config": "5.0.0-alpha.6",
24
- "@open-wa/api": "5.0.0-alpha.6",
25
- "@open-wa/driver-puppeteer": "5.0.0-alpha.6",
26
- "@open-wa/logger": "5.0.0-alpha.6",
27
- "@open-wa/session-sync": "5.0.0-alpha.6",
28
- "@open-wa/client": "5.0.0-alpha.6",
29
- "@open-wa/schema": "5.0.0-alpha.6"
22
+ "@open-wa/client": "5.0.0-alpha.8",
23
+ "@open-wa/config": "5.0.0-alpha.8",
24
+ "@open-wa/api": "5.0.0-alpha.8",
25
+ "@open-wa/core": "5.0.0-alpha.8",
26
+ "@open-wa/driver-lightpanda": "5.0.0-alpha.8",
27
+ "@open-wa/logger": "5.0.0-alpha.8",
28
+ "@open-wa/schema": "5.0.0-alpha.8",
29
+ "@open-wa/session-sync": "5.0.0-alpha.8",
30
+ "@open-wa/driver-puppeteer": "5.0.0-alpha.8"
30
31
  },
31
32
  "devDependencies": {
32
33
  "typescript": "^6.0.3",