@better-openclaw/core 1.0.16 → 1.0.18

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 (970) hide show
  1. package/README.md +27 -0
  2. package/dist/bare-metal-partition.cjs +53 -0
  3. package/dist/bare-metal-partition.cjs.map +1 -0
  4. package/dist/bare-metal-partition.d.cts +26 -0
  5. package/dist/bare-metal-partition.d.cts.map +1 -0
  6. package/dist/bare-metal-partition.test.cjs +57 -0
  7. package/dist/bare-metal-partition.test.cjs.map +1 -0
  8. package/dist/bare-metal-partition.test.d.cts +1 -0
  9. package/dist/bare-metal-partition.test.mjs +1 -1
  10. package/dist/chunk-C0xms8kb.cjs +34 -0
  11. package/dist/compose-validation.test.cjs +67 -0
  12. package/dist/compose-validation.test.cjs.map +1 -0
  13. package/dist/compose-validation.test.d.cts +1 -0
  14. package/dist/compose-validation.test.d.mts +1 -0
  15. package/dist/compose-validation.test.mjs +66 -0
  16. package/dist/compose-validation.test.mjs.map +1 -0
  17. package/dist/composer.cjs +462 -0
  18. package/dist/composer.cjs.map +1 -0
  19. package/dist/composer.d.cts +21 -0
  20. package/dist/composer.d.cts.map +1 -0
  21. package/dist/composer.d.mts.map +1 -1
  22. package/dist/composer.mjs +187 -27
  23. package/dist/composer.mjs.map +1 -1
  24. package/dist/composer.snapshot.test.cjs +91 -0
  25. package/dist/composer.snapshot.test.cjs.map +1 -0
  26. package/dist/composer.snapshot.test.d.cts +1 -0
  27. package/dist/composer.snapshot.test.mjs +1 -1
  28. package/dist/composer.test.cjs +166 -0
  29. package/dist/composer.test.cjs.map +1 -0
  30. package/dist/composer.test.d.cts +1 -0
  31. package/dist/composer.test.mjs +2 -2
  32. package/dist/composer.test.mjs.map +1 -1
  33. package/dist/deployers/coolify.cjs +174 -0
  34. package/dist/deployers/coolify.cjs.map +1 -0
  35. package/dist/deployers/coolify.d.cts +25 -0
  36. package/dist/deployers/coolify.d.cts.map +1 -0
  37. package/dist/deployers/coolify.d.mts +25 -0
  38. package/dist/deployers/coolify.d.mts.map +1 -0
  39. package/dist/deployers/coolify.mjs +172 -0
  40. package/dist/deployers/coolify.mjs.map +1 -0
  41. package/dist/deployers/dokploy.cjs +141 -0
  42. package/dist/deployers/dokploy.cjs.map +1 -0
  43. package/dist/deployers/dokploy.d.cts +24 -0
  44. package/dist/deployers/dokploy.d.cts.map +1 -0
  45. package/dist/deployers/dokploy.d.mts +24 -0
  46. package/dist/deployers/dokploy.d.mts.map +1 -0
  47. package/dist/deployers/dokploy.mjs +139 -0
  48. package/dist/deployers/dokploy.mjs.map +1 -0
  49. package/dist/deployers/index.cjs +26 -0
  50. package/dist/deployers/index.cjs.map +1 -0
  51. package/dist/deployers/index.d.cts +14 -0
  52. package/dist/deployers/index.d.cts.map +1 -0
  53. package/dist/deployers/index.d.mts +14 -0
  54. package/dist/deployers/index.d.mts.map +1 -0
  55. package/dist/deployers/index.mjs +21 -0
  56. package/dist/deployers/index.mjs.map +1 -0
  57. package/dist/deployers/types.cjs +0 -0
  58. package/dist/deployers/types.d.cts +72 -0
  59. package/dist/deployers/types.d.cts.map +1 -0
  60. package/dist/deployers/types.d.mts +72 -0
  61. package/dist/deployers/types.d.mts.map +1 -0
  62. package/dist/deployers/types.mjs +1 -0
  63. package/dist/errors.cjs +27 -0
  64. package/dist/errors.cjs.map +1 -0
  65. package/dist/errors.d.cts +17 -0
  66. package/dist/errors.d.cts.map +1 -0
  67. package/dist/generate.cjs +225 -0
  68. package/dist/generate.cjs.map +1 -0
  69. package/dist/generate.d.cts +12 -0
  70. package/dist/generate.d.cts.map +1 -0
  71. package/dist/generate.d.mts.map +1 -1
  72. package/dist/generate.mjs +34 -5
  73. package/dist/generate.mjs.map +1 -1
  74. package/dist/generate.test.cjs +283 -0
  75. package/dist/generate.test.cjs.map +1 -0
  76. package/dist/generate.test.d.cts +1 -0
  77. package/dist/generate.test.mjs +1 -1
  78. package/dist/generators/bare-metal-install.cjs +226 -0
  79. package/dist/generators/bare-metal-install.cjs.map +1 -0
  80. package/dist/generators/bare-metal-install.d.cts +17 -0
  81. package/dist/generators/bare-metal-install.d.cts.map +1 -0
  82. package/dist/generators/bare-metal-install.test.cjs +47 -0
  83. package/dist/generators/bare-metal-install.test.cjs.map +1 -0
  84. package/dist/generators/bare-metal-install.test.d.cts +1 -0
  85. package/dist/generators/bare-metal-install.test.mjs +1 -1
  86. package/dist/generators/caddy.cjs +79 -0
  87. package/dist/generators/caddy.cjs.map +1 -0
  88. package/dist/generators/caddy.d.cts +17 -0
  89. package/dist/generators/caddy.d.cts.map +1 -0
  90. package/dist/generators/caddy.test.cjs +44 -0
  91. package/dist/generators/caddy.test.cjs.map +1 -0
  92. package/dist/generators/caddy.test.d.cts +1 -0
  93. package/dist/generators/caddy.test.mjs +1 -1
  94. package/dist/generators/cloud-init.cjs +132 -0
  95. package/dist/generators/cloud-init.cjs.map +1 -0
  96. package/dist/generators/cloud-init.d.cts +25 -0
  97. package/dist/generators/cloud-init.d.cts.map +1 -0
  98. package/dist/generators/cloud-init.d.mts +25 -0
  99. package/dist/generators/cloud-init.d.mts.map +1 -0
  100. package/dist/generators/cloud-init.mjs +130 -0
  101. package/dist/generators/cloud-init.mjs.map +1 -0
  102. package/dist/generators/env.cjs +325 -0
  103. package/dist/generators/env.cjs.map +1 -0
  104. package/dist/generators/env.d.cts +52 -0
  105. package/dist/generators/env.d.cts.map +1 -0
  106. package/dist/generators/env.d.mts +6 -0
  107. package/dist/generators/env.d.mts.map +1 -1
  108. package/dist/generators/env.mjs +58 -6
  109. package/dist/generators/env.mjs.map +1 -1
  110. package/dist/generators/env.test.cjs +59 -0
  111. package/dist/generators/env.test.cjs.map +1 -0
  112. package/dist/generators/env.test.d.cts +1 -0
  113. package/dist/generators/env.test.mjs +1 -1
  114. package/dist/generators/get-shit-done.cjs +40 -0
  115. package/dist/generators/get-shit-done.cjs.map +1 -0
  116. package/dist/generators/get-shit-done.d.cts +10 -0
  117. package/dist/generators/get-shit-done.d.cts.map +1 -0
  118. package/dist/generators/grafana.cjs +296 -0
  119. package/dist/generators/grafana.cjs.map +1 -0
  120. package/dist/generators/grafana.d.cts +22 -0
  121. package/dist/generators/grafana.d.cts.map +1 -0
  122. package/dist/generators/health-check.cjs +707 -0
  123. package/dist/generators/health-check.cjs.map +1 -0
  124. package/dist/generators/health-check.d.cts +18 -0
  125. package/dist/generators/health-check.d.cts.map +1 -0
  126. package/dist/generators/health-check.d.mts +2 -2
  127. package/dist/generators/health-check.d.mts.map +1 -1
  128. package/dist/generators/health-check.mjs.map +1 -1
  129. package/dist/generators/health-check.test.cjs +84 -0
  130. package/dist/generators/health-check.test.cjs.map +1 -0
  131. package/dist/generators/health-check.test.d.cts +1 -0
  132. package/dist/generators/health-check.test.mjs +1 -1
  133. package/dist/generators/n8n-workflows.cjs +77 -0
  134. package/dist/generators/n8n-workflows.cjs.map +1 -0
  135. package/dist/generators/n8n-workflows.d.cts +11 -0
  136. package/dist/generators/n8n-workflows.d.cts.map +1 -0
  137. package/dist/generators/native-services.cjs +80 -0
  138. package/dist/generators/native-services.cjs.map +1 -0
  139. package/dist/generators/native-services.d.cts +17 -0
  140. package/dist/generators/native-services.d.cts.map +1 -0
  141. package/dist/generators/openclaw-install-script.cjs +68 -0
  142. package/dist/generators/openclaw-install-script.cjs.map +1 -0
  143. package/dist/generators/openclaw-install-script.d.cts +12 -0
  144. package/dist/generators/openclaw-install-script.d.cts.map +1 -0
  145. package/dist/generators/openclaw-install-script.d.mts +12 -0
  146. package/dist/generators/openclaw-install-script.d.mts.map +1 -0
  147. package/dist/generators/openclaw-install-script.mjs +66 -0
  148. package/dist/generators/openclaw-install-script.mjs.map +1 -0
  149. package/dist/generators/openclaw-json.cjs +540 -0
  150. package/dist/generators/openclaw-json.cjs.map +1 -0
  151. package/dist/generators/openclaw-json.d.cts +16 -0
  152. package/dist/generators/openclaw-json.d.cts.map +1 -0
  153. package/dist/generators/openclaw-json.d.mts +8 -3
  154. package/dist/generators/openclaw-json.d.mts.map +1 -1
  155. package/dist/generators/openclaw-json.mjs +214 -86
  156. package/dist/generators/openclaw-json.mjs.map +1 -1
  157. package/dist/generators/postgres-init.cjs +189 -0
  158. package/dist/generators/postgres-init.cjs.map +1 -0
  159. package/dist/generators/postgres-init.d.cts +30 -0
  160. package/dist/generators/postgres-init.d.cts.map +1 -0
  161. package/dist/generators/postgres-init.d.mts.map +1 -1
  162. package/dist/generators/postgres-init.mjs +35 -0
  163. package/dist/generators/postgres-init.mjs.map +1 -1
  164. package/dist/generators/prometheus.cjs +109 -0
  165. package/dist/generators/prometheus.cjs.map +1 -0
  166. package/dist/generators/prometheus.d.cts +14 -0
  167. package/dist/generators/prometheus.d.cts.map +1 -0
  168. package/dist/generators/readme.cjs +286 -0
  169. package/dist/generators/readme.cjs.map +1 -0
  170. package/dist/generators/readme.d.cts +27 -0
  171. package/dist/generators/readme.d.cts.map +1 -0
  172. package/dist/generators/readme.d.mts +3 -1
  173. package/dist/generators/readme.d.mts.map +1 -1
  174. package/dist/generators/readme.mjs +88 -3
  175. package/dist/generators/readme.mjs.map +1 -1
  176. package/dist/generators/scripts.cjs +353 -0
  177. package/dist/generators/scripts.cjs.map +1 -0
  178. package/dist/generators/scripts.d.cts +10 -0
  179. package/dist/generators/scripts.d.cts.map +1 -0
  180. package/dist/generators/scripts.test.cjs +51 -0
  181. package/dist/generators/scripts.test.cjs.map +1 -0
  182. package/dist/generators/scripts.test.d.cts +1 -0
  183. package/dist/generators/scripts.test.mjs +1 -1
  184. package/dist/generators/skills.cjs +590 -0
  185. package/dist/generators/skills.cjs.map +1 -0
  186. package/dist/generators/skills.d.cts +14 -0
  187. package/dist/generators/skills.d.cts.map +1 -0
  188. package/dist/generators/stack-manifest.cjs +70 -0
  189. package/dist/generators/stack-manifest.cjs.map +1 -0
  190. package/dist/generators/stack-manifest.d.cts +51 -0
  191. package/dist/generators/stack-manifest.d.cts.map +1 -0
  192. package/dist/generators/stack-manifest.d.mts +51 -0
  193. package/dist/generators/stack-manifest.d.mts.map +1 -0
  194. package/dist/generators/stack-manifest.mjs +68 -0
  195. package/dist/generators/stack-manifest.mjs.map +1 -0
  196. package/dist/generators/traefik.cjs +88 -0
  197. package/dist/generators/traefik.cjs.map +1 -0
  198. package/dist/generators/traefik.d.cts +19 -0
  199. package/dist/generators/traefik.d.cts.map +1 -0
  200. package/dist/generators/traefik.test.cjs +68 -0
  201. package/dist/generators/traefik.test.cjs.map +1 -0
  202. package/dist/generators/traefik.test.d.cts +1 -0
  203. package/dist/generators/traefik.test.mjs +1 -1
  204. package/dist/index.cjs +118 -0
  205. package/dist/index.d.cts +31 -0
  206. package/dist/index.d.mts +9 -3
  207. package/dist/index.mjs +8 -3
  208. package/dist/magic-string.es-D2agHT3I.cjs +1015 -0
  209. package/dist/magic-string.es-D2agHT3I.cjs.map +1 -0
  210. package/dist/manifest-4uLbISXV.cjs +1190 -0
  211. package/dist/manifest-4uLbISXV.cjs.map +1 -0
  212. package/dist/migrations.cjs +37 -0
  213. package/dist/migrations.cjs.map +1 -0
  214. package/dist/migrations.d.cts +14 -0
  215. package/dist/migrations.d.cts.map +1 -0
  216. package/dist/migrations.test.cjs +41 -0
  217. package/dist/migrations.test.cjs.map +1 -0
  218. package/dist/migrations.test.d.cts +1 -0
  219. package/dist/migrations.test.mjs +1 -1
  220. package/dist/port-scanner.cjs +125 -0
  221. package/dist/port-scanner.cjs.map +1 -0
  222. package/dist/port-scanner.d.cts +27 -0
  223. package/dist/port-scanner.d.cts.map +1 -0
  224. package/dist/port-scanner.d.mts +27 -0
  225. package/dist/port-scanner.d.mts.map +1 -0
  226. package/dist/port-scanner.mjs +122 -0
  227. package/dist/port-scanner.mjs.map +1 -0
  228. package/dist/presets/presets.test.cjs +65 -0
  229. package/dist/presets/presets.test.cjs.map +1 -0
  230. package/dist/presets/presets.test.d.cts +1 -0
  231. package/dist/presets/presets.test.d.mts +1 -0
  232. package/dist/presets/presets.test.mjs +64 -0
  233. package/dist/presets/presets.test.mjs.map +1 -0
  234. package/dist/presets/registry.cjs +193 -0
  235. package/dist/presets/registry.cjs.map +1 -0
  236. package/dist/presets/registry.d.cts +9 -0
  237. package/dist/presets/registry.d.cts.map +1 -0
  238. package/dist/presets/registry.d.mts.map +1 -1
  239. package/dist/presets/registry.mjs +38 -8
  240. package/dist/presets/registry.mjs.map +1 -1
  241. package/dist/presets/registry.test.cjs +36 -0
  242. package/dist/presets/registry.test.cjs.map +1 -0
  243. package/dist/presets/registry.test.d.cts +1 -0
  244. package/dist/presets/registry.test.mjs +5 -2
  245. package/dist/presets/registry.test.mjs.map +1 -1
  246. package/dist/resolver.cjs +217 -0
  247. package/dist/resolver.cjs.map +1 -0
  248. package/dist/resolver.d.cts +26 -0
  249. package/dist/resolver.d.cts.map +1 -0
  250. package/dist/resolver.mjs +2 -0
  251. package/dist/resolver.mjs.map +1 -1
  252. package/dist/resolver.test.cjs +236 -0
  253. package/dist/resolver.test.cjs.map +1 -0
  254. package/dist/resolver.test.d.cts +1 -0
  255. package/dist/resolver.test.mjs +1 -1
  256. package/dist/schema.cjs +354 -0
  257. package/dist/schema.cjs.map +1 -0
  258. package/dist/schema.d.cts +854 -0
  259. package/dist/schema.d.cts.map +1 -0
  260. package/dist/schema.d.mts +56 -1
  261. package/dist/schema.d.mts.map +1 -1
  262. package/dist/schema.mjs +31 -4
  263. package/dist/schema.mjs.map +1 -1
  264. package/dist/schema.test.cjs +263 -0
  265. package/dist/schema.test.cjs.map +1 -0
  266. package/dist/schema.test.d.cts +1 -0
  267. package/dist/schema.test.mjs +1 -1
  268. package/dist/services/definitions/anything-llm.cjs +46 -0
  269. package/dist/services/definitions/anything-llm.cjs.map +1 -0
  270. package/dist/services/definitions/anything-llm.d.cts +7 -0
  271. package/dist/services/definitions/anything-llm.d.cts.map +1 -0
  272. package/dist/services/definitions/anything-llm.mjs +2 -2
  273. package/dist/services/definitions/anything-llm.mjs.map +1 -1
  274. package/dist/services/definitions/appflowy.cjs +47 -0
  275. package/dist/services/definitions/appflowy.cjs.map +1 -0
  276. package/dist/services/definitions/appflowy.d.cts +7 -0
  277. package/dist/services/definitions/appflowy.d.cts.map +1 -0
  278. package/dist/services/definitions/appflowy.mjs +1 -1
  279. package/dist/services/definitions/appflowy.mjs.map +1 -1
  280. package/dist/services/definitions/authentik.cjs +107 -0
  281. package/dist/services/definitions/authentik.cjs.map +1 -0
  282. package/dist/services/definitions/authentik.d.cts +7 -0
  283. package/dist/services/definitions/authentik.d.cts.map +1 -0
  284. package/dist/services/definitions/authentik.mjs +5 -5
  285. package/dist/services/definitions/authentik.mjs.map +1 -1
  286. package/dist/services/definitions/beszel.cjs +47 -0
  287. package/dist/services/definitions/beszel.cjs.map +1 -0
  288. package/dist/services/definitions/beszel.d.cts +7 -0
  289. package/dist/services/definitions/beszel.d.cts.map +1 -0
  290. package/dist/services/definitions/beszel.mjs +1 -1
  291. package/dist/services/definitions/beszel.mjs.map +1 -1
  292. package/dist/services/definitions/browserless.cjs +87 -0
  293. package/dist/services/definitions/browserless.cjs.map +1 -0
  294. package/dist/services/definitions/browserless.d.cts +7 -0
  295. package/dist/services/definitions/browserless.d.cts.map +1 -0
  296. package/dist/services/definitions/browserless.mjs +1 -1
  297. package/dist/services/definitions/browserless.mjs.map +1 -1
  298. package/dist/services/definitions/caddy.cjs +73 -0
  299. package/dist/services/definitions/caddy.cjs.map +1 -0
  300. package/dist/services/definitions/caddy.d.cts +7 -0
  301. package/dist/services/definitions/caddy.d.cts.map +1 -0
  302. package/dist/services/definitions/caddy.mjs +2 -2
  303. package/dist/services/definitions/caddy.mjs.map +1 -1
  304. package/dist/services/definitions/cal-com.cjs +90 -0
  305. package/dist/services/definitions/cal-com.cjs.map +1 -0
  306. package/dist/services/definitions/cal-com.d.cts +7 -0
  307. package/dist/services/definitions/cal-com.d.cts.map +1 -0
  308. package/dist/services/definitions/cal-com.mjs +2 -2
  309. package/dist/services/definitions/cal-com.mjs.map +1 -1
  310. package/dist/services/definitions/chromadb.cjs +65 -0
  311. package/dist/services/definitions/chromadb.cjs.map +1 -0
  312. package/dist/services/definitions/chromadb.d.cts +7 -0
  313. package/dist/services/definitions/chromadb.d.cts.map +1 -0
  314. package/dist/services/definitions/chromadb.mjs +3 -3
  315. package/dist/services/definitions/chromadb.mjs.map +1 -1
  316. package/dist/services/definitions/claude-code.cjs +54 -0
  317. package/dist/services/definitions/claude-code.cjs.map +1 -0
  318. package/dist/services/definitions/claude-code.d.cts +7 -0
  319. package/dist/services/definitions/claude-code.d.cts.map +1 -0
  320. package/dist/services/definitions/claude-code.mjs +1 -1
  321. package/dist/services/definitions/claude-code.mjs.map +1 -1
  322. package/dist/services/definitions/code-server.cjs +68 -0
  323. package/dist/services/definitions/code-server.cjs.map +1 -0
  324. package/dist/services/definitions/code-server.d.cts +7 -0
  325. package/dist/services/definitions/code-server.d.cts.map +1 -0
  326. package/dist/services/definitions/code-server.mjs +1 -1
  327. package/dist/services/definitions/code-server.mjs.map +1 -1
  328. package/dist/services/definitions/codex.cjs +47 -0
  329. package/dist/services/definitions/codex.cjs.map +1 -0
  330. package/dist/services/definitions/codex.d.cts +7 -0
  331. package/dist/services/definitions/codex.d.cts.map +1 -0
  332. package/dist/services/definitions/codex.mjs +1 -1
  333. package/dist/services/definitions/codex.mjs.map +1 -1
  334. package/dist/services/definitions/comfyui.cjs +85 -0
  335. package/dist/services/definitions/comfyui.cjs.map +1 -0
  336. package/dist/services/definitions/comfyui.d.cts +7 -0
  337. package/dist/services/definitions/comfyui.d.cts.map +1 -0
  338. package/dist/services/definitions/comfyui.mjs +1 -1
  339. package/dist/services/definitions/comfyui.mjs.map +1 -1
  340. package/dist/services/definitions/convex-dashboard.cjs +48 -0
  341. package/dist/services/definitions/convex-dashboard.cjs.map +1 -0
  342. package/dist/services/definitions/convex-dashboard.d.cts +7 -0
  343. package/dist/services/definitions/convex-dashboard.d.cts.map +1 -0
  344. package/dist/services/definitions/convex.cjs +120 -0
  345. package/dist/services/definitions/convex.cjs.map +1 -0
  346. package/dist/services/definitions/convex.d.cts +7 -0
  347. package/dist/services/definitions/convex.d.cts.map +1 -0
  348. package/dist/services/definitions/coolify.cjs +51 -0
  349. package/dist/services/definitions/coolify.cjs.map +1 -0
  350. package/dist/services/definitions/coolify.d.cts +7 -0
  351. package/dist/services/definitions/coolify.d.cts.map +1 -0
  352. package/dist/services/definitions/coolify.mjs +1 -1
  353. package/dist/services/definitions/coolify.mjs.map +1 -1
  354. package/dist/services/definitions/crowdsec.cjs +64 -0
  355. package/dist/services/definitions/crowdsec.cjs.map +1 -0
  356. package/dist/services/definitions/crowdsec.d.cts +7 -0
  357. package/dist/services/definitions/crowdsec.d.cts.map +1 -0
  358. package/dist/services/definitions/crowdsec.mjs +2 -2
  359. package/dist/services/definitions/crowdsec.mjs.map +1 -1
  360. package/dist/services/definitions/desktop-environment.cjs +155 -0
  361. package/dist/services/definitions/desktop-environment.cjs.map +1 -0
  362. package/dist/services/definitions/desktop-environment.d.cts +7 -0
  363. package/dist/services/definitions/desktop-environment.d.cts.map +1 -0
  364. package/dist/services/definitions/desktop-environment.mjs +1 -1
  365. package/dist/services/definitions/desktop-environment.mjs.map +1 -1
  366. package/dist/services/definitions/dify.cjs +83 -0
  367. package/dist/services/definitions/dify.cjs.map +1 -0
  368. package/dist/services/definitions/dify.d.cts +7 -0
  369. package/dist/services/definitions/dify.d.cts.map +1 -0
  370. package/dist/services/definitions/dify.mjs +1 -1
  371. package/dist/services/definitions/dify.mjs.map +1 -1
  372. package/dist/services/definitions/docsgpt.cjs +47 -0
  373. package/dist/services/definitions/docsgpt.cjs.map +1 -0
  374. package/dist/services/definitions/docsgpt.d.cts +7 -0
  375. package/dist/services/definitions/docsgpt.d.cts.map +1 -0
  376. package/dist/services/definitions/docsgpt.mjs +1 -1
  377. package/dist/services/definitions/docsgpt.mjs.map +1 -1
  378. package/dist/services/definitions/dokploy.cjs +51 -0
  379. package/dist/services/definitions/dokploy.cjs.map +1 -0
  380. package/dist/services/definitions/dokploy.d.cts +7 -0
  381. package/dist/services/definitions/dokploy.d.cts.map +1 -0
  382. package/dist/services/definitions/dokploy.mjs +2 -2
  383. package/dist/services/definitions/dokploy.mjs.map +1 -1
  384. package/dist/services/definitions/dozzle.cjs +43 -0
  385. package/dist/services/definitions/dozzle.cjs.map +1 -0
  386. package/dist/services/definitions/dozzle.d.cts +7 -0
  387. package/dist/services/definitions/dozzle.d.cts.map +1 -0
  388. package/dist/services/definitions/dozzle.mjs +1 -1
  389. package/dist/services/definitions/dozzle.mjs.map +1 -1
  390. package/dist/services/definitions/ffmpeg.cjs +68 -0
  391. package/dist/services/definitions/ffmpeg.cjs.map +1 -0
  392. package/dist/services/definitions/ffmpeg.d.cts +7 -0
  393. package/dist/services/definitions/ffmpeg.d.cts.map +1 -0
  394. package/dist/services/definitions/ffmpeg.mjs +2 -2
  395. package/dist/services/definitions/ffmpeg.mjs.map +1 -1
  396. package/dist/services/definitions/flowise.cjs +47 -0
  397. package/dist/services/definitions/flowise.cjs.map +1 -0
  398. package/dist/services/definitions/flowise.d.cts +7 -0
  399. package/dist/services/definitions/flowise.d.cts.map +1 -0
  400. package/dist/services/definitions/flowise.mjs +1 -1
  401. package/dist/services/definitions/flowise.mjs.map +1 -1
  402. package/dist/services/definitions/gemini-cli.cjs +54 -0
  403. package/dist/services/definitions/gemini-cli.cjs.map +1 -0
  404. package/dist/services/definitions/gemini-cli.d.cts +7 -0
  405. package/dist/services/definitions/gemini-cli.d.cts.map +1 -0
  406. package/dist/services/definitions/gemini-cli.mjs +7 -1
  407. package/dist/services/definitions/gemini-cli.mjs.map +1 -1
  408. package/dist/services/definitions/ghost.cjs +60 -0
  409. package/dist/services/definitions/ghost.cjs.map +1 -0
  410. package/dist/services/definitions/ghost.d.cts +7 -0
  411. package/dist/services/definitions/ghost.d.cts.map +1 -0
  412. package/dist/services/definitions/ghost.mjs +1 -1
  413. package/dist/services/definitions/ghost.mjs.map +1 -1
  414. package/dist/services/definitions/gitea.cjs +51 -0
  415. package/dist/services/definitions/gitea.cjs.map +1 -0
  416. package/dist/services/definitions/gitea.d.cts +7 -0
  417. package/dist/services/definitions/gitea.d.cts.map +1 -0
  418. package/dist/services/definitions/gitea.mjs +1 -1
  419. package/dist/services/definitions/gitea.mjs.map +1 -1
  420. package/dist/services/definitions/gotify.cjs +64 -0
  421. package/dist/services/definitions/gotify.cjs.map +1 -0
  422. package/dist/services/definitions/gotify.d.cts +7 -0
  423. package/dist/services/definitions/gotify.d.cts.map +1 -0
  424. package/dist/services/definitions/gotify.mjs +3 -3
  425. package/dist/services/definitions/gotify.mjs.map +1 -1
  426. package/dist/services/definitions/grafana.cjs +77 -0
  427. package/dist/services/definitions/grafana.cjs.map +1 -0
  428. package/dist/services/definitions/grafana.d.cts +7 -0
  429. package/dist/services/definitions/grafana.d.cts.map +1 -0
  430. package/dist/services/definitions/grafana.mjs +2 -2
  431. package/dist/services/definitions/grafana.mjs.map +1 -1
  432. package/dist/services/definitions/headscale.cjs +73 -0
  433. package/dist/services/definitions/headscale.cjs.map +1 -0
  434. package/dist/services/definitions/headscale.d.cts +7 -0
  435. package/dist/services/definitions/headscale.d.cts.map +1 -0
  436. package/dist/services/definitions/headscale.mjs +2 -2
  437. package/dist/services/definitions/headscale.mjs.map +1 -1
  438. package/dist/services/definitions/hexstrike.cjs +46 -0
  439. package/dist/services/definitions/hexstrike.cjs.map +1 -0
  440. package/dist/services/definitions/hexstrike.d.cts +7 -0
  441. package/dist/services/definitions/hexstrike.d.cts.map +1 -0
  442. package/dist/services/definitions/hexstrike.mjs +1 -1
  443. package/dist/services/definitions/hexstrike.mjs.map +1 -1
  444. package/dist/services/definitions/homeassistant.cjs +63 -0
  445. package/dist/services/definitions/homeassistant.cjs.map +1 -0
  446. package/dist/services/definitions/homeassistant.d.cts +7 -0
  447. package/dist/services/definitions/homeassistant.d.cts.map +1 -0
  448. package/dist/services/definitions/homeassistant.mjs +1 -1
  449. package/dist/services/definitions/homeassistant.mjs.map +1 -1
  450. package/dist/services/definitions/immich.cjs +94 -0
  451. package/dist/services/definitions/immich.cjs.map +1 -0
  452. package/dist/services/definitions/immich.d.cts +7 -0
  453. package/dist/services/definitions/immich.d.cts.map +1 -0
  454. package/dist/services/definitions/immich.mjs +6 -6
  455. package/dist/services/definitions/immich.mjs.map +1 -1
  456. package/dist/services/definitions/index.cjs +291 -0
  457. package/dist/services/definitions/index.cjs.map +1 -0
  458. package/dist/services/definitions/index.d.cts +101 -0
  459. package/dist/services/definitions/index.d.cts.map +1 -0
  460. package/dist/services/definitions/jellyfin.cjs +64 -0
  461. package/dist/services/definitions/jellyfin.cjs.map +1 -0
  462. package/dist/services/definitions/jellyfin.d.cts +7 -0
  463. package/dist/services/definitions/jellyfin.d.cts.map +1 -0
  464. package/dist/services/definitions/jellyfin.mjs +1 -1
  465. package/dist/services/definitions/jellyfin.mjs.map +1 -1
  466. package/dist/services/definitions/jenkins.cjs +64 -0
  467. package/dist/services/definitions/jenkins.cjs.map +1 -0
  468. package/dist/services/definitions/jenkins.d.cts +7 -0
  469. package/dist/services/definitions/jenkins.d.cts.map +1 -0
  470. package/dist/services/definitions/jenkins.mjs +1 -1
  471. package/dist/services/definitions/jenkins.mjs.map +1 -1
  472. package/dist/services/definitions/kimi.cjs +48 -0
  473. package/dist/services/definitions/kimi.cjs.map +1 -0
  474. package/dist/services/definitions/kimi.d.cts +7 -0
  475. package/dist/services/definitions/kimi.d.cts.map +1 -0
  476. package/dist/services/definitions/kimi.mjs +1 -1
  477. package/dist/services/definitions/kimi.mjs.map +1 -1
  478. package/dist/services/definitions/lasuite-meet-agents.cjs +38 -0
  479. package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -0
  480. package/dist/services/definitions/lasuite-meet-agents.d.cts +7 -0
  481. package/dist/services/definitions/lasuite-meet-agents.d.cts.map +1 -0
  482. package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
  483. package/dist/services/definitions/lasuite-meet-agents.mjs.map +1 -1
  484. package/dist/services/definitions/lasuite-meet-backend.cjs +136 -0
  485. package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -0
  486. package/dist/services/definitions/lasuite-meet-backend.d.cts +7 -0
  487. package/dist/services/definitions/lasuite-meet-backend.d.cts.map +1 -0
  488. package/dist/services/definitions/lasuite-meet-backend.mjs +3 -3
  489. package/dist/services/definitions/lasuite-meet-backend.mjs.map +1 -1
  490. package/dist/services/definitions/lasuite-meet-frontend.cjs +50 -0
  491. package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -0
  492. package/dist/services/definitions/lasuite-meet-frontend.d.cts +7 -0
  493. package/dist/services/definitions/lasuite-meet-frontend.d.cts.map +1 -0
  494. package/dist/services/definitions/lasuite-meet-frontend.mjs +3 -3
  495. package/dist/services/definitions/lasuite-meet-frontend.mjs.map +1 -1
  496. package/dist/services/definitions/librechat.cjs +52 -0
  497. package/dist/services/definitions/librechat.cjs.map +1 -0
  498. package/dist/services/definitions/librechat.d.cts +7 -0
  499. package/dist/services/definitions/librechat.d.cts.map +1 -0
  500. package/dist/services/definitions/librechat.mjs +1 -1
  501. package/dist/services/definitions/librechat.mjs.map +1 -1
  502. package/dist/services/definitions/lightpanda.cjs +61 -0
  503. package/dist/services/definitions/lightpanda.cjs.map +1 -0
  504. package/dist/services/definitions/lightpanda.d.cts +7 -0
  505. package/dist/services/definitions/lightpanda.d.cts.map +1 -0
  506. package/dist/services/definitions/litellm.cjs +49 -0
  507. package/dist/services/definitions/litellm.cjs.map +1 -0
  508. package/dist/services/definitions/litellm.d.cts +7 -0
  509. package/dist/services/definitions/litellm.d.cts.map +1 -0
  510. package/dist/services/definitions/litellm.mjs +1 -1
  511. package/dist/services/definitions/litellm.mjs.map +1 -1
  512. package/dist/services/definitions/livekit.cjs +58 -0
  513. package/dist/services/definitions/livekit.cjs.map +1 -0
  514. package/dist/services/definitions/livekit.d.cts +7 -0
  515. package/dist/services/definitions/livekit.d.cts.map +1 -0
  516. package/dist/services/definitions/loki.cjs +53 -0
  517. package/dist/services/definitions/loki.cjs.map +1 -0
  518. package/dist/services/definitions/loki.d.cts +7 -0
  519. package/dist/services/definitions/loki.d.cts.map +1 -0
  520. package/dist/services/definitions/loki.mjs +1 -1
  521. package/dist/services/definitions/loki.mjs.map +1 -1
  522. package/dist/services/definitions/matomo.cjs +82 -0
  523. package/dist/services/definitions/matomo.cjs.map +1 -0
  524. package/dist/services/definitions/matomo.d.cts +7 -0
  525. package/dist/services/definitions/matomo.d.cts.map +1 -0
  526. package/dist/services/definitions/matomo.mjs +1 -1
  527. package/dist/services/definitions/matomo.mjs.map +1 -1
  528. package/dist/services/definitions/matrix-synapse.cjs +90 -0
  529. package/dist/services/definitions/matrix-synapse.cjs.map +1 -0
  530. package/dist/services/definitions/matrix-synapse.d.cts +7 -0
  531. package/dist/services/definitions/matrix-synapse.d.cts.map +1 -0
  532. package/dist/services/definitions/matrix-synapse.mjs +1 -1
  533. package/dist/services/definitions/matrix-synapse.mjs.map +1 -1
  534. package/dist/services/definitions/mattermost.cjs +63 -0
  535. package/dist/services/definitions/mattermost.cjs.map +1 -0
  536. package/dist/services/definitions/mattermost.d.cts +7 -0
  537. package/dist/services/definitions/mattermost.d.cts.map +1 -0
  538. package/dist/services/definitions/mattermost.mjs +1 -1
  539. package/dist/services/definitions/mattermost.mjs.map +1 -1
  540. package/dist/services/definitions/meilisearch.cjs +80 -0
  541. package/dist/services/definitions/meilisearch.cjs.map +1 -0
  542. package/dist/services/definitions/meilisearch.d.cts +7 -0
  543. package/dist/services/definitions/meilisearch.d.cts.map +1 -0
  544. package/dist/services/definitions/meilisearch.mjs +4 -4
  545. package/dist/services/definitions/meilisearch.mjs.map +1 -1
  546. package/dist/services/definitions/milvus.cjs +77 -0
  547. package/dist/services/definitions/milvus.cjs.map +1 -0
  548. package/dist/services/definitions/milvus.d.cts +7 -0
  549. package/dist/services/definitions/milvus.d.cts.map +1 -0
  550. package/dist/services/definitions/milvus.mjs +1 -1
  551. package/dist/services/definitions/milvus.mjs.map +1 -1
  552. package/dist/services/definitions/minio.cjs +104 -0
  553. package/dist/services/definitions/minio.cjs.map +1 -0
  554. package/dist/services/definitions/minio.d.cts +7 -0
  555. package/dist/services/definitions/minio.d.cts.map +1 -0
  556. package/dist/services/definitions/minio.mjs +1 -1
  557. package/dist/services/definitions/minio.mjs.map +1 -1
  558. package/dist/services/definitions/mission-control.cjs +69 -0
  559. package/dist/services/definitions/mission-control.cjs.map +1 -0
  560. package/dist/services/definitions/mission-control.d.cts +7 -0
  561. package/dist/services/definitions/mission-control.d.cts.map +1 -0
  562. package/dist/services/definitions/mixpost.cjs +89 -0
  563. package/dist/services/definitions/mixpost.cjs.map +1 -0
  564. package/dist/services/definitions/mixpost.d.cts +7 -0
  565. package/dist/services/definitions/mixpost.d.cts.map +1 -0
  566. package/dist/services/definitions/mixpost.mjs +1 -1
  567. package/dist/services/definitions/mixpost.mjs.map +1 -1
  568. package/dist/services/definitions/motion-canvas.cjs +54 -0
  569. package/dist/services/definitions/motion-canvas.cjs.map +1 -0
  570. package/dist/services/definitions/motion-canvas.d.cts +7 -0
  571. package/dist/services/definitions/motion-canvas.d.cts.map +1 -0
  572. package/dist/services/definitions/motion-canvas.mjs +1 -1
  573. package/dist/services/definitions/motion-canvas.mjs.map +1 -1
  574. package/dist/services/definitions/n8n.cjs +156 -0
  575. package/dist/services/definitions/n8n.cjs.map +1 -0
  576. package/dist/services/definitions/n8n.d.cts +7 -0
  577. package/dist/services/definitions/n8n.d.cts.map +1 -0
  578. package/dist/services/definitions/n8n.mjs +1 -1
  579. package/dist/services/definitions/n8n.mjs.map +1 -1
  580. package/dist/services/definitions/neo4j.cjs +93 -0
  581. package/dist/services/definitions/neo4j.cjs.map +1 -0
  582. package/dist/services/definitions/neo4j.d.cts +7 -0
  583. package/dist/services/definitions/neo4j.d.cts.map +1 -0
  584. package/dist/services/definitions/neo4j.mjs +1 -1
  585. package/dist/services/definitions/neo4j.mjs.map +1 -1
  586. package/dist/services/definitions/nextcloud.cjs +82 -0
  587. package/dist/services/definitions/nextcloud.cjs.map +1 -0
  588. package/dist/services/definitions/nextcloud.d.cts +7 -0
  589. package/dist/services/definitions/nextcloud.d.cts.map +1 -0
  590. package/dist/services/definitions/nextcloud.mjs +19 -19
  591. package/dist/services/definitions/nextcloud.mjs.map +1 -1
  592. package/dist/services/definitions/nocodb.cjs +47 -0
  593. package/dist/services/definitions/nocodb.cjs.map +1 -0
  594. package/dist/services/definitions/nocodb.d.cts +7 -0
  595. package/dist/services/definitions/nocodb.d.cts.map +1 -0
  596. package/dist/services/definitions/nocodb.mjs +1 -1
  597. package/dist/services/definitions/nocodb.mjs.map +1 -1
  598. package/dist/services/definitions/ntfy.cjs +65 -0
  599. package/dist/services/definitions/ntfy.cjs.map +1 -0
  600. package/dist/services/definitions/ntfy.d.cts +7 -0
  601. package/dist/services/definitions/ntfy.d.cts.map +1 -0
  602. package/dist/services/definitions/ntfy.mjs +2 -2
  603. package/dist/services/definitions/ntfy.mjs.map +1 -1
  604. package/dist/services/definitions/ollama.cjs +68 -0
  605. package/dist/services/definitions/ollama.cjs.map +1 -0
  606. package/dist/services/definitions/ollama.d.cts +7 -0
  607. package/dist/services/definitions/ollama.d.cts.map +1 -0
  608. package/dist/services/definitions/ollama.mjs +1 -1
  609. package/dist/services/definitions/ollama.mjs.map +1 -1
  610. package/dist/services/definitions/open-webui.cjs +52 -0
  611. package/dist/services/definitions/open-webui.cjs.map +1 -0
  612. package/dist/services/definitions/open-webui.d.cts +7 -0
  613. package/dist/services/definitions/open-webui.d.cts.map +1 -0
  614. package/dist/services/definitions/open-webui.mjs +1 -1
  615. package/dist/services/definitions/open-webui.mjs.map +1 -1
  616. package/dist/services/definitions/opencode.cjs +52 -0
  617. package/dist/services/definitions/opencode.cjs.map +1 -0
  618. package/dist/services/definitions/opencode.d.cts +7 -0
  619. package/dist/services/definitions/opencode.d.cts.map +1 -0
  620. package/dist/services/definitions/opencode.mjs +1 -1
  621. package/dist/services/definitions/opencode.mjs.map +1 -1
  622. package/dist/services/definitions/openpanel.cjs +48 -0
  623. package/dist/services/definitions/openpanel.cjs.map +1 -0
  624. package/dist/services/definitions/openpanel.d.cts +7 -0
  625. package/dist/services/definitions/openpanel.d.cts.map +1 -0
  626. package/dist/services/definitions/openpanel.mjs +3 -3
  627. package/dist/services/definitions/openpanel.mjs.map +1 -1
  628. package/dist/services/definitions/outline.cjs +76 -0
  629. package/dist/services/definitions/outline.cjs.map +1 -0
  630. package/dist/services/definitions/outline.d.cts +7 -0
  631. package/dist/services/definitions/outline.d.cts.map +1 -0
  632. package/dist/services/definitions/paperless-ngx.cjs +95 -0
  633. package/dist/services/definitions/paperless-ngx.cjs.map +1 -0
  634. package/dist/services/definitions/paperless-ngx.d.cts +7 -0
  635. package/dist/services/definitions/paperless-ngx.d.cts.map +1 -0
  636. package/dist/services/definitions/paperless-ngx.mjs +1 -1
  637. package/dist/services/definitions/paperless-ngx.mjs.map +1 -1
  638. package/dist/services/definitions/pentagi.cjs +46 -0
  639. package/dist/services/definitions/pentagi.cjs.map +1 -0
  640. package/dist/services/definitions/pentagi.d.cts +7 -0
  641. package/dist/services/definitions/pentagi.d.cts.map +1 -0
  642. package/dist/services/definitions/pentagi.mjs +2 -2
  643. package/dist/services/definitions/pentagi.mjs.map +1 -1
  644. package/dist/services/definitions/pentestagent.cjs +41 -0
  645. package/dist/services/definitions/pentestagent.cjs.map +1 -0
  646. package/dist/services/definitions/pentestagent.d.cts +7 -0
  647. package/dist/services/definitions/pentestagent.d.cts.map +1 -0
  648. package/dist/services/definitions/playwright-server.cjs +44 -0
  649. package/dist/services/definitions/playwright-server.cjs.map +1 -0
  650. package/dist/services/definitions/playwright-server.d.cts +7 -0
  651. package/dist/services/definitions/playwright-server.d.cts.map +1 -0
  652. package/dist/services/definitions/playwright-server.mjs +1 -1
  653. package/dist/services/definitions/playwright-server.mjs.map +1 -1
  654. package/dist/services/definitions/portainer.cjs +51 -0
  655. package/dist/services/definitions/portainer.cjs.map +1 -0
  656. package/dist/services/definitions/portainer.d.cts +7 -0
  657. package/dist/services/definitions/portainer.d.cts.map +1 -0
  658. package/dist/services/definitions/portainer.mjs +1 -1
  659. package/dist/services/definitions/portainer.mjs.map +1 -1
  660. package/dist/services/definitions/postgresql.cjs +86 -0
  661. package/dist/services/definitions/postgresql.cjs.map +1 -0
  662. package/dist/services/definitions/postgresql.d.cts +7 -0
  663. package/dist/services/definitions/postgresql.d.cts.map +1 -0
  664. package/dist/services/definitions/postgresql.mjs +1 -1
  665. package/dist/services/definitions/postgresql.mjs.map +1 -1
  666. package/dist/services/definitions/postiz.cjs +85 -0
  667. package/dist/services/definitions/postiz.cjs.map +1 -0
  668. package/dist/services/definitions/postiz.d.cts +7 -0
  669. package/dist/services/definitions/postiz.d.cts.map +1 -0
  670. package/dist/services/definitions/postiz.mjs +1 -1
  671. package/dist/services/definitions/postiz.mjs.map +1 -1
  672. package/dist/services/definitions/prometheus.cjs +54 -0
  673. package/dist/services/definitions/prometheus.cjs.map +1 -0
  674. package/dist/services/definitions/prometheus.d.cts +7 -0
  675. package/dist/services/definitions/prometheus.d.cts.map +1 -0
  676. package/dist/services/definitions/prometheus.mjs +1 -1
  677. package/dist/services/definitions/prometheus.mjs.map +1 -1
  678. package/dist/services/definitions/qdrant.cjs +79 -0
  679. package/dist/services/definitions/qdrant.cjs.map +1 -0
  680. package/dist/services/definitions/qdrant.d.cts +7 -0
  681. package/dist/services/definitions/qdrant.d.cts.map +1 -0
  682. package/dist/services/definitions/qdrant.mjs +1 -1
  683. package/dist/services/definitions/qdrant.mjs.map +1 -1
  684. package/dist/services/definitions/redis.cjs +93 -0
  685. package/dist/services/definitions/redis.cjs.map +1 -0
  686. package/dist/services/definitions/redis.d.cts +7 -0
  687. package/dist/services/definitions/redis.d.cts.map +1 -0
  688. package/dist/services/definitions/redis.mjs +1 -1
  689. package/dist/services/definitions/redis.mjs.map +1 -1
  690. package/dist/services/definitions/remotion.cjs +57 -0
  691. package/dist/services/definitions/remotion.cjs.map +1 -0
  692. package/dist/services/definitions/remotion.d.cts +7 -0
  693. package/dist/services/definitions/remotion.d.cts.map +1 -0
  694. package/dist/services/definitions/remotion.mjs +1 -1
  695. package/dist/services/definitions/remotion.mjs.map +1 -1
  696. package/dist/services/definitions/rocketchat.cjs +59 -0
  697. package/dist/services/definitions/rocketchat.cjs.map +1 -0
  698. package/dist/services/definitions/rocketchat.d.cts +7 -0
  699. package/dist/services/definitions/rocketchat.d.cts.map +1 -0
  700. package/dist/services/definitions/rocketchat.mjs +1 -1
  701. package/dist/services/definitions/rocketchat.mjs.map +1 -1
  702. package/dist/services/definitions/scrapling.cjs +46 -0
  703. package/dist/services/definitions/scrapling.cjs.map +1 -0
  704. package/dist/services/definitions/scrapling.d.cts +7 -0
  705. package/dist/services/definitions/scrapling.d.cts.map +1 -0
  706. package/dist/services/definitions/scrapling.mjs +2 -2
  707. package/dist/services/definitions/scrapling.mjs.map +1 -1
  708. package/dist/services/definitions/searxng.cjs +67 -0
  709. package/dist/services/definitions/searxng.cjs.map +1 -0
  710. package/dist/services/definitions/searxng.d.cts +7 -0
  711. package/dist/services/definitions/searxng.d.cts.map +1 -0
  712. package/dist/services/definitions/searxng.mjs +1 -1
  713. package/dist/services/definitions/searxng.mjs.map +1 -1
  714. package/dist/services/definitions/signoz.cjs +56 -0
  715. package/dist/services/definitions/signoz.cjs.map +1 -0
  716. package/dist/services/definitions/signoz.d.cts +7 -0
  717. package/dist/services/definitions/signoz.d.cts.map +1 -0
  718. package/dist/services/definitions/signoz.mjs +2 -2
  719. package/dist/services/definitions/signoz.mjs.map +1 -1
  720. package/dist/services/definitions/solidityguard.cjs +51 -0
  721. package/dist/services/definitions/solidityguard.cjs.map +1 -0
  722. package/dist/services/definitions/solidityguard.d.cts +7 -0
  723. package/dist/services/definitions/solidityguard.d.cts.map +1 -0
  724. package/dist/services/definitions/solidityguard.mjs +1 -1
  725. package/dist/services/definitions/solidityguard.mjs.map +1 -1
  726. package/dist/services/definitions/stable-diffusion.cjs +50 -0
  727. package/dist/services/definitions/stable-diffusion.cjs.map +1 -0
  728. package/dist/services/definitions/stable-diffusion.d.cts +7 -0
  729. package/dist/services/definitions/stable-diffusion.d.cts.map +1 -0
  730. package/dist/services/definitions/stable-diffusion.mjs +1 -1
  731. package/dist/services/definitions/stable-diffusion.mjs.map +1 -1
  732. package/dist/services/definitions/steel-browser.cjs +79 -0
  733. package/dist/services/definitions/steel-browser.cjs.map +1 -0
  734. package/dist/services/definitions/steel-browser.d.cts +7 -0
  735. package/dist/services/definitions/steel-browser.d.cts.map +1 -0
  736. package/dist/services/definitions/steel-browser.mjs +1 -1
  737. package/dist/services/definitions/steel-browser.mjs.map +1 -1
  738. package/dist/services/definitions/stream-gateway.cjs +135 -0
  739. package/dist/services/definitions/stream-gateway.cjs.map +1 -0
  740. package/dist/services/definitions/stream-gateway.d.cts +7 -0
  741. package/dist/services/definitions/stream-gateway.d.cts.map +1 -0
  742. package/dist/services/definitions/stream-gateway.mjs +2 -2
  743. package/dist/services/definitions/stream-gateway.mjs.map +1 -1
  744. package/dist/services/definitions/supabase.cjs +71 -0
  745. package/dist/services/definitions/supabase.cjs.map +1 -0
  746. package/dist/services/definitions/supabase.d.cts +7 -0
  747. package/dist/services/definitions/supabase.d.cts.map +1 -0
  748. package/dist/services/definitions/supabase.mjs +2 -2
  749. package/dist/services/definitions/supabase.mjs.map +1 -1
  750. package/dist/services/definitions/tailscale.cjs +72 -0
  751. package/dist/services/definitions/tailscale.cjs.map +1 -0
  752. package/dist/services/definitions/tailscale.d.cts +7 -0
  753. package/dist/services/definitions/tailscale.d.cts.map +1 -0
  754. package/dist/services/definitions/tailscale.mjs +1 -1
  755. package/dist/services/definitions/tailscale.mjs.map +1 -1
  756. package/dist/services/definitions/temporal.cjs +102 -0
  757. package/dist/services/definitions/temporal.cjs.map +1 -0
  758. package/dist/services/definitions/temporal.d.cts +7 -0
  759. package/dist/services/definitions/temporal.d.cts.map +1 -0
  760. package/dist/services/definitions/traefik.cjs +59 -0
  761. package/dist/services/definitions/traefik.cjs.map +1 -0
  762. package/dist/services/definitions/traefik.d.cts +7 -0
  763. package/dist/services/definitions/traefik.d.cts.map +1 -0
  764. package/dist/services/definitions/traefik.mjs +1 -1
  765. package/dist/services/definitions/traefik.mjs.map +1 -1
  766. package/dist/services/definitions/umami.cjs +48 -0
  767. package/dist/services/definitions/umami.cjs.map +1 -0
  768. package/dist/services/definitions/umami.d.cts +7 -0
  769. package/dist/services/definitions/umami.d.cts.map +1 -0
  770. package/dist/services/definitions/uptime-kuma.cjs +53 -0
  771. package/dist/services/definitions/uptime-kuma.cjs.map +1 -0
  772. package/dist/services/definitions/uptime-kuma.d.cts +7 -0
  773. package/dist/services/definitions/uptime-kuma.d.cts.map +1 -0
  774. package/dist/services/definitions/uptime-kuma.mjs +2 -2
  775. package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
  776. package/dist/services/definitions/usesend.cjs +101 -0
  777. package/dist/services/definitions/usesend.cjs.map +1 -0
  778. package/dist/services/definitions/usesend.d.cts +7 -0
  779. package/dist/services/definitions/usesend.d.cts.map +1 -0
  780. package/dist/services/definitions/usesend.mjs +4 -4
  781. package/dist/services/definitions/usesend.mjs.map +1 -1
  782. package/dist/services/definitions/valkey.cjs +63 -0
  783. package/dist/services/definitions/valkey.cjs.map +1 -0
  784. package/dist/services/definitions/valkey.d.cts +7 -0
  785. package/dist/services/definitions/valkey.d.cts.map +1 -0
  786. package/dist/services/definitions/valkey.mjs +1 -1
  787. package/dist/services/definitions/valkey.mjs.map +1 -1
  788. package/dist/services/definitions/vaultwarden.cjs +65 -0
  789. package/dist/services/definitions/vaultwarden.cjs.map +1 -0
  790. package/dist/services/definitions/vaultwarden.d.cts +7 -0
  791. package/dist/services/definitions/vaultwarden.d.cts.map +1 -0
  792. package/dist/services/definitions/vaultwarden.mjs +2 -2
  793. package/dist/services/definitions/vaultwarden.mjs.map +1 -1
  794. package/dist/services/definitions/watchtower.cjs +49 -0
  795. package/dist/services/definitions/watchtower.cjs.map +1 -0
  796. package/dist/services/definitions/watchtower.d.cts +7 -0
  797. package/dist/services/definitions/watchtower.d.cts.map +1 -0
  798. package/dist/services/definitions/weaviate.cjs +92 -0
  799. package/dist/services/definitions/weaviate.cjs.map +1 -0
  800. package/dist/services/definitions/weaviate.d.cts +7 -0
  801. package/dist/services/definitions/weaviate.d.cts.map +1 -0
  802. package/dist/services/definitions/weaviate.mjs +2 -2
  803. package/dist/services/definitions/weaviate.mjs.map +1 -1
  804. package/dist/services/definitions/whisper.cjs +64 -0
  805. package/dist/services/definitions/whisper.cjs.map +1 -0
  806. package/dist/services/definitions/whisper.d.cts +7 -0
  807. package/dist/services/definitions/whisper.d.cts.map +1 -0
  808. package/dist/services/definitions/whisper.mjs +2 -2
  809. package/dist/services/definitions/whisper.mjs.map +1 -1
  810. package/dist/services/definitions/xyops.cjs +88 -0
  811. package/dist/services/definitions/xyops.cjs.map +1 -0
  812. package/dist/services/definitions/xyops.d.cts +7 -0
  813. package/dist/services/definitions/xyops.d.cts.map +1 -0
  814. package/dist/services/definitions/xyops.mjs +1 -1
  815. package/dist/services/definitions/xyops.mjs.map +1 -1
  816. package/dist/services/registry.cjs +35 -0
  817. package/dist/services/registry.cjs.map +1 -0
  818. package/dist/services/registry.d.cts +16 -0
  819. package/dist/services/registry.d.cts.map +1 -0
  820. package/dist/services/registry.test.cjs +63 -0
  821. package/dist/services/registry.test.cjs.map +1 -0
  822. package/dist/services/registry.test.d.cts +1 -0
  823. package/dist/services/registry.test.mjs +1 -1
  824. package/dist/skills/registry.cjs +712 -0
  825. package/dist/skills/registry.cjs.map +1 -0
  826. package/dist/skills/registry.d.cts +11 -0
  827. package/dist/skills/registry.d.cts.map +1 -0
  828. package/dist/skills/skill-manifest.cjs +23 -0
  829. package/dist/skills/skill-manifest.cjs.map +1 -0
  830. package/dist/skills/skill-manifest.d.cts +20 -0
  831. package/dist/skills/skill-manifest.d.cts.map +1 -0
  832. package/dist/types.cjs +149 -0
  833. package/dist/types.cjs.map +1 -0
  834. package/dist/types.d.cts +82 -0
  835. package/dist/types.d.cts.map +1 -0
  836. package/dist/types.d.mts +9 -2
  837. package/dist/types.d.mts.map +1 -1
  838. package/dist/types.mjs +40 -0
  839. package/dist/types.mjs.map +1 -1
  840. package/dist/validator.cjs +124 -0
  841. package/dist/validator.cjs.map +1 -0
  842. package/dist/validator.d.cts +20 -0
  843. package/dist/validator.d.cts.map +1 -0
  844. package/dist/validator.test.cjs +64 -0
  845. package/dist/validator.test.cjs.map +1 -0
  846. package/dist/validator.test.d.cts +1 -0
  847. package/dist/validator.test.mjs +1 -1
  848. package/dist/version-manager.cjs +65 -0
  849. package/dist/version-manager.cjs.map +1 -0
  850. package/dist/version-manager.d.cts +14 -0
  851. package/dist/version-manager.d.cts.map +1 -0
  852. package/dist/version-manager.test.cjs +101 -0
  853. package/dist/version-manager.test.cjs.map +1 -0
  854. package/dist/version-manager.test.d.cts +1 -0
  855. package/dist/version-manager.test.mjs +1 -1
  856. package/dist/vi.2VT5v0um-BmRMvymT.cjs +12934 -0
  857. package/dist/vi.2VT5v0um-BmRMvymT.cjs.map +1 -0
  858. package/dist/{vi.2VT5v0um-BgmKutxR.mjs → vi.2VT5v0um-CFyDIn0m.mjs} +5 -5
  859. package/dist/{vi.2VT5v0um-BgmKutxR.mjs.map → vi.2VT5v0um-CFyDIn0m.mjs.map} +1 -1
  860. package/package.json +24 -3
  861. package/src/__snapshots__/composer.snapshot.test.ts.snap +20 -20
  862. package/src/compose-validation.test.ts +102 -0
  863. package/src/composer.test.ts +1 -1
  864. package/src/composer.ts +331 -53
  865. package/src/deployers/coolify.ts +241 -0
  866. package/src/deployers/dokploy.ts +174 -0
  867. package/src/deployers/index.ts +36 -0
  868. package/src/deployers/types.ts +70 -0
  869. package/src/generate.ts +45 -1
  870. package/src/generators/cloud-init.ts +137 -0
  871. package/src/generators/env.ts +112 -6
  872. package/src/generators/health-check.ts +2 -2
  873. package/src/generators/openclaw-install-script.ts +77 -0
  874. package/src/generators/openclaw-json.ts +195 -58
  875. package/src/generators/postgres-init.ts +11 -0
  876. package/src/generators/readme.ts +103 -4
  877. package/src/generators/stack-manifest.ts +127 -0
  878. package/src/index.ts +30 -0
  879. package/src/port-scanner.ts +189 -0
  880. package/src/presets/presets.test.ts +73 -0
  881. package/src/presets/registry.test.ts +3 -0
  882. package/src/presets/registry.ts +30 -7
  883. package/src/resolver.ts +2 -0
  884. package/src/schema.ts +30 -1
  885. package/src/services/definitions/anything-llm.ts +2 -2
  886. package/src/services/definitions/appflowy.ts +1 -1
  887. package/src/services/definitions/authentik.ts +5 -5
  888. package/src/services/definitions/beszel.ts +1 -1
  889. package/src/services/definitions/browserless.ts +1 -1
  890. package/src/services/definitions/caddy.ts +2 -2
  891. package/src/services/definitions/cal-com.ts +2 -2
  892. package/src/services/definitions/chromadb.ts +3 -3
  893. package/src/services/definitions/claude-code.ts +1 -1
  894. package/src/services/definitions/code-server.ts +1 -1
  895. package/src/services/definitions/codex.ts +1 -1
  896. package/src/services/definitions/comfyui.ts +1 -1
  897. package/src/services/definitions/coolify.ts +1 -1
  898. package/src/services/definitions/crowdsec.ts +2 -2
  899. package/src/services/definitions/desktop-environment.ts +1 -1
  900. package/src/services/definitions/dify.ts +1 -1
  901. package/src/services/definitions/docsgpt.ts +1 -1
  902. package/src/services/definitions/dokploy.ts +2 -2
  903. package/src/services/definitions/dozzle.ts +1 -1
  904. package/src/services/definitions/ffmpeg.ts +2 -2
  905. package/src/services/definitions/flowise.ts +1 -1
  906. package/src/services/definitions/gemini-cli.ts +8 -1
  907. package/src/services/definitions/ghost.ts +1 -1
  908. package/src/services/definitions/gitea.ts +1 -1
  909. package/src/services/definitions/gotify.ts +3 -3
  910. package/src/services/definitions/grafana.ts +2 -2
  911. package/src/services/definitions/headscale.ts +68 -68
  912. package/src/services/definitions/hexstrike.ts +1 -1
  913. package/src/services/definitions/homeassistant.ts +1 -1
  914. package/src/services/definitions/immich.ts +6 -6
  915. package/src/services/definitions/jellyfin.ts +1 -1
  916. package/src/services/definitions/jenkins.ts +1 -1
  917. package/src/services/definitions/kimi.ts +1 -1
  918. package/src/services/definitions/lasuite-meet-agents.ts +1 -1
  919. package/src/services/definitions/lasuite-meet-backend.ts +3 -3
  920. package/src/services/definitions/lasuite-meet-frontend.ts +3 -3
  921. package/src/services/definitions/librechat.ts +1 -1
  922. package/src/services/definitions/litellm.ts +1 -1
  923. package/src/services/definitions/loki.ts +1 -1
  924. package/src/services/definitions/matomo.ts +1 -1
  925. package/src/services/definitions/matrix-synapse.ts +1 -1
  926. package/src/services/definitions/mattermost.ts +1 -1
  927. package/src/services/definitions/meilisearch.ts +4 -4
  928. package/src/services/definitions/milvus.ts +1 -1
  929. package/src/services/definitions/minio.ts +1 -1
  930. package/src/services/definitions/mixpost.ts +1 -1
  931. package/src/services/definitions/motion-canvas.ts +1 -1
  932. package/src/services/definitions/n8n.ts +1 -1
  933. package/src/services/definitions/neo4j.ts +1 -1
  934. package/src/services/definitions/nextcloud.ts +19 -19
  935. package/src/services/definitions/nocodb.ts +1 -1
  936. package/src/services/definitions/ntfy.ts +2 -2
  937. package/src/services/definitions/ollama.ts +1 -1
  938. package/src/services/definitions/open-webui.ts +1 -1
  939. package/src/services/definitions/opencode.ts +1 -1
  940. package/src/services/definitions/openpanel.ts +3 -3
  941. package/src/services/definitions/paperless-ngx.ts +1 -1
  942. package/src/services/definitions/pentagi.ts +2 -2
  943. package/src/services/definitions/playwright-server.ts +1 -1
  944. package/src/services/definitions/portainer.ts +1 -1
  945. package/src/services/definitions/postgresql.ts +1 -1
  946. package/src/services/definitions/postiz.ts +1 -1
  947. package/src/services/definitions/prometheus.ts +1 -1
  948. package/src/services/definitions/qdrant.ts +1 -1
  949. package/src/services/definitions/redis.ts +1 -1
  950. package/src/services/definitions/remotion.ts +1 -1
  951. package/src/services/definitions/rocketchat.ts +1 -1
  952. package/src/services/definitions/scrapling.ts +2 -2
  953. package/src/services/definitions/searxng.ts +1 -1
  954. package/src/services/definitions/signoz.ts +2 -2
  955. package/src/services/definitions/solidityguard.ts +1 -1
  956. package/src/services/definitions/stable-diffusion.ts +1 -1
  957. package/src/services/definitions/steel-browser.ts +1 -1
  958. package/src/services/definitions/stream-gateway.ts +2 -2
  959. package/src/services/definitions/supabase.ts +2 -2
  960. package/src/services/definitions/tailscale.ts +1 -1
  961. package/src/services/definitions/traefik.ts +1 -1
  962. package/src/services/definitions/uptime-kuma.ts +2 -2
  963. package/src/services/definitions/usesend.ts +4 -4
  964. package/src/services/definitions/valkey.ts +1 -1
  965. package/src/services/definitions/vaultwarden.ts +2 -2
  966. package/src/services/definitions/weaviate.ts +2 -2
  967. package/src/services/definitions/whisper.ts +2 -2
  968. package/src/services/definitions/xyops.ts +1 -1
  969. package/src/types.ts +138 -20
  970. package/tsdown.config.ts +2 -2
@@ -0,0 +1,166 @@
1
+ const require_chunk = require('./chunk-C0xms8kb.cjs');
2
+ const require_vi_2VT5v0um = require('./vi.2VT5v0um-BmRMvymT.cjs');
3
+ const require_resolver = require('./resolver.cjs');
4
+ const require_composer = require('./composer.cjs');
5
+ let yaml = require("yaml");
6
+
7
+ //#region src/composer.test.ts
8
+ const defaultOptions = {
9
+ projectName: "test-project",
10
+ proxy: "none",
11
+ gpu: false,
12
+ platform: "linux/amd64",
13
+ deployment: "local",
14
+ openclawVersion: "latest"
15
+ };
16
+ require_vi_2VT5v0um.describe("compose", () => {
17
+ require_vi_2VT5v0um.it("generates minimal stack with just OpenClaw gateway when no companions", () => {
18
+ const parsed = (0, yaml.parse)(require_composer.compose(require_resolver.resolve({
19
+ services: [],
20
+ skillPacks: []
21
+ }), defaultOptions));
22
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("openclaw-gateway");
23
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].image).toContain("ghcr.io/openclaw/openclaw");
24
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].environment.HOME).toBe("/home/node");
25
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].environment.TERM).toBe("xterm-256color");
26
+ const gwVolumes = parsed.services["openclaw-gateway"].volumes;
27
+ require_vi_2VT5v0um.globalExpect(gwVolumes.some((v) => v.includes(".openclaw"))).toBe(true);
28
+ require_vi_2VT5v0um.globalExpect(parsed.networks).toHaveProperty("openclaw-network");
29
+ require_vi_2VT5v0um.globalExpect(parsed.networks["openclaw-network"].driver).toBe("bridge");
30
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("openclaw-cli");
31
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"]).not.toHaveProperty("depends_on");
32
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].restart).toBe("unless-stopped");
33
+ });
34
+ require_vi_2VT5v0um.it("generates Redis companion with proper gateway depends_on", () => {
35
+ const parsed = (0, yaml.parse)(require_composer.compose(require_resolver.resolve({
36
+ services: ["redis"],
37
+ skillPacks: []
38
+ }), defaultOptions));
39
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("openclaw-gateway");
40
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("redis");
41
+ require_vi_2VT5v0um.globalExpect(parsed.services.redis.image).toBe("redis:8-alpine");
42
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].depends_on).toHaveProperty("redis");
43
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].depends_on.redis.condition).toBe("service_healthy");
44
+ require_vi_2VT5v0um.globalExpect(parsed.services.redis.healthcheck).toBeDefined();
45
+ require_vi_2VT5v0um.globalExpect(parsed.services.redis.healthcheck.test).toContain("redis-cli ping");
46
+ require_vi_2VT5v0um.globalExpect(parsed.services.redis.restart).toBe("unless-stopped");
47
+ require_vi_2VT5v0um.globalExpect(parsed.services.redis.networks).toContain("openclaw-network");
48
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].environment).toHaveProperty("REDIS_HOST");
49
+ require_vi_2VT5v0um.globalExpect(parsed.services["openclaw-gateway"].environment.REDIS_HOST).toBe("redis");
50
+ });
51
+ require_vi_2VT5v0um.it("generates parseable YAML for a multi-service stack", () => {
52
+ const yaml$1 = require_composer.compose(require_resolver.resolve({
53
+ services: ["redis", "n8n"],
54
+ skillPacks: []
55
+ }), defaultOptions);
56
+ require_vi_2VT5v0um.globalExpect(() => (0, yaml.parse)(yaml$1)).not.toThrow();
57
+ const parsed = (0, yaml.parse)(yaml$1);
58
+ require_vi_2VT5v0um.globalExpect(parsed).toHaveProperty("services");
59
+ require_vi_2VT5v0um.globalExpect(parsed).toHaveProperty("volumes");
60
+ require_vi_2VT5v0um.globalExpect(parsed).toHaveProperty("networks");
61
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("openclaw-gateway");
62
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("redis");
63
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("n8n");
64
+ require_vi_2VT5v0um.globalExpect(parsed.services).toHaveProperty("postgresql");
65
+ });
66
+ require_vi_2VT5v0um.it("includes all service volumes in top-level volumes section", () => {
67
+ const resolved = require_resolver.resolve({
68
+ services: ["redis", "n8n"],
69
+ skillPacks: []
70
+ });
71
+ const parsed = (0, yaml.parse)(require_composer.compose(resolved, defaultOptions));
72
+ const serviceVolumeNames = /* @__PURE__ */ new Set();
73
+ for (const rs of resolved.services) for (const vol of rs.definition.volumes) serviceVolumeNames.add(vol.name);
74
+ for (const volName of serviceVolumeNames) require_vi_2VT5v0um.globalExpect(parsed.volumes).toHaveProperty(volName);
75
+ const gwVols = parsed.services["openclaw-gateway"].volumes;
76
+ require_vi_2VT5v0um.globalExpect(gwVols.some((v) => v.includes(".openclaw"))).toBe(true);
77
+ });
78
+ require_vi_2VT5v0um.it("includes GPU passthrough when gpu=true and service requires it", () => {
79
+ const resolved = require_resolver.resolve({
80
+ services: ["ollama"],
81
+ skillPacks: []
82
+ });
83
+ const ollamaService = (0, yaml.parse)(require_composer.compose({
84
+ ...resolved,
85
+ services: resolved.services.map((s) => ({
86
+ ...s,
87
+ definition: {
88
+ ...s.definition,
89
+ gpuRequired: true
90
+ }
91
+ }))
92
+ }, {
93
+ ...defaultOptions,
94
+ gpu: true
95
+ })).services.ollama;
96
+ require_vi_2VT5v0um.globalExpect(ollamaService.deploy).toBeDefined();
97
+ require_vi_2VT5v0um.globalExpect(ollamaService.deploy.resources.reservations.devices).toEqual([{
98
+ driver: "nvidia",
99
+ count: "all",
100
+ capabilities: ["gpu"]
101
+ }]);
102
+ });
103
+ require_vi_2VT5v0um.it("does not include GPU passthrough when gpu=false", () => {
104
+ const resolved = require_resolver.resolve({
105
+ services: ["ollama"],
106
+ skillPacks: []
107
+ });
108
+ const ollamaService = (0, yaml.parse)(require_composer.compose({
109
+ ...resolved,
110
+ services: resolved.services.map((s) => ({
111
+ ...s,
112
+ definition: {
113
+ ...s.definition,
114
+ gpuRequired: true
115
+ }
116
+ }))
117
+ }, {
118
+ ...defaultOptions,
119
+ gpu: false
120
+ })).services.ollama;
121
+ require_vi_2VT5v0um.globalExpect(ollamaService.deploy?.resources?.reservations?.devices).toBeUndefined();
122
+ });
123
+ require_vi_2VT5v0um.it("does not map internal-only ports to host", () => {
124
+ const resolved = require_resolver.resolve({
125
+ services: ["redis"],
126
+ skillPacks: []
127
+ });
128
+ const redisPorts = (0, yaml.parse)(require_composer.compose({
129
+ ...resolved,
130
+ services: resolved.services.map((s) => ({
131
+ ...s,
132
+ definition: {
133
+ ...s.definition,
134
+ ports: [...s.definition.ports, {
135
+ host: 16379,
136
+ container: 16379,
137
+ description: "Redis cluster bus",
138
+ exposed: false
139
+ }]
140
+ }
141
+ }))
142
+ }, defaultOptions)).services.redis.ports;
143
+ require_vi_2VT5v0um.globalExpect(redisPorts).toHaveLength(1);
144
+ require_vi_2VT5v0um.globalExpect(redisPorts[0]).toContain("6379");
145
+ require_vi_2VT5v0um.globalExpect(redisPorts[0]).not.toContain("16379");
146
+ });
147
+ require_vi_2VT5v0um.it("uses service_started condition for services without healthcheck", () => {
148
+ const resolved = require_resolver.resolve({
149
+ services: ["minio"],
150
+ skillPacks: []
151
+ });
152
+ const gatewayDeps = (0, yaml.parse)(require_composer.compose(resolved, defaultOptions)).services["openclaw-gateway"].depends_on;
153
+ for (const [id, dep] of Object.entries(gatewayDeps)) if (resolved.services.find((s) => s.definition.id === id)?.definition.healthcheck) require_vi_2VT5v0um.globalExpect(dep.condition).toBe("service_healthy");
154
+ else require_vi_2VT5v0um.globalExpect(dep.condition).toBe("service_started");
155
+ });
156
+ require_vi_2VT5v0um.it("gateway is always the first service in the output", () => {
157
+ const parsed = (0, yaml.parse)(require_composer.compose(require_resolver.resolve({
158
+ services: ["redis", "ollama"],
159
+ skillPacks: []
160
+ }), defaultOptions));
161
+ require_vi_2VT5v0um.globalExpect(Object.keys(parsed.services)[0]).toBe("openclaw-gateway");
162
+ });
163
+ });
164
+
165
+ //#endregion
166
+ //# sourceMappingURL=composer.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.test.cjs","names":["describe","compose","resolve","yaml"],"sources":["../src/composer.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { compose } from \"./composer.js\";\nimport { resolve } from \"./resolver.js\";\nimport type { ComposeOptions, ResolverOutput } from \"./types.js\";\n\nconst defaultOptions: ComposeOptions = {\n\tprojectName: \"test-project\",\n\tproxy: \"none\",\n\tgpu: false,\n\tplatform: \"linux/amd64\",\n\tdeployment: \"local\",\n\topenclawVersion: \"latest\",\n};\n\ndescribe(\"compose\", () => {\n\tit(\"generates minimal stack with just OpenClaw gateway when no companions\", () => {\n\t\tconst resolved = resolve({ services: [], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should have the gateway service\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].image).toContain(\"ghcr.io/openclaw/openclaw\");\n\n\t\t// Gateway should have core environment\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.HOME).toBe(\"/home/node\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.TERM).toBe(\"xterm-256color\");\n\n\t\t// Gateway uses bind-mount volumes (not named volumes in top-level volumes section)\n\t\tconst gwVolumes = parsed.services[\"openclaw-gateway\"].volumes as string[];\n\t\texpect(gwVolumes.some((v: string) => v.includes(\".openclaw\"))).toBe(true);\n\n\t\t// Should have network\n\t\texpect(parsed.networks).toHaveProperty(\"openclaw-network\");\n\t\texpect(parsed.networks[\"openclaw-network\"].driver).toBe(\"bridge\");\n\n\t\t// Should have CLI companion service\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-cli\");\n\n\t\t// Gateway should have no depends_on (no companions)\n\t\texpect(parsed.services[\"openclaw-gateway\"]).not.toHaveProperty(\"depends_on\");\n\n\t\t// Gateway should have restart policy\n\t\texpect(parsed.services[\"openclaw-gateway\"].restart).toBe(\"unless-stopped\");\n\t});\n\n\tit(\"generates Redis companion with proper gateway depends_on\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should have gateway and redis services\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services).toHaveProperty(\"redis\");\n\n\t\t// Redis service should have correct image\n\t\texpect(parsed.services.redis.image).toBe(\"redis:8-alpine\");\n\n\t\t// Gateway depends_on should include redis with service_healthy (redis has healthcheck)\n\t\texpect(parsed.services[\"openclaw-gateway\"].depends_on).toHaveProperty(\"redis\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].depends_on.redis.condition).toBe(\"service_healthy\");\n\n\t\t// Redis should have a healthcheck\n\t\texpect(parsed.services.redis.healthcheck).toBeDefined();\n\t\texpect(parsed.services.redis.healthcheck.test).toContain(\"redis-cli ping\");\n\n\t\t// Redis should have restart policy\n\t\texpect(parsed.services.redis.restart).toBe(\"unless-stopped\");\n\n\t\t// Redis should be on openclaw-network\n\t\texpect(parsed.services.redis.networks).toContain(\"openclaw-network\");\n\n\t\t// Gateway environment should include redis-related openclawEnvVars\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment).toHaveProperty(\"REDIS_HOST\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.REDIS_HOST).toBe(\"redis\");\n\t});\n\n\tit(\"generates parseable YAML for a multi-service stack\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"n8n\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\n\t\t// Should not throw when parsing\n\t\texpect(() => parse(yaml)).not.toThrow();\n\n\t\tconst parsed = parse(yaml);\n\t\texpect(parsed).toHaveProperty(\"services\");\n\t\texpect(parsed).toHaveProperty(\"volumes\");\n\t\texpect(parsed).toHaveProperty(\"networks\");\n\n\t\t// Should have gateway + redis + n8n + postgresql (n8n requires postgresql)\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services).toHaveProperty(\"redis\");\n\t\texpect(parsed.services).toHaveProperty(\"n8n\");\n\t\texpect(parsed.services).toHaveProperty(\"postgresql\");\n\t});\n\n\tit(\"includes all service volumes in top-level volumes section\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"n8n\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Collect all volume names from all resolved services\n\t\tconst serviceVolumeNames = new Set<string>();\n\t\tfor (const rs of resolved.services) {\n\t\t\tfor (const vol of rs.definition.volumes) {\n\t\t\t\tserviceVolumeNames.add(vol.name);\n\t\t\t}\n\t\t}\n\n\t\t// All service volumes must appear in top-level volumes\n\t\tfor (const volName of serviceVolumeNames) {\n\t\t\texpect(parsed.volumes).toHaveProperty(volName);\n\t\t}\n\n\t\t// Gateway uses bind-mount volumes (not in top-level volumes section)\n\t\tconst gwVols = parsed.services[\"openclaw-gateway\"].volumes as string[];\n\t\texpect(gwVols.some((v: string) => v.includes(\".openclaw\"))).toBe(true);\n\t});\n\n\tit(\"includes GPU passthrough when gpu=true and service requires it\", () => {\n\t\tconst resolved = resolve({ services: [\"ollama\"], skillPacks: [] });\n\n\t\t// Modify resolved output to simulate a GPU-required service\n\t\tconst gpuResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: { ...s.definition, gpuRequired: true },\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(gpuResolved, { ...defaultOptions, gpu: true });\n\t\tconst parsed = parse(yaml);\n\n\t\t// Ollama service should have GPU device reservation\n\t\tconst ollamaService = parsed.services.ollama;\n\t\texpect(ollamaService.deploy).toBeDefined();\n\t\texpect(ollamaService.deploy.resources.reservations.devices).toEqual([\n\t\t\t{\n\t\t\t\tdriver: \"nvidia\",\n\t\t\t\tcount: \"all\",\n\t\t\t\tcapabilities: [\"gpu\"],\n\t\t\t},\n\t\t]);\n\t});\n\n\tit(\"does not include GPU passthrough when gpu=false\", () => {\n\t\tconst resolved = resolve({ services: [\"ollama\"], skillPacks: [] });\n\n\t\t// Even if service requires GPU, gpu option is false\n\t\tconst gpuResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: { ...s.definition, gpuRequired: true },\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(gpuResolved, { ...defaultOptions, gpu: false });\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should NOT have deploy with GPU devices\n\t\tconst ollamaService = parsed.services.ollama;\n\t\texpect(ollamaService.deploy?.resources?.reservations?.devices).toBeUndefined();\n\t});\n\n\tit(\"does not map internal-only ports to host\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\n\t\t// Modify redis to have an internal-only port\n\t\tconst modifiedResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: {\n\t\t\t\t\t...s.definition,\n\t\t\t\t\tports: [\n\t\t\t\t\t\t...s.definition.ports,\n\t\t\t\t\t\t{ host: 16379, container: 16379, description: \"Redis cluster bus\", exposed: false },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(modifiedResolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should only have the exposed port, not the internal one\n\t\tconst redisPorts = parsed.services.redis.ports;\n\t\texpect(redisPorts).toHaveLength(1);\n\t\texpect(redisPorts[0]).toContain(\"6379\");\n\t\texpect(redisPorts[0]).not.toContain(\"16379\");\n\t});\n\n\tit(\"uses service_started condition for services without healthcheck\", () => {\n\t\tconst resolved = resolve({ services: [\"minio\"], skillPacks: [] });\n\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Minio may or may not have a healthcheck – the gateway depends_on\n\t\t// condition should reflect the definition accurately\n\t\tconst gatewayDeps = parsed.services[\"openclaw-gateway\"].depends_on;\n\t\tfor (const [id, dep] of Object.entries(gatewayDeps)) {\n\t\t\tconst svc = resolved.services.find((s) => s.definition.id === id);\n\t\t\tif (svc?.definition.healthcheck) {\n\t\t\t\texpect((dep as { condition: string }).condition).toBe(\"service_healthy\");\n\t\t\t} else {\n\t\t\t\texpect((dep as { condition: string }).condition).toBe(\"service_started\");\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"gateway is always the first service in the output\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"ollama\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// First key in services should be openclaw-gateway\n\t\tconst serviceKeys = Object.keys(parsed.services);\n\t\texpect(serviceKeys[0]).toBe(\"openclaw-gateway\");\n\t});\n});\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -1,4 +1,4 @@
1
- import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-BgmKutxR.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-CFyDIn0m.mjs";
2
2
  import { resolve } from "./resolver.mjs";
3
3
  import { compose } from "./composer.mjs";
4
4
  import { parse } from "yaml";
@@ -37,7 +37,7 @@ describe("compose", () => {
37
37
  }), defaultOptions));
38
38
  globalExpect(parsed.services).toHaveProperty("openclaw-gateway");
39
39
  globalExpect(parsed.services).toHaveProperty("redis");
40
- globalExpect(parsed.services.redis.image).toBe("redis:7-alpine");
40
+ globalExpect(parsed.services.redis.image).toBe("redis:8-alpine");
41
41
  globalExpect(parsed.services["openclaw-gateway"].depends_on).toHaveProperty("redis");
42
42
  globalExpect(parsed.services["openclaw-gateway"].depends_on.redis.condition).toBe("service_healthy");
43
43
  globalExpect(parsed.services.redis.healthcheck).toBeDefined();
@@ -1 +1 @@
1
- {"version":3,"file":"composer.test.mjs","names":[],"sources":["../src/composer.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { compose } from \"./composer.js\";\nimport { resolve } from \"./resolver.js\";\nimport type { ComposeOptions, ResolverOutput } from \"./types.js\";\n\nconst defaultOptions: ComposeOptions = {\n\tprojectName: \"test-project\",\n\tproxy: \"none\",\n\tgpu: false,\n\tplatform: \"linux/amd64\",\n\tdeployment: \"local\",\n\topenclawVersion: \"latest\",\n};\n\ndescribe(\"compose\", () => {\n\tit(\"generates minimal stack with just OpenClaw gateway when no companions\", () => {\n\t\tconst resolved = resolve({ services: [], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should have the gateway service\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].image).toContain(\"ghcr.io/openclaw/openclaw\");\n\n\t\t// Gateway should have core environment\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.HOME).toBe(\"/home/node\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.TERM).toBe(\"xterm-256color\");\n\n\t\t// Gateway uses bind-mount volumes (not named volumes in top-level volumes section)\n\t\tconst gwVolumes = parsed.services[\"openclaw-gateway\"].volumes as string[];\n\t\texpect(gwVolumes.some((v: string) => v.includes(\".openclaw\"))).toBe(true);\n\n\t\t// Should have network\n\t\texpect(parsed.networks).toHaveProperty(\"openclaw-network\");\n\t\texpect(parsed.networks[\"openclaw-network\"].driver).toBe(\"bridge\");\n\n\t\t// Should have CLI companion service\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-cli\");\n\n\t\t// Gateway should have no depends_on (no companions)\n\t\texpect(parsed.services[\"openclaw-gateway\"]).not.toHaveProperty(\"depends_on\");\n\n\t\t// Gateway should have restart policy\n\t\texpect(parsed.services[\"openclaw-gateway\"].restart).toBe(\"unless-stopped\");\n\t});\n\n\tit(\"generates Redis companion with proper gateway depends_on\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should have gateway and redis services\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services).toHaveProperty(\"redis\");\n\n\t\t// Redis service should have correct image\n\t\texpect(parsed.services.redis.image).toBe(\"redis:7-alpine\");\n\n\t\t// Gateway depends_on should include redis with service_healthy (redis has healthcheck)\n\t\texpect(parsed.services[\"openclaw-gateway\"].depends_on).toHaveProperty(\"redis\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].depends_on.redis.condition).toBe(\"service_healthy\");\n\n\t\t// Redis should have a healthcheck\n\t\texpect(parsed.services.redis.healthcheck).toBeDefined();\n\t\texpect(parsed.services.redis.healthcheck.test).toContain(\"redis-cli ping\");\n\n\t\t// Redis should have restart policy\n\t\texpect(parsed.services.redis.restart).toBe(\"unless-stopped\");\n\n\t\t// Redis should be on openclaw-network\n\t\texpect(parsed.services.redis.networks).toContain(\"openclaw-network\");\n\n\t\t// Gateway environment should include redis-related openclawEnvVars\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment).toHaveProperty(\"REDIS_HOST\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.REDIS_HOST).toBe(\"redis\");\n\t});\n\n\tit(\"generates parseable YAML for a multi-service stack\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"n8n\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\n\t\t// Should not throw when parsing\n\t\texpect(() => parse(yaml)).not.toThrow();\n\n\t\tconst parsed = parse(yaml);\n\t\texpect(parsed).toHaveProperty(\"services\");\n\t\texpect(parsed).toHaveProperty(\"volumes\");\n\t\texpect(parsed).toHaveProperty(\"networks\");\n\n\t\t// Should have gateway + redis + n8n + postgresql (n8n requires postgresql)\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services).toHaveProperty(\"redis\");\n\t\texpect(parsed.services).toHaveProperty(\"n8n\");\n\t\texpect(parsed.services).toHaveProperty(\"postgresql\");\n\t});\n\n\tit(\"includes all service volumes in top-level volumes section\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"n8n\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Collect all volume names from all resolved services\n\t\tconst serviceVolumeNames = new Set<string>();\n\t\tfor (const rs of resolved.services) {\n\t\t\tfor (const vol of rs.definition.volumes) {\n\t\t\t\tserviceVolumeNames.add(vol.name);\n\t\t\t}\n\t\t}\n\n\t\t// All service volumes must appear in top-level volumes\n\t\tfor (const volName of serviceVolumeNames) {\n\t\t\texpect(parsed.volumes).toHaveProperty(volName);\n\t\t}\n\n\t\t// Gateway uses bind-mount volumes (not in top-level volumes section)\n\t\tconst gwVols = parsed.services[\"openclaw-gateway\"].volumes as string[];\n\t\texpect(gwVols.some((v: string) => v.includes(\".openclaw\"))).toBe(true);\n\t});\n\n\tit(\"includes GPU passthrough when gpu=true and service requires it\", () => {\n\t\tconst resolved = resolve({ services: [\"ollama\"], skillPacks: [] });\n\n\t\t// Modify resolved output to simulate a GPU-required service\n\t\tconst gpuResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: { ...s.definition, gpuRequired: true },\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(gpuResolved, { ...defaultOptions, gpu: true });\n\t\tconst parsed = parse(yaml);\n\n\t\t// Ollama service should have GPU device reservation\n\t\tconst ollamaService = parsed.services.ollama;\n\t\texpect(ollamaService.deploy).toBeDefined();\n\t\texpect(ollamaService.deploy.resources.reservations.devices).toEqual([\n\t\t\t{\n\t\t\t\tdriver: \"nvidia\",\n\t\t\t\tcount: \"all\",\n\t\t\t\tcapabilities: [\"gpu\"],\n\t\t\t},\n\t\t]);\n\t});\n\n\tit(\"does not include GPU passthrough when gpu=false\", () => {\n\t\tconst resolved = resolve({ services: [\"ollama\"], skillPacks: [] });\n\n\t\t// Even if service requires GPU, gpu option is false\n\t\tconst gpuResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: { ...s.definition, gpuRequired: true },\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(gpuResolved, { ...defaultOptions, gpu: false });\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should NOT have deploy with GPU devices\n\t\tconst ollamaService = parsed.services.ollama;\n\t\texpect(ollamaService.deploy?.resources?.reservations?.devices).toBeUndefined();\n\t});\n\n\tit(\"does not map internal-only ports to host\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\n\t\t// Modify redis to have an internal-only port\n\t\tconst modifiedResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: {\n\t\t\t\t\t...s.definition,\n\t\t\t\t\tports: [\n\t\t\t\t\t\t...s.definition.ports,\n\t\t\t\t\t\t{ host: 16379, container: 16379, description: \"Redis cluster bus\", exposed: false },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(modifiedResolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should only have the exposed port, not the internal one\n\t\tconst redisPorts = parsed.services.redis.ports;\n\t\texpect(redisPorts).toHaveLength(1);\n\t\texpect(redisPorts[0]).toContain(\"6379\");\n\t\texpect(redisPorts[0]).not.toContain(\"16379\");\n\t});\n\n\tit(\"uses service_started condition for services without healthcheck\", () => {\n\t\tconst resolved = resolve({ services: [\"minio\"], skillPacks: [] });\n\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Minio may or may not have a healthcheck – the gateway depends_on\n\t\t// condition should reflect the definition accurately\n\t\tconst gatewayDeps = parsed.services[\"openclaw-gateway\"].depends_on;\n\t\tfor (const [id, dep] of Object.entries(gatewayDeps)) {\n\t\t\tconst svc = resolved.services.find((s) => s.definition.id === id);\n\t\t\tif (svc?.definition.healthcheck) {\n\t\t\t\texpect((dep as { condition: string }).condition).toBe(\"service_healthy\");\n\t\t\t} else {\n\t\t\t\texpect((dep as { condition: string }).condition).toBe(\"service_started\");\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"gateway is always the first service in the output\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"ollama\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// First key in services should be openclaw-gateway\n\t\tconst serviceKeys = Object.keys(parsed.services);\n\t\texpect(serviceKeys[0]).toBe(\"openclaw-gateway\");\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"composer.test.mjs","names":[],"sources":["../src/composer.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { compose } from \"./composer.js\";\nimport { resolve } from \"./resolver.js\";\nimport type { ComposeOptions, ResolverOutput } from \"./types.js\";\n\nconst defaultOptions: ComposeOptions = {\n\tprojectName: \"test-project\",\n\tproxy: \"none\",\n\tgpu: false,\n\tplatform: \"linux/amd64\",\n\tdeployment: \"local\",\n\topenclawVersion: \"latest\",\n};\n\ndescribe(\"compose\", () => {\n\tit(\"generates minimal stack with just OpenClaw gateway when no companions\", () => {\n\t\tconst resolved = resolve({ services: [], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should have the gateway service\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].image).toContain(\"ghcr.io/openclaw/openclaw\");\n\n\t\t// Gateway should have core environment\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.HOME).toBe(\"/home/node\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.TERM).toBe(\"xterm-256color\");\n\n\t\t// Gateway uses bind-mount volumes (not named volumes in top-level volumes section)\n\t\tconst gwVolumes = parsed.services[\"openclaw-gateway\"].volumes as string[];\n\t\texpect(gwVolumes.some((v: string) => v.includes(\".openclaw\"))).toBe(true);\n\n\t\t// Should have network\n\t\texpect(parsed.networks).toHaveProperty(\"openclaw-network\");\n\t\texpect(parsed.networks[\"openclaw-network\"].driver).toBe(\"bridge\");\n\n\t\t// Should have CLI companion service\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-cli\");\n\n\t\t// Gateway should have no depends_on (no companions)\n\t\texpect(parsed.services[\"openclaw-gateway\"]).not.toHaveProperty(\"depends_on\");\n\n\t\t// Gateway should have restart policy\n\t\texpect(parsed.services[\"openclaw-gateway\"].restart).toBe(\"unless-stopped\");\n\t});\n\n\tit(\"generates Redis companion with proper gateway depends_on\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should have gateway and redis services\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services).toHaveProperty(\"redis\");\n\n\t\t// Redis service should have correct image\n\t\texpect(parsed.services.redis.image).toBe(\"redis:8-alpine\");\n\n\t\t// Gateway depends_on should include redis with service_healthy (redis has healthcheck)\n\t\texpect(parsed.services[\"openclaw-gateway\"].depends_on).toHaveProperty(\"redis\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].depends_on.redis.condition).toBe(\"service_healthy\");\n\n\t\t// Redis should have a healthcheck\n\t\texpect(parsed.services.redis.healthcheck).toBeDefined();\n\t\texpect(parsed.services.redis.healthcheck.test).toContain(\"redis-cli ping\");\n\n\t\t// Redis should have restart policy\n\t\texpect(parsed.services.redis.restart).toBe(\"unless-stopped\");\n\n\t\t// Redis should be on openclaw-network\n\t\texpect(parsed.services.redis.networks).toContain(\"openclaw-network\");\n\n\t\t// Gateway environment should include redis-related openclawEnvVars\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment).toHaveProperty(\"REDIS_HOST\");\n\t\texpect(parsed.services[\"openclaw-gateway\"].environment.REDIS_HOST).toBe(\"redis\");\n\t});\n\n\tit(\"generates parseable YAML for a multi-service stack\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"n8n\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\n\t\t// Should not throw when parsing\n\t\texpect(() => parse(yaml)).not.toThrow();\n\n\t\tconst parsed = parse(yaml);\n\t\texpect(parsed).toHaveProperty(\"services\");\n\t\texpect(parsed).toHaveProperty(\"volumes\");\n\t\texpect(parsed).toHaveProperty(\"networks\");\n\n\t\t// Should have gateway + redis + n8n + postgresql (n8n requires postgresql)\n\t\texpect(parsed.services).toHaveProperty(\"openclaw-gateway\");\n\t\texpect(parsed.services).toHaveProperty(\"redis\");\n\t\texpect(parsed.services).toHaveProperty(\"n8n\");\n\t\texpect(parsed.services).toHaveProperty(\"postgresql\");\n\t});\n\n\tit(\"includes all service volumes in top-level volumes section\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"n8n\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Collect all volume names from all resolved services\n\t\tconst serviceVolumeNames = new Set<string>();\n\t\tfor (const rs of resolved.services) {\n\t\t\tfor (const vol of rs.definition.volumes) {\n\t\t\t\tserviceVolumeNames.add(vol.name);\n\t\t\t}\n\t\t}\n\n\t\t// All service volumes must appear in top-level volumes\n\t\tfor (const volName of serviceVolumeNames) {\n\t\t\texpect(parsed.volumes).toHaveProperty(volName);\n\t\t}\n\n\t\t// Gateway uses bind-mount volumes (not in top-level volumes section)\n\t\tconst gwVols = parsed.services[\"openclaw-gateway\"].volumes as string[];\n\t\texpect(gwVols.some((v: string) => v.includes(\".openclaw\"))).toBe(true);\n\t});\n\n\tit(\"includes GPU passthrough when gpu=true and service requires it\", () => {\n\t\tconst resolved = resolve({ services: [\"ollama\"], skillPacks: [] });\n\n\t\t// Modify resolved output to simulate a GPU-required service\n\t\tconst gpuResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: { ...s.definition, gpuRequired: true },\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(gpuResolved, { ...defaultOptions, gpu: true });\n\t\tconst parsed = parse(yaml);\n\n\t\t// Ollama service should have GPU device reservation\n\t\tconst ollamaService = parsed.services.ollama;\n\t\texpect(ollamaService.deploy).toBeDefined();\n\t\texpect(ollamaService.deploy.resources.reservations.devices).toEqual([\n\t\t\t{\n\t\t\t\tdriver: \"nvidia\",\n\t\t\t\tcount: \"all\",\n\t\t\t\tcapabilities: [\"gpu\"],\n\t\t\t},\n\t\t]);\n\t});\n\n\tit(\"does not include GPU passthrough when gpu=false\", () => {\n\t\tconst resolved = resolve({ services: [\"ollama\"], skillPacks: [] });\n\n\t\t// Even if service requires GPU, gpu option is false\n\t\tconst gpuResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: { ...s.definition, gpuRequired: true },\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(gpuResolved, { ...defaultOptions, gpu: false });\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should NOT have deploy with GPU devices\n\t\tconst ollamaService = parsed.services.ollama;\n\t\texpect(ollamaService.deploy?.resources?.reservations?.devices).toBeUndefined();\n\t});\n\n\tit(\"does not map internal-only ports to host\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\n\t\t// Modify redis to have an internal-only port\n\t\tconst modifiedResolved: ResolverOutput = {\n\t\t\t...resolved,\n\t\t\tservices: resolved.services.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\tdefinition: {\n\t\t\t\t\t...s.definition,\n\t\t\t\t\tports: [\n\t\t\t\t\t\t...s.definition.ports,\n\t\t\t\t\t\t{ host: 16379, container: 16379, description: \"Redis cluster bus\", exposed: false },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t})),\n\t\t};\n\n\t\tconst yaml = compose(modifiedResolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Should only have the exposed port, not the internal one\n\t\tconst redisPorts = parsed.services.redis.ports;\n\t\texpect(redisPorts).toHaveLength(1);\n\t\texpect(redisPorts[0]).toContain(\"6379\");\n\t\texpect(redisPorts[0]).not.toContain(\"16379\");\n\t});\n\n\tit(\"uses service_started condition for services without healthcheck\", () => {\n\t\tconst resolved = resolve({ services: [\"minio\"], skillPacks: [] });\n\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// Minio may or may not have a healthcheck – the gateway depends_on\n\t\t// condition should reflect the definition accurately\n\t\tconst gatewayDeps = parsed.services[\"openclaw-gateway\"].depends_on;\n\t\tfor (const [id, dep] of Object.entries(gatewayDeps)) {\n\t\t\tconst svc = resolved.services.find((s) => s.definition.id === id);\n\t\t\tif (svc?.definition.healthcheck) {\n\t\t\t\texpect((dep as { condition: string }).condition).toBe(\"service_healthy\");\n\t\t\t} else {\n\t\t\t\texpect((dep as { condition: string }).condition).toBe(\"service_started\");\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"gateway is always the first service in the output\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\", \"ollama\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultOptions);\n\t\tconst parsed = parse(yaml);\n\n\t\t// First key in services should be openclaw-gateway\n\t\tconst serviceKeys = Object.keys(parsed.services);\n\t\texpect(serviceKeys[0]).toBe(\"openclaw-gateway\");\n\t});\n});\n"],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/deployers/coolify.ts
4
+ /** Build a full Coolify API URL (base + /api/v1 + path). */
5
+ function apiUrl(target, path) {
6
+ return `${target.instanceUrl.replace(/\/+$/, "")}/api/v1${path}`;
7
+ }
8
+ /**
9
+ * Typed fetch wrapper for the Coolify v4 API.
10
+ * Handles JSON serialisation, Bearer auth, and error extraction.
11
+ */
12
+ async function coolifyFetch(target, path, options = {}) {
13
+ const res = await fetch(apiUrl(target, path), {
14
+ method: options.method ?? "GET",
15
+ headers: {
16
+ "Content-Type": "application/json",
17
+ Authorization: `Bearer ${target.apiKey}`
18
+ },
19
+ body: options.body ? JSON.stringify(options.body) : void 0
20
+ });
21
+ if (!res.ok) {
22
+ const text = await res.text().catch(() => "");
23
+ let detail = text;
24
+ try {
25
+ const json = JSON.parse(text);
26
+ detail = json.message || json.error || text;
27
+ } catch {}
28
+ throw new Error(`Coolify API ${res.status}: ${detail}`);
29
+ }
30
+ const text = await res.text();
31
+ if (!text) return void 0;
32
+ return JSON.parse(text);
33
+ }
34
+ /**
35
+ * Parse .env content into key-value pairs for Coolify's bulk env API.
36
+ */
37
+ function parseEnvContent(envContent) {
38
+ const result = [];
39
+ for (const line of envContent.split("\n")) {
40
+ const trimmed = line.trim();
41
+ if (!trimmed || trimmed.startsWith("#")) continue;
42
+ const eqIdx = trimmed.indexOf("=");
43
+ if (eqIdx <= 0) continue;
44
+ const key = trimmed.slice(0, eqIdx);
45
+ const value = trimmed.slice(eqIdx + 1);
46
+ result.push({
47
+ key,
48
+ value,
49
+ is_preview: false,
50
+ is_build_time: false,
51
+ is_literal: true
52
+ });
53
+ }
54
+ return result;
55
+ }
56
+ /**
57
+ * Deploys Docker Compose stacks to a Coolify v4 instance.
58
+ *
59
+ * Deploy flow (5 steps):
60
+ * 1. Discover the first available server
61
+ * 2. Create a Coolify project
62
+ * 3. Create a compose service with the raw docker-compose YAML
63
+ * 4. Push .env variables via the bulk env API
64
+ * 5. Trigger the deployment
65
+ */
66
+ var CoolifyDeployer = class {
67
+ name = "Coolify";
68
+ id = "coolify";
69
+ async testConnection(target) {
70
+ try {
71
+ await coolifyFetch(target, "/version");
72
+ return { ok: true };
73
+ } catch (err) {
74
+ return {
75
+ ok: false,
76
+ error: err instanceof Error ? err.message : String(err)
77
+ };
78
+ }
79
+ }
80
+ async deploy(input) {
81
+ const steps = [
82
+ {
83
+ step: "Discover server",
84
+ status: "pending"
85
+ },
86
+ {
87
+ step: "Create project",
88
+ status: "pending"
89
+ },
90
+ {
91
+ step: "Create compose service",
92
+ status: "pending"
93
+ },
94
+ {
95
+ step: "Set environment variables",
96
+ status: "pending"
97
+ },
98
+ {
99
+ step: "Trigger deployment",
100
+ status: "pending"
101
+ }
102
+ ];
103
+ const result = {
104
+ success: false,
105
+ steps
106
+ };
107
+ try {
108
+ steps[0].status = "running";
109
+ const servers = await coolifyFetch(input.target, "/servers");
110
+ if (!servers || servers.length === 0) throw new Error("No servers found in Coolify instance");
111
+ const server = servers[0];
112
+ steps[0].status = "done";
113
+ steps[0].detail = `Server: ${server.name} (${server.ip})`;
114
+ steps[1].status = "running";
115
+ const project = await coolifyFetch(input.target, "/projects", {
116
+ method: "POST",
117
+ body: {
118
+ name: input.projectName,
119
+ description: input.description ?? `OpenClaw stack: ${input.projectName}`
120
+ }
121
+ });
122
+ result.projectId = project.uuid;
123
+ steps[1].status = "done";
124
+ steps[1].detail = `Project: ${project.uuid}`;
125
+ const projectDetail = await coolifyFetch(input.target, `/projects/${project.uuid}`);
126
+ const envUuid = projectDetail.environments?.[0]?.uuid;
127
+ const envName = projectDetail.environments?.[0]?.name ?? "production";
128
+ if (!envUuid) throw new Error("No default environment found in project");
129
+ steps[2].status = "running";
130
+ const service = await coolifyFetch(input.target, "/services", {
131
+ method: "POST",
132
+ body: {
133
+ project_uuid: project.uuid,
134
+ server_uuid: server.uuid,
135
+ environment_name: envName,
136
+ environment_uuid: envUuid,
137
+ docker_compose_raw: input.composeYaml,
138
+ name: input.projectName,
139
+ description: input.description ?? "Deployed via OpenClaw web builder",
140
+ instant_deploy: false
141
+ }
142
+ });
143
+ result.composeId = service.uuid;
144
+ steps[2].status = "done";
145
+ steps[2].detail = `Service: ${service.uuid}`;
146
+ steps[3].status = "running";
147
+ const envVars = parseEnvContent(input.envContent);
148
+ if (envVars.length > 0) await coolifyFetch(input.target, `/services/${service.uuid}/envs`, {
149
+ method: "PATCH",
150
+ body: envVars
151
+ });
152
+ steps[3].status = "done";
153
+ steps[3].detail = `${envVars.length} variables set`;
154
+ steps[4].status = "running";
155
+ const deployments = await coolifyFetch(input.target, `/deploy?uuid=${service.uuid}&force=true`);
156
+ steps[4].status = "done";
157
+ steps[4].detail = deployments?.deployments?.[0]?.deployment_uuid ?? "Deployment triggered";
158
+ result.success = true;
159
+ result.dashboardUrl = `${input.target.instanceUrl.replace(/\/+$/, "")}/project/${project.uuid}`;
160
+ } catch (err) {
161
+ const failedIdx = steps.findIndex((s) => s.status === "running");
162
+ if (failedIdx >= 0) {
163
+ steps[failedIdx].status = "error";
164
+ steps[failedIdx].detail = err instanceof Error ? err.message : String(err);
165
+ }
166
+ result.error = err instanceof Error ? err.message : String(err);
167
+ }
168
+ return result;
169
+ }
170
+ };
171
+
172
+ //#endregion
173
+ exports.CoolifyDeployer = CoolifyDeployer;
174
+ //# sourceMappingURL=coolify.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coolify.cjs","names":[],"sources":["../../src/deployers/coolify.ts"],"sourcesContent":["/**\n * Coolify PaaS deployer — deploys Docker Compose stacks via the Coolify v4 REST API.\n *\n * API docs: https://coolify.io/docs/api-reference/api/\n * Auth: Authorization: Bearer <token>\n * Base path: /api/v1\n */\n\nimport type { DeployInput, DeployResult, DeployStep, DeployTarget, PaasDeployer } from \"./types.js\";\n\n/** Shape returned by Coolify's project endpoints. */\ninterface CoolifyProject {\n\tuuid: string;\n\tname: string;\n\tenvironments?: { uuid: string; name: string }[];\n}\n\n/** Shape returned by Coolify's server listing. */\ninterface CoolifyServer {\n\tuuid: string;\n\tname: string;\n\tip: string;\n}\n\n/** Shape returned when creating a Coolify service (compose stack). */\ninterface CoolifyService {\n\tuuid: string;\n}\n\n/** Shape returned by Coolify's deploy trigger endpoint. */\ninterface CoolifyDeployment {\n\tmessage: string;\n\tresource_uuid: string;\n\tdeployment_uuid: string;\n}\n\n/** Build a full Coolify API URL (base + /api/v1 + path). */\nfunction apiUrl(target: DeployTarget, path: string): string {\n\tconst base = target.instanceUrl.replace(/\\/+$/, \"\");\n\treturn `${base}/api/v1${path}`;\n}\n\n/**\n * Typed fetch wrapper for the Coolify v4 API.\n * Handles JSON serialisation, Bearer auth, and error extraction.\n */\nasync function coolifyFetch<T>(\n\ttarget: DeployTarget,\n\tpath: string,\n\toptions: { method?: string; body?: unknown } = {},\n): Promise<T> {\n\tconst res = await fetch(apiUrl(target, path), {\n\t\tmethod: options.method ?? \"GET\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${target.apiKey}`,\n\t\t},\n\t\tbody: options.body ? JSON.stringify(options.body) : undefined,\n\t});\n\n\tif (!res.ok) {\n\t\tconst text = await res.text().catch(() => \"\");\n\t\tlet detail = text;\n\t\ttry {\n\t\t\tconst json = JSON.parse(text);\n\t\t\tdetail = json.message || json.error || text;\n\t\t} catch {\n\t\t\t// use raw text\n\t\t}\n\t\tthrow new Error(`Coolify API ${res.status}: ${detail}`);\n\t}\n\n\tconst text = await res.text();\n\tif (!text) return undefined as T;\n\treturn JSON.parse(text) as T;\n}\n\n/**\n * Parse .env content into key-value pairs for Coolify's bulk env API.\n */\nfunction parseEnvContent(envContent: string): {\n\tkey: string;\n\tvalue: string;\n\tis_preview: boolean;\n\tis_build_time: boolean;\n\tis_literal: boolean;\n}[] {\n\tconst result: {\n\t\tkey: string;\n\t\tvalue: string;\n\t\tis_preview: boolean;\n\t\tis_build_time: boolean;\n\t\tis_literal: boolean;\n\t}[] = [];\n\n\tfor (const line of envContent.split(\"\\n\")) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n\t\tconst eqIdx = trimmed.indexOf(\"=\");\n\t\tif (eqIdx <= 0) continue;\n\n\t\tconst key = trimmed.slice(0, eqIdx);\n\t\tconst value = trimmed.slice(eqIdx + 1);\n\n\t\tresult.push({\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tis_preview: false,\n\t\t\tis_build_time: false,\n\t\t\tis_literal: true,\n\t\t});\n\t}\n\n\treturn result;\n}\n\n/**\n * Deploys Docker Compose stacks to a Coolify v4 instance.\n *\n * Deploy flow (5 steps):\n * 1. Discover the first available server\n * 2. Create a Coolify project\n * 3. Create a compose service with the raw docker-compose YAML\n * 4. Push .env variables via the bulk env API\n * 5. Trigger the deployment\n */\nexport class CoolifyDeployer implements PaasDeployer {\n\treadonly name = \"Coolify\";\n\treadonly id = \"coolify\";\n\n\tasync testConnection(target: DeployTarget): Promise<{ ok: boolean; error?: string }> {\n\t\ttry {\n\t\t\tawait coolifyFetch<unknown>(target, \"/version\");\n\t\t\treturn { ok: true };\n\t\t} catch (err) {\n\t\t\treturn { ok: false, error: err instanceof Error ? err.message : String(err) };\n\t\t}\n\t}\n\n\tasync deploy(input: DeployInput): Promise<DeployResult> {\n\t\tconst steps: DeployStep[] = [\n\t\t\t{ step: \"Discover server\", status: \"pending\" },\n\t\t\t{ step: \"Create project\", status: \"pending\" },\n\t\t\t{ step: \"Create compose service\", status: \"pending\" },\n\t\t\t{ step: \"Set environment variables\", status: \"pending\" },\n\t\t\t{ step: \"Trigger deployment\", status: \"pending\" },\n\t\t];\n\n\t\tconst result: DeployResult = { success: false, steps };\n\n\t\ttry {\n\t\t\t// Step 1: Discover default server\n\t\t\tsteps[0].status = \"running\";\n\t\t\tconst servers = await coolifyFetch<CoolifyServer[]>(input.target, \"/servers\");\n\t\t\tif (!servers || servers.length === 0) {\n\t\t\t\tthrow new Error(\"No servers found in Coolify instance\");\n\t\t\t}\n\t\t\tconst server = servers[0];\n\t\t\tsteps[0].status = \"done\";\n\t\t\tsteps[0].detail = `Server: ${server.name} (${server.ip})`;\n\n\t\t\t// Step 2: Create project\n\t\t\tsteps[1].status = \"running\";\n\t\t\tconst project = await coolifyFetch<CoolifyProject>(input.target, \"/projects\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: {\n\t\t\t\t\tname: input.projectName,\n\t\t\t\t\tdescription: input.description ?? `OpenClaw stack: ${input.projectName}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\tresult.projectId = project.uuid;\n\t\t\tsteps[1].status = \"done\";\n\t\t\tsteps[1].detail = `Project: ${project.uuid}`;\n\n\t\t\t// Get the default environment\n\t\t\tconst projectDetail = await coolifyFetch<CoolifyProject>(\n\t\t\t\tinput.target,\n\t\t\t\t`/projects/${project.uuid}`,\n\t\t\t);\n\t\t\tconst envUuid = projectDetail.environments?.[0]?.uuid;\n\t\t\tconst envName = projectDetail.environments?.[0]?.name ?? \"production\";\n\t\t\tif (!envUuid) {\n\t\t\t\tthrow new Error(\"No default environment found in project\");\n\t\t\t}\n\n\t\t\t// Step 3: Create compose service with docker_compose_raw\n\t\t\tsteps[2].status = \"running\";\n\t\t\tconst service = await coolifyFetch<CoolifyService>(input.target, \"/services\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: {\n\t\t\t\t\tproject_uuid: project.uuid,\n\t\t\t\t\tserver_uuid: server.uuid,\n\t\t\t\t\tenvironment_name: envName,\n\t\t\t\t\tenvironment_uuid: envUuid,\n\t\t\t\t\tdocker_compose_raw: input.composeYaml,\n\t\t\t\t\tname: input.projectName,\n\t\t\t\t\tdescription: input.description ?? \"Deployed via OpenClaw web builder\",\n\t\t\t\t\tinstant_deploy: false,\n\t\t\t\t},\n\t\t\t});\n\t\t\tresult.composeId = service.uuid;\n\t\t\tsteps[2].status = \"done\";\n\t\t\tsteps[2].detail = `Service: ${service.uuid}`;\n\n\t\t\t// Step 4: Set environment variables\n\t\t\tsteps[3].status = \"running\";\n\t\t\tconst envVars = parseEnvContent(input.envContent);\n\t\t\tif (envVars.length > 0) {\n\t\t\t\tawait coolifyFetch(input.target, `/services/${service.uuid}/envs`, {\n\t\t\t\t\tmethod: \"PATCH\",\n\t\t\t\t\tbody: envVars,\n\t\t\t\t});\n\t\t\t}\n\t\t\tsteps[3].status = \"done\";\n\t\t\tsteps[3].detail = `${envVars.length} variables set`;\n\n\t\t\t// Step 5: Trigger deployment\n\t\t\tsteps[4].status = \"running\";\n\t\t\tconst deployments = await coolifyFetch<{ deployments: CoolifyDeployment[] }>(\n\t\t\t\tinput.target,\n\t\t\t\t`/deploy?uuid=${service.uuid}&force=true`,\n\t\t\t);\n\t\t\tsteps[4].status = \"done\";\n\t\t\tsteps[4].detail = deployments?.deployments?.[0]?.deployment_uuid ?? \"Deployment triggered\";\n\n\t\t\tresult.success = true;\n\t\t\tconst base = input.target.instanceUrl.replace(/\\/+$/, \"\");\n\t\t\tresult.dashboardUrl = `${base}/project/${project.uuid}`;\n\t\t} catch (err) {\n\t\t\tconst failedIdx = steps.findIndex((s) => s.status === \"running\");\n\t\t\tif (failedIdx >= 0) {\n\t\t\t\tsteps[failedIdx].status = \"error\";\n\t\t\t\tsteps[failedIdx].detail = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\t\t\tresult.error = err instanceof Error ? err.message : String(err);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { DeployInput, DeployResult, DeployTarget, PaasDeployer } from "./types.cjs";
2
+
3
+ //#region src/deployers/coolify.d.ts
4
+ /**
5
+ * Deploys Docker Compose stacks to a Coolify v4 instance.
6
+ *
7
+ * Deploy flow (5 steps):
8
+ * 1. Discover the first available server
9
+ * 2. Create a Coolify project
10
+ * 3. Create a compose service with the raw docker-compose YAML
11
+ * 4. Push .env variables via the bulk env API
12
+ * 5. Trigger the deployment
13
+ */
14
+ declare class CoolifyDeployer implements PaasDeployer {
15
+ readonly name = "Coolify";
16
+ readonly id = "coolify";
17
+ testConnection(target: DeployTarget): Promise<{
18
+ ok: boolean;
19
+ error?: string;
20
+ }>;
21
+ deploy(input: DeployInput): Promise<DeployResult>;
22
+ }
23
+ //#endregion
24
+ export { CoolifyDeployer };
25
+ //# sourceMappingURL=coolify.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coolify.d.cts","names":[],"sources":["../../src/deployers/coolify.ts"],"mappings":";;;;;;;;;;;;;cA+Ha,eAAA,YAA2B,YAAA;EAAA,SAC9B,IAAA;EAAA,SACA,EAAA;EAEH,cAAA,CAAe,MAAA,EAAQ,YAAA,GAAe,OAAA;IAAU,EAAA;IAAa,KAAA;EAAA;EAS7D,MAAA,CAAO,KAAA,EAAO,WAAA,GAAc,OAAA,CAAQ,YAAA;AAAA"}
@@ -0,0 +1,25 @@
1
+ import { DeployInput, DeployResult, DeployTarget, PaasDeployer } from "./types.mjs";
2
+
3
+ //#region src/deployers/coolify.d.ts
4
+ /**
5
+ * Deploys Docker Compose stacks to a Coolify v4 instance.
6
+ *
7
+ * Deploy flow (5 steps):
8
+ * 1. Discover the first available server
9
+ * 2. Create a Coolify project
10
+ * 3. Create a compose service with the raw docker-compose YAML
11
+ * 4. Push .env variables via the bulk env API
12
+ * 5. Trigger the deployment
13
+ */
14
+ declare class CoolifyDeployer implements PaasDeployer {
15
+ readonly name = "Coolify";
16
+ readonly id = "coolify";
17
+ testConnection(target: DeployTarget): Promise<{
18
+ ok: boolean;
19
+ error?: string;
20
+ }>;
21
+ deploy(input: DeployInput): Promise<DeployResult>;
22
+ }
23
+ //#endregion
24
+ export { CoolifyDeployer };
25
+ //# sourceMappingURL=coolify.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coolify.d.mts","names":[],"sources":["../../src/deployers/coolify.ts"],"mappings":";;;;;;;;;;;;;cA+Ha,eAAA,YAA2B,YAAA;EAAA,SAC9B,IAAA;EAAA,SACA,EAAA;EAEH,cAAA,CAAe,MAAA,EAAQ,YAAA,GAAe,OAAA;IAAU,EAAA;IAAa,KAAA;EAAA;EAS7D,MAAA,CAAO,KAAA,EAAO,WAAA,GAAc,OAAA,CAAQ,YAAA;AAAA"}