@better-openclaw/core 1.0.20 → 1.0.22

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 (975) hide show
  1. package/.github/workflows/publish-core.yml +1 -1
  2. package/dist/bare-metal-partition.cjs +2 -3
  3. package/dist/bare-metal-partition.cjs.map +1 -1
  4. package/dist/bare-metal-partition.d.mts.map +1 -1
  5. package/dist/bare-metal-partition.mjs +1 -1
  6. package/dist/bare-metal-partition.test.cjs +4 -5
  7. package/dist/bare-metal-partition.test.cjs.map +1 -1
  8. package/dist/bare-metal-partition.test.mjs +3 -4
  9. package/dist/bare-metal-partition.test.mjs.map +1 -1
  10. package/dist/compose-validation.test.cjs +5 -6
  11. package/dist/compose-validation.test.cjs.map +1 -1
  12. package/dist/compose-validation.test.mjs +2 -3
  13. package/dist/compose-validation.test.mjs.map +1 -1
  14. package/dist/composer.cjs +4 -5
  15. package/dist/composer.cjs.map +1 -1
  16. package/dist/composer.d.mts.map +1 -1
  17. package/dist/composer.mjs +1 -2
  18. package/dist/composer.mjs.map +1 -1
  19. package/dist/composer.snapshot.test.cjs +4 -5
  20. package/dist/composer.snapshot.test.cjs.map +1 -1
  21. package/dist/composer.snapshot.test.mjs +3 -4
  22. package/dist/composer.snapshot.test.mjs.map +1 -1
  23. package/dist/composer.test.cjs +5 -6
  24. package/dist/composer.test.cjs.map +1 -1
  25. package/dist/composer.test.mjs +3 -4
  26. package/dist/composer.test.mjs.map +1 -1
  27. package/dist/coolify-BVGGcMrT.d.mts +18 -0
  28. package/dist/coolify-BVGGcMrT.d.mts.map +1 -0
  29. package/dist/coolify-vlb1G9V2.d.cts +18 -0
  30. package/dist/coolify-vlb1G9V2.d.cts.map +1 -0
  31. package/dist/deployers/coolify.cjs +63 -53
  32. package/dist/deployers/coolify.cjs.map +1 -1
  33. package/dist/deployers/coolify.d.cts +2 -25
  34. package/dist/deployers/coolify.d.mts +2 -25
  35. package/dist/deployers/coolify.mjs +62 -51
  36. package/dist/deployers/coolify.mjs.map +1 -1
  37. package/dist/deployers/dokploy.cjs +108 -32
  38. package/dist/deployers/dokploy.cjs.map +1 -1
  39. package/dist/deployers/dokploy.d.cts +2 -24
  40. package/dist/deployers/dokploy.d.mts +2 -24
  41. package/dist/deployers/dokploy.mjs +107 -30
  42. package/dist/deployers/dokploy.mjs.map +1 -1
  43. package/dist/deployers/index.cjs +4 -5
  44. package/dist/deployers/index.cjs.map +1 -1
  45. package/dist/deployers/index.d.cts +4 -4
  46. package/dist/deployers/index.d.cts.map +1 -1
  47. package/dist/deployers/index.d.mts +4 -4
  48. package/dist/deployers/index.d.mts.map +1 -1
  49. package/dist/deployers/index.mjs +1 -2
  50. package/dist/deployers/index.mjs.map +1 -1
  51. package/dist/deployers/strip-host-ports.cjs +137 -0
  52. package/dist/deployers/strip-host-ports.cjs.map +1 -0
  53. package/dist/deployers/strip-host-ports.d.cts +62 -0
  54. package/dist/deployers/strip-host-ports.d.cts.map +1 -0
  55. package/dist/deployers/strip-host-ports.d.mts +62 -0
  56. package/dist/deployers/strip-host-ports.d.mts.map +1 -0
  57. package/dist/deployers/strip-host-ports.mjs +132 -0
  58. package/dist/deployers/strip-host-ports.mjs.map +1 -0
  59. package/dist/deployers/strip-host-ports.test.cjs +88 -0
  60. package/dist/deployers/strip-host-ports.test.cjs.map +1 -0
  61. package/dist/deployers/strip-host-ports.test.d.cts +1 -0
  62. package/dist/deployers/strip-host-ports.test.d.mts +1 -0
  63. package/dist/deployers/strip-host-ports.test.mjs +89 -0
  64. package/dist/deployers/strip-host-ports.test.mjs.map +1 -0
  65. package/dist/deployers/types.d.cts +2 -72
  66. package/dist/deployers/types.d.mts +2 -72
  67. package/dist/deployers/types.mjs +1 -1
  68. package/dist/dokploy-8cbrxUun.d.cts +25 -0
  69. package/dist/dokploy-8cbrxUun.d.cts.map +1 -0
  70. package/dist/dokploy-BTflLhTM.d.mts +25 -0
  71. package/dist/dokploy-BTflLhTM.d.mts.map +1 -0
  72. package/dist/errors.cjs +2 -3
  73. package/dist/errors.cjs.map +1 -1
  74. package/dist/errors.mjs +1 -1
  75. package/dist/errors.mjs.map +1 -1
  76. package/dist/generate.cjs +27 -28
  77. package/dist/generate.cjs.map +1 -1
  78. package/dist/generate.d.mts.map +1 -1
  79. package/dist/generate.mjs +1 -2
  80. package/dist/generate.mjs.map +1 -1
  81. package/dist/generate.test.cjs +4 -5
  82. package/dist/generate.test.cjs.map +1 -1
  83. package/dist/generate.test.mjs +3 -4
  84. package/dist/generate.test.mjs.map +1 -1
  85. package/dist/generators/bare-metal-install.cjs +2 -3
  86. package/dist/generators/bare-metal-install.cjs.map +1 -1
  87. package/dist/generators/bare-metal-install.d.mts.map +1 -1
  88. package/dist/generators/bare-metal-install.mjs +1 -1
  89. package/dist/generators/bare-metal-install.test.cjs +3 -4
  90. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  91. package/dist/generators/bare-metal-install.test.mjs +3 -4
  92. package/dist/generators/bare-metal-install.test.mjs.map +1 -1
  93. package/dist/generators/caddy.cjs +2 -3
  94. package/dist/generators/caddy.cjs.map +1 -1
  95. package/dist/generators/caddy.d.mts.map +1 -1
  96. package/dist/generators/caddy.mjs +1 -1
  97. package/dist/generators/caddy.test.cjs +3 -4
  98. package/dist/generators/caddy.test.cjs.map +1 -1
  99. package/dist/generators/caddy.test.mjs +3 -4
  100. package/dist/generators/caddy.test.mjs.map +1 -1
  101. package/dist/generators/cloud-init.cjs +2 -3
  102. package/dist/generators/cloud-init.cjs.map +1 -1
  103. package/dist/generators/cloud-init.mjs +1 -1
  104. package/dist/generators/env.cjs +4 -5
  105. package/dist/generators/env.cjs.map +1 -1
  106. package/dist/generators/env.d.mts.map +1 -1
  107. package/dist/generators/env.mjs +1 -2
  108. package/dist/generators/env.mjs.map +1 -1
  109. package/dist/generators/env.test.cjs +3 -4
  110. package/dist/generators/env.test.cjs.map +1 -1
  111. package/dist/generators/env.test.mjs +3 -4
  112. package/dist/generators/env.test.mjs.map +1 -1
  113. package/dist/generators/get-shit-done.cjs +2 -3
  114. package/dist/generators/get-shit-done.cjs.map +1 -1
  115. package/dist/generators/get-shit-done.mjs +1 -1
  116. package/dist/generators/grafana.cjs +2 -3
  117. package/dist/generators/grafana.cjs.map +1 -1
  118. package/dist/generators/grafana.mjs +1 -1
  119. package/dist/generators/health-check.cjs +2 -3
  120. package/dist/generators/health-check.cjs.map +1 -1
  121. package/dist/generators/health-check.d.mts.map +1 -1
  122. package/dist/generators/health-check.mjs +1 -1
  123. package/dist/generators/health-check.test.cjs +3 -4
  124. package/dist/generators/health-check.test.cjs.map +1 -1
  125. package/dist/generators/health-check.test.mjs +3 -4
  126. package/dist/generators/health-check.test.mjs.map +1 -1
  127. package/dist/generators/n8n-workflows.cjs +2 -3
  128. package/dist/generators/n8n-workflows.cjs.map +1 -1
  129. package/dist/generators/n8n-workflows.d.mts.map +1 -1
  130. package/dist/generators/n8n-workflows.mjs +1 -1
  131. package/dist/generators/native-services.cjs +2 -3
  132. package/dist/generators/native-services.cjs.map +1 -1
  133. package/dist/generators/native-services.mjs +1 -1
  134. package/dist/generators/openclaw-install-script.cjs +2 -3
  135. package/dist/generators/openclaw-install-script.cjs.map +1 -1
  136. package/dist/generators/openclaw-install-script.mjs +1 -1
  137. package/dist/generators/openclaw-json.cjs +2 -3
  138. package/dist/generators/openclaw-json.cjs.map +1 -1
  139. package/dist/generators/openclaw-json.mjs +1 -1
  140. package/dist/generators/postgres-init.cjs +32 -3
  141. package/dist/generators/postgres-init.cjs.map +1 -1
  142. package/dist/generators/postgres-init.d.cts.map +1 -1
  143. package/dist/generators/postgres-init.d.mts.map +1 -1
  144. package/dist/generators/postgres-init.mjs +31 -1
  145. package/dist/generators/postgres-init.mjs.map +1 -1
  146. package/dist/generators/prometheus.cjs +2 -3
  147. package/dist/generators/prometheus.cjs.map +1 -1
  148. package/dist/generators/prometheus.d.mts.map +1 -1
  149. package/dist/generators/prometheus.mjs +1 -1
  150. package/dist/generators/readme.cjs +2 -3
  151. package/dist/generators/readme.cjs.map +1 -1
  152. package/dist/generators/readme.d.mts.map +1 -1
  153. package/dist/generators/readme.mjs +1 -1
  154. package/dist/generators/scripts.cjs +2 -3
  155. package/dist/generators/scripts.cjs.map +1 -1
  156. package/dist/generators/scripts.mjs +1 -1
  157. package/dist/generators/scripts.test.cjs +3 -4
  158. package/dist/generators/scripts.test.cjs.map +1 -1
  159. package/dist/generators/scripts.test.mjs +3 -4
  160. package/dist/generators/scripts.test.mjs.map +1 -1
  161. package/dist/generators/skills.cjs +3 -590
  162. package/dist/generators/skills.d.mts.map +1 -1
  163. package/dist/generators/skills.mjs +1 -2
  164. package/dist/generators/skills.mjs.map +1 -1
  165. package/dist/generators/stack-manifest.cjs +2 -3
  166. package/dist/generators/stack-manifest.cjs.map +1 -1
  167. package/dist/generators/stack-manifest.mjs +1 -1
  168. package/dist/generators/traefik.cjs +2 -3
  169. package/dist/generators/traefik.cjs.map +1 -1
  170. package/dist/generators/traefik.mjs +1 -1
  171. package/dist/generators/traefik.test.cjs +4 -5
  172. package/dist/generators/traefik.test.cjs.map +1 -1
  173. package/dist/generators/traefik.test.mjs +3 -4
  174. package/dist/generators/traefik.test.mjs.map +1 -1
  175. package/dist/index.cjs +35 -36
  176. package/dist/index.d.cts +5 -5
  177. package/dist/index.d.mts +5 -5
  178. package/dist/index.mjs +2 -3
  179. package/dist/{magic-string.es-D2agHT3I.cjs → magic-string.es-CJq41xdM.cjs} +2 -4
  180. package/dist/{magic-string.es-CfFonO_S.mjs.map → magic-string.es-CJq41xdM.cjs.map} +1 -1
  181. package/dist/{magic-string.es-CfFonO_S.mjs → magic-string.es-CoDyF8pj.mjs} +2 -3
  182. package/dist/{magic-string.es-D2agHT3I.cjs.map → magic-string.es-CoDyF8pj.mjs.map} +1 -1
  183. package/dist/migrations.cjs +5 -6
  184. package/dist/migrations.cjs.map +1 -1
  185. package/dist/migrations.mjs +4 -4
  186. package/dist/migrations.mjs.map +1 -1
  187. package/dist/migrations.test.cjs +6 -7
  188. package/dist/migrations.test.cjs.map +1 -1
  189. package/dist/migrations.test.mjs +7 -8
  190. package/dist/migrations.test.mjs.map +1 -1
  191. package/dist/port-scanner.cjs +2 -3
  192. package/dist/port-scanner.cjs.map +1 -1
  193. package/dist/port-scanner.d.mts.map +1 -1
  194. package/dist/port-scanner.mjs +1 -1
  195. package/dist/presets/presets.test.cjs +11 -8
  196. package/dist/presets/presets.test.cjs.map +1 -1
  197. package/dist/presets/presets.test.mjs +7 -4
  198. package/dist/presets/presets.test.mjs.map +1 -1
  199. package/dist/presets/registry.cjs +152 -3
  200. package/dist/presets/registry.cjs.map +1 -1
  201. package/dist/presets/registry.d.cts.map +1 -1
  202. package/dist/presets/registry.d.mts.map +1 -1
  203. package/dist/presets/registry.mjs +151 -1
  204. package/dist/presets/registry.mjs.map +1 -1
  205. package/dist/presets/registry.test.cjs +3 -4
  206. package/dist/presets/registry.test.cjs.map +1 -1
  207. package/dist/presets/registry.test.mjs +3 -4
  208. package/dist/presets/registry.test.mjs.map +1 -1
  209. package/dist/resolver.cjs +4 -5
  210. package/dist/resolver.cjs.map +1 -1
  211. package/dist/resolver.d.mts.map +1 -1
  212. package/dist/resolver.mjs +1 -2
  213. package/dist/resolver.mjs.map +1 -1
  214. package/dist/resolver.test.cjs +3 -4
  215. package/dist/resolver.test.cjs.map +1 -1
  216. package/dist/resolver.test.mjs +3 -4
  217. package/dist/resolver.test.mjs.map +1 -1
  218. package/dist/schema-C_hc7e4k.d.cts +898 -0
  219. package/dist/schema-C_hc7e4k.d.cts.map +1 -0
  220. package/dist/schema-CaesJaS2.d.mts +898 -0
  221. package/dist/schema-CaesJaS2.d.mts.map +1 -0
  222. package/dist/schema.cjs +15 -5
  223. package/dist/schema.cjs.map +1 -1
  224. package/dist/schema.d.cts +2 -854
  225. package/dist/schema.d.mts +2 -854
  226. package/dist/schema.mjs +13 -3
  227. package/dist/schema.mjs.map +1 -1
  228. package/dist/schema.test.cjs +3 -4
  229. package/dist/schema.test.cjs.map +1 -1
  230. package/dist/schema.test.mjs +3 -4
  231. package/dist/schema.test.mjs.map +1 -1
  232. package/dist/services/definitions/airbyte.cjs +76 -0
  233. package/dist/services/definitions/airbyte.cjs.map +1 -0
  234. package/dist/services/definitions/airbyte.d.cts +7 -0
  235. package/dist/services/definitions/airbyte.d.cts.map +1 -0
  236. package/dist/services/definitions/airbyte.d.mts +7 -0
  237. package/dist/services/definitions/airbyte.d.mts.map +1 -0
  238. package/dist/services/definitions/airbyte.mjs +75 -0
  239. package/dist/services/definitions/airbyte.mjs.map +1 -0
  240. package/dist/services/definitions/airflow.cjs +109 -0
  241. package/dist/services/definitions/airflow.cjs.map +1 -0
  242. package/dist/services/definitions/airflow.d.cts +7 -0
  243. package/dist/services/definitions/airflow.d.cts.map +1 -0
  244. package/dist/services/definitions/airflow.d.mts +7 -0
  245. package/dist/services/definitions/airflow.d.mts.map +1 -0
  246. package/dist/services/definitions/airflow.mjs +108 -0
  247. package/dist/services/definitions/airflow.mjs.map +1 -0
  248. package/dist/services/definitions/anything-llm.cjs +2 -3
  249. package/dist/services/definitions/anything-llm.cjs.map +1 -1
  250. package/dist/services/definitions/anything-llm.mjs +1 -1
  251. package/dist/services/definitions/appflowy.cjs +2 -3
  252. package/dist/services/definitions/appflowy.cjs.map +1 -1
  253. package/dist/services/definitions/appflowy.mjs +1 -1
  254. package/dist/services/definitions/appwrite.cjs +190 -0
  255. package/dist/services/definitions/appwrite.cjs.map +1 -0
  256. package/dist/services/definitions/appwrite.d.cts +7 -0
  257. package/dist/services/definitions/appwrite.d.cts.map +1 -0
  258. package/dist/services/definitions/appwrite.d.mts +7 -0
  259. package/dist/services/definitions/appwrite.d.mts.map +1 -0
  260. package/dist/services/definitions/appwrite.mjs +189 -0
  261. package/dist/services/definitions/appwrite.mjs.map +1 -0
  262. package/dist/services/definitions/authelia.cjs +145 -0
  263. package/dist/services/definitions/authelia.cjs.map +1 -0
  264. package/dist/services/definitions/authelia.d.cts +7 -0
  265. package/dist/services/definitions/authelia.d.cts.map +1 -0
  266. package/dist/services/definitions/authelia.d.mts +7 -0
  267. package/dist/services/definitions/authelia.d.mts.map +1 -0
  268. package/dist/services/definitions/authelia.mjs +144 -0
  269. package/dist/services/definitions/authelia.mjs.map +1 -0
  270. package/dist/services/definitions/authentik.cjs +2 -3
  271. package/dist/services/definitions/authentik.cjs.map +1 -1
  272. package/dist/services/definitions/authentik.mjs +1 -1
  273. package/dist/services/definitions/axolotl.cjs +67 -0
  274. package/dist/services/definitions/axolotl.cjs.map +1 -0
  275. package/dist/services/definitions/axolotl.d.cts +7 -0
  276. package/dist/services/definitions/axolotl.d.cts.map +1 -0
  277. package/dist/services/definitions/axolotl.d.mts +7 -0
  278. package/dist/services/definitions/axolotl.d.mts.map +1 -0
  279. package/dist/services/definitions/axolotl.mjs +66 -0
  280. package/dist/services/definitions/axolotl.mjs.map +1 -0
  281. package/dist/services/definitions/beszel.cjs +2 -3
  282. package/dist/services/definitions/beszel.cjs.map +1 -1
  283. package/dist/services/definitions/beszel.mjs +1 -1
  284. package/dist/services/definitions/browserless.cjs +2 -3
  285. package/dist/services/definitions/browserless.cjs.map +1 -1
  286. package/dist/services/definitions/browserless.mjs +1 -1
  287. package/dist/services/definitions/caddy.cjs +2 -3
  288. package/dist/services/definitions/caddy.cjs.map +1 -1
  289. package/dist/services/definitions/caddy.mjs +1 -1
  290. package/dist/services/definitions/cal-com.cjs +2 -3
  291. package/dist/services/definitions/cal-com.cjs.map +1 -1
  292. package/dist/services/definitions/cal-com.mjs +1 -1
  293. package/dist/services/definitions/chatwoot-worker.cjs +95 -0
  294. package/dist/services/definitions/chatwoot-worker.cjs.map +1 -0
  295. package/dist/services/definitions/chatwoot-worker.d.cts +7 -0
  296. package/dist/services/definitions/chatwoot-worker.d.cts.map +1 -0
  297. package/dist/services/definitions/chatwoot-worker.d.mts +7 -0
  298. package/dist/services/definitions/chatwoot-worker.d.mts.map +1 -0
  299. package/dist/services/definitions/chatwoot-worker.mjs +94 -0
  300. package/dist/services/definitions/chatwoot-worker.mjs.map +1 -0
  301. package/dist/services/definitions/chatwoot.cjs +112 -0
  302. package/dist/services/definitions/chatwoot.cjs.map +1 -0
  303. package/dist/services/definitions/chatwoot.d.cts +7 -0
  304. package/dist/services/definitions/chatwoot.d.cts.map +1 -0
  305. package/dist/services/definitions/chatwoot.d.mts +7 -0
  306. package/dist/services/definitions/chatwoot.d.mts.map +1 -0
  307. package/dist/services/definitions/chatwoot.mjs +111 -0
  308. package/dist/services/definitions/chatwoot.mjs.map +1 -0
  309. package/dist/services/definitions/chromadb.cjs +2 -3
  310. package/dist/services/definitions/chromadb.cjs.map +1 -1
  311. package/dist/services/definitions/chromadb.mjs +1 -1
  312. package/dist/services/definitions/claude-code.cjs +2 -3
  313. package/dist/services/definitions/claude-code.cjs.map +1 -1
  314. package/dist/services/definitions/claude-code.mjs +1 -1
  315. package/dist/services/definitions/code-server.cjs +2 -3
  316. package/dist/services/definitions/code-server.cjs.map +1 -1
  317. package/dist/services/definitions/code-server.mjs +1 -1
  318. package/dist/services/definitions/codex.cjs +2 -3
  319. package/dist/services/definitions/codex.cjs.map +1 -1
  320. package/dist/services/definitions/codex.mjs +1 -1
  321. package/dist/services/definitions/comfyui.cjs +2 -3
  322. package/dist/services/definitions/comfyui.cjs.map +1 -1
  323. package/dist/services/definitions/comfyui.mjs +1 -1
  324. package/dist/services/definitions/convex-dashboard.cjs +2 -3
  325. package/dist/services/definitions/convex-dashboard.cjs.map +1 -1
  326. package/dist/services/definitions/convex-dashboard.mjs +1 -1
  327. package/dist/services/definitions/convex.cjs +2 -3
  328. package/dist/services/definitions/convex.cjs.map +1 -1
  329. package/dist/services/definitions/convex.mjs +1 -1
  330. package/dist/services/definitions/coolify.cjs +2 -3
  331. package/dist/services/definitions/coolify.cjs.map +1 -1
  332. package/dist/services/definitions/coolify.mjs +1 -1
  333. package/dist/services/definitions/crowdsec.cjs +2 -3
  334. package/dist/services/definitions/crowdsec.cjs.map +1 -1
  335. package/dist/services/definitions/crowdsec.mjs +1 -1
  336. package/dist/services/definitions/dagster.cjs +83 -0
  337. package/dist/services/definitions/dagster.cjs.map +1 -0
  338. package/dist/services/definitions/dagster.d.cts +7 -0
  339. package/dist/services/definitions/dagster.d.cts.map +1 -0
  340. package/dist/services/definitions/dagster.d.mts +7 -0
  341. package/dist/services/definitions/dagster.d.mts.map +1 -0
  342. package/dist/services/definitions/dagster.mjs +82 -0
  343. package/dist/services/definitions/dagster.mjs.map +1 -0
  344. package/dist/services/definitions/desktop-environment.cjs +2 -3
  345. package/dist/services/definitions/desktop-environment.cjs.map +1 -1
  346. package/dist/services/definitions/desktop-environment.mjs +1 -1
  347. package/dist/services/definitions/dify.cjs +2 -3
  348. package/dist/services/definitions/dify.cjs.map +1 -1
  349. package/dist/services/definitions/dify.mjs +1 -1
  350. package/dist/services/definitions/directus.cjs +115 -0
  351. package/dist/services/definitions/directus.cjs.map +1 -0
  352. package/dist/services/definitions/directus.d.cts +7 -0
  353. package/dist/services/definitions/directus.d.cts.map +1 -0
  354. package/dist/services/definitions/directus.d.mts +7 -0
  355. package/dist/services/definitions/directus.d.mts.map +1 -0
  356. package/dist/services/definitions/directus.mjs +114 -0
  357. package/dist/services/definitions/directus.mjs.map +1 -0
  358. package/dist/services/definitions/docsgpt.cjs +2 -3
  359. package/dist/services/definitions/docsgpt.cjs.map +1 -1
  360. package/dist/services/definitions/docsgpt.mjs +1 -1
  361. package/dist/services/definitions/dokploy.cjs +2 -3
  362. package/dist/services/definitions/dokploy.cjs.map +1 -1
  363. package/dist/services/definitions/dokploy.mjs +1 -1
  364. package/dist/services/definitions/dozzle.cjs +2 -3
  365. package/dist/services/definitions/dozzle.cjs.map +1 -1
  366. package/dist/services/definitions/dozzle.mjs +1 -1
  367. package/dist/services/definitions/duplicati.cjs +76 -0
  368. package/dist/services/definitions/duplicati.cjs.map +1 -0
  369. package/dist/services/definitions/duplicati.d.cts +7 -0
  370. package/dist/services/definitions/duplicati.d.cts.map +1 -0
  371. package/dist/services/definitions/duplicati.d.mts +7 -0
  372. package/dist/services/definitions/duplicati.d.mts.map +1 -0
  373. package/dist/services/definitions/duplicati.mjs +75 -0
  374. package/dist/services/definitions/duplicati.mjs.map +1 -0
  375. package/dist/services/definitions/excalidraw.cjs +48 -0
  376. package/dist/services/definitions/excalidraw.cjs.map +1 -0
  377. package/dist/services/definitions/excalidraw.d.cts +7 -0
  378. package/dist/services/definitions/excalidraw.d.cts.map +1 -0
  379. package/dist/services/definitions/excalidraw.d.mts +7 -0
  380. package/dist/services/definitions/excalidraw.d.mts.map +1 -0
  381. package/dist/services/definitions/excalidraw.mjs +47 -0
  382. package/dist/services/definitions/excalidraw.mjs.map +1 -0
  383. package/dist/services/definitions/ffmpeg.cjs +2 -3
  384. package/dist/services/definitions/ffmpeg.cjs.map +1 -1
  385. package/dist/services/definitions/ffmpeg.mjs +1 -1
  386. package/dist/services/definitions/firecrawl-playwright.cjs +61 -0
  387. package/dist/services/definitions/firecrawl-playwright.cjs.map +1 -0
  388. package/dist/services/definitions/firecrawl-playwright.d.cts +7 -0
  389. package/dist/services/definitions/firecrawl-playwright.d.cts.map +1 -0
  390. package/dist/services/definitions/firecrawl-playwright.d.mts +7 -0
  391. package/dist/services/definitions/firecrawl-playwright.d.mts.map +1 -0
  392. package/dist/services/definitions/firecrawl-playwright.mjs +60 -0
  393. package/dist/services/definitions/firecrawl-playwright.mjs.map +1 -0
  394. package/dist/services/definitions/firecrawl.cjs +163 -0
  395. package/dist/services/definitions/firecrawl.cjs.map +1 -0
  396. package/dist/services/definitions/firecrawl.d.cts +7 -0
  397. package/dist/services/definitions/firecrawl.d.cts.map +1 -0
  398. package/dist/services/definitions/firecrawl.d.mts +7 -0
  399. package/dist/services/definitions/firecrawl.d.mts.map +1 -0
  400. package/dist/services/definitions/firecrawl.mjs +162 -0
  401. package/dist/services/definitions/firecrawl.mjs.map +1 -0
  402. package/dist/services/definitions/flagsmith.cjs +77 -0
  403. package/dist/services/definitions/flagsmith.cjs.map +1 -0
  404. package/dist/services/definitions/flagsmith.d.cts +7 -0
  405. package/dist/services/definitions/flagsmith.d.cts.map +1 -0
  406. package/dist/services/definitions/flagsmith.d.mts +7 -0
  407. package/dist/services/definitions/flagsmith.d.mts.map +1 -0
  408. package/dist/services/definitions/flagsmith.mjs +76 -0
  409. package/dist/services/definitions/flagsmith.mjs.map +1 -0
  410. package/dist/services/definitions/flowise.cjs +2 -3
  411. package/dist/services/definitions/flowise.cjs.map +1 -1
  412. package/dist/services/definitions/flowise.mjs +1 -1
  413. package/dist/services/definitions/fonoster.cjs +66 -0
  414. package/dist/services/definitions/fonoster.cjs.map +1 -0
  415. package/dist/services/definitions/fonoster.d.cts +7 -0
  416. package/dist/services/definitions/fonoster.d.cts.map +1 -0
  417. package/dist/services/definitions/fonoster.d.mts +7 -0
  418. package/dist/services/definitions/fonoster.d.mts.map +1 -0
  419. package/dist/services/definitions/fonoster.mjs +65 -0
  420. package/dist/services/definitions/fonoster.mjs.map +1 -0
  421. package/dist/services/definitions/formbricks.cjs +75 -0
  422. package/dist/services/definitions/formbricks.cjs.map +1 -0
  423. package/dist/services/definitions/formbricks.d.cts +7 -0
  424. package/dist/services/definitions/formbricks.d.cts.map +1 -0
  425. package/dist/services/definitions/formbricks.d.mts +7 -0
  426. package/dist/services/definitions/formbricks.d.mts.map +1 -0
  427. package/dist/services/definitions/formbricks.mjs +74 -0
  428. package/dist/services/definitions/formbricks.mjs.map +1 -0
  429. package/dist/services/definitions/gemini-cli.cjs +2 -3
  430. package/dist/services/definitions/gemini-cli.cjs.map +1 -1
  431. package/dist/services/definitions/gemini-cli.mjs +1 -1
  432. package/dist/services/definitions/ghost.cjs +2 -3
  433. package/dist/services/definitions/ghost.cjs.map +1 -1
  434. package/dist/services/definitions/ghost.mjs +1 -1
  435. package/dist/services/definitions/gitea.cjs +2 -3
  436. package/dist/services/definitions/gitea.cjs.map +1 -1
  437. package/dist/services/definitions/gitea.mjs +1 -1
  438. package/dist/services/definitions/gotify.cjs +2 -3
  439. package/dist/services/definitions/gotify.cjs.map +1 -1
  440. package/dist/services/definitions/gotify.mjs +1 -1
  441. package/dist/services/definitions/grafana.cjs +2 -3
  442. package/dist/services/definitions/grafana.cjs.map +1 -1
  443. package/dist/services/definitions/grafana.mjs +1 -1
  444. package/dist/services/definitions/headscale.cjs +2 -3
  445. package/dist/services/definitions/headscale.cjs.map +1 -1
  446. package/dist/services/definitions/headscale.mjs +1 -1
  447. package/dist/services/definitions/hedgedoc.cjs +82 -0
  448. package/dist/services/definitions/hedgedoc.cjs.map +1 -0
  449. package/dist/services/definitions/hedgedoc.d.cts +7 -0
  450. package/dist/services/definitions/hedgedoc.d.cts.map +1 -0
  451. package/dist/services/definitions/hedgedoc.d.mts +7 -0
  452. package/dist/services/definitions/hedgedoc.d.mts.map +1 -0
  453. package/dist/services/definitions/hedgedoc.mjs +81 -0
  454. package/dist/services/definitions/hedgedoc.mjs.map +1 -0
  455. package/dist/services/definitions/hexstrike.cjs +2 -3
  456. package/dist/services/definitions/hexstrike.cjs.map +1 -1
  457. package/dist/services/definitions/hexstrike.mjs +1 -1
  458. package/dist/services/definitions/heyform.cjs +64 -0
  459. package/dist/services/definitions/heyform.cjs.map +1 -0
  460. package/dist/services/definitions/heyform.d.cts +7 -0
  461. package/dist/services/definitions/heyform.d.cts.map +1 -0
  462. package/dist/services/definitions/heyform.d.mts +7 -0
  463. package/dist/services/definitions/heyform.d.mts.map +1 -0
  464. package/dist/services/definitions/heyform.mjs +63 -0
  465. package/dist/services/definitions/heyform.mjs.map +1 -0
  466. package/dist/services/definitions/homeassistant.cjs +2 -3
  467. package/dist/services/definitions/homeassistant.cjs.map +1 -1
  468. package/dist/services/definitions/homeassistant.mjs +1 -1
  469. package/dist/services/definitions/hoppscotch.cjs +76 -0
  470. package/dist/services/definitions/hoppscotch.cjs.map +1 -0
  471. package/dist/services/definitions/hoppscotch.d.cts +7 -0
  472. package/dist/services/definitions/hoppscotch.d.cts.map +1 -0
  473. package/dist/services/definitions/hoppscotch.d.mts +7 -0
  474. package/dist/services/definitions/hoppscotch.d.mts.map +1 -0
  475. package/dist/services/definitions/hoppscotch.mjs +75 -0
  476. package/dist/services/definitions/hoppscotch.mjs.map +1 -0
  477. package/dist/services/definitions/immich.cjs +2 -3
  478. package/dist/services/definitions/immich.cjs.map +1 -1
  479. package/dist/services/definitions/immich.mjs +1 -1
  480. package/dist/services/definitions/index.cjs +220 -98
  481. package/dist/services/definitions/index.cjs.map +1 -1
  482. package/dist/services/definitions/index.d.cts +42 -1
  483. package/dist/services/definitions/index.d.cts.map +1 -1
  484. package/dist/services/definitions/index.d.mts +42 -1
  485. package/dist/services/definitions/index.d.mts.map +1 -1
  486. package/dist/services/definitions/index.mjs +85 -4
  487. package/dist/services/definitions/index.mjs.map +1 -1
  488. package/dist/services/definitions/infisical.cjs +99 -0
  489. package/dist/services/definitions/infisical.cjs.map +1 -0
  490. package/dist/services/definitions/infisical.d.cts +7 -0
  491. package/dist/services/definitions/infisical.d.cts.map +1 -0
  492. package/dist/services/definitions/infisical.d.mts +7 -0
  493. package/dist/services/definitions/infisical.d.mts.map +1 -0
  494. package/dist/services/definitions/infisical.mjs +98 -0
  495. package/dist/services/definitions/infisical.mjs.map +1 -0
  496. package/dist/services/definitions/jellyfin.cjs +2 -3
  497. package/dist/services/definitions/jellyfin.cjs.map +1 -1
  498. package/dist/services/definitions/jellyfin.mjs +1 -1
  499. package/dist/services/definitions/jenkins.cjs +2 -3
  500. package/dist/services/definitions/jenkins.cjs.map +1 -1
  501. package/dist/services/definitions/jenkins.mjs +1 -1
  502. package/dist/services/definitions/keycloak.cjs +122 -0
  503. package/dist/services/definitions/keycloak.cjs.map +1 -0
  504. package/dist/services/definitions/keycloak.d.cts +7 -0
  505. package/dist/services/definitions/keycloak.d.cts.map +1 -0
  506. package/dist/services/definitions/keycloak.d.mts +7 -0
  507. package/dist/services/definitions/keycloak.d.mts.map +1 -0
  508. package/dist/services/definitions/keycloak.mjs +121 -0
  509. package/dist/services/definitions/keycloak.mjs.map +1 -0
  510. package/dist/services/definitions/kimi.cjs +2 -3
  511. package/dist/services/definitions/kimi.cjs.map +1 -1
  512. package/dist/services/definitions/kimi.mjs +1 -1
  513. package/dist/services/definitions/kong.cjs +121 -0
  514. package/dist/services/definitions/kong.cjs.map +1 -0
  515. package/dist/services/definitions/kong.d.cts +7 -0
  516. package/dist/services/definitions/kong.d.cts.map +1 -0
  517. package/dist/services/definitions/kong.d.mts +7 -0
  518. package/dist/services/definitions/kong.d.mts.map +1 -0
  519. package/dist/services/definitions/kong.mjs +120 -0
  520. package/dist/services/definitions/kong.mjs.map +1 -0
  521. package/dist/services/definitions/lago.cjs +95 -0
  522. package/dist/services/definitions/lago.cjs.map +1 -0
  523. package/dist/services/definitions/lago.d.cts +7 -0
  524. package/dist/services/definitions/lago.d.cts.map +1 -0
  525. package/dist/services/definitions/lago.d.mts +7 -0
  526. package/dist/services/definitions/lago.d.mts.map +1 -0
  527. package/dist/services/definitions/lago.mjs +94 -0
  528. package/dist/services/definitions/lago.mjs.map +1 -0
  529. package/dist/services/definitions/langflow.cjs +88 -0
  530. package/dist/services/definitions/langflow.cjs.map +1 -0
  531. package/dist/services/definitions/langflow.d.cts +7 -0
  532. package/dist/services/definitions/langflow.d.cts.map +1 -0
  533. package/dist/services/definitions/langflow.d.mts +7 -0
  534. package/dist/services/definitions/langflow.d.mts.map +1 -0
  535. package/dist/services/definitions/langflow.mjs +87 -0
  536. package/dist/services/definitions/langflow.mjs.map +1 -0
  537. package/dist/services/definitions/langfuse.cjs +79 -0
  538. package/dist/services/definitions/langfuse.cjs.map +1 -0
  539. package/dist/services/definitions/langfuse.d.cts +7 -0
  540. package/dist/services/definitions/langfuse.d.cts.map +1 -0
  541. package/dist/services/definitions/langfuse.d.mts +7 -0
  542. package/dist/services/definitions/langfuse.d.mts.map +1 -0
  543. package/dist/services/definitions/langfuse.mjs +78 -0
  544. package/dist/services/definitions/langfuse.mjs.map +1 -0
  545. package/dist/services/definitions/lasuite-meet-agents.cjs +2 -3
  546. package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -1
  547. package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
  548. package/dist/services/definitions/lasuite-meet-backend.cjs +2 -3
  549. package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -1
  550. package/dist/services/definitions/lasuite-meet-backend.mjs +1 -1
  551. package/dist/services/definitions/lasuite-meet-frontend.cjs +2 -3
  552. package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -1
  553. package/dist/services/definitions/lasuite-meet-frontend.mjs +1 -1
  554. package/dist/services/definitions/librechat.cjs +2 -3
  555. package/dist/services/definitions/librechat.cjs.map +1 -1
  556. package/dist/services/definitions/librechat.mjs +1 -1
  557. package/dist/services/definitions/lightpanda.cjs +2 -3
  558. package/dist/services/definitions/lightpanda.cjs.map +1 -1
  559. package/dist/services/definitions/lightpanda.mjs +1 -1
  560. package/dist/services/definitions/listmonk.cjs +118 -0
  561. package/dist/services/definitions/listmonk.cjs.map +1 -0
  562. package/dist/services/definitions/listmonk.d.cts +7 -0
  563. package/dist/services/definitions/listmonk.d.cts.map +1 -0
  564. package/dist/services/definitions/listmonk.d.mts +7 -0
  565. package/dist/services/definitions/listmonk.d.mts.map +1 -0
  566. package/dist/services/definitions/listmonk.mjs +117 -0
  567. package/dist/services/definitions/listmonk.mjs.map +1 -0
  568. package/dist/services/definitions/litellm.cjs +2 -3
  569. package/dist/services/definitions/litellm.cjs.map +1 -1
  570. package/dist/services/definitions/litellm.mjs +1 -1
  571. package/dist/services/definitions/livekit.cjs +2 -3
  572. package/dist/services/definitions/livekit.cjs.map +1 -1
  573. package/dist/services/definitions/livekit.mjs +1 -1
  574. package/dist/services/definitions/loki.cjs +2 -3
  575. package/dist/services/definitions/loki.cjs.map +1 -1
  576. package/dist/services/definitions/loki.mjs +1 -1
  577. package/dist/services/definitions/mariadb.cjs +81 -0
  578. package/dist/services/definitions/mariadb.cjs.map +1 -0
  579. package/dist/services/definitions/mariadb.d.cts +7 -0
  580. package/dist/services/definitions/mariadb.d.cts.map +1 -0
  581. package/dist/services/definitions/mariadb.d.mts +7 -0
  582. package/dist/services/definitions/mariadb.d.mts.map +1 -0
  583. package/dist/services/definitions/mariadb.mjs +80 -0
  584. package/dist/services/definitions/mariadb.mjs.map +1 -0
  585. package/dist/services/definitions/matomo.cjs +2 -3
  586. package/dist/services/definitions/matomo.cjs.map +1 -1
  587. package/dist/services/definitions/matomo.mjs +1 -1
  588. package/dist/services/definitions/matrix-synapse.cjs +2 -3
  589. package/dist/services/definitions/matrix-synapse.cjs.map +1 -1
  590. package/dist/services/definitions/matrix-synapse.mjs +1 -1
  591. package/dist/services/definitions/mattermost.cjs +2 -3
  592. package/dist/services/definitions/mattermost.cjs.map +1 -1
  593. package/dist/services/definitions/mattermost.mjs +1 -1
  594. package/dist/services/definitions/mautic.cjs +83 -0
  595. package/dist/services/definitions/mautic.cjs.map +1 -0
  596. package/dist/services/definitions/mautic.d.cts +7 -0
  597. package/dist/services/definitions/mautic.d.cts.map +1 -0
  598. package/dist/services/definitions/mautic.d.mts +7 -0
  599. package/dist/services/definitions/mautic.d.mts.map +1 -0
  600. package/dist/services/definitions/mautic.mjs +82 -0
  601. package/dist/services/definitions/mautic.mjs.map +1 -0
  602. package/dist/services/definitions/medusa.cjs +83 -0
  603. package/dist/services/definitions/medusa.cjs.map +1 -0
  604. package/dist/services/definitions/medusa.d.cts +7 -0
  605. package/dist/services/definitions/medusa.d.cts.map +1 -0
  606. package/dist/services/definitions/medusa.d.mts +7 -0
  607. package/dist/services/definitions/medusa.d.mts.map +1 -0
  608. package/dist/services/definitions/medusa.mjs +82 -0
  609. package/dist/services/definitions/medusa.mjs.map +1 -0
  610. package/dist/services/definitions/meilisearch.cjs +2 -3
  611. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  612. package/dist/services/definitions/meilisearch.mjs +1 -1
  613. package/dist/services/definitions/milvus.cjs +2 -3
  614. package/dist/services/definitions/milvus.cjs.map +1 -1
  615. package/dist/services/definitions/milvus.mjs +1 -1
  616. package/dist/services/definitions/minio.cjs +2 -3
  617. package/dist/services/definitions/minio.cjs.map +1 -1
  618. package/dist/services/definitions/minio.mjs +1 -1
  619. package/dist/services/definitions/mission-control.cjs +2 -3
  620. package/dist/services/definitions/mission-control.cjs.map +1 -1
  621. package/dist/services/definitions/mission-control.mjs +1 -1
  622. package/dist/services/definitions/mixpost.cjs +2 -3
  623. package/dist/services/definitions/mixpost.cjs.map +1 -1
  624. package/dist/services/definitions/mixpost.mjs +1 -1
  625. package/dist/services/definitions/motion-canvas.cjs +2 -3
  626. package/dist/services/definitions/motion-canvas.cjs.map +1 -1
  627. package/dist/services/definitions/motion-canvas.mjs +1 -1
  628. package/dist/services/definitions/mysql.cjs +81 -0
  629. package/dist/services/definitions/mysql.cjs.map +1 -0
  630. package/dist/services/definitions/mysql.d.cts +7 -0
  631. package/dist/services/definitions/mysql.d.cts.map +1 -0
  632. package/dist/services/definitions/mysql.d.mts +7 -0
  633. package/dist/services/definitions/mysql.d.mts.map +1 -0
  634. package/dist/services/definitions/mysql.mjs +80 -0
  635. package/dist/services/definitions/mysql.mjs.map +1 -0
  636. package/dist/services/definitions/n8n.cjs +2 -3
  637. package/dist/services/definitions/n8n.cjs.map +1 -1
  638. package/dist/services/definitions/n8n.mjs +1 -1
  639. package/dist/services/definitions/neo4j.cjs +2 -3
  640. package/dist/services/definitions/neo4j.cjs.map +1 -1
  641. package/dist/services/definitions/neo4j.mjs +1 -1
  642. package/dist/services/definitions/nextcloud.cjs +2 -3
  643. package/dist/services/definitions/nextcloud.cjs.map +1 -1
  644. package/dist/services/definitions/nextcloud.mjs +1 -1
  645. package/dist/services/definitions/nocodb.cjs +2 -3
  646. package/dist/services/definitions/nocodb.cjs.map +1 -1
  647. package/dist/services/definitions/nocodb.mjs +1 -1
  648. package/dist/services/definitions/ntfy.cjs +2 -3
  649. package/dist/services/definitions/ntfy.cjs.map +1 -1
  650. package/dist/services/definitions/ntfy.mjs +1 -1
  651. package/dist/services/definitions/ollama.cjs +2 -3
  652. package/dist/services/definitions/ollama.cjs.map +1 -1
  653. package/dist/services/definitions/ollama.mjs +1 -1
  654. package/dist/services/definitions/open-webui.cjs +2 -3
  655. package/dist/services/definitions/open-webui.cjs.map +1 -1
  656. package/dist/services/definitions/open-webui.mjs +1 -1
  657. package/dist/services/definitions/opencode.cjs +2 -3
  658. package/dist/services/definitions/opencode.cjs.map +1 -1
  659. package/dist/services/definitions/opencode.mjs +1 -1
  660. package/dist/services/definitions/openhands.cjs +58 -0
  661. package/dist/services/definitions/openhands.cjs.map +1 -0
  662. package/dist/services/definitions/openhands.d.cts +7 -0
  663. package/dist/services/definitions/openhands.d.cts.map +1 -0
  664. package/dist/services/definitions/openhands.d.mts +7 -0
  665. package/dist/services/definitions/openhands.d.mts.map +1 -0
  666. package/dist/services/definitions/openhands.mjs +57 -0
  667. package/dist/services/definitions/openhands.mjs.map +1 -0
  668. package/dist/services/definitions/openpanel.cjs +2 -3
  669. package/dist/services/definitions/openpanel.cjs.map +1 -1
  670. package/dist/services/definitions/openpanel.mjs +1 -1
  671. package/dist/services/definitions/opensearch.cjs +94 -0
  672. package/dist/services/definitions/opensearch.cjs.map +1 -0
  673. package/dist/services/definitions/opensearch.d.cts +7 -0
  674. package/dist/services/definitions/opensearch.d.cts.map +1 -0
  675. package/dist/services/definitions/opensearch.d.mts +7 -0
  676. package/dist/services/definitions/opensearch.d.mts.map +1 -0
  677. package/dist/services/definitions/opensearch.mjs +93 -0
  678. package/dist/services/definitions/opensearch.mjs.map +1 -0
  679. package/dist/services/definitions/outline.cjs +2 -3
  680. package/dist/services/definitions/outline.cjs.map +1 -1
  681. package/dist/services/definitions/outline.mjs +1 -1
  682. package/dist/services/definitions/paperless-ngx.cjs +2 -3
  683. package/dist/services/definitions/paperless-ngx.cjs.map +1 -1
  684. package/dist/services/definitions/paperless-ngx.mjs +1 -1
  685. package/dist/services/definitions/pentagi.cjs +2 -3
  686. package/dist/services/definitions/pentagi.cjs.map +1 -1
  687. package/dist/services/definitions/pentagi.mjs +1 -1
  688. package/dist/services/definitions/pentestagent.cjs +2 -3
  689. package/dist/services/definitions/pentestagent.cjs.map +1 -1
  690. package/dist/services/definitions/pentestagent.mjs +1 -1
  691. package/dist/services/definitions/playwright-server.cjs +2 -3
  692. package/dist/services/definitions/playwright-server.cjs.map +1 -1
  693. package/dist/services/definitions/playwright-server.mjs +1 -1
  694. package/dist/services/definitions/pocketbase.cjs +61 -0
  695. package/dist/services/definitions/pocketbase.cjs.map +1 -0
  696. package/dist/services/definitions/pocketbase.d.cts +7 -0
  697. package/dist/services/definitions/pocketbase.d.cts.map +1 -0
  698. package/dist/services/definitions/pocketbase.d.mts +7 -0
  699. package/dist/services/definitions/pocketbase.d.mts.map +1 -0
  700. package/dist/services/definitions/pocketbase.mjs +60 -0
  701. package/dist/services/definitions/pocketbase.mjs.map +1 -0
  702. package/dist/services/definitions/portainer.cjs +2 -3
  703. package/dist/services/definitions/portainer.cjs.map +1 -1
  704. package/dist/services/definitions/portainer.mjs +1 -1
  705. package/dist/services/definitions/postgresql.cjs +2 -3
  706. package/dist/services/definitions/postgresql.cjs.map +1 -1
  707. package/dist/services/definitions/postgresql.mjs +1 -1
  708. package/dist/services/definitions/postiz.cjs +2 -3
  709. package/dist/services/definitions/postiz.cjs.map +1 -1
  710. package/dist/services/definitions/postiz.mjs +1 -1
  711. package/dist/services/definitions/prometheus.cjs +2 -3
  712. package/dist/services/definitions/prometheus.cjs.map +1 -1
  713. package/dist/services/definitions/prometheus.mjs +1 -1
  714. package/dist/services/definitions/qdrant.cjs +2 -3
  715. package/dist/services/definitions/qdrant.cjs.map +1 -1
  716. package/dist/services/definitions/qdrant.mjs +1 -1
  717. package/dist/services/definitions/rabbitmq.cjs +80 -0
  718. package/dist/services/definitions/rabbitmq.cjs.map +1 -0
  719. package/dist/services/definitions/rabbitmq.d.cts +7 -0
  720. package/dist/services/definitions/rabbitmq.d.cts.map +1 -0
  721. package/dist/services/definitions/rabbitmq.d.mts +7 -0
  722. package/dist/services/definitions/rabbitmq.d.mts.map +1 -0
  723. package/dist/services/definitions/rabbitmq.mjs +79 -0
  724. package/dist/services/definitions/rabbitmq.mjs.map +1 -0
  725. package/dist/services/definitions/ragflow.cjs +192 -0
  726. package/dist/services/definitions/ragflow.cjs.map +1 -0
  727. package/dist/services/definitions/ragflow.d.cts +7 -0
  728. package/dist/services/definitions/ragflow.d.cts.map +1 -0
  729. package/dist/services/definitions/ragflow.d.mts +7 -0
  730. package/dist/services/definitions/ragflow.d.mts.map +1 -0
  731. package/dist/services/definitions/ragflow.mjs +191 -0
  732. package/dist/services/definitions/ragflow.mjs.map +1 -0
  733. package/dist/services/definitions/redis.cjs +2 -3
  734. package/dist/services/definitions/redis.cjs.map +1 -1
  735. package/dist/services/definitions/redis.mjs +1 -1
  736. package/dist/services/definitions/remotion.cjs +2 -3
  737. package/dist/services/definitions/remotion.cjs.map +1 -1
  738. package/dist/services/definitions/remotion.mjs +1 -1
  739. package/dist/services/definitions/restic.cjs +58 -0
  740. package/dist/services/definitions/restic.cjs.map +1 -0
  741. package/dist/services/definitions/restic.d.cts +7 -0
  742. package/dist/services/definitions/restic.d.cts.map +1 -0
  743. package/dist/services/definitions/restic.d.mts +7 -0
  744. package/dist/services/definitions/restic.d.mts.map +1 -0
  745. package/dist/services/definitions/restic.mjs +57 -0
  746. package/dist/services/definitions/restic.mjs.map +1 -0
  747. package/dist/services/definitions/rocketchat.cjs +2 -3
  748. package/dist/services/definitions/rocketchat.cjs.map +1 -1
  749. package/dist/services/definitions/rocketchat.mjs +1 -1
  750. package/dist/services/definitions/saleor.cjs +76 -0
  751. package/dist/services/definitions/saleor.cjs.map +1 -0
  752. package/dist/services/definitions/saleor.d.cts +7 -0
  753. package/dist/services/definitions/saleor.d.cts.map +1 -0
  754. package/dist/services/definitions/saleor.d.mts +7 -0
  755. package/dist/services/definitions/saleor.d.mts.map +1 -0
  756. package/dist/services/definitions/saleor.mjs +75 -0
  757. package/dist/services/definitions/saleor.mjs.map +1 -0
  758. package/dist/services/definitions/scrapling.cjs +2 -3
  759. package/dist/services/definitions/scrapling.cjs.map +1 -1
  760. package/dist/services/definitions/scrapling.mjs +1 -1
  761. package/dist/services/definitions/searxng.cjs +2 -3
  762. package/dist/services/definitions/searxng.cjs.map +1 -1
  763. package/dist/services/definitions/searxng.mjs +1 -1
  764. package/dist/services/definitions/signoz.cjs +2 -3
  765. package/dist/services/definitions/signoz.cjs.map +1 -1
  766. package/dist/services/definitions/signoz.mjs +1 -1
  767. package/dist/services/definitions/solidityguard.cjs +2 -3
  768. package/dist/services/definitions/solidityguard.cjs.map +1 -1
  769. package/dist/services/definitions/solidityguard.mjs +1 -1
  770. package/dist/services/definitions/stable-diffusion.cjs +2 -3
  771. package/dist/services/definitions/stable-diffusion.cjs.map +1 -1
  772. package/dist/services/definitions/stable-diffusion.mjs +1 -1
  773. package/dist/services/definitions/steel-browser.cjs +2 -3
  774. package/dist/services/definitions/steel-browser.cjs.map +1 -1
  775. package/dist/services/definitions/steel-browser.mjs +1 -1
  776. package/dist/services/definitions/stirling-pdf.cjs +74 -0
  777. package/dist/services/definitions/stirling-pdf.cjs.map +1 -0
  778. package/dist/services/definitions/stirling-pdf.d.cts +7 -0
  779. package/dist/services/definitions/stirling-pdf.d.cts.map +1 -0
  780. package/dist/services/definitions/stirling-pdf.d.mts +7 -0
  781. package/dist/services/definitions/stirling-pdf.d.mts.map +1 -0
  782. package/dist/services/definitions/stirling-pdf.mjs +73 -0
  783. package/dist/services/definitions/stirling-pdf.mjs.map +1 -0
  784. package/dist/services/definitions/strapi.cjs +124 -0
  785. package/dist/services/definitions/strapi.cjs.map +1 -0
  786. package/dist/services/definitions/strapi.d.cts +7 -0
  787. package/dist/services/definitions/strapi.d.cts.map +1 -0
  788. package/dist/services/definitions/strapi.d.mts +7 -0
  789. package/dist/services/definitions/strapi.d.mts.map +1 -0
  790. package/dist/services/definitions/strapi.mjs +123 -0
  791. package/dist/services/definitions/strapi.mjs.map +1 -0
  792. package/dist/services/definitions/stream-gateway.cjs +2 -3
  793. package/dist/services/definitions/stream-gateway.cjs.map +1 -1
  794. package/dist/services/definitions/stream-gateway.mjs +1 -1
  795. package/dist/services/definitions/supabase.cjs +2 -3
  796. package/dist/services/definitions/supabase.cjs.map +1 -1
  797. package/dist/services/definitions/supabase.mjs +1 -1
  798. package/dist/services/definitions/tailscale.cjs +2 -3
  799. package/dist/services/definitions/tailscale.cjs.map +1 -1
  800. package/dist/services/definitions/tailscale.mjs +1 -1
  801. package/dist/services/definitions/temporal.cjs +2 -3
  802. package/dist/services/definitions/temporal.cjs.map +1 -1
  803. package/dist/services/definitions/temporal.mjs +1 -1
  804. package/dist/services/definitions/traefik.cjs +2 -3
  805. package/dist/services/definitions/traefik.cjs.map +1 -1
  806. package/dist/services/definitions/traefik.mjs +1 -1
  807. package/dist/services/definitions/twenty.cjs +83 -0
  808. package/dist/services/definitions/twenty.cjs.map +1 -0
  809. package/dist/services/definitions/twenty.d.cts +7 -0
  810. package/dist/services/definitions/twenty.d.cts.map +1 -0
  811. package/dist/services/definitions/twenty.d.mts +7 -0
  812. package/dist/services/definitions/twenty.d.mts.map +1 -0
  813. package/dist/services/definitions/twenty.mjs +82 -0
  814. package/dist/services/definitions/twenty.mjs.map +1 -0
  815. package/dist/services/definitions/umami.cjs +2 -3
  816. package/dist/services/definitions/umami.cjs.map +1 -1
  817. package/dist/services/definitions/umami.mjs +1 -1
  818. package/dist/services/definitions/uptime-kuma.cjs +2 -3
  819. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  820. package/dist/services/definitions/uptime-kuma.mjs +1 -1
  821. package/dist/services/definitions/usesend.cjs +2 -3
  822. package/dist/services/definitions/usesend.cjs.map +1 -1
  823. package/dist/services/definitions/usesend.mjs +1 -1
  824. package/dist/services/definitions/valkey.cjs +2 -3
  825. package/dist/services/definitions/valkey.cjs.map +1 -1
  826. package/dist/services/definitions/valkey.mjs +1 -1
  827. package/dist/services/definitions/vault.cjs +71 -0
  828. package/dist/services/definitions/vault.cjs.map +1 -0
  829. package/dist/services/definitions/vault.d.cts +7 -0
  830. package/dist/services/definitions/vault.d.cts.map +1 -0
  831. package/dist/services/definitions/vault.d.mts +7 -0
  832. package/dist/services/definitions/vault.d.mts.map +1 -0
  833. package/dist/services/definitions/vault.mjs +70 -0
  834. package/dist/services/definitions/vault.mjs.map +1 -0
  835. package/dist/services/definitions/vaultwarden.cjs +2 -3
  836. package/dist/services/definitions/vaultwarden.cjs.map +1 -1
  837. package/dist/services/definitions/vaultwarden.mjs +1 -1
  838. package/dist/services/definitions/watchtower.cjs +2 -3
  839. package/dist/services/definitions/watchtower.cjs.map +1 -1
  840. package/dist/services/definitions/watchtower.mjs +1 -1
  841. package/dist/services/definitions/weaviate.cjs +2 -3
  842. package/dist/services/definitions/weaviate.cjs.map +1 -1
  843. package/dist/services/definitions/weaviate.mjs +1 -1
  844. package/dist/services/definitions/whisper.cjs +2 -3
  845. package/dist/services/definitions/whisper.cjs.map +1 -1
  846. package/dist/services/definitions/whisper.mjs +1 -1
  847. package/dist/services/definitions/xyops.cjs +2 -3
  848. package/dist/services/definitions/xyops.cjs.map +1 -1
  849. package/dist/services/definitions/xyops.mjs +1 -1
  850. package/dist/services/registry.cjs +3 -4
  851. package/dist/services/registry.cjs.map +1 -1
  852. package/dist/services/registry.d.mts.map +1 -1
  853. package/dist/services/registry.mjs +1 -2
  854. package/dist/services/registry.mjs.map +1 -1
  855. package/dist/services/registry.test.cjs +3 -4
  856. package/dist/services/registry.test.cjs.map +1 -1
  857. package/dist/services/registry.test.mjs +3 -4
  858. package/dist/services/registry.test.mjs.map +1 -1
  859. package/dist/{manifest-4uLbISXV.cjs → skill-manifest--IgY9REK.cjs} +40 -10
  860. package/dist/skill-manifest--IgY9REK.cjs.map +1 -0
  861. package/dist/{manifest-B8UDsVlR.mjs → skill-manifest-BVUXU0__.mjs} +24 -5
  862. package/dist/skill-manifest-BVUXU0__.mjs.map +1 -0
  863. package/dist/skills/registry.cjs +262 -3
  864. package/dist/skills/registry.cjs.map +1 -1
  865. package/dist/skills/registry.d.cts.map +1 -1
  866. package/dist/skills/registry.d.mts.map +1 -1
  867. package/dist/skills/registry.mjs +261 -1
  868. package/dist/skills/registry.mjs.map +1 -1
  869. package/dist/skills/skill-manifest.cjs +5 -23
  870. package/dist/skills/skill-manifest.mjs +1 -19
  871. package/dist/skills-BlzpHmpH.cjs +620 -0
  872. package/dist/skills-BlzpHmpH.cjs.map +1 -0
  873. package/dist/types-CR83OJiq.d.cts +243 -0
  874. package/dist/types-CR83OJiq.d.cts.map +1 -0
  875. package/dist/types-zYjGTuyn.d.mts +243 -0
  876. package/dist/types-zYjGTuyn.d.mts.map +1 -0
  877. package/dist/types.cjs +79 -3
  878. package/dist/types.cjs.map +1 -1
  879. package/dist/types.d.cts +1 -1
  880. package/dist/types.d.mts +1 -1
  881. package/dist/types.mjs +78 -1
  882. package/dist/types.mjs.map +1 -1
  883. package/dist/validator.cjs +3 -4
  884. package/dist/validator.cjs.map +1 -1
  885. package/dist/validator.mjs +1 -2
  886. package/dist/validator.mjs.map +1 -1
  887. package/dist/validator.test.cjs +5 -6
  888. package/dist/validator.test.cjs.map +1 -1
  889. package/dist/validator.test.mjs +3 -4
  890. package/dist/validator.test.mjs.map +1 -1
  891. package/dist/version-manager.cjs +3 -4
  892. package/dist/version-manager.cjs.map +1 -1
  893. package/dist/version-manager.d.mts.map +1 -1
  894. package/dist/version-manager.mjs +1 -2
  895. package/dist/version-manager.mjs.map +1 -1
  896. package/dist/version-manager.test.cjs +5 -6
  897. package/dist/version-manager.test.cjs.map +1 -1
  898. package/dist/version-manager.test.mjs +3 -4
  899. package/dist/version-manager.test.mjs.map +1 -1
  900. package/dist/{vi.2VT5v0um-BmRMvymT.cjs → vi.2VT5v0um-CRqXre87.cjs} +82 -202
  901. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs.map → vi.2VT5v0um-CRqXre87.cjs.map} +1 -1
  902. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs → vi.2VT5v0um-DvC3SVNc.mjs} +67 -186
  903. package/dist/{vi.2VT5v0um-BmRMvymT.cjs.map → vi.2VT5v0um-DvC3SVNc.mjs.map} +1 -1
  904. package/package.json +4 -3
  905. package/src/deployers/coolify.ts +198 -103
  906. package/src/deployers/dokploy.ts +209 -55
  907. package/src/deployers/index.ts +1 -0
  908. package/src/deployers/strip-host-ports.test.ts +100 -0
  909. package/src/deployers/strip-host-ports.ts +187 -0
  910. package/src/deployers/types.ts +185 -1
  911. package/src/generators/postgres-init.ts +6 -0
  912. package/src/index.ts +19 -4
  913. package/src/presets/presets.test.ts +4 -0
  914. package/src/presets/registry.ts +88 -0
  915. package/src/schema.ts +11 -0
  916. package/src/services/definitions/airbyte.ts +75 -0
  917. package/src/services/definitions/airflow.ts +109 -0
  918. package/src/services/definitions/appwrite.ts +181 -0
  919. package/src/services/definitions/authelia.ts +145 -0
  920. package/src/services/definitions/axolotl.ts +65 -0
  921. package/src/services/definitions/chatwoot-worker.ts +93 -0
  922. package/src/services/definitions/chatwoot.ts +106 -0
  923. package/src/services/definitions/dagster.ts +82 -0
  924. package/src/services/definitions/directus.ts +115 -0
  925. package/src/services/definitions/duplicati.ts +77 -0
  926. package/src/services/definitions/excalidraw.ts +46 -0
  927. package/src/services/definitions/firecrawl-playwright.ts +62 -0
  928. package/src/services/definitions/firecrawl.ts +146 -0
  929. package/src/services/definitions/flagsmith.ts +76 -0
  930. package/src/services/definitions/fonoster.ts +67 -0
  931. package/src/services/definitions/formbricks.ts +75 -0
  932. package/src/services/definitions/hedgedoc.ts +81 -0
  933. package/src/services/definitions/heyform.ts +67 -0
  934. package/src/services/definitions/hoppscotch.ts +74 -0
  935. package/src/services/definitions/index.ts +124 -0
  936. package/src/services/definitions/infisical.ts +97 -0
  937. package/src/services/definitions/keycloak.ts +119 -0
  938. package/src/services/definitions/kong.ts +116 -0
  939. package/src/services/definitions/lago.ts +95 -0
  940. package/src/services/definitions/langflow.ts +82 -0
  941. package/src/services/definitions/langfuse.ts +76 -0
  942. package/src/services/definitions/listmonk.ts +118 -0
  943. package/src/services/definitions/mariadb.ts +82 -0
  944. package/src/services/definitions/mautic.ts +82 -0
  945. package/src/services/definitions/medusa.ts +82 -0
  946. package/src/services/definitions/mysql.ts +82 -0
  947. package/src/services/definitions/openhands.ts +60 -0
  948. package/src/services/definitions/opensearch.ts +95 -0
  949. package/src/services/definitions/pocketbase.ts +62 -0
  950. package/src/services/definitions/rabbitmq.ts +81 -0
  951. package/src/services/definitions/ragflow.ts +175 -0
  952. package/src/services/definitions/restic.ts +60 -0
  953. package/src/services/definitions/saleor.ts +75 -0
  954. package/src/services/definitions/stirling-pdf.ts +73 -0
  955. package/src/services/definitions/strapi.ts +124 -0
  956. package/src/services/definitions/twenty.ts +82 -0
  957. package/src/services/definitions/vault.ts +74 -0
  958. package/src/skills/manifest.json +8 -0
  959. package/src/skills/registry.ts +119 -0
  960. package/src/types.ts +91 -2
  961. package/tsconfig.tsbuildinfo +1 -0
  962. package/dist/chunk-C0xms8kb.cjs +0 -34
  963. package/dist/deployers/coolify.d.cts.map +0 -1
  964. package/dist/deployers/coolify.d.mts.map +0 -1
  965. package/dist/deployers/dokploy.d.cts.map +0 -1
  966. package/dist/deployers/dokploy.d.mts.map +0 -1
  967. package/dist/deployers/types.d.cts.map +0 -1
  968. package/dist/deployers/types.d.mts.map +0 -1
  969. package/dist/generators/skills.cjs.map +0 -1
  970. package/dist/manifest-4uLbISXV.cjs.map +0 -1
  971. package/dist/manifest-B8UDsVlR.mjs.map +0 -1
  972. package/dist/schema.d.cts.map +0 -1
  973. package/dist/schema.d.mts.map +0 -1
  974. package/dist/skills/skill-manifest.cjs.map +0 -1
  975. package/dist/skills/skill-manifest.mjs.map +0 -1
@@ -1,14 +1,23 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_deployers_strip_host_ports = require("./strip-host-ports.cjs");
3
3
  //#region src/deployers/coolify.ts
4
- /** Build a full Coolify API URL (base + /api/v1 + path). */
4
+ /**
5
+ * Coolify PaaS deployer
6
+ *
7
+ * Deploys Docker Compose stacks via Coolify v4 API
8
+ *
9
+ * Docs:
10
+ * https://coolify.io/docs/api-reference/api
11
+ *
12
+ * Auth:
13
+ * Authorization: Bearer <token>
14
+ *
15
+ * Base path:
16
+ * /api/v1
17
+ */
5
18
  function apiUrl(target, path) {
6
19
  return `${target.instanceUrl.replace(/\/+$/, "")}/api/v1${path}`;
7
20
  }
8
- /**
9
- * Typed fetch wrapper for the Coolify v4 API.
10
- * Handles JSON serialisation, Bearer auth, and error extraction.
11
- */
12
21
  async function coolifyFetch(target, path, options = {}) {
13
22
  const res = await fetch(apiUrl(target, path), {
14
23
  method: options.method ?? "GET",
@@ -31,18 +40,24 @@ async function coolifyFetch(target, path, options = {}) {
31
40
  if (!text) return void 0;
32
41
  return JSON.parse(text);
33
42
  }
34
- /**
35
- * Parse .env content into key-value pairs for Coolify's bulk env API.
36
- */
43
+ function hashString(str) {
44
+ let hash = 0;
45
+ for (let i = 0; i < str.length; i++) {
46
+ hash = (hash << 5) - hash + str.charCodeAt(i);
47
+ hash |= 0;
48
+ }
49
+ return hash;
50
+ }
37
51
  function parseEnvContent(envContent) {
52
+ if (!envContent) return [];
38
53
  const result = [];
39
54
  for (const line of envContent.split("\n")) {
40
55
  const trimmed = line.trim();
41
56
  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);
57
+ const idx = trimmed.indexOf("=");
58
+ if (idx <= 0) continue;
59
+ const key = trimmed.slice(0, idx);
60
+ const value = trimmed.slice(idx + 1);
46
61
  result.push({
47
62
  key,
48
63
  value,
@@ -53,16 +68,6 @@ function parseEnvContent(envContent) {
53
68
  }
54
69
  return result;
55
70
  }
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
71
  var CoolifyDeployer = class {
67
72
  name = "Coolify";
68
73
  id = "coolify";
@@ -83,15 +88,15 @@ var CoolifyDeployer = class {
83
88
  status: "pending"
84
89
  };
85
90
  const step2 = {
86
- step: "Create project",
91
+ step: "Find or create project",
87
92
  status: "pending"
88
93
  };
89
94
  const step3 = {
90
- step: "Create compose service",
95
+ step: "Find or create service",
91
96
  status: "pending"
92
97
  };
93
98
  const step4 = {
94
- step: "Set environment variables",
99
+ step: "Update environment variables",
95
100
  status: "pending"
96
101
  };
97
102
  const step5 = {
@@ -109,71 +114,76 @@ var CoolifyDeployer = class {
109
114
  success: false,
110
115
  steps
111
116
  };
117
+ const composeYaml = require_deployers_strip_host_ports.sanitizeComposeForPaas(input.composeYaml);
112
118
  try {
113
119
  step1.status = "running";
114
120
  const servers = await coolifyFetch(input.target, "/servers");
115
- if (!servers || servers.length === 0) throw new Error("No servers found in Coolify instance");
121
+ if (!servers.length) throw new Error("No Coolify servers available");
116
122
  const server = servers[0];
117
123
  step1.status = "done";
118
- step1.detail = `Server: ${server.name} (${server.ip})`;
124
+ step1.detail = `${server.name} (${server.ip})`;
119
125
  step2.status = "running";
120
- const project = await coolifyFetch(input.target, "/projects", {
126
+ let project = (await coolifyFetch(input.target, "/projects")).find((p) => p.name === input.projectName);
127
+ if (!project) project = await coolifyFetch(input.target, "/projects", {
121
128
  method: "POST",
122
129
  body: {
123
130
  name: input.projectName,
124
- description: input.description ?? `OpenClaw stack: ${input.projectName}`
131
+ description: input.description ?? `Stack ${input.projectName}`
125
132
  }
126
133
  });
127
134
  result.projectId = project.uuid;
128
135
  step2.status = "done";
129
- step2.detail = `Project: ${project.uuid}`;
136
+ step2.detail = project.uuid;
130
137
  const projectDetail = await coolifyFetch(input.target, `/projects/${project.uuid}`);
131
- const envUuid = projectDetail.environments?.[0]?.uuid;
132
- const envName = projectDetail.environments?.[0]?.name ?? "production";
133
- if (!envUuid) throw new Error("No default environment found in project");
138
+ const env = projectDetail.environments?.find((e) => e.name === "production") ?? projectDetail.environments?.[0];
139
+ if (!env) throw new Error("No environment found");
134
140
  step3.status = "running";
135
- const service = await coolifyFetch(input.target, "/services", {
141
+ let service = (await coolifyFetch(input.target, `/projects/${project.uuid}/services`)).find((s) => s.name === input.projectName);
142
+ if (!service) service = await coolifyFetch(input.target, "/services", {
136
143
  method: "POST",
137
144
  body: {
138
145
  project_uuid: project.uuid,
139
146
  server_uuid: server.uuid,
140
- environment_name: envName,
141
- environment_uuid: envUuid,
142
- docker_compose_raw: input.composeYaml,
143
- name: input.projectName,
144
- description: input.description ?? "Deployed via OpenClaw web builder",
145
- instant_deploy: false
147
+ environment_uuid: env.uuid,
148
+ environment_name: env.name,
149
+ docker_compose_raw: composeYaml,
150
+ name: input.projectName
146
151
  }
147
152
  });
153
+ else if (hashString(composeYaml) !== hashString(service.docker_compose_raw ?? "")) await coolifyFetch(input.target, `/services/${service.uuid}`, {
154
+ method: "PATCH",
155
+ body: { docker_compose_raw: composeYaml }
156
+ });
148
157
  result.composeId = service.uuid;
149
158
  step3.status = "done";
150
- step3.detail = `Service: ${service.uuid}`;
159
+ step3.detail = service.uuid;
151
160
  step4.status = "running";
152
161
  const envVars = parseEnvContent(input.envContent);
153
- if (envVars.length > 0) await coolifyFetch(input.target, `/services/${service.uuid}/envs`, {
162
+ if (envVars.length) await coolifyFetch(input.target, `/services/${service.uuid}/envs`, {
154
163
  method: "PATCH",
155
164
  body: envVars
156
165
  });
157
166
  step4.status = "done";
158
- step4.detail = `${envVars.length} variables set`;
167
+ step4.detail = `${envVars.length} vars`;
159
168
  step5.status = "running";
160
- const deployments = await coolifyFetch(input.target, `/deploy?uuid=${service.uuid}&force=true`);
169
+ const deploy = await coolifyFetch(input.target, `/deploy?uuid=${service.uuid}&force=true`);
161
170
  step5.status = "done";
162
- step5.detail = deployments?.deployments?.[0]?.deployment_uuid ?? "Deployment triggered";
171
+ step5.detail = deploy.deployments?.[0]?.deployment_uuid ?? "Deployment started";
163
172
  result.success = true;
164
173
  result.dashboardUrl = `${input.target.instanceUrl.replace(/\/+$/, "")}/project/${project.uuid}`;
174
+ return result;
165
175
  } catch (err) {
166
- const failedStep = steps.find((s) => s.status === "running");
167
- if (failedStep) {
168
- failedStep.status = "error";
169
- failedStep.detail = err instanceof Error ? err.message : String(err);
176
+ const running = steps.find((s) => s.status === "running");
177
+ if (running) {
178
+ running.status = "error";
179
+ running.detail = err instanceof Error ? err.message : String(err);
170
180
  }
171
181
  result.error = err instanceof Error ? err.message : String(err);
182
+ return result;
172
183
  }
173
- return result;
174
184
  }
175
185
  };
176
-
177
186
  //#endregion
178
187
  exports.CoolifyDeployer = CoolifyDeployer;
188
+
179
189
  //# sourceMappingURL=coolify.cjs.map
@@ -1 +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 step1: DeployStep = { step: \"Discover server\", status: \"pending\" };\n\t\tconst step2: DeployStep = { step: \"Create project\", status: \"pending\" };\n\t\tconst step3: DeployStep = { step: \"Create compose service\", status: \"pending\" };\n\t\tconst step4: DeployStep = { step: \"Set environment variables\", status: \"pending\" };\n\t\tconst step5: DeployStep = { step: \"Trigger deployment\", status: \"pending\" };\n\t\tconst steps: DeployStep[] = [step1, step2, step3, step4, step5];\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\tstep1.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] as CoolifyServer;\n\t\t\tstep1.status = \"done\";\n\t\t\tstep1.detail = `Server: ${server.name} (${server.ip})`;\n\n\t\t\t// Step 2: Create project\n\t\t\tstep2.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\tstep2.status = \"done\";\n\t\t\tstep2.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\tstep3.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\tstep3.status = \"done\";\n\t\t\tstep3.detail = `Service: ${service.uuid}`;\n\n\t\t\t// Step 4: Set environment variables\n\t\t\tstep4.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\tstep4.status = \"done\";\n\t\t\tstep4.detail = `${envVars.length} variables set`;\n\n\t\t\t// Step 5: Trigger deployment\n\t\t\tstep5.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\tstep5.status = \"done\";\n\t\t\tstep5.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 failedStep = steps.find((s) => s.status === \"running\");\n\t\t\tif (failedStep) {\n\t\t\t\tfailedStep.status = \"error\";\n\t\t\t\tfailedStep.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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"}
1
+ {"version":3,"file":"coolify.cjs","names":["sanitizeComposeForPaas"],"sources":["../../src/deployers/coolify.ts"],"sourcesContent":["/**\n * Coolify PaaS deployer\n *\n * Deploys Docker Compose stacks via Coolify v4 API\n *\n * Docs:\n * https://coolify.io/docs/api-reference/api\n *\n * Auth:\n * Authorization: Bearer <token>\n *\n * Base path:\n * /api/v1\n */\n\nimport { sanitizeComposeForPaas } from \"./strip-host-ports.js\";\nimport type { DeployInput, DeployResult, DeployStep, DeployTarget, PaasDeployer } from \"./types.js\";\n\n/* ----------------------------- */\n/* Coolify API Types */\n/* ----------------------------- */\n\ninterface CoolifyProject {\n\tuuid: string;\n\tname: string;\n\tenvironments?: {\n\t\tuuid: string;\n\t\tname: string;\n\t}[];\n}\n\ninterface CoolifyServer {\n\tuuid: string;\n\tname: string;\n\tip: string;\n}\n\ninterface CoolifyService {\n\tuuid: string;\n\tname: string;\n\tdocker_compose_raw?: string;\n}\n\ninterface CoolifyDeployment {\n\tmessage: string;\n\tresource_uuid: string;\n\tdeployment_uuid: string;\n}\n\n/* ----------------------------- */\n/* Utilities */\n/* ----------------------------- */\n\nfunction apiUrl(target: DeployTarget, path: string) {\n\tconst base = target.instanceUrl.replace(/\\/+$/, \"\");\n\treturn `${base}/api/v1${path}`;\n}\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\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\n\t\tthrow new Error(`Coolify API ${res.status}: ${detail}`);\n\t}\n\n\tconst text = await res.text();\n\n\tif (!text) return undefined as T;\n\n\treturn JSON.parse(text);\n}\n\nfunction hashString(str: string) {\n\tlet hash = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = (hash << 5) - hash + str.charCodeAt(i);\n\t\thash |= 0;\n\t}\n\n\treturn hash;\n}\n\nfunction parseEnvContent(envContent?: string) {\n\tif (!envContent) return [];\n\n\tconst result = [];\n\n\tfor (const line of envContent.split(\"\\n\")) {\n\t\tconst trimmed = line.trim();\n\n\t\tif (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n\t\tconst idx = trimmed.indexOf(\"=\");\n\n\t\tif (idx <= 0) continue;\n\n\t\tconst key = trimmed.slice(0, idx);\n\t\tconst value = trimmed.slice(idx + 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/* Coolify Deployer */\n/* ----------------------------- */\n\nexport class CoolifyDeployer implements PaasDeployer {\n\treadonly name = \"Coolify\";\n\treadonly id = \"coolify\";\n\n\tasync testConnection(target: DeployTarget) {\n\t\ttry {\n\t\t\tawait coolifyFetch(target, \"/version\");\n\n\t\t\treturn { ok: true };\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t};\n\t\t}\n\t}\n\n\tasync deploy(input: DeployInput): Promise<DeployResult> {\n\t\tconst step1: DeployStep = { step: \"Discover server\", status: \"pending\" };\n\t\tconst step2: DeployStep = {\n\t\t\tstep: \"Find or create project\",\n\t\t\tstatus: \"pending\",\n\t\t};\n\t\tconst step3: DeployStep = {\n\t\t\tstep: \"Find or create service\",\n\t\t\tstatus: \"pending\",\n\t\t};\n\t\tconst step4: DeployStep = {\n\t\t\tstep: \"Update environment variables\",\n\t\t\tstatus: \"pending\",\n\t\t};\n\t\tconst step5: DeployStep = { step: \"Trigger deployment\", status: \"pending\" };\n\t\tconst steps: DeployStep[] = [step1, step2, step3, step4, step5];\n\n\t\tconst result: DeployResult = { success: false, steps };\n\n\t\t// Strip host port bindings — Coolify routes via Traefik,\n\t\t// so host ports are unnecessary and cause \"port already allocated\" errors.\n\t\tconst composeYaml = sanitizeComposeForPaas(input.composeYaml);\n\n\t\ttry {\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 1: Discover server */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep1.status = \"running\";\n\n\t\t\tconst servers = await coolifyFetch<CoolifyServer[]>(input.target, \"/servers\");\n\n\t\t\tif (!servers.length) {\n\t\t\t\tthrow new Error(\"No Coolify servers available\");\n\t\t\t}\n\n\t\t\tconst server = servers[0]!;\n\n\t\t\tstep1.status = \"done\";\n\t\t\tstep1.detail = `${server.name} (${server.ip})`;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 2: Find or create project */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep2.status = \"running\";\n\n\t\t\tconst projects = await coolifyFetch<CoolifyProject[]>(input.target, \"/projects\");\n\n\t\t\tlet project = projects.find((p) => p.name === input.projectName);\n\n\t\t\tif (!project) {\n\t\t\t\tproject = await coolifyFetch<CoolifyProject>(input.target, \"/projects\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tname: input.projectName,\n\t\t\t\t\t\tdescription: input.description ?? `Stack ${input.projectName}`,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tresult.projectId = project.uuid;\n\n\t\t\tstep2.status = \"done\";\n\t\t\tstep2.detail = project.uuid;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* Find environment */\n\t\t\t/* ----------------------------- */\n\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\n\t\t\tconst env =\n\t\t\t\tprojectDetail.environments?.find((e) => e.name === \"production\") ??\n\t\t\t\tprojectDetail.environments?.[0];\n\n\t\t\tif (!env) throw new Error(\"No environment found\");\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 3: Find or create service */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep3.status = \"running\";\n\n\t\t\tconst services = await coolifyFetch<CoolifyService[]>(\n\t\t\t\tinput.target,\n\t\t\t\t`/projects/${project.uuid}/services`,\n\t\t\t);\n\n\t\t\tlet service = services.find((s) => s.name === input.projectName);\n\n\t\t\tif (!service) {\n\t\t\t\tservice = await coolifyFetch<CoolifyService>(input.target, \"/services\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tproject_uuid: project.uuid,\n\n\t\t\t\t\t\tserver_uuid: server.uuid,\n\n\t\t\t\t\t\tenvironment_uuid: env.uuid,\n\n\t\t\t\t\t\tenvironment_name: env.name,\n\n\t\t\t\t\t\tdocker_compose_raw: composeYaml,\n\n\t\t\t\t\t\tname: input.projectName,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst newHash = hashString(composeYaml);\n\t\t\t\tconst oldHash = hashString(service.docker_compose_raw ?? \"\");\n\n\t\t\t\tif (newHash !== oldHash) {\n\t\t\t\t\tawait coolifyFetch(input.target, `/services/${service.uuid}`, {\n\t\t\t\t\t\tmethod: \"PATCH\",\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tdocker_compose_raw: composeYaml,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult.composeId = service.uuid;\n\n\t\t\tstep3.status = \"done\";\n\t\t\tstep3.detail = service.uuid;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 4: Environment variables */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep4.status = \"running\";\n\n\t\t\tconst envVars = parseEnvContent(input.envContent);\n\n\t\t\tif (envVars.length) {\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\n\t\t\tstep4.status = \"done\";\n\t\t\tstep4.detail = `${envVars.length} vars`;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 5: Deploy */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep5.status = \"running\";\n\n\t\t\tconst deploy = 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\n\t\t\tstep5.status = \"done\";\n\t\t\tstep5.detail = deploy.deployments?.[0]?.deployment_uuid ?? \"Deployment started\";\n\n\t\t\tresult.success = true;\n\n\t\t\tconst base = input.target.instanceUrl.replace(/\\/+$/, \"\");\n\n\t\t\tresult.dashboardUrl = `${base}/project/${project.uuid}`;\n\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tconst running = steps.find((s) => s.status === \"running\");\n\n\t\t\tif (running) {\n\t\t\t\trunning.status = \"error\";\n\t\t\t\trunning.detail = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\n\t\t\tresult.error = err instanceof Error ? err.message : String(err);\n\n\t\t\treturn result;\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -1,25 +1,2 @@
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
1
+ import { t as CoolifyDeployer } from "../coolify-vlb1G9V2.cjs";
2
+ export { CoolifyDeployer };
@@ -1,25 +1,2 @@
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
1
+ import { t as CoolifyDeployer } from "../coolify-BVGGcMrT.mjs";
2
+ export { CoolifyDeployer };
@@ -1,12 +1,22 @@
1
+ import { sanitizeComposeForPaas } from "./strip-host-ports.mjs";
1
2
  //#region src/deployers/coolify.ts
2
- /** Build a full Coolify API URL (base + /api/v1 + path). */
3
+ /**
4
+ * Coolify PaaS deployer
5
+ *
6
+ * Deploys Docker Compose stacks via Coolify v4 API
7
+ *
8
+ * Docs:
9
+ * https://coolify.io/docs/api-reference/api
10
+ *
11
+ * Auth:
12
+ * Authorization: Bearer <token>
13
+ *
14
+ * Base path:
15
+ * /api/v1
16
+ */
3
17
  function apiUrl(target, path) {
4
18
  return `${target.instanceUrl.replace(/\/+$/, "")}/api/v1${path}`;
5
19
  }
6
- /**
7
- * Typed fetch wrapper for the Coolify v4 API.
8
- * Handles JSON serialisation, Bearer auth, and error extraction.
9
- */
10
20
  async function coolifyFetch(target, path, options = {}) {
11
21
  const res = await fetch(apiUrl(target, path), {
12
22
  method: options.method ?? "GET",
@@ -29,18 +39,24 @@ async function coolifyFetch(target, path, options = {}) {
29
39
  if (!text) return void 0;
30
40
  return JSON.parse(text);
31
41
  }
32
- /**
33
- * Parse .env content into key-value pairs for Coolify's bulk env API.
34
- */
42
+ function hashString(str) {
43
+ let hash = 0;
44
+ for (let i = 0; i < str.length; i++) {
45
+ hash = (hash << 5) - hash + str.charCodeAt(i);
46
+ hash |= 0;
47
+ }
48
+ return hash;
49
+ }
35
50
  function parseEnvContent(envContent) {
51
+ if (!envContent) return [];
36
52
  const result = [];
37
53
  for (const line of envContent.split("\n")) {
38
54
  const trimmed = line.trim();
39
55
  if (!trimmed || trimmed.startsWith("#")) continue;
40
- const eqIdx = trimmed.indexOf("=");
41
- if (eqIdx <= 0) continue;
42
- const key = trimmed.slice(0, eqIdx);
43
- const value = trimmed.slice(eqIdx + 1);
56
+ const idx = trimmed.indexOf("=");
57
+ if (idx <= 0) continue;
58
+ const key = trimmed.slice(0, idx);
59
+ const value = trimmed.slice(idx + 1);
44
60
  result.push({
45
61
  key,
46
62
  value,
@@ -51,16 +67,6 @@ function parseEnvContent(envContent) {
51
67
  }
52
68
  return result;
53
69
  }
54
- /**
55
- * Deploys Docker Compose stacks to a Coolify v4 instance.
56
- *
57
- * Deploy flow (5 steps):
58
- * 1. Discover the first available server
59
- * 2. Create a Coolify project
60
- * 3. Create a compose service with the raw docker-compose YAML
61
- * 4. Push .env variables via the bulk env API
62
- * 5. Trigger the deployment
63
- */
64
70
  var CoolifyDeployer = class {
65
71
  name = "Coolify";
66
72
  id = "coolify";
@@ -81,15 +87,15 @@ var CoolifyDeployer = class {
81
87
  status: "pending"
82
88
  };
83
89
  const step2 = {
84
- step: "Create project",
90
+ step: "Find or create project",
85
91
  status: "pending"
86
92
  };
87
93
  const step3 = {
88
- step: "Create compose service",
94
+ step: "Find or create service",
89
95
  status: "pending"
90
96
  };
91
97
  const step4 = {
92
- step: "Set environment variables",
98
+ step: "Update environment variables",
93
99
  status: "pending"
94
100
  };
95
101
  const step5 = {
@@ -107,71 +113,76 @@ var CoolifyDeployer = class {
107
113
  success: false,
108
114
  steps
109
115
  };
116
+ const composeYaml = sanitizeComposeForPaas(input.composeYaml);
110
117
  try {
111
118
  step1.status = "running";
112
119
  const servers = await coolifyFetch(input.target, "/servers");
113
- if (!servers || servers.length === 0) throw new Error("No servers found in Coolify instance");
120
+ if (!servers.length) throw new Error("No Coolify servers available");
114
121
  const server = servers[0];
115
122
  step1.status = "done";
116
- step1.detail = `Server: ${server.name} (${server.ip})`;
123
+ step1.detail = `${server.name} (${server.ip})`;
117
124
  step2.status = "running";
118
- const project = await coolifyFetch(input.target, "/projects", {
125
+ let project = (await coolifyFetch(input.target, "/projects")).find((p) => p.name === input.projectName);
126
+ if (!project) project = await coolifyFetch(input.target, "/projects", {
119
127
  method: "POST",
120
128
  body: {
121
129
  name: input.projectName,
122
- description: input.description ?? `OpenClaw stack: ${input.projectName}`
130
+ description: input.description ?? `Stack ${input.projectName}`
123
131
  }
124
132
  });
125
133
  result.projectId = project.uuid;
126
134
  step2.status = "done";
127
- step2.detail = `Project: ${project.uuid}`;
135
+ step2.detail = project.uuid;
128
136
  const projectDetail = await coolifyFetch(input.target, `/projects/${project.uuid}`);
129
- const envUuid = projectDetail.environments?.[0]?.uuid;
130
- const envName = projectDetail.environments?.[0]?.name ?? "production";
131
- if (!envUuid) throw new Error("No default environment found in project");
137
+ const env = projectDetail.environments?.find((e) => e.name === "production") ?? projectDetail.environments?.[0];
138
+ if (!env) throw new Error("No environment found");
132
139
  step3.status = "running";
133
- const service = await coolifyFetch(input.target, "/services", {
140
+ let service = (await coolifyFetch(input.target, `/projects/${project.uuid}/services`)).find((s) => s.name === input.projectName);
141
+ if (!service) service = await coolifyFetch(input.target, "/services", {
134
142
  method: "POST",
135
143
  body: {
136
144
  project_uuid: project.uuid,
137
145
  server_uuid: server.uuid,
138
- environment_name: envName,
139
- environment_uuid: envUuid,
140
- docker_compose_raw: input.composeYaml,
141
- name: input.projectName,
142
- description: input.description ?? "Deployed via OpenClaw web builder",
143
- instant_deploy: false
146
+ environment_uuid: env.uuid,
147
+ environment_name: env.name,
148
+ docker_compose_raw: composeYaml,
149
+ name: input.projectName
144
150
  }
145
151
  });
152
+ else if (hashString(composeYaml) !== hashString(service.docker_compose_raw ?? "")) await coolifyFetch(input.target, `/services/${service.uuid}`, {
153
+ method: "PATCH",
154
+ body: { docker_compose_raw: composeYaml }
155
+ });
146
156
  result.composeId = service.uuid;
147
157
  step3.status = "done";
148
- step3.detail = `Service: ${service.uuid}`;
158
+ step3.detail = service.uuid;
149
159
  step4.status = "running";
150
160
  const envVars = parseEnvContent(input.envContent);
151
- if (envVars.length > 0) await coolifyFetch(input.target, `/services/${service.uuid}/envs`, {
161
+ if (envVars.length) await coolifyFetch(input.target, `/services/${service.uuid}/envs`, {
152
162
  method: "PATCH",
153
163
  body: envVars
154
164
  });
155
165
  step4.status = "done";
156
- step4.detail = `${envVars.length} variables set`;
166
+ step4.detail = `${envVars.length} vars`;
157
167
  step5.status = "running";
158
- const deployments = await coolifyFetch(input.target, `/deploy?uuid=${service.uuid}&force=true`);
168
+ const deploy = await coolifyFetch(input.target, `/deploy?uuid=${service.uuid}&force=true`);
159
169
  step5.status = "done";
160
- step5.detail = deployments?.deployments?.[0]?.deployment_uuid ?? "Deployment triggered";
170
+ step5.detail = deploy.deployments?.[0]?.deployment_uuid ?? "Deployment started";
161
171
  result.success = true;
162
172
  result.dashboardUrl = `${input.target.instanceUrl.replace(/\/+$/, "")}/project/${project.uuid}`;
173
+ return result;
163
174
  } catch (err) {
164
- const failedStep = steps.find((s) => s.status === "running");
165
- if (failedStep) {
166
- failedStep.status = "error";
167
- failedStep.detail = err instanceof Error ? err.message : String(err);
175
+ const running = steps.find((s) => s.status === "running");
176
+ if (running) {
177
+ running.status = "error";
178
+ running.detail = err instanceof Error ? err.message : String(err);
168
179
  }
169
180
  result.error = err instanceof Error ? err.message : String(err);
181
+ return result;
170
182
  }
171
- return result;
172
183
  }
173
184
  };
174
-
175
185
  //#endregion
176
186
  export { CoolifyDeployer };
187
+
177
188
  //# sourceMappingURL=coolify.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"coolify.mjs","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 step1: DeployStep = { step: \"Discover server\", status: \"pending\" };\n\t\tconst step2: DeployStep = { step: \"Create project\", status: \"pending\" };\n\t\tconst step3: DeployStep = { step: \"Create compose service\", status: \"pending\" };\n\t\tconst step4: DeployStep = { step: \"Set environment variables\", status: \"pending\" };\n\t\tconst step5: DeployStep = { step: \"Trigger deployment\", status: \"pending\" };\n\t\tconst steps: DeployStep[] = [step1, step2, step3, step4, step5];\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\tstep1.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] as CoolifyServer;\n\t\t\tstep1.status = \"done\";\n\t\t\tstep1.detail = `Server: ${server.name} (${server.ip})`;\n\n\t\t\t// Step 2: Create project\n\t\t\tstep2.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\tstep2.status = \"done\";\n\t\t\tstep2.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\tstep3.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\tstep3.status = \"done\";\n\t\t\tstep3.detail = `Service: ${service.uuid}`;\n\n\t\t\t// Step 4: Set environment variables\n\t\t\tstep4.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\tstep4.status = \"done\";\n\t\t\tstep4.detail = `${envVars.length} variables set`;\n\n\t\t\t// Step 5: Trigger deployment\n\t\t\tstep5.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\tstep5.status = \"done\";\n\t\t\tstep5.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 failedStep = steps.find((s) => s.status === \"running\");\n\t\t\tif (failedStep) {\n\t\t\t\tfailedStep.status = \"error\";\n\t\t\t\tfailedStep.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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"}
1
+ {"version":3,"file":"coolify.mjs","names":[],"sources":["../../src/deployers/coolify.ts"],"sourcesContent":["/**\n * Coolify PaaS deployer\n *\n * Deploys Docker Compose stacks via Coolify v4 API\n *\n * Docs:\n * https://coolify.io/docs/api-reference/api\n *\n * Auth:\n * Authorization: Bearer <token>\n *\n * Base path:\n * /api/v1\n */\n\nimport { sanitizeComposeForPaas } from \"./strip-host-ports.js\";\nimport type { DeployInput, DeployResult, DeployStep, DeployTarget, PaasDeployer } from \"./types.js\";\n\n/* ----------------------------- */\n/* Coolify API Types */\n/* ----------------------------- */\n\ninterface CoolifyProject {\n\tuuid: string;\n\tname: string;\n\tenvironments?: {\n\t\tuuid: string;\n\t\tname: string;\n\t}[];\n}\n\ninterface CoolifyServer {\n\tuuid: string;\n\tname: string;\n\tip: string;\n}\n\ninterface CoolifyService {\n\tuuid: string;\n\tname: string;\n\tdocker_compose_raw?: string;\n}\n\ninterface CoolifyDeployment {\n\tmessage: string;\n\tresource_uuid: string;\n\tdeployment_uuid: string;\n}\n\n/* ----------------------------- */\n/* Utilities */\n/* ----------------------------- */\n\nfunction apiUrl(target: DeployTarget, path: string) {\n\tconst base = target.instanceUrl.replace(/\\/+$/, \"\");\n\treturn `${base}/api/v1${path}`;\n}\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\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\n\t\tthrow new Error(`Coolify API ${res.status}: ${detail}`);\n\t}\n\n\tconst text = await res.text();\n\n\tif (!text) return undefined as T;\n\n\treturn JSON.parse(text);\n}\n\nfunction hashString(str: string) {\n\tlet hash = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = (hash << 5) - hash + str.charCodeAt(i);\n\t\thash |= 0;\n\t}\n\n\treturn hash;\n}\n\nfunction parseEnvContent(envContent?: string) {\n\tif (!envContent) return [];\n\n\tconst result = [];\n\n\tfor (const line of envContent.split(\"\\n\")) {\n\t\tconst trimmed = line.trim();\n\n\t\tif (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n\t\tconst idx = trimmed.indexOf(\"=\");\n\n\t\tif (idx <= 0) continue;\n\n\t\tconst key = trimmed.slice(0, idx);\n\t\tconst value = trimmed.slice(idx + 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/* Coolify Deployer */\n/* ----------------------------- */\n\nexport class CoolifyDeployer implements PaasDeployer {\n\treadonly name = \"Coolify\";\n\treadonly id = \"coolify\";\n\n\tasync testConnection(target: DeployTarget) {\n\t\ttry {\n\t\t\tawait coolifyFetch(target, \"/version\");\n\n\t\t\treturn { ok: true };\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t};\n\t\t}\n\t}\n\n\tasync deploy(input: DeployInput): Promise<DeployResult> {\n\t\tconst step1: DeployStep = { step: \"Discover server\", status: \"pending\" };\n\t\tconst step2: DeployStep = {\n\t\t\tstep: \"Find or create project\",\n\t\t\tstatus: \"pending\",\n\t\t};\n\t\tconst step3: DeployStep = {\n\t\t\tstep: \"Find or create service\",\n\t\t\tstatus: \"pending\",\n\t\t};\n\t\tconst step4: DeployStep = {\n\t\t\tstep: \"Update environment variables\",\n\t\t\tstatus: \"pending\",\n\t\t};\n\t\tconst step5: DeployStep = { step: \"Trigger deployment\", status: \"pending\" };\n\t\tconst steps: DeployStep[] = [step1, step2, step3, step4, step5];\n\n\t\tconst result: DeployResult = { success: false, steps };\n\n\t\t// Strip host port bindings — Coolify routes via Traefik,\n\t\t// so host ports are unnecessary and cause \"port already allocated\" errors.\n\t\tconst composeYaml = sanitizeComposeForPaas(input.composeYaml);\n\n\t\ttry {\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 1: Discover server */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep1.status = \"running\";\n\n\t\t\tconst servers = await coolifyFetch<CoolifyServer[]>(input.target, \"/servers\");\n\n\t\t\tif (!servers.length) {\n\t\t\t\tthrow new Error(\"No Coolify servers available\");\n\t\t\t}\n\n\t\t\tconst server = servers[0]!;\n\n\t\t\tstep1.status = \"done\";\n\t\t\tstep1.detail = `${server.name} (${server.ip})`;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 2: Find or create project */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep2.status = \"running\";\n\n\t\t\tconst projects = await coolifyFetch<CoolifyProject[]>(input.target, \"/projects\");\n\n\t\t\tlet project = projects.find((p) => p.name === input.projectName);\n\n\t\t\tif (!project) {\n\t\t\t\tproject = await coolifyFetch<CoolifyProject>(input.target, \"/projects\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tname: input.projectName,\n\t\t\t\t\t\tdescription: input.description ?? `Stack ${input.projectName}`,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tresult.projectId = project.uuid;\n\n\t\t\tstep2.status = \"done\";\n\t\t\tstep2.detail = project.uuid;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* Find environment */\n\t\t\t/* ----------------------------- */\n\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\n\t\t\tconst env =\n\t\t\t\tprojectDetail.environments?.find((e) => e.name === \"production\") ??\n\t\t\t\tprojectDetail.environments?.[0];\n\n\t\t\tif (!env) throw new Error(\"No environment found\");\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 3: Find or create service */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep3.status = \"running\";\n\n\t\t\tconst services = await coolifyFetch<CoolifyService[]>(\n\t\t\t\tinput.target,\n\t\t\t\t`/projects/${project.uuid}/services`,\n\t\t\t);\n\n\t\t\tlet service = services.find((s) => s.name === input.projectName);\n\n\t\t\tif (!service) {\n\t\t\t\tservice = await coolifyFetch<CoolifyService>(input.target, \"/services\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tproject_uuid: project.uuid,\n\n\t\t\t\t\t\tserver_uuid: server.uuid,\n\n\t\t\t\t\t\tenvironment_uuid: env.uuid,\n\n\t\t\t\t\t\tenvironment_name: env.name,\n\n\t\t\t\t\t\tdocker_compose_raw: composeYaml,\n\n\t\t\t\t\t\tname: input.projectName,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst newHash = hashString(composeYaml);\n\t\t\t\tconst oldHash = hashString(service.docker_compose_raw ?? \"\");\n\n\t\t\t\tif (newHash !== oldHash) {\n\t\t\t\t\tawait coolifyFetch(input.target, `/services/${service.uuid}`, {\n\t\t\t\t\t\tmethod: \"PATCH\",\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tdocker_compose_raw: composeYaml,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult.composeId = service.uuid;\n\n\t\t\tstep3.status = \"done\";\n\t\t\tstep3.detail = service.uuid;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 4: Environment variables */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep4.status = \"running\";\n\n\t\t\tconst envVars = parseEnvContent(input.envContent);\n\n\t\t\tif (envVars.length) {\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\n\t\t\tstep4.status = \"done\";\n\t\t\tstep4.detail = `${envVars.length} vars`;\n\n\t\t\t/* ----------------------------- */\n\t\t\t/* STEP 5: Deploy */\n\t\t\t/* ----------------------------- */\n\n\t\t\tstep5.status = \"running\";\n\n\t\t\tconst deploy = 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\n\t\t\tstep5.status = \"done\";\n\t\t\tstep5.detail = deploy.deployments?.[0]?.deployment_uuid ?? \"Deployment started\";\n\n\t\t\tresult.success = true;\n\n\t\t\tconst base = input.target.instanceUrl.replace(/\\/+$/, \"\");\n\n\t\t\tresult.dashboardUrl = `${base}/project/${project.uuid}`;\n\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tconst running = steps.find((s) => s.status === \"running\");\n\n\t\t\tif (running) {\n\t\t\t\trunning.status = \"error\";\n\t\t\t\trunning.detail = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\n\t\t\tresult.error = err instanceof Error ? err.message : String(err);\n\n\t\t\treturn result;\n\t\t}\n\t}\n}\n"],"mappings":"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"}