@better-openclaw/core 1.0.0

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 (461) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint.log +360 -0
  3. package/.turbo/turbo-typecheck.log +4 -0
  4. package/dist/bare-metal-partition.d.ts +22 -0
  5. package/dist/bare-metal-partition.d.ts.map +1 -0
  6. package/dist/bare-metal-partition.js +49 -0
  7. package/dist/bare-metal-partition.js.map +1 -0
  8. package/dist/composer.d.ts +17 -0
  9. package/dist/composer.d.ts.map +1 -0
  10. package/dist/composer.js +305 -0
  11. package/dist/composer.js.map +1 -0
  12. package/dist/generate.d.ts +7 -0
  13. package/dist/generate.d.ts.map +1 -0
  14. package/dist/generate.js +218 -0
  15. package/dist/generate.js.map +1 -0
  16. package/dist/generators/bare-metal-install.d.ts +18 -0
  17. package/dist/generators/bare-metal-install.d.ts.map +1 -0
  18. package/dist/generators/bare-metal-install.js +228 -0
  19. package/dist/generators/bare-metal-install.js.map +1 -0
  20. package/dist/generators/caddy.d.ts +13 -0
  21. package/dist/generators/caddy.d.ts.map +1 -0
  22. package/dist/generators/caddy.js +85 -0
  23. package/dist/generators/caddy.js.map +1 -0
  24. package/dist/generators/env.d.ts +42 -0
  25. package/dist/generators/env.d.ts.map +1 -0
  26. package/dist/generators/env.js +276 -0
  27. package/dist/generators/env.js.map +1 -0
  28. package/dist/generators/grafana.d.ts +19 -0
  29. package/dist/generators/grafana.d.ts.map +1 -0
  30. package/dist/generators/grafana.js +247 -0
  31. package/dist/generators/grafana.js.map +1 -0
  32. package/dist/generators/n8n-workflows.d.ts +7 -0
  33. package/dist/generators/n8n-workflows.d.ts.map +1 -0
  34. package/dist/generators/n8n-workflows.js +78 -0
  35. package/dist/generators/n8n-workflows.js.map +1 -0
  36. package/dist/generators/native-services.d.ts +13 -0
  37. package/dist/generators/native-services.d.ts.map +1 -0
  38. package/dist/generators/native-services.js +85 -0
  39. package/dist/generators/native-services.js.map +1 -0
  40. package/dist/generators/postgres-init.d.ts +27 -0
  41. package/dist/generators/postgres-init.d.ts.map +1 -0
  42. package/dist/generators/postgres-init.js +119 -0
  43. package/dist/generators/postgres-init.js.map +1 -0
  44. package/dist/generators/prometheus.d.ts +10 -0
  45. package/dist/generators/prometheus.d.ts.map +1 -0
  46. package/dist/generators/prometheus.js +79 -0
  47. package/dist/generators/prometheus.js.map +1 -0
  48. package/dist/generators/readme.d.ts +21 -0
  49. package/dist/generators/readme.d.ts.map +1 -0
  50. package/dist/generators/readme.js +224 -0
  51. package/dist/generators/readme.js.map +1 -0
  52. package/dist/generators/scripts.d.ts +7 -0
  53. package/dist/generators/scripts.d.ts.map +1 -0
  54. package/dist/generators/scripts.js +352 -0
  55. package/dist/generators/scripts.js.map +1 -0
  56. package/dist/generators/skills.d.ts +10 -0
  57. package/dist/generators/skills.d.ts.map +1 -0
  58. package/dist/generators/skills.js +596 -0
  59. package/dist/generators/skills.js.map +1 -0
  60. package/dist/index.d.ts +24 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +27 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/presets/registry.d.ts +5 -0
  65. package/dist/presets/registry.d.ts.map +1 -0
  66. package/dist/presets/registry.js +121 -0
  67. package/dist/presets/registry.js.map +1 -0
  68. package/dist/resolver.d.ts +17 -0
  69. package/dist/resolver.d.ts.map +1 -0
  70. package/dist/resolver.js +254 -0
  71. package/dist/resolver.js.map +1 -0
  72. package/dist/schema.d.ts +2426 -0
  73. package/dist/schema.d.ts.map +1 -0
  74. package/dist/schema.js +259 -0
  75. package/dist/schema.js.map +1 -0
  76. package/dist/services/definitions/anything-llm.d.ts +3 -0
  77. package/dist/services/definitions/anything-llm.d.ts.map +1 -0
  78. package/dist/services/definitions/anything-llm.js +39 -0
  79. package/dist/services/definitions/anything-llm.js.map +1 -0
  80. package/dist/services/definitions/appflowy.d.ts +3 -0
  81. package/dist/services/definitions/appflowy.d.ts.map +1 -0
  82. package/dist/services/definitions/appflowy.js +39 -0
  83. package/dist/services/definitions/appflowy.js.map +1 -0
  84. package/dist/services/definitions/beszel.d.ts +3 -0
  85. package/dist/services/definitions/beszel.d.ts.map +1 -0
  86. package/dist/services/definitions/beszel.js +39 -0
  87. package/dist/services/definitions/beszel.js.map +1 -0
  88. package/dist/services/definitions/browserless.d.ts +3 -0
  89. package/dist/services/definitions/browserless.d.ts.map +1 -0
  90. package/dist/services/definitions/browserless.js +77 -0
  91. package/dist/services/definitions/browserless.js.map +1 -0
  92. package/dist/services/definitions/caddy.d.ts +3 -0
  93. package/dist/services/definitions/caddy.d.ts.map +1 -0
  94. package/dist/services/definitions/caddy.js +50 -0
  95. package/dist/services/definitions/caddy.js.map +1 -0
  96. package/dist/services/definitions/chromadb.d.ts +3 -0
  97. package/dist/services/definitions/chromadb.d.ts.map +1 -0
  98. package/dist/services/definitions/chromadb.js +61 -0
  99. package/dist/services/definitions/chromadb.js.map +1 -0
  100. package/dist/services/definitions/claude-code.d.ts +3 -0
  101. package/dist/services/definitions/claude-code.d.ts.map +1 -0
  102. package/dist/services/definitions/claude-code.js +49 -0
  103. package/dist/services/definitions/claude-code.js.map +1 -0
  104. package/dist/services/definitions/code-server.d.ts +3 -0
  105. package/dist/services/definitions/code-server.d.ts.map +1 -0
  106. package/dist/services/definitions/code-server.js +61 -0
  107. package/dist/services/definitions/code-server.js.map +1 -0
  108. package/dist/services/definitions/codex.d.ts +3 -0
  109. package/dist/services/definitions/codex.d.ts.map +1 -0
  110. package/dist/services/definitions/codex.js +41 -0
  111. package/dist/services/definitions/codex.js.map +1 -0
  112. package/dist/services/definitions/coolify.d.ts +3 -0
  113. package/dist/services/definitions/coolify.d.ts.map +1 -0
  114. package/dist/services/definitions/coolify.js +44 -0
  115. package/dist/services/definitions/coolify.js.map +1 -0
  116. package/dist/services/definitions/dify.d.ts +3 -0
  117. package/dist/services/definitions/dify.d.ts.map +1 -0
  118. package/dist/services/definitions/dify.js +75 -0
  119. package/dist/services/definitions/dify.js.map +1 -0
  120. package/dist/services/definitions/docsgpt.d.ts +3 -0
  121. package/dist/services/definitions/docsgpt.d.ts.map +1 -0
  122. package/dist/services/definitions/docsgpt.js +39 -0
  123. package/dist/services/definitions/docsgpt.js.map +1 -0
  124. package/dist/services/definitions/dokploy.d.ts +3 -0
  125. package/dist/services/definitions/dokploy.d.ts.map +1 -0
  126. package/dist/services/definitions/dokploy.js +44 -0
  127. package/dist/services/definitions/dokploy.js.map +1 -0
  128. package/dist/services/definitions/dozzle.d.ts +3 -0
  129. package/dist/services/definitions/dozzle.d.ts.map +1 -0
  130. package/dist/services/definitions/dozzle.js +33 -0
  131. package/dist/services/definitions/dozzle.js.map +1 -0
  132. package/dist/services/definitions/ffmpeg.d.ts +3 -0
  133. package/dist/services/definitions/ffmpeg.d.ts.map +1 -0
  134. package/dist/services/definitions/ffmpeg.js +63 -0
  135. package/dist/services/definitions/ffmpeg.js.map +1 -0
  136. package/dist/services/definitions/flowise.d.ts +3 -0
  137. package/dist/services/definitions/flowise.d.ts.map +1 -0
  138. package/dist/services/definitions/flowise.js +39 -0
  139. package/dist/services/definitions/flowise.js.map +1 -0
  140. package/dist/services/definitions/gemini-cli.d.ts +3 -0
  141. package/dist/services/definitions/gemini-cli.d.ts.map +1 -0
  142. package/dist/services/definitions/gemini-cli.js +41 -0
  143. package/dist/services/definitions/gemini-cli.js.map +1 -0
  144. package/dist/services/definitions/gitea.d.ts +3 -0
  145. package/dist/services/definitions/gitea.d.ts.map +1 -0
  146. package/dist/services/definitions/gitea.js +45 -0
  147. package/dist/services/definitions/gitea.js.map +1 -0
  148. package/dist/services/definitions/gotify.d.ts +3 -0
  149. package/dist/services/definitions/gotify.d.ts.map +1 -0
  150. package/dist/services/definitions/gotify.js +60 -0
  151. package/dist/services/definitions/gotify.js.map +1 -0
  152. package/dist/services/definitions/grafana.d.ts +3 -0
  153. package/dist/services/definitions/grafana.d.ts.map +1 -0
  154. package/dist/services/definitions/grafana.js +61 -0
  155. package/dist/services/definitions/grafana.js.map +1 -0
  156. package/dist/services/definitions/index.d.ts +68 -0
  157. package/dist/services/definitions/index.d.ts.map +1 -0
  158. package/dist/services/definitions/index.js +198 -0
  159. package/dist/services/definitions/index.js.map +1 -0
  160. package/dist/services/definitions/kimi.d.ts +3 -0
  161. package/dist/services/definitions/kimi.d.ts.map +1 -0
  162. package/dist/services/definitions/kimi.js +41 -0
  163. package/dist/services/definitions/kimi.js.map +1 -0
  164. package/dist/services/definitions/lasuite-meet-agents.d.ts +3 -0
  165. package/dist/services/definitions/lasuite-meet-agents.d.ts.map +1 -0
  166. package/dist/services/definitions/lasuite-meet-agents.js +26 -0
  167. package/dist/services/definitions/lasuite-meet-agents.js.map +1 -0
  168. package/dist/services/definitions/lasuite-meet-backend.d.ts +3 -0
  169. package/dist/services/definitions/lasuite-meet-backend.d.ts.map +1 -0
  170. package/dist/services/definitions/lasuite-meet-backend.js +118 -0
  171. package/dist/services/definitions/lasuite-meet-backend.js.map +1 -0
  172. package/dist/services/definitions/lasuite-meet-frontend.d.ts +3 -0
  173. package/dist/services/definitions/lasuite-meet-frontend.d.ts.map +1 -0
  174. package/dist/services/definitions/lasuite-meet-frontend.js +31 -0
  175. package/dist/services/definitions/lasuite-meet-frontend.js.map +1 -0
  176. package/dist/services/definitions/librechat.d.ts +3 -0
  177. package/dist/services/definitions/librechat.d.ts.map +1 -0
  178. package/dist/services/definitions/librechat.js +47 -0
  179. package/dist/services/definitions/librechat.js.map +1 -0
  180. package/dist/services/definitions/lightpanda.d.ts +3 -0
  181. package/dist/services/definitions/lightpanda.d.ts.map +1 -0
  182. package/dist/services/definitions/lightpanda.js +59 -0
  183. package/dist/services/definitions/lightpanda.js.map +1 -0
  184. package/dist/services/definitions/litellm.d.ts +3 -0
  185. package/dist/services/definitions/litellm.d.ts.map +1 -0
  186. package/dist/services/definitions/litellm.js +41 -0
  187. package/dist/services/definitions/litellm.js.map +1 -0
  188. package/dist/services/definitions/livekit.d.ts +3 -0
  189. package/dist/services/definitions/livekit.d.ts.map +1 -0
  190. package/dist/services/definitions/livekit.js +31 -0
  191. package/dist/services/definitions/livekit.js.map +1 -0
  192. package/dist/services/definitions/matomo.d.ts +3 -0
  193. package/dist/services/definitions/matomo.d.ts.map +1 -0
  194. package/dist/services/definitions/matomo.js +75 -0
  195. package/dist/services/definitions/matomo.js.map +1 -0
  196. package/dist/services/definitions/matrix-synapse.d.ts +3 -0
  197. package/dist/services/definitions/matrix-synapse.d.ts.map +1 -0
  198. package/dist/services/definitions/matrix-synapse.js +82 -0
  199. package/dist/services/definitions/matrix-synapse.js.map +1 -0
  200. package/dist/services/definitions/mattermost.d.ts +3 -0
  201. package/dist/services/definitions/mattermost.d.ts.map +1 -0
  202. package/dist/services/definitions/mattermost.js +59 -0
  203. package/dist/services/definitions/mattermost.js.map +1 -0
  204. package/dist/services/definitions/meilisearch.d.ts +3 -0
  205. package/dist/services/definitions/meilisearch.d.ts.map +1 -0
  206. package/dist/services/definitions/meilisearch.js +76 -0
  207. package/dist/services/definitions/meilisearch.js.map +1 -0
  208. package/dist/services/definitions/minio.d.ts +3 -0
  209. package/dist/services/definitions/minio.d.ts.map +1 -0
  210. package/dist/services/definitions/minio.js +98 -0
  211. package/dist/services/definitions/minio.js.map +1 -0
  212. package/dist/services/definitions/mixpost.d.ts +3 -0
  213. package/dist/services/definitions/mixpost.d.ts.map +1 -0
  214. package/dist/services/definitions/mixpost.js +82 -0
  215. package/dist/services/definitions/mixpost.js.map +1 -0
  216. package/dist/services/definitions/motion-canvas.d.ts +3 -0
  217. package/dist/services/definitions/motion-canvas.d.ts.map +1 -0
  218. package/dist/services/definitions/motion-canvas.js +48 -0
  219. package/dist/services/definitions/motion-canvas.js.map +1 -0
  220. package/dist/services/definitions/n8n.d.ts +3 -0
  221. package/dist/services/definitions/n8n.d.ts.map +1 -0
  222. package/dist/services/definitions/n8n.js +146 -0
  223. package/dist/services/definitions/n8n.js.map +1 -0
  224. package/dist/services/definitions/nocodb.d.ts +3 -0
  225. package/dist/services/definitions/nocodb.d.ts.map +1 -0
  226. package/dist/services/definitions/nocodb.js +39 -0
  227. package/dist/services/definitions/nocodb.js.map +1 -0
  228. package/dist/services/definitions/ntfy.d.ts +3 -0
  229. package/dist/services/definitions/ntfy.d.ts.map +1 -0
  230. package/dist/services/definitions/ntfy.js +61 -0
  231. package/dist/services/definitions/ntfy.js.map +1 -0
  232. package/dist/services/definitions/ollama.d.ts +3 -0
  233. package/dist/services/definitions/ollama.d.ts.map +1 -0
  234. package/dist/services/definitions/ollama.js +61 -0
  235. package/dist/services/definitions/ollama.js.map +1 -0
  236. package/dist/services/definitions/open-webui.d.ts +3 -0
  237. package/dist/services/definitions/open-webui.d.ts.map +1 -0
  238. package/dist/services/definitions/open-webui.js +47 -0
  239. package/dist/services/definitions/open-webui.js.map +1 -0
  240. package/dist/services/definitions/opencode.d.ts +3 -0
  241. package/dist/services/definitions/opencode.d.ts.map +1 -0
  242. package/dist/services/definitions/opencode.js +47 -0
  243. package/dist/services/definitions/opencode.js.map +1 -0
  244. package/dist/services/definitions/openpanel.d.ts +3 -0
  245. package/dist/services/definitions/openpanel.d.ts.map +1 -0
  246. package/dist/services/definitions/openpanel.js +41 -0
  247. package/dist/services/definitions/openpanel.js.map +1 -0
  248. package/dist/services/definitions/outline.d.ts +3 -0
  249. package/dist/services/definitions/outline.d.ts.map +1 -0
  250. package/dist/services/definitions/outline.js +68 -0
  251. package/dist/services/definitions/outline.js.map +1 -0
  252. package/dist/services/definitions/paperless-ngx.d.ts +3 -0
  253. package/dist/services/definitions/paperless-ngx.d.ts.map +1 -0
  254. package/dist/services/definitions/paperless-ngx.js +85 -0
  255. package/dist/services/definitions/paperless-ngx.js.map +1 -0
  256. package/dist/services/definitions/playwright-server.d.ts +3 -0
  257. package/dist/services/definitions/playwright-server.d.ts.map +1 -0
  258. package/dist/services/definitions/playwright-server.js +34 -0
  259. package/dist/services/definitions/playwright-server.js.map +1 -0
  260. package/dist/services/definitions/portainer.d.ts +3 -0
  261. package/dist/services/definitions/portainer.d.ts.map +1 -0
  262. package/dist/services/definitions/portainer.js +44 -0
  263. package/dist/services/definitions/portainer.js.map +1 -0
  264. package/dist/services/definitions/postgresql.d.ts +3 -0
  265. package/dist/services/definitions/postgresql.d.ts.map +1 -0
  266. package/dist/services/definitions/postgresql.js +83 -0
  267. package/dist/services/definitions/postgresql.js.map +1 -0
  268. package/dist/services/definitions/postiz.d.ts +3 -0
  269. package/dist/services/definitions/postiz.d.ts.map +1 -0
  270. package/dist/services/definitions/postiz.js +79 -0
  271. package/dist/services/definitions/postiz.js.map +1 -0
  272. package/dist/services/definitions/prometheus.d.ts +3 -0
  273. package/dist/services/definitions/prometheus.d.ts.map +1 -0
  274. package/dist/services/definitions/prometheus.js +47 -0
  275. package/dist/services/definitions/prometheus.js.map +1 -0
  276. package/dist/services/definitions/qdrant.d.ts +3 -0
  277. package/dist/services/definitions/qdrant.d.ts.map +1 -0
  278. package/dist/services/definitions/qdrant.js +75 -0
  279. package/dist/services/definitions/qdrant.js.map +1 -0
  280. package/dist/services/definitions/redis.d.ts +3 -0
  281. package/dist/services/definitions/redis.d.ts.map +1 -0
  282. package/dist/services/definitions/redis.js +90 -0
  283. package/dist/services/definitions/redis.js.map +1 -0
  284. package/dist/services/definitions/remotion.d.ts +3 -0
  285. package/dist/services/definitions/remotion.d.ts.map +1 -0
  286. package/dist/services/definitions/remotion.js +48 -0
  287. package/dist/services/definitions/remotion.js.map +1 -0
  288. package/dist/services/definitions/rocketchat.d.ts +3 -0
  289. package/dist/services/definitions/rocketchat.d.ts.map +1 -0
  290. package/dist/services/definitions/rocketchat.js +54 -0
  291. package/dist/services/definitions/rocketchat.js.map +1 -0
  292. package/dist/services/definitions/searxng.d.ts +3 -0
  293. package/dist/services/definitions/searxng.d.ts.map +1 -0
  294. package/dist/services/definitions/searxng.js +61 -0
  295. package/dist/services/definitions/searxng.js.map +1 -0
  296. package/dist/services/definitions/stable-diffusion.d.ts +3 -0
  297. package/dist/services/definitions/stable-diffusion.d.ts.map +1 -0
  298. package/dist/services/definitions/stable-diffusion.js +44 -0
  299. package/dist/services/definitions/stable-diffusion.js.map +1 -0
  300. package/dist/services/definitions/steel-browser.d.ts +3 -0
  301. package/dist/services/definitions/steel-browser.d.ts.map +1 -0
  302. package/dist/services/definitions/steel-browser.js +68 -0
  303. package/dist/services/definitions/steel-browser.js.map +1 -0
  304. package/dist/services/definitions/tailscale.d.ts +3 -0
  305. package/dist/services/definitions/tailscale.d.ts.map +1 -0
  306. package/dist/services/definitions/tailscale.js +62 -0
  307. package/dist/services/definitions/tailscale.js.map +1 -0
  308. package/dist/services/definitions/temporal.d.ts +3 -0
  309. package/dist/services/definitions/temporal.d.ts.map +1 -0
  310. package/dist/services/definitions/temporal.js +97 -0
  311. package/dist/services/definitions/temporal.js.map +1 -0
  312. package/dist/services/definitions/traefik.d.ts +3 -0
  313. package/dist/services/definitions/traefik.d.ts.map +1 -0
  314. package/dist/services/definitions/traefik.js +52 -0
  315. package/dist/services/definitions/traefik.js.map +1 -0
  316. package/dist/services/definitions/umami.d.ts +3 -0
  317. package/dist/services/definitions/umami.d.ts.map +1 -0
  318. package/dist/services/definitions/umami.js +41 -0
  319. package/dist/services/definitions/umami.js.map +1 -0
  320. package/dist/services/definitions/uptime-kuma.d.ts +3 -0
  321. package/dist/services/definitions/uptime-kuma.d.ts.map +1 -0
  322. package/dist/services/definitions/uptime-kuma.js +46 -0
  323. package/dist/services/definitions/uptime-kuma.js.map +1 -0
  324. package/dist/services/definitions/valkey.d.ts +3 -0
  325. package/dist/services/definitions/valkey.d.ts.map +1 -0
  326. package/dist/services/definitions/valkey.js +60 -0
  327. package/dist/services/definitions/valkey.js.map +1 -0
  328. package/dist/services/definitions/watchtower.d.ts +3 -0
  329. package/dist/services/definitions/watchtower.d.ts.map +1 -0
  330. package/dist/services/definitions/watchtower.js +41 -0
  331. package/dist/services/definitions/watchtower.js.map +1 -0
  332. package/dist/services/definitions/weaviate.d.ts +3 -0
  333. package/dist/services/definitions/weaviate.d.ts.map +1 -0
  334. package/dist/services/definitions/weaviate.js +89 -0
  335. package/dist/services/definitions/weaviate.js.map +1 -0
  336. package/dist/services/definitions/whisper.d.ts +3 -0
  337. package/dist/services/definitions/whisper.d.ts.map +1 -0
  338. package/dist/services/definitions/whisper.js +55 -0
  339. package/dist/services/definitions/whisper.js.map +1 -0
  340. package/dist/services/registry.d.ts +12 -0
  341. package/dist/services/registry.d.ts.map +1 -0
  342. package/dist/services/registry.js +28 -0
  343. package/dist/services/registry.js.map +1 -0
  344. package/dist/skills/registry.d.ts +7 -0
  345. package/dist/skills/registry.d.ts.map +1 -0
  346. package/dist/skills/registry.js +111 -0
  347. package/dist/skills/registry.js.map +1 -0
  348. package/dist/types.d.ts +60 -0
  349. package/dist/types.d.ts.map +1 -0
  350. package/dist/types.js +20 -0
  351. package/dist/types.js.map +1 -0
  352. package/dist/validator.d.ts +16 -0
  353. package/dist/validator.d.ts.map +1 -0
  354. package/dist/validator.js +142 -0
  355. package/dist/validator.js.map +1 -0
  356. package/dist/version-manager.d.ts +10 -0
  357. package/dist/version-manager.d.ts.map +1 -0
  358. package/dist/version-manager.js +60 -0
  359. package/dist/version-manager.js.map +1 -0
  360. package/package.json +37 -0
  361. package/src/__snapshots__/composer.snapshot.test.ts.snap +903 -0
  362. package/src/bare-metal-partition.test.ts +63 -0
  363. package/src/bare-metal-partition.ts +64 -0
  364. package/src/composer.snapshot.test.ts +87 -0
  365. package/src/composer.test.ts +224 -0
  366. package/src/composer.ts +403 -0
  367. package/src/generate.test.ts +349 -0
  368. package/src/generate.ts +259 -0
  369. package/src/generators/bare-metal-install.test.ts +43 -0
  370. package/src/generators/bare-metal-install.ts +249 -0
  371. package/src/generators/caddy.ts +99 -0
  372. package/src/generators/env.ts +405 -0
  373. package/src/generators/grafana.ts +255 -0
  374. package/src/generators/n8n-workflows.ts +88 -0
  375. package/src/generators/native-services.ts +103 -0
  376. package/src/generators/postgres-init.ts +137 -0
  377. package/src/generators/prometheus.ts +89 -0
  378. package/src/generators/readme.ts +274 -0
  379. package/src/generators/scripts.ts +362 -0
  380. package/src/generators/skills.ts +628 -0
  381. package/src/index.ts +118 -0
  382. package/src/presets/registry.test.ts +32 -0
  383. package/src/presets/registry.ts +126 -0
  384. package/src/resolver.test.ts +204 -0
  385. package/src/resolver.ts +282 -0
  386. package/src/schema.test.ts +295 -0
  387. package/src/schema.ts +307 -0
  388. package/src/services/definitions/anything-llm.ts +46 -0
  389. package/src/services/definitions/appflowy.ts +46 -0
  390. package/src/services/definitions/beszel.ts +46 -0
  391. package/src/services/definitions/browserless.ts +84 -0
  392. package/src/services/definitions/caddy.ts +57 -0
  393. package/src/services/definitions/chromadb.ts +68 -0
  394. package/src/services/definitions/claude-code.ts +56 -0
  395. package/src/services/definitions/code-server.ts +67 -0
  396. package/src/services/definitions/codex.ts +48 -0
  397. package/src/services/definitions/coolify.ts +51 -0
  398. package/src/services/definitions/dify.ts +82 -0
  399. package/src/services/definitions/docsgpt.ts +45 -0
  400. package/src/services/definitions/dokploy.ts +51 -0
  401. package/src/services/definitions/dozzle.ts +40 -0
  402. package/src/services/definitions/ffmpeg.ts +70 -0
  403. package/src/services/definitions/flowise.ts +45 -0
  404. package/src/services/definitions/gemini-cli.ts +48 -0
  405. package/src/services/definitions/gitea.ts +52 -0
  406. package/src/services/definitions/gotify.ts +67 -0
  407. package/src/services/definitions/grafana.ts +68 -0
  408. package/src/services/definitions/index.ts +200 -0
  409. package/src/services/definitions/kimi.ts +48 -0
  410. package/src/services/definitions/lasuite-meet-agents.ts +33 -0
  411. package/src/services/definitions/lasuite-meet-backend.ts +125 -0
  412. package/src/services/definitions/lasuite-meet-frontend.ts +38 -0
  413. package/src/services/definitions/librechat.ts +54 -0
  414. package/src/services/definitions/lightpanda.ts +61 -0
  415. package/src/services/definitions/litellm.ts +48 -0
  416. package/src/services/definitions/livekit.ts +38 -0
  417. package/src/services/definitions/matomo.ts +82 -0
  418. package/src/services/definitions/matrix-synapse.ts +89 -0
  419. package/src/services/definitions/mattermost.ts +67 -0
  420. package/src/services/definitions/meilisearch.ts +83 -0
  421. package/src/services/definitions/minio.ts +105 -0
  422. package/src/services/definitions/mixpost.ts +89 -0
  423. package/src/services/definitions/motion-canvas.ts +55 -0
  424. package/src/services/definitions/n8n.ts +153 -0
  425. package/src/services/definitions/nocodb.ts +46 -0
  426. package/src/services/definitions/ntfy.ts +68 -0
  427. package/src/services/definitions/ollama.ts +68 -0
  428. package/src/services/definitions/open-webui.ts +54 -0
  429. package/src/services/definitions/opencode.ts +54 -0
  430. package/src/services/definitions/openpanel.ts +48 -0
  431. package/src/services/definitions/outline.ts +75 -0
  432. package/src/services/definitions/paperless-ngx.ts +92 -0
  433. package/src/services/definitions/playwright-server.ts +41 -0
  434. package/src/services/definitions/portainer.ts +50 -0
  435. package/src/services/definitions/postgresql.ts +90 -0
  436. package/src/services/definitions/postiz.ts +86 -0
  437. package/src/services/definitions/prometheus.ts +54 -0
  438. package/src/services/definitions/qdrant.ts +82 -0
  439. package/src/services/definitions/redis.ts +99 -0
  440. package/src/services/definitions/remotion.ts +55 -0
  441. package/src/services/definitions/rocketchat.ts +61 -0
  442. package/src/services/definitions/searxng.ts +68 -0
  443. package/src/services/definitions/stable-diffusion.ts +50 -0
  444. package/src/services/definitions/steel-browser.ts +70 -0
  445. package/src/services/definitions/tailscale.ts +69 -0
  446. package/src/services/definitions/temporal.ts +104 -0
  447. package/src/services/definitions/traefik.ts +60 -0
  448. package/src/services/definitions/umami.ts +48 -0
  449. package/src/services/definitions/uptime-kuma.ts +53 -0
  450. package/src/services/definitions/valkey.ts +67 -0
  451. package/src/services/definitions/watchtower.ts +47 -0
  452. package/src/services/definitions/weaviate.ts +96 -0
  453. package/src/services/definitions/whisper.ts +62 -0
  454. package/src/services/registry.test.ts +98 -0
  455. package/src/services/registry.ts +37 -0
  456. package/src/skills/registry.ts +126 -0
  457. package/src/types.ts +123 -0
  458. package/src/validator.test.ts +66 -0
  459. package/src/validator.ts +166 -0
  460. package/src/version-manager.ts +65 -0
  461. package/tsconfig.json +9 -0
@@ -0,0 +1,405 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import type { ResolverOutput } from "../types.js";
3
+ import { getDbRequirements } from "./postgres-init.js";
4
+
5
+ /**
6
+ * Options for environment file generation.
7
+ */
8
+ export interface EnvGeneratorOptions {
9
+ generateSecrets: boolean;
10
+ domain?: string;
11
+ openclawVersion?: string;
12
+ /** When set, host-like vars (e.g. REDIS_HOST) for these services use host.docker.internal so gateway in Docker can reach native services on host. */
13
+ nativeServiceIds?: Set<string>;
14
+ }
15
+
16
+ /**
17
+ * Generates `.env.example` and `.env` file contents from resolved services.
18
+ *
19
+ * - `.env.example`: every env var with descriptive comments, placeholders for secrets
20
+ * - `.env`: same vars but secrets filled with cryptographically random values when generateSecrets is true
21
+ */
22
+ export function generateEnvFiles(
23
+ resolved: ResolverOutput,
24
+ options: EnvGeneratorOptions,
25
+ ): { envExample: string; env: string } {
26
+ const version = options.openclawVersion ?? "latest";
27
+ const lines: { comment: string; key: string; exampleValue: string; actualValue: string }[] = [];
28
+
29
+ // ── Base OpenClaw Variables ──────────────────────────────────────────────
30
+
31
+ lines.push({
32
+ comment: formatComment("OpenClaw version to deploy", "OpenClaw Core", true, false),
33
+ key: "OPENCLAW_VERSION",
34
+ exampleValue: version,
35
+ actualValue: version,
36
+ });
37
+
38
+ const gatewayToken = options.generateSecrets ? randomBytes(24).toString("hex") : "";
39
+
40
+ lines.push({
41
+ comment: formatComment(
42
+ "Authentication token for the OpenClaw gateway API",
43
+ "OpenClaw Core",
44
+ true,
45
+ true,
46
+ ),
47
+ key: "OPENCLAW_GATEWAY_TOKEN",
48
+ exampleValue: "your_gateway_token_here",
49
+ actualValue: gatewayToken,
50
+ });
51
+
52
+ lines.push({
53
+ comment: formatComment("Port the OpenClaw gateway listens on", "OpenClaw Core", true, false),
54
+ key: "OPENCLAW_GATEWAY_PORT",
55
+ exampleValue: "18789",
56
+ actualValue: "18789",
57
+ });
58
+
59
+ lines.push({
60
+ comment: formatComment(
61
+ "Port for the OpenClaw ACP bridge (WebSocket)",
62
+ "OpenClaw Core",
63
+ false,
64
+ false,
65
+ ),
66
+ key: "OPENCLAW_BRIDGE_PORT",
67
+ exampleValue: "18790",
68
+ actualValue: "18790",
69
+ });
70
+
71
+ lines.push({
72
+ comment: formatComment(
73
+ "Gateway network bind mode (lan for Docker networking, loopback for local-only)",
74
+ "OpenClaw Core",
75
+ false,
76
+ false,
77
+ ),
78
+ key: "OPENCLAW_GATEWAY_BIND",
79
+ exampleValue: "lan",
80
+ actualValue: "lan",
81
+ });
82
+
83
+ lines.push({
84
+ comment: formatComment(
85
+ "Host path to OpenClaw configuration directory",
86
+ "OpenClaw Core",
87
+ true,
88
+ false,
89
+ ),
90
+ key: "OPENCLAW_CONFIG_DIR",
91
+ exampleValue: "./openclaw/config",
92
+ actualValue: "./openclaw/config",
93
+ });
94
+
95
+ lines.push({
96
+ comment: formatComment(
97
+ "Host path to OpenClaw workspace directory",
98
+ "OpenClaw Core",
99
+ true,
100
+ false,
101
+ ),
102
+ key: "OPENCLAW_WORKSPACE_DIR",
103
+ exampleValue: "./openclaw/workspace",
104
+ actualValue: "./openclaw/workspace",
105
+ });
106
+
107
+ lines.push({
108
+ comment: formatComment(
109
+ "OpenClaw Docker image override (default uses ghcr.io/openclaw/openclaw)",
110
+ "OpenClaw Core",
111
+ false,
112
+ false,
113
+ ),
114
+ key: "OPENCLAW_IMAGE",
115
+ exampleValue: "",
116
+ actualValue: "",
117
+ });
118
+
119
+ if (options.domain) {
120
+ lines.push({
121
+ comment: formatComment("Primary domain for service routing", "OpenClaw Core", false, false),
122
+ key: "OPENCLAW_DOMAIN",
123
+ exampleValue: "example.com",
124
+ actualValue: options.domain,
125
+ });
126
+ }
127
+
128
+ // Claude web-provider session variables (optional)
129
+ lines.push({
130
+ comment:
131
+ "\n# ═══════════════════════════════════════════════════════════════════════════════\n# Claude Web Provider (optional)\n# ═══════════════════════════════════════════════════════════════════════════════",
132
+ key: "",
133
+ exampleValue: "",
134
+ actualValue: "",
135
+ });
136
+
137
+ lines.push({
138
+ comment: formatComment(
139
+ "Claude AI session key for web provider authentication",
140
+ "OpenClaw Core",
141
+ false,
142
+ true,
143
+ ),
144
+ key: "CLAUDE_AI_SESSION_KEY",
145
+ exampleValue: "your_claude_ai_session_key_here",
146
+ actualValue: "",
147
+ });
148
+
149
+ lines.push({
150
+ comment: formatComment(
151
+ "Claude web session key for web provider authentication",
152
+ "OpenClaw Core",
153
+ false,
154
+ true,
155
+ ),
156
+ key: "CLAUDE_WEB_SESSION_KEY",
157
+ exampleValue: "your_claude_web_session_key_here",
158
+ actualValue: "",
159
+ });
160
+
161
+ lines.push({
162
+ comment: formatComment(
163
+ "Claude web cookie for web provider authentication",
164
+ "OpenClaw Core",
165
+ false,
166
+ true,
167
+ ),
168
+ key: "CLAUDE_WEB_COOKIE",
169
+ exampleValue: "your_claude_web_cookie_here",
170
+ actualValue: "",
171
+ });
172
+
173
+ // ── Per-Service Database Passwords ──────────────────────────────────────
174
+
175
+ const dbReqs = getDbRequirements(resolved);
176
+
177
+ if (dbReqs.length > 0) {
178
+ lines.push({
179
+ comment:
180
+ "\n# ═══════════════════════════════════════════════════════════════════════════════\n# Per-Service Database Passwords\n# Each service gets its own PostgreSQL database and credentials\n# ═══════════════════════════════════════════════════════════════════════════════",
181
+ key: "",
182
+ exampleValue: "",
183
+ actualValue: "",
184
+ });
185
+
186
+ for (const req of dbReqs) {
187
+ const secretValue = options.generateSecrets ? randomBytes(24).toString("hex") : "";
188
+
189
+ lines.push({
190
+ comment: formatComment(
191
+ `PostgreSQL password for ${req.serviceName} (database: ${req.dbName}, user: ${req.dbUser})`,
192
+ req.serviceName,
193
+ true,
194
+ true,
195
+ ),
196
+ key: req.passwordEnvVar,
197
+ exampleValue: `your_${req.passwordEnvVar.toLowerCase()}_here`,
198
+ actualValue: secretValue,
199
+ });
200
+ }
201
+ }
202
+
203
+ // ── Service-Specific Variables ───────────────────────────────────────────
204
+
205
+ const dbPasswordKeys = dbReqs.map((r) => r.passwordEnvVar);
206
+ const seenKeys = new Set<string>([
207
+ "OPENCLAW_VERSION",
208
+ "OPENCLAW_GATEWAY_TOKEN",
209
+ "OPENCLAW_GATEWAY_PORT",
210
+ "OPENCLAW_BRIDGE_PORT",
211
+ "OPENCLAW_GATEWAY_BIND",
212
+ "OPENCLAW_CONFIG_DIR",
213
+ "OPENCLAW_WORKSPACE_DIR",
214
+ "OPENCLAW_IMAGE",
215
+ "OPENCLAW_DOMAIN",
216
+ "CLAUDE_AI_SESSION_KEY",
217
+ "CLAUDE_WEB_SESSION_KEY",
218
+ "CLAUDE_WEB_COOKIE",
219
+ ...dbPasswordKeys,
220
+ ]);
221
+
222
+ for (const { definition } of resolved.services) {
223
+ const allEnvVars = [...definition.environment, ...definition.openclawEnvVars];
224
+
225
+ if (allEnvVars.length === 0) continue;
226
+
227
+ // Section separator for this service
228
+ lines.push({
229
+ comment: `\n# ═══════════════════════════════════════════════════════════════════════════════\n# ${definition.icon} ${definition.name}\n# ═══════════════════════════════════════════════════════════════════════════════`,
230
+ key: "",
231
+ exampleValue: "",
232
+ actualValue: "",
233
+ });
234
+
235
+ const isNative = options.nativeServiceIds?.has(definition.id);
236
+
237
+ for (const envVar of allEnvVars) {
238
+ if (seenKeys.has(envVar.key)) continue;
239
+ seenKeys.add(envVar.key);
240
+
241
+ const secretValue = options.generateSecrets ? randomBytes(24).toString("hex") : "";
242
+
243
+ // For native services, host-like vars must point to host so gateway (in Docker) can reach them
244
+ const isHostVar = envVar.key.endsWith("_HOST");
245
+ const hostValue = isNative && isHostVar ? "host.docker.internal" : null;
246
+
247
+ const exampleValue = hostValue
248
+ ? hostValue
249
+ : envVar.secret
250
+ ? `your_${envVar.key.toLowerCase()}_here`
251
+ : envVar.defaultValue;
252
+
253
+ let actualValue: string;
254
+ if (hostValue) {
255
+ actualValue = hostValue;
256
+ } else if (envVar.secret) {
257
+ actualValue = envVar.defaultValue.startsWith("${") ? envVar.defaultValue : secretValue;
258
+ } else {
259
+ actualValue = envVar.defaultValue;
260
+ }
261
+
262
+ lines.push({
263
+ comment: formatComment(envVar.description, definition.name, envVar.required, envVar.secret),
264
+ key: envVar.key,
265
+ exampleValue,
266
+ actualValue,
267
+ });
268
+ }
269
+ }
270
+
271
+ // ── Build output strings ────────────────────────────────────────────────
272
+
273
+ const header = [
274
+ "# ═══════════════════════════════════════════════════════════════════════════════",
275
+ "# OpenClaw Environment Configuration",
276
+ `# Generated at ${new Date().toISOString()}`,
277
+ "# ═══════════════════════════════════════════════════════════════════════════════",
278
+ "",
279
+ ].join("\n");
280
+
281
+ let envExample = header;
282
+ let env = header;
283
+
284
+ for (const line of lines) {
285
+ if (line.key === "") {
286
+ // Section comment
287
+ envExample += `${line.comment}\n`;
288
+ env += `${line.comment}\n`;
289
+ } else {
290
+ envExample += `${line.comment}\n${line.key}=${line.exampleValue}\n\n`;
291
+ env += `${line.comment}\n${line.key}=${line.actualValue}\n\n`;
292
+ }
293
+ }
294
+
295
+ return { envExample, env };
296
+ }
297
+
298
+ /**
299
+ * Format a descriptive comment block for an environment variable.
300
+ */
301
+ function formatComment(
302
+ description: string,
303
+ serviceName: string,
304
+ required: boolean,
305
+ secret: boolean,
306
+ ): string {
307
+ return [
308
+ `# ${description}`,
309
+ `# Service: ${serviceName} | Required: ${required ? "Yes" : "No"} | Secret: ${secret ? "Yes" : "No"}`,
310
+ ].join("\n");
311
+ }
312
+
313
+ // ── Structured Env Vars ─────────────────────────────────────────────────────
314
+
315
+ export interface EnvVarGroup {
316
+ serviceName: string;
317
+ serviceIcon: string;
318
+ serviceId: string;
319
+ vars: {
320
+ key: string;
321
+ description: string;
322
+ secret: boolean;
323
+ required: boolean;
324
+ defaultValue: string;
325
+ }[];
326
+ }
327
+
328
+ /**
329
+ * Returns environment variables grouped by service, suitable for UI rendering.
330
+ *
331
+ * - First group is always "OpenClaw Core" with base variables.
332
+ * - Subsequent groups correspond to each resolved service.
333
+ * - Variables are deduplicated across groups (first occurrence wins).
334
+ */
335
+ export function getStructuredEnvVars(resolved: ResolverOutput): EnvVarGroup[] {
336
+ const groups: EnvVarGroup[] = [];
337
+ const seenKeys = new Set<string>();
338
+
339
+ // ── OpenClaw Core group ──────────────────────────────────────────────────
340
+ const coreVars: EnvVarGroup["vars"] = [
341
+ {
342
+ key: "OPENCLAW_VERSION",
343
+ description: "OpenClaw version to deploy",
344
+ secret: false,
345
+ required: true,
346
+ defaultValue: "latest",
347
+ },
348
+ {
349
+ key: "OPENCLAW_GATEWAY_TOKEN",
350
+ description: "Authentication token for the OpenClaw gateway API",
351
+ secret: true,
352
+ required: true,
353
+ defaultValue: "",
354
+ },
355
+ {
356
+ key: "OPENCLAW_GATEWAY_PORT",
357
+ description: "Port the OpenClaw gateway listens on",
358
+ secret: false,
359
+ required: true,
360
+ defaultValue: "18789",
361
+ },
362
+ ];
363
+
364
+ for (const v of coreVars) {
365
+ seenKeys.add(v.key);
366
+ }
367
+
368
+ groups.push({
369
+ serviceName: "OpenClaw Core",
370
+ serviceIcon: "⚙️",
371
+ serviceId: "openclaw-core",
372
+ vars: coreVars,
373
+ });
374
+
375
+ // ── Per-service groups ───────────────────────────────────────────────────
376
+ for (const { definition } of resolved.services) {
377
+ const allEnvVars = [...definition.environment, ...definition.openclawEnvVars];
378
+
379
+ const vars: EnvVarGroup["vars"] = [];
380
+
381
+ for (const envVar of allEnvVars) {
382
+ if (seenKeys.has(envVar.key)) continue;
383
+ seenKeys.add(envVar.key);
384
+
385
+ vars.push({
386
+ key: envVar.key,
387
+ description: envVar.description,
388
+ secret: envVar.secret,
389
+ required: envVar.required,
390
+ defaultValue: envVar.defaultValue,
391
+ });
392
+ }
393
+
394
+ if (vars.length === 0) continue;
395
+
396
+ groups.push({
397
+ serviceName: definition.name,
398
+ serviceIcon: definition.icon,
399
+ serviceId: definition.id,
400
+ vars,
401
+ });
402
+ }
403
+
404
+ return groups;
405
+ }
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Generates Grafana provisioning configuration files.
3
+ *
4
+ * Returns a map of file paths (relative to project root) to file contents.
5
+ * Includes datasource provisioning YAML for the Prometheus connection.
6
+ */
7
+ export function generateGrafanaConfig(): Record<string, string> {
8
+ const files: Record<string, string> = {};
9
+
10
+ // ── Datasource Provisioning ─────────────────────────────────────────────
11
+
12
+ files["config/grafana/provisioning/datasources/prometheus.yml"] =
13
+ `# ═══════════════════════════════════════════════════════════════════════════════
14
+ # Grafana Datasource Provisioning — Auto-generated by OpenClaw
15
+ # ═══════════════════════════════════════════════════════════════════════════════
16
+
17
+ apiVersion: 1
18
+
19
+ datasources:
20
+ # Prometheus — primary metrics datasource
21
+ - name: Prometheus
22
+ type: prometheus
23
+ access: proxy
24
+ url: http://prometheus:9090
25
+ isDefault: true
26
+ editable: true
27
+ jsonData:
28
+ httpMethod: POST
29
+ timeInterval: "15s"
30
+ exemplarTraceIdDestinations:
31
+ - name: traceID
32
+ datasourceUid: ""
33
+ version: 1
34
+ `;
35
+
36
+ // ── Dashboard Provisioning ───────────────────────────────────────────────
37
+
38
+ files["config/grafana/provisioning/dashboards/default.yml"] =
39
+ `# ═══════════════════════════════════════════════════════════════════════════════
40
+ # Grafana Dashboard Provisioning — Auto-generated by OpenClaw
41
+ # ═══════════════════════════════════════════════════════════════════════════════
42
+
43
+ apiVersion: 1
44
+
45
+ providers:
46
+ - name: "OpenClaw Dashboards"
47
+ orgId: 1
48
+ folder: "OpenClaw"
49
+ type: file
50
+ disableDeletion: false
51
+ editable: true
52
+ updateIntervalSeconds: 30
53
+ allowUiUpdates: true
54
+ options:
55
+ path: /var/lib/grafana/dashboards
56
+ foldersFromFilesStructure: false
57
+ `;
58
+
59
+ // ── Grafana Configuration (grafana.ini overrides) ────────────────────────
60
+
61
+ files["config/grafana/grafana.ini"] =
62
+ `# ═══════════════════════════════════════════════════════════════════════════════
63
+ # Grafana Configuration — Auto-generated by OpenClaw
64
+ # ═══════════════════════════════════════════════════════════════════════════════
65
+
66
+ [server]
67
+ root_url = %(protocol)s://%(domain)s/
68
+
69
+ [security]
70
+ # Admin credentials are set via environment variables:
71
+ # GF_SECURITY_ADMIN_USER
72
+ # GF_SECURITY_ADMIN_PASSWORD
73
+
74
+ [auth.anonymous]
75
+ enabled = false
76
+
77
+ [dashboards]
78
+ default_home_dashboard_path = /var/lib/grafana/dashboards/home.json
79
+
80
+ [alerting]
81
+ enabled = true
82
+
83
+ [unified_alerting]
84
+ enabled = true
85
+
86
+ [log]
87
+ mode = console
88
+ level = info
89
+ `;
90
+
91
+ return files;
92
+ }
93
+
94
+ /**
95
+ * Generates a Grafana dashboard JSON for the OpenClaw stack overview.
96
+ *
97
+ * The dashboard includes:
98
+ * - Service Health (stat panel)
99
+ * - Memory Usage (gauge)
100
+ * - Request Rate (graph)
101
+ *
102
+ * Uses Prometheus as the datasource.
103
+ */
104
+ export function generateGrafanaDashboard(): string {
105
+ const dashboard = {
106
+ annotations: { list: [] },
107
+ editable: true,
108
+ fiscalYearStartMonth: 0,
109
+ graphTooltip: 1,
110
+ links: [],
111
+ panels: [
112
+ {
113
+ // ── Service Health (stat panel) ──
114
+ id: 1,
115
+ title: "Service Health",
116
+ type: "stat",
117
+ gridPos: { h: 8, w: 8, x: 0, y: 0 },
118
+ datasource: { type: "prometheus", uid: "prometheus" },
119
+ targets: [
120
+ {
121
+ expr: 'count(up{job=~".+"} == 1)',
122
+ legendFormat: "Healthy Services",
123
+ refId: "A",
124
+ },
125
+ ],
126
+ fieldConfig: {
127
+ defaults: {
128
+ thresholds: {
129
+ mode: "absolute",
130
+ steps: [
131
+ { color: "red", value: null },
132
+ { color: "yellow", value: 1 },
133
+ { color: "green", value: 3 },
134
+ ],
135
+ },
136
+ color: { mode: "thresholds" },
137
+ mappings: [],
138
+ },
139
+ overrides: [],
140
+ },
141
+ options: {
142
+ reduceOptions: {
143
+ values: false,
144
+ calcs: ["lastNotNull"],
145
+ fields: "",
146
+ },
147
+ orientation: "auto",
148
+ textMode: "auto",
149
+ colorMode: "background",
150
+ graphMode: "none",
151
+ justifyMode: "auto",
152
+ },
153
+ },
154
+ {
155
+ // ── Memory Usage (gauge) ──
156
+ id: 2,
157
+ title: "Memory Usage",
158
+ type: "gauge",
159
+ gridPos: { h: 8, w: 8, x: 8, y: 0 },
160
+ datasource: { type: "prometheus", uid: "prometheus" },
161
+ targets: [
162
+ {
163
+ expr: "sum(container_memory_usage_bytes) / sum(machine_memory_bytes) * 100",
164
+ legendFormat: "Memory %",
165
+ refId: "A",
166
+ },
167
+ ],
168
+ fieldConfig: {
169
+ defaults: {
170
+ thresholds: {
171
+ mode: "absolute",
172
+ steps: [
173
+ { color: "green", value: null },
174
+ { color: "yellow", value: 60 },
175
+ { color: "red", value: 85 },
176
+ ],
177
+ },
178
+ color: { mode: "thresholds" },
179
+ min: 0,
180
+ max: 100,
181
+ unit: "percent",
182
+ mappings: [],
183
+ },
184
+ overrides: [],
185
+ },
186
+ options: {
187
+ reduceOptions: {
188
+ values: false,
189
+ calcs: ["lastNotNull"],
190
+ fields: "",
191
+ },
192
+ orientation: "auto",
193
+ showThresholdLabels: false,
194
+ showThresholdMarkers: true,
195
+ },
196
+ },
197
+ {
198
+ // ── Request Rate (graph / timeseries) ──
199
+ id: 3,
200
+ title: "Request Rate",
201
+ type: "timeseries",
202
+ gridPos: { h: 8, w: 8, x: 16, y: 0 },
203
+ datasource: { type: "prometheus", uid: "prometheus" },
204
+ targets: [
205
+ {
206
+ expr: 'sum(rate(http_requests_total{job=~".+"}[5m])) by (job)',
207
+ legendFormat: "{{job}}",
208
+ refId: "A",
209
+ },
210
+ ],
211
+ fieldConfig: {
212
+ defaults: {
213
+ color: { mode: "palette-classic" },
214
+ custom: {
215
+ axisBorderShow: false,
216
+ axisCenteredZero: false,
217
+ axisColorMode: "text",
218
+ axisLabel: "req/s",
219
+ drawStyle: "line",
220
+ fillOpacity: 10,
221
+ gradientMode: "none",
222
+ lineInterpolation: "smooth",
223
+ lineWidth: 2,
224
+ pointSize: 5,
225
+ showPoints: "auto",
226
+ spanNulls: false,
227
+ stacking: { group: "A", mode: "none" },
228
+ },
229
+ mappings: [],
230
+ thresholds: {
231
+ mode: "absolute",
232
+ steps: [{ color: "green", value: null }],
233
+ },
234
+ unit: "reqps",
235
+ },
236
+ overrides: [],
237
+ },
238
+ options: {
239
+ legend: { calcs: [], displayMode: "list", placement: "bottom" },
240
+ tooltip: { mode: "multi", sort: "desc" },
241
+ },
242
+ },
243
+ ],
244
+ schemaVersion: 39,
245
+ tags: ["openclaw"],
246
+ templating: { list: [] },
247
+ time: { from: "now-1h", to: "now" },
248
+ timepicker: {},
249
+ timezone: "browser",
250
+ title: "OpenClaw Stack Overview",
251
+ uid: "openclaw-stack-overview",
252
+ };
253
+
254
+ return JSON.stringify(dashboard, null, 2);
255
+ }