@better-openclaw/core 1.0.12 → 1.0.13

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.
Files changed (50) hide show
  1. package/README.md +70 -0
  2. package/dist/composer.d.mts.map +1 -1
  3. package/dist/composer.mjs +5 -3
  4. package/dist/composer.mjs.map +1 -1
  5. package/dist/{manifest-DSGl8ITO.mjs → manifest-BjK4ALvr.mjs} +49 -1
  6. package/dist/manifest-BjK4ALvr.mjs.map +1 -0
  7. package/dist/schema.d.mts +4 -0
  8. package/dist/schema.d.mts.map +1 -1
  9. package/dist/schema.mjs +2 -1
  10. package/dist/schema.mjs.map +1 -1
  11. package/dist/services/definitions/hexstrike.d.mts +7 -0
  12. package/dist/services/definitions/hexstrike.d.mts.map +1 -0
  13. package/dist/services/definitions/hexstrike.mjs +44 -0
  14. package/dist/services/definitions/hexstrike.mjs.map +1 -0
  15. package/dist/services/definitions/index.d.mts +6 -1
  16. package/dist/services/definitions/index.d.mts.map +1 -1
  17. package/dist/services/definitions/index.mjs +12 -2
  18. package/dist/services/definitions/index.mjs.map +1 -1
  19. package/dist/services/definitions/pentagi.d.mts +7 -0
  20. package/dist/services/definitions/pentagi.d.mts.map +1 -0
  21. package/dist/services/definitions/pentagi.mjs +44 -0
  22. package/dist/services/definitions/pentagi.mjs.map +1 -0
  23. package/dist/services/definitions/pentestagent.d.mts +7 -0
  24. package/dist/services/definitions/pentestagent.d.mts.map +1 -0
  25. package/dist/services/definitions/pentestagent.mjs +39 -0
  26. package/dist/services/definitions/pentestagent.mjs.map +1 -0
  27. package/dist/services/definitions/scrapling.d.mts +7 -0
  28. package/dist/services/definitions/scrapling.d.mts.map +1 -0
  29. package/dist/services/definitions/scrapling.mjs +44 -0
  30. package/dist/services/definitions/scrapling.mjs.map +1 -0
  31. package/dist/services/definitions/solidityguard.d.mts +7 -0
  32. package/dist/services/definitions/solidityguard.d.mts.map +1 -0
  33. package/dist/services/definitions/solidityguard.mjs +49 -0
  34. package/dist/services/definitions/solidityguard.mjs.map +1 -0
  35. package/dist/skills/skill-manifest.mjs +1 -1
  36. package/dist/types.mjs +5 -0
  37. package/dist/types.mjs.map +1 -1
  38. package/package.json +1 -1
  39. package/src/composer.ts +12 -3
  40. package/src/schema.ts +1 -0
  41. package/src/services/definitions/hexstrike.ts +40 -0
  42. package/src/services/definitions/index.ts +15 -0
  43. package/src/services/definitions/pentagi.ts +40 -0
  44. package/src/services/definitions/pentestagent.ts +33 -0
  45. package/src/services/definitions/scrapling.ts +40 -0
  46. package/src/services/definitions/solidityguard.ts +46 -0
  47. package/src/skills/manifest.json +58 -0
  48. package/src/skills/manifest.schema.json +51 -0
  49. package/src/types.ts +1 -0
  50. package/dist/manifest-DSGl8ITO.mjs.map +0 -1
package/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # @better-openclaw/core
2
+
3
+ The core engine responsible for parsing configurations, resolving dependencies, formatting outputs, and generating production-ready OpenClaw Docker Compose stacks.
4
+
5
+ ## Features
6
+
7
+ - **Service Registry:** A unified, expandable catalog of pre-configured Docker services (e.g., Traefik, PostgreSQL, Qdrant, Ollama, N8N, SearXNG, Scrapling, etc.) categorized by function (databases, models, scrapers, tools).
8
+ - **Dependency Resolution Engine:** Automatically detects and resolves required services. If you select a Postgres-dependent service, Postgres is automatically injected into the generation plan.
9
+ - **Skill Injection (`SKILL.md`):** Deep integration with AI agent workflows. Packages specialized `SKILL.md` instructions into volume mounts for AI tools like the `browser` integration or `tinyfish`.
10
+ - **Intelligent Networking & Proxies:** Fully integrated reverse proxy generation (Caddy and Traefik) and auto-SSL domain generation.
11
+ - **Cross-Platform & Heterogeneous Topologies:** Supports generating stacks for `local` (Docker Desktop), `vps` (cloud), and `homelab` deployments. It explicitly supports a hybrid native-docker model via `deploymentType: "bare-metal"`.
12
+ - **GPU Passthrough Support:** Automatically injects NVIDIA or AMD runtime flags to AI services if the `gpuRequired` flag is detected on the requested service and enabled by the user.
13
+
14
+ ## Programmatic API
15
+
16
+ You can use the generation engine programmatically within any Node.js or TypeScript application:
17
+
18
+ ```typescript
19
+ import { generate, type GenerationInput } from "@better-openclaw/core";
20
+
21
+ const input: GenerationInput = {
22
+ projectName: "my-openclaw-stack",
23
+ services: ["postgres-database", "ollama-local-llm", "n8n-workflow"],
24
+ skillPacks: ["ollama-local-llm", "n8n-workflows"],
25
+ proxy: "caddy",
26
+ domain: "my-ai.example.com",
27
+ gpu: true,
28
+ platform: "linux/amd64",
29
+ deployment: "vps",
30
+ deploymentType: "docker", // or "bare-metal"
31
+ generateSecrets: true,
32
+ openclawVersion: "latest",
33
+ monitoring: true,
34
+ };
35
+
36
+ // Generates the Compose YAML, configs, skills, and .env securely.
37
+ const result = generate(input);
38
+
39
+ console.log(result.files["docker-compose.yaml"]);
40
+ console.log(result.metadata.estimatedMemoryMB);
41
+ ```
42
+
43
+ ## Service Definition Format
44
+
45
+ The Core reads from `src/services/definitions/`. New services should expose a standardized `ServiceDefinition`:
46
+
47
+ ```typescript
48
+ export const myCoolService: ServiceDefinition = {
49
+ id: "my-cool-service",
50
+ name: "Cool AI Service",
51
+ description: "Provides an API for cool operations.",
52
+ category: "tools",
53
+ image: "cool/service:latest",
54
+ ports: [{ port: 8080, public: true }],
55
+ environment: { API_KEY: "${SECRET_KEY}" },
56
+ dependsOn: ["postgres-database"],
57
+ };
58
+ ```
59
+
60
+ ## Adding Skills
61
+
62
+ Skills are markdown instructions or code bundles mapped to specific tools. They are defined in `skills/manifest.json`. During generation, if a `SkillPack` is explicitly selected or implicitly included via an auto-installing service, the Core locates the corresponding files and mounts them into the generated stack's Volume pathways.
63
+
64
+ ## Development
65
+
66
+ ```bash
67
+ pnpm build # Compiles TypeScript via tsdown
68
+ pnpm test # Executes integration tests verifying generating valid stacks
69
+ pnpm lint # Executes Biome linting rules
70
+ ```
@@ -1 +1 @@
1
- {"version":3,"file":"composer.d.mts","names":[],"sources":["../src/composer.ts"],"mappings":";;;UAKiB,aAAA;EAChB,KAAA,EAAO,MAAA;EACP,QAAA;EACA,QAAA;AAAA;;;;;iBAmQe,OAAA,CAAQ,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA;;;AAA3D;;iBAkDgB,gBAAA,CAAiB,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA,GAAiB,aAAA"}
1
+ {"version":3,"file":"composer.d.mts","names":[],"sources":["../src/composer.ts"],"mappings":";;;UAKiB,aAAA;EAChB,KAAA,EAAO,MAAA;EACP,QAAA;EACA,QAAA;AAAA;;;;;iBA4Qe,OAAA,CAAQ,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA;;;AAA3D;;iBAkDgB,gBAAA,CAAiB,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA,GAAiB,aAAA"}
package/dist/composer.mjs CHANGED
@@ -70,7 +70,7 @@ function buildGatewayServices(resolved, options, dependsOn) {
70
70
  for (const { definition: def } of resolved.services) {
71
71
  for (const env of def.openclawEnvVars) gatewayEnv[env.key] = env.secret ? `\${${env.key}}` : env.defaultValue;
72
72
  if (def.openclawVolumeMounts) for (const vol of def.openclawVolumeMounts) {
73
- allVolumes.add(vol.name);
73
+ if (!(vol.name.startsWith("./") || vol.name.startsWith("/") || vol.name.startsWith("~"))) allVolumes.add(vol.name);
74
74
  gatewayVolumes.push(`${vol.name}:${vol.containerPath}`);
75
75
  }
76
76
  }
@@ -136,8 +136,10 @@ function buildCompanionService(def, resolved, options, allVolumes) {
136
136
  });
137
137
  }
138
138
  if (def.volumes.length > 0) svc.volumes = def.volumes.map((v) => {
139
- allVolumes.add(v.name);
140
- volumeNames.push(v.name);
139
+ if (!(v.name.startsWith("./") || v.name.startsWith("/") || v.name.startsWith("~"))) {
140
+ allVolumes.add(v.name);
141
+ volumeNames.push(v.name);
142
+ }
141
143
  return `${v.name}:${v.containerPath}`;
142
144
  });
143
145
  if (def.id === "postgresql") {
@@ -1 +1 @@
1
- {"version":3,"file":"composer.mjs","names":[],"sources":["../src/composer.ts"],"sourcesContent":["import { stringify } from \"yaml\";\nimport type { ComposeOptions, ResolverOutput, ServiceCategory } from \"./types.js\";\n\n// ── Public Types ────────────────────────────────────────────────────────────\n\nexport interface ComposeResult {\n\tfiles: Record<string, string>; // filename -> YAML content\n\tmainFile: string; // \"docker-compose.yml\"\n\tprofiles: string[]; // list of profiles used\n}\n\n// ── Category → Profile Mapping ──────────────────────────────────────────────\n\nconst CATEGORY_PROFILE_MAP: Partial<Record<ServiceCategory, { file: string; profile: string }>> = {\n\tai: { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\t\"ai-platform\": { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\tmedia: { file: \"docker-compose.media.yml\", profile: \"media\" },\n\tmonitoring: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\tanalytics: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\t\"dev-tools\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"coding-agent\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"social-media\": { file: \"docker-compose.social.yml\", profile: \"social\" },\n\tknowledge: { file: \"docker-compose.knowledge.yml\", profile: \"knowledge\" },\n\tcommunication: { file: \"docker-compose.communication.yml\", profile: \"communication\" },\n};\n\nconst YAML_OPTIONS = { lineWidth: 120, nullStr: \"\" };\n\n// ── Shared Gateway Builder ──────────────────────────────────────────────────\n\ninterface GatewayBuildResult {\n\tgatewayService: Record<string, unknown>;\n\tcliService: Record<string, unknown>;\n\tallVolumes: Set<string>;\n}\n\n/**\n * Builds the OpenClaw gateway and CLI service entries.\n * Matches the real OpenClaw docker-compose.yml structure:\n * - Bridge port 18790 for ACP/WebSocket\n * - Bind-mount volumes (not named volumes)\n * - Claude web-provider session env vars\n * - Gateway bind mode (--bind lan)\n * - CLI companion service with stdin/tty\n */\nfunction buildGatewayServices(\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tdependsOn?: Record<string, { condition: string }>,\n): GatewayBuildResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Gateway environment\n\tconst gatewayEnv: Record<string, string> = {\n\t\tHOME: \"/home/node\",\n\t\tTERM: \"xterm-256color\",\n\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t// Claude web-provider session vars (optional, user fills in .env)\n\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t};\n\n\t// Gateway volumes (bind-mount style matching real docker-setup.sh)\n\tconst gatewayVolumes: string[] = [\n\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t];\n\n\t// Collect env vars and volume mounts from companion services\n\tfor (const { definition: def } of resolved.services) {\n\t\tfor (const env of def.openclawEnvVars) {\n\t\t\tgatewayEnv[env.key] = env.secret ? `\\${${env.key}}` : env.defaultValue;\n\t\t}\n\t\tif (def.openclawVolumeMounts) {\n\t\t\tfor (const vol of def.openclawVolumeMounts) {\n\t\t\t\tallVolumes.add(vol.name);\n\t\t\t\tgatewayVolumes.push(`${vol.name}:${vol.containerPath}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Gateway service\n\tconst gateway: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,\n\t\tenvironment: gatewayEnv,\n\t\tvolumes: gatewayVolumes,\n\t\tports: [\"${OPENCLAW_GATEWAY_PORT:-18789}:18789\", \"${OPENCLAW_BRIDGE_PORT:-18790}:18790\"],\n\t\tnetworks: [\"openclaw-network\"],\n\t\tinit: true,\n\t\trestart: \"unless-stopped\",\n\t\tcommand: [\n\t\t\t\"node\",\n\t\t\t\"dist/index.js\",\n\t\t\t\"gateway\",\n\t\t\t\"--bind\",\n\t\t\t\"${OPENCLAW_GATEWAY_BIND:-lan}\",\n\t\t\t\"--port\",\n\t\t\t\"18789\",\n\t\t],\n\t};\n\n\t// Traefik labels for the gateway\n\tconst gwTraefikLabels = options.traefikLabels?.get(\"openclaw-gateway\");\n\tif (gwTraefikLabels) {\n\t\tgateway.labels = gwTraefikLabels;\n\t}\n\n\tif (options.bareMetalNativeHost) {\n\t\tgateway.extra_hosts = [\"host.docker.internal:host-gateway\"];\n\t}\n\n\tif (dependsOn && Object.keys(dependsOn).length > 0) {\n\t\tgateway.depends_on = dependsOn;\n\t}\n\n\t// CLI companion service (matching real OpenClaw docker-compose.yml)\n\tconst cliService: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,\n\t\tenvironment: {\n\t\t\tHOME: \"/home/node\",\n\t\t\tTERM: \"xterm-256color\",\n\t\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t\tBROWSER: \"echo\",\n\t\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t\t},\n\t\tvolumes: [\n\t\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t\t],\n\t\tstdin_open: true,\n\t\ttty: true,\n\t\tinit: true,\n\t\tnetworks: [\"openclaw-network\"],\n\t\tentrypoint: [\"node\", \"dist/index.js\"],\n\t};\n\n\treturn { gatewayService: gateway, cliService: cliService, allVolumes };\n}\n\n// ── Shared Companion Service Builder ────────────────────────────────────────\n\nfunction buildCompanionService(\n\tdef: ResolverOutput[\"services\"][number][\"definition\"],\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tallVolumes: Set<string>,\n): { entry: Record<string, unknown>; volumeNames: string[] } {\n\tconst svc: Record<string, unknown> = {};\n\tconst volumeNames: string[] = [];\n\n\tsvc.image = `${def.image}:${def.imageTag}`;\n\n\tif (def.environment.length > 0) {\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const e of def.environment) {\n\t\t\tenv[e.key] = e.secret ? `\\${${e.key}}` : e.defaultValue;\n\t\t}\n\t\tsvc.environment = env;\n\t}\n\n\tconst exposedPorts = def.ports.filter((p) => p.exposed);\n\tif (exposedPorts.length > 0) {\n\t\tconst prefix = def.id.toUpperCase().replace(/-/g, \"_\");\n\t\tsvc.ports = exposedPorts.map((p, i) => {\n\t\t\tconst suffix = exposedPorts.length > 1 ? `_${i}` : \"\";\n\t\t\treturn `\\${${prefix}_PORT${suffix}:-${p.host}}:${p.container}`;\n\t\t});\n\t}\n\n\tif (def.volumes.length > 0) {\n\t\tsvc.volumes = def.volumes.map((v) => {\n\t\t\tallVolumes.add(v.name);\n\t\t\tvolumeNames.push(v.name);\n\t\t\treturn `${v.name}:${v.containerPath}`;\n\t\t});\n\t}\n\n\t// PostgreSQL: mount the init script for creating per-service databases\n\tif (def.id === \"postgresql\") {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro\",\n\t\t);\n\t}\n\n\tif (def.healthcheck) {\n\t\tconst hc: Record<string, unknown> = {\n\t\t\ttest: [\"CMD-SHELL\", def.healthcheck.test],\n\t\t\tinterval: def.healthcheck.interval,\n\t\t\ttimeout: def.healthcheck.timeout,\n\t\t\tretries: def.healthcheck.retries,\n\t\t};\n\t\tif (def.healthcheck.startPeriod) {\n\t\t\thc.start_period = def.healthcheck.startPeriod;\n\t\t}\n\t\tsvc.healthcheck = hc;\n\t}\n\n\tsvc.restart = def.restartPolicy;\n\tsvc.networks = def.networks;\n\n\tif (def.command) svc.command = def.command;\n\tif (def.entrypoint) svc.entrypoint = def.entrypoint;\n\n\t// Labels: merge static definition labels with dynamic Traefik labels\n\tconst mergedLabels: Record<string, string> = {};\n\tif (def.labels) Object.assign(mergedLabels, def.labels);\n\tconst traefikLabels = options.traefikLabels?.get(def.id);\n\tif (traefikLabels) Object.assign(mergedLabels, traefikLabels);\n\tif (Object.keys(mergedLabels).length > 0) svc.labels = mergedLabels;\n\n\t// Traefik: bind-mount static config and Docker socket\n\tif (def.id === \"traefik\" && options.traefikLabels) {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./traefik/traefik.yml:/etc/traefik/traefik.yml:ro\",\n\t\t\t\"/var/run/docker.sock:/var/run/docker.sock:ro\",\n\t\t);\n\t}\n\n\tlet deploy: Record<string, unknown> | undefined;\n\tif (def.deploy) {\n\t\tdeploy = JSON.parse(JSON.stringify(def.deploy)) as Record<string, unknown>;\n\t}\n\tif (options.gpu && def.gpuRequired) {\n\t\tconst base = deploy ?? {};\n\t\tconst resources = (base.resources ?? {}) as Record<string, unknown>;\n\t\tdeploy = {\n\t\t\t...base,\n\t\t\tresources: {\n\t\t\t\t...resources,\n\t\t\t\treservations: {\n\t\t\t\t\t...((resources.reservations as Record<string, unknown>) ?? {}),\n\t\t\t\t\tdevices: [{ driver: \"nvidia\", count: \"all\", capabilities: [\"gpu\"] }],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\tif (deploy) svc.deploy = deploy;\n\n\t// Merge both dependsOn and requires to ensure proper Docker startup ordering\n\tconst depIds = [...new Set([...def.dependsOn, ...def.requires])].filter((id) =>\n\t\tresolved.services.some((s) => s.definition.id === id),\n\t);\n\tif (depIds.length > 0) {\n\t\tconst dependsOn: Record<string, { condition: string }> = {};\n\t\tfor (const depId of depIds) {\n\t\t\tconst dep = resolved.services.find((s) => s.definition.id === depId);\n\t\t\tdependsOn[depId] = {\n\t\t\t\tcondition: dep?.definition.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t\tsvc.depends_on = dependsOn;\n\t}\n\n\treturn { entry: svc, volumeNames };\n}\n\n// ── Single-File Compose ─────────────────────────────────────────────────────\n\n/**\n * Generates a single Docker Compose YAML string with ALL services.\n * Backward-compatible signature.\n */\nexport function compose(resolved: ResolverOutput, options: ComposeOptions): string {\n\t// Build depends_on for ALL companion services\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tgatewayDependsOn[def.id] = {\n\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t};\n\t}\n\n\tconst { gatewayService, cliService, allVolumes } = buildGatewayServices(\n\t\tresolved,\n\t\toptions,\n\t\tgatewayDependsOn,\n\t);\n\n\tconst services: Record<string, Record<string, unknown>> = {\n\t\t\"openclaw-gateway\": gatewayService,\n\t};\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry } = buildCompanionService(def, resolved, options, allVolumes);\n\t\tservices[def.id] = entry;\n\t}\n\n\t// Add CLI service\n\tservices[\"openclaw-cli\"] = cliService;\n\n\tconst volumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tvolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\treturn stringify({ services, volumes, networks }, YAML_OPTIONS);\n}\n\n// ── Multi-File Compose ──────────────────────────────────────────────────────\n\ninterface ServiceInfo {\n\tid: string;\n\tcategory: ServiceCategory;\n\tentry: Record<string, unknown>;\n\tvolumeNames: string[];\n}\n\n/**\n * Generates multiple Docker Compose files, splitting services into profile-based\n * override files by category.\n */\nexport function composeMultiFile(resolved: ResolverOutput, options: ComposeOptions): ComposeResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Build all companion service entries & classify by category\n\tconst serviceInfos: ServiceInfo[] = [];\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry, volumeNames } = buildCompanionService(def, resolved, options, allVolumes);\n\t\tserviceInfos.push({ id: def.id, category: def.category, entry, volumeNames });\n\t}\n\n\t// Partition services into base vs. profile files\n\tconst baseServiceIds = new Set<string>();\n\tconst profileFileMap: Record<string, { profile: string; services: ServiceInfo[] }> = {};\n\n\tfor (const info of serviceInfos) {\n\t\tconst mapping = CATEGORY_PROFILE_MAP[info.category];\n\t\tif (mapping) {\n\t\t\tif (!profileFileMap[mapping.file]) {\n\t\t\t\tprofileFileMap[mapping.file] = { profile: mapping.profile, services: [] };\n\t\t\t}\n\t\t\tprofileFileMap[mapping.file]!.services.push(info);\n\t\t} else {\n\t\t\tbaseServiceIds.add(info.id);\n\t\t}\n\t}\n\n\t// Gateway depends_on (only base services)\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tif (baseServiceIds.has(def.id)) {\n\t\t\tgatewayDependsOn[def.id] = {\n\t\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t}\n\n\tconst {\n\t\tgatewayService,\n\t\tcliService,\n\t\tallVolumes: gwVolumes,\n\t} = buildGatewayServices(resolved, options, gatewayDependsOn);\n\n\t// Merge gateway volumes into allVolumes\n\tfor (const v of gwVolumes) allVolumes.add(v);\n\n\t// Base file: gateway + CLI + core services + ALL volumes + networks\n\tconst baseServices: Record<string, Record<string, unknown>> = {\n\t\t\"openclaw-gateway\": gatewayService,\n\t};\n\n\tfor (const info of serviceInfos) {\n\t\tif (baseServiceIds.has(info.id)) {\n\t\t\tbaseServices[info.id] = info.entry;\n\t\t}\n\t}\n\n\tbaseServices[\"openclaw-cli\"] = cliService;\n\n\tconst sortedAllVolumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tsortedAllVolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\tconst files: Record<string, string> = {};\n\tfiles[\"docker-compose.yml\"] = stringify(\n\t\t{ services: baseServices, volumes: sortedAllVolumes, networks },\n\t\tYAML_OPTIONS,\n\t);\n\n\t// Profile override files\n\tconst usedProfiles = new Set<string>();\n\n\tfor (const [fileName, { profile, services }] of Object.entries(profileFileMap)) {\n\t\tusedProfiles.add(profile);\n\n\t\tconst profileServices: Record<string, Record<string, unknown>> = {};\n\t\tconst profileVolumes = new Set<string>();\n\n\t\tfor (const info of services) {\n\t\t\tprofileServices[info.id] = { ...info.entry, profiles: [profile] };\n\t\t\tfor (const vName of info.volumeNames) {\n\t\t\t\tprofileVolumes.add(vName);\n\t\t\t}\n\t\t}\n\n\t\tconst fileContent: Record<string, unknown> = { services: profileServices };\n\n\t\tif (profileVolumes.size > 0) {\n\t\t\tconst sortedProfileVolumes: Record<string, null> = {};\n\t\t\tfor (const v of [...profileVolumes].sort()) {\n\t\t\t\tsortedProfileVolumes[v] = null;\n\t\t\t}\n\t\t\tfileContent.volumes = sortedProfileVolumes;\n\t\t}\n\n\t\tfiles[fileName] = stringify(fileContent, YAML_OPTIONS);\n\t}\n\n\treturn {\n\t\tfiles,\n\t\tmainFile: \"docker-compose.yml\",\n\t\tprofiles: [...usedProfiles].sort(),\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"composer.mjs","names":[],"sources":["../src/composer.ts"],"sourcesContent":["import { stringify } from \"yaml\";\nimport type { ComposeOptions, ResolverOutput, ServiceCategory } from \"./types.js\";\n\n// ── Public Types ────────────────────────────────────────────────────────────\n\nexport interface ComposeResult {\n\tfiles: Record<string, string>; // filename -> YAML content\n\tmainFile: string; // \"docker-compose.yml\"\n\tprofiles: string[]; // list of profiles used\n}\n\n// ── Category → Profile Mapping ──────────────────────────────────────────────\n\nconst CATEGORY_PROFILE_MAP: Partial<Record<ServiceCategory, { file: string; profile: string }>> = {\n\tai: { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\t\"ai-platform\": { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\tmedia: { file: \"docker-compose.media.yml\", profile: \"media\" },\n\tmonitoring: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\tanalytics: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\t\"dev-tools\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"coding-agent\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"social-media\": { file: \"docker-compose.social.yml\", profile: \"social\" },\n\tknowledge: { file: \"docker-compose.knowledge.yml\", profile: \"knowledge\" },\n\tcommunication: { file: \"docker-compose.communication.yml\", profile: \"communication\" },\n};\n\nconst YAML_OPTIONS = { lineWidth: 120, nullStr: \"\" };\n\n// ── Shared Gateway Builder ──────────────────────────────────────────────────\n\ninterface GatewayBuildResult {\n\tgatewayService: Record<string, unknown>;\n\tcliService: Record<string, unknown>;\n\tallVolumes: Set<string>;\n}\n\n/**\n * Builds the OpenClaw gateway and CLI service entries.\n * Matches the real OpenClaw docker-compose.yml structure:\n * - Bridge port 18790 for ACP/WebSocket\n * - Bind-mount volumes (not named volumes)\n * - Claude web-provider session env vars\n * - Gateway bind mode (--bind lan)\n * - CLI companion service with stdin/tty\n */\nfunction buildGatewayServices(\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tdependsOn?: Record<string, { condition: string }>,\n): GatewayBuildResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Gateway environment\n\tconst gatewayEnv: Record<string, string> = {\n\t\tHOME: \"/home/node\",\n\t\tTERM: \"xterm-256color\",\n\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t// Claude web-provider session vars (optional, user fills in .env)\n\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t};\n\n\t// Gateway volumes (bind-mount style matching real docker-setup.sh)\n\tconst gatewayVolumes: string[] = [\n\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t];\n\n\t// Collect env vars and volume mounts from companion services\n\tfor (const { definition: def } of resolved.services) {\n\t\tfor (const env of def.openclawEnvVars) {\n\t\t\tgatewayEnv[env.key] = env.secret ? `\\${${env.key}}` : env.defaultValue;\n\t\t}\n\t\tif (def.openclawVolumeMounts) {\n\t\t\tfor (const vol of def.openclawVolumeMounts) {\n\t\t\t\tconst isBindMount =\n\t\t\t\t\tvol.name.startsWith(\"./\") || vol.name.startsWith(\"/\") || vol.name.startsWith(\"~\");\n\t\t\t\tif (!isBindMount) {\n\t\t\t\t\tallVolumes.add(vol.name);\n\t\t\t\t}\n\t\t\t\tgatewayVolumes.push(`${vol.name}:${vol.containerPath}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Gateway service\n\tconst gateway: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,\n\t\tenvironment: gatewayEnv,\n\t\tvolumes: gatewayVolumes,\n\t\tports: [\"${OPENCLAW_GATEWAY_PORT:-18789}:18789\", \"${OPENCLAW_BRIDGE_PORT:-18790}:18790\"],\n\t\tnetworks: [\"openclaw-network\"],\n\t\tinit: true,\n\t\trestart: \"unless-stopped\",\n\t\tcommand: [\n\t\t\t\"node\",\n\t\t\t\"dist/index.js\",\n\t\t\t\"gateway\",\n\t\t\t\"--bind\",\n\t\t\t\"${OPENCLAW_GATEWAY_BIND:-lan}\",\n\t\t\t\"--port\",\n\t\t\t\"18789\",\n\t\t],\n\t};\n\n\t// Traefik labels for the gateway\n\tconst gwTraefikLabels = options.traefikLabels?.get(\"openclaw-gateway\");\n\tif (gwTraefikLabels) {\n\t\tgateway.labels = gwTraefikLabels;\n\t}\n\n\tif (options.bareMetalNativeHost) {\n\t\tgateway.extra_hosts = [\"host.docker.internal:host-gateway\"];\n\t}\n\n\tif (dependsOn && Object.keys(dependsOn).length > 0) {\n\t\tgateway.depends_on = dependsOn;\n\t}\n\n\t// CLI companion service (matching real OpenClaw docker-compose.yml)\n\tconst cliService: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,\n\t\tenvironment: {\n\t\t\tHOME: \"/home/node\",\n\t\t\tTERM: \"xterm-256color\",\n\t\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t\tBROWSER: \"echo\",\n\t\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t\t},\n\t\tvolumes: [\n\t\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t\t],\n\t\tstdin_open: true,\n\t\ttty: true,\n\t\tinit: true,\n\t\tnetworks: [\"openclaw-network\"],\n\t\tentrypoint: [\"node\", \"dist/index.js\"],\n\t};\n\n\treturn { gatewayService: gateway, cliService: cliService, allVolumes };\n}\n\n// ── Shared Companion Service Builder ────────────────────────────────────────\n\nfunction buildCompanionService(\n\tdef: ResolverOutput[\"services\"][number][\"definition\"],\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tallVolumes: Set<string>,\n): { entry: Record<string, unknown>; volumeNames: string[] } {\n\tconst svc: Record<string, unknown> = {};\n\tconst volumeNames: string[] = [];\n\n\tsvc.image = `${def.image}:${def.imageTag}`;\n\n\tif (def.environment.length > 0) {\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const e of def.environment) {\n\t\t\tenv[e.key] = e.secret ? `\\${${e.key}}` : e.defaultValue;\n\t\t}\n\t\tsvc.environment = env;\n\t}\n\n\tconst exposedPorts = def.ports.filter((p) => p.exposed);\n\tif (exposedPorts.length > 0) {\n\t\tconst prefix = def.id.toUpperCase().replace(/-/g, \"_\");\n\t\tsvc.ports = exposedPorts.map((p, i) => {\n\t\t\tconst suffix = exposedPorts.length > 1 ? `_${i}` : \"\";\n\t\t\treturn `\\${${prefix}_PORT${suffix}:-${p.host}}:${p.container}`;\n\t\t});\n\t}\n\n\tif (def.volumes.length > 0) {\n\t\tsvc.volumes = def.volumes.map((v) => {\n\t\t\tconst isBindMount =\n\t\t\t\tv.name.startsWith(\"./\") || v.name.startsWith(\"/\") || v.name.startsWith(\"~\");\n\t\t\t\n\t\t\tif (!isBindMount) {\n\t\t\t\tallVolumes.add(v.name);\n\t\t\t\tvolumeNames.push(v.name);\n\t\t\t}\n\t\t\treturn `${v.name}:${v.containerPath}`;\n\t\t});\n\t}\n\n\t// PostgreSQL: mount the init script for creating per-service databases\n\tif (def.id === \"postgresql\") {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro\",\n\t\t);\n\t}\n\n\tif (def.healthcheck) {\n\t\tconst hc: Record<string, unknown> = {\n\t\t\ttest: [\"CMD-SHELL\", def.healthcheck.test],\n\t\t\tinterval: def.healthcheck.interval,\n\t\t\ttimeout: def.healthcheck.timeout,\n\t\t\tretries: def.healthcheck.retries,\n\t\t};\n\t\tif (def.healthcheck.startPeriod) {\n\t\t\thc.start_period = def.healthcheck.startPeriod;\n\t\t}\n\t\tsvc.healthcheck = hc;\n\t}\n\n\tsvc.restart = def.restartPolicy;\n\tsvc.networks = def.networks;\n\n\tif (def.command) svc.command = def.command;\n\tif (def.entrypoint) svc.entrypoint = def.entrypoint;\n\n\t// Labels: merge static definition labels with dynamic Traefik labels\n\tconst mergedLabels: Record<string, string> = {};\n\tif (def.labels) Object.assign(mergedLabels, def.labels);\n\tconst traefikLabels = options.traefikLabels?.get(def.id);\n\tif (traefikLabels) Object.assign(mergedLabels, traefikLabels);\n\tif (Object.keys(mergedLabels).length > 0) svc.labels = mergedLabels;\n\n\t// Traefik: bind-mount static config and Docker socket\n\tif (def.id === \"traefik\" && options.traefikLabels) {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./traefik/traefik.yml:/etc/traefik/traefik.yml:ro\",\n\t\t\t\"/var/run/docker.sock:/var/run/docker.sock:ro\",\n\t\t);\n\t}\n\n\tlet deploy: Record<string, unknown> | undefined;\n\tif (def.deploy) {\n\t\tdeploy = JSON.parse(JSON.stringify(def.deploy)) as Record<string, unknown>;\n\t}\n\tif (options.gpu && def.gpuRequired) {\n\t\tconst base = deploy ?? {};\n\t\tconst resources = (base.resources ?? {}) as Record<string, unknown>;\n\t\tdeploy = {\n\t\t\t...base,\n\t\t\tresources: {\n\t\t\t\t...resources,\n\t\t\t\treservations: {\n\t\t\t\t\t...((resources.reservations as Record<string, unknown>) ?? {}),\n\t\t\t\t\tdevices: [{ driver: \"nvidia\", count: \"all\", capabilities: [\"gpu\"] }],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\tif (deploy) svc.deploy = deploy;\n\n\t// Merge both dependsOn and requires to ensure proper Docker startup ordering\n\tconst depIds = [...new Set([...def.dependsOn, ...def.requires])].filter((id) =>\n\t\tresolved.services.some((s) => s.definition.id === id),\n\t);\n\tif (depIds.length > 0) {\n\t\tconst dependsOn: Record<string, { condition: string }> = {};\n\t\tfor (const depId of depIds) {\n\t\t\tconst dep = resolved.services.find((s) => s.definition.id === depId);\n\t\t\tdependsOn[depId] = {\n\t\t\t\tcondition: dep?.definition.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t\tsvc.depends_on = dependsOn;\n\t}\n\n\treturn { entry: svc, volumeNames };\n}\n\n// ── Single-File Compose ─────────────────────────────────────────────────────\n\n/**\n * Generates a single Docker Compose YAML string with ALL services.\n * Backward-compatible signature.\n */\nexport function compose(resolved: ResolverOutput, options: ComposeOptions): string {\n\t// Build depends_on for ALL companion services\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tgatewayDependsOn[def.id] = {\n\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t};\n\t}\n\n\tconst { gatewayService, cliService, allVolumes } = buildGatewayServices(\n\t\tresolved,\n\t\toptions,\n\t\tgatewayDependsOn,\n\t);\n\n\tconst services: Record<string, Record<string, unknown>> = {\n\t\t\"openclaw-gateway\": gatewayService,\n\t};\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry } = buildCompanionService(def, resolved, options, allVolumes);\n\t\tservices[def.id] = entry;\n\t}\n\n\t// Add CLI service\n\tservices[\"openclaw-cli\"] = cliService;\n\n\tconst volumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tvolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\treturn stringify({ services, volumes, networks }, YAML_OPTIONS);\n}\n\n// ── Multi-File Compose ──────────────────────────────────────────────────────\n\ninterface ServiceInfo {\n\tid: string;\n\tcategory: ServiceCategory;\n\tentry: Record<string, unknown>;\n\tvolumeNames: string[];\n}\n\n/**\n * Generates multiple Docker Compose files, splitting services into profile-based\n * override files by category.\n */\nexport function composeMultiFile(resolved: ResolverOutput, options: ComposeOptions): ComposeResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Build all companion service entries & classify by category\n\tconst serviceInfos: ServiceInfo[] = [];\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry, volumeNames } = buildCompanionService(def, resolved, options, allVolumes);\n\t\tserviceInfos.push({ id: def.id, category: def.category, entry, volumeNames });\n\t}\n\n\t// Partition services into base vs. profile files\n\tconst baseServiceIds = new Set<string>();\n\tconst profileFileMap: Record<string, { profile: string; services: ServiceInfo[] }> = {};\n\n\tfor (const info of serviceInfos) {\n\t\tconst mapping = CATEGORY_PROFILE_MAP[info.category];\n\t\tif (mapping) {\n\t\t\tif (!profileFileMap[mapping.file]) {\n\t\t\t\tprofileFileMap[mapping.file] = { profile: mapping.profile, services: [] };\n\t\t\t}\n\t\t\tprofileFileMap[mapping.file]!.services.push(info);\n\t\t} else {\n\t\t\tbaseServiceIds.add(info.id);\n\t\t}\n\t}\n\n\t// Gateway depends_on (only base services)\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tif (baseServiceIds.has(def.id)) {\n\t\t\tgatewayDependsOn[def.id] = {\n\t\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t}\n\n\tconst {\n\t\tgatewayService,\n\t\tcliService,\n\t\tallVolumes: gwVolumes,\n\t} = buildGatewayServices(resolved, options, gatewayDependsOn);\n\n\t// Merge gateway volumes into allVolumes\n\tfor (const v of gwVolumes) allVolumes.add(v);\n\n\t// Base file: gateway + CLI + core services + ALL volumes + networks\n\tconst baseServices: Record<string, Record<string, unknown>> = {\n\t\t\"openclaw-gateway\": gatewayService,\n\t};\n\n\tfor (const info of serviceInfos) {\n\t\tif (baseServiceIds.has(info.id)) {\n\t\t\tbaseServices[info.id] = info.entry;\n\t\t}\n\t}\n\n\tbaseServices[\"openclaw-cli\"] = cliService;\n\n\tconst sortedAllVolumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tsortedAllVolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\tconst files: Record<string, string> = {};\n\tfiles[\"docker-compose.yml\"] = stringify(\n\t\t{ services: baseServices, volumes: sortedAllVolumes, networks },\n\t\tYAML_OPTIONS,\n\t);\n\n\t// Profile override files\n\tconst usedProfiles = new Set<string>();\n\n\tfor (const [fileName, { profile, services }] of Object.entries(profileFileMap)) {\n\t\tusedProfiles.add(profile);\n\n\t\tconst profileServices: Record<string, Record<string, unknown>> = {};\n\t\tconst profileVolumes = new Set<string>();\n\n\t\tfor (const info of services) {\n\t\t\tprofileServices[info.id] = { ...info.entry, profiles: [profile] };\n\t\t\tfor (const vName of info.volumeNames) {\n\t\t\t\tprofileVolumes.add(vName);\n\t\t\t}\n\t\t}\n\n\t\tconst fileContent: Record<string, unknown> = { services: profileServices };\n\n\t\tif (profileVolumes.size > 0) {\n\t\t\tconst sortedProfileVolumes: Record<string, null> = {};\n\t\t\tfor (const v of [...profileVolumes].sort()) {\n\t\t\t\tsortedProfileVolumes[v] = null;\n\t\t\t}\n\t\t\tfileContent.volumes = sortedProfileVolumes;\n\t\t}\n\n\t\tfiles[fileName] = stringify(fileContent, YAML_OPTIONS);\n\t}\n\n\treturn {\n\t\tfiles,\n\t\tmainFile: \"docker-compose.yml\",\n\t\tprofiles: [...usedProfiles].sort(),\n\t};\n}\n"],"mappings":"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"}
@@ -1101,10 +1101,58 @@ var manifest_default = {
1101
1101
  "path": "aura-asset-images/SKILL.md",
1102
1102
  "emoji": "📷",
1103
1103
  "services": []
1104
+ },
1105
+ {
1106
+ "id": "tinyfish-cookbook",
1107
+ "path": "tinyfish-cookbook/SKILL.md",
1108
+ "emoji": "🐟",
1109
+ "services": []
1110
+ },
1111
+ {
1112
+ "id": "browser-learn",
1113
+ "path": "browser-learn/SKILL.md",
1114
+ "emoji": "🧠",
1115
+ "services": []
1116
+ },
1117
+ {
1118
+ "id": "scrapling-scrape",
1119
+ "path": "scrapling-scrape/SKILL.md",
1120
+ "emoji": "🕸️",
1121
+ "services": ["scrapling"]
1122
+ },
1123
+ {
1124
+ "id": "youtube-growth",
1125
+ "path": "youtube-growth/SKILL.md",
1126
+ "emoji": "📈",
1127
+ "services": []
1128
+ },
1129
+ {
1130
+ "id": "hexstrike-mcp",
1131
+ "path": "hexstrike-mcp/SKILL.md",
1132
+ "emoji": "⚔️",
1133
+ "services": ["hexstrike"]
1134
+ },
1135
+ {
1136
+ "id": "solidityguard-audit",
1137
+ "path": "solidityguard-audit/SKILL.md",
1138
+ "emoji": "🛡️",
1139
+ "services": ["solidityguard"]
1140
+ },
1141
+ {
1142
+ "id": "pentagi-orchestrator",
1143
+ "path": "pentagi-orchestrator/SKILL.md",
1144
+ "emoji": "🕵️",
1145
+ "services": ["pentagi"]
1146
+ },
1147
+ {
1148
+ "id": "pentestagent-runner",
1149
+ "path": "pentestagent-runner/SKILL.md",
1150
+ "emoji": "🔍",
1151
+ "services": ["pentestagent"]
1104
1152
  }
1105
1153
  ]
1106
1154
  };
1107
1155
 
1108
1156
  //#endregion
1109
1157
  export { manifest_default as t };
1110
- //# sourceMappingURL=manifest-DSGl8ITO.mjs.map
1158
+ //# sourceMappingURL=manifest-BjK4ALvr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-BjK4ALvr.mjs","names":[],"sources":["../src/skills/manifest.json"],"sourcesContent":[""],"mappings":""}
package/dist/schema.d.mts CHANGED
@@ -21,6 +21,7 @@ declare const ServiceCategorySchema: z.ZodEnum<{
21
21
  knowledge: "knowledge";
22
22
  desktop: "desktop";
23
23
  streaming: "streaming";
24
+ security: "security";
24
25
  }>;
25
26
  declare const MaturitySchema: z.ZodEnum<{
26
27
  stable: "stable";
@@ -156,6 +157,7 @@ declare const ServiceDefinitionSchema: z.ZodObject<{
156
157
  knowledge: "knowledge";
157
158
  desktop: "desktop";
158
159
  streaming: "streaming";
160
+ security: "security";
159
161
  }>;
160
162
  icon: z.ZodString;
161
163
  image: z.ZodString;
@@ -341,6 +343,7 @@ declare const ResolvedServiceSchema: z.ZodObject<{
341
343
  knowledge: "knowledge";
342
344
  desktop: "desktop";
343
345
  streaming: "streaming";
346
+ security: "security";
344
347
  }>;
345
348
  icon: z.ZodString;
346
349
  image: z.ZodString;
@@ -497,6 +500,7 @@ declare const ResolverOutputSchema: z.ZodObject<{
497
500
  knowledge: "knowledge";
498
501
  desktop: "desktop";
499
502
  streaming: "streaming";
503
+ security: "security";
500
504
  }>;
501
505
  icon: z.ZodString;
502
506
  image: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.mts","names":[],"sources":["../src/schema.ts"],"mappings":";;;cAIa,qBAAA,EAAqB,CAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;cAsBrB,cAAA,EAAc,CAAA,CAAA,OAAA;;;;;cAEd,cAAA,EAAc,CAAA,CAAA,OAAA;;;;;;;;cASd,qBAAA,EAAqB,CAAA,CAAA,OAAA;;;;cAErB,oBAAA,EAAoB,CAAA,CAAA,OAAA;;;;cAEpB,mBAAA,EAAmB,CAAA,CAAA,OAAA;;;;;;cAEnB,eAAA,EAAe,CAAA,CAAA,OAAA;;;;;cAEf,sBAAA,EAAsB,CAAA,CAAA,OAAA;;;;;;cAEtB,kBAAA,EAAkB,CAAA,CAAA,OAAA;;;;;cAIlB,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;cAOjB,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;cAOnB,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;;;cASjB,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;;cAQjB,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;cAKpB,YAAA,EAAY,CAAA,CAAA,SAAA;;;;;;;;;;;;cASZ,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;cAOlB,oBAAA,EAAoB,CAAA,CAAA,OAAA;;;;;cAEpB,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;;;;;;;;cAYlB,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwDvB,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;;;cAef,YAAA,EAAY,CAAA,CAAA,SAAA;;;;;;;;cAcZ,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyBrB,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKrB,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;cAKrB,aAAA,EAAa,CAAA,CAAA,SAAA;;;;cAKb,WAAA,EAAW,CAAA,CAAA,SAAA;;;;cAKX,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAYpB,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;cAcpB,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;cASrB,sBAAA,EAAsB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;cAStB,cAAA,EAAc,CAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"schema.d.mts","names":[],"sources":["../src/schema.ts"],"mappings":";;;cAIa,qBAAA,EAAqB,CAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;cAuBrB,cAAA,EAAc,CAAA,CAAA,OAAA;;;;;cAEd,cAAA,EAAc,CAAA,CAAA,OAAA;;;;;;;;cASd,qBAAA,EAAqB,CAAA,CAAA,OAAA;;;;cAErB,oBAAA,EAAoB,CAAA,CAAA,OAAA;;;;cAEpB,mBAAA,EAAmB,CAAA,CAAA,OAAA;;;;;;cAEnB,eAAA,EAAe,CAAA,CAAA,OAAA;;;;;cAEf,sBAAA,EAAsB,CAAA,CAAA,OAAA;;;;;;cAEtB,kBAAA,EAAkB,CAAA,CAAA,OAAA;;;;;cAIlB,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;cAOjB,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;cAOnB,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;;;cASjB,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;;cAQjB,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;cAKpB,YAAA,EAAY,CAAA,CAAA,SAAA;;;;;;;;;;;;cASZ,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;cAOlB,oBAAA,EAAoB,CAAA,CAAA,OAAA;;;;;cAEpB,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;;;;;;;;cAYlB,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwDvB,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;;;cAef,YAAA,EAAY,CAAA,CAAA,SAAA;;;;;;;;cAcZ,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyBrB,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKrB,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;cAKrB,aAAA,EAAa,CAAA,CAAA,SAAA;;;;cAKb,WAAA,EAAW,CAAA,CAAA,SAAA;;;;cAKX,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAYpB,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;cAcpB,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;cASrB,sBAAA,EAAsB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;cAStB,cAAA,EAAc,CAAA,CAAA,SAAA"}
package/dist/schema.mjs CHANGED
@@ -20,7 +20,8 @@ const ServiceCategorySchema = z.enum([
20
20
  "dev-tools",
21
21
  "knowledge",
22
22
  "desktop",
23
- "streaming"
23
+ "streaming",
24
+ "security"
24
25
  ]);
25
26
  const MaturitySchema = z.enum([
26
27
  "stable",
@@ -1 +1 @@
1
- {"version":3,"file":"schema.mjs","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// ─── Enums ──────────────────────────────────────────────────────────────────\n\nexport const ServiceCategorySchema = z.enum([\n\t\"automation\",\n\t\"vector-db\",\n\t\"media\",\n\t\"storage\",\n\t\"database\",\n\t\"proxy\",\n\t\"monitoring\",\n\t\"browser\",\n\t\"search\",\n\t\"ai\",\n\t\"communication\",\n\t\"coding-agent\",\n\t\"social-media\",\n\t\"analytics\",\n\t\"ai-platform\",\n\t\"dev-tools\",\n\t\"knowledge\",\n\t\"desktop\",\n\t\"streaming\",\n]);\n\nexport const MaturitySchema = z.enum([\"stable\", \"beta\", \"experimental\"]);\n\nexport const PlatformSchema = z.enum([\n\t\"linux/amd64\",\n\t\"linux/arm64\",\n\t\"windows/amd64\",\n\t\"macos/amd64\",\n\t\"macos/arm64\",\n]);\n\n/** Platform for Docker image arch only (used by resolver/compose). */\nexport const ComposePlatformSchema = z.enum([\"linux/amd64\", \"linux/arm64\"]);\n\nexport const DeploymentTypeSchema = z.enum([\"docker\", \"bare-metal\"]);\n\nexport const RestartPolicySchema = z.enum([\"unless-stopped\", \"always\", \"on-failure\", \"no\"]);\n\nexport const ProxyTypeSchema = z.enum([\"none\", \"caddy\", \"traefik\"]);\n\nexport const DeploymentTargetSchema = z.enum([\"local\", \"vps\", \"homelab\", \"clawexa\"]);\n\nexport const OutputFormatSchema = z.enum([\"directory\", \"tar\", \"zip\"]);\n\n// ─── Sub-Schemas ────────────────────────────────────────────────────────────\n\nexport const PortMappingSchema = z.object({\n\thost: z.number().int().min(1).max(65535),\n\tcontainer: z.number().int().min(1).max(65535),\n\tdescription: z.string(),\n\texposed: z.boolean().default(true),\n});\n\nexport const VolumeMappingSchema = z.object({\n\tname: z.string().min(1),\n\tcontainerPath: z.string().min(1),\n\tdescription: z.string(),\n\tdriver: z.string().optional(),\n});\n\nexport const EnvVariableSchema = z.object({\n\tkey: z.string().min(1),\n\tdefaultValue: z.string(),\n\tsecret: z.boolean().default(false),\n\tdescription: z.string(),\n\trequired: z.boolean().default(true),\n\tvalidation: z.string().optional(),\n});\n\nexport const HealthCheckSchema = z.object({\n\ttest: z.string().min(1),\n\tinterval: z.string().default(\"30s\"),\n\ttimeout: z.string().default(\"10s\"),\n\tretries: z.number().int().min(1).default(3),\n\tstartPeriod: z.string().optional(),\n});\n\nexport const ResourceLimitsSchema = z.object({\n\tcpus: z.string().optional(),\n\tmemory: z.string().optional(),\n});\n\nexport const DeploySchema = z.object({\n\tresources: z\n\t\t.object({\n\t\t\tlimits: ResourceLimitsSchema.optional(),\n\t\t\treservations: ResourceLimitsSchema.optional(),\n\t\t})\n\t\t.optional(),\n});\n\nexport const SkillBindingSchema = z.object({\n\tskillId: z.string().min(1),\n\tautoInstall: z.boolean().default(true),\n\tconfigOverrides: z.record(z.string(), z.string()).optional(),\n});\n\n/** Platform for native install (linux, windows, macos — no arch). */\nexport const NativePlatformSchema = z.enum([\"linux\", \"windows\", \"macos\"]);\n\nexport const NativeRecipeSchema = z.object({\n\tplatform: NativePlatformSchema,\n\tinstallSteps: z.array(z.string()).min(1),\n\tstartCommand: z.string(),\n\tstopCommand: z.string().optional(),\n\tconfigPath: z.string().optional(),\n\tconfigTemplate: z.string().optional(),\n\tsystemdUnit: z.string().optional(),\n});\n\n// ─── Service Definition ─────────────────────────────────────────────────────\n\nexport const ServiceDefinitionSchema = z.object({\n\t// Identity\n\tid: z\n\t\t.string()\n\t\t.min(1)\n\t\t.regex(/^[a-z0-9-]+$/),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tcategory: ServiceCategorySchema,\n\ticon: z.string(),\n\n\t// Docker\n\timage: z.string().min(1),\n\timageTag: z.string().min(1),\n\tports: z.array(PortMappingSchema).default([]),\n\tvolumes: z.array(VolumeMappingSchema).default([]),\n\tenvironment: z.array(EnvVariableSchema).default([]),\n\thealthcheck: HealthCheckSchema.optional(),\n\tcommand: z.string().optional(),\n\tentrypoint: z.string().optional(),\n\tdependsOn: z.array(z.string()).default([]),\n\trestartPolicy: RestartPolicySchema.default(\"unless-stopped\"),\n\tnetworks: z.array(z.string()).default([\"openclaw-network\"]),\n\tlabels: z.record(z.string(), z.string()).optional(),\n\tdeploy: DeploySchema.optional(),\n\n\t// OpenClaw Integration\n\tskills: z.array(SkillBindingSchema).default([]),\n\topenclawEnvVars: z.array(EnvVariableSchema).default([]),\n\topenclawVolumeMounts: z.array(VolumeMappingSchema).optional(),\n\n\t// Metadata\n\tdocsUrl: z.string().url(),\n\tselfHostedDocsUrl: z.string().url().optional(),\n\ttags: z.array(z.string()).default([]),\n\tmaturity: MaturitySchema.default(\"stable\"),\n\n\t// Dependencies & Conflicts\n\trequires: z.array(z.string()).default([]),\n\trecommends: z.array(z.string()).default([]),\n\tconflictsWith: z.array(z.string()).default([]),\n\tmandatory: z.boolean().default(false).optional(),\n\tremovalWarning: z.string().optional(),\n\n\t// Platform Constraints\n\tplatforms: z.array(PlatformSchema).optional(),\n\tminMemoryMB: z.number().int().min(0).optional(),\n\tgpuRequired: z.boolean().default(false),\n\n\t// Bare-metal native (install/run on host when no Docker)\n\tnativeSupported: z.boolean().optional(),\n\tnativeRecipes: z.array(NativeRecipeSchema).optional(),\n});\n\n// ─── Skill Pack ─────────────────────────────────────────────────────────────\n\nexport const SkillPackSchema = z.object({\n\tid: z\n\t\t.string()\n\t\t.min(1)\n\t\t.regex(/^[a-z0-9-]+$/),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\trequiredServices: z.array(z.string()).min(1),\n\tskills: z.array(z.string()),\n\ticon: z.string().optional(),\n\ttags: z.array(z.string()).default([]),\n});\n\n// ─── Preset ─────────────────────────────────────────────────────────────────\n\nexport const PresetSchema = z.object({\n\tid: z\n\t\t.string()\n\t\t.min(1)\n\t\t.regex(/^[a-z0-9-]+$/),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tservices: z.array(z.string()),\n\tskillPacks: z.array(z.string()).default([]),\n\testimatedMemoryMB: z.number().int().min(0).optional(),\n});\n\n// ─── Generation Input ───────────────────────────────────────────────────────\n\nexport const GenerationInputSchema = z.object({\n\tconfigVersion: z.number().int().min(1).optional(),\n\tprojectName: z\n\t\t.string()\n\t\t.min(1)\n\t\t.max(64)\n\t\t.regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/, {\n\t\t\tmessage:\n\t\t\t\t\"Project name must be lowercase alphanumeric with hyphens, cannot start or end with hyphen\",\n\t\t}),\n\tservices: z.array(z.string()).default([]),\n\tskillPacks: z.array(z.string()).default([]),\n\tproxy: ProxyTypeSchema.default(\"none\"),\n\tdomain: z.string().optional(),\n\tgpu: z.boolean().default(false),\n\tplatform: PlatformSchema.default(\"linux/amd64\"),\n\tdeployment: DeploymentTargetSchema.default(\"local\"),\n\tdeploymentType: DeploymentTypeSchema.default(\"docker\"),\n\tgenerateSecrets: z.boolean().default(true),\n\topenclawVersion: z.string().default(\"latest\"),\n\tmonitoring: z.boolean().default(false),\n});\n\n// ─── Resolver Output ────────────────────────────────────────────────────────\n\nexport const ResolvedServiceSchema = z.object({\n\tdefinition: ServiceDefinitionSchema,\n\taddedBy: z.enum([\"user\", \"dependency\", \"skill-pack\", \"proxy\", \"monitoring\"]).default(\"user\"),\n});\n\nexport const AddedDependencySchema = z.object({\n\tservice: z.string(),\n\treason: z.string(),\n});\n\nexport const WarningSchema = z.object({\n\ttype: z.string(),\n\tmessage: z.string(),\n});\n\nexport const ErrorSchema = z.object({\n\ttype: z.string(),\n\tmessage: z.string(),\n});\n\nexport const ResolverOutputSchema = z.object({\n\tservices: z.array(ResolvedServiceSchema),\n\taddedDependencies: z.array(AddedDependencySchema),\n\tremovedConflicts: z.array(z.object({ service: z.string(), reason: z.string() })),\n\twarnings: z.array(WarningSchema),\n\terrors: z.array(ErrorSchema),\n\tisValid: z.boolean(),\n\testimatedMemoryMB: z.number().int().min(0),\n});\n\n// ─── Compose Options ────────────────────────────────────────────────────────\n\nexport const ComposeOptionsSchema = z.object({\n\tprojectName: z.string(),\n\tproxy: ProxyTypeSchema.default(\"none\"),\n\tdomain: z.string().optional(),\n\tgpu: z.boolean().default(false),\n\tplatform: PlatformSchema.default(\"linux/amd64\"),\n\tdeployment: DeploymentTargetSchema.default(\"local\"),\n\topenclawVersion: z.string().default(\"latest\"),\n\t/** When true, gateway gets extra_hosts so it can reach host-run (native) services. */\n\tbareMetalNativeHost: z.boolean().optional(),\n});\n\n// ─── API Request/Response ───────────────────────────────────────────────────\n\nexport const ValidateRequestSchema = z.object({\n\tservices: z.array(z.string()),\n\tskillPacks: z.array(z.string()).default([]),\n\tproxy: ProxyTypeSchema.default(\"none\"),\n\tdomain: z.string().optional(),\n\tgpu: z.boolean().default(false),\n\tplatform: PlatformSchema.default(\"linux/amd64\"),\n});\n\nexport const ValidateResponseSchema = z.object({\n\tvalid: z.boolean(),\n\tresolvedServices: z.array(z.string()),\n\taddedDependencies: z.array(AddedDependencySchema),\n\twarnings: z.array(WarningSchema),\n\tconflicts: z.array(ErrorSchema),\n\testimatedMemoryMB: z.number(),\n});\n\nexport const ApiErrorSchema = z.object({\n\terror: z.object({\n\t\tcode: z.enum([\n\t\t\t\"VALIDATION_ERROR\",\n\t\t\t\"CONFLICT_ERROR\",\n\t\t\t\"GENERATION_ERROR\",\n\t\t\t\"RATE_LIMITED\",\n\t\t\t\"INTERNAL_ERROR\",\n\t\t]),\n\t\tmessage: z.string(),\n\t\tdetails: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\tfield: z.string().optional(),\n\t\t\t\t\tmessage: z.string(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t}),\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema.mjs","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// ─── Enums ──────────────────────────────────────────────────────────────────\n\nexport const ServiceCategorySchema = z.enum([\n\t\"automation\",\n\t\"vector-db\",\n\t\"media\",\n\t\"storage\",\n\t\"database\",\n\t\"proxy\",\n\t\"monitoring\",\n\t\"browser\",\n\t\"search\",\n\t\"ai\",\n\t\"communication\",\n\t\"coding-agent\",\n\t\"social-media\",\n\t\"analytics\",\n\t\"ai-platform\",\n\t\"dev-tools\",\n\t\"knowledge\",\n\t\"desktop\",\n\t\"streaming\",\n\t\"security\",\n]);\n\nexport const MaturitySchema = z.enum([\"stable\", \"beta\", \"experimental\"]);\n\nexport const PlatformSchema = z.enum([\n\t\"linux/amd64\",\n\t\"linux/arm64\",\n\t\"windows/amd64\",\n\t\"macos/amd64\",\n\t\"macos/arm64\",\n]);\n\n/** Platform for Docker image arch only (used by resolver/compose). */\nexport const ComposePlatformSchema = z.enum([\"linux/amd64\", \"linux/arm64\"]);\n\nexport const DeploymentTypeSchema = z.enum([\"docker\", \"bare-metal\"]);\n\nexport const RestartPolicySchema = z.enum([\"unless-stopped\", \"always\", \"on-failure\", \"no\"]);\n\nexport const ProxyTypeSchema = z.enum([\"none\", \"caddy\", \"traefik\"]);\n\nexport const DeploymentTargetSchema = z.enum([\"local\", \"vps\", \"homelab\", \"clawexa\"]);\n\nexport const OutputFormatSchema = z.enum([\"directory\", \"tar\", \"zip\"]);\n\n// ─── Sub-Schemas ────────────────────────────────────────────────────────────\n\nexport const PortMappingSchema = z.object({\n\thost: z.number().int().min(1).max(65535),\n\tcontainer: z.number().int().min(1).max(65535),\n\tdescription: z.string(),\n\texposed: z.boolean().default(true),\n});\n\nexport const VolumeMappingSchema = z.object({\n\tname: z.string().min(1),\n\tcontainerPath: z.string().min(1),\n\tdescription: z.string(),\n\tdriver: z.string().optional(),\n});\n\nexport const EnvVariableSchema = z.object({\n\tkey: z.string().min(1),\n\tdefaultValue: z.string(),\n\tsecret: z.boolean().default(false),\n\tdescription: z.string(),\n\trequired: z.boolean().default(true),\n\tvalidation: z.string().optional(),\n});\n\nexport const HealthCheckSchema = z.object({\n\ttest: z.string().min(1),\n\tinterval: z.string().default(\"30s\"),\n\ttimeout: z.string().default(\"10s\"),\n\tretries: z.number().int().min(1).default(3),\n\tstartPeriod: z.string().optional(),\n});\n\nexport const ResourceLimitsSchema = z.object({\n\tcpus: z.string().optional(),\n\tmemory: z.string().optional(),\n});\n\nexport const DeploySchema = z.object({\n\tresources: z\n\t\t.object({\n\t\t\tlimits: ResourceLimitsSchema.optional(),\n\t\t\treservations: ResourceLimitsSchema.optional(),\n\t\t})\n\t\t.optional(),\n});\n\nexport const SkillBindingSchema = z.object({\n\tskillId: z.string().min(1),\n\tautoInstall: z.boolean().default(true),\n\tconfigOverrides: z.record(z.string(), z.string()).optional(),\n});\n\n/** Platform for native install (linux, windows, macos — no arch). */\nexport const NativePlatformSchema = z.enum([\"linux\", \"windows\", \"macos\"]);\n\nexport const NativeRecipeSchema = z.object({\n\tplatform: NativePlatformSchema,\n\tinstallSteps: z.array(z.string()).min(1),\n\tstartCommand: z.string(),\n\tstopCommand: z.string().optional(),\n\tconfigPath: z.string().optional(),\n\tconfigTemplate: z.string().optional(),\n\tsystemdUnit: z.string().optional(),\n});\n\n// ─── Service Definition ─────────────────────────────────────────────────────\n\nexport const ServiceDefinitionSchema = z.object({\n\t// Identity\n\tid: z\n\t\t.string()\n\t\t.min(1)\n\t\t.regex(/^[a-z0-9-]+$/),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tcategory: ServiceCategorySchema,\n\ticon: z.string(),\n\n\t// Docker\n\timage: z.string().min(1),\n\timageTag: z.string().min(1),\n\tports: z.array(PortMappingSchema).default([]),\n\tvolumes: z.array(VolumeMappingSchema).default([]),\n\tenvironment: z.array(EnvVariableSchema).default([]),\n\thealthcheck: HealthCheckSchema.optional(),\n\tcommand: z.string().optional(),\n\tentrypoint: z.string().optional(),\n\tdependsOn: z.array(z.string()).default([]),\n\trestartPolicy: RestartPolicySchema.default(\"unless-stopped\"),\n\tnetworks: z.array(z.string()).default([\"openclaw-network\"]),\n\tlabels: z.record(z.string(), z.string()).optional(),\n\tdeploy: DeploySchema.optional(),\n\n\t// OpenClaw Integration\n\tskills: z.array(SkillBindingSchema).default([]),\n\topenclawEnvVars: z.array(EnvVariableSchema).default([]),\n\topenclawVolumeMounts: z.array(VolumeMappingSchema).optional(),\n\n\t// Metadata\n\tdocsUrl: z.string().url(),\n\tselfHostedDocsUrl: z.string().url().optional(),\n\ttags: z.array(z.string()).default([]),\n\tmaturity: MaturitySchema.default(\"stable\"),\n\n\t// Dependencies & Conflicts\n\trequires: z.array(z.string()).default([]),\n\trecommends: z.array(z.string()).default([]),\n\tconflictsWith: z.array(z.string()).default([]),\n\tmandatory: z.boolean().default(false).optional(),\n\tremovalWarning: z.string().optional(),\n\n\t// Platform Constraints\n\tplatforms: z.array(PlatformSchema).optional(),\n\tminMemoryMB: z.number().int().min(0).optional(),\n\tgpuRequired: z.boolean().default(false),\n\n\t// Bare-metal native (install/run on host when no Docker)\n\tnativeSupported: z.boolean().optional(),\n\tnativeRecipes: z.array(NativeRecipeSchema).optional(),\n});\n\n// ─── Skill Pack ─────────────────────────────────────────────────────────────\n\nexport const SkillPackSchema = z.object({\n\tid: z\n\t\t.string()\n\t\t.min(1)\n\t\t.regex(/^[a-z0-9-]+$/),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\trequiredServices: z.array(z.string()).min(1),\n\tskills: z.array(z.string()),\n\ticon: z.string().optional(),\n\ttags: z.array(z.string()).default([]),\n});\n\n// ─── Preset ─────────────────────────────────────────────────────────────────\n\nexport const PresetSchema = z.object({\n\tid: z\n\t\t.string()\n\t\t.min(1)\n\t\t.regex(/^[a-z0-9-]+$/),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tservices: z.array(z.string()),\n\tskillPacks: z.array(z.string()).default([]),\n\testimatedMemoryMB: z.number().int().min(0).optional(),\n});\n\n// ─── Generation Input ───────────────────────────────────────────────────────\n\nexport const GenerationInputSchema = z.object({\n\tconfigVersion: z.number().int().min(1).optional(),\n\tprojectName: z\n\t\t.string()\n\t\t.min(1)\n\t\t.max(64)\n\t\t.regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/, {\n\t\t\tmessage:\n\t\t\t\t\"Project name must be lowercase alphanumeric with hyphens, cannot start or end with hyphen\",\n\t\t}),\n\tservices: z.array(z.string()).default([]),\n\tskillPacks: z.array(z.string()).default([]),\n\tproxy: ProxyTypeSchema.default(\"none\"),\n\tdomain: z.string().optional(),\n\tgpu: z.boolean().default(false),\n\tplatform: PlatformSchema.default(\"linux/amd64\"),\n\tdeployment: DeploymentTargetSchema.default(\"local\"),\n\tdeploymentType: DeploymentTypeSchema.default(\"docker\"),\n\tgenerateSecrets: z.boolean().default(true),\n\topenclawVersion: z.string().default(\"latest\"),\n\tmonitoring: z.boolean().default(false),\n});\n\n// ─── Resolver Output ────────────────────────────────────────────────────────\n\nexport const ResolvedServiceSchema = z.object({\n\tdefinition: ServiceDefinitionSchema,\n\taddedBy: z.enum([\"user\", \"dependency\", \"skill-pack\", \"proxy\", \"monitoring\"]).default(\"user\"),\n});\n\nexport const AddedDependencySchema = z.object({\n\tservice: z.string(),\n\treason: z.string(),\n});\n\nexport const WarningSchema = z.object({\n\ttype: z.string(),\n\tmessage: z.string(),\n});\n\nexport const ErrorSchema = z.object({\n\ttype: z.string(),\n\tmessage: z.string(),\n});\n\nexport const ResolverOutputSchema = z.object({\n\tservices: z.array(ResolvedServiceSchema),\n\taddedDependencies: z.array(AddedDependencySchema),\n\tremovedConflicts: z.array(z.object({ service: z.string(), reason: z.string() })),\n\twarnings: z.array(WarningSchema),\n\terrors: z.array(ErrorSchema),\n\tisValid: z.boolean(),\n\testimatedMemoryMB: z.number().int().min(0),\n});\n\n// ─── Compose Options ────────────────────────────────────────────────────────\n\nexport const ComposeOptionsSchema = z.object({\n\tprojectName: z.string(),\n\tproxy: ProxyTypeSchema.default(\"none\"),\n\tdomain: z.string().optional(),\n\tgpu: z.boolean().default(false),\n\tplatform: PlatformSchema.default(\"linux/amd64\"),\n\tdeployment: DeploymentTargetSchema.default(\"local\"),\n\topenclawVersion: z.string().default(\"latest\"),\n\t/** When true, gateway gets extra_hosts so it can reach host-run (native) services. */\n\tbareMetalNativeHost: z.boolean().optional(),\n});\n\n// ─── API Request/Response ───────────────────────────────────────────────────\n\nexport const ValidateRequestSchema = z.object({\n\tservices: z.array(z.string()),\n\tskillPacks: z.array(z.string()).default([]),\n\tproxy: ProxyTypeSchema.default(\"none\"),\n\tdomain: z.string().optional(),\n\tgpu: z.boolean().default(false),\n\tplatform: PlatformSchema.default(\"linux/amd64\"),\n});\n\nexport const ValidateResponseSchema = z.object({\n\tvalid: z.boolean(),\n\tresolvedServices: z.array(z.string()),\n\taddedDependencies: z.array(AddedDependencySchema),\n\twarnings: z.array(WarningSchema),\n\tconflicts: z.array(ErrorSchema),\n\testimatedMemoryMB: z.number(),\n});\n\nexport const ApiErrorSchema = z.object({\n\terror: z.object({\n\t\tcode: z.enum([\n\t\t\t\"VALIDATION_ERROR\",\n\t\t\t\"CONFLICT_ERROR\",\n\t\t\t\"GENERATION_ERROR\",\n\t\t\t\"RATE_LIMITED\",\n\t\t\t\"INTERNAL_ERROR\",\n\t\t]),\n\t\tmessage: z.string(),\n\t\tdetails: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\tfield: z.string().optional(),\n\t\t\t\t\tmessage: z.string(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t}),\n});\n"],"mappings":";;;AAIA,MAAa,wBAAwB,EAAE,KAAK;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAa,iBAAiB,EAAE,KAAK;CAAC;CAAU;CAAQ;CAAe,CAAC;AAExE,MAAa,iBAAiB,EAAE,KAAK;CACpC;CACA;CACA;CACA;CACA;CACA,CAAC;;AAGF,MAAa,wBAAwB,EAAE,KAAK,CAAC,eAAe,cAAc,CAAC;AAE3E,MAAa,uBAAuB,EAAE,KAAK,CAAC,UAAU,aAAa,CAAC;AAEpE,MAAa,sBAAsB,EAAE,KAAK;CAAC;CAAkB;CAAU;CAAc;CAAK,CAAC;AAE3F,MAAa,kBAAkB,EAAE,KAAK;CAAC;CAAQ;CAAS;CAAU,CAAC;AAEnE,MAAa,yBAAyB,EAAE,KAAK;CAAC;CAAS;CAAO;CAAW;CAAU,CAAC;AAEpF,MAAa,qBAAqB,EAAE,KAAK;CAAC;CAAa;CAAO;CAAM,CAAC;AAIrE,MAAa,oBAAoB,EAAE,OAAO;CACzC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM;CACxC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM;CAC7C,aAAa,EAAE,QAAQ;CACvB,SAAS,EAAE,SAAS,CAAC,QAAQ,KAAK;CAClC,CAAC;AAEF,MAAa,sBAAsB,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvB,eAAe,EAAE,QAAQ,CAAC,IAAI,EAAE;CAChC,aAAa,EAAE,QAAQ;CACvB,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAa,oBAAoB,EAAE,OAAO;CACzC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE;CACtB,cAAc,EAAE,QAAQ;CACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ,MAAM;CAClC,aAAa,EAAE,QAAQ;CACvB,UAAU,EAAE,SAAS,CAAC,QAAQ,KAAK;CACnC,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC;AAEF,MAAa,oBAAoB,EAAE,OAAO;CACzC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvB,UAAU,EAAE,QAAQ,CAAC,QAAQ,MAAM;CACnC,SAAS,EAAE,QAAQ,CAAC,QAAQ,MAAM;CAClC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;CAC3C,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,CAAC;AAEF,MAAa,uBAAuB,EAAE,OAAO;CAC5C,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC3B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAa,eAAe,EAAE,OAAO,EACpC,WAAW,EACT,OAAO;CACP,QAAQ,qBAAqB,UAAU;CACvC,cAAc,qBAAqB,UAAU;CAC7C,CAAC,CACD,UAAU,EACZ,CAAC;AAEF,MAAa,qBAAqB,EAAE,OAAO;CAC1C,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC1B,aAAa,EAAE,SAAS,CAAC,QAAQ,KAAK;CACtC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC5D,CAAC;;AAGF,MAAa,uBAAuB,EAAE,KAAK;CAAC;CAAS;CAAW;CAAQ,CAAC;AAEzE,MAAa,qBAAqB,EAAE,OAAO;CAC1C,UAAU;CACV,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE;CACxC,cAAc,EAAE,QAAQ;CACxB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,gBAAgB,EAAE,QAAQ,CAAC,UAAU;CACrC,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,CAAC;AAIF,MAAa,0BAA0B,EAAE,OAAO;CAE/C,IAAI,EACF,QAAQ,CACR,IAAI,EAAE,CACN,MAAM,eAAe;CACvB,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvB,aAAa,EAAE,QAAQ;CACvB,UAAU;CACV,MAAM,EAAE,QAAQ;CAGhB,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE;CACxB,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC3B,OAAO,EAAE,MAAM,kBAAkB,CAAC,QAAQ,EAAE,CAAC;CAC7C,SAAS,EAAE,MAAM,oBAAoB,CAAC,QAAQ,EAAE,CAAC;CACjD,aAAa,EAAE,MAAM,kBAAkB,CAAC,QAAQ,EAAE,CAAC;CACnD,aAAa,kBAAkB,UAAU;CACzC,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC1C,eAAe,oBAAoB,QAAQ,iBAAiB;CAC5D,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CAC3D,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CACnD,QAAQ,aAAa,UAAU;CAG/B,QAAQ,EAAE,MAAM,mBAAmB,CAAC,QAAQ,EAAE,CAAC;CAC/C,iBAAiB,EAAE,MAAM,kBAAkB,CAAC,QAAQ,EAAE,CAAC;CACvD,sBAAsB,EAAE,MAAM,oBAAoB,CAAC,UAAU;CAG7D,SAAS,EAAE,QAAQ,CAAC,KAAK;CACzB,mBAAmB,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;CAC9C,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CACrC,UAAU,eAAe,QAAQ,SAAS;CAG1C,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC3C,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC9C,WAAW,EAAE,SAAS,CAAC,QAAQ,MAAM,CAAC,UAAU;CAChD,gBAAgB,EAAE,QAAQ,CAAC,UAAU;CAGrC,WAAW,EAAE,MAAM,eAAe,CAAC,UAAU;CAC7C,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU;CAC/C,aAAa,EAAE,SAAS,CAAC,QAAQ,MAAM;CAGvC,iBAAiB,EAAE,SAAS,CAAC,UAAU;CACvC,eAAe,EAAE,MAAM,mBAAmB,CAAC,UAAU;CACrD,CAAC;AAIF,MAAa,kBAAkB,EAAE,OAAO;CACvC,IAAI,EACF,QAAQ,CACR,IAAI,EAAE,CACN,MAAM,eAAe;CACvB,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvB,aAAa,EAAE,QAAQ;CACvB,kBAAkB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE;CAC5C,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC3B,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC3B,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CACrC,CAAC;AAIF,MAAa,eAAe,EAAE,OAAO;CACpC,IAAI,EACF,QAAQ,CACR,IAAI,EAAE,CACN,MAAM,eAAe;CACvB,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvB,aAAa,EAAE,QAAQ;CACvB,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC7B,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC3C,mBAAmB,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU;CACrD,CAAC;AAIF,MAAa,wBAAwB,EAAE,OAAO;CAC7C,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU;CACjD,aAAa,EACX,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,GAAG,CACP,MAAM,2CAA2C,EACjD,SACC,6FACD,CAAC;CACH,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC3C,OAAO,gBAAgB,QAAQ,OAAO;CACtC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,KAAK,EAAE,SAAS,CAAC,QAAQ,MAAM;CAC/B,UAAU,eAAe,QAAQ,cAAc;CAC/C,YAAY,uBAAuB,QAAQ,QAAQ;CACnD,gBAAgB,qBAAqB,QAAQ,SAAS;CACtD,iBAAiB,EAAE,SAAS,CAAC,QAAQ,KAAK;CAC1C,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,SAAS;CAC7C,YAAY,EAAE,SAAS,CAAC,QAAQ,MAAM;CACtC,CAAC;AAIF,MAAa,wBAAwB,EAAE,OAAO;CAC7C,YAAY;CACZ,SAAS,EAAE,KAAK;EAAC;EAAQ;EAAc;EAAc;EAAS;EAAa,CAAC,CAAC,QAAQ,OAAO;CAC5F,CAAC;AAEF,MAAa,wBAAwB,EAAE,OAAO;CAC7C,SAAS,EAAE,QAAQ;CACnB,QAAQ,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAa,gBAAgB,EAAE,OAAO;CACrC,MAAM,EAAE,QAAQ;CAChB,SAAS,EAAE,QAAQ;CACnB,CAAC;AAEF,MAAa,cAAc,EAAE,OAAO;CACnC,MAAM,EAAE,QAAQ;CAChB,SAAS,EAAE,QAAQ;CACnB,CAAC;AAEF,MAAa,uBAAuB,EAAE,OAAO;CAC5C,UAAU,EAAE,MAAM,sBAAsB;CACxC,mBAAmB,EAAE,MAAM,sBAAsB;CACjD,kBAAkB,EAAE,MAAM,EAAE,OAAO;EAAE,SAAS,EAAE,QAAQ;EAAE,QAAQ,EAAE,QAAQ;EAAE,CAAC,CAAC;CAChF,UAAU,EAAE,MAAM,cAAc;CAChC,QAAQ,EAAE,MAAM,YAAY;CAC5B,SAAS,EAAE,SAAS;CACpB,mBAAmB,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;CAC1C,CAAC;AAIF,MAAa,uBAAuB,EAAE,OAAO;CAC5C,aAAa,EAAE,QAAQ;CACvB,OAAO,gBAAgB,QAAQ,OAAO;CACtC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,KAAK,EAAE,SAAS,CAAC,QAAQ,MAAM;CAC/B,UAAU,eAAe,QAAQ,cAAc;CAC/C,YAAY,uBAAuB,QAAQ,QAAQ;CACnD,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,SAAS;CAE7C,qBAAqB,EAAE,SAAS,CAAC,UAAU;CAC3C,CAAC;AAIF,MAAa,wBAAwB,EAAE,OAAO;CAC7C,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC7B,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC3C,OAAO,gBAAgB,QAAQ,OAAO;CACtC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,KAAK,EAAE,SAAS,CAAC,QAAQ,MAAM;CAC/B,UAAU,eAAe,QAAQ,cAAc;CAC/C,CAAC;AAEF,MAAa,yBAAyB,EAAE,OAAO;CAC9C,OAAO,EAAE,SAAS;CAClB,kBAAkB,EAAE,MAAM,EAAE,QAAQ,CAAC;CACrC,mBAAmB,EAAE,MAAM,sBAAsB;CACjD,UAAU,EAAE,MAAM,cAAc;CAChC,WAAW,EAAE,MAAM,YAAY;CAC/B,mBAAmB,EAAE,QAAQ;CAC7B,CAAC;AAEF,MAAa,iBAAiB,EAAE,OAAO,EACtC,OAAO,EAAE,OAAO;CACf,MAAM,EAAE,KAAK;EACZ;EACA;EACA;EACA;EACA;EACA,CAAC;CACF,SAAS,EAAE,QAAQ;CACnB,SAAS,EACP,MACA,EAAE,OAAO;EACR,OAAO,EAAE,QAAQ,CAAC,UAAU;EAC5B,SAAS,EAAE,QAAQ;EACnB,CAAC,CACF,CACA,UAAU;CACZ,CAAC,EACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ServiceDefinition } from "../../types.mjs";
2
+
3
+ //#region src/services/definitions/hexstrike.d.ts
4
+ declare const hexstrikeDefinition: ServiceDefinition;
5
+ //#endregion
6
+ export { hexstrikeDefinition };
7
+ //# sourceMappingURL=hexstrike.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexstrike.d.mts","names":[],"sources":["../../../src/services/definitions/hexstrike.ts"],"mappings":";;;cAEa,mBAAA,EAAqB,iBAAA"}
@@ -0,0 +1,44 @@
1
+ //#region src/services/definitions/hexstrike.ts
2
+ const hexstrikeDefinition = {
3
+ id: "hexstrike",
4
+ name: "HexStrike AI",
5
+ description: "AI-Powered MCP Cybersecurity Automation Platform with 150+ pentesting tools.",
6
+ category: "security",
7
+ icon: "⚔️",
8
+ image: "ghcr.io/0x4m4/hexstrike-ai",
9
+ imageTag: "latest",
10
+ ports: [{
11
+ host: 8888,
12
+ container: 8888,
13
+ description: "HexStrike MCP Server",
14
+ exposed: true
15
+ }],
16
+ volumes: [],
17
+ environment: [],
18
+ command: "mcp",
19
+ dependsOn: [],
20
+ restartPolicy: "unless-stopped",
21
+ networks: ["openclaw-network"],
22
+ skills: [{
23
+ skillId: "hexstrike-mcp",
24
+ autoInstall: true
25
+ }],
26
+ openclawEnvVars: [],
27
+ docsUrl: "https://github.com/0x4m4/hexstrike-ai",
28
+ tags: [
29
+ "security",
30
+ "pentesting",
31
+ "mcp",
32
+ "agent"
33
+ ],
34
+ maturity: "experimental",
35
+ requires: [],
36
+ recommends: [],
37
+ conflictsWith: [],
38
+ minMemoryMB: 2048,
39
+ gpuRequired: false
40
+ };
41
+
42
+ //#endregion
43
+ export { hexstrikeDefinition };
44
+ //# sourceMappingURL=hexstrike.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexstrike.mjs","names":[],"sources":["../../../src/services/definitions/hexstrike.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const hexstrikeDefinition: ServiceDefinition = {\n\tid: \"hexstrike\",\n\tname: \"HexStrike AI\",\n\tdescription: \"AI-Powered MCP Cybersecurity Automation Platform with 150+ pentesting tools.\",\n\tcategory: \"security\",\n\ticon: \"⚔️\",\n\n\timage: \"ghcr.io/0x4m4/hexstrike-ai\",\n\timageTag: \"latest\",\n\tports: [\n\t\t{\n\t\t\thost: 8888,\n\t\t\tcontainer: 8888,\n\t\t\tdescription: \"HexStrike MCP Server\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [],\n\tcommand: \"mcp\", // Instructs standard Python/Docker runtime to serve the MCP endpoint\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [{ skillId: \"hexstrike-mcp\", autoInstall: true }],\n\topenclawEnvVars: [],\n\n\tdocsUrl: \"https://github.com/0x4m4/hexstrike-ai\",\n\ttags: [\"security\", \"pentesting\", \"mcp\", \"agent\"],\n\tmaturity: \"experimental\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 2048,\n\tgpuRequired: false,\n};\n"],"mappings":";AAEA,MAAa,sBAAyC;CACrD,IAAI;CACJ,MAAM;CACN,aAAa;CACb,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,EAAE;CACf,SAAS;CACT,WAAW,EAAE;CACb,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,CAAC;EAAE,SAAS;EAAiB,aAAa;EAAM,CAAC;CACzD,iBAAiB,EAAE;CAEnB,SAAS;CACT,MAAM;EAAC;EAAY;EAAc;EAAO;EAAQ;CAChD,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
@@ -24,6 +24,7 @@ import { geminiCliDefinition } from "./gemini-cli.mjs";
24
24
  import { giteaDefinition } from "./gitea.mjs";
25
25
  import { gotifyDefinition } from "./gotify.mjs";
26
26
  import { grafanaDefinition } from "./grafana.mjs";
27
+ import { hexstrikeDefinition } from "./hexstrike.mjs";
27
28
  import { kimiDefinition } from "./kimi.mjs";
28
29
  import { lasuiteMeetAgentsDefinition } from "./lasuite-meet-agents.mjs";
29
30
  import { lasuiteMeetBackendDefinition } from "./lasuite-meet-backend.mjs";
@@ -50,6 +51,8 @@ import { opencodeDefinition } from "./opencode.mjs";
50
51
  import { openpanelDefinition } from "./openpanel.mjs";
51
52
  import { outlineDefinition } from "./outline.mjs";
52
53
  import { paperlessNgxDefinition } from "./paperless-ngx.mjs";
54
+ import { pentagiDefinition } from "./pentagi.mjs";
55
+ import { pentestagentDefinition } from "./pentestagent.mjs";
53
56
  import { playwrightServerDefinition } from "./playwright-server.mjs";
54
57
  import { portainerDefinition } from "./portainer.mjs";
55
58
  import { postgresqlDefinition } from "./postgresql.mjs";
@@ -59,7 +62,9 @@ import { qdrantDefinition } from "./qdrant.mjs";
59
62
  import { redisDefinition } from "./redis.mjs";
60
63
  import { remotionDefinition } from "./remotion.mjs";
61
64
  import { rocketchatDefinition } from "./rocketchat.mjs";
65
+ import { scraplingDefinition } from "./scrapling.mjs";
62
66
  import { searxngDefinition } from "./searxng.mjs";
67
+ import { solidityGuardDefinition } from "./solidityguard.mjs";
63
68
  import { stableDiffusionDefinition } from "./stable-diffusion.mjs";
64
69
  import { steelBrowserDefinition } from "./steel-browser.mjs";
65
70
  import { streamGatewayDefinition } from "./stream-gateway.mjs";
@@ -78,5 +83,5 @@ import { xyopsDefinition } from "./xyops.mjs";
78
83
  //#region src/services/definitions/index.d.ts
79
84
  declare const allServiceDefinitions: ServiceDefinition[];
80
85
  //#endregion
81
- export { allServiceDefinitions, anythingLlmDefinition, appflowyDefinition, beszelDefinition, browserlessDefinition, caddyDefinition, calComDefinition, chromadbDefinition, claudeCodeDefinition, codeServerDefinition, codexDefinition, comfyuiDefinition, convexDashboardDefinition, convexDefinition, coolifyDefinition, desktopEnvironmentDefinition, difyDefinition, docsgptDefinition, dokployDefinition, dozzleDefinition, ffmpegDefinition, flowiseDefinition, geminiCliDefinition, giteaDefinition, gotifyDefinition, grafanaDefinition, kimiDefinition, lasuiteMeetAgentsDefinition, lasuiteMeetBackendDefinition, lasuiteMeetFrontendDefinition, librechatDefinition, lightpandaDefinition, litellmDefinition, livekitDefinition, matomoDefinition, matrixSynapseDefinition, mattermostDefinition, meilisearchDefinition, minioDefinition, missionControlDefinition, mixpostDefinition, motionCanvasDefinition, n8nDefinition, neo4jDefinition, nocodbDefinition, ntfyDefinition, ollamaDefinition, openWebuiDefinition, opencodeDefinition, openpanelDefinition, outlineDefinition, paperlessNgxDefinition, playwrightServerDefinition, portainerDefinition, postgresqlDefinition, postizDefinition, prometheusDefinition, qdrantDefinition, redisDefinition, remotionDefinition, rocketchatDefinition, searxngDefinition, stableDiffusionDefinition, steelBrowserDefinition, streamGatewayDefinition, tailscaleDefinition, temporalDefinition, traefikDefinition, umamiDefinition, uptimeKumaDefinition, usesendDefinition, valkeyDefinition, watchtowerDefinition, weaviateDefinition, whisperDefinition, xyopsDefinition };
86
+ export { allServiceDefinitions, anythingLlmDefinition, appflowyDefinition, beszelDefinition, browserlessDefinition, caddyDefinition, calComDefinition, chromadbDefinition, claudeCodeDefinition, codeServerDefinition, codexDefinition, comfyuiDefinition, convexDashboardDefinition, convexDefinition, coolifyDefinition, desktopEnvironmentDefinition, difyDefinition, docsgptDefinition, dokployDefinition, dozzleDefinition, ffmpegDefinition, flowiseDefinition, geminiCliDefinition, giteaDefinition, gotifyDefinition, grafanaDefinition, hexstrikeDefinition, kimiDefinition, lasuiteMeetAgentsDefinition, lasuiteMeetBackendDefinition, lasuiteMeetFrontendDefinition, librechatDefinition, lightpandaDefinition, litellmDefinition, livekitDefinition, matomoDefinition, matrixSynapseDefinition, mattermostDefinition, meilisearchDefinition, minioDefinition, missionControlDefinition, mixpostDefinition, motionCanvasDefinition, n8nDefinition, neo4jDefinition, nocodbDefinition, ntfyDefinition, ollamaDefinition, openWebuiDefinition, opencodeDefinition, openpanelDefinition, outlineDefinition, paperlessNgxDefinition, pentagiDefinition, pentestagentDefinition, playwrightServerDefinition, portainerDefinition, postgresqlDefinition, postizDefinition, prometheusDefinition, qdrantDefinition, redisDefinition, remotionDefinition, rocketchatDefinition, scraplingDefinition, searxngDefinition, solidityGuardDefinition, stableDiffusionDefinition, steelBrowserDefinition, streamGatewayDefinition, tailscaleDefinition, temporalDefinition, traefikDefinition, umamiDefinition, uptimeKumaDefinition, usesendDefinition, valkeyDefinition, watchtowerDefinition, weaviateDefinition, whisperDefinition, xyopsDefinition };
82
87
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/definitions/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyJa,qBAAA,EAAuB,iBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/definitions/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmKa,qBAAA,EAAuB,iBAAA"}
@@ -23,6 +23,7 @@ import { geminiCliDefinition } from "./gemini-cli.mjs";
23
23
  import { giteaDefinition } from "./gitea.mjs";
24
24
  import { gotifyDefinition } from "./gotify.mjs";
25
25
  import { grafanaDefinition } from "./grafana.mjs";
26
+ import { hexstrikeDefinition } from "./hexstrike.mjs";
26
27
  import { kimiDefinition } from "./kimi.mjs";
27
28
  import { lasuiteMeetAgentsDefinition } from "./lasuite-meet-agents.mjs";
28
29
  import { lasuiteMeetBackendDefinition } from "./lasuite-meet-backend.mjs";
@@ -49,6 +50,8 @@ import { opencodeDefinition } from "./opencode.mjs";
49
50
  import { openpanelDefinition } from "./openpanel.mjs";
50
51
  import { outlineDefinition } from "./outline.mjs";
51
52
  import { paperlessNgxDefinition } from "./paperless-ngx.mjs";
53
+ import { pentagiDefinition } from "./pentagi.mjs";
54
+ import { pentestagentDefinition } from "./pentestagent.mjs";
52
55
  import { playwrightServerDefinition } from "./playwright-server.mjs";
53
56
  import { portainerDefinition } from "./portainer.mjs";
54
57
  import { postgresqlDefinition } from "./postgresql.mjs";
@@ -58,7 +61,9 @@ import { qdrantDefinition } from "./qdrant.mjs";
58
61
  import { redisDefinition } from "./redis.mjs";
59
62
  import { remotionDefinition } from "./remotion.mjs";
60
63
  import { rocketchatDefinition } from "./rocketchat.mjs";
64
+ import { scraplingDefinition } from "./scrapling.mjs";
61
65
  import { searxngDefinition } from "./searxng.mjs";
66
+ import { solidityGuardDefinition } from "./solidityguard.mjs";
62
67
  import { stableDiffusionDefinition } from "./stable-diffusion.mjs";
63
68
  import { steelBrowserDefinition } from "./steel-browser.mjs";
64
69
  import { streamGatewayDefinition } from "./stream-gateway.mjs";
@@ -150,9 +155,14 @@ const allServiceDefinitions = [
150
155
  streamGatewayDefinition,
151
156
  neo4jDefinition,
152
157
  calComDefinition,
153
- xyopsDefinition
158
+ xyopsDefinition,
159
+ scraplingDefinition,
160
+ hexstrikeDefinition,
161
+ solidityGuardDefinition,
162
+ pentagiDefinition,
163
+ pentestagentDefinition
154
164
  ];
155
165
 
156
166
  //#endregion
157
- export { allServiceDefinitions, anythingLlmDefinition, appflowyDefinition, beszelDefinition, browserlessDefinition, caddyDefinition, calComDefinition, chromadbDefinition, claudeCodeDefinition, codeServerDefinition, codexDefinition, comfyuiDefinition, convexDashboardDefinition, convexDefinition, coolifyDefinition, desktopEnvironmentDefinition, difyDefinition, docsgptDefinition, dokployDefinition, dozzleDefinition, ffmpegDefinition, flowiseDefinition, geminiCliDefinition, giteaDefinition, gotifyDefinition, grafanaDefinition, kimiDefinition, lasuiteMeetAgentsDefinition, lasuiteMeetBackendDefinition, lasuiteMeetFrontendDefinition, librechatDefinition, lightpandaDefinition, litellmDefinition, livekitDefinition, matomoDefinition, matrixSynapseDefinition, mattermostDefinition, meilisearchDefinition, minioDefinition, missionControlDefinition, mixpostDefinition, motionCanvasDefinition, n8nDefinition, neo4jDefinition, nocodbDefinition, ntfyDefinition, ollamaDefinition, openWebuiDefinition, opencodeDefinition, openpanelDefinition, outlineDefinition, paperlessNgxDefinition, playwrightServerDefinition, portainerDefinition, postgresqlDefinition, postizDefinition, prometheusDefinition, qdrantDefinition, redisDefinition, remotionDefinition, rocketchatDefinition, searxngDefinition, stableDiffusionDefinition, steelBrowserDefinition, streamGatewayDefinition, tailscaleDefinition, temporalDefinition, traefikDefinition, umamiDefinition, uptimeKumaDefinition, usesendDefinition, valkeyDefinition, watchtowerDefinition, weaviateDefinition, whisperDefinition, xyopsDefinition };
167
+ export { allServiceDefinitions, anythingLlmDefinition, appflowyDefinition, beszelDefinition, browserlessDefinition, caddyDefinition, calComDefinition, chromadbDefinition, claudeCodeDefinition, codeServerDefinition, codexDefinition, comfyuiDefinition, convexDashboardDefinition, convexDefinition, coolifyDefinition, desktopEnvironmentDefinition, difyDefinition, docsgptDefinition, dokployDefinition, dozzleDefinition, ffmpegDefinition, flowiseDefinition, geminiCliDefinition, giteaDefinition, gotifyDefinition, grafanaDefinition, hexstrikeDefinition, kimiDefinition, lasuiteMeetAgentsDefinition, lasuiteMeetBackendDefinition, lasuiteMeetFrontendDefinition, librechatDefinition, lightpandaDefinition, litellmDefinition, livekitDefinition, matomoDefinition, matrixSynapseDefinition, mattermostDefinition, meilisearchDefinition, minioDefinition, missionControlDefinition, mixpostDefinition, motionCanvasDefinition, n8nDefinition, neo4jDefinition, nocodbDefinition, ntfyDefinition, ollamaDefinition, openWebuiDefinition, opencodeDefinition, openpanelDefinition, outlineDefinition, paperlessNgxDefinition, pentagiDefinition, pentestagentDefinition, playwrightServerDefinition, portainerDefinition, postgresqlDefinition, postizDefinition, prometheusDefinition, qdrantDefinition, redisDefinition, remotionDefinition, rocketchatDefinition, scraplingDefinition, searxngDefinition, solidityGuardDefinition, stableDiffusionDefinition, steelBrowserDefinition, streamGatewayDefinition, tailscaleDefinition, temporalDefinition, traefikDefinition, umamiDefinition, uptimeKumaDefinition, usesendDefinition, valkeyDefinition, watchtowerDefinition, weaviateDefinition, whisperDefinition, xyopsDefinition };
158
168
  //# sourceMappingURL=index.mjs.map