@better-openclaw/core 1.0.15 → 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/{manifest-BjK4ALvr.mjs → manifest-B8UDsVlR.mjs} +39 -13
- package/dist/manifest-B8UDsVlR.mjs.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.d.mts +7 -0
- package/dist/services/definitions/headscale.d.mts.map +1 -0
- package/dist/services/definitions/headscale.mjs +71 -0
- package/dist/services/definitions/headscale.mjs.map +1 -0
- 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/index.d.mts +2 -1
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +4 -2
- package/dist/services/definitions/index.mjs.map +1 -1
- 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/skills/skill-manifest.mjs +1 -1
- 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 +72 -0
- 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/index.ts +3 -0
- 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/skills/manifest.json +63 -12
- package/src/types.ts +138 -20
- package/tsdown.config.ts +2 -2
- package/dist/manifest-BjK4ALvr.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-4uLbISXV.cjs","names":[],"sources":["../src/skills/manifest.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -92,7 +92,23 @@ var manifest_default = {
|
|
|
92
92
|
"id": "better-openclaw",
|
|
93
93
|
"path": "better-openclaw/SKILL.md",
|
|
94
94
|
"emoji": "🦞",
|
|
95
|
-
"services": [
|
|
95
|
+
"services": [
|
|
96
|
+
"caddy",
|
|
97
|
+
"chromadb",
|
|
98
|
+
"ffmpeg",
|
|
99
|
+
"grafana",
|
|
100
|
+
"minio",
|
|
101
|
+
"n8n",
|
|
102
|
+
"ollama",
|
|
103
|
+
"postgresql",
|
|
104
|
+
"prometheus",
|
|
105
|
+
"qdrant",
|
|
106
|
+
"redis",
|
|
107
|
+
"remotion",
|
|
108
|
+
"traefik",
|
|
109
|
+
"weaviate",
|
|
110
|
+
"whisper"
|
|
111
|
+
]
|
|
96
112
|
},
|
|
97
113
|
{
|
|
98
114
|
"id": "postgresql-query",
|
|
@@ -392,25 +408,25 @@ var manifest_default = {
|
|
|
392
408
|
"id": "claude-code-assist",
|
|
393
409
|
"path": "claude-code-assist/SKILL.md",
|
|
394
410
|
"emoji": "🤖",
|
|
395
|
-
"services": []
|
|
411
|
+
"services": ["claude-code"]
|
|
396
412
|
},
|
|
397
413
|
{
|
|
398
414
|
"id": "codex-generate",
|
|
399
415
|
"path": "codex-generate/SKILL.md",
|
|
400
416
|
"emoji": "⌨️",
|
|
401
|
-
"services": []
|
|
417
|
+
"services": ["codex"]
|
|
402
418
|
},
|
|
403
419
|
{
|
|
404
420
|
"id": "gemini-cli-query",
|
|
405
421
|
"path": "gemini-cli-query/SKILL.md",
|
|
406
422
|
"emoji": "♊",
|
|
407
|
-
"services": []
|
|
423
|
+
"services": ["gemini-cli"]
|
|
408
424
|
},
|
|
409
425
|
{
|
|
410
426
|
"id": "opencode-develop",
|
|
411
427
|
"path": "opencode-develop/SKILL.md",
|
|
412
428
|
"emoji": "🔓",
|
|
413
|
-
"services": []
|
|
429
|
+
"services": ["opencode", "ollama"]
|
|
414
430
|
},
|
|
415
431
|
{
|
|
416
432
|
"id": "mission-control-manage",
|
|
@@ -596,7 +612,7 @@ var manifest_default = {
|
|
|
596
612
|
"id": "calendar-manage",
|
|
597
613
|
"path": "calendar-manage/SKILL.md",
|
|
598
614
|
"emoji": "📆",
|
|
599
|
-
"services": []
|
|
615
|
+
"services": ["nextcloud"]
|
|
600
616
|
},
|
|
601
617
|
{
|
|
602
618
|
"id": "system-info",
|
|
@@ -698,7 +714,7 @@ var manifest_default = {
|
|
|
698
714
|
"id": "haystack-rag",
|
|
699
715
|
"path": "haystack-rag/SKILL.md",
|
|
700
716
|
"emoji": "🔍",
|
|
701
|
-
"services": []
|
|
717
|
+
"services": ["qdrant", "weaviate"]
|
|
702
718
|
},
|
|
703
719
|
{
|
|
704
720
|
"id": "llamaindex-query",
|
|
@@ -722,7 +738,7 @@ var manifest_default = {
|
|
|
722
738
|
"id": "ansible-configure",
|
|
723
739
|
"path": "ansible-configure/SKILL.md",
|
|
724
740
|
"emoji": "📋",
|
|
725
|
-
"services": []
|
|
741
|
+
"services": ["jenkins"]
|
|
726
742
|
},
|
|
727
743
|
{
|
|
728
744
|
"id": "woodpecker-ci",
|
|
@@ -1034,13 +1050,13 @@ var manifest_default = {
|
|
|
1034
1050
|
"id": "ui-design-system",
|
|
1035
1051
|
"path": "ui-design-system/SKILL.md",
|
|
1036
1052
|
"emoji": "🎨",
|
|
1037
|
-
"services": []
|
|
1053
|
+
"services": ["claude-code"]
|
|
1038
1054
|
},
|
|
1039
1055
|
{
|
|
1040
1056
|
"id": "tailwind-design-system-v4",
|
|
1041
1057
|
"path": "tailwind-design-system-v4/SKILL.md",
|
|
1042
1058
|
"emoji": "💨",
|
|
1043
|
-
"services": []
|
|
1059
|
+
"services": ["ghost"]
|
|
1044
1060
|
},
|
|
1045
1061
|
{
|
|
1046
1062
|
"id": "interaction-design",
|
|
@@ -1112,7 +1128,7 @@ var manifest_default = {
|
|
|
1112
1128
|
"id": "browser-learn",
|
|
1113
1129
|
"path": "browser-learn/SKILL.md",
|
|
1114
1130
|
"emoji": "🧠",
|
|
1115
|
-
"services": []
|
|
1131
|
+
"services": ["browserless", "lightpanda"]
|
|
1116
1132
|
},
|
|
1117
1133
|
{
|
|
1118
1134
|
"id": "scrapling-scrape",
|
|
@@ -1124,7 +1140,11 @@ var manifest_default = {
|
|
|
1124
1140
|
"id": "youtube-growth",
|
|
1125
1141
|
"path": "youtube-growth/SKILL.md",
|
|
1126
1142
|
"emoji": "📈",
|
|
1127
|
-
"services": [
|
|
1143
|
+
"services": [
|
|
1144
|
+
"comfyui",
|
|
1145
|
+
"ollama",
|
|
1146
|
+
"searxng"
|
|
1147
|
+
]
|
|
1128
1148
|
},
|
|
1129
1149
|
{
|
|
1130
1150
|
"id": "hexstrike-mcp",
|
|
@@ -1149,10 +1169,16 @@ var manifest_default = {
|
|
|
1149
1169
|
"path": "pentestagent-runner/SKILL.md",
|
|
1150
1170
|
"emoji": "🔍",
|
|
1151
1171
|
"services": ["pentestagent"]
|
|
1172
|
+
},
|
|
1173
|
+
{
|
|
1174
|
+
"id": "headscale-network",
|
|
1175
|
+
"path": "headscale-network/SKILL.md",
|
|
1176
|
+
"emoji": "🌐",
|
|
1177
|
+
"services": ["headscale"]
|
|
1152
1178
|
}
|
|
1153
1179
|
]
|
|
1154
1180
|
};
|
|
1155
1181
|
|
|
1156
1182
|
//#endregion
|
|
1157
1183
|
export { manifest_default as t };
|
|
1158
|
-
//# sourceMappingURL=manifest-
|
|
1184
|
+
//# sourceMappingURL=manifest-B8UDsVlR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-B8UDsVlR.mjs","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":"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"}
|
|
@@ -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"}
|