@better-openclaw/core 1.0.21 → 1.0.22
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/dist/bare-metal-partition.cjs +2 -3
- package/dist/bare-metal-partition.cjs.map +1 -1
- package/dist/bare-metal-partition.d.mts.map +1 -1
- package/dist/bare-metal-partition.mjs +1 -1
- package/dist/bare-metal-partition.test.cjs +4 -5
- package/dist/bare-metal-partition.test.cjs.map +1 -1
- package/dist/bare-metal-partition.test.mjs +3 -4
- package/dist/bare-metal-partition.test.mjs.map +1 -1
- package/dist/compose-validation.test.cjs +5 -6
- package/dist/compose-validation.test.cjs.map +1 -1
- package/dist/compose-validation.test.mjs +2 -3
- package/dist/compose-validation.test.mjs.map +1 -1
- package/dist/composer.cjs +4 -5
- package/dist/composer.cjs.map +1 -1
- package/dist/composer.d.mts.map +1 -1
- package/dist/composer.mjs +1 -2
- package/dist/composer.mjs.map +1 -1
- package/dist/composer.snapshot.test.cjs +4 -5
- package/dist/composer.snapshot.test.cjs.map +1 -1
- package/dist/composer.snapshot.test.mjs +3 -4
- package/dist/composer.snapshot.test.mjs.map +1 -1
- package/dist/composer.test.cjs +5 -6
- package/dist/composer.test.cjs.map +1 -1
- package/dist/composer.test.mjs +3 -4
- package/dist/composer.test.mjs.map +1 -1
- package/dist/coolify-BVGGcMrT.d.mts +18 -0
- package/dist/coolify-BVGGcMrT.d.mts.map +1 -0
- package/dist/coolify-vlb1G9V2.d.cts +18 -0
- package/dist/coolify-vlb1G9V2.d.cts.map +1 -0
- package/dist/deployers/coolify.cjs +3 -4
- package/dist/deployers/coolify.cjs.map +1 -1
- package/dist/deployers/coolify.d.cts +2 -18
- package/dist/deployers/coolify.d.mts +2 -18
- package/dist/deployers/coolify.mjs +1 -2
- package/dist/deployers/coolify.mjs.map +1 -1
- package/dist/deployers/dokploy.cjs +3 -4
- package/dist/deployers/dokploy.cjs.map +1 -1
- package/dist/deployers/dokploy.d.cts +2 -25
- package/dist/deployers/dokploy.d.mts +2 -25
- package/dist/deployers/dokploy.mjs +1 -2
- package/dist/deployers/dokploy.mjs.map +1 -1
- package/dist/deployers/index.cjs +4 -5
- package/dist/deployers/index.cjs.map +1 -1
- package/dist/deployers/index.d.cts +3 -3
- package/dist/deployers/index.d.mts +3 -3
- package/dist/deployers/index.mjs +1 -2
- package/dist/deployers/index.mjs.map +1 -1
- package/dist/deployers/strip-host-ports.cjs +3 -4
- package/dist/deployers/strip-host-ports.cjs.map +1 -1
- package/dist/deployers/strip-host-ports.mjs +1 -2
- package/dist/deployers/strip-host-ports.mjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.cjs +3 -4
- package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.mjs +3 -4
- package/dist/deployers/strip-host-ports.test.mjs.map +1 -1
- package/dist/deployers/types.d.cts +2 -243
- package/dist/deployers/types.d.mts +2 -243
- package/dist/deployers/types.mjs +1 -1
- package/dist/dokploy-8cbrxUun.d.cts +25 -0
- package/dist/dokploy-8cbrxUun.d.cts.map +1 -0
- package/dist/dokploy-BTflLhTM.d.mts +25 -0
- package/dist/dokploy-BTflLhTM.d.mts.map +1 -0
- package/dist/errors.cjs +2 -3
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.mjs +1 -1
- package/dist/errors.mjs.map +1 -1
- package/dist/generate.cjs +27 -28
- package/dist/generate.cjs.map +1 -1
- package/dist/generate.d.mts.map +1 -1
- package/dist/generate.mjs +1 -2
- package/dist/generate.mjs.map +1 -1
- package/dist/generate.test.cjs +4 -5
- package/dist/generate.test.cjs.map +1 -1
- package/dist/generate.test.mjs +3 -4
- package/dist/generate.test.mjs.map +1 -1
- package/dist/generators/bare-metal-install.cjs +2 -3
- package/dist/generators/bare-metal-install.cjs.map +1 -1
- package/dist/generators/bare-metal-install.d.mts.map +1 -1
- package/dist/generators/bare-metal-install.mjs +1 -1
- package/dist/generators/bare-metal-install.test.cjs +3 -4
- package/dist/generators/bare-metal-install.test.cjs.map +1 -1
- package/dist/generators/bare-metal-install.test.mjs +3 -4
- package/dist/generators/bare-metal-install.test.mjs.map +1 -1
- package/dist/generators/caddy.cjs +2 -3
- package/dist/generators/caddy.cjs.map +1 -1
- package/dist/generators/caddy.d.mts.map +1 -1
- package/dist/generators/caddy.mjs +1 -1
- package/dist/generators/caddy.test.cjs +3 -4
- package/dist/generators/caddy.test.cjs.map +1 -1
- package/dist/generators/caddy.test.mjs +3 -4
- package/dist/generators/caddy.test.mjs.map +1 -1
- package/dist/generators/cloud-init.cjs +2 -3
- package/dist/generators/cloud-init.cjs.map +1 -1
- package/dist/generators/cloud-init.mjs +1 -1
- package/dist/generators/env.cjs +4 -5
- package/dist/generators/env.cjs.map +1 -1
- package/dist/generators/env.d.mts.map +1 -1
- package/dist/generators/env.mjs +1 -2
- package/dist/generators/env.mjs.map +1 -1
- package/dist/generators/env.test.cjs +3 -4
- package/dist/generators/env.test.cjs.map +1 -1
- package/dist/generators/env.test.mjs +3 -4
- package/dist/generators/env.test.mjs.map +1 -1
- package/dist/generators/get-shit-done.cjs +2 -3
- package/dist/generators/get-shit-done.cjs.map +1 -1
- package/dist/generators/get-shit-done.mjs +1 -1
- package/dist/generators/grafana.cjs +2 -3
- package/dist/generators/grafana.cjs.map +1 -1
- package/dist/generators/grafana.mjs +1 -1
- package/dist/generators/health-check.cjs +2 -3
- package/dist/generators/health-check.cjs.map +1 -1
- package/dist/generators/health-check.d.mts.map +1 -1
- package/dist/generators/health-check.mjs +1 -1
- package/dist/generators/health-check.test.cjs +3 -4
- package/dist/generators/health-check.test.cjs.map +1 -1
- package/dist/generators/health-check.test.mjs +3 -4
- package/dist/generators/health-check.test.mjs.map +1 -1
- package/dist/generators/n8n-workflows.cjs +2 -3
- package/dist/generators/n8n-workflows.cjs.map +1 -1
- package/dist/generators/n8n-workflows.d.mts.map +1 -1
- package/dist/generators/n8n-workflows.mjs +1 -1
- package/dist/generators/native-services.cjs +2 -3
- package/dist/generators/native-services.cjs.map +1 -1
- package/dist/generators/native-services.mjs +1 -1
- package/dist/generators/openclaw-install-script.cjs +2 -3
- package/dist/generators/openclaw-install-script.cjs.map +1 -1
- package/dist/generators/openclaw-install-script.mjs +1 -1
- package/dist/generators/openclaw-json.cjs +2 -3
- package/dist/generators/openclaw-json.cjs.map +1 -1
- package/dist/generators/openclaw-json.mjs +1 -1
- package/dist/generators/postgres-init.cjs +32 -3
- package/dist/generators/postgres-init.cjs.map +1 -1
- package/dist/generators/postgres-init.d.cts.map +1 -1
- package/dist/generators/postgres-init.d.mts.map +1 -1
- package/dist/generators/postgres-init.mjs +31 -1
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/prometheus.cjs +2 -3
- package/dist/generators/prometheus.cjs.map +1 -1
- package/dist/generators/prometheus.d.mts.map +1 -1
- package/dist/generators/prometheus.mjs +1 -1
- package/dist/generators/readme.cjs +2 -3
- package/dist/generators/readme.cjs.map +1 -1
- package/dist/generators/readme.d.mts.map +1 -1
- package/dist/generators/readme.mjs +1 -1
- package/dist/generators/scripts.cjs +2 -3
- package/dist/generators/scripts.cjs.map +1 -1
- package/dist/generators/scripts.mjs +1 -1
- package/dist/generators/scripts.test.cjs +3 -4
- package/dist/generators/scripts.test.cjs.map +1 -1
- package/dist/generators/scripts.test.mjs +3 -4
- package/dist/generators/scripts.test.mjs.map +1 -1
- package/dist/generators/skills.cjs +3 -590
- package/dist/generators/skills.d.mts.map +1 -1
- package/dist/generators/skills.mjs +1 -2
- package/dist/generators/skills.mjs.map +1 -1
- package/dist/generators/stack-manifest.cjs +2 -3
- package/dist/generators/stack-manifest.cjs.map +1 -1
- package/dist/generators/stack-manifest.mjs +1 -1
- package/dist/generators/traefik.cjs +2 -3
- package/dist/generators/traefik.cjs.map +1 -1
- package/dist/generators/traefik.mjs +1 -1
- package/dist/generators/traefik.test.cjs +4 -5
- package/dist/generators/traefik.test.cjs.map +1 -1
- package/dist/generators/traefik.test.mjs +3 -4
- package/dist/generators/traefik.test.mjs.map +1 -1
- package/dist/index.cjs +35 -36
- package/dist/index.d.cts +4 -4
- package/dist/index.d.mts +4 -4
- package/dist/index.mjs +2 -3
- package/dist/{magic-string.es-D2agHT3I.cjs → magic-string.es-CJq41xdM.cjs} +2 -4
- package/dist/{magic-string.es-CfFonO_S.mjs.map → magic-string.es-CJq41xdM.cjs.map} +1 -1
- package/dist/{magic-string.es-CfFonO_S.mjs → magic-string.es-CoDyF8pj.mjs} +2 -3
- package/dist/{magic-string.es-D2agHT3I.cjs.map → magic-string.es-CoDyF8pj.mjs.map} +1 -1
- package/dist/migrations.cjs +5 -6
- package/dist/migrations.cjs.map +1 -1
- package/dist/migrations.mjs +4 -4
- package/dist/migrations.mjs.map +1 -1
- package/dist/migrations.test.cjs +6 -7
- package/dist/migrations.test.cjs.map +1 -1
- package/dist/migrations.test.mjs +7 -8
- package/dist/migrations.test.mjs.map +1 -1
- package/dist/port-scanner.cjs +2 -3
- package/dist/port-scanner.cjs.map +1 -1
- package/dist/port-scanner.d.mts.map +1 -1
- package/dist/port-scanner.mjs +1 -1
- package/dist/presets/presets.test.cjs +11 -8
- package/dist/presets/presets.test.cjs.map +1 -1
- package/dist/presets/presets.test.mjs +7 -4
- package/dist/presets/presets.test.mjs.map +1 -1
- package/dist/presets/registry.cjs +152 -3
- package/dist/presets/registry.cjs.map +1 -1
- package/dist/presets/registry.d.cts.map +1 -1
- package/dist/presets/registry.d.mts.map +1 -1
- package/dist/presets/registry.mjs +151 -1
- package/dist/presets/registry.mjs.map +1 -1
- package/dist/presets/registry.test.cjs +3 -4
- package/dist/presets/registry.test.cjs.map +1 -1
- package/dist/presets/registry.test.mjs +3 -4
- package/dist/presets/registry.test.mjs.map +1 -1
- package/dist/resolver.cjs +4 -5
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.d.mts.map +1 -1
- package/dist/resolver.mjs +1 -2
- package/dist/resolver.mjs.map +1 -1
- package/dist/resolver.test.cjs +3 -4
- package/dist/resolver.test.cjs.map +1 -1
- package/dist/resolver.test.mjs +3 -4
- package/dist/resolver.test.mjs.map +1 -1
- package/dist/schema-C_hc7e4k.d.cts +898 -0
- package/dist/schema-C_hc7e4k.d.cts.map +1 -0
- package/dist/schema-CaesJaS2.d.mts +898 -0
- package/dist/schema-CaesJaS2.d.mts.map +1 -0
- package/dist/schema.cjs +15 -5
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +2 -854
- package/dist/schema.d.mts +2 -854
- package/dist/schema.mjs +13 -3
- package/dist/schema.mjs.map +1 -1
- package/dist/schema.test.cjs +3 -4
- package/dist/schema.test.cjs.map +1 -1
- package/dist/schema.test.mjs +3 -4
- package/dist/schema.test.mjs.map +1 -1
- package/dist/services/definitions/airbyte.cjs +76 -0
- package/dist/services/definitions/airbyte.cjs.map +1 -0
- package/dist/services/definitions/airbyte.d.cts +7 -0
- package/dist/services/definitions/airbyte.d.cts.map +1 -0
- package/dist/services/definitions/airbyte.d.mts +7 -0
- package/dist/services/definitions/airbyte.d.mts.map +1 -0
- package/dist/services/definitions/airbyte.mjs +75 -0
- package/dist/services/definitions/airbyte.mjs.map +1 -0
- package/dist/services/definitions/airflow.cjs +109 -0
- package/dist/services/definitions/airflow.cjs.map +1 -0
- package/dist/services/definitions/airflow.d.cts +7 -0
- package/dist/services/definitions/airflow.d.cts.map +1 -0
- package/dist/services/definitions/airflow.d.mts +7 -0
- package/dist/services/definitions/airflow.d.mts.map +1 -0
- package/dist/services/definitions/airflow.mjs +108 -0
- package/dist/services/definitions/airflow.mjs.map +1 -0
- package/dist/services/definitions/anything-llm.cjs +2 -3
- package/dist/services/definitions/anything-llm.cjs.map +1 -1
- package/dist/services/definitions/anything-llm.mjs +1 -1
- package/dist/services/definitions/appflowy.cjs +2 -3
- package/dist/services/definitions/appflowy.cjs.map +1 -1
- package/dist/services/definitions/appflowy.mjs +1 -1
- package/dist/services/definitions/appwrite.cjs +190 -0
- package/dist/services/definitions/appwrite.cjs.map +1 -0
- package/dist/services/definitions/appwrite.d.cts +7 -0
- package/dist/services/definitions/appwrite.d.cts.map +1 -0
- package/dist/services/definitions/appwrite.d.mts +7 -0
- package/dist/services/definitions/appwrite.d.mts.map +1 -0
- package/dist/services/definitions/appwrite.mjs +189 -0
- package/dist/services/definitions/appwrite.mjs.map +1 -0
- package/dist/services/definitions/authelia.cjs +145 -0
- package/dist/services/definitions/authelia.cjs.map +1 -0
- package/dist/services/definitions/authelia.d.cts +7 -0
- package/dist/services/definitions/authelia.d.cts.map +1 -0
- package/dist/services/definitions/authelia.d.mts +7 -0
- package/dist/services/definitions/authelia.d.mts.map +1 -0
- package/dist/services/definitions/authelia.mjs +144 -0
- package/dist/services/definitions/authelia.mjs.map +1 -0
- package/dist/services/definitions/authentik.cjs +2 -3
- package/dist/services/definitions/authentik.cjs.map +1 -1
- package/dist/services/definitions/authentik.mjs +1 -1
- package/dist/services/definitions/axolotl.cjs +67 -0
- package/dist/services/definitions/axolotl.cjs.map +1 -0
- package/dist/services/definitions/axolotl.d.cts +7 -0
- package/dist/services/definitions/axolotl.d.cts.map +1 -0
- package/dist/services/definitions/axolotl.d.mts +7 -0
- package/dist/services/definitions/axolotl.d.mts.map +1 -0
- package/dist/services/definitions/axolotl.mjs +66 -0
- package/dist/services/definitions/axolotl.mjs.map +1 -0
- package/dist/services/definitions/beszel.cjs +2 -3
- package/dist/services/definitions/beszel.cjs.map +1 -1
- package/dist/services/definitions/beszel.mjs +1 -1
- package/dist/services/definitions/browserless.cjs +2 -3
- package/dist/services/definitions/browserless.cjs.map +1 -1
- package/dist/services/definitions/browserless.mjs +1 -1
- package/dist/services/definitions/caddy.cjs +2 -3
- package/dist/services/definitions/caddy.cjs.map +1 -1
- package/dist/services/definitions/caddy.mjs +1 -1
- package/dist/services/definitions/cal-com.cjs +2 -3
- package/dist/services/definitions/cal-com.cjs.map +1 -1
- package/dist/services/definitions/cal-com.mjs +1 -1
- package/dist/services/definitions/chatwoot-worker.cjs +95 -0
- package/dist/services/definitions/chatwoot-worker.cjs.map +1 -0
- package/dist/services/definitions/chatwoot-worker.d.cts +7 -0
- package/dist/services/definitions/chatwoot-worker.d.cts.map +1 -0
- package/dist/services/definitions/chatwoot-worker.d.mts +7 -0
- package/dist/services/definitions/chatwoot-worker.d.mts.map +1 -0
- package/dist/services/definitions/chatwoot-worker.mjs +94 -0
- package/dist/services/definitions/chatwoot-worker.mjs.map +1 -0
- package/dist/services/definitions/chatwoot.cjs +112 -0
- package/dist/services/definitions/chatwoot.cjs.map +1 -0
- package/dist/services/definitions/chatwoot.d.cts +7 -0
- package/dist/services/definitions/chatwoot.d.cts.map +1 -0
- package/dist/services/definitions/chatwoot.d.mts +7 -0
- package/dist/services/definitions/chatwoot.d.mts.map +1 -0
- package/dist/services/definitions/chatwoot.mjs +111 -0
- package/dist/services/definitions/chatwoot.mjs.map +1 -0
- package/dist/services/definitions/chromadb.cjs +2 -3
- package/dist/services/definitions/chromadb.cjs.map +1 -1
- package/dist/services/definitions/chromadb.mjs +1 -1
- package/dist/services/definitions/claude-code.cjs +2 -3
- package/dist/services/definitions/claude-code.cjs.map +1 -1
- package/dist/services/definitions/claude-code.mjs +1 -1
- package/dist/services/definitions/code-server.cjs +2 -3
- package/dist/services/definitions/code-server.cjs.map +1 -1
- package/dist/services/definitions/code-server.mjs +1 -1
- package/dist/services/definitions/codex.cjs +2 -3
- package/dist/services/definitions/codex.cjs.map +1 -1
- package/dist/services/definitions/codex.mjs +1 -1
- package/dist/services/definitions/comfyui.cjs +2 -3
- package/dist/services/definitions/comfyui.cjs.map +1 -1
- package/dist/services/definitions/comfyui.mjs +1 -1
- package/dist/services/definitions/convex-dashboard.cjs +2 -3
- package/dist/services/definitions/convex-dashboard.cjs.map +1 -1
- package/dist/services/definitions/convex-dashboard.mjs +1 -1
- package/dist/services/definitions/convex.cjs +2 -3
- package/dist/services/definitions/convex.cjs.map +1 -1
- package/dist/services/definitions/convex.mjs +1 -1
- package/dist/services/definitions/coolify.cjs +2 -3
- package/dist/services/definitions/coolify.cjs.map +1 -1
- package/dist/services/definitions/coolify.mjs +1 -1
- package/dist/services/definitions/crowdsec.cjs +2 -3
- package/dist/services/definitions/crowdsec.cjs.map +1 -1
- package/dist/services/definitions/crowdsec.mjs +1 -1
- package/dist/services/definitions/dagster.cjs +83 -0
- package/dist/services/definitions/dagster.cjs.map +1 -0
- package/dist/services/definitions/dagster.d.cts +7 -0
- package/dist/services/definitions/dagster.d.cts.map +1 -0
- package/dist/services/definitions/dagster.d.mts +7 -0
- package/dist/services/definitions/dagster.d.mts.map +1 -0
- package/dist/services/definitions/dagster.mjs +82 -0
- package/dist/services/definitions/dagster.mjs.map +1 -0
- package/dist/services/definitions/desktop-environment.cjs +2 -3
- package/dist/services/definitions/desktop-environment.cjs.map +1 -1
- package/dist/services/definitions/desktop-environment.mjs +1 -1
- package/dist/services/definitions/dify.cjs +2 -3
- package/dist/services/definitions/dify.cjs.map +1 -1
- package/dist/services/definitions/dify.mjs +1 -1
- package/dist/services/definitions/directus.cjs +115 -0
- package/dist/services/definitions/directus.cjs.map +1 -0
- package/dist/services/definitions/directus.d.cts +7 -0
- package/dist/services/definitions/directus.d.cts.map +1 -0
- package/dist/services/definitions/directus.d.mts +7 -0
- package/dist/services/definitions/directus.d.mts.map +1 -0
- package/dist/services/definitions/directus.mjs +114 -0
- package/dist/services/definitions/directus.mjs.map +1 -0
- package/dist/services/definitions/docsgpt.cjs +2 -3
- package/dist/services/definitions/docsgpt.cjs.map +1 -1
- package/dist/services/definitions/docsgpt.mjs +1 -1
- package/dist/services/definitions/dokploy.cjs +2 -3
- package/dist/services/definitions/dokploy.cjs.map +1 -1
- package/dist/services/definitions/dokploy.mjs +1 -1
- package/dist/services/definitions/dozzle.cjs +2 -3
- package/dist/services/definitions/dozzle.cjs.map +1 -1
- package/dist/services/definitions/dozzle.mjs +1 -1
- package/dist/services/definitions/duplicati.cjs +76 -0
- package/dist/services/definitions/duplicati.cjs.map +1 -0
- package/dist/services/definitions/duplicati.d.cts +7 -0
- package/dist/services/definitions/duplicati.d.cts.map +1 -0
- package/dist/services/definitions/duplicati.d.mts +7 -0
- package/dist/services/definitions/duplicati.d.mts.map +1 -0
- package/dist/services/definitions/duplicati.mjs +75 -0
- package/dist/services/definitions/duplicati.mjs.map +1 -0
- package/dist/services/definitions/excalidraw.cjs +48 -0
- package/dist/services/definitions/excalidraw.cjs.map +1 -0
- package/dist/services/definitions/excalidraw.d.cts +7 -0
- package/dist/services/definitions/excalidraw.d.cts.map +1 -0
- package/dist/services/definitions/excalidraw.d.mts +7 -0
- package/dist/services/definitions/excalidraw.d.mts.map +1 -0
- package/dist/services/definitions/excalidraw.mjs +47 -0
- package/dist/services/definitions/excalidraw.mjs.map +1 -0
- package/dist/services/definitions/ffmpeg.cjs +2 -3
- package/dist/services/definitions/ffmpeg.cjs.map +1 -1
- package/dist/services/definitions/ffmpeg.mjs +1 -1
- package/dist/services/definitions/firecrawl-playwright.cjs +61 -0
- package/dist/services/definitions/firecrawl-playwright.cjs.map +1 -0
- package/dist/services/definitions/firecrawl-playwright.d.cts +7 -0
- package/dist/services/definitions/firecrawl-playwright.d.cts.map +1 -0
- package/dist/services/definitions/firecrawl-playwright.d.mts +7 -0
- package/dist/services/definitions/firecrawl-playwright.d.mts.map +1 -0
- package/dist/services/definitions/firecrawl-playwright.mjs +60 -0
- package/dist/services/definitions/firecrawl-playwright.mjs.map +1 -0
- package/dist/services/definitions/firecrawl.cjs +163 -0
- package/dist/services/definitions/firecrawl.cjs.map +1 -0
- package/dist/services/definitions/firecrawl.d.cts +7 -0
- package/dist/services/definitions/firecrawl.d.cts.map +1 -0
- package/dist/services/definitions/firecrawl.d.mts +7 -0
- package/dist/services/definitions/firecrawl.d.mts.map +1 -0
- package/dist/services/definitions/firecrawl.mjs +162 -0
- package/dist/services/definitions/firecrawl.mjs.map +1 -0
- package/dist/services/definitions/flagsmith.cjs +77 -0
- package/dist/services/definitions/flagsmith.cjs.map +1 -0
- package/dist/services/definitions/flagsmith.d.cts +7 -0
- package/dist/services/definitions/flagsmith.d.cts.map +1 -0
- package/dist/services/definitions/flagsmith.d.mts +7 -0
- package/dist/services/definitions/flagsmith.d.mts.map +1 -0
- package/dist/services/definitions/flagsmith.mjs +76 -0
- package/dist/services/definitions/flagsmith.mjs.map +1 -0
- package/dist/services/definitions/flowise.cjs +2 -3
- package/dist/services/definitions/flowise.cjs.map +1 -1
- package/dist/services/definitions/flowise.mjs +1 -1
- package/dist/services/definitions/fonoster.cjs +66 -0
- package/dist/services/definitions/fonoster.cjs.map +1 -0
- package/dist/services/definitions/fonoster.d.cts +7 -0
- package/dist/services/definitions/fonoster.d.cts.map +1 -0
- package/dist/services/definitions/fonoster.d.mts +7 -0
- package/dist/services/definitions/fonoster.d.mts.map +1 -0
- package/dist/services/definitions/fonoster.mjs +65 -0
- package/dist/services/definitions/fonoster.mjs.map +1 -0
- package/dist/services/definitions/formbricks.cjs +75 -0
- package/dist/services/definitions/formbricks.cjs.map +1 -0
- package/dist/services/definitions/formbricks.d.cts +7 -0
- package/dist/services/definitions/formbricks.d.cts.map +1 -0
- package/dist/services/definitions/formbricks.d.mts +7 -0
- package/dist/services/definitions/formbricks.d.mts.map +1 -0
- package/dist/services/definitions/formbricks.mjs +74 -0
- package/dist/services/definitions/formbricks.mjs.map +1 -0
- package/dist/services/definitions/gemini-cli.cjs +2 -3
- package/dist/services/definitions/gemini-cli.cjs.map +1 -1
- package/dist/services/definitions/gemini-cli.mjs +1 -1
- package/dist/services/definitions/ghost.cjs +2 -3
- package/dist/services/definitions/ghost.cjs.map +1 -1
- package/dist/services/definitions/ghost.mjs +1 -1
- package/dist/services/definitions/gitea.cjs +2 -3
- package/dist/services/definitions/gitea.cjs.map +1 -1
- package/dist/services/definitions/gitea.mjs +1 -1
- package/dist/services/definitions/gotify.cjs +2 -3
- package/dist/services/definitions/gotify.cjs.map +1 -1
- package/dist/services/definitions/gotify.mjs +1 -1
- package/dist/services/definitions/grafana.cjs +2 -3
- package/dist/services/definitions/grafana.cjs.map +1 -1
- package/dist/services/definitions/grafana.mjs +1 -1
- package/dist/services/definitions/headscale.cjs +2 -3
- package/dist/services/definitions/headscale.cjs.map +1 -1
- package/dist/services/definitions/headscale.mjs +1 -1
- package/dist/services/definitions/hedgedoc.cjs +82 -0
- package/dist/services/definitions/hedgedoc.cjs.map +1 -0
- package/dist/services/definitions/hedgedoc.d.cts +7 -0
- package/dist/services/definitions/hedgedoc.d.cts.map +1 -0
- package/dist/services/definitions/hedgedoc.d.mts +7 -0
- package/dist/services/definitions/hedgedoc.d.mts.map +1 -0
- package/dist/services/definitions/hedgedoc.mjs +81 -0
- package/dist/services/definitions/hedgedoc.mjs.map +1 -0
- package/dist/services/definitions/hexstrike.cjs +2 -3
- package/dist/services/definitions/hexstrike.cjs.map +1 -1
- package/dist/services/definitions/hexstrike.mjs +1 -1
- package/dist/services/definitions/heyform.cjs +64 -0
- package/dist/services/definitions/heyform.cjs.map +1 -0
- package/dist/services/definitions/heyform.d.cts +7 -0
- package/dist/services/definitions/heyform.d.cts.map +1 -0
- package/dist/services/definitions/heyform.d.mts +7 -0
- package/dist/services/definitions/heyform.d.mts.map +1 -0
- package/dist/services/definitions/heyform.mjs +63 -0
- package/dist/services/definitions/heyform.mjs.map +1 -0
- package/dist/services/definitions/homeassistant.cjs +2 -3
- package/dist/services/definitions/homeassistant.cjs.map +1 -1
- package/dist/services/definitions/homeassistant.mjs +1 -1
- package/dist/services/definitions/hoppscotch.cjs +76 -0
- package/dist/services/definitions/hoppscotch.cjs.map +1 -0
- package/dist/services/definitions/hoppscotch.d.cts +7 -0
- package/dist/services/definitions/hoppscotch.d.cts.map +1 -0
- package/dist/services/definitions/hoppscotch.d.mts +7 -0
- package/dist/services/definitions/hoppscotch.d.mts.map +1 -0
- package/dist/services/definitions/hoppscotch.mjs +75 -0
- package/dist/services/definitions/hoppscotch.mjs.map +1 -0
- package/dist/services/definitions/immich.cjs +2 -3
- package/dist/services/definitions/immich.cjs.map +1 -1
- package/dist/services/definitions/immich.mjs +1 -1
- package/dist/services/definitions/index.cjs +220 -98
- package/dist/services/definitions/index.cjs.map +1 -1
- package/dist/services/definitions/index.d.cts +42 -1
- package/dist/services/definitions/index.d.cts.map +1 -1
- package/dist/services/definitions/index.d.mts +42 -1
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +85 -4
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/infisical.cjs +99 -0
- package/dist/services/definitions/infisical.cjs.map +1 -0
- package/dist/services/definitions/infisical.d.cts +7 -0
- package/dist/services/definitions/infisical.d.cts.map +1 -0
- package/dist/services/definitions/infisical.d.mts +7 -0
- package/dist/services/definitions/infisical.d.mts.map +1 -0
- package/dist/services/definitions/infisical.mjs +98 -0
- package/dist/services/definitions/infisical.mjs.map +1 -0
- package/dist/services/definitions/jellyfin.cjs +2 -3
- package/dist/services/definitions/jellyfin.cjs.map +1 -1
- package/dist/services/definitions/jellyfin.mjs +1 -1
- package/dist/services/definitions/jenkins.cjs +2 -3
- package/dist/services/definitions/jenkins.cjs.map +1 -1
- package/dist/services/definitions/jenkins.mjs +1 -1
- package/dist/services/definitions/keycloak.cjs +122 -0
- package/dist/services/definitions/keycloak.cjs.map +1 -0
- package/dist/services/definitions/keycloak.d.cts +7 -0
- package/dist/services/definitions/keycloak.d.cts.map +1 -0
- package/dist/services/definitions/keycloak.d.mts +7 -0
- package/dist/services/definitions/keycloak.d.mts.map +1 -0
- package/dist/services/definitions/keycloak.mjs +121 -0
- package/dist/services/definitions/keycloak.mjs.map +1 -0
- package/dist/services/definitions/kimi.cjs +2 -3
- package/dist/services/definitions/kimi.cjs.map +1 -1
- package/dist/services/definitions/kimi.mjs +1 -1
- package/dist/services/definitions/kong.cjs +121 -0
- package/dist/services/definitions/kong.cjs.map +1 -0
- package/dist/services/definitions/kong.d.cts +7 -0
- package/dist/services/definitions/kong.d.cts.map +1 -0
- package/dist/services/definitions/kong.d.mts +7 -0
- package/dist/services/definitions/kong.d.mts.map +1 -0
- package/dist/services/definitions/kong.mjs +120 -0
- package/dist/services/definitions/kong.mjs.map +1 -0
- package/dist/services/definitions/lago.cjs +95 -0
- package/dist/services/definitions/lago.cjs.map +1 -0
- package/dist/services/definitions/lago.d.cts +7 -0
- package/dist/services/definitions/lago.d.cts.map +1 -0
- package/dist/services/definitions/lago.d.mts +7 -0
- package/dist/services/definitions/lago.d.mts.map +1 -0
- package/dist/services/definitions/lago.mjs +94 -0
- package/dist/services/definitions/lago.mjs.map +1 -0
- package/dist/services/definitions/langflow.cjs +88 -0
- package/dist/services/definitions/langflow.cjs.map +1 -0
- package/dist/services/definitions/langflow.d.cts +7 -0
- package/dist/services/definitions/langflow.d.cts.map +1 -0
- package/dist/services/definitions/langflow.d.mts +7 -0
- package/dist/services/definitions/langflow.d.mts.map +1 -0
- package/dist/services/definitions/langflow.mjs +87 -0
- package/dist/services/definitions/langflow.mjs.map +1 -0
- package/dist/services/definitions/langfuse.cjs +79 -0
- package/dist/services/definitions/langfuse.cjs.map +1 -0
- package/dist/services/definitions/langfuse.d.cts +7 -0
- package/dist/services/definitions/langfuse.d.cts.map +1 -0
- package/dist/services/definitions/langfuse.d.mts +7 -0
- package/dist/services/definitions/langfuse.d.mts.map +1 -0
- package/dist/services/definitions/langfuse.mjs +78 -0
- package/dist/services/definitions/langfuse.mjs.map +1 -0
- package/dist/services/definitions/lasuite-meet-agents.cjs +2 -3
- package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -1
- package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
- package/dist/services/definitions/lasuite-meet-backend.cjs +2 -3
- package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -1
- package/dist/services/definitions/lasuite-meet-backend.mjs +1 -1
- package/dist/services/definitions/lasuite-meet-frontend.cjs +2 -3
- package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -1
- package/dist/services/definitions/lasuite-meet-frontend.mjs +1 -1
- package/dist/services/definitions/librechat.cjs +2 -3
- package/dist/services/definitions/librechat.cjs.map +1 -1
- package/dist/services/definitions/librechat.mjs +1 -1
- package/dist/services/definitions/lightpanda.cjs +2 -3
- package/dist/services/definitions/lightpanda.cjs.map +1 -1
- package/dist/services/definitions/lightpanda.mjs +1 -1
- package/dist/services/definitions/listmonk.cjs +118 -0
- package/dist/services/definitions/listmonk.cjs.map +1 -0
- package/dist/services/definitions/listmonk.d.cts +7 -0
- package/dist/services/definitions/listmonk.d.cts.map +1 -0
- package/dist/services/definitions/listmonk.d.mts +7 -0
- package/dist/services/definitions/listmonk.d.mts.map +1 -0
- package/dist/services/definitions/listmonk.mjs +117 -0
- package/dist/services/definitions/listmonk.mjs.map +1 -0
- package/dist/services/definitions/litellm.cjs +2 -3
- package/dist/services/definitions/litellm.cjs.map +1 -1
- package/dist/services/definitions/litellm.mjs +1 -1
- package/dist/services/definitions/livekit.cjs +2 -3
- package/dist/services/definitions/livekit.cjs.map +1 -1
- package/dist/services/definitions/livekit.mjs +1 -1
- package/dist/services/definitions/loki.cjs +2 -3
- package/dist/services/definitions/loki.cjs.map +1 -1
- package/dist/services/definitions/loki.mjs +1 -1
- package/dist/services/definitions/mariadb.cjs +81 -0
- package/dist/services/definitions/mariadb.cjs.map +1 -0
- package/dist/services/definitions/mariadb.d.cts +7 -0
- package/dist/services/definitions/mariadb.d.cts.map +1 -0
- package/dist/services/definitions/mariadb.d.mts +7 -0
- package/dist/services/definitions/mariadb.d.mts.map +1 -0
- package/dist/services/definitions/mariadb.mjs +80 -0
- package/dist/services/definitions/mariadb.mjs.map +1 -0
- package/dist/services/definitions/matomo.cjs +2 -3
- package/dist/services/definitions/matomo.cjs.map +1 -1
- package/dist/services/definitions/matomo.mjs +1 -1
- package/dist/services/definitions/matrix-synapse.cjs +2 -3
- package/dist/services/definitions/matrix-synapse.cjs.map +1 -1
- package/dist/services/definitions/matrix-synapse.mjs +1 -1
- package/dist/services/definitions/mattermost.cjs +2 -3
- package/dist/services/definitions/mattermost.cjs.map +1 -1
- package/dist/services/definitions/mattermost.mjs +1 -1
- package/dist/services/definitions/mautic.cjs +83 -0
- package/dist/services/definitions/mautic.cjs.map +1 -0
- package/dist/services/definitions/mautic.d.cts +7 -0
- package/dist/services/definitions/mautic.d.cts.map +1 -0
- package/dist/services/definitions/mautic.d.mts +7 -0
- package/dist/services/definitions/mautic.d.mts.map +1 -0
- package/dist/services/definitions/mautic.mjs +82 -0
- package/dist/services/definitions/mautic.mjs.map +1 -0
- package/dist/services/definitions/medusa.cjs +83 -0
- package/dist/services/definitions/medusa.cjs.map +1 -0
- package/dist/services/definitions/medusa.d.cts +7 -0
- package/dist/services/definitions/medusa.d.cts.map +1 -0
- package/dist/services/definitions/medusa.d.mts +7 -0
- package/dist/services/definitions/medusa.d.mts.map +1 -0
- package/dist/services/definitions/medusa.mjs +82 -0
- package/dist/services/definitions/medusa.mjs.map +1 -0
- package/dist/services/definitions/meilisearch.cjs +2 -3
- package/dist/services/definitions/meilisearch.cjs.map +1 -1
- package/dist/services/definitions/meilisearch.mjs +1 -1
- package/dist/services/definitions/milvus.cjs +2 -3
- package/dist/services/definitions/milvus.cjs.map +1 -1
- package/dist/services/definitions/milvus.mjs +1 -1
- package/dist/services/definitions/minio.cjs +2 -3
- package/dist/services/definitions/minio.cjs.map +1 -1
- package/dist/services/definitions/minio.mjs +1 -1
- package/dist/services/definitions/mission-control.cjs +2 -3
- package/dist/services/definitions/mission-control.cjs.map +1 -1
- package/dist/services/definitions/mission-control.mjs +1 -1
- package/dist/services/definitions/mixpost.cjs +2 -3
- package/dist/services/definitions/mixpost.cjs.map +1 -1
- package/dist/services/definitions/mixpost.mjs +1 -1
- package/dist/services/definitions/motion-canvas.cjs +2 -3
- package/dist/services/definitions/motion-canvas.cjs.map +1 -1
- package/dist/services/definitions/motion-canvas.mjs +1 -1
- package/dist/services/definitions/mysql.cjs +81 -0
- package/dist/services/definitions/mysql.cjs.map +1 -0
- package/dist/services/definitions/mysql.d.cts +7 -0
- package/dist/services/definitions/mysql.d.cts.map +1 -0
- package/dist/services/definitions/mysql.d.mts +7 -0
- package/dist/services/definitions/mysql.d.mts.map +1 -0
- package/dist/services/definitions/mysql.mjs +80 -0
- package/dist/services/definitions/mysql.mjs.map +1 -0
- package/dist/services/definitions/n8n.cjs +2 -3
- package/dist/services/definitions/n8n.cjs.map +1 -1
- package/dist/services/definitions/n8n.mjs +1 -1
- package/dist/services/definitions/neo4j.cjs +2 -3
- package/dist/services/definitions/neo4j.cjs.map +1 -1
- package/dist/services/definitions/neo4j.mjs +1 -1
- package/dist/services/definitions/nextcloud.cjs +2 -3
- package/dist/services/definitions/nextcloud.cjs.map +1 -1
- package/dist/services/definitions/nextcloud.mjs +1 -1
- package/dist/services/definitions/nocodb.cjs +2 -3
- package/dist/services/definitions/nocodb.cjs.map +1 -1
- package/dist/services/definitions/nocodb.mjs +1 -1
- package/dist/services/definitions/ntfy.cjs +2 -3
- package/dist/services/definitions/ntfy.cjs.map +1 -1
- package/dist/services/definitions/ntfy.mjs +1 -1
- package/dist/services/definitions/ollama.cjs +2 -3
- package/dist/services/definitions/ollama.cjs.map +1 -1
- package/dist/services/definitions/ollama.mjs +1 -1
- package/dist/services/definitions/open-webui.cjs +2 -3
- package/dist/services/definitions/open-webui.cjs.map +1 -1
- package/dist/services/definitions/open-webui.mjs +1 -1
- package/dist/services/definitions/opencode.cjs +2 -3
- package/dist/services/definitions/opencode.cjs.map +1 -1
- package/dist/services/definitions/opencode.mjs +1 -1
- package/dist/services/definitions/openhands.cjs +58 -0
- package/dist/services/definitions/openhands.cjs.map +1 -0
- package/dist/services/definitions/openhands.d.cts +7 -0
- package/dist/services/definitions/openhands.d.cts.map +1 -0
- package/dist/services/definitions/openhands.d.mts +7 -0
- package/dist/services/definitions/openhands.d.mts.map +1 -0
- package/dist/services/definitions/openhands.mjs +57 -0
- package/dist/services/definitions/openhands.mjs.map +1 -0
- package/dist/services/definitions/openpanel.cjs +2 -3
- package/dist/services/definitions/openpanel.cjs.map +1 -1
- package/dist/services/definitions/openpanel.mjs +1 -1
- package/dist/services/definitions/opensearch.cjs +94 -0
- package/dist/services/definitions/opensearch.cjs.map +1 -0
- package/dist/services/definitions/opensearch.d.cts +7 -0
- package/dist/services/definitions/opensearch.d.cts.map +1 -0
- package/dist/services/definitions/opensearch.d.mts +7 -0
- package/dist/services/definitions/opensearch.d.mts.map +1 -0
- package/dist/services/definitions/opensearch.mjs +93 -0
- package/dist/services/definitions/opensearch.mjs.map +1 -0
- package/dist/services/definitions/outline.cjs +2 -3
- package/dist/services/definitions/outline.cjs.map +1 -1
- package/dist/services/definitions/outline.mjs +1 -1
- package/dist/services/definitions/paperless-ngx.cjs +2 -3
- package/dist/services/definitions/paperless-ngx.cjs.map +1 -1
- package/dist/services/definitions/paperless-ngx.mjs +1 -1
- package/dist/services/definitions/pentagi.cjs +2 -3
- package/dist/services/definitions/pentagi.cjs.map +1 -1
- package/dist/services/definitions/pentagi.mjs +1 -1
- package/dist/services/definitions/pentestagent.cjs +2 -3
- package/dist/services/definitions/pentestagent.cjs.map +1 -1
- package/dist/services/definitions/pentestagent.mjs +1 -1
- package/dist/services/definitions/playwright-server.cjs +2 -3
- package/dist/services/definitions/playwright-server.cjs.map +1 -1
- package/dist/services/definitions/playwright-server.mjs +1 -1
- package/dist/services/definitions/pocketbase.cjs +61 -0
- package/dist/services/definitions/pocketbase.cjs.map +1 -0
- package/dist/services/definitions/pocketbase.d.cts +7 -0
- package/dist/services/definitions/pocketbase.d.cts.map +1 -0
- package/dist/services/definitions/pocketbase.d.mts +7 -0
- package/dist/services/definitions/pocketbase.d.mts.map +1 -0
- package/dist/services/definitions/pocketbase.mjs +60 -0
- package/dist/services/definitions/pocketbase.mjs.map +1 -0
- package/dist/services/definitions/portainer.cjs +2 -3
- package/dist/services/definitions/portainer.cjs.map +1 -1
- package/dist/services/definitions/portainer.mjs +1 -1
- package/dist/services/definitions/postgresql.cjs +2 -3
- package/dist/services/definitions/postgresql.cjs.map +1 -1
- package/dist/services/definitions/postgresql.mjs +1 -1
- package/dist/services/definitions/postiz.cjs +2 -3
- package/dist/services/definitions/postiz.cjs.map +1 -1
- package/dist/services/definitions/postiz.mjs +1 -1
- package/dist/services/definitions/prometheus.cjs +2 -3
- package/dist/services/definitions/prometheus.cjs.map +1 -1
- package/dist/services/definitions/prometheus.mjs +1 -1
- package/dist/services/definitions/qdrant.cjs +2 -3
- package/dist/services/definitions/qdrant.cjs.map +1 -1
- package/dist/services/definitions/qdrant.mjs +1 -1
- package/dist/services/definitions/rabbitmq.cjs +80 -0
- package/dist/services/definitions/rabbitmq.cjs.map +1 -0
- package/dist/services/definitions/rabbitmq.d.cts +7 -0
- package/dist/services/definitions/rabbitmq.d.cts.map +1 -0
- package/dist/services/definitions/rabbitmq.d.mts +7 -0
- package/dist/services/definitions/rabbitmq.d.mts.map +1 -0
- package/dist/services/definitions/rabbitmq.mjs +79 -0
- package/dist/services/definitions/rabbitmq.mjs.map +1 -0
- package/dist/services/definitions/ragflow.cjs +192 -0
- package/dist/services/definitions/ragflow.cjs.map +1 -0
- package/dist/services/definitions/ragflow.d.cts +7 -0
- package/dist/services/definitions/ragflow.d.cts.map +1 -0
- package/dist/services/definitions/ragflow.d.mts +7 -0
- package/dist/services/definitions/ragflow.d.mts.map +1 -0
- package/dist/services/definitions/ragflow.mjs +191 -0
- package/dist/services/definitions/ragflow.mjs.map +1 -0
- package/dist/services/definitions/redis.cjs +2 -3
- package/dist/services/definitions/redis.cjs.map +1 -1
- package/dist/services/definitions/redis.mjs +1 -1
- package/dist/services/definitions/remotion.cjs +2 -3
- package/dist/services/definitions/remotion.cjs.map +1 -1
- package/dist/services/definitions/remotion.mjs +1 -1
- package/dist/services/definitions/restic.cjs +58 -0
- package/dist/services/definitions/restic.cjs.map +1 -0
- package/dist/services/definitions/restic.d.cts +7 -0
- package/dist/services/definitions/restic.d.cts.map +1 -0
- package/dist/services/definitions/restic.d.mts +7 -0
- package/dist/services/definitions/restic.d.mts.map +1 -0
- package/dist/services/definitions/restic.mjs +57 -0
- package/dist/services/definitions/restic.mjs.map +1 -0
- package/dist/services/definitions/rocketchat.cjs +2 -3
- package/dist/services/definitions/rocketchat.cjs.map +1 -1
- package/dist/services/definitions/rocketchat.mjs +1 -1
- package/dist/services/definitions/saleor.cjs +76 -0
- package/dist/services/definitions/saleor.cjs.map +1 -0
- package/dist/services/definitions/saleor.d.cts +7 -0
- package/dist/services/definitions/saleor.d.cts.map +1 -0
- package/dist/services/definitions/saleor.d.mts +7 -0
- package/dist/services/definitions/saleor.d.mts.map +1 -0
- package/dist/services/definitions/saleor.mjs +75 -0
- package/dist/services/definitions/saleor.mjs.map +1 -0
- package/dist/services/definitions/scrapling.cjs +2 -3
- package/dist/services/definitions/scrapling.cjs.map +1 -1
- package/dist/services/definitions/scrapling.mjs +1 -1
- package/dist/services/definitions/searxng.cjs +2 -3
- package/dist/services/definitions/searxng.cjs.map +1 -1
- package/dist/services/definitions/searxng.mjs +1 -1
- package/dist/services/definitions/signoz.cjs +2 -3
- package/dist/services/definitions/signoz.cjs.map +1 -1
- package/dist/services/definitions/signoz.mjs +1 -1
- package/dist/services/definitions/solidityguard.cjs +2 -3
- package/dist/services/definitions/solidityguard.cjs.map +1 -1
- package/dist/services/definitions/solidityguard.mjs +1 -1
- package/dist/services/definitions/stable-diffusion.cjs +2 -3
- package/dist/services/definitions/stable-diffusion.cjs.map +1 -1
- package/dist/services/definitions/stable-diffusion.mjs +1 -1
- package/dist/services/definitions/steel-browser.cjs +2 -3
- package/dist/services/definitions/steel-browser.cjs.map +1 -1
- package/dist/services/definitions/steel-browser.mjs +1 -1
- package/dist/services/definitions/stirling-pdf.cjs +74 -0
- package/dist/services/definitions/stirling-pdf.cjs.map +1 -0
- package/dist/services/definitions/stirling-pdf.d.cts +7 -0
- package/dist/services/definitions/stirling-pdf.d.cts.map +1 -0
- package/dist/services/definitions/stirling-pdf.d.mts +7 -0
- package/dist/services/definitions/stirling-pdf.d.mts.map +1 -0
- package/dist/services/definitions/stirling-pdf.mjs +73 -0
- package/dist/services/definitions/stirling-pdf.mjs.map +1 -0
- package/dist/services/definitions/strapi.cjs +124 -0
- package/dist/services/definitions/strapi.cjs.map +1 -0
- package/dist/services/definitions/strapi.d.cts +7 -0
- package/dist/services/definitions/strapi.d.cts.map +1 -0
- package/dist/services/definitions/strapi.d.mts +7 -0
- package/dist/services/definitions/strapi.d.mts.map +1 -0
- package/dist/services/definitions/strapi.mjs +123 -0
- package/dist/services/definitions/strapi.mjs.map +1 -0
- package/dist/services/definitions/stream-gateway.cjs +2 -3
- package/dist/services/definitions/stream-gateway.cjs.map +1 -1
- package/dist/services/definitions/stream-gateway.mjs +1 -1
- package/dist/services/definitions/supabase.cjs +2 -3
- package/dist/services/definitions/supabase.cjs.map +1 -1
- package/dist/services/definitions/supabase.mjs +1 -1
- package/dist/services/definitions/tailscale.cjs +2 -3
- package/dist/services/definitions/tailscale.cjs.map +1 -1
- package/dist/services/definitions/tailscale.mjs +1 -1
- package/dist/services/definitions/temporal.cjs +2 -3
- package/dist/services/definitions/temporal.cjs.map +1 -1
- package/dist/services/definitions/temporal.mjs +1 -1
- package/dist/services/definitions/traefik.cjs +2 -3
- package/dist/services/definitions/traefik.cjs.map +1 -1
- package/dist/services/definitions/traefik.mjs +1 -1
- package/dist/services/definitions/twenty.cjs +83 -0
- package/dist/services/definitions/twenty.cjs.map +1 -0
- package/dist/services/definitions/twenty.d.cts +7 -0
- package/dist/services/definitions/twenty.d.cts.map +1 -0
- package/dist/services/definitions/twenty.d.mts +7 -0
- package/dist/services/definitions/twenty.d.mts.map +1 -0
- package/dist/services/definitions/twenty.mjs +82 -0
- package/dist/services/definitions/twenty.mjs.map +1 -0
- package/dist/services/definitions/umami.cjs +2 -3
- package/dist/services/definitions/umami.cjs.map +1 -1
- package/dist/services/definitions/umami.mjs +1 -1
- package/dist/services/definitions/uptime-kuma.cjs +2 -3
- package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
- package/dist/services/definitions/uptime-kuma.mjs +1 -1
- package/dist/services/definitions/usesend.cjs +2 -3
- package/dist/services/definitions/usesend.cjs.map +1 -1
- package/dist/services/definitions/usesend.mjs +1 -1
- package/dist/services/definitions/valkey.cjs +2 -3
- package/dist/services/definitions/valkey.cjs.map +1 -1
- package/dist/services/definitions/valkey.mjs +1 -1
- package/dist/services/definitions/vault.cjs +71 -0
- package/dist/services/definitions/vault.cjs.map +1 -0
- package/dist/services/definitions/vault.d.cts +7 -0
- package/dist/services/definitions/vault.d.cts.map +1 -0
- package/dist/services/definitions/vault.d.mts +7 -0
- package/dist/services/definitions/vault.d.mts.map +1 -0
- package/dist/services/definitions/vault.mjs +70 -0
- package/dist/services/definitions/vault.mjs.map +1 -0
- package/dist/services/definitions/vaultwarden.cjs +2 -3
- package/dist/services/definitions/vaultwarden.cjs.map +1 -1
- package/dist/services/definitions/vaultwarden.mjs +1 -1
- package/dist/services/definitions/watchtower.cjs +2 -3
- package/dist/services/definitions/watchtower.cjs.map +1 -1
- package/dist/services/definitions/watchtower.mjs +1 -1
- package/dist/services/definitions/weaviate.cjs +2 -3
- package/dist/services/definitions/weaviate.cjs.map +1 -1
- package/dist/services/definitions/weaviate.mjs +1 -1
- package/dist/services/definitions/whisper.cjs +2 -3
- package/dist/services/definitions/whisper.cjs.map +1 -1
- package/dist/services/definitions/whisper.mjs +1 -1
- package/dist/services/definitions/xyops.cjs +2 -3
- package/dist/services/definitions/xyops.cjs.map +1 -1
- package/dist/services/definitions/xyops.mjs +1 -1
- package/dist/services/registry.cjs +3 -4
- package/dist/services/registry.cjs.map +1 -1
- package/dist/services/registry.d.mts.map +1 -1
- package/dist/services/registry.mjs +1 -2
- package/dist/services/registry.mjs.map +1 -1
- package/dist/services/registry.test.cjs +3 -4
- package/dist/services/registry.test.cjs.map +1 -1
- package/dist/services/registry.test.mjs +3 -4
- package/dist/services/registry.test.mjs.map +1 -1
- package/dist/{manifest-4uLbISXV.cjs → skill-manifest--IgY9REK.cjs} +40 -10
- package/dist/skill-manifest--IgY9REK.cjs.map +1 -0
- package/dist/{manifest-B8UDsVlR.mjs → skill-manifest-BVUXU0__.mjs} +24 -5
- package/dist/skill-manifest-BVUXU0__.mjs.map +1 -0
- package/dist/skills/registry.cjs +262 -3
- package/dist/skills/registry.cjs.map +1 -1
- package/dist/skills/registry.d.cts.map +1 -1
- package/dist/skills/registry.d.mts.map +1 -1
- package/dist/skills/registry.mjs +261 -1
- package/dist/skills/registry.mjs.map +1 -1
- package/dist/skills/skill-manifest.cjs +5 -23
- package/dist/skills/skill-manifest.mjs +1 -19
- package/dist/skills-BlzpHmpH.cjs +620 -0
- package/dist/skills-BlzpHmpH.cjs.map +1 -0
- package/dist/types-CR83OJiq.d.cts +243 -0
- package/dist/types-CR83OJiq.d.cts.map +1 -0
- package/dist/types-zYjGTuyn.d.mts +243 -0
- package/dist/types-zYjGTuyn.d.mts.map +1 -0
- package/dist/types.cjs +79 -3
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.mjs +78 -1
- package/dist/types.mjs.map +1 -1
- package/dist/validator.cjs +3 -4
- package/dist/validator.cjs.map +1 -1
- package/dist/validator.mjs +1 -2
- package/dist/validator.mjs.map +1 -1
- package/dist/validator.test.cjs +5 -6
- package/dist/validator.test.cjs.map +1 -1
- package/dist/validator.test.mjs +3 -4
- package/dist/validator.test.mjs.map +1 -1
- package/dist/version-manager.cjs +3 -4
- package/dist/version-manager.cjs.map +1 -1
- package/dist/version-manager.d.mts.map +1 -1
- package/dist/version-manager.mjs +1 -2
- package/dist/version-manager.mjs.map +1 -1
- package/dist/version-manager.test.cjs +5 -6
- package/dist/version-manager.test.cjs.map +1 -1
- package/dist/version-manager.test.mjs +3 -4
- package/dist/version-manager.test.mjs.map +1 -1
- package/dist/{vi.2VT5v0um-BmRMvymT.cjs → vi.2VT5v0um-CRqXre87.cjs} +82 -202
- package/dist/{vi.2VT5v0um-CFyDIn0m.mjs.map → vi.2VT5v0um-CRqXre87.cjs.map} +1 -1
- package/dist/{vi.2VT5v0um-CFyDIn0m.mjs → vi.2VT5v0um-DvC3SVNc.mjs} +67 -186
- package/dist/{vi.2VT5v0um-BmRMvymT.cjs.map → vi.2VT5v0um-DvC3SVNc.mjs.map} +1 -1
- package/package.json +3 -3
- package/src/generators/postgres-init.ts +6 -0
- package/src/presets/presets.test.ts +4 -0
- package/src/presets/registry.ts +88 -0
- package/src/schema.ts +11 -0
- package/src/services/definitions/airbyte.ts +75 -0
- package/src/services/definitions/airflow.ts +109 -0
- package/src/services/definitions/appwrite.ts +181 -0
- package/src/services/definitions/authelia.ts +145 -0
- package/src/services/definitions/axolotl.ts +65 -0
- package/src/services/definitions/chatwoot-worker.ts +93 -0
- package/src/services/definitions/chatwoot.ts +106 -0
- package/src/services/definitions/dagster.ts +82 -0
- package/src/services/definitions/directus.ts +115 -0
- package/src/services/definitions/duplicati.ts +77 -0
- package/src/services/definitions/excalidraw.ts +46 -0
- package/src/services/definitions/firecrawl-playwright.ts +62 -0
- package/src/services/definitions/firecrawl.ts +146 -0
- package/src/services/definitions/flagsmith.ts +76 -0
- package/src/services/definitions/fonoster.ts +67 -0
- package/src/services/definitions/formbricks.ts +75 -0
- package/src/services/definitions/hedgedoc.ts +81 -0
- package/src/services/definitions/heyform.ts +67 -0
- package/src/services/definitions/hoppscotch.ts +74 -0
- package/src/services/definitions/index.ts +124 -0
- package/src/services/definitions/infisical.ts +97 -0
- package/src/services/definitions/keycloak.ts +119 -0
- package/src/services/definitions/kong.ts +116 -0
- package/src/services/definitions/lago.ts +95 -0
- package/src/services/definitions/langflow.ts +82 -0
- package/src/services/definitions/langfuse.ts +76 -0
- package/src/services/definitions/listmonk.ts +118 -0
- package/src/services/definitions/mariadb.ts +82 -0
- package/src/services/definitions/mautic.ts +82 -0
- package/src/services/definitions/medusa.ts +82 -0
- package/src/services/definitions/mysql.ts +82 -0
- package/src/services/definitions/openhands.ts +60 -0
- package/src/services/definitions/opensearch.ts +95 -0
- package/src/services/definitions/pocketbase.ts +62 -0
- package/src/services/definitions/rabbitmq.ts +81 -0
- package/src/services/definitions/ragflow.ts +175 -0
- package/src/services/definitions/restic.ts +60 -0
- package/src/services/definitions/saleor.ts +75 -0
- package/src/services/definitions/stirling-pdf.ts +73 -0
- package/src/services/definitions/strapi.ts +124 -0
- package/src/services/definitions/twenty.ts +82 -0
- package/src/services/definitions/vault.ts +74 -0
- package/src/skills/manifest.json +8 -0
- package/src/skills/registry.ts +119 -0
- package/src/types.ts +91 -2
- package/dist/chunk-C0xms8kb.cjs +0 -34
- package/dist/deployers/coolify.d.cts.map +0 -1
- package/dist/deployers/coolify.d.mts.map +0 -1
- package/dist/deployers/dokploy.d.cts.map +0 -1
- package/dist/deployers/dokploy.d.mts.map +0 -1
- package/dist/deployers/types.d.cts.map +0 -1
- package/dist/deployers/types.d.mts.map +0 -1
- package/dist/generators/skills.cjs.map +0 -1
- package/dist/manifest-4uLbISXV.cjs.map +0 -1
- package/dist/manifest-B8UDsVlR.mjs.map +0 -1
- package/dist/schema.d.cts.map +0 -1
- package/dist/schema.d.mts.map +0 -1
- package/dist/skills/skill-manifest.cjs.map +0 -1
- package/dist/skills/skill-manifest.mjs.map +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
//#region src/bare-metal-partition.ts
|
|
4
3
|
/**
|
|
5
4
|
* Maps Platform (e.g. linux/amd64) to NativePlatform (linux, windows, macos).
|
|
@@ -45,9 +44,9 @@ function resolvedWithOnlyServices(resolved, services) {
|
|
|
45
44
|
services: resolved.services.filter((s) => idSet.has(s.definition.id))
|
|
46
45
|
};
|
|
47
46
|
}
|
|
48
|
-
|
|
49
47
|
//#endregion
|
|
50
48
|
exports.partitionBareMetal = partitionBareMetal;
|
|
51
49
|
exports.platformToNativePlatform = platformToNativePlatform;
|
|
52
50
|
exports.resolvedWithOnlyServices = resolvedWithOnlyServices;
|
|
51
|
+
|
|
53
52
|
//# sourceMappingURL=bare-metal-partition.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bare-metal-partition.cjs","names":[],"sources":["../src/bare-metal-partition.ts"],"sourcesContent":["import type { NativePlatform, Platform, ResolvedService, ResolverOutput } from \"./types.js\";\n\n/**\n * Maps Platform (e.g. linux/amd64) to NativePlatform (linux, windows, macos).\n */\nexport function platformToNativePlatform(platform: Platform): NativePlatform {\n\tif (platform.startsWith(\"linux/\")) return \"linux\";\n\tif (platform.startsWith(\"windows/\")) return \"windows\";\n\tif (platform.startsWith(\"macos/\")) return \"macos\";\n\tconsole.warn(`Unknown platform prefix in \"${platform}\", defaulting to linux`);\n\treturn \"linux\";\n}\n\nexport interface BareMetalPartitionResult {\n\tnativeServices: ResolvedService[];\n\tdockerOnlyServices: ResolvedService[];\n\tnativeIds: Set<string>;\n}\n\n/**\n * Partitions resolved services into native (run on host via scripts) vs Docker-only.\n * Gateway and CLI are never native; services with nativeSupported and a matching\n * nativeRecipe for the platform go to native, rest to Docker.\n */\nexport function partitionBareMetal(\n\tresolved: ResolverOutput,\n\tplatform: Platform,\n): BareMetalPartitionResult {\n\tconst nativePlatform = platformToNativePlatform(platform);\n\tconst nativeServices: ResolvedService[] = [];\n\tconst dockerOnlyServices: ResolvedService[] = [];\n\tconst nativeIds = new Set<string>();\n\n\tfor (const entry of resolved.services) {\n\t\tconst def = entry.definition;\n\t\tconst hasNativeRecipe =\n\t\t\tdef.nativeSupported === true &&\n\t\t\tdef.nativeRecipes?.length &&\n\t\t\tdef.nativeRecipes.some((r) => r.platform === nativePlatform);\n\n\t\tif (hasNativeRecipe) {\n\t\t\tnativeServices.push(entry);\n\t\t\tnativeIds.add(def.id);\n\t\t} else {\n\t\t\tdockerOnlyServices.push(entry);\n\t\t}\n\t}\n\n\treturn { nativeServices, dockerOnlyServices, nativeIds };\n}\n\n/**\n * Returns a new ResolverOutput containing only the given service list (same order).\n * Used to build compose for Docker-only subset when bare-metal has native services.\n */\nexport function resolvedWithOnlyServices(\n\tresolved: ResolverOutput,\n\tservices: ResolvedService[],\n): ResolverOutput {\n\tconst idSet = new Set(services.map((s) => s.definition.id));\n\treturn {\n\t\t...resolved,\n\t\tservices: resolved.services.filter((s) => idSet.has(s.definition.id)),\n\t};\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bare-metal-partition.cjs","names":[],"sources":["../src/bare-metal-partition.ts"],"sourcesContent":["import type { NativePlatform, Platform, ResolvedService, ResolverOutput } from \"./types.js\";\n\n/**\n * Maps Platform (e.g. linux/amd64) to NativePlatform (linux, windows, macos).\n */\nexport function platformToNativePlatform(platform: Platform): NativePlatform {\n\tif (platform.startsWith(\"linux/\")) return \"linux\";\n\tif (platform.startsWith(\"windows/\")) return \"windows\";\n\tif (platform.startsWith(\"macos/\")) return \"macos\";\n\tconsole.warn(`Unknown platform prefix in \"${platform}\", defaulting to linux`);\n\treturn \"linux\";\n}\n\nexport interface BareMetalPartitionResult {\n\tnativeServices: ResolvedService[];\n\tdockerOnlyServices: ResolvedService[];\n\tnativeIds: Set<string>;\n}\n\n/**\n * Partitions resolved services into native (run on host via scripts) vs Docker-only.\n * Gateway and CLI are never native; services with nativeSupported and a matching\n * nativeRecipe for the platform go to native, rest to Docker.\n */\nexport function partitionBareMetal(\n\tresolved: ResolverOutput,\n\tplatform: Platform,\n): BareMetalPartitionResult {\n\tconst nativePlatform = platformToNativePlatform(platform);\n\tconst nativeServices: ResolvedService[] = [];\n\tconst dockerOnlyServices: ResolvedService[] = [];\n\tconst nativeIds = new Set<string>();\n\n\tfor (const entry of resolved.services) {\n\t\tconst def = entry.definition;\n\t\tconst hasNativeRecipe =\n\t\t\tdef.nativeSupported === true &&\n\t\t\tdef.nativeRecipes?.length &&\n\t\t\tdef.nativeRecipes.some((r) => r.platform === nativePlatform);\n\n\t\tif (hasNativeRecipe) {\n\t\t\tnativeServices.push(entry);\n\t\t\tnativeIds.add(def.id);\n\t\t} else {\n\t\t\tdockerOnlyServices.push(entry);\n\t\t}\n\t}\n\n\treturn { nativeServices, dockerOnlyServices, nativeIds };\n}\n\n/**\n * Returns a new ResolverOutput containing only the given service list (same order).\n * Used to build compose for Docker-only subset when bare-metal has native services.\n */\nexport function resolvedWithOnlyServices(\n\tresolved: ResolverOutput,\n\tservices: ResolvedService[],\n): ResolverOutput {\n\tconst idSet = new Set(services.map((s) => s.definition.id));\n\treturn {\n\t\t...resolved,\n\t\tservices: resolved.services.filter((s) => idSet.has(s.definition.id)),\n\t};\n}\n"],"mappings":";;;;;AAKA,SAAgB,yBAAyB,UAAoC;AAC5E,KAAI,SAAS,WAAW,SAAS,CAAE,QAAO;AAC1C,KAAI,SAAS,WAAW,WAAW,CAAE,QAAO;AAC5C,KAAI,SAAS,WAAW,SAAS,CAAE,QAAO;AAC1C,SAAQ,KAAK,+BAA+B,SAAS,wBAAwB;AAC7E,QAAO;;;;;;;AAcR,SAAgB,mBACf,UACA,UAC2B;CAC3B,MAAM,iBAAiB,yBAAyB,SAAS;CACzD,MAAM,iBAAoC,EAAE;CAC5C,MAAM,qBAAwC,EAAE;CAChD,MAAM,4BAAY,IAAI,KAAa;AAEnC,MAAK,MAAM,SAAS,SAAS,UAAU;EACtC,MAAM,MAAM,MAAM;AAMlB,MAJC,IAAI,oBAAoB,QACxB,IAAI,eAAe,UACnB,IAAI,cAAc,MAAM,MAAM,EAAE,aAAa,eAAe,EAExC;AACpB,kBAAe,KAAK,MAAM;AAC1B,aAAU,IAAI,IAAI,GAAG;QAErB,oBAAmB,KAAK,MAAM;;AAIhC,QAAO;EAAE;EAAgB;EAAoB;EAAW;;;;;;AAOzD,SAAgB,yBACf,UACA,UACiB;CACjB,MAAM,QAAQ,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,WAAW,GAAG,CAAC;AAC3D,QAAO;EACN,GAAG;EACH,UAAU,SAAS,SAAS,QAAQ,MAAM,MAAM,IAAI,EAAE,WAAW,GAAG,CAAC;EACrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bare-metal-partition.d.mts","names":[],"sources":["../src/bare-metal-partition.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bare-metal-partition.d.mts","names":[],"sources":["../src/bare-metal-partition.ts"],"mappings":";;;;;;iBAKgB,wBAAA,CAAyB,QAAA,EAAU,QAAA,GAAW,cAAA;AAAA,UAQ7C,wBAAA;EAChB,cAAA,EAAgB,eAAA;EAChB,kBAAA,EAAoB,eAAA;EACpB,SAAA,EAAW,GAAA;AAAA;;;;AAHZ;;iBAWgB,kBAAA,CACf,QAAA,EAAU,cAAA,EACV,QAAA,EAAU,QAAA,GACR,wBAAA;;;;;iBA4Ba,wBAAA,CACf,QAAA,EAAU,cAAA,EACV,QAAA,EAAU,eAAA,KACR,cAAA"}
|
|
@@ -43,7 +43,7 @@ function resolvedWithOnlyServices(resolved, services) {
|
|
|
43
43
|
services: resolved.services.filter((s) => idSet.has(s.definition.id))
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
|
|
47
46
|
//#endregion
|
|
48
47
|
export { partitionBareMetal, platformToNativePlatform, resolvedWithOnlyServices };
|
|
48
|
+
|
|
49
49
|
//# sourceMappingURL=bare-metal-partition.mjs.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
const require_vi_2VT5v0um = require(
|
|
2
|
-
const require_bare_metal_partition = require(
|
|
3
|
-
const require_resolver = require(
|
|
4
|
-
|
|
1
|
+
const require_vi_2VT5v0um = require("./vi.2VT5v0um-CRqXre87.cjs");
|
|
2
|
+
const require_bare_metal_partition = require("./bare-metal-partition.cjs");
|
|
3
|
+
const require_resolver = require("./resolver.cjs");
|
|
5
4
|
//#region src/bare-metal-partition.test.ts
|
|
6
5
|
require_vi_2VT5v0um.describe("bare-metal partition", () => {
|
|
7
6
|
require_vi_2VT5v0um.it("platformToNativePlatform maps platform to native", () => {
|
|
@@ -52,6 +51,6 @@ require_vi_2VT5v0um.describe("bare-metal partition", () => {
|
|
|
52
51
|
require_vi_2VT5v0um.globalExpect(filtered.services.some((s) => s.definition.id === "n8n")).toBe(true);
|
|
53
52
|
});
|
|
54
53
|
});
|
|
55
|
-
|
|
56
54
|
//#endregion
|
|
55
|
+
|
|
57
56
|
//# sourceMappingURL=bare-metal-partition.test.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bare-metal-partition.test.cjs","names":["describe","platformToNativePlatform","partitionBareMetal","resolve","resolvedWithOnlyServices"],"sources":["../src/bare-metal-partition.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { resolve } from \"./resolver.js\";\n\ndescribe(\"bare-metal partition\", () => {\n\tit(\"platformToNativePlatform maps platform to native\", () => {\n\t\texpect(platformToNativePlatform(\"linux/amd64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"linux/arm64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"windows/amd64\")).toBe(\"windows\");\n\t\texpect(platformToNativePlatform(\"macos/arm64\")).toBe(\"macos\");\n\t});\n\n\tit(\"partitions redis as native on Linux when redis has native recipe\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"redis\")).toBe(true);\n\t\texpect(result.nativeServices.length).toBe(1);\n\t\texpect(result.nativeServices[0].definition.id).toBe(\"redis\");\n\t\texpect(result.dockerOnlyServices.length).toBe(0);\n\t});\n\n\tit(\"partitions n8n as Docker-only (no native recipe)\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"n8n\")).toBe(false);\n\t\texpect(result.nativeServices.length).toBe(0);\n\t\texpect(result.dockerOnlyServices.length).toBeGreaterThanOrEqual(1);\n\t\texpect(result.dockerOnlyServices.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n\n\tit(\"resolvedWithOnlyServices filters to given service list\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst partition = partitionBareMetal(resolved, \"linux/amd64\");\n\t\tconst filtered = resolvedWithOnlyServices(resolved, partition.dockerOnlyServices);\n\t\texpect(filtered.services.every((s) => s.definition.id !== \"redis\")).toBe(true);\n\t\texpect(filtered.services.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bare-metal-partition.test.cjs","names":["describe","platformToNativePlatform","partitionBareMetal","resolve","resolvedWithOnlyServices"],"sources":["../src/bare-metal-partition.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { resolve } from \"./resolver.js\";\n\ndescribe(\"bare-metal partition\", () => {\n\tit(\"platformToNativePlatform maps platform to native\", () => {\n\t\texpect(platformToNativePlatform(\"linux/amd64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"linux/arm64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"windows/amd64\")).toBe(\"windows\");\n\t\texpect(platformToNativePlatform(\"macos/arm64\")).toBe(\"macos\");\n\t});\n\n\tit(\"partitions redis as native on Linux when redis has native recipe\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"redis\")).toBe(true);\n\t\texpect(result.nativeServices.length).toBe(1);\n\t\texpect(result.nativeServices[0].definition.id).toBe(\"redis\");\n\t\texpect(result.dockerOnlyServices.length).toBe(0);\n\t});\n\n\tit(\"partitions n8n as Docker-only (no native recipe)\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"n8n\")).toBe(false);\n\t\texpect(result.nativeServices.length).toBe(0);\n\t\texpect(result.dockerOnlyServices.length).toBeGreaterThanOrEqual(1);\n\t\texpect(result.dockerOnlyServices.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n\n\tit(\"resolvedWithOnlyServices filters to given service list\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst partition = partitionBareMetal(resolved, \"linux/amd64\");\n\t\tconst filtered = resolvedWithOnlyServices(resolved, partition.dockerOnlyServices);\n\t\texpect(filtered.services.every((s) => s.definition.id !== \"redis\")).toBe(true);\n\t\texpect(filtered.services.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n});\n"],"mappings":";;;;AAQAA,oBAAAA,SAAS,8BAA8B;AACtC,qBAAA,GAAG,0DAA0D;AAC5D,sBAAA,aAAOC,6BAAAA,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;AAC7D,sBAAA,aAAOA,6BAAAA,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;AAC7D,sBAAA,aAAOA,6BAAAA,yBAAyB,gBAAgB,CAAC,CAAC,KAAK,UAAU;AACjE,sBAAA,aAAOA,6BAAAA,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;GAC5D;AAEF,qBAAA,GAAG,0EAA0E;EAS5E,MAAM,SAASC,6BAAAA,mBAREC,iBAAAA,QAAQ;GACxB,UAAU,CAAC,QAAQ;GACnB,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC,EAC0C,cAAc;AAC1D,sBAAA,aAAO,OAAO,UAAU,IAAI,QAAQ,CAAC,CAAC,KAAK,KAAK;AAChD,sBAAA,aAAO,OAAO,eAAe,OAAO,CAAC,KAAK,EAAE;AAC5C,sBAAA,aAAO,OAAO,eAAe,GAAG,WAAW,GAAG,CAAC,KAAK,QAAQ;AAC5D,sBAAA,aAAO,OAAO,mBAAmB,OAAO,CAAC,KAAK,EAAE;GAC/C;AAEF,qBAAA,GAAG,0DAA0D;EAS5D,MAAM,SAASD,6BAAAA,mBAREC,iBAAAA,QAAQ;GACxB,UAAU,CAAC,MAAM;GACjB,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC,EAC0C,cAAc;AAC1D,sBAAA,aAAO,OAAO,UAAU,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM;AAC/C,sBAAA,aAAO,OAAO,eAAe,OAAO,CAAC,KAAK,EAAE;AAC5C,sBAAA,aAAO,OAAO,mBAAmB,OAAO,CAAC,uBAAuB,EAAE;AAClE,sBAAA,aAAO,OAAO,mBAAmB,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;GAClF;AAEF,qBAAA,GAAG,gEAAgE;EAClE,MAAM,WAAWA,iBAAAA,QAAQ;GACxB,UAAU,CAAC,SAAS,MAAM;GAC1B,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC;EAEF,MAAM,WAAWC,6BAAAA,yBAAyB,UADxBF,6BAAAA,mBAAmB,UAAU,cAAc,CACC,mBAAmB;AACjF,sBAAA,aAAO,SAAS,SAAS,OAAO,MAAM,EAAE,WAAW,OAAO,QAAQ,CAAC,CAAC,KAAK,KAAK;AAC9E,sBAAA,aAAO,SAAS,SAAS,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;GAC1E;EACD"}
|
|
@@ -1,7 +1,6 @@
|
|
|
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-DvC3SVNc.mjs";
|
|
2
2
|
import { partitionBareMetal, platformToNativePlatform, resolvedWithOnlyServices } from "./bare-metal-partition.mjs";
|
|
3
3
|
import { resolve } from "./resolver.mjs";
|
|
4
|
-
|
|
5
4
|
//#region src/bare-metal-partition.test.ts
|
|
6
5
|
describe("bare-metal partition", () => {
|
|
7
6
|
it("platformToNativePlatform maps platform to native", () => {
|
|
@@ -52,7 +51,7 @@ describe("bare-metal partition", () => {
|
|
|
52
51
|
globalExpect(filtered.services.some((s) => s.definition.id === "n8n")).toBe(true);
|
|
53
52
|
});
|
|
54
53
|
});
|
|
55
|
-
|
|
56
54
|
//#endregion
|
|
57
|
-
export {
|
|
55
|
+
export {};
|
|
56
|
+
|
|
58
57
|
//# sourceMappingURL=bare-metal-partition.test.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bare-metal-partition.test.mjs","names":[],"sources":["../src/bare-metal-partition.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { resolve } from \"./resolver.js\";\n\ndescribe(\"bare-metal partition\", () => {\n\tit(\"platformToNativePlatform maps platform to native\", () => {\n\t\texpect(platformToNativePlatform(\"linux/amd64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"linux/arm64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"windows/amd64\")).toBe(\"windows\");\n\t\texpect(platformToNativePlatform(\"macos/arm64\")).toBe(\"macos\");\n\t});\n\n\tit(\"partitions redis as native on Linux when redis has native recipe\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"redis\")).toBe(true);\n\t\texpect(result.nativeServices.length).toBe(1);\n\t\texpect(result.nativeServices[0].definition.id).toBe(\"redis\");\n\t\texpect(result.dockerOnlyServices.length).toBe(0);\n\t});\n\n\tit(\"partitions n8n as Docker-only (no native recipe)\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"n8n\")).toBe(false);\n\t\texpect(result.nativeServices.length).toBe(0);\n\t\texpect(result.dockerOnlyServices.length).toBeGreaterThanOrEqual(1);\n\t\texpect(result.dockerOnlyServices.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n\n\tit(\"resolvedWithOnlyServices filters to given service list\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst partition = partitionBareMetal(resolved, \"linux/amd64\");\n\t\tconst filtered = resolvedWithOnlyServices(resolved, partition.dockerOnlyServices);\n\t\texpect(filtered.services.every((s) => s.definition.id !== \"redis\")).toBe(true);\n\t\texpect(filtered.services.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bare-metal-partition.test.mjs","names":[],"sources":["../src/bare-metal-partition.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { resolve } from \"./resolver.js\";\n\ndescribe(\"bare-metal partition\", () => {\n\tit(\"platformToNativePlatform maps platform to native\", () => {\n\t\texpect(platformToNativePlatform(\"linux/amd64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"linux/arm64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"windows/amd64\")).toBe(\"windows\");\n\t\texpect(platformToNativePlatform(\"macos/arm64\")).toBe(\"macos\");\n\t});\n\n\tit(\"partitions redis as native on Linux when redis has native recipe\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"redis\")).toBe(true);\n\t\texpect(result.nativeServices.length).toBe(1);\n\t\texpect(result.nativeServices[0].definition.id).toBe(\"redis\");\n\t\texpect(result.dockerOnlyServices.length).toBe(0);\n\t});\n\n\tit(\"partitions n8n as Docker-only (no native recipe)\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"n8n\")).toBe(false);\n\t\texpect(result.nativeServices.length).toBe(0);\n\t\texpect(result.dockerOnlyServices.length).toBeGreaterThanOrEqual(1);\n\t\texpect(result.dockerOnlyServices.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n\n\tit(\"resolvedWithOnlyServices filters to given service list\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst partition = partitionBareMetal(resolved, \"linux/amd64\");\n\t\tconst filtered = resolvedWithOnlyServices(resolved, partition.dockerOnlyServices);\n\t\texpect(filtered.services.every((s) => s.definition.id !== \"redis\")).toBe(true);\n\t\texpect(filtered.services.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n});\n"],"mappings":";;;;AAQA,SAAS,8BAA8B;AACtC,IAAG,0DAA0D;AAC5D,eAAO,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;AAC7D,eAAO,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;AAC7D,eAAO,yBAAyB,gBAAgB,CAAC,CAAC,KAAK,UAAU;AACjE,eAAO,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;GAC5D;AAEF,IAAG,0EAA0E;EAS5E,MAAM,SAAS,mBARE,QAAQ;GACxB,UAAU,CAAC,QAAQ;GACnB,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC,EAC0C,cAAc;AAC1D,eAAO,OAAO,UAAU,IAAI,QAAQ,CAAC,CAAC,KAAK,KAAK;AAChD,eAAO,OAAO,eAAe,OAAO,CAAC,KAAK,EAAE;AAC5C,eAAO,OAAO,eAAe,GAAG,WAAW,GAAG,CAAC,KAAK,QAAQ;AAC5D,eAAO,OAAO,mBAAmB,OAAO,CAAC,KAAK,EAAE;GAC/C;AAEF,IAAG,0DAA0D;EAS5D,MAAM,SAAS,mBARE,QAAQ;GACxB,UAAU,CAAC,MAAM;GACjB,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC,EAC0C,cAAc;AAC1D,eAAO,OAAO,UAAU,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM;AAC/C,eAAO,OAAO,eAAe,OAAO,CAAC,KAAK,EAAE;AAC5C,eAAO,OAAO,mBAAmB,OAAO,CAAC,uBAAuB,EAAE;AAClE,eAAO,OAAO,mBAAmB,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;GAClF;AAEF,IAAG,gEAAgE;EAClE,MAAM,WAAW,QAAQ;GACxB,UAAU,CAAC,SAAS,MAAM;GAC1B,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC;EAEF,MAAM,WAAW,yBAAyB,UADxB,mBAAmB,UAAU,cAAc,CACC,mBAAmB;AACjF,eAAO,SAAS,SAAS,OAAO,MAAM,EAAE,WAAW,OAAO,QAAQ,CAAC,CAAC,KAAK,KAAK;AAC9E,eAAO,SAAS,SAAS,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;GAC1E;EACD"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
const
|
|
2
|
-
const require_generate = require(
|
|
3
|
-
const require_presets_registry = require(
|
|
1
|
+
const require_skills = require("./skills-BlzpHmpH.cjs");
|
|
2
|
+
const require_generate = require("./generate.cjs");
|
|
3
|
+
const require_presets_registry = require("./presets/registry.cjs");
|
|
4
4
|
let yaml = require("yaml");
|
|
5
|
-
yaml =
|
|
6
|
-
|
|
5
|
+
yaml = require_skills.__toESM(yaml);
|
|
7
6
|
//#region src/compose-validation.test.ts
|
|
8
7
|
const allPresets = require_presets_registry.getAllPresets();
|
|
9
8
|
describe("docker compose config integration tests", () => {
|
|
@@ -62,6 +61,6 @@ describe("docker compose config integration tests", () => {
|
|
|
62
61
|
});
|
|
63
62
|
});
|
|
64
63
|
});
|
|
65
|
-
|
|
66
64
|
//#endregion
|
|
65
|
+
|
|
67
66
|
//# sourceMappingURL=compose-validation.test.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-validation.test.cjs","names":["getAllPresets","generate"],"sources":["../src/compose-validation.test.ts"],"sourcesContent":["import * as yaml from \"yaml\";\nimport { generate } from \"./generate.js\";\nimport { getAllPresets } from \"./presets/registry.js\";\n\nconst allPresets = getAllPresets();\n\ndescribe(\"docker compose config integration tests\", () => {\n\tfor (const preset of allPresets) {\n\t\tdescribe(`preset \"${preset.id}\"`, () => {\n\t\t\tconst result = generate({\n\t\t\t\tprojectName: \"test-project\",\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\taiProviders: [],\n\t\t\t\tgsdRuntimes: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tdeploymentType: \"docker\",\n\t\t\t\tgenerateSecrets: false,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\tconst composeContent = result.files[\"docker-compose.yml\"]!;\n\t\t\tconst parsed = yaml.parse(composeContent);\n\n\t\t\tit(\"parses as valid YAML\", () => {\n\t\t\t\texpect(parsed).toBeDefined();\n\t\t\t\texpect(typeof parsed).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"every service has an image field\", () => {\n\t\t\t\texpect(parsed.services).toBeDefined();\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\texpect(\n\t\t\t\t\t\t(service as Record<string, unknown>).image,\n\t\t\t\t\t\t`service \"${name}\" is missing an image field`,\n\t\t\t\t\t).toBeDefined();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"every service has restart or uses default\", () => {\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\t// A service should either have an explicit restart policy\n\t\t\t\t\t// or rely on the default (which means the field can be absent).\n\t\t\t\t\t// We just verify that if restart is set, it is a valid value.\n\t\t\t\t\tif (svc.restart !== undefined) {\n\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t[\"always\", \"unless-stopped\", \"on-failure\", \"no\"].includes(svc.restart as string),\n\t\t\t\t\t\t\t`service \"${name}\" has invalid restart policy: ${svc.restart}`,\n\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"has networks defined\", () => {\n\t\t\t\texpect(parsed.networks).toBeDefined();\n\t\t\t\texpect(typeof parsed.networks).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"named volumes referenced by services are declared in top-level volumes\", () => {\n\t\t\t\tconst topLevelVolumes = parsed.volumes\n\t\t\t\t\t? new Set(Object.keys(parsed.volumes))\n\t\t\t\t\t: new Set<string>();\n\n\t\t\t\tfor (const [serviceName, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\tconst volumes = svc.volumes as string[] | undefined;\n\t\t\t\t\tif (!volumes) continue;\n\n\t\t\t\t\tfor (const vol of volumes) {\n\t\t\t\t\t\tconst volStr = typeof vol === \"string\" ? vol : (vol as { source?: string })?.source;\n\t\t\t\t\t\tif (typeof volStr !== \"string\") continue;\n\n\t\t\t\t\t\t// Named volumes follow the pattern \"name:path\" (no leading . or /)\n\t\t\t\t\t\t// Bind mounts start with . or / or use an absolute path\n\t\t\t\t\t\tconst parts = volStr.split(\":\");\n\t\t\t\t\t\tconst source = parts[0]!;\n\t\t\t\t\t\tconst isNamedVolume =\n\t\t\t\t\t\t\tsource.length > 0 &&\n\t\t\t\t\t\t\t!source.startsWith(\".\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"/\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"~\") &&\n\t\t\t\t\t\t\t!source.includes(\"\\\\\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"$\") &&\n\t\t\t\t\t\t\t!source.includes(\"${\");\n\n\t\t\t\t\t\tif (isNamedVolume) {\n\t\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t\ttopLevelVolumes.has(source),\n\t\t\t\t\t\t\t\t`service \"${serviceName}\" references named volume \"${source}\" which is not declared in top-level volumes`,\n\t\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"compose-validation.test.cjs","names":["getAllPresets","generate"],"sources":["../src/compose-validation.test.ts"],"sourcesContent":["import * as yaml from \"yaml\";\nimport { generate } from \"./generate.js\";\nimport { getAllPresets } from \"./presets/registry.js\";\n\nconst allPresets = getAllPresets();\n\ndescribe(\"docker compose config integration tests\", () => {\n\tfor (const preset of allPresets) {\n\t\tdescribe(`preset \"${preset.id}\"`, () => {\n\t\t\tconst result = generate({\n\t\t\t\tprojectName: \"test-project\",\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\taiProviders: [],\n\t\t\t\tgsdRuntimes: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tdeploymentType: \"docker\",\n\t\t\t\tgenerateSecrets: false,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\tconst composeContent = result.files[\"docker-compose.yml\"]!;\n\t\t\tconst parsed = yaml.parse(composeContent);\n\n\t\t\tit(\"parses as valid YAML\", () => {\n\t\t\t\texpect(parsed).toBeDefined();\n\t\t\t\texpect(typeof parsed).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"every service has an image field\", () => {\n\t\t\t\texpect(parsed.services).toBeDefined();\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\texpect(\n\t\t\t\t\t\t(service as Record<string, unknown>).image,\n\t\t\t\t\t\t`service \"${name}\" is missing an image field`,\n\t\t\t\t\t).toBeDefined();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"every service has restart or uses default\", () => {\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\t// A service should either have an explicit restart policy\n\t\t\t\t\t// or rely on the default (which means the field can be absent).\n\t\t\t\t\t// We just verify that if restart is set, it is a valid value.\n\t\t\t\t\tif (svc.restart !== undefined) {\n\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t[\"always\", \"unless-stopped\", \"on-failure\", \"no\"].includes(svc.restart as string),\n\t\t\t\t\t\t\t`service \"${name}\" has invalid restart policy: ${svc.restart}`,\n\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"has networks defined\", () => {\n\t\t\t\texpect(parsed.networks).toBeDefined();\n\t\t\t\texpect(typeof parsed.networks).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"named volumes referenced by services are declared in top-level volumes\", () => {\n\t\t\t\tconst topLevelVolumes = parsed.volumes\n\t\t\t\t\t? new Set(Object.keys(parsed.volumes))\n\t\t\t\t\t: new Set<string>();\n\n\t\t\t\tfor (const [serviceName, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\tconst volumes = svc.volumes as string[] | undefined;\n\t\t\t\t\tif (!volumes) continue;\n\n\t\t\t\t\tfor (const vol of volumes) {\n\t\t\t\t\t\tconst volStr = typeof vol === \"string\" ? vol : (vol as { source?: string })?.source;\n\t\t\t\t\t\tif (typeof volStr !== \"string\") continue;\n\n\t\t\t\t\t\t// Named volumes follow the pattern \"name:path\" (no leading . or /)\n\t\t\t\t\t\t// Bind mounts start with . or / or use an absolute path\n\t\t\t\t\t\tconst parts = volStr.split(\":\");\n\t\t\t\t\t\tconst source = parts[0]!;\n\t\t\t\t\t\tconst isNamedVolume =\n\t\t\t\t\t\t\tsource.length > 0 &&\n\t\t\t\t\t\t\t!source.startsWith(\".\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"/\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"~\") &&\n\t\t\t\t\t\t\t!source.includes(\"\\\\\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"$\") &&\n\t\t\t\t\t\t\t!source.includes(\"${\");\n\n\t\t\t\t\t\tif (isNamedVolume) {\n\t\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t\ttopLevelVolumes.has(source),\n\t\t\t\t\t\t\t\t`service \"${serviceName}\" references named volume \"${source}\" which is not declared in top-level volumes`,\n\t\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n});\n"],"mappings":";;;;;;AAIA,MAAM,aAAaA,yBAAAA,eAAe;AAElC,SAAS,iDAAiD;AACzD,MAAK,MAAM,UAAU,WACpB,UAAS,WAAW,OAAO,GAAG,UAAU;EAiBvC,MAAM,iBAhBSC,iBAAAA,SAAS;GACvB,aAAa;GACb,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,aAAa,EAAE;GACf,aAAa,EAAE;GACf,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,iBAAiB;GACjB,YAAY;GACZ,CAAC,CAE4B,MAAM;EACpC,MAAM,SAAS,KAAK,MAAM,eAAe;AAEzC,KAAG,8BAA8B;AAChC,UAAO,OAAO,CAAC,aAAa;AAC5B,UAAO,OAAO,OAAO,CAAC,KAAK,SAAS;IACnC;AAEF,KAAG,0CAA0C;AAC5C,UAAO,OAAO,SAAS,CAAC,aAAa;AACrC,QAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,SAAS,CAC5D,QACE,QAAoC,OACrC,YAAY,KAAK,6BACjB,CAAC,aAAa;IAEf;AAEF,KAAG,mDAAmD;AACrD,QAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,SAAS,EAAE;IAC9D,MAAM,MAAM;AAIZ,QAAI,IAAI,YAAY,KAAA,EACnB,QACC;KAAC;KAAU;KAAkB;KAAc;KAAK,CAAC,SAAS,IAAI,QAAkB,EAChF,YAAY,KAAK,gCAAgC,IAAI,UACrD,CAAC,KAAK,KAAK;;IAGb;AAEF,KAAG,8BAA8B;AAChC,UAAO,OAAO,SAAS,CAAC,aAAa;AACrC,UAAO,OAAO,OAAO,SAAS,CAAC,KAAK,SAAS;IAC5C;AAEF,KAAG,gFAAgF;GAClF,MAAM,kBAAkB,OAAO,UAC5B,IAAI,IAAI,OAAO,KAAK,OAAO,QAAQ,CAAC,mBACpC,IAAI,KAAa;AAEpB,QAAK,MAAM,CAAC,aAAa,YAAY,OAAO,QAAQ,OAAO,SAAS,EAAE;IAErE,MAAM,UADM,QACQ;AACpB,QAAI,CAAC,QAAS;AAEd,SAAK,MAAM,OAAO,SAAS;KAC1B,MAAM,SAAS,OAAO,QAAQ,WAAW,MAAO,KAA6B;AAC7E,SAAI,OAAO,WAAW,SAAU;KAKhC,MAAM,SADQ,OAAO,MAAM,IAAI,CACV;AAUrB,SARC,OAAO,SAAS,KAChB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,SAAS,KAAK,IACtB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,SAAS,KAAK,CAGtB,QACC,gBAAgB,IAAI,OAAO,EAC3B,YAAY,YAAY,6BAA6B,OAAO,8CAC5D,CAAC,KAAK,KAAK;;;IAId;GACD;EAEF"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { generate } from "./generate.mjs";
|
|
2
2
|
import { getAllPresets } from "./presets/registry.mjs";
|
|
3
3
|
import * as yaml from "yaml";
|
|
4
|
-
|
|
5
4
|
//#region src/compose-validation.test.ts
|
|
6
5
|
const allPresets = getAllPresets();
|
|
7
6
|
describe("docker compose config integration tests", () => {
|
|
@@ -60,7 +59,7 @@ describe("docker compose config integration tests", () => {
|
|
|
60
59
|
});
|
|
61
60
|
});
|
|
62
61
|
});
|
|
63
|
-
|
|
64
62
|
//#endregion
|
|
65
|
-
export {
|
|
63
|
+
export {};
|
|
64
|
+
|
|
66
65
|
//# sourceMappingURL=compose-validation.test.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-validation.test.mjs","names":[],"sources":["../src/compose-validation.test.ts"],"sourcesContent":["import * as yaml from \"yaml\";\nimport { generate } from \"./generate.js\";\nimport { getAllPresets } from \"./presets/registry.js\";\n\nconst allPresets = getAllPresets();\n\ndescribe(\"docker compose config integration tests\", () => {\n\tfor (const preset of allPresets) {\n\t\tdescribe(`preset \"${preset.id}\"`, () => {\n\t\t\tconst result = generate({\n\t\t\t\tprojectName: \"test-project\",\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\taiProviders: [],\n\t\t\t\tgsdRuntimes: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tdeploymentType: \"docker\",\n\t\t\t\tgenerateSecrets: false,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\tconst composeContent = result.files[\"docker-compose.yml\"]!;\n\t\t\tconst parsed = yaml.parse(composeContent);\n\n\t\t\tit(\"parses as valid YAML\", () => {\n\t\t\t\texpect(parsed).toBeDefined();\n\t\t\t\texpect(typeof parsed).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"every service has an image field\", () => {\n\t\t\t\texpect(parsed.services).toBeDefined();\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\texpect(\n\t\t\t\t\t\t(service as Record<string, unknown>).image,\n\t\t\t\t\t\t`service \"${name}\" is missing an image field`,\n\t\t\t\t\t).toBeDefined();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"every service has restart or uses default\", () => {\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\t// A service should either have an explicit restart policy\n\t\t\t\t\t// or rely on the default (which means the field can be absent).\n\t\t\t\t\t// We just verify that if restart is set, it is a valid value.\n\t\t\t\t\tif (svc.restart !== undefined) {\n\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t[\"always\", \"unless-stopped\", \"on-failure\", \"no\"].includes(svc.restart as string),\n\t\t\t\t\t\t\t`service \"${name}\" has invalid restart policy: ${svc.restart}`,\n\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"has networks defined\", () => {\n\t\t\t\texpect(parsed.networks).toBeDefined();\n\t\t\t\texpect(typeof parsed.networks).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"named volumes referenced by services are declared in top-level volumes\", () => {\n\t\t\t\tconst topLevelVolumes = parsed.volumes\n\t\t\t\t\t? new Set(Object.keys(parsed.volumes))\n\t\t\t\t\t: new Set<string>();\n\n\t\t\t\tfor (const [serviceName, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\tconst volumes = svc.volumes as string[] | undefined;\n\t\t\t\t\tif (!volumes) continue;\n\n\t\t\t\t\tfor (const vol of volumes) {\n\t\t\t\t\t\tconst volStr = typeof vol === \"string\" ? vol : (vol as { source?: string })?.source;\n\t\t\t\t\t\tif (typeof volStr !== \"string\") continue;\n\n\t\t\t\t\t\t// Named volumes follow the pattern \"name:path\" (no leading . or /)\n\t\t\t\t\t\t// Bind mounts start with . or / or use an absolute path\n\t\t\t\t\t\tconst parts = volStr.split(\":\");\n\t\t\t\t\t\tconst source = parts[0]!;\n\t\t\t\t\t\tconst isNamedVolume =\n\t\t\t\t\t\t\tsource.length > 0 &&\n\t\t\t\t\t\t\t!source.startsWith(\".\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"/\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"~\") &&\n\t\t\t\t\t\t\t!source.includes(\"\\\\\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"$\") &&\n\t\t\t\t\t\t\t!source.includes(\"${\");\n\n\t\t\t\t\t\tif (isNamedVolume) {\n\t\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t\ttopLevelVolumes.has(source),\n\t\t\t\t\t\t\t\t`service \"${serviceName}\" references named volume \"${source}\" which is not declared in top-level volumes`,\n\t\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"compose-validation.test.mjs","names":[],"sources":["../src/compose-validation.test.ts"],"sourcesContent":["import * as yaml from \"yaml\";\nimport { generate } from \"./generate.js\";\nimport { getAllPresets } from \"./presets/registry.js\";\n\nconst allPresets = getAllPresets();\n\ndescribe(\"docker compose config integration tests\", () => {\n\tfor (const preset of allPresets) {\n\t\tdescribe(`preset \"${preset.id}\"`, () => {\n\t\t\tconst result = generate({\n\t\t\t\tprojectName: \"test-project\",\n\t\t\t\tservices: preset.services,\n\t\t\t\tskillPacks: preset.skillPacks,\n\t\t\t\taiProviders: [],\n\t\t\t\tgsdRuntimes: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tdeploymentType: \"docker\",\n\t\t\t\tgenerateSecrets: false,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t\tmonitoring: false,\n\t\t\t});\n\n\t\t\tconst composeContent = result.files[\"docker-compose.yml\"]!;\n\t\t\tconst parsed = yaml.parse(composeContent);\n\n\t\t\tit(\"parses as valid YAML\", () => {\n\t\t\t\texpect(parsed).toBeDefined();\n\t\t\t\texpect(typeof parsed).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"every service has an image field\", () => {\n\t\t\t\texpect(parsed.services).toBeDefined();\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\texpect(\n\t\t\t\t\t\t(service as Record<string, unknown>).image,\n\t\t\t\t\t\t`service \"${name}\" is missing an image field`,\n\t\t\t\t\t).toBeDefined();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"every service has restart or uses default\", () => {\n\t\t\t\tfor (const [name, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\t// A service should either have an explicit restart policy\n\t\t\t\t\t// or rely on the default (which means the field can be absent).\n\t\t\t\t\t// We just verify that if restart is set, it is a valid value.\n\t\t\t\t\tif (svc.restart !== undefined) {\n\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t[\"always\", \"unless-stopped\", \"on-failure\", \"no\"].includes(svc.restart as string),\n\t\t\t\t\t\t\t`service \"${name}\" has invalid restart policy: ${svc.restart}`,\n\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"has networks defined\", () => {\n\t\t\t\texpect(parsed.networks).toBeDefined();\n\t\t\t\texpect(typeof parsed.networks).toBe(\"object\");\n\t\t\t});\n\n\t\t\tit(\"named volumes referenced by services are declared in top-level volumes\", () => {\n\t\t\t\tconst topLevelVolumes = parsed.volumes\n\t\t\t\t\t? new Set(Object.keys(parsed.volumes))\n\t\t\t\t\t: new Set<string>();\n\n\t\t\t\tfor (const [serviceName, service] of Object.entries(parsed.services)) {\n\t\t\t\t\tconst svc = service as Record<string, unknown>;\n\t\t\t\t\tconst volumes = svc.volumes as string[] | undefined;\n\t\t\t\t\tif (!volumes) continue;\n\n\t\t\t\t\tfor (const vol of volumes) {\n\t\t\t\t\t\tconst volStr = typeof vol === \"string\" ? vol : (vol as { source?: string })?.source;\n\t\t\t\t\t\tif (typeof volStr !== \"string\") continue;\n\n\t\t\t\t\t\t// Named volumes follow the pattern \"name:path\" (no leading . or /)\n\t\t\t\t\t\t// Bind mounts start with . or / or use an absolute path\n\t\t\t\t\t\tconst parts = volStr.split(\":\");\n\t\t\t\t\t\tconst source = parts[0]!;\n\t\t\t\t\t\tconst isNamedVolume =\n\t\t\t\t\t\t\tsource.length > 0 &&\n\t\t\t\t\t\t\t!source.startsWith(\".\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"/\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"~\") &&\n\t\t\t\t\t\t\t!source.includes(\"\\\\\") &&\n\t\t\t\t\t\t\t!source.startsWith(\"$\") &&\n\t\t\t\t\t\t\t!source.includes(\"${\");\n\n\t\t\t\t\t\tif (isNamedVolume) {\n\t\t\t\t\t\t\texpect(\n\t\t\t\t\t\t\t\ttopLevelVolumes.has(source),\n\t\t\t\t\t\t\t\t`service \"${serviceName}\" references named volume \"${source}\" which is not declared in top-level volumes`,\n\t\t\t\t\t\t\t).toBe(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n});\n"],"mappings":";;;;AAIA,MAAM,aAAa,eAAe;AAElC,SAAS,iDAAiD;AACzD,MAAK,MAAM,UAAU,WACpB,UAAS,WAAW,OAAO,GAAG,UAAU;EAiBvC,MAAM,iBAhBS,SAAS;GACvB,aAAa;GACb,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,aAAa,EAAE;GACf,aAAa,EAAE;GACf,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,iBAAiB;GACjB,YAAY;GACZ,CAAC,CAE4B,MAAM;EACpC,MAAM,SAAS,KAAK,MAAM,eAAe;AAEzC,KAAG,8BAA8B;AAChC,UAAO,OAAO,CAAC,aAAa;AAC5B,UAAO,OAAO,OAAO,CAAC,KAAK,SAAS;IACnC;AAEF,KAAG,0CAA0C;AAC5C,UAAO,OAAO,SAAS,CAAC,aAAa;AACrC,QAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,SAAS,CAC5D,QACE,QAAoC,OACrC,YAAY,KAAK,6BACjB,CAAC,aAAa;IAEf;AAEF,KAAG,mDAAmD;AACrD,QAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,SAAS,EAAE;IAC9D,MAAM,MAAM;AAIZ,QAAI,IAAI,YAAY,KAAA,EACnB,QACC;KAAC;KAAU;KAAkB;KAAc;KAAK,CAAC,SAAS,IAAI,QAAkB,EAChF,YAAY,KAAK,gCAAgC,IAAI,UACrD,CAAC,KAAK,KAAK;;IAGb;AAEF,KAAG,8BAA8B;AAChC,UAAO,OAAO,SAAS,CAAC,aAAa;AACrC,UAAO,OAAO,OAAO,SAAS,CAAC,KAAK,SAAS;IAC5C;AAEF,KAAG,gFAAgF;GAClF,MAAM,kBAAkB,OAAO,UAC5B,IAAI,IAAI,OAAO,KAAK,OAAO,QAAQ,CAAC,mBACpC,IAAI,KAAa;AAEpB,QAAK,MAAM,CAAC,aAAa,YAAY,OAAO,QAAQ,OAAO,SAAS,EAAE;IAErE,MAAM,UADM,QACQ;AACpB,QAAI,CAAC,QAAS;AAEd,SAAK,MAAM,OAAO,SAAS;KAC1B,MAAM,SAAS,OAAO,QAAQ,WAAW,MAAO,KAA6B;AAC7E,SAAI,OAAO,WAAW,SAAU;KAKhC,MAAM,SADQ,OAAO,MAAM,IAAI,CACV;AAUrB,SARC,OAAO,SAAS,KAChB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,SAAS,KAAK,IACtB,CAAC,OAAO,WAAW,IAAI,IACvB,CAAC,OAAO,SAAS,KAAK,CAGtB,QACC,gBAAgB,IAAI,OAAO,EAC3B,YAAY,YAAY,6BAA6B,OAAO,8CAC5D,CAAC,KAAK,KAAK;;;IAId;GACD;EAEF"}
|
package/dist/composer.cjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
|
|
3
|
-
const require_generators_postgres_init = require(
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("./skills-BlzpHmpH.cjs");
|
|
3
|
+
const require_generators_postgres_init = require("./generators/postgres-init.cjs");
|
|
4
4
|
let yaml = require("yaml");
|
|
5
|
-
|
|
6
5
|
//#region src/composer.ts
|
|
7
6
|
/** Maps image variant to the Docker image string. */
|
|
8
7
|
const IMAGE_VARIANTS = {
|
|
@@ -455,8 +454,8 @@ function composeMultiFile(resolved, options) {
|
|
|
455
454
|
profiles: [...usedProfiles].sort()
|
|
456
455
|
};
|
|
457
456
|
}
|
|
458
|
-
|
|
459
457
|
//#endregion
|
|
460
458
|
exports.compose = compose;
|
|
461
459
|
exports.composeMultiFile = composeMultiFile;
|
|
460
|
+
|
|
462
461
|
//# sourceMappingURL=composer.cjs.map
|
package/dist/composer.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.cjs","names":["Scalar","getDbRequirements"],"sources":["../src/composer.ts"],"sourcesContent":["import { Scalar, stringify } from \"yaml\";\nimport { getDbRequirements } from \"./generators/postgres-init.js\";\nimport type {\n\tComposeOptions,\n\tOpenclawImageVariant,\n\tResolverOutput,\n\tServiceCategory,\n} from \"./types.js\";\n\n/** Maps image variant to the Docker image string. */\nconst IMAGE_VARIANTS: Record<OpenclawImageVariant, string> = {\n\tofficial: \"ghcr.io/openclaw/openclaw\",\n\tcoolify: \"coollabsio/openclaw\",\n\talpine: \"alpine/openclaw\",\n};\n\n/** Returns the OpenClaw image string with version tag for a given variant. */\nfunction getOpenclawImage(variant: OpenclawImageVariant, version: string): string {\n\tconst base = IMAGE_VARIANTS[variant];\n\t// Coolify and alpine images use :latest by default\n\tconst tag = variant === \"official\" ? version : \"latest\";\n\treturn `${base}:${tag}`;\n}\n\n/** Creates a YAML scalar that is always quoted — avoids YAML 1.1 bare `no` → false. */\nfunction quotedStr(value: string): Scalar {\n\tconst s = new Scalar(value);\n\ts.type = Scalar.QUOTE_DOUBLE;\n\treturn s;\n}\n\n// ── Public Types ────────────────────────────────────────────────────────────\n\nexport interface ComposeResult {\n\tfiles: Record<string, string>; // filename -> YAML content\n\tmainFile: string; // \"docker-compose.yml\"\n\tprofiles: string[]; // list of profiles used\n}\n\n// ── Category → Profile Mapping ──────────────────────────────────────────────\n\nconst CATEGORY_PROFILE_MAP: Partial<Record<ServiceCategory, { file: string; profile: string }>> = {\n\tai: { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\t\"ai-platform\": { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\tmedia: { file: \"docker-compose.media.yml\", profile: \"media\" },\n\tmonitoring: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\tanalytics: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\t\"dev-tools\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"coding-agent\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"social-media\": { file: \"docker-compose.social.yml\", profile: \"social\" },\n\tknowledge: { file: \"docker-compose.knowledge.yml\", profile: \"knowledge\" },\n\tcommunication: { file: \"docker-compose.communication.yml\", profile: \"communication\" },\n};\n\nconst YAML_OPTIONS = { lineWidth: 120, nullStr: \"\" };\n\n// ── Shared Gateway Builder ──────────────────────────────────────────────────\n\ninterface GatewayBuildResult {\n\tgatewayService: Record<string, unknown>;\n\tcliService: Record<string, unknown>;\n\tallVolumes: Set<string>;\n}\n\n/**\n * Builds the OpenClaw gateway and CLI service entries.\n * Matches the real OpenClaw docker-compose.yml structure:\n * - Bridge port 18790 for ACP/WebSocket\n * - Bind-mount volumes (not named volumes)\n * - Claude web-provider session env vars\n * - Gateway bind mode (--bind lan)\n * - CLI companion service with stdin/tty\n */\nfunction buildGatewayServices(\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tdependsOn?: Record<string, { condition: string }>,\n): GatewayBuildResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Gateway environment\n\tconst gatewayEnv: Record<string, string> = {\n\t\tHOME: \"/home/node\",\n\t\tTERM: \"xterm-256color\",\n\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t// Claude web-provider session vars (optional, user fills in .env)\n\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t};\n\n\t// Add AI provider API keys to gateway environment\n\tconst providerKeys = [\n\t\t\"OPENAI_API_KEY\",\n\t\t\"ANTHROPIC_API_KEY\",\n\t\t\"GOOGLE_API_KEY\",\n\t\t\"XAI_API_KEY\",\n\t\t\"DEEPSEEK_API_KEY\",\n\t\t\"GROQ_API_KEY\",\n\t\t\"OPENROUTER_API_KEY\",\n\t\t\"MISTRAL_API_KEY\",\n\t\t\"TOGETHER_API_KEY\",\n\t\t\"OLLAMA_API_KEY\",\n\t];\n\tfor (const key of providerKeys) {\n\t\tgatewayEnv[key] = `\\${${key}}`;\n\t}\n\n\t// Gateway volumes (bind-mount style matching real docker-setup.sh)\n\tconst gatewayVolumes: string[] = [\n\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t];\n\n\t// Collect env vars and volume mounts from companion services\n\tfor (const { definition: def } of resolved.services) {\n\t\tfor (const env of def.openclawEnvVars) {\n\t\t\tgatewayEnv[env.key] = env.secret ? `\\${${env.key}}` : env.defaultValue;\n\t\t}\n\t\tif (def.openclawVolumeMounts) {\n\t\t\tfor (const vol of def.openclawVolumeMounts) {\n\t\t\t\tconst isBindMount =\n\t\t\t\t\tvol.name.startsWith(\"./\") || vol.name.startsWith(\"/\") || vol.name.startsWith(\"~\");\n\t\t\t\tif (!isBindMount) {\n\t\t\t\t\tallVolumes.add(vol.name);\n\t\t\t\t}\n\t\t\t\tgatewayVolumes.push(`${vol.name}:${vol.containerPath}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Gateway service\n\tconst defaultImage = getOpenclawImage(\n\t\toptions.openclawImage ?? \"official\",\n\t\toptions.openclawVersion,\n\t);\n\tconst gateway: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-${defaultImage}}`,\n\t\tenvironment: gatewayEnv,\n\t\tvolumes: gatewayVolumes,\n\t\tports: [\"${OPENCLAW_GATEWAY_PORT:-18789}:18789\", \"${OPENCLAW_BRIDGE_PORT:-18790}:18790\"],\n\t\tnetworks: [\"openclaw-network\"],\n\t\tinit: true,\n\t\trestart: \"unless-stopped\",\n\t\tcommand: [\n\t\t\t\"node\",\n\t\t\t\"dist/index.js\",\n\t\t\t\"gateway\",\n\t\t\t\"--bind\",\n\t\t\t\"${OPENCLAW_GATEWAY_BIND:-lan}\",\n\t\t\t\"--port\",\n\t\t\t\"18789\",\n\t\t],\n\t};\n\n\t// Traefik labels for the gateway\n\tconst gwTraefikLabels = options.traefikLabels?.get(\"openclaw-gateway\");\n\tif (gwTraefikLabels) {\n\t\tgateway.labels = gwTraefikLabels;\n\t}\n\n\tif (options.bareMetalNativeHost) {\n\t\tgateway.extra_hosts = [\"host.docker.internal:host-gateway\"];\n\t}\n\n\tif (dependsOn && Object.keys(dependsOn).length > 0) {\n\t\tgateway.depends_on = dependsOn;\n\t}\n\n\t// CLI companion service (matching real OpenClaw docker-compose.yml)\n\t// Build CLI environment with same keys as gateway for consistency\n\tconst cliEnv: Record<string, string> = {\n\t\tHOME: \"/home/node\",\n\t\tTERM: \"xterm-256color\",\n\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t// Gateway connection: use Docker service name so CLI can reach the gateway over the bridge network\n\t\tOPENCLAW_GATEWAY_HOST: \"openclaw-gateway\",\n\t\tOPENCLAW_GATEWAY_PORT: \"18789\",\n\t\tBROWSER: \"echo\",\n\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t};\n\n\t// Add same AI provider API keys to CLI for direct AI interactions\n\tfor (const key of providerKeys) {\n\t\tcliEnv[key] = `\\${${key}}`;\n\t}\n\n\tconst cliService: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-${defaultImage}}`,\n\t\tenvironment: cliEnv,\n\t\tvolumes: [\n\t\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t\t],\n\t\tstdin_open: true,\n\t\ttty: true,\n\t\tinit: true,\n\t\tnetworks: [\"openclaw-network\"],\n\t\tentrypoint: [\"node\", \"dist/index.js\"],\n\t\t// CLI is interactive — don't auto-restart, but wait for gateway to be ready\n\t\trestart: \"no\",\n\t\tdepends_on: {\n\t\t\t\"openclaw-gateway\": { condition: \"service_started\" },\n\t\t},\n\t};\n\n\treturn { gatewayService: gateway, cliService: cliService, allVolumes };\n}\n\n// ── Shared Companion Service Builder ────────────────────────────────────────\n\nfunction buildCompanionService(\n\tdef: ResolverOutput[\"services\"][number][\"definition\"],\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tallVolumes: Set<string>,\n): { entry: Record<string, unknown>; volumeNames: string[] } {\n\tconst svc: Record<string, unknown> = {};\n\tconst volumeNames: string[] = [];\n\n\tsvc.image = `${def.image}:${def.imageTag}`;\n\n\tif (def.environment.length > 0) {\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const e of def.environment) {\n\t\t\tenv[e.key] = e.secret ? `\\${${e.key}}` : e.defaultValue;\n\t\t}\n\t\tsvc.environment = env;\n\t}\n\n\tconst exposedPorts = def.ports.filter((p) => p.exposed);\n\tif (exposedPorts.length > 0) {\n\t\tconst prefix = def.id.toUpperCase().replace(/-/g, \"_\");\n\t\tsvc.ports = exposedPorts.map((p, i) => {\n\t\t\tconst suffix = exposedPorts.length > 1 ? `_${i}` : \"\";\n\t\t\tlet defaultPort = p.host;\n\n\t\t\t// Override proxy ports if custom ports are specified\n\t\t\tif (\n\t\t\t\t(def.id === \"caddy\" || def.id === \"traefik\") &&\n\t\t\t\toptions.proxyHttpPort !== undefined &&\n\t\t\t\tp.container === 80\n\t\t\t) {\n\t\t\t\tdefaultPort = options.proxyHttpPort;\n\t\t\t}\n\t\t\tif (\n\t\t\t\t(def.id === \"caddy\" || def.id === \"traefik\") &&\n\t\t\t\toptions.proxyHttpsPort !== undefined &&\n\t\t\t\tp.container === 443\n\t\t\t) {\n\t\t\t\tdefaultPort = options.proxyHttpsPort;\n\t\t\t}\n\n\t\t\t// Apply global port overrides if specified\n\t\t\tif (options.portOverrides?.[def.id]?.[p.host] !== undefined) {\n\t\t\t\tdefaultPort = options.portOverrides?.[def.id]?.[p.host] || p.host;\n\t\t\t}\n\n\t\t\t// Use _EXTERNAL_PORT to avoid colliding with openclawEnvVars _PORT keys.\n\t\t\t// openclawEnvVars define the container port (e.g. GRAFANA_PORT=3000 for\n\t\t\t// internal Docker networking), while these are host port mappings (e.g. 3150).\n\t\t\t// Without this, GRAFANA_PORT=3000 from .env would override the default\n\t\t\t// 3150 in ${GRAFANA_PORT:-3150}:3000, mapping host port 3000 instead.\n\t\t\treturn `\\${${prefix}_EXTERNAL_PORT${suffix}:-${defaultPort}}:${p.container}`;\n\t\t});\n\t}\n\n\tif (def.volumes.length > 0) {\n\t\tsvc.volumes = def.volumes.map((v) => {\n\t\t\tconst isBindMount =\n\t\t\t\tv.name.startsWith(\"./\") || v.name.startsWith(\"/\") || v.name.startsWith(\"~\");\n\n\t\t\tif (!isBindMount) {\n\t\t\t\tallVolumes.add(v.name);\n\t\t\t\tvolumeNames.push(v.name);\n\t\t\t}\n\t\t\treturn `${v.name}:${v.containerPath}`;\n\t\t});\n\t}\n\n\t// PostgreSQL: mount the init script and pass per-service DB passwords\n\tif (def.id === \"postgresql\") {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro\",\n\t\t);\n\n\t\t// Pass per-service database password env vars so the init script can use them\n\t\tconst dbReqs = getDbRequirements(resolved);\n\t\tif (dbReqs.length > 0) {\n\t\t\tconst env = (svc.environment ?? {}) as Record<string, string>;\n\t\t\tfor (const req of dbReqs) {\n\t\t\t\tenv[req.passwordEnvVar] = `\\${${req.passwordEnvVar}}`;\n\t\t\t}\n\t\t\tsvc.environment = env;\n\t\t}\n\t}\n\n\tif (def.healthcheck) {\n\t\tconst hc: Record<string, unknown> = {\n\t\t\ttest: [\"CMD-SHELL\", def.healthcheck.test],\n\t\t\tinterval: def.healthcheck.interval,\n\t\t\ttimeout: def.healthcheck.timeout,\n\t\t\tretries: def.healthcheck.retries,\n\t\t};\n\t\tif (def.healthcheck.startPeriod) {\n\t\t\thc.start_period = def.healthcheck.startPeriod;\n\t\t}\n\t\tsvc.healthcheck = hc;\n\t}\n\n\tsvc.restart = def.restartPolicy;\n\tsvc.networks = def.networks;\n\n\tif (def.command) svc.command = def.command;\n\tif (def.entrypoint) svc.entrypoint = def.entrypoint;\n\n\t// Labels: merge static definition labels with dynamic Traefik labels\n\tconst mergedLabels: Record<string, string> = {};\n\tif (def.labels) Object.assign(mergedLabels, def.labels);\n\tconst traefikLabels = options.traefikLabels?.get(def.id);\n\tif (traefikLabels) Object.assign(mergedLabels, traefikLabels);\n\tif (Object.keys(mergedLabels).length > 0) svc.labels = mergedLabels;\n\n\t// Traefik: bind-mount static config and Docker socket\n\tif (def.id === \"traefik\" && options.traefikLabels) {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./traefik/traefik.yml:/etc/traefik/traefik.yml:ro\",\n\t\t\t\"/var/run/docker.sock:/var/run/docker.sock:ro\",\n\t\t);\n\t}\n\n\tlet deploy: Record<string, unknown> | undefined;\n\tif (def.deploy) {\n\t\tdeploy = JSON.parse(JSON.stringify(def.deploy)) as Record<string, unknown>;\n\t}\n\tif (options.gpu && def.gpuRequired) {\n\t\tconst base = deploy ?? {};\n\t\tconst resources = (base.resources ?? {}) as Record<string, unknown>;\n\t\tdeploy = {\n\t\t\t...base,\n\t\t\tresources: {\n\t\t\t\t...resources,\n\t\t\t\treservations: {\n\t\t\t\t\t...((resources.reservations as Record<string, unknown>) ?? {}),\n\t\t\t\t\tdevices: [{ driver: \"nvidia\", count: \"all\", capabilities: [\"gpu\"] }],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\t// Memory limits from estimatedMemoryMB\n\tif (def.minMemoryMB && options.hardened) {\n\t\tconst base = deploy ?? {};\n\t\tconst resources = (base.resources ?? {}) as Record<string, unknown>;\n\t\tconst limits = (resources.limits as Record<string, unknown>) ?? {};\n\t\tdeploy = {\n\t\t\t...base,\n\t\t\tresources: {\n\t\t\t\t...resources,\n\t\t\t\tlimits: {\n\t\t\t\t\t...limits,\n\t\t\t\t\tmemory: `${def.minMemoryMB * 2}m`, // 2x min as safe limit\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\tif (deploy) svc.deploy = deploy;\n\n\t// Security hardening (when enabled)\n\tif (options.hardened) {\n\t\tsvc.cap_drop = [\"ALL\"];\n\t\tsvc.security_opt = [\"no-new-privileges:true\"];\n\n\t\t// Services that need specific capabilities\n\t\tconst capAddMap: Record<string, string[]> = {\n\t\t\tcaddy: [\"NET_BIND_SERVICE\"],\n\t\t\ttraefik: [\"NET_BIND_SERVICE\"],\n\t\t\tcrowdsec: [\"NET_BIND_SERVICE\", \"DAC_READ_SEARCH\"],\n\t\t};\n\t\tif (capAddMap[def.id]) {\n\t\t\tsvc.cap_add = capAddMap[def.id];\n\t\t}\n\t}\n\n\t// Merge both dependsOn and requires to ensure proper Docker startup ordering\n\tconst depIds = [...new Set([...def.dependsOn, ...def.requires])].filter((id) =>\n\t\tresolved.services.some((s) => s.definition.id === id),\n\t);\n\tif (depIds.length > 0) {\n\t\tconst dependsOn: Record<string, { condition: string }> = {};\n\t\tfor (const depId of depIds) {\n\t\t\tconst dep = resolved.services.find((s) => s.definition.id === depId);\n\t\t\tdependsOn[depId] = {\n\t\t\t\tcondition: dep?.definition.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t\tsvc.depends_on = dependsOn;\n\t}\n\n\treturn { entry: svc, volumeNames };\n}\n\n// ── PostgreSQL Setup Init Container ─────────────────────────────────────────\n\n/**\n * Builds a one-shot init container that creates databases and users for\n * services that need their own PostgreSQL database. Runs AFTER PostgreSQL\n * is healthy, on every `docker compose up`, and is idempotent.\n *\n * Uses standard PG* environment variables (PGHOST, PGUSER, PGDATABASE,\n * PGPASSWORD) so psql/createuser/createdb automatically connect without\n * needing explicit -h/-U/-d flags — simpler and avoids YAML escaping issues.\n *\n * Returns null when no setup is needed (no PostgreSQL or no DB requirements).\n */\nfunction buildPostgresSetup(resolved: ResolverOutput): Record<string, unknown> | null {\n\tconst hasPostgres = resolved.services.some((s) => s.definition.id === \"postgresql\");\n\tif (!hasPostgres) return null;\n\n\tconst dbReqs = getDbRequirements(resolved);\n\tif (dbReqs.length === 0) return null;\n\n\t// Build a shell script with one command per line.\n\t// Uses $$ to escape $ from Docker Compose's variable substitution —\n\t// Docker Compose converts $$ → $ before passing to the container.\n\t// NO set -e: we handle errors explicitly so one failed service doesn't block others.\n\tconst scriptLines = [\"echo '=== PostgreSQL database setup ==='\", \"FAILED=0\"];\n\n\tfor (const req of dbReqs) {\n\t\t// Each service's setup is wrapped so a failure doesn't block the others.\n\t\t// Uses psql -v ON_ERROR_STOP=0 so SQL errors don't abort psql.\n\t\tscriptLines.push(\n\t\t\t`echo \"Setting up database '${req.dbName}' with user '${req.dbUser}'...\"`,\n\t\t\t// Create user if not exists (pure SQL, no createuser binary quirks)\n\t\t\t`psql -c \"SELECT 1 FROM pg_roles WHERE rolname='${req.dbUser}'\" | grep -q 1 || psql -c \"CREATE ROLE ${req.dbUser} WITH LOGIN PASSWORD '$$${req.passwordEnvVar}'\"`,\n\t\t\t// Always sync the password to match current env\n\t\t\t`psql -c \"ALTER ROLE ${req.dbUser} WITH LOGIN PASSWORD '$$${req.passwordEnvVar}'\"`,\n\t\t\t// Create database if not exists\n\t\t\t`psql -tc \"SELECT 1 FROM pg_database WHERE datname='${req.dbName}'\" | grep -q 1 || psql -c \"CREATE DATABASE ${req.dbName} OWNER ${req.dbUser}\"`,\n\t\t\t// Grant privileges (idempotent)\n\t\t\t`psql -c \"GRANT ALL PRIVILEGES ON DATABASE ${req.dbName} TO ${req.dbUser}\" || FAILED=1`,\n\t\t\t`echo \" Done: ${req.dbName}\"`,\n\t\t);\n\t}\n\n\tscriptLines.push(\"echo '=== All databases ready ==='\", \"exit $$FAILED\");\n\n\t// Standard PG* env vars: psql/createuser/createdb use these automatically\n\tconst env: Record<string, string> = {\n\t\tPGHOST: \"postgresql\",\n\t\tPGUSER: \"${POSTGRES_USER:-openclaw}\",\n\t\tPGDATABASE: \"${POSTGRES_DB:-openclaw}\",\n\t\tPGPASSWORD: \"${POSTGRES_PASSWORD}\",\n\t};\n\tfor (const req of dbReqs) {\n\t\tenv[req.passwordEnvVar] = `\\${${req.passwordEnvVar}}`;\n\t}\n\n\treturn {\n\t\timage: \"postgres:17-alpine\",\n\t\tdepends_on: {\n\t\t\tpostgresql: { condition: \"service_healthy\" },\n\t\t},\n\t\tenvironment: env,\n\t\t// command MUST be a single-element array so the entire script is passed\n\t\t// as ONE argument to `sh -c`. A plain string gets shlex-split by Docker\n\t\t// Compose into multiple args, breaking multi-line scripts.\n\t\tentrypoint: [\"/bin/sh\", \"-c\"],\n\t\tcommand: [scriptLines.join(\"\\n\")],\n\t\trestart: quotedStr(\"no\"),\n\t\tnetworks: [\"openclaw-network\"],\n\t};\n}\n\n// ── Single-File Compose ─────────────────────────────────────────────────────\n\n/**\n * Generates a single Docker Compose YAML string with ALL services.\n * Backward-compatible signature.\n */\nexport function compose(resolved: ResolverOutput, options: ComposeOptions): string {\n\tconst isDirectInstall = options.openclawInstallMethod === \"direct\";\n\n\t// Build depends_on for ALL companion services\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tgatewayDependsOn[def.id] = {\n\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t};\n\t}\n\n\tconst services: Record<string, Record<string, unknown>> = {};\n\tlet allVolumes = new Set<string>();\n\n\tif (!isDirectInstall) {\n\t\tconst {\n\t\t\tgatewayService,\n\t\t\tcliService,\n\t\t\tallVolumes: gwVolumes,\n\t\t} = buildGatewayServices(resolved, options, gatewayDependsOn);\n\t\tallVolumes = gwVolumes;\n\t\tservices[\"openclaw-gateway\"] = gatewayService;\n\t\t// CLI service added after companions\n\t\t// Determine which services need DB setup so we can redirect their depends_on\n\t\tconst dbReqs = getDbRequirements(resolved);\n\t\tconst dbServiceIds = new Set(dbReqs.map((r) => r.serviceId));\n\n\t\tfor (const { definition: def } of resolved.services) {\n\t\t\tconst { entry } = buildCompanionService(def, resolved, options, allVolumes);\n\t\t\tif (dbServiceIds.has(def.id) && entry.depends_on) {\n\t\t\t\tconst deps = entry.depends_on as Record<string, { condition: string }>;\n\t\t\t\tif (deps.postgresql) {\n\t\t\t\t\tdelete deps.postgresql;\n\t\t\t\t\tdeps[\"postgres-setup\"] = { condition: \"service_completed_successfully\" };\n\t\t\t\t}\n\t\t\t}\n\t\t\tservices[def.id] = entry;\n\t\t}\n\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tservices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\n\t\tservices[\"openclaw-cli\"] = cliService;\n\t} else {\n\t\t// Direct install: no gateway/CLI containers, just companion services\n\t\tconst dbReqs = getDbRequirements(resolved);\n\t\tconst dbServiceIds = new Set(dbReqs.map((r) => r.serviceId));\n\n\t\tfor (const { definition: def } of resolved.services) {\n\t\t\tconst { entry } = buildCompanionService(def, resolved, options, allVolumes);\n\t\t\tif (dbServiceIds.has(def.id) && entry.depends_on) {\n\t\t\t\tconst deps = entry.depends_on as Record<string, { condition: string }>;\n\t\t\t\tif (deps.postgresql) {\n\t\t\t\t\tdelete deps.postgresql;\n\t\t\t\t\tdeps[\"postgres-setup\"] = { condition: \"service_completed_successfully\" };\n\t\t\t\t}\n\t\t\t}\n\t\t\tservices[def.id] = entry;\n\t\t}\n\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tservices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\t}\n\n\tconst volumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tvolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\treturn stringify({ services, volumes, networks }, YAML_OPTIONS);\n}\n\n// ── Multi-File Compose ──────────────────────────────────────────────────────\n\ninterface ServiceInfo {\n\tid: string;\n\tcategory: ServiceCategory;\n\tentry: Record<string, unknown>;\n\tvolumeNames: string[];\n}\n\n/**\n * Generates multiple Docker Compose files, splitting services into profile-based\n * override files by category.\n */\nexport function composeMultiFile(resolved: ResolverOutput, options: ComposeOptions): ComposeResult {\n\tconst isDirectInstall = options.openclawInstallMethod === \"direct\";\n\tconst allVolumes = new Set<string>();\n\n\t// Build all companion service entries & classify by category\n\tconst serviceInfos: ServiceInfo[] = [];\n\tconst dbReqs = getDbRequirements(resolved);\n\tconst dbServiceIds = new Set(dbReqs.map((r) => r.serviceId));\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry, volumeNames } = buildCompanionService(def, resolved, options, allVolumes);\n\t\t// Redirect DB-dependent services to depend on postgres-setup\n\t\tif (dbServiceIds.has(def.id) && entry.depends_on) {\n\t\t\tconst deps = entry.depends_on as Record<string, { condition: string }>;\n\t\t\tif (deps.postgresql) {\n\t\t\t\tdelete deps.postgresql;\n\t\t\t\tdeps[\"postgres-setup\"] = { condition: \"service_completed_successfully\" };\n\t\t\t}\n\t\t}\n\t\tserviceInfos.push({ id: def.id, category: def.category, entry, volumeNames });\n\t}\n\n\t// Partition services into base vs. profile files\n\tconst baseServiceIds = new Set<string>();\n\tconst profileFileMap: Record<string, { profile: string; services: ServiceInfo[] }> = {};\n\n\tfor (const info of serviceInfos) {\n\t\tconst mapping = CATEGORY_PROFILE_MAP[info.category];\n\t\tif (mapping) {\n\t\t\tif (!profileFileMap[mapping.file]) {\n\t\t\t\tprofileFileMap[mapping.file] = { profile: mapping.profile, services: [] };\n\t\t\t}\n\t\t\tprofileFileMap[mapping.file]!.services.push(info);\n\t\t} else {\n\t\t\tbaseServiceIds.add(info.id);\n\t\t}\n\t}\n\n\tconst baseServices: Record<string, Record<string, unknown>> = {};\n\n\tif (!isDirectInstall) {\n\t\t// Gateway depends_on (only base services)\n\t\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\t\tfor (const { definition: def } of resolved.services) {\n\t\t\tif (baseServiceIds.has(def.id)) {\n\t\t\t\tgatewayDependsOn[def.id] = {\n\t\t\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst {\n\t\t\tgatewayService,\n\t\t\tcliService,\n\t\t\tallVolumes: gwVolumes,\n\t\t} = buildGatewayServices(resolved, options, gatewayDependsOn);\n\n\t\t// Merge gateway volumes into allVolumes\n\t\tfor (const v of gwVolumes) allVolumes.add(v);\n\n\t\tbaseServices[\"openclaw-gateway\"] = gatewayService;\n\n\t\tfor (const info of serviceInfos) {\n\t\t\tif (baseServiceIds.has(info.id)) {\n\t\t\t\tbaseServices[info.id] = info.entry;\n\t\t\t}\n\t\t}\n\n\t\t// Add postgres-setup init container if needed\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tbaseServices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\n\t\tbaseServices[\"openclaw-cli\"] = cliService;\n\t} else {\n\t\t// Direct install: no gateway/CLI containers\n\t\tfor (const info of serviceInfos) {\n\t\t\tif (baseServiceIds.has(info.id)) {\n\t\t\t\tbaseServices[info.id] = info.entry;\n\t\t\t}\n\t\t}\n\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tbaseServices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\t}\n\n\tconst sortedAllVolumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tsortedAllVolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\tconst files: Record<string, string> = {};\n\tfiles[\"docker-compose.yml\"] = stringify(\n\t\t{ services: baseServices, volumes: sortedAllVolumes, networks },\n\t\tYAML_OPTIONS,\n\t);\n\n\t// Profile override files\n\tconst usedProfiles = new Set<string>();\n\n\tfor (const [fileName, { profile, services }] of Object.entries(profileFileMap)) {\n\t\tusedProfiles.add(profile);\n\n\t\tconst profileServices: Record<string, Record<string, unknown>> = {};\n\t\tconst profileVolumes = new Set<string>();\n\n\t\tfor (const info of services) {\n\t\t\tprofileServices[info.id] = { ...info.entry, profiles: [profile] };\n\t\t\tfor (const vName of info.volumeNames) {\n\t\t\t\tprofileVolumes.add(vName);\n\t\t\t}\n\t\t}\n\n\t\tconst fileContent: Record<string, unknown> = { services: profileServices };\n\n\t\tif (profileVolumes.size > 0) {\n\t\t\tconst sortedProfileVolumes: Record<string, null> = {};\n\t\t\tfor (const v of [...profileVolumes].sort()) {\n\t\t\t\tsortedProfileVolumes[v] = null;\n\t\t\t}\n\t\t\tfileContent.volumes = sortedProfileVolumes;\n\t\t}\n\n\t\tfiles[fileName] = stringify(fileContent, YAML_OPTIONS);\n\t}\n\n\treturn {\n\t\tfiles,\n\t\tmainFile: \"docker-compose.yml\",\n\t\tprofiles: [...usedProfiles].sort(),\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"composer.cjs","names":["Scalar","getDbRequirements"],"sources":["../src/composer.ts"],"sourcesContent":["import { Scalar, stringify } from \"yaml\";\nimport { getDbRequirements } from \"./generators/postgres-init.js\";\nimport type {\n\tComposeOptions,\n\tOpenclawImageVariant,\n\tResolverOutput,\n\tServiceCategory,\n} from \"./types.js\";\n\n/** Maps image variant to the Docker image string. */\nconst IMAGE_VARIANTS: Record<OpenclawImageVariant, string> = {\n\tofficial: \"ghcr.io/openclaw/openclaw\",\n\tcoolify: \"coollabsio/openclaw\",\n\talpine: \"alpine/openclaw\",\n};\n\n/** Returns the OpenClaw image string with version tag for a given variant. */\nfunction getOpenclawImage(variant: OpenclawImageVariant, version: string): string {\n\tconst base = IMAGE_VARIANTS[variant];\n\t// Coolify and alpine images use :latest by default\n\tconst tag = variant === \"official\" ? version : \"latest\";\n\treturn `${base}:${tag}`;\n}\n\n/** Creates a YAML scalar that is always quoted — avoids YAML 1.1 bare `no` → false. */\nfunction quotedStr(value: string): Scalar {\n\tconst s = new Scalar(value);\n\ts.type = Scalar.QUOTE_DOUBLE;\n\treturn s;\n}\n\n// ── Public Types ────────────────────────────────────────────────────────────\n\nexport interface ComposeResult {\n\tfiles: Record<string, string>; // filename -> YAML content\n\tmainFile: string; // \"docker-compose.yml\"\n\tprofiles: string[]; // list of profiles used\n}\n\n// ── Category → Profile Mapping ──────────────────────────────────────────────\n\nconst CATEGORY_PROFILE_MAP: Partial<Record<ServiceCategory, { file: string; profile: string }>> = {\n\tai: { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\t\"ai-platform\": { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\tmedia: { file: \"docker-compose.media.yml\", profile: \"media\" },\n\tmonitoring: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\tanalytics: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\t\"dev-tools\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"coding-agent\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"social-media\": { file: \"docker-compose.social.yml\", profile: \"social\" },\n\tknowledge: { file: \"docker-compose.knowledge.yml\", profile: \"knowledge\" },\n\tcommunication: { file: \"docker-compose.communication.yml\", profile: \"communication\" },\n};\n\nconst YAML_OPTIONS = { lineWidth: 120, nullStr: \"\" };\n\n// ── Shared Gateway Builder ──────────────────────────────────────────────────\n\ninterface GatewayBuildResult {\n\tgatewayService: Record<string, unknown>;\n\tcliService: Record<string, unknown>;\n\tallVolumes: Set<string>;\n}\n\n/**\n * Builds the OpenClaw gateway and CLI service entries.\n * Matches the real OpenClaw docker-compose.yml structure:\n * - Bridge port 18790 for ACP/WebSocket\n * - Bind-mount volumes (not named volumes)\n * - Claude web-provider session env vars\n * - Gateway bind mode (--bind lan)\n * - CLI companion service with stdin/tty\n */\nfunction buildGatewayServices(\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tdependsOn?: Record<string, { condition: string }>,\n): GatewayBuildResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Gateway environment\n\tconst gatewayEnv: Record<string, string> = {\n\t\tHOME: \"/home/node\",\n\t\tTERM: \"xterm-256color\",\n\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t// Claude web-provider session vars (optional, user fills in .env)\n\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t};\n\n\t// Add AI provider API keys to gateway environment\n\tconst providerKeys = [\n\t\t\"OPENAI_API_KEY\",\n\t\t\"ANTHROPIC_API_KEY\",\n\t\t\"GOOGLE_API_KEY\",\n\t\t\"XAI_API_KEY\",\n\t\t\"DEEPSEEK_API_KEY\",\n\t\t\"GROQ_API_KEY\",\n\t\t\"OPENROUTER_API_KEY\",\n\t\t\"MISTRAL_API_KEY\",\n\t\t\"TOGETHER_API_KEY\",\n\t\t\"OLLAMA_API_KEY\",\n\t];\n\tfor (const key of providerKeys) {\n\t\tgatewayEnv[key] = `\\${${key}}`;\n\t}\n\n\t// Gateway volumes (bind-mount style matching real docker-setup.sh)\n\tconst gatewayVolumes: string[] = [\n\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t];\n\n\t// Collect env vars and volume mounts from companion services\n\tfor (const { definition: def } of resolved.services) {\n\t\tfor (const env of def.openclawEnvVars) {\n\t\t\tgatewayEnv[env.key] = env.secret ? `\\${${env.key}}` : env.defaultValue;\n\t\t}\n\t\tif (def.openclawVolumeMounts) {\n\t\t\tfor (const vol of def.openclawVolumeMounts) {\n\t\t\t\tconst isBindMount =\n\t\t\t\t\tvol.name.startsWith(\"./\") || vol.name.startsWith(\"/\") || vol.name.startsWith(\"~\");\n\t\t\t\tif (!isBindMount) {\n\t\t\t\t\tallVolumes.add(vol.name);\n\t\t\t\t}\n\t\t\t\tgatewayVolumes.push(`${vol.name}:${vol.containerPath}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Gateway service\n\tconst defaultImage = getOpenclawImage(\n\t\toptions.openclawImage ?? \"official\",\n\t\toptions.openclawVersion,\n\t);\n\tconst gateway: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-${defaultImage}}`,\n\t\tenvironment: gatewayEnv,\n\t\tvolumes: gatewayVolumes,\n\t\tports: [\"${OPENCLAW_GATEWAY_PORT:-18789}:18789\", \"${OPENCLAW_BRIDGE_PORT:-18790}:18790\"],\n\t\tnetworks: [\"openclaw-network\"],\n\t\tinit: true,\n\t\trestart: \"unless-stopped\",\n\t\tcommand: [\n\t\t\t\"node\",\n\t\t\t\"dist/index.js\",\n\t\t\t\"gateway\",\n\t\t\t\"--bind\",\n\t\t\t\"${OPENCLAW_GATEWAY_BIND:-lan}\",\n\t\t\t\"--port\",\n\t\t\t\"18789\",\n\t\t],\n\t};\n\n\t// Traefik labels for the gateway\n\tconst gwTraefikLabels = options.traefikLabels?.get(\"openclaw-gateway\");\n\tif (gwTraefikLabels) {\n\t\tgateway.labels = gwTraefikLabels;\n\t}\n\n\tif (options.bareMetalNativeHost) {\n\t\tgateway.extra_hosts = [\"host.docker.internal:host-gateway\"];\n\t}\n\n\tif (dependsOn && Object.keys(dependsOn).length > 0) {\n\t\tgateway.depends_on = dependsOn;\n\t}\n\n\t// CLI companion service (matching real OpenClaw docker-compose.yml)\n\t// Build CLI environment with same keys as gateway for consistency\n\tconst cliEnv: Record<string, string> = {\n\t\tHOME: \"/home/node\",\n\t\tTERM: \"xterm-256color\",\n\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t// Gateway connection: use Docker service name so CLI can reach the gateway over the bridge network\n\t\tOPENCLAW_GATEWAY_HOST: \"openclaw-gateway\",\n\t\tOPENCLAW_GATEWAY_PORT: \"18789\",\n\t\tBROWSER: \"echo\",\n\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t};\n\n\t// Add same AI provider API keys to CLI for direct AI interactions\n\tfor (const key of providerKeys) {\n\t\tcliEnv[key] = `\\${${key}}`;\n\t}\n\n\tconst cliService: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-${defaultImage}}`,\n\t\tenvironment: cliEnv,\n\t\tvolumes: [\n\t\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t\t],\n\t\tstdin_open: true,\n\t\ttty: true,\n\t\tinit: true,\n\t\tnetworks: [\"openclaw-network\"],\n\t\tentrypoint: [\"node\", \"dist/index.js\"],\n\t\t// CLI is interactive — don't auto-restart, but wait for gateway to be ready\n\t\trestart: \"no\",\n\t\tdepends_on: {\n\t\t\t\"openclaw-gateway\": { condition: \"service_started\" },\n\t\t},\n\t};\n\n\treturn { gatewayService: gateway, cliService: cliService, allVolumes };\n}\n\n// ── Shared Companion Service Builder ────────────────────────────────────────\n\nfunction buildCompanionService(\n\tdef: ResolverOutput[\"services\"][number][\"definition\"],\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tallVolumes: Set<string>,\n): { entry: Record<string, unknown>; volumeNames: string[] } {\n\tconst svc: Record<string, unknown> = {};\n\tconst volumeNames: string[] = [];\n\n\tsvc.image = `${def.image}:${def.imageTag}`;\n\n\tif (def.environment.length > 0) {\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const e of def.environment) {\n\t\t\tenv[e.key] = e.secret ? `\\${${e.key}}` : e.defaultValue;\n\t\t}\n\t\tsvc.environment = env;\n\t}\n\n\tconst exposedPorts = def.ports.filter((p) => p.exposed);\n\tif (exposedPorts.length > 0) {\n\t\tconst prefix = def.id.toUpperCase().replace(/-/g, \"_\");\n\t\tsvc.ports = exposedPorts.map((p, i) => {\n\t\t\tconst suffix = exposedPorts.length > 1 ? `_${i}` : \"\";\n\t\t\tlet defaultPort = p.host;\n\n\t\t\t// Override proxy ports if custom ports are specified\n\t\t\tif (\n\t\t\t\t(def.id === \"caddy\" || def.id === \"traefik\") &&\n\t\t\t\toptions.proxyHttpPort !== undefined &&\n\t\t\t\tp.container === 80\n\t\t\t) {\n\t\t\t\tdefaultPort = options.proxyHttpPort;\n\t\t\t}\n\t\t\tif (\n\t\t\t\t(def.id === \"caddy\" || def.id === \"traefik\") &&\n\t\t\t\toptions.proxyHttpsPort !== undefined &&\n\t\t\t\tp.container === 443\n\t\t\t) {\n\t\t\t\tdefaultPort = options.proxyHttpsPort;\n\t\t\t}\n\n\t\t\t// Apply global port overrides if specified\n\t\t\tif (options.portOverrides?.[def.id]?.[p.host] !== undefined) {\n\t\t\t\tdefaultPort = options.portOverrides?.[def.id]?.[p.host] || p.host;\n\t\t\t}\n\n\t\t\t// Use _EXTERNAL_PORT to avoid colliding with openclawEnvVars _PORT keys.\n\t\t\t// openclawEnvVars define the container port (e.g. GRAFANA_PORT=3000 for\n\t\t\t// internal Docker networking), while these are host port mappings (e.g. 3150).\n\t\t\t// Without this, GRAFANA_PORT=3000 from .env would override the default\n\t\t\t// 3150 in ${GRAFANA_PORT:-3150}:3000, mapping host port 3000 instead.\n\t\t\treturn `\\${${prefix}_EXTERNAL_PORT${suffix}:-${defaultPort}}:${p.container}`;\n\t\t});\n\t}\n\n\tif (def.volumes.length > 0) {\n\t\tsvc.volumes = def.volumes.map((v) => {\n\t\t\tconst isBindMount =\n\t\t\t\tv.name.startsWith(\"./\") || v.name.startsWith(\"/\") || v.name.startsWith(\"~\");\n\n\t\t\tif (!isBindMount) {\n\t\t\t\tallVolumes.add(v.name);\n\t\t\t\tvolumeNames.push(v.name);\n\t\t\t}\n\t\t\treturn `${v.name}:${v.containerPath}`;\n\t\t});\n\t}\n\n\t// PostgreSQL: mount the init script and pass per-service DB passwords\n\tif (def.id === \"postgresql\") {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro\",\n\t\t);\n\n\t\t// Pass per-service database password env vars so the init script can use them\n\t\tconst dbReqs = getDbRequirements(resolved);\n\t\tif (dbReqs.length > 0) {\n\t\t\tconst env = (svc.environment ?? {}) as Record<string, string>;\n\t\t\tfor (const req of dbReqs) {\n\t\t\t\tenv[req.passwordEnvVar] = `\\${${req.passwordEnvVar}}`;\n\t\t\t}\n\t\t\tsvc.environment = env;\n\t\t}\n\t}\n\n\tif (def.healthcheck) {\n\t\tconst hc: Record<string, unknown> = {\n\t\t\ttest: [\"CMD-SHELL\", def.healthcheck.test],\n\t\t\tinterval: def.healthcheck.interval,\n\t\t\ttimeout: def.healthcheck.timeout,\n\t\t\tretries: def.healthcheck.retries,\n\t\t};\n\t\tif (def.healthcheck.startPeriod) {\n\t\t\thc.start_period = def.healthcheck.startPeriod;\n\t\t}\n\t\tsvc.healthcheck = hc;\n\t}\n\n\tsvc.restart = def.restartPolicy;\n\tsvc.networks = def.networks;\n\n\tif (def.command) svc.command = def.command;\n\tif (def.entrypoint) svc.entrypoint = def.entrypoint;\n\n\t// Labels: merge static definition labels with dynamic Traefik labels\n\tconst mergedLabels: Record<string, string> = {};\n\tif (def.labels) Object.assign(mergedLabels, def.labels);\n\tconst traefikLabels = options.traefikLabels?.get(def.id);\n\tif (traefikLabels) Object.assign(mergedLabels, traefikLabels);\n\tif (Object.keys(mergedLabels).length > 0) svc.labels = mergedLabels;\n\n\t// Traefik: bind-mount static config and Docker socket\n\tif (def.id === \"traefik\" && options.traefikLabels) {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./traefik/traefik.yml:/etc/traefik/traefik.yml:ro\",\n\t\t\t\"/var/run/docker.sock:/var/run/docker.sock:ro\",\n\t\t);\n\t}\n\n\tlet deploy: Record<string, unknown> | undefined;\n\tif (def.deploy) {\n\t\tdeploy = JSON.parse(JSON.stringify(def.deploy)) as Record<string, unknown>;\n\t}\n\tif (options.gpu && def.gpuRequired) {\n\t\tconst base = deploy ?? {};\n\t\tconst resources = (base.resources ?? {}) as Record<string, unknown>;\n\t\tdeploy = {\n\t\t\t...base,\n\t\t\tresources: {\n\t\t\t\t...resources,\n\t\t\t\treservations: {\n\t\t\t\t\t...((resources.reservations as Record<string, unknown>) ?? {}),\n\t\t\t\t\tdevices: [{ driver: \"nvidia\", count: \"all\", capabilities: [\"gpu\"] }],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\t// Memory limits from estimatedMemoryMB\n\tif (def.minMemoryMB && options.hardened) {\n\t\tconst base = deploy ?? {};\n\t\tconst resources = (base.resources ?? {}) as Record<string, unknown>;\n\t\tconst limits = (resources.limits as Record<string, unknown>) ?? {};\n\t\tdeploy = {\n\t\t\t...base,\n\t\t\tresources: {\n\t\t\t\t...resources,\n\t\t\t\tlimits: {\n\t\t\t\t\t...limits,\n\t\t\t\t\tmemory: `${def.minMemoryMB * 2}m`, // 2x min as safe limit\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\tif (deploy) svc.deploy = deploy;\n\n\t// Security hardening (when enabled)\n\tif (options.hardened) {\n\t\tsvc.cap_drop = [\"ALL\"];\n\t\tsvc.security_opt = [\"no-new-privileges:true\"];\n\n\t\t// Services that need specific capabilities\n\t\tconst capAddMap: Record<string, string[]> = {\n\t\t\tcaddy: [\"NET_BIND_SERVICE\"],\n\t\t\ttraefik: [\"NET_BIND_SERVICE\"],\n\t\t\tcrowdsec: [\"NET_BIND_SERVICE\", \"DAC_READ_SEARCH\"],\n\t\t};\n\t\tif (capAddMap[def.id]) {\n\t\t\tsvc.cap_add = capAddMap[def.id];\n\t\t}\n\t}\n\n\t// Merge both dependsOn and requires to ensure proper Docker startup ordering\n\tconst depIds = [...new Set([...def.dependsOn, ...def.requires])].filter((id) =>\n\t\tresolved.services.some((s) => s.definition.id === id),\n\t);\n\tif (depIds.length > 0) {\n\t\tconst dependsOn: Record<string, { condition: string }> = {};\n\t\tfor (const depId of depIds) {\n\t\t\tconst dep = resolved.services.find((s) => s.definition.id === depId);\n\t\t\tdependsOn[depId] = {\n\t\t\t\tcondition: dep?.definition.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t\tsvc.depends_on = dependsOn;\n\t}\n\n\treturn { entry: svc, volumeNames };\n}\n\n// ── PostgreSQL Setup Init Container ─────────────────────────────────────────\n\n/**\n * Builds a one-shot init container that creates databases and users for\n * services that need their own PostgreSQL database. Runs AFTER PostgreSQL\n * is healthy, on every `docker compose up`, and is idempotent.\n *\n * Uses standard PG* environment variables (PGHOST, PGUSER, PGDATABASE,\n * PGPASSWORD) so psql/createuser/createdb automatically connect without\n * needing explicit -h/-U/-d flags — simpler and avoids YAML escaping issues.\n *\n * Returns null when no setup is needed (no PostgreSQL or no DB requirements).\n */\nfunction buildPostgresSetup(resolved: ResolverOutput): Record<string, unknown> | null {\n\tconst hasPostgres = resolved.services.some((s) => s.definition.id === \"postgresql\");\n\tif (!hasPostgres) return null;\n\n\tconst dbReqs = getDbRequirements(resolved);\n\tif (dbReqs.length === 0) return null;\n\n\t// Build a shell script with one command per line.\n\t// Uses $$ to escape $ from Docker Compose's variable substitution —\n\t// Docker Compose converts $$ → $ before passing to the container.\n\t// NO set -e: we handle errors explicitly so one failed service doesn't block others.\n\tconst scriptLines = [\"echo '=== PostgreSQL database setup ==='\", \"FAILED=0\"];\n\n\tfor (const req of dbReqs) {\n\t\t// Each service's setup is wrapped so a failure doesn't block the others.\n\t\t// Uses psql -v ON_ERROR_STOP=0 so SQL errors don't abort psql.\n\t\tscriptLines.push(\n\t\t\t`echo \"Setting up database '${req.dbName}' with user '${req.dbUser}'...\"`,\n\t\t\t// Create user if not exists (pure SQL, no createuser binary quirks)\n\t\t\t`psql -c \"SELECT 1 FROM pg_roles WHERE rolname='${req.dbUser}'\" | grep -q 1 || psql -c \"CREATE ROLE ${req.dbUser} WITH LOGIN PASSWORD '$$${req.passwordEnvVar}'\"`,\n\t\t\t// Always sync the password to match current env\n\t\t\t`psql -c \"ALTER ROLE ${req.dbUser} WITH LOGIN PASSWORD '$$${req.passwordEnvVar}'\"`,\n\t\t\t// Create database if not exists\n\t\t\t`psql -tc \"SELECT 1 FROM pg_database WHERE datname='${req.dbName}'\" | grep -q 1 || psql -c \"CREATE DATABASE ${req.dbName} OWNER ${req.dbUser}\"`,\n\t\t\t// Grant privileges (idempotent)\n\t\t\t`psql -c \"GRANT ALL PRIVILEGES ON DATABASE ${req.dbName} TO ${req.dbUser}\" || FAILED=1`,\n\t\t\t`echo \" Done: ${req.dbName}\"`,\n\t\t);\n\t}\n\n\tscriptLines.push(\"echo '=== All databases ready ==='\", \"exit $$FAILED\");\n\n\t// Standard PG* env vars: psql/createuser/createdb use these automatically\n\tconst env: Record<string, string> = {\n\t\tPGHOST: \"postgresql\",\n\t\tPGUSER: \"${POSTGRES_USER:-openclaw}\",\n\t\tPGDATABASE: \"${POSTGRES_DB:-openclaw}\",\n\t\tPGPASSWORD: \"${POSTGRES_PASSWORD}\",\n\t};\n\tfor (const req of dbReqs) {\n\t\tenv[req.passwordEnvVar] = `\\${${req.passwordEnvVar}}`;\n\t}\n\n\treturn {\n\t\timage: \"postgres:17-alpine\",\n\t\tdepends_on: {\n\t\t\tpostgresql: { condition: \"service_healthy\" },\n\t\t},\n\t\tenvironment: env,\n\t\t// command MUST be a single-element array so the entire script is passed\n\t\t// as ONE argument to `sh -c`. A plain string gets shlex-split by Docker\n\t\t// Compose into multiple args, breaking multi-line scripts.\n\t\tentrypoint: [\"/bin/sh\", \"-c\"],\n\t\tcommand: [scriptLines.join(\"\\n\")],\n\t\trestart: quotedStr(\"no\"),\n\t\tnetworks: [\"openclaw-network\"],\n\t};\n}\n\n// ── Single-File Compose ─────────────────────────────────────────────────────\n\n/**\n * Generates a single Docker Compose YAML string with ALL services.\n * Backward-compatible signature.\n */\nexport function compose(resolved: ResolverOutput, options: ComposeOptions): string {\n\tconst isDirectInstall = options.openclawInstallMethod === \"direct\";\n\n\t// Build depends_on for ALL companion services\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tgatewayDependsOn[def.id] = {\n\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t};\n\t}\n\n\tconst services: Record<string, Record<string, unknown>> = {};\n\tlet allVolumes = new Set<string>();\n\n\tif (!isDirectInstall) {\n\t\tconst {\n\t\t\tgatewayService,\n\t\t\tcliService,\n\t\t\tallVolumes: gwVolumes,\n\t\t} = buildGatewayServices(resolved, options, gatewayDependsOn);\n\t\tallVolumes = gwVolumes;\n\t\tservices[\"openclaw-gateway\"] = gatewayService;\n\t\t// CLI service added after companions\n\t\t// Determine which services need DB setup so we can redirect their depends_on\n\t\tconst dbReqs = getDbRequirements(resolved);\n\t\tconst dbServiceIds = new Set(dbReqs.map((r) => r.serviceId));\n\n\t\tfor (const { definition: def } of resolved.services) {\n\t\t\tconst { entry } = buildCompanionService(def, resolved, options, allVolumes);\n\t\t\tif (dbServiceIds.has(def.id) && entry.depends_on) {\n\t\t\t\tconst deps = entry.depends_on as Record<string, { condition: string }>;\n\t\t\t\tif (deps.postgresql) {\n\t\t\t\t\tdelete deps.postgresql;\n\t\t\t\t\tdeps[\"postgres-setup\"] = { condition: \"service_completed_successfully\" };\n\t\t\t\t}\n\t\t\t}\n\t\t\tservices[def.id] = entry;\n\t\t}\n\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tservices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\n\t\tservices[\"openclaw-cli\"] = cliService;\n\t} else {\n\t\t// Direct install: no gateway/CLI containers, just companion services\n\t\tconst dbReqs = getDbRequirements(resolved);\n\t\tconst dbServiceIds = new Set(dbReqs.map((r) => r.serviceId));\n\n\t\tfor (const { definition: def } of resolved.services) {\n\t\t\tconst { entry } = buildCompanionService(def, resolved, options, allVolumes);\n\t\t\tif (dbServiceIds.has(def.id) && entry.depends_on) {\n\t\t\t\tconst deps = entry.depends_on as Record<string, { condition: string }>;\n\t\t\t\tif (deps.postgresql) {\n\t\t\t\t\tdelete deps.postgresql;\n\t\t\t\t\tdeps[\"postgres-setup\"] = { condition: \"service_completed_successfully\" };\n\t\t\t\t}\n\t\t\t}\n\t\t\tservices[def.id] = entry;\n\t\t}\n\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tservices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\t}\n\n\tconst volumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tvolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\treturn stringify({ services, volumes, networks }, YAML_OPTIONS);\n}\n\n// ── Multi-File Compose ──────────────────────────────────────────────────────\n\ninterface ServiceInfo {\n\tid: string;\n\tcategory: ServiceCategory;\n\tentry: Record<string, unknown>;\n\tvolumeNames: string[];\n}\n\n/**\n * Generates multiple Docker Compose files, splitting services into profile-based\n * override files by category.\n */\nexport function composeMultiFile(resolved: ResolverOutput, options: ComposeOptions): ComposeResult {\n\tconst isDirectInstall = options.openclawInstallMethod === \"direct\";\n\tconst allVolumes = new Set<string>();\n\n\t// Build all companion service entries & classify by category\n\tconst serviceInfos: ServiceInfo[] = [];\n\tconst dbReqs = getDbRequirements(resolved);\n\tconst dbServiceIds = new Set(dbReqs.map((r) => r.serviceId));\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry, volumeNames } = buildCompanionService(def, resolved, options, allVolumes);\n\t\t// Redirect DB-dependent services to depend on postgres-setup\n\t\tif (dbServiceIds.has(def.id) && entry.depends_on) {\n\t\t\tconst deps = entry.depends_on as Record<string, { condition: string }>;\n\t\t\tif (deps.postgresql) {\n\t\t\t\tdelete deps.postgresql;\n\t\t\t\tdeps[\"postgres-setup\"] = { condition: \"service_completed_successfully\" };\n\t\t\t}\n\t\t}\n\t\tserviceInfos.push({ id: def.id, category: def.category, entry, volumeNames });\n\t}\n\n\t// Partition services into base vs. profile files\n\tconst baseServiceIds = new Set<string>();\n\tconst profileFileMap: Record<string, { profile: string; services: ServiceInfo[] }> = {};\n\n\tfor (const info of serviceInfos) {\n\t\tconst mapping = CATEGORY_PROFILE_MAP[info.category];\n\t\tif (mapping) {\n\t\t\tif (!profileFileMap[mapping.file]) {\n\t\t\t\tprofileFileMap[mapping.file] = { profile: mapping.profile, services: [] };\n\t\t\t}\n\t\t\tprofileFileMap[mapping.file]!.services.push(info);\n\t\t} else {\n\t\t\tbaseServiceIds.add(info.id);\n\t\t}\n\t}\n\n\tconst baseServices: Record<string, Record<string, unknown>> = {};\n\n\tif (!isDirectInstall) {\n\t\t// Gateway depends_on (only base services)\n\t\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\t\tfor (const { definition: def } of resolved.services) {\n\t\t\tif (baseServiceIds.has(def.id)) {\n\t\t\t\tgatewayDependsOn[def.id] = {\n\t\t\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst {\n\t\t\tgatewayService,\n\t\t\tcliService,\n\t\t\tallVolumes: gwVolumes,\n\t\t} = buildGatewayServices(resolved, options, gatewayDependsOn);\n\n\t\t// Merge gateway volumes into allVolumes\n\t\tfor (const v of gwVolumes) allVolumes.add(v);\n\n\t\tbaseServices[\"openclaw-gateway\"] = gatewayService;\n\n\t\tfor (const info of serviceInfos) {\n\t\t\tif (baseServiceIds.has(info.id)) {\n\t\t\t\tbaseServices[info.id] = info.entry;\n\t\t\t}\n\t\t}\n\n\t\t// Add postgres-setup init container if needed\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tbaseServices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\n\t\tbaseServices[\"openclaw-cli\"] = cliService;\n\t} else {\n\t\t// Direct install: no gateway/CLI containers\n\t\tfor (const info of serviceInfos) {\n\t\t\tif (baseServiceIds.has(info.id)) {\n\t\t\t\tbaseServices[info.id] = info.entry;\n\t\t\t}\n\t\t}\n\n\t\tconst pgSetup = buildPostgresSetup(resolved);\n\t\tif (pgSetup) {\n\t\t\tbaseServices[\"postgres-setup\"] = pgSetup;\n\t\t}\n\t}\n\n\tconst sortedAllVolumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tsortedAllVolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\tconst files: Record<string, string> = {};\n\tfiles[\"docker-compose.yml\"] = stringify(\n\t\t{ services: baseServices, volumes: sortedAllVolumes, networks },\n\t\tYAML_OPTIONS,\n\t);\n\n\t// Profile override files\n\tconst usedProfiles = new Set<string>();\n\n\tfor (const [fileName, { profile, services }] of Object.entries(profileFileMap)) {\n\t\tusedProfiles.add(profile);\n\n\t\tconst profileServices: Record<string, Record<string, unknown>> = {};\n\t\tconst profileVolumes = new Set<string>();\n\n\t\tfor (const info of services) {\n\t\t\tprofileServices[info.id] = { ...info.entry, profiles: [profile] };\n\t\t\tfor (const vName of info.volumeNames) {\n\t\t\t\tprofileVolumes.add(vName);\n\t\t\t}\n\t\t}\n\n\t\tconst fileContent: Record<string, unknown> = { services: profileServices };\n\n\t\tif (profileVolumes.size > 0) {\n\t\t\tconst sortedProfileVolumes: Record<string, null> = {};\n\t\t\tfor (const v of [...profileVolumes].sort()) {\n\t\t\t\tsortedProfileVolumes[v] = null;\n\t\t\t}\n\t\t\tfileContent.volumes = sortedProfileVolumes;\n\t\t}\n\n\t\tfiles[fileName] = stringify(fileContent, YAML_OPTIONS);\n\t}\n\n\treturn {\n\t\tfiles,\n\t\tmainFile: \"docker-compose.yml\",\n\t\tprofiles: [...usedProfiles].sort(),\n\t};\n}\n"],"mappings":"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"}
|
package/dist/composer.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.d.mts","names":[],"sources":["../src/composer.ts"],"mappings":";;;UAiCiB,aAAA;EAChB,KAAA,EAAO,MAAA;EACP,QAAA;EACA,QAAA;AAAA;;;;;iBA+be,OAAA,CAAQ,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA
|
|
1
|
+
{"version":3,"file":"composer.d.mts","names":[],"sources":["../src/composer.ts"],"mappings":";;;UAiCiB,aAAA;EAChB,KAAA,EAAO,MAAA;EACP,QAAA;EACA,QAAA;AAAA;;;;;iBA+be,OAAA,CAAQ,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA;;;;AAA3D;iBA2FgB,gBAAA,CAAiB,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA,GAAiB,aAAA"}
|
package/dist/composer.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { getDbRequirements } from "./generators/postgres-init.mjs";
|
|
2
2
|
import { Scalar, stringify } from "yaml";
|
|
3
|
-
|
|
4
3
|
//#region src/composer.ts
|
|
5
4
|
/** Maps image variant to the Docker image string. */
|
|
6
5
|
const IMAGE_VARIANTS = {
|
|
@@ -453,7 +452,7 @@ function composeMultiFile(resolved, options) {
|
|
|
453
452
|
profiles: [...usedProfiles].sort()
|
|
454
453
|
};
|
|
455
454
|
}
|
|
456
|
-
|
|
457
455
|
//#endregion
|
|
458
456
|
export { compose, composeMultiFile };
|
|
457
|
+
|
|
459
458
|
//# sourceMappingURL=composer.mjs.map
|