@better-openclaw/core 1.0.24 → 1.0.26
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/addon-stack.cjs +725 -0
- package/dist/addon-stack.cjs.map +1 -0
- package/dist/addon-stack.d.cts +23 -0
- package/dist/addon-stack.d.cts.map +1 -0
- package/dist/addon-stack.d.mts +23 -0
- package/dist/addon-stack.d.mts.map +1 -0
- package/dist/addon-stack.mjs +723 -0
- package/dist/addon-stack.mjs.map +1 -0
- package/dist/addon-stack.test.cjs +461 -0
- package/dist/addon-stack.test.cjs.map +1 -0
- package/dist/addon-stack.test.d.cts +1 -0
- package/dist/addon-stack.test.d.mts +1 -0
- package/dist/addon-stack.test.mjs +461 -0
- package/dist/addon-stack.test.mjs.map +1 -0
- package/dist/bare-metal-partition.test.cjs +20 -20
- package/dist/bare-metal-partition.test.cjs.map +1 -1
- package/dist/bare-metal-partition.test.mjs +2 -2
- package/dist/compose-validation.test.cjs +1 -1
- package/dist/composer.cjs +5 -1
- package/dist/composer.cjs.map +1 -1
- package/dist/composer.d.cts +24 -1
- package/dist/composer.d.cts.map +1 -1
- package/dist/composer.d.mts +24 -1
- package/dist/composer.d.mts.map +1 -1
- package/dist/composer.mjs +1 -1
- package/dist/composer.mjs.map +1 -1
- package/dist/composer.snapshot.test.cjs +20 -20
- package/dist/composer.snapshot.test.cjs.map +1 -1
- package/dist/composer.snapshot.test.mjs +2 -2
- package/dist/composer.test.cjs +54 -54
- package/dist/composer.test.cjs.map +1 -1
- package/dist/composer.test.mjs +2 -2
- package/dist/deployers/strip-host-ports.cjs +1 -1
- package/dist/deployers/strip-host-ports.test.cjs +26 -26
- package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.mjs +1 -1
- package/dist/generate.cjs +3 -3
- package/dist/generate.mjs +3 -3
- package/dist/generate.test.cjs +56 -56
- package/dist/generate.test.cjs.map +1 -1
- package/dist/generate.test.mjs +1 -1
- package/dist/generators/bare-metal-install.test.cjs +18 -18
- package/dist/generators/bare-metal-install.test.cjs.map +1 -1
- package/dist/generators/bare-metal-install.test.mjs +1 -1
- package/dist/generators/caddy.test.cjs +13 -13
- package/dist/generators/caddy.test.cjs.map +1 -1
- package/dist/generators/caddy.test.mjs +1 -1
- package/dist/generators/clone-repos.test.cjs +27 -27
- package/dist/generators/clone-repos.test.cjs.map +1 -1
- package/dist/generators/clone-repos.test.mjs +1 -1
- package/dist/generators/env.cjs +1 -1
- package/dist/generators/env.test.cjs +17 -17
- package/dist/generators/env.test.cjs.map +1 -1
- package/dist/generators/env.test.mjs +1 -1
- package/dist/generators/health-check.test.cjs +39 -39
- package/dist/generators/health-check.test.cjs.map +1 -1
- package/dist/generators/health-check.test.mjs +1 -1
- package/dist/generators/postgres-init.cjs +5 -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 +5 -0
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/scripts.test.cjs +39 -39
- package/dist/generators/scripts.test.cjs.map +1 -1
- package/dist/generators/scripts.test.mjs +1 -1
- package/dist/generators/skills.cjs +1 -1
- package/dist/generators/skills.d.cts.map +1 -1
- package/dist/generators/skills.d.mts.map +1 -1
- package/dist/generators/skills.mjs +141 -0
- package/dist/generators/skills.mjs.map +1 -1
- package/dist/generators/traefik.test.cjs +32 -32
- package/dist/generators/traefik.test.cjs.map +1 -1
- package/dist/generators/traefik.test.mjs +1 -1
- package/dist/index.cjs +21 -5
- package/dist/index.d.cts +5 -4
- package/dist/index.d.mts +5 -4
- package/dist/index.mjs +7 -6
- package/dist/migrations.test.cjs +16 -16
- package/dist/migrations.test.cjs.map +1 -1
- package/dist/migrations.test.mjs +1 -1
- package/dist/presets/presets.test.cjs +1 -1
- package/dist/presets/registry.test.cjs +14 -14
- package/dist/presets/registry.test.cjs.map +1 -1
- package/dist/presets/registry.test.mjs +1 -1
- package/dist/resolver.test.cjs +95 -95
- package/dist/resolver.test.cjs.map +1 -1
- package/dist/resolver.test.mjs +1 -1
- package/dist/{schema-eX44HhRp.d.mts → schema-BQnZrcw8.d.cts} +300 -2
- package/dist/schema-BQnZrcw8.d.cts.map +1 -0
- package/dist/{schema-tn5RK8CM.d.cts → schema-SBpL0bdI.d.mts} +300 -2
- package/dist/schema-SBpL0bdI.d.mts.map +1 -0
- package/dist/schema.cjs +148 -2
- 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 +139 -2
- package/dist/schema.mjs.map +1 -1
- package/dist/schema.test.cjs +86 -86
- package/dist/schema.test.cjs.map +1 -1
- package/dist/schema.test.mjs +1 -1
- package/dist/services/definitions/browserless.cjs +4 -1
- package/dist/services/definitions/browserless.cjs.map +1 -1
- package/dist/services/definitions/browserless.mjs +4 -1
- package/dist/services/definitions/browserless.mjs.map +1 -1
- package/dist/services/definitions/burnlink.cjs +142 -0
- package/dist/services/definitions/burnlink.cjs.map +1 -0
- package/dist/services/definitions/burnlink.d.cts +7 -0
- package/dist/services/definitions/burnlink.d.cts.map +1 -0
- package/dist/services/definitions/burnlink.d.mts +7 -0
- package/dist/services/definitions/burnlink.d.mts.map +1 -0
- package/dist/services/definitions/burnlink.mjs +141 -0
- package/dist/services/definitions/burnlink.mjs.map +1 -0
- package/dist/services/definitions/convex.cjs +43 -1
- package/dist/services/definitions/convex.cjs.map +1 -1
- package/dist/services/definitions/convex.mjs +43 -1
- package/dist/services/definitions/convex.mjs.map +1 -1
- package/dist/services/definitions/grafana.cjs +11 -1
- package/dist/services/definitions/grafana.cjs.map +1 -1
- package/dist/services/definitions/grafana.mjs +11 -1
- package/dist/services/definitions/grafana.mjs.map +1 -1
- package/dist/services/definitions/hindsight.cjs +130 -0
- package/dist/services/definitions/hindsight.cjs.map +1 -0
- package/dist/services/definitions/hindsight.d.cts +7 -0
- package/dist/services/definitions/hindsight.d.cts.map +1 -0
- package/dist/services/definitions/hindsight.d.mts +7 -0
- package/dist/services/definitions/hindsight.d.mts.map +1 -0
- package/dist/services/definitions/hindsight.mjs +129 -0
- package/dist/services/definitions/hindsight.mjs.map +1 -0
- package/dist/services/definitions/index.cjs +9 -0
- package/dist/services/definitions/index.cjs.map +1 -1
- package/dist/services/definitions/index.d.cts +4 -1
- package/dist/services/definitions/index.d.cts.map +1 -1
- package/dist/services/definitions/index.d.mts +4 -1
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +7 -1
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/meilisearch.cjs +11 -1
- package/dist/services/definitions/meilisearch.cjs.map +1 -1
- package/dist/services/definitions/meilisearch.mjs +11 -1
- package/dist/services/definitions/meilisearch.mjs.map +1 -1
- package/dist/services/definitions/minio.cjs +3 -1
- package/dist/services/definitions/minio.cjs.map +1 -1
- package/dist/services/definitions/minio.mjs +3 -1
- package/dist/services/definitions/minio.mjs.map +1 -1
- package/dist/services/definitions/n8n.cjs +11 -1
- package/dist/services/definitions/n8n.cjs.map +1 -1
- package/dist/services/definitions/n8n.mjs +11 -1
- package/dist/services/definitions/n8n.mjs.map +1 -1
- package/dist/services/definitions/ollama.cjs +3 -1
- package/dist/services/definitions/ollama.cjs.map +1 -1
- package/dist/services/definitions/ollama.mjs +3 -1
- package/dist/services/definitions/ollama.mjs.map +1 -1
- package/dist/services/definitions/opensandbox.cjs +149 -0
- package/dist/services/definitions/opensandbox.cjs.map +1 -0
- package/dist/services/definitions/opensandbox.d.cts +7 -0
- package/dist/services/definitions/opensandbox.d.cts.map +1 -0
- package/dist/services/definitions/opensandbox.d.mts +7 -0
- package/dist/services/definitions/opensandbox.d.mts.map +1 -0
- package/dist/services/definitions/opensandbox.mjs +148 -0
- package/dist/services/definitions/opensandbox.mjs.map +1 -0
- package/dist/services/definitions/qdrant.cjs +3 -1
- package/dist/services/definitions/qdrant.cjs.map +1 -1
- package/dist/services/definitions/qdrant.mjs +3 -1
- package/dist/services/definitions/qdrant.mjs.map +1 -1
- package/dist/services/definitions/searxng.cjs +8 -1
- package/dist/services/definitions/searxng.cjs.map +1 -1
- package/dist/services/definitions/searxng.mjs +8 -1
- package/dist/services/definitions/searxng.mjs.map +1 -1
- package/dist/services/definitions/uptime-kuma.cjs +8 -1
- package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
- package/dist/services/definitions/uptime-kuma.mjs +8 -1
- package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
- package/dist/services/registry.test.cjs +36 -36
- package/dist/services/registry.test.cjs.map +1 -1
- package/dist/services/registry.test.mjs +1 -1
- package/dist/{skills-BlzpHmpH.cjs → skills-BSF7iNa4.cjs} +142 -1
- package/dist/{skills-BlzpHmpH.cjs.map → skills-BSF7iNa4.cjs.map} +1 -1
- package/dist/{vi.2VT5v0um-C_jmO7m2.mjs → test.CTcmp4Su-ClCHJ3FA.mjs} +6793 -6403
- package/dist/test.CTcmp4Su-ClCHJ3FA.mjs.map +1 -0
- package/dist/{vi.2VT5v0um-iVBt6Fyq.cjs → test.CTcmp4Su-DlzTarwH.cjs} +6793 -6403
- package/dist/test.CTcmp4Su-DlzTarwH.cjs.map +1 -0
- package/dist/track-analytics.test.cjs +28 -28
- package/dist/track-analytics.test.cjs.map +1 -1
- package/dist/track-analytics.test.mjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +10 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +10 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/validator.cjs +1 -1
- package/dist/validator.test.cjs +15 -15
- package/dist/validator.test.cjs.map +1 -1
- package/dist/validator.test.mjs +2 -2
- package/dist/version-manager.test.cjs +37 -37
- package/dist/version-manager.test.cjs.map +1 -1
- package/dist/version-manager.test.mjs +1 -1
- package/package.json +4 -4
- package/src/__snapshots__/composer.snapshot.test.ts.snap +5 -0
- package/src/addon-stack.test.ts +648 -0
- package/src/addon-stack.ts +1046 -0
- package/src/composer.ts +4 -4
- package/src/generators/postgres-init.ts +2 -0
- package/src/generators/skills.ts +142 -0
- package/src/index.ts +20 -2
- package/src/schema.ts +190 -0
- package/src/services/definitions/browserless.ts +3 -0
- package/src/services/definitions/burnlink.ts +142 -0
- package/src/services/definitions/convex.ts +31 -0
- package/src/services/definitions/grafana.ts +9 -0
- package/src/services/definitions/hindsight.ts +131 -0
- package/src/services/definitions/index.ts +10 -0
- package/src/services/definitions/meilisearch.ts +9 -0
- package/src/services/definitions/minio.ts +2 -0
- package/src/services/definitions/n8n.ts +9 -0
- package/src/services/definitions/ollama.ts +2 -0
- package/src/services/definitions/opensandbox.ts +156 -0
- package/src/services/definitions/qdrant.ts +2 -0
- package/src/services/definitions/searxng.ts +3 -0
- package/src/services/definitions/uptime-kuma.ts +3 -0
- package/src/types.ts +18 -0
- package/dist/schema-eX44HhRp.d.mts.map +0 -1
- package/dist/schema-tn5RK8CM.d.cts.map +0 -1
- package/dist/vi.2VT5v0um-C_jmO7m2.mjs.map +0 -1
- package/dist/vi.2VT5v0um-iVBt6Fyq.cjs.map +0 -1
package/dist/schema.test.cjs
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_test_CTcmp4Su = require("./test.CTcmp4Su-DlzTarwH.cjs");
|
|
2
2
|
const require_schema = require("./schema.cjs");
|
|
3
3
|
//#region src/schema.test.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
require_test_CTcmp4Su.describe("ServiceCategorySchema", () => {
|
|
5
|
+
require_test_CTcmp4Su.it("accepts valid categories", () => {
|
|
6
|
+
require_test_CTcmp4Su.globalExpect(require_schema.ServiceCategorySchema.parse("automation")).toBe("automation");
|
|
7
|
+
require_test_CTcmp4Su.globalExpect(require_schema.ServiceCategorySchema.parse("vector-db")).toBe("vector-db");
|
|
8
|
+
require_test_CTcmp4Su.globalExpect(require_schema.ServiceCategorySchema.parse("ai")).toBe("ai");
|
|
9
9
|
});
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
require_test_CTcmp4Su.it("rejects invalid categories", () => {
|
|
11
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.ServiceCategorySchema.parse("invalid")).toThrow();
|
|
12
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.ServiceCategorySchema.parse("")).toThrow();
|
|
13
13
|
});
|
|
14
14
|
});
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
require_test_CTcmp4Su.describe("PortMappingSchema", () => {
|
|
16
|
+
require_test_CTcmp4Su.it("accepts valid port mapping", () => {
|
|
17
|
+
require_test_CTcmp4Su.globalExpect(require_schema.PortMappingSchema.parse({
|
|
18
18
|
host: 6379,
|
|
19
19
|
container: 6379,
|
|
20
20
|
description: "Redis port",
|
|
21
21
|
exposed: true
|
|
22
22
|
}).host).toBe(6379);
|
|
23
23
|
});
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
require_test_CTcmp4Su.it("defaults exposed to true", () => {
|
|
25
|
+
require_test_CTcmp4Su.globalExpect(require_schema.PortMappingSchema.parse({
|
|
26
26
|
host: 6379,
|
|
27
27
|
container: 6379,
|
|
28
28
|
description: "Redis port"
|
|
29
29
|
}).exposed).toBe(true);
|
|
30
30
|
});
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
require_test_CTcmp4Su.it("rejects invalid port numbers", () => {
|
|
32
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.PortMappingSchema.parse({
|
|
33
33
|
host: 0,
|
|
34
34
|
container: 6379,
|
|
35
35
|
description: "bad"
|
|
36
36
|
})).toThrow();
|
|
37
|
-
|
|
37
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.PortMappingSchema.parse({
|
|
38
38
|
host: 7e4,
|
|
39
39
|
container: 6379,
|
|
40
40
|
description: "bad"
|
|
41
41
|
})).toThrow();
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
require_test_CTcmp4Su.describe("VolumeMappingSchema", () => {
|
|
45
|
+
require_test_CTcmp4Su.it("accepts valid volume mapping", () => {
|
|
46
|
+
require_test_CTcmp4Su.globalExpect(require_schema.VolumeMappingSchema.parse({
|
|
47
47
|
name: "redis-data",
|
|
48
48
|
containerPath: "/data",
|
|
49
49
|
description: "Redis persistent data"
|
|
50
50
|
}).name).toBe("redis-data");
|
|
51
51
|
});
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
require_test_CTcmp4Su.it("rejects empty name", () => {
|
|
53
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.VolumeMappingSchema.parse({
|
|
54
54
|
name: "",
|
|
55
55
|
containerPath: "/data",
|
|
56
56
|
description: "bad"
|
|
57
57
|
})).toThrow();
|
|
58
58
|
});
|
|
59
59
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
require_test_CTcmp4Su.describe("EnvVariableSchema", () => {
|
|
61
|
+
require_test_CTcmp4Su.it("accepts valid env variable", () => {
|
|
62
|
+
require_test_CTcmp4Su.globalExpect(require_schema.EnvVariableSchema.parse({
|
|
63
63
|
key: "REDIS_PASSWORD",
|
|
64
64
|
defaultValue: "changeme",
|
|
65
65
|
secret: true,
|
|
@@ -67,26 +67,26 @@ require_vi_2VT5v0um.describe("EnvVariableSchema", () => {
|
|
|
67
67
|
required: true
|
|
68
68
|
}).secret).toBe(true);
|
|
69
69
|
});
|
|
70
|
-
|
|
70
|
+
require_test_CTcmp4Su.it("defaults secret to false", () => {
|
|
71
71
|
const result = require_schema.EnvVariableSchema.parse({
|
|
72
72
|
key: "REDIS_HOST",
|
|
73
73
|
defaultValue: "redis",
|
|
74
74
|
description: "Redis host"
|
|
75
75
|
});
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
require_test_CTcmp4Su.globalExpect(result.secret).toBe(false);
|
|
77
|
+
require_test_CTcmp4Su.globalExpect(result.required).toBe(true);
|
|
78
78
|
});
|
|
79
79
|
});
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
require_test_CTcmp4Su.describe("HealthCheckSchema", () => {
|
|
81
|
+
require_test_CTcmp4Su.it("accepts valid healthcheck with defaults", () => {
|
|
82
82
|
const result = require_schema.HealthCheckSchema.parse({ test: "redis-cli ping" });
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
require_test_CTcmp4Su.globalExpect(result.interval).toBe("30s");
|
|
84
|
+
require_test_CTcmp4Su.globalExpect(result.timeout).toBe("10s");
|
|
85
|
+
require_test_CTcmp4Su.globalExpect(result.retries).toBe(3);
|
|
86
86
|
});
|
|
87
87
|
});
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
require_test_CTcmp4Su.describe("GenerationInputSchema", () => {
|
|
89
|
+
require_test_CTcmp4Su.it("accepts valid generation input", () => {
|
|
90
90
|
const result = require_schema.GenerationInputSchema.parse({
|
|
91
91
|
projectName: "my-openclaw-stack",
|
|
92
92
|
services: ["redis", "qdrant"],
|
|
@@ -94,47 +94,47 @@ require_vi_2VT5v0um.describe("GenerationInputSchema", () => {
|
|
|
94
94
|
proxy: "caddy",
|
|
95
95
|
domain: "openclaw.example.com"
|
|
96
96
|
});
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
require_test_CTcmp4Su.globalExpect(result.projectName).toBe("my-openclaw-stack");
|
|
98
|
+
require_test_CTcmp4Su.globalExpect(result.gpu).toBe(false);
|
|
99
99
|
});
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
require_test_CTcmp4Su.it("rejects invalid project names", () => {
|
|
101
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "-bad-name" })).toThrow();
|
|
102
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "Bad Name" })).toThrow();
|
|
103
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "has spaces" })).toThrow();
|
|
104
104
|
});
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
require_test_CTcmp4Su.it("accepts single-char project name", () => {
|
|
106
|
+
require_test_CTcmp4Su.globalExpect(require_schema.GenerationInputSchema.parse({ projectName: "a" }).projectName).toBe("a");
|
|
107
107
|
});
|
|
108
|
-
|
|
108
|
+
require_test_CTcmp4Su.it("applies defaults", () => {
|
|
109
109
|
const result = require_schema.GenerationInputSchema.parse({ projectName: "test" });
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
110
|
+
require_test_CTcmp4Su.globalExpect(result.services).toEqual([]);
|
|
111
|
+
require_test_CTcmp4Su.globalExpect(result.skillPacks).toEqual([]);
|
|
112
|
+
require_test_CTcmp4Su.globalExpect(result.proxy).toBe("none");
|
|
113
|
+
require_test_CTcmp4Su.globalExpect(result.gpu).toBe(false);
|
|
114
|
+
require_test_CTcmp4Su.globalExpect(result.platform).toBe("linux/amd64");
|
|
115
|
+
require_test_CTcmp4Su.globalExpect(result.deployment).toBe("local");
|
|
116
|
+
require_test_CTcmp4Su.globalExpect(result.deploymentType).toBe("docker");
|
|
117
|
+
require_test_CTcmp4Su.globalExpect(result.generateSecrets).toBe(true);
|
|
118
|
+
require_test_CTcmp4Su.globalExpect(result.openclawVersion).toBe("latest");
|
|
119
119
|
});
|
|
120
|
-
|
|
120
|
+
require_test_CTcmp4Su.it("accepts deploymentType bare-metal and extended platform", () => {
|
|
121
121
|
const result = require_schema.GenerationInputSchema.parse({
|
|
122
122
|
projectName: "my-stack",
|
|
123
123
|
services: ["redis"],
|
|
124
124
|
deploymentType: "bare-metal",
|
|
125
125
|
platform: "windows/amd64"
|
|
126
126
|
});
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
require_test_CTcmp4Su.globalExpect(result.deploymentType).toBe("bare-metal");
|
|
128
|
+
require_test_CTcmp4Su.globalExpect(result.platform).toBe("windows/amd64");
|
|
129
129
|
});
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
require_test_CTcmp4Su.it("accepts platform macos/arm64", () => {
|
|
131
|
+
require_test_CTcmp4Su.globalExpect(require_schema.GenerationInputSchema.parse({
|
|
132
132
|
projectName: "my-stack",
|
|
133
133
|
platform: "macos/arm64"
|
|
134
134
|
}).platform).toBe("macos/arm64");
|
|
135
135
|
});
|
|
136
136
|
});
|
|
137
|
-
|
|
137
|
+
require_test_CTcmp4Su.describe("ServiceDefinitionSchema", () => {
|
|
138
138
|
const validDef = {
|
|
139
139
|
id: "redis",
|
|
140
140
|
name: "Redis",
|
|
@@ -163,16 +163,16 @@ require_vi_2VT5v0um.describe("ServiceDefinitionSchema", () => {
|
|
|
163
163
|
tags: ["cache", "database"],
|
|
164
164
|
maturity: "stable"
|
|
165
165
|
};
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
require_test_CTcmp4Su.it("accepts valid service definition", () => {
|
|
167
|
+
require_test_CTcmp4Su.globalExpect(require_schema.ServiceDefinitionSchema.parse(validDef).id).toBe("redis");
|
|
168
168
|
});
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
require_test_CTcmp4Su.it("rejects invalid id format", () => {
|
|
170
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.ServiceDefinitionSchema.parse({
|
|
171
171
|
...validDef,
|
|
172
172
|
id: "Bad_Id"
|
|
173
173
|
})).toThrow();
|
|
174
174
|
});
|
|
175
|
-
|
|
175
|
+
require_test_CTcmp4Su.it("defaults arrays and booleans correctly", () => {
|
|
176
176
|
const result = require_schema.ServiceDefinitionSchema.parse({
|
|
177
177
|
id: "test",
|
|
178
178
|
name: "Test",
|
|
@@ -183,23 +183,23 @@ require_vi_2VT5v0um.describe("ServiceDefinitionSchema", () => {
|
|
|
183
183
|
imageTag: "latest",
|
|
184
184
|
docsUrl: "https://example.com"
|
|
185
185
|
});
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
186
|
+
require_test_CTcmp4Su.globalExpect(result.ports).toEqual([]);
|
|
187
|
+
require_test_CTcmp4Su.globalExpect(result.volumes).toEqual([]);
|
|
188
|
+
require_test_CTcmp4Su.globalExpect(result.requires).toEqual([]);
|
|
189
|
+
require_test_CTcmp4Su.globalExpect(result.conflictsWith).toEqual([]);
|
|
190
|
+
require_test_CTcmp4Su.globalExpect(result.gpuRequired).toBe(false);
|
|
191
191
|
});
|
|
192
|
-
|
|
192
|
+
require_test_CTcmp4Su.it("accepts optional mandatory field and defaults to false when omitted", () => {
|
|
193
193
|
const withMandatory = {
|
|
194
194
|
...validDef,
|
|
195
195
|
mandatory: true
|
|
196
196
|
};
|
|
197
|
-
|
|
197
|
+
require_test_CTcmp4Su.globalExpect(require_schema.ServiceDefinitionSchema.parse(withMandatory).mandatory).toBe(true);
|
|
198
198
|
});
|
|
199
|
-
|
|
200
|
-
|
|
199
|
+
require_test_CTcmp4Su.it("omitting mandatory leaves it undefined or false (schema default false)", () => {
|
|
200
|
+
require_test_CTcmp4Su.globalExpect(require_schema.ServiceDefinitionSchema.parse(validDef).mandatory !== true).toBe(true);
|
|
201
201
|
});
|
|
202
|
-
|
|
202
|
+
require_test_CTcmp4Su.it("accepts nativeSupported and nativeRecipes for bare-metal", () => {
|
|
203
203
|
const withNative = {
|
|
204
204
|
...validDef,
|
|
205
205
|
nativeSupported: true,
|
|
@@ -212,15 +212,15 @@ require_vi_2VT5v0um.describe("ServiceDefinitionSchema", () => {
|
|
|
212
212
|
}]
|
|
213
213
|
};
|
|
214
214
|
const result = require_schema.ServiceDefinitionSchema.parse(withNative);
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
215
|
+
require_test_CTcmp4Su.globalExpect(result.nativeSupported).toBe(true);
|
|
216
|
+
require_test_CTcmp4Su.globalExpect(result.nativeRecipes).toHaveLength(1);
|
|
217
|
+
require_test_CTcmp4Su.globalExpect(result.nativeRecipes[0].platform).toBe("linux");
|
|
218
|
+
require_test_CTcmp4Su.globalExpect(result.nativeRecipes[0].startCommand).toBe("systemctl start redis-server");
|
|
219
219
|
});
|
|
220
220
|
});
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
221
|
+
require_test_CTcmp4Su.describe("SkillPackSchema", () => {
|
|
222
|
+
require_test_CTcmp4Su.it("accepts valid skill pack", () => {
|
|
223
|
+
require_test_CTcmp4Su.globalExpect(require_schema.SkillPackSchema.parse({
|
|
224
224
|
id: "research-agent",
|
|
225
225
|
name: "Research Agent",
|
|
226
226
|
description: "Research agent pack",
|
|
@@ -236,8 +236,8 @@ require_vi_2VT5v0um.describe("SkillPackSchema", () => {
|
|
|
236
236
|
]
|
|
237
237
|
}).requiredServices).toHaveLength(3);
|
|
238
238
|
});
|
|
239
|
-
|
|
240
|
-
|
|
239
|
+
require_test_CTcmp4Su.it("rejects empty required services", () => {
|
|
240
|
+
require_test_CTcmp4Su.globalExpect(() => require_schema.SkillPackSchema.parse({
|
|
241
241
|
id: "empty",
|
|
242
242
|
name: "Empty",
|
|
243
243
|
description: "Bad",
|
|
@@ -246,9 +246,9 @@ require_vi_2VT5v0um.describe("SkillPackSchema", () => {
|
|
|
246
246
|
})).toThrow();
|
|
247
247
|
});
|
|
248
248
|
});
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
249
|
+
require_test_CTcmp4Su.describe("PresetSchema", () => {
|
|
250
|
+
require_test_CTcmp4Su.it("accepts valid preset", () => {
|
|
251
|
+
require_test_CTcmp4Su.globalExpect(require_schema.PresetSchema.parse({
|
|
252
252
|
id: "minimal",
|
|
253
253
|
name: "Minimal",
|
|
254
254
|
description: "OpenClaw + Redis",
|
package/dist/schema.test.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.cjs","names":["describe","ServiceCategorySchema","PortMappingSchema","VolumeMappingSchema","EnvVariableSchema","HealthCheckSchema","GenerationInputSchema","ServiceDefinitionSchema","SkillPackSchema","PresetSchema"],"sources":["../src/schema.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tEnvVariableSchema,\n\tGenerationInputSchema,\n\tHealthCheckSchema,\n\tPortMappingSchema,\n\tPresetSchema,\n\tServiceCategorySchema,\n\tServiceDefinitionSchema,\n\tSkillPackSchema,\n\tVolumeMappingSchema,\n} from \"./schema.js\";\n\ndescribe(\"ServiceCategorySchema\", () => {\n\tit(\"accepts valid categories\", () => {\n\t\texpect(ServiceCategorySchema.parse(\"automation\")).toBe(\"automation\");\n\t\texpect(ServiceCategorySchema.parse(\"vector-db\")).toBe(\"vector-db\");\n\t\texpect(ServiceCategorySchema.parse(\"ai\")).toBe(\"ai\");\n\t});\n\n\tit(\"rejects invalid categories\", () => {\n\t\texpect(() => ServiceCategorySchema.parse(\"invalid\")).toThrow();\n\t\texpect(() => ServiceCategorySchema.parse(\"\")).toThrow();\n\t});\n});\n\ndescribe(\"PortMappingSchema\", () => {\n\tit(\"accepts valid port mapping\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t\texposed: true,\n\t\t});\n\t\texpect(result.host).toBe(6379);\n\t});\n\n\tit(\"defaults exposed to true\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t});\n\t\texpect(result.exposed).toBe(true);\n\t});\n\n\tit(\"rejects invalid port numbers\", () => {\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 0,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 70000,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"VolumeMappingSchema\", () => {\n\tit(\"accepts valid volume mapping\", () => {\n\t\tconst result = VolumeMappingSchema.parse({\n\t\t\tname: \"redis-data\",\n\t\t\tcontainerPath: \"/data\",\n\t\t\tdescription: \"Redis persistent data\",\n\t\t});\n\t\texpect(result.name).toBe(\"redis-data\");\n\t});\n\n\tit(\"rejects empty name\", () => {\n\t\texpect(() =>\n\t\t\tVolumeMappingSchema.parse({\n\t\t\t\tname: \"\",\n\t\t\t\tcontainerPath: \"/data\",\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"EnvVariableSchema\", () => {\n\tit(\"accepts valid env variable\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_PASSWORD\",\n\t\t\tdefaultValue: \"changeme\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Redis password\",\n\t\t\trequired: true,\n\t\t});\n\t\texpect(result.secret).toBe(true);\n\t});\n\n\tit(\"defaults secret to false\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_HOST\",\n\t\t\tdefaultValue: \"redis\",\n\t\t\tdescription: \"Redis host\",\n\t\t});\n\t\texpect(result.secret).toBe(false);\n\t\texpect(result.required).toBe(true);\n\t});\n});\n\ndescribe(\"HealthCheckSchema\", () => {\n\tit(\"accepts valid healthcheck with defaults\", () => {\n\t\tconst result = HealthCheckSchema.parse({\n\t\t\ttest: \"redis-cli ping\",\n\t\t});\n\t\texpect(result.interval).toBe(\"30s\");\n\t\texpect(result.timeout).toBe(\"10s\");\n\t\texpect(result.retries).toBe(3);\n\t});\n});\n\ndescribe(\"GenerationInputSchema\", () => {\n\tit(\"accepts valid generation input\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-openclaw-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\"],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"openclaw.example.com\",\n\t\t});\n\t\texpect(result.projectName).toBe(\"my-openclaw-stack\");\n\t\texpect(result.gpu).toBe(false);\n\t});\n\n\tit(\"rejects invalid project names\", () => {\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"-bad-name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"Bad Name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"has spaces\" })).toThrow();\n\t});\n\n\tit(\"accepts single-char project name\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"a\" });\n\t\texpect(result.projectName).toBe(\"a\");\n\t});\n\n\tit(\"applies defaults\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"test\" });\n\t\texpect(result.services).toEqual([]);\n\t\texpect(result.skillPacks).toEqual([]);\n\t\texpect(result.proxy).toBe(\"none\");\n\t\texpect(result.gpu).toBe(false);\n\t\texpect(result.platform).toBe(\"linux/amd64\");\n\t\texpect(result.deployment).toBe(\"local\");\n\t\texpect(result.deploymentType).toBe(\"docker\");\n\t\texpect(result.generateSecrets).toBe(true);\n\t\texpect(result.openclawVersion).toBe(\"latest\");\n\t});\n\n\tit(\"accepts deploymentType bare-metal and extended platform\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tplatform: \"windows/amd64\",\n\t\t});\n\t\texpect(result.deploymentType).toBe(\"bare-metal\");\n\t\texpect(result.platform).toBe(\"windows/amd64\");\n\t});\n\n\tit(\"accepts platform macos/arm64\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tplatform: \"macos/arm64\",\n\t\t});\n\t\texpect(result.platform).toBe(\"macos/arm64\");\n\t});\n});\n\ndescribe(\"ServiceDefinitionSchema\", () => {\n\tconst validDef = {\n\t\tid: \"redis\",\n\t\tname: \"Redis\",\n\t\tdescription: \"In-memory data store\",\n\t\tcategory: \"database\",\n\t\ticon: \"🔴\",\n\t\timage: \"redis\",\n\t\timageTag: \"7-alpine\",\n\t\tports: [{ host: 6379, container: 6379, description: \"Redis port\", exposed: true }],\n\t\tvolumes: [{ name: \"redis-data\", containerPath: \"/data\", description: \"Data\" }],\n\t\tenvironment: [],\n\t\trestartPolicy: \"unless-stopped\",\n\t\tnetworks: [\"openclaw-network\"],\n\t\tskills: [],\n\t\topenclawEnvVars: [],\n\t\tdocsUrl: \"https://redis.io/docs\",\n\t\ttags: [\"cache\", \"database\"],\n\t\tmaturity: \"stable\",\n\t};\n\n\tit(\"accepts valid service definition\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.id).toBe(\"redis\");\n\t});\n\n\tit(\"rejects invalid id format\", () => {\n\t\texpect(() => ServiceDefinitionSchema.parse({ ...validDef, id: \"Bad_Id\" })).toThrow();\n\t});\n\n\tit(\"defaults arrays and booleans correctly\", () => {\n\t\tconst minimal = {\n\t\t\tid: \"test\",\n\t\t\tname: \"Test\",\n\t\t\tdescription: \"Test service\",\n\t\t\tcategory: \"database\",\n\t\t\ticon: \"🧪\",\n\t\t\timage: \"test\",\n\t\t\timageTag: \"latest\",\n\t\t\tdocsUrl: \"https://example.com\",\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(minimal);\n\t\texpect(result.ports).toEqual([]);\n\t\texpect(result.volumes).toEqual([]);\n\t\texpect(result.requires).toEqual([]);\n\t\texpect(result.conflictsWith).toEqual([]);\n\t\texpect(result.gpuRequired).toBe(false);\n\t});\n\n\tit(\"accepts optional mandatory field and defaults to false when omitted\", () => {\n\t\tconst withMandatory = { ...validDef, mandatory: true };\n\t\tconst result = ServiceDefinitionSchema.parse(withMandatory);\n\t\texpect(result.mandatory).toBe(true);\n\t});\n\n\tit(\"omitting mandatory leaves it undefined or false (schema default false)\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.mandatory !== true).toBe(true); // false or undefined both mean not mandatory\n\t});\n\n\tit(\"accepts nativeSupported and nativeRecipes for bare-metal\", () => {\n\t\tconst withNative = {\n\t\t\t...validDef,\n\t\t\tnativeSupported: true,\n\t\t\tnativeRecipes: [\n\t\t\t\t{\n\t\t\t\t\tplatform: \"linux\",\n\t\t\t\t\tinstallSteps: [\"apt-get install -y redis-server\"],\n\t\t\t\t\tstartCommand: \"systemctl start redis-server\",\n\t\t\t\t\tstopCommand: \"systemctl stop redis-server\",\n\t\t\t\t\tsystemdUnit: \"redis-server\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(withNative);\n\t\texpect(result.nativeSupported).toBe(true);\n\t\texpect(result.nativeRecipes).toHaveLength(1);\n\t\texpect(result.nativeRecipes![0].platform).toBe(\"linux\");\n\t\texpect(result.nativeRecipes![0].startCommand).toBe(\"systemctl start redis-server\");\n\t});\n});\n\ndescribe(\"SkillPackSchema\", () => {\n\tit(\"accepts valid skill pack\", () => {\n\t\tconst result = SkillPackSchema.parse({\n\t\t\tid: \"research-agent\",\n\t\t\tname: \"Research Agent\",\n\t\t\tdescription: \"Research agent pack\",\n\t\t\trequiredServices: [\"qdrant\", \"searxng\", \"browserless\"],\n\t\t\tskills: [\"qdrant-memory\", \"searxng-search\", \"browserless-browse\"],\n\t\t});\n\t\texpect(result.requiredServices).toHaveLength(3);\n\t});\n\n\tit(\"rejects empty required services\", () => {\n\t\texpect(() =>\n\t\t\tSkillPackSchema.parse({\n\t\t\t\tid: \"empty\",\n\t\t\t\tname: \"Empty\",\n\t\t\t\tdescription: \"Bad\",\n\t\t\t\trequiredServices: [],\n\t\t\t\tskills: [],\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"PresetSchema\", () => {\n\tit(\"accepts valid preset\", () => {\n\t\tconst result = PresetSchema.parse({\n\t\t\tid: \"minimal\",\n\t\t\tname: \"Minimal\",\n\t\t\tdescription: \"OpenClaw + Redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\testimatedMemoryMB: 1024,\n\t\t});\n\t\texpect(result.skillPacks).toEqual([]);\n\t});\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.test.cjs","names":["describe","ServiceCategorySchema","PortMappingSchema","VolumeMappingSchema","EnvVariableSchema","HealthCheckSchema","GenerationInputSchema","ServiceDefinitionSchema","SkillPackSchema","PresetSchema"],"sources":["../src/schema.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tEnvVariableSchema,\n\tGenerationInputSchema,\n\tHealthCheckSchema,\n\tPortMappingSchema,\n\tPresetSchema,\n\tServiceCategorySchema,\n\tServiceDefinitionSchema,\n\tSkillPackSchema,\n\tVolumeMappingSchema,\n} from \"./schema.js\";\n\ndescribe(\"ServiceCategorySchema\", () => {\n\tit(\"accepts valid categories\", () => {\n\t\texpect(ServiceCategorySchema.parse(\"automation\")).toBe(\"automation\");\n\t\texpect(ServiceCategorySchema.parse(\"vector-db\")).toBe(\"vector-db\");\n\t\texpect(ServiceCategorySchema.parse(\"ai\")).toBe(\"ai\");\n\t});\n\n\tit(\"rejects invalid categories\", () => {\n\t\texpect(() => ServiceCategorySchema.parse(\"invalid\")).toThrow();\n\t\texpect(() => ServiceCategorySchema.parse(\"\")).toThrow();\n\t});\n});\n\ndescribe(\"PortMappingSchema\", () => {\n\tit(\"accepts valid port mapping\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t\texposed: true,\n\t\t});\n\t\texpect(result.host).toBe(6379);\n\t});\n\n\tit(\"defaults exposed to true\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t});\n\t\texpect(result.exposed).toBe(true);\n\t});\n\n\tit(\"rejects invalid port numbers\", () => {\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 0,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 70000,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"VolumeMappingSchema\", () => {\n\tit(\"accepts valid volume mapping\", () => {\n\t\tconst result = VolumeMappingSchema.parse({\n\t\t\tname: \"redis-data\",\n\t\t\tcontainerPath: \"/data\",\n\t\t\tdescription: \"Redis persistent data\",\n\t\t});\n\t\texpect(result.name).toBe(\"redis-data\");\n\t});\n\n\tit(\"rejects empty name\", () => {\n\t\texpect(() =>\n\t\t\tVolumeMappingSchema.parse({\n\t\t\t\tname: \"\",\n\t\t\t\tcontainerPath: \"/data\",\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"EnvVariableSchema\", () => {\n\tit(\"accepts valid env variable\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_PASSWORD\",\n\t\t\tdefaultValue: \"changeme\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Redis password\",\n\t\t\trequired: true,\n\t\t});\n\t\texpect(result.secret).toBe(true);\n\t});\n\n\tit(\"defaults secret to false\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_HOST\",\n\t\t\tdefaultValue: \"redis\",\n\t\t\tdescription: \"Redis host\",\n\t\t});\n\t\texpect(result.secret).toBe(false);\n\t\texpect(result.required).toBe(true);\n\t});\n});\n\ndescribe(\"HealthCheckSchema\", () => {\n\tit(\"accepts valid healthcheck with defaults\", () => {\n\t\tconst result = HealthCheckSchema.parse({\n\t\t\ttest: \"redis-cli ping\",\n\t\t});\n\t\texpect(result.interval).toBe(\"30s\");\n\t\texpect(result.timeout).toBe(\"10s\");\n\t\texpect(result.retries).toBe(3);\n\t});\n});\n\ndescribe(\"GenerationInputSchema\", () => {\n\tit(\"accepts valid generation input\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-openclaw-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\"],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"openclaw.example.com\",\n\t\t});\n\t\texpect(result.projectName).toBe(\"my-openclaw-stack\");\n\t\texpect(result.gpu).toBe(false);\n\t});\n\n\tit(\"rejects invalid project names\", () => {\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"-bad-name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"Bad Name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"has spaces\" })).toThrow();\n\t});\n\n\tit(\"accepts single-char project name\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"a\" });\n\t\texpect(result.projectName).toBe(\"a\");\n\t});\n\n\tit(\"applies defaults\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"test\" });\n\t\texpect(result.services).toEqual([]);\n\t\texpect(result.skillPacks).toEqual([]);\n\t\texpect(result.proxy).toBe(\"none\");\n\t\texpect(result.gpu).toBe(false);\n\t\texpect(result.platform).toBe(\"linux/amd64\");\n\t\texpect(result.deployment).toBe(\"local\");\n\t\texpect(result.deploymentType).toBe(\"docker\");\n\t\texpect(result.generateSecrets).toBe(true);\n\t\texpect(result.openclawVersion).toBe(\"latest\");\n\t});\n\n\tit(\"accepts deploymentType bare-metal and extended platform\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tplatform: \"windows/amd64\",\n\t\t});\n\t\texpect(result.deploymentType).toBe(\"bare-metal\");\n\t\texpect(result.platform).toBe(\"windows/amd64\");\n\t});\n\n\tit(\"accepts platform macos/arm64\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tplatform: \"macos/arm64\",\n\t\t});\n\t\texpect(result.platform).toBe(\"macos/arm64\");\n\t});\n});\n\ndescribe(\"ServiceDefinitionSchema\", () => {\n\tconst validDef = {\n\t\tid: \"redis\",\n\t\tname: \"Redis\",\n\t\tdescription: \"In-memory data store\",\n\t\tcategory: \"database\",\n\t\ticon: \"🔴\",\n\t\timage: \"redis\",\n\t\timageTag: \"7-alpine\",\n\t\tports: [{ host: 6379, container: 6379, description: \"Redis port\", exposed: true }],\n\t\tvolumes: [{ name: \"redis-data\", containerPath: \"/data\", description: \"Data\" }],\n\t\tenvironment: [],\n\t\trestartPolicy: \"unless-stopped\",\n\t\tnetworks: [\"openclaw-network\"],\n\t\tskills: [],\n\t\topenclawEnvVars: [],\n\t\tdocsUrl: \"https://redis.io/docs\",\n\t\ttags: [\"cache\", \"database\"],\n\t\tmaturity: \"stable\",\n\t};\n\n\tit(\"accepts valid service definition\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.id).toBe(\"redis\");\n\t});\n\n\tit(\"rejects invalid id format\", () => {\n\t\texpect(() => ServiceDefinitionSchema.parse({ ...validDef, id: \"Bad_Id\" })).toThrow();\n\t});\n\n\tit(\"defaults arrays and booleans correctly\", () => {\n\t\tconst minimal = {\n\t\t\tid: \"test\",\n\t\t\tname: \"Test\",\n\t\t\tdescription: \"Test service\",\n\t\t\tcategory: \"database\",\n\t\t\ticon: \"🧪\",\n\t\t\timage: \"test\",\n\t\t\timageTag: \"latest\",\n\t\t\tdocsUrl: \"https://example.com\",\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(minimal);\n\t\texpect(result.ports).toEqual([]);\n\t\texpect(result.volumes).toEqual([]);\n\t\texpect(result.requires).toEqual([]);\n\t\texpect(result.conflictsWith).toEqual([]);\n\t\texpect(result.gpuRequired).toBe(false);\n\t});\n\n\tit(\"accepts optional mandatory field and defaults to false when omitted\", () => {\n\t\tconst withMandatory = { ...validDef, mandatory: true };\n\t\tconst result = ServiceDefinitionSchema.parse(withMandatory);\n\t\texpect(result.mandatory).toBe(true);\n\t});\n\n\tit(\"omitting mandatory leaves it undefined or false (schema default false)\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.mandatory !== true).toBe(true); // false or undefined both mean not mandatory\n\t});\n\n\tit(\"accepts nativeSupported and nativeRecipes for bare-metal\", () => {\n\t\tconst withNative = {\n\t\t\t...validDef,\n\t\t\tnativeSupported: true,\n\t\t\tnativeRecipes: [\n\t\t\t\t{\n\t\t\t\t\tplatform: \"linux\",\n\t\t\t\t\tinstallSteps: [\"apt-get install -y redis-server\"],\n\t\t\t\t\tstartCommand: \"systemctl start redis-server\",\n\t\t\t\t\tstopCommand: \"systemctl stop redis-server\",\n\t\t\t\t\tsystemdUnit: \"redis-server\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(withNative);\n\t\texpect(result.nativeSupported).toBe(true);\n\t\texpect(result.nativeRecipes).toHaveLength(1);\n\t\texpect(result.nativeRecipes![0].platform).toBe(\"linux\");\n\t\texpect(result.nativeRecipes![0].startCommand).toBe(\"systemctl start redis-server\");\n\t});\n});\n\ndescribe(\"SkillPackSchema\", () => {\n\tit(\"accepts valid skill pack\", () => {\n\t\tconst result = SkillPackSchema.parse({\n\t\t\tid: \"research-agent\",\n\t\t\tname: \"Research Agent\",\n\t\t\tdescription: \"Research agent pack\",\n\t\t\trequiredServices: [\"qdrant\", \"searxng\", \"browserless\"],\n\t\t\tskills: [\"qdrant-memory\", \"searxng-search\", \"browserless-browse\"],\n\t\t});\n\t\texpect(result.requiredServices).toHaveLength(3);\n\t});\n\n\tit(\"rejects empty required services\", () => {\n\t\texpect(() =>\n\t\t\tSkillPackSchema.parse({\n\t\t\t\tid: \"empty\",\n\t\t\t\tname: \"Empty\",\n\t\t\t\tdescription: \"Bad\",\n\t\t\t\trequiredServices: [],\n\t\t\t\tskills: [],\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"PresetSchema\", () => {\n\tit(\"accepts valid preset\", () => {\n\t\tconst result = PresetSchema.parse({\n\t\t\tid: \"minimal\",\n\t\t\tname: \"Minimal\",\n\t\t\tdescription: \"OpenClaw + Redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\testimatedMemoryMB: 1024,\n\t\t});\n\t\texpect(result.skillPacks).toEqual([]);\n\t});\n});\n"],"mappings":"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"}
|
package/dist/schema.test.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as describe, r as it, t as globalExpect } from "./
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "./test.CTcmp4Su-ClCHJ3FA.mjs";
|
|
2
2
|
import { EnvVariableSchema, GenerationInputSchema, HealthCheckSchema, PortMappingSchema, PresetSchema, ServiceCategorySchema, ServiceDefinitionSchema, SkillPackSchema, VolumeMappingSchema } from "./schema.mjs";
|
|
3
3
|
//#region src/schema.test.ts
|
|
4
4
|
describe("ServiceCategorySchema", () => {
|
|
@@ -78,7 +78,10 @@ const browserlessDefinition = {
|
|
|
78
78
|
recommends: [],
|
|
79
79
|
conflictsWith: [],
|
|
80
80
|
minMemoryMB: 512,
|
|
81
|
-
gpuRequired: false
|
|
81
|
+
gpuRequired: false,
|
|
82
|
+
capDropCompatible: false,
|
|
83
|
+
proxyPath: "/browserless",
|
|
84
|
+
firstBootCapabilities: ["SYS_ADMIN"]
|
|
82
85
|
};
|
|
83
86
|
//#endregion
|
|
84
87
|
exports.browserlessDefinition = browserlessDefinition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserless.cjs","names":[],"sources":["../../../src/services/definitions/browserless.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const browserlessDefinition: ServiceDefinition = {\n\tid: \"browserless\",\n\tname: \"Browserless\",\n\tdescription:\n\t\t\"Headless Chrome browser-as-a-service for web scraping, PDF generation, screenshots, and browser automation at scale.\",\n\tcategory: \"browser\",\n\ticon: \"🌐\",\n\n\timage: \"browserless/chrome\",\n\timageTag: \"latest\",\n\tports: [\n\t\t{\n\t\t\thost: 3010,\n\t\t\tcontainer: 3000,\n\t\t\tdescription: \"Browserless HTTP and WebSocket API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"TOKEN\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Authentication token for Browserless API access\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"MAX_CONCURRENT_SESSIONS\",\n\t\t\tdefaultValue: \"5\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Maximum number of concurrent browser sessions\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3000/?token=$TOKEN || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"15s\",\n\t},\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [{ skillId: \"browserless-browse\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"BROWSERLESS_HOST\",\n\t\t\tdefaultValue: \"browserless\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_PORT\",\n\t\t\tdefaultValue: \"3000\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_TOKEN\",\n\t\t\tdefaultValue: \"${TOKEN}\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Browserless API token for OpenClaw (references service token)\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://www.browserless.io/docs/\",\n\ttags: [\"browser\", \"scraping\", \"pdf\", \"screenshots\", \"automation\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 512,\n\tgpuRequired: false,\n};\n"],"mappings":";;AAEA,MAAa,wBAA2C;CACvD,IAAI;CACJ,MAAM;CACN,aACC;CACD,UAAU;CACV,MAAM;CAEN,OAAO;CACP,UAAU;CACV,OAAO,CACN;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,EAAE;CACX,aAAa,CACZ;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,EACD;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,CACD;CACD,aAAa;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS;EACT,aAAa;EACb;CACD,WAAW,EAAE;CACb,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,CAAC;EAAE,SAAS;EAAsB,aAAa;EAAM,CAAC;CAC9D,iBAAiB;EAChB;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;CAED,SAAS;CACT,MAAM;EAAC;EAAW;EAAY;EAAO;EAAe;EAAa;CACjE,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
|
|
1
|
+
{"version":3,"file":"browserless.cjs","names":[],"sources":["../../../src/services/definitions/browserless.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const browserlessDefinition: ServiceDefinition = {\n\tid: \"browserless\",\n\tname: \"Browserless\",\n\tdescription:\n\t\t\"Headless Chrome browser-as-a-service for web scraping, PDF generation, screenshots, and browser automation at scale.\",\n\tcategory: \"browser\",\n\ticon: \"🌐\",\n\n\timage: \"browserless/chrome\",\n\timageTag: \"latest\",\n\tports: [\n\t\t{\n\t\t\thost: 3010,\n\t\t\tcontainer: 3000,\n\t\t\tdescription: \"Browserless HTTP and WebSocket API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"TOKEN\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Authentication token for Browserless API access\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"MAX_CONCURRENT_SESSIONS\",\n\t\t\tdefaultValue: \"5\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Maximum number of concurrent browser sessions\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3000/?token=$TOKEN || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"15s\",\n\t},\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [{ skillId: \"browserless-browse\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"BROWSERLESS_HOST\",\n\t\t\tdefaultValue: \"browserless\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_PORT\",\n\t\t\tdefaultValue: \"3000\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_TOKEN\",\n\t\t\tdefaultValue: \"${TOKEN}\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Browserless API token for OpenClaw (references service token)\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://www.browserless.io/docs/\",\n\ttags: [\"browser\", \"scraping\", \"pdf\", \"screenshots\", \"automation\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 512,\n\tgpuRequired: false,\n\tcapDropCompatible: false,\n\tproxyPath: \"/browserless\",\n\tfirstBootCapabilities: [\"SYS_ADMIN\"],\n};\n"],"mappings":";;AAEA,MAAa,wBAA2C;CACvD,IAAI;CACJ,MAAM;CACN,aACC;CACD,UAAU;CACV,MAAM;CAEN,OAAO;CACP,UAAU;CACV,OAAO,CACN;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,EAAE;CACX,aAAa,CACZ;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,EACD;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,CACD;CACD,aAAa;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS;EACT,aAAa;EACb;CACD,WAAW,EAAE;CACb,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,CAAC;EAAE,SAAS;EAAsB,aAAa;EAAM,CAAC;CAC9D,iBAAiB;EAChB;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;CAED,SAAS;CACT,MAAM;EAAC;EAAW;EAAY;EAAO;EAAe;EAAa;CACjE,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX,uBAAuB,CAAC,YAAY;CACpC"}
|
|
@@ -77,7 +77,10 @@ const browserlessDefinition = {
|
|
|
77
77
|
recommends: [],
|
|
78
78
|
conflictsWith: [],
|
|
79
79
|
minMemoryMB: 512,
|
|
80
|
-
gpuRequired: false
|
|
80
|
+
gpuRequired: false,
|
|
81
|
+
capDropCompatible: false,
|
|
82
|
+
proxyPath: "/browserless",
|
|
83
|
+
firstBootCapabilities: ["SYS_ADMIN"]
|
|
81
84
|
};
|
|
82
85
|
//#endregion
|
|
83
86
|
export { browserlessDefinition };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserless.mjs","names":[],"sources":["../../../src/services/definitions/browserless.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const browserlessDefinition: ServiceDefinition = {\n\tid: \"browserless\",\n\tname: \"Browserless\",\n\tdescription:\n\t\t\"Headless Chrome browser-as-a-service for web scraping, PDF generation, screenshots, and browser automation at scale.\",\n\tcategory: \"browser\",\n\ticon: \"🌐\",\n\n\timage: \"browserless/chrome\",\n\timageTag: \"latest\",\n\tports: [\n\t\t{\n\t\t\thost: 3010,\n\t\t\tcontainer: 3000,\n\t\t\tdescription: \"Browserless HTTP and WebSocket API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"TOKEN\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Authentication token for Browserless API access\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"MAX_CONCURRENT_SESSIONS\",\n\t\t\tdefaultValue: \"5\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Maximum number of concurrent browser sessions\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3000/?token=$TOKEN || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"15s\",\n\t},\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [{ skillId: \"browserless-browse\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"BROWSERLESS_HOST\",\n\t\t\tdefaultValue: \"browserless\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_PORT\",\n\t\t\tdefaultValue: \"3000\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_TOKEN\",\n\t\t\tdefaultValue: \"${TOKEN}\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Browserless API token for OpenClaw (references service token)\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://www.browserless.io/docs/\",\n\ttags: [\"browser\", \"scraping\", \"pdf\", \"screenshots\", \"automation\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 512,\n\tgpuRequired: false,\n};\n"],"mappings":";AAEA,MAAa,wBAA2C;CACvD,IAAI;CACJ,MAAM;CACN,aACC;CACD,UAAU;CACV,MAAM;CAEN,OAAO;CACP,UAAU;CACV,OAAO,CACN;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,EAAE;CACX,aAAa,CACZ;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,EACD;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,CACD;CACD,aAAa;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS;EACT,aAAa;EACb;CACD,WAAW,EAAE;CACb,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,CAAC;EAAE,SAAS;EAAsB,aAAa;EAAM,CAAC;CAC9D,iBAAiB;EAChB;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;CAED,SAAS;CACT,MAAM;EAAC;EAAW;EAAY;EAAO;EAAe;EAAa;CACjE,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
|
|
1
|
+
{"version":3,"file":"browserless.mjs","names":[],"sources":["../../../src/services/definitions/browserless.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const browserlessDefinition: ServiceDefinition = {\n\tid: \"browserless\",\n\tname: \"Browserless\",\n\tdescription:\n\t\t\"Headless Chrome browser-as-a-service for web scraping, PDF generation, screenshots, and browser automation at scale.\",\n\tcategory: \"browser\",\n\ticon: \"🌐\",\n\n\timage: \"browserless/chrome\",\n\timageTag: \"latest\",\n\tports: [\n\t\t{\n\t\t\thost: 3010,\n\t\t\tcontainer: 3000,\n\t\t\tdescription: \"Browserless HTTP and WebSocket API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"TOKEN\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Authentication token for Browserless API access\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"MAX_CONCURRENT_SESSIONS\",\n\t\t\tdefaultValue: \"5\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Maximum number of concurrent browser sessions\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3000/?token=$TOKEN || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"15s\",\n\t},\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [{ skillId: \"browserless-browse\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"BROWSERLESS_HOST\",\n\t\t\tdefaultValue: \"browserless\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_PORT\",\n\t\t\tdefaultValue: \"3000\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Browserless port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"BROWSERLESS_TOKEN\",\n\t\t\tdefaultValue: \"${TOKEN}\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Browserless API token for OpenClaw (references service token)\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://www.browserless.io/docs/\",\n\ttags: [\"browser\", \"scraping\", \"pdf\", \"screenshots\", \"automation\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 512,\n\tgpuRequired: false,\n\tcapDropCompatible: false,\n\tproxyPath: \"/browserless\",\n\tfirstBootCapabilities: [\"SYS_ADMIN\"],\n};\n"],"mappings":";AAEA,MAAa,wBAA2C;CACvD,IAAI;CACJ,MAAM;CACN,aACC;CACD,UAAU;CACV,MAAM;CAEN,OAAO;CACP,UAAU;CACV,OAAO,CACN;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,EAAE;CACX,aAAa,CACZ;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,EACD;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,CACD;CACD,aAAa;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS;EACT,aAAa;EACb;CACD,WAAW,EAAE;CACb,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,CAAC;EAAE,SAAS;EAAsB,aAAa;EAAM,CAAC;CAC9D,iBAAiB;EAChB;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;CAED,SAAS;CACT,MAAM;EAAC;EAAW;EAAY;EAAO;EAAe;EAAa;CACjE,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX,uBAAuB,CAAC,YAAY;CACpC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/services/definitions/burnlink.ts
|
|
3
|
+
const burnlinkDefinition = {
|
|
4
|
+
id: "burnlink",
|
|
5
|
+
name: "BurnLink",
|
|
6
|
+
description: "Privacy-first, zero-knowledge file sharing with end-to-end browser-side AES-256-GCM encryption, one-time downloads, view-once mode, and brute-force protection.",
|
|
7
|
+
category: "storage",
|
|
8
|
+
icon: "🔥",
|
|
9
|
+
image: "diopisemou/burnlink",
|
|
10
|
+
imageTag: "latest",
|
|
11
|
+
ports: [{
|
|
12
|
+
host: 3250,
|
|
13
|
+
container: 3e3,
|
|
14
|
+
description: "BurnLink web interface",
|
|
15
|
+
exposed: true
|
|
16
|
+
}],
|
|
17
|
+
volumes: [],
|
|
18
|
+
environment: [
|
|
19
|
+
{
|
|
20
|
+
key: "PORT",
|
|
21
|
+
defaultValue: "3000",
|
|
22
|
+
secret: false,
|
|
23
|
+
description: "Server listen port",
|
|
24
|
+
required: false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: "SUPABASE_URL",
|
|
28
|
+
defaultValue: "",
|
|
29
|
+
secret: false,
|
|
30
|
+
description: "Supabase project URL for metadata storage",
|
|
31
|
+
required: true
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: "SUPABASE_SERVICE_ROLE_KEY",
|
|
35
|
+
defaultValue: "",
|
|
36
|
+
secret: true,
|
|
37
|
+
description: "Supabase service role key",
|
|
38
|
+
required: true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
key: "R2_ACCOUNT_ID",
|
|
42
|
+
defaultValue: "",
|
|
43
|
+
secret: false,
|
|
44
|
+
description: "Cloudflare R2 account ID (or MinIO endpoint for self-hosted)",
|
|
45
|
+
required: true
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
key: "R2_ACCESS_KEY_ID",
|
|
49
|
+
defaultValue: "",
|
|
50
|
+
secret: true,
|
|
51
|
+
description: "S3-compatible storage access key",
|
|
52
|
+
required: true
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
key: "R2_SECRET_ACCESS_KEY",
|
|
56
|
+
defaultValue: "",
|
|
57
|
+
secret: true,
|
|
58
|
+
description: "S3-compatible storage secret key",
|
|
59
|
+
required: true
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
key: "R2_BUCKET_NAME",
|
|
63
|
+
defaultValue: "burnlink",
|
|
64
|
+
secret: false,
|
|
65
|
+
description: "Storage bucket name for encrypted files",
|
|
66
|
+
required: true
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: "CANONICAL_BASE_URL",
|
|
70
|
+
defaultValue: "",
|
|
71
|
+
secret: false,
|
|
72
|
+
description: "Public URL for share links (e.g., https://burn.example.com)",
|
|
73
|
+
required: false
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
key: "MAX_UPLOAD_BYTES",
|
|
77
|
+
defaultValue: "1073741824",
|
|
78
|
+
secret: false,
|
|
79
|
+
description: "Max file upload size in bytes (default 1 GB)",
|
|
80
|
+
required: false
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
key: "NODE_ENV",
|
|
84
|
+
defaultValue: "production",
|
|
85
|
+
secret: false,
|
|
86
|
+
description: "Node environment (production enables rate limiting)",
|
|
87
|
+
required: false
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
healthcheck: {
|
|
91
|
+
test: "wget -q --spider http://localhost:3000/ || exit 1",
|
|
92
|
+
interval: "30s",
|
|
93
|
+
timeout: "10s",
|
|
94
|
+
retries: 3,
|
|
95
|
+
startPeriod: "15s"
|
|
96
|
+
},
|
|
97
|
+
dependsOn: [],
|
|
98
|
+
restartPolicy: "unless-stopped",
|
|
99
|
+
networks: ["openclaw-network"],
|
|
100
|
+
skills: [],
|
|
101
|
+
openclawEnvVars: [{
|
|
102
|
+
key: "BURNLINK_HOST",
|
|
103
|
+
defaultValue: "burnlink",
|
|
104
|
+
secret: false,
|
|
105
|
+
description: "BurnLink hostname",
|
|
106
|
+
required: false
|
|
107
|
+
}, {
|
|
108
|
+
key: "BURNLINK_PORT",
|
|
109
|
+
defaultValue: "3000",
|
|
110
|
+
secret: false,
|
|
111
|
+
description: "BurnLink internal port",
|
|
112
|
+
required: false
|
|
113
|
+
}],
|
|
114
|
+
docsUrl: "https://github.com/diopisemou/BurnLink",
|
|
115
|
+
tags: [
|
|
116
|
+
"file-sharing",
|
|
117
|
+
"encryption",
|
|
118
|
+
"privacy",
|
|
119
|
+
"zero-knowledge",
|
|
120
|
+
"self-destruct"
|
|
121
|
+
],
|
|
122
|
+
maturity: "beta",
|
|
123
|
+
requires: [],
|
|
124
|
+
recommends: ["supabase", "minio"],
|
|
125
|
+
conflictsWith: [],
|
|
126
|
+
minMemoryMB: 128,
|
|
127
|
+
gpuRequired: false,
|
|
128
|
+
capDropCompatible: true,
|
|
129
|
+
proxyPath: "/burnlink",
|
|
130
|
+
envQuirks: [{
|
|
131
|
+
key: "R2_SECRET_ACCESS_KEY",
|
|
132
|
+
issue: "min_length",
|
|
133
|
+
fix: {
|
|
134
|
+
type: "generate_base64url",
|
|
135
|
+
minBytes: 24
|
|
136
|
+
}
|
|
137
|
+
}]
|
|
138
|
+
};
|
|
139
|
+
//#endregion
|
|
140
|
+
exports.burnlinkDefinition = burnlinkDefinition;
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=burnlink.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"burnlink.cjs","names":[],"sources":["../../../src/services/definitions/burnlink.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const burnlinkDefinition: ServiceDefinition = {\n\tid: \"burnlink\",\n\tname: \"BurnLink\",\n\tdescription:\n\t\t\"Privacy-first, zero-knowledge file sharing with end-to-end browser-side AES-256-GCM encryption, one-time downloads, view-once mode, and brute-force protection.\",\n\tcategory: \"storage\",\n\ticon: \"🔥\",\n\n\timage: \"diopisemou/burnlink\",\n\timageTag: \"latest\",\n\tports: [\n\t\t{\n\t\t\thost: 3250,\n\t\t\tcontainer: 3000,\n\t\t\tdescription: \"BurnLink web interface\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"PORT\",\n\t\t\tdefaultValue: \"3000\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Server listen port\",\n\t\t\trequired: false,\n\t\t},\n\t\t{\n\t\t\tkey: \"SUPABASE_URL\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Supabase project URL for metadata storage\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"SUPABASE_SERVICE_ROLE_KEY\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Supabase service role key\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"R2_ACCOUNT_ID\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Cloudflare R2 account ID (or MinIO endpoint for self-hosted)\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"R2_ACCESS_KEY_ID\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"S3-compatible storage access key\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"R2_SECRET_ACCESS_KEY\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"S3-compatible storage secret key\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"R2_BUCKET_NAME\",\n\t\t\tdefaultValue: \"burnlink\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Storage bucket name for encrypted files\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"CANONICAL_BASE_URL\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Public URL for share links (e.g., https://burn.example.com)\",\n\t\t\trequired: false,\n\t\t},\n\t\t{\n\t\t\tkey: \"MAX_UPLOAD_BYTES\",\n\t\t\tdefaultValue: \"1073741824\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Max file upload size in bytes (default 1 GB)\",\n\t\t\trequired: false,\n\t\t},\n\t\t{\n\t\t\tkey: \"NODE_ENV\",\n\t\t\tdefaultValue: \"production\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Node environment (production enables rate limiting)\",\n\t\t\trequired: false,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"wget -q --spider http://localhost:3000/ || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"15s\",\n\t},\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"BURNLINK_HOST\",\n\t\t\tdefaultValue: \"burnlink\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"BurnLink hostname\",\n\t\t\trequired: false,\n\t\t},\n\t\t{\n\t\t\tkey: \"BURNLINK_PORT\",\n\t\t\tdefaultValue: \"3000\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"BurnLink internal port\",\n\t\t\trequired: false,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://github.com/diopisemou/BurnLink\",\n\ttags: [\"file-sharing\", \"encryption\", \"privacy\", \"zero-knowledge\", \"self-destruct\"],\n\tmaturity: \"beta\",\n\n\trequires: [],\n\trecommends: [\"supabase\", \"minio\"],\n\tconflictsWith: [],\n\n\tminMemoryMB: 128,\n\tgpuRequired: false,\n\tcapDropCompatible: true,\n\tproxyPath: \"/burnlink\",\n\tenvQuirks: [\n\t\t{\n\t\t\tkey: \"R2_SECRET_ACCESS_KEY\",\n\t\t\tissue: \"min_length\" as const,\n\t\t\tfix: { type: \"generate_base64url\" as const, minBytes: 24 },\n\t\t},\n\t],\n};\n"],"mappings":";;AAEA,MAAa,qBAAwC;CACpD,IAAI;CACJ,MAAM;CACN,aACC;CACD,UAAU;CACV,MAAM;CAEN,OAAO;CACP,UAAU;CACV,OAAO,CACN;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,EAAE;CACX,aAAa;EACZ;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;CACD,aAAa;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS;EACT,aAAa;EACb;CACD,WAAW,EAAE;CACb,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,EAAE;CACV,iBAAiB,CAChB;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,EACD;EACC,KAAK;EACL,cAAc;EACd,QAAQ;EACR,aAAa;EACb,UAAU;EACV,CACD;CAED,SAAS;CACT,MAAM;EAAC;EAAgB;EAAc;EAAW;EAAkB;EAAgB;CAClF,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,CAAC,YAAY,QAAQ;CACjC,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX,WAAW,CACV;EACC,KAAK;EACL,OAAO;EACP,KAAK;GAAE,MAAM;GAA+B,UAAU;GAAI;EAC1D,CACD;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"burnlink.d.cts","names":[],"sources":["../../../src/services/definitions/burnlink.ts"],"mappings":";;;cAEa,kBAAA,EAAoB,iBAAA"}
|