@better-openclaw/core 1.0.22 → 1.0.24
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.test.cjs +3 -4
- 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/composer.cjs +40 -14
- package/dist/composer.cjs.map +1 -1
- package/dist/composer.d.cts.map +1 -1
- package/dist/composer.d.mts.map +1 -1
- package/dist/composer.mjs +40 -14
- package/dist/composer.mjs.map +1 -1
- package/dist/composer.snapshot.test.cjs +1 -1
- package/dist/composer.snapshot.test.mjs +1 -1
- package/dist/composer.test.cjs +3 -2
- package/dist/composer.test.cjs.map +1 -1
- package/dist/composer.test.mjs +3 -2
- package/dist/composer.test.mjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.cjs +1 -1
- package/dist/deployers/strip-host-ports.test.mjs +1 -1
- package/dist/generate.cjs +7 -2
- package/dist/generate.cjs.map +1 -1
- package/dist/generate.d.cts.map +1 -1
- package/dist/generate.d.mts.map +1 -1
- package/dist/generate.mjs +7 -2
- package/dist/generate.mjs.map +1 -1
- package/dist/generate.test.cjs +2 -2
- package/dist/generate.test.cjs.map +1 -1
- package/dist/generate.test.mjs +2 -2
- package/dist/generate.test.mjs.map +1 -1
- package/dist/generators/bare-metal-install.test.cjs +1 -1
- package/dist/generators/bare-metal-install.test.mjs +1 -1
- package/dist/generators/caddy.test.cjs +1 -1
- package/dist/generators/caddy.test.mjs +1 -1
- package/dist/generators/clone-repos.cjs +140 -0
- package/dist/generators/clone-repos.cjs.map +1 -0
- package/dist/generators/clone-repos.d.cts +11 -0
- package/dist/generators/clone-repos.d.cts.map +1 -0
- package/dist/generators/clone-repos.d.mts +11 -0
- package/dist/generators/clone-repos.d.mts.map +1 -0
- package/dist/generators/clone-repos.mjs +139 -0
- package/dist/generators/clone-repos.mjs.map +1 -0
- package/dist/generators/clone-repos.test.cjs +140 -0
- package/dist/generators/clone-repos.test.cjs.map +1 -0
- package/dist/generators/clone-repos.test.d.cts +1 -0
- package/dist/generators/clone-repos.test.d.mts +1 -0
- package/dist/generators/clone-repos.test.mjs +141 -0
- package/dist/generators/clone-repos.test.mjs.map +1 -0
- package/dist/generators/env.cjs +146 -0
- package/dist/generators/env.cjs.map +1 -1
- package/dist/generators/env.d.cts.map +1 -1
- package/dist/generators/env.d.mts.map +1 -1
- package/dist/generators/env.mjs +146 -0
- package/dist/generators/env.mjs.map +1 -1
- package/dist/generators/env.test.cjs +1 -1
- package/dist/generators/env.test.mjs +1 -1
- package/dist/generators/health-check.test.cjs +1 -1
- package/dist/generators/health-check.test.mjs +1 -1
- package/dist/generators/openclaw-json.cjs +102 -7
- package/dist/generators/openclaw-json.cjs.map +1 -1
- package/dist/generators/openclaw-json.mjs +102 -7
- package/dist/generators/openclaw-json.mjs.map +1 -1
- package/dist/generators/postgres-init.cjs +20 -0
- 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 +20 -0
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/readme.cjs +2 -1
- package/dist/generators/readme.cjs.map +1 -1
- package/dist/generators/readme.mjs +2 -1
- package/dist/generators/readme.mjs.map +1 -1
- package/dist/generators/scripts.cjs +332 -3
- package/dist/generators/scripts.cjs.map +1 -1
- package/dist/generators/scripts.d.cts +3 -1
- package/dist/generators/scripts.d.cts.map +1 -1
- package/dist/generators/scripts.d.mts +3 -1
- package/dist/generators/scripts.d.mts.map +1 -1
- package/dist/generators/scripts.mjs +332 -3
- package/dist/generators/scripts.mjs.map +1 -1
- package/dist/generators/scripts.test.cjs +39 -5
- package/dist/generators/scripts.test.cjs.map +1 -1
- package/dist/generators/scripts.test.mjs +39 -5
- package/dist/generators/scripts.test.mjs.map +1 -1
- package/dist/generators/stack-manifest.cjs +1 -0
- package/dist/generators/stack-manifest.cjs.map +1 -1
- package/dist/generators/stack-manifest.d.cts +3 -2
- package/dist/generators/stack-manifest.d.cts.map +1 -1
- package/dist/generators/stack-manifest.d.mts +3 -2
- package/dist/generators/stack-manifest.d.mts.map +1 -1
- package/dist/generators/stack-manifest.mjs +1 -0
- package/dist/generators/stack-manifest.mjs.map +1 -1
- package/dist/generators/traefik.test.cjs +1 -1
- package/dist/generators/traefik.test.mjs +1 -1
- package/dist/index.cjs +8 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +5 -3
- package/dist/migrations.test.cjs +1 -1
- package/dist/migrations.test.mjs +1 -1
- package/dist/presets/registry.cjs +19 -0
- 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 +19 -0
- package/dist/presets/registry.mjs.map +1 -1
- package/dist/presets/registry.test.cjs +1 -1
- package/dist/presets/registry.test.mjs +1 -1
- package/dist/resolver.cjs +8 -0
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.mjs +9 -1
- package/dist/resolver.mjs.map +1 -1
- package/dist/resolver.test.cjs +47 -12
- package/dist/resolver.test.cjs.map +1 -1
- package/dist/resolver.test.mjs +47 -12
- package/dist/resolver.test.mjs.map +1 -1
- package/dist/{schema-C_hc7e4k.d.cts → schema-eX44HhRp.d.mts} +78 -8
- package/dist/schema-eX44HhRp.d.mts.map +1 -0
- package/dist/{schema-CaesJaS2.d.mts → schema-tn5RK8CM.d.cts} +78 -8
- package/dist/schema-tn5RK8CM.d.cts.map +1 -0
- package/dist/schema.cjs +26 -4
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +2 -2
- package/dist/schema.d.mts +2 -2
- package/dist/schema.mjs +25 -5
- package/dist/schema.mjs.map +1 -1
- package/dist/schema.test.cjs +1 -1
- package/dist/schema.test.mjs +1 -1
- package/dist/services/definitions/adguard-home.cjs +74 -0
- package/dist/services/definitions/adguard-home.cjs.map +1 -0
- package/dist/services/definitions/adguard-home.d.cts +7 -0
- package/dist/services/definitions/adguard-home.d.cts.map +1 -0
- package/dist/services/definitions/adguard-home.d.mts +7 -0
- package/dist/services/definitions/adguard-home.d.mts.map +1 -0
- package/dist/services/definitions/adguard-home.mjs +73 -0
- package/dist/services/definitions/adguard-home.mjs.map +1 -0
- package/dist/services/definitions/apptension-saas.cjs +87 -0
- package/dist/services/definitions/apptension-saas.cjs.map +1 -0
- package/dist/services/definitions/apptension-saas.d.cts +7 -0
- package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
- package/dist/services/definitions/apptension-saas.d.mts +7 -0
- package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
- package/dist/services/definitions/apptension-saas.mjs +86 -0
- package/dist/services/definitions/apptension-saas.mjs.map +1 -0
- package/dist/services/definitions/audiobookshelf.cjs +81 -0
- package/dist/services/definitions/audiobookshelf.cjs.map +1 -0
- package/dist/services/definitions/audiobookshelf.d.cts +7 -0
- package/dist/services/definitions/audiobookshelf.d.cts.map +1 -0
- package/dist/services/definitions/audiobookshelf.d.mts +7 -0
- package/dist/services/definitions/audiobookshelf.d.mts.map +1 -0
- package/dist/services/definitions/audiobookshelf.mjs +80 -0
- package/dist/services/definitions/audiobookshelf.mjs.map +1 -0
- package/dist/services/definitions/baserow.cjs +115 -0
- package/dist/services/definitions/baserow.cjs.map +1 -0
- package/dist/services/definitions/baserow.d.cts +7 -0
- package/dist/services/definitions/baserow.d.cts.map +1 -0
- package/dist/services/definitions/baserow.d.mts +7 -0
- package/dist/services/definitions/baserow.d.mts.map +1 -0
- package/dist/services/definitions/baserow.mjs +114 -0
- package/dist/services/definitions/baserow.mjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.cjs +88 -0
- package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.mjs +87 -0
- package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
- package/dist/services/definitions/calibre-web.cjs +91 -0
- package/dist/services/definitions/calibre-web.cjs.map +1 -0
- package/dist/services/definitions/calibre-web.d.cts +7 -0
- package/dist/services/definitions/calibre-web.d.cts.map +1 -0
- package/dist/services/definitions/calibre-web.d.mts +7 -0
- package/dist/services/definitions/calibre-web.d.mts.map +1 -0
- package/dist/services/definitions/calibre-web.mjs +90 -0
- package/dist/services/definitions/calibre-web.mjs.map +1 -0
- package/dist/services/definitions/clickhouse.cjs +113 -0
- package/dist/services/definitions/clickhouse.cjs.map +1 -0
- package/dist/services/definitions/clickhouse.d.cts +7 -0
- package/dist/services/definitions/clickhouse.d.cts.map +1 -0
- package/dist/services/definitions/clickhouse.d.mts +7 -0
- package/dist/services/definitions/clickhouse.d.mts.map +1 -0
- package/dist/services/definitions/clickhouse.mjs +112 -0
- package/dist/services/definitions/clickhouse.mjs.map +1 -0
- package/dist/services/definitions/cloudflared.cjs +55 -0
- package/dist/services/definitions/cloudflared.cjs.map +1 -0
- package/dist/services/definitions/cloudflared.d.cts +7 -0
- package/dist/services/definitions/cloudflared.d.cts.map +1 -0
- package/dist/services/definitions/cloudflared.d.mts +7 -0
- package/dist/services/definitions/cloudflared.d.mts.map +1 -0
- package/dist/services/definitions/cloudflared.mjs +54 -0
- package/dist/services/definitions/cloudflared.mjs.map +1 -0
- package/dist/services/definitions/cmsaas-starter.cjs +86 -0
- package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.mjs +85 -0
- package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
- package/dist/services/definitions/cockroachdb.cjs +70 -0
- package/dist/services/definitions/cockroachdb.cjs.map +1 -0
- package/dist/services/definitions/cockroachdb.d.cts +7 -0
- package/dist/services/definitions/cockroachdb.d.cts.map +1 -0
- package/dist/services/definitions/cockroachdb.d.mts +7 -0
- package/dist/services/definitions/cockroachdb.d.mts.map +1 -0
- package/dist/services/definitions/cockroachdb.mjs +69 -0
- package/dist/services/definitions/cockroachdb.mjs.map +1 -0
- package/dist/services/definitions/coder.cjs +64 -0
- package/dist/services/definitions/coder.cjs.map +1 -0
- package/dist/services/definitions/coder.d.cts +7 -0
- package/dist/services/definitions/coder.d.cts.map +1 -0
- package/dist/services/definitions/coder.d.mts +7 -0
- package/dist/services/definitions/coder.d.mts.map +1 -0
- package/dist/services/definitions/coder.mjs +63 -0
- package/dist/services/definitions/coder.mjs.map +1 -0
- package/dist/services/definitions/dragonfly.cjs +64 -0
- package/dist/services/definitions/dragonfly.cjs.map +1 -0
- package/dist/services/definitions/dragonfly.d.cts +7 -0
- package/dist/services/definitions/dragonfly.d.cts.map +1 -0
- package/dist/services/definitions/dragonfly.d.mts +7 -0
- package/dist/services/definitions/dragonfly.d.mts.map +1 -0
- package/dist/services/definitions/dragonfly.mjs +63 -0
- package/dist/services/definitions/dragonfly.mjs.map +1 -0
- package/dist/services/definitions/drone-ci.cjs +95 -0
- package/dist/services/definitions/drone-ci.cjs.map +1 -0
- package/dist/services/definitions/drone-ci.d.cts +7 -0
- package/dist/services/definitions/drone-ci.d.cts.map +1 -0
- package/dist/services/definitions/drone-ci.d.mts +7 -0
- package/dist/services/definitions/drone-ci.d.mts.map +1 -0
- package/dist/services/definitions/drone-ci.mjs +94 -0
- package/dist/services/definitions/drone-ci.mjs.map +1 -0
- package/dist/services/definitions/element-web.cjs +61 -0
- package/dist/services/definitions/element-web.cjs.map +1 -0
- package/dist/services/definitions/element-web.d.cts +7 -0
- package/dist/services/definitions/element-web.d.cts.map +1 -0
- package/dist/services/definitions/element-web.d.mts +7 -0
- package/dist/services/definitions/element-web.d.mts.map +1 -0
- package/dist/services/definitions/element-web.mjs +60 -0
- package/dist/services/definitions/element-web.mjs.map +1 -0
- package/dist/services/definitions/focalboard.cjs +65 -0
- package/dist/services/definitions/focalboard.cjs.map +1 -0
- package/dist/services/definitions/focalboard.d.cts +7 -0
- package/dist/services/definitions/focalboard.d.cts.map +1 -0
- package/dist/services/definitions/focalboard.d.mts +7 -0
- package/dist/services/definitions/focalboard.d.mts.map +1 -0
- package/dist/services/definitions/focalboard.mjs +64 -0
- package/dist/services/definitions/focalboard.mjs.map +1 -0
- package/dist/services/definitions/forgejo.cjs +108 -0
- package/dist/services/definitions/forgejo.cjs.map +1 -0
- package/dist/services/definitions/forgejo.d.cts +7 -0
- package/dist/services/definitions/forgejo.d.cts.map +1 -0
- package/dist/services/definitions/forgejo.d.mts +7 -0
- package/dist/services/definitions/forgejo.d.mts.map +1 -0
- package/dist/services/definitions/forgejo.mjs +107 -0
- package/dist/services/definitions/forgejo.mjs.map +1 -0
- package/dist/services/definitions/graylog.cjs +103 -0
- package/dist/services/definitions/graylog.cjs.map +1 -0
- package/dist/services/definitions/graylog.d.cts +7 -0
- package/dist/services/definitions/graylog.d.cts.map +1 -0
- package/dist/services/definitions/graylog.d.mts +7 -0
- package/dist/services/definitions/graylog.d.mts.map +1 -0
- package/dist/services/definitions/graylog.mjs +102 -0
- package/dist/services/definitions/graylog.mjs.map +1 -0
- package/dist/services/definitions/index.cjs +154 -1
- package/dist/services/definitions/index.cjs.map +1 -1
- package/dist/services/definitions/index.d.cts +52 -1
- package/dist/services/definitions/index.d.cts.map +1 -1
- package/dist/services/definitions/index.d.mts +52 -1
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +104 -2
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/influxdb.cjs +105 -0
- package/dist/services/definitions/influxdb.cjs.map +1 -0
- package/dist/services/definitions/influxdb.d.cts +7 -0
- package/dist/services/definitions/influxdb.d.cts.map +1 -0
- package/dist/services/definitions/influxdb.d.mts +7 -0
- package/dist/services/definitions/influxdb.d.mts.map +1 -0
- package/dist/services/definitions/influxdb.mjs +104 -0
- package/dist/services/definitions/influxdb.mjs.map +1 -0
- package/dist/services/definitions/invoke-ai.cjs +70 -0
- package/dist/services/definitions/invoke-ai.cjs.map +1 -0
- package/dist/services/definitions/invoke-ai.d.cts +7 -0
- package/dist/services/definitions/invoke-ai.d.cts.map +1 -0
- package/dist/services/definitions/invoke-ai.d.mts +7 -0
- package/dist/services/definitions/invoke-ai.d.mts.map +1 -0
- package/dist/services/definitions/invoke-ai.mjs +69 -0
- package/dist/services/definitions/invoke-ai.mjs.map +1 -0
- package/dist/services/definitions/ixartz-saas.cjs +88 -0
- package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.cts +7 -0
- package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.mts +7 -0
- package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
- package/dist/services/definitions/ixartz-saas.mjs +87 -0
- package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
- package/dist/services/definitions/jaeger.cjs +95 -0
- package/dist/services/definitions/jaeger.cjs.map +1 -0
- package/dist/services/definitions/jaeger.d.cts +7 -0
- package/dist/services/definitions/jaeger.d.cts.map +1 -0
- package/dist/services/definitions/jaeger.d.mts +7 -0
- package/dist/services/definitions/jaeger.d.mts.map +1 -0
- package/dist/services/definitions/jaeger.mjs +94 -0
- package/dist/services/definitions/jaeger.mjs.map +1 -0
- package/dist/services/definitions/jan.cjs +64 -0
- package/dist/services/definitions/jan.cjs.map +1 -0
- package/dist/services/definitions/jan.d.cts +7 -0
- package/dist/services/definitions/jan.d.cts.map +1 -0
- package/dist/services/definitions/jan.d.mts +7 -0
- package/dist/services/definitions/jan.d.mts.map +1 -0
- package/dist/services/definitions/jan.mjs +63 -0
- package/dist/services/definitions/jan.mjs.map +1 -0
- package/dist/services/definitions/jitsi-meet.cjs +102 -0
- package/dist/services/definitions/jitsi-meet.cjs.map +1 -0
- package/dist/services/definitions/jitsi-meet.d.cts +7 -0
- package/dist/services/definitions/jitsi-meet.d.cts.map +1 -0
- package/dist/services/definitions/jitsi-meet.d.mts +7 -0
- package/dist/services/definitions/jitsi-meet.d.mts.map +1 -0
- package/dist/services/definitions/jitsi-meet.mjs +101 -0
- package/dist/services/definitions/jitsi-meet.mjs.map +1 -0
- package/dist/services/definitions/local-ai.cjs +86 -0
- package/dist/services/definitions/local-ai.cjs.map +1 -0
- package/dist/services/definitions/local-ai.d.cts +7 -0
- package/dist/services/definitions/local-ai.d.cts.map +1 -0
- package/dist/services/definitions/local-ai.d.mts +7 -0
- package/dist/services/definitions/local-ai.d.mts.map +1 -0
- package/dist/services/definitions/local-ai.mjs +85 -0
- package/dist/services/definitions/local-ai.mjs.map +1 -0
- package/dist/services/definitions/metabase.cjs +108 -0
- package/dist/services/definitions/metabase.cjs.map +1 -0
- package/dist/services/definitions/metabase.d.cts +7 -0
- package/dist/services/definitions/metabase.d.cts.map +1 -0
- package/dist/services/definitions/metabase.d.mts +7 -0
- package/dist/services/definitions/metabase.d.mts.map +1 -0
- package/dist/services/definitions/metabase.mjs +107 -0
- package/dist/services/definitions/metabase.mjs.map +1 -0
- package/dist/services/definitions/mission-control.cjs +16 -2
- package/dist/services/definitions/mission-control.cjs.map +1 -1
- package/dist/services/definitions/mission-control.mjs +16 -2
- package/dist/services/definitions/mission-control.mjs.map +1 -1
- package/dist/services/definitions/mosquitto.cjs +82 -0
- package/dist/services/definitions/mosquitto.cjs.map +1 -0
- package/dist/services/definitions/mosquitto.d.cts +7 -0
- package/dist/services/definitions/mosquitto.d.cts.map +1 -0
- package/dist/services/definitions/mosquitto.d.mts +7 -0
- package/dist/services/definitions/mosquitto.d.mts.map +1 -0
- package/dist/services/definitions/mosquitto.mjs +81 -0
- package/dist/services/definitions/mosquitto.mjs.map +1 -0
- package/dist/services/definitions/navidrome.cjs +90 -0
- package/dist/services/definitions/navidrome.cjs.map +1 -0
- package/dist/services/definitions/navidrome.d.cts +7 -0
- package/dist/services/definitions/navidrome.d.cts.map +1 -0
- package/dist/services/definitions/navidrome.d.mts +7 -0
- package/dist/services/definitions/navidrome.d.mts.map +1 -0
- package/dist/services/definitions/navidrome.mjs +89 -0
- package/dist/services/definitions/navidrome.mjs.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.cjs +71 -0
- package/dist/services/definitions/nginx-proxy-manager.cjs.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.d.cts +7 -0
- package/dist/services/definitions/nginx-proxy-manager.d.cts.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.d.mts +7 -0
- package/dist/services/definitions/nginx-proxy-manager.d.mts.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.mjs +70 -0
- package/dist/services/definitions/nginx-proxy-manager.mjs.map +1 -0
- package/dist/services/definitions/node-red.cjs +77 -0
- package/dist/services/definitions/node-red.cjs.map +1 -0
- package/dist/services/definitions/node-red.d.cts +7 -0
- package/dist/services/definitions/node-red.d.cts.map +1 -0
- package/dist/services/definitions/node-red.d.mts +7 -0
- package/dist/services/definitions/node-red.d.mts.map +1 -0
- package/dist/services/definitions/node-red.mjs +76 -0
- package/dist/services/definitions/node-red.mjs.map +1 -0
- package/dist/services/definitions/open-saas.cjs +81 -0
- package/dist/services/definitions/open-saas.cjs.map +1 -0
- package/dist/services/definitions/open-saas.d.cts +7 -0
- package/dist/services/definitions/open-saas.d.cts.map +1 -0
- package/dist/services/definitions/open-saas.d.mts +7 -0
- package/dist/services/definitions/open-saas.d.mts.map +1 -0
- package/dist/services/definitions/open-saas.mjs +80 -0
- package/dist/services/definitions/open-saas.mjs.map +1 -0
- package/dist/services/definitions/photoprism.cjs +126 -0
- package/dist/services/definitions/photoprism.cjs.map +1 -0
- package/dist/services/definitions/photoprism.d.cts +7 -0
- package/dist/services/definitions/photoprism.d.cts.map +1 -0
- package/dist/services/definitions/photoprism.d.mts +7 -0
- package/dist/services/definitions/photoprism.d.mts.map +1 -0
- package/dist/services/definitions/photoprism.mjs +125 -0
- package/dist/services/definitions/photoprism.mjs.map +1 -0
- package/dist/services/definitions/pihole.cjs +73 -0
- package/dist/services/definitions/pihole.cjs.map +1 -0
- package/dist/services/definitions/pihole.d.cts +7 -0
- package/dist/services/definitions/pihole.d.cts.map +1 -0
- package/dist/services/definitions/pihole.d.mts +7 -0
- package/dist/services/definitions/pihole.d.mts.map +1 -0
- package/dist/services/definitions/pihole.mjs +72 -0
- package/dist/services/definitions/pihole.mjs.map +1 -0
- package/dist/services/definitions/piper-tts.cjs +70 -0
- package/dist/services/definitions/piper-tts.cjs.map +1 -0
- package/dist/services/definitions/piper-tts.d.cts +7 -0
- package/dist/services/definitions/piper-tts.d.cts.map +1 -0
- package/dist/services/definitions/piper-tts.d.mts +7 -0
- package/dist/services/definitions/piper-tts.d.mts.map +1 -0
- package/dist/services/definitions/piper-tts.mjs +69 -0
- package/dist/services/definitions/piper-tts.mjs.map +1 -0
- package/dist/services/definitions/plane.cjs +75 -0
- package/dist/services/definitions/plane.cjs.map +1 -0
- package/dist/services/definitions/plane.d.cts +7 -0
- package/dist/services/definitions/plane.d.cts.map +1 -0
- package/dist/services/definitions/plane.d.mts +7 -0
- package/dist/services/definitions/plane.d.mts.map +1 -0
- package/dist/services/definitions/plane.mjs +74 -0
- package/dist/services/definitions/plane.mjs.map +1 -0
- package/dist/services/definitions/plausible.cjs +94 -0
- package/dist/services/definitions/plausible.cjs.map +1 -0
- package/dist/services/definitions/plausible.d.cts +7 -0
- package/dist/services/definitions/plausible.d.cts.map +1 -0
- package/dist/services/definitions/plausible.d.mts +7 -0
- package/dist/services/definitions/plausible.d.mts.map +1 -0
- package/dist/services/definitions/plausible.mjs +93 -0
- package/dist/services/definitions/plausible.mjs.map +1 -0
- package/dist/services/definitions/pocket-id.cjs +101 -0
- package/dist/services/definitions/pocket-id.cjs.map +1 -0
- package/dist/services/definitions/pocket-id.d.cts +7 -0
- package/dist/services/definitions/pocket-id.d.cts.map +1 -0
- package/dist/services/definitions/pocket-id.d.mts +7 -0
- package/dist/services/definitions/pocket-id.d.mts.map +1 -0
- package/dist/services/definitions/pocket-id.mjs +100 -0
- package/dist/services/definitions/pocket-id.mjs.map +1 -0
- package/dist/services/definitions/posthog.cjs +94 -0
- package/dist/services/definitions/posthog.cjs.map +1 -0
- package/dist/services/definitions/posthog.d.cts +7 -0
- package/dist/services/definitions/posthog.d.cts.map +1 -0
- package/dist/services/definitions/posthog.d.mts +7 -0
- package/dist/services/definitions/posthog.d.mts.map +1 -0
- package/dist/services/definitions/posthog.mjs +93 -0
- package/dist/services/definitions/posthog.mjs.map +1 -0
- package/dist/services/definitions/redis.cjs +1 -1
- package/dist/services/definitions/redis.cjs.map +1 -1
- package/dist/services/definitions/redis.mjs +1 -1
- package/dist/services/definitions/redis.mjs.map +1 -1
- package/dist/services/definitions/revolt.cjs +64 -0
- package/dist/services/definitions/revolt.cjs.map +1 -0
- package/dist/services/definitions/revolt.d.cts +7 -0
- package/dist/services/definitions/revolt.d.cts.map +1 -0
- package/dist/services/definitions/revolt.d.mts +7 -0
- package/dist/services/definitions/revolt.d.mts.map +1 -0
- package/dist/services/definitions/revolt.mjs +63 -0
- package/dist/services/definitions/revolt.mjs.map +1 -0
- package/dist/services/definitions/sentry.cjs +101 -0
- package/dist/services/definitions/sentry.cjs.map +1 -0
- package/dist/services/definitions/sentry.d.cts +7 -0
- package/dist/services/definitions/sentry.d.cts.map +1 -0
- package/dist/services/definitions/sentry.d.mts +7 -0
- package/dist/services/definitions/sentry.d.mts.map +1 -0
- package/dist/services/definitions/sentry.mjs +100 -0
- package/dist/services/definitions/sentry.mjs.map +1 -0
- package/dist/services/definitions/sonarqube.cjs +86 -0
- package/dist/services/definitions/sonarqube.cjs.map +1 -0
- package/dist/services/definitions/sonarqube.d.cts +7 -0
- package/dist/services/definitions/sonarqube.d.cts.map +1 -0
- package/dist/services/definitions/sonarqube.d.mts +7 -0
- package/dist/services/definitions/sonarqube.d.mts.map +1 -0
- package/dist/services/definitions/sonarqube.mjs +85 -0
- package/dist/services/definitions/sonarqube.mjs.map +1 -0
- package/dist/services/definitions/superset.cjs +77 -0
- package/dist/services/definitions/superset.cjs.map +1 -0
- package/dist/services/definitions/superset.d.cts +7 -0
- package/dist/services/definitions/superset.d.cts.map +1 -0
- package/dist/services/definitions/superset.d.mts +7 -0
- package/dist/services/definitions/superset.d.mts.map +1 -0
- package/dist/services/definitions/superset.mjs +76 -0
- package/dist/services/definitions/superset.mjs.map +1 -0
- package/dist/services/definitions/surrealdb.cjs +72 -0
- package/dist/services/definitions/surrealdb.cjs.map +1 -0
- package/dist/services/definitions/surrealdb.d.cts +7 -0
- package/dist/services/definitions/surrealdb.d.cts.map +1 -0
- package/dist/services/definitions/surrealdb.d.mts +7 -0
- package/dist/services/definitions/surrealdb.d.mts.map +1 -0
- package/dist/services/definitions/surrealdb.mjs +71 -0
- package/dist/services/definitions/surrealdb.mjs.map +1 -0
- package/dist/services/definitions/tabby-ml.cjs +70 -0
- package/dist/services/definitions/tabby-ml.cjs.map +1 -0
- package/dist/services/definitions/tabby-ml.d.cts +7 -0
- package/dist/services/definitions/tabby-ml.d.cts.map +1 -0
- package/dist/services/definitions/tabby-ml.d.mts +7 -0
- package/dist/services/definitions/tabby-ml.d.mts.map +1 -0
- package/dist/services/definitions/tabby-ml.mjs +69 -0
- package/dist/services/definitions/tabby-ml.mjs.map +1 -0
- package/dist/services/definitions/tempo.cjs +57 -0
- package/dist/services/definitions/tempo.cjs.map +1 -0
- package/dist/services/definitions/tempo.d.cts +7 -0
- package/dist/services/definitions/tempo.d.cts.map +1 -0
- package/dist/services/definitions/tempo.d.mts +7 -0
- package/dist/services/definitions/tempo.d.mts.map +1 -0
- package/dist/services/definitions/tempo.mjs +56 -0
- package/dist/services/definitions/tempo.mjs.map +1 -0
- package/dist/services/definitions/text-gen-webui.cjs +88 -0
- package/dist/services/definitions/text-gen-webui.cjs.map +1 -0
- package/dist/services/definitions/text-gen-webui.d.cts +7 -0
- package/dist/services/definitions/text-gen-webui.d.cts.map +1 -0
- package/dist/services/definitions/text-gen-webui.d.mts +7 -0
- package/dist/services/definitions/text-gen-webui.d.mts.map +1 -0
- package/dist/services/definitions/text-gen-webui.mjs +87 -0
- package/dist/services/definitions/text-gen-webui.mjs.map +1 -0
- package/dist/services/definitions/timescaledb.cjs +87 -0
- package/dist/services/definitions/timescaledb.cjs.map +1 -0
- package/dist/services/definitions/timescaledb.d.cts +7 -0
- package/dist/services/definitions/timescaledb.d.cts.map +1 -0
- package/dist/services/definitions/timescaledb.d.mts +7 -0
- package/dist/services/definitions/timescaledb.d.mts.map +1 -0
- package/dist/services/definitions/timescaledb.mjs +86 -0
- package/dist/services/definitions/timescaledb.mjs.map +1 -0
- package/dist/services/definitions/valkey.cjs +1 -1
- package/dist/services/definitions/valkey.cjs.map +1 -1
- package/dist/services/definitions/valkey.mjs +1 -1
- package/dist/services/definitions/valkey.mjs.map +1 -1
- package/dist/services/definitions/vector-log.cjs +59 -0
- package/dist/services/definitions/vector-log.cjs.map +1 -0
- package/dist/services/definitions/vector-log.d.cts +7 -0
- package/dist/services/definitions/vector-log.d.cts.map +1 -0
- package/dist/services/definitions/vector-log.d.mts +7 -0
- package/dist/services/definitions/vector-log.d.mts.map +1 -0
- package/dist/services/definitions/vector-log.mjs +58 -0
- package/dist/services/definitions/vector-log.mjs.map +1 -0
- package/dist/services/definitions/vikunja.cjs +96 -0
- package/dist/services/definitions/vikunja.cjs.map +1 -0
- package/dist/services/definitions/vikunja.d.cts +7 -0
- package/dist/services/definitions/vikunja.d.cts.map +1 -0
- package/dist/services/definitions/vikunja.d.mts +7 -0
- package/dist/services/definitions/vikunja.d.mts.map +1 -0
- package/dist/services/definitions/vikunja.mjs +95 -0
- package/dist/services/definitions/vikunja.mjs.map +1 -0
- package/dist/services/definitions/wireguard.cjs +88 -0
- package/dist/services/definitions/wireguard.cjs.map +1 -0
- package/dist/services/definitions/wireguard.d.cts +7 -0
- package/dist/services/definitions/wireguard.d.cts.map +1 -0
- package/dist/services/definitions/wireguard.d.mts +7 -0
- package/dist/services/definitions/wireguard.d.mts.map +1 -0
- package/dist/services/definitions/wireguard.mjs +87 -0
- package/dist/services/definitions/wireguard.mjs.map +1 -0
- package/dist/services/definitions/woodpecker-ci.cjs +93 -0
- package/dist/services/definitions/woodpecker-ci.cjs.map +1 -0
- package/dist/services/definitions/woodpecker-ci.d.cts +7 -0
- package/dist/services/definitions/woodpecker-ci.d.cts.map +1 -0
- package/dist/services/definitions/woodpecker-ci.d.mts +7 -0
- package/dist/services/definitions/woodpecker-ci.d.mts.map +1 -0
- package/dist/services/definitions/woodpecker-ci.mjs +92 -0
- package/dist/services/definitions/woodpecker-ci.mjs.map +1 -0
- package/dist/services/definitions/zulip.cjs +116 -0
- package/dist/services/definitions/zulip.cjs.map +1 -0
- package/dist/services/definitions/zulip.d.cts +7 -0
- package/dist/services/definitions/zulip.d.cts.map +1 -0
- package/dist/services/definitions/zulip.d.mts +7 -0
- package/dist/services/definitions/zulip.d.mts.map +1 -0
- package/dist/services/definitions/zulip.mjs +115 -0
- package/dist/services/definitions/zulip.mjs.map +1 -0
- package/dist/services/registry.cjs +3 -0
- package/dist/services/registry.cjs.map +1 -1
- package/dist/services/registry.d.cts.map +1 -1
- package/dist/services/registry.d.mts.map +1 -1
- package/dist/services/registry.mjs +3 -0
- package/dist/services/registry.mjs.map +1 -1
- package/dist/services/registry.test.cjs +8 -1
- package/dist/services/registry.test.cjs.map +1 -1
- package/dist/services/registry.test.mjs +8 -1
- package/dist/services/registry.test.mjs.map +1 -1
- package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
- package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
- package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
- package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
- package/dist/skills/registry.cjs +3 -3
- package/dist/skills/registry.cjs.map +1 -1
- package/dist/skills/registry.mjs +3 -3
- package/dist/skills/registry.mjs.map +1 -1
- package/dist/skills/skill-manifest.cjs +1 -1
- package/dist/skills/skill-manifest.mjs +1 -1
- package/dist/track-analytics.cjs +50 -0
- package/dist/track-analytics.cjs.map +1 -0
- package/dist/track-analytics.d.cts +34 -0
- package/dist/track-analytics.d.cts.map +1 -0
- package/dist/track-analytics.d.mts +34 -0
- package/dist/track-analytics.d.mts.map +1 -0
- package/dist/track-analytics.mjs +48 -0
- package/dist/track-analytics.mjs.map +1 -0
- package/dist/track-analytics.test.cjs +91 -0
- package/dist/track-analytics.test.cjs.map +1 -0
- package/dist/track-analytics.test.d.cts +1 -0
- package/dist/track-analytics.test.d.mts +1 -0
- package/dist/track-analytics.test.mjs +92 -0
- package/dist/track-analytics.test.mjs.map +1 -0
- package/dist/types.cjs +35 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +5 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +5 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +35 -0
- package/dist/types.mjs.map +1 -1
- package/dist/validator.test.cjs +1 -1
- package/dist/validator.test.mjs +1 -1
- package/dist/version-manager.cjs +1 -1
- package/dist/version-manager.cjs.map +1 -1
- package/dist/version-manager.mjs +1 -1
- package/dist/version-manager.mjs.map +1 -1
- package/dist/version-manager.test.cjs +7 -5
- package/dist/version-manager.test.cjs.map +1 -1
- package/dist/version-manager.test.mjs +7 -5
- package/dist/version-manager.test.mjs.map +1 -1
- package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → vi.2VT5v0um-C_jmO7m2.mjs} +5 -5
- package/dist/{vi.2VT5v0um-DvC3SVNc.mjs.map → vi.2VT5v0um-C_jmO7m2.mjs.map} +1 -1
- package/dist/{vi.2VT5v0um-CRqXre87.cjs → vi.2VT5v0um-iVBt6Fyq.cjs} +5 -5
- package/dist/{vi.2VT5v0um-CRqXre87.cjs.map → vi.2VT5v0um-iVBt6Fyq.cjs.map} +1 -1
- package/package.json +1 -1
- package/src/__snapshots__/composer.snapshot.test.ts.snap +285 -65
- package/src/bare-metal-partition.test.ts +4 -3
- package/src/composer.test.ts +4 -2
- package/src/composer.ts +45 -16
- package/src/generate.test.ts +2 -1
- package/src/generate.ts +11 -1
- package/src/generators/clone-repos.test.ts +154 -0
- package/src/generators/clone-repos.ts +159 -0
- package/src/generators/env.ts +214 -0
- package/src/generators/openclaw-json.ts +156 -1
- package/src/generators/postgres-init.ts +17 -0
- package/src/generators/readme.ts +2 -1
- package/src/generators/scripts.test.ts +52 -4
- package/src/generators/scripts.ts +351 -3
- package/src/generators/stack-manifest.ts +4 -2
- package/src/index.ts +8 -0
- package/src/presets/registry.ts +20 -0
- package/src/resolver.test.ts +53 -15
- package/src/resolver.ts +13 -1
- package/src/schema.ts +37 -4
- package/src/services/definitions/adguard-home.ts +79 -0
- package/src/services/definitions/apptension-saas.ts +84 -0
- package/src/services/definitions/audiobookshelf.ts +83 -0
- package/src/services/definitions/baserow.ts +118 -0
- package/src/services/definitions/boxyhq-saas.ts +84 -0
- package/src/services/definitions/calibre-web.ts +95 -0
- package/src/services/definitions/clickhouse.ts +115 -0
- package/src/services/definitions/cloudflared.ts +55 -0
- package/src/services/definitions/cmsaas-starter.ts +84 -0
- package/src/services/definitions/cockroachdb.ts +75 -0
- package/src/services/definitions/coder.ts +68 -0
- package/src/services/definitions/dragonfly.ts +68 -0
- package/src/services/definitions/drone-ci.ts +96 -0
- package/src/services/definitions/element-web.ts +62 -0
- package/src/services/definitions/focalboard.ts +69 -0
- package/src/services/definitions/forgejo.ts +109 -0
- package/src/services/definitions/graylog.ts +101 -0
- package/src/services/definitions/index.ts +159 -0
- package/src/services/definitions/influxdb.ts +109 -0
- package/src/services/definitions/invoke-ai.ts +76 -0
- package/src/services/definitions/ixartz-saas.ts +84 -0
- package/src/services/definitions/jaeger.ts +94 -0
- package/src/services/definitions/jan.ts +68 -0
- package/src/services/definitions/jitsi-meet.ts +108 -0
- package/src/services/definitions/local-ai.ts +90 -0
- package/src/services/definitions/metabase.ts +111 -0
- package/src/services/definitions/mission-control.ts +19 -2
- package/src/services/definitions/mosquitto.ts +84 -0
- package/src/services/definitions/navidrome.ts +95 -0
- package/src/services/definitions/nginx-proxy-manager.ts +70 -0
- package/src/services/definitions/node-red.ts +83 -0
- package/src/services/definitions/open-saas.ts +79 -0
- package/src/services/definitions/photoprism.ts +130 -0
- package/src/services/definitions/pihole.ts +79 -0
- package/src/services/definitions/piper-tts.ts +76 -0
- package/src/services/definitions/plane.ts +75 -0
- package/src/services/definitions/plausible.ts +97 -0
- package/src/services/definitions/pocket-id.ts +98 -0
- package/src/services/definitions/posthog.ts +97 -0
- package/src/services/definitions/redis.ts +1 -1
- package/src/services/definitions/revolt.ts +68 -0
- package/src/services/definitions/sentry.ts +104 -0
- package/src/services/definitions/sonarqube.ts +85 -0
- package/src/services/definitions/superset.ts +84 -0
- package/src/services/definitions/surrealdb.ts +77 -0
- package/src/services/definitions/tabby-ml.ts +76 -0
- package/src/services/definitions/tempo.ts +59 -0
- package/src/services/definitions/text-gen-webui.ts +92 -0
- package/src/services/definitions/timescaledb.ts +90 -0
- package/src/services/definitions/valkey.ts +1 -1
- package/src/services/definitions/vector-log.ts +61 -0
- package/src/services/definitions/vikunja.ts +96 -0
- package/src/services/definitions/wireguard.ts +89 -0
- package/src/services/definitions/woodpecker-ci.ts +97 -0
- package/src/services/definitions/zulip.ts +117 -0
- package/src/services/registry.test.ts +8 -0
- package/src/services/registry.ts +7 -0
- package/src/skills/manifest.json +64 -0
- package/src/skills/registry.ts +3 -3
- package/src/track-analytics.test.ts +82 -0
- package/src/track-analytics.ts +76 -0
- package/src/types.ts +40 -0
- package/src/version-manager.test.ts +10 -5
- package/src/version-manager.ts +1 -1
- package/dist/schema-C_hc7e4k.d.cts.map +0 -1
- package/dist/schema-CaesJaS2.d.mts.map +0 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { ServiceDefinition } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
export const vikunjaDefinition: ServiceDefinition = {
|
|
4
|
+
id: "vikunja",
|
|
5
|
+
name: "Vikunja",
|
|
6
|
+
description:
|
|
7
|
+
"Open-source task management and to-do list application with Kanban boards, calendars, and collaboration. Self-hosted Todoist alternative.",
|
|
8
|
+
category: "project-management",
|
|
9
|
+
icon: "✅",
|
|
10
|
+
|
|
11
|
+
image: "vikunja/vikunja",
|
|
12
|
+
imageTag: "0.24",
|
|
13
|
+
ports: [
|
|
14
|
+
{
|
|
15
|
+
host: 3460,
|
|
16
|
+
container: 3456,
|
|
17
|
+
description: "Vikunja API + frontend",
|
|
18
|
+
exposed: true,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
volumes: [
|
|
22
|
+
{
|
|
23
|
+
name: "vikunja-data",
|
|
24
|
+
containerPath: "/app/vikunja/files",
|
|
25
|
+
description: "Vikunja persistent file storage",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
environment: [
|
|
29
|
+
{
|
|
30
|
+
key: "VIKUNJA_DATABASE_TYPE",
|
|
31
|
+
defaultValue: "postgres",
|
|
32
|
+
secret: false,
|
|
33
|
+
description: "Database type for Vikunja persistence",
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
key: "VIKUNJA_DATABASE_HOST",
|
|
38
|
+
defaultValue: "postgresql",
|
|
39
|
+
secret: false,
|
|
40
|
+
description: "PostgreSQL hostname for Vikunja",
|
|
41
|
+
required: true,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "VIKUNJA_DATABASE_USER",
|
|
45
|
+
defaultValue: "vikunja",
|
|
46
|
+
secret: false,
|
|
47
|
+
description: "PostgreSQL user for Vikunja",
|
|
48
|
+
required: true,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
key: "VIKUNJA_DATABASE_PASSWORD",
|
|
52
|
+
defaultValue: "${VIKUNJA_DB_PASSWORD}",
|
|
53
|
+
secret: true,
|
|
54
|
+
description: "PostgreSQL password for Vikunja",
|
|
55
|
+
required: true,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: "VIKUNJA_DATABASE_DATABASE",
|
|
59
|
+
defaultValue: "vikunja",
|
|
60
|
+
secret: false,
|
|
61
|
+
description: "PostgreSQL database name for Vikunja",
|
|
62
|
+
required: true,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
key: "VIKUNJA_SERVICE_JWTSECRET",
|
|
66
|
+
defaultValue: "${VIKUNJA_JWT_SECRET}",
|
|
67
|
+
secret: true,
|
|
68
|
+
description: "JWT secret for Vikunja authentication tokens",
|
|
69
|
+
required: true,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
healthcheck: {
|
|
73
|
+
test: "wget -qO- http://localhost:3456/api/v1/info || exit 1",
|
|
74
|
+
interval: "30s",
|
|
75
|
+
timeout: "10s",
|
|
76
|
+
retries: 3,
|
|
77
|
+
startPeriod: "30s",
|
|
78
|
+
},
|
|
79
|
+
dependsOn: [],
|
|
80
|
+
restartPolicy: "unless-stopped",
|
|
81
|
+
networks: ["openclaw-network"],
|
|
82
|
+
|
|
83
|
+
skills: [],
|
|
84
|
+
openclawEnvVars: [],
|
|
85
|
+
|
|
86
|
+
docsUrl: "https://vikunja.io/docs/",
|
|
87
|
+
tags: ["tasks", "todo", "kanban", "calendar", "todoist-alternative"],
|
|
88
|
+
maturity: "stable",
|
|
89
|
+
|
|
90
|
+
requires: ["postgresql"],
|
|
91
|
+
recommends: [],
|
|
92
|
+
conflictsWith: [],
|
|
93
|
+
|
|
94
|
+
minMemoryMB: 128,
|
|
95
|
+
gpuRequired: false,
|
|
96
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ServiceDefinition } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
export const wireguardDefinition: ServiceDefinition = {
|
|
4
|
+
id: "wireguard",
|
|
5
|
+
name: "WireGuard",
|
|
6
|
+
description:
|
|
7
|
+
"Modern, high-performance VPN tunnel with simple configuration, strong encryption, and minimal attack surface.",
|
|
8
|
+
category: "dns-networking",
|
|
9
|
+
icon: "🔐",
|
|
10
|
+
|
|
11
|
+
image: "linuxserver/wireguard",
|
|
12
|
+
imageTag: "latest",
|
|
13
|
+
ports: [
|
|
14
|
+
{
|
|
15
|
+
host: 51820,
|
|
16
|
+
container: 51820,
|
|
17
|
+
description: "WireGuard VPN",
|
|
18
|
+
exposed: true,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
volumes: [
|
|
22
|
+
{
|
|
23
|
+
name: "wireguard-config",
|
|
24
|
+
containerPath: "/config",
|
|
25
|
+
description: "WireGuard configuration and keys",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
environment: [
|
|
29
|
+
{
|
|
30
|
+
key: "PUID",
|
|
31
|
+
defaultValue: "1000",
|
|
32
|
+
secret: false,
|
|
33
|
+
description: "User ID",
|
|
34
|
+
required: false,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
key: "PGID",
|
|
38
|
+
defaultValue: "1000",
|
|
39
|
+
secret: false,
|
|
40
|
+
description: "Group ID",
|
|
41
|
+
required: false,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "TZ",
|
|
45
|
+
defaultValue: "UTC",
|
|
46
|
+
secret: false,
|
|
47
|
+
description: "Timezone",
|
|
48
|
+
required: false,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
key: "SERVERURL",
|
|
52
|
+
defaultValue: "auto",
|
|
53
|
+
secret: false,
|
|
54
|
+
description: "Server URL or auto-detect",
|
|
55
|
+
required: true,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: "PEERS",
|
|
59
|
+
defaultValue: "3",
|
|
60
|
+
secret: false,
|
|
61
|
+
description: "Number of VPN peers to generate",
|
|
62
|
+
required: false,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
healthcheck: {
|
|
66
|
+
test: "wg show || exit 1",
|
|
67
|
+
interval: "30s",
|
|
68
|
+
timeout: "10s",
|
|
69
|
+
retries: 3,
|
|
70
|
+
startPeriod: "15s",
|
|
71
|
+
},
|
|
72
|
+
dependsOn: [],
|
|
73
|
+
restartPolicy: "unless-stopped",
|
|
74
|
+
networks: ["openclaw-network"],
|
|
75
|
+
|
|
76
|
+
skills: [],
|
|
77
|
+
openclawEnvVars: [],
|
|
78
|
+
|
|
79
|
+
docsUrl: "https://www.wireguard.com/quickstart/",
|
|
80
|
+
tags: ["vpn", "tunnel", "encryption", "networking"],
|
|
81
|
+
maturity: "stable",
|
|
82
|
+
|
|
83
|
+
requires: [],
|
|
84
|
+
recommends: [],
|
|
85
|
+
conflictsWith: [],
|
|
86
|
+
|
|
87
|
+
minMemoryMB: 64,
|
|
88
|
+
gpuRequired: false,
|
|
89
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { ServiceDefinition } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
export const woodpeckerCiDefinition: ServiceDefinition = {
|
|
4
|
+
id: "woodpecker-ci",
|
|
5
|
+
name: "Woodpecker CI",
|
|
6
|
+
description:
|
|
7
|
+
"Lightweight container-native CI/CD engine with YAML pipelines, multi-platform builds, and Gitea/GitHub/GitLab integration.",
|
|
8
|
+
category: "dev-tools",
|
|
9
|
+
icon: "🐦",
|
|
10
|
+
|
|
11
|
+
image: "woodpeckerci/woodpecker-server",
|
|
12
|
+
imageTag: "latest",
|
|
13
|
+
ports: [
|
|
14
|
+
{
|
|
15
|
+
host: 8320,
|
|
16
|
+
container: 8000,
|
|
17
|
+
description: "Woodpecker web UI",
|
|
18
|
+
exposed: true,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
volumes: [
|
|
22
|
+
{
|
|
23
|
+
name: "woodpecker-data",
|
|
24
|
+
containerPath: "/var/lib/woodpecker",
|
|
25
|
+
description: "Woodpecker server data",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
environment: [
|
|
29
|
+
{
|
|
30
|
+
key: "WOODPECKER_HOST",
|
|
31
|
+
defaultValue: "http://localhost:8320",
|
|
32
|
+
secret: false,
|
|
33
|
+
description: "Woodpecker server URL",
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
key: "WOODPECKER_AGENT_SECRET",
|
|
38
|
+
defaultValue: "",
|
|
39
|
+
secret: true,
|
|
40
|
+
description: "Shared secret for agent auth",
|
|
41
|
+
required: true,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "WOODPECKER_GITEA",
|
|
45
|
+
defaultValue: "true",
|
|
46
|
+
secret: false,
|
|
47
|
+
description: "Enable Gitea integration",
|
|
48
|
+
required: false,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
key: "WOODPECKER_GITEA_URL",
|
|
52
|
+
defaultValue: "http://gitea:3000",
|
|
53
|
+
secret: false,
|
|
54
|
+
description: "Gitea server URL",
|
|
55
|
+
required: false,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
healthcheck: {
|
|
59
|
+
test: "wget -qO- http://localhost:8000/healthz || exit 1",
|
|
60
|
+
interval: "30s",
|
|
61
|
+
timeout: "10s",
|
|
62
|
+
retries: 3,
|
|
63
|
+
startPeriod: "15s",
|
|
64
|
+
},
|
|
65
|
+
dependsOn: [],
|
|
66
|
+
restartPolicy: "unless-stopped",
|
|
67
|
+
networks: ["openclaw-network"],
|
|
68
|
+
|
|
69
|
+
skills: [],
|
|
70
|
+
openclawEnvVars: [
|
|
71
|
+
{
|
|
72
|
+
key: "WOODPECKER_HOST",
|
|
73
|
+
defaultValue: "woodpecker-ci",
|
|
74
|
+
secret: false,
|
|
75
|
+
description: "Woodpecker hostname",
|
|
76
|
+
required: false,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
key: "WOODPECKER_PORT",
|
|
80
|
+
defaultValue: "8000",
|
|
81
|
+
secret: false,
|
|
82
|
+
description: "Woodpecker port",
|
|
83
|
+
required: false,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
|
|
87
|
+
docsUrl: "https://woodpecker-ci.org/docs/intro",
|
|
88
|
+
tags: ["ci-cd", "pipelines", "container-native", "drone-compatible"],
|
|
89
|
+
maturity: "stable",
|
|
90
|
+
|
|
91
|
+
requires: [],
|
|
92
|
+
recommends: ["gitea", "forgejo"],
|
|
93
|
+
conflictsWith: [],
|
|
94
|
+
|
|
95
|
+
minMemoryMB: 256,
|
|
96
|
+
gpuRequired: false,
|
|
97
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { ServiceDefinition } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
export const zulipDefinition: ServiceDefinition = {
|
|
4
|
+
id: "zulip",
|
|
5
|
+
name: "Zulip",
|
|
6
|
+
description:
|
|
7
|
+
"Threaded team chat combining the immediacy of real-time chat with email's topic-based threading for async collaboration.",
|
|
8
|
+
category: "communication",
|
|
9
|
+
icon: "💬",
|
|
10
|
+
|
|
11
|
+
image: "zulip/docker-zulip",
|
|
12
|
+
imageTag: "9.4-0",
|
|
13
|
+
ports: [
|
|
14
|
+
{
|
|
15
|
+
host: 8380,
|
|
16
|
+
container: 443,
|
|
17
|
+
description: "Zulip HTTPS",
|
|
18
|
+
exposed: true,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
volumes: [
|
|
22
|
+
{
|
|
23
|
+
name: "zulip-data",
|
|
24
|
+
containerPath: "/data",
|
|
25
|
+
description: "Zulip persistent data and uploads",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
environment: [
|
|
29
|
+
{
|
|
30
|
+
key: "SETTING_EXTERNAL_HOST",
|
|
31
|
+
defaultValue: "localhost",
|
|
32
|
+
secret: false,
|
|
33
|
+
description: "External hostname for Zulip",
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
key: "SETTING_ZULIP_ADMINISTRATOR",
|
|
38
|
+
defaultValue: "admin@example.com",
|
|
39
|
+
secret: false,
|
|
40
|
+
description: "Email address of the Zulip administrator",
|
|
41
|
+
required: true,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "SECRETS_secret_key",
|
|
45
|
+
defaultValue: "${ZULIP_SECRET_KEY}",
|
|
46
|
+
secret: true,
|
|
47
|
+
description: "Secret key for Zulip session signing and encryption",
|
|
48
|
+
required: true,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
key: "SECRETS_email_password",
|
|
52
|
+
defaultValue: "",
|
|
53
|
+
secret: true,
|
|
54
|
+
description: "Email password for Zulip outbound email",
|
|
55
|
+
required: false,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: "DISABLE_HTTPS",
|
|
59
|
+
defaultValue: "true",
|
|
60
|
+
secret: false,
|
|
61
|
+
description: "Disable HTTPS when running behind a reverse proxy",
|
|
62
|
+
required: false,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
key: "DB_HOST",
|
|
66
|
+
defaultValue: "postgresql",
|
|
67
|
+
secret: false,
|
|
68
|
+
description: "PostgreSQL hostname for Zulip",
|
|
69
|
+
required: true,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
key: "DB_USER",
|
|
73
|
+
defaultValue: "zulip",
|
|
74
|
+
secret: false,
|
|
75
|
+
description: "PostgreSQL user for Zulip",
|
|
76
|
+
required: true,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
key: "DB_NAME",
|
|
80
|
+
defaultValue: "zulip",
|
|
81
|
+
secret: false,
|
|
82
|
+
description: "PostgreSQL database name for Zulip",
|
|
83
|
+
required: true,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
key: "SETTING_MEMCACHED_LOCATION",
|
|
87
|
+
defaultValue: "redis:11211",
|
|
88
|
+
secret: false,
|
|
89
|
+
description: "Memcached-compatible cache location (Redis)",
|
|
90
|
+
required: true,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
healthcheck: {
|
|
94
|
+
test: "curl -sf http://localhost:80 || exit 1",
|
|
95
|
+
interval: "30s",
|
|
96
|
+
timeout: "10s",
|
|
97
|
+
retries: 5,
|
|
98
|
+
startPeriod: "120s",
|
|
99
|
+
},
|
|
100
|
+
dependsOn: [],
|
|
101
|
+
restartPolicy: "unless-stopped",
|
|
102
|
+
networks: ["openclaw-network"],
|
|
103
|
+
|
|
104
|
+
skills: [],
|
|
105
|
+
openclawEnvVars: [],
|
|
106
|
+
|
|
107
|
+
docsUrl: "https://zulip.readthedocs.io/en/latest/production/install.html",
|
|
108
|
+
tags: ["team-chat", "threaded", "async", "slack-alternative"],
|
|
109
|
+
maturity: "stable",
|
|
110
|
+
|
|
111
|
+
requires: ["postgresql", "redis"],
|
|
112
|
+
recommends: [],
|
|
113
|
+
conflictsWith: [],
|
|
114
|
+
|
|
115
|
+
minMemoryMB: 1024,
|
|
116
|
+
gpuRequired: false,
|
|
117
|
+
};
|
|
@@ -31,6 +31,14 @@ describe("service registry", () => {
|
|
|
31
31
|
expect(tailscale!.mandatory).toBe(true);
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
+
it("finds mission-control and it is mandatory with gitSource", () => {
|
|
35
|
+
const mc = getServiceById("mission-control");
|
|
36
|
+
expect(mc).toBeDefined();
|
|
37
|
+
expect(mc!.mandatory).toBe(true);
|
|
38
|
+
expect(mc!.gitSource).toBeDefined();
|
|
39
|
+
expect(mc!.gitSource!.repoUrl).toContain("better-openclaw-mission-control");
|
|
40
|
+
});
|
|
41
|
+
|
|
34
42
|
it("finds coolify, dokploy, livekit, and La Suite Meet services by ID", () => {
|
|
35
43
|
expect(getServiceById("coolify")).toBeDefined();
|
|
36
44
|
expect(getServiceById("dokploy")).toBeDefined();
|
package/src/services/registry.ts
CHANGED
|
@@ -10,6 +10,13 @@ for (const def of allServiceDefinitions) {
|
|
|
10
10
|
`Duplicate service definition ID: "${def.id}". Each service must have a unique ID.`,
|
|
11
11
|
);
|
|
12
12
|
}
|
|
13
|
+
const hasImage = def.image && def.imageTag;
|
|
14
|
+
const hasGitSource = def.gitSource && def.buildContext;
|
|
15
|
+
if (!hasImage && !hasGitSource) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
`Service "${def.id}" must specify either image+imageTag or gitSource+buildContext.`,
|
|
18
|
+
);
|
|
19
|
+
}
|
|
13
20
|
registryMap.set(def.id, def);
|
|
14
21
|
}
|
|
15
22
|
|
package/src/skills/manifest.json
CHANGED
|
@@ -1445,6 +1445,70 @@
|
|
|
1445
1445
|
"services": [
|
|
1446
1446
|
"headscale"
|
|
1447
1447
|
]
|
|
1448
|
+
},
|
|
1449
|
+
{
|
|
1450
|
+
"id": "langfuse-trace",
|
|
1451
|
+
"path": "langfuse-trace/SKILL.md",
|
|
1452
|
+
"emoji": "📊",
|
|
1453
|
+
"services": [
|
|
1454
|
+
"langfuse"
|
|
1455
|
+
]
|
|
1456
|
+
},
|
|
1457
|
+
{
|
|
1458
|
+
"id": "twenty-crm",
|
|
1459
|
+
"path": "twenty-crm/SKILL.md",
|
|
1460
|
+
"emoji": "📇",
|
|
1461
|
+
"services": [
|
|
1462
|
+
"twenty"
|
|
1463
|
+
]
|
|
1464
|
+
},
|
|
1465
|
+
{
|
|
1466
|
+
"id": "mautic-campaign",
|
|
1467
|
+
"path": "mautic-campaign/SKILL.md",
|
|
1468
|
+
"emoji": "📬",
|
|
1469
|
+
"services": [
|
|
1470
|
+
"mautic"
|
|
1471
|
+
]
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
"id": "airflow-dag",
|
|
1475
|
+
"path": "airflow-dag/SKILL.md",
|
|
1476
|
+
"emoji": "🌪️",
|
|
1477
|
+
"services": [
|
|
1478
|
+
"airflow"
|
|
1479
|
+
]
|
|
1480
|
+
},
|
|
1481
|
+
{
|
|
1482
|
+
"id": "airbyte-sync",
|
|
1483
|
+
"path": "airbyte-sync/SKILL.md",
|
|
1484
|
+
"emoji": "🔗",
|
|
1485
|
+
"services": [
|
|
1486
|
+
"airbyte"
|
|
1487
|
+
]
|
|
1488
|
+
},
|
|
1489
|
+
{
|
|
1490
|
+
"id": "fonoster-voice",
|
|
1491
|
+
"path": "fonoster-voice/SKILL.md",
|
|
1492
|
+
"emoji": "📞",
|
|
1493
|
+
"services": [
|
|
1494
|
+
"fonoster"
|
|
1495
|
+
]
|
|
1496
|
+
},
|
|
1497
|
+
{
|
|
1498
|
+
"id": "medusa-commerce",
|
|
1499
|
+
"path": "medusa-commerce/SKILL.md",
|
|
1500
|
+
"emoji": "🛒",
|
|
1501
|
+
"services": [
|
|
1502
|
+
"medusa"
|
|
1503
|
+
]
|
|
1504
|
+
},
|
|
1505
|
+
{
|
|
1506
|
+
"id": "axolotl-finetune",
|
|
1507
|
+
"path": "axolotl-finetune/SKILL.md",
|
|
1508
|
+
"emoji": "🦎",
|
|
1509
|
+
"services": [
|
|
1510
|
+
"axolotl"
|
|
1511
|
+
]
|
|
1448
1512
|
}
|
|
1449
1513
|
]
|
|
1450
1514
|
}
|
package/src/skills/registry.ts
CHANGED
|
@@ -473,7 +473,7 @@ const skillPacks: SkillPack[] = [
|
|
|
473
473
|
description:
|
|
474
474
|
"AI-powered helpdesk with live chat, LLM observability, and ticket management across channels",
|
|
475
475
|
requiredServices: ["chatwoot", "langfuse", "postgresql", "redis"],
|
|
476
|
-
skills: ["chatwoot-
|
|
476
|
+
skills: ["chatwoot-support", "langfuse-trace", "postgresql-query", "redis-cache"],
|
|
477
477
|
icon: "💬",
|
|
478
478
|
tags: ["support", "chat", "helpdesk", "tickets", "customer-service"],
|
|
479
479
|
},
|
|
@@ -483,7 +483,7 @@ const skillPacks: SkillPack[] = [
|
|
|
483
483
|
description:
|
|
484
484
|
"CRM-driven sales pipeline with email marketing, newsletter management, and lead nurturing",
|
|
485
485
|
requiredServices: ["twenty", "mautic", "listmonk", "postgresql"],
|
|
486
|
-
skills: ["twenty-crm", "mautic-campaign", "listmonk-
|
|
486
|
+
skills: ["twenty-crm", "mautic-campaign", "listmonk-email", "postgresql-query"],
|
|
487
487
|
icon: "📈",
|
|
488
488
|
tags: ["sales", "crm", "email", "leads", "marketing"],
|
|
489
489
|
},
|
|
@@ -543,7 +543,7 @@ const skillPacks: SkillPack[] = [
|
|
|
543
543
|
description:
|
|
544
544
|
"Full marketing stack with blogging, email automation, newsletter management, and web analytics",
|
|
545
545
|
requiredServices: ["ghost", "mautic", "listmonk", "umami"],
|
|
546
|
-
skills: ["ghost-publish", "mautic-campaign", "listmonk-
|
|
546
|
+
skills: ["ghost-publish", "mautic-campaign", "listmonk-email", "umami-analytics"],
|
|
547
547
|
icon: "📣",
|
|
548
548
|
tags: ["marketing", "blog", "email", "analytics", "content"],
|
|
549
549
|
},
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { buildAnalyticsPayload } from "./track-analytics.js";
|
|
3
|
+
import type { GenerationInput, GenerationMetadata } from "./types.js";
|
|
4
|
+
|
|
5
|
+
const baseInput: GenerationInput = {
|
|
6
|
+
projectName: "test-stack",
|
|
7
|
+
services: ["postgresql", "redis", "n8n"],
|
|
8
|
+
skillPacks: ["research-agent"],
|
|
9
|
+
aiProviders: ["openai"],
|
|
10
|
+
gsdRuntimes: [],
|
|
11
|
+
proxy: "caddy",
|
|
12
|
+
domain: "example.com",
|
|
13
|
+
gpu: false,
|
|
14
|
+
platform: "linux/amd64",
|
|
15
|
+
deployment: "local",
|
|
16
|
+
deploymentType: "docker",
|
|
17
|
+
generateSecrets: true,
|
|
18
|
+
openclawVersion: "latest",
|
|
19
|
+
monitoring: true,
|
|
20
|
+
openclawImage: "official",
|
|
21
|
+
openclawInstallMethod: "docker",
|
|
22
|
+
hardened: true,
|
|
23
|
+
deployTarget: "local",
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const baseMetadata: GenerationMetadata = {
|
|
27
|
+
serviceCount: 5,
|
|
28
|
+
skillCount: 1,
|
|
29
|
+
estimatedMemoryMB: 2048,
|
|
30
|
+
resolvedServices: ["postgresql", "redis", "n8n", "caddy", "searxng"],
|
|
31
|
+
generatedAt: "2026-03-09T00:00:00.000Z",
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
describe("buildAnalyticsPayload", () => {
|
|
35
|
+
it("builds payload for a preset-based CLI generation", () => {
|
|
36
|
+
const payload = buildAnalyticsPayload(baseInput, baseMetadata, "cli", "researcher");
|
|
37
|
+
|
|
38
|
+
expect(payload.source).toBe("cli");
|
|
39
|
+
expect(payload.buildMethod).toBe("preset");
|
|
40
|
+
expect(payload.presetId).toBe("researcher");
|
|
41
|
+
expect(payload.services).toEqual(["postgresql", "redis", "n8n"]);
|
|
42
|
+
expect(payload.skillPacks).toEqual(["research-agent"]);
|
|
43
|
+
expect(payload.serviceCount).toBe(5);
|
|
44
|
+
expect(payload.proxy).toBe("caddy");
|
|
45
|
+
expect(payload.deployment).toBe("local");
|
|
46
|
+
expect(payload.deploymentType).toBe("docker");
|
|
47
|
+
expect(payload.platform).toBe("linux/amd64");
|
|
48
|
+
expect(payload.gpu).toBe(false);
|
|
49
|
+
expect(payload.monitoring).toBe(true);
|
|
50
|
+
expect(payload.hasDomain).toBe(true);
|
|
51
|
+
expect(payload.openclawImage).toBe("official");
|
|
52
|
+
expect(payload.estimatedMemoryMB).toBe(2048);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("sets buildMethod to custom when no presetId", () => {
|
|
56
|
+
const payload = buildAnalyticsPayload(baseInput, baseMetadata, "web");
|
|
57
|
+
|
|
58
|
+
expect(payload.buildMethod).toBe("custom");
|
|
59
|
+
expect(payload.presetId).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("sets buildMethod to custom when presetId is null", () => {
|
|
63
|
+
const payload = buildAnalyticsPayload(baseInput, baseMetadata, "api", null);
|
|
64
|
+
|
|
65
|
+
expect(payload.buildMethod).toBe("custom");
|
|
66
|
+
expect(payload.presetId).toBeNull();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("sets hasDomain to false when no domain in input", () => {
|
|
70
|
+
const noDomainInput = { ...baseInput, domain: undefined };
|
|
71
|
+
const payload = buildAnalyticsPayload(noDomainInput, baseMetadata, "mcp");
|
|
72
|
+
|
|
73
|
+
expect(payload.hasDomain).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("preserves all source types", () => {
|
|
77
|
+
for (const source of ["cli", "web", "api", "mcp"] as const) {
|
|
78
|
+
const payload = buildAnalyticsPayload(baseInput, baseMetadata, source);
|
|
79
|
+
expect(payload.source).toBe(source);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { GenerationInput, GenerationMetadata } from "./types.js";
|
|
2
|
+
|
|
3
|
+
export interface AnalyticsPayload {
|
|
4
|
+
source: "cli" | "web" | "api" | "mcp";
|
|
5
|
+
buildMethod: "preset" | "custom";
|
|
6
|
+
presetId: string | null;
|
|
7
|
+
services: string[];
|
|
8
|
+
skillPacks: string[];
|
|
9
|
+
serviceCount: number;
|
|
10
|
+
proxy: string;
|
|
11
|
+
deployment: string;
|
|
12
|
+
deploymentType: string;
|
|
13
|
+
platform: string;
|
|
14
|
+
gpu: boolean;
|
|
15
|
+
monitoring: boolean;
|
|
16
|
+
hasDomain: boolean;
|
|
17
|
+
openclawImage: string;
|
|
18
|
+
estimatedMemoryMB: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Build an analytics payload from generation input and metadata.
|
|
23
|
+
* Pure function — does not send anything.
|
|
24
|
+
*/
|
|
25
|
+
export function buildAnalyticsPayload(
|
|
26
|
+
input: GenerationInput,
|
|
27
|
+
metadata: GenerationMetadata,
|
|
28
|
+
source: AnalyticsPayload["source"],
|
|
29
|
+
presetId?: string | null,
|
|
30
|
+
): AnalyticsPayload {
|
|
31
|
+
return {
|
|
32
|
+
source,
|
|
33
|
+
buildMethod: presetId ? "preset" : "custom",
|
|
34
|
+
presetId: presetId ?? null,
|
|
35
|
+
services: input.services,
|
|
36
|
+
skillPacks: input.skillPacks,
|
|
37
|
+
serviceCount: metadata.serviceCount,
|
|
38
|
+
proxy: input.proxy,
|
|
39
|
+
deployment: input.deployment,
|
|
40
|
+
deploymentType: input.deploymentType,
|
|
41
|
+
platform: input.platform,
|
|
42
|
+
gpu: input.gpu,
|
|
43
|
+
monitoring: input.monitoring,
|
|
44
|
+
hasDomain: Boolean(input.domain),
|
|
45
|
+
openclawImage: input.openclawImage,
|
|
46
|
+
estimatedMemoryMB: metadata.estimatedMemoryMB,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const DEFAULT_API_URL = "https://better-openclaw.dev/api/v1/analytics/event";
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Fire-and-forget POST to the analytics endpoint.
|
|
54
|
+
* Respects DISABLE_ANALYTICS=true env var.
|
|
55
|
+
* Silently catches all errors — tracking must never crash the main flow.
|
|
56
|
+
*/
|
|
57
|
+
export async function trackAnalytics(
|
|
58
|
+
payload: AnalyticsPayload,
|
|
59
|
+
apiUrl: string = DEFAULT_API_URL,
|
|
60
|
+
): Promise<void> {
|
|
61
|
+
if (process.env.DISABLE_ANALYTICS === "true") return;
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const controller = new AbortController();
|
|
65
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
66
|
+
await fetch(apiUrl, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: { "Content-Type": "application/json" },
|
|
69
|
+
body: JSON.stringify(payload),
|
|
70
|
+
signal: controller.signal,
|
|
71
|
+
});
|
|
72
|
+
clearTimeout(timeout);
|
|
73
|
+
} catch {
|
|
74
|
+
// Silent — tracking must never block or crash generation
|
|
75
|
+
}
|
|
76
|
+
}
|