@better-openclaw/core 1.0.24 → 1.0.25

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 (170) hide show
  1. package/dist/addon-stack.cjs +673 -0
  2. package/dist/addon-stack.cjs.map +1 -0
  3. package/dist/addon-stack.d.cts +23 -0
  4. package/dist/addon-stack.d.cts.map +1 -0
  5. package/dist/addon-stack.d.mts +23 -0
  6. package/dist/addon-stack.d.mts.map +1 -0
  7. package/dist/addon-stack.mjs +671 -0
  8. package/dist/addon-stack.mjs.map +1 -0
  9. package/dist/addon-stack.test.cjs +349 -0
  10. package/dist/addon-stack.test.cjs.map +1 -0
  11. package/dist/addon-stack.test.d.cts +1 -0
  12. package/dist/addon-stack.test.d.mts +1 -0
  13. package/dist/addon-stack.test.mjs +349 -0
  14. package/dist/addon-stack.test.mjs.map +1 -0
  15. package/dist/bare-metal-partition.test.cjs +20 -20
  16. package/dist/bare-metal-partition.test.cjs.map +1 -1
  17. package/dist/bare-metal-partition.test.mjs +2 -2
  18. package/dist/composer.cjs +4 -0
  19. package/dist/composer.cjs.map +1 -1
  20. package/dist/composer.d.cts +24 -1
  21. package/dist/composer.d.cts.map +1 -1
  22. package/dist/composer.d.mts +24 -1
  23. package/dist/composer.d.mts.map +1 -1
  24. package/dist/composer.mjs +1 -1
  25. package/dist/composer.mjs.map +1 -1
  26. package/dist/composer.snapshot.test.cjs +20 -20
  27. package/dist/composer.snapshot.test.cjs.map +1 -1
  28. package/dist/composer.snapshot.test.mjs +2 -2
  29. package/dist/composer.test.cjs +53 -53
  30. package/dist/composer.test.cjs.map +1 -1
  31. package/dist/composer.test.mjs +2 -2
  32. package/dist/deployers/strip-host-ports.test.cjs +26 -26
  33. package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
  34. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  35. package/dist/generate.cjs +2 -2
  36. package/dist/generate.mjs +3 -3
  37. package/dist/generate.test.cjs +55 -55
  38. package/dist/generate.test.cjs.map +1 -1
  39. package/dist/generate.test.mjs +1 -1
  40. package/dist/generators/bare-metal-install.test.cjs +18 -18
  41. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  42. package/dist/generators/bare-metal-install.test.mjs +1 -1
  43. package/dist/generators/caddy.test.cjs +13 -13
  44. package/dist/generators/caddy.test.cjs.map +1 -1
  45. package/dist/generators/caddy.test.mjs +1 -1
  46. package/dist/generators/clone-repos.test.cjs +27 -27
  47. package/dist/generators/clone-repos.test.cjs.map +1 -1
  48. package/dist/generators/clone-repos.test.mjs +1 -1
  49. package/dist/generators/env.test.cjs +17 -17
  50. package/dist/generators/env.test.cjs.map +1 -1
  51. package/dist/generators/env.test.mjs +1 -1
  52. package/dist/generators/health-check.test.cjs +39 -39
  53. package/dist/generators/health-check.test.cjs.map +1 -1
  54. package/dist/generators/health-check.test.mjs +1 -1
  55. package/dist/generators/scripts.test.cjs +39 -39
  56. package/dist/generators/scripts.test.cjs.map +1 -1
  57. package/dist/generators/scripts.test.mjs +1 -1
  58. package/dist/generators/traefik.test.cjs +32 -32
  59. package/dist/generators/traefik.test.cjs.map +1 -1
  60. package/dist/generators/traefik.test.mjs +1 -1
  61. package/dist/index.cjs +20 -4
  62. package/dist/index.d.cts +5 -4
  63. package/dist/index.d.mts +5 -4
  64. package/dist/index.mjs +7 -6
  65. package/dist/migrations.test.cjs +16 -16
  66. package/dist/migrations.test.cjs.map +1 -1
  67. package/dist/migrations.test.mjs +1 -1
  68. package/dist/presets/registry.test.cjs +14 -14
  69. package/dist/presets/registry.test.cjs.map +1 -1
  70. package/dist/presets/registry.test.mjs +1 -1
  71. package/dist/resolver.test.cjs +95 -95
  72. package/dist/resolver.test.cjs.map +1 -1
  73. package/dist/resolver.test.mjs +1 -1
  74. package/dist/{schema-eX44HhRp.d.mts → schema-CKBRu-Rt.d.cts} +295 -2
  75. package/dist/schema-CKBRu-Rt.d.cts.map +1 -0
  76. package/dist/{schema-tn5RK8CM.d.cts → schema-Dn-_Jpb6.d.mts} +295 -2
  77. package/dist/schema-Dn-_Jpb6.d.mts.map +1 -0
  78. package/dist/schema.cjs +138 -1
  79. package/dist/schema.cjs.map +1 -1
  80. package/dist/schema.d.cts +2 -2
  81. package/dist/schema.d.mts +2 -2
  82. package/dist/schema.mjs +130 -2
  83. package/dist/schema.mjs.map +1 -1
  84. package/dist/schema.test.cjs +86 -86
  85. package/dist/schema.test.cjs.map +1 -1
  86. package/dist/schema.test.mjs +1 -1
  87. package/dist/services/definitions/browserless.cjs +4 -1
  88. package/dist/services/definitions/browserless.cjs.map +1 -1
  89. package/dist/services/definitions/browserless.mjs +4 -1
  90. package/dist/services/definitions/browserless.mjs.map +1 -1
  91. package/dist/services/definitions/convex.cjs +43 -1
  92. package/dist/services/definitions/convex.cjs.map +1 -1
  93. package/dist/services/definitions/convex.mjs +43 -1
  94. package/dist/services/definitions/convex.mjs.map +1 -1
  95. package/dist/services/definitions/grafana.cjs +11 -1
  96. package/dist/services/definitions/grafana.cjs.map +1 -1
  97. package/dist/services/definitions/grafana.mjs +11 -1
  98. package/dist/services/definitions/grafana.mjs.map +1 -1
  99. package/dist/services/definitions/meilisearch.cjs +11 -1
  100. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  101. package/dist/services/definitions/meilisearch.mjs +11 -1
  102. package/dist/services/definitions/meilisearch.mjs.map +1 -1
  103. package/dist/services/definitions/minio.cjs +3 -1
  104. package/dist/services/definitions/minio.cjs.map +1 -1
  105. package/dist/services/definitions/minio.mjs +3 -1
  106. package/dist/services/definitions/minio.mjs.map +1 -1
  107. package/dist/services/definitions/n8n.cjs +11 -1
  108. package/dist/services/definitions/n8n.cjs.map +1 -1
  109. package/dist/services/definitions/n8n.mjs +11 -1
  110. package/dist/services/definitions/n8n.mjs.map +1 -1
  111. package/dist/services/definitions/ollama.cjs +3 -1
  112. package/dist/services/definitions/ollama.cjs.map +1 -1
  113. package/dist/services/definitions/ollama.mjs +3 -1
  114. package/dist/services/definitions/ollama.mjs.map +1 -1
  115. package/dist/services/definitions/qdrant.cjs +3 -1
  116. package/dist/services/definitions/qdrant.cjs.map +1 -1
  117. package/dist/services/definitions/qdrant.mjs +3 -1
  118. package/dist/services/definitions/qdrant.mjs.map +1 -1
  119. package/dist/services/definitions/searxng.cjs +8 -1
  120. package/dist/services/definitions/searxng.cjs.map +1 -1
  121. package/dist/services/definitions/searxng.mjs +8 -1
  122. package/dist/services/definitions/searxng.mjs.map +1 -1
  123. package/dist/services/definitions/uptime-kuma.cjs +8 -1
  124. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  125. package/dist/services/definitions/uptime-kuma.mjs +8 -1
  126. package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
  127. package/dist/services/registry.test.cjs +36 -36
  128. package/dist/services/registry.test.cjs.map +1 -1
  129. package/dist/services/registry.test.mjs +1 -1
  130. package/dist/{vi.2VT5v0um-C_jmO7m2.mjs → test.CTcmp4Su-ClCHJ3FA.mjs} +6793 -6403
  131. package/dist/test.CTcmp4Su-ClCHJ3FA.mjs.map +1 -0
  132. package/dist/{vi.2VT5v0um-iVBt6Fyq.cjs → test.CTcmp4Su-DlzTarwH.cjs} +6793 -6403
  133. package/dist/test.CTcmp4Su-DlzTarwH.cjs.map +1 -0
  134. package/dist/track-analytics.test.cjs +28 -28
  135. package/dist/track-analytics.test.cjs.map +1 -1
  136. package/dist/track-analytics.test.mjs +1 -1
  137. package/dist/types.cjs.map +1 -1
  138. package/dist/types.d.cts +10 -2
  139. package/dist/types.d.cts.map +1 -1
  140. package/dist/types.d.mts +10 -2
  141. package/dist/types.d.mts.map +1 -1
  142. package/dist/types.mjs.map +1 -1
  143. package/dist/validator.test.cjs +15 -15
  144. package/dist/validator.test.cjs.map +1 -1
  145. package/dist/validator.test.mjs +2 -2
  146. package/dist/version-manager.test.cjs +37 -37
  147. package/dist/version-manager.test.cjs.map +1 -1
  148. package/dist/version-manager.test.mjs +1 -1
  149. package/package.json +4 -4
  150. package/src/__snapshots__/composer.snapshot.test.ts.snap +5 -0
  151. package/src/addon-stack.test.ts +490 -0
  152. package/src/addon-stack.ts +998 -0
  153. package/src/composer.ts +4 -4
  154. package/src/index.ts +20 -2
  155. package/src/schema.ts +183 -0
  156. package/src/services/definitions/browserless.ts +3 -0
  157. package/src/services/definitions/convex.ts +31 -0
  158. package/src/services/definitions/grafana.ts +9 -0
  159. package/src/services/definitions/meilisearch.ts +9 -0
  160. package/src/services/definitions/minio.ts +2 -0
  161. package/src/services/definitions/n8n.ts +9 -0
  162. package/src/services/definitions/ollama.ts +2 -0
  163. package/src/services/definitions/qdrant.ts +2 -0
  164. package/src/services/definitions/searxng.ts +3 -0
  165. package/src/services/definitions/uptime-kuma.ts +3 -0
  166. package/src/types.ts +18 -0
  167. package/dist/schema-eX44HhRp.d.mts.map +0 -1
  168. package/dist/schema-tn5RK8CM.d.cts.map +0 -1
  169. package/dist/vi.2VT5v0um-C_jmO7m2.mjs.map +0 -1
  170. package/dist/vi.2VT5v0um-iVBt6Fyq.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"qdrant.mjs","names":[],"sources":["../../../src/services/definitions/qdrant.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const qdrantDefinition: ServiceDefinition = {\n\tid: \"qdrant\",\n\tname: \"Qdrant Vector DB\",\n\tdescription:\n\t\t\"High-performance vector similarity search engine for building RAG pipelines, semantic search, and AI-powered recommendation systems.\",\n\tcategory: \"vector-db\",\n\ticon: \"🧠\",\n\n\timage: \"qdrant/qdrant\",\n\timageTag: \"v1.12.1\",\n\tports: [\n\t\t{\n\t\t\thost: 6333,\n\t\t\tcontainer: 6333,\n\t\t\tdescription: \"Qdrant REST API\",\n\t\t\texposed: true,\n\t\t},\n\t\t{\n\t\t\thost: 6334,\n\t\t\tcontainer: 6334,\n\t\t\tdescription: \"Qdrant gRPC API\",\n\t\t\texposed: false,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"qdrant-data\",\n\t\t\tcontainerPath: \"/qdrant/storage\",\n\t\t\tdescription: \"Persistent Qdrant vector storage\",\n\t\t},\n\t],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"QDRANT__SERVICE__GRPC_PORT\",\n\t\t\tdefaultValue: \"6334\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"gRPC port for Qdrant service\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"bash -c 'echo > /dev/tcp/localhost/6333' || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"10s\",\n\t},\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [{ skillId: \"qdrant-memory\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"QDRANT_HOST\",\n\t\t\tdefaultValue: \"qdrant\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Qdrant hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"QDRANT_PORT\",\n\t\t\tdefaultValue: \"6333\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Qdrant REST API port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://qdrant.tech/documentation/\",\n\ttags: [\"vector\", \"rag\", \"embeddings\", \"semantic-search\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [\"redis\"],\n\tconflictsWith: [],\n\n\tminMemoryMB: 512,\n\tgpuRequired: false,\n};\n"],"mappings":";AAEA,MAAa,mBAAsC;CAClD,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,EACD;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,CACZ;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;EAAiB,aAAa;EAAM,CAAC;CACzD,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;EAAU;EAAO;EAAc;EAAkB;CACxD,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,CAAC,QAAQ;CACrB,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
1
+ {"version":3,"file":"qdrant.mjs","names":[],"sources":["../../../src/services/definitions/qdrant.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const qdrantDefinition: ServiceDefinition = {\n\tid: \"qdrant\",\n\tname: \"Qdrant Vector DB\",\n\tdescription:\n\t\t\"High-performance vector similarity search engine for building RAG pipelines, semantic search, and AI-powered recommendation systems.\",\n\tcategory: \"vector-db\",\n\ticon: \"🧠\",\n\n\timage: \"qdrant/qdrant\",\n\timageTag: \"v1.12.1\",\n\tports: [\n\t\t{\n\t\t\thost: 6333,\n\t\t\tcontainer: 6333,\n\t\t\tdescription: \"Qdrant REST API\",\n\t\t\texposed: true,\n\t\t},\n\t\t{\n\t\t\thost: 6334,\n\t\t\tcontainer: 6334,\n\t\t\tdescription: \"Qdrant gRPC API\",\n\t\t\texposed: false,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"qdrant-data\",\n\t\t\tcontainerPath: \"/qdrant/storage\",\n\t\t\tdescription: \"Persistent Qdrant vector storage\",\n\t\t},\n\t],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"QDRANT__SERVICE__GRPC_PORT\",\n\t\t\tdefaultValue: \"6334\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"gRPC port for Qdrant service\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"bash -c 'echo > /dev/tcp/localhost/6333' || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"10s\",\n\t},\n\tdependsOn: [],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [{ skillId: \"qdrant-memory\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"QDRANT_HOST\",\n\t\t\tdefaultValue: \"qdrant\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Qdrant hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"QDRANT_PORT\",\n\t\t\tdefaultValue: \"6333\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Qdrant REST API port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://qdrant.tech/documentation/\",\n\ttags: [\"vector\", \"rag\", \"embeddings\", \"semantic-search\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [\"redis\"],\n\tconflictsWith: [],\n\n\tminMemoryMB: 512,\n\tgpuRequired: false,\n\tcapDropCompatible: true,\n\tproxyPath: \"/qdrant\",\n};\n"],"mappings":";AAEA,MAAa,mBAAsC;CAClD,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,EACD;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,CACZ;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;EAAiB,aAAa;EAAM,CAAC;CACzD,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;EAAU;EAAO;EAAc;EAAkB;CACxD,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,CAAC,QAAQ;CACrB,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX"}
@@ -58,7 +58,14 @@ const searxngDefinition = {
58
58
  recommends: ["redis"],
59
59
  conflictsWith: [],
60
60
  minMemoryMB: 256,
61
- gpuRequired: false
61
+ gpuRequired: false,
62
+ capDropCompatible: false,
63
+ proxyPath: "/searxng",
64
+ firstBootCapabilities: [
65
+ "CHOWN",
66
+ "SETGID",
67
+ "SETUID"
68
+ ]
62
69
  };
63
70
  //#endregion
64
71
  exports.searxngDefinition = searxngDefinition;
@@ -1 +1 @@
1
- {"version":3,"file":"searxng.cjs","names":[],"sources":["../../../src/services/definitions/searxng.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const searxngDefinition: ServiceDefinition = {\n\tid: \"searxng\",\n\tname: \"SearXNG\",\n\tdescription:\n\t\t\"Privacy-respecting, self-hosted metasearch engine that aggregates results from multiple search engines without tracking.\",\n\tcategory: \"search\",\n\ticon: \"🔍\",\n\n\timage: \"searxng/searxng\",\n\timageTag: \"2026.2.23-4964d664f\",\n\tports: [\n\t\t{\n\t\t\thost: 8080,\n\t\t\tcontainer: 8080,\n\t\t\tdescription: \"SearXNG web interface and API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"searxng-data\",\n\t\t\tcontainerPath: \"/etc/searxng\",\n\t\t\tdescription: \"SearXNG configuration and settings\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"wget -q --spider http://localhost:8080/ || 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: \"searxng-search\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"SEARXNG_HOST\",\n\t\t\tdefaultValue: \"searxng\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"SEARXNG_PORT\",\n\t\t\tdefaultValue: \"8080\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://docs.searxng.org/\",\n\ttags: [\"search\", \"meta-search\", \"privacy\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [\"redis\"],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n};\n"],"mappings":";;AAEA,MAAa,oBAAuC;CACnD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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;EAAkB,aAAa;EAAM,CAAC;CAC1D,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;EAAU;EAAe;EAAU;CAC1C,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,CAAC,QAAQ;CACrB,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
1
+ {"version":3,"file":"searxng.cjs","names":[],"sources":["../../../src/services/definitions/searxng.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const searxngDefinition: ServiceDefinition = {\n\tid: \"searxng\",\n\tname: \"SearXNG\",\n\tdescription:\n\t\t\"Privacy-respecting, self-hosted metasearch engine that aggregates results from multiple search engines without tracking.\",\n\tcategory: \"search\",\n\ticon: \"🔍\",\n\n\timage: \"searxng/searxng\",\n\timageTag: \"2026.2.23-4964d664f\",\n\tports: [\n\t\t{\n\t\t\thost: 8080,\n\t\t\tcontainer: 8080,\n\t\t\tdescription: \"SearXNG web interface and API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"searxng-data\",\n\t\t\tcontainerPath: \"/etc/searxng\",\n\t\t\tdescription: \"SearXNG configuration and settings\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"wget -q --spider http://localhost:8080/ || 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: \"searxng-search\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"SEARXNG_HOST\",\n\t\t\tdefaultValue: \"searxng\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"SEARXNG_PORT\",\n\t\t\tdefaultValue: \"8080\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://docs.searxng.org/\",\n\ttags: [\"search\", \"meta-search\", \"privacy\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [\"redis\"],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n\tcapDropCompatible: false,\n\tproxyPath: \"/searxng\",\n\tfirstBootCapabilities: [\"CHOWN\", \"SETGID\", \"SETUID\"],\n};\n"],"mappings":";;AAEA,MAAa,oBAAuC;CACnD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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;EAAkB,aAAa;EAAM,CAAC;CAC1D,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;EAAU;EAAe;EAAU;CAC1C,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,CAAC,QAAQ;CACrB,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX,uBAAuB;EAAC;EAAS;EAAU;EAAS;CACpD"}
@@ -57,7 +57,14 @@ const searxngDefinition = {
57
57
  recommends: ["redis"],
58
58
  conflictsWith: [],
59
59
  minMemoryMB: 256,
60
- gpuRequired: false
60
+ gpuRequired: false,
61
+ capDropCompatible: false,
62
+ proxyPath: "/searxng",
63
+ firstBootCapabilities: [
64
+ "CHOWN",
65
+ "SETGID",
66
+ "SETUID"
67
+ ]
61
68
  };
62
69
  //#endregion
63
70
  export { searxngDefinition };
@@ -1 +1 @@
1
- {"version":3,"file":"searxng.mjs","names":[],"sources":["../../../src/services/definitions/searxng.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const searxngDefinition: ServiceDefinition = {\n\tid: \"searxng\",\n\tname: \"SearXNG\",\n\tdescription:\n\t\t\"Privacy-respecting, self-hosted metasearch engine that aggregates results from multiple search engines without tracking.\",\n\tcategory: \"search\",\n\ticon: \"🔍\",\n\n\timage: \"searxng/searxng\",\n\timageTag: \"2026.2.23-4964d664f\",\n\tports: [\n\t\t{\n\t\t\thost: 8080,\n\t\t\tcontainer: 8080,\n\t\t\tdescription: \"SearXNG web interface and API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"searxng-data\",\n\t\t\tcontainerPath: \"/etc/searxng\",\n\t\t\tdescription: \"SearXNG configuration and settings\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"wget -q --spider http://localhost:8080/ || 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: \"searxng-search\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"SEARXNG_HOST\",\n\t\t\tdefaultValue: \"searxng\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"SEARXNG_PORT\",\n\t\t\tdefaultValue: \"8080\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://docs.searxng.org/\",\n\ttags: [\"search\", \"meta-search\", \"privacy\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [\"redis\"],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n};\n"],"mappings":";AAEA,MAAa,oBAAuC;CACnD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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;EAAkB,aAAa;EAAM,CAAC;CAC1D,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;EAAU;EAAe;EAAU;CAC1C,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,CAAC,QAAQ;CACrB,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
1
+ {"version":3,"file":"searxng.mjs","names":[],"sources":["../../../src/services/definitions/searxng.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const searxngDefinition: ServiceDefinition = {\n\tid: \"searxng\",\n\tname: \"SearXNG\",\n\tdescription:\n\t\t\"Privacy-respecting, self-hosted metasearch engine that aggregates results from multiple search engines without tracking.\",\n\tcategory: \"search\",\n\ticon: \"🔍\",\n\n\timage: \"searxng/searxng\",\n\timageTag: \"2026.2.23-4964d664f\",\n\tports: [\n\t\t{\n\t\t\thost: 8080,\n\t\t\tcontainer: 8080,\n\t\t\tdescription: \"SearXNG web interface and API\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"searxng-data\",\n\t\t\tcontainerPath: \"/etc/searxng\",\n\t\t\tdescription: \"SearXNG configuration and settings\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"wget -q --spider http://localhost:8080/ || 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: \"searxng-search\", autoInstall: true }],\n\topenclawEnvVars: [\n\t\t{\n\t\t\tkey: \"SEARXNG_HOST\",\n\t\t\tdefaultValue: \"searxng\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG hostname for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"SEARXNG_PORT\",\n\t\t\tdefaultValue: \"8080\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"SearXNG port for OpenClaw\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\n\tdocsUrl: \"https://docs.searxng.org/\",\n\ttags: [\"search\", \"meta-search\", \"privacy\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [\"redis\"],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n\tcapDropCompatible: false,\n\tproxyPath: \"/searxng\",\n\tfirstBootCapabilities: [\"CHOWN\", \"SETGID\", \"SETUID\"],\n};\n"],"mappings":";AAEA,MAAa,oBAAuC;CACnD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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;EAAkB,aAAa;EAAM,CAAC;CAC1D,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;EAAU;EAAe;EAAU;CAC1C,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,CAAC,QAAQ;CACrB,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX,uBAAuB;EAAC;EAAS;EAAU;EAAS;CACpD"}
@@ -44,7 +44,14 @@ const uptimeKumaDefinition = {
44
44
  recommends: [],
45
45
  conflictsWith: [],
46
46
  minMemoryMB: 256,
47
- gpuRequired: false
47
+ gpuRequired: false,
48
+ capDropCompatible: false,
49
+ proxyPath: "/uptime-kuma",
50
+ firstBootCapabilities: [
51
+ "CHOWN",
52
+ "SETGID",
53
+ "SETUID"
54
+ ]
48
55
  };
49
56
  //#endregion
50
57
  exports.uptimeKumaDefinition = uptimeKumaDefinition;
@@ -1 +1 @@
1
- {"version":3,"file":"uptime-kuma.cjs","names":[],"sources":["../../../src/services/definitions/uptime-kuma.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const uptimeKumaDefinition: ServiceDefinition = {\n\tid: \"uptime-kuma\",\n\tname: \"Uptime Kuma\",\n\tdescription:\n\t\t\"Self-hosted monitoring tool for tracking uptime of websites, APIs, and services with a sleek dashboard and multi-notification support.\",\n\tcategory: \"monitoring\",\n\ticon: \"📡\",\n\n\timage: \"louislam/uptime-kuma\",\n\timageTag: \"2\",\n\tports: [\n\t\t{\n\t\t\thost: 3001,\n\t\t\tcontainer: 3001,\n\t\t\tdescription: \"Uptime Kuma web interface\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"uptime-kuma-data\",\n\t\t\tcontainerPath: \"/app/data\",\n\t\t\tdescription: \"Persistent Uptime Kuma data and configuration\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3001 || 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\n\tdocsUrl: \"https://github.com/louislam/uptime-kuma/wiki\",\n\ttags: [\"uptime\", \"monitoring\", \"status-page\", \"alerts\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n};\n"],"mappings":";;AAEA,MAAa,uBAA0C;CACtD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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,EAAE;CAEnB,SAAS;CACT,MAAM;EAAC;EAAU;EAAc;EAAe;EAAS;CACvD,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
1
+ {"version":3,"file":"uptime-kuma.cjs","names":[],"sources":["../../../src/services/definitions/uptime-kuma.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const uptimeKumaDefinition: ServiceDefinition = {\n\tid: \"uptime-kuma\",\n\tname: \"Uptime Kuma\",\n\tdescription:\n\t\t\"Self-hosted monitoring tool for tracking uptime of websites, APIs, and services with a sleek dashboard and multi-notification support.\",\n\tcategory: \"monitoring\",\n\ticon: \"📡\",\n\n\timage: \"louislam/uptime-kuma\",\n\timageTag: \"2\",\n\tports: [\n\t\t{\n\t\t\thost: 3001,\n\t\t\tcontainer: 3001,\n\t\t\tdescription: \"Uptime Kuma web interface\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"uptime-kuma-data\",\n\t\t\tcontainerPath: \"/app/data\",\n\t\t\tdescription: \"Persistent Uptime Kuma data and configuration\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3001 || 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\n\tdocsUrl: \"https://github.com/louislam/uptime-kuma/wiki\",\n\ttags: [\"uptime\", \"monitoring\", \"status-page\", \"alerts\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n\tcapDropCompatible: false,\n\tproxyPath: \"/uptime-kuma\",\n\tfirstBootCapabilities: [\"CHOWN\", \"SETGID\", \"SETUID\"],\n};\n"],"mappings":";;AAEA,MAAa,uBAA0C;CACtD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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,EAAE;CAEnB,SAAS;CACT,MAAM;EAAC;EAAU;EAAc;EAAe;EAAS;CACvD,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX,uBAAuB;EAAC;EAAS;EAAU;EAAS;CACpD"}
@@ -43,7 +43,14 @@ const uptimeKumaDefinition = {
43
43
  recommends: [],
44
44
  conflictsWith: [],
45
45
  minMemoryMB: 256,
46
- gpuRequired: false
46
+ gpuRequired: false,
47
+ capDropCompatible: false,
48
+ proxyPath: "/uptime-kuma",
49
+ firstBootCapabilities: [
50
+ "CHOWN",
51
+ "SETGID",
52
+ "SETUID"
53
+ ]
47
54
  };
48
55
  //#endregion
49
56
  export { uptimeKumaDefinition };
@@ -1 +1 @@
1
- {"version":3,"file":"uptime-kuma.mjs","names":[],"sources":["../../../src/services/definitions/uptime-kuma.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const uptimeKumaDefinition: ServiceDefinition = {\n\tid: \"uptime-kuma\",\n\tname: \"Uptime Kuma\",\n\tdescription:\n\t\t\"Self-hosted monitoring tool for tracking uptime of websites, APIs, and services with a sleek dashboard and multi-notification support.\",\n\tcategory: \"monitoring\",\n\ticon: \"📡\",\n\n\timage: \"louislam/uptime-kuma\",\n\timageTag: \"2\",\n\tports: [\n\t\t{\n\t\t\thost: 3001,\n\t\t\tcontainer: 3001,\n\t\t\tdescription: \"Uptime Kuma web interface\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"uptime-kuma-data\",\n\t\t\tcontainerPath: \"/app/data\",\n\t\t\tdescription: \"Persistent Uptime Kuma data and configuration\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3001 || 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\n\tdocsUrl: \"https://github.com/louislam/uptime-kuma/wiki\",\n\ttags: [\"uptime\", \"monitoring\", \"status-page\", \"alerts\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n};\n"],"mappings":";AAEA,MAAa,uBAA0C;CACtD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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,EAAE;CAEnB,SAAS;CACT,MAAM;EAAC;EAAU;EAAc;EAAe;EAAS;CACvD,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
1
+ {"version":3,"file":"uptime-kuma.mjs","names":[],"sources":["../../../src/services/definitions/uptime-kuma.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const uptimeKumaDefinition: ServiceDefinition = {\n\tid: \"uptime-kuma\",\n\tname: \"Uptime Kuma\",\n\tdescription:\n\t\t\"Self-hosted monitoring tool for tracking uptime of websites, APIs, and services with a sleek dashboard and multi-notification support.\",\n\tcategory: \"monitoring\",\n\ticon: \"📡\",\n\n\timage: \"louislam/uptime-kuma\",\n\timageTag: \"2\",\n\tports: [\n\t\t{\n\t\t\thost: 3001,\n\t\t\tcontainer: 3001,\n\t\t\tdescription: \"Uptime Kuma web interface\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [\n\t\t{\n\t\t\tname: \"uptime-kuma-data\",\n\t\t\tcontainerPath: \"/app/data\",\n\t\t\tdescription: \"Persistent Uptime Kuma data and configuration\",\n\t\t},\n\t],\n\tenvironment: [],\n\thealthcheck: {\n\t\ttest: \"curl -sf http://localhost:3001 || 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\n\tdocsUrl: \"https://github.com/louislam/uptime-kuma/wiki\",\n\ttags: [\"uptime\", \"monitoring\", \"status-page\", \"alerts\"],\n\tmaturity: \"stable\",\n\n\trequires: [],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 256,\n\tgpuRequired: false,\n\tcapDropCompatible: false,\n\tproxyPath: \"/uptime-kuma\",\n\tfirstBootCapabilities: [\"CHOWN\", \"SETGID\", \"SETUID\"],\n};\n"],"mappings":";AAEA,MAAa,uBAA0C;CACtD,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,CACR;EACC,MAAM;EACN,eAAe;EACf,aAAa;EACb,CACD;CACD,aAAa,EAAE;CACf,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,EAAE;CAEnB,SAAS;CACT,MAAM;EAAC;EAAU;EAAc;EAAe;EAAS;CACvD,UAAU;CAEV,UAAU,EAAE;CACZ,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX,uBAAuB;EAAC;EAAS;EAAU;EAAS;CACpD"}
@@ -1,55 +1,55 @@
1
- const require_vi_2VT5v0um = require("../vi.2VT5v0um-iVBt6Fyq.cjs");
1
+ const require_test_CTcmp4Su = require("../test.CTcmp4Su-DlzTarwH.cjs");
2
2
  const require_services_registry = require("./registry.cjs");
3
3
  //#region src/services/registry.test.ts
4
- require_vi_2VT5v0um.describe("service registry", () => {
5
- require_vi_2VT5v0um.it("has at least 60 services registered", () => {
6
- require_vi_2VT5v0um.globalExpect(require_services_registry.getAllServices().length).toBeGreaterThanOrEqual(60);
4
+ require_test_CTcmp4Su.describe("service registry", () => {
5
+ require_test_CTcmp4Su.it("has at least 60 services registered", () => {
6
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getAllServices().length).toBeGreaterThanOrEqual(60);
7
7
  });
8
- require_vi_2VT5v0um.it("finds redis by ID", () => {
8
+ require_test_CTcmp4Su.it("finds redis by ID", () => {
9
9
  const redis = require_services_registry.getServiceById("redis");
10
- require_vi_2VT5v0um.globalExpect(redis).toBeDefined();
11
- require_vi_2VT5v0um.globalExpect(redis.id).toBe("redis");
12
- require_vi_2VT5v0um.globalExpect(redis.name).toBe("Redis");
10
+ require_test_CTcmp4Su.globalExpect(redis).toBeDefined();
11
+ require_test_CTcmp4Su.globalExpect(redis.id).toBe("redis");
12
+ require_test_CTcmp4Su.globalExpect(redis.name).toBe("Redis");
13
13
  });
14
- require_vi_2VT5v0um.it("returns undefined for unknown ID", () => {
15
- require_vi_2VT5v0um.globalExpect(require_services_registry.getServiceById("nonexistent")).toBeUndefined();
14
+ require_test_CTcmp4Su.it("returns undefined for unknown ID", () => {
15
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getServiceById("nonexistent")).toBeUndefined();
16
16
  });
17
- require_vi_2VT5v0um.it("finds tailscale and it is mandatory", () => {
17
+ require_test_CTcmp4Su.it("finds tailscale and it is mandatory", () => {
18
18
  const tailscale = require_services_registry.getServiceById("tailscale");
19
- require_vi_2VT5v0um.globalExpect(tailscale).toBeDefined();
20
- require_vi_2VT5v0um.globalExpect(tailscale.id).toBe("tailscale");
21
- require_vi_2VT5v0um.globalExpect(tailscale.mandatory).toBe(true);
19
+ require_test_CTcmp4Su.globalExpect(tailscale).toBeDefined();
20
+ require_test_CTcmp4Su.globalExpect(tailscale.id).toBe("tailscale");
21
+ require_test_CTcmp4Su.globalExpect(tailscale.mandatory).toBe(true);
22
22
  });
23
- require_vi_2VT5v0um.it("finds mission-control and it is mandatory with gitSource", () => {
23
+ require_test_CTcmp4Su.it("finds mission-control and it is mandatory with gitSource", () => {
24
24
  const mc = require_services_registry.getServiceById("mission-control");
25
- require_vi_2VT5v0um.globalExpect(mc).toBeDefined();
26
- require_vi_2VT5v0um.globalExpect(mc.mandatory).toBe(true);
27
- require_vi_2VT5v0um.globalExpect(mc.gitSource).toBeDefined();
28
- require_vi_2VT5v0um.globalExpect(mc.gitSource.repoUrl).toContain("better-openclaw-mission-control");
25
+ require_test_CTcmp4Su.globalExpect(mc).toBeDefined();
26
+ require_test_CTcmp4Su.globalExpect(mc.mandatory).toBe(true);
27
+ require_test_CTcmp4Su.globalExpect(mc.gitSource).toBeDefined();
28
+ require_test_CTcmp4Su.globalExpect(mc.gitSource.repoUrl).toContain("better-openclaw-mission-control");
29
29
  });
30
- require_vi_2VT5v0um.it("finds coolify, dokploy, livekit, and La Suite Meet services by ID", () => {
31
- require_vi_2VT5v0um.globalExpect(require_services_registry.getServiceById("coolify")).toBeDefined();
32
- require_vi_2VT5v0um.globalExpect(require_services_registry.getServiceById("dokploy")).toBeDefined();
33
- require_vi_2VT5v0um.globalExpect(require_services_registry.getServiceById("livekit")).toBeDefined();
34
- require_vi_2VT5v0um.globalExpect(require_services_registry.getServiceById("lasuite-meet-backend")).toBeDefined();
35
- require_vi_2VT5v0um.globalExpect(require_services_registry.getServiceById("lasuite-meet-frontend")).toBeDefined();
36
- require_vi_2VT5v0um.globalExpect(require_services_registry.getServiceById("lasuite-meet-agents")).toBeDefined();
30
+ require_test_CTcmp4Su.it("finds coolify, dokploy, livekit, and La Suite Meet services by ID", () => {
31
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getServiceById("coolify")).toBeDefined();
32
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getServiceById("dokploy")).toBeDefined();
33
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getServiceById("livekit")).toBeDefined();
34
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getServiceById("lasuite-meet-backend")).toBeDefined();
35
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getServiceById("lasuite-meet-frontend")).toBeDefined();
36
+ require_test_CTcmp4Su.globalExpect(require_services_registry.getServiceById("lasuite-meet-agents")).toBeDefined();
37
37
  });
38
- require_vi_2VT5v0um.it("filters by category", () => {
38
+ require_test_CTcmp4Su.it("filters by category", () => {
39
39
  const databases = require_services_registry.getServicesByCategory("database");
40
- require_vi_2VT5v0um.globalExpect(databases.map((s) => s.id)).toContain("redis");
41
- require_vi_2VT5v0um.globalExpect(databases.length).toBeGreaterThanOrEqual(1);
40
+ require_test_CTcmp4Su.globalExpect(databases.map((s) => s.id)).toContain("redis");
41
+ require_test_CTcmp4Su.globalExpect(databases.length).toBeGreaterThanOrEqual(1);
42
42
  });
43
- require_vi_2VT5v0um.it("filters by tag", () => {
43
+ require_test_CTcmp4Su.it("filters by tag", () => {
44
44
  const cacheServices = require_services_registry.getServicesByTag("cache");
45
- require_vi_2VT5v0um.globalExpect(cacheServices.map((s) => s.id)).toContain("redis");
46
- require_vi_2VT5v0um.globalExpect(cacheServices.length).toBeGreaterThanOrEqual(1);
45
+ require_test_CTcmp4Su.globalExpect(cacheServices.map((s) => s.id)).toContain("redis");
46
+ require_test_CTcmp4Su.globalExpect(cacheServices.length).toBeGreaterThanOrEqual(1);
47
47
  });
48
- require_vi_2VT5v0um.it("all service IDs are unique", () => {
48
+ require_test_CTcmp4Su.it("all service IDs are unique", () => {
49
49
  const ids = require_services_registry.getAllServices().map((s) => s.id);
50
- require_vi_2VT5v0um.globalExpect(new Set(ids).size).toBe(ids.length);
50
+ require_test_CTcmp4Su.globalExpect(new Set(ids).size).toBe(ids.length);
51
51
  });
52
- require_vi_2VT5v0um.it("no two services have the same exposed host port", () => {
52
+ require_test_CTcmp4Su.it("no two services have the same exposed host port", () => {
53
53
  const services = require_services_registry.getAllServices();
54
54
  const portMap = /* @__PURE__ */ new Map();
55
55
  for (const svc of services) for (const port of svc.ports) {
@@ -61,7 +61,7 @@ require_vi_2VT5v0um.describe("service registry", () => {
61
61
  const conflicts = [];
62
62
  for (const [port, serviceIds] of portMap) if (serviceIds.length > 1) conflicts.push(`Port ${port} shared by: ${serviceIds.join(", ")}`);
63
63
  if (conflicts.length > 0) console.warn(`[informational] ${conflicts.length} port overlap(s) detected:\n ${conflicts.join("\n ")}`);
64
- require_vi_2VT5v0um.globalExpect(portMap.size).toBeGreaterThan(0);
64
+ require_test_CTcmp4Su.globalExpect(portMap.size).toBeGreaterThan(0);
65
65
  });
66
66
  });
67
67
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"registry.test.cjs","names":["describe","getAllServices","getServiceById","getServicesByCategory","getServicesByTag"],"sources":["../../src/services/registry.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tgetAllServices,\n\tgetServiceById,\n\tgetServicesByCategory,\n\tgetServicesByTag,\n} from \"../services/registry.js\";\n\ndescribe(\"service registry\", () => {\n\tit(\"has at least 60 services registered\", () => {\n\t\tconst services = getAllServices();\n\t\texpect(services.length).toBeGreaterThanOrEqual(60);\n\t});\n\n\tit(\"finds redis by ID\", () => {\n\t\tconst redis = getServiceById(\"redis\");\n\t\texpect(redis).toBeDefined();\n\t\texpect(redis!.id).toBe(\"redis\");\n\t\texpect(redis!.name).toBe(\"Redis\");\n\t});\n\n\tit(\"returns undefined for unknown ID\", () => {\n\t\tconst result = getServiceById(\"nonexistent\");\n\t\texpect(result).toBeUndefined();\n\t});\n\n\tit(\"finds tailscale and it is mandatory\", () => {\n\t\tconst tailscale = getServiceById(\"tailscale\");\n\t\texpect(tailscale).toBeDefined();\n\t\texpect(tailscale!.id).toBe(\"tailscale\");\n\t\texpect(tailscale!.mandatory).toBe(true);\n\t});\n\n\tit(\"finds mission-control and it is mandatory with gitSource\", () => {\n\t\tconst mc = getServiceById(\"mission-control\");\n\t\texpect(mc).toBeDefined();\n\t\texpect(mc!.mandatory).toBe(true);\n\t\texpect(mc!.gitSource).toBeDefined();\n\t\texpect(mc!.gitSource!.repoUrl).toContain(\"better-openclaw-mission-control\");\n\t});\n\n\tit(\"finds coolify, dokploy, livekit, and La Suite Meet services by ID\", () => {\n\t\texpect(getServiceById(\"coolify\")).toBeDefined();\n\t\texpect(getServiceById(\"dokploy\")).toBeDefined();\n\t\texpect(getServiceById(\"livekit\")).toBeDefined();\n\t\texpect(getServiceById(\"lasuite-meet-backend\")).toBeDefined();\n\t\texpect(getServiceById(\"lasuite-meet-frontend\")).toBeDefined();\n\t\texpect(getServiceById(\"lasuite-meet-agents\")).toBeDefined();\n\t});\n\n\tit(\"filters by category\", () => {\n\t\tconst databases = getServicesByCategory(\"database\");\n\t\tconst ids = databases.map((s) => s.id);\n\t\texpect(ids).toContain(\"redis\");\n\t\texpect(databases.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"filters by tag\", () => {\n\t\tconst cacheServices = getServicesByTag(\"cache\");\n\t\tconst ids = cacheServices.map((s) => s.id);\n\t\texpect(ids).toContain(\"redis\");\n\t\texpect(cacheServices.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"all service IDs are unique\", () => {\n\t\tconst services = getAllServices();\n\t\tconst ids = services.map((s) => s.id);\n\t\tconst uniqueIds = new Set(ids);\n\t\texpect(uniqueIds.size).toBe(ids.length);\n\t});\n\n\tit(\"no two services have the same exposed host port\", () => {\n\t\tconst services = getAllServices();\n\t\tconst portMap = new Map<number, string[]>();\n\n\t\tfor (const svc of services) {\n\t\t\tfor (const port of svc.ports) {\n\t\t\t\tif (!port.exposed) continue;\n\t\t\t\tconst existing = portMap.get(port.host) ?? [];\n\t\t\t\texisting.push(svc.id);\n\t\t\t\tportMap.set(port.host, existing);\n\t\t\t}\n\t\t}\n\n\t\t// Informational: log any shared ports but don't hard-fail,\n\t\t// since users may not enable all services simultaneously.\n\t\tconst conflicts: string[] = [];\n\t\tfor (const [port, serviceIds] of portMap) {\n\t\t\tif (serviceIds.length > 1) {\n\t\t\t\tconflicts.push(`Port ${port} shared by: ${serviceIds.join(\", \")}`);\n\t\t\t}\n\t\t}\n\n\t\t// This is informational — warn if there are conflicts but still pass.\n\t\t// If you want to enforce unique ports, change the next line to:\n\t\t// expect(conflicts).toHaveLength(0);\n\t\tif (conflicts.length > 0) {\n\t\t\tconsole.warn(\n\t\t\t\t`[informational] ${conflicts.length} port overlap(s) detected:\\n ${conflicts.join(\"\\n \")}`,\n\t\t\t);\n\t\t}\n\n\t\t// At minimum, verify we checked something\n\t\texpect(portMap.size).toBeGreaterThan(0);\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.test.cjs","names":["describe","getAllServices","getServiceById","getServicesByCategory","getServicesByTag"],"sources":["../../src/services/registry.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tgetAllServices,\n\tgetServiceById,\n\tgetServicesByCategory,\n\tgetServicesByTag,\n} from \"../services/registry.js\";\n\ndescribe(\"service registry\", () => {\n\tit(\"has at least 60 services registered\", () => {\n\t\tconst services = getAllServices();\n\t\texpect(services.length).toBeGreaterThanOrEqual(60);\n\t});\n\n\tit(\"finds redis by ID\", () => {\n\t\tconst redis = getServiceById(\"redis\");\n\t\texpect(redis).toBeDefined();\n\t\texpect(redis!.id).toBe(\"redis\");\n\t\texpect(redis!.name).toBe(\"Redis\");\n\t});\n\n\tit(\"returns undefined for unknown ID\", () => {\n\t\tconst result = getServiceById(\"nonexistent\");\n\t\texpect(result).toBeUndefined();\n\t});\n\n\tit(\"finds tailscale and it is mandatory\", () => {\n\t\tconst tailscale = getServiceById(\"tailscale\");\n\t\texpect(tailscale).toBeDefined();\n\t\texpect(tailscale!.id).toBe(\"tailscale\");\n\t\texpect(tailscale!.mandatory).toBe(true);\n\t});\n\n\tit(\"finds mission-control and it is mandatory with gitSource\", () => {\n\t\tconst mc = getServiceById(\"mission-control\");\n\t\texpect(mc).toBeDefined();\n\t\texpect(mc!.mandatory).toBe(true);\n\t\texpect(mc!.gitSource).toBeDefined();\n\t\texpect(mc!.gitSource!.repoUrl).toContain(\"better-openclaw-mission-control\");\n\t});\n\n\tit(\"finds coolify, dokploy, livekit, and La Suite Meet services by ID\", () => {\n\t\texpect(getServiceById(\"coolify\")).toBeDefined();\n\t\texpect(getServiceById(\"dokploy\")).toBeDefined();\n\t\texpect(getServiceById(\"livekit\")).toBeDefined();\n\t\texpect(getServiceById(\"lasuite-meet-backend\")).toBeDefined();\n\t\texpect(getServiceById(\"lasuite-meet-frontend\")).toBeDefined();\n\t\texpect(getServiceById(\"lasuite-meet-agents\")).toBeDefined();\n\t});\n\n\tit(\"filters by category\", () => {\n\t\tconst databases = getServicesByCategory(\"database\");\n\t\tconst ids = databases.map((s) => s.id);\n\t\texpect(ids).toContain(\"redis\");\n\t\texpect(databases.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"filters by tag\", () => {\n\t\tconst cacheServices = getServicesByTag(\"cache\");\n\t\tconst ids = cacheServices.map((s) => s.id);\n\t\texpect(ids).toContain(\"redis\");\n\t\texpect(cacheServices.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"all service IDs are unique\", () => {\n\t\tconst services = getAllServices();\n\t\tconst ids = services.map((s) => s.id);\n\t\tconst uniqueIds = new Set(ids);\n\t\texpect(uniqueIds.size).toBe(ids.length);\n\t});\n\n\tit(\"no two services have the same exposed host port\", () => {\n\t\tconst services = getAllServices();\n\t\tconst portMap = new Map<number, string[]>();\n\n\t\tfor (const svc of services) {\n\t\t\tfor (const port of svc.ports) {\n\t\t\t\tif (!port.exposed) continue;\n\t\t\t\tconst existing = portMap.get(port.host) ?? [];\n\t\t\t\texisting.push(svc.id);\n\t\t\t\tportMap.set(port.host, existing);\n\t\t\t}\n\t\t}\n\n\t\t// Informational: log any shared ports but don't hard-fail,\n\t\t// since users may not enable all services simultaneously.\n\t\tconst conflicts: string[] = [];\n\t\tfor (const [port, serviceIds] of portMap) {\n\t\t\tif (serviceIds.length > 1) {\n\t\t\t\tconflicts.push(`Port ${port} shared by: ${serviceIds.join(\", \")}`);\n\t\t\t}\n\t\t}\n\n\t\t// This is informational — warn if there are conflicts but still pass.\n\t\t// If you want to enforce unique ports, change the next line to:\n\t\t// expect(conflicts).toHaveLength(0);\n\t\tif (conflicts.length > 0) {\n\t\t\tconsole.warn(\n\t\t\t\t`[informational] ${conflicts.length} port overlap(s) detected:\\n ${conflicts.join(\"\\n \")}`,\n\t\t\t);\n\t\t}\n\n\t\t// At minimum, verify we checked something\n\t\texpect(portMap.size).toBeGreaterThan(0);\n\t});\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-C_jmO7m2.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "../test.CTcmp4Su-ClCHJ3FA.mjs";
2
2
  import { getAllServices, getServiceById, getServicesByCategory, getServicesByTag } from "./registry.mjs";
3
3
  //#region src/services/registry.test.ts
4
4
  describe("service registry", () => {