{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseCliOptions } from './cli-utils.js';\nimport { LocalRelayMcpServer } from './mcpRelayServer.js';\n\nlet options: ReturnType<typeof parseCliOptions>;\ntry {\n  options = parseCliOptions(process.argv.slice(2));\n} catch (err) {\n  process.stderr.write(\n    `[webmcp-local-relay] error: ${err instanceof Error ? err.message : String(err)}\\n`\n  );\n  process.exit(1);\n}\n\nif (options.allowedOrigins.includes('*')) {\n  process.stderr.write(\n    '[webmcp-local-relay] WARNING: accepting connections from ALL host page origins. Use --widget-origin to restrict.\\n'\n  );\n}\n\nconst bridgeOptions = {\n  host: options.host,\n  port: options.port,\n  portExplicitlySet: options.portExplicitlySet,\n  allowedOrigins: options.allowedOrigins,\n  ...(options.label ? { label: options.label } : {}),\n  ...(options.relayId ? { relayId: options.relayId } : {}),\n  ...(options.workspace ? { workspace: options.workspace } : {}),\n};\n\nconst relay = new LocalRelayMcpServer({\n  bridgeOptions,\n});\n\ntry {\n  await relay.start();\n} catch (err) {\n  const message = err instanceof Error ? err.message : String(err);\n  if (message.includes('EACCES')) {\n    process.stderr.write(\n      `[webmcp-local-relay] error: insufficient permissions to bind to ${options.host}:${options.port}.\\n`\n    );\n  } else {\n    process.stderr.write(`[webmcp-local-relay] error: failed to start bridge server: ${message}\\n`);\n  }\n  process.exit(1);\n}\n\ntry {\n  await relay.startStdio();\n} catch (err) {\n  const message = err instanceof Error ? err.message : String(err);\n  process.stderr.write(`[webmcp-local-relay] error: failed to start stdio transport: ${message}\\n`);\n  process.exit(1);\n}\n\nif (relay.bridge.mode === 'server') {\n  process.stderr.write(\n    `[webmcp-local-relay] server mode: listening on ws://${options.host}:${relay.bridge.port} (allowed origins: ${options.allowedOrigins.join(', ')})\\n`\n  );\n} else {\n  process.stderr.write(\n    `[webmcp-local-relay] client mode: proxying through existing relay at ws://${options.host}:${relay.bridge.port}\\n`\n  );\n}\n\n/**\n * Gracefully shuts down bridge and MCP server for process termination signals.\n */\nconst shutdown = async (signal: string) => {\n  if (shuttingDown) {\n    return;\n  }\n  shuttingDown = true;\n  process.stderr.write(`[webmcp-local-relay] received ${signal}, shutting down\\n`);\n  try {\n    await relay.stop();\n  } catch (err) {\n    process.stderr.write(\n      `[webmcp-local-relay] error during shutdown: ${err instanceof Error ? err.message : err}\\n`\n    );\n    process.exit(1);\n  }\n  process.exit(0);\n};\n\nlet shuttingDown = false;\n\nprocess.on('uncaughtException', (err) => {\n  process.stderr.write(\n    `[webmcp-local-relay] error: uncaught exception: ${err.stack ?? err.message}\\n`\n  );\n  void shutdown('uncaughtException');\n});\nprocess.on('unhandledRejection', (reason) => {\n  const message = reason instanceof Error ? (reason.stack ?? reason.message) : String(reason);\n  process.stderr.write(`[webmcp-local-relay] error: unhandled rejection: ${message}\\n`);\n  void shutdown('unhandledRejection');\n});\n\nprocess.on('SIGINT', () => {\n  void shutdown('SIGINT');\n});\nprocess.on('SIGTERM', () => {\n  void shutdown('SIGTERM');\n});\n"],"mappings":";;;;AAKA,IAAI;AACJ,IAAI;CACF,UAAU,gBAAgB,QAAQ,KAAK,MAAM,EAAE,CAAC;SACzC,KAAK;CACZ,QAAQ,OAAO,MACb,+BAA+B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CAAC,IACjF;CACD,QAAQ,KAAK,EAAE;;AAGjB,IAAI,QAAQ,eAAe,SAAS,IAAI,EACtC,QAAQ,OAAO,MACb,qHACD;AAaH,MAAM,QAAQ,IAAI,oBAAoB,EACpC;CAVA,MAAM,QAAQ;CACd,MAAM,QAAQ;CACd,mBAAmB,QAAQ;CAC3B,gBAAgB,QAAQ;CACxB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAO,GAAG,EAAE;CACjD,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,SAAS,GAAG,EAAE;CACvD,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,WAAW,GAAG,EAAE;CAIhD,EACd,CAAC;AAEF,IAAI;CACF,MAAM,MAAM,OAAO;SACZ,KAAK;CACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;CAChE,IAAI,QAAQ,SAAS,SAAS,EAC5B,QAAQ,OAAO,MACb,mEAAmE,QAAQ,KAAK,GAAG,QAAQ,KAAK,KACjG;MAED,QAAQ,OAAO,MAAM,8DAA8D,QAAQ,IAAI;CAEjG,QAAQ,KAAK,EAAE;;AAGjB,IAAI;CACF,MAAM,MAAM,YAAY;SACjB,KAAK;CACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;CAChE,QAAQ,OAAO,MAAM,gEAAgE,QAAQ,IAAI;CACjG,QAAQ,KAAK,EAAE;;AAGjB,IAAI,MAAM,OAAO,SAAS,UACxB,QAAQ,OAAO,MACb,uDAAuD,QAAQ,KAAK,GAAG,MAAM,OAAO,KAAK,qBAAqB,QAAQ,eAAe,KAAK,KAAK,CAAC,KACjJ;KAED,QAAQ,OAAO,MACb,6EAA6E,QAAQ,KAAK,GAAG,MAAM,OAAO,KAAK,IAChH;;;;AAMH,MAAM,WAAW,OAAO,WAAmB;CACzC,IAAI,cACF;CAEF,eAAe;CACf,QAAQ,OAAO,MAAM,iCAAiC,OAAO,mBAAmB;CAChF,IAAI;EACF,MAAM,MAAM,MAAM;UACX,KAAK;EACZ,QAAQ,OAAO,MACb,+CAA+C,eAAe,QAAQ,IAAI,UAAU,IAAI,IACzF;EACD,QAAQ,KAAK,EAAE;;CAEjB,QAAQ,KAAK,EAAE;;AAGjB,IAAI,eAAe;AAEnB,QAAQ,GAAG,sBAAsB,QAAQ;CACvC,QAAQ,OAAO,MACb,mDAAmD,IAAI,SAAS,IAAI,QAAQ,IAC7E;CACD,AAAK,SAAS,oBAAoB;EAClC;AACF,QAAQ,GAAG,uBAAuB,WAAW;CAC3C,MAAM,UAAU,kBAAkB,QAAS,OAAO,SAAS,OAAO,UAAW,OAAO,OAAO;CAC3F,QAAQ,OAAO,MAAM,oDAAoD,QAAQ,IAAI;CACrF,AAAK,SAAS,qBAAqB;EACnC;AAEF,QAAQ,GAAG,gBAAgB;CACzB,AAAK,SAAS,SAAS;EACvB;AACF,QAAQ,GAAG,iBAAiB;CAC1B,AAAK,SAAS,UAAU;EACxB"}