@better-openclaw/core 1.0.5 → 1.0.7

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 (414) hide show
  1. package/.github/workflows/publish-core.yml +32 -34
  2. package/dist/bare-metal-partition.d.mts +26 -0
  3. package/dist/bare-metal-partition.d.mts.map +1 -0
  4. package/dist/bare-metal-partition.mjs +48 -0
  5. package/dist/bare-metal-partition.mjs.map +1 -0
  6. package/dist/bare-metal-partition.test.d.mts +1 -0
  7. package/dist/bare-metal-partition.test.mjs +58 -0
  8. package/dist/bare-metal-partition.test.mjs.map +1 -0
  9. package/dist/composer.d.mts +21 -0
  10. package/dist/composer.d.mts.map +1 -0
  11. package/dist/composer.mjs +287 -0
  12. package/dist/composer.mjs.map +1 -0
  13. package/dist/composer.snapshot.test.d.mts +1 -0
  14. package/dist/composer.snapshot.test.mjs +92 -0
  15. package/dist/composer.snapshot.test.mjs.map +1 -0
  16. package/dist/composer.test.d.mts +1 -0
  17. package/dist/composer.test.mjs +166 -0
  18. package/dist/composer.test.mjs.map +1 -0
  19. package/dist/generate.d.mts +11 -0
  20. package/dist/generate.d.mts.map +1 -0
  21. package/dist/generate.mjs +169 -0
  22. package/dist/generate.mjs.map +1 -0
  23. package/dist/generate.test.d.mts +1 -0
  24. package/dist/generate.test.mjs +283 -0
  25. package/dist/generate.test.mjs.map +1 -0
  26. package/dist/generators/bare-metal-install.d.mts +17 -0
  27. package/dist/generators/bare-metal-install.d.mts.map +1 -0
  28. package/dist/generators/bare-metal-install.mjs +224 -0
  29. package/dist/generators/bare-metal-install.mjs.map +1 -0
  30. package/dist/generators/bare-metal-install.test.d.mts +1 -0
  31. package/dist/generators/bare-metal-install.test.mjs +48 -0
  32. package/dist/generators/bare-metal-install.test.mjs.map +1 -0
  33. package/dist/generators/caddy.d.mts +17 -0
  34. package/dist/generators/caddy.d.mts.map +1 -0
  35. package/dist/generators/caddy.mjs +77 -0
  36. package/dist/generators/caddy.mjs.map +1 -0
  37. package/dist/generators/env.d.mts +46 -0
  38. package/dist/generators/env.d.mts.map +1 -0
  39. package/dist/generators/env.mjs +250 -0
  40. package/dist/generators/env.mjs.map +1 -0
  41. package/dist/generators/grafana.d.mts +22 -0
  42. package/dist/generators/grafana.d.mts.map +1 -0
  43. package/dist/generators/grafana.mjs +293 -0
  44. package/dist/generators/grafana.mjs.map +1 -0
  45. package/dist/generators/n8n-workflows.d.mts +11 -0
  46. package/dist/generators/n8n-workflows.d.mts.map +1 -0
  47. package/dist/generators/n8n-workflows.mjs +75 -0
  48. package/dist/generators/n8n-workflows.mjs.map +1 -0
  49. package/dist/generators/native-services.d.mts +17 -0
  50. package/dist/generators/native-services.d.mts.map +1 -0
  51. package/dist/generators/native-services.mjs +78 -0
  52. package/dist/generators/native-services.mjs.map +1 -0
  53. package/dist/generators/postgres-init.d.mts +30 -0
  54. package/dist/generators/postgres-init.d.mts.map +1 -0
  55. package/dist/generators/postgres-init.mjs +151 -0
  56. package/dist/generators/postgres-init.mjs.map +1 -0
  57. package/dist/generators/prometheus.d.mts +14 -0
  58. package/dist/generators/prometheus.d.mts.map +1 -0
  59. package/dist/generators/prometheus.mjs +107 -0
  60. package/dist/generators/prometheus.mjs.map +1 -0
  61. package/dist/generators/readme.d.mts +25 -0
  62. package/dist/generators/readme.d.mts.map +1 -0
  63. package/dist/generators/readme.mjs +199 -0
  64. package/dist/generators/readme.mjs.map +1 -0
  65. package/dist/generators/scripts.d.mts +10 -0
  66. package/dist/generators/scripts.d.mts.map +1 -0
  67. package/dist/generators/scripts.mjs +351 -0
  68. package/dist/generators/scripts.mjs.map +1 -0
  69. package/dist/generators/skills.d.mts +14 -0
  70. package/dist/generators/skills.d.mts.map +1 -0
  71. package/dist/generators/skills.mjs +587 -0
  72. package/dist/generators/skills.mjs.map +1 -0
  73. package/dist/index.d.mts +21 -0
  74. package/dist/index.mjs +22 -0
  75. package/dist/magic-string.es-1uTtupLe.mjs +1014 -0
  76. package/dist/magic-string.es-1uTtupLe.mjs.map +1 -0
  77. package/dist/presets/registry.d.mts +9 -0
  78. package/dist/presets/registry.d.mts.map +1 -0
  79. package/dist/presets/registry.mjs +159 -0
  80. package/dist/presets/registry.mjs.map +1 -0
  81. package/dist/presets/registry.test.d.mts +1 -0
  82. package/dist/presets/registry.test.mjs +34 -0
  83. package/dist/presets/registry.test.mjs.map +1 -0
  84. package/dist/resolver.d.mts +21 -0
  85. package/dist/resolver.d.mts.map +1 -0
  86. package/dist/resolver.mjs +194 -0
  87. package/dist/resolver.mjs.map +1 -0
  88. package/dist/resolver.test.d.mts +1 -0
  89. package/dist/resolver.test.mjs +237 -0
  90. package/dist/resolver.test.mjs.map +1 -0
  91. package/dist/schema.d.mts +706 -0
  92. package/dist/schema.d.mts.map +1 -0
  93. package/dist/schema.mjs +260 -0
  94. package/dist/schema.mjs.map +1 -0
  95. package/dist/schema.test.d.mts +1 -0
  96. package/dist/schema.test.mjs +264 -0
  97. package/dist/schema.test.mjs.map +1 -0
  98. package/dist/services/definitions/anything-llm.d.mts +7 -0
  99. package/dist/services/definitions/anything-llm.d.mts.map +1 -0
  100. package/dist/services/definitions/anything-llm.mjs +44 -0
  101. package/dist/services/definitions/anything-llm.mjs.map +1 -0
  102. package/dist/services/definitions/appflowy.d.mts +7 -0
  103. package/dist/services/definitions/appflowy.d.mts.map +1 -0
  104. package/dist/services/definitions/appflowy.mjs +45 -0
  105. package/dist/services/definitions/appflowy.mjs.map +1 -0
  106. package/dist/services/definitions/beszel.d.mts +7 -0
  107. package/dist/services/definitions/beszel.d.mts.map +1 -0
  108. package/dist/services/definitions/beszel.mjs +45 -0
  109. package/dist/services/definitions/beszel.mjs.map +1 -0
  110. package/dist/services/definitions/browserless.d.mts +7 -0
  111. package/dist/services/definitions/browserless.d.mts.map +1 -0
  112. package/dist/services/definitions/browserless.mjs +85 -0
  113. package/dist/services/definitions/browserless.mjs.map +1 -0
  114. package/dist/services/definitions/caddy.d.mts +7 -0
  115. package/dist/services/definitions/caddy.d.mts.map +1 -0
  116. package/dist/services/definitions/caddy.mjs +52 -0
  117. package/dist/services/definitions/caddy.mjs.map +1 -0
  118. package/dist/services/definitions/chromadb.d.mts +7 -0
  119. package/dist/services/definitions/chromadb.d.mts.map +1 -0
  120. package/dist/services/definitions/chromadb.mjs +63 -0
  121. package/dist/services/definitions/chromadb.mjs.map +1 -0
  122. package/dist/services/definitions/claude-code.d.mts +7 -0
  123. package/dist/services/definitions/claude-code.d.mts.map +1 -0
  124. package/dist/services/definitions/claude-code.mjs +52 -0
  125. package/dist/services/definitions/claude-code.mjs.map +1 -0
  126. package/dist/services/definitions/code-server.d.mts +7 -0
  127. package/dist/services/definitions/code-server.d.mts.map +1 -0
  128. package/dist/services/definitions/code-server.mjs +66 -0
  129. package/dist/services/definitions/code-server.mjs.map +1 -0
  130. package/dist/services/definitions/codex.d.mts +7 -0
  131. package/dist/services/definitions/codex.d.mts.map +1 -0
  132. package/dist/services/definitions/codex.mjs +45 -0
  133. package/dist/services/definitions/codex.mjs.map +1 -0
  134. package/dist/services/definitions/convex-dashboard.d.mts +7 -0
  135. package/dist/services/definitions/convex-dashboard.d.mts.map +1 -0
  136. package/dist/services/definitions/convex-dashboard.mjs +46 -0
  137. package/dist/services/definitions/convex-dashboard.mjs.map +1 -0
  138. package/dist/services/definitions/convex.d.mts +7 -0
  139. package/dist/services/definitions/convex.d.mts.map +1 -0
  140. package/dist/services/definitions/convex.mjs +118 -0
  141. package/dist/services/definitions/convex.mjs.map +1 -0
  142. package/dist/services/definitions/coolify.d.mts +7 -0
  143. package/dist/services/definitions/coolify.d.mts.map +1 -0
  144. package/dist/services/definitions/coolify.mjs +49 -0
  145. package/dist/services/definitions/coolify.mjs.map +1 -0
  146. package/dist/services/definitions/dify.d.mts +7 -0
  147. package/dist/services/definitions/dify.d.mts.map +1 -0
  148. package/dist/services/definitions/dify.mjs +81 -0
  149. package/dist/services/definitions/dify.mjs.map +1 -0
  150. package/dist/services/definitions/docsgpt.d.mts +7 -0
  151. package/dist/services/definitions/docsgpt.d.mts.map +1 -0
  152. package/dist/services/definitions/docsgpt.mjs +45 -0
  153. package/dist/services/definitions/docsgpt.mjs.map +1 -0
  154. package/dist/services/definitions/dokploy.d.mts +7 -0
  155. package/dist/services/definitions/dokploy.d.mts.map +1 -0
  156. package/dist/services/definitions/dokploy.mjs +49 -0
  157. package/dist/services/definitions/dokploy.mjs.map +1 -0
  158. package/dist/services/definitions/dozzle.d.mts +7 -0
  159. package/dist/services/definitions/dozzle.d.mts.map +1 -0
  160. package/dist/services/definitions/dozzle.mjs +41 -0
  161. package/dist/services/definitions/dozzle.mjs.map +1 -0
  162. package/dist/services/definitions/ffmpeg.d.mts +7 -0
  163. package/dist/services/definitions/ffmpeg.d.mts.map +1 -0
  164. package/dist/services/definitions/ffmpeg.mjs +66 -0
  165. package/dist/services/definitions/ffmpeg.mjs.map +1 -0
  166. package/dist/services/definitions/flowise.d.mts +7 -0
  167. package/dist/services/definitions/flowise.d.mts.map +1 -0
  168. package/dist/services/definitions/flowise.mjs +45 -0
  169. package/dist/services/definitions/flowise.mjs.map +1 -0
  170. package/dist/services/definitions/gemini-cli.d.mts +7 -0
  171. package/dist/services/definitions/gemini-cli.d.mts.map +1 -0
  172. package/dist/services/definitions/gemini-cli.mjs +46 -0
  173. package/dist/services/definitions/gemini-cli.mjs.map +1 -0
  174. package/dist/services/definitions/gitea.d.mts +7 -0
  175. package/dist/services/definitions/gitea.d.mts.map +1 -0
  176. package/dist/services/definitions/gitea.mjs +49 -0
  177. package/dist/services/definitions/gitea.mjs.map +1 -0
  178. package/dist/services/definitions/gotify.d.mts +7 -0
  179. package/dist/services/definitions/gotify.d.mts.map +1 -0
  180. package/dist/services/definitions/gotify.mjs +62 -0
  181. package/dist/services/definitions/gotify.mjs.map +1 -0
  182. package/dist/services/definitions/grafana.d.mts +7 -0
  183. package/dist/services/definitions/grafana.d.mts.map +1 -0
  184. package/dist/services/definitions/grafana.mjs +63 -0
  185. package/dist/services/definitions/grafana.mjs.map +1 -0
  186. package/dist/services/definitions/index.d.mts +76 -0
  187. package/dist/services/definitions/index.d.mts.map +1 -0
  188. package/dist/services/definitions/index.mjs +146 -0
  189. package/dist/services/definitions/index.mjs.map +1 -0
  190. package/dist/services/definitions/kimi.d.mts +7 -0
  191. package/dist/services/definitions/kimi.d.mts.map +1 -0
  192. package/dist/services/definitions/kimi.mjs +46 -0
  193. package/dist/services/definitions/kimi.mjs.map +1 -0
  194. package/dist/services/definitions/lasuite-meet-agents.d.mts +7 -0
  195. package/dist/services/definitions/lasuite-meet-agents.d.mts.map +1 -0
  196. package/dist/services/definitions/lasuite-meet-agents.mjs +36 -0
  197. package/dist/services/definitions/lasuite-meet-agents.mjs.map +1 -0
  198. package/dist/services/definitions/lasuite-meet-backend.d.mts +7 -0
  199. package/dist/services/definitions/lasuite-meet-backend.d.mts.map +1 -0
  200. package/dist/services/definitions/lasuite-meet-backend.mjs +134 -0
  201. package/dist/services/definitions/lasuite-meet-backend.mjs.map +1 -0
  202. package/dist/services/definitions/lasuite-meet-frontend.d.mts +7 -0
  203. package/dist/services/definitions/lasuite-meet-frontend.d.mts.map +1 -0
  204. package/dist/services/definitions/lasuite-meet-frontend.mjs +48 -0
  205. package/dist/services/definitions/lasuite-meet-frontend.mjs.map +1 -0
  206. package/dist/services/definitions/librechat.d.mts +7 -0
  207. package/dist/services/definitions/librechat.d.mts.map +1 -0
  208. package/dist/services/definitions/librechat.mjs +50 -0
  209. package/dist/services/definitions/librechat.mjs.map +1 -0
  210. package/dist/services/definitions/lightpanda.d.mts +7 -0
  211. package/dist/services/definitions/lightpanda.d.mts.map +1 -0
  212. package/dist/services/definitions/lightpanda.mjs +59 -0
  213. package/dist/services/definitions/lightpanda.mjs.map +1 -0
  214. package/dist/services/definitions/litellm.d.mts +7 -0
  215. package/dist/services/definitions/litellm.d.mts.map +1 -0
  216. package/dist/services/definitions/litellm.mjs +47 -0
  217. package/dist/services/definitions/litellm.mjs.map +1 -0
  218. package/dist/services/definitions/livekit.d.mts +7 -0
  219. package/dist/services/definitions/livekit.d.mts.map +1 -0
  220. package/dist/services/definitions/livekit.mjs +56 -0
  221. package/dist/services/definitions/livekit.mjs.map +1 -0
  222. package/dist/services/definitions/matomo.d.mts +7 -0
  223. package/dist/services/definitions/matomo.d.mts.map +1 -0
  224. package/dist/services/definitions/matomo.mjs +80 -0
  225. package/dist/services/definitions/matomo.mjs.map +1 -0
  226. package/dist/services/definitions/matrix-synapse.d.mts +7 -0
  227. package/dist/services/definitions/matrix-synapse.d.mts.map +1 -0
  228. package/dist/services/definitions/matrix-synapse.mjs +88 -0
  229. package/dist/services/definitions/matrix-synapse.mjs.map +1 -0
  230. package/dist/services/definitions/mattermost.d.mts +7 -0
  231. package/dist/services/definitions/mattermost.d.mts.map +1 -0
  232. package/dist/services/definitions/mattermost.mjs +61 -0
  233. package/dist/services/definitions/mattermost.mjs.map +1 -0
  234. package/dist/services/definitions/meilisearch.d.mts +7 -0
  235. package/dist/services/definitions/meilisearch.d.mts.map +1 -0
  236. package/dist/services/definitions/meilisearch.mjs +78 -0
  237. package/dist/services/definitions/meilisearch.mjs.map +1 -0
  238. package/dist/services/definitions/minio.d.mts +7 -0
  239. package/dist/services/definitions/minio.d.mts.map +1 -0
  240. package/dist/services/definitions/minio.mjs +102 -0
  241. package/dist/services/definitions/minio.mjs.map +1 -0
  242. package/dist/services/definitions/mission-control.d.mts +7 -0
  243. package/dist/services/definitions/mission-control.d.mts.map +1 -0
  244. package/dist/services/definitions/mission-control.mjs +67 -0
  245. package/dist/services/definitions/mission-control.mjs.map +1 -0
  246. package/dist/services/definitions/mixpost.d.mts +7 -0
  247. package/dist/services/definitions/mixpost.d.mts.map +1 -0
  248. package/dist/services/definitions/mixpost.mjs +87 -0
  249. package/dist/services/definitions/mixpost.mjs.map +1 -0
  250. package/dist/services/definitions/motion-canvas.d.mts +7 -0
  251. package/dist/services/definitions/motion-canvas.d.mts.map +1 -0
  252. package/dist/services/definitions/motion-canvas.mjs +52 -0
  253. package/dist/services/definitions/motion-canvas.mjs.map +1 -0
  254. package/dist/services/definitions/n8n.d.mts +7 -0
  255. package/dist/services/definitions/n8n.d.mts.map +1 -0
  256. package/dist/services/definitions/n8n.mjs +154 -0
  257. package/dist/services/definitions/n8n.mjs.map +1 -0
  258. package/dist/services/definitions/nocodb.d.mts +7 -0
  259. package/dist/services/definitions/nocodb.d.mts.map +1 -0
  260. package/dist/services/definitions/nocodb.mjs +45 -0
  261. package/dist/services/definitions/nocodb.mjs.map +1 -0
  262. package/dist/services/definitions/ntfy.d.mts +7 -0
  263. package/dist/services/definitions/ntfy.d.mts.map +1 -0
  264. package/dist/services/definitions/ntfy.mjs +63 -0
  265. package/dist/services/definitions/ntfy.mjs.map +1 -0
  266. package/dist/services/definitions/ollama.d.mts +7 -0
  267. package/dist/services/definitions/ollama.d.mts.map +1 -0
  268. package/dist/services/definitions/ollama.mjs +66 -0
  269. package/dist/services/definitions/ollama.mjs.map +1 -0
  270. package/dist/services/definitions/open-webui.d.mts +7 -0
  271. package/dist/services/definitions/open-webui.d.mts.map +1 -0
  272. package/dist/services/definitions/open-webui.mjs +50 -0
  273. package/dist/services/definitions/open-webui.mjs.map +1 -0
  274. package/dist/services/definitions/opencode.d.mts +7 -0
  275. package/dist/services/definitions/opencode.d.mts.map +1 -0
  276. package/dist/services/definitions/opencode.mjs +50 -0
  277. package/dist/services/definitions/opencode.mjs.map +1 -0
  278. package/dist/services/definitions/openpanel.d.mts +7 -0
  279. package/dist/services/definitions/openpanel.d.mts.map +1 -0
  280. package/dist/services/definitions/openpanel.mjs +46 -0
  281. package/dist/services/definitions/openpanel.mjs.map +1 -0
  282. package/dist/services/definitions/outline.d.mts +7 -0
  283. package/dist/services/definitions/outline.d.mts.map +1 -0
  284. package/dist/services/definitions/outline.mjs +74 -0
  285. package/dist/services/definitions/outline.mjs.map +1 -0
  286. package/dist/services/definitions/paperless-ngx.d.mts +7 -0
  287. package/dist/services/definitions/paperless-ngx.d.mts.map +1 -0
  288. package/dist/services/definitions/paperless-ngx.mjs +93 -0
  289. package/dist/services/definitions/paperless-ngx.mjs.map +1 -0
  290. package/dist/services/definitions/playwright-server.d.mts +7 -0
  291. package/dist/services/definitions/playwright-server.d.mts.map +1 -0
  292. package/dist/services/definitions/playwright-server.mjs +42 -0
  293. package/dist/services/definitions/playwright-server.mjs.map +1 -0
  294. package/dist/services/definitions/portainer.d.mts +7 -0
  295. package/dist/services/definitions/portainer.d.mts.map +1 -0
  296. package/dist/services/definitions/portainer.mjs +49 -0
  297. package/dist/services/definitions/portainer.mjs.map +1 -0
  298. package/dist/services/definitions/postgresql.d.mts +7 -0
  299. package/dist/services/definitions/postgresql.d.mts.map +1 -0
  300. package/dist/services/definitions/postgresql.mjs +84 -0
  301. package/dist/services/definitions/postgresql.mjs.map +1 -0
  302. package/dist/services/definitions/postiz.d.mts +7 -0
  303. package/dist/services/definitions/postiz.d.mts.map +1 -0
  304. package/dist/services/definitions/postiz.mjs +83 -0
  305. package/dist/services/definitions/postiz.mjs.map +1 -0
  306. package/dist/services/definitions/prometheus.d.mts +7 -0
  307. package/dist/services/definitions/prometheus.d.mts.map +1 -0
  308. package/dist/services/definitions/prometheus.mjs +52 -0
  309. package/dist/services/definitions/prometheus.mjs.map +1 -0
  310. package/dist/services/definitions/qdrant.d.mts +7 -0
  311. package/dist/services/definitions/qdrant.d.mts.map +1 -0
  312. package/dist/services/definitions/qdrant.mjs +77 -0
  313. package/dist/services/definitions/qdrant.mjs.map +1 -0
  314. package/dist/services/definitions/redis.d.mts +7 -0
  315. package/dist/services/definitions/redis.d.mts.map +1 -0
  316. package/dist/services/definitions/redis.mjs +91 -0
  317. package/dist/services/definitions/redis.mjs.map +1 -0
  318. package/dist/services/definitions/remotion.d.mts +7 -0
  319. package/dist/services/definitions/remotion.d.mts.map +1 -0
  320. package/dist/services/definitions/remotion.mjs +55 -0
  321. package/dist/services/definitions/remotion.mjs.map +1 -0
  322. package/dist/services/definitions/rocketchat.d.mts +7 -0
  323. package/dist/services/definitions/rocketchat.d.mts.map +1 -0
  324. package/dist/services/definitions/rocketchat.mjs +57 -0
  325. package/dist/services/definitions/rocketchat.mjs.map +1 -0
  326. package/dist/services/definitions/searxng.d.mts +7 -0
  327. package/dist/services/definitions/searxng.d.mts.map +1 -0
  328. package/dist/services/definitions/searxng.mjs +65 -0
  329. package/dist/services/definitions/searxng.mjs.map +1 -0
  330. package/dist/services/definitions/stable-diffusion.d.mts +7 -0
  331. package/dist/services/definitions/stable-diffusion.d.mts.map +1 -0
  332. package/dist/services/definitions/stable-diffusion.mjs +48 -0
  333. package/dist/services/definitions/stable-diffusion.mjs.map +1 -0
  334. package/dist/services/definitions/steel-browser.d.mts +7 -0
  335. package/dist/services/definitions/steel-browser.d.mts.map +1 -0
  336. package/dist/services/definitions/steel-browser.mjs +77 -0
  337. package/dist/services/definitions/steel-browser.mjs.map +1 -0
  338. package/dist/services/definitions/tailscale.d.mts +7 -0
  339. package/dist/services/definitions/tailscale.d.mts.map +1 -0
  340. package/dist/services/definitions/tailscale.mjs +70 -0
  341. package/dist/services/definitions/tailscale.mjs.map +1 -0
  342. package/dist/services/definitions/temporal.d.mts +7 -0
  343. package/dist/services/definitions/temporal.d.mts.map +1 -0
  344. package/dist/services/definitions/temporal.mjs +100 -0
  345. package/dist/services/definitions/temporal.mjs.map +1 -0
  346. package/dist/services/definitions/traefik.d.mts +7 -0
  347. package/dist/services/definitions/traefik.d.mts.map +1 -0
  348. package/dist/services/definitions/traefik.mjs +58 -0
  349. package/dist/services/definitions/traefik.mjs.map +1 -0
  350. package/dist/services/definitions/umami.d.mts +7 -0
  351. package/dist/services/definitions/umami.d.mts.map +1 -0
  352. package/dist/services/definitions/umami.mjs +46 -0
  353. package/dist/services/definitions/umami.mjs.map +1 -0
  354. package/dist/services/definitions/uptime-kuma.d.mts +7 -0
  355. package/dist/services/definitions/uptime-kuma.d.mts.map +1 -0
  356. package/dist/services/definitions/uptime-kuma.mjs +51 -0
  357. package/dist/services/definitions/uptime-kuma.mjs.map +1 -0
  358. package/dist/services/definitions/usesend.d.mts +7 -0
  359. package/dist/services/definitions/usesend.d.mts.map +1 -0
  360. package/dist/services/definitions/usesend.mjs +99 -0
  361. package/dist/services/definitions/usesend.mjs.map +1 -0
  362. package/dist/services/definitions/valkey.d.mts +7 -0
  363. package/dist/services/definitions/valkey.d.mts.map +1 -0
  364. package/dist/services/definitions/valkey.mjs +61 -0
  365. package/dist/services/definitions/valkey.mjs.map +1 -0
  366. package/dist/services/definitions/watchtower.d.mts +7 -0
  367. package/dist/services/definitions/watchtower.d.mts.map +1 -0
  368. package/dist/services/definitions/watchtower.mjs +47 -0
  369. package/dist/services/definitions/watchtower.mjs.map +1 -0
  370. package/dist/services/definitions/weaviate.d.mts +7 -0
  371. package/dist/services/definitions/weaviate.d.mts.map +1 -0
  372. package/dist/services/definitions/weaviate.mjs +90 -0
  373. package/dist/services/definitions/weaviate.mjs.map +1 -0
  374. package/dist/services/definitions/whisper.d.mts +7 -0
  375. package/dist/services/definitions/whisper.d.mts.map +1 -0
  376. package/dist/services/definitions/whisper.mjs +62 -0
  377. package/dist/services/definitions/whisper.mjs.map +1 -0
  378. package/dist/services/registry.d.mts +16 -0
  379. package/dist/services/registry.d.mts.map +1 -0
  380. package/dist/services/registry.mjs +30 -0
  381. package/dist/services/registry.mjs.map +1 -0
  382. package/dist/services/registry.test.d.mts +1 -0
  383. package/dist/services/registry.test.mjs +64 -0
  384. package/dist/services/registry.test.mjs.map +1 -0
  385. package/dist/skills/registry.d.mts +11 -0
  386. package/dist/skills/registry.d.mts.map +1 -0
  387. package/dist/skills/registry.mjs +215 -0
  388. package/dist/skills/registry.mjs.map +1 -0
  389. package/dist/types.d.mts +64 -0
  390. package/dist/types.d.mts.map +1 -0
  391. package/dist/types.mjs +92 -0
  392. package/dist/types.mjs.map +1 -0
  393. package/dist/validator.d.mts +20 -0
  394. package/dist/validator.d.mts.map +1 -0
  395. package/dist/validator.mjs +111 -0
  396. package/dist/validator.mjs.map +1 -0
  397. package/dist/validator.test.d.mts +1 -0
  398. package/dist/validator.test.mjs +65 -0
  399. package/dist/validator.test.mjs.map +1 -0
  400. package/dist/version-manager.d.mts +14 -0
  401. package/dist/version-manager.d.mts.map +1 -0
  402. package/dist/version-manager.mjs +55 -0
  403. package/dist/version-manager.mjs.map +1 -0
  404. package/dist/vi.2VT5v0um-Qk6MgAnK.mjs +12916 -0
  405. package/dist/vi.2VT5v0um-Qk6MgAnK.mjs.map +1 -0
  406. package/package.json +17 -17
  407. package/src/schema.ts +2 -1
  408. package/src/services/definitions/convex-dashboard.ts +48 -0
  409. package/src/services/definitions/convex.ts +123 -0
  410. package/src/services/definitions/index.ts +12 -0
  411. package/src/services/definitions/mission-control.ts +71 -0
  412. package/src/services/definitions/tailscale.ts +2 -0
  413. package/src/services/definitions/usesend.ts +98 -0
  414. package/tsdown.config.ts +1 -0
@@ -1,39 +1,37 @@
1
1
  name: Publish-Core
2
2
 
3
3
  on:
4
- release:
5
- types: [published]
6
-
7
- permissions:
8
- contents: read
9
- id-token: write
4
+ release:
5
+ types: [published]
10
6
 
11
7
  jobs:
12
- publish:
13
- runs-on: ubuntu-latest
14
- steps:
15
- - uses: actions/checkout@v4
16
-
17
- - uses: pnpm/action-setup@v4
18
-
19
- - uses: actions/setup-node@v4
20
- with:
21
- node-version: 22
22
- cache: pnpm
23
- registry-url: "https://registry.npmjs.org"
24
-
25
- - run: pnpm install --no-lockfile
26
-
27
- # - run: pnpm lint --filter @better-openclaw/core
28
-
29
- # - run: pnpm typecheck --filter @better-openclaw/core
30
-
31
- # - run: pnpm test --filter @better-openclaw/core
32
-
33
- - run: pnpm build
34
-
35
- - name: Publish Core to npm
36
- run: npm publish --access=public
37
- env:
38
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
39
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
8
+ publish-npm:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
12
+ id-token: write
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-node@v4
16
+ with:
17
+ node-version: "20.x"
18
+ registry-url: "https://registry.npmjs.org"
19
+
20
+ - uses: pnpm/action-setup@v2
21
+ with:
22
+ version: 9
23
+ run_install: false
24
+
25
+ - name: Install dependencies
26
+ run: pnpm install --no-lockfile
27
+ env:
28
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
29
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
30
+
31
+ - name: Build and Publish Core Typescript Packages
32
+ run: |
33
+ pnpm --filter @better-openclaw/core build
34
+ npm publish --access=public
35
+ env:
36
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
37
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,26 @@
1
+ import { NativePlatform, Platform, ResolvedService, ResolverOutput } from "./types.mjs";
2
+
3
+ //#region src/bare-metal-partition.d.ts
4
+ /**
5
+ * Maps Platform (e.g. linux/amd64) to NativePlatform (linux, windows, macos).
6
+ */
7
+ declare function platformToNativePlatform(platform: Platform): NativePlatform;
8
+ interface BareMetalPartitionResult {
9
+ nativeServices: ResolvedService[];
10
+ dockerOnlyServices: ResolvedService[];
11
+ nativeIds: Set<string>;
12
+ }
13
+ /**
14
+ * Partitions resolved services into native (run on host via scripts) vs Docker-only.
15
+ * Gateway and CLI are never native; services with nativeSupported and a matching
16
+ * nativeRecipe for the platform go to native, rest to Docker.
17
+ */
18
+ declare function partitionBareMetal(resolved: ResolverOutput, platform: Platform): BareMetalPartitionResult;
19
+ /**
20
+ * Returns a new ResolverOutput containing only the given service list (same order).
21
+ * Used to build compose for Docker-only subset when bare-metal has native services.
22
+ */
23
+ declare function resolvedWithOnlyServices(resolved: ResolverOutput, services: ResolvedService[]): ResolverOutput;
24
+ //#endregion
25
+ export { BareMetalPartitionResult, partitionBareMetal, platformToNativePlatform, resolvedWithOnlyServices };
26
+ //# sourceMappingURL=bare-metal-partition.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-metal-partition.d.mts","names":[],"sources":["../src/bare-metal-partition.ts"],"mappings":";;;;;AAKA;iBAAgB,wBAAA,CAAyB,QAAA,EAAU,QAAA,GAAW,cAAA;AAAA,UAO7C,wBAAA;EAChB,cAAA,EAAgB,eAAA;EAChB,kBAAA,EAAoB,eAAA;EACpB,SAAA,EAAW,GAAA;AAAA;;;AAHZ;;;iBAWgB,kBAAA,CACf,QAAA,EAAU,cAAA,EACV,QAAA,EAAU,QAAA,GACR,wBAAA;;;;;iBA4Ba,wBAAA,CACf,QAAA,EAAU,cAAA,EACV,QAAA,EAAU,eAAA,KACR,cAAA"}
@@ -0,0 +1,48 @@
1
+ //#region src/bare-metal-partition.ts
2
+ /**
3
+ * Maps Platform (e.g. linux/amd64) to NativePlatform (linux, windows, macos).
4
+ */
5
+ function platformToNativePlatform(platform) {
6
+ if (platform.startsWith("linux/")) return "linux";
7
+ if (platform.startsWith("windows/")) return "windows";
8
+ if (platform.startsWith("macos/")) return "macos";
9
+ return "linux";
10
+ }
11
+ /**
12
+ * Partitions resolved services into native (run on host via scripts) vs Docker-only.
13
+ * Gateway and CLI are never native; services with nativeSupported and a matching
14
+ * nativeRecipe for the platform go to native, rest to Docker.
15
+ */
16
+ function partitionBareMetal(resolved, platform) {
17
+ const nativePlatform = platformToNativePlatform(platform);
18
+ const nativeServices = [];
19
+ const dockerOnlyServices = [];
20
+ const nativeIds = /* @__PURE__ */ new Set();
21
+ for (const entry of resolved.services) {
22
+ const def = entry.definition;
23
+ if (def.nativeSupported === true && def.nativeRecipes?.length && def.nativeRecipes.some((r) => r.platform === nativePlatform)) {
24
+ nativeServices.push(entry);
25
+ nativeIds.add(def.id);
26
+ } else dockerOnlyServices.push(entry);
27
+ }
28
+ return {
29
+ nativeServices,
30
+ dockerOnlyServices,
31
+ nativeIds
32
+ };
33
+ }
34
+ /**
35
+ * Returns a new ResolverOutput containing only the given service list (same order).
36
+ * Used to build compose for Docker-only subset when bare-metal has native services.
37
+ */
38
+ function resolvedWithOnlyServices(resolved, services) {
39
+ const idSet = new Set(services.map((s) => s.definition.id));
40
+ return {
41
+ ...resolved,
42
+ services: resolved.services.filter((s) => idSet.has(s.definition.id))
43
+ };
44
+ }
45
+
46
+ //#endregion
47
+ export { partitionBareMetal, platformToNativePlatform, resolvedWithOnlyServices };
48
+ //# sourceMappingURL=bare-metal-partition.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-metal-partition.mjs","names":[],"sources":["../src/bare-metal-partition.ts"],"sourcesContent":["import type { NativePlatform, Platform, ResolvedService, ResolverOutput } from \"./types.js\";\n\n/**\n * Maps Platform (e.g. linux/amd64) to NativePlatform (linux, windows, macos).\n */\nexport function platformToNativePlatform(platform: Platform): NativePlatform {\n\tif (platform.startsWith(\"linux/\")) return \"linux\";\n\tif (platform.startsWith(\"windows/\")) return \"windows\";\n\tif (platform.startsWith(\"macos/\")) return \"macos\";\n\treturn \"linux\";\n}\n\nexport interface BareMetalPartitionResult {\n\tnativeServices: ResolvedService[];\n\tdockerOnlyServices: ResolvedService[];\n\tnativeIds: Set<string>;\n}\n\n/**\n * Partitions resolved services into native (run on host via scripts) vs Docker-only.\n * Gateway and CLI are never native; services with nativeSupported and a matching\n * nativeRecipe for the platform go to native, rest to Docker.\n */\nexport function partitionBareMetal(\n\tresolved: ResolverOutput,\n\tplatform: Platform,\n): BareMetalPartitionResult {\n\tconst nativePlatform = platformToNativePlatform(platform);\n\tconst nativeServices: ResolvedService[] = [];\n\tconst dockerOnlyServices: ResolvedService[] = [];\n\tconst nativeIds = new Set<string>();\n\n\tfor (const entry of resolved.services) {\n\t\tconst def = entry.definition;\n\t\tconst hasNativeRecipe =\n\t\t\tdef.nativeSupported === true &&\n\t\t\tdef.nativeRecipes?.length &&\n\t\t\tdef.nativeRecipes.some((r) => r.platform === nativePlatform);\n\n\t\tif (hasNativeRecipe) {\n\t\t\tnativeServices.push(entry);\n\t\t\tnativeIds.add(def.id);\n\t\t} else {\n\t\t\tdockerOnlyServices.push(entry);\n\t\t}\n\t}\n\n\treturn { nativeServices, dockerOnlyServices, nativeIds };\n}\n\n/**\n * Returns a new ResolverOutput containing only the given service list (same order).\n * Used to build compose for Docker-only subset when bare-metal has native services.\n */\nexport function resolvedWithOnlyServices(\n\tresolved: ResolverOutput,\n\tservices: ResolvedService[],\n): ResolverOutput {\n\tconst idSet = new Set(services.map((s) => s.definition.id));\n\treturn {\n\t\t...resolved,\n\t\tservices: resolved.services.filter((s) => idSet.has(s.definition.id)),\n\t};\n}\n"],"mappings":";;;;AAKA,SAAgB,yBAAyB,UAAoC;AAC5E,KAAI,SAAS,WAAW,SAAS,CAAE,QAAO;AAC1C,KAAI,SAAS,WAAW,WAAW,CAAE,QAAO;AAC5C,KAAI,SAAS,WAAW,SAAS,CAAE,QAAO;AAC1C,QAAO;;;;;;;AAcR,SAAgB,mBACf,UACA,UAC2B;CAC3B,MAAM,iBAAiB,yBAAyB,SAAS;CACzD,MAAM,iBAAoC,EAAE;CAC5C,MAAM,qBAAwC,EAAE;CAChD,MAAM,4BAAY,IAAI,KAAa;AAEnC,MAAK,MAAM,SAAS,SAAS,UAAU;EACtC,MAAM,MAAM,MAAM;AAMlB,MAJC,IAAI,oBAAoB,QACxB,IAAI,eAAe,UACnB,IAAI,cAAc,MAAM,MAAM,EAAE,aAAa,eAAe,EAExC;AACpB,kBAAe,KAAK,MAAM;AAC1B,aAAU,IAAI,IAAI,GAAG;QAErB,oBAAmB,KAAK,MAAM;;AAIhC,QAAO;EAAE;EAAgB;EAAoB;EAAW;;;;;;AAOzD,SAAgB,yBACf,UACA,UACiB;CACjB,MAAM,QAAQ,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,WAAW,GAAG,CAAC;AAC3D,QAAO;EACN,GAAG;EACH,UAAU,SAAS,SAAS,QAAQ,MAAM,MAAM,IAAI,EAAE,WAAW,GAAG,CAAC;EACrE"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,58 @@
1
+ import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-Qk6MgAnK.mjs";
2
+ import { partitionBareMetal, platformToNativePlatform, resolvedWithOnlyServices } from "./bare-metal-partition.mjs";
3
+ import { resolve } from "./resolver.mjs";
4
+
5
+ //#region src/bare-metal-partition.test.ts
6
+ describe("bare-metal partition", () => {
7
+ it("platformToNativePlatform maps platform to native", () => {
8
+ globalExpect(platformToNativePlatform("linux/amd64")).toBe("linux");
9
+ globalExpect(platformToNativePlatform("linux/arm64")).toBe("linux");
10
+ globalExpect(platformToNativePlatform("windows/amd64")).toBe("windows");
11
+ globalExpect(platformToNativePlatform("macos/arm64")).toBe("macos");
12
+ });
13
+ it("partitions redis as native on Linux when redis has native recipe", () => {
14
+ const result = partitionBareMetal(resolve({
15
+ services: ["redis"],
16
+ skillPacks: [],
17
+ proxy: "none",
18
+ gpu: false,
19
+ platform: "linux/amd64",
20
+ monitoring: false
21
+ }), "linux/amd64");
22
+ globalExpect(result.nativeIds.has("redis")).toBe(true);
23
+ globalExpect(result.nativeServices.length).toBe(1);
24
+ globalExpect(result.nativeServices[0].definition.id).toBe("redis");
25
+ globalExpect(result.dockerOnlyServices.length).toBe(0);
26
+ });
27
+ it("partitions n8n as Docker-only (no native recipe)", () => {
28
+ const result = partitionBareMetal(resolve({
29
+ services: ["n8n"],
30
+ skillPacks: [],
31
+ proxy: "none",
32
+ gpu: false,
33
+ platform: "linux/amd64",
34
+ monitoring: false
35
+ }), "linux/amd64");
36
+ globalExpect(result.nativeIds.has("n8n")).toBe(false);
37
+ globalExpect(result.nativeServices.length).toBe(0);
38
+ globalExpect(result.dockerOnlyServices.length).toBeGreaterThanOrEqual(1);
39
+ globalExpect(result.dockerOnlyServices.some((s) => s.definition.id === "n8n")).toBe(true);
40
+ });
41
+ it("resolvedWithOnlyServices filters to given service list", () => {
42
+ const resolved = resolve({
43
+ services: ["redis", "n8n"],
44
+ skillPacks: [],
45
+ proxy: "none",
46
+ gpu: false,
47
+ platform: "linux/amd64",
48
+ monitoring: false
49
+ });
50
+ const filtered = resolvedWithOnlyServices(resolved, partitionBareMetal(resolved, "linux/amd64").dockerOnlyServices);
51
+ globalExpect(filtered.services.every((s) => s.definition.id !== "redis")).toBe(true);
52
+ globalExpect(filtered.services.some((s) => s.definition.id === "n8n")).toBe(true);
53
+ });
54
+ });
55
+
56
+ //#endregion
57
+ export { };
58
+ //# sourceMappingURL=bare-metal-partition.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-metal-partition.test.mjs","names":[],"sources":["../src/bare-metal-partition.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { resolve } from \"./resolver.js\";\n\ndescribe(\"bare-metal partition\", () => {\n\tit(\"platformToNativePlatform maps platform to native\", () => {\n\t\texpect(platformToNativePlatform(\"linux/amd64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"linux/arm64\")).toBe(\"linux\");\n\t\texpect(platformToNativePlatform(\"windows/amd64\")).toBe(\"windows\");\n\t\texpect(platformToNativePlatform(\"macos/arm64\")).toBe(\"macos\");\n\t});\n\n\tit(\"partitions redis as native on Linux when redis has native recipe\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"redis\")).toBe(true);\n\t\texpect(result.nativeServices.length).toBe(1);\n\t\texpect(result.nativeServices[0].definition.id).toBe(\"redis\");\n\t\texpect(result.dockerOnlyServices.length).toBe(0);\n\t});\n\n\tit(\"partitions n8n as Docker-only (no native recipe)\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst result = partitionBareMetal(resolved, \"linux/amd64\");\n\t\texpect(result.nativeIds.has(\"n8n\")).toBe(false);\n\t\texpect(result.nativeServices.length).toBe(0);\n\t\texpect(result.dockerOnlyServices.length).toBeGreaterThanOrEqual(1);\n\t\texpect(result.dockerOnlyServices.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n\n\tit(\"resolvedWithOnlyServices filters to given service list\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tmonitoring: false,\n\t\t});\n\t\tconst partition = partitionBareMetal(resolved, \"linux/amd64\");\n\t\tconst filtered = resolvedWithOnlyServices(resolved, partition.dockerOnlyServices);\n\t\texpect(filtered.services.every((s) => s.definition.id !== \"redis\")).toBe(true);\n\t\texpect(filtered.services.some((s) => s.definition.id === \"n8n\")).toBe(true);\n\t});\n});\n"],"mappings":";;;;;AAQA,SAAS,8BAA8B;AACtC,IAAG,0DAA0D;AAC5D,eAAO,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;AAC7D,eAAO,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;AAC7D,eAAO,yBAAyB,gBAAgB,CAAC,CAAC,KAAK,UAAU;AACjE,eAAO,yBAAyB,cAAc,CAAC,CAAC,KAAK,QAAQ;GAC5D;AAEF,IAAG,0EAA0E;EAS5E,MAAM,SAAS,mBARE,QAAQ;GACxB,UAAU,CAAC,QAAQ;GACnB,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC,EAC0C,cAAc;AAC1D,eAAO,OAAO,UAAU,IAAI,QAAQ,CAAC,CAAC,KAAK,KAAK;AAChD,eAAO,OAAO,eAAe,OAAO,CAAC,KAAK,EAAE;AAC5C,eAAO,OAAO,eAAe,GAAG,WAAW,GAAG,CAAC,KAAK,QAAQ;AAC5D,eAAO,OAAO,mBAAmB,OAAO,CAAC,KAAK,EAAE;GAC/C;AAEF,IAAG,0DAA0D;EAS5D,MAAM,SAAS,mBARE,QAAQ;GACxB,UAAU,CAAC,MAAM;GACjB,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC,EAC0C,cAAc;AAC1D,eAAO,OAAO,UAAU,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM;AAC/C,eAAO,OAAO,eAAe,OAAO,CAAC,KAAK,EAAE;AAC5C,eAAO,OAAO,mBAAmB,OAAO,CAAC,uBAAuB,EAAE;AAClE,eAAO,OAAO,mBAAmB,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;GAClF;AAEF,IAAG,gEAAgE;EAClE,MAAM,WAAW,QAAQ;GACxB,UAAU,CAAC,SAAS,MAAM;GAC1B,YAAY,EAAE;GACd,OAAO;GACP,KAAK;GACL,UAAU;GACV,YAAY;GACZ,CAAC;EAEF,MAAM,WAAW,yBAAyB,UADxB,mBAAmB,UAAU,cAAc,CACC,mBAAmB;AACjF,eAAO,SAAS,SAAS,OAAO,MAAM,EAAE,WAAW,OAAO,QAAQ,CAAC,CAAC,KAAK,KAAK;AAC9E,eAAO,SAAS,SAAS,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;GAC1E;EACD"}
@@ -0,0 +1,21 @@
1
+ import { ComposeOptions, ResolverOutput } from "./types.mjs";
2
+
3
+ //#region src/composer.d.ts
4
+ interface ComposeResult {
5
+ files: Record<string, string>;
6
+ mainFile: string;
7
+ profiles: string[];
8
+ }
9
+ /**
10
+ * Generates a single Docker Compose YAML string with ALL services.
11
+ * Backward-compatible signature.
12
+ */
13
+ declare function compose(resolved: ResolverOutput, options: ComposeOptions): string;
14
+ /**
15
+ * Generates multiple Docker Compose files, splitting services into profile-based
16
+ * override files by category.
17
+ */
18
+ declare function composeMultiFile(resolved: ResolverOutput, options: ComposeOptions): ComposeResult;
19
+ //#endregion
20
+ export { ComposeResult, compose, composeMultiFile };
21
+ //# sourceMappingURL=composer.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.d.mts","names":[],"sources":["../src/composer.ts"],"mappings":";;;UAKiB,aAAA;EAChB,KAAA,EAAO,MAAA;EACP,QAAA;EACA,QAAA;AAAA;;;;;iBA8Oe,OAAA,CAAQ,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA;;;AAA3D;;iBAkDgB,gBAAA,CAAiB,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAA,GAAiB,aAAA"}
@@ -0,0 +1,287 @@
1
+ import { stringify } from "yaml";
2
+
3
+ //#region src/composer.ts
4
+ const CATEGORY_PROFILE_MAP = {
5
+ ai: {
6
+ file: "docker-compose.ai.yml",
7
+ profile: "ai"
8
+ },
9
+ "ai-platform": {
10
+ file: "docker-compose.ai.yml",
11
+ profile: "ai"
12
+ },
13
+ media: {
14
+ file: "docker-compose.media.yml",
15
+ profile: "media"
16
+ },
17
+ monitoring: {
18
+ file: "docker-compose.monitoring.yml",
19
+ profile: "monitoring"
20
+ },
21
+ analytics: {
22
+ file: "docker-compose.monitoring.yml",
23
+ profile: "monitoring"
24
+ },
25
+ "dev-tools": {
26
+ file: "docker-compose.tools.yml",
27
+ profile: "tools"
28
+ },
29
+ "coding-agent": {
30
+ file: "docker-compose.tools.yml",
31
+ profile: "tools"
32
+ },
33
+ "social-media": {
34
+ file: "docker-compose.social.yml",
35
+ profile: "social"
36
+ },
37
+ knowledge: {
38
+ file: "docker-compose.knowledge.yml",
39
+ profile: "knowledge"
40
+ },
41
+ communication: {
42
+ file: "docker-compose.communication.yml",
43
+ profile: "communication"
44
+ }
45
+ };
46
+ const YAML_OPTIONS = {
47
+ lineWidth: 120,
48
+ nullStr: ""
49
+ };
50
+ /**
51
+ * Builds the OpenClaw gateway and CLI service entries.
52
+ * Matches the real OpenClaw docker-compose.yml structure:
53
+ * - Bridge port 18790 for ACP/WebSocket
54
+ * - Bind-mount volumes (not named volumes)
55
+ * - Claude web-provider session env vars
56
+ * - Gateway bind mode (--bind lan)
57
+ * - CLI companion service with stdin/tty
58
+ */
59
+ function buildGatewayServices(resolved, options, dependsOn) {
60
+ const allVolumes = /* @__PURE__ */ new Set();
61
+ const gatewayEnv = {
62
+ HOME: "/home/node",
63
+ TERM: "xterm-256color",
64
+ OPENCLAW_GATEWAY_TOKEN: "${OPENCLAW_GATEWAY_TOKEN}",
65
+ CLAUDE_AI_SESSION_KEY: "${CLAUDE_AI_SESSION_KEY}",
66
+ CLAUDE_WEB_SESSION_KEY: "${CLAUDE_WEB_SESSION_KEY}",
67
+ CLAUDE_WEB_COOKIE: "${CLAUDE_WEB_COOKIE}"
68
+ };
69
+ const gatewayVolumes = ["${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw", "${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace"];
70
+ for (const { definition: def } of resolved.services) {
71
+ for (const env of def.openclawEnvVars) gatewayEnv[env.key] = env.secret ? `\${${env.key}}` : env.defaultValue;
72
+ if (def.openclawVolumeMounts) for (const vol of def.openclawVolumeMounts) {
73
+ allVolumes.add(vol.name);
74
+ gatewayVolumes.push(`${vol.name}:${vol.containerPath}`);
75
+ }
76
+ }
77
+ const gateway = {
78
+ image: `\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,
79
+ environment: gatewayEnv,
80
+ volumes: gatewayVolumes,
81
+ ports: ["${OPENCLAW_GATEWAY_PORT:-18789}:18789", "${OPENCLAW_BRIDGE_PORT:-18790}:18790"],
82
+ networks: ["openclaw-network"],
83
+ init: true,
84
+ restart: "unless-stopped",
85
+ command: [
86
+ "node",
87
+ "dist/index.js",
88
+ "gateway",
89
+ "--bind",
90
+ "${OPENCLAW_GATEWAY_BIND:-lan}",
91
+ "--port",
92
+ "18789"
93
+ ]
94
+ };
95
+ if (options.bareMetalNativeHost) gateway.extra_hosts = ["host.docker.internal:host-gateway"];
96
+ if (dependsOn && Object.keys(dependsOn).length > 0) gateway.depends_on = dependsOn;
97
+ return {
98
+ gatewayService: gateway,
99
+ cliService: {
100
+ image: `\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,
101
+ environment: {
102
+ HOME: "/home/node",
103
+ TERM: "xterm-256color",
104
+ OPENCLAW_GATEWAY_TOKEN: "${OPENCLAW_GATEWAY_TOKEN}",
105
+ BROWSER: "echo",
106
+ CLAUDE_AI_SESSION_KEY: "${CLAUDE_AI_SESSION_KEY}",
107
+ CLAUDE_WEB_SESSION_KEY: "${CLAUDE_WEB_SESSION_KEY}",
108
+ CLAUDE_WEB_COOKIE: "${CLAUDE_WEB_COOKIE}"
109
+ },
110
+ volumes: ["${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw", "${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace"],
111
+ stdin_open: true,
112
+ tty: true,
113
+ init: true,
114
+ networks: ["openclaw-network"],
115
+ entrypoint: ["node", "dist/index.js"]
116
+ },
117
+ allVolumes
118
+ };
119
+ }
120
+ function buildCompanionService(def, resolved, options, allVolumes) {
121
+ const svc = {};
122
+ const volumeNames = [];
123
+ svc.image = `${def.image}:${def.imageTag}`;
124
+ if (def.environment.length > 0) {
125
+ const env = {};
126
+ for (const e of def.environment) env[e.key] = e.secret ? `\${${e.key}}` : e.defaultValue;
127
+ svc.environment = env;
128
+ }
129
+ const exposedPorts = def.ports.filter((p) => p.exposed);
130
+ if (exposedPorts.length > 0) {
131
+ const prefix = def.id.toUpperCase().replace(/-/g, "_");
132
+ svc.ports = exposedPorts.map((p, i) => {
133
+ return `\${${prefix}_PORT${exposedPorts.length > 1 ? `_${i}` : ""}:-${p.host}}:${p.container}`;
134
+ });
135
+ }
136
+ if (def.volumes.length > 0) svc.volumes = def.volumes.map((v) => {
137
+ allVolumes.add(v.name);
138
+ volumeNames.push(v.name);
139
+ return `${v.name}:${v.containerPath}`;
140
+ });
141
+ if (def.id === "postgresql") {
142
+ if (!svc.volumes) svc.volumes = [];
143
+ svc.volumes.push("./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro");
144
+ }
145
+ if (def.healthcheck) {
146
+ const hc = {
147
+ test: ["CMD-SHELL", def.healthcheck.test],
148
+ interval: def.healthcheck.interval,
149
+ timeout: def.healthcheck.timeout,
150
+ retries: def.healthcheck.retries
151
+ };
152
+ if (def.healthcheck.startPeriod) hc.start_period = def.healthcheck.startPeriod;
153
+ svc.healthcheck = hc;
154
+ }
155
+ svc.restart = def.restartPolicy;
156
+ svc.networks = def.networks;
157
+ if (def.command) svc.command = def.command;
158
+ if (def.entrypoint) svc.entrypoint = def.entrypoint;
159
+ if (def.labels && Object.keys(def.labels).length > 0) svc.labels = def.labels;
160
+ let deploy;
161
+ if (def.deploy) deploy = JSON.parse(JSON.stringify(def.deploy));
162
+ if (options.gpu && def.gpuRequired) {
163
+ const base = deploy ?? {};
164
+ const resources = base.resources ?? {};
165
+ deploy = {
166
+ ...base,
167
+ resources: {
168
+ ...resources,
169
+ reservations: {
170
+ ...resources.reservations ?? {},
171
+ devices: [{
172
+ driver: "nvidia",
173
+ count: "all",
174
+ capabilities: ["gpu"]
175
+ }]
176
+ }
177
+ }
178
+ };
179
+ }
180
+ if (deploy) svc.deploy = deploy;
181
+ const depIds = [...new Set([...def.dependsOn, ...def.requires])].filter((id) => resolved.services.some((s) => s.definition.id === id));
182
+ if (depIds.length > 0) {
183
+ const dependsOn = {};
184
+ for (const depId of depIds) dependsOn[depId] = { condition: resolved.services.find((s) => s.definition.id === depId)?.definition.healthcheck ? "service_healthy" : "service_started" };
185
+ svc.depends_on = dependsOn;
186
+ }
187
+ return {
188
+ entry: svc,
189
+ volumeNames
190
+ };
191
+ }
192
+ /**
193
+ * Generates a single Docker Compose YAML string with ALL services.
194
+ * Backward-compatible signature.
195
+ */
196
+ function compose(resolved, options) {
197
+ const gatewayDependsOn = {};
198
+ for (const { definition: def } of resolved.services) gatewayDependsOn[def.id] = { condition: def.healthcheck ? "service_healthy" : "service_started" };
199
+ const { gatewayService, cliService, allVolumes } = buildGatewayServices(resolved, options, gatewayDependsOn);
200
+ const services = { "openclaw-gateway": gatewayService };
201
+ for (const { definition: def } of resolved.services) {
202
+ const { entry } = buildCompanionService(def, resolved, options, allVolumes);
203
+ services[def.id] = entry;
204
+ }
205
+ services["openclaw-cli"] = cliService;
206
+ const volumes = {};
207
+ for (const v of [...allVolumes].sort()) volumes[v] = null;
208
+ return stringify({
209
+ services,
210
+ volumes,
211
+ networks: { "openclaw-network": { driver: "bridge" } }
212
+ }, YAML_OPTIONS);
213
+ }
214
+ /**
215
+ * Generates multiple Docker Compose files, splitting services into profile-based
216
+ * override files by category.
217
+ */
218
+ function composeMultiFile(resolved, options) {
219
+ const allVolumes = /* @__PURE__ */ new Set();
220
+ const serviceInfos = [];
221
+ for (const { definition: def } of resolved.services) {
222
+ const { entry, volumeNames } = buildCompanionService(def, resolved, options, allVolumes);
223
+ serviceInfos.push({
224
+ id: def.id,
225
+ category: def.category,
226
+ entry,
227
+ volumeNames
228
+ });
229
+ }
230
+ const baseServiceIds = /* @__PURE__ */ new Set();
231
+ const profileFileMap = {};
232
+ for (const info of serviceInfos) {
233
+ const mapping = CATEGORY_PROFILE_MAP[info.category];
234
+ if (mapping) {
235
+ if (!profileFileMap[mapping.file]) profileFileMap[mapping.file] = {
236
+ profile: mapping.profile,
237
+ services: []
238
+ };
239
+ profileFileMap[mapping.file].services.push(info);
240
+ } else baseServiceIds.add(info.id);
241
+ }
242
+ const gatewayDependsOn = {};
243
+ for (const { definition: def } of resolved.services) if (baseServiceIds.has(def.id)) gatewayDependsOn[def.id] = { condition: def.healthcheck ? "service_healthy" : "service_started" };
244
+ const { gatewayService, cliService, allVolumes: gwVolumes } = buildGatewayServices(resolved, options, gatewayDependsOn);
245
+ for (const v of gwVolumes) allVolumes.add(v);
246
+ const baseServices = { "openclaw-gateway": gatewayService };
247
+ for (const info of serviceInfos) if (baseServiceIds.has(info.id)) baseServices[info.id] = info.entry;
248
+ baseServices["openclaw-cli"] = cliService;
249
+ const sortedAllVolumes = {};
250
+ for (const v of [...allVolumes].sort()) sortedAllVolumes[v] = null;
251
+ const networks = { "openclaw-network": { driver: "bridge" } };
252
+ const files = {};
253
+ files["docker-compose.yml"] = stringify({
254
+ services: baseServices,
255
+ volumes: sortedAllVolumes,
256
+ networks
257
+ }, YAML_OPTIONS);
258
+ const usedProfiles = /* @__PURE__ */ new Set();
259
+ for (const [fileName, { profile, services }] of Object.entries(profileFileMap)) {
260
+ usedProfiles.add(profile);
261
+ const profileServices = {};
262
+ const profileVolumes = /* @__PURE__ */ new Set();
263
+ for (const info of services) {
264
+ profileServices[info.id] = {
265
+ ...info.entry,
266
+ profiles: [profile]
267
+ };
268
+ for (const vName of info.volumeNames) profileVolumes.add(vName);
269
+ }
270
+ const fileContent = { services: profileServices };
271
+ if (profileVolumes.size > 0) {
272
+ const sortedProfileVolumes = {};
273
+ for (const v of [...profileVolumes].sort()) sortedProfileVolumes[v] = null;
274
+ fileContent.volumes = sortedProfileVolumes;
275
+ }
276
+ files[fileName] = stringify(fileContent, YAML_OPTIONS);
277
+ }
278
+ return {
279
+ files,
280
+ mainFile: "docker-compose.yml",
281
+ profiles: [...usedProfiles].sort()
282
+ };
283
+ }
284
+
285
+ //#endregion
286
+ export { compose, composeMultiFile };
287
+ //# sourceMappingURL=composer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.mjs","names":[],"sources":["../src/composer.ts"],"sourcesContent":["import { stringify } from \"yaml\";\nimport type { ComposeOptions, ResolverOutput, ServiceCategory } from \"./types.js\";\n\n// ── Public Types ────────────────────────────────────────────────────────────\n\nexport interface ComposeResult {\n\tfiles: Record<string, string>; // filename -> YAML content\n\tmainFile: string; // \"docker-compose.yml\"\n\tprofiles: string[]; // list of profiles used\n}\n\n// ── Category → Profile Mapping ──────────────────────────────────────────────\n\nconst CATEGORY_PROFILE_MAP: Partial<Record<ServiceCategory, { file: string; profile: string }>> = {\n\tai: { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\t\"ai-platform\": { file: \"docker-compose.ai.yml\", profile: \"ai\" },\n\tmedia: { file: \"docker-compose.media.yml\", profile: \"media\" },\n\tmonitoring: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\tanalytics: { file: \"docker-compose.monitoring.yml\", profile: \"monitoring\" },\n\t\"dev-tools\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"coding-agent\": { file: \"docker-compose.tools.yml\", profile: \"tools\" },\n\t\"social-media\": { file: \"docker-compose.social.yml\", profile: \"social\" },\n\tknowledge: { file: \"docker-compose.knowledge.yml\", profile: \"knowledge\" },\n\tcommunication: { file: \"docker-compose.communication.yml\", profile: \"communication\" },\n};\n\nconst YAML_OPTIONS = { lineWidth: 120, nullStr: \"\" };\n\n// ── Shared Gateway Builder ──────────────────────────────────────────────────\n\ninterface GatewayBuildResult {\n\tgatewayService: Record<string, unknown>;\n\tcliService: Record<string, unknown>;\n\tallVolumes: Set<string>;\n}\n\n/**\n * Builds the OpenClaw gateway and CLI service entries.\n * Matches the real OpenClaw docker-compose.yml structure:\n * - Bridge port 18790 for ACP/WebSocket\n * - Bind-mount volumes (not named volumes)\n * - Claude web-provider session env vars\n * - Gateway bind mode (--bind lan)\n * - CLI companion service with stdin/tty\n */\nfunction buildGatewayServices(\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tdependsOn?: Record<string, { condition: string }>,\n): GatewayBuildResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Gateway environment\n\tconst gatewayEnv: Record<string, string> = {\n\t\tHOME: \"/home/node\",\n\t\tTERM: \"xterm-256color\",\n\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t// Claude web-provider session vars (optional, user fills in .env)\n\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t};\n\n\t// Gateway volumes (bind-mount style matching real docker-setup.sh)\n\tconst gatewayVolumes: string[] = [\n\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t];\n\n\t// Collect env vars and volume mounts from companion services\n\tfor (const { definition: def } of resolved.services) {\n\t\tfor (const env of def.openclawEnvVars) {\n\t\t\tgatewayEnv[env.key] = env.secret ? `\\${${env.key}}` : env.defaultValue;\n\t\t}\n\t\tif (def.openclawVolumeMounts) {\n\t\t\tfor (const vol of def.openclawVolumeMounts) {\n\t\t\t\tallVolumes.add(vol.name);\n\t\t\t\tgatewayVolumes.push(`${vol.name}:${vol.containerPath}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Gateway service\n\tconst gateway: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,\n\t\tenvironment: gatewayEnv,\n\t\tvolumes: gatewayVolumes,\n\t\tports: [\"${OPENCLAW_GATEWAY_PORT:-18789}:18789\", \"${OPENCLAW_BRIDGE_PORT:-18790}:18790\"],\n\t\tnetworks: [\"openclaw-network\"],\n\t\tinit: true,\n\t\trestart: \"unless-stopped\",\n\t\tcommand: [\n\t\t\t\"node\",\n\t\t\t\"dist/index.js\",\n\t\t\t\"gateway\",\n\t\t\t\"--bind\",\n\t\t\t\"${OPENCLAW_GATEWAY_BIND:-lan}\",\n\t\t\t\"--port\",\n\t\t\t\"18789\",\n\t\t],\n\t};\n\n\tif (options.bareMetalNativeHost) {\n\t\tgateway.extra_hosts = [\"host.docker.internal:host-gateway\"];\n\t}\n\n\tif (dependsOn && Object.keys(dependsOn).length > 0) {\n\t\tgateway.depends_on = dependsOn;\n\t}\n\n\t// CLI companion service (matching real OpenClaw docker-compose.yml)\n\tconst cliService: Record<string, unknown> = {\n\t\timage: `\\${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:${options.openclawVersion}}`,\n\t\tenvironment: {\n\t\t\tHOME: \"/home/node\",\n\t\t\tTERM: \"xterm-256color\",\n\t\t\tOPENCLAW_GATEWAY_TOKEN: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t\tBROWSER: \"echo\",\n\t\t\tCLAUDE_AI_SESSION_KEY: \"${CLAUDE_AI_SESSION_KEY}\",\n\t\t\tCLAUDE_WEB_SESSION_KEY: \"${CLAUDE_WEB_SESSION_KEY}\",\n\t\t\tCLAUDE_WEB_COOKIE: \"${CLAUDE_WEB_COOKIE}\",\n\t\t},\n\t\tvolumes: [\n\t\t\t\"${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw\",\n\t\t\t\"${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace\",\n\t\t],\n\t\tstdin_open: true,\n\t\ttty: true,\n\t\tinit: true,\n\t\tnetworks: [\"openclaw-network\"],\n\t\tentrypoint: [\"node\", \"dist/index.js\"],\n\t};\n\n\treturn { gatewayService: gateway, cliService: cliService, allVolumes };\n}\n\n// ── Shared Companion Service Builder ────────────────────────────────────────\n\nfunction buildCompanionService(\n\tdef: ResolverOutput[\"services\"][number][\"definition\"],\n\tresolved: ResolverOutput,\n\toptions: ComposeOptions,\n\tallVolumes: Set<string>,\n): { entry: Record<string, unknown>; volumeNames: string[] } {\n\tconst svc: Record<string, unknown> = {};\n\tconst volumeNames: string[] = [];\n\n\tsvc.image = `${def.image}:${def.imageTag}`;\n\n\tif (def.environment.length > 0) {\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const e of def.environment) {\n\t\t\tenv[e.key] = e.secret ? `\\${${e.key}}` : e.defaultValue;\n\t\t}\n\t\tsvc.environment = env;\n\t}\n\n\tconst exposedPorts = def.ports.filter((p) => p.exposed);\n\tif (exposedPorts.length > 0) {\n\t\tconst prefix = def.id.toUpperCase().replace(/-/g, \"_\");\n\t\tsvc.ports = exposedPorts.map((p, i) => {\n\t\t\tconst suffix = exposedPorts.length > 1 ? `_${i}` : \"\";\n\t\t\treturn `\\${${prefix}_PORT${suffix}:-${p.host}}:${p.container}`;\n\t\t});\n\t}\n\n\tif (def.volumes.length > 0) {\n\t\tsvc.volumes = def.volumes.map((v) => {\n\t\t\tallVolumes.add(v.name);\n\t\t\tvolumeNames.push(v.name);\n\t\t\treturn `${v.name}:${v.containerPath}`;\n\t\t});\n\t}\n\n\t// PostgreSQL: mount the init script for creating per-service databases\n\tif (def.id === \"postgresql\") {\n\t\tif (!svc.volumes) svc.volumes = [];\n\t\t(svc.volumes as string[]).push(\n\t\t\t\"./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro\",\n\t\t);\n\t}\n\n\tif (def.healthcheck) {\n\t\tconst hc: Record<string, unknown> = {\n\t\t\ttest: [\"CMD-SHELL\", def.healthcheck.test],\n\t\t\tinterval: def.healthcheck.interval,\n\t\t\ttimeout: def.healthcheck.timeout,\n\t\t\tretries: def.healthcheck.retries,\n\t\t};\n\t\tif (def.healthcheck.startPeriod) {\n\t\t\thc.start_period = def.healthcheck.startPeriod;\n\t\t}\n\t\tsvc.healthcheck = hc;\n\t}\n\n\tsvc.restart = def.restartPolicy;\n\tsvc.networks = def.networks;\n\n\tif (def.command) svc.command = def.command;\n\tif (def.entrypoint) svc.entrypoint = def.entrypoint;\n\tif (def.labels && Object.keys(def.labels).length > 0) svc.labels = def.labels;\n\n\tlet deploy: Record<string, unknown> | undefined;\n\tif (def.deploy) {\n\t\tdeploy = JSON.parse(JSON.stringify(def.deploy)) as Record<string, unknown>;\n\t}\n\tif (options.gpu && def.gpuRequired) {\n\t\tconst base = deploy ?? {};\n\t\tconst resources = (base.resources ?? {}) as Record<string, unknown>;\n\t\tdeploy = {\n\t\t\t...base,\n\t\t\tresources: {\n\t\t\t\t...resources,\n\t\t\t\treservations: {\n\t\t\t\t\t...((resources.reservations as Record<string, unknown>) ?? {}),\n\t\t\t\t\tdevices: [{ driver: \"nvidia\", count: \"all\", capabilities: [\"gpu\"] }],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\tif (deploy) svc.deploy = deploy;\n\n\t// Merge both dependsOn and requires to ensure proper Docker startup ordering\n\tconst depIds = [...new Set([...def.dependsOn, ...def.requires])].filter((id) =>\n\t\tresolved.services.some((s) => s.definition.id === id),\n\t);\n\tif (depIds.length > 0) {\n\t\tconst dependsOn: Record<string, { condition: string }> = {};\n\t\tfor (const depId of depIds) {\n\t\t\tconst dep = resolved.services.find((s) => s.definition.id === depId);\n\t\t\tdependsOn[depId] = {\n\t\t\t\tcondition: dep?.definition.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t\tsvc.depends_on = dependsOn;\n\t}\n\n\treturn { entry: svc, volumeNames };\n}\n\n// ── Single-File Compose ─────────────────────────────────────────────────────\n\n/**\n * Generates a single Docker Compose YAML string with ALL services.\n * Backward-compatible signature.\n */\nexport function compose(resolved: ResolverOutput, options: ComposeOptions): string {\n\t// Build depends_on for ALL companion services\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tgatewayDependsOn[def.id] = {\n\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t};\n\t}\n\n\tconst { gatewayService, cliService, allVolumes } = buildGatewayServices(\n\t\tresolved,\n\t\toptions,\n\t\tgatewayDependsOn,\n\t);\n\n\tconst services: Record<string, Record<string, unknown>> = {\n\t\t\"openclaw-gateway\": gatewayService,\n\t};\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry } = buildCompanionService(def, resolved, options, allVolumes);\n\t\tservices[def.id] = entry;\n\t}\n\n\t// Add CLI service\n\tservices[\"openclaw-cli\"] = cliService;\n\n\tconst volumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tvolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\treturn stringify({ services, volumes, networks }, YAML_OPTIONS);\n}\n\n// ── Multi-File Compose ──────────────────────────────────────────────────────\n\ninterface ServiceInfo {\n\tid: string;\n\tcategory: ServiceCategory;\n\tentry: Record<string, unknown>;\n\tvolumeNames: string[];\n}\n\n/**\n * Generates multiple Docker Compose files, splitting services into profile-based\n * override files by category.\n */\nexport function composeMultiFile(resolved: ResolverOutput, options: ComposeOptions): ComposeResult {\n\tconst allVolumes = new Set<string>();\n\n\t// Build all companion service entries & classify by category\n\tconst serviceInfos: ServiceInfo[] = [];\n\n\tfor (const { definition: def } of resolved.services) {\n\t\tconst { entry, volumeNames } = buildCompanionService(def, resolved, options, allVolumes);\n\t\tserviceInfos.push({ id: def.id, category: def.category, entry, volumeNames });\n\t}\n\n\t// Partition services into base vs. profile files\n\tconst baseServiceIds = new Set<string>();\n\tconst profileFileMap: Record<string, { profile: string; services: ServiceInfo[] }> = {};\n\n\tfor (const info of serviceInfos) {\n\t\tconst mapping = CATEGORY_PROFILE_MAP[info.category];\n\t\tif (mapping) {\n\t\t\tif (!profileFileMap[mapping.file]) {\n\t\t\t\tprofileFileMap[mapping.file] = { profile: mapping.profile, services: [] };\n\t\t\t}\n\t\t\tprofileFileMap[mapping.file]!.services.push(info);\n\t\t} else {\n\t\t\tbaseServiceIds.add(info.id);\n\t\t}\n\t}\n\n\t// Gateway depends_on (only base services)\n\tconst gatewayDependsOn: Record<string, { condition: string }> = {};\n\tfor (const { definition: def } of resolved.services) {\n\t\tif (baseServiceIds.has(def.id)) {\n\t\t\tgatewayDependsOn[def.id] = {\n\t\t\t\tcondition: def.healthcheck ? \"service_healthy\" : \"service_started\",\n\t\t\t};\n\t\t}\n\t}\n\n\tconst {\n\t\tgatewayService,\n\t\tcliService,\n\t\tallVolumes: gwVolumes,\n\t} = buildGatewayServices(resolved, options, gatewayDependsOn);\n\n\t// Merge gateway volumes into allVolumes\n\tfor (const v of gwVolumes) allVolumes.add(v);\n\n\t// Base file: gateway + CLI + core services + ALL volumes + networks\n\tconst baseServices: Record<string, Record<string, unknown>> = {\n\t\t\"openclaw-gateway\": gatewayService,\n\t};\n\n\tfor (const info of serviceInfos) {\n\t\tif (baseServiceIds.has(info.id)) {\n\t\t\tbaseServices[info.id] = info.entry;\n\t\t}\n\t}\n\n\tbaseServices[\"openclaw-cli\"] = cliService;\n\n\tconst sortedAllVolumes: Record<string, null> = {};\n\tfor (const v of [...allVolumes].sort()) {\n\t\tsortedAllVolumes[v] = null;\n\t}\n\n\tconst networks = { \"openclaw-network\": { driver: \"bridge\" } };\n\n\tconst files: Record<string, string> = {};\n\tfiles[\"docker-compose.yml\"] = stringify(\n\t\t{ services: baseServices, volumes: sortedAllVolumes, networks },\n\t\tYAML_OPTIONS,\n\t);\n\n\t// Profile override files\n\tconst usedProfiles = new Set<string>();\n\n\tfor (const [fileName, { profile, services }] of Object.entries(profileFileMap)) {\n\t\tusedProfiles.add(profile);\n\n\t\tconst profileServices: Record<string, Record<string, unknown>> = {};\n\t\tconst profileVolumes = new Set<string>();\n\n\t\tfor (const info of services) {\n\t\t\tprofileServices[info.id] = { ...info.entry, profiles: [profile] };\n\t\t\tfor (const vName of info.volumeNames) {\n\t\t\t\tprofileVolumes.add(vName);\n\t\t\t}\n\t\t}\n\n\t\tconst fileContent: Record<string, unknown> = { services: profileServices };\n\n\t\tif (profileVolumes.size > 0) {\n\t\t\tconst sortedProfileVolumes: Record<string, null> = {};\n\t\t\tfor (const v of [...profileVolumes].sort()) {\n\t\t\t\tsortedProfileVolumes[v] = null;\n\t\t\t}\n\t\t\tfileContent.volumes = sortedProfileVolumes;\n\t\t}\n\n\t\tfiles[fileName] = stringify(fileContent, YAML_OPTIONS);\n\t}\n\n\treturn {\n\t\tfiles,\n\t\tmainFile: \"docker-compose.yml\",\n\t\tprofiles: [...usedProfiles].sort(),\n\t};\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };