@better-openclaw/core 1.0.22 → 1.0.24

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 (697) hide show
  1. package/dist/bare-metal-partition.test.cjs +3 -4
  2. package/dist/bare-metal-partition.test.cjs.map +1 -1
  3. package/dist/bare-metal-partition.test.mjs +3 -4
  4. package/dist/bare-metal-partition.test.mjs.map +1 -1
  5. package/dist/composer.cjs +40 -14
  6. package/dist/composer.cjs.map +1 -1
  7. package/dist/composer.d.cts.map +1 -1
  8. package/dist/composer.d.mts.map +1 -1
  9. package/dist/composer.mjs +40 -14
  10. package/dist/composer.mjs.map +1 -1
  11. package/dist/composer.snapshot.test.cjs +1 -1
  12. package/dist/composer.snapshot.test.mjs +1 -1
  13. package/dist/composer.test.cjs +3 -2
  14. package/dist/composer.test.cjs.map +1 -1
  15. package/dist/composer.test.mjs +3 -2
  16. package/dist/composer.test.mjs.map +1 -1
  17. package/dist/deployers/strip-host-ports.test.cjs +1 -1
  18. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  19. package/dist/generate.cjs +7 -2
  20. package/dist/generate.cjs.map +1 -1
  21. package/dist/generate.d.cts.map +1 -1
  22. package/dist/generate.d.mts.map +1 -1
  23. package/dist/generate.mjs +7 -2
  24. package/dist/generate.mjs.map +1 -1
  25. package/dist/generate.test.cjs +2 -2
  26. package/dist/generate.test.cjs.map +1 -1
  27. package/dist/generate.test.mjs +2 -2
  28. package/dist/generate.test.mjs.map +1 -1
  29. package/dist/generators/bare-metal-install.test.cjs +1 -1
  30. package/dist/generators/bare-metal-install.test.mjs +1 -1
  31. package/dist/generators/caddy.test.cjs +1 -1
  32. package/dist/generators/caddy.test.mjs +1 -1
  33. package/dist/generators/clone-repos.cjs +140 -0
  34. package/dist/generators/clone-repos.cjs.map +1 -0
  35. package/dist/generators/clone-repos.d.cts +11 -0
  36. package/dist/generators/clone-repos.d.cts.map +1 -0
  37. package/dist/generators/clone-repos.d.mts +11 -0
  38. package/dist/generators/clone-repos.d.mts.map +1 -0
  39. package/dist/generators/clone-repos.mjs +139 -0
  40. package/dist/generators/clone-repos.mjs.map +1 -0
  41. package/dist/generators/clone-repos.test.cjs +140 -0
  42. package/dist/generators/clone-repos.test.cjs.map +1 -0
  43. package/dist/generators/clone-repos.test.d.cts +1 -0
  44. package/dist/generators/clone-repos.test.d.mts +1 -0
  45. package/dist/generators/clone-repos.test.mjs +141 -0
  46. package/dist/generators/clone-repos.test.mjs.map +1 -0
  47. package/dist/generators/env.cjs +146 -0
  48. package/dist/generators/env.cjs.map +1 -1
  49. package/dist/generators/env.d.cts.map +1 -1
  50. package/dist/generators/env.d.mts.map +1 -1
  51. package/dist/generators/env.mjs +146 -0
  52. package/dist/generators/env.mjs.map +1 -1
  53. package/dist/generators/env.test.cjs +1 -1
  54. package/dist/generators/env.test.mjs +1 -1
  55. package/dist/generators/health-check.test.cjs +1 -1
  56. package/dist/generators/health-check.test.mjs +1 -1
  57. package/dist/generators/openclaw-json.cjs +102 -7
  58. package/dist/generators/openclaw-json.cjs.map +1 -1
  59. package/dist/generators/openclaw-json.mjs +102 -7
  60. package/dist/generators/openclaw-json.mjs.map +1 -1
  61. package/dist/generators/postgres-init.cjs +20 -0
  62. package/dist/generators/postgres-init.cjs.map +1 -1
  63. package/dist/generators/postgres-init.d.cts.map +1 -1
  64. package/dist/generators/postgres-init.d.mts.map +1 -1
  65. package/dist/generators/postgres-init.mjs +20 -0
  66. package/dist/generators/postgres-init.mjs.map +1 -1
  67. package/dist/generators/readme.cjs +2 -1
  68. package/dist/generators/readme.cjs.map +1 -1
  69. package/dist/generators/readme.mjs +2 -1
  70. package/dist/generators/readme.mjs.map +1 -1
  71. package/dist/generators/scripts.cjs +332 -3
  72. package/dist/generators/scripts.cjs.map +1 -1
  73. package/dist/generators/scripts.d.cts +3 -1
  74. package/dist/generators/scripts.d.cts.map +1 -1
  75. package/dist/generators/scripts.d.mts +3 -1
  76. package/dist/generators/scripts.d.mts.map +1 -1
  77. package/dist/generators/scripts.mjs +332 -3
  78. package/dist/generators/scripts.mjs.map +1 -1
  79. package/dist/generators/scripts.test.cjs +39 -5
  80. package/dist/generators/scripts.test.cjs.map +1 -1
  81. package/dist/generators/scripts.test.mjs +39 -5
  82. package/dist/generators/scripts.test.mjs.map +1 -1
  83. package/dist/generators/stack-manifest.cjs +1 -0
  84. package/dist/generators/stack-manifest.cjs.map +1 -1
  85. package/dist/generators/stack-manifest.d.cts +3 -2
  86. package/dist/generators/stack-manifest.d.cts.map +1 -1
  87. package/dist/generators/stack-manifest.d.mts +3 -2
  88. package/dist/generators/stack-manifest.d.mts.map +1 -1
  89. package/dist/generators/stack-manifest.mjs +1 -0
  90. package/dist/generators/stack-manifest.mjs.map +1 -1
  91. package/dist/generators/traefik.test.cjs +1 -1
  92. package/dist/generators/traefik.test.mjs +1 -1
  93. package/dist/index.cjs +8 -1
  94. package/dist/index.d.cts +5 -3
  95. package/dist/index.d.mts +5 -3
  96. package/dist/index.mjs +5 -3
  97. package/dist/migrations.test.cjs +1 -1
  98. package/dist/migrations.test.mjs +1 -1
  99. package/dist/presets/registry.cjs +19 -0
  100. package/dist/presets/registry.cjs.map +1 -1
  101. package/dist/presets/registry.d.cts.map +1 -1
  102. package/dist/presets/registry.d.mts.map +1 -1
  103. package/dist/presets/registry.mjs +19 -0
  104. package/dist/presets/registry.mjs.map +1 -1
  105. package/dist/presets/registry.test.cjs +1 -1
  106. package/dist/presets/registry.test.mjs +1 -1
  107. package/dist/resolver.cjs +8 -0
  108. package/dist/resolver.cjs.map +1 -1
  109. package/dist/resolver.mjs +9 -1
  110. package/dist/resolver.mjs.map +1 -1
  111. package/dist/resolver.test.cjs +47 -12
  112. package/dist/resolver.test.cjs.map +1 -1
  113. package/dist/resolver.test.mjs +47 -12
  114. package/dist/resolver.test.mjs.map +1 -1
  115. package/dist/{schema-C_hc7e4k.d.cts → schema-eX44HhRp.d.mts} +78 -8
  116. package/dist/schema-eX44HhRp.d.mts.map +1 -0
  117. package/dist/{schema-CaesJaS2.d.mts → schema-tn5RK8CM.d.cts} +78 -8
  118. package/dist/schema-tn5RK8CM.d.cts.map +1 -0
  119. package/dist/schema.cjs +26 -4
  120. package/dist/schema.cjs.map +1 -1
  121. package/dist/schema.d.cts +2 -2
  122. package/dist/schema.d.mts +2 -2
  123. package/dist/schema.mjs +25 -5
  124. package/dist/schema.mjs.map +1 -1
  125. package/dist/schema.test.cjs +1 -1
  126. package/dist/schema.test.mjs +1 -1
  127. package/dist/services/definitions/adguard-home.cjs +74 -0
  128. package/dist/services/definitions/adguard-home.cjs.map +1 -0
  129. package/dist/services/definitions/adguard-home.d.cts +7 -0
  130. package/dist/services/definitions/adguard-home.d.cts.map +1 -0
  131. package/dist/services/definitions/adguard-home.d.mts +7 -0
  132. package/dist/services/definitions/adguard-home.d.mts.map +1 -0
  133. package/dist/services/definitions/adguard-home.mjs +73 -0
  134. package/dist/services/definitions/adguard-home.mjs.map +1 -0
  135. package/dist/services/definitions/apptension-saas.cjs +87 -0
  136. package/dist/services/definitions/apptension-saas.cjs.map +1 -0
  137. package/dist/services/definitions/apptension-saas.d.cts +7 -0
  138. package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
  139. package/dist/services/definitions/apptension-saas.d.mts +7 -0
  140. package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
  141. package/dist/services/definitions/apptension-saas.mjs +86 -0
  142. package/dist/services/definitions/apptension-saas.mjs.map +1 -0
  143. package/dist/services/definitions/audiobookshelf.cjs +81 -0
  144. package/dist/services/definitions/audiobookshelf.cjs.map +1 -0
  145. package/dist/services/definitions/audiobookshelf.d.cts +7 -0
  146. package/dist/services/definitions/audiobookshelf.d.cts.map +1 -0
  147. package/dist/services/definitions/audiobookshelf.d.mts +7 -0
  148. package/dist/services/definitions/audiobookshelf.d.mts.map +1 -0
  149. package/dist/services/definitions/audiobookshelf.mjs +80 -0
  150. package/dist/services/definitions/audiobookshelf.mjs.map +1 -0
  151. package/dist/services/definitions/baserow.cjs +115 -0
  152. package/dist/services/definitions/baserow.cjs.map +1 -0
  153. package/dist/services/definitions/baserow.d.cts +7 -0
  154. package/dist/services/definitions/baserow.d.cts.map +1 -0
  155. package/dist/services/definitions/baserow.d.mts +7 -0
  156. package/dist/services/definitions/baserow.d.mts.map +1 -0
  157. package/dist/services/definitions/baserow.mjs +114 -0
  158. package/dist/services/definitions/baserow.mjs.map +1 -0
  159. package/dist/services/definitions/boxyhq-saas.cjs +88 -0
  160. package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
  161. package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
  162. package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
  163. package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
  164. package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
  165. package/dist/services/definitions/boxyhq-saas.mjs +87 -0
  166. package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
  167. package/dist/services/definitions/calibre-web.cjs +91 -0
  168. package/dist/services/definitions/calibre-web.cjs.map +1 -0
  169. package/dist/services/definitions/calibre-web.d.cts +7 -0
  170. package/dist/services/definitions/calibre-web.d.cts.map +1 -0
  171. package/dist/services/definitions/calibre-web.d.mts +7 -0
  172. package/dist/services/definitions/calibre-web.d.mts.map +1 -0
  173. package/dist/services/definitions/calibre-web.mjs +90 -0
  174. package/dist/services/definitions/calibre-web.mjs.map +1 -0
  175. package/dist/services/definitions/clickhouse.cjs +113 -0
  176. package/dist/services/definitions/clickhouse.cjs.map +1 -0
  177. package/dist/services/definitions/clickhouse.d.cts +7 -0
  178. package/dist/services/definitions/clickhouse.d.cts.map +1 -0
  179. package/dist/services/definitions/clickhouse.d.mts +7 -0
  180. package/dist/services/definitions/clickhouse.d.mts.map +1 -0
  181. package/dist/services/definitions/clickhouse.mjs +112 -0
  182. package/dist/services/definitions/clickhouse.mjs.map +1 -0
  183. package/dist/services/definitions/cloudflared.cjs +55 -0
  184. package/dist/services/definitions/cloudflared.cjs.map +1 -0
  185. package/dist/services/definitions/cloudflared.d.cts +7 -0
  186. package/dist/services/definitions/cloudflared.d.cts.map +1 -0
  187. package/dist/services/definitions/cloudflared.d.mts +7 -0
  188. package/dist/services/definitions/cloudflared.d.mts.map +1 -0
  189. package/dist/services/definitions/cloudflared.mjs +54 -0
  190. package/dist/services/definitions/cloudflared.mjs.map +1 -0
  191. package/dist/services/definitions/cmsaas-starter.cjs +86 -0
  192. package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
  193. package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
  194. package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
  195. package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
  196. package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
  197. package/dist/services/definitions/cmsaas-starter.mjs +85 -0
  198. package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
  199. package/dist/services/definitions/cockroachdb.cjs +70 -0
  200. package/dist/services/definitions/cockroachdb.cjs.map +1 -0
  201. package/dist/services/definitions/cockroachdb.d.cts +7 -0
  202. package/dist/services/definitions/cockroachdb.d.cts.map +1 -0
  203. package/dist/services/definitions/cockroachdb.d.mts +7 -0
  204. package/dist/services/definitions/cockroachdb.d.mts.map +1 -0
  205. package/dist/services/definitions/cockroachdb.mjs +69 -0
  206. package/dist/services/definitions/cockroachdb.mjs.map +1 -0
  207. package/dist/services/definitions/coder.cjs +64 -0
  208. package/dist/services/definitions/coder.cjs.map +1 -0
  209. package/dist/services/definitions/coder.d.cts +7 -0
  210. package/dist/services/definitions/coder.d.cts.map +1 -0
  211. package/dist/services/definitions/coder.d.mts +7 -0
  212. package/dist/services/definitions/coder.d.mts.map +1 -0
  213. package/dist/services/definitions/coder.mjs +63 -0
  214. package/dist/services/definitions/coder.mjs.map +1 -0
  215. package/dist/services/definitions/dragonfly.cjs +64 -0
  216. package/dist/services/definitions/dragonfly.cjs.map +1 -0
  217. package/dist/services/definitions/dragonfly.d.cts +7 -0
  218. package/dist/services/definitions/dragonfly.d.cts.map +1 -0
  219. package/dist/services/definitions/dragonfly.d.mts +7 -0
  220. package/dist/services/definitions/dragonfly.d.mts.map +1 -0
  221. package/dist/services/definitions/dragonfly.mjs +63 -0
  222. package/dist/services/definitions/dragonfly.mjs.map +1 -0
  223. package/dist/services/definitions/drone-ci.cjs +95 -0
  224. package/dist/services/definitions/drone-ci.cjs.map +1 -0
  225. package/dist/services/definitions/drone-ci.d.cts +7 -0
  226. package/dist/services/definitions/drone-ci.d.cts.map +1 -0
  227. package/dist/services/definitions/drone-ci.d.mts +7 -0
  228. package/dist/services/definitions/drone-ci.d.mts.map +1 -0
  229. package/dist/services/definitions/drone-ci.mjs +94 -0
  230. package/dist/services/definitions/drone-ci.mjs.map +1 -0
  231. package/dist/services/definitions/element-web.cjs +61 -0
  232. package/dist/services/definitions/element-web.cjs.map +1 -0
  233. package/dist/services/definitions/element-web.d.cts +7 -0
  234. package/dist/services/definitions/element-web.d.cts.map +1 -0
  235. package/dist/services/definitions/element-web.d.mts +7 -0
  236. package/dist/services/definitions/element-web.d.mts.map +1 -0
  237. package/dist/services/definitions/element-web.mjs +60 -0
  238. package/dist/services/definitions/element-web.mjs.map +1 -0
  239. package/dist/services/definitions/focalboard.cjs +65 -0
  240. package/dist/services/definitions/focalboard.cjs.map +1 -0
  241. package/dist/services/definitions/focalboard.d.cts +7 -0
  242. package/dist/services/definitions/focalboard.d.cts.map +1 -0
  243. package/dist/services/definitions/focalboard.d.mts +7 -0
  244. package/dist/services/definitions/focalboard.d.mts.map +1 -0
  245. package/dist/services/definitions/focalboard.mjs +64 -0
  246. package/dist/services/definitions/focalboard.mjs.map +1 -0
  247. package/dist/services/definitions/forgejo.cjs +108 -0
  248. package/dist/services/definitions/forgejo.cjs.map +1 -0
  249. package/dist/services/definitions/forgejo.d.cts +7 -0
  250. package/dist/services/definitions/forgejo.d.cts.map +1 -0
  251. package/dist/services/definitions/forgejo.d.mts +7 -0
  252. package/dist/services/definitions/forgejo.d.mts.map +1 -0
  253. package/dist/services/definitions/forgejo.mjs +107 -0
  254. package/dist/services/definitions/forgejo.mjs.map +1 -0
  255. package/dist/services/definitions/graylog.cjs +103 -0
  256. package/dist/services/definitions/graylog.cjs.map +1 -0
  257. package/dist/services/definitions/graylog.d.cts +7 -0
  258. package/dist/services/definitions/graylog.d.cts.map +1 -0
  259. package/dist/services/definitions/graylog.d.mts +7 -0
  260. package/dist/services/definitions/graylog.d.mts.map +1 -0
  261. package/dist/services/definitions/graylog.mjs +102 -0
  262. package/dist/services/definitions/graylog.mjs.map +1 -0
  263. package/dist/services/definitions/index.cjs +154 -1
  264. package/dist/services/definitions/index.cjs.map +1 -1
  265. package/dist/services/definitions/index.d.cts +52 -1
  266. package/dist/services/definitions/index.d.cts.map +1 -1
  267. package/dist/services/definitions/index.d.mts +52 -1
  268. package/dist/services/definitions/index.d.mts.map +1 -1
  269. package/dist/services/definitions/index.mjs +104 -2
  270. package/dist/services/definitions/index.mjs.map +1 -1
  271. package/dist/services/definitions/influxdb.cjs +105 -0
  272. package/dist/services/definitions/influxdb.cjs.map +1 -0
  273. package/dist/services/definitions/influxdb.d.cts +7 -0
  274. package/dist/services/definitions/influxdb.d.cts.map +1 -0
  275. package/dist/services/definitions/influxdb.d.mts +7 -0
  276. package/dist/services/definitions/influxdb.d.mts.map +1 -0
  277. package/dist/services/definitions/influxdb.mjs +104 -0
  278. package/dist/services/definitions/influxdb.mjs.map +1 -0
  279. package/dist/services/definitions/invoke-ai.cjs +70 -0
  280. package/dist/services/definitions/invoke-ai.cjs.map +1 -0
  281. package/dist/services/definitions/invoke-ai.d.cts +7 -0
  282. package/dist/services/definitions/invoke-ai.d.cts.map +1 -0
  283. package/dist/services/definitions/invoke-ai.d.mts +7 -0
  284. package/dist/services/definitions/invoke-ai.d.mts.map +1 -0
  285. package/dist/services/definitions/invoke-ai.mjs +69 -0
  286. package/dist/services/definitions/invoke-ai.mjs.map +1 -0
  287. package/dist/services/definitions/ixartz-saas.cjs +88 -0
  288. package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
  289. package/dist/services/definitions/ixartz-saas.d.cts +7 -0
  290. package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
  291. package/dist/services/definitions/ixartz-saas.d.mts +7 -0
  292. package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
  293. package/dist/services/definitions/ixartz-saas.mjs +87 -0
  294. package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
  295. package/dist/services/definitions/jaeger.cjs +95 -0
  296. package/dist/services/definitions/jaeger.cjs.map +1 -0
  297. package/dist/services/definitions/jaeger.d.cts +7 -0
  298. package/dist/services/definitions/jaeger.d.cts.map +1 -0
  299. package/dist/services/definitions/jaeger.d.mts +7 -0
  300. package/dist/services/definitions/jaeger.d.mts.map +1 -0
  301. package/dist/services/definitions/jaeger.mjs +94 -0
  302. package/dist/services/definitions/jaeger.mjs.map +1 -0
  303. package/dist/services/definitions/jan.cjs +64 -0
  304. package/dist/services/definitions/jan.cjs.map +1 -0
  305. package/dist/services/definitions/jan.d.cts +7 -0
  306. package/dist/services/definitions/jan.d.cts.map +1 -0
  307. package/dist/services/definitions/jan.d.mts +7 -0
  308. package/dist/services/definitions/jan.d.mts.map +1 -0
  309. package/dist/services/definitions/jan.mjs +63 -0
  310. package/dist/services/definitions/jan.mjs.map +1 -0
  311. package/dist/services/definitions/jitsi-meet.cjs +102 -0
  312. package/dist/services/definitions/jitsi-meet.cjs.map +1 -0
  313. package/dist/services/definitions/jitsi-meet.d.cts +7 -0
  314. package/dist/services/definitions/jitsi-meet.d.cts.map +1 -0
  315. package/dist/services/definitions/jitsi-meet.d.mts +7 -0
  316. package/dist/services/definitions/jitsi-meet.d.mts.map +1 -0
  317. package/dist/services/definitions/jitsi-meet.mjs +101 -0
  318. package/dist/services/definitions/jitsi-meet.mjs.map +1 -0
  319. package/dist/services/definitions/local-ai.cjs +86 -0
  320. package/dist/services/definitions/local-ai.cjs.map +1 -0
  321. package/dist/services/definitions/local-ai.d.cts +7 -0
  322. package/dist/services/definitions/local-ai.d.cts.map +1 -0
  323. package/dist/services/definitions/local-ai.d.mts +7 -0
  324. package/dist/services/definitions/local-ai.d.mts.map +1 -0
  325. package/dist/services/definitions/local-ai.mjs +85 -0
  326. package/dist/services/definitions/local-ai.mjs.map +1 -0
  327. package/dist/services/definitions/metabase.cjs +108 -0
  328. package/dist/services/definitions/metabase.cjs.map +1 -0
  329. package/dist/services/definitions/metabase.d.cts +7 -0
  330. package/dist/services/definitions/metabase.d.cts.map +1 -0
  331. package/dist/services/definitions/metabase.d.mts +7 -0
  332. package/dist/services/definitions/metabase.d.mts.map +1 -0
  333. package/dist/services/definitions/metabase.mjs +107 -0
  334. package/dist/services/definitions/metabase.mjs.map +1 -0
  335. package/dist/services/definitions/mission-control.cjs +16 -2
  336. package/dist/services/definitions/mission-control.cjs.map +1 -1
  337. package/dist/services/definitions/mission-control.mjs +16 -2
  338. package/dist/services/definitions/mission-control.mjs.map +1 -1
  339. package/dist/services/definitions/mosquitto.cjs +82 -0
  340. package/dist/services/definitions/mosquitto.cjs.map +1 -0
  341. package/dist/services/definitions/mosquitto.d.cts +7 -0
  342. package/dist/services/definitions/mosquitto.d.cts.map +1 -0
  343. package/dist/services/definitions/mosquitto.d.mts +7 -0
  344. package/dist/services/definitions/mosquitto.d.mts.map +1 -0
  345. package/dist/services/definitions/mosquitto.mjs +81 -0
  346. package/dist/services/definitions/mosquitto.mjs.map +1 -0
  347. package/dist/services/definitions/navidrome.cjs +90 -0
  348. package/dist/services/definitions/navidrome.cjs.map +1 -0
  349. package/dist/services/definitions/navidrome.d.cts +7 -0
  350. package/dist/services/definitions/navidrome.d.cts.map +1 -0
  351. package/dist/services/definitions/navidrome.d.mts +7 -0
  352. package/dist/services/definitions/navidrome.d.mts.map +1 -0
  353. package/dist/services/definitions/navidrome.mjs +89 -0
  354. package/dist/services/definitions/navidrome.mjs.map +1 -0
  355. package/dist/services/definitions/nginx-proxy-manager.cjs +71 -0
  356. package/dist/services/definitions/nginx-proxy-manager.cjs.map +1 -0
  357. package/dist/services/definitions/nginx-proxy-manager.d.cts +7 -0
  358. package/dist/services/definitions/nginx-proxy-manager.d.cts.map +1 -0
  359. package/dist/services/definitions/nginx-proxy-manager.d.mts +7 -0
  360. package/dist/services/definitions/nginx-proxy-manager.d.mts.map +1 -0
  361. package/dist/services/definitions/nginx-proxy-manager.mjs +70 -0
  362. package/dist/services/definitions/nginx-proxy-manager.mjs.map +1 -0
  363. package/dist/services/definitions/node-red.cjs +77 -0
  364. package/dist/services/definitions/node-red.cjs.map +1 -0
  365. package/dist/services/definitions/node-red.d.cts +7 -0
  366. package/dist/services/definitions/node-red.d.cts.map +1 -0
  367. package/dist/services/definitions/node-red.d.mts +7 -0
  368. package/dist/services/definitions/node-red.d.mts.map +1 -0
  369. package/dist/services/definitions/node-red.mjs +76 -0
  370. package/dist/services/definitions/node-red.mjs.map +1 -0
  371. package/dist/services/definitions/open-saas.cjs +81 -0
  372. package/dist/services/definitions/open-saas.cjs.map +1 -0
  373. package/dist/services/definitions/open-saas.d.cts +7 -0
  374. package/dist/services/definitions/open-saas.d.cts.map +1 -0
  375. package/dist/services/definitions/open-saas.d.mts +7 -0
  376. package/dist/services/definitions/open-saas.d.mts.map +1 -0
  377. package/dist/services/definitions/open-saas.mjs +80 -0
  378. package/dist/services/definitions/open-saas.mjs.map +1 -0
  379. package/dist/services/definitions/photoprism.cjs +126 -0
  380. package/dist/services/definitions/photoprism.cjs.map +1 -0
  381. package/dist/services/definitions/photoprism.d.cts +7 -0
  382. package/dist/services/definitions/photoprism.d.cts.map +1 -0
  383. package/dist/services/definitions/photoprism.d.mts +7 -0
  384. package/dist/services/definitions/photoprism.d.mts.map +1 -0
  385. package/dist/services/definitions/photoprism.mjs +125 -0
  386. package/dist/services/definitions/photoprism.mjs.map +1 -0
  387. package/dist/services/definitions/pihole.cjs +73 -0
  388. package/dist/services/definitions/pihole.cjs.map +1 -0
  389. package/dist/services/definitions/pihole.d.cts +7 -0
  390. package/dist/services/definitions/pihole.d.cts.map +1 -0
  391. package/dist/services/definitions/pihole.d.mts +7 -0
  392. package/dist/services/definitions/pihole.d.mts.map +1 -0
  393. package/dist/services/definitions/pihole.mjs +72 -0
  394. package/dist/services/definitions/pihole.mjs.map +1 -0
  395. package/dist/services/definitions/piper-tts.cjs +70 -0
  396. package/dist/services/definitions/piper-tts.cjs.map +1 -0
  397. package/dist/services/definitions/piper-tts.d.cts +7 -0
  398. package/dist/services/definitions/piper-tts.d.cts.map +1 -0
  399. package/dist/services/definitions/piper-tts.d.mts +7 -0
  400. package/dist/services/definitions/piper-tts.d.mts.map +1 -0
  401. package/dist/services/definitions/piper-tts.mjs +69 -0
  402. package/dist/services/definitions/piper-tts.mjs.map +1 -0
  403. package/dist/services/definitions/plane.cjs +75 -0
  404. package/dist/services/definitions/plane.cjs.map +1 -0
  405. package/dist/services/definitions/plane.d.cts +7 -0
  406. package/dist/services/definitions/plane.d.cts.map +1 -0
  407. package/dist/services/definitions/plane.d.mts +7 -0
  408. package/dist/services/definitions/plane.d.mts.map +1 -0
  409. package/dist/services/definitions/plane.mjs +74 -0
  410. package/dist/services/definitions/plane.mjs.map +1 -0
  411. package/dist/services/definitions/plausible.cjs +94 -0
  412. package/dist/services/definitions/plausible.cjs.map +1 -0
  413. package/dist/services/definitions/plausible.d.cts +7 -0
  414. package/dist/services/definitions/plausible.d.cts.map +1 -0
  415. package/dist/services/definitions/plausible.d.mts +7 -0
  416. package/dist/services/definitions/plausible.d.mts.map +1 -0
  417. package/dist/services/definitions/plausible.mjs +93 -0
  418. package/dist/services/definitions/plausible.mjs.map +1 -0
  419. package/dist/services/definitions/pocket-id.cjs +101 -0
  420. package/dist/services/definitions/pocket-id.cjs.map +1 -0
  421. package/dist/services/definitions/pocket-id.d.cts +7 -0
  422. package/dist/services/definitions/pocket-id.d.cts.map +1 -0
  423. package/dist/services/definitions/pocket-id.d.mts +7 -0
  424. package/dist/services/definitions/pocket-id.d.mts.map +1 -0
  425. package/dist/services/definitions/pocket-id.mjs +100 -0
  426. package/dist/services/definitions/pocket-id.mjs.map +1 -0
  427. package/dist/services/definitions/posthog.cjs +94 -0
  428. package/dist/services/definitions/posthog.cjs.map +1 -0
  429. package/dist/services/definitions/posthog.d.cts +7 -0
  430. package/dist/services/definitions/posthog.d.cts.map +1 -0
  431. package/dist/services/definitions/posthog.d.mts +7 -0
  432. package/dist/services/definitions/posthog.d.mts.map +1 -0
  433. package/dist/services/definitions/posthog.mjs +93 -0
  434. package/dist/services/definitions/posthog.mjs.map +1 -0
  435. package/dist/services/definitions/redis.cjs +1 -1
  436. package/dist/services/definitions/redis.cjs.map +1 -1
  437. package/dist/services/definitions/redis.mjs +1 -1
  438. package/dist/services/definitions/redis.mjs.map +1 -1
  439. package/dist/services/definitions/revolt.cjs +64 -0
  440. package/dist/services/definitions/revolt.cjs.map +1 -0
  441. package/dist/services/definitions/revolt.d.cts +7 -0
  442. package/dist/services/definitions/revolt.d.cts.map +1 -0
  443. package/dist/services/definitions/revolt.d.mts +7 -0
  444. package/dist/services/definitions/revolt.d.mts.map +1 -0
  445. package/dist/services/definitions/revolt.mjs +63 -0
  446. package/dist/services/definitions/revolt.mjs.map +1 -0
  447. package/dist/services/definitions/sentry.cjs +101 -0
  448. package/dist/services/definitions/sentry.cjs.map +1 -0
  449. package/dist/services/definitions/sentry.d.cts +7 -0
  450. package/dist/services/definitions/sentry.d.cts.map +1 -0
  451. package/dist/services/definitions/sentry.d.mts +7 -0
  452. package/dist/services/definitions/sentry.d.mts.map +1 -0
  453. package/dist/services/definitions/sentry.mjs +100 -0
  454. package/dist/services/definitions/sentry.mjs.map +1 -0
  455. package/dist/services/definitions/sonarqube.cjs +86 -0
  456. package/dist/services/definitions/sonarqube.cjs.map +1 -0
  457. package/dist/services/definitions/sonarqube.d.cts +7 -0
  458. package/dist/services/definitions/sonarqube.d.cts.map +1 -0
  459. package/dist/services/definitions/sonarqube.d.mts +7 -0
  460. package/dist/services/definitions/sonarqube.d.mts.map +1 -0
  461. package/dist/services/definitions/sonarqube.mjs +85 -0
  462. package/dist/services/definitions/sonarqube.mjs.map +1 -0
  463. package/dist/services/definitions/superset.cjs +77 -0
  464. package/dist/services/definitions/superset.cjs.map +1 -0
  465. package/dist/services/definitions/superset.d.cts +7 -0
  466. package/dist/services/definitions/superset.d.cts.map +1 -0
  467. package/dist/services/definitions/superset.d.mts +7 -0
  468. package/dist/services/definitions/superset.d.mts.map +1 -0
  469. package/dist/services/definitions/superset.mjs +76 -0
  470. package/dist/services/definitions/superset.mjs.map +1 -0
  471. package/dist/services/definitions/surrealdb.cjs +72 -0
  472. package/dist/services/definitions/surrealdb.cjs.map +1 -0
  473. package/dist/services/definitions/surrealdb.d.cts +7 -0
  474. package/dist/services/definitions/surrealdb.d.cts.map +1 -0
  475. package/dist/services/definitions/surrealdb.d.mts +7 -0
  476. package/dist/services/definitions/surrealdb.d.mts.map +1 -0
  477. package/dist/services/definitions/surrealdb.mjs +71 -0
  478. package/dist/services/definitions/surrealdb.mjs.map +1 -0
  479. package/dist/services/definitions/tabby-ml.cjs +70 -0
  480. package/dist/services/definitions/tabby-ml.cjs.map +1 -0
  481. package/dist/services/definitions/tabby-ml.d.cts +7 -0
  482. package/dist/services/definitions/tabby-ml.d.cts.map +1 -0
  483. package/dist/services/definitions/tabby-ml.d.mts +7 -0
  484. package/dist/services/definitions/tabby-ml.d.mts.map +1 -0
  485. package/dist/services/definitions/tabby-ml.mjs +69 -0
  486. package/dist/services/definitions/tabby-ml.mjs.map +1 -0
  487. package/dist/services/definitions/tempo.cjs +57 -0
  488. package/dist/services/definitions/tempo.cjs.map +1 -0
  489. package/dist/services/definitions/tempo.d.cts +7 -0
  490. package/dist/services/definitions/tempo.d.cts.map +1 -0
  491. package/dist/services/definitions/tempo.d.mts +7 -0
  492. package/dist/services/definitions/tempo.d.mts.map +1 -0
  493. package/dist/services/definitions/tempo.mjs +56 -0
  494. package/dist/services/definitions/tempo.mjs.map +1 -0
  495. package/dist/services/definitions/text-gen-webui.cjs +88 -0
  496. package/dist/services/definitions/text-gen-webui.cjs.map +1 -0
  497. package/dist/services/definitions/text-gen-webui.d.cts +7 -0
  498. package/dist/services/definitions/text-gen-webui.d.cts.map +1 -0
  499. package/dist/services/definitions/text-gen-webui.d.mts +7 -0
  500. package/dist/services/definitions/text-gen-webui.d.mts.map +1 -0
  501. package/dist/services/definitions/text-gen-webui.mjs +87 -0
  502. package/dist/services/definitions/text-gen-webui.mjs.map +1 -0
  503. package/dist/services/definitions/timescaledb.cjs +87 -0
  504. package/dist/services/definitions/timescaledb.cjs.map +1 -0
  505. package/dist/services/definitions/timescaledb.d.cts +7 -0
  506. package/dist/services/definitions/timescaledb.d.cts.map +1 -0
  507. package/dist/services/definitions/timescaledb.d.mts +7 -0
  508. package/dist/services/definitions/timescaledb.d.mts.map +1 -0
  509. package/dist/services/definitions/timescaledb.mjs +86 -0
  510. package/dist/services/definitions/timescaledb.mjs.map +1 -0
  511. package/dist/services/definitions/valkey.cjs +1 -1
  512. package/dist/services/definitions/valkey.cjs.map +1 -1
  513. package/dist/services/definitions/valkey.mjs +1 -1
  514. package/dist/services/definitions/valkey.mjs.map +1 -1
  515. package/dist/services/definitions/vector-log.cjs +59 -0
  516. package/dist/services/definitions/vector-log.cjs.map +1 -0
  517. package/dist/services/definitions/vector-log.d.cts +7 -0
  518. package/dist/services/definitions/vector-log.d.cts.map +1 -0
  519. package/dist/services/definitions/vector-log.d.mts +7 -0
  520. package/dist/services/definitions/vector-log.d.mts.map +1 -0
  521. package/dist/services/definitions/vector-log.mjs +58 -0
  522. package/dist/services/definitions/vector-log.mjs.map +1 -0
  523. package/dist/services/definitions/vikunja.cjs +96 -0
  524. package/dist/services/definitions/vikunja.cjs.map +1 -0
  525. package/dist/services/definitions/vikunja.d.cts +7 -0
  526. package/dist/services/definitions/vikunja.d.cts.map +1 -0
  527. package/dist/services/definitions/vikunja.d.mts +7 -0
  528. package/dist/services/definitions/vikunja.d.mts.map +1 -0
  529. package/dist/services/definitions/vikunja.mjs +95 -0
  530. package/dist/services/definitions/vikunja.mjs.map +1 -0
  531. package/dist/services/definitions/wireguard.cjs +88 -0
  532. package/dist/services/definitions/wireguard.cjs.map +1 -0
  533. package/dist/services/definitions/wireguard.d.cts +7 -0
  534. package/dist/services/definitions/wireguard.d.cts.map +1 -0
  535. package/dist/services/definitions/wireguard.d.mts +7 -0
  536. package/dist/services/definitions/wireguard.d.mts.map +1 -0
  537. package/dist/services/definitions/wireguard.mjs +87 -0
  538. package/dist/services/definitions/wireguard.mjs.map +1 -0
  539. package/dist/services/definitions/woodpecker-ci.cjs +93 -0
  540. package/dist/services/definitions/woodpecker-ci.cjs.map +1 -0
  541. package/dist/services/definitions/woodpecker-ci.d.cts +7 -0
  542. package/dist/services/definitions/woodpecker-ci.d.cts.map +1 -0
  543. package/dist/services/definitions/woodpecker-ci.d.mts +7 -0
  544. package/dist/services/definitions/woodpecker-ci.d.mts.map +1 -0
  545. package/dist/services/definitions/woodpecker-ci.mjs +92 -0
  546. package/dist/services/definitions/woodpecker-ci.mjs.map +1 -0
  547. package/dist/services/definitions/zulip.cjs +116 -0
  548. package/dist/services/definitions/zulip.cjs.map +1 -0
  549. package/dist/services/definitions/zulip.d.cts +7 -0
  550. package/dist/services/definitions/zulip.d.cts.map +1 -0
  551. package/dist/services/definitions/zulip.d.mts +7 -0
  552. package/dist/services/definitions/zulip.d.mts.map +1 -0
  553. package/dist/services/definitions/zulip.mjs +115 -0
  554. package/dist/services/definitions/zulip.mjs.map +1 -0
  555. package/dist/services/registry.cjs +3 -0
  556. package/dist/services/registry.cjs.map +1 -1
  557. package/dist/services/registry.d.cts.map +1 -1
  558. package/dist/services/registry.d.mts.map +1 -1
  559. package/dist/services/registry.mjs +3 -0
  560. package/dist/services/registry.mjs.map +1 -1
  561. package/dist/services/registry.test.cjs +8 -1
  562. package/dist/services/registry.test.cjs.map +1 -1
  563. package/dist/services/registry.test.mjs +8 -1
  564. package/dist/services/registry.test.mjs.map +1 -1
  565. package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
  566. package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
  567. package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
  568. package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
  569. package/dist/skills/registry.cjs +3 -3
  570. package/dist/skills/registry.cjs.map +1 -1
  571. package/dist/skills/registry.mjs +3 -3
  572. package/dist/skills/registry.mjs.map +1 -1
  573. package/dist/skills/skill-manifest.cjs +1 -1
  574. package/dist/skills/skill-manifest.mjs +1 -1
  575. package/dist/track-analytics.cjs +50 -0
  576. package/dist/track-analytics.cjs.map +1 -0
  577. package/dist/track-analytics.d.cts +34 -0
  578. package/dist/track-analytics.d.cts.map +1 -0
  579. package/dist/track-analytics.d.mts +34 -0
  580. package/dist/track-analytics.d.mts.map +1 -0
  581. package/dist/track-analytics.mjs +48 -0
  582. package/dist/track-analytics.mjs.map +1 -0
  583. package/dist/track-analytics.test.cjs +91 -0
  584. package/dist/track-analytics.test.cjs.map +1 -0
  585. package/dist/track-analytics.test.d.cts +1 -0
  586. package/dist/track-analytics.test.d.mts +1 -0
  587. package/dist/track-analytics.test.mjs +92 -0
  588. package/dist/track-analytics.test.mjs.map +1 -0
  589. package/dist/types.cjs +35 -0
  590. package/dist/types.cjs.map +1 -1
  591. package/dist/types.d.cts +5 -2
  592. package/dist/types.d.cts.map +1 -1
  593. package/dist/types.d.mts +5 -2
  594. package/dist/types.d.mts.map +1 -1
  595. package/dist/types.mjs +35 -0
  596. package/dist/types.mjs.map +1 -1
  597. package/dist/validator.test.cjs +1 -1
  598. package/dist/validator.test.mjs +1 -1
  599. package/dist/version-manager.cjs +1 -1
  600. package/dist/version-manager.cjs.map +1 -1
  601. package/dist/version-manager.mjs +1 -1
  602. package/dist/version-manager.mjs.map +1 -1
  603. package/dist/version-manager.test.cjs +7 -5
  604. package/dist/version-manager.test.cjs.map +1 -1
  605. package/dist/version-manager.test.mjs +7 -5
  606. package/dist/version-manager.test.mjs.map +1 -1
  607. package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → vi.2VT5v0um-C_jmO7m2.mjs} +5 -5
  608. package/dist/{vi.2VT5v0um-DvC3SVNc.mjs.map → vi.2VT5v0um-C_jmO7m2.mjs.map} +1 -1
  609. package/dist/{vi.2VT5v0um-CRqXre87.cjs → vi.2VT5v0um-iVBt6Fyq.cjs} +5 -5
  610. package/dist/{vi.2VT5v0um-CRqXre87.cjs.map → vi.2VT5v0um-iVBt6Fyq.cjs.map} +1 -1
  611. package/package.json +1 -1
  612. package/src/__snapshots__/composer.snapshot.test.ts.snap +285 -65
  613. package/src/bare-metal-partition.test.ts +4 -3
  614. package/src/composer.test.ts +4 -2
  615. package/src/composer.ts +45 -16
  616. package/src/generate.test.ts +2 -1
  617. package/src/generate.ts +11 -1
  618. package/src/generators/clone-repos.test.ts +154 -0
  619. package/src/generators/clone-repos.ts +159 -0
  620. package/src/generators/env.ts +214 -0
  621. package/src/generators/openclaw-json.ts +156 -1
  622. package/src/generators/postgres-init.ts +17 -0
  623. package/src/generators/readme.ts +2 -1
  624. package/src/generators/scripts.test.ts +52 -4
  625. package/src/generators/scripts.ts +351 -3
  626. package/src/generators/stack-manifest.ts +4 -2
  627. package/src/index.ts +8 -0
  628. package/src/presets/registry.ts +20 -0
  629. package/src/resolver.test.ts +53 -15
  630. package/src/resolver.ts +13 -1
  631. package/src/schema.ts +37 -4
  632. package/src/services/definitions/adguard-home.ts +79 -0
  633. package/src/services/definitions/apptension-saas.ts +84 -0
  634. package/src/services/definitions/audiobookshelf.ts +83 -0
  635. package/src/services/definitions/baserow.ts +118 -0
  636. package/src/services/definitions/boxyhq-saas.ts +84 -0
  637. package/src/services/definitions/calibre-web.ts +95 -0
  638. package/src/services/definitions/clickhouse.ts +115 -0
  639. package/src/services/definitions/cloudflared.ts +55 -0
  640. package/src/services/definitions/cmsaas-starter.ts +84 -0
  641. package/src/services/definitions/cockroachdb.ts +75 -0
  642. package/src/services/definitions/coder.ts +68 -0
  643. package/src/services/definitions/dragonfly.ts +68 -0
  644. package/src/services/definitions/drone-ci.ts +96 -0
  645. package/src/services/definitions/element-web.ts +62 -0
  646. package/src/services/definitions/focalboard.ts +69 -0
  647. package/src/services/definitions/forgejo.ts +109 -0
  648. package/src/services/definitions/graylog.ts +101 -0
  649. package/src/services/definitions/index.ts +159 -0
  650. package/src/services/definitions/influxdb.ts +109 -0
  651. package/src/services/definitions/invoke-ai.ts +76 -0
  652. package/src/services/definitions/ixartz-saas.ts +84 -0
  653. package/src/services/definitions/jaeger.ts +94 -0
  654. package/src/services/definitions/jan.ts +68 -0
  655. package/src/services/definitions/jitsi-meet.ts +108 -0
  656. package/src/services/definitions/local-ai.ts +90 -0
  657. package/src/services/definitions/metabase.ts +111 -0
  658. package/src/services/definitions/mission-control.ts +19 -2
  659. package/src/services/definitions/mosquitto.ts +84 -0
  660. package/src/services/definitions/navidrome.ts +95 -0
  661. package/src/services/definitions/nginx-proxy-manager.ts +70 -0
  662. package/src/services/definitions/node-red.ts +83 -0
  663. package/src/services/definitions/open-saas.ts +79 -0
  664. package/src/services/definitions/photoprism.ts +130 -0
  665. package/src/services/definitions/pihole.ts +79 -0
  666. package/src/services/definitions/piper-tts.ts +76 -0
  667. package/src/services/definitions/plane.ts +75 -0
  668. package/src/services/definitions/plausible.ts +97 -0
  669. package/src/services/definitions/pocket-id.ts +98 -0
  670. package/src/services/definitions/posthog.ts +97 -0
  671. package/src/services/definitions/redis.ts +1 -1
  672. package/src/services/definitions/revolt.ts +68 -0
  673. package/src/services/definitions/sentry.ts +104 -0
  674. package/src/services/definitions/sonarqube.ts +85 -0
  675. package/src/services/definitions/superset.ts +84 -0
  676. package/src/services/definitions/surrealdb.ts +77 -0
  677. package/src/services/definitions/tabby-ml.ts +76 -0
  678. package/src/services/definitions/tempo.ts +59 -0
  679. package/src/services/definitions/text-gen-webui.ts +92 -0
  680. package/src/services/definitions/timescaledb.ts +90 -0
  681. package/src/services/definitions/valkey.ts +1 -1
  682. package/src/services/definitions/vector-log.ts +61 -0
  683. package/src/services/definitions/vikunja.ts +96 -0
  684. package/src/services/definitions/wireguard.ts +89 -0
  685. package/src/services/definitions/woodpecker-ci.ts +97 -0
  686. package/src/services/definitions/zulip.ts +117 -0
  687. package/src/services/registry.test.ts +8 -0
  688. package/src/services/registry.ts +7 -0
  689. package/src/skills/manifest.json +64 -0
  690. package/src/skills/registry.ts +3 -3
  691. package/src/track-analytics.test.ts +82 -0
  692. package/src/track-analytics.ts +76 -0
  693. package/src/types.ts +40 -0
  694. package/src/version-manager.test.ts +10 -5
  695. package/src/version-manager.ts +1 -1
  696. package/dist/schema-C_hc7e4k.d.cts.map +0 -1
  697. package/dist/schema-CaesJaS2.d.mts.map +0 -1
@@ -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\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Alternative auth: gateway password (use token OR password, not both)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_PASSWORD\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Override state directory path (default: ~/.openclaw)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_STATE_DIR\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Override config file path (default: ~/.openclaw/openclaw.json)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_CONFIG_PATH\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Import missing keys from login shell profile (set to 1 to enable)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_LOAD_SHELL_ENV\",\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// ── Tools API Keys (web search, fetch) ──────────────────────────────────\n\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Tools API Keys (web search, fetch, voice)\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Brave Search API key for web search tool (default provider)\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"BRAVE_API_KEY\",\n\t\texampleValue: \"your_brave_api_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Perplexity API key for web search tool (alternative provider)\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"PERPLEXITY_API_KEY\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Firecrawl API key for enhanced web fetch fallback\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"FIRECRAWL_API_KEY\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"ElevenLabs API key for Talk mode (text-to-speech)\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"ELEVENLABS_API_KEY\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\t// ── Swarm / Remote Gateway ───────────────────────────────────────────────\n\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Swarm / Remote Gateway Connection\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Auth token for connecting to a remote OpenClaw gateway (swarm upstream)\",\n\t\t\t\"OpenClaw Swarm\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_TOKEN\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Password for remote gateway auth (alternative to token)\",\n\t\t\t\"OpenClaw Swarm\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_PASSWORD\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\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_GATEWAY_PASSWORD\",\n\t\t\"OPENCLAW_STATE_DIR\",\n\t\t\"OPENCLAW_CONFIG_PATH\",\n\t\t\"OPENCLAW_LOAD_SHELL_ENV\",\n\t\t\"OPENCLAW_DOMAIN\",\n\t\t\"BRAVE_API_KEY\",\n\t\t\"PERPLEXITY_API_KEY\",\n\t\t\"FIRECRAWL_API_KEY\",\n\t\t\"ELEVENLABS_API_KEY\",\n\t\t\"OPENCLAW_REMOTE_GATEWAY_TOKEN\",\n\t\t\"OPENCLAW_REMOTE_GATEWAY_PASSWORD\",\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\"# Docs: https://better-openclaw.dev/docs | Cloud: https://clawexa.net\",\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\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_PASSWORD\",\n\t\t\tdescription: \"Alternative auth: gateway password (use token OR password)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_STATE_DIR\",\n\t\t\tdescription: \"Override state directory path (default: ~/.openclaw)\",\n\t\t\tsecret: false,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_CONFIG_PATH\",\n\t\t\tdescription: \"Override config file path (default: ~/.openclaw/openclaw.json)\",\n\t\t\tsecret: false,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"BRAVE_API_KEY\",\n\t\t\tdescription: \"Brave Search API key for web search tool (default provider)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"PERPLEXITY_API_KEY\",\n\t\t\tdescription: \"Perplexity API key for web search (alternative provider)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"FIRECRAWL_API_KEY\",\n\t\t\tdescription: \"Firecrawl API key for enhanced web fetch fallback\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"ELEVENLABS_API_KEY\",\n\t\t\tdescription: \"ElevenLabs API key for Talk mode (text-to-speech)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_TOKEN\",\n\t\t\tdescription: \"Auth token for connecting to a remote OpenClaw gateway (swarm upstream)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_PASSWORD\",\n\t\t\tdescription: \"Password for remote gateway auth (alternative to token)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\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":";;;;;;;;;;;AA2BA,SAAgB,iBACf,UACA,SACsC;CACtC,MAAM,UAAU,QAAQ,mBAAmB;CAC3C,MAAM,QAAuF,EAAE;CAG/F,MAAM,+BAAe,IAAI,KAAqB;AAK9C,KAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;EAC5D,MAAM,YAAY,QAAQ,aAAa,UAAU,MAAM;EACvD,MAAM,mBAAmB,QAAQ,aAAa,KAAK,UAAU;AAC7D,QAAM,KAAK;GACV,SAAS,cACR,+DACA,kBACA,OACA,MACA;GACD,KAAK;GACL,cAAc;GACd,aAAa;GACb,CAAC;;AAGH,KAAI,QAAQ,mBAAmB,QAAQ,gBAAgB,SAAS,GAAG;EAClE,MAAM,gBAAgB,QAAQ,gBAAgB,KAAK,IAAI;AACvD,QAAM,KAAK;GACV,SAAS,cACR,8DACA,kBACA,OACA,MACA;GACD,KAAK;GACL,cAAc;GACd,aAAa;GACb,CAAC;;AAKH,OAAM,KAAK;EACV,SAAS,cAAc,8BAA8B,iBAAiB,MAAM,MAAM;EAClF,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;CAEF,MAAM,eAAe,QAAQ,mBAAA,GAAA,YAAA,aAA8B,GAAG,CAAC,SAAS,MAAM,GAAG;AAEjF,OAAM,KAAK;EACV,SAAS,cACR,qDACA,iBACA,MACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cAAc,wCAAwC,iBAAiB,MAAM,MAAM;EAC5F,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,gDACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,4JACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,iDACA,iBACA,MACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,6CACA,iBACA,MACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;CAQF,MAAM,aAL0C;EAC/C,UAAU;EACV,SAAS;EACT,QAAQ;EACR,CACkC,QAAQ,iBAAiB,eAAe;AAE3E,OAAM,KAAK;EACV,SAAS,cACR,kCAAkC,QAAQ,iBAAiB,WAAW,+BACtE,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,uGACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,kFACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,6EACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,wEACA,iBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,wDACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,kEACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,qEACA,iBACA,OACA,MACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,KAAI,QAAQ,OACX,OAAM,KAAK;EACV,SAAS,cAAc,sCAAsC,iBAAiB,OAAO,MAAM;EAC3F,KAAK;EACL,cAAc;EACd,aAAa,QAAQ;EACrB,CAAC;AAKH,OAAM,KAAK;EACV,SACC;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,+DACA,kBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,iEACA,kBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,qDACA,kBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,qDACA,kBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAIF,OAAM,KAAK;EACV,SACC;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,2EACA,kBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,2DACA,kBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAIF,KAAI,SAAS,eAAe,SAAS,YAAY,SAAS,GAAG;AAC5D,QAAM,KAAK;GACV,SACC;GACD,KAAK;GACL,cAAc;GACd,aAAa;GACb,CAAC;AAEF,OAAK,MAAM,YAAY,SAAS,aAAa;AAE5C,OAAI,aAAa,YAAY,aAAa,cAAc,aAAa,OAAQ;GAG7E,MAAM,SACL,aAAa,iBAAiB,mBAAmB,GAAG,SAAS,aAAa,CAAC;GAC5E,MAAM,QAAQ,aAAa,iBAAiB,iBAAiB;AAC7D,SAAM,KAAK;IACV,SAAS,cAAc,eAAe,MAAM,aAAa,iBAAiB,MAAM,KAAK;IACrF,KAAK;IACL,cAAc,QAAQ,SAAS,aAAa,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC/D,aAAa;IACb,CAAC;;;AAKJ,OAAM,KAAK;EACV,SACC;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,yDACA,iBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,0DACA,iBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;AAEF,OAAM,KAAK;EACV,SAAS,cACR,qDACA,iBACA,OACA,KACA;EACD,KAAK;EACL,cAAc;EACd,aAAa;EACb,CAAC;CAIF,MAAM,SAASA,iCAAAA,kBAAkB,SAAS;AAE1C,KAAI,OAAO,SAAS,GAAG;AACtB,QAAM,KAAK;GACV,SACC;GACD,KAAK;GACL,cAAc;GACd,aAAa;GACb,CAAC;AAEF,OAAK,MAAM,OAAO,QAAQ;GACzB,MAAM,cAAc,QAAQ,mBAAA,GAAA,YAAA,aAA8B,GAAG,CAAC,SAAS,MAAM,GAAG;AAGhF,gBAAa,IAAI,IAAI,gBAAgB,YAAY;AAEjD,SAAM,KAAK;IACV,SAAS,cACR,2BAA2B,IAAI,YAAY,cAAc,IAAI,OAAO,UAAU,IAAI,OAAO,IACzF,IAAI,aACJ,MACA,KACA;IACD,KAAK,IAAI;IACT,cAAc,QAAQ,IAAI,eAAe,aAAa,CAAC;IACvD,aAAa;IACb,CAAC;;;CAMJ,MAAM,iBAAiB,OAAO,KAAK,MAAM,EAAE,eAAe;CAC1D,MAAM,kBAAkB,SAAS,eAAe,EAAE,EAAE,KAAK,MAAM,GAAG,EAAE,aAAa,CAAC,UAAU;CAC5F,MAAM,WAAW,IAAI,IAAY;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH,GAAG;EACH,CAAC;AAEF,MAAK,MAAM,EAAE,gBAAgB,SAAS,UAAU;EAC/C,MAAM,aAAa,CAAC,GAAG,WAAW,aAAa,GAAG,WAAW,gBAAgB;AAE7E,MAAI,WAAW,WAAW,EAAG;AAG7B,QAAM,KAAK;GACV,SAAS,0FAA0F,WAAW,KAAK,GAAG,WAAW,KAAK;GACtI,KAAK;GACL,cAAc;GACd,aAAa;GACb,CAAC;EAEF,MAAM,WAAW,QAAQ,kBAAkB,IAAI,WAAW,GAAG;AAE7D,OAAK,MAAM,UAAU,YAAY;AAChC,OAAI,SAAS,IAAI,OAAO,IAAI,CAAE;AAC9B,YAAS,IAAI,OAAO,IAAI;GAExB,MAAM,cAAc,QAAQ,mBAAA,GAAA,YAAA,aAA8B,GAAG,CAAC,SAAS,MAAM,GAAG;GAGhF,MAAM,YAAY,OAAO,IAAI,SAAS,QAAQ;GAC9C,MAAM,YAAY,YAAY,YAAY,yBAAyB;GAEnE,MAAM,eAAe,YAClB,YACA,OAAO,SACN,QAAQ,OAAO,IAAI,aAAa,CAAC,SACjC,OAAO;GAEX,IAAI;AACJ,OAAI,UACH,eAAc;YACJ,OAAO,OAEjB,KAAI,OAAO,aAAa,WAAW,KAAK,IAAI,OAAO,aAAa,SAAS,IAAI,EAAE;IAC9E,MAAM,SAAS,OAAO,aAAa,MAAM,GAAG,GAAG;AAC/C,kBAAc,aAAa,IAAI,OAAO,IAAI,OAAO;SAEjD,eAAc;OAGf,eAAc,OAAO;AAItB,gBAAa,IAAI,OAAO,KAAK,YAAY;AAEzC,SAAM,KAAK;IACV,SAAS,cAAc,OAAO,aAAa,WAAW,MAAM,OAAO,UAAU,OAAO,OAAO;IAC3F,KAAK,OAAO;IACZ;IACA;IACA,CAAC;;;CAMJ,MAAM,SAAS;EACd;EACA;EACA,mCAAkB,IAAI,MAAM,EAAC,aAAa;EAC1C;EACA;EACA;EACA,CAAC,KAAK,KAAK;CAEZ,IAAI,aAAa;CACjB,IAAI,MAAM;AAEV,MAAK,MAAM,QAAQ,MAClB,KAAI,KAAK,QAAQ,IAAI;AAEpB,gBAAc,GAAG,KAAK,QAAQ;AAC9B,SAAO,GAAG,KAAK,QAAQ;QACjB;AACN,gBAAc,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,aAAa;AAChE,SAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,YAAY;;AAI1D,QAAO;EAAE;EAAY;EAAK;;;;;AAM3B,SAAS,cACR,aACA,aACA,UACA,QACS;AACT,QAAO,CACN,KAAK,eACL,cAAc,YAAY,eAAe,WAAW,QAAQ,KAAK,aAAa,SAAS,QAAQ,OAC/F,CAAC,KAAK,KAAK;;;;;;;;;AAyBb,SAAgB,qBAAqB,UAAyC;CAC7E,MAAM,SAAwB,EAAE;CAChC,MAAM,2BAAW,IAAI,KAAa;CAGlC,MAAM,WAAgC;EACrC;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;GACC,KAAK;GACL,aAAa;GACb,QAAQ;GACR,UAAU;GACV,cAAc;GACd;EACD;AAED,MAAK,MAAM,KAAK,SACf,UAAS,IAAI,EAAE,IAAI;AAGpB,QAAO,KAAK;EACX,aAAa;EACb,aAAa;EACb,WAAW;EACX,MAAM;EACN,CAAC;AAGF,MAAK,MAAM,EAAE,gBAAgB,SAAS,UAAU;EAC/C,MAAM,aAAa,CAAC,GAAG,WAAW,aAAa,GAAG,WAAW,gBAAgB;EAE7E,MAAM,OAA4B,EAAE;AAEpC,OAAK,MAAM,UAAU,YAAY;AAChC,OAAI,SAAS,IAAI,OAAO,IAAI,CAAE;AAC9B,YAAS,IAAI,OAAO,IAAI;AAExB,QAAK,KAAK;IACT,KAAK,OAAO;IACZ,aAAa,OAAO;IACpB,QAAQ,OAAO;IACf,UAAU,OAAO;IACjB,cAAc,OAAO;IACrB,CAAC;;AAGH,MAAI,KAAK,WAAW,EAAG;AAEvB,SAAO,KAAK;GACX,aAAa,WAAW;GACxB,aAAa,WAAW;GACxB,WAAW,WAAW;GACtB;GACA,CAAC;;AAGH,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.cts","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.cts","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,UAujBR,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 +1 @@
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
+ {"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,UAujBR,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"}
@@ -102,12 +102,84 @@ function generateEnvFiles(resolved, options) {
102
102
  exampleValue: "",
103
103
  actualValue: ""
104
104
  });
105
+ lines.push({
106
+ comment: formatComment("Alternative auth: gateway password (use token OR password, not both)", "OpenClaw Core", false, true),
107
+ key: "OPENCLAW_GATEWAY_PASSWORD",
108
+ exampleValue: "",
109
+ actualValue: ""
110
+ });
111
+ lines.push({
112
+ comment: formatComment("Override state directory path (default: ~/.openclaw)", "OpenClaw Core", false, false),
113
+ key: "OPENCLAW_STATE_DIR",
114
+ exampleValue: "",
115
+ actualValue: ""
116
+ });
117
+ lines.push({
118
+ comment: formatComment("Override config file path (default: ~/.openclaw/openclaw.json)", "OpenClaw Core", false, false),
119
+ key: "OPENCLAW_CONFIG_PATH",
120
+ exampleValue: "",
121
+ actualValue: ""
122
+ });
123
+ lines.push({
124
+ comment: formatComment("Import missing keys from login shell profile (set to 1 to enable)", "OpenClaw Core", false, false),
125
+ key: "OPENCLAW_LOAD_SHELL_ENV",
126
+ exampleValue: "",
127
+ actualValue: ""
128
+ });
105
129
  if (options.domain) lines.push({
106
130
  comment: formatComment("Primary domain for service routing", "OpenClaw Core", false, false),
107
131
  key: "OPENCLAW_DOMAIN",
108
132
  exampleValue: "example.com",
109
133
  actualValue: options.domain
110
134
  });
135
+ lines.push({
136
+ comment: "\n# ═══════════════════════════════════════════════════════════════════════════════\n# Tools API Keys (web search, fetch, voice)\n# ═══════════════════════════════════════════════════════════════════════════════",
137
+ key: "",
138
+ exampleValue: "",
139
+ actualValue: ""
140
+ });
141
+ lines.push({
142
+ comment: formatComment("Brave Search API key for web search tool (default provider)", "OpenClaw Tools", false, true),
143
+ key: "BRAVE_API_KEY",
144
+ exampleValue: "your_brave_api_key_here",
145
+ actualValue: ""
146
+ });
147
+ lines.push({
148
+ comment: formatComment("Perplexity API key for web search tool (alternative provider)", "OpenClaw Tools", false, true),
149
+ key: "PERPLEXITY_API_KEY",
150
+ exampleValue: "",
151
+ actualValue: ""
152
+ });
153
+ lines.push({
154
+ comment: formatComment("Firecrawl API key for enhanced web fetch fallback", "OpenClaw Tools", false, true),
155
+ key: "FIRECRAWL_API_KEY",
156
+ exampleValue: "",
157
+ actualValue: ""
158
+ });
159
+ lines.push({
160
+ comment: formatComment("ElevenLabs API key for Talk mode (text-to-speech)", "OpenClaw Tools", false, true),
161
+ key: "ELEVENLABS_API_KEY",
162
+ exampleValue: "",
163
+ actualValue: ""
164
+ });
165
+ lines.push({
166
+ comment: "\n# ═══════════════════════════════════════════════════════════════════════════════\n# Swarm / Remote Gateway Connection\n# ═══════════════════════════════════════════════════════════════════════════════",
167
+ key: "",
168
+ exampleValue: "",
169
+ actualValue: ""
170
+ });
171
+ lines.push({
172
+ comment: formatComment("Auth token for connecting to a remote OpenClaw gateway (swarm upstream)", "OpenClaw Swarm", false, true),
173
+ key: "OPENCLAW_REMOTE_GATEWAY_TOKEN",
174
+ exampleValue: "",
175
+ actualValue: ""
176
+ });
177
+ lines.push({
178
+ comment: formatComment("Password for remote gateway auth (alternative to token)", "OpenClaw Swarm", false, true),
179
+ key: "OPENCLAW_REMOTE_GATEWAY_PASSWORD",
180
+ exampleValue: "",
181
+ actualValue: ""
182
+ });
111
183
  if (resolved.aiProviders && resolved.aiProviders.length > 0) {
112
184
  lines.push({
113
185
  comment: "\n# ═══════════════════════════════════════════════════════════════════════════════\n# AI Provider API Keys\n# ═══════════════════════════════════════════════════════════════════════════════",
@@ -184,7 +256,17 @@ function generateEnvFiles(resolved, options) {
184
256
  "OPENCLAW_EXTRA_MOUNTS",
185
257
  "OPENCLAW_HOME_VOLUME",
186
258
  "OPENCLAW_DOCKER_APT_PACKAGES",
259
+ "OPENCLAW_GATEWAY_PASSWORD",
260
+ "OPENCLAW_STATE_DIR",
261
+ "OPENCLAW_CONFIG_PATH",
262
+ "OPENCLAW_LOAD_SHELL_ENV",
187
263
  "OPENCLAW_DOMAIN",
264
+ "BRAVE_API_KEY",
265
+ "PERPLEXITY_API_KEY",
266
+ "FIRECRAWL_API_KEY",
267
+ "ELEVENLABS_API_KEY",
268
+ "OPENCLAW_REMOTE_GATEWAY_TOKEN",
269
+ "OPENCLAW_REMOTE_GATEWAY_PASSWORD",
188
270
  "CLAUDE_AI_SESSION_KEY",
189
271
  "CLAUDE_WEB_SESSION_KEY",
190
272
  "CLAUDE_WEB_COOKIE",
@@ -228,6 +310,7 @@ function generateEnvFiles(resolved, options) {
228
310
  "# ═══════════════════════════════════════════════════════════════════════════════",
229
311
  "# OpenClaw Environment Configuration",
230
312
  `# Generated at ${(/* @__PURE__ */ new Date()).toISOString()}`,
313
+ "# Docs: https://better-openclaw.dev/docs | Cloud: https://clawexa.net",
231
314
  "# ═══════════════════════════════════════════════════════════════════════════════",
232
315
  ""
233
316
  ].join("\n");
@@ -282,6 +365,69 @@ function getStructuredEnvVars(resolved) {
282
365
  secret: false,
283
366
  required: true,
284
367
  defaultValue: "18789"
368
+ },
369
+ {
370
+ key: "OPENCLAW_GATEWAY_PASSWORD",
371
+ description: "Alternative auth: gateway password (use token OR password)",
372
+ secret: true,
373
+ required: false,
374
+ defaultValue: ""
375
+ },
376
+ {
377
+ key: "OPENCLAW_STATE_DIR",
378
+ description: "Override state directory path (default: ~/.openclaw)",
379
+ secret: false,
380
+ required: false,
381
+ defaultValue: ""
382
+ },
383
+ {
384
+ key: "OPENCLAW_CONFIG_PATH",
385
+ description: "Override config file path (default: ~/.openclaw/openclaw.json)",
386
+ secret: false,
387
+ required: false,
388
+ defaultValue: ""
389
+ },
390
+ {
391
+ key: "BRAVE_API_KEY",
392
+ description: "Brave Search API key for web search tool (default provider)",
393
+ secret: true,
394
+ required: false,
395
+ defaultValue: ""
396
+ },
397
+ {
398
+ key: "PERPLEXITY_API_KEY",
399
+ description: "Perplexity API key for web search (alternative provider)",
400
+ secret: true,
401
+ required: false,
402
+ defaultValue: ""
403
+ },
404
+ {
405
+ key: "FIRECRAWL_API_KEY",
406
+ description: "Firecrawl API key for enhanced web fetch fallback",
407
+ secret: true,
408
+ required: false,
409
+ defaultValue: ""
410
+ },
411
+ {
412
+ key: "ELEVENLABS_API_KEY",
413
+ description: "ElevenLabs API key for Talk mode (text-to-speech)",
414
+ secret: true,
415
+ required: false,
416
+ defaultValue: ""
417
+ },
418
+ {
419
+ key: "OPENCLAW_REMOTE_GATEWAY_TOKEN",
420
+ description: "Auth token for connecting to a remote OpenClaw gateway (swarm upstream)",
421
+ secret: true,
422
+ required: false,
423
+ defaultValue: ""
424
+ },
425
+ {
426
+ key: "OPENCLAW_REMOTE_GATEWAY_PASSWORD",
427
+ description: "Password for remote gateway auth (alternative to token)",
428
+ secret: true,
429
+ required: false,
430
+ defaultValue: ""
285
431
  }
286
432
  ];
287
433
  for (const v of coreVars) seenKeys.add(v.key);
@@ -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\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Alternative auth: gateway password (use token OR password, not both)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_GATEWAY_PASSWORD\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Override state directory path (default: ~/.openclaw)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_STATE_DIR\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Override config file path (default: ~/.openclaw/openclaw.json)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_CONFIG_PATH\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Import missing keys from login shell profile (set to 1 to enable)\",\n\t\t\t\"OpenClaw Core\",\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t),\n\t\tkey: \"OPENCLAW_LOAD_SHELL_ENV\",\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// ── Tools API Keys (web search, fetch) ──────────────────────────────────\n\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Tools API Keys (web search, fetch, voice)\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Brave Search API key for web search tool (default provider)\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"BRAVE_API_KEY\",\n\t\texampleValue: \"your_brave_api_key_here\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Perplexity API key for web search tool (alternative provider)\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"PERPLEXITY_API_KEY\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Firecrawl API key for enhanced web fetch fallback\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"FIRECRAWL_API_KEY\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"ElevenLabs API key for Talk mode (text-to-speech)\",\n\t\t\t\"OpenClaw Tools\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"ELEVENLABS_API_KEY\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\t// ── Swarm / Remote Gateway ───────────────────────────────────────────────\n\n\tlines.push({\n\t\tcomment:\n\t\t\t\"\\n# ═══════════════════════════════════════════════════════════════════════════════\\n# Swarm / Remote Gateway Connection\\n# ═══════════════════════════════════════════════════════════════════════════════\",\n\t\tkey: \"\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Auth token for connecting to a remote OpenClaw gateway (swarm upstream)\",\n\t\t\t\"OpenClaw Swarm\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_TOKEN\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\n\t});\n\n\tlines.push({\n\t\tcomment: formatComment(\n\t\t\t\"Password for remote gateway auth (alternative to token)\",\n\t\t\t\"OpenClaw Swarm\",\n\t\t\tfalse,\n\t\t\ttrue,\n\t\t),\n\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_PASSWORD\",\n\t\texampleValue: \"\",\n\t\tactualValue: \"\",\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_GATEWAY_PASSWORD\",\n\t\t\"OPENCLAW_STATE_DIR\",\n\t\t\"OPENCLAW_CONFIG_PATH\",\n\t\t\"OPENCLAW_LOAD_SHELL_ENV\",\n\t\t\"OPENCLAW_DOMAIN\",\n\t\t\"BRAVE_API_KEY\",\n\t\t\"PERPLEXITY_API_KEY\",\n\t\t\"FIRECRAWL_API_KEY\",\n\t\t\"ELEVENLABS_API_KEY\",\n\t\t\"OPENCLAW_REMOTE_GATEWAY_TOKEN\",\n\t\t\"OPENCLAW_REMOTE_GATEWAY_PASSWORD\",\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\"# Docs: https://better-openclaw.dev/docs | Cloud: https://clawexa.net\",\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\t{\n\t\t\tkey: \"OPENCLAW_GATEWAY_PASSWORD\",\n\t\t\tdescription: \"Alternative auth: gateway password (use token OR password)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_STATE_DIR\",\n\t\t\tdescription: \"Override state directory path (default: ~/.openclaw)\",\n\t\t\tsecret: false,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_CONFIG_PATH\",\n\t\t\tdescription: \"Override config file path (default: ~/.openclaw/openclaw.json)\",\n\t\t\tsecret: false,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"BRAVE_API_KEY\",\n\t\t\tdescription: \"Brave Search API key for web search tool (default provider)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"PERPLEXITY_API_KEY\",\n\t\t\tdescription: \"Perplexity API key for web search (alternative provider)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"FIRECRAWL_API_KEY\",\n\t\t\tdescription: \"Firecrawl API key for enhanced web fetch fallback\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"ELEVENLABS_API_KEY\",\n\t\t\tdescription: \"ElevenLabs API key for Talk mode (text-to-speech)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_TOKEN\",\n\t\t\tdescription: \"Auth token for connecting to a remote OpenClaw gateway (swarm upstream)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\n\t\t},\n\t\t{\n\t\t\tkey: \"OPENCLAW_REMOTE_GATEWAY_PASSWORD\",\n\t\t\tdescription: \"Password for remote gateway auth (alternative to token)\",\n\t\t\tsecret: true,\n\t\t\trequired: false,\n\t\t\tdefaultValue: \"\",\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,4 +1,4 @@
1
- const require_vi_2VT5v0um = require("../vi.2VT5v0um-CRqXre87.cjs");
1
+ const require_vi_2VT5v0um = require("../vi.2VT5v0um-iVBt6Fyq.cjs");
2
2
  const require_generate = require("../generate.cjs");
3
3
  //#region src/generators/env.test.ts
4
4
  require_vi_2VT5v0um.describe("generateEnvFiles (via generate)", () => {
@@ -1,4 +1,4 @@
1
- import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-DvC3SVNc.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-C_jmO7m2.mjs";
2
2
  import { generate } from "../generate.mjs";
3
3
  //#region src/generators/env.test.ts
4
4
  describe("generateEnvFiles (via generate)", () => {
@@ -1,4 +1,4 @@
1
- const require_vi_2VT5v0um = require("../vi.2VT5v0um-CRqXre87.cjs");
1
+ const require_vi_2VT5v0um = require("../vi.2VT5v0um-iVBt6Fyq.cjs");
2
2
  const require_generate = require("../generate.cjs");
3
3
  //#region src/generators/health-check.test.ts
4
4
  require_vi_2VT5v0um.describe("generateHealthCheck (via generate)", () => {
@@ -1,4 +1,4 @@
1
- import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-DvC3SVNc.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-C_jmO7m2.mjs";
2
2
  import { generate } from "../generate.mjs";
3
3
  //#region src/generators/health-check.test.ts
4
4
  describe("generateHealthCheck (via generate)", () => {