@synap-core/eve 0.1.0
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 +251 -0
- package/dist/add-R6RGUYER.js +22 -0
- package/dist/add-R6RGUYER.js.map +1 -0
- package/dist/auth-7FFZNARZ-4OIRGZ7R.js +31 -0
- package/dist/auth-7FFZNARZ-4OIRGZ7R.js.map +1 -0
- package/dist/chunk-22RIHU4J.js +975 -0
- package/dist/chunk-22RIHU4J.js.map +1 -0
- package/dist/chunk-23XQDB7K.js +1773 -0
- package/dist/chunk-23XQDB7K.js.map +1 -0
- package/dist/chunk-5TBV2VHZ.js +6067 -0
- package/dist/chunk-5TBV2VHZ.js.map +1 -0
- package/dist/chunk-D7P3IYYR.js +44 -0
- package/dist/chunk-D7P3IYYR.js.map +1 -0
- package/dist/chunk-EHPC7CKE.js +757 -0
- package/dist/chunk-EHPC7CKE.js.map +1 -0
- package/dist/chunk-FAE5UZFE.js +17 -0
- package/dist/chunk-FAE5UZFE.js.map +1 -0
- package/dist/chunk-HRF6TNXX.js +53 -0
- package/dist/chunk-HRF6TNXX.js.map +1 -0
- package/dist/chunk-HVJEW7TU.js +495 -0
- package/dist/chunk-HVJEW7TU.js.map +1 -0
- package/dist/chunk-JO5H5G6U.js +1529 -0
- package/dist/chunk-JO5H5G6U.js.map +1 -0
- package/dist/chunk-MUEQNBE6.js +1140 -0
- package/dist/chunk-MUEQNBE6.js.map +1 -0
- package/dist/chunk-O5WTCVMZ.js +3391 -0
- package/dist/chunk-O5WTCVMZ.js.map +1 -0
- package/dist/chunk-ROKIQIEX.js +65 -0
- package/dist/chunk-ROKIQIEX.js.map +1 -0
- package/dist/chunk-T7GCAJK5.js +4895 -0
- package/dist/chunk-T7GCAJK5.js.map +1 -0
- package/dist/chunk-UOQWJ3S4.js +138 -0
- package/dist/chunk-UOQWJ3S4.js.map +1 -0
- package/dist/chunk-YQWV5W4U.js +3479 -0
- package/dist/chunk-YQWV5W4U.js.map +1 -0
- package/dist/chunk-ZPDNZRVW.js +272 -0
- package/dist/chunk-ZPDNZRVW.js.map +1 -0
- package/dist/config-store-KTOWIKAS-XVZHNPKW.js +11 -0
- package/dist/config-store-KTOWIKAS-XVZHNPKW.js.map +1 -0
- package/dist/dist-2VRFSXMO.js +40 -0
- package/dist/dist-2VRFSXMO.js.map +1 -0
- package/dist/dist-C2QB4IKT.js +340 -0
- package/dist/dist-C2QB4IKT.js.map +1 -0
- package/dist/dist-DEIUVZ57.js +299 -0
- package/dist/dist-DEIUVZ57.js.map +1 -0
- package/dist/dist-DSKHGECB.js +36 -0
- package/dist/dist-DSKHGECB.js.map +1 -0
- package/dist/dist-GN2DN7CI.js +95 -0
- package/dist/dist-GN2DN7CI.js.map +1 -0
- package/dist/dist-TZL4XW2R.js +58 -0
- package/dist/dist-TZL4XW2R.js.map +1 -0
- package/dist/dist-ZP2APOYV.js +53 -0
- package/dist/dist-ZP2APOYV.js.map +1 -0
- package/dist/index.js +15083 -0
- package/dist/index.js.map +1 -0
- package/dist/operational-5RT6AZJI-ZEMPD32Q.js +12 -0
- package/dist/operational-5RT6AZJI-ZEMPD32Q.js.map +1 -0
- package/dist/reconcile-A4I3Z7VX-GQMEN4GC.js +12 -0
- package/dist/reconcile-A4I3Z7VX-GQMEN4GC.js.map +1 -0
- package/dist/rsshub-GOJBTNOD-UNNVKBFL.js +18 -0
- package/dist/rsshub-GOJBTNOD-UNNVKBFL.js.map +1 -0
- package/dist/synap-image-install-X36REYQ5-UGO4MAOP.js +17 -0
- package/dist/synap-image-install-X36REYQ5-UGO4MAOP.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../@eve/legs/dist/index.js"],"sourcesContent":["// src/lib/traefik.ts\nimport { execSync, spawnSync } from \"child_process\";\nimport { writeFileSync, readFileSync, existsSync, mkdirSync, readdirSync, chmodSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport { COMPONENTS } from \"@eve/dna\";\nvar HOST_CONFIG_DIR = \"/opt/traefik\";\nvar CONTAINER_DYNAMIC_DIR = \"/etc/traefik/dynamic\";\nvar CONTAINER_ACME_FILE = \"/etc/traefik/acme.json\";\nfunction getSynapBackendContainer() {\n return findComposeContainer(\"backend\");\n}\nfunction getSynapPodAdminContainer() {\n return findComposeContainer(\"pod-admin\");\n}\nfunction findComposeContainer(service) {\n try {\n const out = execSync(\n `docker ps --filter \"label=com.docker.compose.project=synap-backend\" --filter \"label=com.docker.compose.service=${service}\" --format \"{{.Names}}\"`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim();\n return out.split(\"\\n\")[0]?.trim() || null;\n } catch {\n return null;\n }\n}\nfunction connectToEveNetwork(containerName, alias) {\n if (alias) {\n try {\n const inspect = execSync(\n `docker inspect --format \"{{json .NetworkSettings.Networks}}\" ${containerName}`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim();\n const networks = JSON.parse(inspect);\n const eve = networks[\"eve-network\"];\n if (eve) {\n if ((eve.Aliases ?? []).includes(alias)) return;\n try {\n execSync(`docker network disconnect eve-network ${containerName}`, {\n stdio: [\"pipe\", \"pipe\", \"ignore\"]\n });\n } catch {\n }\n }\n } catch {\n }\n }\n const aliasArg = alias ? ` --alias ${alias}` : \"\";\n try {\n execSync(`docker network connect${aliasArg} eve-network ${containerName}`, {\n stdio: [\"pipe\", \"pipe\", \"ignore\"]\n });\n } catch {\n }\n}\nvar TRUSTED_PROXY_IPS = [\n \"10.0.0.0/8\",\n \"172.16.0.0/12\",\n \"192.168.0.0/16\",\n \"127.0.0.1/32\"\n];\nfunction buildStaticConfig(ssl, email) {\n const acmeSection = ssl && email ? `\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: ${email}\n storage: ${CONTAINER_ACME_FILE}\n tlsChallenge: {}\n` : \"\";\n return `# Traefik static config \\u2014 generated by Eve\nentryPoints:\n web:\n address: \":80\"\n websecure:\n address: \":443\"\n\nproviders:\n file:\n directory: ${CONTAINER_DYNAMIC_DIR}\n watch: true\n${acmeSection}\napi:\n dashboard: true\n insecure: true\n\nlog:\n level: INFO\n\naccessLog: {}\n`.trimStart();\n}\nfunction buildProxyModeStaticConfig() {\n const trustedIps = TRUSTED_PROXY_IPS.map((ip) => ` - \"${ip}\"`).join(\"\\n\");\n return `# Traefik static config \\u2014 generated by Eve (behind-proxy mode)\n# External proxy handles SSL termination. Traefik listens on HTTP only.\nentryPoints:\n web:\n address: \":80\"\n forwardedHeaders:\n trustedIPs:\n${trustedIps}\n\nproviders:\n file:\n directory: ${CONTAINER_DYNAMIC_DIR}\n watch: true\n\napi:\n dashboard: true\n insecure: true\n\nlog:\n level: INFO\n\naccessLog: {}\n`.trimStart();\n}\nfunction getDockerHostGateway() {\n try {\n const gw = execSync(\n \"docker network inspect eve-network --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}' 2>/dev/null\",\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim();\n if (gw) return gw;\n } catch {\n }\n try {\n const gw = execSync(\n \"docker network inspect bridge --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}' 2>/dev/null\",\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim();\n if (gw) return gw;\n } catch {\n }\n return \"172.17.0.1\";\n}\nfunction allowDockerToHostPorts(ports) {\n try {\n const networks = execSync(\n \"docker network ls --format '{{.Name}}' | grep -E 'eve-network|bridge' | while read net; do docker network inspect $net --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}' 2>/dev/null; done\",\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim().split(\"\\n\").filter(Boolean);\n for (const cidr of networks) {\n for (const port of ports) {\n try {\n execSync(`ufw allow from ${cidr} to any port ${port} 2>/dev/null`, {\n stdio: [\"pipe\", \"pipe\", \"ignore\"]\n });\n } catch {\n }\n }\n }\n } catch {\n }\n}\nvar TraefikService = class {\n configDir;\n traefikConfigPath;\n dynamicConfigDir;\n constructor(configDir = HOST_CONFIG_DIR) {\n this.configDir = configDir;\n this.traefikConfigPath = join(configDir, \"traefik.yml\");\n this.dynamicConfigDir = join(configDir, \"dynamic\");\n }\n async install() {\n console.log(\"Installing Traefik...\");\n if (!existsSync(this.configDir)) mkdirSync(this.configDir, { recursive: true });\n if (!existsSync(this.dynamicConfigDir)) mkdirSync(this.dynamicConfigDir, { recursive: true });\n const isDokploy = existsSync(\"/opt/dokploy\");\n if (isDokploy) {\n console.log(\"Detected Dokploy \\u2014 using existing Traefik installation\");\n await this.configureDokployTraefik();\n } else {\n await this.installStandalone();\n }\n console.log(\"Traefik installation complete\");\n }\n async installStandalone() {\n writeFileSync(this.traefikConfigPath, buildStaticConfig(false));\n console.log(\"Created Traefik static config\");\n try {\n execSync(\"docker network create eve-network\", { stdio: \"ignore\" });\n } catch {\n }\n const acmePath = join(this.configDir, \"acme.json\");\n if (!existsSync(acmePath)) {\n writeFileSync(acmePath, \"\", { mode: 384 });\n } else {\n try {\n chmodSync(acmePath, 384);\n } catch {\n }\n }\n spawnSync(\"docker\", [\"rm\", \"-f\", \"eve-legs-traefik\"], { stdio: \"ignore\" });\n const result = spawnSync(\"docker\", [\n \"run\",\n \"-d\",\n \"--name\",\n \"eve-legs-traefik\",\n \"--restart\",\n \"unless-stopped\",\n \"-p\",\n \"80:80\",\n \"-p\",\n \"443:443\",\n \"-p\",\n \"8080:8080\",\n \"-v\",\n \"/var/run/docker.sock:/var/run/docker.sock:ro\",\n \"-v\",\n `${this.configDir}/traefik.yml:/etc/traefik/traefik.yml:ro`,\n \"-v\",\n `${this.dynamicConfigDir}:/etc/traefik/dynamic:ro`,\n \"-v\",\n `${acmePath}:/etc/traefik/acme.json`,\n \"--network\",\n \"eve-network\",\n \"traefik:v3.0\"\n ], { stdio: \"inherit\" });\n if (result.status !== 0) throw new Error(`docker run exited with code ${result.status}`);\n console.log(\"Traefik container started\");\n }\n async configureDokployTraefik() {\n console.log(\"Using Dokploy-managed Traefik\");\n }\n async configureSubdomains(domain, ssl, email, installedComponents, behindProxy = false, customRoutes) {\n const synapContainer = getSynapBackendContainer();\n if (synapContainer) {\n connectToEveNetwork(synapContainer, \"eve-brain-synap\");\n console.log(` Connected ${synapContainer} \\u2192 eve-network (alias: eve-brain-synap)`);\n } else if (!installedComponents || installedComponents.includes(\"synap\")) {\n console.warn(\" Warning: Synap backend container not found \\u2014 pod.domain routing will 502 until `eve brain init` is run\");\n }\n const podAdminContainer = getSynapPodAdminContainer();\n if (podAdminContainer) {\n connectToEveNetwork(podAdminContainer, \"eve-brain-pod-admin\");\n console.log(` Connected ${podAdminContainer} \\u2192 eve-network (alias: eve-brain-pod-admin)`);\n }\n let effectiveInstalled = installedComponents;\n if (effectiveInstalled && effectiveInstalled.includes(\"synap\") && !effectiveInstalled.includes(\"pod-admin\")) {\n effectiveInstalled = [...effectiveInstalled, \"pod-admin\"];\n }\n const services = [];\n const pathRoutes = [];\n for (const comp of COMPONENTS) {\n if (!comp.service || !comp.service.subdomain) continue;\n if (effectiveInstalled && !effectiveInstalled.includes(comp.id)) continue;\n let containerName = comp.service.containerName;\n if (comp.id === \"synap\" && synapContainer) containerName = synapContainer;\n if (comp.id === \"pod-admin\" && podAdminContainer) containerName = podAdminContainer;\n services.push({\n id: comp.id,\n subdomain: comp.service.subdomain,\n upstream: `http://${containerName}:${comp.service.internalPort}`,\n requires: comp.id\n });\n for (const extra of comp.service.additionalSubdomains ?? []) {\n services.push({\n id: `${comp.id}-${extra.subdomain}`,\n subdomain: extra.subdomain,\n upstream: `http://${containerName}:${extra.internalPort}`,\n requires: comp.id,\n priority: 1\n });\n for (const proxy of extra.pathProxies ?? []) {\n pathRoutes.push({\n id: `${comp.id}-${extra.subdomain}-${proxy.path.replace(/\\//g, \"\")}`,\n subdomain: extra.subdomain,\n path: proxy.path,\n upstream: `http://${containerName}:${proxy.internalPort}`,\n requires: comp.id\n });\n }\n }\n }\n if (customRoutes && customRoutes.length > 0) {\n allowDockerToHostPorts(customRoutes.map((r) => r.port));\n for (const route of customRoutes) {\n const routeDomain = route.domain || domain;\n const subdomain = route.subdomain;\n const hostGateway = getDockerHostGateway();\n const upstream = `http://${hostGateway}:${route.port}`;\n services.push({\n id: `custom-${subdomain}`,\n subdomain,\n upstream,\n requires: null,\n domain: routeDomain\n });\n console.log(` Added custom route: ${subdomain}.${routeDomain} \\u2192 ${upstream}`);\n }\n }\n const routersYaml = services.map((s) => {\n const routeDomain = s.domain || domain;\n const host = `${s.subdomain}.${routeDomain}`;\n if (behindProxy) {\n return ` ${s.id}:\n rule: \"Host(\\`${host}\\`)\"\n` + (s.priority !== void 0 ? ` priority: ${s.priority}\n` : \"\") + ` entryPoints:\n - web\n middlewares:\n - forward-https\n service: ${s.id}-svc`;\n }\n if (ssl) {\n return (\n // HTTP → HTTPS redirect router\n ` ${s.id}-http:\n rule: \"Host(\\`${host}\\`)\"\n entryPoints:\n - web\n middlewares:\n - redirect-to-https\n service: ${s.id}-svc\n ${s.id}:\n rule: \"Host(\\`${host}\\`)\"\n entryPoints:\n - websecure\n tls:\n certResolver: letsencrypt\n service: ${s.id}-svc`\n );\n }\n return ` ${s.id}-http:\n rule: \"Host(\\`${host}\\`)\"\n entryPoints:\n - web\n service: ${s.id}-svc\n ${s.id}-https:\n rule: \"Host(\\`${host}\\`)\"\n entryPoints:\n - websecure\n tls: {}\n service: ${s.id}-svc`;\n }).join(\"\\n\");\n const servicesYaml = services.map(\n (s) => ` ${s.id}-svc:\n loadBalancer:\n` + (behindProxy ? ` passHostHeader: true\n` : \"\") + ` servers:\n - url: \"${s.upstream}\"`\n ).join(\"\\n\");\n const synapRealtimeContainer = findComposeContainer(\"realtime\");\n const synapService = services.find((s) => s.id === \"synap\");\n let realtimeRouterYaml = \"\";\n let realtimeServiceYaml = \"\";\n if (synapService && synapRealtimeContainer) {\n connectToEveNetwork(synapRealtimeContainer);\n const rHost = `${synapService.subdomain}.${domain}`;\n const rRule = `Host(\\`${rHost}\\`) && (PathPrefix(\\`/socket.io/\\`) || PathPrefix(\\`/realtime/\\`))`;\n const rUpstream = `http://${synapRealtimeContainer}:4001`;\n if (behindProxy) {\n realtimeRouterYaml = `\n synap-realtime:\n rule: \"${rRule}\"\n priority: 100\n entryPoints:\n - web\n middlewares:\n - forward-https\n service: synap-realtime-svc`;\n } else if (ssl) {\n realtimeRouterYaml = `\n synap-realtime-http:\n rule: \"${rRule}\"\n priority: 100\n entryPoints:\n - web\n middlewares:\n - redirect-to-https\n service: synap-realtime-svc\n synap-realtime:\n rule: \"${rRule}\"\n priority: 100\n entryPoints:\n - websecure\n tls:\n certResolver: letsencrypt\n service: synap-realtime-svc`;\n } else {\n realtimeRouterYaml = `\n synap-realtime-http:\n rule: \"${rRule}\"\n priority: 100\n entryPoints:\n - web\n service: synap-realtime-svc\n synap-realtime-https:\n rule: \"${rRule}\"\n priority: 100\n entryPoints:\n - websecure\n tls: {}\n service: synap-realtime-svc`;\n }\n realtimeServiceYaml = `\n synap-realtime-svc:\n loadBalancer:\n` + (behindProxy ? ` passHostHeader: true\n` : \"\") + ` servers:\n - url: \"${rUpstream}\"`;\n }\n const middlewaresYaml = behindProxy ? ` middlewares:\n forward-https:\n headers:\n customRequestHeaders:\n X-Forwarded-Proto: \"https\"\n` : !ssl ? \"\" : ` middlewares:\n redirect-to-https:\n redirectScheme:\n scheme: https\n permanent: true\n`;\n const pathRoutesYaml = pathRoutes.length === 0 ? \"\" : \"\\n\" + pathRoutes.map((p) => {\n const host = `${p.subdomain}.${domain}`;\n if (behindProxy) {\n return ` ${p.id}:\n rule: \"Host(\\`${host}\\`) && Path(\\`${p.path}\\`)\"\n priority: 10\n entryPoints:\n - web\n middlewares:\n - forward-https\n service: ${p.id}-svc`;\n }\n if (ssl) {\n return ` ${p.id}:\n rule: \"Host(\\`${host}\\`) && Path(\\`${p.path}\\`)\"\n priority: 10\n entryPoints:\n - websecure\n tls:\n certResolver: letsencrypt\n service: ${p.id}-svc`;\n }\n return ` ${p.id}:\n rule: \"Host(\\`${host}\\`) && Path(\\`${p.path}\\`)\"\n priority: 10\n entryPoints:\n - web\n service: ${p.id}-svc`;\n }).join(\"\\n\");\n const pathServicesYaml = pathRoutes.length === 0 ? \"\" : \"\\n\" + pathRoutes.map(\n (p) => ` ${p.id}-svc:\n loadBalancer:\n` + (behindProxy ? ` passHostHeader: true\n` : \"\") + ` servers:\n - url: \"${p.upstream}\"`\n ).join(\"\\n\");\n const modeComment = behindProxy ? \"behind-proxy\" : ssl ? \"ssl\" : \"plain\";\n const dynamicConfig = `# Eve subdomain routes \\u2014 generated by \\`eve domain set\\`\n# Domain: ${domain} | Mode: ${modeComment}\nhttp:\n${middlewaresYaml} routers:\n${routersYaml}${realtimeRouterYaml}${pathRoutesYaml}\n services:\n${servicesYaml}${realtimeServiceYaml}${pathServicesYaml}\n`;\n if (!existsSync(this.configDir)) mkdirSync(this.configDir, { recursive: true });\n writeFileSync(this.traefikConfigPath, behindProxy ? buildProxyModeStaticConfig() : buildStaticConfig(ssl, email));\n if (!existsSync(this.dynamicConfigDir)) mkdirSync(this.dynamicConfigDir, { recursive: true });\n writeFileSync(join(this.dynamicConfigDir, \"eve-routes.yml\"), dynamicConfig, \"utf-8\");\n try {\n execSync(\"docker restart eve-legs-traefik\", { stdio: \"ignore\" });\n console.log(\" Traefik restarted\");\n } catch {\n console.warn(\" Could not restart Traefik automatically \\u2014 run: docker restart eve-legs-traefik\");\n }\n }\n // ---------------------------------------------------------------------------\n // Proxy mode\n // ---------------------------------------------------------------------------\n /**\n * Detect whether Traefik is currently running in behind-proxy mode by\n * checking whether the static config has no `websecure` entrypoint.\n */\n getProxyModeStatus() {\n try {\n const config = readFileSync(this.traefikConfigPath, \"utf-8\");\n const enabled = !config.includes(\"websecure\");\n const ssl = config.includes(\"certificatesResolvers\");\n return {\n enabled,\n ssl: !enabled && ssl,\n entrypoints: enabled ? [\"web\"] : [\"web\", \"websecure\"]\n };\n } catch {\n return { enabled: false, ssl: false, entrypoints: [] };\n }\n }\n /**\n * Switch Traefik to behind-proxy mode:\n * - HTTP-only static config (no websecure, no cert resolver, trusted IPs)\n * - Dynamic routes without redirects or TLS\n * - Recreate container without port 443 binding\n */\n async enableProxyMode(domain, installedComponents) {\n if (!existsSync(this.configDir)) mkdirSync(this.configDir, { recursive: true });\n if (!existsSync(this.dynamicConfigDir)) mkdirSync(this.dynamicConfigDir, { recursive: true });\n writeFileSync(this.traefikConfigPath, buildProxyModeStaticConfig());\n const synapContainer = getSynapBackendContainer();\n if (synapContainer) connectToEveNetwork(synapContainer, \"eve-brain-synap\");\n await this.configureSubdomains(domain, false, void 0, installedComponents, true);\n const acmePath = join(this.configDir, \"acme.json\");\n if (!existsSync(acmePath)) {\n writeFileSync(acmePath, \"\", { mode: 384 });\n } else {\n try {\n chmodSync(acmePath, 384);\n } catch {\n }\n }\n this.recreateTraefikContainer([\"80:80\", \"8080:8080\"], acmePath);\n }\n /**\n * Restore standalone mode (Traefik handles its own SSL).\n */\n async disableProxyMode(domain, ssl, email, installedComponents) {\n if (!existsSync(this.configDir)) mkdirSync(this.configDir, { recursive: true });\n await this.configureSubdomains(domain, ssl, email, installedComponents, false);\n const acmePath = join(this.configDir, \"acme.json\");\n if (!existsSync(acmePath)) {\n writeFileSync(acmePath, \"\", { mode: 384 });\n } else {\n try {\n chmodSync(acmePath, 384);\n } catch {\n }\n }\n this.recreateTraefikContainer([\"80:80\", \"443:443\", \"8080:8080\"], acmePath);\n }\n /** Stop + remove + relaunch the Traefik container with the given port bindings. */\n recreateTraefikContainer(ports, acmePath) {\n spawnSync(\"docker\", [\"rm\", \"-f\", \"eve-legs-traefik\"], { stdio: \"ignore\" });\n const result = spawnSync(\"docker\", [\n \"run\",\n \"-d\",\n \"--name\",\n \"eve-legs-traefik\",\n \"--restart\",\n \"unless-stopped\",\n ...ports.flatMap((p) => [\"-p\", p]),\n \"-v\",\n \"/var/run/docker.sock:/var/run/docker.sock:ro\",\n \"-v\",\n `${this.traefikConfigPath}:/etc/traefik/traefik.yml:ro`,\n \"-v\",\n `${this.dynamicConfigDir}:/etc/traefik/dynamic:ro`,\n \"-v\",\n `${acmePath}:/etc/traefik/acme.json`,\n \"--network\",\n \"eve-network\",\n \"traefik:v3.0\"\n ], { stdio: \"inherit\" });\n if (result.status !== 0) throw new Error(`docker run exited with code ${result.status}`);\n }\n // ---------------------------------------------------------------------------\n // Routes\n // ---------------------------------------------------------------------------\n async addRoute(route) {\n const configFile = join(this.dynamicConfigDir, `${route.path.replace(/\\//g, \"_\")}.yml`);\n const routeConfig = `http:\n routers:\n ${route.path.replace(/[^a-zA-Z0-9]/g, \"_\")}:\n rule: \"Host(\\`${route.domain || \"localhost\"}\\`) && PathPrefix(\\`${route.path}\\`)\"\n service: ${route.path.replace(/[^a-zA-Z0-9]/g, \"_\")}\n` + (route.ssl ? ` tls: {}\n` : \"\") + ` services:\n ${route.path.replace(/[^a-zA-Z0-9]/g, \"_\")}:\n loadBalancer:\n servers:\n - url: \"${route.target}\"\n`;\n writeFileSync(configFile, routeConfig);\n }\n async removeRoute(path) {\n const configFile = join(this.dynamicConfigDir, `${path.replace(/\\//g, \"_\")}.yml`);\n if (existsSync(configFile)) writeFileSync(configFile, \"\");\n }\n async configureDomain(domain) {\n const routes = this.getRoutes();\n for (const route of routes) await this.addRoute({ ...route, domain });\n }\n async enableSSL() {\n const routes = this.getRoutes();\n for (const route of routes) {\n if (route.domain) await this.addRoute({ ...route, ssl: true });\n }\n }\n getRoutes() {\n try {\n if (!existsSync(this.dynamicConfigDir)) return [];\n const files = readdirSafe(this.dynamicConfigDir).filter((f) => f.endsWith(\".yml\") && f !== \"eve-routes.yml\");\n return files.flatMap((file) => {\n const content = readFileSync(join(this.dynamicConfigDir, file), \"utf-8\");\n const pathMatch = content.match(/PathPrefix\\(`(.+)`\\)/);\n const urlMatch = content.match(/url: \"(.+)\"/);\n if (!pathMatch || !urlMatch) return [];\n return [{\n path: pathMatch[1],\n target: urlMatch[1],\n domain: content.match(/Host\\(`(.+?)`\\)/)?.[1],\n ssl: content.includes(\"tls:\")\n }];\n });\n } catch {\n return [];\n }\n }\n getStatus() {\n const installed = existsSync(this.traefikConfigPath);\n let running = false;\n try {\n const out = execSync('docker ps --filter \"name=eve-legs-traefik\" --format \"{{.Names}}\"', { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }).trim();\n running = out.length > 0;\n } catch {\n }\n const routes = this.getRoutes();\n const proxyStatus = this.getProxyModeStatus();\n let domain = routes.find((r) => r.domain)?.domain ?? null;\n let ssl = routes.some((r) => r.ssl);\n const eveRoutesPath = join(this.dynamicConfigDir, \"eve-routes.yml\");\n if (existsSync(eveRoutesPath)) {\n try {\n const content = readFileSync(eveRoutesPath, \"utf-8\");\n const hostMatch = content.match(/Host\\(`([^`]+)`\\)/);\n if (hostMatch) {\n const host = hostMatch[1];\n const parts = host.split(\".\");\n domain = parts.length > 2 ? parts.slice(1).join(\".\") : host;\n }\n ssl = content.includes(\"certResolver:\");\n } catch {\n }\n }\n return {\n installed,\n running,\n domain,\n ssl,\n behindProxy: proxyStatus.enabled,\n routes\n };\n }\n cleanConfig() {\n if (existsSync(this.dynamicConfigDir)) {\n for (const file of readdirSafe(this.dynamicConfigDir)) {\n if (file.endsWith(\".yml\") || file.endsWith(\".yaml\")) {\n try {\n unlinkSync(join(this.dynamicConfigDir, file));\n } catch {\n }\n }\n }\n }\n if (existsSync(this.traefikConfigPath)) {\n try {\n unlinkSync(this.traefikConfigPath);\n } catch {\n }\n }\n }\n};\nfunction readdirSafe(dir) {\n try {\n return readdirSync(dir);\n } catch {\n return [];\n }\n}\n\n// src/lib/tunnel.ts\nimport { execSync as execSync2 } from \"child_process\";\nimport { writeFileSync as writeFileSync2, existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2 } from \"fs\";\nimport { join as join2 } from \"path\";\nvar TunnelService = class {\n configDir;\n constructor(configDir = \"/opt/hestia/tunnels\") {\n this.configDir = configDir;\n if (!existsSync2(this.configDir)) {\n mkdirSync2(this.configDir, { recursive: true });\n }\n }\n async setupPangolin(config) {\n console.log(\"Setting up Pangolin tunnel...\");\n try {\n execSync2(\"which pangolin\", { stdio: \"ignore\" });\n console.log(\"Pangolin CLI already installed\");\n } catch {\n console.log(\"Installing Pangolin CLI...\");\n execSync2(\"curl -fsSL https://get.pangolin.cloud | sh\", { stdio: \"inherit\" });\n }\n const pangolinConfig = {\n server: config?.server || \"pangolin.to\",\n domain: config?.domain,\n autoUpdate: true\n };\n writeFileSync2(\n join2(this.configDir, \"pangolin.json\"),\n JSON.stringify(pangolinConfig, null, 2)\n );\n console.log(\"Pangolin configured successfully\");\n }\n async setupCloudflare(config) {\n console.log(\"Setting up Cloudflare tunnel...\");\n try {\n execSync2(\"which cloudflared\", { stdio: \"ignore\" });\n console.log(\"cloudflared already installed\");\n } catch {\n console.log(\"Installing cloudflared...\");\n execSync2(\"npm install -g cloudflared\", { stdio: \"inherit\" });\n }\n const cfConfig = {\n tunnel: null,\n \"credentials-file\": join2(this.configDir, \"cloudflare-credentials.json\"),\n ingress: [\n {\n hostname: config?.domain,\n service: \"http://localhost:3000\"\n },\n {\n service: \"http_status:404\"\n }\n ]\n };\n writeFileSync2(\n join2(this.configDir, \"cloudflare.yml\"),\n JSON.stringify(cfConfig, null, 2)\n );\n console.log(\"Cloudflare tunnel configured\");\n }\n startTunnel(provider) {\n console.log(`Starting ${provider} tunnel...`);\n if (provider === \"pangolin\") {\n execSync2(\"pangolin start\", { stdio: \"inherit\" });\n } else {\n execSync2(\"cloudflared tunnel run\", { stdio: \"inherit\" });\n }\n }\n stopTunnel(provider) {\n console.log(`Stopping ${provider} tunnel...`);\n try {\n if (provider === \"pangolin\") {\n execSync2(\"pkill pangolin\", { stdio: \"ignore\" });\n } else {\n execSync2(\"pkill cloudflared\", { stdio: \"ignore\" });\n }\n console.log(`${provider} tunnel stopped`);\n } catch {\n console.log(`${provider} tunnel was not running`);\n }\n }\n getConfig() {\n try {\n const configPath = join2(this.configDir, \"config.json\");\n if (!existsSync2(configPath)) {\n return null;\n }\n return JSON.parse(readFileSync2(configPath, \"utf-8\"));\n } catch {\n return null;\n }\n }\n};\n\n// src/lib/run-proxy-setup.ts\nasync function runLegsProxySetup(options) {\n console.log(\"\\u{1F9B5} Setting up Legs (Traefik reverse proxy)...\\n\");\n const traefik = options.standalone ? new TraefikService(\"/opt/eve/traefik\") : new TraefikService();\n console.log(\"Step 1: Installing Traefik...\");\n await traefik.install();\n console.log(\"\\nStep 2: Configuring routes...\");\n const organs = [\n { name: \"brain\", path: \"/brain\", port: 3e3 },\n { name: \"heart\", path: \"/heart\", port: 4e3 },\n { name: \"memory\", path: \"/memory\", port: 5432 },\n { name: \"nerves\", path: \"/nerves\", port: 6379 },\n { name: \"eyes\", path: \"/eyes\", port: 8080 },\n { name: \"dna\", path: \"/dna\", port: 9e3 }\n ];\n for (const organ of organs) {\n const target = `http://localhost:${organ.port}`;\n await traefik.addRoute({\n path: organ.path,\n target,\n domain: options.domain,\n ssl: false\n });\n console.log(` \\u2713 Route: ${organ.path} -> ${target}`);\n }\n if (options.tunnel) {\n const tunnelMode = options.tunnel === \"cloudflare_tunnel\" ? \"cloudflare\" : options.tunnel === \"pangolin_tunnel\" ? \"pangolin\" : options.tunnel;\n console.log(`\nStep 3: Setting up ${tunnelMode} tunnel...`);\n const tunnel = new TunnelService();\n if (tunnelMode === \"pangolin\") {\n await tunnel.setupPangolin({ domain: options.tunnelDomain });\n console.log(\" \\u2713 Pangolin tunnel configured\");\n } else if (tunnelMode === \"cloudflare\") {\n await tunnel.setupCloudflare({ domain: options.tunnelDomain });\n console.log(\" \\u2713 Cloudflare tunnel configured\");\n } else {\n console.warn(` \\u26A0 Unknown tunnel provider: ${String(options.tunnel)}`);\n }\n }\n if (options.domain) {\n console.log(`\nStep 4: Configuring domain ${options.domain}...`);\n await traefik.configureDomain(options.domain);\n console.log(\" \\u2713 Domain configured\");\n if (options.ssl) {\n console.log(\"\\nStep 5: Enabling SSL...\");\n await traefik.enableSSL();\n console.log(\" \\u2713 SSL enabled with Let's Encrypt\");\n }\n }\n console.log(\"\\n\\u2705 Legs setup complete!\");\n console.log(\"\\nYour organs are now accessible at:\");\n const baseUrl = options.domain || \"localhost\";\n const protocol = options.ssl ? \"https\" : \"http\";\n for (const organ of organs) {\n console.log(` ${protocol}://${baseUrl}${organ.path}`);\n }\n if (options.tunnel) {\n console.log(`\nTunnel configured with ${options.tunnel}`);\n if (options.tunnelDomain) {\n console.log(`External domain: ${options.tunnelDomain}`);\n }\n }\n}\n\n// src/commands/setup.ts\nfunction setupCommand(program) {\n program.command(\"setup\").description(\"Setup Traefik reverse proxy for Eve\").option(\"--domain <domain>\", \"Custom domain for external access\").option(\n \"--tunnel <provider>\",\n \"Tunnel provider (pangolin, cloudflare, pangolin_tunnel, cloudflare_tunnel)\"\n ).option(\"--tunnel-domain <domain>\", \"Domain for tunnel (if using tunnel)\").option(\"--ssl\", \"Enable SSL/TLS (requires --domain)\").option(\"--standalone\", \"Install standalone Traefik (not using Dokploy)\").action(async (options) => {\n try {\n await runLegsProxySetup({\n domain: options.domain,\n tunnel: options.tunnel,\n tunnelDomain: options.tunnelDomain,\n ssl: Boolean(options.ssl),\n standalone: Boolean(options.standalone)\n });\n } catch (error) {\n console.error(\"\\n\\u274C Setup failed:\", error);\n process.exit(1);\n }\n });\n}\n\n// src/commands/domain.ts\nimport { writeEveSecrets, readEveSecrets, entityStateManager, validateBaseDomain } from \"@eve/dna\";\nfunction domainCommand(program) {\n const domain = program.command(\"domain\").description(\"Configure Traefik domain and SSL\");\n domain.command(\"set <domain>\").description(\"Set primary domain for Traefik routes\").option(\"--ssl\", \"Enable SSL with Let's Encrypt\").option(\"--email <email>\", \"ACME email for SSL certificate\").option(\"--behind-proxy\", \"HTTP-only mode: external proxy handles SSL (no port 443, no redirects)\").action(async (domainName, options) => {\n try {\n const traefik = new TraefikService();\n if (options.behindProxy && options.ssl) {\n console.error(\"--behind-proxy and --ssl are mutually exclusive. The external proxy handles SSL.\");\n process.exit(1);\n }\n const domainError = validateBaseDomain(domainName);\n if (domainError) {\n console.error(domainError);\n process.exit(1);\n }\n const prior = await readEveSecrets(process.cwd());\n const explicitMode = options.behindProxy === true || options.ssl === true;\n const behindProxy = options.behindProxy === true ? true : options.ssl === true ? false : !!prior?.domain?.behindProxy;\n const ssl = behindProxy ? false : options.ssl === true || !explicitMode && !!prior?.domain?.ssl;\n const email = options.email ?? prior?.domain?.email;\n let installedComponents = [];\n try {\n installedComponents = await entityStateManager.getInstalledComponents();\n } catch {\n }\n const inheritedNote = !explicitMode ? ` (inherited mode: ${behindProxy ? \"behind-proxy\" : ssl ? \"ssl\" : \"plain\"})` : \"\";\n console.log(`Configuring domain: ${domainName}${inheritedNote}`);\n if (behindProxy) {\n await traefik.enableProxyMode(domainName, installedComponents);\n await writeEveSecrets(\n { domain: { primary: domainName, ssl: false, behindProxy: true, email } },\n process.cwd()\n );\n console.log(`Domain configured: ${domainName} (behind-proxy, HTTP only)`);\n console.log(\"External proxy must forward port 80 and handle SSL termination.\");\n } else {\n await traefik.configureSubdomains(domainName, ssl, email, installedComponents, false);\n await writeEveSecrets(\n { domain: { primary: domainName, ssl, email, behindProxy: false } },\n process.cwd()\n );\n const protocol = ssl ? \"https\" : \"http\";\n console.log(`Domain configured: ${domainName}${ssl ? \" (SSL)\" : \"\"}`);\n console.log(\"\\nExample endpoints:\");\n for (const sub of [\"pod\", \"pod-admin\", \"eve\"]) {\n console.log(` ${protocol}://${sub}.${domainName}`);\n }\n }\n } catch (error) {\n console.error(\"Domain configuration failed:\", error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n domain.command(\"unset\").description(\"Revert domain to localhost\").action(async () => {\n try {\n const traefik = new TraefikService();\n await traefik.configureDomain(\"localhost\");\n console.log(\"Domain configuration removed (localhost)\");\n } catch (error) {\n console.error(\"Failed to unset domain:\", error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n domain.command(\"status\").description(\"Show current domain and route configuration\").action(async () => {\n try {\n const traefik = new TraefikService();\n const status = await traefik.getStatus();\n console.log(\"Legs (Traefik) configuration:\\n\");\n const state = status.installed ? status.running ? \"running\" : \"installed (not running)\" : \"not installed\";\n console.log(`Status: ${state}`);\n console.log(`Domain: ${status.domain || \"localhost\"}`);\n console.log(`SSL: ${status.ssl ? \"enabled\" : \"disabled\"}`);\n console.log(`\nRoutes (${status.routes.length}):`);\n for (const route of status.routes) {\n console.log(` ${route.path} -> ${route.target}`);\n }\n } catch (error) {\n console.error(\"Failed to get status:\", error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n}\n\n// src/commands/newt.ts\nimport { existsSync as existsSync3, mkdirSync as mkdirSync3, writeFileSync as writeFileSync3 } from \"fs\";\nimport { join as join3 } from \"path\";\nimport { execSync as execSync3 } from \"child_process\";\nvar COMPOSE = `services:\n newt:\n image: fosrl/newt:latest\n container_name: eve-legs-newt\n restart: unless-stopped\n env_file:\n - \\${NEWT_ENV_FILE}\n networks:\n - eve-network\n\nnetworks:\n eve-network:\n external: true\n`.trim();\nfunction composePath(cwd) {\n return join3(cwd, \".eve\", \"legs\", \"newt-compose.yml\");\n}\nfunction envPath(cwd) {\n return join3(cwd, \".eve\", \"legs\", \"newt.env\");\n}\nfunction writeNewtEnvTemplate(cwd) {\n const dir = join3(cwd, \".eve\", \"legs\");\n mkdirSync3(dir, { recursive: true });\n const p = envPath(cwd);\n if (!existsSync3(p)) {\n writeFileSync3(\n p,\n [\n \"# Pangolin Newt site connector \\u2014 https://docs.pangolin.net/manage/sites/install-site\",\n \"PANGOLIN_ENDPOINT=https://your-pangolin-host.example\",\n \"NEWT_ID=\",\n \"NEWT_SECRET=\",\n \"LOG_LEVEL=INFO\",\n \"# Optional: Docker discovery (read-only socket)\",\n \"# DOCKER_SOCKET=unix:///var/run/docker.sock\",\n \"\"\n ].join(\"\\n\"),\n \"utf-8\"\n );\n }\n return p;\n}\nfunction newtCommand(program) {\n const n = program.command(\"newt\").description(\"Pangolin Newt (site connector) on eve-network \\u2014 fosrl/newt\");\n n.command(\"init\").description(\"Write .eve/legs/newt.env template if missing\").action(() => {\n const cwd = process.cwd();\n const p = writeNewtEnvTemplate(cwd);\n console.log(`Newt env template: ${p}\nEdit PANGOLIN_ENDPOINT, NEWT_ID, NEWT_SECRET then run: eve legs newt up`);\n });\n n.command(\"up\").description(\"Start Newt container (requires filled newt.env + eve-network)\").action(() => {\n const cwd = process.cwd();\n writeNewtEnvTemplate(cwd);\n const envFile = envPath(cwd);\n mkdirSync3(join3(cwd, \".eve\", \"legs\"), { recursive: true });\n writeFileSync3(composePath(cwd), COMPOSE, \"utf-8\");\n try {\n execSync3(\"docker network create eve-network\", { stdio: \"ignore\" });\n } catch {\n }\n const env = { ...process.env, NEWT_ENV_FILE: envFile };\n execSync3(`docker compose -f \"${composePath(cwd)}\" up -d`, { stdio: \"inherit\", cwd, env });\n console.log(\"\\nNewt running. See Pangolin dashboard for site status.\\n\");\n });\n n.command(\"down\").description(\"Stop Newt container\").action(() => {\n const cwd = process.cwd();\n if (!existsSync3(composePath(cwd))) {\n console.log(\"No newt compose. Run: eve legs newt up\");\n return;\n }\n execSync3(`docker compose -f \"${composePath(cwd)}\" down`, { stdio: \"inherit\", cwd, env: { ...process.env, NEWT_ENV_FILE: envPath(cwd) } });\n });\n}\n\n// src/commands/restart.ts\nimport { spawnSync as spawnSync2, execSync as execSync4 } from \"child_process\";\nimport { existsSync as existsSync4 } from \"fs\";\nvar CONTAINER = \"eve-legs-traefik\";\nvar CONFIG_DIR = \"/opt/traefik\";\nfunction reconnectSynapToEveNetwork() {\n try {\n const name = execSync4(\n `docker ps --filter \"label=com.docker.compose.project=synap-backend\" --filter \"label=com.docker.compose.service=backend\" --format \"{{.Names}}\"`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim().split(\"\\n\")[0]?.trim();\n if (!name) return;\n try {\n const inspect = execSync4(\n `docker inspect --format \"{{json .NetworkSettings.Networks}}\" ${name}`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim();\n const networks = JSON.parse(inspect);\n const eve = networks[\"eve-network\"];\n if (eve && (eve.Aliases ?? []).includes(\"eve-brain-synap\")) return;\n if (eve) {\n try {\n execSync4(`docker network disconnect eve-network ${name}`, { stdio: [\"pipe\", \"pipe\", \"ignore\"] });\n } catch {\n }\n }\n } catch {\n }\n try {\n execSync4(`docker network connect --alias eve-brain-synap eve-network ${name}`, { stdio: [\"pipe\", \"pipe\", \"ignore\"] });\n console.log(` Reconnected ${name} \\u2192 eve-network (alias: eve-brain-synap)`);\n } catch {\n }\n } catch {\n }\n}\nfunction freePort(port) {\n try {\n const out = execSync4(\n `docker ps --format '{{.Names}}\\\\t{{.Ports}}' | grep ':${port}->'`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim();\n for (const line of out.split(\"\\n\").filter(Boolean)) {\n const name = line.split(\"\t\")[0]?.trim();\n if (name && name !== CONTAINER) {\n console.log(` Stopping container holding port ${port}: ${name}`);\n spawnSync2(\"docker\", [\"stop\", name], { stdio: \"inherit\" });\n }\n }\n } catch {\n }\n}\nfunction restartCommand(program) {\n program.command(\"restart\").description(\"Recreate the Traefik container with correct volume mounts\").action(() => {\n if (!existsSync4(`${CONFIG_DIR}/traefik.yml`)) {\n console.error(`No Traefik config found at ${CONFIG_DIR}/traefik.yml`);\n console.error(\"Run: eve domain set <domain> --ssl --email <email> first\");\n process.exit(1);\n }\n console.log(\"Freeing ports 80 / 443...\");\n freePort(80);\n freePort(443);\n const acmePath = `${CONFIG_DIR}/acme.json`;\n if (!existsSync4(acmePath)) {\n execSync4(`touch ${acmePath} && chmod 600 ${acmePath}`);\n console.log(`Created ${acmePath} (600)`);\n } else {\n execSync4(`chmod 600 ${acmePath}`);\n console.log(`Fixed permissions on ${acmePath} \\u2192 600`);\n }\n console.log(`Removing existing ${CONTAINER} container (if any)...`);\n spawnSync2(\"docker\", [\"rm\", \"-f\", CONTAINER], { stdio: \"inherit\" });\n console.log(\"Starting Traefik with correct volume mounts...\");\n const result = spawnSync2(\"docker\", [\n \"run\",\n \"-d\",\n \"--name\",\n CONTAINER,\n \"--restart\",\n \"unless-stopped\",\n \"-p\",\n \"80:80\",\n \"-p\",\n \"443:443\",\n \"-p\",\n \"8080:8080\",\n \"-v\",\n \"/var/run/docker.sock:/var/run/docker.sock:ro\",\n \"-v\",\n `${CONFIG_DIR}/traefik.yml:/etc/traefik/traefik.yml:ro`,\n \"-v\",\n `${CONFIG_DIR}/dynamic:/etc/traefik/dynamic:ro`,\n \"-v\",\n `${acmePath}:/etc/traefik/acme.json`,\n \"--network\",\n \"eve-network\",\n \"traefik:v3.0\"\n ], { stdio: \"inherit\" });\n if (result.status !== 0) {\n console.error(\"\\nFailed to start Traefik. Containers currently using port 80/443:\");\n spawnSync2(\"docker\", [\"ps\", \"--format\", \"{{.Names}}\t{{.Ports}}\"], { stdio: \"inherit\" });\n process.exit(1);\n }\n reconnectSynapToEveNetwork();\n console.log(\"\\u2713 Traefik running \\u2014 routes are live\");\n });\n}\n\n// src/commands/status.ts\nimport { execSync as execSync5, spawnSync as spawnSync3 } from \"child_process\";\nimport { existsSync as existsSync5, readFileSync as readFileSync3 } from \"fs\";\nvar CONTAINER2 = \"eve-legs-traefik\";\nvar CONFIG_DIR2 = \"/opt/traefik\";\nvar API = \"http://localhost:8080/api\";\nfunction tryFetch(url) {\n try {\n const out = execSync5(`curl -sf \"${url}\"`, { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] });\n return JSON.parse(out);\n } catch {\n return null;\n }\n}\nfunction statusCommand(program) {\n program.command(\"status\").description(\"Show Traefik health, routes, and config\").option(\"--logs\", \"Show last 30 lines of Traefik logs\").action((opts) => {\n console.log(\"\\n\\u{1F9BF} Eve Legs \\u2014 Traefik Status\\n\");\n let running = false;\n try {\n const out = execSync5(\n `docker ps --filter \"name=${CONTAINER2}\" --format \"{{.Names}}\\\\t{{.Status}}\"`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] }\n ).trim();\n running = out.includes(CONTAINER2);\n if (running) {\n console.log(` Container: \\u2713 running (${out.split(\"\t\")[1] ?? \"\"})`);\n } else {\n console.log(` Container: \\u2717 NOT running`);\n }\n } catch {\n console.log(` Container: \\u2717 docker error`);\n }\n const staticExists = existsSync5(`${CONFIG_DIR2}/traefik.yml`);\n const dynamicExists = existsSync5(`${CONFIG_DIR2}/dynamic/eve-routes.yml`);\n console.log(` Static cfg: ${staticExists ? \"\\u2713\" : \"\\u2717 MISSING\"} ${CONFIG_DIR2}/traefik.yml`);\n console.log(` Routes cfg: ${dynamicExists ? \"\\u2713\" : \"\\u2717 MISSING\"} ${CONFIG_DIR2}/dynamic/eve-routes.yml`);\n if (staticExists) {\n console.log(\"\\n \\u2500\\u2500 traefik.yml \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n console.log(readFileSync3(`${CONFIG_DIR2}/traefik.yml`, \"utf-8\").split(\"\\n\").map((l) => \" \" + l).join(\"\\n\"));\n }\n if (dynamicExists) {\n console.log(\"\\n \\u2500\\u2500 eve-routes.yml \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n console.log(readFileSync3(`${CONFIG_DIR2}/dynamic/eve-routes.yml`, \"utf-8\").split(\"\\n\").map((l) => \" \" + l).join(\"\\n\"));\n }\n if (running) {\n console.log(\"\\n \\u2500\\u2500 Active routers (Traefik API) \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n const routers = tryFetch(`${API}/http/routers`);\n if (!routers) {\n console.log(\" Could not reach Traefik API at port 8080 \\u2014 is insecure API enabled?\");\n } else if (routers.length === 0) {\n console.log(\" No routers registered yet\");\n } else {\n for (const r of routers) {\n const status = r.status === \"enabled\" ? \"\\u2713\" : \"\\u2717\";\n console.log(` ${status} ${r.name}`);\n console.log(` Rule: ${r.rule}`);\n console.log(` Entry: ${(r.entryPoints ?? []).join(\", \")}`);\n console.log(` Status: ${r.status}`);\n }\n }\n const certs = tryFetch(`${API}/tls/certificates`);\n if (certs && certs.length > 0) {\n console.log(\"\\n \\u2500\\u2500 TLS Certificates \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n for (const c of certs) {\n console.log(` \\u2713 ${c.subject?.commonName} (expires ${c.notAfter})`);\n }\n } else if (certs !== null) {\n console.log(\"\\n \\u2500\\u2500 TLS Certificates \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n console.log(\" No certificates yet \\u2014 DNS must propagate before Let's Encrypt can provision\");\n }\n }\n if (opts.logs || !running) {\n console.log(\"\\n \\u2500\\u2500 Traefik logs (last 30 lines) \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\");\n spawnSync3(\"docker\", [\"logs\", \"--tail\", \"30\", CONTAINER2], { stdio: \"inherit\" });\n }\n console.log();\n });\n}\n\n// src/commands/proxy-mode.ts\nimport { readEveSecrets as readEveSecrets2, writeEveSecrets as writeEveSecrets2, entityStateManager as entityStateManager2 } from \"@eve/dna\";\nfunction proxyModeCommand(program) {\n const cmd = program.command(\"proxy-mode\").description(\"Run Traefik behind an external SSL-terminating proxy (Caddy, Nginx, etc.)\");\n cmd.command(\"enable\").description(\"Switch to behind-proxy mode: HTTP only on port 80, no SSL/redirects\").action(async () => {\n try {\n const secrets = await readEveSecrets2(process.cwd());\n const domain = secrets?.domain?.primary;\n if (!domain) {\n console.error(\"No domain configured. Run `eve legs domain set <domain>` first.\");\n process.exit(1);\n }\n const status = new TraefikService().getProxyModeStatus();\n if (status.enabled) {\n console.log(\"Already in behind-proxy mode.\");\n printProxyInstructions(domain);\n return;\n }\n let installedComponents = [];\n try {\n installedComponents = await entityStateManager2.getInstalledComponents();\n } catch {\n }\n console.log(`Enabling behind-proxy mode for domain: ${domain}`);\n const traefik = new TraefikService();\n await traefik.enableProxyMode(domain, installedComponents);\n await writeEveSecrets2({ domain: { ...secrets?.domain, behindProxy: true } }, process.cwd());\n console.log(\"\\nBehind-proxy mode enabled.\");\n console.log(\"Traefik now listens on port 80 only (no port 443, no SSL).\\n\");\n printProxyInstructions(domain);\n } catch (err) {\n console.error(\"Failed to enable proxy mode:\", err instanceof Error ? err.message : err);\n process.exit(1);\n }\n });\n cmd.command(\"disable\").description(\"Restore standalone mode (Traefik handles SSL directly)\").option(\"--ssl\", \"Re-enable SSL with Let's Encrypt\").option(\"--email <email>\", \"ACME email address for SSL certificate\").action(async (options) => {\n try {\n const secrets = await readEveSecrets2(process.cwd());\n const domain = secrets?.domain?.primary;\n if (!domain) {\n console.error(\"No domain configured. Run `eve legs domain set <domain>` first.\");\n process.exit(1);\n }\n const status = new TraefikService().getProxyModeStatus();\n if (!status.enabled) {\n console.log(\"Already in standalone mode (not behind a proxy).\");\n return;\n }\n const ssl = options.ssl ?? false;\n const email = options.email ?? secrets?.domain?.email;\n if (ssl && !email) {\n console.error(\"--email <email> is required when using --ssl.\");\n process.exit(1);\n }\n let installedComponents = [];\n try {\n installedComponents = await entityStateManager2.getInstalledComponents();\n } catch {\n }\n console.log(`Restoring standalone mode for domain: ${domain}`);\n const traefik = new TraefikService();\n await traefik.disableProxyMode(domain, ssl, email, installedComponents);\n await writeEveSecrets2(\n { domain: { ...secrets?.domain, ssl, email, behindProxy: false } },\n process.cwd()\n );\n console.log(\"\\nStandalone mode restored.\");\n console.log(`Traefik now listens on ports 80 and 443.`);\n if (ssl) console.log(`SSL certificates will be obtained via Let's Encrypt for ${domain}.`);\n } catch (err) {\n console.error(\"Failed to disable proxy mode:\", err instanceof Error ? err.message : err);\n process.exit(1);\n }\n });\n cmd.command(\"status\").description(\"Show current proxy mode configuration\").action(async () => {\n try {\n const traefik = new TraefikService();\n const status = traefik.getProxyModeStatus();\n const secrets = await readEveSecrets2(process.cwd());\n const domain = secrets?.domain?.primary ?? \"(not set)\";\n console.log(`\nTraefik mode: ${status.enabled ? \"behind-proxy (HTTP only)\" : \"standalone (handles SSL)\"}`);\n console.log(`Domain: ${domain}`);\n console.log(`SSL: ${status.ssl ? \"enabled (Let's Encrypt)\" : \"disabled\"}`);\n console.log(`Entrypoints: ${status.entrypoints.join(\", \")}`);\n console.log(`Port 443: ${status.enabled ? \"not bound (proxy handles it)\" : \"bound\"}`);\n if (status.enabled) {\n console.log(\"\\nYour external proxy must:\");\n console.log(` - Terminate SSL for ${domain} and its subdomains`);\n console.log(\" - Forward requests to http://<this-server>:80\");\n console.log(\" - Set X-Forwarded-Proto: https and X-Forwarded-Host headers\");\n }\n console.log();\n } catch (err) {\n console.error(\"Failed to get proxy mode status:\", err instanceof Error ? err.message : err);\n process.exit(1);\n }\n });\n}\nfunction printProxyInstructions(domain) {\n console.log(\"Configure your external proxy to:\");\n console.log(` 1. Terminate SSL for ${domain} and its subdomains (pod.${domain}, etc.)`);\n console.log(\" 2. Forward requests to http://<this-server-ip>:80\");\n console.log(\" 3. Pass these headers:\");\n console.log(\" X-Forwarded-For: <client-ip>\");\n console.log(\" X-Forwarded-Proto: https\");\n console.log(` X-Forwarded-Host: <subdomain>.${domain}`);\n console.log();\n console.log(\"Example Caddy config:\");\n console.log(` ${domain}, *.${domain} {`);\n console.log(` reverse_proxy <this-server-ip>:80 {`);\n console.log(` header_up X-Forwarded-Host {host}`);\n console.log(` header_up X-Forwarded-Proto https`);\n console.log(` }`);\n console.log(` }`);\n console.log();\n}\n\n// src/lib/inference-gateway.ts\nimport { execSync as execSync6, spawnSync as spawnSync4 } from \"child_process\";\nimport { mkdirSync as mkdirSync4, writeFileSync as writeFileSync4 } from \"fs\";\nimport { join as join4 } from \"path\";\nimport { randomBytes } from \"crypto\";\nimport { readEveSecrets as readEveSecrets3, writeEveSecrets as writeEveSecrets3 } from \"@eve/dna\";\nvar GATEWAY_CONTAINER = \"eve-inference-gateway\";\nvar DEFAULT_HOST_PORT = \"11435\";\nvar InferenceGateway = class {\n baseDir;\n hostPort;\n cwd;\n constructor(cwd = process.cwd(), hostPort = DEFAULT_HOST_PORT) {\n this.cwd = cwd;\n this.baseDir = join4(cwd, \".eve\", \"inference-gateway\");\n this.hostPort = process.env.EVE_INFERENCE_GATEWAY_PORT?.trim() || hostPort;\n }\n /**\n * APR1 hash line for Traefik usersFile (user:hash).\n *\n * Pipe the password via stdin instead of passing it as an arg — base64url\n * passwords starting with `-` were being interpreted by openssl as a flag\n * (\"Unknown option: -LglNqOAY...\"). The `-stdin` form is unambiguous.\n */\n htpasswdLine(username, plainPassword) {\n const r = spawnSync4(\"openssl\", [\"passwd\", \"-apr1\", \"-stdin\"], {\n input: plainPassword + \"\\n\",\n encoding: \"utf-8\"\n });\n if (r.error || r.status !== 0) {\n throw new Error(`openssl passwd -apr1 failed: ${r.stderr || r.error?.message || \"unknown\"}`);\n }\n const hash = (r.stdout ?? \"\").trim();\n return `${username}:${hash}`;\n }\n async ensure(ollamaHost = \"http://eve-brain-ollama:11434\") {\n mkdirSync4(join4(this.baseDir, \"dynamic\"), { recursive: true });\n const username = \"eve\";\n const password = randomBytes(18).toString(\"base64url\").slice(0, 24);\n const userLine = this.htpasswdLine(username, password);\n const staticYaml = `\nentryPoints:\n web:\n address: \":80\"\n\nproviders:\n file:\n directory: /etc/traefik/dynamic\n watch: true\n\nlog:\n level: INFO\n`.trim();\n writeFileSync4(join4(this.baseDir, \"dynamic\", \"ollama-users\"), `${userLine}\n`, { mode: 384 });\n const dynamicYaml = [\n \"http:\",\n \" routers:\",\n \" ollama_api:\",\n \" rule: PathPrefix(`/`)\",\n \" entryPoints:\",\n \" - web\",\n \" service: ollama_svc\",\n \" middlewares:\",\n \" - ollama_auth\",\n \" middlewares:\",\n \" ollama_auth:\",\n \" basicAuth:\",\n \" usersFile: /etc/traefik/dynamic/ollama-users\",\n \" services:\",\n \" ollama_svc:\",\n \" loadBalancer:\",\n \" servers:\",\n ` - url: \"${ollamaHost}\"`\n ].join(\"\\n\");\n writeFileSync4(join4(this.baseDir, \"traefik.yml\"), staticYaml);\n writeFileSync4(join4(this.baseDir, \"dynamic\", \"ollama.yml\"), dynamicYaml);\n const secretsFile = join4(this.baseDir, \"..\", \"secrets\", \"ollama-gateway.txt\");\n mkdirSync4(join4(this.baseDir, \"..\", \"secrets\"), { recursive: true });\n const secretBody = `# Eve inference gateway (Basic auth for Ollama)\nURL=http://127.0.0.1:${this.hostPort}\nUSER=${username}\nPASS=${password}\n\nExample:\n curl -u '${username}:${password}' http://127.0.0.1:${this.hostPort}/api/tags\n`;\n writeFileSync4(secretsFile, secretBody, { mode: 384 });\n const prevSecrets = await readEveSecrets3(this.cwd);\n await writeEveSecrets3(\n {\n inference: {\n ...prevSecrets?.inference ?? {},\n gatewayUrl: `http://127.0.0.1:${this.hostPort}`,\n gatewayUser: username,\n gatewayPass: password,\n ollamaUrl: prevSecrets?.inference?.ollamaUrl ?? ollamaHost\n }\n },\n this.cwd\n );\n try {\n execSync6(\"docker network create eve-network\", { stdio: \"ignore\" });\n } catch {\n }\n const running = this.isGatewayRunning();\n if (!running) {\n if (this.gatewayContainerExists()) {\n execSync6(`docker start ${GATEWAY_CONTAINER}`, { stdio: \"inherit\" });\n } else {\n execSync6(\n [\n \"docker\",\n \"run\",\n \"-d\",\n \"--name\",\n GATEWAY_CONTAINER,\n \"--restart\",\n \"unless-stopped\",\n \"--network\",\n \"eve-network\",\n \"-p\",\n `${this.hostPort}:80`,\n \"-v\",\n `${this.baseDir}/traefik.yml:/etc/traefik/traefik.yml:ro`,\n \"-v\",\n `${this.baseDir}/dynamic:/etc/traefik/dynamic:ro`,\n \"traefik:v3.0\",\n \"--configFile=/etc/traefik/traefik.yml\"\n ].join(\" \"),\n { stdio: \"inherit\" }\n );\n }\n }\n return {\n baseDir: this.baseDir,\n hostPort: this.hostPort,\n publicUrl: `http://127.0.0.1:${this.hostPort}`,\n username,\n password,\n secretsFile\n };\n }\n gatewayContainerExists() {\n try {\n execSync6(`docker container inspect ${GATEWAY_CONTAINER}`, { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n }\n isGatewayRunning() {\n try {\n const out = execSync6(`docker inspect -f '{{.State.Running}}' ${GATEWAY_CONTAINER}`, {\n encoding: \"utf-8\"\n }).trim();\n return out === \"true\";\n } catch {\n return false;\n }\n }\n};\n\n// src/lib/refresh-routes.ts\nimport { readEveSecrets as readEveSecrets4, entityStateManager as entityStateManager3 } from \"@eve/dna\";\nasync function refreshTraefikRoutes(cwd) {\n const secrets = await readEveSecrets4(cwd ?? process.cwd());\n const domain = secrets?.domain?.primary;\n if (!domain) {\n return { refreshed: false, domain: null, reason: \"no domain configured\" };\n }\n let installedComponents = [];\n try {\n installedComponents = await entityStateManager3.getInstalledComponents();\n } catch {\n }\n try {\n const traefik = new TraefikService();\n await traefik.configureSubdomains(\n domain,\n secrets?.domain?.ssl !== false,\n secrets?.domain?.email,\n installedComponents,\n !!secrets?.domain?.behindProxy,\n secrets?.domain?.customRoutes\n );\n return { refreshed: true, domain };\n } catch (err) {\n return {\n refreshed: false,\n domain,\n reason: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\n// src/lib/verify-component.ts\nimport { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { resolveComponent } from \"@eve/dna\";\nvar execFileAsync = promisify(execFile);\nfunction sleep(ms) {\n return new Promise((r) => setTimeout(r, ms));\n}\nvar DOCKER_CALL_TIMEOUT_MS = 4e3;\nasync function isContainerRunning(name) {\n try {\n const { stdout } = await execFileAsync(\n \"docker\",\n [\"ps\", \"--filter\", `name=^${name}$`, \"--format\", \"{{.Names}}\"],\n { timeout: DOCKER_CALL_TIMEOUT_MS }\n );\n if (stdout.trim() === name) return true;\n } catch {\n }\n try {\n const { stdout: ids } = await execFileAsync(\n \"docker\",\n [\"ps\", \"--filter\", `network=eve-network`, \"--format\", \"{{.ID}}\"],\n { timeout: DOCKER_CALL_TIMEOUT_MS }\n );\n const containerIds = ids.trim().split(\"\\n\").filter(Boolean);\n for (const id of containerIds) {\n try {\n const { stdout: aliasJson } = await execFileAsync(\n \"docker\",\n [\"inspect\", \"--format\", \"{{json .NetworkSettings.Networks}}\", id],\n { timeout: DOCKER_CALL_TIMEOUT_MS }\n );\n const networks = JSON.parse(aliasJson.trim());\n const aliases = networks[\"eve-network\"]?.Aliases ?? [];\n if (aliases.includes(name)) return true;\n } catch {\n continue;\n }\n }\n } catch {\n }\n return false;\n}\nasync function canReachFromTraefik(host, port, path) {\n try {\n const { stdout } = await execFileAsync(\n \"docker\",\n [\n \"exec\",\n \"eve-legs-traefik\",\n \"sh\",\n \"-c\",\n `wget -q -O /dev/null --timeout=3 --server-response http://${host}:${port}${path} 2>&1 | grep \"HTTP/\" | tail -1 || echo \"no-response\"`\n ],\n { timeout: DOCKER_CALL_TIMEOUT_MS }\n );\n const out = stdout.trim();\n if (out.includes(\"no-response\")) return false;\n const match = out.match(/HTTP\\/\\S+\\s+(\\d{3})/);\n if (!match) return false;\n return parseInt(match[1], 10) < 500;\n } catch {\n return false;\n }\n}\nasync function verifyComponent(componentId, opts = {}) {\n const checks = [];\n let comp;\n try {\n comp = resolveComponent(componentId);\n } catch {\n return {\n ok: false,\n checks: [{ name: \"registry\", ok: false, detail: `unknown component: ${componentId}` }],\n summary: `unknown component: ${componentId}`\n };\n }\n if (!comp.service) {\n return {\n ok: true,\n checks: [{ name: \"service\", ok: true, detail: \"no network service to verify\" }],\n summary: `${comp.label} install complete (no network service)`\n };\n }\n const containerName = comp.service.containerName;\n const containerAttempts = opts.quick ? 1 : 5;\n const reachableAttempts = opts.quick ? 1 : 4;\n let running = false;\n for (let i = 0; i < containerAttempts; i++) {\n if (await isContainerRunning(containerName)) {\n running = true;\n break;\n }\n if (i < containerAttempts - 1) await sleep(1500);\n }\n checks.push({\n name: \"container\",\n ok: running,\n detail: running ? `${containerName} is running` : opts.quick ? `${containerName} not in docker ps` : `${containerName} not in docker ps after 7.5s`\n });\n if (!running) {\n return { ok: false, checks, summary: `${comp.label}: container not running` };\n }\n if (comp.service.healthPath) {\n let reachable = false;\n for (let i = 0; i < reachableAttempts; i++) {\n if (await canReachFromTraefik(containerName, comp.service.internalPort, comp.service.healthPath)) {\n reachable = true;\n break;\n }\n if (i < reachableAttempts - 1) await sleep(2e3);\n }\n checks.push({\n name: \"reachable\",\n ok: reachable,\n detail: reachable ? `responded on :${comp.service.internalPort}${comp.service.healthPath}` : opts.quick ? `not responding on :${comp.service.internalPort}${comp.service.healthPath}` : `not responding on :${comp.service.internalPort}${comp.service.healthPath} after 10s`\n });\n if (!reachable) {\n return { ok: false, checks, summary: `${comp.label}: container running but not responding on its port` };\n }\n }\n return { ok: true, checks, summary: `${comp.label}: container running and reachable` };\n}\n\n// src/lib/dashboard-container.ts\nimport { execSync as execSync7, spawnSync as spawnSync5 } from \"child_process\";\nimport { existsSync as existsSync6 } from \"fs\";\nimport { homedir } from \"os\";\nimport { resolve } from \"path\";\nvar CONTAINER_NAME = \"eve-dashboard\";\nvar IMAGE_TAG = \"eve-dashboard:local\";\nvar INTERNAL_PORT = 3e3;\nvar HOST_PORT = 7979;\nfunction ensureNetwork(name) {\n try {\n execSync7(`docker network inspect ${name}`, { stdio: \"ignore\" });\n } catch {\n execSync7(`docker network create ${name}`, { stdio: \"inherit\" });\n }\n}\nfunction ensureEveNetwork() {\n ensureNetwork(\"eve-network\");\n}\nfunction imageExists() {\n try {\n const out = execSync7(`docker image inspect ${IMAGE_TAG}`, { stdio: [\"pipe\", \"pipe\", \"ignore\"] });\n return out.length > 0;\n } catch {\n return false;\n }\n}\nfunction buildImage(workspaceRoot) {\n const dockerfile = resolve(workspaceRoot, \"packages/eve-dashboard/Dockerfile\");\n if (!existsSync6(dockerfile)) {\n throw new Error(`Dockerfile not found at ${dockerfile}. Are you in the eve workspace root?`);\n }\n console.log(` Building ${IMAGE_TAG} (this takes a minute on first run)...`);\n const r = spawnSync5(\n \"docker\",\n [\"build\", \"-f\", dockerfile, \"-t\", IMAGE_TAG, workspaceRoot],\n { stdio: \"inherit\" }\n );\n if (r.status !== 0) throw new Error(`docker build exited with code ${r.status}`);\n}\nfunction removeContainer() {\n try {\n execSync7(`docker rm -f ${CONTAINER_NAME}`, { stdio: \"ignore\" });\n } catch {\n }\n}\nfunction runContainer(workspaceRoot, secret) {\n const stateDir = `${homedir()}/.local/share/eve`;\n const args = [\n \"run\",\n \"-d\",\n \"--name\",\n CONTAINER_NAME,\n \"--restart\",\n \"unless-stopped\",\n \"--network\",\n \"eve-network\",\n \"-p\",\n `${HOST_PORT}:${INTERNAL_PORT}`,\n \"-e\",\n `PORT=${INTERNAL_PORT}`,\n \"-e\",\n `EVE_HOME=${workspaceRoot}`,\n \"-e\",\n `EVE_DASHBOARD_SECRET=${secret}`,\n // Mounts that mirror what the host CLI would touch.\n \"-v\",\n \"/opt:/opt\",\n \"-v\",\n `${stateDir}:${stateDir}`,\n \"-v\",\n \"/var/run/docker.sock:/var/run/docker.sock\",\n IMAGE_TAG\n ];\n const r = spawnSync5(\"docker\", args, { stdio: \"inherit\" });\n if (r.status !== 0) throw new Error(`docker run exited with code ${r.status}`);\n}\nfunction installDashboardContainer(opts) {\n const workspaceRoot = resolve(opts.workspaceRoot ?? process.cwd());\n ensureEveNetwork();\n if (opts.rebuild || !imageExists()) {\n buildImage(workspaceRoot);\n }\n removeContainer();\n runContainer(workspaceRoot, opts.secret);\n}\nfunction uninstallDashboardContainer() {\n removeContainer();\n}\nfunction dashboardContainerName() {\n return CONTAINER_NAME;\n}\nfunction dashboardImageTag() {\n return IMAGE_TAG;\n}\nfunction dashboardIsRunning() {\n try {\n const out = execSync7(\n `docker ps --filter \"name=^${CONTAINER_NAME}$\" --format \"{{.Names}}\"`,\n { encoding: \"utf-8\" }\n ).trim();\n return out === CONTAINER_NAME;\n } catch {\n return false;\n }\n}\n\n// src/index.ts\nfunction registerLegsCommands(legs) {\n setupCommand(legs);\n domainCommand(legs);\n newtCommand(legs);\n restartCommand(legs);\n statusCommand(legs);\n proxyModeCommand(legs);\n}\nfunction registerCommands(program) {\n const legs = program.command(\"legs\").description(\"Traefik, domains, and tunnels\");\n registerLegsCommands(legs);\n}\nvar index_default = {\n registerLegsCommands,\n registerCommands\n};\nexport {\n InferenceGateway,\n TraefikService,\n TunnelService,\n dashboardContainerName,\n dashboardImageTag,\n dashboardIsRunning,\n index_default as default,\n domainCommand,\n installDashboardContainer,\n newtCommand,\n proxyModeCommand,\n refreshTraefikRoutes,\n registerCommands,\n registerLegsCommands,\n restartCommand,\n runLegsProxySetup,\n setupCommand,\n statusCommand,\n uninstallDashboardContainer,\n verifyComponent\n};\n"],"mappings":"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","names":[]}
|