@better-openclaw/core 1.0.20 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (975) hide show
  1. package/.github/workflows/publish-core.yml +1 -1
  2. package/dist/bare-metal-partition.cjs +2 -3
  3. package/dist/bare-metal-partition.cjs.map +1 -1
  4. package/dist/bare-metal-partition.d.mts.map +1 -1
  5. package/dist/bare-metal-partition.mjs +1 -1
  6. package/dist/bare-metal-partition.test.cjs +4 -5
  7. package/dist/bare-metal-partition.test.cjs.map +1 -1
  8. package/dist/bare-metal-partition.test.mjs +3 -4
  9. package/dist/bare-metal-partition.test.mjs.map +1 -1
  10. package/dist/compose-validation.test.cjs +5 -6
  11. package/dist/compose-validation.test.cjs.map +1 -1
  12. package/dist/compose-validation.test.mjs +2 -3
  13. package/dist/compose-validation.test.mjs.map +1 -1
  14. package/dist/composer.cjs +4 -5
  15. package/dist/composer.cjs.map +1 -1
  16. package/dist/composer.d.mts.map +1 -1
  17. package/dist/composer.mjs +1 -2
  18. package/dist/composer.mjs.map +1 -1
  19. package/dist/composer.snapshot.test.cjs +4 -5
  20. package/dist/composer.snapshot.test.cjs.map +1 -1
  21. package/dist/composer.snapshot.test.mjs +3 -4
  22. package/dist/composer.snapshot.test.mjs.map +1 -1
  23. package/dist/composer.test.cjs +5 -6
  24. package/dist/composer.test.cjs.map +1 -1
  25. package/dist/composer.test.mjs +3 -4
  26. package/dist/composer.test.mjs.map +1 -1
  27. package/dist/coolify-BVGGcMrT.d.mts +18 -0
  28. package/dist/coolify-BVGGcMrT.d.mts.map +1 -0
  29. package/dist/coolify-vlb1G9V2.d.cts +18 -0
  30. package/dist/coolify-vlb1G9V2.d.cts.map +1 -0
  31. package/dist/deployers/coolify.cjs +63 -53
  32. package/dist/deployers/coolify.cjs.map +1 -1
  33. package/dist/deployers/coolify.d.cts +2 -25
  34. package/dist/deployers/coolify.d.mts +2 -25
  35. package/dist/deployers/coolify.mjs +62 -51
  36. package/dist/deployers/coolify.mjs.map +1 -1
  37. package/dist/deployers/dokploy.cjs +108 -32
  38. package/dist/deployers/dokploy.cjs.map +1 -1
  39. package/dist/deployers/dokploy.d.cts +2 -24
  40. package/dist/deployers/dokploy.d.mts +2 -24
  41. package/dist/deployers/dokploy.mjs +107 -30
  42. package/dist/deployers/dokploy.mjs.map +1 -1
  43. package/dist/deployers/index.cjs +4 -5
  44. package/dist/deployers/index.cjs.map +1 -1
  45. package/dist/deployers/index.d.cts +4 -4
  46. package/dist/deployers/index.d.cts.map +1 -1
  47. package/dist/deployers/index.d.mts +4 -4
  48. package/dist/deployers/index.d.mts.map +1 -1
  49. package/dist/deployers/index.mjs +1 -2
  50. package/dist/deployers/index.mjs.map +1 -1
  51. package/dist/deployers/strip-host-ports.cjs +137 -0
  52. package/dist/deployers/strip-host-ports.cjs.map +1 -0
  53. package/dist/deployers/strip-host-ports.d.cts +62 -0
  54. package/dist/deployers/strip-host-ports.d.cts.map +1 -0
  55. package/dist/deployers/strip-host-ports.d.mts +62 -0
  56. package/dist/deployers/strip-host-ports.d.mts.map +1 -0
  57. package/dist/deployers/strip-host-ports.mjs +132 -0
  58. package/dist/deployers/strip-host-ports.mjs.map +1 -0
  59. package/dist/deployers/strip-host-ports.test.cjs +88 -0
  60. package/dist/deployers/strip-host-ports.test.cjs.map +1 -0
  61. package/dist/deployers/strip-host-ports.test.d.cts +1 -0
  62. package/dist/deployers/strip-host-ports.test.d.mts +1 -0
  63. package/dist/deployers/strip-host-ports.test.mjs +89 -0
  64. package/dist/deployers/strip-host-ports.test.mjs.map +1 -0
  65. package/dist/deployers/types.d.cts +2 -72
  66. package/dist/deployers/types.d.mts +2 -72
  67. package/dist/deployers/types.mjs +1 -1
  68. package/dist/dokploy-8cbrxUun.d.cts +25 -0
  69. package/dist/dokploy-8cbrxUun.d.cts.map +1 -0
  70. package/dist/dokploy-BTflLhTM.d.mts +25 -0
  71. package/dist/dokploy-BTflLhTM.d.mts.map +1 -0
  72. package/dist/errors.cjs +2 -3
  73. package/dist/errors.cjs.map +1 -1
  74. package/dist/errors.mjs +1 -1
  75. package/dist/errors.mjs.map +1 -1
  76. package/dist/generate.cjs +27 -28
  77. package/dist/generate.cjs.map +1 -1
  78. package/dist/generate.d.mts.map +1 -1
  79. package/dist/generate.mjs +1 -2
  80. package/dist/generate.mjs.map +1 -1
  81. package/dist/generate.test.cjs +4 -5
  82. package/dist/generate.test.cjs.map +1 -1
  83. package/dist/generate.test.mjs +3 -4
  84. package/dist/generate.test.mjs.map +1 -1
  85. package/dist/generators/bare-metal-install.cjs +2 -3
  86. package/dist/generators/bare-metal-install.cjs.map +1 -1
  87. package/dist/generators/bare-metal-install.d.mts.map +1 -1
  88. package/dist/generators/bare-metal-install.mjs +1 -1
  89. package/dist/generators/bare-metal-install.test.cjs +3 -4
  90. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  91. package/dist/generators/bare-metal-install.test.mjs +3 -4
  92. package/dist/generators/bare-metal-install.test.mjs.map +1 -1
  93. package/dist/generators/caddy.cjs +2 -3
  94. package/dist/generators/caddy.cjs.map +1 -1
  95. package/dist/generators/caddy.d.mts.map +1 -1
  96. package/dist/generators/caddy.mjs +1 -1
  97. package/dist/generators/caddy.test.cjs +3 -4
  98. package/dist/generators/caddy.test.cjs.map +1 -1
  99. package/dist/generators/caddy.test.mjs +3 -4
  100. package/dist/generators/caddy.test.mjs.map +1 -1
  101. package/dist/generators/cloud-init.cjs +2 -3
  102. package/dist/generators/cloud-init.cjs.map +1 -1
  103. package/dist/generators/cloud-init.mjs +1 -1
  104. package/dist/generators/env.cjs +4 -5
  105. package/dist/generators/env.cjs.map +1 -1
  106. package/dist/generators/env.d.mts.map +1 -1
  107. package/dist/generators/env.mjs +1 -2
  108. package/dist/generators/env.mjs.map +1 -1
  109. package/dist/generators/env.test.cjs +3 -4
  110. package/dist/generators/env.test.cjs.map +1 -1
  111. package/dist/generators/env.test.mjs +3 -4
  112. package/dist/generators/env.test.mjs.map +1 -1
  113. package/dist/generators/get-shit-done.cjs +2 -3
  114. package/dist/generators/get-shit-done.cjs.map +1 -1
  115. package/dist/generators/get-shit-done.mjs +1 -1
  116. package/dist/generators/grafana.cjs +2 -3
  117. package/dist/generators/grafana.cjs.map +1 -1
  118. package/dist/generators/grafana.mjs +1 -1
  119. package/dist/generators/health-check.cjs +2 -3
  120. package/dist/generators/health-check.cjs.map +1 -1
  121. package/dist/generators/health-check.d.mts.map +1 -1
  122. package/dist/generators/health-check.mjs +1 -1
  123. package/dist/generators/health-check.test.cjs +3 -4
  124. package/dist/generators/health-check.test.cjs.map +1 -1
  125. package/dist/generators/health-check.test.mjs +3 -4
  126. package/dist/generators/health-check.test.mjs.map +1 -1
  127. package/dist/generators/n8n-workflows.cjs +2 -3
  128. package/dist/generators/n8n-workflows.cjs.map +1 -1
  129. package/dist/generators/n8n-workflows.d.mts.map +1 -1
  130. package/dist/generators/n8n-workflows.mjs +1 -1
  131. package/dist/generators/native-services.cjs +2 -3
  132. package/dist/generators/native-services.cjs.map +1 -1
  133. package/dist/generators/native-services.mjs +1 -1
  134. package/dist/generators/openclaw-install-script.cjs +2 -3
  135. package/dist/generators/openclaw-install-script.cjs.map +1 -1
  136. package/dist/generators/openclaw-install-script.mjs +1 -1
  137. package/dist/generators/openclaw-json.cjs +2 -3
  138. package/dist/generators/openclaw-json.cjs.map +1 -1
  139. package/dist/generators/openclaw-json.mjs +1 -1
  140. package/dist/generators/postgres-init.cjs +32 -3
  141. package/dist/generators/postgres-init.cjs.map +1 -1
  142. package/dist/generators/postgres-init.d.cts.map +1 -1
  143. package/dist/generators/postgres-init.d.mts.map +1 -1
  144. package/dist/generators/postgres-init.mjs +31 -1
  145. package/dist/generators/postgres-init.mjs.map +1 -1
  146. package/dist/generators/prometheus.cjs +2 -3
  147. package/dist/generators/prometheus.cjs.map +1 -1
  148. package/dist/generators/prometheus.d.mts.map +1 -1
  149. package/dist/generators/prometheus.mjs +1 -1
  150. package/dist/generators/readme.cjs +2 -3
  151. package/dist/generators/readme.cjs.map +1 -1
  152. package/dist/generators/readme.d.mts.map +1 -1
  153. package/dist/generators/readme.mjs +1 -1
  154. package/dist/generators/scripts.cjs +2 -3
  155. package/dist/generators/scripts.cjs.map +1 -1
  156. package/dist/generators/scripts.mjs +1 -1
  157. package/dist/generators/scripts.test.cjs +3 -4
  158. package/dist/generators/scripts.test.cjs.map +1 -1
  159. package/dist/generators/scripts.test.mjs +3 -4
  160. package/dist/generators/scripts.test.mjs.map +1 -1
  161. package/dist/generators/skills.cjs +3 -590
  162. package/dist/generators/skills.d.mts.map +1 -1
  163. package/dist/generators/skills.mjs +1 -2
  164. package/dist/generators/skills.mjs.map +1 -1
  165. package/dist/generators/stack-manifest.cjs +2 -3
  166. package/dist/generators/stack-manifest.cjs.map +1 -1
  167. package/dist/generators/stack-manifest.mjs +1 -1
  168. package/dist/generators/traefik.cjs +2 -3
  169. package/dist/generators/traefik.cjs.map +1 -1
  170. package/dist/generators/traefik.mjs +1 -1
  171. package/dist/generators/traefik.test.cjs +4 -5
  172. package/dist/generators/traefik.test.cjs.map +1 -1
  173. package/dist/generators/traefik.test.mjs +3 -4
  174. package/dist/generators/traefik.test.mjs.map +1 -1
  175. package/dist/index.cjs +35 -36
  176. package/dist/index.d.cts +5 -5
  177. package/dist/index.d.mts +5 -5
  178. package/dist/index.mjs +2 -3
  179. package/dist/{magic-string.es-D2agHT3I.cjs → magic-string.es-CJq41xdM.cjs} +2 -4
  180. package/dist/{magic-string.es-CfFonO_S.mjs.map → magic-string.es-CJq41xdM.cjs.map} +1 -1
  181. package/dist/{magic-string.es-CfFonO_S.mjs → magic-string.es-CoDyF8pj.mjs} +2 -3
  182. package/dist/{magic-string.es-D2agHT3I.cjs.map → magic-string.es-CoDyF8pj.mjs.map} +1 -1
  183. package/dist/migrations.cjs +5 -6
  184. package/dist/migrations.cjs.map +1 -1
  185. package/dist/migrations.mjs +4 -4
  186. package/dist/migrations.mjs.map +1 -1
  187. package/dist/migrations.test.cjs +6 -7
  188. package/dist/migrations.test.cjs.map +1 -1
  189. package/dist/migrations.test.mjs +7 -8
  190. package/dist/migrations.test.mjs.map +1 -1
  191. package/dist/port-scanner.cjs +2 -3
  192. package/dist/port-scanner.cjs.map +1 -1
  193. package/dist/port-scanner.d.mts.map +1 -1
  194. package/dist/port-scanner.mjs +1 -1
  195. package/dist/presets/presets.test.cjs +11 -8
  196. package/dist/presets/presets.test.cjs.map +1 -1
  197. package/dist/presets/presets.test.mjs +7 -4
  198. package/dist/presets/presets.test.mjs.map +1 -1
  199. package/dist/presets/registry.cjs +152 -3
  200. package/dist/presets/registry.cjs.map +1 -1
  201. package/dist/presets/registry.d.cts.map +1 -1
  202. package/dist/presets/registry.d.mts.map +1 -1
  203. package/dist/presets/registry.mjs +151 -1
  204. package/dist/presets/registry.mjs.map +1 -1
  205. package/dist/presets/registry.test.cjs +3 -4
  206. package/dist/presets/registry.test.cjs.map +1 -1
  207. package/dist/presets/registry.test.mjs +3 -4
  208. package/dist/presets/registry.test.mjs.map +1 -1
  209. package/dist/resolver.cjs +4 -5
  210. package/dist/resolver.cjs.map +1 -1
  211. package/dist/resolver.d.mts.map +1 -1
  212. package/dist/resolver.mjs +1 -2
  213. package/dist/resolver.mjs.map +1 -1
  214. package/dist/resolver.test.cjs +3 -4
  215. package/dist/resolver.test.cjs.map +1 -1
  216. package/dist/resolver.test.mjs +3 -4
  217. package/dist/resolver.test.mjs.map +1 -1
  218. package/dist/schema-C_hc7e4k.d.cts +898 -0
  219. package/dist/schema-C_hc7e4k.d.cts.map +1 -0
  220. package/dist/schema-CaesJaS2.d.mts +898 -0
  221. package/dist/schema-CaesJaS2.d.mts.map +1 -0
  222. package/dist/schema.cjs +15 -5
  223. package/dist/schema.cjs.map +1 -1
  224. package/dist/schema.d.cts +2 -854
  225. package/dist/schema.d.mts +2 -854
  226. package/dist/schema.mjs +13 -3
  227. package/dist/schema.mjs.map +1 -1
  228. package/dist/schema.test.cjs +3 -4
  229. package/dist/schema.test.cjs.map +1 -1
  230. package/dist/schema.test.mjs +3 -4
  231. package/dist/schema.test.mjs.map +1 -1
  232. package/dist/services/definitions/airbyte.cjs +76 -0
  233. package/dist/services/definitions/airbyte.cjs.map +1 -0
  234. package/dist/services/definitions/airbyte.d.cts +7 -0
  235. package/dist/services/definitions/airbyte.d.cts.map +1 -0
  236. package/dist/services/definitions/airbyte.d.mts +7 -0
  237. package/dist/services/definitions/airbyte.d.mts.map +1 -0
  238. package/dist/services/definitions/airbyte.mjs +75 -0
  239. package/dist/services/definitions/airbyte.mjs.map +1 -0
  240. package/dist/services/definitions/airflow.cjs +109 -0
  241. package/dist/services/definitions/airflow.cjs.map +1 -0
  242. package/dist/services/definitions/airflow.d.cts +7 -0
  243. package/dist/services/definitions/airflow.d.cts.map +1 -0
  244. package/dist/services/definitions/airflow.d.mts +7 -0
  245. package/dist/services/definitions/airflow.d.mts.map +1 -0
  246. package/dist/services/definitions/airflow.mjs +108 -0
  247. package/dist/services/definitions/airflow.mjs.map +1 -0
  248. package/dist/services/definitions/anything-llm.cjs +2 -3
  249. package/dist/services/definitions/anything-llm.cjs.map +1 -1
  250. package/dist/services/definitions/anything-llm.mjs +1 -1
  251. package/dist/services/definitions/appflowy.cjs +2 -3
  252. package/dist/services/definitions/appflowy.cjs.map +1 -1
  253. package/dist/services/definitions/appflowy.mjs +1 -1
  254. package/dist/services/definitions/appwrite.cjs +190 -0
  255. package/dist/services/definitions/appwrite.cjs.map +1 -0
  256. package/dist/services/definitions/appwrite.d.cts +7 -0
  257. package/dist/services/definitions/appwrite.d.cts.map +1 -0
  258. package/dist/services/definitions/appwrite.d.mts +7 -0
  259. package/dist/services/definitions/appwrite.d.mts.map +1 -0
  260. package/dist/services/definitions/appwrite.mjs +189 -0
  261. package/dist/services/definitions/appwrite.mjs.map +1 -0
  262. package/dist/services/definitions/authelia.cjs +145 -0
  263. package/dist/services/definitions/authelia.cjs.map +1 -0
  264. package/dist/services/definitions/authelia.d.cts +7 -0
  265. package/dist/services/definitions/authelia.d.cts.map +1 -0
  266. package/dist/services/definitions/authelia.d.mts +7 -0
  267. package/dist/services/definitions/authelia.d.mts.map +1 -0
  268. package/dist/services/definitions/authelia.mjs +144 -0
  269. package/dist/services/definitions/authelia.mjs.map +1 -0
  270. package/dist/services/definitions/authentik.cjs +2 -3
  271. package/dist/services/definitions/authentik.cjs.map +1 -1
  272. package/dist/services/definitions/authentik.mjs +1 -1
  273. package/dist/services/definitions/axolotl.cjs +67 -0
  274. package/dist/services/definitions/axolotl.cjs.map +1 -0
  275. package/dist/services/definitions/axolotl.d.cts +7 -0
  276. package/dist/services/definitions/axolotl.d.cts.map +1 -0
  277. package/dist/services/definitions/axolotl.d.mts +7 -0
  278. package/dist/services/definitions/axolotl.d.mts.map +1 -0
  279. package/dist/services/definitions/axolotl.mjs +66 -0
  280. package/dist/services/definitions/axolotl.mjs.map +1 -0
  281. package/dist/services/definitions/beszel.cjs +2 -3
  282. package/dist/services/definitions/beszel.cjs.map +1 -1
  283. package/dist/services/definitions/beszel.mjs +1 -1
  284. package/dist/services/definitions/browserless.cjs +2 -3
  285. package/dist/services/definitions/browserless.cjs.map +1 -1
  286. package/dist/services/definitions/browserless.mjs +1 -1
  287. package/dist/services/definitions/caddy.cjs +2 -3
  288. package/dist/services/definitions/caddy.cjs.map +1 -1
  289. package/dist/services/definitions/caddy.mjs +1 -1
  290. package/dist/services/definitions/cal-com.cjs +2 -3
  291. package/dist/services/definitions/cal-com.cjs.map +1 -1
  292. package/dist/services/definitions/cal-com.mjs +1 -1
  293. package/dist/services/definitions/chatwoot-worker.cjs +95 -0
  294. package/dist/services/definitions/chatwoot-worker.cjs.map +1 -0
  295. package/dist/services/definitions/chatwoot-worker.d.cts +7 -0
  296. package/dist/services/definitions/chatwoot-worker.d.cts.map +1 -0
  297. package/dist/services/definitions/chatwoot-worker.d.mts +7 -0
  298. package/dist/services/definitions/chatwoot-worker.d.mts.map +1 -0
  299. package/dist/services/definitions/chatwoot-worker.mjs +94 -0
  300. package/dist/services/definitions/chatwoot-worker.mjs.map +1 -0
  301. package/dist/services/definitions/chatwoot.cjs +112 -0
  302. package/dist/services/definitions/chatwoot.cjs.map +1 -0
  303. package/dist/services/definitions/chatwoot.d.cts +7 -0
  304. package/dist/services/definitions/chatwoot.d.cts.map +1 -0
  305. package/dist/services/definitions/chatwoot.d.mts +7 -0
  306. package/dist/services/definitions/chatwoot.d.mts.map +1 -0
  307. package/dist/services/definitions/chatwoot.mjs +111 -0
  308. package/dist/services/definitions/chatwoot.mjs.map +1 -0
  309. package/dist/services/definitions/chromadb.cjs +2 -3
  310. package/dist/services/definitions/chromadb.cjs.map +1 -1
  311. package/dist/services/definitions/chromadb.mjs +1 -1
  312. package/dist/services/definitions/claude-code.cjs +2 -3
  313. package/dist/services/definitions/claude-code.cjs.map +1 -1
  314. package/dist/services/definitions/claude-code.mjs +1 -1
  315. package/dist/services/definitions/code-server.cjs +2 -3
  316. package/dist/services/definitions/code-server.cjs.map +1 -1
  317. package/dist/services/definitions/code-server.mjs +1 -1
  318. package/dist/services/definitions/codex.cjs +2 -3
  319. package/dist/services/definitions/codex.cjs.map +1 -1
  320. package/dist/services/definitions/codex.mjs +1 -1
  321. package/dist/services/definitions/comfyui.cjs +2 -3
  322. package/dist/services/definitions/comfyui.cjs.map +1 -1
  323. package/dist/services/definitions/comfyui.mjs +1 -1
  324. package/dist/services/definitions/convex-dashboard.cjs +2 -3
  325. package/dist/services/definitions/convex-dashboard.cjs.map +1 -1
  326. package/dist/services/definitions/convex-dashboard.mjs +1 -1
  327. package/dist/services/definitions/convex.cjs +2 -3
  328. package/dist/services/definitions/convex.cjs.map +1 -1
  329. package/dist/services/definitions/convex.mjs +1 -1
  330. package/dist/services/definitions/coolify.cjs +2 -3
  331. package/dist/services/definitions/coolify.cjs.map +1 -1
  332. package/dist/services/definitions/coolify.mjs +1 -1
  333. package/dist/services/definitions/crowdsec.cjs +2 -3
  334. package/dist/services/definitions/crowdsec.cjs.map +1 -1
  335. package/dist/services/definitions/crowdsec.mjs +1 -1
  336. package/dist/services/definitions/dagster.cjs +83 -0
  337. package/dist/services/definitions/dagster.cjs.map +1 -0
  338. package/dist/services/definitions/dagster.d.cts +7 -0
  339. package/dist/services/definitions/dagster.d.cts.map +1 -0
  340. package/dist/services/definitions/dagster.d.mts +7 -0
  341. package/dist/services/definitions/dagster.d.mts.map +1 -0
  342. package/dist/services/definitions/dagster.mjs +82 -0
  343. package/dist/services/definitions/dagster.mjs.map +1 -0
  344. package/dist/services/definitions/desktop-environment.cjs +2 -3
  345. package/dist/services/definitions/desktop-environment.cjs.map +1 -1
  346. package/dist/services/definitions/desktop-environment.mjs +1 -1
  347. package/dist/services/definitions/dify.cjs +2 -3
  348. package/dist/services/definitions/dify.cjs.map +1 -1
  349. package/dist/services/definitions/dify.mjs +1 -1
  350. package/dist/services/definitions/directus.cjs +115 -0
  351. package/dist/services/definitions/directus.cjs.map +1 -0
  352. package/dist/services/definitions/directus.d.cts +7 -0
  353. package/dist/services/definitions/directus.d.cts.map +1 -0
  354. package/dist/services/definitions/directus.d.mts +7 -0
  355. package/dist/services/definitions/directus.d.mts.map +1 -0
  356. package/dist/services/definitions/directus.mjs +114 -0
  357. package/dist/services/definitions/directus.mjs.map +1 -0
  358. package/dist/services/definitions/docsgpt.cjs +2 -3
  359. package/dist/services/definitions/docsgpt.cjs.map +1 -1
  360. package/dist/services/definitions/docsgpt.mjs +1 -1
  361. package/dist/services/definitions/dokploy.cjs +2 -3
  362. package/dist/services/definitions/dokploy.cjs.map +1 -1
  363. package/dist/services/definitions/dokploy.mjs +1 -1
  364. package/dist/services/definitions/dozzle.cjs +2 -3
  365. package/dist/services/definitions/dozzle.cjs.map +1 -1
  366. package/dist/services/definitions/dozzle.mjs +1 -1
  367. package/dist/services/definitions/duplicati.cjs +76 -0
  368. package/dist/services/definitions/duplicati.cjs.map +1 -0
  369. package/dist/services/definitions/duplicati.d.cts +7 -0
  370. package/dist/services/definitions/duplicati.d.cts.map +1 -0
  371. package/dist/services/definitions/duplicati.d.mts +7 -0
  372. package/dist/services/definitions/duplicati.d.mts.map +1 -0
  373. package/dist/services/definitions/duplicati.mjs +75 -0
  374. package/dist/services/definitions/duplicati.mjs.map +1 -0
  375. package/dist/services/definitions/excalidraw.cjs +48 -0
  376. package/dist/services/definitions/excalidraw.cjs.map +1 -0
  377. package/dist/services/definitions/excalidraw.d.cts +7 -0
  378. package/dist/services/definitions/excalidraw.d.cts.map +1 -0
  379. package/dist/services/definitions/excalidraw.d.mts +7 -0
  380. package/dist/services/definitions/excalidraw.d.mts.map +1 -0
  381. package/dist/services/definitions/excalidraw.mjs +47 -0
  382. package/dist/services/definitions/excalidraw.mjs.map +1 -0
  383. package/dist/services/definitions/ffmpeg.cjs +2 -3
  384. package/dist/services/definitions/ffmpeg.cjs.map +1 -1
  385. package/dist/services/definitions/ffmpeg.mjs +1 -1
  386. package/dist/services/definitions/firecrawl-playwright.cjs +61 -0
  387. package/dist/services/definitions/firecrawl-playwright.cjs.map +1 -0
  388. package/dist/services/definitions/firecrawl-playwright.d.cts +7 -0
  389. package/dist/services/definitions/firecrawl-playwright.d.cts.map +1 -0
  390. package/dist/services/definitions/firecrawl-playwright.d.mts +7 -0
  391. package/dist/services/definitions/firecrawl-playwright.d.mts.map +1 -0
  392. package/dist/services/definitions/firecrawl-playwright.mjs +60 -0
  393. package/dist/services/definitions/firecrawl-playwright.mjs.map +1 -0
  394. package/dist/services/definitions/firecrawl.cjs +163 -0
  395. package/dist/services/definitions/firecrawl.cjs.map +1 -0
  396. package/dist/services/definitions/firecrawl.d.cts +7 -0
  397. package/dist/services/definitions/firecrawl.d.cts.map +1 -0
  398. package/dist/services/definitions/firecrawl.d.mts +7 -0
  399. package/dist/services/definitions/firecrawl.d.mts.map +1 -0
  400. package/dist/services/definitions/firecrawl.mjs +162 -0
  401. package/dist/services/definitions/firecrawl.mjs.map +1 -0
  402. package/dist/services/definitions/flagsmith.cjs +77 -0
  403. package/dist/services/definitions/flagsmith.cjs.map +1 -0
  404. package/dist/services/definitions/flagsmith.d.cts +7 -0
  405. package/dist/services/definitions/flagsmith.d.cts.map +1 -0
  406. package/dist/services/definitions/flagsmith.d.mts +7 -0
  407. package/dist/services/definitions/flagsmith.d.mts.map +1 -0
  408. package/dist/services/definitions/flagsmith.mjs +76 -0
  409. package/dist/services/definitions/flagsmith.mjs.map +1 -0
  410. package/dist/services/definitions/flowise.cjs +2 -3
  411. package/dist/services/definitions/flowise.cjs.map +1 -1
  412. package/dist/services/definitions/flowise.mjs +1 -1
  413. package/dist/services/definitions/fonoster.cjs +66 -0
  414. package/dist/services/definitions/fonoster.cjs.map +1 -0
  415. package/dist/services/definitions/fonoster.d.cts +7 -0
  416. package/dist/services/definitions/fonoster.d.cts.map +1 -0
  417. package/dist/services/definitions/fonoster.d.mts +7 -0
  418. package/dist/services/definitions/fonoster.d.mts.map +1 -0
  419. package/dist/services/definitions/fonoster.mjs +65 -0
  420. package/dist/services/definitions/fonoster.mjs.map +1 -0
  421. package/dist/services/definitions/formbricks.cjs +75 -0
  422. package/dist/services/definitions/formbricks.cjs.map +1 -0
  423. package/dist/services/definitions/formbricks.d.cts +7 -0
  424. package/dist/services/definitions/formbricks.d.cts.map +1 -0
  425. package/dist/services/definitions/formbricks.d.mts +7 -0
  426. package/dist/services/definitions/formbricks.d.mts.map +1 -0
  427. package/dist/services/definitions/formbricks.mjs +74 -0
  428. package/dist/services/definitions/formbricks.mjs.map +1 -0
  429. package/dist/services/definitions/gemini-cli.cjs +2 -3
  430. package/dist/services/definitions/gemini-cli.cjs.map +1 -1
  431. package/dist/services/definitions/gemini-cli.mjs +1 -1
  432. package/dist/services/definitions/ghost.cjs +2 -3
  433. package/dist/services/definitions/ghost.cjs.map +1 -1
  434. package/dist/services/definitions/ghost.mjs +1 -1
  435. package/dist/services/definitions/gitea.cjs +2 -3
  436. package/dist/services/definitions/gitea.cjs.map +1 -1
  437. package/dist/services/definitions/gitea.mjs +1 -1
  438. package/dist/services/definitions/gotify.cjs +2 -3
  439. package/dist/services/definitions/gotify.cjs.map +1 -1
  440. package/dist/services/definitions/gotify.mjs +1 -1
  441. package/dist/services/definitions/grafana.cjs +2 -3
  442. package/dist/services/definitions/grafana.cjs.map +1 -1
  443. package/dist/services/definitions/grafana.mjs +1 -1
  444. package/dist/services/definitions/headscale.cjs +2 -3
  445. package/dist/services/definitions/headscale.cjs.map +1 -1
  446. package/dist/services/definitions/headscale.mjs +1 -1
  447. package/dist/services/definitions/hedgedoc.cjs +82 -0
  448. package/dist/services/definitions/hedgedoc.cjs.map +1 -0
  449. package/dist/services/definitions/hedgedoc.d.cts +7 -0
  450. package/dist/services/definitions/hedgedoc.d.cts.map +1 -0
  451. package/dist/services/definitions/hedgedoc.d.mts +7 -0
  452. package/dist/services/definitions/hedgedoc.d.mts.map +1 -0
  453. package/dist/services/definitions/hedgedoc.mjs +81 -0
  454. package/dist/services/definitions/hedgedoc.mjs.map +1 -0
  455. package/dist/services/definitions/hexstrike.cjs +2 -3
  456. package/dist/services/definitions/hexstrike.cjs.map +1 -1
  457. package/dist/services/definitions/hexstrike.mjs +1 -1
  458. package/dist/services/definitions/heyform.cjs +64 -0
  459. package/dist/services/definitions/heyform.cjs.map +1 -0
  460. package/dist/services/definitions/heyform.d.cts +7 -0
  461. package/dist/services/definitions/heyform.d.cts.map +1 -0
  462. package/dist/services/definitions/heyform.d.mts +7 -0
  463. package/dist/services/definitions/heyform.d.mts.map +1 -0
  464. package/dist/services/definitions/heyform.mjs +63 -0
  465. package/dist/services/definitions/heyform.mjs.map +1 -0
  466. package/dist/services/definitions/homeassistant.cjs +2 -3
  467. package/dist/services/definitions/homeassistant.cjs.map +1 -1
  468. package/dist/services/definitions/homeassistant.mjs +1 -1
  469. package/dist/services/definitions/hoppscotch.cjs +76 -0
  470. package/dist/services/definitions/hoppscotch.cjs.map +1 -0
  471. package/dist/services/definitions/hoppscotch.d.cts +7 -0
  472. package/dist/services/definitions/hoppscotch.d.cts.map +1 -0
  473. package/dist/services/definitions/hoppscotch.d.mts +7 -0
  474. package/dist/services/definitions/hoppscotch.d.mts.map +1 -0
  475. package/dist/services/definitions/hoppscotch.mjs +75 -0
  476. package/dist/services/definitions/hoppscotch.mjs.map +1 -0
  477. package/dist/services/definitions/immich.cjs +2 -3
  478. package/dist/services/definitions/immich.cjs.map +1 -1
  479. package/dist/services/definitions/immich.mjs +1 -1
  480. package/dist/services/definitions/index.cjs +220 -98
  481. package/dist/services/definitions/index.cjs.map +1 -1
  482. package/dist/services/definitions/index.d.cts +42 -1
  483. package/dist/services/definitions/index.d.cts.map +1 -1
  484. package/dist/services/definitions/index.d.mts +42 -1
  485. package/dist/services/definitions/index.d.mts.map +1 -1
  486. package/dist/services/definitions/index.mjs +85 -4
  487. package/dist/services/definitions/index.mjs.map +1 -1
  488. package/dist/services/definitions/infisical.cjs +99 -0
  489. package/dist/services/definitions/infisical.cjs.map +1 -0
  490. package/dist/services/definitions/infisical.d.cts +7 -0
  491. package/dist/services/definitions/infisical.d.cts.map +1 -0
  492. package/dist/services/definitions/infisical.d.mts +7 -0
  493. package/dist/services/definitions/infisical.d.mts.map +1 -0
  494. package/dist/services/definitions/infisical.mjs +98 -0
  495. package/dist/services/definitions/infisical.mjs.map +1 -0
  496. package/dist/services/definitions/jellyfin.cjs +2 -3
  497. package/dist/services/definitions/jellyfin.cjs.map +1 -1
  498. package/dist/services/definitions/jellyfin.mjs +1 -1
  499. package/dist/services/definitions/jenkins.cjs +2 -3
  500. package/dist/services/definitions/jenkins.cjs.map +1 -1
  501. package/dist/services/definitions/jenkins.mjs +1 -1
  502. package/dist/services/definitions/keycloak.cjs +122 -0
  503. package/dist/services/definitions/keycloak.cjs.map +1 -0
  504. package/dist/services/definitions/keycloak.d.cts +7 -0
  505. package/dist/services/definitions/keycloak.d.cts.map +1 -0
  506. package/dist/services/definitions/keycloak.d.mts +7 -0
  507. package/dist/services/definitions/keycloak.d.mts.map +1 -0
  508. package/dist/services/definitions/keycloak.mjs +121 -0
  509. package/dist/services/definitions/keycloak.mjs.map +1 -0
  510. package/dist/services/definitions/kimi.cjs +2 -3
  511. package/dist/services/definitions/kimi.cjs.map +1 -1
  512. package/dist/services/definitions/kimi.mjs +1 -1
  513. package/dist/services/definitions/kong.cjs +121 -0
  514. package/dist/services/definitions/kong.cjs.map +1 -0
  515. package/dist/services/definitions/kong.d.cts +7 -0
  516. package/dist/services/definitions/kong.d.cts.map +1 -0
  517. package/dist/services/definitions/kong.d.mts +7 -0
  518. package/dist/services/definitions/kong.d.mts.map +1 -0
  519. package/dist/services/definitions/kong.mjs +120 -0
  520. package/dist/services/definitions/kong.mjs.map +1 -0
  521. package/dist/services/definitions/lago.cjs +95 -0
  522. package/dist/services/definitions/lago.cjs.map +1 -0
  523. package/dist/services/definitions/lago.d.cts +7 -0
  524. package/dist/services/definitions/lago.d.cts.map +1 -0
  525. package/dist/services/definitions/lago.d.mts +7 -0
  526. package/dist/services/definitions/lago.d.mts.map +1 -0
  527. package/dist/services/definitions/lago.mjs +94 -0
  528. package/dist/services/definitions/lago.mjs.map +1 -0
  529. package/dist/services/definitions/langflow.cjs +88 -0
  530. package/dist/services/definitions/langflow.cjs.map +1 -0
  531. package/dist/services/definitions/langflow.d.cts +7 -0
  532. package/dist/services/definitions/langflow.d.cts.map +1 -0
  533. package/dist/services/definitions/langflow.d.mts +7 -0
  534. package/dist/services/definitions/langflow.d.mts.map +1 -0
  535. package/dist/services/definitions/langflow.mjs +87 -0
  536. package/dist/services/definitions/langflow.mjs.map +1 -0
  537. package/dist/services/definitions/langfuse.cjs +79 -0
  538. package/dist/services/definitions/langfuse.cjs.map +1 -0
  539. package/dist/services/definitions/langfuse.d.cts +7 -0
  540. package/dist/services/definitions/langfuse.d.cts.map +1 -0
  541. package/dist/services/definitions/langfuse.d.mts +7 -0
  542. package/dist/services/definitions/langfuse.d.mts.map +1 -0
  543. package/dist/services/definitions/langfuse.mjs +78 -0
  544. package/dist/services/definitions/langfuse.mjs.map +1 -0
  545. package/dist/services/definitions/lasuite-meet-agents.cjs +2 -3
  546. package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -1
  547. package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
  548. package/dist/services/definitions/lasuite-meet-backend.cjs +2 -3
  549. package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -1
  550. package/dist/services/definitions/lasuite-meet-backend.mjs +1 -1
  551. package/dist/services/definitions/lasuite-meet-frontend.cjs +2 -3
  552. package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -1
  553. package/dist/services/definitions/lasuite-meet-frontend.mjs +1 -1
  554. package/dist/services/definitions/librechat.cjs +2 -3
  555. package/dist/services/definitions/librechat.cjs.map +1 -1
  556. package/dist/services/definitions/librechat.mjs +1 -1
  557. package/dist/services/definitions/lightpanda.cjs +2 -3
  558. package/dist/services/definitions/lightpanda.cjs.map +1 -1
  559. package/dist/services/definitions/lightpanda.mjs +1 -1
  560. package/dist/services/definitions/listmonk.cjs +118 -0
  561. package/dist/services/definitions/listmonk.cjs.map +1 -0
  562. package/dist/services/definitions/listmonk.d.cts +7 -0
  563. package/dist/services/definitions/listmonk.d.cts.map +1 -0
  564. package/dist/services/definitions/listmonk.d.mts +7 -0
  565. package/dist/services/definitions/listmonk.d.mts.map +1 -0
  566. package/dist/services/definitions/listmonk.mjs +117 -0
  567. package/dist/services/definitions/listmonk.mjs.map +1 -0
  568. package/dist/services/definitions/litellm.cjs +2 -3
  569. package/dist/services/definitions/litellm.cjs.map +1 -1
  570. package/dist/services/definitions/litellm.mjs +1 -1
  571. package/dist/services/definitions/livekit.cjs +2 -3
  572. package/dist/services/definitions/livekit.cjs.map +1 -1
  573. package/dist/services/definitions/livekit.mjs +1 -1
  574. package/dist/services/definitions/loki.cjs +2 -3
  575. package/dist/services/definitions/loki.cjs.map +1 -1
  576. package/dist/services/definitions/loki.mjs +1 -1
  577. package/dist/services/definitions/mariadb.cjs +81 -0
  578. package/dist/services/definitions/mariadb.cjs.map +1 -0
  579. package/dist/services/definitions/mariadb.d.cts +7 -0
  580. package/dist/services/definitions/mariadb.d.cts.map +1 -0
  581. package/dist/services/definitions/mariadb.d.mts +7 -0
  582. package/dist/services/definitions/mariadb.d.mts.map +1 -0
  583. package/dist/services/definitions/mariadb.mjs +80 -0
  584. package/dist/services/definitions/mariadb.mjs.map +1 -0
  585. package/dist/services/definitions/matomo.cjs +2 -3
  586. package/dist/services/definitions/matomo.cjs.map +1 -1
  587. package/dist/services/definitions/matomo.mjs +1 -1
  588. package/dist/services/definitions/matrix-synapse.cjs +2 -3
  589. package/dist/services/definitions/matrix-synapse.cjs.map +1 -1
  590. package/dist/services/definitions/matrix-synapse.mjs +1 -1
  591. package/dist/services/definitions/mattermost.cjs +2 -3
  592. package/dist/services/definitions/mattermost.cjs.map +1 -1
  593. package/dist/services/definitions/mattermost.mjs +1 -1
  594. package/dist/services/definitions/mautic.cjs +83 -0
  595. package/dist/services/definitions/mautic.cjs.map +1 -0
  596. package/dist/services/definitions/mautic.d.cts +7 -0
  597. package/dist/services/definitions/mautic.d.cts.map +1 -0
  598. package/dist/services/definitions/mautic.d.mts +7 -0
  599. package/dist/services/definitions/mautic.d.mts.map +1 -0
  600. package/dist/services/definitions/mautic.mjs +82 -0
  601. package/dist/services/definitions/mautic.mjs.map +1 -0
  602. package/dist/services/definitions/medusa.cjs +83 -0
  603. package/dist/services/definitions/medusa.cjs.map +1 -0
  604. package/dist/services/definitions/medusa.d.cts +7 -0
  605. package/dist/services/definitions/medusa.d.cts.map +1 -0
  606. package/dist/services/definitions/medusa.d.mts +7 -0
  607. package/dist/services/definitions/medusa.d.mts.map +1 -0
  608. package/dist/services/definitions/medusa.mjs +82 -0
  609. package/dist/services/definitions/medusa.mjs.map +1 -0
  610. package/dist/services/definitions/meilisearch.cjs +2 -3
  611. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  612. package/dist/services/definitions/meilisearch.mjs +1 -1
  613. package/dist/services/definitions/milvus.cjs +2 -3
  614. package/dist/services/definitions/milvus.cjs.map +1 -1
  615. package/dist/services/definitions/milvus.mjs +1 -1
  616. package/dist/services/definitions/minio.cjs +2 -3
  617. package/dist/services/definitions/minio.cjs.map +1 -1
  618. package/dist/services/definitions/minio.mjs +1 -1
  619. package/dist/services/definitions/mission-control.cjs +2 -3
  620. package/dist/services/definitions/mission-control.cjs.map +1 -1
  621. package/dist/services/definitions/mission-control.mjs +1 -1
  622. package/dist/services/definitions/mixpost.cjs +2 -3
  623. package/dist/services/definitions/mixpost.cjs.map +1 -1
  624. package/dist/services/definitions/mixpost.mjs +1 -1
  625. package/dist/services/definitions/motion-canvas.cjs +2 -3
  626. package/dist/services/definitions/motion-canvas.cjs.map +1 -1
  627. package/dist/services/definitions/motion-canvas.mjs +1 -1
  628. package/dist/services/definitions/mysql.cjs +81 -0
  629. package/dist/services/definitions/mysql.cjs.map +1 -0
  630. package/dist/services/definitions/mysql.d.cts +7 -0
  631. package/dist/services/definitions/mysql.d.cts.map +1 -0
  632. package/dist/services/definitions/mysql.d.mts +7 -0
  633. package/dist/services/definitions/mysql.d.mts.map +1 -0
  634. package/dist/services/definitions/mysql.mjs +80 -0
  635. package/dist/services/definitions/mysql.mjs.map +1 -0
  636. package/dist/services/definitions/n8n.cjs +2 -3
  637. package/dist/services/definitions/n8n.cjs.map +1 -1
  638. package/dist/services/definitions/n8n.mjs +1 -1
  639. package/dist/services/definitions/neo4j.cjs +2 -3
  640. package/dist/services/definitions/neo4j.cjs.map +1 -1
  641. package/dist/services/definitions/neo4j.mjs +1 -1
  642. package/dist/services/definitions/nextcloud.cjs +2 -3
  643. package/dist/services/definitions/nextcloud.cjs.map +1 -1
  644. package/dist/services/definitions/nextcloud.mjs +1 -1
  645. package/dist/services/definitions/nocodb.cjs +2 -3
  646. package/dist/services/definitions/nocodb.cjs.map +1 -1
  647. package/dist/services/definitions/nocodb.mjs +1 -1
  648. package/dist/services/definitions/ntfy.cjs +2 -3
  649. package/dist/services/definitions/ntfy.cjs.map +1 -1
  650. package/dist/services/definitions/ntfy.mjs +1 -1
  651. package/dist/services/definitions/ollama.cjs +2 -3
  652. package/dist/services/definitions/ollama.cjs.map +1 -1
  653. package/dist/services/definitions/ollama.mjs +1 -1
  654. package/dist/services/definitions/open-webui.cjs +2 -3
  655. package/dist/services/definitions/open-webui.cjs.map +1 -1
  656. package/dist/services/definitions/open-webui.mjs +1 -1
  657. package/dist/services/definitions/opencode.cjs +2 -3
  658. package/dist/services/definitions/opencode.cjs.map +1 -1
  659. package/dist/services/definitions/opencode.mjs +1 -1
  660. package/dist/services/definitions/openhands.cjs +58 -0
  661. package/dist/services/definitions/openhands.cjs.map +1 -0
  662. package/dist/services/definitions/openhands.d.cts +7 -0
  663. package/dist/services/definitions/openhands.d.cts.map +1 -0
  664. package/dist/services/definitions/openhands.d.mts +7 -0
  665. package/dist/services/definitions/openhands.d.mts.map +1 -0
  666. package/dist/services/definitions/openhands.mjs +57 -0
  667. package/dist/services/definitions/openhands.mjs.map +1 -0
  668. package/dist/services/definitions/openpanel.cjs +2 -3
  669. package/dist/services/definitions/openpanel.cjs.map +1 -1
  670. package/dist/services/definitions/openpanel.mjs +1 -1
  671. package/dist/services/definitions/opensearch.cjs +94 -0
  672. package/dist/services/definitions/opensearch.cjs.map +1 -0
  673. package/dist/services/definitions/opensearch.d.cts +7 -0
  674. package/dist/services/definitions/opensearch.d.cts.map +1 -0
  675. package/dist/services/definitions/opensearch.d.mts +7 -0
  676. package/dist/services/definitions/opensearch.d.mts.map +1 -0
  677. package/dist/services/definitions/opensearch.mjs +93 -0
  678. package/dist/services/definitions/opensearch.mjs.map +1 -0
  679. package/dist/services/definitions/outline.cjs +2 -3
  680. package/dist/services/definitions/outline.cjs.map +1 -1
  681. package/dist/services/definitions/outline.mjs +1 -1
  682. package/dist/services/definitions/paperless-ngx.cjs +2 -3
  683. package/dist/services/definitions/paperless-ngx.cjs.map +1 -1
  684. package/dist/services/definitions/paperless-ngx.mjs +1 -1
  685. package/dist/services/definitions/pentagi.cjs +2 -3
  686. package/dist/services/definitions/pentagi.cjs.map +1 -1
  687. package/dist/services/definitions/pentagi.mjs +1 -1
  688. package/dist/services/definitions/pentestagent.cjs +2 -3
  689. package/dist/services/definitions/pentestagent.cjs.map +1 -1
  690. package/dist/services/definitions/pentestagent.mjs +1 -1
  691. package/dist/services/definitions/playwright-server.cjs +2 -3
  692. package/dist/services/definitions/playwright-server.cjs.map +1 -1
  693. package/dist/services/definitions/playwright-server.mjs +1 -1
  694. package/dist/services/definitions/pocketbase.cjs +61 -0
  695. package/dist/services/definitions/pocketbase.cjs.map +1 -0
  696. package/dist/services/definitions/pocketbase.d.cts +7 -0
  697. package/dist/services/definitions/pocketbase.d.cts.map +1 -0
  698. package/dist/services/definitions/pocketbase.d.mts +7 -0
  699. package/dist/services/definitions/pocketbase.d.mts.map +1 -0
  700. package/dist/services/definitions/pocketbase.mjs +60 -0
  701. package/dist/services/definitions/pocketbase.mjs.map +1 -0
  702. package/dist/services/definitions/portainer.cjs +2 -3
  703. package/dist/services/definitions/portainer.cjs.map +1 -1
  704. package/dist/services/definitions/portainer.mjs +1 -1
  705. package/dist/services/definitions/postgresql.cjs +2 -3
  706. package/dist/services/definitions/postgresql.cjs.map +1 -1
  707. package/dist/services/definitions/postgresql.mjs +1 -1
  708. package/dist/services/definitions/postiz.cjs +2 -3
  709. package/dist/services/definitions/postiz.cjs.map +1 -1
  710. package/dist/services/definitions/postiz.mjs +1 -1
  711. package/dist/services/definitions/prometheus.cjs +2 -3
  712. package/dist/services/definitions/prometheus.cjs.map +1 -1
  713. package/dist/services/definitions/prometheus.mjs +1 -1
  714. package/dist/services/definitions/qdrant.cjs +2 -3
  715. package/dist/services/definitions/qdrant.cjs.map +1 -1
  716. package/dist/services/definitions/qdrant.mjs +1 -1
  717. package/dist/services/definitions/rabbitmq.cjs +80 -0
  718. package/dist/services/definitions/rabbitmq.cjs.map +1 -0
  719. package/dist/services/definitions/rabbitmq.d.cts +7 -0
  720. package/dist/services/definitions/rabbitmq.d.cts.map +1 -0
  721. package/dist/services/definitions/rabbitmq.d.mts +7 -0
  722. package/dist/services/definitions/rabbitmq.d.mts.map +1 -0
  723. package/dist/services/definitions/rabbitmq.mjs +79 -0
  724. package/dist/services/definitions/rabbitmq.mjs.map +1 -0
  725. package/dist/services/definitions/ragflow.cjs +192 -0
  726. package/dist/services/definitions/ragflow.cjs.map +1 -0
  727. package/dist/services/definitions/ragflow.d.cts +7 -0
  728. package/dist/services/definitions/ragflow.d.cts.map +1 -0
  729. package/dist/services/definitions/ragflow.d.mts +7 -0
  730. package/dist/services/definitions/ragflow.d.mts.map +1 -0
  731. package/dist/services/definitions/ragflow.mjs +191 -0
  732. package/dist/services/definitions/ragflow.mjs.map +1 -0
  733. package/dist/services/definitions/redis.cjs +2 -3
  734. package/dist/services/definitions/redis.cjs.map +1 -1
  735. package/dist/services/definitions/redis.mjs +1 -1
  736. package/dist/services/definitions/remotion.cjs +2 -3
  737. package/dist/services/definitions/remotion.cjs.map +1 -1
  738. package/dist/services/definitions/remotion.mjs +1 -1
  739. package/dist/services/definitions/restic.cjs +58 -0
  740. package/dist/services/definitions/restic.cjs.map +1 -0
  741. package/dist/services/definitions/restic.d.cts +7 -0
  742. package/dist/services/definitions/restic.d.cts.map +1 -0
  743. package/dist/services/definitions/restic.d.mts +7 -0
  744. package/dist/services/definitions/restic.d.mts.map +1 -0
  745. package/dist/services/definitions/restic.mjs +57 -0
  746. package/dist/services/definitions/restic.mjs.map +1 -0
  747. package/dist/services/definitions/rocketchat.cjs +2 -3
  748. package/dist/services/definitions/rocketchat.cjs.map +1 -1
  749. package/dist/services/definitions/rocketchat.mjs +1 -1
  750. package/dist/services/definitions/saleor.cjs +76 -0
  751. package/dist/services/definitions/saleor.cjs.map +1 -0
  752. package/dist/services/definitions/saleor.d.cts +7 -0
  753. package/dist/services/definitions/saleor.d.cts.map +1 -0
  754. package/dist/services/definitions/saleor.d.mts +7 -0
  755. package/dist/services/definitions/saleor.d.mts.map +1 -0
  756. package/dist/services/definitions/saleor.mjs +75 -0
  757. package/dist/services/definitions/saleor.mjs.map +1 -0
  758. package/dist/services/definitions/scrapling.cjs +2 -3
  759. package/dist/services/definitions/scrapling.cjs.map +1 -1
  760. package/dist/services/definitions/scrapling.mjs +1 -1
  761. package/dist/services/definitions/searxng.cjs +2 -3
  762. package/dist/services/definitions/searxng.cjs.map +1 -1
  763. package/dist/services/definitions/searxng.mjs +1 -1
  764. package/dist/services/definitions/signoz.cjs +2 -3
  765. package/dist/services/definitions/signoz.cjs.map +1 -1
  766. package/dist/services/definitions/signoz.mjs +1 -1
  767. package/dist/services/definitions/solidityguard.cjs +2 -3
  768. package/dist/services/definitions/solidityguard.cjs.map +1 -1
  769. package/dist/services/definitions/solidityguard.mjs +1 -1
  770. package/dist/services/definitions/stable-diffusion.cjs +2 -3
  771. package/dist/services/definitions/stable-diffusion.cjs.map +1 -1
  772. package/dist/services/definitions/stable-diffusion.mjs +1 -1
  773. package/dist/services/definitions/steel-browser.cjs +2 -3
  774. package/dist/services/definitions/steel-browser.cjs.map +1 -1
  775. package/dist/services/definitions/steel-browser.mjs +1 -1
  776. package/dist/services/definitions/stirling-pdf.cjs +74 -0
  777. package/dist/services/definitions/stirling-pdf.cjs.map +1 -0
  778. package/dist/services/definitions/stirling-pdf.d.cts +7 -0
  779. package/dist/services/definitions/stirling-pdf.d.cts.map +1 -0
  780. package/dist/services/definitions/stirling-pdf.d.mts +7 -0
  781. package/dist/services/definitions/stirling-pdf.d.mts.map +1 -0
  782. package/dist/services/definitions/stirling-pdf.mjs +73 -0
  783. package/dist/services/definitions/stirling-pdf.mjs.map +1 -0
  784. package/dist/services/definitions/strapi.cjs +124 -0
  785. package/dist/services/definitions/strapi.cjs.map +1 -0
  786. package/dist/services/definitions/strapi.d.cts +7 -0
  787. package/dist/services/definitions/strapi.d.cts.map +1 -0
  788. package/dist/services/definitions/strapi.d.mts +7 -0
  789. package/dist/services/definitions/strapi.d.mts.map +1 -0
  790. package/dist/services/definitions/strapi.mjs +123 -0
  791. package/dist/services/definitions/strapi.mjs.map +1 -0
  792. package/dist/services/definitions/stream-gateway.cjs +2 -3
  793. package/dist/services/definitions/stream-gateway.cjs.map +1 -1
  794. package/dist/services/definitions/stream-gateway.mjs +1 -1
  795. package/dist/services/definitions/supabase.cjs +2 -3
  796. package/dist/services/definitions/supabase.cjs.map +1 -1
  797. package/dist/services/definitions/supabase.mjs +1 -1
  798. package/dist/services/definitions/tailscale.cjs +2 -3
  799. package/dist/services/definitions/tailscale.cjs.map +1 -1
  800. package/dist/services/definitions/tailscale.mjs +1 -1
  801. package/dist/services/definitions/temporal.cjs +2 -3
  802. package/dist/services/definitions/temporal.cjs.map +1 -1
  803. package/dist/services/definitions/temporal.mjs +1 -1
  804. package/dist/services/definitions/traefik.cjs +2 -3
  805. package/dist/services/definitions/traefik.cjs.map +1 -1
  806. package/dist/services/definitions/traefik.mjs +1 -1
  807. package/dist/services/definitions/twenty.cjs +83 -0
  808. package/dist/services/definitions/twenty.cjs.map +1 -0
  809. package/dist/services/definitions/twenty.d.cts +7 -0
  810. package/dist/services/definitions/twenty.d.cts.map +1 -0
  811. package/dist/services/definitions/twenty.d.mts +7 -0
  812. package/dist/services/definitions/twenty.d.mts.map +1 -0
  813. package/dist/services/definitions/twenty.mjs +82 -0
  814. package/dist/services/definitions/twenty.mjs.map +1 -0
  815. package/dist/services/definitions/umami.cjs +2 -3
  816. package/dist/services/definitions/umami.cjs.map +1 -1
  817. package/dist/services/definitions/umami.mjs +1 -1
  818. package/dist/services/definitions/uptime-kuma.cjs +2 -3
  819. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  820. package/dist/services/definitions/uptime-kuma.mjs +1 -1
  821. package/dist/services/definitions/usesend.cjs +2 -3
  822. package/dist/services/definitions/usesend.cjs.map +1 -1
  823. package/dist/services/definitions/usesend.mjs +1 -1
  824. package/dist/services/definitions/valkey.cjs +2 -3
  825. package/dist/services/definitions/valkey.cjs.map +1 -1
  826. package/dist/services/definitions/valkey.mjs +1 -1
  827. package/dist/services/definitions/vault.cjs +71 -0
  828. package/dist/services/definitions/vault.cjs.map +1 -0
  829. package/dist/services/definitions/vault.d.cts +7 -0
  830. package/dist/services/definitions/vault.d.cts.map +1 -0
  831. package/dist/services/definitions/vault.d.mts +7 -0
  832. package/dist/services/definitions/vault.d.mts.map +1 -0
  833. package/dist/services/definitions/vault.mjs +70 -0
  834. package/dist/services/definitions/vault.mjs.map +1 -0
  835. package/dist/services/definitions/vaultwarden.cjs +2 -3
  836. package/dist/services/definitions/vaultwarden.cjs.map +1 -1
  837. package/dist/services/definitions/vaultwarden.mjs +1 -1
  838. package/dist/services/definitions/watchtower.cjs +2 -3
  839. package/dist/services/definitions/watchtower.cjs.map +1 -1
  840. package/dist/services/definitions/watchtower.mjs +1 -1
  841. package/dist/services/definitions/weaviate.cjs +2 -3
  842. package/dist/services/definitions/weaviate.cjs.map +1 -1
  843. package/dist/services/definitions/weaviate.mjs +1 -1
  844. package/dist/services/definitions/whisper.cjs +2 -3
  845. package/dist/services/definitions/whisper.cjs.map +1 -1
  846. package/dist/services/definitions/whisper.mjs +1 -1
  847. package/dist/services/definitions/xyops.cjs +2 -3
  848. package/dist/services/definitions/xyops.cjs.map +1 -1
  849. package/dist/services/definitions/xyops.mjs +1 -1
  850. package/dist/services/registry.cjs +3 -4
  851. package/dist/services/registry.cjs.map +1 -1
  852. package/dist/services/registry.d.mts.map +1 -1
  853. package/dist/services/registry.mjs +1 -2
  854. package/dist/services/registry.mjs.map +1 -1
  855. package/dist/services/registry.test.cjs +3 -4
  856. package/dist/services/registry.test.cjs.map +1 -1
  857. package/dist/services/registry.test.mjs +3 -4
  858. package/dist/services/registry.test.mjs.map +1 -1
  859. package/dist/{manifest-4uLbISXV.cjs → skill-manifest--IgY9REK.cjs} +40 -10
  860. package/dist/skill-manifest--IgY9REK.cjs.map +1 -0
  861. package/dist/{manifest-B8UDsVlR.mjs → skill-manifest-BVUXU0__.mjs} +24 -5
  862. package/dist/skill-manifest-BVUXU0__.mjs.map +1 -0
  863. package/dist/skills/registry.cjs +262 -3
  864. package/dist/skills/registry.cjs.map +1 -1
  865. package/dist/skills/registry.d.cts.map +1 -1
  866. package/dist/skills/registry.d.mts.map +1 -1
  867. package/dist/skills/registry.mjs +261 -1
  868. package/dist/skills/registry.mjs.map +1 -1
  869. package/dist/skills/skill-manifest.cjs +5 -23
  870. package/dist/skills/skill-manifest.mjs +1 -19
  871. package/dist/skills-BlzpHmpH.cjs +620 -0
  872. package/dist/skills-BlzpHmpH.cjs.map +1 -0
  873. package/dist/types-CR83OJiq.d.cts +243 -0
  874. package/dist/types-CR83OJiq.d.cts.map +1 -0
  875. package/dist/types-zYjGTuyn.d.mts +243 -0
  876. package/dist/types-zYjGTuyn.d.mts.map +1 -0
  877. package/dist/types.cjs +79 -3
  878. package/dist/types.cjs.map +1 -1
  879. package/dist/types.d.cts +1 -1
  880. package/dist/types.d.mts +1 -1
  881. package/dist/types.mjs +78 -1
  882. package/dist/types.mjs.map +1 -1
  883. package/dist/validator.cjs +3 -4
  884. package/dist/validator.cjs.map +1 -1
  885. package/dist/validator.mjs +1 -2
  886. package/dist/validator.mjs.map +1 -1
  887. package/dist/validator.test.cjs +5 -6
  888. package/dist/validator.test.cjs.map +1 -1
  889. package/dist/validator.test.mjs +3 -4
  890. package/dist/validator.test.mjs.map +1 -1
  891. package/dist/version-manager.cjs +3 -4
  892. package/dist/version-manager.cjs.map +1 -1
  893. package/dist/version-manager.d.mts.map +1 -1
  894. package/dist/version-manager.mjs +1 -2
  895. package/dist/version-manager.mjs.map +1 -1
  896. package/dist/version-manager.test.cjs +5 -6
  897. package/dist/version-manager.test.cjs.map +1 -1
  898. package/dist/version-manager.test.mjs +3 -4
  899. package/dist/version-manager.test.mjs.map +1 -1
  900. package/dist/{vi.2VT5v0um-BmRMvymT.cjs → vi.2VT5v0um-CRqXre87.cjs} +82 -202
  901. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs.map → vi.2VT5v0um-CRqXre87.cjs.map} +1 -1
  902. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs → vi.2VT5v0um-DvC3SVNc.mjs} +67 -186
  903. package/dist/{vi.2VT5v0um-BmRMvymT.cjs.map → vi.2VT5v0um-DvC3SVNc.mjs.map} +1 -1
  904. package/package.json +4 -3
  905. package/src/deployers/coolify.ts +198 -103
  906. package/src/deployers/dokploy.ts +209 -55
  907. package/src/deployers/index.ts +1 -0
  908. package/src/deployers/strip-host-ports.test.ts +100 -0
  909. package/src/deployers/strip-host-ports.ts +187 -0
  910. package/src/deployers/types.ts +185 -1
  911. package/src/generators/postgres-init.ts +6 -0
  912. package/src/index.ts +19 -4
  913. package/src/presets/presets.test.ts +4 -0
  914. package/src/presets/registry.ts +88 -0
  915. package/src/schema.ts +11 -0
  916. package/src/services/definitions/airbyte.ts +75 -0
  917. package/src/services/definitions/airflow.ts +109 -0
  918. package/src/services/definitions/appwrite.ts +181 -0
  919. package/src/services/definitions/authelia.ts +145 -0
  920. package/src/services/definitions/axolotl.ts +65 -0
  921. package/src/services/definitions/chatwoot-worker.ts +93 -0
  922. package/src/services/definitions/chatwoot.ts +106 -0
  923. package/src/services/definitions/dagster.ts +82 -0
  924. package/src/services/definitions/directus.ts +115 -0
  925. package/src/services/definitions/duplicati.ts +77 -0
  926. package/src/services/definitions/excalidraw.ts +46 -0
  927. package/src/services/definitions/firecrawl-playwright.ts +62 -0
  928. package/src/services/definitions/firecrawl.ts +146 -0
  929. package/src/services/definitions/flagsmith.ts +76 -0
  930. package/src/services/definitions/fonoster.ts +67 -0
  931. package/src/services/definitions/formbricks.ts +75 -0
  932. package/src/services/definitions/hedgedoc.ts +81 -0
  933. package/src/services/definitions/heyform.ts +67 -0
  934. package/src/services/definitions/hoppscotch.ts +74 -0
  935. package/src/services/definitions/index.ts +124 -0
  936. package/src/services/definitions/infisical.ts +97 -0
  937. package/src/services/definitions/keycloak.ts +119 -0
  938. package/src/services/definitions/kong.ts +116 -0
  939. package/src/services/definitions/lago.ts +95 -0
  940. package/src/services/definitions/langflow.ts +82 -0
  941. package/src/services/definitions/langfuse.ts +76 -0
  942. package/src/services/definitions/listmonk.ts +118 -0
  943. package/src/services/definitions/mariadb.ts +82 -0
  944. package/src/services/definitions/mautic.ts +82 -0
  945. package/src/services/definitions/medusa.ts +82 -0
  946. package/src/services/definitions/mysql.ts +82 -0
  947. package/src/services/definitions/openhands.ts +60 -0
  948. package/src/services/definitions/opensearch.ts +95 -0
  949. package/src/services/definitions/pocketbase.ts +62 -0
  950. package/src/services/definitions/rabbitmq.ts +81 -0
  951. package/src/services/definitions/ragflow.ts +175 -0
  952. package/src/services/definitions/restic.ts +60 -0
  953. package/src/services/definitions/saleor.ts +75 -0
  954. package/src/services/definitions/stirling-pdf.ts +73 -0
  955. package/src/services/definitions/strapi.ts +124 -0
  956. package/src/services/definitions/twenty.ts +82 -0
  957. package/src/services/definitions/vault.ts +74 -0
  958. package/src/skills/manifest.json +8 -0
  959. package/src/skills/registry.ts +119 -0
  960. package/src/types.ts +91 -2
  961. package/tsconfig.tsbuildinfo +1 -0
  962. package/dist/chunk-C0xms8kb.cjs +0 -34
  963. package/dist/deployers/coolify.d.cts.map +0 -1
  964. package/dist/deployers/coolify.d.mts.map +0 -1
  965. package/dist/deployers/dokploy.d.cts.map +0 -1
  966. package/dist/deployers/dokploy.d.mts.map +0 -1
  967. package/dist/deployers/types.d.cts.map +0 -1
  968. package/dist/deployers/types.d.mts.map +0 -1
  969. package/dist/generators/skills.cjs.map +0 -1
  970. package/dist/manifest-4uLbISXV.cjs.map +0 -1
  971. package/dist/manifest-B8UDsVlR.mjs.map +0 -1
  972. package/dist/schema.d.cts.map +0 -1
  973. package/dist/schema.d.mts.map +0 -1
  974. package/dist/skills/skill-manifest.cjs.map +0 -1
  975. package/dist/skills/skill-manifest.mjs.map +0 -1
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/generators/health-check.ts
4
3
  /**
5
4
  * Generates stack-specific health check and verification scripts.
@@ -701,7 +700,7 @@ function generatePowerShellScript(resolved, options) {
701
700
  "}"
702
701
  ].join("\n") + "\n";
703
702
  }
704
-
705
703
  //#endregion
706
704
  exports.generateHealthCheck = generateHealthCheck;
705
+
707
706
  //# sourceMappingURL=health-check.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"health-check.cjs","names":[],"sources":["../../src/generators/health-check.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface HealthCheckOptions {\n\tprojectName: string;\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n}\n\n// ─── Generator ──────────────────────────────────────────────────────────────\n\n/**\n * Generates stack-specific health check and verification scripts.\n *\n * Each generated script is dynamic — it contains the exact service names,\n * ports, and health check commands from the resolved stack so users get\n * a precise, zero-configuration verifier.\n */\nexport function generateHealthCheck(\n\tresolved: ResolverOutput,\n\toptions: HealthCheckOptions,\n): Record<string, string> {\n\tconst files: Record<string, string> = {};\n\n\tfiles[\"scripts/health-check.sh\"] = generateBashScript(resolved, options);\n\tfiles[\"scripts/health-check.ps1\"] = generatePowerShellScript(resolved, options);\n\n\treturn files;\n}\n\n// ─── Service metadata extraction ────────────────────────────────────────────\n\ninterface ServiceCheck {\n\tid: string;\n\tname: string;\n\ticon: string;\n\tports: Array<{ host: number; container: number; description: string; exposed: boolean }>;\n\thealthCheckCmd: string | null;\n}\n\nfunction extractServiceChecks(resolved: ResolverOutput): ServiceCheck[] {\n\treturn resolved.services.map((svc) => ({\n\t\tid: svc.definition.id,\n\t\tname: svc.definition.name,\n\t\ticon: svc.definition.icon,\n\t\tports: svc.definition.ports.map((p) => ({\n\t\t\thost: p.host,\n\t\t\tcontainer: p.container,\n\t\t\tdescription: p.description,\n\t\t\texposed: p.exposed,\n\t\t})),\n\t\thealthCheckCmd: svc.definition.healthcheck?.test ?? null,\n\t}));\n}\n\nfunction escapeShell(s: string): string {\n\treturn s.replace(/'/g, \"'\\\\''\").replace(/\"/g, '\\\\\"');\n}\n\n// Use L() to build lines safely — avoids template literal issues with shell syntax\nfunction L(...parts: string[]): string {\n\treturn parts.join(\"\");\n}\n\n// ─── Bash Script ────────────────────────────────────────────────────────────\n\nfunction generateBashScript(resolved: ResolverOutput, options: HealthCheckOptions): string {\n\tconst checks = extractServiceChecks(resolved);\n\tconst name = options.projectName;\n\tconst total = checks.length;\n\n\t// Build per-service docker check calls\n\tconst dockerChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tdockerChecks.push(L(\" # ── \", svc.icon, \" \", svc.name, \" ──\"));\n\t\tdockerChecks.push(L(' check_container \"', svc.id, '\" \"', svc.name, '\" \"', svc.icon, '\"'));\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tdockerChecks.push(\n\t\t\t\tL(' check_port \"', svc.id, '\" ', String(p.host), ' \"', p.description, '\"'),\n\t\t\t);\n\t\t}\n\t\tif (svc.healthCheckCmd) {\n\t\t\tdockerChecks.push(\n\t\t\t\tL(' check_health_cmd \"', svc.id, '\" \"', escapeShell(svc.healthCheckCmd), '\"'),\n\t\t\t);\n\t\t} else {\n\t\t\tdockerChecks.push(\" # No healthcheck defined — skipping exec check\");\n\t\t}\n\t\tdockerChecks.push(\"\");\n\t}\n\n\t// Build per-service bare-metal check calls\n\tconst bmChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tbmChecks.push(L(\" # ── \", svc.icon, \" \", svc.name, \" (bare-metal) ──\"));\n\t\tbmChecks.push(L(' check_process \"', svc.id, '\" \"', svc.name, '\" \"', svc.icon, '\"'));\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tbmChecks.push(L(' check_port \"', svc.id, '\" ', String(p.host), ' \"', p.description, '\"'));\n\t\t}\n\t\tbmChecks.push(\"\");\n\t}\n\n\t// Build the log-scan service list\n\tconst svcIdList = checks.map((s) => '\"' + s.id + '\"').join(\" \");\n\n\tconst lines: string[] = [\n\t\t\"#!/usr/bin/env bash\",\n\t\t\"set -uo pipefail\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\tL(\"# 🐾 OpenClaw Stack Health Check — \", name),\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"#\",\n\t\t\"# Auto-generated verification script for your stack.\",\n\t\tL(\"# Checks \", String(total), \" services across 6 phases:\"),\n\t\t\"# 1. Environment — prerequisites, .env, secrets\",\n\t\t\"# 2. Container — running state, health status, restart count\",\n\t\t\"# 3. Port — TCP reachability for exposed ports\",\n\t\t\"# 4. Health Command — execute each service's health check\",\n\t\t\"# 5. Resources — memory/CPU warnings\",\n\t\t\"# 6. Logs — scan for ERROR/FATAL/panic patterns\",\n\t\t\"#\",\n\t\t\"# Usage:\",\n\t\t\"# ./scripts/health-check.sh # Full check\",\n\t\t\"# ./scripts/health-check.sh --quick # Skip log scan\",\n\t\t\"# ./scripts/health-check.sh --json # Output as JSON\",\n\t\t\"#\",\n\t\t\"# Exit codes: 0 = all healthy, 1 = some issues, 2 = critical failure\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t\t'SCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"',\n\t\t'PROJECT_DIR=\"$(dirname \"$SCRIPT_DIR\")\"',\n\t\t'cd \"$PROJECT_DIR\"',\n\t\t\"\",\n\t\t\"# ── Arguments ────────────────────────────────────────────────────────\",\n\t\t\"QUICK_MODE=false\",\n\t\t\"JSON_MODE=false\",\n\t\t\"VERBOSE=false\",\n\t\t'for arg in \"$@\"; do',\n\t\t' case \"$arg\" in',\n\t\t\" --quick) QUICK_MODE=true ;;\",\n\t\t\" --json) JSON_MODE=true ;;\",\n\t\t\" --verbose|-v) VERBOSE=true ;;\",\n\t\t\" esac\",\n\t\t\"done\",\n\t\t\"\",\n\t\t\"# ── Colour helpers ───────────────────────────────────────────────────\",\n\t\t'if [ -t 1 ] && [ \"$JSON_MODE\" = false ]; then',\n\t\t\" RED='\\\\033[0;31m'; GREEN='\\\\033[0;32m'; YELLOW='\\\\033[1;33m'\",\n\t\t\" CYAN='\\\\033[0;36m'; DIM='\\\\033[2m'; BOLD='\\\\033[1m'; NC='\\\\033[0m'\",\n\t\t\"else\",\n\t\t\" RED=''; GREEN=''; YELLOW=''; CYAN=''; DIM=''; BOLD=''; NC=''\",\n\t\t\"fi\",\n\t\t\"\",\n\t\t\"# ── Counters ─────────────────────────────────────────────────────────\",\n\t\tL(\"TOTAL=\", String(total)),\n\t\t\"HEALTHY=0\",\n\t\t\"WARNING=0\",\n\t\t\"FAILED=0\",\n\t\t\"ERRORS=()\",\n\t\t\"WARNINGS_LIST=()\",\n\t\t\"SERVICE_RESULTS=()\",\n\t\t\"\",\n\t\t\"# ── Utility functions ────────────────────────────────────────────────\",\n\t\t'pass() { echo -e \" ${GREEN}✅ $*${NC}\"; HEALTHY=$((HEALTHY + 1)); }',\n\t\t'warn_svc() { echo -e \" ${YELLOW}⚠️ $*${NC}\"; WARNING=$((WARNING + 1)); WARNINGS_LIST+=(\"$*\"); }',\n\t\t'fail() { echo -e \" ${RED}❌ $*${NC}\"; FAILED=$((FAILED + 1)); ERRORS+=(\"$*\"); }',\n\t\t'info() { echo -e \" ${CYAN}ℹ $*${NC}\"; }',\n\t\t'dim() { echo -e \" ${DIM}$*${NC}\"; }',\n\t\t\"\",\n\t\t\"pad_name() {\",\n\t\t' local name=\"$1\"',\n\t\t\" local pad=25\",\n\t\t' printf \"%-${pad}s\" \"$name\"',\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 1: Environment\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"phase_environment() {\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 1: Environment ────────────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # Docker\",\n\t\t\" if command -v docker &>/dev/null; then\",\n\t\t\" if docker info &>/dev/null 2>&1; then\",\n\t\t' pass \"Docker daemon is running\"',\n\t\t\" DOCKER_AVAILABLE=true\",\n\t\t\" else\",\n\t\t' fail \"Docker daemon is NOT running\"',\n\t\t\" DOCKER_AVAILABLE=false\",\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' warn_svc \"Docker is not installed — running bare-metal checks only\"',\n\t\t\" DOCKER_AVAILABLE=false\",\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # Docker Compose\",\n\t\t' if [ \"$DOCKER_AVAILABLE\" = true ]; then',\n\t\t\" if docker compose version &>/dev/null 2>&1; then\",\n\t\t' pass \"Docker Compose v2 available\"',\n\t\t\" else\",\n\t\t' warn_svc \"Docker Compose v2 not found\"',\n\t\t\" fi\",\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # .env\",\n\t\t' if [ -f \".env\" ]; then',\n\t\t' pass \".env file exists\"',\n\t\t\" EMPTY_SECRETS=0\",\n\t\t\" while IFS='=' read -r key value; do\",\n\t\t' [[ \"$key\" =~ ^#.*$ ]] && continue',\n\t\t' [[ -z \"$key\" ]] && continue',\n\t\t' if [[ \"$key\" =~ (PASSWORD|TOKEN|SECRET|SESSION_KEY|COOKIE|API_KEY) ]] && [[ -z \"${value:-}\" ]]; then',\n\t\t' if [ \"$VERBOSE\" = true ]; then',\n\t\t' warn_svc \"Empty secret: $key\"',\n\t\t\" fi\",\n\t\t\" EMPTY_SECRETS=$((EMPTY_SECRETS + 1))\",\n\t\t\" fi\",\n\t\t\" done < .env 2>/dev/null || true\",\n\t\t' if [ \"$EMPTY_SECRETS\" -gt 0 ]; then',\n\t\t' warn_svc \"$EMPTY_SECRETS secret(s) are empty in .env\"',\n\t\t\" else\",\n\t\t' pass \"All secrets are populated\"',\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' warn_svc \".env file not found\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # Disk space\",\n\t\t\" AVAIL_KB=$(df -k . 2>/dev/null | awk 'NR==2{print $4}' || echo \\\"0\\\")\",\n\t\t\" AVAIL_GB=$((AVAIL_KB / 1024 / 1024))\",\n\t\t' if [ \"$AVAIL_GB\" -lt 2 ]; then',\n\t\t' warn_svc \"Low disk space: ${AVAIL_GB}GB available\"',\n\t\t\" else\",\n\t\t' pass \"Disk space: ${AVAIL_GB}GB available\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 2: Container Status\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"check_container() {\",\n\t\t' local id=\"$1\" name=\"$2\" icon=\"$3\"',\n\t\t\"\",\n\t\t\" local status restarts\",\n\t\t' status=$(docker compose ps \"$id\" --format json 2>/dev/null | head -1)',\n\t\t\"\",\n\t\t' if [ -z \"$status\" ]; then',\n\t\t' fail \"$icon $(pad_name \"$name\") — Container not found\"',\n\t\t\" return\",\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" local state health_status\",\n\t\t' state=$(echo \"$status\" | grep -o \\'\"State\":\"[^\"]*\"\\' | cut -d\\'\"\\' -f4 || echo \"unknown\")',\n\t\t' health_status=$(echo \"$status\" | grep -o \\'\"Health\":\"[^\"]*\"\\' | cut -d\\'\"\\' -f4 || echo \"none\")',\n\t\t\"\",\n\t\t' restarts=$(docker inspect --format=\"{{.RestartCount}}\" \"$(docker compose ps -q \"$id\" 2>/dev/null | head -1)\" 2>/dev/null || echo \"0\")',\n\t\t\"\",\n\t\t' if [ \"$state\" = \"running\" ]; then',\n\t\t' if [ \"$health_status\" = \"healthy\" ]; then',\n\t\t' pass \"$icon $(pad_name \"$name\") Running (healthy) restarts: $restarts\"',\n\t\t' elif [ \"$health_status\" = \"starting\" ]; then',\n\t\t' warn_svc \"$icon $(pad_name \"$name\") Running (starting) restarts: $restarts\"',\n\t\t' elif [ \"$health_status\" = \"unhealthy\" ]; then',\n\t\t' fail \"$icon $(pad_name \"$name\") Running (UNHEALTHY) restarts: $restarts\"',\n\t\t\" else\",\n\t\t' pass \"$icon $(pad_name \"$name\") Running restarts: $restarts\"',\n\t\t\" fi\",\n\t\t' if [ \"$restarts\" -gt 5 ] 2>/dev/null; then',\n\t\t' warn_svc \" └─ $name has restarted $restarts times (possible crash loop)\"',\n\t\t\" fi\",\n\t\t' elif [ \"$state\" = \"exited\" ]; then',\n\t\t\" local exit_code\",\n\t\t' exit_code=$(docker inspect --format=\"{{.State.ExitCode}}\" \"$(docker compose ps -q \"$id\" 2>/dev/null | head -1)\" 2>/dev/null || echo \"?\")',\n\t\t' fail \"$icon $(pad_name \"$name\") Exited (code $exit_code)\"',\n\t\t' if [ \"$exit_code\" = \"137\" ]; then',\n\t\t' ERRORS+=(\" └─ $name: OOM killed (exit 137). Increase memory limits.\")',\n\t\t' elif [ \"$exit_code\" = \"1\" ]; then',\n\t\t' ERRORS+=(\" └─ $name: Application error (exit 1). Check logs: docker compose logs $id\")',\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' fail \"$icon $(pad_name \"$name\") State: $state\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 3: Port Reachability\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"check_port() {\",\n\t\t' local id=\"$1\" port=\"$2\" desc=\"$3\"',\n\t\t\" if command -v nc &>/dev/null; then\",\n\t\t' if nc -z -w 2 localhost \"$port\" 2>/dev/null; then',\n\t\t' dim \" Port $port ($desc) — reachable\"',\n\t\t\" else\",\n\t\t' warn_svc \" └─ $id: Port $port ($desc) — NOT reachable\"',\n\t\t\" fi\",\n\t\t\" elif command -v curl &>/dev/null; then\",\n\t\t' if curl -sf --max-time 2 \"http://localhost:$port/\" &>/dev/null; then',\n\t\t' dim \" Port $port ($desc) — reachable\"',\n\t\t\" else\",\n\t\t' warn_svc \" └─ $id: Port $port ($desc) — NOT reachable\"',\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' dim \" Port $port ($desc) — skipped (no nc or curl)\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 4: Health Check Commands\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"check_health_cmd() {\",\n\t\t' local id=\"$1\" cmd=\"$2\"',\n\t\t' local cid=$(docker compose ps -q \"$id\" 2>/dev/null | head -1)',\n\t\t' [ -z \"$cid\" ] && return',\n\t\t' if docker exec \"$cid\" sh -c \"$cmd\" &>/dev/null; then',\n\t\t' dim \" Health command passed\"',\n\t\t\" else\",\n\t\t' warn_svc \" └─ $id: Health check command failed\"',\n\t\t' if [ \"$VERBOSE\" = true ]; then dim \" Command: $cmd\"; fi',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 5: Resource Usage\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"phase_resources() {\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 5: Resource Usage ─────────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t' docker stats --no-stream --format \"table {{.Name}}\\\\t{{.CPUPerc}}\\\\t{{.MemUsage}}\\\\t{{.MemPerc}}\" 2>/dev/null || true',\n\t\t' if [ \"$VERBOSE\" = false ] && [ \"$JSON_MODE\" = false ]; then',\n\t\t' info \"Use --verbose to see warnings for high memory usage\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 6: Log Scan\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"phase_logs() {\",\n\t\t' if [ \"$QUICK_MODE\" = true ]; then',\n\t\t' if [ \"$JSON_MODE\" = false ]; then echo \"\"; info \"Skipping log scan (--quick mode)\"; fi',\n\t\t\" return\",\n\t\t\" fi\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 6: Log Scan ───────────────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\" local has_errors=false\",\n\t\tL(\" for svc_id in \", svcIdList, \"; do\"),\n\t\t\" local error_lines\",\n\t\t' error_lines=$(docker compose logs --tail=50 \"$svc_id\" 2>/dev/null | grep -iE \"(error|fatal|panic|exception|segfault|killed|oom)\" | tail -5 || true)',\n\t\t' if [ -n \"$error_lines\" ]; then',\n\t\t\" has_errors=true\",\n\t\t' warn_svc \"$svc_id — found error patterns in logs:\"',\n\t\t' echo \"$error_lines\" | while IFS= read -r eline; do',\n\t\t' dim \" | $eline\"',\n\t\t\" done\",\n\t\t\" fi\",\n\t\t\" done\",\n\t\t' if [ \"$has_errors\" = false ] && [ \"$JSON_MODE\" = false ]; then',\n\t\t' pass \"No error patterns found in recent logs\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ── Bare-metal process check ────────────────────────────────────────\",\n\t\t\"check_process() {\",\n\t\t' local id=\"$1\" name=\"$2\" icon=\"$3\"',\n\t\t\" if command -v systemctl &>/dev/null; then\",\n\t\t' if systemctl is-active --quiet \"$id\" 2>/dev/null; then',\n\t\t' pass \"$icon $(pad_name \"$name\") Active (systemd)\"',\n\t\t\" return\",\n\t\t\" fi\",\n\t\t\" fi\",\n\t\t' if pgrep -f \"$id\" &>/dev/null; then',\n\t\t' pass \"$icon $(pad_name \"$name\") Running (process)\"',\n\t\t\" else\",\n\t\t' fail \"$icon $(pad_name \"$name\") NOT running\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Main\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t\t\"DOCKER_AVAILABLE=false\",\n\t\t\"\",\n\t\t'if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\tL(' echo \" 🐾 OpenClaw Stack Health Report — ', name, '\"'),\n\t\t' echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t\"fi\",\n\t\t\"\",\n\t\t\"phase_environment\",\n\t\t\"\",\n\t\t'if [ \"$DOCKER_AVAILABLE\" = true ]; then',\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 2–4: Service Checks ──────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t...dockerChecks,\n\t\t\"\",\n\t\t\" phase_resources\",\n\t\t\" phase_logs\",\n\t\t\"\",\n\t\t\"else\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Bare-Metal Service Checks ──────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t...bmChecks,\n\t\t\"fi\",\n\t\t\"\",\n\t\t\"# ── Summary ──────────────────────────────────────────────────────────\",\n\t\t'echo \"\"',\n\t\t'echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t'echo \"\"',\n\t\t'echo -e \" ${BOLD}Summary${NC}: $TOTAL services checked\"',\n\t\t'echo -e \" ${GREEN}Healthy: $HEALTHY${NC} | ${YELLOW}Warnings: $WARNING${NC} | ${RED}Failed: $FAILED${NC}\"',\n\t\t\"\",\n\t\t\"if [ ${#ERRORS[@]} -gt 0 ]; then\",\n\t\t' echo \"\"',\n\t\t' echo -e \" ${BOLD}${RED}── Errors ─────────────────────────────────────────────────${NC}\"',\n\t\t' for e in \"${ERRORS[@]}\"; do',\n\t\t' echo -e \" ${RED}$e${NC}\"',\n\t\t\" done\",\n\t\t\"fi\",\n\t\t\"\",\n\t\t'echo \"\"',\n\t\t'echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t'echo \"\"',\n\t\t\"\",\n\t\t'if [ \"$FAILED\" -gt 0 ]; then',\n\t\t' echo -e \" ${RED}Some services need attention. Run with --verbose for details.${NC}\"',\n\t\t\" exit 1\",\n\t\t\"else\",\n\t\t' echo -e \" ${GREEN}🎉 All services are running!${NC}\"',\n\t\t\" exit 0\",\n\t\t\"fi\",\n\t];\n\n\treturn lines.join(\"\\n\") + \"\\n\";\n}\n\n// ─── PowerShell Script ──────────────────────────────────────────────────────\n\nfunction generatePowerShellScript(resolved: ResolverOutput, options: HealthCheckOptions): string {\n\tconst checks = extractServiceChecks(resolved);\n\tconst name = options.projectName;\n\tconst total = checks.length;\n\n\t// Build per-service docker check calls\n\tconst dockerChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tdockerChecks.push(L(\" # \", svc.icon, \" \", svc.name));\n\t\tdockerChecks.push(\n\t\t\tL(\n\t\t\t\t' Test-Container -ServiceId \"',\n\t\t\t\tsvc.id,\n\t\t\t\t'\" -ServiceName \"',\n\t\t\t\tsvc.name,\n\t\t\t\t'\" -Icon \"',\n\t\t\t\tsvc.icon,\n\t\t\t\t'\"',\n\t\t\t),\n\t\t);\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tdockerChecks.push(\n\t\t\t\tL(\n\t\t\t\t\t' Test-Port -ServiceId \"',\n\t\t\t\t\tsvc.id,\n\t\t\t\t\t'\" -Port ',\n\t\t\t\t\tString(p.host),\n\t\t\t\t\t' -Description \"',\n\t\t\t\t\tp.description,\n\t\t\t\t\t'\"',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tdockerChecks.push(\"\");\n\t}\n\n\t// Build per-service bare-metal check calls\n\tconst bmChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tbmChecks.push(L(\" # \", svc.icon, \" \", svc.name));\n\t\tbmChecks.push(\n\t\t\tL(\n\t\t\t\t' Test-ProcessRunning -ServiceId \"',\n\t\t\t\tsvc.id,\n\t\t\t\t'\" -ServiceName \"',\n\t\t\t\tsvc.name,\n\t\t\t\t'\" -Icon \"',\n\t\t\t\tsvc.icon,\n\t\t\t\t'\"',\n\t\t\t),\n\t\t);\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tbmChecks.push(\n\t\t\t\tL(\n\t\t\t\t\t' Test-Port -ServiceId \"',\n\t\t\t\t\tsvc.id,\n\t\t\t\t\t'\" -Port ',\n\t\t\t\t\tString(p.host),\n\t\t\t\t\t' -Description \"',\n\t\t\t\t\tp.description,\n\t\t\t\t\t'\"',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tbmChecks.push(\"\");\n\t}\n\n\tconst svcIdList = checks.map((s) => '\"' + s.id + '\"').join(\", \");\n\n\tconst lines: string[] = [\n\t\t\"#Requires -Version 5.1\",\n\t\t\"<#\",\n\t\t\".SYNOPSIS\",\n\t\tL(\" OpenClaw Stack Health Check — \", name),\n\t\t\"\",\n\t\t\".DESCRIPTION\",\n\t\t\" Auto-generated verification script for your stack.\",\n\t\tL(\n\t\t\t\" Checks \",\n\t\t\tString(total),\n\t\t\t\" services: container status, port reachability, and log errors.\",\n\t\t),\n\t\t\"\",\n\t\t\".PARAMETER Quick\",\n\t\t\" Skip log scanning for faster results.\",\n\t\t\"\",\n\t\t\".PARAMETER Json\",\n\t\t\" Output results as JSON.\",\n\t\t\"\",\n\t\t\".EXAMPLE\",\n\t\t\" .\\\\scripts\\\\health-check.ps1\",\n\t\t\" .\\\\scripts\\\\health-check.ps1 -Quick\",\n\t\t\" .\\\\scripts\\\\health-check.ps1 -Json\",\n\t\t\"#>\",\n\t\t\"param(\",\n\t\t\" [switch]$Quick,\",\n\t\t\" [switch]$Json,\",\n\t\t\" [switch]$Detailed\",\n\t\t\")\",\n\t\t\"\",\n\t\t'$ErrorActionPreference = \"Continue\"',\n\t\t\"\",\n\t\t\"# ── Counters ─────────────────────────────────────────────────────────\",\n\t\tL(\"$script:Total = \", String(total)),\n\t\t\"$script:Healthy = 0\",\n\t\t\"$script:Warnings = 0\",\n\t\t\"$script:Failed = 0\",\n\t\t\"$script:Errors = @()\",\n\t\t\"$script:ServiceResults = @()\",\n\t\t\"$script:DockerAvailable = $false\",\n\t\t\"\",\n\t\t\"# ── Helpers ──────────────────────────────────────────────────────────\",\n\t\t\"\",\n\t\t'function Write-Pass($msg) { Write-Host \" ✅ $msg\" -ForegroundColor Green; $script:Healthy++ }',\n\t\t'function Write-Warn($msg) { Write-Host \" ⚠️ $msg\" -ForegroundColor Yellow; $script:Warnings++ }',\n\t\t'function Write-Fail($msg) { Write-Host \" ❌ $msg\" -ForegroundColor Red; $script:Failed++; $script:Errors += $msg }',\n\t\t'function Write-Info($msg) { Write-Host \" ℹ $msg\" -ForegroundColor Cyan }',\n\t\t'function Write-Dim($msg) { Write-Host \" $msg\" -ForegroundColor DarkGray }',\n\t\t\"\",\n\t\t\"function Pad-Name([string]$n) { return $n.PadRight(25) }\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 1: Environment\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Environment {\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Phase 1: Environment ────────────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\" try {\",\n\t\t\" $null = docker info 2>&1\",\n\t\t\" if ($LASTEXITCODE -eq 0) {\",\n\t\t' Write-Pass \"Docker daemon is running\"',\n\t\t\" $script:DockerAvailable = $true\",\n\t\t\" } else {\",\n\t\t' Write-Fail \"Docker daemon is NOT running\"',\n\t\t\" }\",\n\t\t\" } catch {\",\n\t\t' Write-Warn \"Docker is not installed — running bare-metal checks only\"',\n\t\t\" }\",\n\t\t\" if ($script:DockerAvailable) {\",\n\t\t\" try {\",\n\t\t\" $null = docker compose version 2>&1\",\n\t\t\" if ($LASTEXITCODE -eq 0) {\",\n\t\t' Write-Pass \"Docker Compose v2 available\"',\n\t\t\" } else {\",\n\t\t' Write-Warn \"Docker Compose v2 not found\"',\n\t\t\" }\",\n\t\t\" } catch {\",\n\t\t' Write-Warn \"Docker Compose not available\"',\n\t\t\" }\",\n\t\t\" }\",\n\t\t' $envPath = Join-Path $PSScriptRoot \"..\\\\.env\"',\n\t\t\" if (Test-Path $envPath) {\",\n\t\t' Write-Pass \".env file exists\"',\n\t\t\" $emptySecrets = 0\",\n\t\t\" Get-Content $envPath | ForEach-Object {\",\n\t\t' if ($_ -match \"(PASSWORD|TOKEN|SECRET|SESSION_KEY|COOKIE|API_KEY).*=\\\\s*$\") { $emptySecrets++ }',\n\t\t\" }\",\n\t\t\" if ($emptySecrets -gt 0) {\",\n\t\t' Write-Warn \"$emptySecrets secret(s) are empty in .env\"',\n\t\t\" } else {\",\n\t\t' Write-Pass \"All secrets are populated\"',\n\t\t\" }\",\n\t\t\" } else {\",\n\t\t' Write-Warn \".env file not found\"',\n\t\t\" }\",\n\t\t\" $drive = (Get-Item $PSScriptRoot).PSDrive\",\n\t\t\" $freeGB = [math]::Round($drive.Free / 1GB, 1)\",\n\t\t\" if ($freeGB -lt 2) {\",\n\t\t' Write-Warn \"Low disk space: ${freeGB}GB available\"',\n\t\t\" } else {\",\n\t\t' Write-Pass \"Disk space: ${freeGB}GB available\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 2: Container Check\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Container {\",\n\t\t\" param([string]$ServiceId, [string]$ServiceName, [string]$Icon)\",\n\t\t\" try {\",\n\t\t\" $status = docker compose ps $ServiceId --format json 2>&1 | ConvertFrom-Json\",\n\t\t\" } catch {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Container not found\"',\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" if (-not $status) {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Container not found\"',\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" $state = $status.State\",\n\t\t\" $health = $status.Health\",\n\t\t' if ($state -eq \"running\") {',\n\t\t' if ($health -eq \"healthy\") {',\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Running (healthy)\"',\n\t\t' } elseif ($health -eq \"starting\") {',\n\t\t' Write-Warn \"$Icon $(Pad-Name $ServiceName) Running (starting)\"',\n\t\t' } elseif ($health -eq \"unhealthy\") {',\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Running (UNHEALTHY)\"',\n\t\t\" } else {\",\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Running\"',\n\t\t\" }\",\n\t\t' } elseif ($state -eq \"exited\") {',\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Exited\"',\n\t\t\" } else {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) State: $state\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 3: Port Check\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Port {\",\n\t\t\" param([string]$ServiceId, [int]$Port, [string]$Description)\",\n\t\t\" try {\",\n\t\t\" $tcp = New-Object System.Net.Sockets.TcpClient\",\n\t\t' $tcp.ConnectAsync(\"localhost\", $Port).Wait(2000) | Out-Null',\n\t\t\" if ($tcp.Connected) {\",\n\t\t' Write-Dim \" Port $Port ($Description) — reachable\"',\n\t\t\" $tcp.Close()\",\n\t\t\" } else {\",\n\t\t' Write-Warn \" └─ ${ServiceId}: Port $Port ($Description) — NOT reachable\"',\n\t\t\" }\",\n\t\t\" } catch {\",\n\t\t' Write-Warn \" └─ ${ServiceId}: Port $Port ($Description) — NOT reachable\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ── Bare-metal process check ────────────────────────────────────────\",\n\t\t\"function Test-ProcessRunning {\",\n\t\t\" param([string]$ServiceId, [string]$ServiceName, [string]$Icon)\",\n\t\t\" $svc = Get-Service -Name $ServiceId -ErrorAction SilentlyContinue\",\n\t\t\" if ($svc) {\",\n\t\t' if ($svc.Status -eq \"Running\") {',\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Active (service)\"',\n\t\t\" } else {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) $($svc.Status)\"',\n\t\t\" }\",\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" $proc = Get-Process -Name $ServiceId -ErrorAction SilentlyContinue\",\n\t\t\" if ($proc) {\",\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Running (process)\"',\n\t\t\" } else {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) NOT running\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 6: Log Scan\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Logs {\",\n\t\t\" if ($Quick) {\",\n\t\t' if (-not $Json) { Write-Info \"Skipping log scan (-Quick mode)\" }',\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Phase 6: Log Scan ───────────────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\" $hasErrors = $false\",\n\t\tL(\" $svcIds = @(\", svcIdList, \")\"),\n\t\t\" foreach ($svcId in $svcIds) {\",\n\t\t\" try {\",\n\t\t\" $logs = docker compose logs --tail=50 $svcId 2>&1 | Out-String\",\n\t\t' $errorLines = $logs -split \"`n\" | Where-Object { $_ -match \"(error|fatal|panic|exception|segfault|killed|oom)\" } | Select-Object -Last 5',\n\t\t\" if ($errorLines) {\",\n\t\t\" $hasErrors = $true\",\n\t\t' Write-Warn \"$svcId — found error patterns in logs:\"',\n\t\t' $errorLines | ForEach-Object { Write-Dim \" | $_\" }',\n\t\t\" }\",\n\t\t\" } catch {}\",\n\t\t\" }\",\n\t\t\" if (-not $hasErrors -and -not $Json) {\",\n\t\t' Write-Pass \"No error patterns found in recent logs\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Main\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t\t\"if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\" ',\n\t\tL(' Write-Host \" 🐾 OpenClaw Stack Health Report — ', name, '\"'),\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t\"}\",\n\t\t\"\",\n\t\t\"Test-Environment\",\n\t\t\"\",\n\t\t\"if ($script:DockerAvailable) {\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Phase 2–4: Service Checks ──────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\"\",\n\t\t...dockerChecks,\n\t\t\" Test-Logs\",\n\t\t\"} else {\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Bare-Metal Service Checks ──────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\"\",\n\t\t...bmChecks,\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ── Summary ──────────────────────────────────────────────────────────\",\n\t\t\"if ($Json) {\",\n\t\t\" $result = @{\",\n\t\tL(' project = \"', name, '\"'),\n\t\t' timestamp = (Get-Date -Format \"o\")',\n\t\t\" summary = @{\",\n\t\t\" total = $script:Total\",\n\t\t\" healthy = $script:Healthy\",\n\t\t\" warnings = $script:Warnings\",\n\t\t\" failed = $script:Failed\",\n\t\t\" }\",\n\t\t\" errors = $script:Errors\",\n\t\t\" }\",\n\t\t\" $result | ConvertTo-Json -Depth 5\",\n\t\t\"} else {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \" Summary: $($script:Total) services checked\"',\n\t\t' Write-Host \" Healthy: $($script:Healthy)\" -ForegroundColor Green -NoNewline',\n\t\t' Write-Host \" | Warnings: $($script:Warnings)\" -ForegroundColor Yellow -NoNewline',\n\t\t' Write-Host \" | Failed: $($script:Failed)\" -ForegroundColor Red',\n\t\t\" if ($script:Errors.Count -gt 0) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \" ── Errors ──────────────────────────────────────────────────\" -ForegroundColor Red',\n\t\t' $script:Errors | ForEach-Object { Write-Host \" $_\" -ForegroundColor Red }',\n\t\t\" }\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t' Write-Host \"\"',\n\t\t\" if ($script:Failed -gt 0) {\",\n\t\t' Write-Host \" Some services need attention. Run with -Detailed for more.\" -ForegroundColor Red',\n\t\t\" exit 1\",\n\t\t\" } else {\",\n\t\t' Write-Host \" 🎉 All services are running!\" -ForegroundColor Green',\n\t\t\" exit 0\",\n\t\t\" }\",\n\t\t\"}\",\n\t];\n\n\treturn lines.join(\"\\n\") + \"\\n\";\n}\n"],"mappings":";;;;;;;;;;AAkBA,SAAgB,oBACf,UACA,SACyB;CACzB,MAAM,QAAgC,EAAE;AAExC,OAAM,6BAA6B,mBAAmB,UAAU,QAAQ;AACxE,OAAM,8BAA8B,yBAAyB,UAAU,QAAQ;AAE/E,QAAO;;AAaR,SAAS,qBAAqB,UAA0C;AACvE,QAAO,SAAS,SAAS,KAAK,SAAS;EACtC,IAAI,IAAI,WAAW;EACnB,MAAM,IAAI,WAAW;EACrB,MAAM,IAAI,WAAW;EACrB,OAAO,IAAI,WAAW,MAAM,KAAK,OAAO;GACvC,MAAM,EAAE;GACR,WAAW,EAAE;GACb,aAAa,EAAE;GACf,SAAS,EAAE;GACX,EAAE;EACH,gBAAgB,IAAI,WAAW,aAAa,QAAQ;EACpD,EAAE;;AAGJ,SAAS,YAAY,GAAmB;AACvC,QAAO,EAAE,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,OAAM;;AAIrD,SAAS,EAAE,GAAG,OAAyB;AACtC,QAAO,MAAM,KAAK,GAAG;;AAKtB,SAAS,mBAAmB,UAA0B,SAAqC;CAC1F,MAAM,SAAS,qBAAqB,SAAS;CAC7C,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,OAAO;CAGrB,MAAM,eAAyB,EAAE;AACjC,MAAK,MAAM,OAAO,QAAQ;AACzB,eAAa,KAAK,EAAE,WAAW,IAAI,MAAM,KAAK,IAAI,MAAM,MAAM,CAAC;AAC/D,eAAa,KAAK,EAAE,wBAAuB,IAAI,IAAI,SAAO,IAAI,MAAM,SAAO,IAAI,MAAM,KAAI,CAAC;AAC1F,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,cAAa,KACZ,EAAE,mBAAkB,IAAI,IAAI,OAAM,OAAO,EAAE,KAAK,EAAE,OAAM,EAAE,aAAa,KAAI,CAC3E;AAEF,MAAI,IAAI,eACP,cAAa,KACZ,EAAE,yBAAwB,IAAI,IAAI,SAAO,YAAY,IAAI,eAAe,EAAE,KAAI,CAC9E;MAED,cAAa,KAAK,mDAAmD;AAEtE,eAAa,KAAK,GAAG;;CAItB,MAAM,WAAqB,EAAE;AAC7B,MAAK,MAAM,OAAO,QAAQ;AACzB,WAAS,KAAK,EAAE,WAAW,IAAI,MAAM,KAAK,IAAI,MAAM,mBAAmB,CAAC;AACxE,WAAS,KAAK,EAAE,sBAAqB,IAAI,IAAI,SAAO,IAAI,MAAM,SAAO,IAAI,MAAM,KAAI,CAAC;AACpF,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,UAAS,KAAK,EAAE,mBAAkB,IAAI,IAAI,OAAM,OAAO,EAAE,KAAK,EAAE,OAAM,EAAE,aAAa,KAAI,CAAC;AAE3F,WAAS,KAAK,GAAG;;CAIlB,MAAM,YAAY,OAAO,KAAK,MAAM,OAAM,EAAE,KAAK,KAAI,CAAC,KAAK,IAAI;AA6V/D,QA3VwB;EACvB;EACA;EACA;EACA;EACA,EAAE,uCAAuC,KAAK;EAC9C;EACA;EACA;EACA,EAAE,aAAa,OAAO,MAAM,EAAE,6BAA6B;EAC3D;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,UAAU,OAAO,MAAM,CAAC;EAC1B;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;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;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;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;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;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;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,oBAAoB,WAAW,OAAO;EACxC;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,gDAA+C,MAAM,KAAI;EAC3D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;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;EACA;EACA;EACA,CAEY,KAAK,KAAK,GAAG;;AAK3B,SAAS,yBAAyB,UAA0B,SAAqC;CAChG,MAAM,SAAS,qBAAqB,SAAS;CAC7C,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,OAAO;CAGrB,MAAM,eAAyB,EAAE;AACjC,MAAK,MAAM,OAAO,QAAQ;AACzB,eAAa,KAAK,EAAE,UAAU,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC;AACvD,eAAa,KACZ,EACC,oCACA,IAAI,IACJ,sBACA,IAAI,MACJ,eACA,IAAI,MACJ,KACA,CACD;AACD,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,cAAa,KACZ,EACC,+BACA,IAAI,IACJ,aACA,OAAO,EAAE,KAAK,EACd,oBACA,EAAE,aACF,KACA,CACD;AAEF,eAAa,KAAK,GAAG;;CAItB,MAAM,WAAqB,EAAE;AAC7B,MAAK,MAAM,OAAO,QAAQ;AACzB,WAAS,KAAK,EAAE,UAAU,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC;AACnD,WAAS,KACR,EACC,yCACA,IAAI,IACJ,sBACA,IAAI,MACJ,eACA,IAAI,MACJ,KACA,CACD;AACD,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,UAAS,KACR,EACC,+BACA,IAAI,IACJ,aACA,OAAO,EAAE,KAAK,EACd,oBACA,EAAE,aACF,KACA,CACD;AAEF,WAAS,KAAK,GAAG;;CAGlB,MAAM,YAAY,OAAO,KAAK,MAAM,OAAM,EAAE,KAAK,KAAI,CAAC,KAAK,KAAK;AA8RhE,QA5RwB;EACvB;EACA;EACA;EACA,EAAE,sCAAsC,KAAK;EAC7C;EACA;EACA;EACA,EACC,eACA,OAAO,MAAM,EACb,kEACA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,oBAAoB,OAAO,MAAM,CAAC;EACpC;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;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;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;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;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;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,oBAAoB,WAAW,IAAI;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,wDAAuD,MAAM,KAAI;EACnE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;EACA;EACA;EACA;EACA;EACA,EAAE,wBAAuB,MAAM,KAAI;EACnC;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAEY,KAAK,KAAK,GAAG"}
1
+ {"version":3,"file":"health-check.cjs","names":[],"sources":["../../src/generators/health-check.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface HealthCheckOptions {\n\tprojectName: string;\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n}\n\n// ─── Generator ──────────────────────────────────────────────────────────────\n\n/**\n * Generates stack-specific health check and verification scripts.\n *\n * Each generated script is dynamic — it contains the exact service names,\n * ports, and health check commands from the resolved stack so users get\n * a precise, zero-configuration verifier.\n */\nexport function generateHealthCheck(\n\tresolved: ResolverOutput,\n\toptions: HealthCheckOptions,\n): Record<string, string> {\n\tconst files: Record<string, string> = {};\n\n\tfiles[\"scripts/health-check.sh\"] = generateBashScript(resolved, options);\n\tfiles[\"scripts/health-check.ps1\"] = generatePowerShellScript(resolved, options);\n\n\treturn files;\n}\n\n// ─── Service metadata extraction ────────────────────────────────────────────\n\ninterface ServiceCheck {\n\tid: string;\n\tname: string;\n\ticon: string;\n\tports: Array<{ host: number; container: number; description: string; exposed: boolean }>;\n\thealthCheckCmd: string | null;\n}\n\nfunction extractServiceChecks(resolved: ResolverOutput): ServiceCheck[] {\n\treturn resolved.services.map((svc) => ({\n\t\tid: svc.definition.id,\n\t\tname: svc.definition.name,\n\t\ticon: svc.definition.icon,\n\t\tports: svc.definition.ports.map((p) => ({\n\t\t\thost: p.host,\n\t\t\tcontainer: p.container,\n\t\t\tdescription: p.description,\n\t\t\texposed: p.exposed,\n\t\t})),\n\t\thealthCheckCmd: svc.definition.healthcheck?.test ?? null,\n\t}));\n}\n\nfunction escapeShell(s: string): string {\n\treturn s.replace(/'/g, \"'\\\\''\").replace(/\"/g, '\\\\\"');\n}\n\n// Use L() to build lines safely — avoids template literal issues with shell syntax\nfunction L(...parts: string[]): string {\n\treturn parts.join(\"\");\n}\n\n// ─── Bash Script ────────────────────────────────────────────────────────────\n\nfunction generateBashScript(resolved: ResolverOutput, options: HealthCheckOptions): string {\n\tconst checks = extractServiceChecks(resolved);\n\tconst name = options.projectName;\n\tconst total = checks.length;\n\n\t// Build per-service docker check calls\n\tconst dockerChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tdockerChecks.push(L(\" # ── \", svc.icon, \" \", svc.name, \" ──\"));\n\t\tdockerChecks.push(L(' check_container \"', svc.id, '\" \"', svc.name, '\" \"', svc.icon, '\"'));\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tdockerChecks.push(\n\t\t\t\tL(' check_port \"', svc.id, '\" ', String(p.host), ' \"', p.description, '\"'),\n\t\t\t);\n\t\t}\n\t\tif (svc.healthCheckCmd) {\n\t\t\tdockerChecks.push(\n\t\t\t\tL(' check_health_cmd \"', svc.id, '\" \"', escapeShell(svc.healthCheckCmd), '\"'),\n\t\t\t);\n\t\t} else {\n\t\t\tdockerChecks.push(\" # No healthcheck defined — skipping exec check\");\n\t\t}\n\t\tdockerChecks.push(\"\");\n\t}\n\n\t// Build per-service bare-metal check calls\n\tconst bmChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tbmChecks.push(L(\" # ── \", svc.icon, \" \", svc.name, \" (bare-metal) ──\"));\n\t\tbmChecks.push(L(' check_process \"', svc.id, '\" \"', svc.name, '\" \"', svc.icon, '\"'));\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tbmChecks.push(L(' check_port \"', svc.id, '\" ', String(p.host), ' \"', p.description, '\"'));\n\t\t}\n\t\tbmChecks.push(\"\");\n\t}\n\n\t// Build the log-scan service list\n\tconst svcIdList = checks.map((s) => '\"' + s.id + '\"').join(\" \");\n\n\tconst lines: string[] = [\n\t\t\"#!/usr/bin/env bash\",\n\t\t\"set -uo pipefail\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\tL(\"# 🐾 OpenClaw Stack Health Check — \", name),\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"#\",\n\t\t\"# Auto-generated verification script for your stack.\",\n\t\tL(\"# Checks \", String(total), \" services across 6 phases:\"),\n\t\t\"# 1. Environment — prerequisites, .env, secrets\",\n\t\t\"# 2. Container — running state, health status, restart count\",\n\t\t\"# 3. Port — TCP reachability for exposed ports\",\n\t\t\"# 4. Health Command — execute each service's health check\",\n\t\t\"# 5. Resources — memory/CPU warnings\",\n\t\t\"# 6. Logs — scan for ERROR/FATAL/panic patterns\",\n\t\t\"#\",\n\t\t\"# Usage:\",\n\t\t\"# ./scripts/health-check.sh # Full check\",\n\t\t\"# ./scripts/health-check.sh --quick # Skip log scan\",\n\t\t\"# ./scripts/health-check.sh --json # Output as JSON\",\n\t\t\"#\",\n\t\t\"# Exit codes: 0 = all healthy, 1 = some issues, 2 = critical failure\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t\t'SCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"',\n\t\t'PROJECT_DIR=\"$(dirname \"$SCRIPT_DIR\")\"',\n\t\t'cd \"$PROJECT_DIR\"',\n\t\t\"\",\n\t\t\"# ── Arguments ────────────────────────────────────────────────────────\",\n\t\t\"QUICK_MODE=false\",\n\t\t\"JSON_MODE=false\",\n\t\t\"VERBOSE=false\",\n\t\t'for arg in \"$@\"; do',\n\t\t' case \"$arg\" in',\n\t\t\" --quick) QUICK_MODE=true ;;\",\n\t\t\" --json) JSON_MODE=true ;;\",\n\t\t\" --verbose|-v) VERBOSE=true ;;\",\n\t\t\" esac\",\n\t\t\"done\",\n\t\t\"\",\n\t\t\"# ── Colour helpers ───────────────────────────────────────────────────\",\n\t\t'if [ -t 1 ] && [ \"$JSON_MODE\" = false ]; then',\n\t\t\" RED='\\\\033[0;31m'; GREEN='\\\\033[0;32m'; YELLOW='\\\\033[1;33m'\",\n\t\t\" CYAN='\\\\033[0;36m'; DIM='\\\\033[2m'; BOLD='\\\\033[1m'; NC='\\\\033[0m'\",\n\t\t\"else\",\n\t\t\" RED=''; GREEN=''; YELLOW=''; CYAN=''; DIM=''; BOLD=''; NC=''\",\n\t\t\"fi\",\n\t\t\"\",\n\t\t\"# ── Counters ─────────────────────────────────────────────────────────\",\n\t\tL(\"TOTAL=\", String(total)),\n\t\t\"HEALTHY=0\",\n\t\t\"WARNING=0\",\n\t\t\"FAILED=0\",\n\t\t\"ERRORS=()\",\n\t\t\"WARNINGS_LIST=()\",\n\t\t\"SERVICE_RESULTS=()\",\n\t\t\"\",\n\t\t\"# ── Utility functions ────────────────────────────────────────────────\",\n\t\t'pass() { echo -e \" ${GREEN}✅ $*${NC}\"; HEALTHY=$((HEALTHY + 1)); }',\n\t\t'warn_svc() { echo -e \" ${YELLOW}⚠️ $*${NC}\"; WARNING=$((WARNING + 1)); WARNINGS_LIST+=(\"$*\"); }',\n\t\t'fail() { echo -e \" ${RED}❌ $*${NC}\"; FAILED=$((FAILED + 1)); ERRORS+=(\"$*\"); }',\n\t\t'info() { echo -e \" ${CYAN}ℹ $*${NC}\"; }',\n\t\t'dim() { echo -e \" ${DIM}$*${NC}\"; }',\n\t\t\"\",\n\t\t\"pad_name() {\",\n\t\t' local name=\"$1\"',\n\t\t\" local pad=25\",\n\t\t' printf \"%-${pad}s\" \"$name\"',\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 1: Environment\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"phase_environment() {\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 1: Environment ────────────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # Docker\",\n\t\t\" if command -v docker &>/dev/null; then\",\n\t\t\" if docker info &>/dev/null 2>&1; then\",\n\t\t' pass \"Docker daemon is running\"',\n\t\t\" DOCKER_AVAILABLE=true\",\n\t\t\" else\",\n\t\t' fail \"Docker daemon is NOT running\"',\n\t\t\" DOCKER_AVAILABLE=false\",\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' warn_svc \"Docker is not installed — running bare-metal checks only\"',\n\t\t\" DOCKER_AVAILABLE=false\",\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # Docker Compose\",\n\t\t' if [ \"$DOCKER_AVAILABLE\" = true ]; then',\n\t\t\" if docker compose version &>/dev/null 2>&1; then\",\n\t\t' pass \"Docker Compose v2 available\"',\n\t\t\" else\",\n\t\t' warn_svc \"Docker Compose v2 not found\"',\n\t\t\" fi\",\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # .env\",\n\t\t' if [ -f \".env\" ]; then',\n\t\t' pass \".env file exists\"',\n\t\t\" EMPTY_SECRETS=0\",\n\t\t\" while IFS='=' read -r key value; do\",\n\t\t' [[ \"$key\" =~ ^#.*$ ]] && continue',\n\t\t' [[ -z \"$key\" ]] && continue',\n\t\t' if [[ \"$key\" =~ (PASSWORD|TOKEN|SECRET|SESSION_KEY|COOKIE|API_KEY) ]] && [[ -z \"${value:-}\" ]]; then',\n\t\t' if [ \"$VERBOSE\" = true ]; then',\n\t\t' warn_svc \"Empty secret: $key\"',\n\t\t\" fi\",\n\t\t\" EMPTY_SECRETS=$((EMPTY_SECRETS + 1))\",\n\t\t\" fi\",\n\t\t\" done < .env 2>/dev/null || true\",\n\t\t' if [ \"$EMPTY_SECRETS\" -gt 0 ]; then',\n\t\t' warn_svc \"$EMPTY_SECRETS secret(s) are empty in .env\"',\n\t\t\" else\",\n\t\t' pass \"All secrets are populated\"',\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' warn_svc \".env file not found\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" # Disk space\",\n\t\t\" AVAIL_KB=$(df -k . 2>/dev/null | awk 'NR==2{print $4}' || echo \\\"0\\\")\",\n\t\t\" AVAIL_GB=$((AVAIL_KB / 1024 / 1024))\",\n\t\t' if [ \"$AVAIL_GB\" -lt 2 ]; then',\n\t\t' warn_svc \"Low disk space: ${AVAIL_GB}GB available\"',\n\t\t\" else\",\n\t\t' pass \"Disk space: ${AVAIL_GB}GB available\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 2: Container Status\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"check_container() {\",\n\t\t' local id=\"$1\" name=\"$2\" icon=\"$3\"',\n\t\t\"\",\n\t\t\" local status restarts\",\n\t\t' status=$(docker compose ps \"$id\" --format json 2>/dev/null | head -1)',\n\t\t\"\",\n\t\t' if [ -z \"$status\" ]; then',\n\t\t' fail \"$icon $(pad_name \"$name\") — Container not found\"',\n\t\t\" return\",\n\t\t\" fi\",\n\t\t\"\",\n\t\t\" local state health_status\",\n\t\t' state=$(echo \"$status\" | grep -o \\'\"State\":\"[^\"]*\"\\' | cut -d\\'\"\\' -f4 || echo \"unknown\")',\n\t\t' health_status=$(echo \"$status\" | grep -o \\'\"Health\":\"[^\"]*\"\\' | cut -d\\'\"\\' -f4 || echo \"none\")',\n\t\t\"\",\n\t\t' restarts=$(docker inspect --format=\"{{.RestartCount}}\" \"$(docker compose ps -q \"$id\" 2>/dev/null | head -1)\" 2>/dev/null || echo \"0\")',\n\t\t\"\",\n\t\t' if [ \"$state\" = \"running\" ]; then',\n\t\t' if [ \"$health_status\" = \"healthy\" ]; then',\n\t\t' pass \"$icon $(pad_name \"$name\") Running (healthy) restarts: $restarts\"',\n\t\t' elif [ \"$health_status\" = \"starting\" ]; then',\n\t\t' warn_svc \"$icon $(pad_name \"$name\") Running (starting) restarts: $restarts\"',\n\t\t' elif [ \"$health_status\" = \"unhealthy\" ]; then',\n\t\t' fail \"$icon $(pad_name \"$name\") Running (UNHEALTHY) restarts: $restarts\"',\n\t\t\" else\",\n\t\t' pass \"$icon $(pad_name \"$name\") Running restarts: $restarts\"',\n\t\t\" fi\",\n\t\t' if [ \"$restarts\" -gt 5 ] 2>/dev/null; then',\n\t\t' warn_svc \" └─ $name has restarted $restarts times (possible crash loop)\"',\n\t\t\" fi\",\n\t\t' elif [ \"$state\" = \"exited\" ]; then',\n\t\t\" local exit_code\",\n\t\t' exit_code=$(docker inspect --format=\"{{.State.ExitCode}}\" \"$(docker compose ps -q \"$id\" 2>/dev/null | head -1)\" 2>/dev/null || echo \"?\")',\n\t\t' fail \"$icon $(pad_name \"$name\") Exited (code $exit_code)\"',\n\t\t' if [ \"$exit_code\" = \"137\" ]; then',\n\t\t' ERRORS+=(\" └─ $name: OOM killed (exit 137). Increase memory limits.\")',\n\t\t' elif [ \"$exit_code\" = \"1\" ]; then',\n\t\t' ERRORS+=(\" └─ $name: Application error (exit 1). Check logs: docker compose logs $id\")',\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' fail \"$icon $(pad_name \"$name\") State: $state\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 3: Port Reachability\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"check_port() {\",\n\t\t' local id=\"$1\" port=\"$2\" desc=\"$3\"',\n\t\t\" if command -v nc &>/dev/null; then\",\n\t\t' if nc -z -w 2 localhost \"$port\" 2>/dev/null; then',\n\t\t' dim \" Port $port ($desc) — reachable\"',\n\t\t\" else\",\n\t\t' warn_svc \" └─ $id: Port $port ($desc) — NOT reachable\"',\n\t\t\" fi\",\n\t\t\" elif command -v curl &>/dev/null; then\",\n\t\t' if curl -sf --max-time 2 \"http://localhost:$port/\" &>/dev/null; then',\n\t\t' dim \" Port $port ($desc) — reachable\"',\n\t\t\" else\",\n\t\t' warn_svc \" └─ $id: Port $port ($desc) — NOT reachable\"',\n\t\t\" fi\",\n\t\t\" else\",\n\t\t' dim \" Port $port ($desc) — skipped (no nc or curl)\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 4: Health Check Commands\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"check_health_cmd() {\",\n\t\t' local id=\"$1\" cmd=\"$2\"',\n\t\t' local cid=$(docker compose ps -q \"$id\" 2>/dev/null | head -1)',\n\t\t' [ -z \"$cid\" ] && return',\n\t\t' if docker exec \"$cid\" sh -c \"$cmd\" &>/dev/null; then',\n\t\t' dim \" Health command passed\"',\n\t\t\" else\",\n\t\t' warn_svc \" └─ $id: Health check command failed\"',\n\t\t' if [ \"$VERBOSE\" = true ]; then dim \" Command: $cmd\"; fi',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 5: Resource Usage\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"phase_resources() {\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 5: Resource Usage ─────────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t' docker stats --no-stream --format \"table {{.Name}}\\\\t{{.CPUPerc}}\\\\t{{.MemUsage}}\\\\t{{.MemPerc}}\" 2>/dev/null || true',\n\t\t' if [ \"$VERBOSE\" = false ] && [ \"$JSON_MODE\" = false ]; then',\n\t\t' info \"Use --verbose to see warnings for high memory usage\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 6: Log Scan\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"phase_logs() {\",\n\t\t' if [ \"$QUICK_MODE\" = true ]; then',\n\t\t' if [ \"$JSON_MODE\" = false ]; then echo \"\"; info \"Skipping log scan (--quick mode)\"; fi',\n\t\t\" return\",\n\t\t\" fi\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 6: Log Scan ───────────────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\" local has_errors=false\",\n\t\tL(\" for svc_id in \", svcIdList, \"; do\"),\n\t\t\" local error_lines\",\n\t\t' error_lines=$(docker compose logs --tail=50 \"$svc_id\" 2>/dev/null | grep -iE \"(error|fatal|panic|exception|segfault|killed|oom)\" | tail -5 || true)',\n\t\t' if [ -n \"$error_lines\" ]; then',\n\t\t\" has_errors=true\",\n\t\t' warn_svc \"$svc_id — found error patterns in logs:\"',\n\t\t' echo \"$error_lines\" | while IFS= read -r eline; do',\n\t\t' dim \" | $eline\"',\n\t\t\" done\",\n\t\t\" fi\",\n\t\t\" done\",\n\t\t' if [ \"$has_errors\" = false ] && [ \"$JSON_MODE\" = false ]; then',\n\t\t' pass \"No error patterns found in recent logs\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ── Bare-metal process check ────────────────────────────────────────\",\n\t\t\"check_process() {\",\n\t\t' local id=\"$1\" name=\"$2\" icon=\"$3\"',\n\t\t\" if command -v systemctl &>/dev/null; then\",\n\t\t' if systemctl is-active --quiet \"$id\" 2>/dev/null; then',\n\t\t' pass \"$icon $(pad_name \"$name\") Active (systemd)\"',\n\t\t\" return\",\n\t\t\" fi\",\n\t\t\" fi\",\n\t\t' if pgrep -f \"$id\" &>/dev/null; then',\n\t\t' pass \"$icon $(pad_name \"$name\") Running (process)\"',\n\t\t\" else\",\n\t\t' fail \"$icon $(pad_name \"$name\") NOT running\"',\n\t\t\" fi\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"# Main\",\n\t\t\"# ═══════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t\t\"DOCKER_AVAILABLE=false\",\n\t\t\"\",\n\t\t'if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\tL(' echo \" 🐾 OpenClaw Stack Health Report — ', name, '\"'),\n\t\t' echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t\"fi\",\n\t\t\"\",\n\t\t\"phase_environment\",\n\t\t\"\",\n\t\t'if [ \"$DOCKER_AVAILABLE\" = true ]; then',\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Phase 2–4: Service Checks ──────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t...dockerChecks,\n\t\t\"\",\n\t\t\" phase_resources\",\n\t\t\" phase_logs\",\n\t\t\"\",\n\t\t\"else\",\n\t\t' if [ \"$JSON_MODE\" = false ]; then',\n\t\t' echo \"\"',\n\t\t' echo -e \"${BOLD}── Bare-Metal Service Checks ──────────────────────────────${NC}\"',\n\t\t' echo \"\"',\n\t\t\" fi\",\n\t\t\"\",\n\t\t...bmChecks,\n\t\t\"fi\",\n\t\t\"\",\n\t\t\"# ── Summary ──────────────────────────────────────────────────────────\",\n\t\t'echo \"\"',\n\t\t'echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t'echo \"\"',\n\t\t'echo -e \" ${BOLD}Summary${NC}: $TOTAL services checked\"',\n\t\t'echo -e \" ${GREEN}Healthy: $HEALTHY${NC} | ${YELLOW}Warnings: $WARNING${NC} | ${RED}Failed: $FAILED${NC}\"',\n\t\t\"\",\n\t\t\"if [ ${#ERRORS[@]} -gt 0 ]; then\",\n\t\t' echo \"\"',\n\t\t' echo -e \" ${BOLD}${RED}── Errors ─────────────────────────────────────────────────${NC}\"',\n\t\t' for e in \"${ERRORS[@]}\"; do',\n\t\t' echo -e \" ${RED}$e${NC}\"',\n\t\t\" done\",\n\t\t\"fi\",\n\t\t\"\",\n\t\t'echo \"\"',\n\t\t'echo \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t'echo \"\"',\n\t\t\"\",\n\t\t'if [ \"$FAILED\" -gt 0 ]; then',\n\t\t' echo -e \" ${RED}Some services need attention. Run with --verbose for details.${NC}\"',\n\t\t\" exit 1\",\n\t\t\"else\",\n\t\t' echo -e \" ${GREEN}🎉 All services are running!${NC}\"',\n\t\t\" exit 0\",\n\t\t\"fi\",\n\t];\n\n\treturn lines.join(\"\\n\") + \"\\n\";\n}\n\n// ─── PowerShell Script ──────────────────────────────────────────────────────\n\nfunction generatePowerShellScript(resolved: ResolverOutput, options: HealthCheckOptions): string {\n\tconst checks = extractServiceChecks(resolved);\n\tconst name = options.projectName;\n\tconst total = checks.length;\n\n\t// Build per-service docker check calls\n\tconst dockerChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tdockerChecks.push(L(\" # \", svc.icon, \" \", svc.name));\n\t\tdockerChecks.push(\n\t\t\tL(\n\t\t\t\t' Test-Container -ServiceId \"',\n\t\t\t\tsvc.id,\n\t\t\t\t'\" -ServiceName \"',\n\t\t\t\tsvc.name,\n\t\t\t\t'\" -Icon \"',\n\t\t\t\tsvc.icon,\n\t\t\t\t'\"',\n\t\t\t),\n\t\t);\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tdockerChecks.push(\n\t\t\t\tL(\n\t\t\t\t\t' Test-Port -ServiceId \"',\n\t\t\t\t\tsvc.id,\n\t\t\t\t\t'\" -Port ',\n\t\t\t\t\tString(p.host),\n\t\t\t\t\t' -Description \"',\n\t\t\t\t\tp.description,\n\t\t\t\t\t'\"',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tdockerChecks.push(\"\");\n\t}\n\n\t// Build per-service bare-metal check calls\n\tconst bmChecks: string[] = [];\n\tfor (const svc of checks) {\n\t\tbmChecks.push(L(\" # \", svc.icon, \" \", svc.name));\n\t\tbmChecks.push(\n\t\t\tL(\n\t\t\t\t' Test-ProcessRunning -ServiceId \"',\n\t\t\t\tsvc.id,\n\t\t\t\t'\" -ServiceName \"',\n\t\t\t\tsvc.name,\n\t\t\t\t'\" -Icon \"',\n\t\t\t\tsvc.icon,\n\t\t\t\t'\"',\n\t\t\t),\n\t\t);\n\t\tfor (const p of svc.ports.filter((pp) => pp.exposed)) {\n\t\t\tbmChecks.push(\n\t\t\t\tL(\n\t\t\t\t\t' Test-Port -ServiceId \"',\n\t\t\t\t\tsvc.id,\n\t\t\t\t\t'\" -Port ',\n\t\t\t\t\tString(p.host),\n\t\t\t\t\t' -Description \"',\n\t\t\t\t\tp.description,\n\t\t\t\t\t'\"',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tbmChecks.push(\"\");\n\t}\n\n\tconst svcIdList = checks.map((s) => '\"' + s.id + '\"').join(\", \");\n\n\tconst lines: string[] = [\n\t\t\"#Requires -Version 5.1\",\n\t\t\"<#\",\n\t\t\".SYNOPSIS\",\n\t\tL(\" OpenClaw Stack Health Check — \", name),\n\t\t\"\",\n\t\t\".DESCRIPTION\",\n\t\t\" Auto-generated verification script for your stack.\",\n\t\tL(\n\t\t\t\" Checks \",\n\t\t\tString(total),\n\t\t\t\" services: container status, port reachability, and log errors.\",\n\t\t),\n\t\t\"\",\n\t\t\".PARAMETER Quick\",\n\t\t\" Skip log scanning for faster results.\",\n\t\t\"\",\n\t\t\".PARAMETER Json\",\n\t\t\" Output results as JSON.\",\n\t\t\"\",\n\t\t\".EXAMPLE\",\n\t\t\" .\\\\scripts\\\\health-check.ps1\",\n\t\t\" .\\\\scripts\\\\health-check.ps1 -Quick\",\n\t\t\" .\\\\scripts\\\\health-check.ps1 -Json\",\n\t\t\"#>\",\n\t\t\"param(\",\n\t\t\" [switch]$Quick,\",\n\t\t\" [switch]$Json,\",\n\t\t\" [switch]$Detailed\",\n\t\t\")\",\n\t\t\"\",\n\t\t'$ErrorActionPreference = \"Continue\"',\n\t\t\"\",\n\t\t\"# ── Counters ─────────────────────────────────────────────────────────\",\n\t\tL(\"$script:Total = \", String(total)),\n\t\t\"$script:Healthy = 0\",\n\t\t\"$script:Warnings = 0\",\n\t\t\"$script:Failed = 0\",\n\t\t\"$script:Errors = @()\",\n\t\t\"$script:ServiceResults = @()\",\n\t\t\"$script:DockerAvailable = $false\",\n\t\t\"\",\n\t\t\"# ── Helpers ──────────────────────────────────────────────────────────\",\n\t\t\"\",\n\t\t'function Write-Pass($msg) { Write-Host \" ✅ $msg\" -ForegroundColor Green; $script:Healthy++ }',\n\t\t'function Write-Warn($msg) { Write-Host \" ⚠️ $msg\" -ForegroundColor Yellow; $script:Warnings++ }',\n\t\t'function Write-Fail($msg) { Write-Host \" ❌ $msg\" -ForegroundColor Red; $script:Failed++; $script:Errors += $msg }',\n\t\t'function Write-Info($msg) { Write-Host \" ℹ $msg\" -ForegroundColor Cyan }',\n\t\t'function Write-Dim($msg) { Write-Host \" $msg\" -ForegroundColor DarkGray }',\n\t\t\"\",\n\t\t\"function Pad-Name([string]$n) { return $n.PadRight(25) }\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 1: Environment\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Environment {\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Phase 1: Environment ────────────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\" try {\",\n\t\t\" $null = docker info 2>&1\",\n\t\t\" if ($LASTEXITCODE -eq 0) {\",\n\t\t' Write-Pass \"Docker daemon is running\"',\n\t\t\" $script:DockerAvailable = $true\",\n\t\t\" } else {\",\n\t\t' Write-Fail \"Docker daemon is NOT running\"',\n\t\t\" }\",\n\t\t\" } catch {\",\n\t\t' Write-Warn \"Docker is not installed — running bare-metal checks only\"',\n\t\t\" }\",\n\t\t\" if ($script:DockerAvailable) {\",\n\t\t\" try {\",\n\t\t\" $null = docker compose version 2>&1\",\n\t\t\" if ($LASTEXITCODE -eq 0) {\",\n\t\t' Write-Pass \"Docker Compose v2 available\"',\n\t\t\" } else {\",\n\t\t' Write-Warn \"Docker Compose v2 not found\"',\n\t\t\" }\",\n\t\t\" } catch {\",\n\t\t' Write-Warn \"Docker Compose not available\"',\n\t\t\" }\",\n\t\t\" }\",\n\t\t' $envPath = Join-Path $PSScriptRoot \"..\\\\.env\"',\n\t\t\" if (Test-Path $envPath) {\",\n\t\t' Write-Pass \".env file exists\"',\n\t\t\" $emptySecrets = 0\",\n\t\t\" Get-Content $envPath | ForEach-Object {\",\n\t\t' if ($_ -match \"(PASSWORD|TOKEN|SECRET|SESSION_KEY|COOKIE|API_KEY).*=\\\\s*$\") { $emptySecrets++ }',\n\t\t\" }\",\n\t\t\" if ($emptySecrets -gt 0) {\",\n\t\t' Write-Warn \"$emptySecrets secret(s) are empty in .env\"',\n\t\t\" } else {\",\n\t\t' Write-Pass \"All secrets are populated\"',\n\t\t\" }\",\n\t\t\" } else {\",\n\t\t' Write-Warn \".env file not found\"',\n\t\t\" }\",\n\t\t\" $drive = (Get-Item $PSScriptRoot).PSDrive\",\n\t\t\" $freeGB = [math]::Round($drive.Free / 1GB, 1)\",\n\t\t\" if ($freeGB -lt 2) {\",\n\t\t' Write-Warn \"Low disk space: ${freeGB}GB available\"',\n\t\t\" } else {\",\n\t\t' Write-Pass \"Disk space: ${freeGB}GB available\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 2: Container Check\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Container {\",\n\t\t\" param([string]$ServiceId, [string]$ServiceName, [string]$Icon)\",\n\t\t\" try {\",\n\t\t\" $status = docker compose ps $ServiceId --format json 2>&1 | ConvertFrom-Json\",\n\t\t\" } catch {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Container not found\"',\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" if (-not $status) {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Container not found\"',\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" $state = $status.State\",\n\t\t\" $health = $status.Health\",\n\t\t' if ($state -eq \"running\") {',\n\t\t' if ($health -eq \"healthy\") {',\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Running (healthy)\"',\n\t\t' } elseif ($health -eq \"starting\") {',\n\t\t' Write-Warn \"$Icon $(Pad-Name $ServiceName) Running (starting)\"',\n\t\t' } elseif ($health -eq \"unhealthy\") {',\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Running (UNHEALTHY)\"',\n\t\t\" } else {\",\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Running\"',\n\t\t\" }\",\n\t\t' } elseif ($state -eq \"exited\") {',\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) Exited\"',\n\t\t\" } else {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) State: $state\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 3: Port Check\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Port {\",\n\t\t\" param([string]$ServiceId, [int]$Port, [string]$Description)\",\n\t\t\" try {\",\n\t\t\" $tcp = New-Object System.Net.Sockets.TcpClient\",\n\t\t' $tcp.ConnectAsync(\"localhost\", $Port).Wait(2000) | Out-Null',\n\t\t\" if ($tcp.Connected) {\",\n\t\t' Write-Dim \" Port $Port ($Description) — reachable\"',\n\t\t\" $tcp.Close()\",\n\t\t\" } else {\",\n\t\t' Write-Warn \" └─ ${ServiceId}: Port $Port ($Description) — NOT reachable\"',\n\t\t\" }\",\n\t\t\" } catch {\",\n\t\t' Write-Warn \" └─ ${ServiceId}: Port $Port ($Description) — NOT reachable\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ── Bare-metal process check ────────────────────────────────────────\",\n\t\t\"function Test-ProcessRunning {\",\n\t\t\" param([string]$ServiceId, [string]$ServiceName, [string]$Icon)\",\n\t\t\" $svc = Get-Service -Name $ServiceId -ErrorAction SilentlyContinue\",\n\t\t\" if ($svc) {\",\n\t\t' if ($svc.Status -eq \"Running\") {',\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Active (service)\"',\n\t\t\" } else {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) $($svc.Status)\"',\n\t\t\" }\",\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" $proc = Get-Process -Name $ServiceId -ErrorAction SilentlyContinue\",\n\t\t\" if ($proc) {\",\n\t\t' Write-Pass \"$Icon $(Pad-Name $ServiceName) Running (process)\"',\n\t\t\" } else {\",\n\t\t' Write-Fail \"$Icon $(Pad-Name $ServiceName) NOT running\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Phase 6: Log Scan\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"function Test-Logs {\",\n\t\t\" if ($Quick) {\",\n\t\t' if (-not $Json) { Write-Info \"Skipping log scan (-Quick mode)\" }',\n\t\t\" return\",\n\t\t\" }\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Phase 6: Log Scan ───────────────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\" $hasErrors = $false\",\n\t\tL(\" $svcIds = @(\", svcIdList, \")\"),\n\t\t\" foreach ($svcId in $svcIds) {\",\n\t\t\" try {\",\n\t\t\" $logs = docker compose logs --tail=50 $svcId 2>&1 | Out-String\",\n\t\t' $errorLines = $logs -split \"`n\" | Where-Object { $_ -match \"(error|fatal|panic|exception|segfault|killed|oom)\" } | Select-Object -Last 5',\n\t\t\" if ($errorLines) {\",\n\t\t\" $hasErrors = $true\",\n\t\t' Write-Warn \"$svcId — found error patterns in logs:\"',\n\t\t' $errorLines | ForEach-Object { Write-Dim \" | $_\" }',\n\t\t\" }\",\n\t\t\" } catch {}\",\n\t\t\" }\",\n\t\t\" if (-not $hasErrors -and -not $Json) {\",\n\t\t' Write-Pass \"No error patterns found in recent logs\"',\n\t\t\" }\",\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"# Main\",\n\t\t\"# ═════════════════════════════════════════════════════════════════════\",\n\t\t\"\",\n\t\t\"if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\" ',\n\t\tL(' Write-Host \" 🐾 OpenClaw Stack Health Report — ', name, '\"'),\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t\"}\",\n\t\t\"\",\n\t\t\"Test-Environment\",\n\t\t\"\",\n\t\t\"if ($script:DockerAvailable) {\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Phase 2–4: Service Checks ──────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\"\",\n\t\t...dockerChecks,\n\t\t\" Test-Logs\",\n\t\t\"} else {\",\n\t\t\" if (-not $Json) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"── Bare-Metal Service Checks ──────────────────────────────\" -ForegroundColor White',\n\t\t' Write-Host \"\"',\n\t\t\" }\",\n\t\t\"\",\n\t\t...bmChecks,\n\t\t\"}\",\n\t\t\"\",\n\t\t\"# ── Summary ──────────────────────────────────────────────────────────\",\n\t\t\"if ($Json) {\",\n\t\t\" $result = @{\",\n\t\tL(' project = \"', name, '\"'),\n\t\t' timestamp = (Get-Date -Format \"o\")',\n\t\t\" summary = @{\",\n\t\t\" total = $script:Total\",\n\t\t\" healthy = $script:Healthy\",\n\t\t\" warnings = $script:Warnings\",\n\t\t\" failed = $script:Failed\",\n\t\t\" }\",\n\t\t\" errors = $script:Errors\",\n\t\t\" }\",\n\t\t\" $result | ConvertTo-Json -Depth 5\",\n\t\t\"} else {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \" Summary: $($script:Total) services checked\"',\n\t\t' Write-Host \" Healthy: $($script:Healthy)\" -ForegroundColor Green -NoNewline',\n\t\t' Write-Host \" | Warnings: $($script:Warnings)\" -ForegroundColor Yellow -NoNewline',\n\t\t' Write-Host \" | Failed: $($script:Failed)\" -ForegroundColor Red',\n\t\t\" if ($script:Errors.Count -gt 0) {\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \" ── Errors ──────────────────────────────────────────────────\" -ForegroundColor Red',\n\t\t' $script:Errors | ForEach-Object { Write-Host \" $_\" -ForegroundColor Red }',\n\t\t\" }\",\n\t\t' Write-Host \"\"',\n\t\t' Write-Host \"═══════════════════════════════════════════════════════════════════════\"',\n\t\t' Write-Host \"\"',\n\t\t\" if ($script:Failed -gt 0) {\",\n\t\t' Write-Host \" Some services need attention. Run with -Detailed for more.\" -ForegroundColor Red',\n\t\t\" exit 1\",\n\t\t\" } else {\",\n\t\t' Write-Host \" 🎉 All services are running!\" -ForegroundColor Green',\n\t\t\" exit 0\",\n\t\t\" }\",\n\t\t\"}\",\n\t];\n\n\treturn lines.join(\"\\n\") + \"\\n\";\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAgB,oBACf,UACA,SACyB;CACzB,MAAM,QAAgC,EAAE;AAExC,OAAM,6BAA6B,mBAAmB,UAAU,QAAQ;AACxE,OAAM,8BAA8B,yBAAyB,UAAU,QAAQ;AAE/E,QAAO;;AAaR,SAAS,qBAAqB,UAA0C;AACvE,QAAO,SAAS,SAAS,KAAK,SAAS;EACtC,IAAI,IAAI,WAAW;EACnB,MAAM,IAAI,WAAW;EACrB,MAAM,IAAI,WAAW;EACrB,OAAO,IAAI,WAAW,MAAM,KAAK,OAAO;GACvC,MAAM,EAAE;GACR,WAAW,EAAE;GACb,aAAa,EAAE;GACf,SAAS,EAAE;GACX,EAAE;EACH,gBAAgB,IAAI,WAAW,aAAa,QAAQ;EACpD,EAAE;;AAGJ,SAAS,YAAY,GAAmB;AACvC,QAAO,EAAE,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,OAAM;;AAIrD,SAAS,EAAE,GAAG,OAAyB;AACtC,QAAO,MAAM,KAAK,GAAG;;AAKtB,SAAS,mBAAmB,UAA0B,SAAqC;CAC1F,MAAM,SAAS,qBAAqB,SAAS;CAC7C,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,OAAO;CAGrB,MAAM,eAAyB,EAAE;AACjC,MAAK,MAAM,OAAO,QAAQ;AACzB,eAAa,KAAK,EAAE,WAAW,IAAI,MAAM,KAAK,IAAI,MAAM,MAAM,CAAC;AAC/D,eAAa,KAAK,EAAE,wBAAuB,IAAI,IAAI,SAAO,IAAI,MAAM,SAAO,IAAI,MAAM,KAAI,CAAC;AAC1F,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,cAAa,KACZ,EAAE,mBAAkB,IAAI,IAAI,OAAM,OAAO,EAAE,KAAK,EAAE,OAAM,EAAE,aAAa,KAAI,CAC3E;AAEF,MAAI,IAAI,eACP,cAAa,KACZ,EAAE,yBAAwB,IAAI,IAAI,SAAO,YAAY,IAAI,eAAe,EAAE,KAAI,CAC9E;MAED,cAAa,KAAK,mDAAmD;AAEtE,eAAa,KAAK,GAAG;;CAItB,MAAM,WAAqB,EAAE;AAC7B,MAAK,MAAM,OAAO,QAAQ;AACzB,WAAS,KAAK,EAAE,WAAW,IAAI,MAAM,KAAK,IAAI,MAAM,mBAAmB,CAAC;AACxE,WAAS,KAAK,EAAE,sBAAqB,IAAI,IAAI,SAAO,IAAI,MAAM,SAAO,IAAI,MAAM,KAAI,CAAC;AACpF,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,UAAS,KAAK,EAAE,mBAAkB,IAAI,IAAI,OAAM,OAAO,EAAE,KAAK,EAAE,OAAM,EAAE,aAAa,KAAI,CAAC;AAE3F,WAAS,KAAK,GAAG;;CAIlB,MAAM,YAAY,OAAO,KAAK,MAAM,OAAM,EAAE,KAAK,KAAI,CAAC,KAAK,IAAI;AA6V/D,QA3VwB;EACvB;EACA;EACA;EACA;EACA,EAAE,uCAAuC,KAAK;EAC9C;EACA;EACA;EACA,EAAE,aAAa,OAAO,MAAM,EAAE,6BAA6B;EAC3D;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,UAAU,OAAO,MAAM,CAAC;EAC1B;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;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;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;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;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;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;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,oBAAoB,WAAW,OAAO;EACxC;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,gDAA+C,MAAM,KAAI;EAC3D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;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;EACA;EACA;EACA,CAEY,KAAK,KAAK,GAAG;;AAK3B,SAAS,yBAAyB,UAA0B,SAAqC;CAChG,MAAM,SAAS,qBAAqB,SAAS;CAC7C,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,OAAO;CAGrB,MAAM,eAAyB,EAAE;AACjC,MAAK,MAAM,OAAO,QAAQ;AACzB,eAAa,KAAK,EAAE,UAAU,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC;AACvD,eAAa,KACZ,EACC,oCACA,IAAI,IACJ,sBACA,IAAI,MACJ,eACA,IAAI,MACJ,KACA,CACD;AACD,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,cAAa,KACZ,EACC,+BACA,IAAI,IACJ,aACA,OAAO,EAAE,KAAK,EACd,oBACA,EAAE,aACF,KACA,CACD;AAEF,eAAa,KAAK,GAAG;;CAItB,MAAM,WAAqB,EAAE;AAC7B,MAAK,MAAM,OAAO,QAAQ;AACzB,WAAS,KAAK,EAAE,UAAU,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC;AACnD,WAAS,KACR,EACC,yCACA,IAAI,IACJ,sBACA,IAAI,MACJ,eACA,IAAI,MACJ,KACA,CACD;AACD,OAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,OAAO,GAAG,QAAQ,CACnD,UAAS,KACR,EACC,+BACA,IAAI,IACJ,aACA,OAAO,EAAE,KAAK,EACd,oBACA,EAAE,aACF,KACA,CACD;AAEF,WAAS,KAAK,GAAG;;CAGlB,MAAM,YAAY,OAAO,KAAK,MAAM,OAAM,EAAE,KAAK,KAAI,CAAC,KAAK,KAAK;AA8RhE,QA5RwB;EACvB;EACA;EACA;EACA,EAAE,sCAAsC,KAAK;EAC7C;EACA;EACA;EACA,EACC,eACA,OAAO,MAAM,EACb,kEACA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,oBAAoB,OAAO,MAAM,CAAC;EACpC;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;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;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;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;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;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,oBAAoB,WAAW,IAAI;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,wDAAuD,MAAM,KAAI;EACnE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;EACA;EACA;EACA;EACA;EACA,EAAE,wBAAuB,MAAM,KAAI;EACnC;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;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAEY,KAAK,KAAK,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"health-check.d.mts","names":[],"sources":["../../src/generators/health-check.ts"],"mappings":";;;UAIiB,kBAAA;EAChB,WAAA;EACA,cAAA;AAAA;;;;AAYD;;;;iBAAgB,mBAAA,CACf,QAAA,EAAU,cAAA,EACV,OAAA,EAAS,kBAAA,GACP,MAAA"}
1
+ {"version":3,"file":"health-check.d.mts","names":[],"sources":["../../src/generators/health-check.ts"],"mappings":";;;UAIiB,kBAAA;EAChB,WAAA;EACA,cAAA;AAAA;;;;;AAYD;;;iBAAgB,mBAAA,CACf,QAAA,EAAU,cAAA,EACV,OAAA,EAAS,kBAAA,GACP,MAAA"}
@@ -699,7 +699,7 @@ function generatePowerShellScript(resolved, options) {
699
699
  "}"
700
700
  ].join("\n") + "\n";
701
701
  }
702
-
703
702
  //#endregion
704
703
  export { generateHealthCheck };
704
+
705
705
  //# sourceMappingURL=health-check.mjs.map
@@ -1,6 +1,5 @@
1
- const require_vi_2VT5v0um = require('../vi.2VT5v0um-BmRMvymT.cjs');
2
- const require_generate = require('../generate.cjs');
3
-
1
+ const require_vi_2VT5v0um = require("../vi.2VT5v0um-CRqXre87.cjs");
2
+ const require_generate = require("../generate.cjs");
4
3
  //#region src/generators/health-check.test.ts
5
4
  require_vi_2VT5v0um.describe("generateHealthCheck (via generate)", () => {
6
5
  const baseInput = {
@@ -79,6 +78,6 @@ require_vi_2VT5v0um.describe("generateHealthCheck (via generate)", () => {
79
78
  require_vi_2VT5v0um.globalExpect(sh).toContain("phase_logs");
80
79
  });
81
80
  });
82
-
83
81
  //#endregion
82
+
84
83
  //# sourceMappingURL=health-check.test.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"health-check.test.cjs","names":["describe","generate"],"sources":["../../src/generators/health-check.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateHealthCheck (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"health-test\",\n\t\tservices: [\"redis\", \"postgresql\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates health-check.sh and health-check.ps1\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.sh\");\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.ps1\");\n\t});\n\n\tit(\"health-check.sh contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.sh contains service-specific checks for each resolved service\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.sh includes port checks for exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis exposes port 6379, PostgreSQL exposes 5432\n\t\texpect(sh).toContain(\"6379\");\n\t\texpect(sh).toContain(\"5432\");\n\t});\n\n\tit(\"health-check.sh has usage/help docs\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"--quick\");\n\t\texpect(sh).toContain(\"--json\");\n\t\texpect(sh).toContain(\"--verbose\");\n\t});\n\n\tit(\"health-check.sh starts with shebang\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh.startsWith(\"#!/usr/bin/env bash\")).toBe(true);\n\t});\n\n\tit(\"health-check.ps1 contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.ps1 contains service checks\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"redis\");\n\t\texpect(ps1).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.ps1 includes PowerShell-style parameters\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"[switch]$Quick\");\n\t\texpect(ps1).toContain(\"[switch]$Json\");\n\t});\n\n\tit(\"health check scripts include all resolved services including dependencies\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"postiz\"], // postiz depends on redis and postgresql\n\t\t});\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"postiz\");\n\t\t// Dependencies should be auto-resolved and included\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health check script includes health check commands when service defines one\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis has a healthcheck command (redis-cli ping)\n\t\texpect(sh).toContain(\"check_health_cmd\");\n\t});\n\n\tit(\"health check scripts contain the phase structure\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"Phase 1\");\n\t\texpect(sh).toContain(\"phase_environment\");\n\t\texpect(sh).toContain(\"check_container\");\n\t\texpect(sh).toContain(\"check_port\");\n\t\texpect(sh).toContain(\"phase_logs\");\n\t});\n});\n"],"mappings":";;;;AAGAA,6BAAS,4CAA4C;CACpD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,aAAa;EACjC,YAAY,EAAE;EACd,OAAO;EACP,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,wBAAG,wDAAwD;EAC1D,MAAM,SAASC,0BAAS,UAAU;AAElC,mCAAO,OAAO,MAAM,CAAC,eAAe,0BAA0B;AAC9D,mCAAO,OAAO,MAAM,CAAC,eAAe,2BAA2B;GAC9D;AAEF,wBAAG,+CAA+C;EAEjD,MAAM,KADSA,0BAAS,UAAU,CAChB,MAAM;AAExB,mCAAO,GAAG,CAAC,UAAU,cAAc;GAClC;AAEF,wBAAG,oFAAoF;EAEtF,MAAM,KADSA,0BAAS,UAAU,CAChB,MAAM;AAExB,mCAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,mCAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,wBAAG,gEAAgE;EAElE,MAAM,KADSA,0BAAS,UAAU,CAChB,MAAM;AAGxB,mCAAO,GAAG,CAAC,UAAU,OAAO;AAC5B,mCAAO,GAAG,CAAC,UAAU,OAAO;GAC3B;AAEF,wBAAG,6CAA6C;EAE/C,MAAM,KADSA,0BAAS,UAAU,CAChB,MAAM;AAExB,mCAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,mCAAO,GAAG,CAAC,UAAU,SAAS;AAC9B,mCAAO,GAAG,CAAC,UAAU,YAAY;GAChC;AAEF,wBAAG,6CAA6C;EAE/C,MAAM,KADSA,0BAAS,UAAU,CAChB,MAAM;AAExB,mCAAO,GAAG,WAAW,sBAAsB,CAAC,CAAC,KAAK,KAAK;GACtD;AAEF,wBAAG,gDAAgD;EAElD,MAAM,MADSA,0BAAS,UAAU,CACf,MAAM;AAEzB,mCAAO,IAAI,CAAC,UAAU,cAAc;GACnC;AAEF,wBAAG,kDAAkD;EAEpD,MAAM,MADSA,0BAAS,UAAU,CACf,MAAM;AAEzB,mCAAO,IAAI,CAAC,UAAU,QAAQ;AAC9B,mCAAO,IAAI,CAAC,UAAU,aAAa;GAClC;AAEF,wBAAG,+DAA+D;EAEjE,MAAM,MADSA,0BAAS,UAAU,CACf,MAAM;AAEzB,mCAAO,IAAI,CAAC,UAAU,iBAAiB;AACvC,mCAAO,IAAI,CAAC,UAAU,gBAAgB;GACrC;AAEF,wBAAG,mFAAmF;EAKrF,MAAM,KAJSA,0BAAS;GACvB,GAAG;GACH,UAAU,CAAC,SAAS;GACpB,CAAC,CACgB,MAAM;AAExB,mCAAO,GAAG,CAAC,UAAU,SAAS;AAE9B,mCAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,mCAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,wBAAG,qFAAqF;EAEvF,MAAM,KADSA,0BAAS,UAAU,CAChB,MAAM;AAGxB,mCAAO,GAAG,CAAC,UAAU,mBAAmB;GACvC;AAEF,wBAAG,0DAA0D;EAE5D,MAAM,KADSA,0BAAS,UAAU,CAChB,MAAM;AAExB,mCAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,mCAAO,GAAG,CAAC,UAAU,oBAAoB;AACzC,mCAAO,GAAG,CAAC,UAAU,kBAAkB;AACvC,mCAAO,GAAG,CAAC,UAAU,aAAa;AAClC,mCAAO,GAAG,CAAC,UAAU,aAAa;GACjC;EACD"}
1
+ {"version":3,"file":"health-check.test.cjs","names":["describe","generate"],"sources":["../../src/generators/health-check.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateHealthCheck (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"health-test\",\n\t\tservices: [\"redis\", \"postgresql\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates health-check.sh and health-check.ps1\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.sh\");\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.ps1\");\n\t});\n\n\tit(\"health-check.sh contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.sh contains service-specific checks for each resolved service\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.sh includes port checks for exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis exposes port 6379, PostgreSQL exposes 5432\n\t\texpect(sh).toContain(\"6379\");\n\t\texpect(sh).toContain(\"5432\");\n\t});\n\n\tit(\"health-check.sh has usage/help docs\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"--quick\");\n\t\texpect(sh).toContain(\"--json\");\n\t\texpect(sh).toContain(\"--verbose\");\n\t});\n\n\tit(\"health-check.sh starts with shebang\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh.startsWith(\"#!/usr/bin/env bash\")).toBe(true);\n\t});\n\n\tit(\"health-check.ps1 contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.ps1 contains service checks\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"redis\");\n\t\texpect(ps1).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.ps1 includes PowerShell-style parameters\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"[switch]$Quick\");\n\t\texpect(ps1).toContain(\"[switch]$Json\");\n\t});\n\n\tit(\"health check scripts include all resolved services including dependencies\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"postiz\"], // postiz depends on redis and postgresql\n\t\t});\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"postiz\");\n\t\t// Dependencies should be auto-resolved and included\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health check script includes health check commands when service defines one\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis has a healthcheck command (redis-cli ping)\n\t\texpect(sh).toContain(\"check_health_cmd\");\n\t});\n\n\tit(\"health check scripts contain the phase structure\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"Phase 1\");\n\t\texpect(sh).toContain(\"phase_environment\");\n\t\texpect(sh).toContain(\"check_container\");\n\t\texpect(sh).toContain(\"check_port\");\n\t\texpect(sh).toContain(\"phase_logs\");\n\t});\n});\n"],"mappings":";;;AAGAA,oBAAAA,SAAS,4CAA4C;CACpD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,aAAa;EACjC,YAAY,EAAE;EACd,OAAO;EACP,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,qBAAA,GAAG,wDAAwD;EAC1D,MAAM,SAASC,iBAAAA,SAAS,UAAU;AAElC,sBAAA,aAAO,OAAO,MAAM,CAAC,eAAe,0BAA0B;AAC9D,sBAAA,aAAO,OAAO,MAAM,CAAC,eAAe,2BAA2B;GAC9D;AAEF,qBAAA,GAAG,+CAA+C;EAEjD,MAAM,KADSA,iBAAAA,SAAS,UAAU,CAChB,MAAM;AAExB,sBAAA,aAAO,GAAG,CAAC,UAAU,cAAc;GAClC;AAEF,qBAAA,GAAG,oFAAoF;EAEtF,MAAM,KADSA,iBAAAA,SAAS,UAAU,CAChB,MAAM;AAExB,sBAAA,aAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,sBAAA,aAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,qBAAA,GAAG,gEAAgE;EAElE,MAAM,KADSA,iBAAAA,SAAS,UAAU,CAChB,MAAM;AAGxB,sBAAA,aAAO,GAAG,CAAC,UAAU,OAAO;AAC5B,sBAAA,aAAO,GAAG,CAAC,UAAU,OAAO;GAC3B;AAEF,qBAAA,GAAG,6CAA6C;EAE/C,MAAM,KADSA,iBAAAA,SAAS,UAAU,CAChB,MAAM;AAExB,sBAAA,aAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,sBAAA,aAAO,GAAG,CAAC,UAAU,SAAS;AAC9B,sBAAA,aAAO,GAAG,CAAC,UAAU,YAAY;GAChC;AAEF,qBAAA,GAAG,6CAA6C;EAE/C,MAAM,KADSA,iBAAAA,SAAS,UAAU,CAChB,MAAM;AAExB,sBAAA,aAAO,GAAG,WAAW,sBAAsB,CAAC,CAAC,KAAK,KAAK;GACtD;AAEF,qBAAA,GAAG,gDAAgD;EAElD,MAAM,MADSA,iBAAAA,SAAS,UAAU,CACf,MAAM;AAEzB,sBAAA,aAAO,IAAI,CAAC,UAAU,cAAc;GACnC;AAEF,qBAAA,GAAG,kDAAkD;EAEpD,MAAM,MADSA,iBAAAA,SAAS,UAAU,CACf,MAAM;AAEzB,sBAAA,aAAO,IAAI,CAAC,UAAU,QAAQ;AAC9B,sBAAA,aAAO,IAAI,CAAC,UAAU,aAAa;GAClC;AAEF,qBAAA,GAAG,+DAA+D;EAEjE,MAAM,MADSA,iBAAAA,SAAS,UAAU,CACf,MAAM;AAEzB,sBAAA,aAAO,IAAI,CAAC,UAAU,iBAAiB;AACvC,sBAAA,aAAO,IAAI,CAAC,UAAU,gBAAgB;GACrC;AAEF,qBAAA,GAAG,mFAAmF;EAKrF,MAAM,KAJSA,iBAAAA,SAAS;GACvB,GAAG;GACH,UAAU,CAAC,SAAS;GACpB,CAAC,CACgB,MAAM;AAExB,sBAAA,aAAO,GAAG,CAAC,UAAU,SAAS;AAE9B,sBAAA,aAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,sBAAA,aAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,qBAAA,GAAG,qFAAqF;EAEvF,MAAM,KADSA,iBAAAA,SAAS,UAAU,CAChB,MAAM;AAGxB,sBAAA,aAAO,GAAG,CAAC,UAAU,mBAAmB;GACvC;AAEF,qBAAA,GAAG,0DAA0D;EAE5D,MAAM,KADSA,iBAAAA,SAAS,UAAU,CAChB,MAAM;AAExB,sBAAA,aAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,sBAAA,aAAO,GAAG,CAAC,UAAU,oBAAoB;AACzC,sBAAA,aAAO,GAAG,CAAC,UAAU,kBAAkB;AACvC,sBAAA,aAAO,GAAG,CAAC,UAAU,aAAa;AAClC,sBAAA,aAAO,GAAG,CAAC,UAAU,aAAa;GACjC;EACD"}
@@ -1,6 +1,5 @@
1
- import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-CFyDIn0m.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-DvC3SVNc.mjs";
2
2
  import { generate } from "../generate.mjs";
3
-
4
3
  //#region src/generators/health-check.test.ts
5
4
  describe("generateHealthCheck (via generate)", () => {
6
5
  const baseInput = {
@@ -79,7 +78,7 @@ describe("generateHealthCheck (via generate)", () => {
79
78
  globalExpect(sh).toContain("phase_logs");
80
79
  });
81
80
  });
82
-
83
81
  //#endregion
84
- export { };
82
+ export {};
83
+
85
84
  //# sourceMappingURL=health-check.test.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"health-check.test.mjs","names":[],"sources":["../../src/generators/health-check.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateHealthCheck (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"health-test\",\n\t\tservices: [\"redis\", \"postgresql\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates health-check.sh and health-check.ps1\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.sh\");\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.ps1\");\n\t});\n\n\tit(\"health-check.sh contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.sh contains service-specific checks for each resolved service\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.sh includes port checks for exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis exposes port 6379, PostgreSQL exposes 5432\n\t\texpect(sh).toContain(\"6379\");\n\t\texpect(sh).toContain(\"5432\");\n\t});\n\n\tit(\"health-check.sh has usage/help docs\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"--quick\");\n\t\texpect(sh).toContain(\"--json\");\n\t\texpect(sh).toContain(\"--verbose\");\n\t});\n\n\tit(\"health-check.sh starts with shebang\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh.startsWith(\"#!/usr/bin/env bash\")).toBe(true);\n\t});\n\n\tit(\"health-check.ps1 contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.ps1 contains service checks\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"redis\");\n\t\texpect(ps1).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.ps1 includes PowerShell-style parameters\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"[switch]$Quick\");\n\t\texpect(ps1).toContain(\"[switch]$Json\");\n\t});\n\n\tit(\"health check scripts include all resolved services including dependencies\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"postiz\"], // postiz depends on redis and postgresql\n\t\t});\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"postiz\");\n\t\t// Dependencies should be auto-resolved and included\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health check script includes health check commands when service defines one\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis has a healthcheck command (redis-cli ping)\n\t\texpect(sh).toContain(\"check_health_cmd\");\n\t});\n\n\tit(\"health check scripts contain the phase structure\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"Phase 1\");\n\t\texpect(sh).toContain(\"phase_environment\");\n\t\texpect(sh).toContain(\"check_container\");\n\t\texpect(sh).toContain(\"check_port\");\n\t\texpect(sh).toContain(\"phase_logs\");\n\t});\n});\n"],"mappings":";;;;AAGA,SAAS,4CAA4C;CACpD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,aAAa;EACjC,YAAY,EAAE;EACd,OAAO;EACP,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,IAAG,wDAAwD;EAC1D,MAAM,SAAS,SAAS,UAAU;AAElC,eAAO,OAAO,MAAM,CAAC,eAAe,0BAA0B;AAC9D,eAAO,OAAO,MAAM,CAAC,eAAe,2BAA2B;GAC9D;AAEF,IAAG,+CAA+C;EAEjD,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,cAAc;GAClC;AAEF,IAAG,oFAAoF;EAEtF,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,eAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,IAAG,gEAAgE;EAElE,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAGxB,eAAO,GAAG,CAAC,UAAU,OAAO;AAC5B,eAAO,GAAG,CAAC,UAAU,OAAO;GAC3B;AAEF,IAAG,6CAA6C;EAE/C,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,eAAO,GAAG,CAAC,UAAU,SAAS;AAC9B,eAAO,GAAG,CAAC,UAAU,YAAY;GAChC;AAEF,IAAG,6CAA6C;EAE/C,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,WAAW,sBAAsB,CAAC,CAAC,KAAK,KAAK;GACtD;AAEF,IAAG,gDAAgD;EAElD,MAAM,MADS,SAAS,UAAU,CACf,MAAM;AAEzB,eAAO,IAAI,CAAC,UAAU,cAAc;GACnC;AAEF,IAAG,kDAAkD;EAEpD,MAAM,MADS,SAAS,UAAU,CACf,MAAM;AAEzB,eAAO,IAAI,CAAC,UAAU,QAAQ;AAC9B,eAAO,IAAI,CAAC,UAAU,aAAa;GAClC;AAEF,IAAG,+DAA+D;EAEjE,MAAM,MADS,SAAS,UAAU,CACf,MAAM;AAEzB,eAAO,IAAI,CAAC,UAAU,iBAAiB;AACvC,eAAO,IAAI,CAAC,UAAU,gBAAgB;GACrC;AAEF,IAAG,mFAAmF;EAKrF,MAAM,KAJS,SAAS;GACvB,GAAG;GACH,UAAU,CAAC,SAAS;GACpB,CAAC,CACgB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,SAAS;AAE9B,eAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,eAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,IAAG,qFAAqF;EAEvF,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAGxB,eAAO,GAAG,CAAC,UAAU,mBAAmB;GACvC;AAEF,IAAG,0DAA0D;EAE5D,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,eAAO,GAAG,CAAC,UAAU,oBAAoB;AACzC,eAAO,GAAG,CAAC,UAAU,kBAAkB;AACvC,eAAO,GAAG,CAAC,UAAU,aAAa;AAClC,eAAO,GAAG,CAAC,UAAU,aAAa;GACjC;EACD"}
1
+ {"version":3,"file":"health-check.test.mjs","names":[],"sources":["../../src/generators/health-check.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateHealthCheck (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"health-test\",\n\t\tservices: [\"redis\", \"postgresql\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates health-check.sh and health-check.ps1\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.sh\");\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.ps1\");\n\t});\n\n\tit(\"health-check.sh contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.sh contains service-specific checks for each resolved service\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.sh includes port checks for exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis exposes port 6379, PostgreSQL exposes 5432\n\t\texpect(sh).toContain(\"6379\");\n\t\texpect(sh).toContain(\"5432\");\n\t});\n\n\tit(\"health-check.sh has usage/help docs\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"--quick\");\n\t\texpect(sh).toContain(\"--json\");\n\t\texpect(sh).toContain(\"--verbose\");\n\t});\n\n\tit(\"health-check.sh starts with shebang\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh.startsWith(\"#!/usr/bin/env bash\")).toBe(true);\n\t});\n\n\tit(\"health-check.ps1 contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.ps1 contains service checks\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"redis\");\n\t\texpect(ps1).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.ps1 includes PowerShell-style parameters\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"[switch]$Quick\");\n\t\texpect(ps1).toContain(\"[switch]$Json\");\n\t});\n\n\tit(\"health check scripts include all resolved services including dependencies\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"postiz\"], // postiz depends on redis and postgresql\n\t\t});\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"postiz\");\n\t\t// Dependencies should be auto-resolved and included\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health check script includes health check commands when service defines one\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis has a healthcheck command (redis-cli ping)\n\t\texpect(sh).toContain(\"check_health_cmd\");\n\t});\n\n\tit(\"health check scripts contain the phase structure\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"Phase 1\");\n\t\texpect(sh).toContain(\"phase_environment\");\n\t\texpect(sh).toContain(\"check_container\");\n\t\texpect(sh).toContain(\"check_port\");\n\t\texpect(sh).toContain(\"phase_logs\");\n\t});\n});\n"],"mappings":";;;AAGA,SAAS,4CAA4C;CACpD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,SAAS,aAAa;EACjC,YAAY,EAAE;EACd,OAAO;EACP,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,IAAG,wDAAwD;EAC1D,MAAM,SAAS,SAAS,UAAU;AAElC,eAAO,OAAO,MAAM,CAAC,eAAe,0BAA0B;AAC9D,eAAO,OAAO,MAAM,CAAC,eAAe,2BAA2B;GAC9D;AAEF,IAAG,+CAA+C;EAEjD,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,cAAc;GAClC;AAEF,IAAG,oFAAoF;EAEtF,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,eAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,IAAG,gEAAgE;EAElE,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAGxB,eAAO,GAAG,CAAC,UAAU,OAAO;AAC5B,eAAO,GAAG,CAAC,UAAU,OAAO;GAC3B;AAEF,IAAG,6CAA6C;EAE/C,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,eAAO,GAAG,CAAC,UAAU,SAAS;AAC9B,eAAO,GAAG,CAAC,UAAU,YAAY;GAChC;AAEF,IAAG,6CAA6C;EAE/C,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,WAAW,sBAAsB,CAAC,CAAC,KAAK,KAAK;GACtD;AAEF,IAAG,gDAAgD;EAElD,MAAM,MADS,SAAS,UAAU,CACf,MAAM;AAEzB,eAAO,IAAI,CAAC,UAAU,cAAc;GACnC;AAEF,IAAG,kDAAkD;EAEpD,MAAM,MADS,SAAS,UAAU,CACf,MAAM;AAEzB,eAAO,IAAI,CAAC,UAAU,QAAQ;AAC9B,eAAO,IAAI,CAAC,UAAU,aAAa;GAClC;AAEF,IAAG,+DAA+D;EAEjE,MAAM,MADS,SAAS,UAAU,CACf,MAAM;AAEzB,eAAO,IAAI,CAAC,UAAU,iBAAiB;AACvC,eAAO,IAAI,CAAC,UAAU,gBAAgB;GACrC;AAEF,IAAG,mFAAmF;EAKrF,MAAM,KAJS,SAAS;GACvB,GAAG;GACH,UAAU,CAAC,SAAS;GACpB,CAAC,CACgB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,SAAS;AAE9B,eAAO,GAAG,CAAC,UAAU,QAAQ;AAC7B,eAAO,GAAG,CAAC,UAAU,aAAa;GACjC;AAEF,IAAG,qFAAqF;EAEvF,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAGxB,eAAO,GAAG,CAAC,UAAU,mBAAmB;GACvC;AAEF,IAAG,0DAA0D;EAE5D,MAAM,KADS,SAAS,UAAU,CAChB,MAAM;AAExB,eAAO,GAAG,CAAC,UAAU,UAAU;AAC/B,eAAO,GAAG,CAAC,UAAU,oBAAoB;AACzC,eAAO,GAAG,CAAC,UAAU,kBAAkB;AACvC,eAAO,GAAG,CAAC,UAAU,aAAa;AAClC,eAAO,GAAG,CAAC,UAAU,aAAa;GACjC;EACD"}
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/generators/n8n-workflows.ts
4
3
  /**
5
4
  * Generates n8n workflow template files.
@@ -71,7 +70,7 @@ return [{ json: { received: true, timestamp: new Date().toISOString(), payload }
71
70
  tags: [{ name: "openclaw" }]
72
71
  };
73
72
  }
74
-
75
73
  //#endregion
76
74
  exports.generateN8nWorkflows = generateN8nWorkflows;
75
+
77
76
  //# sourceMappingURL=n8n-workflows.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"n8n-workflows.cjs","names":[],"sources":["../../src/generators/n8n-workflows.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Generates n8n workflow template files.\n * Returns a map of file paths to JSON content strings.\n */\nexport function generateN8nWorkflows(resolved: ResolverOutput): Record<string, string> {\n\tconst files: Record<string, string> = {};\n\n\t// Only generate if n8n is in the stack\n\tconst hasN8n = resolved.services.some((s) => s.definition.id === \"n8n\");\n\tif (!hasN8n) return files;\n\n\tfiles[\"n8n/workflows/openclaw-webhook-handler.json\"] = JSON.stringify(\n\t\tcreateWebhookHandlerWorkflow(resolved),\n\t\tnull,\n\t\t2,\n\t);\n\n\treturn files;\n}\n\nfunction createWebhookHandlerWorkflow(resolved: ResolverOutput) {\n\t// Create a basic n8n workflow JSON that:\n\t// 1. Has a Webhook trigger node listening on /openclaw-webhook\n\t// 2. Has a Function node that processes the payload\n\t// 3. Outputs to a Respond to Webhook node\n\tconst serviceNames = resolved.services.map((s) => s.definition.name).join(\", \");\n\n\treturn {\n\t\tname: \"OpenClaw Webhook Handler\",\n\t\tnodes: [\n\t\t\t{\n\t\t\t\tparameters: {\n\t\t\t\t\thttpMethod: \"POST\",\n\t\t\t\t\tpath: \"openclaw-webhook\",\n\t\t\t\t\tresponseMode: \"responseNode\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\tid: \"webhook-trigger\",\n\t\t\t\tname: \"Webhook\",\n\t\t\t\ttype: \"n8n-nodes-base.webhook\",\n\t\t\t\ttypeVersion: 2,\n\t\t\t\tposition: [250, 300],\n\t\t\t},\n\t\t\t{\n\t\t\t\tparameters: {\n\t\t\t\t\tjsCode:\n\t\t\t\t\t\t\"// Process OpenClaw webhook payload\\n\" +\n\t\t\t\t\t\t\"const payload = $input.all()[0].json;\\n\" +\n\t\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\t\"// Available services in this stack:\\n\" +\n\t\t\t\t\t\t`// ${serviceNames}\\n` +\n\t\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\t\"return [{ json: { received: true, timestamp: new Date().toISOString(), payload } }];\",\n\t\t\t\t},\n\t\t\t\tid: \"process-payload\",\n\t\t\t\tname: \"Process Payload\",\n\t\t\t\ttype: \"n8n-nodes-base.code\",\n\t\t\t\ttypeVersion: 2,\n\t\t\t\tposition: [470, 300],\n\t\t\t},\n\t\t\t{\n\t\t\t\tparameters: {\n\t\t\t\t\trespondWith: \"json\",\n\t\t\t\t\tresponseBody: \"={{ JSON.stringify($json) }}\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\tid: \"respond\",\n\t\t\t\tname: \"Respond to Webhook\",\n\t\t\t\ttype: \"n8n-nodes-base.respondToWebhook\",\n\t\t\t\ttypeVersion: 1,\n\t\t\t\tposition: [690, 300],\n\t\t\t},\n\t\t],\n\t\tconnections: {\n\t\t\tWebhook: {\n\t\t\t\tmain: [[{ node: \"Process Payload\", type: \"main\", index: 0 }]],\n\t\t\t},\n\t\t\t\"Process Payload\": {\n\t\t\t\tmain: [[{ node: \"Respond to Webhook\", type: \"main\", index: 0 }]],\n\t\t\t},\n\t\t},\n\t\tactive: false,\n\t\tsettings: { executionOrder: \"v1\" },\n\t\ttags: [{ name: \"openclaw\" }],\n\t};\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,qBAAqB,UAAkD;CACtF,MAAM,QAAgC,EAAE;AAIxC,KAAI,CADW,SAAS,SAAS,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAC1D,QAAO;AAEpB,OAAM,iDAAiD,KAAK,UAC3D,6BAA6B,SAAS,EACtC,MACA,EACA;AAED,QAAO;;AAGR,SAAS,6BAA6B,UAA0B;AAO/D,QAAO;EACN,MAAM;EACN,OAAO;GACN;IACC,YAAY;KACX,YAAY;KACZ,MAAM;KACN,cAAc;KACd,SAAS,EAAE;KACX;IACD,IAAI;IACJ,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU,CAAC,KAAK,IAAI;IACpB;GACD;IACC,YAAY,EACX,QACC;;;;KArBgB,SAAS,SAAS,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC,KAAK,KAAK,CAyBvD;uFAGpB;IACD,IAAI;IACJ,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU,CAAC,KAAK,IAAI;IACpB;GACD;IACC,YAAY;KACX,aAAa;KACb,cAAc;KACd,SAAS,EAAE;KACX;IACD,IAAI;IACJ,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU,CAAC,KAAK,IAAI;IACpB;GACD;EACD,aAAa;GACZ,SAAS,EACR,MAAM,CAAC,CAAC;IAAE,MAAM;IAAmB,MAAM;IAAQ,OAAO;IAAG,CAAC,CAAC,EAC7D;GACD,mBAAmB,EAClB,MAAM,CAAC,CAAC;IAAE,MAAM;IAAsB,MAAM;IAAQ,OAAO;IAAG,CAAC,CAAC,EAChE;GACD;EACD,QAAQ;EACR,UAAU,EAAE,gBAAgB,MAAM;EAClC,MAAM,CAAC,EAAE,MAAM,YAAY,CAAC;EAC5B"}
1
+ {"version":3,"file":"n8n-workflows.cjs","names":[],"sources":["../../src/generators/n8n-workflows.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Generates n8n workflow template files.\n * Returns a map of file paths to JSON content strings.\n */\nexport function generateN8nWorkflows(resolved: ResolverOutput): Record<string, string> {\n\tconst files: Record<string, string> = {};\n\n\t// Only generate if n8n is in the stack\n\tconst hasN8n = resolved.services.some((s) => s.definition.id === \"n8n\");\n\tif (!hasN8n) return files;\n\n\tfiles[\"n8n/workflows/openclaw-webhook-handler.json\"] = JSON.stringify(\n\t\tcreateWebhookHandlerWorkflow(resolved),\n\t\tnull,\n\t\t2,\n\t);\n\n\treturn files;\n}\n\nfunction createWebhookHandlerWorkflow(resolved: ResolverOutput) {\n\t// Create a basic n8n workflow JSON that:\n\t// 1. Has a Webhook trigger node listening on /openclaw-webhook\n\t// 2. Has a Function node that processes the payload\n\t// 3. Outputs to a Respond to Webhook node\n\tconst serviceNames = resolved.services.map((s) => s.definition.name).join(\", \");\n\n\treturn {\n\t\tname: \"OpenClaw Webhook Handler\",\n\t\tnodes: [\n\t\t\t{\n\t\t\t\tparameters: {\n\t\t\t\t\thttpMethod: \"POST\",\n\t\t\t\t\tpath: \"openclaw-webhook\",\n\t\t\t\t\tresponseMode: \"responseNode\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\tid: \"webhook-trigger\",\n\t\t\t\tname: \"Webhook\",\n\t\t\t\ttype: \"n8n-nodes-base.webhook\",\n\t\t\t\ttypeVersion: 2,\n\t\t\t\tposition: [250, 300],\n\t\t\t},\n\t\t\t{\n\t\t\t\tparameters: {\n\t\t\t\t\tjsCode:\n\t\t\t\t\t\t\"// Process OpenClaw webhook payload\\n\" +\n\t\t\t\t\t\t\"const payload = $input.all()[0].json;\\n\" +\n\t\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\t\"// Available services in this stack:\\n\" +\n\t\t\t\t\t\t`// ${serviceNames}\\n` +\n\t\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\t\"return [{ json: { received: true, timestamp: new Date().toISOString(), payload } }];\",\n\t\t\t\t},\n\t\t\t\tid: \"process-payload\",\n\t\t\t\tname: \"Process Payload\",\n\t\t\t\ttype: \"n8n-nodes-base.code\",\n\t\t\t\ttypeVersion: 2,\n\t\t\t\tposition: [470, 300],\n\t\t\t},\n\t\t\t{\n\t\t\t\tparameters: {\n\t\t\t\t\trespondWith: \"json\",\n\t\t\t\t\tresponseBody: \"={{ JSON.stringify($json) }}\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\tid: \"respond\",\n\t\t\t\tname: \"Respond to Webhook\",\n\t\t\t\ttype: \"n8n-nodes-base.respondToWebhook\",\n\t\t\t\ttypeVersion: 1,\n\t\t\t\tposition: [690, 300],\n\t\t\t},\n\t\t],\n\t\tconnections: {\n\t\t\tWebhook: {\n\t\t\t\tmain: [[{ node: \"Process Payload\", type: \"main\", index: 0 }]],\n\t\t\t},\n\t\t\t\"Process Payload\": {\n\t\t\t\tmain: [[{ node: \"Respond to Webhook\", type: \"main\", index: 0 }]],\n\t\t\t},\n\t\t},\n\t\tactive: false,\n\t\tsettings: { executionOrder: \"v1\" },\n\t\ttags: [{ name: \"openclaw\" }],\n\t};\n}\n"],"mappings":";;;;;;AAMA,SAAgB,qBAAqB,UAAkD;CACtF,MAAM,QAAgC,EAAE;AAIxC,KAAI,CADW,SAAS,SAAS,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,CAC1D,QAAO;AAEpB,OAAM,iDAAiD,KAAK,UAC3D,6BAA6B,SAAS,EACtC,MACA,EACA;AAED,QAAO;;AAGR,SAAS,6BAA6B,UAA0B;AAO/D,QAAO;EACN,MAAM;EACN,OAAO;GACN;IACC,YAAY;KACX,YAAY;KACZ,MAAM;KACN,cAAc;KACd,SAAS,EAAE;KACX;IACD,IAAI;IACJ,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU,CAAC,KAAK,IAAI;IACpB;GACD;IACC,YAAY,EACX,QACC;;;;KArBgB,SAAS,SAAS,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC,KAAK,KAAK,CAyBvD;uFAGpB;IACD,IAAI;IACJ,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU,CAAC,KAAK,IAAI;IACpB;GACD;IACC,YAAY;KACX,aAAa;KACb,cAAc;KACd,SAAS,EAAE;KACX;IACD,IAAI;IACJ,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU,CAAC,KAAK,IAAI;IACpB;GACD;EACD,aAAa;GACZ,SAAS,EACR,MAAM,CAAC,CAAC;IAAE,MAAM;IAAmB,MAAM;IAAQ,OAAO;IAAG,CAAC,CAAC,EAC7D;GACD,mBAAmB,EAClB,MAAM,CAAC,CAAC;IAAE,MAAM;IAAsB,MAAM;IAAQ,OAAO;IAAG,CAAC,CAAC,EAChE;GACD;EACD,QAAQ;EACR,UAAU,EAAE,gBAAgB,MAAM;EAClC,MAAM,CAAC,EAAE,MAAM,YAAY,CAAC;EAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"n8n-workflows.d.mts","names":[],"sources":["../../src/generators/n8n-workflows.ts"],"mappings":";;;;;AAMA;;iBAAgB,oBAAA,CAAqB,QAAA,EAAU,cAAA,GAAiB,MAAA"}
1
+ {"version":3,"file":"n8n-workflows.d.mts","names":[],"sources":["../../src/generators/n8n-workflows.ts"],"mappings":";;;;;;AAMA;iBAAgB,oBAAA,CAAqB,QAAA,EAAU,cAAA,GAAiB,MAAA"}
@@ -69,7 +69,7 @@ return [{ json: { received: true, timestamp: new Date().toISOString(), payload }
69
69
  tags: [{ name: "openclaw" }]
70
70
  };
71
71
  }
72
-
73
72
  //#endregion
74
73
  export { generateN8nWorkflows };
74
+
75
75
  //# sourceMappingURL=n8n-workflows.mjs.map
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/generators/native-services.ts
4
3
  /**
5
4
  * Generates native install/run scripts for services that have a native recipe.
@@ -74,7 +73,7 @@ function buildWindowsNativeScript(nativeServices) {
74
73
  lines.push("Write-Host 'Native services started.'");
75
74
  return lines.join("\n");
76
75
  }
77
-
78
76
  //#endregion
79
77
  exports.generateNativeInstallScripts = generateNativeInstallScripts;
78
+
80
79
  //# sourceMappingURL=native-services.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"native-services.cjs","names":[],"sources":["../../src/generators/native-services.ts"],"sourcesContent":["import type { NativePlatform, ResolvedService } from \"../types.js\";\n\nexport interface NativeServicesGeneratorOptions {\n\tnativeServices: ResolvedService[];\n\tplatform: NativePlatform;\n\tprojectName: string;\n}\n\n/**\n * Generates native install/run scripts for services that have a native recipe.\n * Returns e.g. native/install-linux.sh (or native/install.ps1 for Windows).\n * Scripts source .env and run install steps then start commands in dependency order.\n */\nexport function generateNativeInstallScripts(\n\toptions: NativeServicesGeneratorOptions,\n): Record<string, string> {\n\tconst { nativeServices, platform } = options;\n\tconst files: Record<string, string> = {};\n\n\tif (platform === \"linux\") {\n\t\tfiles[\"native/install-linux.sh\"] = buildLinuxNativeScript(nativeServices);\n\t} else if (platform === \"windows\") {\n\t\tfiles[\"native/install-windows.ps1\"] = buildWindowsNativeScript(nativeServices);\n\t} else {\n\t\t// macos: use bash script similar to linux\n\t\tfiles[\"native/install-macos.sh\"] = buildLinuxNativeScript(nativeServices);\n\t}\n\n\treturn files;\n}\n\nfunction buildLinuxNativeScript(nativeServices: ResolvedService[]): string {\n\tconst lines: string[] = [\n\t\t\"#!/usr/bin/env bash\",\n\t\t\"set -euo pipefail\",\n\t\t\"# OpenClaw native services — install and start (Linux). Run from project root. Source .env first.\",\n\t\t\"\",\n\t\t'SCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"',\n\t\t'PROJECT_DIR=\"$(dirname \"$SCRIPT_DIR\")\"',\n\t\t'cd \"$PROJECT_DIR\"',\n\t\t\"\",\n\t\t\"if [ -f .env ]; then set -a; source .env; set +a; fi\",\n\t\t\"\",\n\t];\n\n\tfor (const { definition: def } of nativeServices) {\n\t\tconst recipe = def.nativeRecipes?.find((r) => r.platform === \"linux\");\n\t\tif (!recipe) continue;\n\n\t\tlines.push(`# ─── ${def.icon} ${def.name} ─────────────────────────────────────────`);\n\t\tlines.push(\"\");\n\n\t\tif (recipe.configPath && recipe.configTemplate) {\n\t\t\tconst delim = `ENDOF_${def.id.toUpperCase().replace(/-/g, \"_\")}_CONF`;\n\t\t\tlines.push(`# Write config for ${def.id}`);\n\t\t\tlines.push(`sudo mkdir -p \"$(dirname \"${recipe.configPath}\")\" 2>/dev/null || true`);\n\t\t\tlines.push(`sudo tee \"${recipe.configPath}\" > /dev/null << ${delim}`);\n\t\t\tlines.push(recipe.configTemplate.trim());\n\t\t\tlines.push(delim);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tfor (const step of recipe.installSteps) {\n\t\t\tlines.push(`# Install: ${def.id}`);\n\t\t\tlines.push(step);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tlines.push(`# Start: ${def.id}`);\n\t\tlines.push(recipe.startCommand);\n\t\tlines.push(\"\");\n\t}\n\n\tlines.push(\"echo 'Native services started.'\");\n\treturn lines.join(\"\\n\");\n}\n\nfunction buildWindowsNativeScript(nativeServices: ResolvedService[]): string {\n\tconst lines: string[] = [\n\t\t\"# OpenClaw native services — install and start (Windows). Run from project root.\",\n\t\t\"$ErrorActionPreference = 'Stop'\",\n\t\t\"$ProjectDir = (Get-Item $PSScriptRoot).Parent.FullName\",\n\t\t\"Set-Location $ProjectDir\",\n\t\t\"\",\n\t\t\"if (Test-Path .env) { Get-Content .env | ForEach-Object { if ($_ -match '^([^#=]+)=(.*)$') { [System.Environment]::SetEnvironmentVariable($matches[1].Trim(), $matches[2].Trim(), 'Process') } } }\",\n\t\t\"\",\n\t];\n\n\tfor (const { definition: def } of nativeServices) {\n\t\tconst recipe = def.nativeRecipes?.find((r) => r.platform === \"windows\");\n\t\tif (!recipe) continue;\n\n\t\tlines.push(`# ${def.name}`);\n\t\tfor (const step of recipe.installSteps) {\n\t\t\tlines.push(`Invoke-Expression \"${step.replace(/\"/g, '`\"')}\"`);\n\t\t}\n\t\tlines.push(recipe.startCommand);\n\t\tlines.push(\"\");\n\t}\n\n\tlines.push(\"Write-Host 'Native services started.'\");\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;AAaA,SAAgB,6BACf,SACyB;CACzB,MAAM,EAAE,gBAAgB,aAAa;CACrC,MAAM,QAAgC,EAAE;AAExC,KAAI,aAAa,QAChB,OAAM,6BAA6B,uBAAuB,eAAe;UAC/D,aAAa,UACvB,OAAM,gCAAgC,yBAAyB,eAAe;KAG9E,OAAM,6BAA6B,uBAAuB,eAAe;AAG1E,QAAO;;AAGR,SAAS,uBAAuB,gBAA2C;CAC1E,MAAM,QAAkB;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAED,MAAK,MAAM,EAAE,YAAY,SAAS,gBAAgB;EACjD,MAAM,SAAS,IAAI,eAAe,MAAM,MAAM,EAAE,aAAa,QAAQ;AACrE,MAAI,CAAC,OAAQ;AAEb,QAAM,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,KAAK,4CAA4C;AACrF,QAAM,KAAK,GAAG;AAEd,MAAI,OAAO,cAAc,OAAO,gBAAgB;GAC/C,MAAM,QAAQ,SAAS,IAAI,GAAG,aAAa,CAAC,QAAQ,MAAM,IAAI,CAAC;AAC/D,SAAM,KAAK,sBAAsB,IAAI,KAAK;AAC1C,SAAM,KAAK,6BAA6B,OAAO,WAAW,yBAAyB;AACnF,SAAM,KAAK,aAAa,OAAO,WAAW,mBAAmB,QAAQ;AACrE,SAAM,KAAK,OAAO,eAAe,MAAM,CAAC;AACxC,SAAM,KAAK,MAAM;AACjB,SAAM,KAAK,GAAG;;AAGf,OAAK,MAAM,QAAQ,OAAO,cAAc;AACvC,SAAM,KAAK,cAAc,IAAI,KAAK;AAClC,SAAM,KAAK,KAAK;AAChB,SAAM,KAAK,GAAG;;AAGf,QAAM,KAAK,YAAY,IAAI,KAAK;AAChC,QAAM,KAAK,OAAO,aAAa;AAC/B,QAAM,KAAK,GAAG;;AAGf,OAAM,KAAK,kCAAkC;AAC7C,QAAO,MAAM,KAAK,KAAK;;AAGxB,SAAS,yBAAyB,gBAA2C;CAC5E,MAAM,QAAkB;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAED,MAAK,MAAM,EAAE,YAAY,SAAS,gBAAgB;EACjD,MAAM,SAAS,IAAI,eAAe,MAAM,MAAM,EAAE,aAAa,UAAU;AACvE,MAAI,CAAC,OAAQ;AAEb,QAAM,KAAK,KAAK,IAAI,OAAO;AAC3B,OAAK,MAAM,QAAQ,OAAO,aACzB,OAAM,KAAK,sBAAsB,KAAK,QAAQ,MAAM,MAAK,CAAC,GAAG;AAE9D,QAAM,KAAK,OAAO,aAAa;AAC/B,QAAM,KAAK,GAAG;;AAGf,OAAM,KAAK,wCAAwC;AACnD,QAAO,MAAM,KAAK,KAAK"}
1
+ {"version":3,"file":"native-services.cjs","names":[],"sources":["../../src/generators/native-services.ts"],"sourcesContent":["import type { NativePlatform, ResolvedService } from \"../types.js\";\n\nexport interface NativeServicesGeneratorOptions {\n\tnativeServices: ResolvedService[];\n\tplatform: NativePlatform;\n\tprojectName: string;\n}\n\n/**\n * Generates native install/run scripts for services that have a native recipe.\n * Returns e.g. native/install-linux.sh (or native/install.ps1 for Windows).\n * Scripts source .env and run install steps then start commands in dependency order.\n */\nexport function generateNativeInstallScripts(\n\toptions: NativeServicesGeneratorOptions,\n): Record<string, string> {\n\tconst { nativeServices, platform } = options;\n\tconst files: Record<string, string> = {};\n\n\tif (platform === \"linux\") {\n\t\tfiles[\"native/install-linux.sh\"] = buildLinuxNativeScript(nativeServices);\n\t} else if (platform === \"windows\") {\n\t\tfiles[\"native/install-windows.ps1\"] = buildWindowsNativeScript(nativeServices);\n\t} else {\n\t\t// macos: use bash script similar to linux\n\t\tfiles[\"native/install-macos.sh\"] = buildLinuxNativeScript(nativeServices);\n\t}\n\n\treturn files;\n}\n\nfunction buildLinuxNativeScript(nativeServices: ResolvedService[]): string {\n\tconst lines: string[] = [\n\t\t\"#!/usr/bin/env bash\",\n\t\t\"set -euo pipefail\",\n\t\t\"# OpenClaw native services — install and start (Linux). Run from project root. Source .env first.\",\n\t\t\"\",\n\t\t'SCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"',\n\t\t'PROJECT_DIR=\"$(dirname \"$SCRIPT_DIR\")\"',\n\t\t'cd \"$PROJECT_DIR\"',\n\t\t\"\",\n\t\t\"if [ -f .env ]; then set -a; source .env; set +a; fi\",\n\t\t\"\",\n\t];\n\n\tfor (const { definition: def } of nativeServices) {\n\t\tconst recipe = def.nativeRecipes?.find((r) => r.platform === \"linux\");\n\t\tif (!recipe) continue;\n\n\t\tlines.push(`# ─── ${def.icon} ${def.name} ─────────────────────────────────────────`);\n\t\tlines.push(\"\");\n\n\t\tif (recipe.configPath && recipe.configTemplate) {\n\t\t\tconst delim = `ENDOF_${def.id.toUpperCase().replace(/-/g, \"_\")}_CONF`;\n\t\t\tlines.push(`# Write config for ${def.id}`);\n\t\t\tlines.push(`sudo mkdir -p \"$(dirname \"${recipe.configPath}\")\" 2>/dev/null || true`);\n\t\t\tlines.push(`sudo tee \"${recipe.configPath}\" > /dev/null << ${delim}`);\n\t\t\tlines.push(recipe.configTemplate.trim());\n\t\t\tlines.push(delim);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tfor (const step of recipe.installSteps) {\n\t\t\tlines.push(`# Install: ${def.id}`);\n\t\t\tlines.push(step);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tlines.push(`# Start: ${def.id}`);\n\t\tlines.push(recipe.startCommand);\n\t\tlines.push(\"\");\n\t}\n\n\tlines.push(\"echo 'Native services started.'\");\n\treturn lines.join(\"\\n\");\n}\n\nfunction buildWindowsNativeScript(nativeServices: ResolvedService[]): string {\n\tconst lines: string[] = [\n\t\t\"# OpenClaw native services — install and start (Windows). Run from project root.\",\n\t\t\"$ErrorActionPreference = 'Stop'\",\n\t\t\"$ProjectDir = (Get-Item $PSScriptRoot).Parent.FullName\",\n\t\t\"Set-Location $ProjectDir\",\n\t\t\"\",\n\t\t\"if (Test-Path .env) { Get-Content .env | ForEach-Object { if ($_ -match '^([^#=]+)=(.*)$') { [System.Environment]::SetEnvironmentVariable($matches[1].Trim(), $matches[2].Trim(), 'Process') } } }\",\n\t\t\"\",\n\t];\n\n\tfor (const { definition: def } of nativeServices) {\n\t\tconst recipe = def.nativeRecipes?.find((r) => r.platform === \"windows\");\n\t\tif (!recipe) continue;\n\n\t\tlines.push(`# ${def.name}`);\n\t\tfor (const step of recipe.installSteps) {\n\t\t\tlines.push(`Invoke-Expression \"${step.replace(/\"/g, '`\"')}\"`);\n\t\t}\n\t\tlines.push(recipe.startCommand);\n\t\tlines.push(\"\");\n\t}\n\n\tlines.push(\"Write-Host 'Native services started.'\");\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,6BACf,SACyB;CACzB,MAAM,EAAE,gBAAgB,aAAa;CACrC,MAAM,QAAgC,EAAE;AAExC,KAAI,aAAa,QAChB,OAAM,6BAA6B,uBAAuB,eAAe;UAC/D,aAAa,UACvB,OAAM,gCAAgC,yBAAyB,eAAe;KAG9E,OAAM,6BAA6B,uBAAuB,eAAe;AAG1E,QAAO;;AAGR,SAAS,uBAAuB,gBAA2C;CAC1E,MAAM,QAAkB;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAED,MAAK,MAAM,EAAE,YAAY,SAAS,gBAAgB;EACjD,MAAM,SAAS,IAAI,eAAe,MAAM,MAAM,EAAE,aAAa,QAAQ;AACrE,MAAI,CAAC,OAAQ;AAEb,QAAM,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,KAAK,4CAA4C;AACrF,QAAM,KAAK,GAAG;AAEd,MAAI,OAAO,cAAc,OAAO,gBAAgB;GAC/C,MAAM,QAAQ,SAAS,IAAI,GAAG,aAAa,CAAC,QAAQ,MAAM,IAAI,CAAC;AAC/D,SAAM,KAAK,sBAAsB,IAAI,KAAK;AAC1C,SAAM,KAAK,6BAA6B,OAAO,WAAW,yBAAyB;AACnF,SAAM,KAAK,aAAa,OAAO,WAAW,mBAAmB,QAAQ;AACrE,SAAM,KAAK,OAAO,eAAe,MAAM,CAAC;AACxC,SAAM,KAAK,MAAM;AACjB,SAAM,KAAK,GAAG;;AAGf,OAAK,MAAM,QAAQ,OAAO,cAAc;AACvC,SAAM,KAAK,cAAc,IAAI,KAAK;AAClC,SAAM,KAAK,KAAK;AAChB,SAAM,KAAK,GAAG;;AAGf,QAAM,KAAK,YAAY,IAAI,KAAK;AAChC,QAAM,KAAK,OAAO,aAAa;AAC/B,QAAM,KAAK,GAAG;;AAGf,OAAM,KAAK,kCAAkC;AAC7C,QAAO,MAAM,KAAK,KAAK;;AAGxB,SAAS,yBAAyB,gBAA2C;CAC5E,MAAM,QAAkB;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAED,MAAK,MAAM,EAAE,YAAY,SAAS,gBAAgB;EACjD,MAAM,SAAS,IAAI,eAAe,MAAM,MAAM,EAAE,aAAa,UAAU;AACvE,MAAI,CAAC,OAAQ;AAEb,QAAM,KAAK,KAAK,IAAI,OAAO;AAC3B,OAAK,MAAM,QAAQ,OAAO,aACzB,OAAM,KAAK,sBAAsB,KAAK,QAAQ,MAAM,MAAK,CAAC,GAAG;AAE9D,QAAM,KAAK,OAAO,aAAa;AAC/B,QAAM,KAAK,GAAG;;AAGf,OAAM,KAAK,wCAAwC;AACnD,QAAO,MAAM,KAAK,KAAK"}
@@ -72,7 +72,7 @@ function buildWindowsNativeScript(nativeServices) {
72
72
  lines.push("Write-Host 'Native services started.'");
73
73
  return lines.join("\n");
74
74
  }
75
-
76
75
  //#endregion
77
76
  export { generateNativeInstallScripts };
77
+
78
78
  //# sourceMappingURL=native-services.mjs.map
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/generators/openclaw-install-script.ts
4
3
  function generateOpenclawInstallScript(options) {
5
4
  const files = {};
@@ -62,7 +61,7 @@ function generateOpenclawInstallScript(options) {
62
61
  ].join("\n");
63
62
  return files;
64
63
  }
65
-
66
64
  //#endregion
67
65
  exports.generateOpenclawInstallScript = generateOpenclawInstallScript;
66
+
68
67
  //# sourceMappingURL=openclaw-install-script.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw-install-script.cjs","names":[],"sources":["../../src/generators/openclaw-install-script.ts"],"sourcesContent":["/**\n * Generates the `scripts/install-openclaw.sh` and `scripts/install-openclaw.ps1`\n * scripts that install OpenClaw directly on the host via the official installer.\n */\n\nexport interface OpenclawInstallScriptOptions {\n\tprojectName: string;\n}\n\nexport function generateOpenclawInstallScript(\n\toptions: OpenclawInstallScriptOptions,\n): Record<string, string> {\n\tconst files: Record<string, string> = {};\n\n\t// Bash script (macOS / Linux)\n\tfiles[\"scripts/install-openclaw.sh\"] = [\n\t\t\"#!/usr/bin/env bash\",\n\t\t\"set -euo pipefail\",\n\t\t\"\",\n\t\t`# Install OpenClaw directly on this host for project: ${options.projectName}`,\n\t\t\"# This script downloads and runs the official OpenClaw installer.\",\n\t\t\"# It will install Node.js 22+ (if needed) and OpenClaw globally via npm.\",\n\t\t\"\",\n\t\t'echo \"╔══════════════════════════════════════════╗\"',\n\t\t'echo \"║ OpenClaw — Direct Host Installation ║\"',\n\t\t'echo \"╚══════════════════════════════════════════╝\"',\n\t\t'echo \"\"',\n\t\t\"\",\n\t\t\"# Run the official installer\",\n\t\t'curl -fsSL --proto \"=https\" --tlsv1.2 https://openclaw.ai/install.sh | bash',\n\t\t\"\",\n\t\t'echo \"\"',\n\t\t'echo \"OpenClaw installed successfully!\"',\n\t\t'echo \"\"',\n\t\t'echo \"Next steps:\"',\n\t\t'echo \" 1. Start your companion services: docker compose up -d\"',\n\t\t'echo \" 2. Run onboarding: openclaw onboard\"',\n\t\t'echo \" 3. Launch the dashboard: openclaw dashboard\"',\n\t\t'echo \"\"',\n\t\t\"\",\n\t].join(\"\\n\");\n\n\t// PowerShell script (Windows / WSL)\n\tfiles[\"scripts/install-openclaw.ps1\"] = [\n\t\t\"# Install OpenClaw directly on this host (Windows via WSL)\",\n\t\t`# Project: ${options.projectName}`,\n\t\t\"#\",\n\t\t\"# This script sets up WSL if needed, then runs the official Linux installer inside it.\",\n\t\t\"\",\n\t\t'Write-Host \"OpenClaw - Direct Host Installation\" -ForegroundColor Cyan',\n\t\t'Write-Host \"\"',\n\t\t\"\",\n\t\t\"# Check if WSL is available\",\n\t\t\"$wslCheck = Get-Command wsl -ErrorAction SilentlyContinue\",\n\t\t\"if (-not $wslCheck) {\",\n\t\t' Write-Host \"WSL is not installed. Installing WSL...\" -ForegroundColor Yellow',\n\t\t\" wsl --install\",\n\t\t' Write-Host \"Please restart your computer and re-run this script.\" -ForegroundColor Yellow',\n\t\t\" exit 1\",\n\t\t\"}\",\n\t\t\"\",\n\t\t'Write-Host \"Running OpenClaw installer inside WSL...\" -ForegroundColor Green',\n\t\t\"wsl bash -c \\\"curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash\\\"\",\n\t\t\"\",\n\t\t'Write-Host \"\"',\n\t\t'Write-Host \"OpenClaw installed successfully inside WSL!\" -ForegroundColor Green',\n\t\t'Write-Host \"\"',\n\t\t'Write-Host \"Next steps:\"',\n\t\t'Write-Host \" 1. Start your companion services: docker compose up -d\"',\n\t\t'Write-Host \" 2. Run onboarding (in WSL): openclaw onboard\"',\n\t\t'Write-Host \" 3. Launch the dashboard: openclaw dashboard\"',\n\t\t'Write-Host \"\"',\n\t\t\"\",\n\t].join(\"\\n\");\n\n\treturn files;\n}\n"],"mappings":";;;AASA,SAAgB,8BACf,SACyB;CACzB,MAAM,QAAgC,EAAE;AAGxC,OAAM,iCAAiC;EACtC;EACA;EACA;EACA,yDAAyD,QAAQ;EACjE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAAC,KAAK,KAAK;AAGZ,OAAM,kCAAkC;EACvC;EACA,cAAc,QAAQ;EACtB;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;EACA;EACA,CAAC,KAAK,KAAK;AAEZ,QAAO"}
1
+ {"version":3,"file":"openclaw-install-script.cjs","names":[],"sources":["../../src/generators/openclaw-install-script.ts"],"sourcesContent":["/**\n * Generates the `scripts/install-openclaw.sh` and `scripts/install-openclaw.ps1`\n * scripts that install OpenClaw directly on the host via the official installer.\n */\n\nexport interface OpenclawInstallScriptOptions {\n\tprojectName: string;\n}\n\nexport function generateOpenclawInstallScript(\n\toptions: OpenclawInstallScriptOptions,\n): Record<string, string> {\n\tconst files: Record<string, string> = {};\n\n\t// Bash script (macOS / Linux)\n\tfiles[\"scripts/install-openclaw.sh\"] = [\n\t\t\"#!/usr/bin/env bash\",\n\t\t\"set -euo pipefail\",\n\t\t\"\",\n\t\t`# Install OpenClaw directly on this host for project: ${options.projectName}`,\n\t\t\"# This script downloads and runs the official OpenClaw installer.\",\n\t\t\"# It will install Node.js 22+ (if needed) and OpenClaw globally via npm.\",\n\t\t\"\",\n\t\t'echo \"╔══════════════════════════════════════════╗\"',\n\t\t'echo \"║ OpenClaw — Direct Host Installation ║\"',\n\t\t'echo \"╚══════════════════════════════════════════╝\"',\n\t\t'echo \"\"',\n\t\t\"\",\n\t\t\"# Run the official installer\",\n\t\t'curl -fsSL --proto \"=https\" --tlsv1.2 https://openclaw.ai/install.sh | bash',\n\t\t\"\",\n\t\t'echo \"\"',\n\t\t'echo \"OpenClaw installed successfully!\"',\n\t\t'echo \"\"',\n\t\t'echo \"Next steps:\"',\n\t\t'echo \" 1. Start your companion services: docker compose up -d\"',\n\t\t'echo \" 2. Run onboarding: openclaw onboard\"',\n\t\t'echo \" 3. Launch the dashboard: openclaw dashboard\"',\n\t\t'echo \"\"',\n\t\t\"\",\n\t].join(\"\\n\");\n\n\t// PowerShell script (Windows / WSL)\n\tfiles[\"scripts/install-openclaw.ps1\"] = [\n\t\t\"# Install OpenClaw directly on this host (Windows via WSL)\",\n\t\t`# Project: ${options.projectName}`,\n\t\t\"#\",\n\t\t\"# This script sets up WSL if needed, then runs the official Linux installer inside it.\",\n\t\t\"\",\n\t\t'Write-Host \"OpenClaw - Direct Host Installation\" -ForegroundColor Cyan',\n\t\t'Write-Host \"\"',\n\t\t\"\",\n\t\t\"# Check if WSL is available\",\n\t\t\"$wslCheck = Get-Command wsl -ErrorAction SilentlyContinue\",\n\t\t\"if (-not $wslCheck) {\",\n\t\t' Write-Host \"WSL is not installed. Installing WSL...\" -ForegroundColor Yellow',\n\t\t\" wsl --install\",\n\t\t' Write-Host \"Please restart your computer and re-run this script.\" -ForegroundColor Yellow',\n\t\t\" exit 1\",\n\t\t\"}\",\n\t\t\"\",\n\t\t'Write-Host \"Running OpenClaw installer inside WSL...\" -ForegroundColor Green',\n\t\t\"wsl bash -c \\\"curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash\\\"\",\n\t\t\"\",\n\t\t'Write-Host \"\"',\n\t\t'Write-Host \"OpenClaw installed successfully inside WSL!\" -ForegroundColor Green',\n\t\t'Write-Host \"\"',\n\t\t'Write-Host \"Next steps:\"',\n\t\t'Write-Host \" 1. Start your companion services: docker compose up -d\"',\n\t\t'Write-Host \" 2. Run onboarding (in WSL): openclaw onboard\"',\n\t\t'Write-Host \" 3. Launch the dashboard: openclaw dashboard\"',\n\t\t'Write-Host \"\"',\n\t\t\"\",\n\t].join(\"\\n\");\n\n\treturn files;\n}\n"],"mappings":";;AASA,SAAgB,8BACf,SACyB;CACzB,MAAM,QAAgC,EAAE;AAGxC,OAAM,iCAAiC;EACtC;EACA;EACA;EACA,yDAAyD,QAAQ;EACjE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAAC,KAAK,KAAK;AAGZ,OAAM,kCAAkC;EACvC;EACA,cAAc,QAAQ;EACtB;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;EACA;EACA,CAAC,KAAK,KAAK;AAEZ,QAAO"}
@@ -60,7 +60,7 @@ function generateOpenclawInstallScript(options) {
60
60
  ].join("\n");
61
61
  return files;
62
62
  }
63
-
64
63
  //#endregion
65
64
  export { generateOpenclawInstallScript };
65
+
66
66
  //# sourceMappingURL=openclaw-install-script.mjs.map
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/generators/openclaw-json.ts
4
3
  const PROVIDER_CONFIGS = {
5
4
  openai: {
@@ -534,7 +533,7 @@ function generateOpenClawConfig(resolved, options) {
534
533
  };
535
534
  return JSON.stringify(config, null, 2);
536
535
  }
537
-
538
536
  //#endregion
539
537
  exports.generateOpenClawConfig = generateOpenClawConfig;
538
+
540
539
  //# sourceMappingURL=openclaw-json.cjs.map