@better-openclaw/core 1.0.16 → 1.0.18
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 +27 -0
- package/dist/bare-metal-partition.cjs +53 -0
- package/dist/bare-metal-partition.cjs.map +1 -0
- package/dist/bare-metal-partition.d.cts +26 -0
- package/dist/bare-metal-partition.d.cts.map +1 -0
- package/dist/bare-metal-partition.test.cjs +57 -0
- package/dist/bare-metal-partition.test.cjs.map +1 -0
- package/dist/bare-metal-partition.test.d.cts +1 -0
- package/dist/bare-metal-partition.test.mjs +1 -1
- package/dist/chunk-C0xms8kb.cjs +34 -0
- package/dist/compose-validation.test.cjs +67 -0
- package/dist/compose-validation.test.cjs.map +1 -0
- package/dist/compose-validation.test.d.cts +1 -0
- package/dist/compose-validation.test.d.mts +1 -0
- package/dist/compose-validation.test.mjs +66 -0
- package/dist/compose-validation.test.mjs.map +1 -0
- package/dist/composer.cjs +462 -0
- package/dist/composer.cjs.map +1 -0
- package/dist/composer.d.cts +21 -0
- package/dist/composer.d.cts.map +1 -0
- package/dist/composer.d.mts.map +1 -1
- package/dist/composer.mjs +187 -27
- package/dist/composer.mjs.map +1 -1
- package/dist/composer.snapshot.test.cjs +91 -0
- package/dist/composer.snapshot.test.cjs.map +1 -0
- package/dist/composer.snapshot.test.d.cts +1 -0
- package/dist/composer.snapshot.test.mjs +1 -1
- package/dist/composer.test.cjs +166 -0
- package/dist/composer.test.cjs.map +1 -0
- package/dist/composer.test.d.cts +1 -0
- package/dist/composer.test.mjs +2 -2
- package/dist/composer.test.mjs.map +1 -1
- package/dist/deployers/coolify.cjs +174 -0
- package/dist/deployers/coolify.cjs.map +1 -0
- package/dist/deployers/coolify.d.cts +25 -0
- package/dist/deployers/coolify.d.cts.map +1 -0
- package/dist/deployers/coolify.d.mts +25 -0
- package/dist/deployers/coolify.d.mts.map +1 -0
- package/dist/deployers/coolify.mjs +172 -0
- package/dist/deployers/coolify.mjs.map +1 -0
- package/dist/deployers/dokploy.cjs +141 -0
- package/dist/deployers/dokploy.cjs.map +1 -0
- package/dist/deployers/dokploy.d.cts +24 -0
- package/dist/deployers/dokploy.d.cts.map +1 -0
- package/dist/deployers/dokploy.d.mts +24 -0
- package/dist/deployers/dokploy.d.mts.map +1 -0
- package/dist/deployers/dokploy.mjs +139 -0
- package/dist/deployers/dokploy.mjs.map +1 -0
- package/dist/deployers/index.cjs +26 -0
- package/dist/deployers/index.cjs.map +1 -0
- package/dist/deployers/index.d.cts +14 -0
- package/dist/deployers/index.d.cts.map +1 -0
- package/dist/deployers/index.d.mts +14 -0
- package/dist/deployers/index.d.mts.map +1 -0
- package/dist/deployers/index.mjs +21 -0
- package/dist/deployers/index.mjs.map +1 -0
- package/dist/deployers/types.cjs +0 -0
- package/dist/deployers/types.d.cts +72 -0
- package/dist/deployers/types.d.cts.map +1 -0
- package/dist/deployers/types.d.mts +72 -0
- package/dist/deployers/types.d.mts.map +1 -0
- package/dist/deployers/types.mjs +1 -0
- package/dist/errors.cjs +27 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +17 -0
- package/dist/errors.d.cts.map +1 -0
- package/dist/generate.cjs +225 -0
- package/dist/generate.cjs.map +1 -0
- package/dist/generate.d.cts +12 -0
- package/dist/generate.d.cts.map +1 -0
- package/dist/generate.d.mts.map +1 -1
- package/dist/generate.mjs +34 -5
- package/dist/generate.mjs.map +1 -1
- package/dist/generate.test.cjs +283 -0
- package/dist/generate.test.cjs.map +1 -0
- package/dist/generate.test.d.cts +1 -0
- package/dist/generate.test.mjs +1 -1
- package/dist/generators/bare-metal-install.cjs +226 -0
- package/dist/generators/bare-metal-install.cjs.map +1 -0
- package/dist/generators/bare-metal-install.d.cts +17 -0
- package/dist/generators/bare-metal-install.d.cts.map +1 -0
- package/dist/generators/bare-metal-install.test.cjs +47 -0
- package/dist/generators/bare-metal-install.test.cjs.map +1 -0
- package/dist/generators/bare-metal-install.test.d.cts +1 -0
- package/dist/generators/bare-metal-install.test.mjs +1 -1
- package/dist/generators/caddy.cjs +79 -0
- package/dist/generators/caddy.cjs.map +1 -0
- package/dist/generators/caddy.d.cts +17 -0
- package/dist/generators/caddy.d.cts.map +1 -0
- package/dist/generators/caddy.test.cjs +44 -0
- package/dist/generators/caddy.test.cjs.map +1 -0
- package/dist/generators/caddy.test.d.cts +1 -0
- package/dist/generators/caddy.test.mjs +1 -1
- package/dist/generators/cloud-init.cjs +132 -0
- package/dist/generators/cloud-init.cjs.map +1 -0
- package/dist/generators/cloud-init.d.cts +25 -0
- package/dist/generators/cloud-init.d.cts.map +1 -0
- package/dist/generators/cloud-init.d.mts +25 -0
- package/dist/generators/cloud-init.d.mts.map +1 -0
- package/dist/generators/cloud-init.mjs +130 -0
- package/dist/generators/cloud-init.mjs.map +1 -0
- package/dist/generators/env.cjs +325 -0
- package/dist/generators/env.cjs.map +1 -0
- package/dist/generators/env.d.cts +52 -0
- package/dist/generators/env.d.cts.map +1 -0
- package/dist/generators/env.d.mts +6 -0
- package/dist/generators/env.d.mts.map +1 -1
- package/dist/generators/env.mjs +58 -6
- package/dist/generators/env.mjs.map +1 -1
- package/dist/generators/env.test.cjs +59 -0
- package/dist/generators/env.test.cjs.map +1 -0
- package/dist/generators/env.test.d.cts +1 -0
- package/dist/generators/env.test.mjs +1 -1
- package/dist/generators/get-shit-done.cjs +40 -0
- package/dist/generators/get-shit-done.cjs.map +1 -0
- package/dist/generators/get-shit-done.d.cts +10 -0
- package/dist/generators/get-shit-done.d.cts.map +1 -0
- package/dist/generators/grafana.cjs +296 -0
- package/dist/generators/grafana.cjs.map +1 -0
- package/dist/generators/grafana.d.cts +22 -0
- package/dist/generators/grafana.d.cts.map +1 -0
- package/dist/generators/health-check.cjs +707 -0
- package/dist/generators/health-check.cjs.map +1 -0
- package/dist/generators/health-check.d.cts +18 -0
- package/dist/generators/health-check.d.cts.map +1 -0
- package/dist/generators/health-check.d.mts +2 -2
- package/dist/generators/health-check.d.mts.map +1 -1
- package/dist/generators/health-check.mjs.map +1 -1
- package/dist/generators/health-check.test.cjs +84 -0
- package/dist/generators/health-check.test.cjs.map +1 -0
- package/dist/generators/health-check.test.d.cts +1 -0
- package/dist/generators/health-check.test.mjs +1 -1
- package/dist/generators/n8n-workflows.cjs +77 -0
- package/dist/generators/n8n-workflows.cjs.map +1 -0
- package/dist/generators/n8n-workflows.d.cts +11 -0
- package/dist/generators/n8n-workflows.d.cts.map +1 -0
- package/dist/generators/native-services.cjs +80 -0
- package/dist/generators/native-services.cjs.map +1 -0
- package/dist/generators/native-services.d.cts +17 -0
- package/dist/generators/native-services.d.cts.map +1 -0
- package/dist/generators/openclaw-install-script.cjs +68 -0
- package/dist/generators/openclaw-install-script.cjs.map +1 -0
- package/dist/generators/openclaw-install-script.d.cts +12 -0
- package/dist/generators/openclaw-install-script.d.cts.map +1 -0
- package/dist/generators/openclaw-install-script.d.mts +12 -0
- package/dist/generators/openclaw-install-script.d.mts.map +1 -0
- package/dist/generators/openclaw-install-script.mjs +66 -0
- package/dist/generators/openclaw-install-script.mjs.map +1 -0
- package/dist/generators/openclaw-json.cjs +540 -0
- package/dist/generators/openclaw-json.cjs.map +1 -0
- package/dist/generators/openclaw-json.d.cts +16 -0
- package/dist/generators/openclaw-json.d.cts.map +1 -0
- package/dist/generators/openclaw-json.d.mts +8 -3
- package/dist/generators/openclaw-json.d.mts.map +1 -1
- package/dist/generators/openclaw-json.mjs +214 -86
- package/dist/generators/openclaw-json.mjs.map +1 -1
- package/dist/generators/postgres-init.cjs +189 -0
- package/dist/generators/postgres-init.cjs.map +1 -0
- package/dist/generators/postgres-init.d.cts +30 -0
- package/dist/generators/postgres-init.d.cts.map +1 -0
- package/dist/generators/postgres-init.d.mts.map +1 -1
- package/dist/generators/postgres-init.mjs +35 -0
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/prometheus.cjs +109 -0
- package/dist/generators/prometheus.cjs.map +1 -0
- package/dist/generators/prometheus.d.cts +14 -0
- package/dist/generators/prometheus.d.cts.map +1 -0
- package/dist/generators/readme.cjs +286 -0
- package/dist/generators/readme.cjs.map +1 -0
- package/dist/generators/readme.d.cts +27 -0
- package/dist/generators/readme.d.cts.map +1 -0
- package/dist/generators/readme.d.mts +3 -1
- package/dist/generators/readme.d.mts.map +1 -1
- package/dist/generators/readme.mjs +88 -3
- package/dist/generators/readme.mjs.map +1 -1
- package/dist/generators/scripts.cjs +353 -0
- package/dist/generators/scripts.cjs.map +1 -0
- package/dist/generators/scripts.d.cts +10 -0
- package/dist/generators/scripts.d.cts.map +1 -0
- package/dist/generators/scripts.test.cjs +51 -0
- package/dist/generators/scripts.test.cjs.map +1 -0
- package/dist/generators/scripts.test.d.cts +1 -0
- package/dist/generators/scripts.test.mjs +1 -1
- package/dist/generators/skills.cjs +590 -0
- package/dist/generators/skills.cjs.map +1 -0
- package/dist/generators/skills.d.cts +14 -0
- package/dist/generators/skills.d.cts.map +1 -0
- package/dist/generators/stack-manifest.cjs +70 -0
- package/dist/generators/stack-manifest.cjs.map +1 -0
- package/dist/generators/stack-manifest.d.cts +51 -0
- package/dist/generators/stack-manifest.d.cts.map +1 -0
- package/dist/generators/stack-manifest.d.mts +51 -0
- package/dist/generators/stack-manifest.d.mts.map +1 -0
- package/dist/generators/stack-manifest.mjs +68 -0
- package/dist/generators/stack-manifest.mjs.map +1 -0
- package/dist/generators/traefik.cjs +88 -0
- package/dist/generators/traefik.cjs.map +1 -0
- package/dist/generators/traefik.d.cts +19 -0
- package/dist/generators/traefik.d.cts.map +1 -0
- package/dist/generators/traefik.test.cjs +68 -0
- package/dist/generators/traefik.test.cjs.map +1 -0
- package/dist/generators/traefik.test.d.cts +1 -0
- package/dist/generators/traefik.test.mjs +1 -1
- package/dist/index.cjs +118 -0
- package/dist/index.d.cts +31 -0
- package/dist/index.d.mts +9 -3
- package/dist/index.mjs +8 -3
- package/dist/magic-string.es-D2agHT3I.cjs +1015 -0
- package/dist/magic-string.es-D2agHT3I.cjs.map +1 -0
- package/dist/manifest-4uLbISXV.cjs +1190 -0
- package/dist/manifest-4uLbISXV.cjs.map +1 -0
- package/dist/migrations.cjs +37 -0
- package/dist/migrations.cjs.map +1 -0
- package/dist/migrations.d.cts +14 -0
- package/dist/migrations.d.cts.map +1 -0
- package/dist/migrations.test.cjs +41 -0
- package/dist/migrations.test.cjs.map +1 -0
- package/dist/migrations.test.d.cts +1 -0
- package/dist/migrations.test.mjs +1 -1
- package/dist/port-scanner.cjs +125 -0
- package/dist/port-scanner.cjs.map +1 -0
- package/dist/port-scanner.d.cts +27 -0
- package/dist/port-scanner.d.cts.map +1 -0
- package/dist/port-scanner.d.mts +27 -0
- package/dist/port-scanner.d.mts.map +1 -0
- package/dist/port-scanner.mjs +122 -0
- package/dist/port-scanner.mjs.map +1 -0
- package/dist/presets/presets.test.cjs +65 -0
- package/dist/presets/presets.test.cjs.map +1 -0
- package/dist/presets/presets.test.d.cts +1 -0
- package/dist/presets/presets.test.d.mts +1 -0
- package/dist/presets/presets.test.mjs +64 -0
- package/dist/presets/presets.test.mjs.map +1 -0
- package/dist/presets/registry.cjs +193 -0
- package/dist/presets/registry.cjs.map +1 -0
- package/dist/presets/registry.d.cts +9 -0
- package/dist/presets/registry.d.cts.map +1 -0
- package/dist/presets/registry.d.mts.map +1 -1
- package/dist/presets/registry.mjs +38 -8
- package/dist/presets/registry.mjs.map +1 -1
- package/dist/presets/registry.test.cjs +36 -0
- package/dist/presets/registry.test.cjs.map +1 -0
- package/dist/presets/registry.test.d.cts +1 -0
- package/dist/presets/registry.test.mjs +5 -2
- package/dist/presets/registry.test.mjs.map +1 -1
- package/dist/resolver.cjs +217 -0
- package/dist/resolver.cjs.map +1 -0
- package/dist/resolver.d.cts +26 -0
- package/dist/resolver.d.cts.map +1 -0
- package/dist/resolver.mjs +2 -0
- package/dist/resolver.mjs.map +1 -1
- package/dist/resolver.test.cjs +236 -0
- package/dist/resolver.test.cjs.map +1 -0
- package/dist/resolver.test.d.cts +1 -0
- package/dist/resolver.test.mjs +1 -1
- package/dist/schema.cjs +354 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.cts +854 -0
- package/dist/schema.d.cts.map +1 -0
- package/dist/schema.d.mts +56 -1
- package/dist/schema.d.mts.map +1 -1
- package/dist/schema.mjs +31 -4
- package/dist/schema.mjs.map +1 -1
- package/dist/schema.test.cjs +263 -0
- package/dist/schema.test.cjs.map +1 -0
- package/dist/schema.test.d.cts +1 -0
- package/dist/schema.test.mjs +1 -1
- package/dist/services/definitions/anything-llm.cjs +46 -0
- package/dist/services/definitions/anything-llm.cjs.map +1 -0
- package/dist/services/definitions/anything-llm.d.cts +7 -0
- package/dist/services/definitions/anything-llm.d.cts.map +1 -0
- package/dist/services/definitions/anything-llm.mjs +2 -2
- package/dist/services/definitions/anything-llm.mjs.map +1 -1
- package/dist/services/definitions/appflowy.cjs +47 -0
- package/dist/services/definitions/appflowy.cjs.map +1 -0
- package/dist/services/definitions/appflowy.d.cts +7 -0
- package/dist/services/definitions/appflowy.d.cts.map +1 -0
- package/dist/services/definitions/appflowy.mjs +1 -1
- package/dist/services/definitions/appflowy.mjs.map +1 -1
- package/dist/services/definitions/authentik.cjs +107 -0
- package/dist/services/definitions/authentik.cjs.map +1 -0
- package/dist/services/definitions/authentik.d.cts +7 -0
- package/dist/services/definitions/authentik.d.cts.map +1 -0
- package/dist/services/definitions/authentik.mjs +5 -5
- package/dist/services/definitions/authentik.mjs.map +1 -1
- package/dist/services/definitions/beszel.cjs +47 -0
- package/dist/services/definitions/beszel.cjs.map +1 -0
- package/dist/services/definitions/beszel.d.cts +7 -0
- package/dist/services/definitions/beszel.d.cts.map +1 -0
- package/dist/services/definitions/beszel.mjs +1 -1
- package/dist/services/definitions/beszel.mjs.map +1 -1
- package/dist/services/definitions/browserless.cjs +87 -0
- package/dist/services/definitions/browserless.cjs.map +1 -0
- package/dist/services/definitions/browserless.d.cts +7 -0
- package/dist/services/definitions/browserless.d.cts.map +1 -0
- package/dist/services/definitions/browserless.mjs +1 -1
- package/dist/services/definitions/browserless.mjs.map +1 -1
- package/dist/services/definitions/caddy.cjs +73 -0
- package/dist/services/definitions/caddy.cjs.map +1 -0
- package/dist/services/definitions/caddy.d.cts +7 -0
- package/dist/services/definitions/caddy.d.cts.map +1 -0
- package/dist/services/definitions/caddy.mjs +2 -2
- package/dist/services/definitions/caddy.mjs.map +1 -1
- package/dist/services/definitions/cal-com.cjs +90 -0
- package/dist/services/definitions/cal-com.cjs.map +1 -0
- package/dist/services/definitions/cal-com.d.cts +7 -0
- package/dist/services/definitions/cal-com.d.cts.map +1 -0
- package/dist/services/definitions/cal-com.mjs +2 -2
- package/dist/services/definitions/cal-com.mjs.map +1 -1
- package/dist/services/definitions/chromadb.cjs +65 -0
- package/dist/services/definitions/chromadb.cjs.map +1 -0
- package/dist/services/definitions/chromadb.d.cts +7 -0
- package/dist/services/definitions/chromadb.d.cts.map +1 -0
- package/dist/services/definitions/chromadb.mjs +3 -3
- package/dist/services/definitions/chromadb.mjs.map +1 -1
- package/dist/services/definitions/claude-code.cjs +54 -0
- package/dist/services/definitions/claude-code.cjs.map +1 -0
- package/dist/services/definitions/claude-code.d.cts +7 -0
- package/dist/services/definitions/claude-code.d.cts.map +1 -0
- package/dist/services/definitions/claude-code.mjs +1 -1
- package/dist/services/definitions/claude-code.mjs.map +1 -1
- package/dist/services/definitions/code-server.cjs +68 -0
- package/dist/services/definitions/code-server.cjs.map +1 -0
- package/dist/services/definitions/code-server.d.cts +7 -0
- package/dist/services/definitions/code-server.d.cts.map +1 -0
- package/dist/services/definitions/code-server.mjs +1 -1
- package/dist/services/definitions/code-server.mjs.map +1 -1
- package/dist/services/definitions/codex.cjs +47 -0
- package/dist/services/definitions/codex.cjs.map +1 -0
- package/dist/services/definitions/codex.d.cts +7 -0
- package/dist/services/definitions/codex.d.cts.map +1 -0
- package/dist/services/definitions/codex.mjs +1 -1
- package/dist/services/definitions/codex.mjs.map +1 -1
- package/dist/services/definitions/comfyui.cjs +85 -0
- package/dist/services/definitions/comfyui.cjs.map +1 -0
- package/dist/services/definitions/comfyui.d.cts +7 -0
- package/dist/services/definitions/comfyui.d.cts.map +1 -0
- package/dist/services/definitions/comfyui.mjs +1 -1
- package/dist/services/definitions/comfyui.mjs.map +1 -1
- package/dist/services/definitions/convex-dashboard.cjs +48 -0
- package/dist/services/definitions/convex-dashboard.cjs.map +1 -0
- package/dist/services/definitions/convex-dashboard.d.cts +7 -0
- package/dist/services/definitions/convex-dashboard.d.cts.map +1 -0
- package/dist/services/definitions/convex.cjs +120 -0
- package/dist/services/definitions/convex.cjs.map +1 -0
- package/dist/services/definitions/convex.d.cts +7 -0
- package/dist/services/definitions/convex.d.cts.map +1 -0
- package/dist/services/definitions/coolify.cjs +51 -0
- package/dist/services/definitions/coolify.cjs.map +1 -0
- package/dist/services/definitions/coolify.d.cts +7 -0
- package/dist/services/definitions/coolify.d.cts.map +1 -0
- package/dist/services/definitions/coolify.mjs +1 -1
- package/dist/services/definitions/coolify.mjs.map +1 -1
- package/dist/services/definitions/crowdsec.cjs +64 -0
- package/dist/services/definitions/crowdsec.cjs.map +1 -0
- package/dist/services/definitions/crowdsec.d.cts +7 -0
- package/dist/services/definitions/crowdsec.d.cts.map +1 -0
- package/dist/services/definitions/crowdsec.mjs +2 -2
- package/dist/services/definitions/crowdsec.mjs.map +1 -1
- package/dist/services/definitions/desktop-environment.cjs +155 -0
- package/dist/services/definitions/desktop-environment.cjs.map +1 -0
- package/dist/services/definitions/desktop-environment.d.cts +7 -0
- package/dist/services/definitions/desktop-environment.d.cts.map +1 -0
- package/dist/services/definitions/desktop-environment.mjs +1 -1
- package/dist/services/definitions/desktop-environment.mjs.map +1 -1
- package/dist/services/definitions/dify.cjs +83 -0
- package/dist/services/definitions/dify.cjs.map +1 -0
- package/dist/services/definitions/dify.d.cts +7 -0
- package/dist/services/definitions/dify.d.cts.map +1 -0
- package/dist/services/definitions/dify.mjs +1 -1
- package/dist/services/definitions/dify.mjs.map +1 -1
- package/dist/services/definitions/docsgpt.cjs +47 -0
- package/dist/services/definitions/docsgpt.cjs.map +1 -0
- package/dist/services/definitions/docsgpt.d.cts +7 -0
- package/dist/services/definitions/docsgpt.d.cts.map +1 -0
- package/dist/services/definitions/docsgpt.mjs +1 -1
- package/dist/services/definitions/docsgpt.mjs.map +1 -1
- package/dist/services/definitions/dokploy.cjs +51 -0
- package/dist/services/definitions/dokploy.cjs.map +1 -0
- package/dist/services/definitions/dokploy.d.cts +7 -0
- package/dist/services/definitions/dokploy.d.cts.map +1 -0
- package/dist/services/definitions/dokploy.mjs +2 -2
- package/dist/services/definitions/dokploy.mjs.map +1 -1
- package/dist/services/definitions/dozzle.cjs +43 -0
- package/dist/services/definitions/dozzle.cjs.map +1 -0
- package/dist/services/definitions/dozzle.d.cts +7 -0
- package/dist/services/definitions/dozzle.d.cts.map +1 -0
- package/dist/services/definitions/dozzle.mjs +1 -1
- package/dist/services/definitions/dozzle.mjs.map +1 -1
- package/dist/services/definitions/ffmpeg.cjs +68 -0
- package/dist/services/definitions/ffmpeg.cjs.map +1 -0
- package/dist/services/definitions/ffmpeg.d.cts +7 -0
- package/dist/services/definitions/ffmpeg.d.cts.map +1 -0
- package/dist/services/definitions/ffmpeg.mjs +2 -2
- package/dist/services/definitions/ffmpeg.mjs.map +1 -1
- package/dist/services/definitions/flowise.cjs +47 -0
- package/dist/services/definitions/flowise.cjs.map +1 -0
- package/dist/services/definitions/flowise.d.cts +7 -0
- package/dist/services/definitions/flowise.d.cts.map +1 -0
- package/dist/services/definitions/flowise.mjs +1 -1
- package/dist/services/definitions/flowise.mjs.map +1 -1
- package/dist/services/definitions/gemini-cli.cjs +54 -0
- package/dist/services/definitions/gemini-cli.cjs.map +1 -0
- package/dist/services/definitions/gemini-cli.d.cts +7 -0
- package/dist/services/definitions/gemini-cli.d.cts.map +1 -0
- package/dist/services/definitions/gemini-cli.mjs +7 -1
- package/dist/services/definitions/gemini-cli.mjs.map +1 -1
- package/dist/services/definitions/ghost.cjs +60 -0
- package/dist/services/definitions/ghost.cjs.map +1 -0
- package/dist/services/definitions/ghost.d.cts +7 -0
- package/dist/services/definitions/ghost.d.cts.map +1 -0
- package/dist/services/definitions/ghost.mjs +1 -1
- package/dist/services/definitions/ghost.mjs.map +1 -1
- package/dist/services/definitions/gitea.cjs +51 -0
- package/dist/services/definitions/gitea.cjs.map +1 -0
- package/dist/services/definitions/gitea.d.cts +7 -0
- package/dist/services/definitions/gitea.d.cts.map +1 -0
- package/dist/services/definitions/gitea.mjs +1 -1
- package/dist/services/definitions/gitea.mjs.map +1 -1
- package/dist/services/definitions/gotify.cjs +64 -0
- package/dist/services/definitions/gotify.cjs.map +1 -0
- package/dist/services/definitions/gotify.d.cts +7 -0
- package/dist/services/definitions/gotify.d.cts.map +1 -0
- package/dist/services/definitions/gotify.mjs +3 -3
- package/dist/services/definitions/gotify.mjs.map +1 -1
- package/dist/services/definitions/grafana.cjs +77 -0
- package/dist/services/definitions/grafana.cjs.map +1 -0
- package/dist/services/definitions/grafana.d.cts +7 -0
- package/dist/services/definitions/grafana.d.cts.map +1 -0
- package/dist/services/definitions/grafana.mjs +2 -2
- package/dist/services/definitions/grafana.mjs.map +1 -1
- package/dist/services/definitions/headscale.cjs +73 -0
- package/dist/services/definitions/headscale.cjs.map +1 -0
- package/dist/services/definitions/headscale.d.cts +7 -0
- package/dist/services/definitions/headscale.d.cts.map +1 -0
- package/dist/services/definitions/headscale.mjs +2 -2
- package/dist/services/definitions/headscale.mjs.map +1 -1
- package/dist/services/definitions/hexstrike.cjs +46 -0
- package/dist/services/definitions/hexstrike.cjs.map +1 -0
- package/dist/services/definitions/hexstrike.d.cts +7 -0
- package/dist/services/definitions/hexstrike.d.cts.map +1 -0
- package/dist/services/definitions/hexstrike.mjs +1 -1
- package/dist/services/definitions/hexstrike.mjs.map +1 -1
- package/dist/services/definitions/homeassistant.cjs +63 -0
- package/dist/services/definitions/homeassistant.cjs.map +1 -0
- package/dist/services/definitions/homeassistant.d.cts +7 -0
- package/dist/services/definitions/homeassistant.d.cts.map +1 -0
- package/dist/services/definitions/homeassistant.mjs +1 -1
- package/dist/services/definitions/homeassistant.mjs.map +1 -1
- package/dist/services/definitions/immich.cjs +94 -0
- package/dist/services/definitions/immich.cjs.map +1 -0
- package/dist/services/definitions/immich.d.cts +7 -0
- package/dist/services/definitions/immich.d.cts.map +1 -0
- package/dist/services/definitions/immich.mjs +6 -6
- package/dist/services/definitions/immich.mjs.map +1 -1
- package/dist/services/definitions/index.cjs +291 -0
- package/dist/services/definitions/index.cjs.map +1 -0
- package/dist/services/definitions/index.d.cts +101 -0
- package/dist/services/definitions/index.d.cts.map +1 -0
- package/dist/services/definitions/jellyfin.cjs +64 -0
- package/dist/services/definitions/jellyfin.cjs.map +1 -0
- package/dist/services/definitions/jellyfin.d.cts +7 -0
- package/dist/services/definitions/jellyfin.d.cts.map +1 -0
- package/dist/services/definitions/jellyfin.mjs +1 -1
- package/dist/services/definitions/jellyfin.mjs.map +1 -1
- package/dist/services/definitions/jenkins.cjs +64 -0
- package/dist/services/definitions/jenkins.cjs.map +1 -0
- package/dist/services/definitions/jenkins.d.cts +7 -0
- package/dist/services/definitions/jenkins.d.cts.map +1 -0
- package/dist/services/definitions/jenkins.mjs +1 -1
- package/dist/services/definitions/jenkins.mjs.map +1 -1
- package/dist/services/definitions/kimi.cjs +48 -0
- package/dist/services/definitions/kimi.cjs.map +1 -0
- package/dist/services/definitions/kimi.d.cts +7 -0
- package/dist/services/definitions/kimi.d.cts.map +1 -0
- package/dist/services/definitions/kimi.mjs +1 -1
- package/dist/services/definitions/kimi.mjs.map +1 -1
- package/dist/services/definitions/lasuite-meet-agents.cjs +38 -0
- package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -0
- package/dist/services/definitions/lasuite-meet-agents.d.cts +7 -0
- package/dist/services/definitions/lasuite-meet-agents.d.cts.map +1 -0
- package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
- package/dist/services/definitions/lasuite-meet-agents.mjs.map +1 -1
- package/dist/services/definitions/lasuite-meet-backend.cjs +136 -0
- package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -0
- package/dist/services/definitions/lasuite-meet-backend.d.cts +7 -0
- package/dist/services/definitions/lasuite-meet-backend.d.cts.map +1 -0
- package/dist/services/definitions/lasuite-meet-backend.mjs +3 -3
- package/dist/services/definitions/lasuite-meet-backend.mjs.map +1 -1
- package/dist/services/definitions/lasuite-meet-frontend.cjs +50 -0
- package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -0
- package/dist/services/definitions/lasuite-meet-frontend.d.cts +7 -0
- package/dist/services/definitions/lasuite-meet-frontend.d.cts.map +1 -0
- package/dist/services/definitions/lasuite-meet-frontend.mjs +3 -3
- package/dist/services/definitions/lasuite-meet-frontend.mjs.map +1 -1
- package/dist/services/definitions/librechat.cjs +52 -0
- package/dist/services/definitions/librechat.cjs.map +1 -0
- package/dist/services/definitions/librechat.d.cts +7 -0
- package/dist/services/definitions/librechat.d.cts.map +1 -0
- package/dist/services/definitions/librechat.mjs +1 -1
- package/dist/services/definitions/librechat.mjs.map +1 -1
- package/dist/services/definitions/lightpanda.cjs +61 -0
- package/dist/services/definitions/lightpanda.cjs.map +1 -0
- package/dist/services/definitions/lightpanda.d.cts +7 -0
- package/dist/services/definitions/lightpanda.d.cts.map +1 -0
- package/dist/services/definitions/litellm.cjs +49 -0
- package/dist/services/definitions/litellm.cjs.map +1 -0
- package/dist/services/definitions/litellm.d.cts +7 -0
- package/dist/services/definitions/litellm.d.cts.map +1 -0
- package/dist/services/definitions/litellm.mjs +1 -1
- package/dist/services/definitions/litellm.mjs.map +1 -1
- package/dist/services/definitions/livekit.cjs +58 -0
- package/dist/services/definitions/livekit.cjs.map +1 -0
- package/dist/services/definitions/livekit.d.cts +7 -0
- package/dist/services/definitions/livekit.d.cts.map +1 -0
- package/dist/services/definitions/loki.cjs +53 -0
- package/dist/services/definitions/loki.cjs.map +1 -0
- package/dist/services/definitions/loki.d.cts +7 -0
- package/dist/services/definitions/loki.d.cts.map +1 -0
- package/dist/services/definitions/loki.mjs +1 -1
- package/dist/services/definitions/loki.mjs.map +1 -1
- package/dist/services/definitions/matomo.cjs +82 -0
- package/dist/services/definitions/matomo.cjs.map +1 -0
- package/dist/services/definitions/matomo.d.cts +7 -0
- package/dist/services/definitions/matomo.d.cts.map +1 -0
- package/dist/services/definitions/matomo.mjs +1 -1
- package/dist/services/definitions/matomo.mjs.map +1 -1
- package/dist/services/definitions/matrix-synapse.cjs +90 -0
- package/dist/services/definitions/matrix-synapse.cjs.map +1 -0
- package/dist/services/definitions/matrix-synapse.d.cts +7 -0
- package/dist/services/definitions/matrix-synapse.d.cts.map +1 -0
- package/dist/services/definitions/matrix-synapse.mjs +1 -1
- package/dist/services/definitions/matrix-synapse.mjs.map +1 -1
- package/dist/services/definitions/mattermost.cjs +63 -0
- package/dist/services/definitions/mattermost.cjs.map +1 -0
- package/dist/services/definitions/mattermost.d.cts +7 -0
- package/dist/services/definitions/mattermost.d.cts.map +1 -0
- package/dist/services/definitions/mattermost.mjs +1 -1
- package/dist/services/definitions/mattermost.mjs.map +1 -1
- package/dist/services/definitions/meilisearch.cjs +80 -0
- package/dist/services/definitions/meilisearch.cjs.map +1 -0
- package/dist/services/definitions/meilisearch.d.cts +7 -0
- package/dist/services/definitions/meilisearch.d.cts.map +1 -0
- package/dist/services/definitions/meilisearch.mjs +4 -4
- package/dist/services/definitions/meilisearch.mjs.map +1 -1
- package/dist/services/definitions/milvus.cjs +77 -0
- package/dist/services/definitions/milvus.cjs.map +1 -0
- package/dist/services/definitions/milvus.d.cts +7 -0
- package/dist/services/definitions/milvus.d.cts.map +1 -0
- package/dist/services/definitions/milvus.mjs +1 -1
- package/dist/services/definitions/milvus.mjs.map +1 -1
- package/dist/services/definitions/minio.cjs +104 -0
- package/dist/services/definitions/minio.cjs.map +1 -0
- package/dist/services/definitions/minio.d.cts +7 -0
- package/dist/services/definitions/minio.d.cts.map +1 -0
- package/dist/services/definitions/minio.mjs +1 -1
- package/dist/services/definitions/minio.mjs.map +1 -1
- package/dist/services/definitions/mission-control.cjs +69 -0
- package/dist/services/definitions/mission-control.cjs.map +1 -0
- package/dist/services/definitions/mission-control.d.cts +7 -0
- package/dist/services/definitions/mission-control.d.cts.map +1 -0
- package/dist/services/definitions/mixpost.cjs +89 -0
- package/dist/services/definitions/mixpost.cjs.map +1 -0
- package/dist/services/definitions/mixpost.d.cts +7 -0
- package/dist/services/definitions/mixpost.d.cts.map +1 -0
- package/dist/services/definitions/mixpost.mjs +1 -1
- package/dist/services/definitions/mixpost.mjs.map +1 -1
- package/dist/services/definitions/motion-canvas.cjs +54 -0
- package/dist/services/definitions/motion-canvas.cjs.map +1 -0
- package/dist/services/definitions/motion-canvas.d.cts +7 -0
- package/dist/services/definitions/motion-canvas.d.cts.map +1 -0
- package/dist/services/definitions/motion-canvas.mjs +1 -1
- package/dist/services/definitions/motion-canvas.mjs.map +1 -1
- package/dist/services/definitions/n8n.cjs +156 -0
- package/dist/services/definitions/n8n.cjs.map +1 -0
- package/dist/services/definitions/n8n.d.cts +7 -0
- package/dist/services/definitions/n8n.d.cts.map +1 -0
- package/dist/services/definitions/n8n.mjs +1 -1
- package/dist/services/definitions/n8n.mjs.map +1 -1
- package/dist/services/definitions/neo4j.cjs +93 -0
- package/dist/services/definitions/neo4j.cjs.map +1 -0
- package/dist/services/definitions/neo4j.d.cts +7 -0
- package/dist/services/definitions/neo4j.d.cts.map +1 -0
- package/dist/services/definitions/neo4j.mjs +1 -1
- package/dist/services/definitions/neo4j.mjs.map +1 -1
- package/dist/services/definitions/nextcloud.cjs +82 -0
- package/dist/services/definitions/nextcloud.cjs.map +1 -0
- package/dist/services/definitions/nextcloud.d.cts +7 -0
- package/dist/services/definitions/nextcloud.d.cts.map +1 -0
- package/dist/services/definitions/nextcloud.mjs +19 -19
- package/dist/services/definitions/nextcloud.mjs.map +1 -1
- package/dist/services/definitions/nocodb.cjs +47 -0
- package/dist/services/definitions/nocodb.cjs.map +1 -0
- package/dist/services/definitions/nocodb.d.cts +7 -0
- package/dist/services/definitions/nocodb.d.cts.map +1 -0
- package/dist/services/definitions/nocodb.mjs +1 -1
- package/dist/services/definitions/nocodb.mjs.map +1 -1
- package/dist/services/definitions/ntfy.cjs +65 -0
- package/dist/services/definitions/ntfy.cjs.map +1 -0
- package/dist/services/definitions/ntfy.d.cts +7 -0
- package/dist/services/definitions/ntfy.d.cts.map +1 -0
- package/dist/services/definitions/ntfy.mjs +2 -2
- package/dist/services/definitions/ntfy.mjs.map +1 -1
- package/dist/services/definitions/ollama.cjs +68 -0
- package/dist/services/definitions/ollama.cjs.map +1 -0
- package/dist/services/definitions/ollama.d.cts +7 -0
- package/dist/services/definitions/ollama.d.cts.map +1 -0
- package/dist/services/definitions/ollama.mjs +1 -1
- package/dist/services/definitions/ollama.mjs.map +1 -1
- package/dist/services/definitions/open-webui.cjs +52 -0
- package/dist/services/definitions/open-webui.cjs.map +1 -0
- package/dist/services/definitions/open-webui.d.cts +7 -0
- package/dist/services/definitions/open-webui.d.cts.map +1 -0
- package/dist/services/definitions/open-webui.mjs +1 -1
- package/dist/services/definitions/open-webui.mjs.map +1 -1
- package/dist/services/definitions/opencode.cjs +52 -0
- package/dist/services/definitions/opencode.cjs.map +1 -0
- package/dist/services/definitions/opencode.d.cts +7 -0
- package/dist/services/definitions/opencode.d.cts.map +1 -0
- package/dist/services/definitions/opencode.mjs +1 -1
- package/dist/services/definitions/opencode.mjs.map +1 -1
- package/dist/services/definitions/openpanel.cjs +48 -0
- package/dist/services/definitions/openpanel.cjs.map +1 -0
- package/dist/services/definitions/openpanel.d.cts +7 -0
- package/dist/services/definitions/openpanel.d.cts.map +1 -0
- package/dist/services/definitions/openpanel.mjs +3 -3
- package/dist/services/definitions/openpanel.mjs.map +1 -1
- package/dist/services/definitions/outline.cjs +76 -0
- package/dist/services/definitions/outline.cjs.map +1 -0
- package/dist/services/definitions/outline.d.cts +7 -0
- package/dist/services/definitions/outline.d.cts.map +1 -0
- package/dist/services/definitions/paperless-ngx.cjs +95 -0
- package/dist/services/definitions/paperless-ngx.cjs.map +1 -0
- package/dist/services/definitions/paperless-ngx.d.cts +7 -0
- package/dist/services/definitions/paperless-ngx.d.cts.map +1 -0
- package/dist/services/definitions/paperless-ngx.mjs +1 -1
- package/dist/services/definitions/paperless-ngx.mjs.map +1 -1
- package/dist/services/definitions/pentagi.cjs +46 -0
- package/dist/services/definitions/pentagi.cjs.map +1 -0
- package/dist/services/definitions/pentagi.d.cts +7 -0
- package/dist/services/definitions/pentagi.d.cts.map +1 -0
- package/dist/services/definitions/pentagi.mjs +2 -2
- package/dist/services/definitions/pentagi.mjs.map +1 -1
- package/dist/services/definitions/pentestagent.cjs +41 -0
- package/dist/services/definitions/pentestagent.cjs.map +1 -0
- package/dist/services/definitions/pentestagent.d.cts +7 -0
- package/dist/services/definitions/pentestagent.d.cts.map +1 -0
- package/dist/services/definitions/playwright-server.cjs +44 -0
- package/dist/services/definitions/playwright-server.cjs.map +1 -0
- package/dist/services/definitions/playwright-server.d.cts +7 -0
- package/dist/services/definitions/playwright-server.d.cts.map +1 -0
- package/dist/services/definitions/playwright-server.mjs +1 -1
- package/dist/services/definitions/playwright-server.mjs.map +1 -1
- package/dist/services/definitions/portainer.cjs +51 -0
- package/dist/services/definitions/portainer.cjs.map +1 -0
- package/dist/services/definitions/portainer.d.cts +7 -0
- package/dist/services/definitions/portainer.d.cts.map +1 -0
- package/dist/services/definitions/portainer.mjs +1 -1
- package/dist/services/definitions/portainer.mjs.map +1 -1
- package/dist/services/definitions/postgresql.cjs +86 -0
- package/dist/services/definitions/postgresql.cjs.map +1 -0
- package/dist/services/definitions/postgresql.d.cts +7 -0
- package/dist/services/definitions/postgresql.d.cts.map +1 -0
- package/dist/services/definitions/postgresql.mjs +1 -1
- package/dist/services/definitions/postgresql.mjs.map +1 -1
- package/dist/services/definitions/postiz.cjs +85 -0
- package/dist/services/definitions/postiz.cjs.map +1 -0
- package/dist/services/definitions/postiz.d.cts +7 -0
- package/dist/services/definitions/postiz.d.cts.map +1 -0
- package/dist/services/definitions/postiz.mjs +1 -1
- package/dist/services/definitions/postiz.mjs.map +1 -1
- package/dist/services/definitions/prometheus.cjs +54 -0
- package/dist/services/definitions/prometheus.cjs.map +1 -0
- package/dist/services/definitions/prometheus.d.cts +7 -0
- package/dist/services/definitions/prometheus.d.cts.map +1 -0
- package/dist/services/definitions/prometheus.mjs +1 -1
- package/dist/services/definitions/prometheus.mjs.map +1 -1
- package/dist/services/definitions/qdrant.cjs +79 -0
- package/dist/services/definitions/qdrant.cjs.map +1 -0
- package/dist/services/definitions/qdrant.d.cts +7 -0
- package/dist/services/definitions/qdrant.d.cts.map +1 -0
- package/dist/services/definitions/qdrant.mjs +1 -1
- package/dist/services/definitions/qdrant.mjs.map +1 -1
- package/dist/services/definitions/redis.cjs +93 -0
- package/dist/services/definitions/redis.cjs.map +1 -0
- package/dist/services/definitions/redis.d.cts +7 -0
- package/dist/services/definitions/redis.d.cts.map +1 -0
- package/dist/services/definitions/redis.mjs +1 -1
- package/dist/services/definitions/redis.mjs.map +1 -1
- package/dist/services/definitions/remotion.cjs +57 -0
- package/dist/services/definitions/remotion.cjs.map +1 -0
- package/dist/services/definitions/remotion.d.cts +7 -0
- package/dist/services/definitions/remotion.d.cts.map +1 -0
- package/dist/services/definitions/remotion.mjs +1 -1
- package/dist/services/definitions/remotion.mjs.map +1 -1
- package/dist/services/definitions/rocketchat.cjs +59 -0
- package/dist/services/definitions/rocketchat.cjs.map +1 -0
- package/dist/services/definitions/rocketchat.d.cts +7 -0
- package/dist/services/definitions/rocketchat.d.cts.map +1 -0
- package/dist/services/definitions/rocketchat.mjs +1 -1
- package/dist/services/definitions/rocketchat.mjs.map +1 -1
- package/dist/services/definitions/scrapling.cjs +46 -0
- package/dist/services/definitions/scrapling.cjs.map +1 -0
- package/dist/services/definitions/scrapling.d.cts +7 -0
- package/dist/services/definitions/scrapling.d.cts.map +1 -0
- package/dist/services/definitions/scrapling.mjs +2 -2
- package/dist/services/definitions/scrapling.mjs.map +1 -1
- package/dist/services/definitions/searxng.cjs +67 -0
- package/dist/services/definitions/searxng.cjs.map +1 -0
- package/dist/services/definitions/searxng.d.cts +7 -0
- package/dist/services/definitions/searxng.d.cts.map +1 -0
- package/dist/services/definitions/searxng.mjs +1 -1
- package/dist/services/definitions/searxng.mjs.map +1 -1
- package/dist/services/definitions/signoz.cjs +56 -0
- package/dist/services/definitions/signoz.cjs.map +1 -0
- package/dist/services/definitions/signoz.d.cts +7 -0
- package/dist/services/definitions/signoz.d.cts.map +1 -0
- package/dist/services/definitions/signoz.mjs +2 -2
- package/dist/services/definitions/signoz.mjs.map +1 -1
- package/dist/services/definitions/solidityguard.cjs +51 -0
- package/dist/services/definitions/solidityguard.cjs.map +1 -0
- package/dist/services/definitions/solidityguard.d.cts +7 -0
- package/dist/services/definitions/solidityguard.d.cts.map +1 -0
- package/dist/services/definitions/solidityguard.mjs +1 -1
- package/dist/services/definitions/solidityguard.mjs.map +1 -1
- package/dist/services/definitions/stable-diffusion.cjs +50 -0
- package/dist/services/definitions/stable-diffusion.cjs.map +1 -0
- package/dist/services/definitions/stable-diffusion.d.cts +7 -0
- package/dist/services/definitions/stable-diffusion.d.cts.map +1 -0
- package/dist/services/definitions/stable-diffusion.mjs +1 -1
- package/dist/services/definitions/stable-diffusion.mjs.map +1 -1
- package/dist/services/definitions/steel-browser.cjs +79 -0
- package/dist/services/definitions/steel-browser.cjs.map +1 -0
- package/dist/services/definitions/steel-browser.d.cts +7 -0
- package/dist/services/definitions/steel-browser.d.cts.map +1 -0
- package/dist/services/definitions/steel-browser.mjs +1 -1
- package/dist/services/definitions/steel-browser.mjs.map +1 -1
- package/dist/services/definitions/stream-gateway.cjs +135 -0
- package/dist/services/definitions/stream-gateway.cjs.map +1 -0
- package/dist/services/definitions/stream-gateway.d.cts +7 -0
- package/dist/services/definitions/stream-gateway.d.cts.map +1 -0
- package/dist/services/definitions/stream-gateway.mjs +2 -2
- package/dist/services/definitions/stream-gateway.mjs.map +1 -1
- package/dist/services/definitions/supabase.cjs +71 -0
- package/dist/services/definitions/supabase.cjs.map +1 -0
- package/dist/services/definitions/supabase.d.cts +7 -0
- package/dist/services/definitions/supabase.d.cts.map +1 -0
- package/dist/services/definitions/supabase.mjs +2 -2
- package/dist/services/definitions/supabase.mjs.map +1 -1
- package/dist/services/definitions/tailscale.cjs +72 -0
- package/dist/services/definitions/tailscale.cjs.map +1 -0
- package/dist/services/definitions/tailscale.d.cts +7 -0
- package/dist/services/definitions/tailscale.d.cts.map +1 -0
- package/dist/services/definitions/tailscale.mjs +1 -1
- package/dist/services/definitions/tailscale.mjs.map +1 -1
- package/dist/services/definitions/temporal.cjs +102 -0
- package/dist/services/definitions/temporal.cjs.map +1 -0
- package/dist/services/definitions/temporal.d.cts +7 -0
- package/dist/services/definitions/temporal.d.cts.map +1 -0
- package/dist/services/definitions/traefik.cjs +59 -0
- package/dist/services/definitions/traefik.cjs.map +1 -0
- package/dist/services/definitions/traefik.d.cts +7 -0
- package/dist/services/definitions/traefik.d.cts.map +1 -0
- package/dist/services/definitions/traefik.mjs +1 -1
- package/dist/services/definitions/traefik.mjs.map +1 -1
- package/dist/services/definitions/umami.cjs +48 -0
- package/dist/services/definitions/umami.cjs.map +1 -0
- package/dist/services/definitions/umami.d.cts +7 -0
- package/dist/services/definitions/umami.d.cts.map +1 -0
- package/dist/services/definitions/uptime-kuma.cjs +53 -0
- package/dist/services/definitions/uptime-kuma.cjs.map +1 -0
- package/dist/services/definitions/uptime-kuma.d.cts +7 -0
- package/dist/services/definitions/uptime-kuma.d.cts.map +1 -0
- package/dist/services/definitions/uptime-kuma.mjs +2 -2
- package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
- package/dist/services/definitions/usesend.cjs +101 -0
- package/dist/services/definitions/usesend.cjs.map +1 -0
- package/dist/services/definitions/usesend.d.cts +7 -0
- package/dist/services/definitions/usesend.d.cts.map +1 -0
- package/dist/services/definitions/usesend.mjs +4 -4
- package/dist/services/definitions/usesend.mjs.map +1 -1
- package/dist/services/definitions/valkey.cjs +63 -0
- package/dist/services/definitions/valkey.cjs.map +1 -0
- package/dist/services/definitions/valkey.d.cts +7 -0
- package/dist/services/definitions/valkey.d.cts.map +1 -0
- package/dist/services/definitions/valkey.mjs +1 -1
- package/dist/services/definitions/valkey.mjs.map +1 -1
- package/dist/services/definitions/vaultwarden.cjs +65 -0
- package/dist/services/definitions/vaultwarden.cjs.map +1 -0
- package/dist/services/definitions/vaultwarden.d.cts +7 -0
- package/dist/services/definitions/vaultwarden.d.cts.map +1 -0
- package/dist/services/definitions/vaultwarden.mjs +2 -2
- package/dist/services/definitions/vaultwarden.mjs.map +1 -1
- package/dist/services/definitions/watchtower.cjs +49 -0
- package/dist/services/definitions/watchtower.cjs.map +1 -0
- package/dist/services/definitions/watchtower.d.cts +7 -0
- package/dist/services/definitions/watchtower.d.cts.map +1 -0
- package/dist/services/definitions/weaviate.cjs +92 -0
- package/dist/services/definitions/weaviate.cjs.map +1 -0
- package/dist/services/definitions/weaviate.d.cts +7 -0
- package/dist/services/definitions/weaviate.d.cts.map +1 -0
- package/dist/services/definitions/weaviate.mjs +2 -2
- package/dist/services/definitions/weaviate.mjs.map +1 -1
- package/dist/services/definitions/whisper.cjs +64 -0
- package/dist/services/definitions/whisper.cjs.map +1 -0
- package/dist/services/definitions/whisper.d.cts +7 -0
- package/dist/services/definitions/whisper.d.cts.map +1 -0
- package/dist/services/definitions/whisper.mjs +2 -2
- package/dist/services/definitions/whisper.mjs.map +1 -1
- package/dist/services/definitions/xyops.cjs +88 -0
- package/dist/services/definitions/xyops.cjs.map +1 -0
- package/dist/services/definitions/xyops.d.cts +7 -0
- package/dist/services/definitions/xyops.d.cts.map +1 -0
- package/dist/services/definitions/xyops.mjs +1 -1
- package/dist/services/definitions/xyops.mjs.map +1 -1
- package/dist/services/registry.cjs +35 -0
- package/dist/services/registry.cjs.map +1 -0
- package/dist/services/registry.d.cts +16 -0
- package/dist/services/registry.d.cts.map +1 -0
- package/dist/services/registry.test.cjs +63 -0
- package/dist/services/registry.test.cjs.map +1 -0
- package/dist/services/registry.test.d.cts +1 -0
- package/dist/services/registry.test.mjs +1 -1
- package/dist/skills/registry.cjs +712 -0
- package/dist/skills/registry.cjs.map +1 -0
- package/dist/skills/registry.d.cts +11 -0
- package/dist/skills/registry.d.cts.map +1 -0
- package/dist/skills/skill-manifest.cjs +23 -0
- package/dist/skills/skill-manifest.cjs.map +1 -0
- package/dist/skills/skill-manifest.d.cts +20 -0
- package/dist/skills/skill-manifest.d.cts.map +1 -0
- package/dist/types.cjs +149 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +82 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +9 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +40 -0
- package/dist/types.mjs.map +1 -1
- package/dist/validator.cjs +124 -0
- package/dist/validator.cjs.map +1 -0
- package/dist/validator.d.cts +20 -0
- package/dist/validator.d.cts.map +1 -0
- package/dist/validator.test.cjs +64 -0
- package/dist/validator.test.cjs.map +1 -0
- package/dist/validator.test.d.cts +1 -0
- package/dist/validator.test.mjs +1 -1
- package/dist/version-manager.cjs +65 -0
- package/dist/version-manager.cjs.map +1 -0
- package/dist/version-manager.d.cts +14 -0
- package/dist/version-manager.d.cts.map +1 -0
- package/dist/version-manager.test.cjs +101 -0
- package/dist/version-manager.test.cjs.map +1 -0
- package/dist/version-manager.test.d.cts +1 -0
- package/dist/version-manager.test.mjs +1 -1
- package/dist/vi.2VT5v0um-BmRMvymT.cjs +12934 -0
- package/dist/vi.2VT5v0um-BmRMvymT.cjs.map +1 -0
- package/dist/{vi.2VT5v0um-BgmKutxR.mjs → vi.2VT5v0um-CFyDIn0m.mjs} +5 -5
- package/dist/{vi.2VT5v0um-BgmKutxR.mjs.map → vi.2VT5v0um-CFyDIn0m.mjs.map} +1 -1
- package/package.json +24 -3
- package/src/__snapshots__/composer.snapshot.test.ts.snap +20 -20
- package/src/compose-validation.test.ts +102 -0
- package/src/composer.test.ts +1 -1
- package/src/composer.ts +331 -53
- package/src/deployers/coolify.ts +241 -0
- package/src/deployers/dokploy.ts +174 -0
- package/src/deployers/index.ts +36 -0
- package/src/deployers/types.ts +70 -0
- package/src/generate.ts +45 -1
- package/src/generators/cloud-init.ts +137 -0
- package/src/generators/env.ts +112 -6
- package/src/generators/health-check.ts +2 -2
- package/src/generators/openclaw-install-script.ts +77 -0
- package/src/generators/openclaw-json.ts +195 -58
- package/src/generators/postgres-init.ts +11 -0
- package/src/generators/readme.ts +103 -4
- package/src/generators/stack-manifest.ts +127 -0
- package/src/index.ts +30 -0
- package/src/port-scanner.ts +189 -0
- package/src/presets/presets.test.ts +73 -0
- package/src/presets/registry.test.ts +3 -0
- package/src/presets/registry.ts +30 -7
- package/src/resolver.ts +2 -0
- package/src/schema.ts +30 -1
- package/src/services/definitions/anything-llm.ts +2 -2
- package/src/services/definitions/appflowy.ts +1 -1
- package/src/services/definitions/authentik.ts +5 -5
- package/src/services/definitions/beszel.ts +1 -1
- package/src/services/definitions/browserless.ts +1 -1
- package/src/services/definitions/caddy.ts +2 -2
- package/src/services/definitions/cal-com.ts +2 -2
- package/src/services/definitions/chromadb.ts +3 -3
- package/src/services/definitions/claude-code.ts +1 -1
- package/src/services/definitions/code-server.ts +1 -1
- package/src/services/definitions/codex.ts +1 -1
- package/src/services/definitions/comfyui.ts +1 -1
- package/src/services/definitions/coolify.ts +1 -1
- package/src/services/definitions/crowdsec.ts +2 -2
- package/src/services/definitions/desktop-environment.ts +1 -1
- package/src/services/definitions/dify.ts +1 -1
- package/src/services/definitions/docsgpt.ts +1 -1
- package/src/services/definitions/dokploy.ts +2 -2
- package/src/services/definitions/dozzle.ts +1 -1
- package/src/services/definitions/ffmpeg.ts +2 -2
- package/src/services/definitions/flowise.ts +1 -1
- package/src/services/definitions/gemini-cli.ts +8 -1
- package/src/services/definitions/ghost.ts +1 -1
- package/src/services/definitions/gitea.ts +1 -1
- package/src/services/definitions/gotify.ts +3 -3
- package/src/services/definitions/grafana.ts +2 -2
- package/src/services/definitions/headscale.ts +68 -68
- package/src/services/definitions/hexstrike.ts +1 -1
- package/src/services/definitions/homeassistant.ts +1 -1
- package/src/services/definitions/immich.ts +6 -6
- package/src/services/definitions/jellyfin.ts +1 -1
- package/src/services/definitions/jenkins.ts +1 -1
- package/src/services/definitions/kimi.ts +1 -1
- package/src/services/definitions/lasuite-meet-agents.ts +1 -1
- package/src/services/definitions/lasuite-meet-backend.ts +3 -3
- package/src/services/definitions/lasuite-meet-frontend.ts +3 -3
- package/src/services/definitions/librechat.ts +1 -1
- package/src/services/definitions/litellm.ts +1 -1
- package/src/services/definitions/loki.ts +1 -1
- package/src/services/definitions/matomo.ts +1 -1
- package/src/services/definitions/matrix-synapse.ts +1 -1
- package/src/services/definitions/mattermost.ts +1 -1
- package/src/services/definitions/meilisearch.ts +4 -4
- package/src/services/definitions/milvus.ts +1 -1
- package/src/services/definitions/minio.ts +1 -1
- package/src/services/definitions/mixpost.ts +1 -1
- package/src/services/definitions/motion-canvas.ts +1 -1
- package/src/services/definitions/n8n.ts +1 -1
- package/src/services/definitions/neo4j.ts +1 -1
- package/src/services/definitions/nextcloud.ts +19 -19
- package/src/services/definitions/nocodb.ts +1 -1
- package/src/services/definitions/ntfy.ts +2 -2
- package/src/services/definitions/ollama.ts +1 -1
- package/src/services/definitions/open-webui.ts +1 -1
- package/src/services/definitions/opencode.ts +1 -1
- package/src/services/definitions/openpanel.ts +3 -3
- package/src/services/definitions/paperless-ngx.ts +1 -1
- package/src/services/definitions/pentagi.ts +2 -2
- package/src/services/definitions/playwright-server.ts +1 -1
- package/src/services/definitions/portainer.ts +1 -1
- package/src/services/definitions/postgresql.ts +1 -1
- package/src/services/definitions/postiz.ts +1 -1
- package/src/services/definitions/prometheus.ts +1 -1
- package/src/services/definitions/qdrant.ts +1 -1
- package/src/services/definitions/redis.ts +1 -1
- package/src/services/definitions/remotion.ts +1 -1
- package/src/services/definitions/rocketchat.ts +1 -1
- package/src/services/definitions/scrapling.ts +2 -2
- package/src/services/definitions/searxng.ts +1 -1
- package/src/services/definitions/signoz.ts +2 -2
- package/src/services/definitions/solidityguard.ts +1 -1
- package/src/services/definitions/stable-diffusion.ts +1 -1
- package/src/services/definitions/steel-browser.ts +1 -1
- package/src/services/definitions/stream-gateway.ts +2 -2
- package/src/services/definitions/supabase.ts +2 -2
- package/src/services/definitions/tailscale.ts +1 -1
- package/src/services/definitions/traefik.ts +1 -1
- package/src/services/definitions/uptime-kuma.ts +2 -2
- package/src/services/definitions/usesend.ts +4 -4
- package/src/services/definitions/valkey.ts +1 -1
- package/src/services/definitions/vaultwarden.ts +2 -2
- package/src/services/definitions/weaviate.ts +2 -2
- package/src/services/definitions/whisper.ts +2 -2
- package/src/services/definitions/xyops.ts +1 -1
- package/src/types.ts +138 -20
- package/tsdown.config.ts +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-4uLbISXV.cjs","names":[],"sources":["../src/skills/manifest.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/migrations.ts
|
|
4
|
+
const CURRENT_CONFIG_VERSION = 2;
|
|
5
|
+
const migrations = { 1: (input) => ({
|
|
6
|
+
...input,
|
|
7
|
+
configVersion: 2,
|
|
8
|
+
deploymentType: input.deploymentType ?? "docker"
|
|
9
|
+
}) };
|
|
10
|
+
/**
|
|
11
|
+
* Applies sequential migrations to bring a config from its current version
|
|
12
|
+
* to CURRENT_CONFIG_VERSION. Returns the config unchanged if already current.
|
|
13
|
+
*/
|
|
14
|
+
function migrateConfig(input) {
|
|
15
|
+
let version = input.configVersion ?? 1;
|
|
16
|
+
if (version > CURRENT_CONFIG_VERSION) throw new Error(`No migration path from config version ${version}`);
|
|
17
|
+
let current = { ...input };
|
|
18
|
+
while (version < CURRENT_CONFIG_VERSION) {
|
|
19
|
+
const migrationFn = migrations[version];
|
|
20
|
+
if (!migrationFn) throw new Error(`No migration path from config version ${version}`);
|
|
21
|
+
current = migrationFn(current);
|
|
22
|
+
version++;
|
|
23
|
+
}
|
|
24
|
+
return current;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns true if the config needs migration to the current version.
|
|
28
|
+
*/
|
|
29
|
+
function needsMigration(input) {
|
|
30
|
+
return (input.configVersion ?? 1) < CURRENT_CONFIG_VERSION;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
exports.CURRENT_CONFIG_VERSION = CURRENT_CONFIG_VERSION;
|
|
35
|
+
exports.migrateConfig = migrateConfig;
|
|
36
|
+
exports.needsMigration = needsMigration;
|
|
37
|
+
//# sourceMappingURL=migrations.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.cjs","names":[],"sources":["../src/migrations.ts"],"sourcesContent":["export const CURRENT_CONFIG_VERSION = 2;\n\ntype MigrationFn = (input: Record<string, unknown>) => Record<string, unknown>;\n\nconst migrations: Record<number, MigrationFn> = {\n\t// v1 → v2: ensure deploymentType field exists (defaulting to \"docker\")\n\t1: (input) => ({\n\t\t...input,\n\t\tconfigVersion: 2,\n\t\tdeploymentType: (input.deploymentType as string) ?? \"docker\",\n\t}),\n};\n\n/**\n * Applies sequential migrations to bring a config from its current version\n * to CURRENT_CONFIG_VERSION. Returns the config unchanged if already current.\n */\nexport function migrateConfig(input: Record<string, unknown>): Record<string, unknown> {\n\tlet version = (input.configVersion as number) ?? 1;\n\n\tif (version > CURRENT_CONFIG_VERSION) {\n\t\tthrow new Error(`No migration path from config version ${version}`);\n\t}\n\n\tlet current = { ...input };\n\n\twhile (version < CURRENT_CONFIG_VERSION) {\n\t\tconst migrationFn = migrations[version];\n\t\tif (!migrationFn) {\n\t\t\tthrow new Error(`No migration path from config version ${version}`);\n\t\t}\n\t\tcurrent = migrationFn(current);\n\t\tversion++;\n\t}\n\n\treturn current;\n}\n\n/**\n * Returns true if the config needs migration to the current version.\n */\nexport function needsMigration(input: Record<string, unknown>): boolean {\n\tconst version = (input.configVersion as number) ?? 1;\n\treturn version < CURRENT_CONFIG_VERSION;\n}\n"],"mappings":";;;AAAA,MAAa,yBAAyB;AAItC,MAAM,aAA0C,EAE/C,IAAI,WAAW;CACd,GAAG;CACH,eAAe;CACf,gBAAiB,MAAM,kBAA6B;CACpD,GACD;;;;;AAMD,SAAgB,cAAc,OAAyD;CACtF,IAAI,UAAW,MAAM,iBAA4B;AAEjD,KAAI,UAAU,uBACb,OAAM,IAAI,MAAM,yCAAyC,UAAU;CAGpE,IAAI,UAAU,EAAE,GAAG,OAAO;AAE1B,QAAO,UAAU,wBAAwB;EACxC,MAAM,cAAc,WAAW;AAC/B,MAAI,CAAC,YACJ,OAAM,IAAI,MAAM,yCAAyC,UAAU;AAEpE,YAAU,YAAY,QAAQ;AAC9B;;AAGD,QAAO;;;;;AAMR,SAAgB,eAAe,OAAyC;AAEvE,SADiB,MAAM,iBAA4B,KAClC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/migrations.d.ts
|
|
2
|
+
declare const CURRENT_CONFIG_VERSION = 2;
|
|
3
|
+
/**
|
|
4
|
+
* Applies sequential migrations to bring a config from its current version
|
|
5
|
+
* to CURRENT_CONFIG_VERSION. Returns the config unchanged if already current.
|
|
6
|
+
*/
|
|
7
|
+
declare function migrateConfig(input: Record<string, unknown>): Record<string, unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* Returns true if the config needs migration to the current version.
|
|
10
|
+
*/
|
|
11
|
+
declare function needsMigration(input: Record<string, unknown>): boolean;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { CURRENT_CONFIG_VERSION, migrateConfig, needsMigration };
|
|
14
|
+
//# sourceMappingURL=migrations.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.cts","names":[],"sources":["../src/migrations.ts"],"mappings":";cAAa,sBAAA;AAAb;;;;AAAA,iBAiBgB,aAAA,CAAc,KAAA,EAAO,MAAA,oBAA0B,MAAA;AAA/D;;;AAAA,iBAwBgB,cAAA,CAAe,KAAA,EAAO,MAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const require_vi_2VT5v0um = require('./vi.2VT5v0um-BmRMvymT.cjs');
|
|
2
|
+
const require_migrations = require('./migrations.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/migrations.test.ts
|
|
5
|
+
require_vi_2VT5v0um.describe("config migrations", () => {
|
|
6
|
+
require_vi_2VT5v0um.it("migrates v1 config to current version", () => {
|
|
7
|
+
const result = require_migrations.migrateConfig({
|
|
8
|
+
projectName: "test",
|
|
9
|
+
services: ["redis"],
|
|
10
|
+
skillPacks: []
|
|
11
|
+
});
|
|
12
|
+
require_vi_2VT5v0um.globalExpect(result.configVersion).toBe(require_migrations.CURRENT_CONFIG_VERSION);
|
|
13
|
+
require_vi_2VT5v0um.globalExpect(result.deploymentType).toBe("docker");
|
|
14
|
+
});
|
|
15
|
+
require_vi_2VT5v0um.it("preserves existing deploymentType during migration", () => {
|
|
16
|
+
require_vi_2VT5v0um.globalExpect(require_migrations.migrateConfig({
|
|
17
|
+
configVersion: 1,
|
|
18
|
+
deploymentType: "bare-metal"
|
|
19
|
+
}).deploymentType).toBe("bare-metal");
|
|
20
|
+
});
|
|
21
|
+
require_vi_2VT5v0um.it("passes through current version unchanged", () => {
|
|
22
|
+
const current = {
|
|
23
|
+
configVersion: require_migrations.CURRENT_CONFIG_VERSION,
|
|
24
|
+
projectName: "test"
|
|
25
|
+
};
|
|
26
|
+
require_vi_2VT5v0um.globalExpect(require_migrations.migrateConfig(current)).toEqual(current);
|
|
27
|
+
});
|
|
28
|
+
require_vi_2VT5v0um.it("needsMigration returns true for old configs", () => {
|
|
29
|
+
require_vi_2VT5v0um.globalExpect(require_migrations.needsMigration({ configVersion: 1 })).toBe(true);
|
|
30
|
+
require_vi_2VT5v0um.globalExpect(require_migrations.needsMigration({})).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
require_vi_2VT5v0um.it("needsMigration returns false for current configs", () => {
|
|
33
|
+
require_vi_2VT5v0um.globalExpect(require_migrations.needsMigration({ configVersion: require_migrations.CURRENT_CONFIG_VERSION })).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
require_vi_2VT5v0um.it("throws for unknown version with no migration path", () => {
|
|
36
|
+
require_vi_2VT5v0um.globalExpect(() => require_migrations.migrateConfig({ configVersion: 99 })).toThrow("No migration path");
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
//# sourceMappingURL=migrations.test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.test.cjs","names":["describe","migrateConfig","CURRENT_CONFIG_VERSION","needsMigration"],"sources":["../src/migrations.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { CURRENT_CONFIG_VERSION, migrateConfig, needsMigration } from \"./migrations.js\";\n\ndescribe(\"config migrations\", () => {\n\tit(\"migrates v1 config to current version\", () => {\n\t\tconst v1 = { projectName: \"test\", services: [\"redis\"], skillPacks: [] };\n\t\tconst result = migrateConfig(v1);\n\t\texpect(result.configVersion).toBe(CURRENT_CONFIG_VERSION);\n\t\texpect(result.deploymentType).toBe(\"docker\");\n\t});\n\n\tit(\"preserves existing deploymentType during migration\", () => {\n\t\tconst v1 = { configVersion: 1, deploymentType: \"bare-metal\" };\n\t\tconst result = migrateConfig(v1);\n\t\texpect(result.deploymentType).toBe(\"bare-metal\");\n\t});\n\n\tit(\"passes through current version unchanged\", () => {\n\t\tconst current = { configVersion: CURRENT_CONFIG_VERSION, projectName: \"test\" };\n\t\tconst result = migrateConfig(current);\n\t\texpect(result).toEqual(current);\n\t});\n\n\tit(\"needsMigration returns true for old configs\", () => {\n\t\texpect(needsMigration({ configVersion: 1 })).toBe(true);\n\t\texpect(needsMigration({})).toBe(true); // no version = v1\n\t});\n\n\tit(\"needsMigration returns false for current configs\", () => {\n\t\texpect(needsMigration({ configVersion: CURRENT_CONFIG_VERSION })).toBe(false);\n\t});\n\n\tit(\"throws for unknown version with no migration path\", () => {\n\t\texpect(() => migrateConfig({ configVersion: 99 })).toThrow(\"No migration path\");\n\t});\n});\n"],"mappings":";;;;AAGAA,6BAAS,2BAA2B;AACnC,wBAAG,+CAA+C;EAEjD,MAAM,SAASC,iCADJ;GAAE,aAAa;GAAQ,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CACvC;AAChC,mCAAO,OAAO,cAAc,CAAC,KAAKC,0CAAuB;AACzD,mCAAO,OAAO,eAAe,CAAC,KAAK,SAAS;GAC3C;AAEF,wBAAG,4DAA4D;AAG9D,mCADeD,iCADJ;GAAE,eAAe;GAAG,gBAAgB;GAAc,CAC7B,CAClB,eAAe,CAAC,KAAK,aAAa;GAC/C;AAEF,wBAAG,kDAAkD;EACpD,MAAM,UAAU;GAAE,eAAeC;GAAwB,aAAa;GAAQ;AAE9E,mCADeD,iCAAc,QAAQ,CACvB,CAAC,QAAQ,QAAQ;GAC9B;AAEF,wBAAG,qDAAqD;AACvD,mCAAOE,kCAAe,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK;AACvD,mCAAOA,kCAAe,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK;GACpC;AAEF,wBAAG,0DAA0D;AAC5D,mCAAOA,kCAAe,EAAE,eAAeD,2CAAwB,CAAC,CAAC,CAAC,KAAK,MAAM;GAC5E;AAEF,wBAAG,2DAA2D;AAC7D,yCAAaD,iCAAc,EAAE,eAAe,IAAI,CAAC,CAAC,CAAC,QAAQ,oBAAoB;GAC9E;EACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/migrations.test.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-CFyDIn0m.mjs";
|
|
2
2
|
import { CURRENT_CONFIG_VERSION, migrateConfig, needsMigration } from "./migrations.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/migrations.test.ts
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/port-scanner.ts
|
|
4
|
+
/**
|
|
5
|
+
* Check if a port is available using a two-phase approach:
|
|
6
|
+
* 1. TCP connect — detects if something is already listening
|
|
7
|
+
* 2. Bind check — detects OS-reserved/excluded port ranges (e.g. Hyper-V on Windows)
|
|
8
|
+
*
|
|
9
|
+
* The connect-only approach misses Windows excluded port ranges because
|
|
10
|
+
* ECONNREFUSED (nothing listening) looks the same as "available" even though
|
|
11
|
+
* Docker's bind() will fail on those reserved ranges.
|
|
12
|
+
*/
|
|
13
|
+
async function isPortAvailable(port) {
|
|
14
|
+
try {
|
|
15
|
+
const net = await import("node:net");
|
|
16
|
+
if (await new Promise((resolve) => {
|
|
17
|
+
const socket = new net.Socket();
|
|
18
|
+
let resolved = false;
|
|
19
|
+
const cleanup = () => {
|
|
20
|
+
if (!resolved) {
|
|
21
|
+
resolved = true;
|
|
22
|
+
socket.removeAllListeners();
|
|
23
|
+
socket.destroy();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
socket.once("connect", () => {
|
|
27
|
+
cleanup();
|
|
28
|
+
resolve(true);
|
|
29
|
+
});
|
|
30
|
+
socket.once("error", () => {
|
|
31
|
+
cleanup();
|
|
32
|
+
resolve(false);
|
|
33
|
+
});
|
|
34
|
+
socket.setTimeout(500);
|
|
35
|
+
socket.once("timeout", () => {
|
|
36
|
+
cleanup();
|
|
37
|
+
resolve(false);
|
|
38
|
+
});
|
|
39
|
+
socket.connect(port, "127.0.0.1");
|
|
40
|
+
})) return false;
|
|
41
|
+
return await new Promise((resolve) => {
|
|
42
|
+
const server = net.createServer();
|
|
43
|
+
server.once("error", (err) => {
|
|
44
|
+
resolve(false);
|
|
45
|
+
});
|
|
46
|
+
server.listen(port, "0.0.0.0", () => {
|
|
47
|
+
server.close(() => resolve(true));
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.warn(`Port scanner error for port ${port}:`, error);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Find next available port starting from a base port.
|
|
57
|
+
* Also skips ports already claimed by other services in this generation.
|
|
58
|
+
*/
|
|
59
|
+
async function findNextAvailablePort(startPort, claimedPorts, maxAttempts = 100) {
|
|
60
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
61
|
+
const port = startPort + i;
|
|
62
|
+
if (port > 65535) break;
|
|
63
|
+
if (claimedPorts.has(port)) continue;
|
|
64
|
+
if (await isPortAvailable(port)) return port;
|
|
65
|
+
}
|
|
66
|
+
return 5e4 + Math.floor(Math.random() * 1e4);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Scan for port conflicts and suggest alternatives.
|
|
70
|
+
*
|
|
71
|
+
* Detects two types of conflicts:
|
|
72
|
+
* 1. Host conflicts — port is already in use or reserved by the OS
|
|
73
|
+
* 2. Inter-service conflicts — multiple selected services claim the same host port
|
|
74
|
+
*/
|
|
75
|
+
async function scanPortConflicts(services) {
|
|
76
|
+
const portReassignments = /* @__PURE__ */ new Map();
|
|
77
|
+
const claimedPorts = /* @__PURE__ */ new Map();
|
|
78
|
+
for (const service of services) {
|
|
79
|
+
if (!service.ports || service.ports.length === 0) continue;
|
|
80
|
+
const serviceReassignments = /* @__PURE__ */ new Map();
|
|
81
|
+
for (const portDef of service.ports) {
|
|
82
|
+
if (!portDef.exposed) continue;
|
|
83
|
+
const port = portDef.host;
|
|
84
|
+
const claimedBy = claimedPorts.get(port);
|
|
85
|
+
if (claimedBy && claimedBy !== service.id) {
|
|
86
|
+
const newPort = await findNextAvailablePort(port + 1e3, new Set(claimedPorts.keys()));
|
|
87
|
+
serviceReassignments.set(port, newPort);
|
|
88
|
+
claimedPorts.set(newPort, service.id);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (!await isPortAvailable(port)) {
|
|
92
|
+
const newPort = await findNextAvailablePort(port + 1e3, new Set(claimedPorts.keys()));
|
|
93
|
+
serviceReassignments.set(port, newPort);
|
|
94
|
+
claimedPorts.set(newPort, service.id);
|
|
95
|
+
} else claimedPorts.set(port, service.id);
|
|
96
|
+
}
|
|
97
|
+
if (serviceReassignments.size > 0) portReassignments.set(service.id, serviceReassignments);
|
|
98
|
+
}
|
|
99
|
+
return portReassignments;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get conflicts in a user-friendly format
|
|
103
|
+
*/
|
|
104
|
+
function formatPortConflicts(services, reassignments) {
|
|
105
|
+
const conflicts = [];
|
|
106
|
+
for (const service of services) {
|
|
107
|
+
const serviceReassignments = reassignments.get(service.id);
|
|
108
|
+
if (!serviceReassignments) continue;
|
|
109
|
+
for (const portDef of service.ports || []) {
|
|
110
|
+
const newPort = serviceReassignments.get(portDef.host);
|
|
111
|
+
if (newPort) conflicts.push({
|
|
112
|
+
port: portDef.host,
|
|
113
|
+
serviceId: service.id,
|
|
114
|
+
description: portDef.description || `${service.name} port`,
|
|
115
|
+
suggestedPort: newPort
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return conflicts;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
//#endregion
|
|
123
|
+
exports.formatPortConflicts = formatPortConflicts;
|
|
124
|
+
exports.scanPortConflicts = scanPortConflicts;
|
|
125
|
+
//# sourceMappingURL=port-scanner.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-scanner.cjs","names":[],"sources":["../src/port-scanner.ts"],"sourcesContent":["import type { ServiceDefinition } from \"./types.js\";\n\n/**\n * Scans system for ports in use and suggests alternatives for conflicts\n */\nexport interface PortConflict {\n\tport: number;\n\tserviceId: string;\n\tdescription: string;\n\tsuggestedPort: number;\n}\n\n/**\n * Check if a port is available using a two-phase approach:\n * 1. TCP connect — detects if something is already listening\n * 2. Bind check — detects OS-reserved/excluded port ranges (e.g. Hyper-V on Windows)\n *\n * The connect-only approach misses Windows excluded port ranges because\n * ECONNREFUSED (nothing listening) looks the same as \"available\" even though\n * Docker's bind() will fail on those reserved ranges.\n */\nasync function isPortAvailable(port: number): Promise<boolean> {\n\ttry {\n\t\tconst net = await import(\"node:net\");\n\n\t\t// Phase 1: TCP connect check — is something actively listening?\n\t\tconst isListening = await new Promise<boolean>((resolve) => {\n\t\t\tconst socket = new net.Socket();\n\t\t\tlet resolved = false;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tsocket.removeAllListeners();\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tsocket.once(\"connect\", () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(true);\n\t\t\t});\n\n\t\t\tsocket.once(\"error\", () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(false);\n\t\t\t});\n\n\t\t\tsocket.setTimeout(500);\n\t\t\tsocket.once(\"timeout\", () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(false);\n\t\t\t});\n\n\t\t\tsocket.connect(port, \"127.0.0.1\");\n\t\t});\n\n\t\tif (isListening) return false; // Port is in use\n\n\t\t// Phase 2: Bind check — catches OS-reserved/excluded port ranges\n\t\t// On Windows, Hyper-V/WSL reserve dynamic port ranges that TCP connect\n\t\t// cannot detect. Attempting to bind reveals these reservations.\n\t\tconst canBind = await new Promise<boolean>((resolve) => {\n\t\t\tconst server = net.createServer();\n\n\t\t\tserver.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\t// EACCES / EADDRINUSE / EPERM = port is reserved or in use\n\t\t\t\tresolve(false);\n\t\t\t});\n\n\t\t\tserver.listen(port, \"0.0.0.0\", () => {\n\t\t\t\t// Successfully bound — port is truly available\n\t\t\t\tserver.close(() => resolve(true));\n\t\t\t});\n\t\t});\n\n\t\treturn canBind;\n\t} catch (error) {\n\t\tconsole.warn(`Port scanner error for port ${port}:`, error);\n\t\treturn true; // Failsafe: assume available\n\t}\n}\n\n/**\n * Find next available port starting from a base port.\n * Also skips ports already claimed by other services in this generation.\n */\nasync function findNextAvailablePort(\n\tstartPort: number,\n\tclaimedPorts: Set<number>,\n\tmaxAttempts = 100,\n): Promise<number> {\n\tfor (let i = 0; i < maxAttempts; i++) {\n\t\tconst port = startPort + i;\n\t\tif (port > 65535) break;\n\t\tif (claimedPorts.has(port)) continue;\n\t\tif (await isPortAvailable(port)) {\n\t\t\treturn port;\n\t\t}\n\t}\n\t// Fallback: return a high random port\n\treturn 50000 + Math.floor(Math.random() * 10000);\n}\n\n/**\n * Scan for port conflicts and suggest alternatives.\n *\n * Detects two types of conflicts:\n * 1. Host conflicts — port is already in use or reserved by the OS\n * 2. Inter-service conflicts — multiple selected services claim the same host port\n */\nexport async function scanPortConflicts(\n\tservices: ServiceDefinition[],\n): Promise<Map<string, Map<number, number>>> {\n\tconst portReassignments = new Map<string, Map<number, number>>();\n\n\t// Track which host ports are already claimed by services in this stack.\n\t// First service to claim a port wins; subsequent services get reassigned.\n\tconst claimedPorts = new Map<number, string>(); // port → serviceId that claimed it\n\n\tfor (const service of services) {\n\t\tif (!service.ports || service.ports.length === 0) continue;\n\n\t\tconst serviceReassignments = new Map<number, number>();\n\n\t\tfor (const portDef of service.ports) {\n\t\t\tif (!portDef.exposed) continue;\n\n\t\t\tconst port = portDef.host;\n\n\t\t\t// Check inter-service conflict first\n\t\t\tconst claimedBy = claimedPorts.get(port);\n\t\t\tif (claimedBy && claimedBy !== service.id) {\n\t\t\t\t// Another service already claimed this port — must reassign\n\t\t\t\tconst newPort = await findNextAvailablePort(port + 1000, new Set(claimedPorts.keys()));\n\t\t\t\tserviceReassignments.set(port, newPort);\n\t\t\t\tclaimedPorts.set(newPort, service.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check host availability (TCP connect + bind check)\n\t\t\tconst isAvailable = await isPortAvailable(port);\n\n\t\t\tif (!isAvailable) {\n\t\t\t\tconst newPort = await findNextAvailablePort(port + 1000, new Set(claimedPorts.keys()));\n\t\t\t\tserviceReassignments.set(port, newPort);\n\t\t\t\tclaimedPorts.set(newPort, service.id);\n\t\t\t} else {\n\t\t\t\t// Port is available and not claimed — claim it\n\t\t\t\tclaimedPorts.set(port, service.id);\n\t\t\t}\n\t\t}\n\n\t\tif (serviceReassignments.size > 0) {\n\t\t\tportReassignments.set(service.id, serviceReassignments);\n\t\t}\n\t}\n\n\treturn portReassignments;\n}\n\n/**\n * Get conflicts in a user-friendly format\n */\nexport function formatPortConflicts(\n\tservices: ServiceDefinition[],\n\treassignments: Map<string, Map<number, number>>,\n): PortConflict[] {\n\tconst conflicts: PortConflict[] = [];\n\n\tfor (const service of services) {\n\t\tconst serviceReassignments = reassignments.get(service.id);\n\t\tif (!serviceReassignments) continue;\n\n\t\tfor (const portDef of service.ports || []) {\n\t\t\tconst newPort = serviceReassignments.get(portDef.host);\n\t\t\tif (newPort) {\n\t\t\t\tconflicts.push({\n\t\t\t\t\tport: portDef.host,\n\t\t\t\t\tserviceId: service.id,\n\t\t\t\t\tdescription: portDef.description || `${service.name} port`,\n\t\t\t\t\tsuggestedPort: newPort,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn conflicts;\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,eAAe,gBAAgB,MAAgC;AAC9D,KAAI;EACH,MAAM,MAAM,MAAM,OAAO;AAkCzB,MA/BoB,MAAM,IAAI,SAAkB,YAAY;GAC3D,MAAM,SAAS,IAAI,IAAI,QAAQ;GAC/B,IAAI,WAAW;GAEf,MAAM,gBAAgB;AACrB,QAAI,CAAC,UAAU;AACd,gBAAW;AACX,YAAO,oBAAoB;AAC3B,YAAO,SAAS;;;AAIlB,UAAO,KAAK,iBAAiB;AAC5B,aAAS;AACT,YAAQ,KAAK;KACZ;AAEF,UAAO,KAAK,eAAe;AAC1B,aAAS;AACT,YAAQ,MAAM;KACb;AAEF,UAAO,WAAW,IAAI;AACtB,UAAO,KAAK,iBAAiB;AAC5B,aAAS;AACT,YAAQ,MAAM;KACb;AAEF,UAAO,QAAQ,MAAM,YAAY;IAChC,CAEe,QAAO;AAmBxB,SAdgB,MAAM,IAAI,SAAkB,YAAY;GACvD,MAAM,SAAS,IAAI,cAAc;AAEjC,UAAO,KAAK,UAAU,QAA+B;AAEpD,YAAQ,MAAM;KACb;AAEF,UAAO,OAAO,MAAM,iBAAiB;AAEpC,WAAO,YAAY,QAAQ,KAAK,CAAC;KAChC;IACD;UAGM,OAAO;AACf,UAAQ,KAAK,+BAA+B,KAAK,IAAI,MAAM;AAC3D,SAAO;;;;;;;AAQT,eAAe,sBACd,WACA,cACA,cAAc,KACI;AAClB,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,KAAK;EACrC,MAAM,OAAO,YAAY;AACzB,MAAI,OAAO,MAAO;AAClB,MAAI,aAAa,IAAI,KAAK,CAAE;AAC5B,MAAI,MAAM,gBAAgB,KAAK,CAC9B,QAAO;;AAIT,QAAO,MAAQ,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAM;;;;;;;;;AAUjD,eAAsB,kBACrB,UAC4C;CAC5C,MAAM,oCAAoB,IAAI,KAAkC;CAIhE,MAAM,+BAAe,IAAI,KAAqB;AAE9C,MAAK,MAAM,WAAW,UAAU;AAC/B,MAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,WAAW,EAAG;EAElD,MAAM,uCAAuB,IAAI,KAAqB;AAEtD,OAAK,MAAM,WAAW,QAAQ,OAAO;AACpC,OAAI,CAAC,QAAQ,QAAS;GAEtB,MAAM,OAAO,QAAQ;GAGrB,MAAM,YAAY,aAAa,IAAI,KAAK;AACxC,OAAI,aAAa,cAAc,QAAQ,IAAI;IAE1C,MAAM,UAAU,MAAM,sBAAsB,OAAO,KAAM,IAAI,IAAI,aAAa,MAAM,CAAC,CAAC;AACtF,yBAAqB,IAAI,MAAM,QAAQ;AACvC,iBAAa,IAAI,SAAS,QAAQ,GAAG;AACrC;;AAMD,OAAI,CAFgB,MAAM,gBAAgB,KAAK,EAE7B;IACjB,MAAM,UAAU,MAAM,sBAAsB,OAAO,KAAM,IAAI,IAAI,aAAa,MAAM,CAAC,CAAC;AACtF,yBAAqB,IAAI,MAAM,QAAQ;AACvC,iBAAa,IAAI,SAAS,QAAQ,GAAG;SAGrC,cAAa,IAAI,MAAM,QAAQ,GAAG;;AAIpC,MAAI,qBAAqB,OAAO,EAC/B,mBAAkB,IAAI,QAAQ,IAAI,qBAAqB;;AAIzD,QAAO;;;;;AAMR,SAAgB,oBACf,UACA,eACiB;CACjB,MAAM,YAA4B,EAAE;AAEpC,MAAK,MAAM,WAAW,UAAU;EAC/B,MAAM,uBAAuB,cAAc,IAAI,QAAQ,GAAG;AAC1D,MAAI,CAAC,qBAAsB;AAE3B,OAAK,MAAM,WAAW,QAAQ,SAAS,EAAE,EAAE;GAC1C,MAAM,UAAU,qBAAqB,IAAI,QAAQ,KAAK;AACtD,OAAI,QACH,WAAU,KAAK;IACd,MAAM,QAAQ;IACd,WAAW,QAAQ;IACnB,aAAa,QAAQ,eAAe,GAAG,QAAQ,KAAK;IACpD,eAAe;IACf,CAAC;;;AAKL,QAAO"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ServiceDefinition } from "./types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/port-scanner.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Scans system for ports in use and suggests alternatives for conflicts
|
|
6
|
+
*/
|
|
7
|
+
interface PortConflict {
|
|
8
|
+
port: number;
|
|
9
|
+
serviceId: string;
|
|
10
|
+
description: string;
|
|
11
|
+
suggestedPort: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Scan for port conflicts and suggest alternatives.
|
|
15
|
+
*
|
|
16
|
+
* Detects two types of conflicts:
|
|
17
|
+
* 1. Host conflicts — port is already in use or reserved by the OS
|
|
18
|
+
* 2. Inter-service conflicts — multiple selected services claim the same host port
|
|
19
|
+
*/
|
|
20
|
+
declare function scanPortConflicts(services: ServiceDefinition[]): Promise<Map<string, Map<number, number>>>;
|
|
21
|
+
/**
|
|
22
|
+
* Get conflicts in a user-friendly format
|
|
23
|
+
*/
|
|
24
|
+
declare function formatPortConflicts(services: ServiceDefinition[], reassignments: Map<string, Map<number, number>>): PortConflict[];
|
|
25
|
+
//#endregion
|
|
26
|
+
export { PortConflict, formatPortConflicts, scanPortConflicts };
|
|
27
|
+
//# sourceMappingURL=port-scanner.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-scanner.d.cts","names":[],"sources":["../src/port-scanner.ts"],"mappings":";;;;;AAKA;UAAiB,YAAA;EAChB,IAAA;EACA,SAAA;EACA,WAAA;EACA,aAAA;AAAA;;;;AAsGD;;;;iBAAsB,iBAAA,CACrB,QAAA,EAAU,iBAAA,KACR,OAAA,CAAQ,GAAA,SAAY,GAAA;;;;iBAmDP,mBAAA,CACf,QAAA,EAAU,iBAAA,IACV,aAAA,EAAe,GAAA,SAAY,GAAA,oBACzB,YAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ServiceDefinition } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/port-scanner.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Scans system for ports in use and suggests alternatives for conflicts
|
|
6
|
+
*/
|
|
7
|
+
interface PortConflict {
|
|
8
|
+
port: number;
|
|
9
|
+
serviceId: string;
|
|
10
|
+
description: string;
|
|
11
|
+
suggestedPort: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Scan for port conflicts and suggest alternatives.
|
|
15
|
+
*
|
|
16
|
+
* Detects two types of conflicts:
|
|
17
|
+
* 1. Host conflicts — port is already in use or reserved by the OS
|
|
18
|
+
* 2. Inter-service conflicts — multiple selected services claim the same host port
|
|
19
|
+
*/
|
|
20
|
+
declare function scanPortConflicts(services: ServiceDefinition[]): Promise<Map<string, Map<number, number>>>;
|
|
21
|
+
/**
|
|
22
|
+
* Get conflicts in a user-friendly format
|
|
23
|
+
*/
|
|
24
|
+
declare function formatPortConflicts(services: ServiceDefinition[], reassignments: Map<string, Map<number, number>>): PortConflict[];
|
|
25
|
+
//#endregion
|
|
26
|
+
export { PortConflict, formatPortConflicts, scanPortConflicts };
|
|
27
|
+
//# sourceMappingURL=port-scanner.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-scanner.d.mts","names":[],"sources":["../src/port-scanner.ts"],"mappings":";;;;;AAKA;UAAiB,YAAA;EAChB,IAAA;EACA,SAAA;EACA,WAAA;EACA,aAAA;AAAA;;;;AAsGD;;;;iBAAsB,iBAAA,CACrB,QAAA,EAAU,iBAAA,KACR,OAAA,CAAQ,GAAA,SAAY,GAAA;;;;iBAmDP,mBAAA,CACf,QAAA,EAAU,iBAAA,IACV,aAAA,EAAe,GAAA,SAAY,GAAA,oBACzB,YAAA"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
//#region src/port-scanner.ts
|
|
2
|
+
/**
|
|
3
|
+
* Check if a port is available using a two-phase approach:
|
|
4
|
+
* 1. TCP connect — detects if something is already listening
|
|
5
|
+
* 2. Bind check — detects OS-reserved/excluded port ranges (e.g. Hyper-V on Windows)
|
|
6
|
+
*
|
|
7
|
+
* The connect-only approach misses Windows excluded port ranges because
|
|
8
|
+
* ECONNREFUSED (nothing listening) looks the same as "available" even though
|
|
9
|
+
* Docker's bind() will fail on those reserved ranges.
|
|
10
|
+
*/
|
|
11
|
+
async function isPortAvailable(port) {
|
|
12
|
+
try {
|
|
13
|
+
const net = await import("node:net");
|
|
14
|
+
if (await new Promise((resolve) => {
|
|
15
|
+
const socket = new net.Socket();
|
|
16
|
+
let resolved = false;
|
|
17
|
+
const cleanup = () => {
|
|
18
|
+
if (!resolved) {
|
|
19
|
+
resolved = true;
|
|
20
|
+
socket.removeAllListeners();
|
|
21
|
+
socket.destroy();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
socket.once("connect", () => {
|
|
25
|
+
cleanup();
|
|
26
|
+
resolve(true);
|
|
27
|
+
});
|
|
28
|
+
socket.once("error", () => {
|
|
29
|
+
cleanup();
|
|
30
|
+
resolve(false);
|
|
31
|
+
});
|
|
32
|
+
socket.setTimeout(500);
|
|
33
|
+
socket.once("timeout", () => {
|
|
34
|
+
cleanup();
|
|
35
|
+
resolve(false);
|
|
36
|
+
});
|
|
37
|
+
socket.connect(port, "127.0.0.1");
|
|
38
|
+
})) return false;
|
|
39
|
+
return await new Promise((resolve) => {
|
|
40
|
+
const server = net.createServer();
|
|
41
|
+
server.once("error", (err) => {
|
|
42
|
+
resolve(false);
|
|
43
|
+
});
|
|
44
|
+
server.listen(port, "0.0.0.0", () => {
|
|
45
|
+
server.close(() => resolve(true));
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.warn(`Port scanner error for port ${port}:`, error);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Find next available port starting from a base port.
|
|
55
|
+
* Also skips ports already claimed by other services in this generation.
|
|
56
|
+
*/
|
|
57
|
+
async function findNextAvailablePort(startPort, claimedPorts, maxAttempts = 100) {
|
|
58
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
59
|
+
const port = startPort + i;
|
|
60
|
+
if (port > 65535) break;
|
|
61
|
+
if (claimedPorts.has(port)) continue;
|
|
62
|
+
if (await isPortAvailable(port)) return port;
|
|
63
|
+
}
|
|
64
|
+
return 5e4 + Math.floor(Math.random() * 1e4);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Scan for port conflicts and suggest alternatives.
|
|
68
|
+
*
|
|
69
|
+
* Detects two types of conflicts:
|
|
70
|
+
* 1. Host conflicts — port is already in use or reserved by the OS
|
|
71
|
+
* 2. Inter-service conflicts — multiple selected services claim the same host port
|
|
72
|
+
*/
|
|
73
|
+
async function scanPortConflicts(services) {
|
|
74
|
+
const portReassignments = /* @__PURE__ */ new Map();
|
|
75
|
+
const claimedPorts = /* @__PURE__ */ new Map();
|
|
76
|
+
for (const service of services) {
|
|
77
|
+
if (!service.ports || service.ports.length === 0) continue;
|
|
78
|
+
const serviceReassignments = /* @__PURE__ */ new Map();
|
|
79
|
+
for (const portDef of service.ports) {
|
|
80
|
+
if (!portDef.exposed) continue;
|
|
81
|
+
const port = portDef.host;
|
|
82
|
+
const claimedBy = claimedPorts.get(port);
|
|
83
|
+
if (claimedBy && claimedBy !== service.id) {
|
|
84
|
+
const newPort = await findNextAvailablePort(port + 1e3, new Set(claimedPorts.keys()));
|
|
85
|
+
serviceReassignments.set(port, newPort);
|
|
86
|
+
claimedPorts.set(newPort, service.id);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (!await isPortAvailable(port)) {
|
|
90
|
+
const newPort = await findNextAvailablePort(port + 1e3, new Set(claimedPorts.keys()));
|
|
91
|
+
serviceReassignments.set(port, newPort);
|
|
92
|
+
claimedPorts.set(newPort, service.id);
|
|
93
|
+
} else claimedPorts.set(port, service.id);
|
|
94
|
+
}
|
|
95
|
+
if (serviceReassignments.size > 0) portReassignments.set(service.id, serviceReassignments);
|
|
96
|
+
}
|
|
97
|
+
return portReassignments;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get conflicts in a user-friendly format
|
|
101
|
+
*/
|
|
102
|
+
function formatPortConflicts(services, reassignments) {
|
|
103
|
+
const conflicts = [];
|
|
104
|
+
for (const service of services) {
|
|
105
|
+
const serviceReassignments = reassignments.get(service.id);
|
|
106
|
+
if (!serviceReassignments) continue;
|
|
107
|
+
for (const portDef of service.ports || []) {
|
|
108
|
+
const newPort = serviceReassignments.get(portDef.host);
|
|
109
|
+
if (newPort) conflicts.push({
|
|
110
|
+
port: portDef.host,
|
|
111
|
+
serviceId: service.id,
|
|
112
|
+
description: portDef.description || `${service.name} port`,
|
|
113
|
+
suggestedPort: newPort
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return conflicts;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//#endregion
|
|
121
|
+
export { formatPortConflicts, scanPortConflicts };
|
|
122
|
+
//# sourceMappingURL=port-scanner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-scanner.mjs","names":[],"sources":["../src/port-scanner.ts"],"sourcesContent":["import type { ServiceDefinition } from \"./types.js\";\n\n/**\n * Scans system for ports in use and suggests alternatives for conflicts\n */\nexport interface PortConflict {\n\tport: number;\n\tserviceId: string;\n\tdescription: string;\n\tsuggestedPort: number;\n}\n\n/**\n * Check if a port is available using a two-phase approach:\n * 1. TCP connect — detects if something is already listening\n * 2. Bind check — detects OS-reserved/excluded port ranges (e.g. Hyper-V on Windows)\n *\n * The connect-only approach misses Windows excluded port ranges because\n * ECONNREFUSED (nothing listening) looks the same as \"available\" even though\n * Docker's bind() will fail on those reserved ranges.\n */\nasync function isPortAvailable(port: number): Promise<boolean> {\n\ttry {\n\t\tconst net = await import(\"node:net\");\n\n\t\t// Phase 1: TCP connect check — is something actively listening?\n\t\tconst isListening = await new Promise<boolean>((resolve) => {\n\t\t\tconst socket = new net.Socket();\n\t\t\tlet resolved = false;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tsocket.removeAllListeners();\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tsocket.once(\"connect\", () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(true);\n\t\t\t});\n\n\t\t\tsocket.once(\"error\", () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(false);\n\t\t\t});\n\n\t\t\tsocket.setTimeout(500);\n\t\t\tsocket.once(\"timeout\", () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(false);\n\t\t\t});\n\n\t\t\tsocket.connect(port, \"127.0.0.1\");\n\t\t});\n\n\t\tif (isListening) return false; // Port is in use\n\n\t\t// Phase 2: Bind check — catches OS-reserved/excluded port ranges\n\t\t// On Windows, Hyper-V/WSL reserve dynamic port ranges that TCP connect\n\t\t// cannot detect. Attempting to bind reveals these reservations.\n\t\tconst canBind = await new Promise<boolean>((resolve) => {\n\t\t\tconst server = net.createServer();\n\n\t\t\tserver.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\t// EACCES / EADDRINUSE / EPERM = port is reserved or in use\n\t\t\t\tresolve(false);\n\t\t\t});\n\n\t\t\tserver.listen(port, \"0.0.0.0\", () => {\n\t\t\t\t// Successfully bound — port is truly available\n\t\t\t\tserver.close(() => resolve(true));\n\t\t\t});\n\t\t});\n\n\t\treturn canBind;\n\t} catch (error) {\n\t\tconsole.warn(`Port scanner error for port ${port}:`, error);\n\t\treturn true; // Failsafe: assume available\n\t}\n}\n\n/**\n * Find next available port starting from a base port.\n * Also skips ports already claimed by other services in this generation.\n */\nasync function findNextAvailablePort(\n\tstartPort: number,\n\tclaimedPorts: Set<number>,\n\tmaxAttempts = 100,\n): Promise<number> {\n\tfor (let i = 0; i < maxAttempts; i++) {\n\t\tconst port = startPort + i;\n\t\tif (port > 65535) break;\n\t\tif (claimedPorts.has(port)) continue;\n\t\tif (await isPortAvailable(port)) {\n\t\t\treturn port;\n\t\t}\n\t}\n\t// Fallback: return a high random port\n\treturn 50000 + Math.floor(Math.random() * 10000);\n}\n\n/**\n * Scan for port conflicts and suggest alternatives.\n *\n * Detects two types of conflicts:\n * 1. Host conflicts — port is already in use or reserved by the OS\n * 2. Inter-service conflicts — multiple selected services claim the same host port\n */\nexport async function scanPortConflicts(\n\tservices: ServiceDefinition[],\n): Promise<Map<string, Map<number, number>>> {\n\tconst portReassignments = new Map<string, Map<number, number>>();\n\n\t// Track which host ports are already claimed by services in this stack.\n\t// First service to claim a port wins; subsequent services get reassigned.\n\tconst claimedPorts = new Map<number, string>(); // port → serviceId that claimed it\n\n\tfor (const service of services) {\n\t\tif (!service.ports || service.ports.length === 0) continue;\n\n\t\tconst serviceReassignments = new Map<number, number>();\n\n\t\tfor (const portDef of service.ports) {\n\t\t\tif (!portDef.exposed) continue;\n\n\t\t\tconst port = portDef.host;\n\n\t\t\t// Check inter-service conflict first\n\t\t\tconst claimedBy = claimedPorts.get(port);\n\t\t\tif (claimedBy && claimedBy !== service.id) {\n\t\t\t\t// Another service already claimed this port — must reassign\n\t\t\t\tconst newPort = await findNextAvailablePort(port + 1000, new Set(claimedPorts.keys()));\n\t\t\t\tserviceReassignments.set(port, newPort);\n\t\t\t\tclaimedPorts.set(newPort, service.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check host availability (TCP connect + bind check)\n\t\t\tconst isAvailable = await isPortAvailable(port);\n\n\t\t\tif (!isAvailable) {\n\t\t\t\tconst newPort = await findNextAvailablePort(port + 1000, new Set(claimedPorts.keys()));\n\t\t\t\tserviceReassignments.set(port, newPort);\n\t\t\t\tclaimedPorts.set(newPort, service.id);\n\t\t\t} else {\n\t\t\t\t// Port is available and not claimed — claim it\n\t\t\t\tclaimedPorts.set(port, service.id);\n\t\t\t}\n\t\t}\n\n\t\tif (serviceReassignments.size > 0) {\n\t\t\tportReassignments.set(service.id, serviceReassignments);\n\t\t}\n\t}\n\n\treturn portReassignments;\n}\n\n/**\n * Get conflicts in a user-friendly format\n */\nexport function formatPortConflicts(\n\tservices: ServiceDefinition[],\n\treassignments: Map<string, Map<number, number>>,\n): PortConflict[] {\n\tconst conflicts: PortConflict[] = [];\n\n\tfor (const service of services) {\n\t\tconst serviceReassignments = reassignments.get(service.id);\n\t\tif (!serviceReassignments) continue;\n\n\t\tfor (const portDef of service.ports || []) {\n\t\t\tconst newPort = serviceReassignments.get(portDef.host);\n\t\t\tif (newPort) {\n\t\t\t\tconflicts.push({\n\t\t\t\t\tport: portDef.host,\n\t\t\t\t\tserviceId: service.id,\n\t\t\t\t\tdescription: portDef.description || `${service.name} port`,\n\t\t\t\t\tsuggestedPort: newPort,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn conflicts;\n}\n"],"mappings":";;;;;;;;;;AAqBA,eAAe,gBAAgB,MAAgC;AAC9D,KAAI;EACH,MAAM,MAAM,MAAM,OAAO;AAkCzB,MA/BoB,MAAM,IAAI,SAAkB,YAAY;GAC3D,MAAM,SAAS,IAAI,IAAI,QAAQ;GAC/B,IAAI,WAAW;GAEf,MAAM,gBAAgB;AACrB,QAAI,CAAC,UAAU;AACd,gBAAW;AACX,YAAO,oBAAoB;AAC3B,YAAO,SAAS;;;AAIlB,UAAO,KAAK,iBAAiB;AAC5B,aAAS;AACT,YAAQ,KAAK;KACZ;AAEF,UAAO,KAAK,eAAe;AAC1B,aAAS;AACT,YAAQ,MAAM;KACb;AAEF,UAAO,WAAW,IAAI;AACtB,UAAO,KAAK,iBAAiB;AAC5B,aAAS;AACT,YAAQ,MAAM;KACb;AAEF,UAAO,QAAQ,MAAM,YAAY;IAChC,CAEe,QAAO;AAmBxB,SAdgB,MAAM,IAAI,SAAkB,YAAY;GACvD,MAAM,SAAS,IAAI,cAAc;AAEjC,UAAO,KAAK,UAAU,QAA+B;AAEpD,YAAQ,MAAM;KACb;AAEF,UAAO,OAAO,MAAM,iBAAiB;AAEpC,WAAO,YAAY,QAAQ,KAAK,CAAC;KAChC;IACD;UAGM,OAAO;AACf,UAAQ,KAAK,+BAA+B,KAAK,IAAI,MAAM;AAC3D,SAAO;;;;;;;AAQT,eAAe,sBACd,WACA,cACA,cAAc,KACI;AAClB,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,KAAK;EACrC,MAAM,OAAO,YAAY;AACzB,MAAI,OAAO,MAAO;AAClB,MAAI,aAAa,IAAI,KAAK,CAAE;AAC5B,MAAI,MAAM,gBAAgB,KAAK,CAC9B,QAAO;;AAIT,QAAO,MAAQ,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAM;;;;;;;;;AAUjD,eAAsB,kBACrB,UAC4C;CAC5C,MAAM,oCAAoB,IAAI,KAAkC;CAIhE,MAAM,+BAAe,IAAI,KAAqB;AAE9C,MAAK,MAAM,WAAW,UAAU;AAC/B,MAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,WAAW,EAAG;EAElD,MAAM,uCAAuB,IAAI,KAAqB;AAEtD,OAAK,MAAM,WAAW,QAAQ,OAAO;AACpC,OAAI,CAAC,QAAQ,QAAS;GAEtB,MAAM,OAAO,QAAQ;GAGrB,MAAM,YAAY,aAAa,IAAI,KAAK;AACxC,OAAI,aAAa,cAAc,QAAQ,IAAI;IAE1C,MAAM,UAAU,MAAM,sBAAsB,OAAO,KAAM,IAAI,IAAI,aAAa,MAAM,CAAC,CAAC;AACtF,yBAAqB,IAAI,MAAM,QAAQ;AACvC,iBAAa,IAAI,SAAS,QAAQ,GAAG;AACrC;;AAMD,OAAI,CAFgB,MAAM,gBAAgB,KAAK,EAE7B;IACjB,MAAM,UAAU,MAAM,sBAAsB,OAAO,KAAM,IAAI,IAAI,aAAa,MAAM,CAAC,CAAC;AACtF,yBAAqB,IAAI,MAAM,QAAQ;AACvC,iBAAa,IAAI,SAAS,QAAQ,GAAG;SAGrC,cAAa,IAAI,MAAM,QAAQ,GAAG;;AAIpC,MAAI,qBAAqB,OAAO,EAC/B,mBAAkB,IAAI,QAAQ,IAAI,qBAAqB;;AAIzD,QAAO;;;;;AAMR,SAAgB,oBACf,UACA,eACiB;CACjB,MAAM,YAA4B,EAAE;AAEpC,MAAK,MAAM,WAAW,UAAU;EAC/B,MAAM,uBAAuB,cAAc,IAAI,QAAQ,GAAG;AAC1D,MAAI,CAAC,qBAAsB;AAE3B,OAAK,MAAM,WAAW,QAAQ,SAAS,EAAE,EAAE;GAC1C,MAAM,UAAU,qBAAqB,IAAI,QAAQ,KAAK;AACtD,OAAI,QACH,WAAU,KAAK;IACd,MAAM,QAAQ;IACd,WAAW,QAAQ;IACnB,aAAa,QAAQ,eAAe,GAAG,QAAQ,KAAK;IACpD,eAAe;IACf,CAAC;;;AAKL,QAAO"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const require_chunk = require('../chunk-C0xms8kb.cjs');
|
|
2
|
+
const require_resolver = require('../resolver.cjs');
|
|
3
|
+
const require_generate = require('../generate.cjs');
|
|
4
|
+
const require_presets_registry = require('./registry.cjs');
|
|
5
|
+
let yaml = require("yaml");
|
|
6
|
+
yaml = require_chunk.__toESM(yaml);
|
|
7
|
+
|
|
8
|
+
//#region src/presets/presets.test.ts
|
|
9
|
+
const allPresets = require_presets_registry.getAllPresets();
|
|
10
|
+
describe("preset smoke tests", () => {
|
|
11
|
+
it("all presets are defined", () => {
|
|
12
|
+
expect(allPresets.length).toBeGreaterThanOrEqual(5);
|
|
13
|
+
});
|
|
14
|
+
it("all preset IDs are unique", () => {
|
|
15
|
+
const ids = allPresets.map((p) => p.id);
|
|
16
|
+
const uniqueIds = new Set(ids);
|
|
17
|
+
expect(uniqueIds.size).toBe(ids.length);
|
|
18
|
+
});
|
|
19
|
+
for (const preset of allPresets) it(`getPresetById returns correct preset for "${preset.id}"`, () => {
|
|
20
|
+
const found = require_presets_registry.getPresetById(preset.id);
|
|
21
|
+
expect(found).toBeDefined();
|
|
22
|
+
expect(found.id).toBe(preset.id);
|
|
23
|
+
expect(found.name).toBe(preset.name);
|
|
24
|
+
expect(found.services).toEqual(preset.services);
|
|
25
|
+
expect(found.skillPacks).toEqual(preset.skillPacks);
|
|
26
|
+
});
|
|
27
|
+
for (const preset of allPresets) it(`preset "${preset.id}" generates valid configuration`, () => {
|
|
28
|
+
const result = require_generate.generate({
|
|
29
|
+
projectName: "test-project",
|
|
30
|
+
services: preset.services,
|
|
31
|
+
skillPacks: preset.skillPacks,
|
|
32
|
+
aiProviders: [],
|
|
33
|
+
gsdRuntimes: [],
|
|
34
|
+
proxy: "none",
|
|
35
|
+
gpu: false,
|
|
36
|
+
platform: "linux/amd64",
|
|
37
|
+
deployment: "local",
|
|
38
|
+
deploymentType: "docker",
|
|
39
|
+
generateSecrets: false,
|
|
40
|
+
openclawVersion: "latest",
|
|
41
|
+
monitoring: false
|
|
42
|
+
});
|
|
43
|
+
expect(result.files["docker-compose.yml"]).toBeDefined();
|
|
44
|
+
expect(result.files[".env.example"]).toBeDefined();
|
|
45
|
+
expect(result.metadata.serviceCount).toBeGreaterThan(0);
|
|
46
|
+
const composeContent = result.files["docker-compose.yml"];
|
|
47
|
+
const parsed = yaml.parse(composeContent);
|
|
48
|
+
expect(parsed).toBeDefined();
|
|
49
|
+
expect(parsed.services).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
for (const preset of allPresets) it(`preset "${preset.id}" resolves without errors`, () => {
|
|
52
|
+
const result = require_resolver.resolve({
|
|
53
|
+
services: preset.services,
|
|
54
|
+
skillPacks: preset.skillPacks,
|
|
55
|
+
proxy: "none",
|
|
56
|
+
gpu: false,
|
|
57
|
+
platform: "linux/amd64",
|
|
58
|
+
monitoring: false
|
|
59
|
+
});
|
|
60
|
+
expect(result.isValid).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
//# sourceMappingURL=presets.test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.test.cjs","names":["getAllPresets","getPresetById","generate","resolve"],"sources":["../../src/presets/presets.test.ts"],"sourcesContent":["import * as yaml from \"yaml\";\nimport { generate } from \"../generate.js\";\nimport { getAllPresets, getPresetById } from \"../presets/registry.js\";\nimport { resolve } from \"../resolver.js\";\n\nconst allPresets = getAllPresets();\n\ndescribe(\"preset smoke tests\", () => {\n\tit(\"all presets are defined\", () => {\n\t\texpect(allPresets.length).toBeGreaterThanOrEqual(5);\n\t});\n\n\tit(\"all preset IDs are unique\", () => {\n\t\tconst ids = allPresets.map((p) => p.id);\n\t\tconst uniqueIds = new Set(ids);\n\t\texpect(uniqueIds.size).toBe(ids.length);\n\t});\n\n\tfor (const preset of allPresets) {\n\t\tit(`getPresetById returns correct preset for \"${preset.id}\"`, () => {\n\t\t\tconst found = getPresetById(preset.id);\n\t\t\texpect(found).toBeDefined();\n\t\t\texpect(found!.id).toBe(preset.id);\n\t\t\texpect(found!.name).toBe(preset.name);\n\t\t\texpect(found!.services).toEqual(preset.services);\n\t\t\texpect(found!.skillPacks).toEqual(preset.skillPacks);\n\t\t});\n\t}\n\n\tfor (const preset of allPresets) {\n\t\tit(`preset \"${preset.id}\" generates valid configuration`, () => {\n\t\t\tconst result = generate({\n\t\t\t\tprojectName: \"test-project\",\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\taiProviders: [],\n\t\t\t\tgsdRuntimes: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tdeploymentType: \"docker\",\n\t\t\t\tgenerateSecrets: false,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\texpect(result.files[\"docker-compose.yml\"]).toBeDefined();\n\t\t\texpect(result.files[\".env.example\"]).toBeDefined();\n\t\t\texpect(result.metadata.serviceCount).toBeGreaterThan(0);\n\n\t\t\tconst composeContent = result.files[\"docker-compose.yml\"]!;\n\t\t\tconst parsed = yaml.parse(composeContent);\n\t\t\texpect(parsed).toBeDefined();\n\t\t\texpect(parsed.services).toBeDefined();\n\t\t});\n\t}\n\n\tfor (const preset of allPresets) {\n\t\tit(`preset \"${preset.id}\" resolves without errors`, () => {\n\t\t\tconst result = resolve({\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\texpect(result.isValid).toBe(true);\n\t\t});\n\t}\n});\n"],"mappings":";;;;;;;;AAKA,MAAM,aAAaA,wCAAe;AAElC,SAAS,4BAA4B;AACpC,IAAG,iCAAiC;AACnC,SAAO,WAAW,OAAO,CAAC,uBAAuB,EAAE;GAClD;AAEF,IAAG,mCAAmC;EACrC,MAAM,MAAM,WAAW,KAAK,MAAM,EAAE,GAAG;EACvC,MAAM,YAAY,IAAI,IAAI,IAAI;AAC9B,SAAO,UAAU,KAAK,CAAC,KAAK,IAAI,OAAO;GACtC;AAEF,MAAK,MAAM,UAAU,WACpB,IAAG,6CAA6C,OAAO,GAAG,UAAU;EACnE,MAAM,QAAQC,uCAAc,OAAO,GAAG;AACtC,SAAO,MAAM,CAAC,aAAa;AAC3B,SAAO,MAAO,GAAG,CAAC,KAAK,OAAO,GAAG;AACjC,SAAO,MAAO,KAAK,CAAC,KAAK,OAAO,KAAK;AACrC,SAAO,MAAO,SAAS,CAAC,QAAQ,OAAO,SAAS;AAChD,SAAO,MAAO,WAAW,CAAC,QAAQ,OAAO,WAAW;GACnD;AAGH,MAAK,MAAM,UAAU,WACpB,IAAG,WAAW,OAAO,GAAG,wCAAwC;EAC/D,MAAM,SAASC,0BAAS;GACvB,aAAa;GACb,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,aAAa,EAAE;GACf,aAAa,EAAE;GACf,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,iBAAiB;GACjB,YAAY;GACZ,CAAC;AAEF,SAAO,OAAO,MAAM,sBAAsB,CAAC,aAAa;AACxD,SAAO,OAAO,MAAM,gBAAgB,CAAC,aAAa;AAClD,SAAO,OAAO,SAAS,aAAa,CAAC,gBAAgB,EAAE;EAEvD,MAAM,iBAAiB,OAAO,MAAM;EACpC,MAAM,SAAS,KAAK,MAAM,eAAe;AACzC,SAAO,OAAO,CAAC,aAAa;AAC5B,SAAO,OAAO,SAAS,CAAC,aAAa;GACpC;AAGH,MAAK,MAAM,UAAU,WACpB,IAAG,WAAW,OAAO,GAAG,kCAAkC;EACzD,MAAM,SAASC,yBAAQ;GACtB,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC;AAEF,SAAO,OAAO,QAAQ,CAAC,KAAK,KAAK;GAChC;EAEF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { resolve } from "../resolver.mjs";
|
|
2
|
+
import { generate } from "../generate.mjs";
|
|
3
|
+
import { getAllPresets, getPresetById } from "./registry.mjs";
|
|
4
|
+
import * as yaml from "yaml";
|
|
5
|
+
|
|
6
|
+
//#region src/presets/presets.test.ts
|
|
7
|
+
const allPresets = getAllPresets();
|
|
8
|
+
describe("preset smoke tests", () => {
|
|
9
|
+
it("all presets are defined", () => {
|
|
10
|
+
expect(allPresets.length).toBeGreaterThanOrEqual(5);
|
|
11
|
+
});
|
|
12
|
+
it("all preset IDs are unique", () => {
|
|
13
|
+
const ids = allPresets.map((p) => p.id);
|
|
14
|
+
const uniqueIds = new Set(ids);
|
|
15
|
+
expect(uniqueIds.size).toBe(ids.length);
|
|
16
|
+
});
|
|
17
|
+
for (const preset of allPresets) it(`getPresetById returns correct preset for "${preset.id}"`, () => {
|
|
18
|
+
const found = getPresetById(preset.id);
|
|
19
|
+
expect(found).toBeDefined();
|
|
20
|
+
expect(found.id).toBe(preset.id);
|
|
21
|
+
expect(found.name).toBe(preset.name);
|
|
22
|
+
expect(found.services).toEqual(preset.services);
|
|
23
|
+
expect(found.skillPacks).toEqual(preset.skillPacks);
|
|
24
|
+
});
|
|
25
|
+
for (const preset of allPresets) it(`preset "${preset.id}" generates valid configuration`, () => {
|
|
26
|
+
const result = generate({
|
|
27
|
+
projectName: "test-project",
|
|
28
|
+
services: preset.services,
|
|
29
|
+
skillPacks: preset.skillPacks,
|
|
30
|
+
aiProviders: [],
|
|
31
|
+
gsdRuntimes: [],
|
|
32
|
+
proxy: "none",
|
|
33
|
+
gpu: false,
|
|
34
|
+
platform: "linux/amd64",
|
|
35
|
+
deployment: "local",
|
|
36
|
+
deploymentType: "docker",
|
|
37
|
+
generateSecrets: false,
|
|
38
|
+
openclawVersion: "latest",
|
|
39
|
+
monitoring: false
|
|
40
|
+
});
|
|
41
|
+
expect(result.files["docker-compose.yml"]).toBeDefined();
|
|
42
|
+
expect(result.files[".env.example"]).toBeDefined();
|
|
43
|
+
expect(result.metadata.serviceCount).toBeGreaterThan(0);
|
|
44
|
+
const composeContent = result.files["docker-compose.yml"];
|
|
45
|
+
const parsed = yaml.parse(composeContent);
|
|
46
|
+
expect(parsed).toBeDefined();
|
|
47
|
+
expect(parsed.services).toBeDefined();
|
|
48
|
+
});
|
|
49
|
+
for (const preset of allPresets) it(`preset "${preset.id}" resolves without errors`, () => {
|
|
50
|
+
const result = resolve({
|
|
51
|
+
services: preset.services,
|
|
52
|
+
skillPacks: preset.skillPacks,
|
|
53
|
+
proxy: "none",
|
|
54
|
+
gpu: false,
|
|
55
|
+
platform: "linux/amd64",
|
|
56
|
+
monitoring: false
|
|
57
|
+
});
|
|
58
|
+
expect(result.isValid).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
export { };
|
|
64
|
+
//# sourceMappingURL=presets.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.test.mjs","names":[],"sources":["../../src/presets/presets.test.ts"],"sourcesContent":["import * as yaml from \"yaml\";\nimport { generate } from \"../generate.js\";\nimport { getAllPresets, getPresetById } from \"../presets/registry.js\";\nimport { resolve } from \"../resolver.js\";\n\nconst allPresets = getAllPresets();\n\ndescribe(\"preset smoke tests\", () => {\n\tit(\"all presets are defined\", () => {\n\t\texpect(allPresets.length).toBeGreaterThanOrEqual(5);\n\t});\n\n\tit(\"all preset IDs are unique\", () => {\n\t\tconst ids = allPresets.map((p) => p.id);\n\t\tconst uniqueIds = new Set(ids);\n\t\texpect(uniqueIds.size).toBe(ids.length);\n\t});\n\n\tfor (const preset of allPresets) {\n\t\tit(`getPresetById returns correct preset for \"${preset.id}\"`, () => {\n\t\t\tconst found = getPresetById(preset.id);\n\t\t\texpect(found).toBeDefined();\n\t\t\texpect(found!.id).toBe(preset.id);\n\t\t\texpect(found!.name).toBe(preset.name);\n\t\t\texpect(found!.services).toEqual(preset.services);\n\t\t\texpect(found!.skillPacks).toEqual(preset.skillPacks);\n\t\t});\n\t}\n\n\tfor (const preset of allPresets) {\n\t\tit(`preset \"${preset.id}\" generates valid configuration`, () => {\n\t\t\tconst result = generate({\n\t\t\t\tprojectName: \"test-project\",\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\taiProviders: [],\n\t\t\t\tgsdRuntimes: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tdeploymentType: \"docker\",\n\t\t\t\tgenerateSecrets: false,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\texpect(result.files[\"docker-compose.yml\"]).toBeDefined();\n\t\t\texpect(result.files[\".env.example\"]).toBeDefined();\n\t\t\texpect(result.metadata.serviceCount).toBeGreaterThan(0);\n\n\t\t\tconst composeContent = result.files[\"docker-compose.yml\"]!;\n\t\t\tconst parsed = yaml.parse(composeContent);\n\t\t\texpect(parsed).toBeDefined();\n\t\t\texpect(parsed.services).toBeDefined();\n\t\t});\n\t}\n\n\tfor (const preset of allPresets) {\n\t\tit(`preset \"${preset.id}\" resolves without errors`, () => {\n\t\t\tconst result = resolve({\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\texpect(result.isValid).toBe(true);\n\t\t});\n\t}\n});\n"],"mappings":";;;;;;AAKA,MAAM,aAAa,eAAe;AAElC,SAAS,4BAA4B;AACpC,IAAG,iCAAiC;AACnC,SAAO,WAAW,OAAO,CAAC,uBAAuB,EAAE;GAClD;AAEF,IAAG,mCAAmC;EACrC,MAAM,MAAM,WAAW,KAAK,MAAM,EAAE,GAAG;EACvC,MAAM,YAAY,IAAI,IAAI,IAAI;AAC9B,SAAO,UAAU,KAAK,CAAC,KAAK,IAAI,OAAO;GACtC;AAEF,MAAK,MAAM,UAAU,WACpB,IAAG,6CAA6C,OAAO,GAAG,UAAU;EACnE,MAAM,QAAQ,cAAc,OAAO,GAAG;AACtC,SAAO,MAAM,CAAC,aAAa;AAC3B,SAAO,MAAO,GAAG,CAAC,KAAK,OAAO,GAAG;AACjC,SAAO,MAAO,KAAK,CAAC,KAAK,OAAO,KAAK;AACrC,SAAO,MAAO,SAAS,CAAC,QAAQ,OAAO,SAAS;AAChD,SAAO,MAAO,WAAW,CAAC,QAAQ,OAAO,WAAW;GACnD;AAGH,MAAK,MAAM,UAAU,WACpB,IAAG,WAAW,OAAO,GAAG,wCAAwC;EAC/D,MAAM,SAAS,SAAS;GACvB,aAAa;GACb,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,aAAa,EAAE;GACf,aAAa,EAAE;GACf,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,iBAAiB;GACjB,YAAY;GACZ,CAAC;AAEF,SAAO,OAAO,MAAM,sBAAsB,CAAC,aAAa;AACxD,SAAO,OAAO,MAAM,gBAAgB,CAAC,aAAa;AAClD,SAAO,OAAO,SAAS,aAAa,CAAC,gBAAgB,EAAE;EAEvD,MAAM,iBAAiB,OAAO,MAAM;EACpC,MAAM,SAAS,KAAK,MAAM,eAAe;AACzC,SAAO,OAAO,CAAC,aAAa;AAC5B,SAAO,OAAO,SAAS,CAAC,aAAa;GACpC;AAGH,MAAK,MAAM,UAAU,WACpB,IAAG,WAAW,OAAO,GAAG,kCAAkC;EACzD,MAAM,SAAS,QAAQ;GACtB,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC;AAEF,SAAO,OAAO,QAAQ,CAAC,KAAK,KAAK;GAChC;EAEF"}
|