{"version":3,"sources":["../src/cli.ts","../../node_modules/.pnpm/tsup@8.4.0_@microsoft+api-extractor@7.58.12_@types+node@22.19.1__postcss@8.5.23_tsx@4.23.1_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Command, Option } from 'commander';\nimport type { EventEmitter } from 'node:events';\nimport { CLIClient } from './cli_client.js';\nimport { runConsole } from './console.js';\nimport { type PluginDownloadFailure, formatDownloadFailureMessage } from './download.js';\nimport { initializeLogger, log } from './log.js';\nimport { Plugin } from './plugin.js';\nimport { version } from './version.js';\nimport { AgentServer, ServerOptions } from './worker.js';\n\nexport { formatDownloadFailureMessage };\n\ntype CliArgs = {\n  opts: ServerOptions;\n  production: boolean;\n  watch: boolean;\n  event?: EventEmitter;\n  room?: string;\n  participantIdentity?: string;\n  // Address of the driving `lk` CLI's dev channel (set by `lk agent dev`).\n  cliAddr?: string;\n};\n\nconst formatErrorMessage = (error: unknown): string =>\n  error instanceof Error ? error.message : String(error);\n\nconst runServer = async (args: CliArgs) => {\n  initializeLogger({ pretty: !args.production, level: args.opts.logLevel });\n  const logger = log();\n\n  if (!args.production && !args.room && !args.cliAddr) {\n    logger.warn(\n      'dev mode is deprecated and will be removed in a future release; ' +\n        'use `lk agent dev` instead ' +\n        '(https://docs.livekit.io/reference/developer-tools/livekit-cli/#setup)',\n    );\n  }\n\n  // though `production` is defined in ServerOptions, it will always be overridden by CLI.\n  const { production: _, ...opts } = args.opts; // eslint-disable-line @typescript-eslint/no-unused-vars\n  const serverOptions = new ServerOptions({ ...opts, production: args.production });\n  const server = new AgentServer(serverOptions);\n\n  // When launched by `lk agent dev`, report ServerInfo over the CLI's dev channel\n  // so it can surface e.g. a Cloud console link. Best-effort; never fatal.\n  const cliClient = args.cliAddr\n    ? new CLIClient(args.cliAddr, serverOptions.agentName, serverOptions.wsURL)\n    : undefined;\n  cliClient?.start();\n\n  if (args.room) {\n    server.event.once('worker_registered', () => {\n      logger.info(`connecting to room ${args.room}`);\n      server.simulateJob(args.room!, args.participantIdentity);\n    });\n  }\n\n  const onSigint = async () => {\n    logger.debug('SIGINT received in CLI');\n    // allow C-c C-c for force interrupt\n    process.once('SIGINT', () => {\n      console.log('Force exit (Ctrl+C pressed twice)');\n      process.exit(130); // SIGINT exit code\n    });\n    if (args.production) {\n      try {\n        await server.drain();\n      } catch (e) {\n        logger.error(e);\n      }\n    }\n    cliClient?.close();\n    await server.close();\n    logger.debug('worker closed due to SIGINT.');\n    process.exit(130); // SIGINT exit code\n  };\n  process.once('SIGINT', () => {\n    onSigint().catch((error) => {\n      logger.error(error, 'failed to close worker after SIGINT');\n      process.exit(1);\n    });\n  });\n\n  const onSigterm = async () => {\n    logger.debug('SIGTERM received in CLI.');\n    if (args.production) {\n      try {\n        await server.drain();\n      } catch (e) {\n        logger.error(e);\n      }\n    }\n    cliClient?.close();\n    await server.close();\n    logger.debug('worker closed due to SIGTERM.');\n    process.exit(143); // SIGTERM exit code\n  };\n  process.once('SIGTERM', () => {\n    onSigterm().catch((error) => {\n      logger.error(error, 'failed to close worker after SIGTERM');\n      process.exit(1);\n    });\n  });\n\n  try {\n    await server.run();\n  } catch {\n    logger.fatal('closing worker due to error.');\n    process.exit(1);\n  } finally {\n    cliClient?.close();\n  }\n};\n\n/**\n * Exposes a CLI for creating a new worker, in development or production mode.\n *\n * @param opts - Options to launch the worker with\n * @example\n * ```\n * if (process.argv[1] === fileURLToPath(import.meta.url)) {\n *   cli.runApp(new ServerOptions({ agent: import.meta.filename }));\n * }\n * ```\n */\nexport const runApp = (opts: ServerOptions) => {\n  const logLevelOption = (defaultLevel: string) =>\n    new Option('--log-level <level>', 'Set the logging level')\n      .choices(['trace', 'debug', 'info', 'warn', 'error', 'fatal'])\n      .default(defaultLevel)\n      .env('LOG_LEVEL');\n\n  const program = new Command()\n    .name('agents')\n    .description('LiveKit Agents CLI')\n    .version(version)\n    .addOption(\n      new Option('--url <string>', 'LiveKit server or Cloud project websocket URL').env(\n        'LIVEKIT_URL',\n      ),\n    )\n    .addOption(\n      new Option('--api-key <string>', \"LiveKit server or Cloud project's API key\").env(\n        'LIVEKIT_API_KEY',\n      ),\n    )\n    .addOption(\n      new Option('--api-secret <string>', \"LiveKit server or Cloud project's API secret\").env(\n        'LIVEKIT_API_SECRET',\n      ),\n    )\n    .addOption(\n      new Option('--worker-token <string>', 'Internal use only')\n        .env('LIVEKIT_WORKER_TOKEN')\n        .hideHelp(),\n    )\n    .action(() => {\n      if (\n        // do not run CLI if origin file is agents/ipc/job_main.js\n        process.argv[1] !== new URL('ipc/job_main.js', import.meta.url).pathname &&\n        process.argv.length < 3\n      ) {\n        program.help();\n      }\n    });\n\n  program\n    .command('start')\n    .description('Start the worker in production mode')\n    .addOption(logLevelOption('info'))\n    .addOption(\n      new Option(\n        '--simulation',\n        'Run under an agent simulation: the worker load limit is disabled so runs ' +\n          'can saturate the agent, and the worker HTTP server is not started. Set by `lk simulate`.',\n      ).hideHelp(),\n    )\n    .action((...[, command]) => {\n      const globalOptions = program.optsWithGlobals();\n      const commandOptions = command.opts();\n      opts.wsURL = globalOptions.url || opts.wsURL;\n      opts.apiKey = globalOptions.apiKey || opts.apiKey;\n      opts.apiSecret = globalOptions.apiSecret || opts.apiSecret;\n      opts.logLevel = commandOptions.logLevel;\n      opts.workerToken = globalOptions.workerToken || opts.workerToken;\n      opts.simulation = commandOptions.simulation || opts.simulation;\n      runServer({\n        opts,\n        production: true,\n        watch: false,\n      });\n    });\n\n  program\n    .command('dev')\n    .description(\n      'Start the worker in development mode\\n\\n' +\n        'Deprecated: use lk agent dev instead ' +\n        '(https://docs.livekit.io/reference/developer-tools/livekit-cli/#setup).',\n    )\n    .addOption(logLevelOption('debug'))\n    .addOption(\n      // Set by `lk agent dev`: address of the CLI's dev channel the agent reports\n      // ServerInfo to (agent name + URL, e.g. for a Cloud console link).\n      new Option('--cli-addr <string>', 'Internal use only').hideHelp(),\n    )\n    .action((...[, command]) => {\n      const globalOptions = program.optsWithGlobals();\n      const commandOptions = command.opts();\n      opts.wsURL = globalOptions.url || opts.wsURL;\n      opts.apiKey = globalOptions.apiKey || opts.apiKey;\n      opts.apiSecret = globalOptions.apiSecret || opts.apiSecret;\n      opts.logLevel = commandOptions.logLevel;\n      opts.workerToken = globalOptions.workerToken || opts.workerToken;\n      process.env.LIVEKIT_DEV_MODE = '1';\n      runServer({\n        opts,\n        production: false,\n        watch: false,\n        cliAddr: commandOptions.cliAddr,\n      });\n    });\n\n  program\n    .command('connect')\n    .description('Connect to a specific room')\n    .requiredOption('--room <string>', 'Room name to connect to')\n    .option('--participant-identity <string>', 'Identity of user to listen to')\n    .addOption(logLevelOption('info'))\n    .action((...[, command]) => {\n      const globalOptions = program.optsWithGlobals();\n      const commandOptions = command.opts();\n      opts.wsURL = globalOptions.url || opts.wsURL;\n      opts.apiKey = globalOptions.apiKey || opts.apiKey;\n      opts.apiSecret = globalOptions.apiSecret || opts.apiSecret;\n      opts.logLevel = commandOptions.logLevel;\n      opts.workerToken = globalOptions.workerToken || opts.workerToken;\n      process.env.LIVEKIT_DEV_MODE = '1';\n      runServer({\n        opts,\n        production: false,\n        watch: false,\n        room: commandOptions.room,\n        participantIdentity: commandOptions.participantIdentity,\n      });\n    });\n\n  program\n    .command('console')\n    .description('Run the agent in-process attached to a local broker over TCP')\n    .requiredOption('--connect-addr <addr>', 'host:port of the broker TCP socket')\n    .option('--record', 'save the session report locally', false)\n    .addOption(logLevelOption('debug'))\n    .action((...[, command]) => {\n      const commandOptions = command.opts();\n      opts.logLevel = commandOptions.logLevel;\n      initializeLogger({ pretty: true, level: opts.logLevel });\n      process.env.LIVEKIT_DEV_MODE = '1';\n      runConsole({\n        agentPath: opts.agent,\n        connectAddr: commandOptions.connectAddr,\n        record: commandOptions.record === true,\n        sessionEndTimeout: opts.sessionEndTimeout,\n      }).catch((error) => {\n        log().fatal(`console mode failed: ${formatErrorMessage(error)}`);\n        process.exit(1);\n      });\n    });\n\n  program\n    .command('download-files')\n    .description('Download plugin dependency files')\n    .addOption(logLevelOption('debug'))\n    .action((...[, command]) => {\n      const commandOptions = command.opts();\n      initializeLogger({ pretty: true, level: commandOptions.logLevel });\n      const logger = log();\n\n      logger.warn(\n        'Invoking the download-files command via cli.runApp() is deprecated as of 1.4.4. ' +\n          'Use the livekit-agents command included with the @livekit/agents package instead, e.g. ' +\n          '`npx livekit-agents download-files`.',\n      );\n\n      const downloadFiles = async () => {\n        const failures: PluginDownloadFailure[] = [];\n\n        for (const plugin of Plugin.registeredPlugins) {\n          logger.info(`Downloading files for ${plugin.title}`);\n          try {\n            await plugin.downloadFiles();\n            logger.info(`Finished downloading files for ${plugin.title}`);\n          } catch (error) {\n            failures.push({ plugin, error });\n            logger.error(\n              `Failed to download files for ${plugin.title}: ${formatErrorMessage(error)}`,\n            );\n          }\n        }\n\n        if (failures.length > 0) {\n          throw new Error(formatDownloadFailureMessage(failures));\n        }\n      };\n\n      downloadFiles()\n        .then(() => {\n          process.exit(0);\n        })\n        .catch((error) => {\n          logger.fatal(`Error during file downloads: ${error}`);\n          process.exit(1);\n        });\n    });\n\n  program.parse();\n};\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n  typeof document === 'undefined'\n    ? new URL(`file:${__filename}`).href\n    : (document.currentScript && document.currentScript.src) ||\n      new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":"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","names":[]}