@better-openclaw/core 1.0.21 → 1.0.23

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 (1389) hide show
  1. package/dist/bare-metal-partition.cjs +2 -3
  2. package/dist/bare-metal-partition.cjs.map +1 -1
  3. package/dist/bare-metal-partition.d.mts.map +1 -1
  4. package/dist/bare-metal-partition.mjs +1 -1
  5. package/dist/bare-metal-partition.test.cjs +4 -5
  6. package/dist/bare-metal-partition.test.cjs.map +1 -1
  7. package/dist/bare-metal-partition.test.mjs +3 -4
  8. package/dist/bare-metal-partition.test.mjs.map +1 -1
  9. package/dist/compose-validation.test.cjs +5 -6
  10. package/dist/compose-validation.test.cjs.map +1 -1
  11. package/dist/compose-validation.test.mjs +2 -3
  12. package/dist/compose-validation.test.mjs.map +1 -1
  13. package/dist/composer.cjs +31 -18
  14. package/dist/composer.cjs.map +1 -1
  15. package/dist/composer.d.cts.map +1 -1
  16. package/dist/composer.d.mts.map +1 -1
  17. package/dist/composer.mjs +28 -15
  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 +3 -4
  32. package/dist/deployers/coolify.cjs.map +1 -1
  33. package/dist/deployers/coolify.d.cts +2 -18
  34. package/dist/deployers/coolify.d.mts +2 -18
  35. package/dist/deployers/coolify.mjs +1 -2
  36. package/dist/deployers/coolify.mjs.map +1 -1
  37. package/dist/deployers/dokploy.cjs +3 -4
  38. package/dist/deployers/dokploy.cjs.map +1 -1
  39. package/dist/deployers/dokploy.d.cts +2 -25
  40. package/dist/deployers/dokploy.d.mts +2 -25
  41. package/dist/deployers/dokploy.mjs +1 -2
  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 +3 -3
  46. package/dist/deployers/index.d.mts +3 -3
  47. package/dist/deployers/index.mjs +1 -2
  48. package/dist/deployers/index.mjs.map +1 -1
  49. package/dist/deployers/strip-host-ports.cjs +3 -4
  50. package/dist/deployers/strip-host-ports.cjs.map +1 -1
  51. package/dist/deployers/strip-host-ports.mjs +1 -2
  52. package/dist/deployers/strip-host-ports.mjs.map +1 -1
  53. package/dist/deployers/strip-host-ports.test.cjs +3 -4
  54. package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
  55. package/dist/deployers/strip-host-ports.test.mjs +3 -4
  56. package/dist/deployers/strip-host-ports.test.mjs.map +1 -1
  57. package/dist/deployers/types.d.cts +2 -243
  58. package/dist/deployers/types.d.mts +2 -243
  59. package/dist/deployers/types.mjs +1 -1
  60. package/dist/dokploy-8cbrxUun.d.cts +25 -0
  61. package/dist/dokploy-8cbrxUun.d.cts.map +1 -0
  62. package/dist/dokploy-BTflLhTM.d.mts +25 -0
  63. package/dist/dokploy-BTflLhTM.d.mts.map +1 -0
  64. package/dist/errors.cjs +2 -3
  65. package/dist/errors.cjs.map +1 -1
  66. package/dist/errors.mjs +1 -1
  67. package/dist/errors.mjs.map +1 -1
  68. package/dist/generate.cjs +28 -28
  69. package/dist/generate.cjs.map +1 -1
  70. package/dist/generate.d.cts.map +1 -1
  71. package/dist/generate.d.mts.map +1 -1
  72. package/dist/generate.mjs +2 -2
  73. package/dist/generate.mjs.map +1 -1
  74. package/dist/generate.test.cjs +4 -5
  75. package/dist/generate.test.cjs.map +1 -1
  76. package/dist/generate.test.mjs +3 -4
  77. package/dist/generate.test.mjs.map +1 -1
  78. package/dist/generators/bare-metal-install.cjs +2 -3
  79. package/dist/generators/bare-metal-install.cjs.map +1 -1
  80. package/dist/generators/bare-metal-install.d.mts.map +1 -1
  81. package/dist/generators/bare-metal-install.mjs +1 -1
  82. package/dist/generators/bare-metal-install.test.cjs +3 -4
  83. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  84. package/dist/generators/bare-metal-install.test.mjs +3 -4
  85. package/dist/generators/bare-metal-install.test.mjs.map +1 -1
  86. package/dist/generators/caddy.cjs +2 -3
  87. package/dist/generators/caddy.cjs.map +1 -1
  88. package/dist/generators/caddy.d.mts.map +1 -1
  89. package/dist/generators/caddy.mjs +1 -1
  90. package/dist/generators/caddy.test.cjs +3 -4
  91. package/dist/generators/caddy.test.cjs.map +1 -1
  92. package/dist/generators/caddy.test.mjs +3 -4
  93. package/dist/generators/caddy.test.mjs.map +1 -1
  94. package/dist/generators/cloud-init.cjs +2 -3
  95. package/dist/generators/cloud-init.cjs.map +1 -1
  96. package/dist/generators/cloud-init.mjs +1 -1
  97. package/dist/generators/env.cjs +150 -5
  98. package/dist/generators/env.cjs.map +1 -1
  99. package/dist/generators/env.d.cts.map +1 -1
  100. package/dist/generators/env.d.mts.map +1 -1
  101. package/dist/generators/env.mjs +147 -2
  102. package/dist/generators/env.mjs.map +1 -1
  103. package/dist/generators/env.test.cjs +3 -4
  104. package/dist/generators/env.test.cjs.map +1 -1
  105. package/dist/generators/env.test.mjs +3 -4
  106. package/dist/generators/env.test.mjs.map +1 -1
  107. package/dist/generators/get-shit-done.cjs +2 -3
  108. package/dist/generators/get-shit-done.cjs.map +1 -1
  109. package/dist/generators/get-shit-done.mjs +1 -1
  110. package/dist/generators/grafana.cjs +2 -3
  111. package/dist/generators/grafana.cjs.map +1 -1
  112. package/dist/generators/grafana.mjs +1 -1
  113. package/dist/generators/health-check.cjs +2 -3
  114. package/dist/generators/health-check.cjs.map +1 -1
  115. package/dist/generators/health-check.d.mts.map +1 -1
  116. package/dist/generators/health-check.mjs +1 -1
  117. package/dist/generators/health-check.test.cjs +3 -4
  118. package/dist/generators/health-check.test.cjs.map +1 -1
  119. package/dist/generators/health-check.test.mjs +3 -4
  120. package/dist/generators/health-check.test.mjs.map +1 -1
  121. package/dist/generators/n8n-workflows.cjs +2 -3
  122. package/dist/generators/n8n-workflows.cjs.map +1 -1
  123. package/dist/generators/n8n-workflows.d.mts.map +1 -1
  124. package/dist/generators/n8n-workflows.mjs +1 -1
  125. package/dist/generators/native-services.cjs +2 -3
  126. package/dist/generators/native-services.cjs.map +1 -1
  127. package/dist/generators/native-services.mjs +1 -1
  128. package/dist/generators/openclaw-install-script.cjs +2 -3
  129. package/dist/generators/openclaw-install-script.cjs.map +1 -1
  130. package/dist/generators/openclaw-install-script.mjs +1 -1
  131. package/dist/generators/openclaw-json.cjs +104 -10
  132. package/dist/generators/openclaw-json.cjs.map +1 -1
  133. package/dist/generators/openclaw-json.mjs +103 -8
  134. package/dist/generators/openclaw-json.mjs.map +1 -1
  135. package/dist/generators/postgres-init.cjs +32 -3
  136. package/dist/generators/postgres-init.cjs.map +1 -1
  137. package/dist/generators/postgres-init.d.cts.map +1 -1
  138. package/dist/generators/postgres-init.d.mts.map +1 -1
  139. package/dist/generators/postgres-init.mjs +31 -1
  140. package/dist/generators/postgres-init.mjs.map +1 -1
  141. package/dist/generators/prometheus.cjs +2 -3
  142. package/dist/generators/prometheus.cjs.map +1 -1
  143. package/dist/generators/prometheus.d.mts.map +1 -1
  144. package/dist/generators/prometheus.mjs +1 -1
  145. package/dist/generators/readme.cjs +4 -4
  146. package/dist/generators/readme.cjs.map +1 -1
  147. package/dist/generators/readme.d.mts.map +1 -1
  148. package/dist/generators/readme.mjs +3 -2
  149. package/dist/generators/readme.mjs.map +1 -1
  150. package/dist/generators/scripts.cjs +2 -3
  151. package/dist/generators/scripts.cjs.map +1 -1
  152. package/dist/generators/scripts.mjs +1 -1
  153. package/dist/generators/scripts.test.cjs +3 -4
  154. package/dist/generators/scripts.test.cjs.map +1 -1
  155. package/dist/generators/scripts.test.mjs +3 -4
  156. package/dist/generators/scripts.test.mjs.map +1 -1
  157. package/dist/generators/skills.cjs +3 -590
  158. package/dist/generators/skills.d.mts.map +1 -1
  159. package/dist/generators/skills.mjs +1 -2
  160. package/dist/generators/skills.mjs.map +1 -1
  161. package/dist/generators/stack-manifest.cjs +2 -3
  162. package/dist/generators/stack-manifest.cjs.map +1 -1
  163. package/dist/generators/stack-manifest.mjs +1 -1
  164. package/dist/generators/traefik.cjs +2 -3
  165. package/dist/generators/traefik.cjs.map +1 -1
  166. package/dist/generators/traefik.mjs +1 -1
  167. package/dist/generators/traefik.test.cjs +4 -5
  168. package/dist/generators/traefik.test.cjs.map +1 -1
  169. package/dist/generators/traefik.test.mjs +3 -4
  170. package/dist/generators/traefik.test.mjs.map +1 -1
  171. package/dist/index.cjs +35 -36
  172. package/dist/index.d.cts +4 -4
  173. package/dist/index.d.mts +4 -4
  174. package/dist/index.mjs +2 -3
  175. package/dist/{magic-string.es-D2agHT3I.cjs → magic-string.es-CJq41xdM.cjs} +2 -4
  176. package/dist/{magic-string.es-CfFonO_S.mjs.map → magic-string.es-CJq41xdM.cjs.map} +1 -1
  177. package/dist/{magic-string.es-CfFonO_S.mjs → magic-string.es-CoDyF8pj.mjs} +2 -3
  178. package/dist/{magic-string.es-D2agHT3I.cjs.map → magic-string.es-CoDyF8pj.mjs.map} +1 -1
  179. package/dist/migrations.cjs +5 -6
  180. package/dist/migrations.cjs.map +1 -1
  181. package/dist/migrations.mjs +4 -4
  182. package/dist/migrations.mjs.map +1 -1
  183. package/dist/migrations.test.cjs +6 -7
  184. package/dist/migrations.test.cjs.map +1 -1
  185. package/dist/migrations.test.mjs +7 -8
  186. package/dist/migrations.test.mjs.map +1 -1
  187. package/dist/port-scanner.cjs +2 -3
  188. package/dist/port-scanner.cjs.map +1 -1
  189. package/dist/port-scanner.d.mts.map +1 -1
  190. package/dist/port-scanner.mjs +1 -1
  191. package/dist/presets/presets.test.cjs +11 -8
  192. package/dist/presets/presets.test.cjs.map +1 -1
  193. package/dist/presets/presets.test.mjs +7 -4
  194. package/dist/presets/presets.test.mjs.map +1 -1
  195. package/dist/presets/registry.cjs +171 -3
  196. package/dist/presets/registry.cjs.map +1 -1
  197. package/dist/presets/registry.d.cts.map +1 -1
  198. package/dist/presets/registry.d.mts.map +1 -1
  199. package/dist/presets/registry.mjs +170 -1
  200. package/dist/presets/registry.mjs.map +1 -1
  201. package/dist/presets/registry.test.cjs +3 -4
  202. package/dist/presets/registry.test.cjs.map +1 -1
  203. package/dist/presets/registry.test.mjs +3 -4
  204. package/dist/presets/registry.test.mjs.map +1 -1
  205. package/dist/resolver.cjs +4 -5
  206. package/dist/resolver.cjs.map +1 -1
  207. package/dist/resolver.d.mts.map +1 -1
  208. package/dist/resolver.mjs +1 -2
  209. package/dist/resolver.mjs.map +1 -1
  210. package/dist/resolver.test.cjs +3 -4
  211. package/dist/resolver.test.cjs.map +1 -1
  212. package/dist/resolver.test.mjs +3 -4
  213. package/dist/resolver.test.mjs.map +1 -1
  214. package/dist/schema-B4c64P8N.d.cts +914 -0
  215. package/dist/schema-B4c64P8N.d.cts.map +1 -0
  216. package/dist/schema-CXNhYci1.d.mts +914 -0
  217. package/dist/schema-CXNhYci1.d.mts.map +1 -0
  218. package/dist/schema.cjs +19 -5
  219. package/dist/schema.cjs.map +1 -1
  220. package/dist/schema.d.cts +2 -854
  221. package/dist/schema.d.mts +2 -854
  222. package/dist/schema.mjs +17 -3
  223. package/dist/schema.mjs.map +1 -1
  224. package/dist/schema.test.cjs +3 -4
  225. package/dist/schema.test.cjs.map +1 -1
  226. package/dist/schema.test.mjs +3 -4
  227. package/dist/schema.test.mjs.map +1 -1
  228. package/dist/services/definitions/adguard-home.cjs +74 -0
  229. package/dist/services/definitions/adguard-home.cjs.map +1 -0
  230. package/dist/services/definitions/adguard-home.d.cts +7 -0
  231. package/dist/services/definitions/adguard-home.d.cts.map +1 -0
  232. package/dist/services/definitions/adguard-home.d.mts +7 -0
  233. package/dist/services/definitions/adguard-home.d.mts.map +1 -0
  234. package/dist/services/definitions/adguard-home.mjs +73 -0
  235. package/dist/services/definitions/adguard-home.mjs.map +1 -0
  236. package/dist/services/definitions/airbyte.cjs +76 -0
  237. package/dist/services/definitions/airbyte.cjs.map +1 -0
  238. package/dist/services/definitions/airbyte.d.cts +7 -0
  239. package/dist/services/definitions/airbyte.d.cts.map +1 -0
  240. package/dist/services/definitions/airbyte.d.mts +7 -0
  241. package/dist/services/definitions/airbyte.d.mts.map +1 -0
  242. package/dist/services/definitions/airbyte.mjs +75 -0
  243. package/dist/services/definitions/airbyte.mjs.map +1 -0
  244. package/dist/services/definitions/airflow.cjs +109 -0
  245. package/dist/services/definitions/airflow.cjs.map +1 -0
  246. package/dist/services/definitions/airflow.d.cts +7 -0
  247. package/dist/services/definitions/airflow.d.cts.map +1 -0
  248. package/dist/services/definitions/airflow.d.mts +7 -0
  249. package/dist/services/definitions/airflow.d.mts.map +1 -0
  250. package/dist/services/definitions/airflow.mjs +108 -0
  251. package/dist/services/definitions/airflow.mjs.map +1 -0
  252. package/dist/services/definitions/anything-llm.cjs +2 -3
  253. package/dist/services/definitions/anything-llm.cjs.map +1 -1
  254. package/dist/services/definitions/anything-llm.mjs +1 -1
  255. package/dist/services/definitions/appflowy.cjs +2 -3
  256. package/dist/services/definitions/appflowy.cjs.map +1 -1
  257. package/dist/services/definitions/appflowy.mjs +1 -1
  258. package/dist/services/definitions/appwrite.cjs +190 -0
  259. package/dist/services/definitions/appwrite.cjs.map +1 -0
  260. package/dist/services/definitions/appwrite.d.cts +7 -0
  261. package/dist/services/definitions/appwrite.d.cts.map +1 -0
  262. package/dist/services/definitions/appwrite.d.mts +7 -0
  263. package/dist/services/definitions/appwrite.d.mts.map +1 -0
  264. package/dist/services/definitions/appwrite.mjs +189 -0
  265. package/dist/services/definitions/appwrite.mjs.map +1 -0
  266. package/dist/services/definitions/audiobookshelf.cjs +81 -0
  267. package/dist/services/definitions/audiobookshelf.cjs.map +1 -0
  268. package/dist/services/definitions/audiobookshelf.d.cts +7 -0
  269. package/dist/services/definitions/audiobookshelf.d.cts.map +1 -0
  270. package/dist/services/definitions/audiobookshelf.d.mts +7 -0
  271. package/dist/services/definitions/audiobookshelf.d.mts.map +1 -0
  272. package/dist/services/definitions/audiobookshelf.mjs +80 -0
  273. package/dist/services/definitions/audiobookshelf.mjs.map +1 -0
  274. package/dist/services/definitions/authelia.cjs +145 -0
  275. package/dist/services/definitions/authelia.cjs.map +1 -0
  276. package/dist/services/definitions/authelia.d.cts +7 -0
  277. package/dist/services/definitions/authelia.d.cts.map +1 -0
  278. package/dist/services/definitions/authelia.d.mts +7 -0
  279. package/dist/services/definitions/authelia.d.mts.map +1 -0
  280. package/dist/services/definitions/authelia.mjs +144 -0
  281. package/dist/services/definitions/authelia.mjs.map +1 -0
  282. package/dist/services/definitions/authentik.cjs +2 -3
  283. package/dist/services/definitions/authentik.cjs.map +1 -1
  284. package/dist/services/definitions/authentik.mjs +1 -1
  285. package/dist/services/definitions/axolotl.cjs +67 -0
  286. package/dist/services/definitions/axolotl.cjs.map +1 -0
  287. package/dist/services/definitions/axolotl.d.cts +7 -0
  288. package/dist/services/definitions/axolotl.d.cts.map +1 -0
  289. package/dist/services/definitions/axolotl.d.mts +7 -0
  290. package/dist/services/definitions/axolotl.d.mts.map +1 -0
  291. package/dist/services/definitions/axolotl.mjs +66 -0
  292. package/dist/services/definitions/axolotl.mjs.map +1 -0
  293. package/dist/services/definitions/baserow.cjs +115 -0
  294. package/dist/services/definitions/baserow.cjs.map +1 -0
  295. package/dist/services/definitions/baserow.d.cts +7 -0
  296. package/dist/services/definitions/baserow.d.cts.map +1 -0
  297. package/dist/services/definitions/baserow.d.mts +7 -0
  298. package/dist/services/definitions/baserow.d.mts.map +1 -0
  299. package/dist/services/definitions/baserow.mjs +114 -0
  300. package/dist/services/definitions/baserow.mjs.map +1 -0
  301. package/dist/services/definitions/beszel.cjs +2 -3
  302. package/dist/services/definitions/beszel.cjs.map +1 -1
  303. package/dist/services/definitions/beszel.mjs +1 -1
  304. package/dist/services/definitions/browserless.cjs +2 -3
  305. package/dist/services/definitions/browserless.cjs.map +1 -1
  306. package/dist/services/definitions/browserless.mjs +1 -1
  307. package/dist/services/definitions/caddy.cjs +2 -3
  308. package/dist/services/definitions/caddy.cjs.map +1 -1
  309. package/dist/services/definitions/caddy.mjs +1 -1
  310. package/dist/services/definitions/cal-com.cjs +2 -3
  311. package/dist/services/definitions/cal-com.cjs.map +1 -1
  312. package/dist/services/definitions/cal-com.mjs +1 -1
  313. package/dist/services/definitions/calibre-web.cjs +91 -0
  314. package/dist/services/definitions/calibre-web.cjs.map +1 -0
  315. package/dist/services/definitions/calibre-web.d.cts +7 -0
  316. package/dist/services/definitions/calibre-web.d.cts.map +1 -0
  317. package/dist/services/definitions/calibre-web.d.mts +7 -0
  318. package/dist/services/definitions/calibre-web.d.mts.map +1 -0
  319. package/dist/services/definitions/calibre-web.mjs +90 -0
  320. package/dist/services/definitions/calibre-web.mjs.map +1 -0
  321. package/dist/services/definitions/chatwoot-worker.cjs +95 -0
  322. package/dist/services/definitions/chatwoot-worker.cjs.map +1 -0
  323. package/dist/services/definitions/chatwoot-worker.d.cts +7 -0
  324. package/dist/services/definitions/chatwoot-worker.d.cts.map +1 -0
  325. package/dist/services/definitions/chatwoot-worker.d.mts +7 -0
  326. package/dist/services/definitions/chatwoot-worker.d.mts.map +1 -0
  327. package/dist/services/definitions/chatwoot-worker.mjs +94 -0
  328. package/dist/services/definitions/chatwoot-worker.mjs.map +1 -0
  329. package/dist/services/definitions/chatwoot.cjs +112 -0
  330. package/dist/services/definitions/chatwoot.cjs.map +1 -0
  331. package/dist/services/definitions/chatwoot.d.cts +7 -0
  332. package/dist/services/definitions/chatwoot.d.cts.map +1 -0
  333. package/dist/services/definitions/chatwoot.d.mts +7 -0
  334. package/dist/services/definitions/chatwoot.d.mts.map +1 -0
  335. package/dist/services/definitions/chatwoot.mjs +111 -0
  336. package/dist/services/definitions/chatwoot.mjs.map +1 -0
  337. package/dist/services/definitions/chromadb.cjs +2 -3
  338. package/dist/services/definitions/chromadb.cjs.map +1 -1
  339. package/dist/services/definitions/chromadb.mjs +1 -1
  340. package/dist/services/definitions/claude-code.cjs +2 -3
  341. package/dist/services/definitions/claude-code.cjs.map +1 -1
  342. package/dist/services/definitions/claude-code.mjs +1 -1
  343. package/dist/services/definitions/clickhouse.cjs +113 -0
  344. package/dist/services/definitions/clickhouse.cjs.map +1 -0
  345. package/dist/services/definitions/clickhouse.d.cts +7 -0
  346. package/dist/services/definitions/clickhouse.d.cts.map +1 -0
  347. package/dist/services/definitions/clickhouse.d.mts +7 -0
  348. package/dist/services/definitions/clickhouse.d.mts.map +1 -0
  349. package/dist/services/definitions/clickhouse.mjs +112 -0
  350. package/dist/services/definitions/clickhouse.mjs.map +1 -0
  351. package/dist/services/definitions/cloudflared.cjs +55 -0
  352. package/dist/services/definitions/cloudflared.cjs.map +1 -0
  353. package/dist/services/definitions/cloudflared.d.cts +7 -0
  354. package/dist/services/definitions/cloudflared.d.cts.map +1 -0
  355. package/dist/services/definitions/cloudflared.d.mts +7 -0
  356. package/dist/services/definitions/cloudflared.d.mts.map +1 -0
  357. package/dist/services/definitions/cloudflared.mjs +54 -0
  358. package/dist/services/definitions/cloudflared.mjs.map +1 -0
  359. package/dist/services/definitions/cockroachdb.cjs +70 -0
  360. package/dist/services/definitions/cockroachdb.cjs.map +1 -0
  361. package/dist/services/definitions/cockroachdb.d.cts +7 -0
  362. package/dist/services/definitions/cockroachdb.d.cts.map +1 -0
  363. package/dist/services/definitions/cockroachdb.d.mts +7 -0
  364. package/dist/services/definitions/cockroachdb.d.mts.map +1 -0
  365. package/dist/services/definitions/cockroachdb.mjs +69 -0
  366. package/dist/services/definitions/cockroachdb.mjs.map +1 -0
  367. package/dist/services/definitions/code-server.cjs +2 -3
  368. package/dist/services/definitions/code-server.cjs.map +1 -1
  369. package/dist/services/definitions/code-server.mjs +1 -1
  370. package/dist/services/definitions/coder.cjs +64 -0
  371. package/dist/services/definitions/coder.cjs.map +1 -0
  372. package/dist/services/definitions/coder.d.cts +7 -0
  373. package/dist/services/definitions/coder.d.cts.map +1 -0
  374. package/dist/services/definitions/coder.d.mts +7 -0
  375. package/dist/services/definitions/coder.d.mts.map +1 -0
  376. package/dist/services/definitions/coder.mjs +63 -0
  377. package/dist/services/definitions/coder.mjs.map +1 -0
  378. package/dist/services/definitions/codex.cjs +2 -3
  379. package/dist/services/definitions/codex.cjs.map +1 -1
  380. package/dist/services/definitions/codex.mjs +1 -1
  381. package/dist/services/definitions/comfyui.cjs +2 -3
  382. package/dist/services/definitions/comfyui.cjs.map +1 -1
  383. package/dist/services/definitions/comfyui.mjs +1 -1
  384. package/dist/services/definitions/convex-dashboard.cjs +2 -3
  385. package/dist/services/definitions/convex-dashboard.cjs.map +1 -1
  386. package/dist/services/definitions/convex-dashboard.mjs +1 -1
  387. package/dist/services/definitions/convex.cjs +2 -3
  388. package/dist/services/definitions/convex.cjs.map +1 -1
  389. package/dist/services/definitions/convex.mjs +1 -1
  390. package/dist/services/definitions/coolify.cjs +2 -3
  391. package/dist/services/definitions/coolify.cjs.map +1 -1
  392. package/dist/services/definitions/coolify.mjs +1 -1
  393. package/dist/services/definitions/crowdsec.cjs +2 -3
  394. package/dist/services/definitions/crowdsec.cjs.map +1 -1
  395. package/dist/services/definitions/crowdsec.mjs +1 -1
  396. package/dist/services/definitions/dagster.cjs +83 -0
  397. package/dist/services/definitions/dagster.cjs.map +1 -0
  398. package/dist/services/definitions/dagster.d.cts +7 -0
  399. package/dist/services/definitions/dagster.d.cts.map +1 -0
  400. package/dist/services/definitions/dagster.d.mts +7 -0
  401. package/dist/services/definitions/dagster.d.mts.map +1 -0
  402. package/dist/services/definitions/dagster.mjs +82 -0
  403. package/dist/services/definitions/dagster.mjs.map +1 -0
  404. package/dist/services/definitions/desktop-environment.cjs +2 -3
  405. package/dist/services/definitions/desktop-environment.cjs.map +1 -1
  406. package/dist/services/definitions/desktop-environment.mjs +1 -1
  407. package/dist/services/definitions/dify.cjs +2 -3
  408. package/dist/services/definitions/dify.cjs.map +1 -1
  409. package/dist/services/definitions/dify.mjs +1 -1
  410. package/dist/services/definitions/directus.cjs +115 -0
  411. package/dist/services/definitions/directus.cjs.map +1 -0
  412. package/dist/services/definitions/directus.d.cts +7 -0
  413. package/dist/services/definitions/directus.d.cts.map +1 -0
  414. package/dist/services/definitions/directus.d.mts +7 -0
  415. package/dist/services/definitions/directus.d.mts.map +1 -0
  416. package/dist/services/definitions/directus.mjs +114 -0
  417. package/dist/services/definitions/directus.mjs.map +1 -0
  418. package/dist/services/definitions/docsgpt.cjs +2 -3
  419. package/dist/services/definitions/docsgpt.cjs.map +1 -1
  420. package/dist/services/definitions/docsgpt.mjs +1 -1
  421. package/dist/services/definitions/dokploy.cjs +2 -3
  422. package/dist/services/definitions/dokploy.cjs.map +1 -1
  423. package/dist/services/definitions/dokploy.mjs +1 -1
  424. package/dist/services/definitions/dozzle.cjs +2 -3
  425. package/dist/services/definitions/dozzle.cjs.map +1 -1
  426. package/dist/services/definitions/dozzle.mjs +1 -1
  427. package/dist/services/definitions/dragonfly.cjs +64 -0
  428. package/dist/services/definitions/dragonfly.cjs.map +1 -0
  429. package/dist/services/definitions/dragonfly.d.cts +7 -0
  430. package/dist/services/definitions/dragonfly.d.cts.map +1 -0
  431. package/dist/services/definitions/dragonfly.d.mts +7 -0
  432. package/dist/services/definitions/dragonfly.d.mts.map +1 -0
  433. package/dist/services/definitions/dragonfly.mjs +63 -0
  434. package/dist/services/definitions/dragonfly.mjs.map +1 -0
  435. package/dist/services/definitions/drone-ci.cjs +95 -0
  436. package/dist/services/definitions/drone-ci.cjs.map +1 -0
  437. package/dist/services/definitions/drone-ci.d.cts +7 -0
  438. package/dist/services/definitions/drone-ci.d.cts.map +1 -0
  439. package/dist/services/definitions/drone-ci.d.mts +7 -0
  440. package/dist/services/definitions/drone-ci.d.mts.map +1 -0
  441. package/dist/services/definitions/drone-ci.mjs +94 -0
  442. package/dist/services/definitions/drone-ci.mjs.map +1 -0
  443. package/dist/services/definitions/duplicati.cjs +76 -0
  444. package/dist/services/definitions/duplicati.cjs.map +1 -0
  445. package/dist/services/definitions/duplicati.d.cts +7 -0
  446. package/dist/services/definitions/duplicati.d.cts.map +1 -0
  447. package/dist/services/definitions/duplicati.d.mts +7 -0
  448. package/dist/services/definitions/duplicati.d.mts.map +1 -0
  449. package/dist/services/definitions/duplicati.mjs +75 -0
  450. package/dist/services/definitions/duplicati.mjs.map +1 -0
  451. package/dist/services/definitions/element-web.cjs +61 -0
  452. package/dist/services/definitions/element-web.cjs.map +1 -0
  453. package/dist/services/definitions/element-web.d.cts +7 -0
  454. package/dist/services/definitions/element-web.d.cts.map +1 -0
  455. package/dist/services/definitions/element-web.d.mts +7 -0
  456. package/dist/services/definitions/element-web.d.mts.map +1 -0
  457. package/dist/services/definitions/element-web.mjs +60 -0
  458. package/dist/services/definitions/element-web.mjs.map +1 -0
  459. package/dist/services/definitions/excalidraw.cjs +48 -0
  460. package/dist/services/definitions/excalidraw.cjs.map +1 -0
  461. package/dist/services/definitions/excalidraw.d.cts +7 -0
  462. package/dist/services/definitions/excalidraw.d.cts.map +1 -0
  463. package/dist/services/definitions/excalidraw.d.mts +7 -0
  464. package/dist/services/definitions/excalidraw.d.mts.map +1 -0
  465. package/dist/services/definitions/excalidraw.mjs +47 -0
  466. package/dist/services/definitions/excalidraw.mjs.map +1 -0
  467. package/dist/services/definitions/ffmpeg.cjs +2 -3
  468. package/dist/services/definitions/ffmpeg.cjs.map +1 -1
  469. package/dist/services/definitions/ffmpeg.mjs +1 -1
  470. package/dist/services/definitions/firecrawl-playwright.cjs +61 -0
  471. package/dist/services/definitions/firecrawl-playwright.cjs.map +1 -0
  472. package/dist/services/definitions/firecrawl-playwright.d.cts +7 -0
  473. package/dist/services/definitions/firecrawl-playwright.d.cts.map +1 -0
  474. package/dist/services/definitions/firecrawl-playwright.d.mts +7 -0
  475. package/dist/services/definitions/firecrawl-playwright.d.mts.map +1 -0
  476. package/dist/services/definitions/firecrawl-playwright.mjs +60 -0
  477. package/dist/services/definitions/firecrawl-playwright.mjs.map +1 -0
  478. package/dist/services/definitions/firecrawl.cjs +163 -0
  479. package/dist/services/definitions/firecrawl.cjs.map +1 -0
  480. package/dist/services/definitions/firecrawl.d.cts +7 -0
  481. package/dist/services/definitions/firecrawl.d.cts.map +1 -0
  482. package/dist/services/definitions/firecrawl.d.mts +7 -0
  483. package/dist/services/definitions/firecrawl.d.mts.map +1 -0
  484. package/dist/services/definitions/firecrawl.mjs +162 -0
  485. package/dist/services/definitions/firecrawl.mjs.map +1 -0
  486. package/dist/services/definitions/flagsmith.cjs +77 -0
  487. package/dist/services/definitions/flagsmith.cjs.map +1 -0
  488. package/dist/services/definitions/flagsmith.d.cts +7 -0
  489. package/dist/services/definitions/flagsmith.d.cts.map +1 -0
  490. package/dist/services/definitions/flagsmith.d.mts +7 -0
  491. package/dist/services/definitions/flagsmith.d.mts.map +1 -0
  492. package/dist/services/definitions/flagsmith.mjs +76 -0
  493. package/dist/services/definitions/flagsmith.mjs.map +1 -0
  494. package/dist/services/definitions/flowise.cjs +2 -3
  495. package/dist/services/definitions/flowise.cjs.map +1 -1
  496. package/dist/services/definitions/flowise.mjs +1 -1
  497. package/dist/services/definitions/focalboard.cjs +65 -0
  498. package/dist/services/definitions/focalboard.cjs.map +1 -0
  499. package/dist/services/definitions/focalboard.d.cts +7 -0
  500. package/dist/services/definitions/focalboard.d.cts.map +1 -0
  501. package/dist/services/definitions/focalboard.d.mts +7 -0
  502. package/dist/services/definitions/focalboard.d.mts.map +1 -0
  503. package/dist/services/definitions/focalboard.mjs +64 -0
  504. package/dist/services/definitions/focalboard.mjs.map +1 -0
  505. package/dist/services/definitions/fonoster.cjs +66 -0
  506. package/dist/services/definitions/fonoster.cjs.map +1 -0
  507. package/dist/services/definitions/fonoster.d.cts +7 -0
  508. package/dist/services/definitions/fonoster.d.cts.map +1 -0
  509. package/dist/services/definitions/fonoster.d.mts +7 -0
  510. package/dist/services/definitions/fonoster.d.mts.map +1 -0
  511. package/dist/services/definitions/fonoster.mjs +65 -0
  512. package/dist/services/definitions/fonoster.mjs.map +1 -0
  513. package/dist/services/definitions/forgejo.cjs +108 -0
  514. package/dist/services/definitions/forgejo.cjs.map +1 -0
  515. package/dist/services/definitions/forgejo.d.cts +7 -0
  516. package/dist/services/definitions/forgejo.d.cts.map +1 -0
  517. package/dist/services/definitions/forgejo.d.mts +7 -0
  518. package/dist/services/definitions/forgejo.d.mts.map +1 -0
  519. package/dist/services/definitions/forgejo.mjs +107 -0
  520. package/dist/services/definitions/forgejo.mjs.map +1 -0
  521. package/dist/services/definitions/formbricks.cjs +75 -0
  522. package/dist/services/definitions/formbricks.cjs.map +1 -0
  523. package/dist/services/definitions/formbricks.d.cts +7 -0
  524. package/dist/services/definitions/formbricks.d.cts.map +1 -0
  525. package/dist/services/definitions/formbricks.d.mts +7 -0
  526. package/dist/services/definitions/formbricks.d.mts.map +1 -0
  527. package/dist/services/definitions/formbricks.mjs +74 -0
  528. package/dist/services/definitions/formbricks.mjs.map +1 -0
  529. package/dist/services/definitions/gemini-cli.cjs +2 -3
  530. package/dist/services/definitions/gemini-cli.cjs.map +1 -1
  531. package/dist/services/definitions/gemini-cli.mjs +1 -1
  532. package/dist/services/definitions/ghost.cjs +2 -3
  533. package/dist/services/definitions/ghost.cjs.map +1 -1
  534. package/dist/services/definitions/ghost.mjs +1 -1
  535. package/dist/services/definitions/gitea.cjs +2 -3
  536. package/dist/services/definitions/gitea.cjs.map +1 -1
  537. package/dist/services/definitions/gitea.mjs +1 -1
  538. package/dist/services/definitions/gotify.cjs +2 -3
  539. package/dist/services/definitions/gotify.cjs.map +1 -1
  540. package/dist/services/definitions/gotify.mjs +1 -1
  541. package/dist/services/definitions/grafana.cjs +2 -3
  542. package/dist/services/definitions/grafana.cjs.map +1 -1
  543. package/dist/services/definitions/grafana.mjs +1 -1
  544. package/dist/services/definitions/graylog.cjs +103 -0
  545. package/dist/services/definitions/graylog.cjs.map +1 -0
  546. package/dist/services/definitions/graylog.d.cts +7 -0
  547. package/dist/services/definitions/graylog.d.cts.map +1 -0
  548. package/dist/services/definitions/graylog.d.mts +7 -0
  549. package/dist/services/definitions/graylog.d.mts.map +1 -0
  550. package/dist/services/definitions/graylog.mjs +102 -0
  551. package/dist/services/definitions/graylog.mjs.map +1 -0
  552. package/dist/services/definitions/headscale.cjs +2 -3
  553. package/dist/services/definitions/headscale.cjs.map +1 -1
  554. package/dist/services/definitions/headscale.mjs +1 -1
  555. package/dist/services/definitions/hedgedoc.cjs +82 -0
  556. package/dist/services/definitions/hedgedoc.cjs.map +1 -0
  557. package/dist/services/definitions/hedgedoc.d.cts +7 -0
  558. package/dist/services/definitions/hedgedoc.d.cts.map +1 -0
  559. package/dist/services/definitions/hedgedoc.d.mts +7 -0
  560. package/dist/services/definitions/hedgedoc.d.mts.map +1 -0
  561. package/dist/services/definitions/hedgedoc.mjs +81 -0
  562. package/dist/services/definitions/hedgedoc.mjs.map +1 -0
  563. package/dist/services/definitions/hexstrike.cjs +2 -3
  564. package/dist/services/definitions/hexstrike.cjs.map +1 -1
  565. package/dist/services/definitions/hexstrike.mjs +1 -1
  566. package/dist/services/definitions/heyform.cjs +64 -0
  567. package/dist/services/definitions/heyform.cjs.map +1 -0
  568. package/dist/services/definitions/heyform.d.cts +7 -0
  569. package/dist/services/definitions/heyform.d.cts.map +1 -0
  570. package/dist/services/definitions/heyform.d.mts +7 -0
  571. package/dist/services/definitions/heyform.d.mts.map +1 -0
  572. package/dist/services/definitions/heyform.mjs +63 -0
  573. package/dist/services/definitions/heyform.mjs.map +1 -0
  574. package/dist/services/definitions/homeassistant.cjs +2 -3
  575. package/dist/services/definitions/homeassistant.cjs.map +1 -1
  576. package/dist/services/definitions/homeassistant.mjs +1 -1
  577. package/dist/services/definitions/hoppscotch.cjs +76 -0
  578. package/dist/services/definitions/hoppscotch.cjs.map +1 -0
  579. package/dist/services/definitions/hoppscotch.d.cts +7 -0
  580. package/dist/services/definitions/hoppscotch.d.cts.map +1 -0
  581. package/dist/services/definitions/hoppscotch.d.mts +7 -0
  582. package/dist/services/definitions/hoppscotch.d.mts.map +1 -0
  583. package/dist/services/definitions/hoppscotch.mjs +75 -0
  584. package/dist/services/definitions/hoppscotch.mjs.map +1 -0
  585. package/dist/services/definitions/immich.cjs +2 -3
  586. package/dist/services/definitions/immich.cjs.map +1 -1
  587. package/dist/services/definitions/immich.mjs +1 -1
  588. package/dist/services/definitions/index.cjs +358 -98
  589. package/dist/services/definitions/index.cjs.map +1 -1
  590. package/dist/services/definitions/index.d.cts +88 -1
  591. package/dist/services/definitions/index.d.cts.map +1 -1
  592. package/dist/services/definitions/index.d.mts +88 -1
  593. package/dist/services/definitions/index.d.mts.map +1 -1
  594. package/dist/services/definitions/index.mjs +177 -4
  595. package/dist/services/definitions/index.mjs.map +1 -1
  596. package/dist/services/definitions/infisical.cjs +99 -0
  597. package/dist/services/definitions/infisical.cjs.map +1 -0
  598. package/dist/services/definitions/infisical.d.cts +7 -0
  599. package/dist/services/definitions/infisical.d.cts.map +1 -0
  600. package/dist/services/definitions/infisical.d.mts +7 -0
  601. package/dist/services/definitions/infisical.d.mts.map +1 -0
  602. package/dist/services/definitions/infisical.mjs +98 -0
  603. package/dist/services/definitions/infisical.mjs.map +1 -0
  604. package/dist/services/definitions/influxdb.cjs +105 -0
  605. package/dist/services/definitions/influxdb.cjs.map +1 -0
  606. package/dist/services/definitions/influxdb.d.cts +7 -0
  607. package/dist/services/definitions/influxdb.d.cts.map +1 -0
  608. package/dist/services/definitions/influxdb.d.mts +7 -0
  609. package/dist/services/definitions/influxdb.d.mts.map +1 -0
  610. package/dist/services/definitions/influxdb.mjs +104 -0
  611. package/dist/services/definitions/influxdb.mjs.map +1 -0
  612. package/dist/services/definitions/invoke-ai.cjs +70 -0
  613. package/dist/services/definitions/invoke-ai.cjs.map +1 -0
  614. package/dist/services/definitions/invoke-ai.d.cts +7 -0
  615. package/dist/services/definitions/invoke-ai.d.cts.map +1 -0
  616. package/dist/services/definitions/invoke-ai.d.mts +7 -0
  617. package/dist/services/definitions/invoke-ai.d.mts.map +1 -0
  618. package/dist/services/definitions/invoke-ai.mjs +69 -0
  619. package/dist/services/definitions/invoke-ai.mjs.map +1 -0
  620. package/dist/services/definitions/jaeger.cjs +95 -0
  621. package/dist/services/definitions/jaeger.cjs.map +1 -0
  622. package/dist/services/definitions/jaeger.d.cts +7 -0
  623. package/dist/services/definitions/jaeger.d.cts.map +1 -0
  624. package/dist/services/definitions/jaeger.d.mts +7 -0
  625. package/dist/services/definitions/jaeger.d.mts.map +1 -0
  626. package/dist/services/definitions/jaeger.mjs +94 -0
  627. package/dist/services/definitions/jaeger.mjs.map +1 -0
  628. package/dist/services/definitions/jan.cjs +64 -0
  629. package/dist/services/definitions/jan.cjs.map +1 -0
  630. package/dist/services/definitions/jan.d.cts +7 -0
  631. package/dist/services/definitions/jan.d.cts.map +1 -0
  632. package/dist/services/definitions/jan.d.mts +7 -0
  633. package/dist/services/definitions/jan.d.mts.map +1 -0
  634. package/dist/services/definitions/jan.mjs +63 -0
  635. package/dist/services/definitions/jan.mjs.map +1 -0
  636. package/dist/services/definitions/jellyfin.cjs +2 -3
  637. package/dist/services/definitions/jellyfin.cjs.map +1 -1
  638. package/dist/services/definitions/jellyfin.mjs +1 -1
  639. package/dist/services/definitions/jenkins.cjs +2 -3
  640. package/dist/services/definitions/jenkins.cjs.map +1 -1
  641. package/dist/services/definitions/jenkins.mjs +1 -1
  642. package/dist/services/definitions/jitsi-meet.cjs +102 -0
  643. package/dist/services/definitions/jitsi-meet.cjs.map +1 -0
  644. package/dist/services/definitions/jitsi-meet.d.cts +7 -0
  645. package/dist/services/definitions/jitsi-meet.d.cts.map +1 -0
  646. package/dist/services/definitions/jitsi-meet.d.mts +7 -0
  647. package/dist/services/definitions/jitsi-meet.d.mts.map +1 -0
  648. package/dist/services/definitions/jitsi-meet.mjs +101 -0
  649. package/dist/services/definitions/jitsi-meet.mjs.map +1 -0
  650. package/dist/services/definitions/keycloak.cjs +122 -0
  651. package/dist/services/definitions/keycloak.cjs.map +1 -0
  652. package/dist/services/definitions/keycloak.d.cts +7 -0
  653. package/dist/services/definitions/keycloak.d.cts.map +1 -0
  654. package/dist/services/definitions/keycloak.d.mts +7 -0
  655. package/dist/services/definitions/keycloak.d.mts.map +1 -0
  656. package/dist/services/definitions/keycloak.mjs +121 -0
  657. package/dist/services/definitions/keycloak.mjs.map +1 -0
  658. package/dist/services/definitions/kimi.cjs +2 -3
  659. package/dist/services/definitions/kimi.cjs.map +1 -1
  660. package/dist/services/definitions/kimi.mjs +1 -1
  661. package/dist/services/definitions/kong.cjs +121 -0
  662. package/dist/services/definitions/kong.cjs.map +1 -0
  663. package/dist/services/definitions/kong.d.cts +7 -0
  664. package/dist/services/definitions/kong.d.cts.map +1 -0
  665. package/dist/services/definitions/kong.d.mts +7 -0
  666. package/dist/services/definitions/kong.d.mts.map +1 -0
  667. package/dist/services/definitions/kong.mjs +120 -0
  668. package/dist/services/definitions/kong.mjs.map +1 -0
  669. package/dist/services/definitions/lago.cjs +95 -0
  670. package/dist/services/definitions/lago.cjs.map +1 -0
  671. package/dist/services/definitions/lago.d.cts +7 -0
  672. package/dist/services/definitions/lago.d.cts.map +1 -0
  673. package/dist/services/definitions/lago.d.mts +7 -0
  674. package/dist/services/definitions/lago.d.mts.map +1 -0
  675. package/dist/services/definitions/lago.mjs +94 -0
  676. package/dist/services/definitions/lago.mjs.map +1 -0
  677. package/dist/services/definitions/langflow.cjs +88 -0
  678. package/dist/services/definitions/langflow.cjs.map +1 -0
  679. package/dist/services/definitions/langflow.d.cts +7 -0
  680. package/dist/services/definitions/langflow.d.cts.map +1 -0
  681. package/dist/services/definitions/langflow.d.mts +7 -0
  682. package/dist/services/definitions/langflow.d.mts.map +1 -0
  683. package/dist/services/definitions/langflow.mjs +87 -0
  684. package/dist/services/definitions/langflow.mjs.map +1 -0
  685. package/dist/services/definitions/langfuse.cjs +79 -0
  686. package/dist/services/definitions/langfuse.cjs.map +1 -0
  687. package/dist/services/definitions/langfuse.d.cts +7 -0
  688. package/dist/services/definitions/langfuse.d.cts.map +1 -0
  689. package/dist/services/definitions/langfuse.d.mts +7 -0
  690. package/dist/services/definitions/langfuse.d.mts.map +1 -0
  691. package/dist/services/definitions/langfuse.mjs +78 -0
  692. package/dist/services/definitions/langfuse.mjs.map +1 -0
  693. package/dist/services/definitions/lasuite-meet-agents.cjs +2 -3
  694. package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -1
  695. package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
  696. package/dist/services/definitions/lasuite-meet-backend.cjs +2 -3
  697. package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -1
  698. package/dist/services/definitions/lasuite-meet-backend.mjs +1 -1
  699. package/dist/services/definitions/lasuite-meet-frontend.cjs +2 -3
  700. package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -1
  701. package/dist/services/definitions/lasuite-meet-frontend.mjs +1 -1
  702. package/dist/services/definitions/librechat.cjs +2 -3
  703. package/dist/services/definitions/librechat.cjs.map +1 -1
  704. package/dist/services/definitions/librechat.mjs +1 -1
  705. package/dist/services/definitions/lightpanda.cjs +2 -3
  706. package/dist/services/definitions/lightpanda.cjs.map +1 -1
  707. package/dist/services/definitions/lightpanda.mjs +1 -1
  708. package/dist/services/definitions/listmonk.cjs +118 -0
  709. package/dist/services/definitions/listmonk.cjs.map +1 -0
  710. package/dist/services/definitions/listmonk.d.cts +7 -0
  711. package/dist/services/definitions/listmonk.d.cts.map +1 -0
  712. package/dist/services/definitions/listmonk.d.mts +7 -0
  713. package/dist/services/definitions/listmonk.d.mts.map +1 -0
  714. package/dist/services/definitions/listmonk.mjs +117 -0
  715. package/dist/services/definitions/listmonk.mjs.map +1 -0
  716. package/dist/services/definitions/litellm.cjs +2 -3
  717. package/dist/services/definitions/litellm.cjs.map +1 -1
  718. package/dist/services/definitions/litellm.mjs +1 -1
  719. package/dist/services/definitions/livekit.cjs +2 -3
  720. package/dist/services/definitions/livekit.cjs.map +1 -1
  721. package/dist/services/definitions/livekit.mjs +1 -1
  722. package/dist/services/definitions/local-ai.cjs +86 -0
  723. package/dist/services/definitions/local-ai.cjs.map +1 -0
  724. package/dist/services/definitions/local-ai.d.cts +7 -0
  725. package/dist/services/definitions/local-ai.d.cts.map +1 -0
  726. package/dist/services/definitions/local-ai.d.mts +7 -0
  727. package/dist/services/definitions/local-ai.d.mts.map +1 -0
  728. package/dist/services/definitions/local-ai.mjs +85 -0
  729. package/dist/services/definitions/local-ai.mjs.map +1 -0
  730. package/dist/services/definitions/loki.cjs +2 -3
  731. package/dist/services/definitions/loki.cjs.map +1 -1
  732. package/dist/services/definitions/loki.mjs +1 -1
  733. package/dist/services/definitions/mariadb.cjs +81 -0
  734. package/dist/services/definitions/mariadb.cjs.map +1 -0
  735. package/dist/services/definitions/mariadb.d.cts +7 -0
  736. package/dist/services/definitions/mariadb.d.cts.map +1 -0
  737. package/dist/services/definitions/mariadb.d.mts +7 -0
  738. package/dist/services/definitions/mariadb.d.mts.map +1 -0
  739. package/dist/services/definitions/mariadb.mjs +80 -0
  740. package/dist/services/definitions/mariadb.mjs.map +1 -0
  741. package/dist/services/definitions/matomo.cjs +2 -3
  742. package/dist/services/definitions/matomo.cjs.map +1 -1
  743. package/dist/services/definitions/matomo.mjs +1 -1
  744. package/dist/services/definitions/matrix-synapse.cjs +2 -3
  745. package/dist/services/definitions/matrix-synapse.cjs.map +1 -1
  746. package/dist/services/definitions/matrix-synapse.mjs +1 -1
  747. package/dist/services/definitions/mattermost.cjs +2 -3
  748. package/dist/services/definitions/mattermost.cjs.map +1 -1
  749. package/dist/services/definitions/mattermost.mjs +1 -1
  750. package/dist/services/definitions/mautic.cjs +83 -0
  751. package/dist/services/definitions/mautic.cjs.map +1 -0
  752. package/dist/services/definitions/mautic.d.cts +7 -0
  753. package/dist/services/definitions/mautic.d.cts.map +1 -0
  754. package/dist/services/definitions/mautic.d.mts +7 -0
  755. package/dist/services/definitions/mautic.d.mts.map +1 -0
  756. package/dist/services/definitions/mautic.mjs +82 -0
  757. package/dist/services/definitions/mautic.mjs.map +1 -0
  758. package/dist/services/definitions/medusa.cjs +83 -0
  759. package/dist/services/definitions/medusa.cjs.map +1 -0
  760. package/dist/services/definitions/medusa.d.cts +7 -0
  761. package/dist/services/definitions/medusa.d.cts.map +1 -0
  762. package/dist/services/definitions/medusa.d.mts +7 -0
  763. package/dist/services/definitions/medusa.d.mts.map +1 -0
  764. package/dist/services/definitions/medusa.mjs +82 -0
  765. package/dist/services/definitions/medusa.mjs.map +1 -0
  766. package/dist/services/definitions/meilisearch.cjs +2 -3
  767. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  768. package/dist/services/definitions/meilisearch.mjs +1 -1
  769. package/dist/services/definitions/metabase.cjs +108 -0
  770. package/dist/services/definitions/metabase.cjs.map +1 -0
  771. package/dist/services/definitions/metabase.d.cts +7 -0
  772. package/dist/services/definitions/metabase.d.cts.map +1 -0
  773. package/dist/services/definitions/metabase.d.mts +7 -0
  774. package/dist/services/definitions/metabase.d.mts.map +1 -0
  775. package/dist/services/definitions/metabase.mjs +107 -0
  776. package/dist/services/definitions/metabase.mjs.map +1 -0
  777. package/dist/services/definitions/milvus.cjs +2 -3
  778. package/dist/services/definitions/milvus.cjs.map +1 -1
  779. package/dist/services/definitions/milvus.mjs +1 -1
  780. package/dist/services/definitions/minio.cjs +2 -3
  781. package/dist/services/definitions/minio.cjs.map +1 -1
  782. package/dist/services/definitions/minio.mjs +1 -1
  783. package/dist/services/definitions/mission-control.cjs +2 -3
  784. package/dist/services/definitions/mission-control.cjs.map +1 -1
  785. package/dist/services/definitions/mission-control.mjs +1 -1
  786. package/dist/services/definitions/mixpost.cjs +2 -3
  787. package/dist/services/definitions/mixpost.cjs.map +1 -1
  788. package/dist/services/definitions/mixpost.mjs +1 -1
  789. package/dist/services/definitions/mosquitto.cjs +82 -0
  790. package/dist/services/definitions/mosquitto.cjs.map +1 -0
  791. package/dist/services/definitions/mosquitto.d.cts +7 -0
  792. package/dist/services/definitions/mosquitto.d.cts.map +1 -0
  793. package/dist/services/definitions/mosquitto.d.mts +7 -0
  794. package/dist/services/definitions/mosquitto.d.mts.map +1 -0
  795. package/dist/services/definitions/mosquitto.mjs +81 -0
  796. package/dist/services/definitions/mosquitto.mjs.map +1 -0
  797. package/dist/services/definitions/motion-canvas.cjs +2 -3
  798. package/dist/services/definitions/motion-canvas.cjs.map +1 -1
  799. package/dist/services/definitions/motion-canvas.mjs +1 -1
  800. package/dist/services/definitions/mysql.cjs +81 -0
  801. package/dist/services/definitions/mysql.cjs.map +1 -0
  802. package/dist/services/definitions/mysql.d.cts +7 -0
  803. package/dist/services/definitions/mysql.d.cts.map +1 -0
  804. package/dist/services/definitions/mysql.d.mts +7 -0
  805. package/dist/services/definitions/mysql.d.mts.map +1 -0
  806. package/dist/services/definitions/mysql.mjs +80 -0
  807. package/dist/services/definitions/mysql.mjs.map +1 -0
  808. package/dist/services/definitions/n8n.cjs +2 -3
  809. package/dist/services/definitions/n8n.cjs.map +1 -1
  810. package/dist/services/definitions/n8n.mjs +1 -1
  811. package/dist/services/definitions/navidrome.cjs +90 -0
  812. package/dist/services/definitions/navidrome.cjs.map +1 -0
  813. package/dist/services/definitions/navidrome.d.cts +7 -0
  814. package/dist/services/definitions/navidrome.d.cts.map +1 -0
  815. package/dist/services/definitions/navidrome.d.mts +7 -0
  816. package/dist/services/definitions/navidrome.d.mts.map +1 -0
  817. package/dist/services/definitions/navidrome.mjs +89 -0
  818. package/dist/services/definitions/navidrome.mjs.map +1 -0
  819. package/dist/services/definitions/neo4j.cjs +2 -3
  820. package/dist/services/definitions/neo4j.cjs.map +1 -1
  821. package/dist/services/definitions/neo4j.mjs +1 -1
  822. package/dist/services/definitions/nextcloud.cjs +2 -3
  823. package/dist/services/definitions/nextcloud.cjs.map +1 -1
  824. package/dist/services/definitions/nextcloud.mjs +1 -1
  825. package/dist/services/definitions/nginx-proxy-manager.cjs +71 -0
  826. package/dist/services/definitions/nginx-proxy-manager.cjs.map +1 -0
  827. package/dist/services/definitions/nginx-proxy-manager.d.cts +7 -0
  828. package/dist/services/definitions/nginx-proxy-manager.d.cts.map +1 -0
  829. package/dist/services/definitions/nginx-proxy-manager.d.mts +7 -0
  830. package/dist/services/definitions/nginx-proxy-manager.d.mts.map +1 -0
  831. package/dist/services/definitions/nginx-proxy-manager.mjs +70 -0
  832. package/dist/services/definitions/nginx-proxy-manager.mjs.map +1 -0
  833. package/dist/services/definitions/nocodb.cjs +2 -3
  834. package/dist/services/definitions/nocodb.cjs.map +1 -1
  835. package/dist/services/definitions/nocodb.mjs +1 -1
  836. package/dist/services/definitions/node-red.cjs +77 -0
  837. package/dist/services/definitions/node-red.cjs.map +1 -0
  838. package/dist/services/definitions/node-red.d.cts +7 -0
  839. package/dist/services/definitions/node-red.d.cts.map +1 -0
  840. package/dist/services/definitions/node-red.d.mts +7 -0
  841. package/dist/services/definitions/node-red.d.mts.map +1 -0
  842. package/dist/services/definitions/node-red.mjs +76 -0
  843. package/dist/services/definitions/node-red.mjs.map +1 -0
  844. package/dist/services/definitions/ntfy.cjs +2 -3
  845. package/dist/services/definitions/ntfy.cjs.map +1 -1
  846. package/dist/services/definitions/ntfy.mjs +1 -1
  847. package/dist/services/definitions/ollama.cjs +2 -3
  848. package/dist/services/definitions/ollama.cjs.map +1 -1
  849. package/dist/services/definitions/ollama.mjs +1 -1
  850. package/dist/services/definitions/open-webui.cjs +2 -3
  851. package/dist/services/definitions/open-webui.cjs.map +1 -1
  852. package/dist/services/definitions/open-webui.mjs +1 -1
  853. package/dist/services/definitions/opencode.cjs +2 -3
  854. package/dist/services/definitions/opencode.cjs.map +1 -1
  855. package/dist/services/definitions/opencode.mjs +1 -1
  856. package/dist/services/definitions/openhands.cjs +58 -0
  857. package/dist/services/definitions/openhands.cjs.map +1 -0
  858. package/dist/services/definitions/openhands.d.cts +7 -0
  859. package/dist/services/definitions/openhands.d.cts.map +1 -0
  860. package/dist/services/definitions/openhands.d.mts +7 -0
  861. package/dist/services/definitions/openhands.d.mts.map +1 -0
  862. package/dist/services/definitions/openhands.mjs +57 -0
  863. package/dist/services/definitions/openhands.mjs.map +1 -0
  864. package/dist/services/definitions/openpanel.cjs +2 -3
  865. package/dist/services/definitions/openpanel.cjs.map +1 -1
  866. package/dist/services/definitions/openpanel.mjs +1 -1
  867. package/dist/services/definitions/opensearch.cjs +94 -0
  868. package/dist/services/definitions/opensearch.cjs.map +1 -0
  869. package/dist/services/definitions/opensearch.d.cts +7 -0
  870. package/dist/services/definitions/opensearch.d.cts.map +1 -0
  871. package/dist/services/definitions/opensearch.d.mts +7 -0
  872. package/dist/services/definitions/opensearch.d.mts.map +1 -0
  873. package/dist/services/definitions/opensearch.mjs +93 -0
  874. package/dist/services/definitions/opensearch.mjs.map +1 -0
  875. package/dist/services/definitions/outline.cjs +2 -3
  876. package/dist/services/definitions/outline.cjs.map +1 -1
  877. package/dist/services/definitions/outline.mjs +1 -1
  878. package/dist/services/definitions/paperless-ngx.cjs +2 -3
  879. package/dist/services/definitions/paperless-ngx.cjs.map +1 -1
  880. package/dist/services/definitions/paperless-ngx.mjs +1 -1
  881. package/dist/services/definitions/pentagi.cjs +2 -3
  882. package/dist/services/definitions/pentagi.cjs.map +1 -1
  883. package/dist/services/definitions/pentagi.mjs +1 -1
  884. package/dist/services/definitions/pentestagent.cjs +2 -3
  885. package/dist/services/definitions/pentestagent.cjs.map +1 -1
  886. package/dist/services/definitions/pentestagent.mjs +1 -1
  887. package/dist/services/definitions/photoprism.cjs +126 -0
  888. package/dist/services/definitions/photoprism.cjs.map +1 -0
  889. package/dist/services/definitions/photoprism.d.cts +7 -0
  890. package/dist/services/definitions/photoprism.d.cts.map +1 -0
  891. package/dist/services/definitions/photoprism.d.mts +7 -0
  892. package/dist/services/definitions/photoprism.d.mts.map +1 -0
  893. package/dist/services/definitions/photoprism.mjs +125 -0
  894. package/dist/services/definitions/photoprism.mjs.map +1 -0
  895. package/dist/services/definitions/pihole.cjs +73 -0
  896. package/dist/services/definitions/pihole.cjs.map +1 -0
  897. package/dist/services/definitions/pihole.d.cts +7 -0
  898. package/dist/services/definitions/pihole.d.cts.map +1 -0
  899. package/dist/services/definitions/pihole.d.mts +7 -0
  900. package/dist/services/definitions/pihole.d.mts.map +1 -0
  901. package/dist/services/definitions/pihole.mjs +72 -0
  902. package/dist/services/definitions/pihole.mjs.map +1 -0
  903. package/dist/services/definitions/piper-tts.cjs +70 -0
  904. package/dist/services/definitions/piper-tts.cjs.map +1 -0
  905. package/dist/services/definitions/piper-tts.d.cts +7 -0
  906. package/dist/services/definitions/piper-tts.d.cts.map +1 -0
  907. package/dist/services/definitions/piper-tts.d.mts +7 -0
  908. package/dist/services/definitions/piper-tts.d.mts.map +1 -0
  909. package/dist/services/definitions/piper-tts.mjs +69 -0
  910. package/dist/services/definitions/piper-tts.mjs.map +1 -0
  911. package/dist/services/definitions/plane.cjs +75 -0
  912. package/dist/services/definitions/plane.cjs.map +1 -0
  913. package/dist/services/definitions/plane.d.cts +7 -0
  914. package/dist/services/definitions/plane.d.cts.map +1 -0
  915. package/dist/services/definitions/plane.d.mts +7 -0
  916. package/dist/services/definitions/plane.d.mts.map +1 -0
  917. package/dist/services/definitions/plane.mjs +74 -0
  918. package/dist/services/definitions/plane.mjs.map +1 -0
  919. package/dist/services/definitions/plausible.cjs +94 -0
  920. package/dist/services/definitions/plausible.cjs.map +1 -0
  921. package/dist/services/definitions/plausible.d.cts +7 -0
  922. package/dist/services/definitions/plausible.d.cts.map +1 -0
  923. package/dist/services/definitions/plausible.d.mts +7 -0
  924. package/dist/services/definitions/plausible.d.mts.map +1 -0
  925. package/dist/services/definitions/plausible.mjs +93 -0
  926. package/dist/services/definitions/plausible.mjs.map +1 -0
  927. package/dist/services/definitions/playwright-server.cjs +2 -3
  928. package/dist/services/definitions/playwright-server.cjs.map +1 -1
  929. package/dist/services/definitions/playwright-server.mjs +1 -1
  930. package/dist/services/definitions/pocket-id.cjs +101 -0
  931. package/dist/services/definitions/pocket-id.cjs.map +1 -0
  932. package/dist/services/definitions/pocket-id.d.cts +7 -0
  933. package/dist/services/definitions/pocket-id.d.cts.map +1 -0
  934. package/dist/services/definitions/pocket-id.d.mts +7 -0
  935. package/dist/services/definitions/pocket-id.d.mts.map +1 -0
  936. package/dist/services/definitions/pocket-id.mjs +100 -0
  937. package/dist/services/definitions/pocket-id.mjs.map +1 -0
  938. package/dist/services/definitions/pocketbase.cjs +61 -0
  939. package/dist/services/definitions/pocketbase.cjs.map +1 -0
  940. package/dist/services/definitions/pocketbase.d.cts +7 -0
  941. package/dist/services/definitions/pocketbase.d.cts.map +1 -0
  942. package/dist/services/definitions/pocketbase.d.mts +7 -0
  943. package/dist/services/definitions/pocketbase.d.mts.map +1 -0
  944. package/dist/services/definitions/pocketbase.mjs +60 -0
  945. package/dist/services/definitions/pocketbase.mjs.map +1 -0
  946. package/dist/services/definitions/portainer.cjs +2 -3
  947. package/dist/services/definitions/portainer.cjs.map +1 -1
  948. package/dist/services/definitions/portainer.mjs +1 -1
  949. package/dist/services/definitions/postgresql.cjs +2 -3
  950. package/dist/services/definitions/postgresql.cjs.map +1 -1
  951. package/dist/services/definitions/postgresql.mjs +1 -1
  952. package/dist/services/definitions/posthog.cjs +94 -0
  953. package/dist/services/definitions/posthog.cjs.map +1 -0
  954. package/dist/services/definitions/posthog.d.cts +7 -0
  955. package/dist/services/definitions/posthog.d.cts.map +1 -0
  956. package/dist/services/definitions/posthog.d.mts +7 -0
  957. package/dist/services/definitions/posthog.d.mts.map +1 -0
  958. package/dist/services/definitions/posthog.mjs +93 -0
  959. package/dist/services/definitions/posthog.mjs.map +1 -0
  960. package/dist/services/definitions/postiz.cjs +2 -3
  961. package/dist/services/definitions/postiz.cjs.map +1 -1
  962. package/dist/services/definitions/postiz.mjs +1 -1
  963. package/dist/services/definitions/prometheus.cjs +2 -3
  964. package/dist/services/definitions/prometheus.cjs.map +1 -1
  965. package/dist/services/definitions/prometheus.mjs +1 -1
  966. package/dist/services/definitions/qdrant.cjs +2 -3
  967. package/dist/services/definitions/qdrant.cjs.map +1 -1
  968. package/dist/services/definitions/qdrant.mjs +1 -1
  969. package/dist/services/definitions/rabbitmq.cjs +80 -0
  970. package/dist/services/definitions/rabbitmq.cjs.map +1 -0
  971. package/dist/services/definitions/rabbitmq.d.cts +7 -0
  972. package/dist/services/definitions/rabbitmq.d.cts.map +1 -0
  973. package/dist/services/definitions/rabbitmq.d.mts +7 -0
  974. package/dist/services/definitions/rabbitmq.d.mts.map +1 -0
  975. package/dist/services/definitions/rabbitmq.mjs +79 -0
  976. package/dist/services/definitions/rabbitmq.mjs.map +1 -0
  977. package/dist/services/definitions/ragflow.cjs +192 -0
  978. package/dist/services/definitions/ragflow.cjs.map +1 -0
  979. package/dist/services/definitions/ragflow.d.cts +7 -0
  980. package/dist/services/definitions/ragflow.d.cts.map +1 -0
  981. package/dist/services/definitions/ragflow.d.mts +7 -0
  982. package/dist/services/definitions/ragflow.d.mts.map +1 -0
  983. package/dist/services/definitions/ragflow.mjs +191 -0
  984. package/dist/services/definitions/ragflow.mjs.map +1 -0
  985. package/dist/services/definitions/redis.cjs +3 -4
  986. package/dist/services/definitions/redis.cjs.map +1 -1
  987. package/dist/services/definitions/redis.mjs +2 -2
  988. package/dist/services/definitions/redis.mjs.map +1 -1
  989. package/dist/services/definitions/remotion.cjs +2 -3
  990. package/dist/services/definitions/remotion.cjs.map +1 -1
  991. package/dist/services/definitions/remotion.mjs +1 -1
  992. package/dist/services/definitions/restic.cjs +58 -0
  993. package/dist/services/definitions/restic.cjs.map +1 -0
  994. package/dist/services/definitions/restic.d.cts +7 -0
  995. package/dist/services/definitions/restic.d.cts.map +1 -0
  996. package/dist/services/definitions/restic.d.mts +7 -0
  997. package/dist/services/definitions/restic.d.mts.map +1 -0
  998. package/dist/services/definitions/restic.mjs +57 -0
  999. package/dist/services/definitions/restic.mjs.map +1 -0
  1000. package/dist/services/definitions/revolt.cjs +64 -0
  1001. package/dist/services/definitions/revolt.cjs.map +1 -0
  1002. package/dist/services/definitions/revolt.d.cts +7 -0
  1003. package/dist/services/definitions/revolt.d.cts.map +1 -0
  1004. package/dist/services/definitions/revolt.d.mts +7 -0
  1005. package/dist/services/definitions/revolt.d.mts.map +1 -0
  1006. package/dist/services/definitions/revolt.mjs +63 -0
  1007. package/dist/services/definitions/revolt.mjs.map +1 -0
  1008. package/dist/services/definitions/rocketchat.cjs +2 -3
  1009. package/dist/services/definitions/rocketchat.cjs.map +1 -1
  1010. package/dist/services/definitions/rocketchat.mjs +1 -1
  1011. package/dist/services/definitions/saleor.cjs +76 -0
  1012. package/dist/services/definitions/saleor.cjs.map +1 -0
  1013. package/dist/services/definitions/saleor.d.cts +7 -0
  1014. package/dist/services/definitions/saleor.d.cts.map +1 -0
  1015. package/dist/services/definitions/saleor.d.mts +7 -0
  1016. package/dist/services/definitions/saleor.d.mts.map +1 -0
  1017. package/dist/services/definitions/saleor.mjs +75 -0
  1018. package/dist/services/definitions/saleor.mjs.map +1 -0
  1019. package/dist/services/definitions/scrapling.cjs +2 -3
  1020. package/dist/services/definitions/scrapling.cjs.map +1 -1
  1021. package/dist/services/definitions/scrapling.mjs +1 -1
  1022. package/dist/services/definitions/searxng.cjs +2 -3
  1023. package/dist/services/definitions/searxng.cjs.map +1 -1
  1024. package/dist/services/definitions/searxng.mjs +1 -1
  1025. package/dist/services/definitions/sentry.cjs +101 -0
  1026. package/dist/services/definitions/sentry.cjs.map +1 -0
  1027. package/dist/services/definitions/sentry.d.cts +7 -0
  1028. package/dist/services/definitions/sentry.d.cts.map +1 -0
  1029. package/dist/services/definitions/sentry.d.mts +7 -0
  1030. package/dist/services/definitions/sentry.d.mts.map +1 -0
  1031. package/dist/services/definitions/sentry.mjs +100 -0
  1032. package/dist/services/definitions/sentry.mjs.map +1 -0
  1033. package/dist/services/definitions/signoz.cjs +2 -3
  1034. package/dist/services/definitions/signoz.cjs.map +1 -1
  1035. package/dist/services/definitions/signoz.mjs +1 -1
  1036. package/dist/services/definitions/solidityguard.cjs +2 -3
  1037. package/dist/services/definitions/solidityguard.cjs.map +1 -1
  1038. package/dist/services/definitions/solidityguard.mjs +1 -1
  1039. package/dist/services/definitions/sonarqube.cjs +86 -0
  1040. package/dist/services/definitions/sonarqube.cjs.map +1 -0
  1041. package/dist/services/definitions/sonarqube.d.cts +7 -0
  1042. package/dist/services/definitions/sonarqube.d.cts.map +1 -0
  1043. package/dist/services/definitions/sonarqube.d.mts +7 -0
  1044. package/dist/services/definitions/sonarqube.d.mts.map +1 -0
  1045. package/dist/services/definitions/sonarqube.mjs +85 -0
  1046. package/dist/services/definitions/sonarqube.mjs.map +1 -0
  1047. package/dist/services/definitions/stable-diffusion.cjs +2 -3
  1048. package/dist/services/definitions/stable-diffusion.cjs.map +1 -1
  1049. package/dist/services/definitions/stable-diffusion.mjs +1 -1
  1050. package/dist/services/definitions/steel-browser.cjs +2 -3
  1051. package/dist/services/definitions/steel-browser.cjs.map +1 -1
  1052. package/dist/services/definitions/steel-browser.mjs +1 -1
  1053. package/dist/services/definitions/stirling-pdf.cjs +74 -0
  1054. package/dist/services/definitions/stirling-pdf.cjs.map +1 -0
  1055. package/dist/services/definitions/stirling-pdf.d.cts +7 -0
  1056. package/dist/services/definitions/stirling-pdf.d.cts.map +1 -0
  1057. package/dist/services/definitions/stirling-pdf.d.mts +7 -0
  1058. package/dist/services/definitions/stirling-pdf.d.mts.map +1 -0
  1059. package/dist/services/definitions/stirling-pdf.mjs +73 -0
  1060. package/dist/services/definitions/stirling-pdf.mjs.map +1 -0
  1061. package/dist/services/definitions/strapi.cjs +124 -0
  1062. package/dist/services/definitions/strapi.cjs.map +1 -0
  1063. package/dist/services/definitions/strapi.d.cts +7 -0
  1064. package/dist/services/definitions/strapi.d.cts.map +1 -0
  1065. package/dist/services/definitions/strapi.d.mts +7 -0
  1066. package/dist/services/definitions/strapi.d.mts.map +1 -0
  1067. package/dist/services/definitions/strapi.mjs +123 -0
  1068. package/dist/services/definitions/strapi.mjs.map +1 -0
  1069. package/dist/services/definitions/stream-gateway.cjs +2 -3
  1070. package/dist/services/definitions/stream-gateway.cjs.map +1 -1
  1071. package/dist/services/definitions/stream-gateway.mjs +1 -1
  1072. package/dist/services/definitions/supabase.cjs +2 -3
  1073. package/dist/services/definitions/supabase.cjs.map +1 -1
  1074. package/dist/services/definitions/supabase.mjs +1 -1
  1075. package/dist/services/definitions/superset.cjs +77 -0
  1076. package/dist/services/definitions/superset.cjs.map +1 -0
  1077. package/dist/services/definitions/superset.d.cts +7 -0
  1078. package/dist/services/definitions/superset.d.cts.map +1 -0
  1079. package/dist/services/definitions/superset.d.mts +7 -0
  1080. package/dist/services/definitions/superset.d.mts.map +1 -0
  1081. package/dist/services/definitions/superset.mjs +76 -0
  1082. package/dist/services/definitions/superset.mjs.map +1 -0
  1083. package/dist/services/definitions/surrealdb.cjs +72 -0
  1084. package/dist/services/definitions/surrealdb.cjs.map +1 -0
  1085. package/dist/services/definitions/surrealdb.d.cts +7 -0
  1086. package/dist/services/definitions/surrealdb.d.cts.map +1 -0
  1087. package/dist/services/definitions/surrealdb.d.mts +7 -0
  1088. package/dist/services/definitions/surrealdb.d.mts.map +1 -0
  1089. package/dist/services/definitions/surrealdb.mjs +71 -0
  1090. package/dist/services/definitions/surrealdb.mjs.map +1 -0
  1091. package/dist/services/definitions/tabby-ml.cjs +70 -0
  1092. package/dist/services/definitions/tabby-ml.cjs.map +1 -0
  1093. package/dist/services/definitions/tabby-ml.d.cts +7 -0
  1094. package/dist/services/definitions/tabby-ml.d.cts.map +1 -0
  1095. package/dist/services/definitions/tabby-ml.d.mts +7 -0
  1096. package/dist/services/definitions/tabby-ml.d.mts.map +1 -0
  1097. package/dist/services/definitions/tabby-ml.mjs +69 -0
  1098. package/dist/services/definitions/tabby-ml.mjs.map +1 -0
  1099. package/dist/services/definitions/tailscale.cjs +2 -3
  1100. package/dist/services/definitions/tailscale.cjs.map +1 -1
  1101. package/dist/services/definitions/tailscale.mjs +1 -1
  1102. package/dist/services/definitions/tempo.cjs +57 -0
  1103. package/dist/services/definitions/tempo.cjs.map +1 -0
  1104. package/dist/services/definitions/tempo.d.cts +7 -0
  1105. package/dist/services/definitions/tempo.d.cts.map +1 -0
  1106. package/dist/services/definitions/tempo.d.mts +7 -0
  1107. package/dist/services/definitions/tempo.d.mts.map +1 -0
  1108. package/dist/services/definitions/tempo.mjs +56 -0
  1109. package/dist/services/definitions/tempo.mjs.map +1 -0
  1110. package/dist/services/definitions/temporal.cjs +2 -3
  1111. package/dist/services/definitions/temporal.cjs.map +1 -1
  1112. package/dist/services/definitions/temporal.mjs +1 -1
  1113. package/dist/services/definitions/text-gen-webui.cjs +88 -0
  1114. package/dist/services/definitions/text-gen-webui.cjs.map +1 -0
  1115. package/dist/services/definitions/text-gen-webui.d.cts +7 -0
  1116. package/dist/services/definitions/text-gen-webui.d.cts.map +1 -0
  1117. package/dist/services/definitions/text-gen-webui.d.mts +7 -0
  1118. package/dist/services/definitions/text-gen-webui.d.mts.map +1 -0
  1119. package/dist/services/definitions/text-gen-webui.mjs +87 -0
  1120. package/dist/services/definitions/text-gen-webui.mjs.map +1 -0
  1121. package/dist/services/definitions/timescaledb.cjs +87 -0
  1122. package/dist/services/definitions/timescaledb.cjs.map +1 -0
  1123. package/dist/services/definitions/timescaledb.d.cts +7 -0
  1124. package/dist/services/definitions/timescaledb.d.cts.map +1 -0
  1125. package/dist/services/definitions/timescaledb.d.mts +7 -0
  1126. package/dist/services/definitions/timescaledb.d.mts.map +1 -0
  1127. package/dist/services/definitions/timescaledb.mjs +86 -0
  1128. package/dist/services/definitions/timescaledb.mjs.map +1 -0
  1129. package/dist/services/definitions/traefik.cjs +2 -3
  1130. package/dist/services/definitions/traefik.cjs.map +1 -1
  1131. package/dist/services/definitions/traefik.mjs +1 -1
  1132. package/dist/services/definitions/twenty.cjs +83 -0
  1133. package/dist/services/definitions/twenty.cjs.map +1 -0
  1134. package/dist/services/definitions/twenty.d.cts +7 -0
  1135. package/dist/services/definitions/twenty.d.cts.map +1 -0
  1136. package/dist/services/definitions/twenty.d.mts +7 -0
  1137. package/dist/services/definitions/twenty.d.mts.map +1 -0
  1138. package/dist/services/definitions/twenty.mjs +82 -0
  1139. package/dist/services/definitions/twenty.mjs.map +1 -0
  1140. package/dist/services/definitions/umami.cjs +2 -3
  1141. package/dist/services/definitions/umami.cjs.map +1 -1
  1142. package/dist/services/definitions/umami.mjs +1 -1
  1143. package/dist/services/definitions/uptime-kuma.cjs +2 -3
  1144. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  1145. package/dist/services/definitions/uptime-kuma.mjs +1 -1
  1146. package/dist/services/definitions/usesend.cjs +2 -3
  1147. package/dist/services/definitions/usesend.cjs.map +1 -1
  1148. package/dist/services/definitions/usesend.mjs +1 -1
  1149. package/dist/services/definitions/valkey.cjs +3 -4
  1150. package/dist/services/definitions/valkey.cjs.map +1 -1
  1151. package/dist/services/definitions/valkey.mjs +2 -2
  1152. package/dist/services/definitions/valkey.mjs.map +1 -1
  1153. package/dist/services/definitions/vault.cjs +71 -0
  1154. package/dist/services/definitions/vault.cjs.map +1 -0
  1155. package/dist/services/definitions/vault.d.cts +7 -0
  1156. package/dist/services/definitions/vault.d.cts.map +1 -0
  1157. package/dist/services/definitions/vault.d.mts +7 -0
  1158. package/dist/services/definitions/vault.d.mts.map +1 -0
  1159. package/dist/services/definitions/vault.mjs +70 -0
  1160. package/dist/services/definitions/vault.mjs.map +1 -0
  1161. package/dist/services/definitions/vaultwarden.cjs +2 -3
  1162. package/dist/services/definitions/vaultwarden.cjs.map +1 -1
  1163. package/dist/services/definitions/vaultwarden.mjs +1 -1
  1164. package/dist/services/definitions/vector-log.cjs +59 -0
  1165. package/dist/services/definitions/vector-log.cjs.map +1 -0
  1166. package/dist/services/definitions/vector-log.d.cts +7 -0
  1167. package/dist/services/definitions/vector-log.d.cts.map +1 -0
  1168. package/dist/services/definitions/vector-log.d.mts +7 -0
  1169. package/dist/services/definitions/vector-log.d.mts.map +1 -0
  1170. package/dist/services/definitions/vector-log.mjs +58 -0
  1171. package/dist/services/definitions/vector-log.mjs.map +1 -0
  1172. package/dist/services/definitions/vikunja.cjs +96 -0
  1173. package/dist/services/definitions/vikunja.cjs.map +1 -0
  1174. package/dist/services/definitions/vikunja.d.cts +7 -0
  1175. package/dist/services/definitions/vikunja.d.cts.map +1 -0
  1176. package/dist/services/definitions/vikunja.d.mts +7 -0
  1177. package/dist/services/definitions/vikunja.d.mts.map +1 -0
  1178. package/dist/services/definitions/vikunja.mjs +95 -0
  1179. package/dist/services/definitions/vikunja.mjs.map +1 -0
  1180. package/dist/services/definitions/watchtower.cjs +2 -3
  1181. package/dist/services/definitions/watchtower.cjs.map +1 -1
  1182. package/dist/services/definitions/watchtower.mjs +1 -1
  1183. package/dist/services/definitions/weaviate.cjs +2 -3
  1184. package/dist/services/definitions/weaviate.cjs.map +1 -1
  1185. package/dist/services/definitions/weaviate.mjs +1 -1
  1186. package/dist/services/definitions/whisper.cjs +2 -3
  1187. package/dist/services/definitions/whisper.cjs.map +1 -1
  1188. package/dist/services/definitions/whisper.mjs +1 -1
  1189. package/dist/services/definitions/wireguard.cjs +88 -0
  1190. package/dist/services/definitions/wireguard.cjs.map +1 -0
  1191. package/dist/services/definitions/wireguard.d.cts +7 -0
  1192. package/dist/services/definitions/wireguard.d.cts.map +1 -0
  1193. package/dist/services/definitions/wireguard.d.mts +7 -0
  1194. package/dist/services/definitions/wireguard.d.mts.map +1 -0
  1195. package/dist/services/definitions/wireguard.mjs +87 -0
  1196. package/dist/services/definitions/wireguard.mjs.map +1 -0
  1197. package/dist/services/definitions/woodpecker-ci.cjs +93 -0
  1198. package/dist/services/definitions/woodpecker-ci.cjs.map +1 -0
  1199. package/dist/services/definitions/woodpecker-ci.d.cts +7 -0
  1200. package/dist/services/definitions/woodpecker-ci.d.cts.map +1 -0
  1201. package/dist/services/definitions/woodpecker-ci.d.mts +7 -0
  1202. package/dist/services/definitions/woodpecker-ci.d.mts.map +1 -0
  1203. package/dist/services/definitions/woodpecker-ci.mjs +92 -0
  1204. package/dist/services/definitions/woodpecker-ci.mjs.map +1 -0
  1205. package/dist/services/definitions/xyops.cjs +2 -3
  1206. package/dist/services/definitions/xyops.cjs.map +1 -1
  1207. package/dist/services/definitions/xyops.mjs +1 -1
  1208. package/dist/services/definitions/zulip.cjs +116 -0
  1209. package/dist/services/definitions/zulip.cjs.map +1 -0
  1210. package/dist/services/definitions/zulip.d.cts +7 -0
  1211. package/dist/services/definitions/zulip.d.cts.map +1 -0
  1212. package/dist/services/definitions/zulip.d.mts +7 -0
  1213. package/dist/services/definitions/zulip.d.mts.map +1 -0
  1214. package/dist/services/definitions/zulip.mjs +115 -0
  1215. package/dist/services/definitions/zulip.mjs.map +1 -0
  1216. package/dist/services/registry.cjs +3 -4
  1217. package/dist/services/registry.cjs.map +1 -1
  1218. package/dist/services/registry.d.mts.map +1 -1
  1219. package/dist/services/registry.mjs +1 -2
  1220. package/dist/services/registry.mjs.map +1 -1
  1221. package/dist/services/registry.test.cjs +3 -4
  1222. package/dist/services/registry.test.cjs.map +1 -1
  1223. package/dist/services/registry.test.mjs +3 -4
  1224. package/dist/services/registry.test.mjs.map +1 -1
  1225. package/dist/{manifest-4uLbISXV.cjs → skill-manifest--IgY9REK.cjs} +40 -10
  1226. package/dist/skill-manifest--IgY9REK.cjs.map +1 -0
  1227. package/dist/{manifest-B8UDsVlR.mjs → skill-manifest-BVUXU0__.mjs} +24 -5
  1228. package/dist/skill-manifest-BVUXU0__.mjs.map +1 -0
  1229. package/dist/skills/registry.cjs +262 -3
  1230. package/dist/skills/registry.cjs.map +1 -1
  1231. package/dist/skills/registry.d.cts.map +1 -1
  1232. package/dist/skills/registry.d.mts.map +1 -1
  1233. package/dist/skills/registry.mjs +261 -1
  1234. package/dist/skills/registry.mjs.map +1 -1
  1235. package/dist/skills/skill-manifest.cjs +5 -23
  1236. package/dist/skills/skill-manifest.mjs +1 -19
  1237. package/dist/skills-BlzpHmpH.cjs +620 -0
  1238. package/dist/skills-BlzpHmpH.cjs.map +1 -0
  1239. package/dist/types-CR83OJiq.d.cts +243 -0
  1240. package/dist/types-CR83OJiq.d.cts.map +1 -0
  1241. package/dist/types-zYjGTuyn.d.mts +243 -0
  1242. package/dist/types-zYjGTuyn.d.mts.map +1 -0
  1243. package/dist/types.cjs +107 -3
  1244. package/dist/types.cjs.map +1 -1
  1245. package/dist/types.d.cts +2 -1
  1246. package/dist/types.d.cts.map +1 -1
  1247. package/dist/types.d.mts +2 -1
  1248. package/dist/types.d.mts.map +1 -1
  1249. package/dist/types.mjs +106 -1
  1250. package/dist/types.mjs.map +1 -1
  1251. package/dist/validator.cjs +3 -4
  1252. package/dist/validator.cjs.map +1 -1
  1253. package/dist/validator.mjs +1 -2
  1254. package/dist/validator.mjs.map +1 -1
  1255. package/dist/validator.test.cjs +5 -6
  1256. package/dist/validator.test.cjs.map +1 -1
  1257. package/dist/validator.test.mjs +3 -4
  1258. package/dist/validator.test.mjs.map +1 -1
  1259. package/dist/version-manager.cjs +3 -4
  1260. package/dist/version-manager.cjs.map +1 -1
  1261. package/dist/version-manager.d.mts.map +1 -1
  1262. package/dist/version-manager.mjs +1 -2
  1263. package/dist/version-manager.mjs.map +1 -1
  1264. package/dist/version-manager.test.cjs +5 -6
  1265. package/dist/version-manager.test.cjs.map +1 -1
  1266. package/dist/version-manager.test.mjs +3 -4
  1267. package/dist/version-manager.test.mjs.map +1 -1
  1268. package/dist/{vi.2VT5v0um-BmRMvymT.cjs → vi.2VT5v0um-CRqXre87.cjs} +82 -202
  1269. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs.map → vi.2VT5v0um-CRqXre87.cjs.map} +1 -1
  1270. package/dist/{vi.2VT5v0um-CFyDIn0m.mjs → vi.2VT5v0um-DvC3SVNc.mjs} +67 -186
  1271. package/dist/{vi.2VT5v0um-BmRMvymT.cjs.map → vi.2VT5v0um-DvC3SVNc.mjs.map} +1 -1
  1272. package/package.json +3 -3
  1273. package/src/__snapshots__/composer.snapshot.test.ts.snap +130 -65
  1274. package/src/composer.ts +25 -15
  1275. package/src/generate.ts +1 -0
  1276. package/src/generators/env.ts +214 -0
  1277. package/src/generators/openclaw-json.ts +156 -1
  1278. package/src/generators/postgres-init.ts +6 -0
  1279. package/src/generators/readme.ts +2 -1
  1280. package/src/presets/presets.test.ts +4 -0
  1281. package/src/presets/registry.ts +329 -133
  1282. package/src/schema.ts +15 -0
  1283. package/src/services/definitions/adguard-home.ts +79 -0
  1284. package/src/services/definitions/airbyte.ts +75 -0
  1285. package/src/services/definitions/airflow.ts +109 -0
  1286. package/src/services/definitions/appwrite.ts +181 -0
  1287. package/src/services/definitions/audiobookshelf.ts +83 -0
  1288. package/src/services/definitions/authelia.ts +145 -0
  1289. package/src/services/definitions/axolotl.ts +65 -0
  1290. package/src/services/definitions/baserow.ts +118 -0
  1291. package/src/services/definitions/calibre-web.ts +95 -0
  1292. package/src/services/definitions/chatwoot-worker.ts +93 -0
  1293. package/src/services/definitions/chatwoot.ts +106 -0
  1294. package/src/services/definitions/clickhouse.ts +115 -0
  1295. package/src/services/definitions/cloudflared.ts +55 -0
  1296. package/src/services/definitions/cockroachdb.ts +75 -0
  1297. package/src/services/definitions/coder.ts +68 -0
  1298. package/src/services/definitions/dagster.ts +82 -0
  1299. package/src/services/definitions/directus.ts +115 -0
  1300. package/src/services/definitions/dragonfly.ts +68 -0
  1301. package/src/services/definitions/drone-ci.ts +96 -0
  1302. package/src/services/definitions/duplicati.ts +77 -0
  1303. package/src/services/definitions/element-web.ts +62 -0
  1304. package/src/services/definitions/excalidraw.ts +46 -0
  1305. package/src/services/definitions/firecrawl-playwright.ts +62 -0
  1306. package/src/services/definitions/firecrawl.ts +146 -0
  1307. package/src/services/definitions/flagsmith.ts +76 -0
  1308. package/src/services/definitions/focalboard.ts +69 -0
  1309. package/src/services/definitions/fonoster.ts +67 -0
  1310. package/src/services/definitions/forgejo.ts +109 -0
  1311. package/src/services/definitions/formbricks.ts +75 -0
  1312. package/src/services/definitions/graylog.ts +101 -0
  1313. package/src/services/definitions/hedgedoc.ts +81 -0
  1314. package/src/services/definitions/heyform.ts +67 -0
  1315. package/src/services/definitions/hoppscotch.ts +74 -0
  1316. package/src/services/definitions/index.ts +263 -0
  1317. package/src/services/definitions/infisical.ts +97 -0
  1318. package/src/services/definitions/influxdb.ts +109 -0
  1319. package/src/services/definitions/invoke-ai.ts +76 -0
  1320. package/src/services/definitions/jaeger.ts +94 -0
  1321. package/src/services/definitions/jan.ts +68 -0
  1322. package/src/services/definitions/jitsi-meet.ts +108 -0
  1323. package/src/services/definitions/keycloak.ts +119 -0
  1324. package/src/services/definitions/kong.ts +116 -0
  1325. package/src/services/definitions/lago.ts +95 -0
  1326. package/src/services/definitions/langflow.ts +82 -0
  1327. package/src/services/definitions/langfuse.ts +76 -0
  1328. package/src/services/definitions/listmonk.ts +118 -0
  1329. package/src/services/definitions/local-ai.ts +90 -0
  1330. package/src/services/definitions/mariadb.ts +82 -0
  1331. package/src/services/definitions/mautic.ts +82 -0
  1332. package/src/services/definitions/medusa.ts +82 -0
  1333. package/src/services/definitions/metabase.ts +111 -0
  1334. package/src/services/definitions/mosquitto.ts +84 -0
  1335. package/src/services/definitions/mysql.ts +82 -0
  1336. package/src/services/definitions/navidrome.ts +95 -0
  1337. package/src/services/definitions/nginx-proxy-manager.ts +70 -0
  1338. package/src/services/definitions/node-red.ts +83 -0
  1339. package/src/services/definitions/openhands.ts +60 -0
  1340. package/src/services/definitions/opensearch.ts +95 -0
  1341. package/src/services/definitions/photoprism.ts +130 -0
  1342. package/src/services/definitions/pihole.ts +79 -0
  1343. package/src/services/definitions/piper-tts.ts +76 -0
  1344. package/src/services/definitions/plane.ts +75 -0
  1345. package/src/services/definitions/plausible.ts +97 -0
  1346. package/src/services/definitions/pocket-id.ts +98 -0
  1347. package/src/services/definitions/pocketbase.ts +62 -0
  1348. package/src/services/definitions/posthog.ts +97 -0
  1349. package/src/services/definitions/rabbitmq.ts +81 -0
  1350. package/src/services/definitions/ragflow.ts +175 -0
  1351. package/src/services/definitions/redis.ts +1 -1
  1352. package/src/services/definitions/restic.ts +60 -0
  1353. package/src/services/definitions/revolt.ts +68 -0
  1354. package/src/services/definitions/saleor.ts +75 -0
  1355. package/src/services/definitions/sentry.ts +104 -0
  1356. package/src/services/definitions/sonarqube.ts +85 -0
  1357. package/src/services/definitions/stirling-pdf.ts +73 -0
  1358. package/src/services/definitions/strapi.ts +124 -0
  1359. package/src/services/definitions/superset.ts +84 -0
  1360. package/src/services/definitions/surrealdb.ts +77 -0
  1361. package/src/services/definitions/tabby-ml.ts +76 -0
  1362. package/src/services/definitions/tempo.ts +59 -0
  1363. package/src/services/definitions/text-gen-webui.ts +92 -0
  1364. package/src/services/definitions/timescaledb.ts +90 -0
  1365. package/src/services/definitions/twenty.ts +82 -0
  1366. package/src/services/definitions/valkey.ts +1 -1
  1367. package/src/services/definitions/vault.ts +74 -0
  1368. package/src/services/definitions/vector-log.ts +61 -0
  1369. package/src/services/definitions/vikunja.ts +96 -0
  1370. package/src/services/definitions/wireguard.ts +89 -0
  1371. package/src/services/definitions/woodpecker-ci.ts +97 -0
  1372. package/src/services/definitions/zulip.ts +117 -0
  1373. package/src/skills/manifest.json +8 -0
  1374. package/src/skills/registry.ts +119 -0
  1375. package/src/types.ts +120 -2
  1376. package/dist/chunk-C0xms8kb.cjs +0 -34
  1377. package/dist/deployers/coolify.d.cts.map +0 -1
  1378. package/dist/deployers/coolify.d.mts.map +0 -1
  1379. package/dist/deployers/dokploy.d.cts.map +0 -1
  1380. package/dist/deployers/dokploy.d.mts.map +0 -1
  1381. package/dist/deployers/types.d.cts.map +0 -1
  1382. package/dist/deployers/types.d.mts.map +0 -1
  1383. package/dist/generators/skills.cjs.map +0 -1
  1384. package/dist/manifest-4uLbISXV.cjs.map +0 -1
  1385. package/dist/manifest-B8UDsVlR.mjs.map +0 -1
  1386. package/dist/schema.d.cts.map +0 -1
  1387. package/dist/schema.d.mts.map +0 -1
  1388. package/dist/skills/skill-manifest.cjs.map +0 -1
  1389. package/dist/skills/skill-manifest.mjs.map +0 -1
package/dist/errors.cjs CHANGED
@@ -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/errors.ts
4
3
  /**
5
4
  * Typed error classes for stack generation.
@@ -20,8 +19,8 @@ var ValidationError = class extends Error {
20
19
  this.name = "ValidationError";
21
20
  }
22
21
  };
23
-
24
22
  //#endregion
25
23
  exports.StackConfigError = StackConfigError;
26
24
  exports.ValidationError = ValidationError;
25
+
27
26
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Typed error classes for stack generation.\n */\n\n/** Thrown when the resolved stack configuration is invalid (e.g. conflicts). */\nexport class StackConfigError extends Error {\n\treadonly code = \"STACK_CONFIG_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"StackConfigError\";\n\t}\n}\n\n/** Thrown when post-generation validation fails. */\nexport class ValidationError extends Error {\n\treadonly code = \"VALIDATION_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ValidationError\";\n\t}\n}\n"],"mappings":";;;;;;;AAKA,IAAa,mBAAb,cAAsC,MAAM;CAC3C,AAAS,OAAO;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO;;;;AAKd,IAAa,kBAAb,cAAqC,MAAM;CAC1C,AAAS,OAAO;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO"}
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Typed error classes for stack generation.\n */\n\n/** Thrown when the resolved stack configuration is invalid (e.g. conflicts). */\nexport class StackConfigError extends Error {\n\treadonly code = \"STACK_CONFIG_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"StackConfigError\";\n\t}\n}\n\n/** Thrown when post-generation validation fails. */\nexport class ValidationError extends Error {\n\treadonly code = \"VALIDATION_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ValidationError\";\n\t}\n}\n"],"mappings":";;;;;;AAKA,IAAa,mBAAb,cAAsC,MAAM;CAC3C,OAAgB;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO;;;;AAKd,IAAa,kBAAb,cAAqC,MAAM;CAC1C,OAAgB;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO"}
package/dist/errors.mjs CHANGED
@@ -18,7 +18,7 @@ var ValidationError = class extends Error {
18
18
  this.name = "ValidationError";
19
19
  }
20
20
  };
21
-
22
21
  //#endregion
23
22
  export { StackConfigError, ValidationError };
23
+
24
24
  //# sourceMappingURL=errors.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Typed error classes for stack generation.\n */\n\n/** Thrown when the resolved stack configuration is invalid (e.g. conflicts). */\nexport class StackConfigError extends Error {\n\treadonly code = \"STACK_CONFIG_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"StackConfigError\";\n\t}\n}\n\n/** Thrown when post-generation validation fails. */\nexport class ValidationError extends Error {\n\treadonly code = \"VALIDATION_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ValidationError\";\n\t}\n}\n"],"mappings":";;;;;AAKA,IAAa,mBAAb,cAAsC,MAAM;CAC3C,AAAS,OAAO;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO;;;;AAKd,IAAa,kBAAb,cAAqC,MAAM;CAC1C,AAAS,OAAO;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO"}
1
+ {"version":3,"file":"errors.mjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Typed error classes for stack generation.\n */\n\n/** Thrown when the resolved stack configuration is invalid (e.g. conflicts). */\nexport class StackConfigError extends Error {\n\treadonly code = \"STACK_CONFIG_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"StackConfigError\";\n\t}\n}\n\n/** Thrown when post-generation validation fails. */\nexport class ValidationError extends Error {\n\treadonly code = \"VALIDATION_ERROR\" as const;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ValidationError\";\n\t}\n}\n"],"mappings":";;;;;AAKA,IAAa,mBAAb,cAAsC,MAAM;CAC3C,OAAgB;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO;;;;AAKd,IAAa,kBAAb,cAAqC,MAAM;CAC1C,OAAgB;CAEhB,YAAY,SAAiB;AAC5B,QAAM,QAAQ;AACd,OAAK,OAAO"}
package/dist/generate.cjs CHANGED
@@ -1,29 +1,28 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_bare_metal_partition = require('./bare-metal-partition.cjs');
3
- const require_resolver = require('./resolver.cjs');
4
- const require_generators_postgres_init = require('./generators/postgres-init.cjs');
5
- const require_composer = require('./composer.cjs');
6
- const require_errors = require('./errors.cjs');
7
- const require_generators_bare_metal_install = require('./generators/bare-metal-install.cjs');
8
- const require_generators_caddy = require('./generators/caddy.cjs');
9
- const require_generators_cloud_init = require('./generators/cloud-init.cjs');
10
- const require_generators_env = require('./generators/env.cjs');
11
- const require_generators_get_shit_done = require('./generators/get-shit-done.cjs');
12
- const require_generators_grafana = require('./generators/grafana.cjs');
13
- const require_generators_health_check = require('./generators/health-check.cjs');
14
- const require_generators_n8n_workflows = require('./generators/n8n-workflows.cjs');
15
- const require_generators_native_services = require('./generators/native-services.cjs');
16
- const require_generators_openclaw_install_script = require('./generators/openclaw-install-script.cjs');
17
- const require_generators_openclaw_json = require('./generators/openclaw-json.cjs');
18
- const require_generators_prometheus = require('./generators/prometheus.cjs');
19
- const require_generators_readme = require('./generators/readme.cjs');
20
- const require_generators_scripts = require('./generators/scripts.cjs');
21
- const require_generators_skills = require('./generators/skills.cjs');
22
- const require_generators_stack_manifest = require('./generators/stack-manifest.cjs');
23
- const require_generators_traefik = require('./generators/traefik.cjs');
24
- const require_migrations = require('./migrations.cjs');
25
- const require_validator = require('./validator.cjs');
26
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_skills = require("./skills-BlzpHmpH.cjs");
3
+ const require_bare_metal_partition = require("./bare-metal-partition.cjs");
4
+ const require_resolver = require("./resolver.cjs");
5
+ const require_generators_postgres_init = require("./generators/postgres-init.cjs");
6
+ const require_composer = require("./composer.cjs");
7
+ const require_errors = require("./errors.cjs");
8
+ const require_generators_bare_metal_install = require("./generators/bare-metal-install.cjs");
9
+ const require_generators_caddy = require("./generators/caddy.cjs");
10
+ const require_generators_cloud_init = require("./generators/cloud-init.cjs");
11
+ const require_generators_env = require("./generators/env.cjs");
12
+ const require_generators_get_shit_done = require("./generators/get-shit-done.cjs");
13
+ const require_generators_grafana = require("./generators/grafana.cjs");
14
+ const require_generators_health_check = require("./generators/health-check.cjs");
15
+ const require_generators_n8n_workflows = require("./generators/n8n-workflows.cjs");
16
+ const require_generators_native_services = require("./generators/native-services.cjs");
17
+ const require_generators_openclaw_install_script = require("./generators/openclaw-install-script.cjs");
18
+ const require_generators_openclaw_json = require("./generators/openclaw-json.cjs");
19
+ const require_generators_prometheus = require("./generators/prometheus.cjs");
20
+ const require_generators_readme = require("./generators/readme.cjs");
21
+ const require_generators_scripts = require("./generators/scripts.cjs");
22
+ const require_generators_stack_manifest = require("./generators/stack-manifest.cjs");
23
+ const require_generators_traefik = require("./generators/traefik.cjs");
24
+ const require_migrations = require("./migrations.cjs");
25
+ const require_validator = require("./validator.cjs");
27
26
  //#region src/generate.ts
28
27
  /** Resolver/compose only support linux image platforms; normalize for bare-metal (windows/macos). */
29
28
  function getComposePlatform(platform) {
@@ -106,7 +105,7 @@ function generate(rawInput) {
106
105
  ].join("\n");
107
106
  const manifestFiles = require_generators_stack_manifest.generateStackManifest(resolved, input);
108
107
  for (const [path, content] of Object.entries(manifestFiles)) files[path] = content;
109
- const skillFiles = require_generators_skills.generateSkillFiles(resolved);
108
+ const skillFiles = require_skills.generateSkillFiles(resolved);
110
109
  for (const [path, content] of Object.entries(skillFiles)) files[path] = content;
111
110
  files["openclaw/config/openclaw.json"] = require_generators_openclaw_json.generateOpenClawConfig(resolved, {
112
111
  deploymentType: input.deploymentType,
@@ -188,6 +187,7 @@ function generate(rawInput) {
188
187
  serviceCount: resolved.services.length,
189
188
  skillCount,
190
189
  estimatedMemoryMB: resolved.estimatedMemoryMB,
190
+ resolvedServices: resolved.services.map((s) => s.definition.id),
191
191
  generatedAt: (/* @__PURE__ */ new Date()).toISOString()
192
192
  }
193
193
  };
@@ -218,8 +218,8 @@ function generateServicesDoc(resolved) {
218
218
  }
219
219
  return lines.join("\n");
220
220
  }
221
-
222
221
  //#endregion
223
222
  exports.generate = generate;
224
223
  exports.generateServicesDoc = generateServicesDoc;
224
+
225
225
  //# sourceMappingURL=generate.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.cjs","names":["migrateConfig","resolve","StackConfigError","partitionBareMetal","resolvedWithOnlyServices","generateTraefikConfig","composeMultiFile","validate","ValidationError","generateEnvFiles","generateStackManifest","generateSkillFiles","generateOpenClawConfig","generateReadme","generateScripts","generateHealthCheck","generateN8nWorkflows","generatePostgresInit","generateCaddyfile","generatePrometheusConfig","generateGrafanaConfig","generateGrafanaDashboard","platformToNativePlatform","generateNativeInstallScripts","generateBareMetalInstall","generateGsdScripts","generateOpenclawInstallScript","generateCloudInit"],"sources":["../src/generate.ts"],"sourcesContent":["import {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { composeMultiFile } from \"./composer.js\";\nimport { StackConfigError, ValidationError } from \"./errors.js\";\nimport { generateBareMetalInstall } from \"./generators/bare-metal-install.js\";\nimport { generateCaddyfile } from \"./generators/caddy.js\";\nimport { generateCloudInit } from \"./generators/cloud-init.js\";\nimport { generateEnvFiles } from \"./generators/env.js\";\nimport { generateGsdScripts } from \"./generators/get-shit-done.js\";\nimport { generateGrafanaConfig, generateGrafanaDashboard } from \"./generators/grafana.js\";\nimport { generateHealthCheck } from \"./generators/health-check.js\";\nimport { generateN8nWorkflows } from \"./generators/n8n-workflows.js\";\nimport { generateNativeInstallScripts } from \"./generators/native-services.js\";\nimport { generateOpenclawInstallScript } from \"./generators/openclaw-install-script.js\";\nimport { generateOpenClawConfig } from \"./generators/openclaw-json.js\";\nimport { generatePostgresInit } from \"./generators/postgres-init.js\";\nimport { generatePrometheusConfig } from \"./generators/prometheus.js\";\nimport { generateReadme } from \"./generators/readme.js\";\nimport { generateScripts } from \"./generators/scripts.js\";\nimport { generateSkillFiles } from \"./generators/skills.js\";\nimport { generateStackManifest } from \"./generators/stack-manifest.js\";\nimport { generateTraefikConfig } from \"./generators/traefik.js\";\nimport { migrateConfig } from \"./migrations.js\";\nimport { resolve } from \"./resolver.js\";\nimport type {\n\tGeneratedFiles,\n\tGenerationInput,\n\tGenerationResult,\n\tPlatform,\n\tResolverInput,\n} from \"./types.js\";\nimport { validate } from \"./validator.js\";\n\n/** Resolver/compose only support linux image platforms; normalize for bare-metal (windows/macos). */\nfunction getComposePlatform(platform: Platform): \"linux/amd64\" | \"linux/arm64\" {\n\tif (platform === \"linux/amd64\" || platform === \"linux/arm64\") return platform;\n\treturn \"linux/amd64\";\n}\n\n/**\n * Main orchestration function: takes generation input, resolves dependencies,\n * generates all files, validates, and returns the complete file tree.\n */\nexport function generate(rawInput: GenerationInput): GenerationResult {\n\t// Apply config migrations if needed\n\tconst input = migrateConfig(rawInput as Record<string, unknown>) as GenerationInput;\n\n\tconst composePlatform = getComposePlatform(input.platform);\n\n\t// 1. Resolve dependencies\n\tconst resolverInput: ResolverInput = {\n\t\tservices: input.services,\n\t\tskillPacks: input.skillPacks,\n\t\taiProviders: input.aiProviders,\n\t\tproxy: input.proxy,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tmonitoring: input.monitoring,\n\t};\n\tconst resolved = resolve(resolverInput);\n\n\tif (!resolved.isValid) {\n\t\tthrow new StackConfigError(\n\t\t\t`Invalid stack configuration: ${resolved.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst isBareMetal = input.deploymentType === \"bare-metal\";\n\tlet resolvedForCompose = resolved;\n\tlet nativeIds = new Set<string>();\n\tlet nativeServices: typeof resolved.services = [];\n\tlet dockerOnlyServices: typeof resolved.services = [];\n\n\tif (isBareMetal) {\n\t\tconst partition = partitionBareMetal(resolved, input.platform);\n\t\tnativeServices = partition.nativeServices;\n\t\tdockerOnlyServices = partition.dockerOnlyServices;\n\t\tnativeIds = partition.nativeIds;\n\t\tif (nativeServices.length > 0) {\n\t\t\tresolvedForCompose = resolvedWithOnlyServices(resolved, dockerOnlyServices);\n\t\t}\n\t}\n\n\t// 2. Generate Docker Compose YAML (multi-file)\n\t// Compute Traefik labels before composing (labels get injected into docker-compose services)\n\tlet traefikOutput: ReturnType<typeof generateTraefikConfig> | undefined;\n\tif (input.proxy === \"traefik\" && input.domain) {\n\t\ttraefikOutput = generateTraefikConfig(resolvedForCompose, input.domain);\n\t}\n\n\tconst composeOptions = {\n\t\tprojectName: input.projectName,\n\t\tproxy: input.proxy,\n\t\tproxyHttpPort: input.proxyHttpPort,\n\t\tproxyHttpsPort: input.proxyHttpsPort,\n\t\tportOverrides: input.portOverrides,\n\t\tdomain: input.domain,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tdeployment: input.deployment,\n\t\topenclawVersion: input.openclawVersion,\n\t\tbareMetalNativeHost: isBareMetal && nativeIds.size > 0,\n\t\ttraefikLabels: traefikOutput?.serviceLabels,\n\t\topenclawImage: input.openclawImage ?? \"official\",\n\t\thardened: input.hardened ?? true,\n\t\topenclawInstallMethod: input.openclawInstallMethod ?? \"docker\",\n\t};\n\tconst composeResult = composeMultiFile(resolvedForCompose, composeOptions);\n\n\t// 3. Validate (using the base docker-compose.yml)\n\tconst validation = validate(resolvedForCompose, composeResult.files[\"docker-compose.yml\"] ?? \"\", {\n\t\tdomain: input.domain,\n\t\tgenerateSecrets: input.generateSecrets,\n\t});\n\tif (!validation.valid) {\n\t\tthrow new ValidationError(\n\t\t\t`Validation failed: ${validation.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\t// 4. Generate all files\n\tconst files: GeneratedFiles = {};\n\n\t// Docker Compose (multi-file output)\n\tfor (const [filename, content] of Object.entries(composeResult.files)) {\n\t\tfiles[filename] = content;\n\t}\n\n\t// Environment files (when bare-metal with native services, host vars use host.docker.internal)\n\tconst envFiles = generateEnvFiles(resolved, {\n\t\tgenerateSecrets: input.generateSecrets,\n\t\tdomain: input.domain,\n\t\topenclawVersion: input.openclawVersion,\n\t\tnativeServiceIds: isBareMetal ? nativeIds : undefined,\n\t\tcomposeFiles: Object.keys(composeResult.files),\n\t\tcomposeProfiles: composeResult.profiles,\n\t\topenclawImage: input.openclawImage,\n\t});\n\tfiles[\".env.example\"] = envFiles.envExample;\n\tfiles[\".env\"] = envFiles.env;\n\n\t// .gitignore\n\tfiles[\".gitignore\"] = [\n\t\t\".env\",\n\t\t\".env.local\",\n\t\t\".env.*.local\",\n\t\t\"*.log\",\n\t\t\"docker-compose.override.yml\",\n\t].join(\"\\n\");\n\n\t// Stack manifest (consumed by Mission Control)\n\tconst manifestFiles = generateStackManifest(resolved, input);\n\tfor (const [path, content] of Object.entries(manifestFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Skills\n\tconst skillFiles = generateSkillFiles(resolved);\n\tfor (const [path, content] of Object.entries(skillFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// OpenClaw Core Configuration\n\tfiles[\"openclaw/config/openclaw.json\"] = generateOpenClawConfig(resolved, {\n\t\tdeploymentType: input.deploymentType,\n\t\tgatewayPort: 18789,\n\t\topenclawVersion: input.openclawVersion,\n\t});\n\n\t// README\n\tfiles[\"README.md\"] = generateReadme(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdomain: input.domain,\n\t\tproxy: input.proxy,\n\t\tdeploymentType: input.deploymentType,\n\t\thasNativeServices: isBareMetal && nativeServices.length > 0,\n\t\topenclawInstallMethod: input.openclawInstallMethod,\n\t});\n\n\t// Scripts\n\tconst scripts = generateScripts();\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Health check scripts (dynamic, stack-specific)\n\tconst healthCheckFiles = generateHealthCheck(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdeploymentType: input.deploymentType,\n\t});\n\tfor (const [path, content] of Object.entries(healthCheckFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// n8n workflows\n\tconst n8nWorkflows = generateN8nWorkflows(resolved);\n\tfor (const [path, content] of Object.entries(n8nWorkflows)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// PostgreSQL init script (creates per-service databases and users)\n\tconst postgresInit = generatePostgresInit(resolved);\n\tif (postgresInit) {\n\t\tfiles[\"postgres/init-databases.sh\"] = postgresInit;\n\t}\n\n\t// Caddy config\n\tif (input.proxy === \"caddy\" && input.domain) {\n\t\tfiles[\"caddy/Caddyfile\"] = generateCaddyfile(resolved, input.domain);\n\t}\n\n\t// Traefik config (labels are already injected via composeOptions.traefikLabels)\n\tif (traefikOutput) {\n\t\tfiles[\"traefik/traefik.yml\"] = traefikOutput.staticConfig;\n\t}\n\n\t// Prometheus config\n\tconst hasPrometheus = resolved.services.some((s) => s.definition.id === \"prometheus\");\n\tif (hasPrometheus) {\n\t\tfiles[\"prometheus/prometheus.yml\"] = generatePrometheusConfig(resolved);\n\t}\n\n\t// Grafana config\n\tconst hasGrafana = resolved.services.some((s) => s.definition.id === \"grafana\");\n\tif (hasGrafana) {\n\t\tconst grafanaFiles = generateGrafanaConfig();\n\t\tfor (const [path, content] of Object.entries(grafanaFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t\t// Grafana dashboard\n\t\tfiles[\"config/grafana/dashboards/openclaw-stack-overview.json\"] = generateGrafanaDashboard();\n\t}\n\n\t// Docker Compose override (empty template)\n\tfiles[\"docker-compose.override.yml\"] = [\n\t\t\"# Local overrides for docker-compose.yml\",\n\t\t\"# This file is gitignored — use it for personal port changes, extra volumes, etc.\",\n\t\t\"services: {}\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\t// SERVICES.md documentation\n\tfiles[\"docs/SERVICES.md\"] = generateServicesDoc(resolved);\n\n\t// Bare-metal: native install scripts + top-level installer\n\tif (isBareMetal) {\n\t\tif (nativeServices.length > 0) {\n\t\t\tconst nativePlatform = platformToNativePlatform(input.platform);\n\t\t\tconst nativeScripts = generateNativeInstallScripts({\n\t\t\t\tnativeServices,\n\t\t\t\tplatform: nativePlatform,\n\t\t\t\tprojectName: input.projectName,\n\t\t\t});\n\t\t\tfor (const [path, content] of Object.entries(nativeScripts)) {\n\t\t\t\tfiles[path] = content;\n\t\t\t}\n\t\t}\n\t\tconst bareMetalFiles = generateBareMetalInstall({\n\t\t\tplatform: input.platform,\n\t\t\tprojectName: input.projectName,\n\t\t\thasNativeServices: nativeServices.length > 0,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(bareMetalFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Get-Shit-Done setup scripts\n\tif (input.gsdRuntimes && input.gsdRuntimes.length > 0) {\n\t\tconst gsdScripts = generateGsdScripts(input.gsdRuntimes);\n\t\tif (gsdScripts) {\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.sh\"] = gsdScripts.sh;\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.ps1\"] = gsdScripts.ps1;\n\t\t}\n\t}\n\n\t// OpenClaw direct install scripts (host-based, no Docker gateway)\n\tif (input.openclawInstallMethod === \"direct\") {\n\t\tconst installScripts = generateOpenclawInstallScript({\n\t\t\tprojectName: input.projectName,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(installScripts)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Cloud-init deploy target\n\tif (input.deployTarget === \"cloud-init\") {\n\t\tconst mainCompose = composeResult.files[\"docker-compose.yml\"] ?? \"\";\n\t\tfiles[\"cloud-init.yml\"] = generateCloudInit({\n\t\t\tcomposeYaml: mainCompose,\n\t\t\tenvContent: envFiles.env,\n\t\t\tprojectName: input.projectName,\n\t\t\tgatewayPort: 18789,\n\t\t});\n\t}\n\n\t// 5. Calculate metadata\n\tconst skillCount = resolved.services.reduce((sum, s) => sum + s.definition.skills.length, 0);\n\n\treturn {\n\t\tfiles,\n\t\tmetadata: {\n\t\t\tserviceCount: resolved.services.length,\n\t\t\tskillCount,\n\t\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\n\t\t\tgeneratedAt: new Date().toISOString(),\n\t\t},\n\t};\n}\n\nexport function generateServicesDoc(resolved: import(\"./types.js\").ResolverOutput): string {\n\tconst lines: string[] = [\n\t\t\"# Service Reference\",\n\t\t\"\",\n\t\t\"This document describes all companion services in your OpenClaw stack.\",\n\t\t\"\",\n\t];\n\n\tfor (const svc of resolved.services) {\n\t\tconst def = svc.definition;\n\t\tlines.push(`## ${def.icon} ${def.name}`);\n\t\tlines.push(\"\");\n\t\tlines.push(def.description);\n\t\tlines.push(\"\");\n\t\tlines.push(`- **Image**: \\`${def.image}:${def.imageTag}\\``);\n\t\tlines.push(`- **Category**: ${def.category}`);\n\t\tlines.push(`- **Maturity**: ${def.maturity}`);\n\t\tif (def.minMemoryMB) {\n\t\t\tlines.push(`- **Min Memory**: ${def.minMemoryMB}MB`);\n\t\t}\n\t\tif (def.ports.length > 0) {\n\t\t\tlines.push(\"- **Ports**:\");\n\t\t\tfor (const p of def.ports) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` - \\`${p.container}\\` — ${p.description}${p.exposed ? \"\" : \" (internal only)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tlines.push(`- **Docs**: ${def.docsUrl}`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.cjs","names":["migrateConfig","resolve","StackConfigError","partitionBareMetal","resolvedWithOnlyServices","generateTraefikConfig","composeMultiFile","validate","ValidationError","generateEnvFiles","generateStackManifest","generateSkillFiles","generateOpenClawConfig","generateReadme","generateScripts","generateHealthCheck","generateN8nWorkflows","generatePostgresInit","generateCaddyfile","generatePrometheusConfig","generateGrafanaConfig","generateGrafanaDashboard","platformToNativePlatform","generateNativeInstallScripts","generateBareMetalInstall","generateGsdScripts","generateOpenclawInstallScript","generateCloudInit"],"sources":["../src/generate.ts"],"sourcesContent":["import {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { composeMultiFile } from \"./composer.js\";\nimport { StackConfigError, ValidationError } from \"./errors.js\";\nimport { generateBareMetalInstall } from \"./generators/bare-metal-install.js\";\nimport { generateCaddyfile } from \"./generators/caddy.js\";\nimport { generateCloudInit } from \"./generators/cloud-init.js\";\nimport { generateEnvFiles } from \"./generators/env.js\";\nimport { generateGsdScripts } from \"./generators/get-shit-done.js\";\nimport { generateGrafanaConfig, generateGrafanaDashboard } from \"./generators/grafana.js\";\nimport { generateHealthCheck } from \"./generators/health-check.js\";\nimport { generateN8nWorkflows } from \"./generators/n8n-workflows.js\";\nimport { generateNativeInstallScripts } from \"./generators/native-services.js\";\nimport { generateOpenclawInstallScript } from \"./generators/openclaw-install-script.js\";\nimport { generateOpenClawConfig } from \"./generators/openclaw-json.js\";\nimport { generatePostgresInit } from \"./generators/postgres-init.js\";\nimport { generatePrometheusConfig } from \"./generators/prometheus.js\";\nimport { generateReadme } from \"./generators/readme.js\";\nimport { generateScripts } from \"./generators/scripts.js\";\nimport { generateSkillFiles } from \"./generators/skills.js\";\nimport { generateStackManifest } from \"./generators/stack-manifest.js\";\nimport { generateTraefikConfig } from \"./generators/traefik.js\";\nimport { migrateConfig } from \"./migrations.js\";\nimport { resolve } from \"./resolver.js\";\nimport type {\n\tGeneratedFiles,\n\tGenerationInput,\n\tGenerationResult,\n\tPlatform,\n\tResolverInput,\n} from \"./types.js\";\nimport { validate } from \"./validator.js\";\n\n/** Resolver/compose only support linux image platforms; normalize for bare-metal (windows/macos). */\nfunction getComposePlatform(platform: Platform): \"linux/amd64\" | \"linux/arm64\" {\n\tif (platform === \"linux/amd64\" || platform === \"linux/arm64\") return platform;\n\treturn \"linux/amd64\";\n}\n\n/**\n * Main orchestration function: takes generation input, resolves dependencies,\n * generates all files, validates, and returns the complete file tree.\n */\nexport function generate(rawInput: GenerationInput): GenerationResult {\n\t// Apply config migrations if needed\n\tconst input = migrateConfig(rawInput as Record<string, unknown>) as GenerationInput;\n\n\tconst composePlatform = getComposePlatform(input.platform);\n\n\t// 1. Resolve dependencies\n\tconst resolverInput: ResolverInput = {\n\t\tservices: input.services,\n\t\tskillPacks: input.skillPacks,\n\t\taiProviders: input.aiProviders,\n\t\tproxy: input.proxy,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tmonitoring: input.monitoring,\n\t};\n\tconst resolved = resolve(resolverInput);\n\n\tif (!resolved.isValid) {\n\t\tthrow new StackConfigError(\n\t\t\t`Invalid stack configuration: ${resolved.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst isBareMetal = input.deploymentType === \"bare-metal\";\n\tlet resolvedForCompose = resolved;\n\tlet nativeIds = new Set<string>();\n\tlet nativeServices: typeof resolved.services = [];\n\tlet dockerOnlyServices: typeof resolved.services = [];\n\n\tif (isBareMetal) {\n\t\tconst partition = partitionBareMetal(resolved, input.platform);\n\t\tnativeServices = partition.nativeServices;\n\t\tdockerOnlyServices = partition.dockerOnlyServices;\n\t\tnativeIds = partition.nativeIds;\n\t\tif (nativeServices.length > 0) {\n\t\t\tresolvedForCompose = resolvedWithOnlyServices(resolved, dockerOnlyServices);\n\t\t}\n\t}\n\n\t// 2. Generate Docker Compose YAML (multi-file)\n\t// Compute Traefik labels before composing (labels get injected into docker-compose services)\n\tlet traefikOutput: ReturnType<typeof generateTraefikConfig> | undefined;\n\tif (input.proxy === \"traefik\" && input.domain) {\n\t\ttraefikOutput = generateTraefikConfig(resolvedForCompose, input.domain);\n\t}\n\n\tconst composeOptions = {\n\t\tprojectName: input.projectName,\n\t\tproxy: input.proxy,\n\t\tproxyHttpPort: input.proxyHttpPort,\n\t\tproxyHttpsPort: input.proxyHttpsPort,\n\t\tportOverrides: input.portOverrides,\n\t\tdomain: input.domain,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tdeployment: input.deployment,\n\t\topenclawVersion: input.openclawVersion,\n\t\tbareMetalNativeHost: isBareMetal && nativeIds.size > 0,\n\t\ttraefikLabels: traefikOutput?.serviceLabels,\n\t\topenclawImage: input.openclawImage ?? \"official\",\n\t\thardened: input.hardened ?? true,\n\t\topenclawInstallMethod: input.openclawInstallMethod ?? \"docker\",\n\t};\n\tconst composeResult = composeMultiFile(resolvedForCompose, composeOptions);\n\n\t// 3. Validate (using the base docker-compose.yml)\n\tconst validation = validate(resolvedForCompose, composeResult.files[\"docker-compose.yml\"] ?? \"\", {\n\t\tdomain: input.domain,\n\t\tgenerateSecrets: input.generateSecrets,\n\t});\n\tif (!validation.valid) {\n\t\tthrow new ValidationError(\n\t\t\t`Validation failed: ${validation.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\t// 4. Generate all files\n\tconst files: GeneratedFiles = {};\n\n\t// Docker Compose (multi-file output)\n\tfor (const [filename, content] of Object.entries(composeResult.files)) {\n\t\tfiles[filename] = content;\n\t}\n\n\t// Environment files (when bare-metal with native services, host vars use host.docker.internal)\n\tconst envFiles = generateEnvFiles(resolved, {\n\t\tgenerateSecrets: input.generateSecrets,\n\t\tdomain: input.domain,\n\t\topenclawVersion: input.openclawVersion,\n\t\tnativeServiceIds: isBareMetal ? nativeIds : undefined,\n\t\tcomposeFiles: Object.keys(composeResult.files),\n\t\tcomposeProfiles: composeResult.profiles,\n\t\topenclawImage: input.openclawImage,\n\t});\n\tfiles[\".env.example\"] = envFiles.envExample;\n\tfiles[\".env\"] = envFiles.env;\n\n\t// .gitignore\n\tfiles[\".gitignore\"] = [\n\t\t\".env\",\n\t\t\".env.local\",\n\t\t\".env.*.local\",\n\t\t\"*.log\",\n\t\t\"docker-compose.override.yml\",\n\t].join(\"\\n\");\n\n\t// Stack manifest (consumed by Mission Control)\n\tconst manifestFiles = generateStackManifest(resolved, input);\n\tfor (const [path, content] of Object.entries(manifestFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Skills\n\tconst skillFiles = generateSkillFiles(resolved);\n\tfor (const [path, content] of Object.entries(skillFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// OpenClaw Core Configuration\n\tfiles[\"openclaw/config/openclaw.json\"] = generateOpenClawConfig(resolved, {\n\t\tdeploymentType: input.deploymentType,\n\t\tgatewayPort: 18789,\n\t\topenclawVersion: input.openclawVersion,\n\t});\n\n\t// README\n\tfiles[\"README.md\"] = generateReadme(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdomain: input.domain,\n\t\tproxy: input.proxy,\n\t\tdeploymentType: input.deploymentType,\n\t\thasNativeServices: isBareMetal && nativeServices.length > 0,\n\t\topenclawInstallMethod: input.openclawInstallMethod,\n\t});\n\n\t// Scripts\n\tconst scripts = generateScripts();\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Health check scripts (dynamic, stack-specific)\n\tconst healthCheckFiles = generateHealthCheck(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdeploymentType: input.deploymentType,\n\t});\n\tfor (const [path, content] of Object.entries(healthCheckFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// n8n workflows\n\tconst n8nWorkflows = generateN8nWorkflows(resolved);\n\tfor (const [path, content] of Object.entries(n8nWorkflows)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// PostgreSQL init script (creates per-service databases and users)\n\tconst postgresInit = generatePostgresInit(resolved);\n\tif (postgresInit) {\n\t\tfiles[\"postgres/init-databases.sh\"] = postgresInit;\n\t}\n\n\t// Caddy config\n\tif (input.proxy === \"caddy\" && input.domain) {\n\t\tfiles[\"caddy/Caddyfile\"] = generateCaddyfile(resolved, input.domain);\n\t}\n\n\t// Traefik config (labels are already injected via composeOptions.traefikLabels)\n\tif (traefikOutput) {\n\t\tfiles[\"traefik/traefik.yml\"] = traefikOutput.staticConfig;\n\t}\n\n\t// Prometheus config\n\tconst hasPrometheus = resolved.services.some((s) => s.definition.id === \"prometheus\");\n\tif (hasPrometheus) {\n\t\tfiles[\"prometheus/prometheus.yml\"] = generatePrometheusConfig(resolved);\n\t}\n\n\t// Grafana config\n\tconst hasGrafana = resolved.services.some((s) => s.definition.id === \"grafana\");\n\tif (hasGrafana) {\n\t\tconst grafanaFiles = generateGrafanaConfig();\n\t\tfor (const [path, content] of Object.entries(grafanaFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t\t// Grafana dashboard\n\t\tfiles[\"config/grafana/dashboards/openclaw-stack-overview.json\"] = generateGrafanaDashboard();\n\t}\n\n\t// Docker Compose override (empty template)\n\tfiles[\"docker-compose.override.yml\"] = [\n\t\t\"# Local overrides for docker-compose.yml\",\n\t\t\"# This file is gitignored — use it for personal port changes, extra volumes, etc.\",\n\t\t\"services: {}\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\t// SERVICES.md documentation\n\tfiles[\"docs/SERVICES.md\"] = generateServicesDoc(resolved);\n\n\t// Bare-metal: native install scripts + top-level installer\n\tif (isBareMetal) {\n\t\tif (nativeServices.length > 0) {\n\t\t\tconst nativePlatform = platformToNativePlatform(input.platform);\n\t\t\tconst nativeScripts = generateNativeInstallScripts({\n\t\t\t\tnativeServices,\n\t\t\t\tplatform: nativePlatform,\n\t\t\t\tprojectName: input.projectName,\n\t\t\t});\n\t\t\tfor (const [path, content] of Object.entries(nativeScripts)) {\n\t\t\t\tfiles[path] = content;\n\t\t\t}\n\t\t}\n\t\tconst bareMetalFiles = generateBareMetalInstall({\n\t\t\tplatform: input.platform,\n\t\t\tprojectName: input.projectName,\n\t\t\thasNativeServices: nativeServices.length > 0,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(bareMetalFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Get-Shit-Done setup scripts\n\tif (input.gsdRuntimes && input.gsdRuntimes.length > 0) {\n\t\tconst gsdScripts = generateGsdScripts(input.gsdRuntimes);\n\t\tif (gsdScripts) {\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.sh\"] = gsdScripts.sh;\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.ps1\"] = gsdScripts.ps1;\n\t\t}\n\t}\n\n\t// OpenClaw direct install scripts (host-based, no Docker gateway)\n\tif (input.openclawInstallMethod === \"direct\") {\n\t\tconst installScripts = generateOpenclawInstallScript({\n\t\t\tprojectName: input.projectName,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(installScripts)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Cloud-init deploy target\n\tif (input.deployTarget === \"cloud-init\") {\n\t\tconst mainCompose = composeResult.files[\"docker-compose.yml\"] ?? \"\";\n\t\tfiles[\"cloud-init.yml\"] = generateCloudInit({\n\t\t\tcomposeYaml: mainCompose,\n\t\t\tenvContent: envFiles.env,\n\t\t\tprojectName: input.projectName,\n\t\t\tgatewayPort: 18789,\n\t\t});\n\t}\n\n\t// 5. Calculate metadata\n\tconst skillCount = resolved.services.reduce((sum, s) => sum + s.definition.skills.length, 0);\n\n\treturn {\n\t\tfiles,\n\t\tmetadata: {\n\t\t\tserviceCount: resolved.services.length,\n\t\t\tskillCount,\n\t\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\n\t\t\tresolvedServices: resolved.services.map((s) => s.definition.id),\n\t\t\tgeneratedAt: new Date().toISOString(),\n\t\t},\n\t};\n}\n\nexport function generateServicesDoc(resolved: import(\"./types.js\").ResolverOutput): string {\n\tconst lines: string[] = [\n\t\t\"# Service Reference\",\n\t\t\"\",\n\t\t\"This document describes all companion services in your OpenClaw stack.\",\n\t\t\"\",\n\t];\n\n\tfor (const svc of resolved.services) {\n\t\tconst def = svc.definition;\n\t\tlines.push(`## ${def.icon} ${def.name}`);\n\t\tlines.push(\"\");\n\t\tlines.push(def.description);\n\t\tlines.push(\"\");\n\t\tlines.push(`- **Image**: \\`${def.image}:${def.imageTag}\\``);\n\t\tlines.push(`- **Category**: ${def.category}`);\n\t\tlines.push(`- **Maturity**: ${def.maturity}`);\n\t\tif (def.minMemoryMB) {\n\t\t\tlines.push(`- **Min Memory**: ${def.minMemoryMB}MB`);\n\t\t}\n\t\tif (def.ports.length > 0) {\n\t\t\tlines.push(\"- **Ports**:\");\n\t\t\tfor (const p of def.ports) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` - \\`${p.container}\\` — ${p.description}${p.exposed ? \"\" : \" (internal only)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tlines.push(`- **Docs**: ${def.docsUrl}`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.cts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;AA8CA;;iBAAgB,QAAA,CAAS,QAAA,EAAU,eAAA,GAAkB,gBAAA;AAAA,iBA4QrC,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
1
+ {"version":3,"file":"generate.d.cts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;AA8CA;;iBAAgB,QAAA,CAAS,QAAA,EAAU,eAAA,GAAkB,gBAAA;AAAA,iBA6QrC,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.mts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;AA8CA;;iBAAgB,QAAA,CAAS,QAAA,EAAU,eAAA,GAAkB,gBAAA;AAAA,iBA4QrC,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
1
+ {"version":3,"file":"generate.d.mts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;;AA8CA;iBAAgB,QAAA,CAAS,QAAA,EAAU,eAAA,GAAkB,gBAAA;AAAA,iBA6QrC,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
package/dist/generate.mjs CHANGED
@@ -22,7 +22,6 @@ import { generateStackManifest } from "./generators/stack-manifest.mjs";
22
22
  import { generateTraefikConfig } from "./generators/traefik.mjs";
23
23
  import { migrateConfig } from "./migrations.mjs";
24
24
  import { validate } from "./validator.mjs";
25
-
26
25
  //#region src/generate.ts
27
26
  /** Resolver/compose only support linux image platforms; normalize for bare-metal (windows/macos). */
28
27
  function getComposePlatform(platform) {
@@ -187,6 +186,7 @@ function generate(rawInput) {
187
186
  serviceCount: resolved.services.length,
188
187
  skillCount,
189
188
  estimatedMemoryMB: resolved.estimatedMemoryMB,
189
+ resolvedServices: resolved.services.map((s) => s.definition.id),
190
190
  generatedAt: (/* @__PURE__ */ new Date()).toISOString()
191
191
  }
192
192
  };
@@ -217,7 +217,7 @@ function generateServicesDoc(resolved) {
217
217
  }
218
218
  return lines.join("\n");
219
219
  }
220
-
221
220
  //#endregion
222
221
  export { generate, generateServicesDoc };
222
+
223
223
  //# sourceMappingURL=generate.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.mjs","names":[],"sources":["../src/generate.ts"],"sourcesContent":["import {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { composeMultiFile } from \"./composer.js\";\nimport { StackConfigError, ValidationError } from \"./errors.js\";\nimport { generateBareMetalInstall } from \"./generators/bare-metal-install.js\";\nimport { generateCaddyfile } from \"./generators/caddy.js\";\nimport { generateCloudInit } from \"./generators/cloud-init.js\";\nimport { generateEnvFiles } from \"./generators/env.js\";\nimport { generateGsdScripts } from \"./generators/get-shit-done.js\";\nimport { generateGrafanaConfig, generateGrafanaDashboard } from \"./generators/grafana.js\";\nimport { generateHealthCheck } from \"./generators/health-check.js\";\nimport { generateN8nWorkflows } from \"./generators/n8n-workflows.js\";\nimport { generateNativeInstallScripts } from \"./generators/native-services.js\";\nimport { generateOpenclawInstallScript } from \"./generators/openclaw-install-script.js\";\nimport { generateOpenClawConfig } from \"./generators/openclaw-json.js\";\nimport { generatePostgresInit } from \"./generators/postgres-init.js\";\nimport { generatePrometheusConfig } from \"./generators/prometheus.js\";\nimport { generateReadme } from \"./generators/readme.js\";\nimport { generateScripts } from \"./generators/scripts.js\";\nimport { generateSkillFiles } from \"./generators/skills.js\";\nimport { generateStackManifest } from \"./generators/stack-manifest.js\";\nimport { generateTraefikConfig } from \"./generators/traefik.js\";\nimport { migrateConfig } from \"./migrations.js\";\nimport { resolve } from \"./resolver.js\";\nimport type {\n\tGeneratedFiles,\n\tGenerationInput,\n\tGenerationResult,\n\tPlatform,\n\tResolverInput,\n} from \"./types.js\";\nimport { validate } from \"./validator.js\";\n\n/** Resolver/compose only support linux image platforms; normalize for bare-metal (windows/macos). */\nfunction getComposePlatform(platform: Platform): \"linux/amd64\" | \"linux/arm64\" {\n\tif (platform === \"linux/amd64\" || platform === \"linux/arm64\") return platform;\n\treturn \"linux/amd64\";\n}\n\n/**\n * Main orchestration function: takes generation input, resolves dependencies,\n * generates all files, validates, and returns the complete file tree.\n */\nexport function generate(rawInput: GenerationInput): GenerationResult {\n\t// Apply config migrations if needed\n\tconst input = migrateConfig(rawInput as Record<string, unknown>) as GenerationInput;\n\n\tconst composePlatform = getComposePlatform(input.platform);\n\n\t// 1. Resolve dependencies\n\tconst resolverInput: ResolverInput = {\n\t\tservices: input.services,\n\t\tskillPacks: input.skillPacks,\n\t\taiProviders: input.aiProviders,\n\t\tproxy: input.proxy,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tmonitoring: input.monitoring,\n\t};\n\tconst resolved = resolve(resolverInput);\n\n\tif (!resolved.isValid) {\n\t\tthrow new StackConfigError(\n\t\t\t`Invalid stack configuration: ${resolved.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst isBareMetal = input.deploymentType === \"bare-metal\";\n\tlet resolvedForCompose = resolved;\n\tlet nativeIds = new Set<string>();\n\tlet nativeServices: typeof resolved.services = [];\n\tlet dockerOnlyServices: typeof resolved.services = [];\n\n\tif (isBareMetal) {\n\t\tconst partition = partitionBareMetal(resolved, input.platform);\n\t\tnativeServices = partition.nativeServices;\n\t\tdockerOnlyServices = partition.dockerOnlyServices;\n\t\tnativeIds = partition.nativeIds;\n\t\tif (nativeServices.length > 0) {\n\t\t\tresolvedForCompose = resolvedWithOnlyServices(resolved, dockerOnlyServices);\n\t\t}\n\t}\n\n\t// 2. Generate Docker Compose YAML (multi-file)\n\t// Compute Traefik labels before composing (labels get injected into docker-compose services)\n\tlet traefikOutput: ReturnType<typeof generateTraefikConfig> | undefined;\n\tif (input.proxy === \"traefik\" && input.domain) {\n\t\ttraefikOutput = generateTraefikConfig(resolvedForCompose, input.domain);\n\t}\n\n\tconst composeOptions = {\n\t\tprojectName: input.projectName,\n\t\tproxy: input.proxy,\n\t\tproxyHttpPort: input.proxyHttpPort,\n\t\tproxyHttpsPort: input.proxyHttpsPort,\n\t\tportOverrides: input.portOverrides,\n\t\tdomain: input.domain,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tdeployment: input.deployment,\n\t\topenclawVersion: input.openclawVersion,\n\t\tbareMetalNativeHost: isBareMetal && nativeIds.size > 0,\n\t\ttraefikLabels: traefikOutput?.serviceLabels,\n\t\topenclawImage: input.openclawImage ?? \"official\",\n\t\thardened: input.hardened ?? true,\n\t\topenclawInstallMethod: input.openclawInstallMethod ?? \"docker\",\n\t};\n\tconst composeResult = composeMultiFile(resolvedForCompose, composeOptions);\n\n\t// 3. Validate (using the base docker-compose.yml)\n\tconst validation = validate(resolvedForCompose, composeResult.files[\"docker-compose.yml\"] ?? \"\", {\n\t\tdomain: input.domain,\n\t\tgenerateSecrets: input.generateSecrets,\n\t});\n\tif (!validation.valid) {\n\t\tthrow new ValidationError(\n\t\t\t`Validation failed: ${validation.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\t// 4. Generate all files\n\tconst files: GeneratedFiles = {};\n\n\t// Docker Compose (multi-file output)\n\tfor (const [filename, content] of Object.entries(composeResult.files)) {\n\t\tfiles[filename] = content;\n\t}\n\n\t// Environment files (when bare-metal with native services, host vars use host.docker.internal)\n\tconst envFiles = generateEnvFiles(resolved, {\n\t\tgenerateSecrets: input.generateSecrets,\n\t\tdomain: input.domain,\n\t\topenclawVersion: input.openclawVersion,\n\t\tnativeServiceIds: isBareMetal ? nativeIds : undefined,\n\t\tcomposeFiles: Object.keys(composeResult.files),\n\t\tcomposeProfiles: composeResult.profiles,\n\t\topenclawImage: input.openclawImage,\n\t});\n\tfiles[\".env.example\"] = envFiles.envExample;\n\tfiles[\".env\"] = envFiles.env;\n\n\t// .gitignore\n\tfiles[\".gitignore\"] = [\n\t\t\".env\",\n\t\t\".env.local\",\n\t\t\".env.*.local\",\n\t\t\"*.log\",\n\t\t\"docker-compose.override.yml\",\n\t].join(\"\\n\");\n\n\t// Stack manifest (consumed by Mission Control)\n\tconst manifestFiles = generateStackManifest(resolved, input);\n\tfor (const [path, content] of Object.entries(manifestFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Skills\n\tconst skillFiles = generateSkillFiles(resolved);\n\tfor (const [path, content] of Object.entries(skillFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// OpenClaw Core Configuration\n\tfiles[\"openclaw/config/openclaw.json\"] = generateOpenClawConfig(resolved, {\n\t\tdeploymentType: input.deploymentType,\n\t\tgatewayPort: 18789,\n\t\topenclawVersion: input.openclawVersion,\n\t});\n\n\t// README\n\tfiles[\"README.md\"] = generateReadme(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdomain: input.domain,\n\t\tproxy: input.proxy,\n\t\tdeploymentType: input.deploymentType,\n\t\thasNativeServices: isBareMetal && nativeServices.length > 0,\n\t\topenclawInstallMethod: input.openclawInstallMethod,\n\t});\n\n\t// Scripts\n\tconst scripts = generateScripts();\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Health check scripts (dynamic, stack-specific)\n\tconst healthCheckFiles = generateHealthCheck(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdeploymentType: input.deploymentType,\n\t});\n\tfor (const [path, content] of Object.entries(healthCheckFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// n8n workflows\n\tconst n8nWorkflows = generateN8nWorkflows(resolved);\n\tfor (const [path, content] of Object.entries(n8nWorkflows)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// PostgreSQL init script (creates per-service databases and users)\n\tconst postgresInit = generatePostgresInit(resolved);\n\tif (postgresInit) {\n\t\tfiles[\"postgres/init-databases.sh\"] = postgresInit;\n\t}\n\n\t// Caddy config\n\tif (input.proxy === \"caddy\" && input.domain) {\n\t\tfiles[\"caddy/Caddyfile\"] = generateCaddyfile(resolved, input.domain);\n\t}\n\n\t// Traefik config (labels are already injected via composeOptions.traefikLabels)\n\tif (traefikOutput) {\n\t\tfiles[\"traefik/traefik.yml\"] = traefikOutput.staticConfig;\n\t}\n\n\t// Prometheus config\n\tconst hasPrometheus = resolved.services.some((s) => s.definition.id === \"prometheus\");\n\tif (hasPrometheus) {\n\t\tfiles[\"prometheus/prometheus.yml\"] = generatePrometheusConfig(resolved);\n\t}\n\n\t// Grafana config\n\tconst hasGrafana = resolved.services.some((s) => s.definition.id === \"grafana\");\n\tif (hasGrafana) {\n\t\tconst grafanaFiles = generateGrafanaConfig();\n\t\tfor (const [path, content] of Object.entries(grafanaFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t\t// Grafana dashboard\n\t\tfiles[\"config/grafana/dashboards/openclaw-stack-overview.json\"] = generateGrafanaDashboard();\n\t}\n\n\t// Docker Compose override (empty template)\n\tfiles[\"docker-compose.override.yml\"] = [\n\t\t\"# Local overrides for docker-compose.yml\",\n\t\t\"# This file is gitignored — use it for personal port changes, extra volumes, etc.\",\n\t\t\"services: {}\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\t// SERVICES.md documentation\n\tfiles[\"docs/SERVICES.md\"] = generateServicesDoc(resolved);\n\n\t// Bare-metal: native install scripts + top-level installer\n\tif (isBareMetal) {\n\t\tif (nativeServices.length > 0) {\n\t\t\tconst nativePlatform = platformToNativePlatform(input.platform);\n\t\t\tconst nativeScripts = generateNativeInstallScripts({\n\t\t\t\tnativeServices,\n\t\t\t\tplatform: nativePlatform,\n\t\t\t\tprojectName: input.projectName,\n\t\t\t});\n\t\t\tfor (const [path, content] of Object.entries(nativeScripts)) {\n\t\t\t\tfiles[path] = content;\n\t\t\t}\n\t\t}\n\t\tconst bareMetalFiles = generateBareMetalInstall({\n\t\t\tplatform: input.platform,\n\t\t\tprojectName: input.projectName,\n\t\t\thasNativeServices: nativeServices.length > 0,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(bareMetalFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Get-Shit-Done setup scripts\n\tif (input.gsdRuntimes && input.gsdRuntimes.length > 0) {\n\t\tconst gsdScripts = generateGsdScripts(input.gsdRuntimes);\n\t\tif (gsdScripts) {\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.sh\"] = gsdScripts.sh;\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.ps1\"] = gsdScripts.ps1;\n\t\t}\n\t}\n\n\t// OpenClaw direct install scripts (host-based, no Docker gateway)\n\tif (input.openclawInstallMethod === \"direct\") {\n\t\tconst installScripts = generateOpenclawInstallScript({\n\t\t\tprojectName: input.projectName,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(installScripts)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Cloud-init deploy target\n\tif (input.deployTarget === \"cloud-init\") {\n\t\tconst mainCompose = composeResult.files[\"docker-compose.yml\"] ?? \"\";\n\t\tfiles[\"cloud-init.yml\"] = generateCloudInit({\n\t\t\tcomposeYaml: mainCompose,\n\t\t\tenvContent: envFiles.env,\n\t\t\tprojectName: input.projectName,\n\t\t\tgatewayPort: 18789,\n\t\t});\n\t}\n\n\t// 5. Calculate metadata\n\tconst skillCount = resolved.services.reduce((sum, s) => sum + s.definition.skills.length, 0);\n\n\treturn {\n\t\tfiles,\n\t\tmetadata: {\n\t\t\tserviceCount: resolved.services.length,\n\t\t\tskillCount,\n\t\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\n\t\t\tgeneratedAt: new Date().toISOString(),\n\t\t},\n\t};\n}\n\nexport function generateServicesDoc(resolved: import(\"./types.js\").ResolverOutput): string {\n\tconst lines: string[] = [\n\t\t\"# Service Reference\",\n\t\t\"\",\n\t\t\"This document describes all companion services in your OpenClaw stack.\",\n\t\t\"\",\n\t];\n\n\tfor (const svc of resolved.services) {\n\t\tconst def = svc.definition;\n\t\tlines.push(`## ${def.icon} ${def.name}`);\n\t\tlines.push(\"\");\n\t\tlines.push(def.description);\n\t\tlines.push(\"\");\n\t\tlines.push(`- **Image**: \\`${def.image}:${def.imageTag}\\``);\n\t\tlines.push(`- **Category**: ${def.category}`);\n\t\tlines.push(`- **Maturity**: ${def.maturity}`);\n\t\tif (def.minMemoryMB) {\n\t\t\tlines.push(`- **Min Memory**: ${def.minMemoryMB}MB`);\n\t\t}\n\t\tif (def.ports.length > 0) {\n\t\t\tlines.push(\"- **Ports**:\");\n\t\t\tfor (const p of def.ports) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` - \\`${p.container}\\` — ${p.description}${p.exposed ? \"\" : \" (internal only)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tlines.push(`- **Docs**: ${def.docsUrl}`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.mjs","names":[],"sources":["../src/generate.ts"],"sourcesContent":["import {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { composeMultiFile } from \"./composer.js\";\nimport { StackConfigError, ValidationError } from \"./errors.js\";\nimport { generateBareMetalInstall } from \"./generators/bare-metal-install.js\";\nimport { generateCaddyfile } from \"./generators/caddy.js\";\nimport { generateCloudInit } from \"./generators/cloud-init.js\";\nimport { generateEnvFiles } from \"./generators/env.js\";\nimport { generateGsdScripts } from \"./generators/get-shit-done.js\";\nimport { generateGrafanaConfig, generateGrafanaDashboard } from \"./generators/grafana.js\";\nimport { generateHealthCheck } from \"./generators/health-check.js\";\nimport { generateN8nWorkflows } from \"./generators/n8n-workflows.js\";\nimport { generateNativeInstallScripts } from \"./generators/native-services.js\";\nimport { generateOpenclawInstallScript } from \"./generators/openclaw-install-script.js\";\nimport { generateOpenClawConfig } from \"./generators/openclaw-json.js\";\nimport { generatePostgresInit } from \"./generators/postgres-init.js\";\nimport { generatePrometheusConfig } from \"./generators/prometheus.js\";\nimport { generateReadme } from \"./generators/readme.js\";\nimport { generateScripts } from \"./generators/scripts.js\";\nimport { generateSkillFiles } from \"./generators/skills.js\";\nimport { generateStackManifest } from \"./generators/stack-manifest.js\";\nimport { generateTraefikConfig } from \"./generators/traefik.js\";\nimport { migrateConfig } from \"./migrations.js\";\nimport { resolve } from \"./resolver.js\";\nimport type {\n\tGeneratedFiles,\n\tGenerationInput,\n\tGenerationResult,\n\tPlatform,\n\tResolverInput,\n} from \"./types.js\";\nimport { validate } from \"./validator.js\";\n\n/** Resolver/compose only support linux image platforms; normalize for bare-metal (windows/macos). */\nfunction getComposePlatform(platform: Platform): \"linux/amd64\" | \"linux/arm64\" {\n\tif (platform === \"linux/amd64\" || platform === \"linux/arm64\") return platform;\n\treturn \"linux/amd64\";\n}\n\n/**\n * Main orchestration function: takes generation input, resolves dependencies,\n * generates all files, validates, and returns the complete file tree.\n */\nexport function generate(rawInput: GenerationInput): GenerationResult {\n\t// Apply config migrations if needed\n\tconst input = migrateConfig(rawInput as Record<string, unknown>) as GenerationInput;\n\n\tconst composePlatform = getComposePlatform(input.platform);\n\n\t// 1. Resolve dependencies\n\tconst resolverInput: ResolverInput = {\n\t\tservices: input.services,\n\t\tskillPacks: input.skillPacks,\n\t\taiProviders: input.aiProviders,\n\t\tproxy: input.proxy,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tmonitoring: input.monitoring,\n\t};\n\tconst resolved = resolve(resolverInput);\n\n\tif (!resolved.isValid) {\n\t\tthrow new StackConfigError(\n\t\t\t`Invalid stack configuration: ${resolved.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst isBareMetal = input.deploymentType === \"bare-metal\";\n\tlet resolvedForCompose = resolved;\n\tlet nativeIds = new Set<string>();\n\tlet nativeServices: typeof resolved.services = [];\n\tlet dockerOnlyServices: typeof resolved.services = [];\n\n\tif (isBareMetal) {\n\t\tconst partition = partitionBareMetal(resolved, input.platform);\n\t\tnativeServices = partition.nativeServices;\n\t\tdockerOnlyServices = partition.dockerOnlyServices;\n\t\tnativeIds = partition.nativeIds;\n\t\tif (nativeServices.length > 0) {\n\t\t\tresolvedForCompose = resolvedWithOnlyServices(resolved, dockerOnlyServices);\n\t\t}\n\t}\n\n\t// 2. Generate Docker Compose YAML (multi-file)\n\t// Compute Traefik labels before composing (labels get injected into docker-compose services)\n\tlet traefikOutput: ReturnType<typeof generateTraefikConfig> | undefined;\n\tif (input.proxy === \"traefik\" && input.domain) {\n\t\ttraefikOutput = generateTraefikConfig(resolvedForCompose, input.domain);\n\t}\n\n\tconst composeOptions = {\n\t\tprojectName: input.projectName,\n\t\tproxy: input.proxy,\n\t\tproxyHttpPort: input.proxyHttpPort,\n\t\tproxyHttpsPort: input.proxyHttpsPort,\n\t\tportOverrides: input.portOverrides,\n\t\tdomain: input.domain,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tdeployment: input.deployment,\n\t\topenclawVersion: input.openclawVersion,\n\t\tbareMetalNativeHost: isBareMetal && nativeIds.size > 0,\n\t\ttraefikLabels: traefikOutput?.serviceLabels,\n\t\topenclawImage: input.openclawImage ?? \"official\",\n\t\thardened: input.hardened ?? true,\n\t\topenclawInstallMethod: input.openclawInstallMethod ?? \"docker\",\n\t};\n\tconst composeResult = composeMultiFile(resolvedForCompose, composeOptions);\n\n\t// 3. Validate (using the base docker-compose.yml)\n\tconst validation = validate(resolvedForCompose, composeResult.files[\"docker-compose.yml\"] ?? \"\", {\n\t\tdomain: input.domain,\n\t\tgenerateSecrets: input.generateSecrets,\n\t});\n\tif (!validation.valid) {\n\t\tthrow new ValidationError(\n\t\t\t`Validation failed: ${validation.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\t// 4. Generate all files\n\tconst files: GeneratedFiles = {};\n\n\t// Docker Compose (multi-file output)\n\tfor (const [filename, content] of Object.entries(composeResult.files)) {\n\t\tfiles[filename] = content;\n\t}\n\n\t// Environment files (when bare-metal with native services, host vars use host.docker.internal)\n\tconst envFiles = generateEnvFiles(resolved, {\n\t\tgenerateSecrets: input.generateSecrets,\n\t\tdomain: input.domain,\n\t\topenclawVersion: input.openclawVersion,\n\t\tnativeServiceIds: isBareMetal ? nativeIds : undefined,\n\t\tcomposeFiles: Object.keys(composeResult.files),\n\t\tcomposeProfiles: composeResult.profiles,\n\t\topenclawImage: input.openclawImage,\n\t});\n\tfiles[\".env.example\"] = envFiles.envExample;\n\tfiles[\".env\"] = envFiles.env;\n\n\t// .gitignore\n\tfiles[\".gitignore\"] = [\n\t\t\".env\",\n\t\t\".env.local\",\n\t\t\".env.*.local\",\n\t\t\"*.log\",\n\t\t\"docker-compose.override.yml\",\n\t].join(\"\\n\");\n\n\t// Stack manifest (consumed by Mission Control)\n\tconst manifestFiles = generateStackManifest(resolved, input);\n\tfor (const [path, content] of Object.entries(manifestFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Skills\n\tconst skillFiles = generateSkillFiles(resolved);\n\tfor (const [path, content] of Object.entries(skillFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// OpenClaw Core Configuration\n\tfiles[\"openclaw/config/openclaw.json\"] = generateOpenClawConfig(resolved, {\n\t\tdeploymentType: input.deploymentType,\n\t\tgatewayPort: 18789,\n\t\topenclawVersion: input.openclawVersion,\n\t});\n\n\t// README\n\tfiles[\"README.md\"] = generateReadme(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdomain: input.domain,\n\t\tproxy: input.proxy,\n\t\tdeploymentType: input.deploymentType,\n\t\thasNativeServices: isBareMetal && nativeServices.length > 0,\n\t\topenclawInstallMethod: input.openclawInstallMethod,\n\t});\n\n\t// Scripts\n\tconst scripts = generateScripts();\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Health check scripts (dynamic, stack-specific)\n\tconst healthCheckFiles = generateHealthCheck(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdeploymentType: input.deploymentType,\n\t});\n\tfor (const [path, content] of Object.entries(healthCheckFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// n8n workflows\n\tconst n8nWorkflows = generateN8nWorkflows(resolved);\n\tfor (const [path, content] of Object.entries(n8nWorkflows)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// PostgreSQL init script (creates per-service databases and users)\n\tconst postgresInit = generatePostgresInit(resolved);\n\tif (postgresInit) {\n\t\tfiles[\"postgres/init-databases.sh\"] = postgresInit;\n\t}\n\n\t// Caddy config\n\tif (input.proxy === \"caddy\" && input.domain) {\n\t\tfiles[\"caddy/Caddyfile\"] = generateCaddyfile(resolved, input.domain);\n\t}\n\n\t// Traefik config (labels are already injected via composeOptions.traefikLabels)\n\tif (traefikOutput) {\n\t\tfiles[\"traefik/traefik.yml\"] = traefikOutput.staticConfig;\n\t}\n\n\t// Prometheus config\n\tconst hasPrometheus = resolved.services.some((s) => s.definition.id === \"prometheus\");\n\tif (hasPrometheus) {\n\t\tfiles[\"prometheus/prometheus.yml\"] = generatePrometheusConfig(resolved);\n\t}\n\n\t// Grafana config\n\tconst hasGrafana = resolved.services.some((s) => s.definition.id === \"grafana\");\n\tif (hasGrafana) {\n\t\tconst grafanaFiles = generateGrafanaConfig();\n\t\tfor (const [path, content] of Object.entries(grafanaFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t\t// Grafana dashboard\n\t\tfiles[\"config/grafana/dashboards/openclaw-stack-overview.json\"] = generateGrafanaDashboard();\n\t}\n\n\t// Docker Compose override (empty template)\n\tfiles[\"docker-compose.override.yml\"] = [\n\t\t\"# Local overrides for docker-compose.yml\",\n\t\t\"# This file is gitignored — use it for personal port changes, extra volumes, etc.\",\n\t\t\"services: {}\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\t// SERVICES.md documentation\n\tfiles[\"docs/SERVICES.md\"] = generateServicesDoc(resolved);\n\n\t// Bare-metal: native install scripts + top-level installer\n\tif (isBareMetal) {\n\t\tif (nativeServices.length > 0) {\n\t\t\tconst nativePlatform = platformToNativePlatform(input.platform);\n\t\t\tconst nativeScripts = generateNativeInstallScripts({\n\t\t\t\tnativeServices,\n\t\t\t\tplatform: nativePlatform,\n\t\t\t\tprojectName: input.projectName,\n\t\t\t});\n\t\t\tfor (const [path, content] of Object.entries(nativeScripts)) {\n\t\t\t\tfiles[path] = content;\n\t\t\t}\n\t\t}\n\t\tconst bareMetalFiles = generateBareMetalInstall({\n\t\t\tplatform: input.platform,\n\t\t\tprojectName: input.projectName,\n\t\t\thasNativeServices: nativeServices.length > 0,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(bareMetalFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Get-Shit-Done setup scripts\n\tif (input.gsdRuntimes && input.gsdRuntimes.length > 0) {\n\t\tconst gsdScripts = generateGsdScripts(input.gsdRuntimes);\n\t\tif (gsdScripts) {\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.sh\"] = gsdScripts.sh;\n\t\t\tfiles[\"openclaw/scripts/setup-gsd.ps1\"] = gsdScripts.ps1;\n\t\t}\n\t}\n\n\t// OpenClaw direct install scripts (host-based, no Docker gateway)\n\tif (input.openclawInstallMethod === \"direct\") {\n\t\tconst installScripts = generateOpenclawInstallScript({\n\t\t\tprojectName: input.projectName,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(installScripts)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// Cloud-init deploy target\n\tif (input.deployTarget === \"cloud-init\") {\n\t\tconst mainCompose = composeResult.files[\"docker-compose.yml\"] ?? \"\";\n\t\tfiles[\"cloud-init.yml\"] = generateCloudInit({\n\t\t\tcomposeYaml: mainCompose,\n\t\t\tenvContent: envFiles.env,\n\t\t\tprojectName: input.projectName,\n\t\t\tgatewayPort: 18789,\n\t\t});\n\t}\n\n\t// 5. Calculate metadata\n\tconst skillCount = resolved.services.reduce((sum, s) => sum + s.definition.skills.length, 0);\n\n\treturn {\n\t\tfiles,\n\t\tmetadata: {\n\t\t\tserviceCount: resolved.services.length,\n\t\t\tskillCount,\n\t\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\n\t\t\tresolvedServices: resolved.services.map((s) => s.definition.id),\n\t\t\tgeneratedAt: new Date().toISOString(),\n\t\t},\n\t};\n}\n\nexport function generateServicesDoc(resolved: import(\"./types.js\").ResolverOutput): string {\n\tconst lines: string[] = [\n\t\t\"# Service Reference\",\n\t\t\"\",\n\t\t\"This document describes all companion services in your OpenClaw stack.\",\n\t\t\"\",\n\t];\n\n\tfor (const svc of resolved.services) {\n\t\tconst def = svc.definition;\n\t\tlines.push(`## ${def.icon} ${def.name}`);\n\t\tlines.push(\"\");\n\t\tlines.push(def.description);\n\t\tlines.push(\"\");\n\t\tlines.push(`- **Image**: \\`${def.image}:${def.imageTag}\\``);\n\t\tlines.push(`- **Category**: ${def.category}`);\n\t\tlines.push(`- **Maturity**: ${def.maturity}`);\n\t\tif (def.minMemoryMB) {\n\t\t\tlines.push(`- **Min Memory**: ${def.minMemoryMB}MB`);\n\t\t}\n\t\tif (def.ports.length > 0) {\n\t\t\tlines.push(\"- **Ports**:\");\n\t\t\tfor (const p of def.ports) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` - \\`${p.container}\\` — ${p.description}${p.exposed ? \"\" : \" (internal only)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tlines.push(`- **Docs**: ${def.docsUrl}`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- const require_chunk = require('./chunk-C0xms8kb.cjs');
2
- const require_vi_2VT5v0um = require('./vi.2VT5v0um-BmRMvymT.cjs');
3
- const require_generate = require('./generate.cjs');
1
+ require("./skills-BlzpHmpH.cjs");
2
+ const require_vi_2VT5v0um = require("./vi.2VT5v0um-CRqXre87.cjs");
3
+ const require_generate = require("./generate.cjs");
4
4
  let yaml = require("yaml");
5
-
6
5
  //#region src/generate.test.ts
7
6
  require_vi_2VT5v0um.describe("generate (end-to-end)", () => {
8
7
  require_vi_2VT5v0um.it("generates a minimal stack (redis only)", () => {
@@ -278,6 +277,6 @@ require_vi_2VT5v0um.describe("generate (end-to-end)", () => {
278
277
  }
279
278
  });
280
279
  });
281
-
282
280
  //#endregion
281
+
283
282
  //# sourceMappingURL=generate.test.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.test.cjs","names":["describe","generate"],"sources":["../src/generate.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { generate } from \"./generate.js\";\n\ndescribe(\"generate (end-to-end)\", () => {\n\tit(\"generates a minimal stack (redis only)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"test-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Core files must be present\n\t\texpect(result.files).toHaveProperty(\"docker-compose.yml\");\n\t\texpect(result.files).toHaveProperty(\".env.example\");\n\t\texpect(result.files).toHaveProperty(\".env\");\n\t\texpect(result.files).toHaveProperty(\"README.md\");\n\n\t\t// docker-compose.yml must be valid YAML\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed).toHaveProperty(\"services\");\n\n\t\t// .env.example should reference REDIS_PASSWORD\n\t\texpect(result.files[\".env.example\"]).toContain(\"REDIS_PASSWORD\");\n\n\t\t// README should mention the project name\n\t\texpect(result.files[\"README.md\"]).toContain(\"test-stack\");\n\n\t\t// At least one service resolved\n\t\texpect(result.metadata.serviceCount).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"generates research-agent stack from skill pack\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"research-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Skill SKILL.md files for each skill in the research-agent pack\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/qdrant-memory/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/searxng-search/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/browserless-browse/SKILL.md\");\n\n\t\t// docker-compose.yml should contain the expected services\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).toHaveProperty(\"qdrant\");\n\t\texpect(composed.services).toHaveProperty(\"searxng\");\n\t\texpect(composed.services).toHaveProperty(\"browserless\");\n\t});\n\n\tit(\"generates full preset stack\", () => {\n\t\tconst fullServices = [\n\t\t\t\"redis\",\n\t\t\t\"postgresql\",\n\t\t\t\"qdrant\",\n\t\t\t\"n8n\",\n\t\t\t\"ffmpeg\",\n\t\t\t\"remotion\",\n\t\t\t\"minio\",\n\t\t\t\"caddy\",\n\t\t\t\"browserless\",\n\t\t\t\"searxng\",\n\t\t\t\"meilisearch\",\n\t\t\t\"uptime-kuma\",\n\t\t\t\"grafana\",\n\t\t\t\"prometheus\",\n\t\t\t\"ollama\",\n\t\t\t\"whisper\",\n\t\t\t\"gotify\",\n\t\t];\n\n\t\tconst result = generate({\n\t\t\tprojectName: \"full-stack\",\n\t\t\tservices: fullServices,\n\t\t\tskillPacks: [\n\t\t\t\t\"video-creator\",\n\t\t\t\t\"research-agent\",\n\t\t\t\t\"social-media\",\n\t\t\t\t\"dev-ops\",\n\t\t\t\t\"knowledge-base\",\n\t\t\t\t\"local-ai\",\n\t\t\t],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Should have many files\n\t\tconst fileCount = Object.keys(result.files).length;\n\t\texpect(fileCount).toBeGreaterThan(10);\n\n\t\t// Should include the start script\n\t\texpect(result.files).toHaveProperty(\"scripts/start.sh\");\n\n\t\t// Should not throw (it already didn't if we got here)\n\t\texpect(result.metadata.serviceCount).toBeGreaterThan(5);\n\t});\n\n\tit(\"generates caddy config when proxy is caddy\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"caddy-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"generates prometheus config when monitoring enabled\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"monitored-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t\tmonitoring: true,\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"prometheus/prometheus.yml\");\n\t\t// Verify it's valid YAML\n\t\tconst promConfig = parse(result.files[\"prometheus/prometheus.yml\"]!);\n\t\texpect(promConfig).toBeDefined();\n\t});\n\n\tit(\"generates La Suite Meet stack with all expected services\", () => {\n\t\tconst lasuiteMeetServices = [\n\t\t\t\"postgresql\",\n\t\t\t\"redis\",\n\t\t\t\"livekit\",\n\t\t\t\"lasuite-meet-backend\",\n\t\t\t\"lasuite-meet-frontend\",\n\t\t\t\"lasuite-meet-agents\",\n\t\t];\n\t\tconst result = generate({\n\t\t\tprojectName: \"lasuite-meet-stack\",\n\t\t\tservices: lasuiteMeetServices,\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Services may be split across main and profile compose files\n\t\tconst allServiceIds = new Set<string>();\n\t\tfor (const [filename, content] of Object.entries(result.files)) {\n\t\t\tif (filename.endsWith(\".yml\") && content) {\n\t\t\t\tconst doc = parse(content);\n\t\t\t\tif (doc?.services && typeof doc.services === \"object\") {\n\t\t\t\t\tfor (const id of Object.keys(doc.services)) {\n\t\t\t\t\t\tallServiceIds.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const id of lasuiteMeetServices) {\n\t\t\texpect(allServiceIds.has(id), `missing service ${id}`).toBe(true);\n\t\t}\n\t\texpect(result.metadata.serviceCount).toBe(lasuiteMeetServices.length);\n\t});\n\n\tit(\"generates bare-metal installer for Windows (install.ps1)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"win-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.ps1\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"generates bare-metal installer for Linux/macOS (install.sh)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"linux-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.sh\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"bare-metal with redis on Linux: native script, compose excludes redis, gateway has extra_hosts\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"bare-metal-redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Native install script for Linux\n\t\texpect(result.files).toHaveProperty(\"native/install-linux.sh\");\n\t\texpect(result.files[\"native/install-linux.sh\"]).toContain(\"redis\");\n\n\t\t// Docker compose must NOT include redis (native); only gateway/openclaw\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).not.toHaveProperty(\"redis\");\n\t\texpect(composed.services).toHaveProperty(\"openclaw-gateway\");\n\n\t\t// Gateway must have extra_hosts for host.docker.internal\n\t\tconst gateway = composed.services[\"openclaw-gateway\"];\n\t\texpect(gateway).toBeDefined();\n\t\texpect(gateway.extra_hosts).toBeDefined();\n\t\texpect(\n\t\t\t(gateway.extra_hosts as string[]).some(\n\t\t\t\t(h: string) => h.includes(\"host.docker.internal\") && h.includes(\"host-gateway\"),\n\t\t\t),\n\t\t).toBe(true);\n\n\t\t// .env should set REDIS_HOST to host.docker.internal for gateway to reach native Redis\n\t\texpect(result.files[\".env\"]).toContain(\"REDIS_HOST=host.docker.internal\");\n\t});\n\n\tit(\"throws on conflicting services\", () => {\n\t\texpect(() =>\n\t\t\tgenerate({\n\t\t\t\tprojectName: \"conflict-stack\",\n\t\t\t\tservices: [\"redis\", \"valkey\"],\n\t\t\t\tskillPacks: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tgenerateSecrets: true,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n\n\tit(\"generates scripts directory\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"scripts-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result.files).toHaveProperty(script);\n\t\t\texpect(result.files[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"all generated .env.example vars have comments\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"env-comments-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst envExample = result.files[\".env.example\"]!;\n\t\tconst lines = envExample.split(\"\\n\");\n\n\t\t// Walk through lines: every non-empty, non-comment KEY=VALUE line should\n\t\t// have a preceding comment line (starting with #).\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i]!.trim();\n\t\t\tif (line === \"\" || line.startsWith(\"#\")) continue;\n\n\t\t\t// This line looks like KEY=VALUE\n\t\t\tif (line.includes(\"=\")) {\n\t\t\t\t// There must be a comment somewhere before it (look backwards for a # line)\n\t\t\t\tlet foundComment = false;\n\t\t\t\tfor (let j = i - 1; j >= 0; j--) {\n\t\t\t\t\tconst prev = lines[j]!.trim();\n\t\t\t\t\tif (prev === \"\") continue; // skip blank lines\n\t\t\t\t\tif (prev.startsWith(\"#\")) {\n\t\t\t\t\t\tfoundComment = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// Hit another non-comment, non-empty line — no comment found\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\texpect(foundComment).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.test.cjs","names":["describe","generate"],"sources":["../src/generate.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { generate } from \"./generate.js\";\n\ndescribe(\"generate (end-to-end)\", () => {\n\tit(\"generates a minimal stack (redis only)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"test-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Core files must be present\n\t\texpect(result.files).toHaveProperty(\"docker-compose.yml\");\n\t\texpect(result.files).toHaveProperty(\".env.example\");\n\t\texpect(result.files).toHaveProperty(\".env\");\n\t\texpect(result.files).toHaveProperty(\"README.md\");\n\n\t\t// docker-compose.yml must be valid YAML\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed).toHaveProperty(\"services\");\n\n\t\t// .env.example should reference REDIS_PASSWORD\n\t\texpect(result.files[\".env.example\"]).toContain(\"REDIS_PASSWORD\");\n\n\t\t// README should mention the project name\n\t\texpect(result.files[\"README.md\"]).toContain(\"test-stack\");\n\n\t\t// At least one service resolved\n\t\texpect(result.metadata.serviceCount).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"generates research-agent stack from skill pack\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"research-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Skill SKILL.md files for each skill in the research-agent pack\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/qdrant-memory/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/searxng-search/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/browserless-browse/SKILL.md\");\n\n\t\t// docker-compose.yml should contain the expected services\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).toHaveProperty(\"qdrant\");\n\t\texpect(composed.services).toHaveProperty(\"searxng\");\n\t\texpect(composed.services).toHaveProperty(\"browserless\");\n\t});\n\n\tit(\"generates full preset stack\", () => {\n\t\tconst fullServices = [\n\t\t\t\"redis\",\n\t\t\t\"postgresql\",\n\t\t\t\"qdrant\",\n\t\t\t\"n8n\",\n\t\t\t\"ffmpeg\",\n\t\t\t\"remotion\",\n\t\t\t\"minio\",\n\t\t\t\"caddy\",\n\t\t\t\"browserless\",\n\t\t\t\"searxng\",\n\t\t\t\"meilisearch\",\n\t\t\t\"uptime-kuma\",\n\t\t\t\"grafana\",\n\t\t\t\"prometheus\",\n\t\t\t\"ollama\",\n\t\t\t\"whisper\",\n\t\t\t\"gotify\",\n\t\t];\n\n\t\tconst result = generate({\n\t\t\tprojectName: \"full-stack\",\n\t\t\tservices: fullServices,\n\t\t\tskillPacks: [\n\t\t\t\t\"video-creator\",\n\t\t\t\t\"research-agent\",\n\t\t\t\t\"social-media\",\n\t\t\t\t\"dev-ops\",\n\t\t\t\t\"knowledge-base\",\n\t\t\t\t\"local-ai\",\n\t\t\t],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Should have many files\n\t\tconst fileCount = Object.keys(result.files).length;\n\t\texpect(fileCount).toBeGreaterThan(10);\n\n\t\t// Should include the start script\n\t\texpect(result.files).toHaveProperty(\"scripts/start.sh\");\n\n\t\t// Should not throw (it already didn't if we got here)\n\t\texpect(result.metadata.serviceCount).toBeGreaterThan(5);\n\t});\n\n\tit(\"generates caddy config when proxy is caddy\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"caddy-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"generates prometheus config when monitoring enabled\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"monitored-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t\tmonitoring: true,\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"prometheus/prometheus.yml\");\n\t\t// Verify it's valid YAML\n\t\tconst promConfig = parse(result.files[\"prometheus/prometheus.yml\"]!);\n\t\texpect(promConfig).toBeDefined();\n\t});\n\n\tit(\"generates La Suite Meet stack with all expected services\", () => {\n\t\tconst lasuiteMeetServices = [\n\t\t\t\"postgresql\",\n\t\t\t\"redis\",\n\t\t\t\"livekit\",\n\t\t\t\"lasuite-meet-backend\",\n\t\t\t\"lasuite-meet-frontend\",\n\t\t\t\"lasuite-meet-agents\",\n\t\t];\n\t\tconst result = generate({\n\t\t\tprojectName: \"lasuite-meet-stack\",\n\t\t\tservices: lasuiteMeetServices,\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Services may be split across main and profile compose files\n\t\tconst allServiceIds = new Set<string>();\n\t\tfor (const [filename, content] of Object.entries(result.files)) {\n\t\t\tif (filename.endsWith(\".yml\") && content) {\n\t\t\t\tconst doc = parse(content);\n\t\t\t\tif (doc?.services && typeof doc.services === \"object\") {\n\t\t\t\t\tfor (const id of Object.keys(doc.services)) {\n\t\t\t\t\t\tallServiceIds.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const id of lasuiteMeetServices) {\n\t\t\texpect(allServiceIds.has(id), `missing service ${id}`).toBe(true);\n\t\t}\n\t\texpect(result.metadata.serviceCount).toBe(lasuiteMeetServices.length);\n\t});\n\n\tit(\"generates bare-metal installer for Windows (install.ps1)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"win-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.ps1\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"generates bare-metal installer for Linux/macOS (install.sh)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"linux-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.sh\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"bare-metal with redis on Linux: native script, compose excludes redis, gateway has extra_hosts\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"bare-metal-redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Native install script for Linux\n\t\texpect(result.files).toHaveProperty(\"native/install-linux.sh\");\n\t\texpect(result.files[\"native/install-linux.sh\"]).toContain(\"redis\");\n\n\t\t// Docker compose must NOT include redis (native); only gateway/openclaw\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).not.toHaveProperty(\"redis\");\n\t\texpect(composed.services).toHaveProperty(\"openclaw-gateway\");\n\n\t\t// Gateway must have extra_hosts for host.docker.internal\n\t\tconst gateway = composed.services[\"openclaw-gateway\"];\n\t\texpect(gateway).toBeDefined();\n\t\texpect(gateway.extra_hosts).toBeDefined();\n\t\texpect(\n\t\t\t(gateway.extra_hosts as string[]).some(\n\t\t\t\t(h: string) => h.includes(\"host.docker.internal\") && h.includes(\"host-gateway\"),\n\t\t\t),\n\t\t).toBe(true);\n\n\t\t// .env should set REDIS_HOST to host.docker.internal for gateway to reach native Redis\n\t\texpect(result.files[\".env\"]).toContain(\"REDIS_HOST=host.docker.internal\");\n\t});\n\n\tit(\"throws on conflicting services\", () => {\n\t\texpect(() =>\n\t\t\tgenerate({\n\t\t\t\tprojectName: \"conflict-stack\",\n\t\t\t\tservices: [\"redis\", \"valkey\"],\n\t\t\t\tskillPacks: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tgenerateSecrets: true,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n\n\tit(\"generates scripts directory\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"scripts-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result.files).toHaveProperty(script);\n\t\t\texpect(result.files[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"all generated .env.example vars have comments\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"env-comments-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst envExample = result.files[\".env.example\"]!;\n\t\tconst lines = envExample.split(\"\\n\");\n\n\t\t// Walk through lines: every non-empty, non-comment KEY=VALUE line should\n\t\t// have a preceding comment line (starting with #).\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i]!.trim();\n\t\t\tif (line === \"\" || line.startsWith(\"#\")) continue;\n\n\t\t\t// This line looks like KEY=VALUE\n\t\t\tif (line.includes(\"=\")) {\n\t\t\t\t// There must be a comment somewhere before it (look backwards for a # line)\n\t\t\t\tlet foundComment = false;\n\t\t\t\tfor (let j = i - 1; j >= 0; j--) {\n\t\t\t\t\tconst prev = lines[j]!.trim();\n\t\t\t\t\tif (prev === \"\") continue; // skip blank lines\n\t\t\t\t\tif (prev.startsWith(\"#\")) {\n\t\t\t\t\t\tfoundComment = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// Hit another non-comment, non-empty line — no comment found\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\texpect(foundComment).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n});\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
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
3
  import { parse } from "yaml";
4
-
5
4
  //#region src/generate.test.ts
6
5
  describe("generate (end-to-end)", () => {
7
6
  it("generates a minimal stack (redis only)", () => {
@@ -277,7 +276,7 @@ describe("generate (end-to-end)", () => {
277
276
  }
278
277
  });
279
278
  });
280
-
281
279
  //#endregion
282
- export { };
280
+ export {};
281
+
283
282
  //# sourceMappingURL=generate.test.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.test.mjs","names":[],"sources":["../src/generate.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { generate } from \"./generate.js\";\n\ndescribe(\"generate (end-to-end)\", () => {\n\tit(\"generates a minimal stack (redis only)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"test-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Core files must be present\n\t\texpect(result.files).toHaveProperty(\"docker-compose.yml\");\n\t\texpect(result.files).toHaveProperty(\".env.example\");\n\t\texpect(result.files).toHaveProperty(\".env\");\n\t\texpect(result.files).toHaveProperty(\"README.md\");\n\n\t\t// docker-compose.yml must be valid YAML\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed).toHaveProperty(\"services\");\n\n\t\t// .env.example should reference REDIS_PASSWORD\n\t\texpect(result.files[\".env.example\"]).toContain(\"REDIS_PASSWORD\");\n\n\t\t// README should mention the project name\n\t\texpect(result.files[\"README.md\"]).toContain(\"test-stack\");\n\n\t\t// At least one service resolved\n\t\texpect(result.metadata.serviceCount).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"generates research-agent stack from skill pack\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"research-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Skill SKILL.md files for each skill in the research-agent pack\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/qdrant-memory/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/searxng-search/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/browserless-browse/SKILL.md\");\n\n\t\t// docker-compose.yml should contain the expected services\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).toHaveProperty(\"qdrant\");\n\t\texpect(composed.services).toHaveProperty(\"searxng\");\n\t\texpect(composed.services).toHaveProperty(\"browserless\");\n\t});\n\n\tit(\"generates full preset stack\", () => {\n\t\tconst fullServices = [\n\t\t\t\"redis\",\n\t\t\t\"postgresql\",\n\t\t\t\"qdrant\",\n\t\t\t\"n8n\",\n\t\t\t\"ffmpeg\",\n\t\t\t\"remotion\",\n\t\t\t\"minio\",\n\t\t\t\"caddy\",\n\t\t\t\"browserless\",\n\t\t\t\"searxng\",\n\t\t\t\"meilisearch\",\n\t\t\t\"uptime-kuma\",\n\t\t\t\"grafana\",\n\t\t\t\"prometheus\",\n\t\t\t\"ollama\",\n\t\t\t\"whisper\",\n\t\t\t\"gotify\",\n\t\t];\n\n\t\tconst result = generate({\n\t\t\tprojectName: \"full-stack\",\n\t\t\tservices: fullServices,\n\t\t\tskillPacks: [\n\t\t\t\t\"video-creator\",\n\t\t\t\t\"research-agent\",\n\t\t\t\t\"social-media\",\n\t\t\t\t\"dev-ops\",\n\t\t\t\t\"knowledge-base\",\n\t\t\t\t\"local-ai\",\n\t\t\t],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Should have many files\n\t\tconst fileCount = Object.keys(result.files).length;\n\t\texpect(fileCount).toBeGreaterThan(10);\n\n\t\t// Should include the start script\n\t\texpect(result.files).toHaveProperty(\"scripts/start.sh\");\n\n\t\t// Should not throw (it already didn't if we got here)\n\t\texpect(result.metadata.serviceCount).toBeGreaterThan(5);\n\t});\n\n\tit(\"generates caddy config when proxy is caddy\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"caddy-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"generates prometheus config when monitoring enabled\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"monitored-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t\tmonitoring: true,\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"prometheus/prometheus.yml\");\n\t\t// Verify it's valid YAML\n\t\tconst promConfig = parse(result.files[\"prometheus/prometheus.yml\"]!);\n\t\texpect(promConfig).toBeDefined();\n\t});\n\n\tit(\"generates La Suite Meet stack with all expected services\", () => {\n\t\tconst lasuiteMeetServices = [\n\t\t\t\"postgresql\",\n\t\t\t\"redis\",\n\t\t\t\"livekit\",\n\t\t\t\"lasuite-meet-backend\",\n\t\t\t\"lasuite-meet-frontend\",\n\t\t\t\"lasuite-meet-agents\",\n\t\t];\n\t\tconst result = generate({\n\t\t\tprojectName: \"lasuite-meet-stack\",\n\t\t\tservices: lasuiteMeetServices,\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Services may be split across main and profile compose files\n\t\tconst allServiceIds = new Set<string>();\n\t\tfor (const [filename, content] of Object.entries(result.files)) {\n\t\t\tif (filename.endsWith(\".yml\") && content) {\n\t\t\t\tconst doc = parse(content);\n\t\t\t\tif (doc?.services && typeof doc.services === \"object\") {\n\t\t\t\t\tfor (const id of Object.keys(doc.services)) {\n\t\t\t\t\t\tallServiceIds.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const id of lasuiteMeetServices) {\n\t\t\texpect(allServiceIds.has(id), `missing service ${id}`).toBe(true);\n\t\t}\n\t\texpect(result.metadata.serviceCount).toBe(lasuiteMeetServices.length);\n\t});\n\n\tit(\"generates bare-metal installer for Windows (install.ps1)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"win-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.ps1\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"generates bare-metal installer for Linux/macOS (install.sh)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"linux-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.sh\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"bare-metal with redis on Linux: native script, compose excludes redis, gateway has extra_hosts\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"bare-metal-redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Native install script for Linux\n\t\texpect(result.files).toHaveProperty(\"native/install-linux.sh\");\n\t\texpect(result.files[\"native/install-linux.sh\"]).toContain(\"redis\");\n\n\t\t// Docker compose must NOT include redis (native); only gateway/openclaw\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).not.toHaveProperty(\"redis\");\n\t\texpect(composed.services).toHaveProperty(\"openclaw-gateway\");\n\n\t\t// Gateway must have extra_hosts for host.docker.internal\n\t\tconst gateway = composed.services[\"openclaw-gateway\"];\n\t\texpect(gateway).toBeDefined();\n\t\texpect(gateway.extra_hosts).toBeDefined();\n\t\texpect(\n\t\t\t(gateway.extra_hosts as string[]).some(\n\t\t\t\t(h: string) => h.includes(\"host.docker.internal\") && h.includes(\"host-gateway\"),\n\t\t\t),\n\t\t).toBe(true);\n\n\t\t// .env should set REDIS_HOST to host.docker.internal for gateway to reach native Redis\n\t\texpect(result.files[\".env\"]).toContain(\"REDIS_HOST=host.docker.internal\");\n\t});\n\n\tit(\"throws on conflicting services\", () => {\n\t\texpect(() =>\n\t\t\tgenerate({\n\t\t\t\tprojectName: \"conflict-stack\",\n\t\t\t\tservices: [\"redis\", \"valkey\"],\n\t\t\t\tskillPacks: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tgenerateSecrets: true,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n\n\tit(\"generates scripts directory\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"scripts-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result.files).toHaveProperty(script);\n\t\t\texpect(result.files[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"all generated .env.example vars have comments\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"env-comments-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst envExample = result.files[\".env.example\"]!;\n\t\tconst lines = envExample.split(\"\\n\");\n\n\t\t// Walk through lines: every non-empty, non-comment KEY=VALUE line should\n\t\t// have a preceding comment line (starting with #).\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i]!.trim();\n\t\t\tif (line === \"\" || line.startsWith(\"#\")) continue;\n\n\t\t\t// This line looks like KEY=VALUE\n\t\t\tif (line.includes(\"=\")) {\n\t\t\t\t// There must be a comment somewhere before it (look backwards for a # line)\n\t\t\t\tlet foundComment = false;\n\t\t\t\tfor (let j = i - 1; j >= 0; j--) {\n\t\t\t\t\tconst prev = lines[j]!.trim();\n\t\t\t\t\tif (prev === \"\") continue; // skip blank lines\n\t\t\t\t\tif (prev.startsWith(\"#\")) {\n\t\t\t\t\t\tfoundComment = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// Hit another non-comment, non-empty line — no comment found\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\texpect(foundComment).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.test.mjs","names":[],"sources":["../src/generate.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { generate } from \"./generate.js\";\n\ndescribe(\"generate (end-to-end)\", () => {\n\tit(\"generates a minimal stack (redis only)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"test-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Core files must be present\n\t\texpect(result.files).toHaveProperty(\"docker-compose.yml\");\n\t\texpect(result.files).toHaveProperty(\".env.example\");\n\t\texpect(result.files).toHaveProperty(\".env\");\n\t\texpect(result.files).toHaveProperty(\"README.md\");\n\n\t\t// docker-compose.yml must be valid YAML\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed).toHaveProperty(\"services\");\n\n\t\t// .env.example should reference REDIS_PASSWORD\n\t\texpect(result.files[\".env.example\"]).toContain(\"REDIS_PASSWORD\");\n\n\t\t// README should mention the project name\n\t\texpect(result.files[\"README.md\"]).toContain(\"test-stack\");\n\n\t\t// At least one service resolved\n\t\texpect(result.metadata.serviceCount).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"generates research-agent stack from skill pack\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"research-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Skill SKILL.md files for each skill in the research-agent pack\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/qdrant-memory/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/searxng-search/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/browserless-browse/SKILL.md\");\n\n\t\t// docker-compose.yml should contain the expected services\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).toHaveProperty(\"qdrant\");\n\t\texpect(composed.services).toHaveProperty(\"searxng\");\n\t\texpect(composed.services).toHaveProperty(\"browserless\");\n\t});\n\n\tit(\"generates full preset stack\", () => {\n\t\tconst fullServices = [\n\t\t\t\"redis\",\n\t\t\t\"postgresql\",\n\t\t\t\"qdrant\",\n\t\t\t\"n8n\",\n\t\t\t\"ffmpeg\",\n\t\t\t\"remotion\",\n\t\t\t\"minio\",\n\t\t\t\"caddy\",\n\t\t\t\"browserless\",\n\t\t\t\"searxng\",\n\t\t\t\"meilisearch\",\n\t\t\t\"uptime-kuma\",\n\t\t\t\"grafana\",\n\t\t\t\"prometheus\",\n\t\t\t\"ollama\",\n\t\t\t\"whisper\",\n\t\t\t\"gotify\",\n\t\t];\n\n\t\tconst result = generate({\n\t\t\tprojectName: \"full-stack\",\n\t\t\tservices: fullServices,\n\t\t\tskillPacks: [\n\t\t\t\t\"video-creator\",\n\t\t\t\t\"research-agent\",\n\t\t\t\t\"social-media\",\n\t\t\t\t\"dev-ops\",\n\t\t\t\t\"knowledge-base\",\n\t\t\t\t\"local-ai\",\n\t\t\t],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Should have many files\n\t\tconst fileCount = Object.keys(result.files).length;\n\t\texpect(fileCount).toBeGreaterThan(10);\n\n\t\t// Should include the start script\n\t\texpect(result.files).toHaveProperty(\"scripts/start.sh\");\n\n\t\t// Should not throw (it already didn't if we got here)\n\t\texpect(result.metadata.serviceCount).toBeGreaterThan(5);\n\t});\n\n\tit(\"generates caddy config when proxy is caddy\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"caddy-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"generates prometheus config when monitoring enabled\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"monitored-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t\tmonitoring: true,\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"prometheus/prometheus.yml\");\n\t\t// Verify it's valid YAML\n\t\tconst promConfig = parse(result.files[\"prometheus/prometheus.yml\"]!);\n\t\texpect(promConfig).toBeDefined();\n\t});\n\n\tit(\"generates La Suite Meet stack with all expected services\", () => {\n\t\tconst lasuiteMeetServices = [\n\t\t\t\"postgresql\",\n\t\t\t\"redis\",\n\t\t\t\"livekit\",\n\t\t\t\"lasuite-meet-backend\",\n\t\t\t\"lasuite-meet-frontend\",\n\t\t\t\"lasuite-meet-agents\",\n\t\t];\n\t\tconst result = generate({\n\t\t\tprojectName: \"lasuite-meet-stack\",\n\t\t\tservices: lasuiteMeetServices,\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Services may be split across main and profile compose files\n\t\tconst allServiceIds = new Set<string>();\n\t\tfor (const [filename, content] of Object.entries(result.files)) {\n\t\t\tif (filename.endsWith(\".yml\") && content) {\n\t\t\t\tconst doc = parse(content);\n\t\t\t\tif (doc?.services && typeof doc.services === \"object\") {\n\t\t\t\t\tfor (const id of Object.keys(doc.services)) {\n\t\t\t\t\t\tallServiceIds.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const id of lasuiteMeetServices) {\n\t\t\texpect(allServiceIds.has(id), `missing service ${id}`).toBe(true);\n\t\t}\n\t\texpect(result.metadata.serviceCount).toBe(lasuiteMeetServices.length);\n\t});\n\n\tit(\"generates bare-metal installer for Windows (install.ps1)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"win-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.ps1\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"generates bare-metal installer for Linux/macOS (install.sh)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"linux-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.sh\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"bare-metal with redis on Linux: native script, compose excludes redis, gateway has extra_hosts\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"bare-metal-redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Native install script for Linux\n\t\texpect(result.files).toHaveProperty(\"native/install-linux.sh\");\n\t\texpect(result.files[\"native/install-linux.sh\"]).toContain(\"redis\");\n\n\t\t// Docker compose must NOT include redis (native); only gateway/openclaw\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).not.toHaveProperty(\"redis\");\n\t\texpect(composed.services).toHaveProperty(\"openclaw-gateway\");\n\n\t\t// Gateway must have extra_hosts for host.docker.internal\n\t\tconst gateway = composed.services[\"openclaw-gateway\"];\n\t\texpect(gateway).toBeDefined();\n\t\texpect(gateway.extra_hosts).toBeDefined();\n\t\texpect(\n\t\t\t(gateway.extra_hosts as string[]).some(\n\t\t\t\t(h: string) => h.includes(\"host.docker.internal\") && h.includes(\"host-gateway\"),\n\t\t\t),\n\t\t).toBe(true);\n\n\t\t// .env should set REDIS_HOST to host.docker.internal for gateway to reach native Redis\n\t\texpect(result.files[\".env\"]).toContain(\"REDIS_HOST=host.docker.internal\");\n\t});\n\n\tit(\"throws on conflicting services\", () => {\n\t\texpect(() =>\n\t\t\tgenerate({\n\t\t\t\tprojectName: \"conflict-stack\",\n\t\t\t\tservices: [\"redis\", \"valkey\"],\n\t\t\t\tskillPacks: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tgenerateSecrets: true,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n\n\tit(\"generates scripts directory\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"scripts-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result.files).toHaveProperty(script);\n\t\t\texpect(result.files[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"all generated .env.example vars have comments\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"env-comments-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst envExample = result.files[\".env.example\"]!;\n\t\tconst lines = envExample.split(\"\\n\");\n\n\t\t// Walk through lines: every non-empty, non-comment KEY=VALUE line should\n\t\t// have a preceding comment line (starting with #).\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i]!.trim();\n\t\t\tif (line === \"\" || line.startsWith(\"#\")) continue;\n\n\t\t\t// This line looks like KEY=VALUE\n\t\t\tif (line.includes(\"=\")) {\n\t\t\t\t// There must be a comment somewhere before it (look backwards for a # line)\n\t\t\t\tlet foundComment = false;\n\t\t\t\tfor (let j = i - 1; j >= 0; j--) {\n\t\t\t\t\tconst prev = lines[j]!.trim();\n\t\t\t\t\tif (prev === \"\") continue; // skip blank lines\n\t\t\t\t\tif (prev.startsWith(\"#\")) {\n\t\t\t\t\t\tfoundComment = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// Hit another non-comment, non-empty line — no comment found\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\texpect(foundComment).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n});\n"],"mappings":"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"}
@@ -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/bare-metal-install.ts
4
3
  const LINUX_SCRIPT_PREFIX_NATIVE = `
5
4
  # Native services (install/start on host first)
@@ -220,7 +219,7 @@ function generateBareMetalInstall(options) {
220
219
  files["install.sh"] = baseScript.replace("__NATIVE_BLOCK__", prefix);
221
220
  return files;
222
221
  }
223
-
224
222
  //#endregion
225
223
  exports.generateBareMetalInstall = generateBareMetalInstall;
224
+
226
225
  //# sourceMappingURL=bare-metal-install.cjs.map