@better-openclaw/core 1.0.21 → 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 (958) hide show
  1. package/dist/bare-metal-partition.cjs +2 -3
  2. package/dist/bare-metal-partition.cjs.map +1 -1
  3. package/dist/bare-metal-partition.d.mts.map +1 -1
  4. package/dist/bare-metal-partition.mjs +1 -1
  5. package/dist/bare-metal-partition.test.cjs +4 -5
  6. package/dist/bare-metal-partition.test.cjs.map +1 -1
  7. package/dist/bare-metal-partition.test.mjs +3 -4
  8. package/dist/bare-metal-partition.test.mjs.map +1 -1
  9. package/dist/compose-validation.test.cjs +5 -6
  10. package/dist/compose-validation.test.cjs.map +1 -1
  11. package/dist/compose-validation.test.mjs +2 -3
  12. package/dist/compose-validation.test.mjs.map +1 -1
  13. package/dist/composer.cjs +4 -5
  14. package/dist/composer.cjs.map +1 -1
  15. package/dist/composer.d.mts.map +1 -1
  16. package/dist/composer.mjs +1 -2
  17. package/dist/composer.mjs.map +1 -1
  18. package/dist/composer.snapshot.test.cjs +4 -5
  19. package/dist/composer.snapshot.test.cjs.map +1 -1
  20. package/dist/composer.snapshot.test.mjs +3 -4
  21. package/dist/composer.snapshot.test.mjs.map +1 -1
  22. package/dist/composer.test.cjs +5 -6
  23. package/dist/composer.test.cjs.map +1 -1
  24. package/dist/composer.test.mjs +3 -4
  25. package/dist/composer.test.mjs.map +1 -1
  26. package/dist/coolify-BVGGcMrT.d.mts +18 -0
  27. package/dist/coolify-BVGGcMrT.d.mts.map +1 -0
  28. package/dist/coolify-vlb1G9V2.d.cts +18 -0
  29. package/dist/coolify-vlb1G9V2.d.cts.map +1 -0
  30. package/dist/deployers/coolify.cjs +3 -4
  31. package/dist/deployers/coolify.cjs.map +1 -1
  32. package/dist/deployers/coolify.d.cts +2 -18
  33. package/dist/deployers/coolify.d.mts +2 -18
  34. package/dist/deployers/coolify.mjs +1 -2
  35. package/dist/deployers/coolify.mjs.map +1 -1
  36. package/dist/deployers/dokploy.cjs +3 -4
  37. package/dist/deployers/dokploy.cjs.map +1 -1
  38. package/dist/deployers/dokploy.d.cts +2 -25
  39. package/dist/deployers/dokploy.d.mts +2 -25
  40. package/dist/deployers/dokploy.mjs +1 -2
  41. package/dist/deployers/dokploy.mjs.map +1 -1
  42. package/dist/deployers/index.cjs +4 -5
  43. package/dist/deployers/index.cjs.map +1 -1
  44. package/dist/deployers/index.d.cts +3 -3
  45. package/dist/deployers/index.d.mts +3 -3
  46. package/dist/deployers/index.mjs +1 -2
  47. package/dist/deployers/index.mjs.map +1 -1
  48. package/dist/deployers/strip-host-ports.cjs +3 -4
  49. package/dist/deployers/strip-host-ports.cjs.map +1 -1
  50. package/dist/deployers/strip-host-ports.mjs +1 -2
  51. package/dist/deployers/strip-host-ports.mjs.map +1 -1
  52. package/dist/deployers/strip-host-ports.test.cjs +3 -4
  53. package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
  54. package/dist/deployers/strip-host-ports.test.mjs +3 -4
  55. package/dist/deployers/strip-host-ports.test.mjs.map +1 -1
  56. package/dist/deployers/types.d.cts +2 -243
  57. package/dist/deployers/types.d.mts +2 -243
  58. package/dist/deployers/types.mjs +1 -1
  59. package/dist/dokploy-8cbrxUun.d.cts +25 -0
  60. package/dist/dokploy-8cbrxUun.d.cts.map +1 -0
  61. package/dist/dokploy-BTflLhTM.d.mts +25 -0
  62. package/dist/dokploy-BTflLhTM.d.mts.map +1 -0
  63. package/dist/errors.cjs +2 -3
  64. package/dist/errors.cjs.map +1 -1
  65. package/dist/errors.mjs +1 -1
  66. package/dist/errors.mjs.map +1 -1
  67. package/dist/generate.cjs +27 -28
  68. package/dist/generate.cjs.map +1 -1
  69. package/dist/generate.d.mts.map +1 -1
  70. package/dist/generate.mjs +1 -2
  71. package/dist/generate.mjs.map +1 -1
  72. package/dist/generate.test.cjs +4 -5
  73. package/dist/generate.test.cjs.map +1 -1
  74. package/dist/generate.test.mjs +3 -4
  75. package/dist/generate.test.mjs.map +1 -1
  76. package/dist/generators/bare-metal-install.cjs +2 -3
  77. package/dist/generators/bare-metal-install.cjs.map +1 -1
  78. package/dist/generators/bare-metal-install.d.mts.map +1 -1
  79. package/dist/generators/bare-metal-install.mjs +1 -1
  80. package/dist/generators/bare-metal-install.test.cjs +3 -4
  81. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  82. package/dist/generators/bare-metal-install.test.mjs +3 -4
  83. package/dist/generators/bare-metal-install.test.mjs.map +1 -1
  84. package/dist/generators/caddy.cjs +2 -3
  85. package/dist/generators/caddy.cjs.map +1 -1
  86. package/dist/generators/caddy.d.mts.map +1 -1
  87. package/dist/generators/caddy.mjs +1 -1
  88. package/dist/generators/caddy.test.cjs +3 -4
  89. package/dist/generators/caddy.test.cjs.map +1 -1
  90. package/dist/generators/caddy.test.mjs +3 -4
  91. package/dist/generators/caddy.test.mjs.map +1 -1
  92. package/dist/generators/cloud-init.cjs +2 -3
  93. package/dist/generators/cloud-init.cjs.map +1 -1
  94. package/dist/generators/cloud-init.mjs +1 -1
  95. package/dist/generators/env.cjs +4 -5
  96. package/dist/generators/env.cjs.map +1 -1
  97. package/dist/generators/env.d.mts.map +1 -1
  98. package/dist/generators/env.mjs +1 -2
  99. package/dist/generators/env.mjs.map +1 -1
  100. package/dist/generators/env.test.cjs +3 -4
  101. package/dist/generators/env.test.cjs.map +1 -1
  102. package/dist/generators/env.test.mjs +3 -4
  103. package/dist/generators/env.test.mjs.map +1 -1
  104. package/dist/generators/get-shit-done.cjs +2 -3
  105. package/dist/generators/get-shit-done.cjs.map +1 -1
  106. package/dist/generators/get-shit-done.mjs +1 -1
  107. package/dist/generators/grafana.cjs +2 -3
  108. package/dist/generators/grafana.cjs.map +1 -1
  109. package/dist/generators/grafana.mjs +1 -1
  110. package/dist/generators/health-check.cjs +2 -3
  111. package/dist/generators/health-check.cjs.map +1 -1
  112. package/dist/generators/health-check.d.mts.map +1 -1
  113. package/dist/generators/health-check.mjs +1 -1
  114. package/dist/generators/health-check.test.cjs +3 -4
  115. package/dist/generators/health-check.test.cjs.map +1 -1
  116. package/dist/generators/health-check.test.mjs +3 -4
  117. package/dist/generators/health-check.test.mjs.map +1 -1
  118. package/dist/generators/n8n-workflows.cjs +2 -3
  119. package/dist/generators/n8n-workflows.cjs.map +1 -1
  120. package/dist/generators/n8n-workflows.d.mts.map +1 -1
  121. package/dist/generators/n8n-workflows.mjs +1 -1
  122. package/dist/generators/native-services.cjs +2 -3
  123. package/dist/generators/native-services.cjs.map +1 -1
  124. package/dist/generators/native-services.mjs +1 -1
  125. package/dist/generators/openclaw-install-script.cjs +2 -3
  126. package/dist/generators/openclaw-install-script.cjs.map +1 -1
  127. package/dist/generators/openclaw-install-script.mjs +1 -1
  128. package/dist/generators/openclaw-json.cjs +2 -3
  129. package/dist/generators/openclaw-json.cjs.map +1 -1
  130. package/dist/generators/openclaw-json.mjs +1 -1
  131. package/dist/generators/postgres-init.cjs +32 -3
  132. package/dist/generators/postgres-init.cjs.map +1 -1
  133. package/dist/generators/postgres-init.d.cts.map +1 -1
  134. package/dist/generators/postgres-init.d.mts.map +1 -1
  135. package/dist/generators/postgres-init.mjs +31 -1
  136. package/dist/generators/postgres-init.mjs.map +1 -1
  137. package/dist/generators/prometheus.cjs +2 -3
  138. package/dist/generators/prometheus.cjs.map +1 -1
  139. package/dist/generators/prometheus.d.mts.map +1 -1
  140. package/dist/generators/prometheus.mjs +1 -1
  141. package/dist/generators/readme.cjs +2 -3
  142. package/dist/generators/readme.cjs.map +1 -1
  143. package/dist/generators/readme.d.mts.map +1 -1
  144. package/dist/generators/readme.mjs +1 -1
  145. package/dist/generators/scripts.cjs +2 -3
  146. package/dist/generators/scripts.cjs.map +1 -1
  147. package/dist/generators/scripts.mjs +1 -1
  148. package/dist/generators/scripts.test.cjs +3 -4
  149. package/dist/generators/scripts.test.cjs.map +1 -1
  150. package/dist/generators/scripts.test.mjs +3 -4
  151. package/dist/generators/scripts.test.mjs.map +1 -1
  152. package/dist/generators/skills.cjs +3 -590
  153. package/dist/generators/skills.d.mts.map +1 -1
  154. package/dist/generators/skills.mjs +1 -2
  155. package/dist/generators/skills.mjs.map +1 -1
  156. package/dist/generators/stack-manifest.cjs +2 -3
  157. package/dist/generators/stack-manifest.cjs.map +1 -1
  158. package/dist/generators/stack-manifest.mjs +1 -1
  159. package/dist/generators/traefik.cjs +2 -3
  160. package/dist/generators/traefik.cjs.map +1 -1
  161. package/dist/generators/traefik.mjs +1 -1
  162. package/dist/generators/traefik.test.cjs +4 -5
  163. package/dist/generators/traefik.test.cjs.map +1 -1
  164. package/dist/generators/traefik.test.mjs +3 -4
  165. package/dist/generators/traefik.test.mjs.map +1 -1
  166. package/dist/index.cjs +35 -36
  167. package/dist/index.d.cts +4 -4
  168. package/dist/index.d.mts +4 -4
  169. package/dist/index.mjs +2 -3
  170. package/dist/{magic-string.es-D2agHT3I.cjs → magic-string.es-CJq41xdM.cjs} +2 -4
  171. package/dist/{magic-string.es-CfFonO_S.mjs.map → magic-string.es-CJq41xdM.cjs.map} +1 -1
  172. package/dist/{magic-string.es-CfFonO_S.mjs → magic-string.es-CoDyF8pj.mjs} +2 -3
  173. package/dist/{magic-string.es-D2agHT3I.cjs.map → magic-string.es-CoDyF8pj.mjs.map} +1 -1
  174. package/dist/migrations.cjs +5 -6
  175. package/dist/migrations.cjs.map +1 -1
  176. package/dist/migrations.mjs +4 -4
  177. package/dist/migrations.mjs.map +1 -1
  178. package/dist/migrations.test.cjs +6 -7
  179. package/dist/migrations.test.cjs.map +1 -1
  180. package/dist/migrations.test.mjs +7 -8
  181. package/dist/migrations.test.mjs.map +1 -1
  182. package/dist/port-scanner.cjs +2 -3
  183. package/dist/port-scanner.cjs.map +1 -1
  184. package/dist/port-scanner.d.mts.map +1 -1
  185. package/dist/port-scanner.mjs +1 -1
  186. package/dist/presets/presets.test.cjs +11 -8
  187. package/dist/presets/presets.test.cjs.map +1 -1
  188. package/dist/presets/presets.test.mjs +7 -4
  189. package/dist/presets/presets.test.mjs.map +1 -1
  190. package/dist/presets/registry.cjs +152 -3
  191. package/dist/presets/registry.cjs.map +1 -1
  192. package/dist/presets/registry.d.cts.map +1 -1
  193. package/dist/presets/registry.d.mts.map +1 -1
  194. package/dist/presets/registry.mjs +151 -1
  195. package/dist/presets/registry.mjs.map +1 -1
  196. package/dist/presets/registry.test.cjs +3 -4
  197. package/dist/presets/registry.test.cjs.map +1 -1
  198. package/dist/presets/registry.test.mjs +3 -4
  199. package/dist/presets/registry.test.mjs.map +1 -1
  200. package/dist/resolver.cjs +4 -5
  201. package/dist/resolver.cjs.map +1 -1
  202. package/dist/resolver.d.mts.map +1 -1
  203. package/dist/resolver.mjs +1 -2
  204. package/dist/resolver.mjs.map +1 -1
  205. package/dist/resolver.test.cjs +3 -4
  206. package/dist/resolver.test.cjs.map +1 -1
  207. package/dist/resolver.test.mjs +3 -4
  208. package/dist/resolver.test.mjs.map +1 -1
  209. package/dist/schema-C_hc7e4k.d.cts +898 -0
  210. package/dist/schema-C_hc7e4k.d.cts.map +1 -0
  211. package/dist/schema-CaesJaS2.d.mts +898 -0
  212. package/dist/schema-CaesJaS2.d.mts.map +1 -0
  213. package/dist/schema.cjs +15 -5
  214. package/dist/schema.cjs.map +1 -1
  215. package/dist/schema.d.cts +2 -854
  216. package/dist/schema.d.mts +2 -854
  217. package/dist/schema.mjs +13 -3
  218. package/dist/schema.mjs.map +1 -1
  219. package/dist/schema.test.cjs +3 -4
  220. package/dist/schema.test.cjs.map +1 -1
  221. package/dist/schema.test.mjs +3 -4
  222. package/dist/schema.test.mjs.map +1 -1
  223. package/dist/services/definitions/airbyte.cjs +76 -0
  224. package/dist/services/definitions/airbyte.cjs.map +1 -0
  225. package/dist/services/definitions/airbyte.d.cts +7 -0
  226. package/dist/services/definitions/airbyte.d.cts.map +1 -0
  227. package/dist/services/definitions/airbyte.d.mts +7 -0
  228. package/dist/services/definitions/airbyte.d.mts.map +1 -0
  229. package/dist/services/definitions/airbyte.mjs +75 -0
  230. package/dist/services/definitions/airbyte.mjs.map +1 -0
  231. package/dist/services/definitions/airflow.cjs +109 -0
  232. package/dist/services/definitions/airflow.cjs.map +1 -0
  233. package/dist/services/definitions/airflow.d.cts +7 -0
  234. package/dist/services/definitions/airflow.d.cts.map +1 -0
  235. package/dist/services/definitions/airflow.d.mts +7 -0
  236. package/dist/services/definitions/airflow.d.mts.map +1 -0
  237. package/dist/services/definitions/airflow.mjs +108 -0
  238. package/dist/services/definitions/airflow.mjs.map +1 -0
  239. package/dist/services/definitions/anything-llm.cjs +2 -3
  240. package/dist/services/definitions/anything-llm.cjs.map +1 -1
  241. package/dist/services/definitions/anything-llm.mjs +1 -1
  242. package/dist/services/definitions/appflowy.cjs +2 -3
  243. package/dist/services/definitions/appflowy.cjs.map +1 -1
  244. package/dist/services/definitions/appflowy.mjs +1 -1
  245. package/dist/services/definitions/appwrite.cjs +190 -0
  246. package/dist/services/definitions/appwrite.cjs.map +1 -0
  247. package/dist/services/definitions/appwrite.d.cts +7 -0
  248. package/dist/services/definitions/appwrite.d.cts.map +1 -0
  249. package/dist/services/definitions/appwrite.d.mts +7 -0
  250. package/dist/services/definitions/appwrite.d.mts.map +1 -0
  251. package/dist/services/definitions/appwrite.mjs +189 -0
  252. package/dist/services/definitions/appwrite.mjs.map +1 -0
  253. package/dist/services/definitions/authelia.cjs +145 -0
  254. package/dist/services/definitions/authelia.cjs.map +1 -0
  255. package/dist/services/definitions/authelia.d.cts +7 -0
  256. package/dist/services/definitions/authelia.d.cts.map +1 -0
  257. package/dist/services/definitions/authelia.d.mts +7 -0
  258. package/dist/services/definitions/authelia.d.mts.map +1 -0
  259. package/dist/services/definitions/authelia.mjs +144 -0
  260. package/dist/services/definitions/authelia.mjs.map +1 -0
  261. package/dist/services/definitions/authentik.cjs +2 -3
  262. package/dist/services/definitions/authentik.cjs.map +1 -1
  263. package/dist/services/definitions/authentik.mjs +1 -1
  264. package/dist/services/definitions/axolotl.cjs +67 -0
  265. package/dist/services/definitions/axolotl.cjs.map +1 -0
  266. package/dist/services/definitions/axolotl.d.cts +7 -0
  267. package/dist/services/definitions/axolotl.d.cts.map +1 -0
  268. package/dist/services/definitions/axolotl.d.mts +7 -0
  269. package/dist/services/definitions/axolotl.d.mts.map +1 -0
  270. package/dist/services/definitions/axolotl.mjs +66 -0
  271. package/dist/services/definitions/axolotl.mjs.map +1 -0
  272. package/dist/services/definitions/beszel.cjs +2 -3
  273. package/dist/services/definitions/beszel.cjs.map +1 -1
  274. package/dist/services/definitions/beszel.mjs +1 -1
  275. package/dist/services/definitions/browserless.cjs +2 -3
  276. package/dist/services/definitions/browserless.cjs.map +1 -1
  277. package/dist/services/definitions/browserless.mjs +1 -1
  278. package/dist/services/definitions/caddy.cjs +2 -3
  279. package/dist/services/definitions/caddy.cjs.map +1 -1
  280. package/dist/services/definitions/caddy.mjs +1 -1
  281. package/dist/services/definitions/cal-com.cjs +2 -3
  282. package/dist/services/definitions/cal-com.cjs.map +1 -1
  283. package/dist/services/definitions/cal-com.mjs +1 -1
  284. package/dist/services/definitions/chatwoot-worker.cjs +95 -0
  285. package/dist/services/definitions/chatwoot-worker.cjs.map +1 -0
  286. package/dist/services/definitions/chatwoot-worker.d.cts +7 -0
  287. package/dist/services/definitions/chatwoot-worker.d.cts.map +1 -0
  288. package/dist/services/definitions/chatwoot-worker.d.mts +7 -0
  289. package/dist/services/definitions/chatwoot-worker.d.mts.map +1 -0
  290. package/dist/services/definitions/chatwoot-worker.mjs +94 -0
  291. package/dist/services/definitions/chatwoot-worker.mjs.map +1 -0
  292. package/dist/services/definitions/chatwoot.cjs +112 -0
  293. package/dist/services/definitions/chatwoot.cjs.map +1 -0
  294. package/dist/services/definitions/chatwoot.d.cts +7 -0
  295. package/dist/services/definitions/chatwoot.d.cts.map +1 -0
  296. package/dist/services/definitions/chatwoot.d.mts +7 -0
  297. package/dist/services/definitions/chatwoot.d.mts.map +1 -0
  298. package/dist/services/definitions/chatwoot.mjs +111 -0
  299. package/dist/services/definitions/chatwoot.mjs.map +1 -0
  300. package/dist/services/definitions/chromadb.cjs +2 -3
  301. package/dist/services/definitions/chromadb.cjs.map +1 -1
  302. package/dist/services/definitions/chromadb.mjs +1 -1
  303. package/dist/services/definitions/claude-code.cjs +2 -3
  304. package/dist/services/definitions/claude-code.cjs.map +1 -1
  305. package/dist/services/definitions/claude-code.mjs +1 -1
  306. package/dist/services/definitions/code-server.cjs +2 -3
  307. package/dist/services/definitions/code-server.cjs.map +1 -1
  308. package/dist/services/definitions/code-server.mjs +1 -1
  309. package/dist/services/definitions/codex.cjs +2 -3
  310. package/dist/services/definitions/codex.cjs.map +1 -1
  311. package/dist/services/definitions/codex.mjs +1 -1
  312. package/dist/services/definitions/comfyui.cjs +2 -3
  313. package/dist/services/definitions/comfyui.cjs.map +1 -1
  314. package/dist/services/definitions/comfyui.mjs +1 -1
  315. package/dist/services/definitions/convex-dashboard.cjs +2 -3
  316. package/dist/services/definitions/convex-dashboard.cjs.map +1 -1
  317. package/dist/services/definitions/convex-dashboard.mjs +1 -1
  318. package/dist/services/definitions/convex.cjs +2 -3
  319. package/dist/services/definitions/convex.cjs.map +1 -1
  320. package/dist/services/definitions/convex.mjs +1 -1
  321. package/dist/services/definitions/coolify.cjs +2 -3
  322. package/dist/services/definitions/coolify.cjs.map +1 -1
  323. package/dist/services/definitions/coolify.mjs +1 -1
  324. package/dist/services/definitions/crowdsec.cjs +2 -3
  325. package/dist/services/definitions/crowdsec.cjs.map +1 -1
  326. package/dist/services/definitions/crowdsec.mjs +1 -1
  327. package/dist/services/definitions/dagster.cjs +83 -0
  328. package/dist/services/definitions/dagster.cjs.map +1 -0
  329. package/dist/services/definitions/dagster.d.cts +7 -0
  330. package/dist/services/definitions/dagster.d.cts.map +1 -0
  331. package/dist/services/definitions/dagster.d.mts +7 -0
  332. package/dist/services/definitions/dagster.d.mts.map +1 -0
  333. package/dist/services/definitions/dagster.mjs +82 -0
  334. package/dist/services/definitions/dagster.mjs.map +1 -0
  335. package/dist/services/definitions/desktop-environment.cjs +2 -3
  336. package/dist/services/definitions/desktop-environment.cjs.map +1 -1
  337. package/dist/services/definitions/desktop-environment.mjs +1 -1
  338. package/dist/services/definitions/dify.cjs +2 -3
  339. package/dist/services/definitions/dify.cjs.map +1 -1
  340. package/dist/services/definitions/dify.mjs +1 -1
  341. package/dist/services/definitions/directus.cjs +115 -0
  342. package/dist/services/definitions/directus.cjs.map +1 -0
  343. package/dist/services/definitions/directus.d.cts +7 -0
  344. package/dist/services/definitions/directus.d.cts.map +1 -0
  345. package/dist/services/definitions/directus.d.mts +7 -0
  346. package/dist/services/definitions/directus.d.mts.map +1 -0
  347. package/dist/services/definitions/directus.mjs +114 -0
  348. package/dist/services/definitions/directus.mjs.map +1 -0
  349. package/dist/services/definitions/docsgpt.cjs +2 -3
  350. package/dist/services/definitions/docsgpt.cjs.map +1 -1
  351. package/dist/services/definitions/docsgpt.mjs +1 -1
  352. package/dist/services/definitions/dokploy.cjs +2 -3
  353. package/dist/services/definitions/dokploy.cjs.map +1 -1
  354. package/dist/services/definitions/dokploy.mjs +1 -1
  355. package/dist/services/definitions/dozzle.cjs +2 -3
  356. package/dist/services/definitions/dozzle.cjs.map +1 -1
  357. package/dist/services/definitions/dozzle.mjs +1 -1
  358. package/dist/services/definitions/duplicati.cjs +76 -0
  359. package/dist/services/definitions/duplicati.cjs.map +1 -0
  360. package/dist/services/definitions/duplicati.d.cts +7 -0
  361. package/dist/services/definitions/duplicati.d.cts.map +1 -0
  362. package/dist/services/definitions/duplicati.d.mts +7 -0
  363. package/dist/services/definitions/duplicati.d.mts.map +1 -0
  364. package/dist/services/definitions/duplicati.mjs +75 -0
  365. package/dist/services/definitions/duplicati.mjs.map +1 -0
  366. package/dist/services/definitions/excalidraw.cjs +48 -0
  367. package/dist/services/definitions/excalidraw.cjs.map +1 -0
  368. package/dist/services/definitions/excalidraw.d.cts +7 -0
  369. package/dist/services/definitions/excalidraw.d.cts.map +1 -0
  370. package/dist/services/definitions/excalidraw.d.mts +7 -0
  371. package/dist/services/definitions/excalidraw.d.mts.map +1 -0
  372. package/dist/services/definitions/excalidraw.mjs +47 -0
  373. package/dist/services/definitions/excalidraw.mjs.map +1 -0
  374. package/dist/services/definitions/ffmpeg.cjs +2 -3
  375. package/dist/services/definitions/ffmpeg.cjs.map +1 -1
  376. package/dist/services/definitions/ffmpeg.mjs +1 -1
  377. package/dist/services/definitions/firecrawl-playwright.cjs +61 -0
  378. package/dist/services/definitions/firecrawl-playwright.cjs.map +1 -0
  379. package/dist/services/definitions/firecrawl-playwright.d.cts +7 -0
  380. package/dist/services/definitions/firecrawl-playwright.d.cts.map +1 -0
  381. package/dist/services/definitions/firecrawl-playwright.d.mts +7 -0
  382. package/dist/services/definitions/firecrawl-playwright.d.mts.map +1 -0
  383. package/dist/services/definitions/firecrawl-playwright.mjs +60 -0
  384. package/dist/services/definitions/firecrawl-playwright.mjs.map +1 -0
  385. package/dist/services/definitions/firecrawl.cjs +163 -0
  386. package/dist/services/definitions/firecrawl.cjs.map +1 -0
  387. package/dist/services/definitions/firecrawl.d.cts +7 -0
  388. package/dist/services/definitions/firecrawl.d.cts.map +1 -0
  389. package/dist/services/definitions/firecrawl.d.mts +7 -0
  390. package/dist/services/definitions/firecrawl.d.mts.map +1 -0
  391. package/dist/services/definitions/firecrawl.mjs +162 -0
  392. package/dist/services/definitions/firecrawl.mjs.map +1 -0
  393. package/dist/services/definitions/flagsmith.cjs +77 -0
  394. package/dist/services/definitions/flagsmith.cjs.map +1 -0
  395. package/dist/services/definitions/flagsmith.d.cts +7 -0
  396. package/dist/services/definitions/flagsmith.d.cts.map +1 -0
  397. package/dist/services/definitions/flagsmith.d.mts +7 -0
  398. package/dist/services/definitions/flagsmith.d.mts.map +1 -0
  399. package/dist/services/definitions/flagsmith.mjs +76 -0
  400. package/dist/services/definitions/flagsmith.mjs.map +1 -0
  401. package/dist/services/definitions/flowise.cjs +2 -3
  402. package/dist/services/definitions/flowise.cjs.map +1 -1
  403. package/dist/services/definitions/flowise.mjs +1 -1
  404. package/dist/services/definitions/fonoster.cjs +66 -0
  405. package/dist/services/definitions/fonoster.cjs.map +1 -0
  406. package/dist/services/definitions/fonoster.d.cts +7 -0
  407. package/dist/services/definitions/fonoster.d.cts.map +1 -0
  408. package/dist/services/definitions/fonoster.d.mts +7 -0
  409. package/dist/services/definitions/fonoster.d.mts.map +1 -0
  410. package/dist/services/definitions/fonoster.mjs +65 -0
  411. package/dist/services/definitions/fonoster.mjs.map +1 -0
  412. package/dist/services/definitions/formbricks.cjs +75 -0
  413. package/dist/services/definitions/formbricks.cjs.map +1 -0
  414. package/dist/services/definitions/formbricks.d.cts +7 -0
  415. package/dist/services/definitions/formbricks.d.cts.map +1 -0
  416. package/dist/services/definitions/formbricks.d.mts +7 -0
  417. package/dist/services/definitions/formbricks.d.mts.map +1 -0
  418. package/dist/services/definitions/formbricks.mjs +74 -0
  419. package/dist/services/definitions/formbricks.mjs.map +1 -0
  420. package/dist/services/definitions/gemini-cli.cjs +2 -3
  421. package/dist/services/definitions/gemini-cli.cjs.map +1 -1
  422. package/dist/services/definitions/gemini-cli.mjs +1 -1
  423. package/dist/services/definitions/ghost.cjs +2 -3
  424. package/dist/services/definitions/ghost.cjs.map +1 -1
  425. package/dist/services/definitions/ghost.mjs +1 -1
  426. package/dist/services/definitions/gitea.cjs +2 -3
  427. package/dist/services/definitions/gitea.cjs.map +1 -1
  428. package/dist/services/definitions/gitea.mjs +1 -1
  429. package/dist/services/definitions/gotify.cjs +2 -3
  430. package/dist/services/definitions/gotify.cjs.map +1 -1
  431. package/dist/services/definitions/gotify.mjs +1 -1
  432. package/dist/services/definitions/grafana.cjs +2 -3
  433. package/dist/services/definitions/grafana.cjs.map +1 -1
  434. package/dist/services/definitions/grafana.mjs +1 -1
  435. package/dist/services/definitions/headscale.cjs +2 -3
  436. package/dist/services/definitions/headscale.cjs.map +1 -1
  437. package/dist/services/definitions/headscale.mjs +1 -1
  438. package/dist/services/definitions/hedgedoc.cjs +82 -0
  439. package/dist/services/definitions/hedgedoc.cjs.map +1 -0
  440. package/dist/services/definitions/hedgedoc.d.cts +7 -0
  441. package/dist/services/definitions/hedgedoc.d.cts.map +1 -0
  442. package/dist/services/definitions/hedgedoc.d.mts +7 -0
  443. package/dist/services/definitions/hedgedoc.d.mts.map +1 -0
  444. package/dist/services/definitions/hedgedoc.mjs +81 -0
  445. package/dist/services/definitions/hedgedoc.mjs.map +1 -0
  446. package/dist/services/definitions/hexstrike.cjs +2 -3
  447. package/dist/services/definitions/hexstrike.cjs.map +1 -1
  448. package/dist/services/definitions/hexstrike.mjs +1 -1
  449. package/dist/services/definitions/heyform.cjs +64 -0
  450. package/dist/services/definitions/heyform.cjs.map +1 -0
  451. package/dist/services/definitions/heyform.d.cts +7 -0
  452. package/dist/services/definitions/heyform.d.cts.map +1 -0
  453. package/dist/services/definitions/heyform.d.mts +7 -0
  454. package/dist/services/definitions/heyform.d.mts.map +1 -0
  455. package/dist/services/definitions/heyform.mjs +63 -0
  456. package/dist/services/definitions/heyform.mjs.map +1 -0
  457. package/dist/services/definitions/homeassistant.cjs +2 -3
  458. package/dist/services/definitions/homeassistant.cjs.map +1 -1
  459. package/dist/services/definitions/homeassistant.mjs +1 -1
  460. package/dist/services/definitions/hoppscotch.cjs +76 -0
  461. package/dist/services/definitions/hoppscotch.cjs.map +1 -0
  462. package/dist/services/definitions/hoppscotch.d.cts +7 -0
  463. package/dist/services/definitions/hoppscotch.d.cts.map +1 -0
  464. package/dist/services/definitions/hoppscotch.d.mts +7 -0
  465. package/dist/services/definitions/hoppscotch.d.mts.map +1 -0
  466. package/dist/services/definitions/hoppscotch.mjs +75 -0
  467. package/dist/services/definitions/hoppscotch.mjs.map +1 -0
  468. package/dist/services/definitions/immich.cjs +2 -3
  469. package/dist/services/definitions/immich.cjs.map +1 -1
  470. package/dist/services/definitions/immich.mjs +1 -1
  471. package/dist/services/definitions/index.cjs +220 -98
  472. package/dist/services/definitions/index.cjs.map +1 -1
  473. package/dist/services/definitions/index.d.cts +42 -1
  474. package/dist/services/definitions/index.d.cts.map +1 -1
  475. package/dist/services/definitions/index.d.mts +42 -1
  476. package/dist/services/definitions/index.d.mts.map +1 -1
  477. package/dist/services/definitions/index.mjs +85 -4
  478. package/dist/services/definitions/index.mjs.map +1 -1
  479. package/dist/services/definitions/infisical.cjs +99 -0
  480. package/dist/services/definitions/infisical.cjs.map +1 -0
  481. package/dist/services/definitions/infisical.d.cts +7 -0
  482. package/dist/services/definitions/infisical.d.cts.map +1 -0
  483. package/dist/services/definitions/infisical.d.mts +7 -0
  484. package/dist/services/definitions/infisical.d.mts.map +1 -0
  485. package/dist/services/definitions/infisical.mjs +98 -0
  486. package/dist/services/definitions/infisical.mjs.map +1 -0
  487. package/dist/services/definitions/jellyfin.cjs +2 -3
  488. package/dist/services/definitions/jellyfin.cjs.map +1 -1
  489. package/dist/services/definitions/jellyfin.mjs +1 -1
  490. package/dist/services/definitions/jenkins.cjs +2 -3
  491. package/dist/services/definitions/jenkins.cjs.map +1 -1
  492. package/dist/services/definitions/jenkins.mjs +1 -1
  493. package/dist/services/definitions/keycloak.cjs +122 -0
  494. package/dist/services/definitions/keycloak.cjs.map +1 -0
  495. package/dist/services/definitions/keycloak.d.cts +7 -0
  496. package/dist/services/definitions/keycloak.d.cts.map +1 -0
  497. package/dist/services/definitions/keycloak.d.mts +7 -0
  498. package/dist/services/definitions/keycloak.d.mts.map +1 -0
  499. package/dist/services/definitions/keycloak.mjs +121 -0
  500. package/dist/services/definitions/keycloak.mjs.map +1 -0
  501. package/dist/services/definitions/kimi.cjs +2 -3
  502. package/dist/services/definitions/kimi.cjs.map +1 -1
  503. package/dist/services/definitions/kimi.mjs +1 -1
  504. package/dist/services/definitions/kong.cjs +121 -0
  505. package/dist/services/definitions/kong.cjs.map +1 -0
  506. package/dist/services/definitions/kong.d.cts +7 -0
  507. package/dist/services/definitions/kong.d.cts.map +1 -0
  508. package/dist/services/definitions/kong.d.mts +7 -0
  509. package/dist/services/definitions/kong.d.mts.map +1 -0
  510. package/dist/services/definitions/kong.mjs +120 -0
  511. package/dist/services/definitions/kong.mjs.map +1 -0
  512. package/dist/services/definitions/lago.cjs +95 -0
  513. package/dist/services/definitions/lago.cjs.map +1 -0
  514. package/dist/services/definitions/lago.d.cts +7 -0
  515. package/dist/services/definitions/lago.d.cts.map +1 -0
  516. package/dist/services/definitions/lago.d.mts +7 -0
  517. package/dist/services/definitions/lago.d.mts.map +1 -0
  518. package/dist/services/definitions/lago.mjs +94 -0
  519. package/dist/services/definitions/lago.mjs.map +1 -0
  520. package/dist/services/definitions/langflow.cjs +88 -0
  521. package/dist/services/definitions/langflow.cjs.map +1 -0
  522. package/dist/services/definitions/langflow.d.cts +7 -0
  523. package/dist/services/definitions/langflow.d.cts.map +1 -0
  524. package/dist/services/definitions/langflow.d.mts +7 -0
  525. package/dist/services/definitions/langflow.d.mts.map +1 -0
  526. package/dist/services/definitions/langflow.mjs +87 -0
  527. package/dist/services/definitions/langflow.mjs.map +1 -0
  528. package/dist/services/definitions/langfuse.cjs +79 -0
  529. package/dist/services/definitions/langfuse.cjs.map +1 -0
  530. package/dist/services/definitions/langfuse.d.cts +7 -0
  531. package/dist/services/definitions/langfuse.d.cts.map +1 -0
  532. package/dist/services/definitions/langfuse.d.mts +7 -0
  533. package/dist/services/definitions/langfuse.d.mts.map +1 -0
  534. package/dist/services/definitions/langfuse.mjs +78 -0
  535. package/dist/services/definitions/langfuse.mjs.map +1 -0
  536. package/dist/services/definitions/lasuite-meet-agents.cjs +2 -3
  537. package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -1
  538. package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
  539. package/dist/services/definitions/lasuite-meet-backend.cjs +2 -3
  540. package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -1
  541. package/dist/services/definitions/lasuite-meet-backend.mjs +1 -1
  542. package/dist/services/definitions/lasuite-meet-frontend.cjs +2 -3
  543. package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -1
  544. package/dist/services/definitions/lasuite-meet-frontend.mjs +1 -1
  545. package/dist/services/definitions/librechat.cjs +2 -3
  546. package/dist/services/definitions/librechat.cjs.map +1 -1
  547. package/dist/services/definitions/librechat.mjs +1 -1
  548. package/dist/services/definitions/lightpanda.cjs +2 -3
  549. package/dist/services/definitions/lightpanda.cjs.map +1 -1
  550. package/dist/services/definitions/lightpanda.mjs +1 -1
  551. package/dist/services/definitions/listmonk.cjs +118 -0
  552. package/dist/services/definitions/listmonk.cjs.map +1 -0
  553. package/dist/services/definitions/listmonk.d.cts +7 -0
  554. package/dist/services/definitions/listmonk.d.cts.map +1 -0
  555. package/dist/services/definitions/listmonk.d.mts +7 -0
  556. package/dist/services/definitions/listmonk.d.mts.map +1 -0
  557. package/dist/services/definitions/listmonk.mjs +117 -0
  558. package/dist/services/definitions/listmonk.mjs.map +1 -0
  559. package/dist/services/definitions/litellm.cjs +2 -3
  560. package/dist/services/definitions/litellm.cjs.map +1 -1
  561. package/dist/services/definitions/litellm.mjs +1 -1
  562. package/dist/services/definitions/livekit.cjs +2 -3
  563. package/dist/services/definitions/livekit.cjs.map +1 -1
  564. package/dist/services/definitions/livekit.mjs +1 -1
  565. package/dist/services/definitions/loki.cjs +2 -3
  566. package/dist/services/definitions/loki.cjs.map +1 -1
  567. package/dist/services/definitions/loki.mjs +1 -1
  568. package/dist/services/definitions/mariadb.cjs +81 -0
  569. package/dist/services/definitions/mariadb.cjs.map +1 -0
  570. package/dist/services/definitions/mariadb.d.cts +7 -0
  571. package/dist/services/definitions/mariadb.d.cts.map +1 -0
  572. package/dist/services/definitions/mariadb.d.mts +7 -0
  573. package/dist/services/definitions/mariadb.d.mts.map +1 -0
  574. package/dist/services/definitions/mariadb.mjs +80 -0
  575. package/dist/services/definitions/mariadb.mjs.map +1 -0
  576. package/dist/services/definitions/matomo.cjs +2 -3
  577. package/dist/services/definitions/matomo.cjs.map +1 -1
  578. package/dist/services/definitions/matomo.mjs +1 -1
  579. package/dist/services/definitions/matrix-synapse.cjs +2 -3
  580. package/dist/services/definitions/matrix-synapse.cjs.map +1 -1
  581. package/dist/services/definitions/matrix-synapse.mjs +1 -1
  582. package/dist/services/definitions/mattermost.cjs +2 -3
  583. package/dist/services/definitions/mattermost.cjs.map +1 -1
  584. package/dist/services/definitions/mattermost.mjs +1 -1
  585. package/dist/services/definitions/mautic.cjs +83 -0
  586. package/dist/services/definitions/mautic.cjs.map +1 -0
  587. package/dist/services/definitions/mautic.d.cts +7 -0
  588. package/dist/services/definitions/mautic.d.cts.map +1 -0
  589. package/dist/services/definitions/mautic.d.mts +7 -0
  590. package/dist/services/definitions/mautic.d.mts.map +1 -0
  591. package/dist/services/definitions/mautic.mjs +82 -0
  592. package/dist/services/definitions/mautic.mjs.map +1 -0
  593. package/dist/services/definitions/medusa.cjs +83 -0
  594. package/dist/services/definitions/medusa.cjs.map +1 -0
  595. package/dist/services/definitions/medusa.d.cts +7 -0
  596. package/dist/services/definitions/medusa.d.cts.map +1 -0
  597. package/dist/services/definitions/medusa.d.mts +7 -0
  598. package/dist/services/definitions/medusa.d.mts.map +1 -0
  599. package/dist/services/definitions/medusa.mjs +82 -0
  600. package/dist/services/definitions/medusa.mjs.map +1 -0
  601. package/dist/services/definitions/meilisearch.cjs +2 -3
  602. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  603. package/dist/services/definitions/meilisearch.mjs +1 -1
  604. package/dist/services/definitions/milvus.cjs +2 -3
  605. package/dist/services/definitions/milvus.cjs.map +1 -1
  606. package/dist/services/definitions/milvus.mjs +1 -1
  607. package/dist/services/definitions/minio.cjs +2 -3
  608. package/dist/services/definitions/minio.cjs.map +1 -1
  609. package/dist/services/definitions/minio.mjs +1 -1
  610. package/dist/services/definitions/mission-control.cjs +2 -3
  611. package/dist/services/definitions/mission-control.cjs.map +1 -1
  612. package/dist/services/definitions/mission-control.mjs +1 -1
  613. package/dist/services/definitions/mixpost.cjs +2 -3
  614. package/dist/services/definitions/mixpost.cjs.map +1 -1
  615. package/dist/services/definitions/mixpost.mjs +1 -1
  616. package/dist/services/definitions/motion-canvas.cjs +2 -3
  617. package/dist/services/definitions/motion-canvas.cjs.map +1 -1
  618. package/dist/services/definitions/motion-canvas.mjs +1 -1
  619. package/dist/services/definitions/mysql.cjs +81 -0
  620. package/dist/services/definitions/mysql.cjs.map +1 -0
  621. package/dist/services/definitions/mysql.d.cts +7 -0
  622. package/dist/services/definitions/mysql.d.cts.map +1 -0
  623. package/dist/services/definitions/mysql.d.mts +7 -0
  624. package/dist/services/definitions/mysql.d.mts.map +1 -0
  625. package/dist/services/definitions/mysql.mjs +80 -0
  626. package/dist/services/definitions/mysql.mjs.map +1 -0
  627. package/dist/services/definitions/n8n.cjs +2 -3
  628. package/dist/services/definitions/n8n.cjs.map +1 -1
  629. package/dist/services/definitions/n8n.mjs +1 -1
  630. package/dist/services/definitions/neo4j.cjs +2 -3
  631. package/dist/services/definitions/neo4j.cjs.map +1 -1
  632. package/dist/services/definitions/neo4j.mjs +1 -1
  633. package/dist/services/definitions/nextcloud.cjs +2 -3
  634. package/dist/services/definitions/nextcloud.cjs.map +1 -1
  635. package/dist/services/definitions/nextcloud.mjs +1 -1
  636. package/dist/services/definitions/nocodb.cjs +2 -3
  637. package/dist/services/definitions/nocodb.cjs.map +1 -1
  638. package/dist/services/definitions/nocodb.mjs +1 -1
  639. package/dist/services/definitions/ntfy.cjs +2 -3
  640. package/dist/services/definitions/ntfy.cjs.map +1 -1
  641. package/dist/services/definitions/ntfy.mjs +1 -1
  642. package/dist/services/definitions/ollama.cjs +2 -3
  643. package/dist/services/definitions/ollama.cjs.map +1 -1
  644. package/dist/services/definitions/ollama.mjs +1 -1
  645. package/dist/services/definitions/open-webui.cjs +2 -3
  646. package/dist/services/definitions/open-webui.cjs.map +1 -1
  647. package/dist/services/definitions/open-webui.mjs +1 -1
  648. package/dist/services/definitions/opencode.cjs +2 -3
  649. package/dist/services/definitions/opencode.cjs.map +1 -1
  650. package/dist/services/definitions/opencode.mjs +1 -1
  651. package/dist/services/definitions/openhands.cjs +58 -0
  652. package/dist/services/definitions/openhands.cjs.map +1 -0
  653. package/dist/services/definitions/openhands.d.cts +7 -0
  654. package/dist/services/definitions/openhands.d.cts.map +1 -0
  655. package/dist/services/definitions/openhands.d.mts +7 -0
  656. package/dist/services/definitions/openhands.d.mts.map +1 -0
  657. package/dist/services/definitions/openhands.mjs +57 -0
  658. package/dist/services/definitions/openhands.mjs.map +1 -0
  659. package/dist/services/definitions/openpanel.cjs +2 -3
  660. package/dist/services/definitions/openpanel.cjs.map +1 -1
  661. package/dist/services/definitions/openpanel.mjs +1 -1
  662. package/dist/services/definitions/opensearch.cjs +94 -0
  663. package/dist/services/definitions/opensearch.cjs.map +1 -0
  664. package/dist/services/definitions/opensearch.d.cts +7 -0
  665. package/dist/services/definitions/opensearch.d.cts.map +1 -0
  666. package/dist/services/definitions/opensearch.d.mts +7 -0
  667. package/dist/services/definitions/opensearch.d.mts.map +1 -0
  668. package/dist/services/definitions/opensearch.mjs +93 -0
  669. package/dist/services/definitions/opensearch.mjs.map +1 -0
  670. package/dist/services/definitions/outline.cjs +2 -3
  671. package/dist/services/definitions/outline.cjs.map +1 -1
  672. package/dist/services/definitions/outline.mjs +1 -1
  673. package/dist/services/definitions/paperless-ngx.cjs +2 -3
  674. package/dist/services/definitions/paperless-ngx.cjs.map +1 -1
  675. package/dist/services/definitions/paperless-ngx.mjs +1 -1
  676. package/dist/services/definitions/pentagi.cjs +2 -3
  677. package/dist/services/definitions/pentagi.cjs.map +1 -1
  678. package/dist/services/definitions/pentagi.mjs +1 -1
  679. package/dist/services/definitions/pentestagent.cjs +2 -3
  680. package/dist/services/definitions/pentestagent.cjs.map +1 -1
  681. package/dist/services/definitions/pentestagent.mjs +1 -1
  682. package/dist/services/definitions/playwright-server.cjs +2 -3
  683. package/dist/services/definitions/playwright-server.cjs.map +1 -1
  684. package/dist/services/definitions/playwright-server.mjs +1 -1
  685. package/dist/services/definitions/pocketbase.cjs +61 -0
  686. package/dist/services/definitions/pocketbase.cjs.map +1 -0
  687. package/dist/services/definitions/pocketbase.d.cts +7 -0
  688. package/dist/services/definitions/pocketbase.d.cts.map +1 -0
  689. package/dist/services/definitions/pocketbase.d.mts +7 -0
  690. package/dist/services/definitions/pocketbase.d.mts.map +1 -0
  691. package/dist/services/definitions/pocketbase.mjs +60 -0
  692. package/dist/services/definitions/pocketbase.mjs.map +1 -0
  693. package/dist/services/definitions/portainer.cjs +2 -3
  694. package/dist/services/definitions/portainer.cjs.map +1 -1
  695. package/dist/services/definitions/portainer.mjs +1 -1
  696. package/dist/services/definitions/postgresql.cjs +2 -3
  697. package/dist/services/definitions/postgresql.cjs.map +1 -1
  698. package/dist/services/definitions/postgresql.mjs +1 -1
  699. package/dist/services/definitions/postiz.cjs +2 -3
  700. package/dist/services/definitions/postiz.cjs.map +1 -1
  701. package/dist/services/definitions/postiz.mjs +1 -1
  702. package/dist/services/definitions/prometheus.cjs +2 -3
  703. package/dist/services/definitions/prometheus.cjs.map +1 -1
  704. package/dist/services/definitions/prometheus.mjs +1 -1
  705. package/dist/services/definitions/qdrant.cjs +2 -3
  706. package/dist/services/definitions/qdrant.cjs.map +1 -1
  707. package/dist/services/definitions/qdrant.mjs +1 -1
  708. package/dist/services/definitions/rabbitmq.cjs +80 -0
  709. package/dist/services/definitions/rabbitmq.cjs.map +1 -0
  710. package/dist/services/definitions/rabbitmq.d.cts +7 -0
  711. package/dist/services/definitions/rabbitmq.d.cts.map +1 -0
  712. package/dist/services/definitions/rabbitmq.d.mts +7 -0
  713. package/dist/services/definitions/rabbitmq.d.mts.map +1 -0
  714. package/dist/services/definitions/rabbitmq.mjs +79 -0
  715. package/dist/services/definitions/rabbitmq.mjs.map +1 -0
  716. package/dist/services/definitions/ragflow.cjs +192 -0
  717. package/dist/services/definitions/ragflow.cjs.map +1 -0
  718. package/dist/services/definitions/ragflow.d.cts +7 -0
  719. package/dist/services/definitions/ragflow.d.cts.map +1 -0
  720. package/dist/services/definitions/ragflow.d.mts +7 -0
  721. package/dist/services/definitions/ragflow.d.mts.map +1 -0
  722. package/dist/services/definitions/ragflow.mjs +191 -0
  723. package/dist/services/definitions/ragflow.mjs.map +1 -0
  724. package/dist/services/definitions/redis.cjs +2 -3
  725. package/dist/services/definitions/redis.cjs.map +1 -1
  726. package/dist/services/definitions/redis.mjs +1 -1
  727. package/dist/services/definitions/remotion.cjs +2 -3
  728. package/dist/services/definitions/remotion.cjs.map +1 -1
  729. package/dist/services/definitions/remotion.mjs +1 -1
  730. package/dist/services/definitions/restic.cjs +58 -0
  731. package/dist/services/definitions/restic.cjs.map +1 -0
  732. package/dist/services/definitions/restic.d.cts +7 -0
  733. package/dist/services/definitions/restic.d.cts.map +1 -0
  734. package/dist/services/definitions/restic.d.mts +7 -0
  735. package/dist/services/definitions/restic.d.mts.map +1 -0
  736. package/dist/services/definitions/restic.mjs +57 -0
  737. package/dist/services/definitions/restic.mjs.map +1 -0
  738. package/dist/services/definitions/rocketchat.cjs +2 -3
  739. package/dist/services/definitions/rocketchat.cjs.map +1 -1
  740. package/dist/services/definitions/rocketchat.mjs +1 -1
  741. package/dist/services/definitions/saleor.cjs +76 -0
  742. package/dist/services/definitions/saleor.cjs.map +1 -0
  743. package/dist/services/definitions/saleor.d.cts +7 -0
  744. package/dist/services/definitions/saleor.d.cts.map +1 -0
  745. package/dist/services/definitions/saleor.d.mts +7 -0
  746. package/dist/services/definitions/saleor.d.mts.map +1 -0
  747. package/dist/services/definitions/saleor.mjs +75 -0
  748. package/dist/services/definitions/saleor.mjs.map +1 -0
  749. package/dist/services/definitions/scrapling.cjs +2 -3
  750. package/dist/services/definitions/scrapling.cjs.map +1 -1
  751. package/dist/services/definitions/scrapling.mjs +1 -1
  752. package/dist/services/definitions/searxng.cjs +2 -3
  753. package/dist/services/definitions/searxng.cjs.map +1 -1
  754. package/dist/services/definitions/searxng.mjs +1 -1
  755. package/dist/services/definitions/signoz.cjs +2 -3
  756. package/dist/services/definitions/signoz.cjs.map +1 -1
  757. package/dist/services/definitions/signoz.mjs +1 -1
  758. package/dist/services/definitions/solidityguard.cjs +2 -3
  759. package/dist/services/definitions/solidityguard.cjs.map +1 -1
  760. package/dist/services/definitions/solidityguard.mjs +1 -1
  761. package/dist/services/definitions/stable-diffusion.cjs +2 -3
  762. package/dist/services/definitions/stable-diffusion.cjs.map +1 -1
  763. package/dist/services/definitions/stable-diffusion.mjs +1 -1
  764. package/dist/services/definitions/steel-browser.cjs +2 -3
  765. package/dist/services/definitions/steel-browser.cjs.map +1 -1
  766. package/dist/services/definitions/steel-browser.mjs +1 -1
  767. package/dist/services/definitions/stirling-pdf.cjs +74 -0
  768. package/dist/services/definitions/stirling-pdf.cjs.map +1 -0
  769. package/dist/services/definitions/stirling-pdf.d.cts +7 -0
  770. package/dist/services/definitions/stirling-pdf.d.cts.map +1 -0
  771. package/dist/services/definitions/stirling-pdf.d.mts +7 -0
  772. package/dist/services/definitions/stirling-pdf.d.mts.map +1 -0
  773. package/dist/services/definitions/stirling-pdf.mjs +73 -0
  774. package/dist/services/definitions/stirling-pdf.mjs.map +1 -0
  775. package/dist/services/definitions/strapi.cjs +124 -0
  776. package/dist/services/definitions/strapi.cjs.map +1 -0
  777. package/dist/services/definitions/strapi.d.cts +7 -0
  778. package/dist/services/definitions/strapi.d.cts.map +1 -0
  779. package/dist/services/definitions/strapi.d.mts +7 -0
  780. package/dist/services/definitions/strapi.d.mts.map +1 -0
  781. package/dist/services/definitions/strapi.mjs +123 -0
  782. package/dist/services/definitions/strapi.mjs.map +1 -0
  783. package/dist/services/definitions/stream-gateway.cjs +2 -3
  784. package/dist/services/definitions/stream-gateway.cjs.map +1 -1
  785. package/dist/services/definitions/stream-gateway.mjs +1 -1
  786. package/dist/services/definitions/supabase.cjs +2 -3
  787. package/dist/services/definitions/supabase.cjs.map +1 -1
  788. package/dist/services/definitions/supabase.mjs +1 -1
  789. package/dist/services/definitions/tailscale.cjs +2 -3
  790. package/dist/services/definitions/tailscale.cjs.map +1 -1
  791. package/dist/services/definitions/tailscale.mjs +1 -1
  792. package/dist/services/definitions/temporal.cjs +2 -3
  793. package/dist/services/definitions/temporal.cjs.map +1 -1
  794. package/dist/services/definitions/temporal.mjs +1 -1
  795. package/dist/services/definitions/traefik.cjs +2 -3
  796. package/dist/services/definitions/traefik.cjs.map +1 -1
  797. package/dist/services/definitions/traefik.mjs +1 -1
  798. package/dist/services/definitions/twenty.cjs +83 -0
  799. package/dist/services/definitions/twenty.cjs.map +1 -0
  800. package/dist/services/definitions/twenty.d.cts +7 -0
  801. package/dist/services/definitions/twenty.d.cts.map +1 -0
  802. package/dist/services/definitions/twenty.d.mts +7 -0
  803. package/dist/services/definitions/twenty.d.mts.map +1 -0
  804. package/dist/services/definitions/twenty.mjs +82 -0
  805. package/dist/services/definitions/twenty.mjs.map +1 -0
  806. package/dist/services/definitions/umami.cjs +2 -3
  807. package/dist/services/definitions/umami.cjs.map +1 -1
  808. package/dist/services/definitions/umami.mjs +1 -1
  809. package/dist/services/definitions/uptime-kuma.cjs +2 -3
  810. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  811. package/dist/services/definitions/uptime-kuma.mjs +1 -1
  812. package/dist/services/definitions/usesend.cjs +2 -3
  813. package/dist/services/definitions/usesend.cjs.map +1 -1
  814. package/dist/services/definitions/usesend.mjs +1 -1
  815. package/dist/services/definitions/valkey.cjs +2 -3
  816. package/dist/services/definitions/valkey.cjs.map +1 -1
  817. package/dist/services/definitions/valkey.mjs +1 -1
  818. package/dist/services/definitions/vault.cjs +71 -0
  819. package/dist/services/definitions/vault.cjs.map +1 -0
  820. package/dist/services/definitions/vault.d.cts +7 -0
  821. package/dist/services/definitions/vault.d.cts.map +1 -0
  822. package/dist/services/definitions/vault.d.mts +7 -0
  823. package/dist/services/definitions/vault.d.mts.map +1 -0
  824. package/dist/services/definitions/vault.mjs +70 -0
  825. package/dist/services/definitions/vault.mjs.map +1 -0
  826. package/dist/services/definitions/vaultwarden.cjs +2 -3
  827. package/dist/services/definitions/vaultwarden.cjs.map +1 -1
  828. package/dist/services/definitions/vaultwarden.mjs +1 -1
  829. package/dist/services/definitions/watchtower.cjs +2 -3
  830. package/dist/services/definitions/watchtower.cjs.map +1 -1
  831. package/dist/services/definitions/watchtower.mjs +1 -1
  832. package/dist/services/definitions/weaviate.cjs +2 -3
  833. package/dist/services/definitions/weaviate.cjs.map +1 -1
  834. package/dist/services/definitions/weaviate.mjs +1 -1
  835. package/dist/services/definitions/whisper.cjs +2 -3
  836. package/dist/services/definitions/whisper.cjs.map +1 -1
  837. package/dist/services/definitions/whisper.mjs +1 -1
  838. package/dist/services/definitions/xyops.cjs +2 -3
  839. package/dist/services/definitions/xyops.cjs.map +1 -1
  840. package/dist/services/definitions/xyops.mjs +1 -1
  841. package/dist/services/registry.cjs +3 -4
  842. package/dist/services/registry.cjs.map +1 -1
  843. package/dist/services/registry.d.mts.map +1 -1
  844. package/dist/services/registry.mjs +1 -2
  845. package/dist/services/registry.mjs.map +1 -1
  846. package/dist/services/registry.test.cjs +3 -4
  847. package/dist/services/registry.test.cjs.map +1 -1
  848. package/dist/services/registry.test.mjs +3 -4
  849. package/dist/services/registry.test.mjs.map +1 -1
  850. package/dist/{manifest-4uLbISXV.cjs → skill-manifest--IgY9REK.cjs} +40 -10
  851. package/dist/skill-manifest--IgY9REK.cjs.map +1 -0
  852. package/dist/{manifest-B8UDsVlR.mjs → skill-manifest-BVUXU0__.mjs} +24 -5
  853. package/dist/skill-manifest-BVUXU0__.mjs.map +1 -0
  854. package/dist/skills/registry.cjs +262 -3
  855. package/dist/skills/registry.cjs.map +1 -1
  856. package/dist/skills/registry.d.cts.map +1 -1
  857. package/dist/skills/registry.d.mts.map +1 -1
  858. package/dist/skills/registry.mjs +261 -1
  859. package/dist/skills/registry.mjs.map +1 -1
  860. package/dist/skills/skill-manifest.cjs +5 -23
  861. package/dist/skills/skill-manifest.mjs +1 -19
  862. package/dist/skills-BlzpHmpH.cjs +620 -0
  863. package/dist/skills-BlzpHmpH.cjs.map +1 -0
  864. package/dist/types-CR83OJiq.d.cts +243 -0
  865. package/dist/types-CR83OJiq.d.cts.map +1 -0
  866. package/dist/types-zYjGTuyn.d.mts +243 -0
  867. package/dist/types-zYjGTuyn.d.mts.map +1 -0
  868. package/dist/types.cjs +79 -3
  869. package/dist/types.cjs.map +1 -1
  870. package/dist/types.d.cts +1 -1
  871. package/dist/types.d.mts +1 -1
  872. package/dist/types.mjs +78 -1
  873. package/dist/types.mjs.map +1 -1
  874. package/dist/validator.cjs +3 -4
  875. package/dist/validator.cjs.map +1 -1
  876. package/dist/validator.mjs +1 -2
  877. package/dist/validator.mjs.map +1 -1
  878. package/dist/validator.test.cjs +5 -6
  879. package/dist/validator.test.cjs.map +1 -1
  880. package/dist/validator.test.mjs +3 -4
  881. package/dist/validator.test.mjs.map +1 -1
  882. package/dist/version-manager.cjs +3 -4
  883. package/dist/version-manager.cjs.map +1 -1
  884. package/dist/version-manager.d.mts.map +1 -1
  885. package/dist/version-manager.mjs +1 -2
  886. package/dist/version-manager.mjs.map +1 -1
  887. package/dist/version-manager.test.cjs +5 -6
  888. package/dist/version-manager.test.cjs.map +1 -1
  889. package/dist/version-manager.test.mjs +3 -4
  890. package/dist/version-manager.test.mjs.map +1 -1
  891. package/dist/{vi.2VT5v0um-BmRMvymT.cjs → vi.2VT5v0um-CRqXre87.cjs} +82 -202
  892. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs.map → vi.2VT5v0um-CRqXre87.cjs.map} +1 -1
  893. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs → vi.2VT5v0um-DvC3SVNc.mjs} +67 -186
  894. package/dist/{vi.2VT5v0um-BmRMvymT.cjs.map → vi.2VT5v0um-DvC3SVNc.mjs.map} +1 -1
  895. package/package.json +3 -3
  896. package/src/generators/postgres-init.ts +6 -0
  897. package/src/presets/presets.test.ts +4 -0
  898. package/src/presets/registry.ts +88 -0
  899. package/src/schema.ts +11 -0
  900. package/src/services/definitions/airbyte.ts +75 -0
  901. package/src/services/definitions/airflow.ts +109 -0
  902. package/src/services/definitions/appwrite.ts +181 -0
  903. package/src/services/definitions/authelia.ts +145 -0
  904. package/src/services/definitions/axolotl.ts +65 -0
  905. package/src/services/definitions/chatwoot-worker.ts +93 -0
  906. package/src/services/definitions/chatwoot.ts +106 -0
  907. package/src/services/definitions/dagster.ts +82 -0
  908. package/src/services/definitions/directus.ts +115 -0
  909. package/src/services/definitions/duplicati.ts +77 -0
  910. package/src/services/definitions/excalidraw.ts +46 -0
  911. package/src/services/definitions/firecrawl-playwright.ts +62 -0
  912. package/src/services/definitions/firecrawl.ts +146 -0
  913. package/src/services/definitions/flagsmith.ts +76 -0
  914. package/src/services/definitions/fonoster.ts +67 -0
  915. package/src/services/definitions/formbricks.ts +75 -0
  916. package/src/services/definitions/hedgedoc.ts +81 -0
  917. package/src/services/definitions/heyform.ts +67 -0
  918. package/src/services/definitions/hoppscotch.ts +74 -0
  919. package/src/services/definitions/index.ts +124 -0
  920. package/src/services/definitions/infisical.ts +97 -0
  921. package/src/services/definitions/keycloak.ts +119 -0
  922. package/src/services/definitions/kong.ts +116 -0
  923. package/src/services/definitions/lago.ts +95 -0
  924. package/src/services/definitions/langflow.ts +82 -0
  925. package/src/services/definitions/langfuse.ts +76 -0
  926. package/src/services/definitions/listmonk.ts +118 -0
  927. package/src/services/definitions/mariadb.ts +82 -0
  928. package/src/services/definitions/mautic.ts +82 -0
  929. package/src/services/definitions/medusa.ts +82 -0
  930. package/src/services/definitions/mysql.ts +82 -0
  931. package/src/services/definitions/openhands.ts +60 -0
  932. package/src/services/definitions/opensearch.ts +95 -0
  933. package/src/services/definitions/pocketbase.ts +62 -0
  934. package/src/services/definitions/rabbitmq.ts +81 -0
  935. package/src/services/definitions/ragflow.ts +175 -0
  936. package/src/services/definitions/restic.ts +60 -0
  937. package/src/services/definitions/saleor.ts +75 -0
  938. package/src/services/definitions/stirling-pdf.ts +73 -0
  939. package/src/services/definitions/strapi.ts +124 -0
  940. package/src/services/definitions/twenty.ts +82 -0
  941. package/src/services/definitions/vault.ts +74 -0
  942. package/src/skills/manifest.json +8 -0
  943. package/src/skills/registry.ts +119 -0
  944. package/src/types.ts +91 -2
  945. package/dist/chunk-C0xms8kb.cjs +0 -34
  946. package/dist/deployers/coolify.d.cts.map +0 -1
  947. package/dist/deployers/coolify.d.mts.map +0 -1
  948. package/dist/deployers/dokploy.d.cts.map +0 -1
  949. package/dist/deployers/dokploy.d.mts.map +0 -1
  950. package/dist/deployers/types.d.cts.map +0 -1
  951. package/dist/deployers/types.d.mts.map +0 -1
  952. package/dist/generators/skills.cjs.map +0 -1
  953. package/dist/manifest-4uLbISXV.cjs.map +0 -1
  954. package/dist/manifest-B8UDsVlR.mjs.map +0 -1
  955. package/dist/schema.d.cts.map +0 -1
  956. package/dist/schema.d.mts.map +0 -1
  957. package/dist/skills/skill-manifest.cjs.map +0 -1
  958. package/dist/skills/skill-manifest.mjs.map +0 -1
@@ -1,6 +1,5 @@
1
- const require_vi_2VT5v0um = require('../vi.2VT5v0um-BmRMvymT.cjs');
2
- const require_generators_bare_metal_install = require('./bare-metal-install.cjs');
3
-
1
+ const require_vi_2VT5v0um = require("../vi.2VT5v0um-CRqXre87.cjs");
2
+ const require_generators_bare_metal_install = require("./bare-metal-install.cjs");
4
3
  //#region src/generators/bare-metal-install.test.ts
5
4
  require_vi_2VT5v0um.describe("generateBareMetalInstall", () => {
6
5
  require_vi_2VT5v0um.it("returns install.ps1 for windows/amd64", () => {
@@ -42,6 +41,6 @@ require_vi_2VT5v0um.describe("generateBareMetalInstall", () => {
42
41
  }
43
42
  });
44
43
  });
45
-
46
44
  //#endregion
45
+
47
46
  //# sourceMappingURL=bare-metal-install.test.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bare-metal-install.test.cjs","names":["describe","generateBareMetalInstall"],"sources":["../../src/generators/bare-metal-install.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateBareMetalInstall } from \"./bare-metal-install.js\";\n\ndescribe(\"generateBareMetalInstall\", () => {\n\tit(\"returns install.ps1 for windows/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.ps1\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"returns install.sh for linux/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"returns install.sh for linux/arm64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/arm64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t});\n\n\tit(\"returns install.sh for macos/amd64 and macos/arm64\", () => {\n\t\tfor (const platform of [\"macos/amd64\", \"macos/arm64\"] as const) {\n\t\t\tconst result = generateBareMetalInstall({ platform, projectName: \"my-stack\" });\n\t\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\t\texpect(result[\"install.sh\"]).toContain(\"Docker\");\n\t\t}\n\t});\n});\n"],"mappings":";;;;AAGAA,6BAAS,kCAAkC;AAC1C,wBAAG,+CAA+C;EACjD,MAAM,SAASC,+DAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,mCAAO,OAAO,CAAC,eAAe,cAAc;AAC5C,mCAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,mCAAO,OAAO,eAAe,CAAC,UAAU,iBAAiB;AACzD,mCAAO,OAAO,eAAe,CAAC,UAAU,aAAa;GACpD;AAEF,wBAAG,4CAA4C;EAC9C,MAAM,SAASA,+DAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,mCAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,mCAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,mCAAO,OAAO,cAAc,CAAC,UAAU,SAAS;AAChD,mCAAO,OAAO,cAAc,CAAC,UAAU,UAAU;GAChD;AAEF,wBAAG,4CAA4C;EAC9C,MAAM,SAASA,+DAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,mCAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,mCAAO,OAAO,cAAc,CAAC,UAAU,SAAS;GAC/C;AAEF,wBAAG,4DAA4D;AAC9D,OAAK,MAAM,YAAY,CAAC,eAAe,cAAc,EAAW;GAC/D,MAAM,SAASA,+DAAyB;IAAE;IAAU,aAAa;IAAY,CAAC;AAC9E,oCAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,oCAAO,OAAO,cAAc,CAAC,UAAU,SAAS;;GAEhD;EACD"}
1
+ {"version":3,"file":"bare-metal-install.test.cjs","names":["describe","generateBareMetalInstall"],"sources":["../../src/generators/bare-metal-install.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateBareMetalInstall } from \"./bare-metal-install.js\";\n\ndescribe(\"generateBareMetalInstall\", () => {\n\tit(\"returns install.ps1 for windows/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.ps1\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"returns install.sh for linux/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"returns install.sh for linux/arm64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/arm64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t});\n\n\tit(\"returns install.sh for macos/amd64 and macos/arm64\", () => {\n\t\tfor (const platform of [\"macos/amd64\", \"macos/arm64\"] as const) {\n\t\t\tconst result = generateBareMetalInstall({ platform, projectName: \"my-stack\" });\n\t\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\t\texpect(result[\"install.sh\"]).toContain(\"Docker\");\n\t\t}\n\t});\n});\n"],"mappings":";;;AAGAA,oBAAAA,SAAS,kCAAkC;AAC1C,qBAAA,GAAG,+CAA+C;EACjD,MAAM,SAASC,sCAAAA,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,sBAAA,aAAO,OAAO,CAAC,eAAe,cAAc;AAC5C,sBAAA,aAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,sBAAA,aAAO,OAAO,eAAe,CAAC,UAAU,iBAAiB;AACzD,sBAAA,aAAO,OAAO,eAAe,CAAC,UAAU,aAAa;GACpD;AAEF,qBAAA,GAAG,4CAA4C;EAC9C,MAAM,SAASA,sCAAAA,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,sBAAA,aAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,sBAAA,aAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,sBAAA,aAAO,OAAO,cAAc,CAAC,UAAU,SAAS;AAChD,sBAAA,aAAO,OAAO,cAAc,CAAC,UAAU,UAAU;GAChD;AAEF,qBAAA,GAAG,4CAA4C;EAC9C,MAAM,SAASA,sCAAAA,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,sBAAA,aAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,sBAAA,aAAO,OAAO,cAAc,CAAC,UAAU,SAAS;GAC/C;AAEF,qBAAA,GAAG,4DAA4D;AAC9D,OAAK,MAAM,YAAY,CAAC,eAAe,cAAc,EAAW;GAC/D,MAAM,SAASA,sCAAAA,yBAAyB;IAAE;IAAU,aAAa;IAAY,CAAC;AAC9E,uBAAA,aAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,uBAAA,aAAO,OAAO,cAAc,CAAC,UAAU,SAAS;;GAEhD;EACD"}
@@ -1,6 +1,5 @@
1
- import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-CFyDIn0m.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-DvC3SVNc.mjs";
2
2
  import { generateBareMetalInstall } from "./bare-metal-install.mjs";
3
-
4
3
  //#region src/generators/bare-metal-install.test.ts
5
4
  describe("generateBareMetalInstall", () => {
6
5
  it("returns install.ps1 for windows/amd64", () => {
@@ -42,7 +41,7 @@ describe("generateBareMetalInstall", () => {
42
41
  }
43
42
  });
44
43
  });
45
-
46
44
  //#endregion
47
- export { };
45
+ export {};
46
+
48
47
  //# sourceMappingURL=bare-metal-install.test.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bare-metal-install.test.mjs","names":[],"sources":["../../src/generators/bare-metal-install.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateBareMetalInstall } from \"./bare-metal-install.js\";\n\ndescribe(\"generateBareMetalInstall\", () => {\n\tit(\"returns install.ps1 for windows/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.ps1\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"returns install.sh for linux/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"returns install.sh for linux/arm64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/arm64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t});\n\n\tit(\"returns install.sh for macos/amd64 and macos/arm64\", () => {\n\t\tfor (const platform of [\"macos/amd64\", \"macos/arm64\"] as const) {\n\t\t\tconst result = generateBareMetalInstall({ platform, projectName: \"my-stack\" });\n\t\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\t\texpect(result[\"install.sh\"]).toContain(\"Docker\");\n\t\t}\n\t});\n});\n"],"mappings":";;;;AAGA,SAAS,kCAAkC;AAC1C,IAAG,+CAA+C;EACjD,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,cAAc;AAC5C,eAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,eAAO,OAAO,eAAe,CAAC,UAAU,iBAAiB;AACzD,eAAO,OAAO,eAAe,CAAC,UAAU,aAAa;GACpD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,eAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,eAAO,OAAO,cAAc,CAAC,UAAU,SAAS;AAChD,eAAO,OAAO,cAAc,CAAC,UAAU,UAAU;GAChD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,eAAO,OAAO,cAAc,CAAC,UAAU,SAAS;GAC/C;AAEF,IAAG,4DAA4D;AAC9D,OAAK,MAAM,YAAY,CAAC,eAAe,cAAc,EAAW;GAC/D,MAAM,SAAS,yBAAyB;IAAE;IAAU,aAAa;IAAY,CAAC;AAC9E,gBAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,gBAAO,OAAO,cAAc,CAAC,UAAU,SAAS;;GAEhD;EACD"}
1
+ {"version":3,"file":"bare-metal-install.test.mjs","names":[],"sources":["../../src/generators/bare-metal-install.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateBareMetalInstall } from \"./bare-metal-install.js\";\n\ndescribe(\"generateBareMetalInstall\", () => {\n\tit(\"returns install.ps1 for windows/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.ps1\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"returns install.sh for linux/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"returns install.sh for linux/arm64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/arm64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t});\n\n\tit(\"returns install.sh for macos/amd64 and macos/arm64\", () => {\n\t\tfor (const platform of [\"macos/amd64\", \"macos/arm64\"] as const) {\n\t\t\tconst result = generateBareMetalInstall({ platform, projectName: \"my-stack\" });\n\t\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\t\texpect(result[\"install.sh\"]).toContain(\"Docker\");\n\t\t}\n\t});\n});\n"],"mappings":";;;AAGA,SAAS,kCAAkC;AAC1C,IAAG,+CAA+C;EACjD,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,cAAc;AAC5C,eAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,eAAO,OAAO,eAAe,CAAC,UAAU,iBAAiB;AACzD,eAAO,OAAO,eAAe,CAAC,UAAU,aAAa;GACpD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,eAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,eAAO,OAAO,cAAc,CAAC,UAAU,SAAS;AAChD,eAAO,OAAO,cAAc,CAAC,UAAU,UAAU;GAChD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,eAAO,OAAO,cAAc,CAAC,UAAU,SAAS;GAC/C;AAEF,IAAG,4DAA4D;AAC9D,OAAK,MAAM,YAAY,CAAC,eAAe,cAAc,EAAW;GAC/D,MAAM,SAAS,yBAAyB;IAAE;IAAU,aAAa;IAAY,CAAC;AAC9E,gBAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,gBAAO,OAAO,cAAc,CAAC,UAAU,SAAS;;GAEhD;EACD"}
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/generators/caddy.ts
4
3
  /**
5
4
  * Generates a Caddyfile with reverse proxy entries for each exposed service.
@@ -73,7 +72,7 @@ ${domain} {
73
72
  `);
74
73
  return sections.join("\n");
75
74
  }
76
-
77
75
  //#endregion
78
76
  exports.generateCaddyfile = generateCaddyfile;
77
+
79
78
  //# sourceMappingURL=caddy.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"caddy.cjs","names":[],"sources":["../../src/generators/caddy.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Generates a Caddyfile with reverse proxy entries for each exposed service.\n *\n * Each service with exposed ports gets a subdomain route under the provided domain.\n * Services without exposed ports are skipped.\n *\n * @param resolved - The resolved service configuration\n * @param domain - The main domain for routing (e.g. \"example.com\")\n * @returns The Caddyfile content as a string\n */\nexport function generateCaddyfile(resolved: ResolverOutput, domain: string): string {\n\tconst sections: string[] = [];\n\n\t// ── Global Options ──────────────────────────────────────────────────────\n\n\tsections.push(`# ═══════════════════════════════════════════════════════════════════════════════\n# OpenClaw Caddyfile — Auto-generated reverse proxy configuration\n# Domain: ${domain}\n# ═══════════════════════════════════════════════════════════════════════════════\n\n{\n\t# Global options\n\temail admin@${domain}\n\tacme_ca https://acme-v02.api.letsencrypt.org/directory\n}\n`);\n\n\t// ── Per-Service Reverse Proxy Blocks ─────────────────────────────────────\n\n\tfor (const { definition } of resolved.services) {\n\t\t// Skip the proxy service itself\n\t\tif (definition.id === \"caddy\" || definition.id === \"traefik\") continue;\n\n\t\tconst exposedPorts = definition.ports.filter((p) => p.exposed);\n\t\tif (exposedPorts.length === 0) continue;\n\n\t\t// Use the first exposed port as the primary route target\n\t\tconst primaryPort = exposedPorts[0]!;\n\t\tconst subdomain = `${definition.id}.${domain}`;\n\n\t\tconst block = [\n\t\t\t`# ${definition.icon} ${definition.name}`,\n\t\t\t`# ${definition.description}`,\n\t\t\t`${subdomain} {`,\n\t\t\t`\treverse_proxy ${definition.id}:${primaryPort.container} {`,\n\t\t\t`\t\theader_up Host {host}`,\n\t\t\t`\t\theader_up X-Real-IP {remote_host}`,\n\t\t\t`\t\theader_up X-Forwarded-For {remote_host}`,\n\t\t\t`\t\theader_up X-Forwarded-Proto {scheme}`,\n\t\t\t`\t}`,\n\t\t];\n\n\t\t// Add health check if service has one\n\t\tif (definition.healthcheck) {\n\t\t\tblock.push(\"\");\n\t\t\tblock.push(`\t# Health check`);\n\t\t\tblock.push(`\thandle /health {`);\n\t\t\tblock.push(`\t\treverse_proxy ${definition.id}:${primaryPort.container}`);\n\t\t\tblock.push(`\t}`);\n\t\t}\n\n\t\tblock.push(`}`);\n\t\tblock.push(\"\");\n\n\t\t// If there are additional exposed ports, add them as separate entries\n\t\tfor (let i = 1; i < exposedPorts.length; i++) {\n\t\t\tconst port = exposedPorts[i]!;\n\t\t\tconst portSubdomain = `${definition.id}-${port.description\n\t\t\t\t.toLowerCase()\n\t\t\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t\t\t.replace(/-+$/, \"\")}.${domain}`;\n\n\t\t\tblock.push(`# ${definition.name} — ${port.description}`);\n\t\t\tblock.push(`${portSubdomain} {`);\n\t\t\tblock.push(`\treverse_proxy ${definition.id}:${port.container}`);\n\t\t\tblock.push(`}`);\n\t\t\tblock.push(\"\");\n\t\t}\n\n\t\tsections.push(block.join(\"\\n\"));\n\t}\n\n\t// ── Fallback / Root Domain ──────────────────────────────────────────────\n\n\tsections.push(`# Root domain — serves the OpenClaw gateway\n${domain} {\n\treverse_proxy openclaw:18789 {\n\t\theader_up Host {host}\n\t\theader_up X-Real-IP {remote_host}\n\t\theader_up X-Forwarded-For {remote_host}\n\t\theader_up X-Forwarded-Proto {scheme}\n\t}\n}\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAgB,kBAAkB,UAA0B,QAAwB;CACnF,MAAM,WAAqB,EAAE;AAI7B,UAAS,KAAK;;YAEH,OAAO;;;;;eAKJ,OAAO;;;EAGpB;AAID,MAAK,MAAM,EAAE,gBAAgB,SAAS,UAAU;AAE/C,MAAI,WAAW,OAAO,WAAW,WAAW,OAAO,UAAW;EAE9D,MAAM,eAAe,WAAW,MAAM,QAAQ,MAAM,EAAE,QAAQ;AAC9D,MAAI,aAAa,WAAW,EAAG;EAG/B,MAAM,cAAc,aAAa;EACjC,MAAM,YAAY,GAAG,WAAW,GAAG,GAAG;EAEtC,MAAM,QAAQ;GACb,KAAK,WAAW,KAAK,GAAG,WAAW;GACnC,KAAK,WAAW;GAChB,GAAG,UAAU;GACb,kBAAkB,WAAW,GAAG,GAAG,YAAY,UAAU;GACzD;GACA;GACA;GACA;GACA;GACA;AAGD,MAAI,WAAW,aAAa;AAC3B,SAAM,KAAK,GAAG;AACd,SAAM,KAAK,kBAAkB;AAC7B,SAAM,KAAK,oBAAoB;AAC/B,SAAM,KAAK,mBAAmB,WAAW,GAAG,GAAG,YAAY,YAAY;AACvE,SAAM,KAAK,KAAK;;AAGjB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,GAAG;AAGd,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;GAC7C,MAAM,OAAO,aAAa;GAC1B,MAAM,gBAAgB,GAAG,WAAW,GAAG,GAAG,KAAK,YAC7C,aAAa,CACb,QAAQ,eAAe,IAAI,CAC3B,QAAQ,OAAO,GAAG,CAAC,GAAG;AAExB,SAAM,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,cAAc;AACxD,SAAM,KAAK,GAAG,cAAc,IAAI;AAChC,SAAM,KAAK,kBAAkB,WAAW,GAAG,GAAG,KAAK,YAAY;AAC/D,SAAM,KAAK,IAAI;AACf,SAAM,KAAK,GAAG;;AAGf,WAAS,KAAK,MAAM,KAAK,KAAK,CAAC;;AAKhC,UAAS,KAAK;EACb,OAAO;;;;;;;;EAQP;AAED,QAAO,SAAS,KAAK,KAAK"}
1
+ {"version":3,"file":"caddy.cjs","names":[],"sources":["../../src/generators/caddy.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Generates a Caddyfile with reverse proxy entries for each exposed service.\n *\n * Each service with exposed ports gets a subdomain route under the provided domain.\n * Services without exposed ports are skipped.\n *\n * @param resolved - The resolved service configuration\n * @param domain - The main domain for routing (e.g. \"example.com\")\n * @returns The Caddyfile content as a string\n */\nexport function generateCaddyfile(resolved: ResolverOutput, domain: string): string {\n\tconst sections: string[] = [];\n\n\t// ── Global Options ──────────────────────────────────────────────────────\n\n\tsections.push(`# ═══════════════════════════════════════════════════════════════════════════════\n# OpenClaw Caddyfile — Auto-generated reverse proxy configuration\n# Domain: ${domain}\n# ═══════════════════════════════════════════════════════════════════════════════\n\n{\n\t# Global options\n\temail admin@${domain}\n\tacme_ca https://acme-v02.api.letsencrypt.org/directory\n}\n`);\n\n\t// ── Per-Service Reverse Proxy Blocks ─────────────────────────────────────\n\n\tfor (const { definition } of resolved.services) {\n\t\t// Skip the proxy service itself\n\t\tif (definition.id === \"caddy\" || definition.id === \"traefik\") continue;\n\n\t\tconst exposedPorts = definition.ports.filter((p) => p.exposed);\n\t\tif (exposedPorts.length === 0) continue;\n\n\t\t// Use the first exposed port as the primary route target\n\t\tconst primaryPort = exposedPorts[0]!;\n\t\tconst subdomain = `${definition.id}.${domain}`;\n\n\t\tconst block = [\n\t\t\t`# ${definition.icon} ${definition.name}`,\n\t\t\t`# ${definition.description}`,\n\t\t\t`${subdomain} {`,\n\t\t\t`\treverse_proxy ${definition.id}:${primaryPort.container} {`,\n\t\t\t`\t\theader_up Host {host}`,\n\t\t\t`\t\theader_up X-Real-IP {remote_host}`,\n\t\t\t`\t\theader_up X-Forwarded-For {remote_host}`,\n\t\t\t`\t\theader_up X-Forwarded-Proto {scheme}`,\n\t\t\t`\t}`,\n\t\t];\n\n\t\t// Add health check if service has one\n\t\tif (definition.healthcheck) {\n\t\t\tblock.push(\"\");\n\t\t\tblock.push(`\t# Health check`);\n\t\t\tblock.push(`\thandle /health {`);\n\t\t\tblock.push(`\t\treverse_proxy ${definition.id}:${primaryPort.container}`);\n\t\t\tblock.push(`\t}`);\n\t\t}\n\n\t\tblock.push(`}`);\n\t\tblock.push(\"\");\n\n\t\t// If there are additional exposed ports, add them as separate entries\n\t\tfor (let i = 1; i < exposedPorts.length; i++) {\n\t\t\tconst port = exposedPorts[i]!;\n\t\t\tconst portSubdomain = `${definition.id}-${port.description\n\t\t\t\t.toLowerCase()\n\t\t\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t\t\t.replace(/-+$/, \"\")}.${domain}`;\n\n\t\t\tblock.push(`# ${definition.name} — ${port.description}`);\n\t\t\tblock.push(`${portSubdomain} {`);\n\t\t\tblock.push(`\treverse_proxy ${definition.id}:${port.container}`);\n\t\t\tblock.push(`}`);\n\t\t\tblock.push(\"\");\n\t\t}\n\n\t\tsections.push(block.join(\"\\n\"));\n\t}\n\n\t// ── Fallback / Root Domain ──────────────────────────────────────────────\n\n\tsections.push(`# Root domain — serves the OpenClaw gateway\n${domain} {\n\treverse_proxy openclaw:18789 {\n\t\theader_up Host {host}\n\t\theader_up X-Real-IP {remote_host}\n\t\theader_up X-Forwarded-For {remote_host}\n\t\theader_up X-Forwarded-Proto {scheme}\n\t}\n}\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgB,kBAAkB,UAA0B,QAAwB;CACnF,MAAM,WAAqB,EAAE;AAI7B,UAAS,KAAK;;YAEH,OAAO;;;;;eAKJ,OAAO;;;EAGpB;AAID,MAAK,MAAM,EAAE,gBAAgB,SAAS,UAAU;AAE/C,MAAI,WAAW,OAAO,WAAW,WAAW,OAAO,UAAW;EAE9D,MAAM,eAAe,WAAW,MAAM,QAAQ,MAAM,EAAE,QAAQ;AAC9D,MAAI,aAAa,WAAW,EAAG;EAG/B,MAAM,cAAc,aAAa;EACjC,MAAM,YAAY,GAAG,WAAW,GAAG,GAAG;EAEtC,MAAM,QAAQ;GACb,KAAK,WAAW,KAAK,GAAG,WAAW;GACnC,KAAK,WAAW;GAChB,GAAG,UAAU;GACb,kBAAkB,WAAW,GAAG,GAAG,YAAY,UAAU;GACzD;GACA;GACA;GACA;GACA;GACA;AAGD,MAAI,WAAW,aAAa;AAC3B,SAAM,KAAK,GAAG;AACd,SAAM,KAAK,kBAAkB;AAC7B,SAAM,KAAK,oBAAoB;AAC/B,SAAM,KAAK,mBAAmB,WAAW,GAAG,GAAG,YAAY,YAAY;AACvE,SAAM,KAAK,KAAK;;AAGjB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,GAAG;AAGd,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;GAC7C,MAAM,OAAO,aAAa;GAC1B,MAAM,gBAAgB,GAAG,WAAW,GAAG,GAAG,KAAK,YAC7C,aAAa,CACb,QAAQ,eAAe,IAAI,CAC3B,QAAQ,OAAO,GAAG,CAAC,GAAG;AAExB,SAAM,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,cAAc;AACxD,SAAM,KAAK,GAAG,cAAc,IAAI;AAChC,SAAM,KAAK,kBAAkB,WAAW,GAAG,GAAG,KAAK,YAAY;AAC/D,SAAM,KAAK,IAAI;AACf,SAAM,KAAK,GAAG;;AAGf,WAAS,KAAK,MAAM,KAAK,KAAK,CAAC;;AAKhC,UAAS,KAAK;EACb,OAAO;;;;;;;;EAQP;AAED,QAAO,SAAS,KAAK,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"caddy.d.mts","names":[],"sources":["../../src/generators/caddy.ts"],"mappings":";;;;;AAYA;;;;;;;;iBAAgB,iBAAA,CAAkB,QAAA,EAAU,cAAA,EAAgB,MAAA"}
1
+ {"version":3,"file":"caddy.d.mts","names":[],"sources":["../../src/generators/caddy.ts"],"mappings":";;;;;;AAYA;;;;;;;iBAAgB,iBAAA,CAAkB,QAAA,EAAU,cAAA,EAAgB,MAAA"}
@@ -71,7 +71,7 @@ ${domain} {
71
71
  `);
72
72
  return sections.join("\n");
73
73
  }
74
-
75
74
  //#endregion
76
75
  export { generateCaddyfile };
76
+
77
77
  //# sourceMappingURL=caddy.mjs.map
@@ -1,6 +1,5 @@
1
- const require_vi_2VT5v0um = require('../vi.2VT5v0um-BmRMvymT.cjs');
2
- const require_generate = require('../generate.cjs');
3
-
1
+ const require_vi_2VT5v0um = require("../vi.2VT5v0um-CRqXre87.cjs");
2
+ const require_generate = require("../generate.cjs");
4
3
  //#region src/generators/caddy.test.ts
5
4
  require_vi_2VT5v0um.describe("generateCaddyfile (via generate)", () => {
6
5
  const baseInput = {
@@ -39,6 +38,6 @@ require_vi_2VT5v0um.describe("generateCaddyfile (via generate)", () => {
39
38
  require_vi_2VT5v0um.globalExpect(caddyfile.length).toBeGreaterThan(50);
40
39
  });
41
40
  });
42
-
43
41
  //#endregion
42
+
44
43
  //# sourceMappingURL=caddy.test.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"caddy.test.cjs","names":["describe","generate"],"sources":["../../src/generators/caddy.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateCaddyfile (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"caddy-test\",\n\t\tservices: [\"redis\", \"n8n\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"caddy\" as const,\n\t\tdomain: \"example.com\",\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates Caddyfile when proxy is caddy\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"does not generate Caddyfile when proxy is none\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tproxy: \"none\",\n\t\t});\n\n\t\texpect(result.files).not.toHaveProperty(\"caddy/Caddyfile\");\n\t});\n\n\tit(\"Caddyfile contains the domain\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\texpect(caddyfile).toContain(\"example.com\");\n\t});\n\n\tit(\"Caddyfile includes reverse proxy directives for services with exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Should reference n8n since it has exposed ports\n\t\texpect(caddyfile).toContain(\"n8n\");\n\t});\n\n\tit(\"Caddyfile includes TLS configuration\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Caddy auto-enables TLS, so should reference HTTPS or TLS\n\t\texpect(caddyfile.length).toBeGreaterThan(50);\n\t});\n});\n"],"mappings":";;;;AAGAA,6BAAS,0CAA0C;CAClD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,MAAM;EAC1B,YAAY,EAAE;EACd,OAAO;EACP,QAAQ;EACR,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,wBAAG,iDAAiD;EACnD,MAAM,SAASC,0BAAS,UAAU;AAElC,mCAAO,OAAO,MAAM,CAAC,eAAe,kBAAkB;AACtD,mCAAO,OAAO,MAAM,mBAAoB,OAAO,CAAC,gBAAgB,EAAE;GACjE;AAEF,wBAAG,wDAAwD;AAM1D,mCALeA,0BAAS;GACvB,GAAG;GACH,OAAO;GACP,CAAC,CAEY,MAAM,CAAC,IAAI,eAAe,kBAAkB;GACzD;AAEF,wBAAG,uCAAuC;EAEzC,MAAM,YADSA,0BAAS,UAAU,CACT,MAAM;AAE/B,mCAAO,UAAU,CAAC,UAAU,cAAc;GACzC;AAEF,wBAAG,qFAAqF;EAEvF,MAAM,YADSA,0BAAS,UAAU,CACT,MAAM;AAG/B,mCAAO,UAAU,CAAC,UAAU,MAAM;GACjC;AAEF,wBAAG,8CAA8C;EAEhD,MAAM,YADSA,0BAAS,UAAU,CACT,MAAM;AAG/B,mCAAO,UAAU,OAAO,CAAC,gBAAgB,GAAG;GAC3C;EACD"}
1
+ {"version":3,"file":"caddy.test.cjs","names":["describe","generate"],"sources":["../../src/generators/caddy.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateCaddyfile (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"caddy-test\",\n\t\tservices: [\"redis\", \"n8n\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"caddy\" as const,\n\t\tdomain: \"example.com\",\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates Caddyfile when proxy is caddy\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"does not generate Caddyfile when proxy is none\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tproxy: \"none\",\n\t\t});\n\n\t\texpect(result.files).not.toHaveProperty(\"caddy/Caddyfile\");\n\t});\n\n\tit(\"Caddyfile contains the domain\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\texpect(caddyfile).toContain(\"example.com\");\n\t});\n\n\tit(\"Caddyfile includes reverse proxy directives for services with exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Should reference n8n since it has exposed ports\n\t\texpect(caddyfile).toContain(\"n8n\");\n\t});\n\n\tit(\"Caddyfile includes TLS configuration\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Caddy auto-enables TLS, so should reference HTTPS or TLS\n\t\texpect(caddyfile.length).toBeGreaterThan(50);\n\t});\n});\n"],"mappings":";;;AAGAA,oBAAAA,SAAS,0CAA0C;CAClD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,MAAM;EAC1B,YAAY,EAAE;EACd,OAAO;EACP,QAAQ;EACR,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,qBAAA,GAAG,iDAAiD;EACnD,MAAM,SAASC,iBAAAA,SAAS,UAAU;AAElC,sBAAA,aAAO,OAAO,MAAM,CAAC,eAAe,kBAAkB;AACtD,sBAAA,aAAO,OAAO,MAAM,mBAAoB,OAAO,CAAC,gBAAgB,EAAE;GACjE;AAEF,qBAAA,GAAG,wDAAwD;AAM1D,sBAAA,aALeA,iBAAAA,SAAS;GACvB,GAAG;GACH,OAAO;GACP,CAAC,CAEY,MAAM,CAAC,IAAI,eAAe,kBAAkB;GACzD;AAEF,qBAAA,GAAG,uCAAuC;EAEzC,MAAM,YADSA,iBAAAA,SAAS,UAAU,CACT,MAAM;AAE/B,sBAAA,aAAO,UAAU,CAAC,UAAU,cAAc;GACzC;AAEF,qBAAA,GAAG,qFAAqF;EAEvF,MAAM,YADSA,iBAAAA,SAAS,UAAU,CACT,MAAM;AAG/B,sBAAA,aAAO,UAAU,CAAC,UAAU,MAAM;GACjC;AAEF,qBAAA,GAAG,8CAA8C;EAEhD,MAAM,YADSA,iBAAAA,SAAS,UAAU,CACT,MAAM;AAG/B,sBAAA,aAAO,UAAU,OAAO,CAAC,gBAAgB,GAAG;GAC3C;EACD"}
@@ -1,6 +1,5 @@
1
- import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-CFyDIn0m.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-DvC3SVNc.mjs";
2
2
  import { generate } from "../generate.mjs";
3
-
4
3
  //#region src/generators/caddy.test.ts
5
4
  describe("generateCaddyfile (via generate)", () => {
6
5
  const baseInput = {
@@ -39,7 +38,7 @@ describe("generateCaddyfile (via generate)", () => {
39
38
  globalExpect(caddyfile.length).toBeGreaterThan(50);
40
39
  });
41
40
  });
42
-
43
41
  //#endregion
44
- export { };
42
+ export {};
43
+
45
44
  //# sourceMappingURL=caddy.test.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"caddy.test.mjs","names":[],"sources":["../../src/generators/caddy.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateCaddyfile (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"caddy-test\",\n\t\tservices: [\"redis\", \"n8n\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"caddy\" as const,\n\t\tdomain: \"example.com\",\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates Caddyfile when proxy is caddy\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"does not generate Caddyfile when proxy is none\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tproxy: \"none\",\n\t\t});\n\n\t\texpect(result.files).not.toHaveProperty(\"caddy/Caddyfile\");\n\t});\n\n\tit(\"Caddyfile contains the domain\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\texpect(caddyfile).toContain(\"example.com\");\n\t});\n\n\tit(\"Caddyfile includes reverse proxy directives for services with exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Should reference n8n since it has exposed ports\n\t\texpect(caddyfile).toContain(\"n8n\");\n\t});\n\n\tit(\"Caddyfile includes TLS configuration\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Caddy auto-enables TLS, so should reference HTTPS or TLS\n\t\texpect(caddyfile.length).toBeGreaterThan(50);\n\t});\n});\n"],"mappings":";;;;AAGA,SAAS,0CAA0C;CAClD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,MAAM;EAC1B,YAAY,EAAE;EACd,OAAO;EACP,QAAQ;EACR,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,IAAG,iDAAiD;EACnD,MAAM,SAAS,SAAS,UAAU;AAElC,eAAO,OAAO,MAAM,CAAC,eAAe,kBAAkB;AACtD,eAAO,OAAO,MAAM,mBAAoB,OAAO,CAAC,gBAAgB,EAAE;GACjE;AAEF,IAAG,wDAAwD;AAM1D,eALe,SAAS;GACvB,GAAG;GACH,OAAO;GACP,CAAC,CAEY,MAAM,CAAC,IAAI,eAAe,kBAAkB;GACzD;AAEF,IAAG,uCAAuC;EAEzC,MAAM,YADS,SAAS,UAAU,CACT,MAAM;AAE/B,eAAO,UAAU,CAAC,UAAU,cAAc;GACzC;AAEF,IAAG,qFAAqF;EAEvF,MAAM,YADS,SAAS,UAAU,CACT,MAAM;AAG/B,eAAO,UAAU,CAAC,UAAU,MAAM;GACjC;AAEF,IAAG,8CAA8C;EAEhD,MAAM,YADS,SAAS,UAAU,CACT,MAAM;AAG/B,eAAO,UAAU,OAAO,CAAC,gBAAgB,GAAG;GAC3C;EACD"}
1
+ {"version":3,"file":"caddy.test.mjs","names":[],"sources":["../../src/generators/caddy.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateCaddyfile (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"caddy-test\",\n\t\tservices: [\"redis\", \"n8n\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"caddy\" as const,\n\t\tdomain: \"example.com\",\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates Caddyfile when proxy is caddy\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"does not generate Caddyfile when proxy is none\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tproxy: \"none\",\n\t\t});\n\n\t\texpect(result.files).not.toHaveProperty(\"caddy/Caddyfile\");\n\t});\n\n\tit(\"Caddyfile contains the domain\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\texpect(caddyfile).toContain(\"example.com\");\n\t});\n\n\tit(\"Caddyfile includes reverse proxy directives for services with exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Should reference n8n since it has exposed ports\n\t\texpect(caddyfile).toContain(\"n8n\");\n\t});\n\n\tit(\"Caddyfile includes TLS configuration\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst caddyfile = result.files[\"caddy/Caddyfile\"]!;\n\n\t\t// Caddy auto-enables TLS, so should reference HTTPS or TLS\n\t\texpect(caddyfile.length).toBeGreaterThan(50);\n\t});\n});\n"],"mappings":";;;AAGA,SAAS,0CAA0C;CAClD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,MAAM;EAC1B,YAAY,EAAE;EACd,OAAO;EACP,QAAQ;EACR,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,IAAG,iDAAiD;EACnD,MAAM,SAAS,SAAS,UAAU;AAElC,eAAO,OAAO,MAAM,CAAC,eAAe,kBAAkB;AACtD,eAAO,OAAO,MAAM,mBAAoB,OAAO,CAAC,gBAAgB,EAAE;GACjE;AAEF,IAAG,wDAAwD;AAM1D,eALe,SAAS;GACvB,GAAG;GACH,OAAO;GACP,CAAC,CAEY,MAAM,CAAC,IAAI,eAAe,kBAAkB;GACzD;AAEF,IAAG,uCAAuC;EAEzC,MAAM,YADS,SAAS,UAAU,CACT,MAAM;AAE/B,eAAO,UAAU,CAAC,UAAU,cAAc;GACzC;AAEF,IAAG,qFAAqF;EAEvF,MAAM,YADS,SAAS,UAAU,CACT,MAAM;AAG/B,eAAO,UAAU,CAAC,UAAU,MAAM;GACjC;AAEF,IAAG,8CAA8C;EAEhD,MAAM,YADS,SAAS,UAAU,CACT,MAAM;AAG/B,eAAO,UAAU,OAAO,CAAC,gBAAgB,GAAG;GAC3C;EACD"}
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/generators/cloud-init.ts
4
3
  /**
5
4
  * Generates a cloud-init.yml file for deploying the stack to a VPS.
@@ -126,7 +125,7 @@ runcmd:
126
125
  final_message: "OpenClaw stack '${options.projectName}' is ready! Connect to port ${gatewayPort}."
127
126
  `;
128
127
  }
129
-
130
128
  //#endregion
131
129
  exports.generateCloudInit = generateCloudInit;
130
+
132
131
  //# sourceMappingURL=cloud-init.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-init.cjs","names":[],"sources":["../../src/generators/cloud-init.ts"],"sourcesContent":["/**\n * Generates a cloud-init.yml file for deploying the stack to a VPS.\n * Compatible with Hetzner, DigitalOcean, Vultr, Linode, and any provider\n * that supports cloud-init user data.\n *\n * Based on the patterns from openclaw_docker-setup.sh and openclaw_install.sh:\n * 1. Installs Docker via the official convenience script\n * 2. Adds the default user to the docker group\n * 3. Verifies Docker Compose v2 plugin is available\n * 4. Creates /opt/openclaw/ with config, workspace, and identity directories\n * 5. Writes docker-compose.yml and .env inline (env with restrictive 0600 perms)\n * 6. Starts the stack with docker compose up -d\n * 7. Polls the gateway health endpoint until it responds (up to 120s)\n * 8. Logs all operations to /opt/openclaw/deploy.log\n */\nexport function generateCloudInit(options: {\n\tcomposeYaml: string;\n\tenvContent: string;\n\tprojectName: string;\n\tgatewayPort?: number;\n}): string {\n\tconst gatewayPort = options.gatewayPort ?? 18789;\n\n\t// Escape content for cloud-init write_files (indent by 8 spaces)\n\tconst indentContent = (content: string) =>\n\t\tcontent\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => ` ${line}`)\n\t\t\t.join(\"\\n\");\n\n\treturn `#cloud-config\n# Cloud-init for ${options.projectName}\n# Generated by better-openclaw\n# Compatible with: Hetzner, DigitalOcean, Vultr, Linode, AWS, GCP\n\npackage_update: true\n\npackages:\n - curl\n - git\n - ca-certificates\n - gnupg\n\nwrite_files:\n - path: /opt/openclaw/docker-compose.yml\n permissions: \"0644\"\n content: |\n${indentContent(options.composeYaml)}\n\n - path: /opt/openclaw/.env\n permissions: \"0600\"\n content: |\n${indentContent(options.envContent)}\n\n - path: /opt/openclaw/deploy.sh\n permissions: \"0755\"\n content: |\n #!/usr/bin/env bash\n # OpenClaw deployment script — runs as runcmd via cloud-init\n # All output logged to /opt/openclaw/deploy.log\n set -euo pipefail\n exec > >(tee -a /opt/openclaw/deploy.log) 2>&1\n echo \"==> [$(date -u +%Y-%m-%dT%H:%M:%SZ)] Starting OpenClaw deployment\"\n\n # Install Docker via official convenience script\n echo \"==> Installing Docker\"\n curl -fsSL https://get.docker.com | sh\n\n # Enable and start Docker daemon\n systemctl enable docker\n systemctl start docker\n\n # Add default user to docker group (cloud providers commonly use 'ubuntu' or 'root')\n DEFAULT_USER=\"\\${SUDO_USER:-$(logname 2>/dev/null || echo root)}\"\n if [ \"$DEFAULT_USER\" != \"root\" ]; then\n usermod -aG docker \"$DEFAULT_USER\"\n echo \"==> Added $DEFAULT_USER to docker group\"\n fi\n\n # Verify Docker Compose v2 plugin\n if ! docker compose version >/dev/null 2>&1; then\n echo \"ERROR: Docker Compose v2 plugin not available\" >&2\n exit 1\n fi\n echo \"==> Docker Compose: $(docker compose version)\"\n\n # Create openclaw directories (matching docker-setup.sh structure)\n # config: gateway config files (openclaw.json)\n # workspace: agent workspace and data\n # identity: device identity for Docker Desktop/Windows bind mount compat\n mkdir -p /opt/openclaw/openclaw/config\n mkdir -p /opt/openclaw/openclaw/workspace\n mkdir -p /opt/openclaw/openclaw/config/identity\n\n # Start the stack\n echo \"==> Starting stack\"\n cd /opt/openclaw\n docker compose up -d\n\n # Health check: poll gateway until it responds (up to 120 seconds)\n echo \"==> Waiting for gateway health check on port ${gatewayPort}\"\n RETRIES=60\n while [ \"$RETRIES\" -gt 0 ]; do\n if curl -sf \"http://127.0.0.1:${gatewayPort}\" >/dev/null 2>&1; then\n echo \"==> Gateway is healthy\"\n break\n fi\n RETRIES=$((RETRIES - 1))\n sleep 2\n done\n\n if [ \"$RETRIES\" -eq 0 ]; then\n echo \"WARNING: Gateway did not respond within 120s. Check logs with:\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml logs -f openclaw-gateway\"\n fi\n\n # Print summary\n echo \"\"\n echo \"==> Deployment complete at $(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n echo \" Project: ${options.projectName}\"\n echo \" Gateway: http://$(hostname -I | awk '{print $1}'):${gatewayPort}\"\n echo \"\"\n echo \"Useful commands:\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml logs -f\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml ps\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml restart\"\n echo \"\"\n echo \"Channel setup (optional):\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml run --rm openclaw-cli channels login\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml run --rm openclaw-cli channels add --channel telegram --token <TOKEN>\"\n\nruncmd:\n - /opt/openclaw/deploy.sh\n\nfinal_message: \"OpenClaw stack '${options.projectName}' is ready! Connect to port ${gatewayPort}.\"\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAeA,SAAgB,kBAAkB,SAKvB;CACV,MAAM,cAAc,QAAQ,eAAe;CAG3C,MAAM,iBAAiB,YACtB,QACE,MAAM,KAAK,CACX,KAAK,SAAS,WAAW,OAAO,CAChC,KAAK,KAAK;AAEb,QAAO;mBACW,QAAQ,YAAY;;;;;;;;;;;;;;;;EAgBrC,cAAc,QAAQ,YAAY,CAAC;;;;;EAKnC,cAAc,QAAQ,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DAgDyB,YAAY;;;0CAG/B,YAAY;;;;;;;;;;;;;;;;6BAgBzB,QAAQ,YAAY;sEACqB,YAAY;;;;;;;;;;;;;;kCAchD,QAAQ,YAAY,8BAA8B,YAAY"}
1
+ {"version":3,"file":"cloud-init.cjs","names":[],"sources":["../../src/generators/cloud-init.ts"],"sourcesContent":["/**\n * Generates a cloud-init.yml file for deploying the stack to a VPS.\n * Compatible with Hetzner, DigitalOcean, Vultr, Linode, and any provider\n * that supports cloud-init user data.\n *\n * Based on the patterns from openclaw_docker-setup.sh and openclaw_install.sh:\n * 1. Installs Docker via the official convenience script\n * 2. Adds the default user to the docker group\n * 3. Verifies Docker Compose v2 plugin is available\n * 4. Creates /opt/openclaw/ with config, workspace, and identity directories\n * 5. Writes docker-compose.yml and .env inline (env with restrictive 0600 perms)\n * 6. Starts the stack with docker compose up -d\n * 7. Polls the gateway health endpoint until it responds (up to 120s)\n * 8. Logs all operations to /opt/openclaw/deploy.log\n */\nexport function generateCloudInit(options: {\n\tcomposeYaml: string;\n\tenvContent: string;\n\tprojectName: string;\n\tgatewayPort?: number;\n}): string {\n\tconst gatewayPort = options.gatewayPort ?? 18789;\n\n\t// Escape content for cloud-init write_files (indent by 8 spaces)\n\tconst indentContent = (content: string) =>\n\t\tcontent\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => ` ${line}`)\n\t\t\t.join(\"\\n\");\n\n\treturn `#cloud-config\n# Cloud-init for ${options.projectName}\n# Generated by better-openclaw\n# Compatible with: Hetzner, DigitalOcean, Vultr, Linode, AWS, GCP\n\npackage_update: true\n\npackages:\n - curl\n - git\n - ca-certificates\n - gnupg\n\nwrite_files:\n - path: /opt/openclaw/docker-compose.yml\n permissions: \"0644\"\n content: |\n${indentContent(options.composeYaml)}\n\n - path: /opt/openclaw/.env\n permissions: \"0600\"\n content: |\n${indentContent(options.envContent)}\n\n - path: /opt/openclaw/deploy.sh\n permissions: \"0755\"\n content: |\n #!/usr/bin/env bash\n # OpenClaw deployment script — runs as runcmd via cloud-init\n # All output logged to /opt/openclaw/deploy.log\n set -euo pipefail\n exec > >(tee -a /opt/openclaw/deploy.log) 2>&1\n echo \"==> [$(date -u +%Y-%m-%dT%H:%M:%SZ)] Starting OpenClaw deployment\"\n\n # Install Docker via official convenience script\n echo \"==> Installing Docker\"\n curl -fsSL https://get.docker.com | sh\n\n # Enable and start Docker daemon\n systemctl enable docker\n systemctl start docker\n\n # Add default user to docker group (cloud providers commonly use 'ubuntu' or 'root')\n DEFAULT_USER=\"\\${SUDO_USER:-$(logname 2>/dev/null || echo root)}\"\n if [ \"$DEFAULT_USER\" != \"root\" ]; then\n usermod -aG docker \"$DEFAULT_USER\"\n echo \"==> Added $DEFAULT_USER to docker group\"\n fi\n\n # Verify Docker Compose v2 plugin\n if ! docker compose version >/dev/null 2>&1; then\n echo \"ERROR: Docker Compose v2 plugin not available\" >&2\n exit 1\n fi\n echo \"==> Docker Compose: $(docker compose version)\"\n\n # Create openclaw directories (matching docker-setup.sh structure)\n # config: gateway config files (openclaw.json)\n # workspace: agent workspace and data\n # identity: device identity for Docker Desktop/Windows bind mount compat\n mkdir -p /opt/openclaw/openclaw/config\n mkdir -p /opt/openclaw/openclaw/workspace\n mkdir -p /opt/openclaw/openclaw/config/identity\n\n # Start the stack\n echo \"==> Starting stack\"\n cd /opt/openclaw\n docker compose up -d\n\n # Health check: poll gateway until it responds (up to 120 seconds)\n echo \"==> Waiting for gateway health check on port ${gatewayPort}\"\n RETRIES=60\n while [ \"$RETRIES\" -gt 0 ]; do\n if curl -sf \"http://127.0.0.1:${gatewayPort}\" >/dev/null 2>&1; then\n echo \"==> Gateway is healthy\"\n break\n fi\n RETRIES=$((RETRIES - 1))\n sleep 2\n done\n\n if [ \"$RETRIES\" -eq 0 ]; then\n echo \"WARNING: Gateway did not respond within 120s. Check logs with:\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml logs -f openclaw-gateway\"\n fi\n\n # Print summary\n echo \"\"\n echo \"==> Deployment complete at $(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n echo \" Project: ${options.projectName}\"\n echo \" Gateway: http://$(hostname -I | awk '{print $1}'):${gatewayPort}\"\n echo \"\"\n echo \"Useful commands:\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml logs -f\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml ps\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml restart\"\n echo \"\"\n echo \"Channel setup (optional):\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml run --rm openclaw-cli channels login\"\n echo \" docker compose -f /opt/openclaw/docker-compose.yml run --rm openclaw-cli channels add --channel telegram --token <TOKEN>\"\n\nruncmd:\n - /opt/openclaw/deploy.sh\n\nfinal_message: \"OpenClaw stack '${options.projectName}' is ready! Connect to port ${gatewayPort}.\"\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAeA,SAAgB,kBAAkB,SAKvB;CACV,MAAM,cAAc,QAAQ,eAAe;CAG3C,MAAM,iBAAiB,YACtB,QACE,MAAM,KAAK,CACX,KAAK,SAAS,WAAW,OAAO,CAChC,KAAK,KAAK;AAEb,QAAO;mBACW,QAAQ,YAAY;;;;;;;;;;;;;;;;EAgBrC,cAAc,QAAQ,YAAY,CAAC;;;;;EAKnC,cAAc,QAAQ,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DAgDyB,YAAY;;;0CAG/B,YAAY;;;;;;;;;;;;;;;;6BAgBzB,QAAQ,YAAY;sEACqB,YAAY;;;;;;;;;;;;;;kCAchD,QAAQ,YAAY,8BAA8B,YAAY"}
@@ -124,7 +124,7 @@ runcmd:
124
124
  final_message: "OpenClaw stack '${options.projectName}' is ready! Connect to port ${gatewayPort}."
125
125
  `;
126
126
  }
127
-
128
127
  //#endregion
129
128
  export { generateCloudInit };
129
+
130
130
  //# sourceMappingURL=cloud-init.mjs.map
@@ -1,8 +1,7 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-C0xms8kb.cjs');
3
- const require_generators_postgres_init = require('./postgres-init.cjs');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../skills-BlzpHmpH.cjs");
3
+ const require_generators_postgres_init = require("./postgres-init.cjs");
4
4
  let node_crypto = require("node:crypto");
5
-
6
5
  //#region src/generators/env.ts
7
6
  /**
8
7
  * Generates `.env.example` and `.env` file contents from resolved services.
@@ -318,8 +317,8 @@ function getStructuredEnvVars(resolved) {
318
317
  }
319
318
  return groups;
320
319
  }
321
-
322
320
  //#endregion
323
321
  exports.generateEnvFiles = generateEnvFiles;
324
322
  exports.getStructuredEnvVars = getStructuredEnvVars;
323
+
325
324
  //# sourceMappingURL=env.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.cjs","names":["getDbRequirements"],"sources":["../../src/generators/env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { ResolverOutput } from \"../types.js\";\nimport { getDbRequirements } from \"./postgres-init.js\";\n\n/**\n * Options for environment file generation.\n */\nexport interface EnvGeneratorOptions {\n\tgenerateSecrets: boolean;\n\tdomain?: string;\n\topenclawVersion?: string;\n\t/** When set, host-like vars (e.g. REDIS_HOST) for these services use host.docker.internal so gateway in Docker can reach native services on host. */\n\tnativeServiceIds?: Set<string>;\n\t/** Compose file names for COMPOSE_FILE env var (enables `docker compose up` without -f flags). */\n\tcomposeFiles?: string[];\n\t/** Compose profiles for COMPOSE_PROFILES env var (enables `docker compose up` without --profile flags). */\n\tcomposeProfiles?: string[];\n\t/** OpenClaw image variant (official, coolify, alpine). */\n\topenclawImage?: \"official\" | \"coolify\" | \"alpine\";\n}\n\n/**\n * Generates `.env.example` and `.env` file contents from resolved services.\n *\n * - `.env.example`: every env var with descriptive comments, placeholders for secrets\n * - `.env`: same vars but secrets filled with cryptographically random values when generateSecrets is true\n */\nexport function generateEnvFiles(\n\tresolved: ResolverOutput,\n\toptions: EnvGeneratorOptions,\n): { envExample: string; env: string } {\n\tconst version = options.openclawVersion ?? \"latest\";\n\tconst lines: { comment: string; key: string; exampleValue: string; actualValue: string }[] = [];\n\n\t// Track all env var values for resolving references later\n\tconst envVarValues = new Map<string, string>();\n\n\t// ── Docker Compose convenience vars ─────────────────────────────────────\n\t// These let you run `docker compose up -d` without -f and --profile flags.\n\n\tif (options.composeFiles && options.composeFiles.length > 0) {\n\t\tconst separator = process.platform === \"win32\" ? \";\" : \":\";\n\t\tconst composeFileValue = options.composeFiles.join(separator);\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Compose files to load (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_FILE\",\n\t\t\texampleValue: composeFileValue,\n\t\t\tactualValue: composeFileValue,\n\t\t});\n\t}\n\n\tif (options.composeProfiles && options.composeProfiles.length > 0) {\n\t\tconst profilesValue = options.composeProfiles.join(\",\");\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Profiles to activate (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_PROFILES\",\n\t\t\texampleValue: profilesValue,\n\t\t\tactualValue: profilesValue,\n\t\t});\n\t}\n\n\t// ── Base OpenClaw Variables ──────────────────────────────────────────────\n\n\tlines.push({\n\t\tcomment: formatComment(\"OpenClaw version to deploy\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_VERSION\",\n\t\texampleValue: version,\n\t\tactualValue: version,\n\t});\n\n\tconst gatewayToken = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Authentication token for the OpenClaw gateway API\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\texampleValue: \"your_gateway_token_here\",\n\t\tactualValue: gatewayToken,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\"Port the OpenClaw gateway listens on\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\texampleValue: \"18789\",\n\t\tactualValue: \"18789\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Port for the OpenClaw ACP bridge (WebSocket)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_BRIDGE_PORT\",\n\t\texampleValue: \"18790\",\n\t\tactualValue: \"18790\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Gateway network bind mode: 'lan' (all interfaces, required for Docker). Use 'loopback' only for native (non-Docker) installs with Tailscale serve/funnel\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_BIND\",\n\t\texampleValue: \"lan\",\n\t\tactualValue: \"lan\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw configuration directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_CONFIG_DIR\",\n\t\texampleValue: \"./openclaw/config\",\n\t\tactualValue: \"./openclaw/config\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw workspace directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_WORKSPACE_DIR\",\n\t\texampleValue: \"./openclaw/workspace\",\n\t\tactualValue: \"./openclaw/workspace\",\n\t});\n\n\t// Set OPENCLAW_IMAGE based on variant (empty = use compose default)\n\tconst imageVariantMap: Record<string, string> = {\n\t\tofficial: \"\", // use compose default (ghcr.io/openclaw/openclaw:VERSION)\n\t\tcoolify: \"coollabsio/openclaw:latest\",\n\t\talpine: \"alpine/openclaw:latest\",\n\t};\n\tconst imageValue = imageVariantMap[options.openclawImage ?? \"official\"] ?? \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t`OpenClaw Docker image variant: ${options.openclawImage ?? \"official\"} (official, coolify, alpine)`,\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_IMAGE\",\n\t\texampleValue: \"\",\n\t\tactualValue: imageValue,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra bind mounts for gateway and CLI containers (comma-separated, format: source:target[:options])\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_EXTRA_MOUNTS\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Named volume or host path for /home/node persistence across container restarts\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_HOME_VOLUME\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra apt packages to install during Docker image build (space-separated)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tif (options.domain) {\n\t\tlines.push({\n\t\t\tcomment: formatComment(\"Primary domain for service routing\", \"OpenClaw Core\", false, false),\n\t\t\tkey: \"OPENCLAW_DOMAIN\",\n\t\t\texampleValue: \"example.com\",\n\t\t\tactualValue: options.domain,\n\t\t});\n\t}\n\n\t// ── AI Provider API Keys ─────────────────────────────────────────────────\n\n\tif (resolved.aiProviders && resolved.aiProviders.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# AI Provider API Keys\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const provider of resolved.aiProviders) {\n\t\t\t// Local-only providers don't need API keys\n\t\t\tif (provider === \"ollama\" || provider === \"lmstudio\" || provider === \"vllm\") continue;\n\n\t\t\t// Ollama Cloud uses OLLAMA_API_KEY (matches Ollama's official env var name)\n\t\t\tconst envKey =\n\t\t\t\tprovider === \"ollama-cloud\" ? \"OLLAMA_API_KEY\" : `${provider.toUpperCase()}_API_KEY`;\n\t\t\tconst label = provider === \"ollama-cloud\" ? \"Ollama Cloud\" : provider;\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(`API Key for ${label} AI models`, \"OpenClaw Core\", true, true),\n\t\t\t\tkey: envKey,\n\t\t\t\texampleValue: `your_${provider.toLowerCase().replace(\"-\", \"_\")}_api_key_here`,\n\t\t\t\tactualValue: \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Claude web-provider session variables (optional)\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Claude Web Provider (optional)\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude AI session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_AI_SESSION_KEY\",\n\t\texampleValue: \"your_claude_ai_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_SESSION_KEY\",\n\t\texampleValue: \"your_claude_web_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web cookie for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_COOKIE\",\n\t\texampleValue: \"your_claude_web_cookie_here\",\n\t\tactualValue: \"\",\n\t});\n\n\t// ── Per-Service Database Passwords ──────────────────────────────────────\n\n\tconst dbReqs = getDbRequirements(resolved);\n\n\tif (dbReqs.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Per-Service Database Passwords\\n# Each service gets its own PostgreSQL database and credentials\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const req of dbReqs) {\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(req.passwordEnvVar, secretValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(\n\t\t\t\t\t`PostgreSQL password for ${req.serviceName} (database: ${req.dbName}, user: ${req.dbUser})`,\n\t\t\t\t\treq.serviceName,\n\t\t\t\t\ttrue,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tkey: req.passwordEnvVar,\n\t\t\t\texampleValue: `your_${req.passwordEnvVar.toLowerCase()}_here`,\n\t\t\t\tactualValue: secretValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Service-Specific Variables ───────────────────────────────────────────\n\n\tconst dbPasswordKeys = dbReqs.map((r) => r.passwordEnvVar);\n\tconst aiProviderKeys = (resolved.aiProviders || []).map((p) => `${p.toUpperCase()}_API_KEY`);\n\tconst seenKeys = new Set<string>([\n\t\t\"OPENCLAW_VERSION\",\n\t\t\"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\"OPENCLAW_GATEWAY_PORT\",\n\t\t\"OPENCLAW_BRIDGE_PORT\",\n\t\t\"OPENCLAW_GATEWAY_BIND\",\n\t\t\"OPENCLAW_CONFIG_DIR\",\n\t\t\"OPENCLAW_WORKSPACE_DIR\",\n\t\t\"OPENCLAW_IMAGE\",\n\t\t\"OPENCLAW_EXTRA_MOUNTS\",\n\t\t\"OPENCLAW_HOME_VOLUME\",\n\t\t\"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\t\"OPENCLAW_DOMAIN\",\n\t\t\"CLAUDE_AI_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_COOKIE\",\n\t\t...dbPasswordKeys,\n\t\t...aiProviderKeys,\n\t]);\n\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tif (allEnvVars.length === 0) continue;\n\n\t\t// Section separator for this service\n\t\tlines.push({\n\t\t\tcomment: `\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# ${definition.icon} ${definition.name}\\n# ═══════════════════════════════════════════════════════════════════════════════`,\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tconst isNative = options.nativeServiceIds?.has(definition.id);\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// For native services, host-like vars must point to host so gateway (in Docker) can reach them\n\t\t\tconst isHostVar = envVar.key.endsWith(\"_HOST\");\n\t\t\tconst hostValue = isNative && isHostVar ? \"host.docker.internal\" : null;\n\n\t\t\tconst exampleValue = hostValue\n\t\t\t\t? hostValue\n\t\t\t\t: envVar.secret\n\t\t\t\t\t? `your_${envVar.key.toLowerCase()}_here`\n\t\t\t\t\t: envVar.defaultValue;\n\n\t\t\tlet actualValue: string;\n\t\t\tif (hostValue) {\n\t\t\t\tactualValue = hostValue;\n\t\t\t} else if (envVar.secret) {\n\t\t\t\t// Resolve env var references like ${N8N_DB_PASSWORD}\n\t\t\t\tif (envVar.defaultValue.startsWith(\"${\") && envVar.defaultValue.endsWith(\"}\")) {\n\t\t\t\t\tconst refKey = envVar.defaultValue.slice(2, -1); // Extract var name from ${VAR_NAME}\n\t\t\t\t\tactualValue = envVarValues.get(refKey) || envVar.defaultValue;\n\t\t\t\t} else {\n\t\t\t\t\tactualValue = secretValue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tactualValue = envVar.defaultValue;\n\t\t\t}\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(envVar.key, actualValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(envVar.description, definition.name, envVar.required, envVar.secret),\n\t\t\t\tkey: envVar.key,\n\t\t\t\texampleValue,\n\t\t\t\tactualValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Build output strings ────────────────────────────────────────────────\n\n\tconst header = [\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"# OpenClaw Environment Configuration\",\n\t\t`# Generated at ${new Date().toISOString()}`,\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tlet envExample = header;\n\tlet env = header;\n\n\tfor (const line of lines) {\n\t\tif (line.key === \"\") {\n\t\t\t// Section comment\n\t\t\tenvExample += `${line.comment}\\n`;\n\t\t\tenv += `${line.comment}\\n`;\n\t\t} else {\n\t\t\tenvExample += `${line.comment}\\n${line.key}=${line.exampleValue}\\n\\n`;\n\t\t\tenv += `${line.comment}\\n${line.key}=${line.actualValue}\\n\\n`;\n\t\t}\n\t}\n\n\treturn { envExample, env };\n}\n\n/**\n * Format a descriptive comment block for an environment variable.\n */\nfunction formatComment(\n\tdescription: string,\n\tserviceName: string,\n\trequired: boolean,\n\tsecret: boolean,\n): string {\n\treturn [\n\t\t`# ${description}`,\n\t\t`# Service: ${serviceName} | Required: ${required ? \"Yes\" : \"No\"} | Secret: ${secret ? \"Yes\" : \"No\"}`,\n\t].join(\"\\n\");\n}\n\n// ── Structured Env Vars ─────────────────────────────────────────────────────\n\nexport interface EnvVarGroup {\n\tserviceName: string;\n\tserviceIcon: string;\n\tserviceId: string;\n\tvars: {\n\t\tkey: string;\n\t\tdescription: string;\n\t\tsecret: boolean;\n\t\trequired: boolean;\n\t\tdefaultValue: string;\n\t}[];\n}\n\n/**\n * Returns environment variables grouped by service, suitable for UI rendering.\n *\n * - First group is always \"OpenClaw Core\" with base variables.\n * - Subsequent groups correspond to each resolved service.\n * - Variables are deduplicated across groups (first occurrence wins).\n */\nexport function getStructuredEnvVars(resolved: ResolverOutput): EnvVarGroup[] {\n\tconst groups: EnvVarGroup[] = [];\n\tconst seenKeys = new Set<string>();\n\n\t// ── OpenClaw Core group ──────────────────────────────────────────────────\n\tconst coreVars: EnvVarGroup[\"vars\"] = [\n\t\t{\n\t\t\tkey: \"OPENCLAW_VERSION\",\n\t\t\tdescription: \"OpenClaw version to deploy\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"latest\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\tdescription: \"Authentication token for the OpenClaw gateway API\",\n\t\t\tsecret: true,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\t\tdescription: \"Port the OpenClaw gateway listens on\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"18789\",\n\t\t},\n\t];\n\n\tfor (const v of coreVars) {\n\t\tseenKeys.add(v.key);\n\t}\n\n\tgroups.push({\n\t\tserviceName: \"OpenClaw Core\",\n\t\tserviceIcon: \"⚙️\",\n\t\tserviceId: \"openclaw-core\",\n\t\tvars: coreVars,\n\t});\n\n\t// ── Per-service groups ───────────────────────────────────────────────────\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tconst vars: EnvVarGroup[\"vars\"] = [];\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tvars.push({\n\t\t\t\tkey: envVar.key,\n\t\t\t\tdescription: envVar.description,\n\t\t\t\tsecret: envVar.secret,\n\t\t\t\trequired: envVar.required,\n\t\t\t\tdefaultValue: envVar.defaultValue,\n\t\t\t});\n\t\t}\n\n\t\tif (vars.length === 0) continue;\n\n\t\tgroups.push({\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t\tserviceId: definition.id,\n\t\t\tvars,\n\t\t});\n\t}\n\n\treturn groups;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"env.cjs","names":["getDbRequirements"],"sources":["../../src/generators/env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { ResolverOutput } from \"../types.js\";\nimport { getDbRequirements } from \"./postgres-init.js\";\n\n/**\n * Options for environment file generation.\n */\nexport interface EnvGeneratorOptions {\n\tgenerateSecrets: boolean;\n\tdomain?: string;\n\topenclawVersion?: string;\n\t/** When set, host-like vars (e.g. REDIS_HOST) for these services use host.docker.internal so gateway in Docker can reach native services on host. */\n\tnativeServiceIds?: Set<string>;\n\t/** Compose file names for COMPOSE_FILE env var (enables `docker compose up` without -f flags). */\n\tcomposeFiles?: string[];\n\t/** Compose profiles for COMPOSE_PROFILES env var (enables `docker compose up` without --profile flags). */\n\tcomposeProfiles?: string[];\n\t/** OpenClaw image variant (official, coolify, alpine). */\n\topenclawImage?: \"official\" | \"coolify\" | \"alpine\";\n}\n\n/**\n * Generates `.env.example` and `.env` file contents from resolved services.\n *\n * - `.env.example`: every env var with descriptive comments, placeholders for secrets\n * - `.env`: same vars but secrets filled with cryptographically random values when generateSecrets is true\n */\nexport function generateEnvFiles(\n\tresolved: ResolverOutput,\n\toptions: EnvGeneratorOptions,\n): { envExample: string; env: string } {\n\tconst version = options.openclawVersion ?? \"latest\";\n\tconst lines: { comment: string; key: string; exampleValue: string; actualValue: string }[] = [];\n\n\t// Track all env var values for resolving references later\n\tconst envVarValues = new Map<string, string>();\n\n\t// ── Docker Compose convenience vars ─────────────────────────────────────\n\t// These let you run `docker compose up -d` without -f and --profile flags.\n\n\tif (options.composeFiles && options.composeFiles.length > 0) {\n\t\tconst separator = process.platform === \"win32\" ? \";\" : \":\";\n\t\tconst composeFileValue = options.composeFiles.join(separator);\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Compose files to load (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_FILE\",\n\t\t\texampleValue: composeFileValue,\n\t\t\tactualValue: composeFileValue,\n\t\t});\n\t}\n\n\tif (options.composeProfiles && options.composeProfiles.length > 0) {\n\t\tconst profilesValue = options.composeProfiles.join(\",\");\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Profiles to activate (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_PROFILES\",\n\t\t\texampleValue: profilesValue,\n\t\t\tactualValue: profilesValue,\n\t\t});\n\t}\n\n\t// ── Base OpenClaw Variables ──────────────────────────────────────────────\n\n\tlines.push({\n\t\tcomment: formatComment(\"OpenClaw version to deploy\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_VERSION\",\n\t\texampleValue: version,\n\t\tactualValue: version,\n\t});\n\n\tconst gatewayToken = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Authentication token for the OpenClaw gateway API\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\texampleValue: \"your_gateway_token_here\",\n\t\tactualValue: gatewayToken,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\"Port the OpenClaw gateway listens on\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\texampleValue: \"18789\",\n\t\tactualValue: \"18789\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Port for the OpenClaw ACP bridge (WebSocket)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_BRIDGE_PORT\",\n\t\texampleValue: \"18790\",\n\t\tactualValue: \"18790\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Gateway network bind mode: 'lan' (all interfaces, required for Docker). Use 'loopback' only for native (non-Docker) installs with Tailscale serve/funnel\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_BIND\",\n\t\texampleValue: \"lan\",\n\t\tactualValue: \"lan\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw configuration directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_CONFIG_DIR\",\n\t\texampleValue: \"./openclaw/config\",\n\t\tactualValue: \"./openclaw/config\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw workspace directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_WORKSPACE_DIR\",\n\t\texampleValue: \"./openclaw/workspace\",\n\t\tactualValue: \"./openclaw/workspace\",\n\t});\n\n\t// Set OPENCLAW_IMAGE based on variant (empty = use compose default)\n\tconst imageVariantMap: Record<string, string> = {\n\t\tofficial: \"\", // use compose default (ghcr.io/openclaw/openclaw:VERSION)\n\t\tcoolify: \"coollabsio/openclaw:latest\",\n\t\talpine: \"alpine/openclaw:latest\",\n\t};\n\tconst imageValue = imageVariantMap[options.openclawImage ?? \"official\"] ?? \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t`OpenClaw Docker image variant: ${options.openclawImage ?? \"official\"} (official, coolify, alpine)`,\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_IMAGE\",\n\t\texampleValue: \"\",\n\t\tactualValue: imageValue,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra bind mounts for gateway and CLI containers (comma-separated, format: source:target[:options])\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_EXTRA_MOUNTS\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Named volume or host path for /home/node persistence across container restarts\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_HOME_VOLUME\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra apt packages to install during Docker image build (space-separated)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tif (options.domain) {\n\t\tlines.push({\n\t\t\tcomment: formatComment(\"Primary domain for service routing\", \"OpenClaw Core\", false, false),\n\t\t\tkey: \"OPENCLAW_DOMAIN\",\n\t\t\texampleValue: \"example.com\",\n\t\t\tactualValue: options.domain,\n\t\t});\n\t}\n\n\t// ── AI Provider API Keys ─────────────────────────────────────────────────\n\n\tif (resolved.aiProviders && resolved.aiProviders.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# AI Provider API Keys\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const provider of resolved.aiProviders) {\n\t\t\t// Local-only providers don't need API keys\n\t\t\tif (provider === \"ollama\" || provider === \"lmstudio\" || provider === \"vllm\") continue;\n\n\t\t\t// Ollama Cloud uses OLLAMA_API_KEY (matches Ollama's official env var name)\n\t\t\tconst envKey =\n\t\t\t\tprovider === \"ollama-cloud\" ? \"OLLAMA_API_KEY\" : `${provider.toUpperCase()}_API_KEY`;\n\t\t\tconst label = provider === \"ollama-cloud\" ? \"Ollama Cloud\" : provider;\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(`API Key for ${label} AI models`, \"OpenClaw Core\", true, true),\n\t\t\t\tkey: envKey,\n\t\t\t\texampleValue: `your_${provider.toLowerCase().replace(\"-\", \"_\")}_api_key_here`,\n\t\t\t\tactualValue: \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Claude web-provider session variables (optional)\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Claude Web Provider (optional)\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude AI session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_AI_SESSION_KEY\",\n\t\texampleValue: \"your_claude_ai_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_SESSION_KEY\",\n\t\texampleValue: \"your_claude_web_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web cookie for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_COOKIE\",\n\t\texampleValue: \"your_claude_web_cookie_here\",\n\t\tactualValue: \"\",\n\t});\n\n\t// ── Per-Service Database Passwords ──────────────────────────────────────\n\n\tconst dbReqs = getDbRequirements(resolved);\n\n\tif (dbReqs.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Per-Service Database Passwords\\n# Each service gets its own PostgreSQL database and credentials\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const req of dbReqs) {\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(req.passwordEnvVar, secretValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(\n\t\t\t\t\t`PostgreSQL password for ${req.serviceName} (database: ${req.dbName}, user: ${req.dbUser})`,\n\t\t\t\t\treq.serviceName,\n\t\t\t\t\ttrue,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tkey: req.passwordEnvVar,\n\t\t\t\texampleValue: `your_${req.passwordEnvVar.toLowerCase()}_here`,\n\t\t\t\tactualValue: secretValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Service-Specific Variables ───────────────────────────────────────────\n\n\tconst dbPasswordKeys = dbReqs.map((r) => r.passwordEnvVar);\n\tconst aiProviderKeys = (resolved.aiProviders || []).map((p) => `${p.toUpperCase()}_API_KEY`);\n\tconst seenKeys = new Set<string>([\n\t\t\"OPENCLAW_VERSION\",\n\t\t\"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\"OPENCLAW_GATEWAY_PORT\",\n\t\t\"OPENCLAW_BRIDGE_PORT\",\n\t\t\"OPENCLAW_GATEWAY_BIND\",\n\t\t\"OPENCLAW_CONFIG_DIR\",\n\t\t\"OPENCLAW_WORKSPACE_DIR\",\n\t\t\"OPENCLAW_IMAGE\",\n\t\t\"OPENCLAW_EXTRA_MOUNTS\",\n\t\t\"OPENCLAW_HOME_VOLUME\",\n\t\t\"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\t\"OPENCLAW_DOMAIN\",\n\t\t\"CLAUDE_AI_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_COOKIE\",\n\t\t...dbPasswordKeys,\n\t\t...aiProviderKeys,\n\t]);\n\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tif (allEnvVars.length === 0) continue;\n\n\t\t// Section separator for this service\n\t\tlines.push({\n\t\t\tcomment: `\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# ${definition.icon} ${definition.name}\\n# ═══════════════════════════════════════════════════════════════════════════════`,\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tconst isNative = options.nativeServiceIds?.has(definition.id);\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// For native services, host-like vars must point to host so gateway (in Docker) can reach them\n\t\t\tconst isHostVar = envVar.key.endsWith(\"_HOST\");\n\t\t\tconst hostValue = isNative && isHostVar ? \"host.docker.internal\" : null;\n\n\t\t\tconst exampleValue = hostValue\n\t\t\t\t? hostValue\n\t\t\t\t: envVar.secret\n\t\t\t\t\t? `your_${envVar.key.toLowerCase()}_here`\n\t\t\t\t\t: envVar.defaultValue;\n\n\t\t\tlet actualValue: string;\n\t\t\tif (hostValue) {\n\t\t\t\tactualValue = hostValue;\n\t\t\t} else if (envVar.secret) {\n\t\t\t\t// Resolve env var references like ${N8N_DB_PASSWORD}\n\t\t\t\tif (envVar.defaultValue.startsWith(\"${\") && envVar.defaultValue.endsWith(\"}\")) {\n\t\t\t\t\tconst refKey = envVar.defaultValue.slice(2, -1); // Extract var name from ${VAR_NAME}\n\t\t\t\t\tactualValue = envVarValues.get(refKey) || envVar.defaultValue;\n\t\t\t\t} else {\n\t\t\t\t\tactualValue = secretValue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tactualValue = envVar.defaultValue;\n\t\t\t}\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(envVar.key, actualValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(envVar.description, definition.name, envVar.required, envVar.secret),\n\t\t\t\tkey: envVar.key,\n\t\t\t\texampleValue,\n\t\t\t\tactualValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Build output strings ────────────────────────────────────────────────\n\n\tconst header = [\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"# OpenClaw Environment Configuration\",\n\t\t`# Generated at ${new Date().toISOString()}`,\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tlet envExample = header;\n\tlet env = header;\n\n\tfor (const line of lines) {\n\t\tif (line.key === \"\") {\n\t\t\t// Section comment\n\t\t\tenvExample += `${line.comment}\\n`;\n\t\t\tenv += `${line.comment}\\n`;\n\t\t} else {\n\t\t\tenvExample += `${line.comment}\\n${line.key}=${line.exampleValue}\\n\\n`;\n\t\t\tenv += `${line.comment}\\n${line.key}=${line.actualValue}\\n\\n`;\n\t\t}\n\t}\n\n\treturn { envExample, env };\n}\n\n/**\n * Format a descriptive comment block for an environment variable.\n */\nfunction formatComment(\n\tdescription: string,\n\tserviceName: string,\n\trequired: boolean,\n\tsecret: boolean,\n): string {\n\treturn [\n\t\t`# ${description}`,\n\t\t`# Service: ${serviceName} | Required: ${required ? \"Yes\" : \"No\"} | Secret: ${secret ? \"Yes\" : \"No\"}`,\n\t].join(\"\\n\");\n}\n\n// ── Structured Env Vars ─────────────────────────────────────────────────────\n\nexport interface EnvVarGroup {\n\tserviceName: string;\n\tserviceIcon: string;\n\tserviceId: string;\n\tvars: {\n\t\tkey: string;\n\t\tdescription: string;\n\t\tsecret: boolean;\n\t\trequired: boolean;\n\t\tdefaultValue: string;\n\t}[];\n}\n\n/**\n * Returns environment variables grouped by service, suitable for UI rendering.\n *\n * - First group is always \"OpenClaw Core\" with base variables.\n * - Subsequent groups correspond to each resolved service.\n * - Variables are deduplicated across groups (first occurrence wins).\n */\nexport function getStructuredEnvVars(resolved: ResolverOutput): EnvVarGroup[] {\n\tconst groups: EnvVarGroup[] = [];\n\tconst seenKeys = new Set<string>();\n\n\t// ── OpenClaw Core group ──────────────────────────────────────────────────\n\tconst coreVars: EnvVarGroup[\"vars\"] = [\n\t\t{\n\t\t\tkey: \"OPENCLAW_VERSION\",\n\t\t\tdescription: \"OpenClaw version to deploy\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"latest\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\tdescription: \"Authentication token for the OpenClaw gateway API\",\n\t\t\tsecret: true,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\t\tdescription: \"Port the OpenClaw gateway listens on\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"18789\",\n\t\t},\n\t];\n\n\tfor (const v of coreVars) {\n\t\tseenKeys.add(v.key);\n\t}\n\n\tgroups.push({\n\t\tserviceName: \"OpenClaw Core\",\n\t\tserviceIcon: \"⚙️\",\n\t\tserviceId: \"openclaw-core\",\n\t\tvars: coreVars,\n\t});\n\n\t// ── Per-service groups ───────────────────────────────────────────────────\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tconst vars: EnvVarGroup[\"vars\"] = [];\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tvars.push({\n\t\t\t\tkey: envVar.key,\n\t\t\t\tdescription: envVar.description,\n\t\t\t\tsecret: envVar.secret,\n\t\t\t\trequired: envVar.required,\n\t\t\t\tdefaultValue: envVar.defaultValue,\n\t\t\t});\n\t\t}\n\n\t\tif (vars.length === 0) continue;\n\n\t\tgroups.push({\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t\tserviceId: definition.id,\n\t\t\tvars,\n\t\t});\n\t}\n\n\treturn groups;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.mts","names":[],"sources":["../../src/generators/env.ts"],"mappings":";;;;;AAOA;UAAiB,mBAAA;EAChB,eAAA;EACA,MAAA;EACA,eAAA;EADA;EAGA,gBAAA,GAAmB,GAAA;EAAnB;EAEA,YAAA;EAAA;EAEA,eAAA;EAEA;EAAA,aAAA;AAAA;AASD;;;;;;AAAA,iBAAgB,gBAAA,CACf,QAAA,EAAU,cAAA,EACV,OAAA,EAAS,mBAAA;EACL,UAAA;EAAoB,GAAA;AAAA;AAAA,UAgaR,WAAA;EAChB,WAAA;EACA,WAAA;EACA,SAAA;EACA,IAAA;IACC,GAAA;IACA,WAAA;IACA,MAAA;IACA,QAAA;IACA,YAAA;EAAA;AAAA;;;;;;AAWF;;iBAAgB,oBAAA,CAAqB,QAAA,EAAU,cAAA,GAAiB,WAAA"}
1
+ {"version":3,"file":"env.d.mts","names":[],"sources":["../../src/generators/env.ts"],"mappings":";;;;;;UAOiB,mBAAA;EAChB,eAAA;EACA,MAAA;EACA,eAAA;EAFA;EAIA,gBAAA,GAAmB,GAAA;EAFnB;EAIA,YAAA;EAFmB;EAInB,eAAA;EAAA;EAEA,aAAA;AAAA;;AASD;;;;;iBAAgB,gBAAA,CACf,QAAA,EAAU,cAAA,EACV,OAAA,EAAS,mBAAA;EACL,UAAA;EAAoB,GAAA;AAAA;AAAA,UAgaR,WAAA;EAChB,WAAA;EACA,WAAA;EACA,SAAA;EACA,IAAA;IACC,GAAA;IACA,WAAA;IACA,MAAA;IACA,QAAA;IACA,YAAA;EAAA;AAAA;;;;;;;AAWF;iBAAgB,oBAAA,CAAqB,QAAA,EAAU,cAAA,GAAiB,WAAA"}
@@ -1,6 +1,5 @@
1
1
  import { getDbRequirements } from "./postgres-init.mjs";
2
2
  import { randomBytes } from "node:crypto";
3
-
4
3
  //#region src/generators/env.ts
5
4
  /**
6
5
  * Generates `.env.example` and `.env` file contents from resolved services.
@@ -316,7 +315,7 @@ function getStructuredEnvVars(resolved) {
316
315
  }
317
316
  return groups;
318
317
  }
319
-
320
318
  //#endregion
321
319
  export { generateEnvFiles, getStructuredEnvVars };
320
+
322
321
  //# sourceMappingURL=env.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.mjs","names":[],"sources":["../../src/generators/env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { ResolverOutput } from \"../types.js\";\nimport { getDbRequirements } from \"./postgres-init.js\";\n\n/**\n * Options for environment file generation.\n */\nexport interface EnvGeneratorOptions {\n\tgenerateSecrets: boolean;\n\tdomain?: string;\n\topenclawVersion?: string;\n\t/** When set, host-like vars (e.g. REDIS_HOST) for these services use host.docker.internal so gateway in Docker can reach native services on host. */\n\tnativeServiceIds?: Set<string>;\n\t/** Compose file names for COMPOSE_FILE env var (enables `docker compose up` without -f flags). */\n\tcomposeFiles?: string[];\n\t/** Compose profiles for COMPOSE_PROFILES env var (enables `docker compose up` without --profile flags). */\n\tcomposeProfiles?: string[];\n\t/** OpenClaw image variant (official, coolify, alpine). */\n\topenclawImage?: \"official\" | \"coolify\" | \"alpine\";\n}\n\n/**\n * Generates `.env.example` and `.env` file contents from resolved services.\n *\n * - `.env.example`: every env var with descriptive comments, placeholders for secrets\n * - `.env`: same vars but secrets filled with cryptographically random values when generateSecrets is true\n */\nexport function generateEnvFiles(\n\tresolved: ResolverOutput,\n\toptions: EnvGeneratorOptions,\n): { envExample: string; env: string } {\n\tconst version = options.openclawVersion ?? \"latest\";\n\tconst lines: { comment: string; key: string; exampleValue: string; actualValue: string }[] = [];\n\n\t// Track all env var values for resolving references later\n\tconst envVarValues = new Map<string, string>();\n\n\t// ── Docker Compose convenience vars ─────────────────────────────────────\n\t// These let you run `docker compose up -d` without -f and --profile flags.\n\n\tif (options.composeFiles && options.composeFiles.length > 0) {\n\t\tconst separator = process.platform === \"win32\" ? \";\" : \":\";\n\t\tconst composeFileValue = options.composeFiles.join(separator);\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Compose files to load (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_FILE\",\n\t\t\texampleValue: composeFileValue,\n\t\t\tactualValue: composeFileValue,\n\t\t});\n\t}\n\n\tif (options.composeProfiles && options.composeProfiles.length > 0) {\n\t\tconst profilesValue = options.composeProfiles.join(\",\");\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Profiles to activate (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_PROFILES\",\n\t\t\texampleValue: profilesValue,\n\t\t\tactualValue: profilesValue,\n\t\t});\n\t}\n\n\t// ── Base OpenClaw Variables ──────────────────────────────────────────────\n\n\tlines.push({\n\t\tcomment: formatComment(\"OpenClaw version to deploy\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_VERSION\",\n\t\texampleValue: version,\n\t\tactualValue: version,\n\t});\n\n\tconst gatewayToken = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Authentication token for the OpenClaw gateway API\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\texampleValue: \"your_gateway_token_here\",\n\t\tactualValue: gatewayToken,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\"Port the OpenClaw gateway listens on\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\texampleValue: \"18789\",\n\t\tactualValue: \"18789\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Port for the OpenClaw ACP bridge (WebSocket)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_BRIDGE_PORT\",\n\t\texampleValue: \"18790\",\n\t\tactualValue: \"18790\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Gateway network bind mode: 'lan' (all interfaces, required for Docker). Use 'loopback' only for native (non-Docker) installs with Tailscale serve/funnel\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_BIND\",\n\t\texampleValue: \"lan\",\n\t\tactualValue: \"lan\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw configuration directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_CONFIG_DIR\",\n\t\texampleValue: \"./openclaw/config\",\n\t\tactualValue: \"./openclaw/config\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw workspace directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_WORKSPACE_DIR\",\n\t\texampleValue: \"./openclaw/workspace\",\n\t\tactualValue: \"./openclaw/workspace\",\n\t});\n\n\t// Set OPENCLAW_IMAGE based on variant (empty = use compose default)\n\tconst imageVariantMap: Record<string, string> = {\n\t\tofficial: \"\", // use compose default (ghcr.io/openclaw/openclaw:VERSION)\n\t\tcoolify: \"coollabsio/openclaw:latest\",\n\t\talpine: \"alpine/openclaw:latest\",\n\t};\n\tconst imageValue = imageVariantMap[options.openclawImage ?? \"official\"] ?? \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t`OpenClaw Docker image variant: ${options.openclawImage ?? \"official\"} (official, coolify, alpine)`,\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_IMAGE\",\n\t\texampleValue: \"\",\n\t\tactualValue: imageValue,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra bind mounts for gateway and CLI containers (comma-separated, format: source:target[:options])\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_EXTRA_MOUNTS\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Named volume or host path for /home/node persistence across container restarts\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_HOME_VOLUME\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra apt packages to install during Docker image build (space-separated)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tif (options.domain) {\n\t\tlines.push({\n\t\t\tcomment: formatComment(\"Primary domain for service routing\", \"OpenClaw Core\", false, false),\n\t\t\tkey: \"OPENCLAW_DOMAIN\",\n\t\t\texampleValue: \"example.com\",\n\t\t\tactualValue: options.domain,\n\t\t});\n\t}\n\n\t// ── AI Provider API Keys ─────────────────────────────────────────────────\n\n\tif (resolved.aiProviders && resolved.aiProviders.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# AI Provider API Keys\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const provider of resolved.aiProviders) {\n\t\t\t// Local-only providers don't need API keys\n\t\t\tif (provider === \"ollama\" || provider === \"lmstudio\" || provider === \"vllm\") continue;\n\n\t\t\t// Ollama Cloud uses OLLAMA_API_KEY (matches Ollama's official env var name)\n\t\t\tconst envKey =\n\t\t\t\tprovider === \"ollama-cloud\" ? \"OLLAMA_API_KEY\" : `${provider.toUpperCase()}_API_KEY`;\n\t\t\tconst label = provider === \"ollama-cloud\" ? \"Ollama Cloud\" : provider;\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(`API Key for ${label} AI models`, \"OpenClaw Core\", true, true),\n\t\t\t\tkey: envKey,\n\t\t\t\texampleValue: `your_${provider.toLowerCase().replace(\"-\", \"_\")}_api_key_here`,\n\t\t\t\tactualValue: \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Claude web-provider session variables (optional)\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Claude Web Provider (optional)\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude AI session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_AI_SESSION_KEY\",\n\t\texampleValue: \"your_claude_ai_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_SESSION_KEY\",\n\t\texampleValue: \"your_claude_web_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web cookie for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_COOKIE\",\n\t\texampleValue: \"your_claude_web_cookie_here\",\n\t\tactualValue: \"\",\n\t});\n\n\t// ── Per-Service Database Passwords ──────────────────────────────────────\n\n\tconst dbReqs = getDbRequirements(resolved);\n\n\tif (dbReqs.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Per-Service Database Passwords\\n# Each service gets its own PostgreSQL database and credentials\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const req of dbReqs) {\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(req.passwordEnvVar, secretValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(\n\t\t\t\t\t`PostgreSQL password for ${req.serviceName} (database: ${req.dbName}, user: ${req.dbUser})`,\n\t\t\t\t\treq.serviceName,\n\t\t\t\t\ttrue,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tkey: req.passwordEnvVar,\n\t\t\t\texampleValue: `your_${req.passwordEnvVar.toLowerCase()}_here`,\n\t\t\t\tactualValue: secretValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Service-Specific Variables ───────────────────────────────────────────\n\n\tconst dbPasswordKeys = dbReqs.map((r) => r.passwordEnvVar);\n\tconst aiProviderKeys = (resolved.aiProviders || []).map((p) => `${p.toUpperCase()}_API_KEY`);\n\tconst seenKeys = new Set<string>([\n\t\t\"OPENCLAW_VERSION\",\n\t\t\"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\"OPENCLAW_GATEWAY_PORT\",\n\t\t\"OPENCLAW_BRIDGE_PORT\",\n\t\t\"OPENCLAW_GATEWAY_BIND\",\n\t\t\"OPENCLAW_CONFIG_DIR\",\n\t\t\"OPENCLAW_WORKSPACE_DIR\",\n\t\t\"OPENCLAW_IMAGE\",\n\t\t\"OPENCLAW_EXTRA_MOUNTS\",\n\t\t\"OPENCLAW_HOME_VOLUME\",\n\t\t\"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\t\"OPENCLAW_DOMAIN\",\n\t\t\"CLAUDE_AI_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_COOKIE\",\n\t\t...dbPasswordKeys,\n\t\t...aiProviderKeys,\n\t]);\n\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tif (allEnvVars.length === 0) continue;\n\n\t\t// Section separator for this service\n\t\tlines.push({\n\t\t\tcomment: `\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# ${definition.icon} ${definition.name}\\n# ═══════════════════════════════════════════════════════════════════════════════`,\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tconst isNative = options.nativeServiceIds?.has(definition.id);\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// For native services, host-like vars must point to host so gateway (in Docker) can reach them\n\t\t\tconst isHostVar = envVar.key.endsWith(\"_HOST\");\n\t\t\tconst hostValue = isNative && isHostVar ? \"host.docker.internal\" : null;\n\n\t\t\tconst exampleValue = hostValue\n\t\t\t\t? hostValue\n\t\t\t\t: envVar.secret\n\t\t\t\t\t? `your_${envVar.key.toLowerCase()}_here`\n\t\t\t\t\t: envVar.defaultValue;\n\n\t\t\tlet actualValue: string;\n\t\t\tif (hostValue) {\n\t\t\t\tactualValue = hostValue;\n\t\t\t} else if (envVar.secret) {\n\t\t\t\t// Resolve env var references like ${N8N_DB_PASSWORD}\n\t\t\t\tif (envVar.defaultValue.startsWith(\"${\") && envVar.defaultValue.endsWith(\"}\")) {\n\t\t\t\t\tconst refKey = envVar.defaultValue.slice(2, -1); // Extract var name from ${VAR_NAME}\n\t\t\t\t\tactualValue = envVarValues.get(refKey) || envVar.defaultValue;\n\t\t\t\t} else {\n\t\t\t\t\tactualValue = secretValue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tactualValue = envVar.defaultValue;\n\t\t\t}\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(envVar.key, actualValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(envVar.description, definition.name, envVar.required, envVar.secret),\n\t\t\t\tkey: envVar.key,\n\t\t\t\texampleValue,\n\t\t\t\tactualValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Build output strings ────────────────────────────────────────────────\n\n\tconst header = [\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"# OpenClaw Environment Configuration\",\n\t\t`# Generated at ${new Date().toISOString()}`,\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tlet envExample = header;\n\tlet env = header;\n\n\tfor (const line of lines) {\n\t\tif (line.key === \"\") {\n\t\t\t// Section comment\n\t\t\tenvExample += `${line.comment}\\n`;\n\t\t\tenv += `${line.comment}\\n`;\n\t\t} else {\n\t\t\tenvExample += `${line.comment}\\n${line.key}=${line.exampleValue}\\n\\n`;\n\t\t\tenv += `${line.comment}\\n${line.key}=${line.actualValue}\\n\\n`;\n\t\t}\n\t}\n\n\treturn { envExample, env };\n}\n\n/**\n * Format a descriptive comment block for an environment variable.\n */\nfunction formatComment(\n\tdescription: string,\n\tserviceName: string,\n\trequired: boolean,\n\tsecret: boolean,\n): string {\n\treturn [\n\t\t`# ${description}`,\n\t\t`# Service: ${serviceName} | Required: ${required ? \"Yes\" : \"No\"} | Secret: ${secret ? \"Yes\" : \"No\"}`,\n\t].join(\"\\n\");\n}\n\n// ── Structured Env Vars ─────────────────────────────────────────────────────\n\nexport interface EnvVarGroup {\n\tserviceName: string;\n\tserviceIcon: string;\n\tserviceId: string;\n\tvars: {\n\t\tkey: string;\n\t\tdescription: string;\n\t\tsecret: boolean;\n\t\trequired: boolean;\n\t\tdefaultValue: string;\n\t}[];\n}\n\n/**\n * Returns environment variables grouped by service, suitable for UI rendering.\n *\n * - First group is always \"OpenClaw Core\" with base variables.\n * - Subsequent groups correspond to each resolved service.\n * - Variables are deduplicated across groups (first occurrence wins).\n */\nexport function getStructuredEnvVars(resolved: ResolverOutput): EnvVarGroup[] {\n\tconst groups: EnvVarGroup[] = [];\n\tconst seenKeys = new Set<string>();\n\n\t// ── OpenClaw Core group ──────────────────────────────────────────────────\n\tconst coreVars: EnvVarGroup[\"vars\"] = [\n\t\t{\n\t\t\tkey: \"OPENCLAW_VERSION\",\n\t\t\tdescription: \"OpenClaw version to deploy\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"latest\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\tdescription: \"Authentication token for the OpenClaw gateway API\",\n\t\t\tsecret: true,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\t\tdescription: \"Port the OpenClaw gateway listens on\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"18789\",\n\t\t},\n\t];\n\n\tfor (const v of coreVars) {\n\t\tseenKeys.add(v.key);\n\t}\n\n\tgroups.push({\n\t\tserviceName: \"OpenClaw Core\",\n\t\tserviceIcon: \"⚙️\",\n\t\tserviceId: \"openclaw-core\",\n\t\tvars: coreVars,\n\t});\n\n\t// ── Per-service groups ───────────────────────────────────────────────────\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tconst vars: EnvVarGroup[\"vars\"] = [];\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tvars.push({\n\t\t\t\tkey: envVar.key,\n\t\t\t\tdescription: envVar.description,\n\t\t\t\tsecret: envVar.secret,\n\t\t\t\trequired: envVar.required,\n\t\t\t\tdefaultValue: envVar.defaultValue,\n\t\t\t});\n\t\t}\n\n\t\tif (vars.length === 0) continue;\n\n\t\tgroups.push({\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t\tserviceId: definition.id,\n\t\t\tvars,\n\t\t});\n\t}\n\n\treturn groups;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"env.mjs","names":[],"sources":["../../src/generators/env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { ResolverOutput } from \"../types.js\";\nimport { getDbRequirements } from \"./postgres-init.js\";\n\n/**\n * Options for environment file generation.\n */\nexport interface EnvGeneratorOptions {\n\tgenerateSecrets: boolean;\n\tdomain?: string;\n\topenclawVersion?: string;\n\t/** When set, host-like vars (e.g. REDIS_HOST) for these services use host.docker.internal so gateway in Docker can reach native services on host. */\n\tnativeServiceIds?: Set<string>;\n\t/** Compose file names for COMPOSE_FILE env var (enables `docker compose up` without -f flags). */\n\tcomposeFiles?: string[];\n\t/** Compose profiles for COMPOSE_PROFILES env var (enables `docker compose up` without --profile flags). */\n\tcomposeProfiles?: string[];\n\t/** OpenClaw image variant (official, coolify, alpine). */\n\topenclawImage?: \"official\" | \"coolify\" | \"alpine\";\n}\n\n/**\n * Generates `.env.example` and `.env` file contents from resolved services.\n *\n * - `.env.example`: every env var with descriptive comments, placeholders for secrets\n * - `.env`: same vars but secrets filled with cryptographically random values when generateSecrets is true\n */\nexport function generateEnvFiles(\n\tresolved: ResolverOutput,\n\toptions: EnvGeneratorOptions,\n): { envExample: string; env: string } {\n\tconst version = options.openclawVersion ?? \"latest\";\n\tconst lines: { comment: string; key: string; exampleValue: string; actualValue: string }[] = [];\n\n\t// Track all env var values for resolving references later\n\tconst envVarValues = new Map<string, string>();\n\n\t// ── Docker Compose convenience vars ─────────────────────────────────────\n\t// These let you run `docker compose up -d` without -f and --profile flags.\n\n\tif (options.composeFiles && options.composeFiles.length > 0) {\n\t\tconst separator = process.platform === \"win32\" ? \";\" : \":\";\n\t\tconst composeFileValue = options.composeFiles.join(separator);\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Compose files to load (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_FILE\",\n\t\t\texampleValue: composeFileValue,\n\t\t\tactualValue: composeFileValue,\n\t\t});\n\t}\n\n\tif (options.composeProfiles && options.composeProfiles.length > 0) {\n\t\tconst profilesValue = options.composeProfiles.join(\",\");\n\t\tlines.push({\n\t\t\tcomment: formatComment(\n\t\t\t\t\"Profiles to activate (allows plain `docker compose up -d`)\",\n\t\t\t\t\"Docker Compose\",\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\tkey: \"COMPOSE_PROFILES\",\n\t\t\texampleValue: profilesValue,\n\t\t\tactualValue: profilesValue,\n\t\t});\n\t}\n\n\t// ── Base OpenClaw Variables ──────────────────────────────────────────────\n\n\tlines.push({\n\t\tcomment: formatComment(\"OpenClaw version to deploy\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_VERSION\",\n\t\texampleValue: version,\n\t\tactualValue: version,\n\t});\n\n\tconst gatewayToken = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Authentication token for the OpenClaw gateway API\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\texampleValue: \"your_gateway_token_here\",\n\t\tactualValue: gatewayToken,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\"Port the OpenClaw gateway listens on\", \"OpenClaw Core\", true, false),\n\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\texampleValue: \"18789\",\n\t\tactualValue: \"18789\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Port for the OpenClaw ACP bridge (WebSocket)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_BRIDGE_PORT\",\n\t\texampleValue: \"18790\",\n\t\tactualValue: \"18790\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Gateway network bind mode: 'lan' (all interfaces, required for Docker). Use 'loopback' only for native (non-Docker) installs with Tailscale serve/funnel\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_BIND\",\n\t\texampleValue: \"lan\",\n\t\tactualValue: \"lan\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw configuration directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_CONFIG_DIR\",\n\t\texampleValue: \"./openclaw/config\",\n\t\tactualValue: \"./openclaw/config\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Host path to OpenClaw workspace directory\",\n\t\t\t\"OpenClaw Core\",\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_WORKSPACE_DIR\",\n\t\texampleValue: \"./openclaw/workspace\",\n\t\tactualValue: \"./openclaw/workspace\",\n\t});\n\n\t// Set OPENCLAW_IMAGE based on variant (empty = use compose default)\n\tconst imageVariantMap: Record<string, string> = {\n\t\tofficial: \"\", // use compose default (ghcr.io/openclaw/openclaw:VERSION)\n\t\tcoolify: \"coollabsio/openclaw:latest\",\n\t\talpine: \"alpine/openclaw:latest\",\n\t};\n\tconst imageValue = imageVariantMap[options.openclawImage ?? \"official\"] ?? \"\";\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t`OpenClaw Docker image variant: ${options.openclawImage ?? \"official\"} (official, coolify, alpine)`,\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_IMAGE\",\n\t\texampleValue: \"\",\n\t\tactualValue: imageValue,\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra bind mounts for gateway and CLI containers (comma-separated, format: source:target[:options])\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_EXTRA_MOUNTS\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Named volume or host path for /home/node persistence across container restarts\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_HOME_VOLUME\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Extra apt packages to install during Docker image build (space-separated)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tif (options.domain) {\n\t\tlines.push({\n\t\t\tcomment: formatComment(\"Primary domain for service routing\", \"OpenClaw Core\", false, false),\n\t\t\tkey: \"OPENCLAW_DOMAIN\",\n\t\t\texampleValue: \"example.com\",\n\t\t\tactualValue: options.domain,\n\t\t});\n\t}\n\n\t// ── AI Provider API Keys ─────────────────────────────────────────────────\n\n\tif (resolved.aiProviders && resolved.aiProviders.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# AI Provider API Keys\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const provider of resolved.aiProviders) {\n\t\t\t// Local-only providers don't need API keys\n\t\t\tif (provider === \"ollama\" || provider === \"lmstudio\" || provider === \"vllm\") continue;\n\n\t\t\t// Ollama Cloud uses OLLAMA_API_KEY (matches Ollama's official env var name)\n\t\t\tconst envKey =\n\t\t\t\tprovider === \"ollama-cloud\" ? \"OLLAMA_API_KEY\" : `${provider.toUpperCase()}_API_KEY`;\n\t\t\tconst label = provider === \"ollama-cloud\" ? \"Ollama Cloud\" : provider;\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(`API Key for ${label} AI models`, \"OpenClaw Core\", true, true),\n\t\t\t\tkey: envKey,\n\t\t\t\texampleValue: `your_${provider.toLowerCase().replace(\"-\", \"_\")}_api_key_here`,\n\t\t\t\tactualValue: \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Claude web-provider session variables (optional)\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Claude Web Provider (optional)\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude AI session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_AI_SESSION_KEY\",\n\t\texampleValue: \"your_claude_ai_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web session key for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_SESSION_KEY\",\n\t\texampleValue: \"your_claude_web_session_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Claude web cookie for web provider authentication\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"CLAUDE_WEB_COOKIE\",\n\t\texampleValue: \"your_claude_web_cookie_here\",\n\t\tactualValue: \"\",\n\t});\n\n\t// ── Per-Service Database Passwords ──────────────────────────────────────\n\n\tconst dbReqs = getDbRequirements(resolved);\n\n\tif (dbReqs.length > 0) {\n\t\tlines.push({\n\t\t\tcomment:\n\t\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Per-Service Database Passwords\\n# Each service gets its own PostgreSQL database and credentials\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tfor (const req of dbReqs) {\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(req.passwordEnvVar, secretValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(\n\t\t\t\t\t`PostgreSQL password for ${req.serviceName} (database: ${req.dbName}, user: ${req.dbUser})`,\n\t\t\t\t\treq.serviceName,\n\t\t\t\t\ttrue,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tkey: req.passwordEnvVar,\n\t\t\t\texampleValue: `your_${req.passwordEnvVar.toLowerCase()}_here`,\n\t\t\t\tactualValue: secretValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Service-Specific Variables ───────────────────────────────────────────\n\n\tconst dbPasswordKeys = dbReqs.map((r) => r.passwordEnvVar);\n\tconst aiProviderKeys = (resolved.aiProviders || []).map((p) => `${p.toUpperCase()}_API_KEY`);\n\tconst seenKeys = new Set<string>([\n\t\t\"OPENCLAW_VERSION\",\n\t\t\"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\"OPENCLAW_GATEWAY_PORT\",\n\t\t\"OPENCLAW_BRIDGE_PORT\",\n\t\t\"OPENCLAW_GATEWAY_BIND\",\n\t\t\"OPENCLAW_CONFIG_DIR\",\n\t\t\"OPENCLAW_WORKSPACE_DIR\",\n\t\t\"OPENCLAW_IMAGE\",\n\t\t\"OPENCLAW_EXTRA_MOUNTS\",\n\t\t\"OPENCLAW_HOME_VOLUME\",\n\t\t\"OPENCLAW_DOCKER_APT_PACKAGES\",\n\t\t\"OPENCLAW_DOMAIN\",\n\t\t\"CLAUDE_AI_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_SESSION_KEY\",\n\t\t\"CLAUDE_WEB_COOKIE\",\n\t\t...dbPasswordKeys,\n\t\t...aiProviderKeys,\n\t]);\n\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tif (allEnvVars.length === 0) continue;\n\n\t\t// Section separator for this service\n\t\tlines.push({\n\t\t\tcomment: `\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# ${definition.icon} ${definition.name}\\n# ═══════════════════════════════════════════════════════════════════════════════`,\n\t\t\tkey: \"\",\n\t\t\texampleValue: \"\",\n\t\t\tactualValue: \"\",\n\t\t});\n\n\t\tconst isNative = options.nativeServiceIds?.has(definition.id);\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tconst secretValue = options.generateSecrets ? randomBytes(24).toString(\"hex\") : \"\";\n\n\t\t\t// For native services, host-like vars must point to host so gateway (in Docker) can reach them\n\t\t\tconst isHostVar = envVar.key.endsWith(\"_HOST\");\n\t\t\tconst hostValue = isNative && isHostVar ? \"host.docker.internal\" : null;\n\n\t\t\tconst exampleValue = hostValue\n\t\t\t\t? hostValue\n\t\t\t\t: envVar.secret\n\t\t\t\t\t? `your_${envVar.key.toLowerCase()}_here`\n\t\t\t\t\t: envVar.defaultValue;\n\n\t\t\tlet actualValue: string;\n\t\t\tif (hostValue) {\n\t\t\t\tactualValue = hostValue;\n\t\t\t} else if (envVar.secret) {\n\t\t\t\t// Resolve env var references like ${N8N_DB_PASSWORD}\n\t\t\t\tif (envVar.defaultValue.startsWith(\"${\") && envVar.defaultValue.endsWith(\"}\")) {\n\t\t\t\t\tconst refKey = envVar.defaultValue.slice(2, -1); // Extract var name from ${VAR_NAME}\n\t\t\t\t\tactualValue = envVarValues.get(refKey) || envVar.defaultValue;\n\t\t\t\t} else {\n\t\t\t\t\tactualValue = secretValue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tactualValue = envVar.defaultValue;\n\t\t\t}\n\n\t\t\t// Store in map for later reference resolution\n\t\t\tenvVarValues.set(envVar.key, actualValue);\n\n\t\t\tlines.push({\n\t\t\t\tcomment: formatComment(envVar.description, definition.name, envVar.required, envVar.secret),\n\t\t\t\tkey: envVar.key,\n\t\t\t\texampleValue,\n\t\t\t\tactualValue,\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Build output strings ────────────────────────────────────────────────\n\n\tconst header = [\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"# OpenClaw Environment Configuration\",\n\t\t`# Generated at ${new Date().toISOString()}`,\n\t\t\"# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tlet envExample = header;\n\tlet env = header;\n\n\tfor (const line of lines) {\n\t\tif (line.key === \"\") {\n\t\t\t// Section comment\n\t\t\tenvExample += `${line.comment}\\n`;\n\t\t\tenv += `${line.comment}\\n`;\n\t\t} else {\n\t\t\tenvExample += `${line.comment}\\n${line.key}=${line.exampleValue}\\n\\n`;\n\t\t\tenv += `${line.comment}\\n${line.key}=${line.actualValue}\\n\\n`;\n\t\t}\n\t}\n\n\treturn { envExample, env };\n}\n\n/**\n * Format a descriptive comment block for an environment variable.\n */\nfunction formatComment(\n\tdescription: string,\n\tserviceName: string,\n\trequired: boolean,\n\tsecret: boolean,\n): string {\n\treturn [\n\t\t`# ${description}`,\n\t\t`# Service: ${serviceName} | Required: ${required ? \"Yes\" : \"No\"} | Secret: ${secret ? \"Yes\" : \"No\"}`,\n\t].join(\"\\n\");\n}\n\n// ── Structured Env Vars ─────────────────────────────────────────────────────\n\nexport interface EnvVarGroup {\n\tserviceName: string;\n\tserviceIcon: string;\n\tserviceId: string;\n\tvars: {\n\t\tkey: string;\n\t\tdescription: string;\n\t\tsecret: boolean;\n\t\trequired: boolean;\n\t\tdefaultValue: string;\n\t}[];\n}\n\n/**\n * Returns environment variables grouped by service, suitable for UI rendering.\n *\n * - First group is always \"OpenClaw Core\" with base variables.\n * - Subsequent groups correspond to each resolved service.\n * - Variables are deduplicated across groups (first occurrence wins).\n */\nexport function getStructuredEnvVars(resolved: ResolverOutput): EnvVarGroup[] {\n\tconst groups: EnvVarGroup[] = [];\n\tconst seenKeys = new Set<string>();\n\n\t// ── OpenClaw Core group ──────────────────────────────────────────────────\n\tconst coreVars: EnvVarGroup[\"vars\"] = [\n\t\t{\n\t\t\tkey: \"OPENCLAW_VERSION\",\n\t\t\tdescription: \"OpenClaw version to deploy\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"latest\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_TOKEN\",\n\t\t\tdescription: \"Authentication token for the OpenClaw gateway API\",\n\t\t\tsecret: true,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_PORT\",\n\t\t\tdescription: \"Port the OpenClaw gateway listens on\",\n\t\t\tsecret: false,\n\t\t\trequired: true,\n\t\t\tdefaultValue: \"18789\",\n\t\t},\n\t];\n\n\tfor (const v of coreVars) {\n\t\tseenKeys.add(v.key);\n\t}\n\n\tgroups.push({\n\t\tserviceName: \"OpenClaw Core\",\n\t\tserviceIcon: \"⚙️\",\n\t\tserviceId: \"openclaw-core\",\n\t\tvars: coreVars,\n\t});\n\n\t// ── Per-service groups ───────────────────────────────────────────────────\n\tfor (const { definition } of resolved.services) {\n\t\tconst allEnvVars = [...definition.environment, ...definition.openclawEnvVars];\n\n\t\tconst vars: EnvVarGroup[\"vars\"] = [];\n\n\t\tfor (const envVar of allEnvVars) {\n\t\t\tif (seenKeys.has(envVar.key)) continue;\n\t\t\tseenKeys.add(envVar.key);\n\n\t\t\tvars.push({\n\t\t\t\tkey: envVar.key,\n\t\t\t\tdescription: envVar.description,\n\t\t\t\tsecret: envVar.secret,\n\t\t\t\trequired: envVar.required,\n\t\t\t\tdefaultValue: envVar.defaultValue,\n\t\t\t});\n\t\t}\n\n\t\tif (vars.length === 0) continue;\n\n\t\tgroups.push({\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t\tserviceId: definition.id,\n\t\t\tvars,\n\t\t});\n\t}\n\n\treturn groups;\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- const require_vi_2VT5v0um = require('../vi.2VT5v0um-BmRMvymT.cjs');
2
- const require_generate = require('../generate.cjs');
3
-
1
+ const require_vi_2VT5v0um = require("../vi.2VT5v0um-CRqXre87.cjs");
2
+ const require_generate = require("../generate.cjs");
4
3
  //#region src/generators/env.test.ts
5
4
  require_vi_2VT5v0um.describe("generateEnvFiles (via generate)", () => {
6
5
  const baseInput = {
@@ -54,6 +53,6 @@ require_vi_2VT5v0um.describe("generateEnvFiles (via generate)", () => {
54
53
  require_vi_2VT5v0um.globalExpect(env).toContain("example.com");
55
54
  });
56
55
  });
57
-
58
56
  //#endregion
57
+
59
58
  //# sourceMappingURL=env.test.cjs.map