@better-openclaw/core 1.0.26 → 1.0.30

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 (1038) hide show
  1. package/README.md +66 -7
  2. package/dist/addon-stack.cjs +41 -28
  3. package/dist/addon-stack.cjs.map +1 -1
  4. package/dist/addon-stack.d.cts +1 -1
  5. package/dist/addon-stack.d.cts.map +1 -1
  6. package/dist/addon-stack.d.mts +1 -1
  7. package/dist/addon-stack.d.mts.map +1 -1
  8. package/dist/addon-stack.mjs +40 -27
  9. package/dist/addon-stack.mjs.map +1 -1
  10. package/dist/addon-stack.test.cjs +14 -14
  11. package/dist/addon-stack.test.cjs.map +1 -1
  12. package/dist/addon-stack.test.mjs +13 -13
  13. package/dist/addon-stack.test.mjs.map +1 -1
  14. package/dist/bare-metal-partition.d.cts +1 -1
  15. package/dist/bare-metal-partition.d.mts +1 -1
  16. package/dist/bare-metal-partition.test.cjs +1 -1
  17. package/dist/bare-metal-partition.test.mjs +1 -1
  18. package/dist/callback-sink-CdMKYayY.d.mts +15 -0
  19. package/dist/callback-sink-CdMKYayY.d.mts.map +1 -0
  20. package/dist/callback-sink-iNThWRnQ.d.cts +15 -0
  21. package/dist/callback-sink-iNThWRnQ.d.cts.map +1 -0
  22. package/dist/claude-code-fw-CrbAlzTM.d.mts +7 -0
  23. package/dist/claude-code-fw-CrbAlzTM.d.mts.map +1 -0
  24. package/dist/claude-code-fw-dKYH2prH.d.cts +7 -0
  25. package/dist/claude-code-fw-dKYH2prH.d.cts.map +1 -0
  26. package/dist/codex-fw-Ct8q4pzo.d.mts +7 -0
  27. package/dist/codex-fw-Ct8q4pzo.d.mts.map +1 -0
  28. package/dist/codex-fw-l7Ku8ZI8.d.cts +7 -0
  29. package/dist/codex-fw-l7Ku8ZI8.d.cts.map +1 -0
  30. package/dist/compose-validation.test.cjs +1 -1
  31. package/dist/composer.cjs +89 -129
  32. package/dist/composer.cjs.map +1 -1
  33. package/dist/composer.d.cts +3 -3
  34. package/dist/composer.d.cts.map +1 -1
  35. package/dist/composer.d.mts +3 -3
  36. package/dist/composer.d.mts.map +1 -1
  37. package/dist/composer.mjs +88 -128
  38. package/dist/composer.mjs.map +1 -1
  39. package/dist/composer.snapshot.test.cjs +1 -1
  40. package/dist/composer.snapshot.test.mjs +1 -1
  41. package/dist/composer.test.cjs +53 -2
  42. package/dist/composer.test.cjs.map +1 -1
  43. package/dist/composer.test.mjs +52 -1
  44. package/dist/composer.test.mjs.map +1 -1
  45. package/dist/console-sink-BHQpRyCt.d.cts +13 -0
  46. package/dist/console-sink-BHQpRyCt.d.cts.map +1 -0
  47. package/dist/console-sink-bouG_M1K.d.mts +13 -0
  48. package/dist/console-sink-bouG_M1K.d.mts.map +1 -0
  49. package/dist/{coolify-BVGGcMrT.d.mts → coolify-D5E0z01M.d.mts} +2 -2
  50. package/dist/{coolify-BVGGcMrT.d.mts.map → coolify-D5E0z01M.d.mts.map} +1 -1
  51. package/dist/{coolify-vlb1G9V2.d.cts → coolify-DjHecHCr.d.cts} +2 -2
  52. package/dist/{coolify-vlb1G9V2.d.cts.map → coolify-DjHecHCr.d.cts.map} +1 -1
  53. package/dist/copaw-BQyjioz7.d.cts +7 -0
  54. package/dist/copaw-BQyjioz7.d.cts.map +1 -0
  55. package/dist/copaw-C_3N7eQu.d.mts +7 -0
  56. package/dist/copaw-C_3N7eQu.d.mts.map +1 -0
  57. package/dist/deployers/coolify.cjs +25 -0
  58. package/dist/deployers/coolify.cjs.map +1 -1
  59. package/dist/deployers/coolify.d.cts +1 -1
  60. package/dist/deployers/coolify.d.mts +1 -1
  61. package/dist/deployers/coolify.mjs +25 -0
  62. package/dist/deployers/coolify.mjs.map +1 -1
  63. package/dist/deployers/dokploy.cjs +25 -0
  64. package/dist/deployers/dokploy.cjs.map +1 -1
  65. package/dist/deployers/dokploy.d.cts +1 -1
  66. package/dist/deployers/dokploy.d.mts +1 -1
  67. package/dist/deployers/dokploy.mjs +25 -0
  68. package/dist/deployers/dokploy.mjs.map +1 -1
  69. package/dist/deployers/index.d.cts +3 -3
  70. package/dist/deployers/index.d.mts +3 -3
  71. package/dist/deployers/strip-host-ports.cjs +1 -1
  72. package/dist/deployers/strip-host-ports.test.cjs +1 -1
  73. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  74. package/dist/deployers/types.d.cts +1 -1
  75. package/dist/deployers/types.d.mts +1 -1
  76. package/dist/{dokploy-8cbrxUun.d.cts → dokploy-BnVDjWCV.d.cts} +2 -2
  77. package/dist/{dokploy-8cbrxUun.d.cts.map → dokploy-BnVDjWCV.d.cts.map} +1 -1
  78. package/dist/{dokploy-BTflLhTM.d.mts → dokploy-BqLdCfyR.d.mts} +2 -2
  79. package/dist/{dokploy-BTflLhTM.d.mts.map → dokploy-BqLdCfyR.d.mts.map} +1 -1
  80. package/dist/frameworks/claude-code-fw.cjs +79 -0
  81. package/dist/frameworks/claude-code-fw.cjs.map +1 -0
  82. package/dist/frameworks/claude-code-fw.d.cts +2 -0
  83. package/dist/frameworks/claude-code-fw.d.mts +2 -0
  84. package/dist/frameworks/claude-code-fw.mjs +78 -0
  85. package/dist/frameworks/claude-code-fw.mjs.map +1 -0
  86. package/dist/frameworks/codex-fw.cjs +67 -0
  87. package/dist/frameworks/codex-fw.cjs.map +1 -0
  88. package/dist/frameworks/codex-fw.d.cts +2 -0
  89. package/dist/frameworks/codex-fw.d.mts +2 -0
  90. package/dist/frameworks/codex-fw.mjs +66 -0
  91. package/dist/frameworks/codex-fw.mjs.map +1 -0
  92. package/dist/frameworks/copaw.cjs +118 -0
  93. package/dist/frameworks/copaw.cjs.map +1 -0
  94. package/dist/frameworks/copaw.d.cts +2 -0
  95. package/dist/frameworks/copaw.d.mts +2 -0
  96. package/dist/frameworks/copaw.mjs +117 -0
  97. package/dist/frameworks/copaw.mjs.map +1 -0
  98. package/dist/frameworks/index.cjs +35 -0
  99. package/dist/frameworks/index.cjs.map +1 -0
  100. package/dist/frameworks/index.d.cts +11 -0
  101. package/dist/frameworks/index.d.mts +11 -0
  102. package/dist/frameworks/index.mjs +22 -0
  103. package/dist/frameworks/index.mjs.map +1 -0
  104. package/dist/frameworks/memu.cjs +118 -0
  105. package/dist/frameworks/memu.cjs.map +1 -0
  106. package/dist/frameworks/memu.d.cts +2 -0
  107. package/dist/frameworks/memu.d.mts +2 -0
  108. package/dist/frameworks/memu.mjs +117 -0
  109. package/dist/frameworks/memu.mjs.map +1 -0
  110. package/dist/frameworks/nanobot.cjs +126 -0
  111. package/dist/frameworks/nanobot.cjs.map +1 -0
  112. package/dist/frameworks/nanobot.d.cts +2 -0
  113. package/dist/frameworks/nanobot.d.mts +2 -0
  114. package/dist/frameworks/nanobot.mjs +125 -0
  115. package/dist/frameworks/nanobot.mjs.map +1 -0
  116. package/dist/frameworks/nanoclaw.cjs +99 -0
  117. package/dist/frameworks/nanoclaw.cjs.map +1 -0
  118. package/dist/frameworks/nanoclaw.d.cts +2 -0
  119. package/dist/frameworks/nanoclaw.d.mts +2 -0
  120. package/dist/frameworks/nanoclaw.mjs +98 -0
  121. package/dist/frameworks/nanoclaw.mjs.map +1 -0
  122. package/dist/frameworks/openclaw.cjs +253 -0
  123. package/dist/frameworks/openclaw.cjs.map +1 -0
  124. package/dist/frameworks/openclaw.d.cts +2 -0
  125. package/dist/frameworks/openclaw.d.mts +2 -0
  126. package/dist/frameworks/openclaw.mjs +251 -0
  127. package/dist/frameworks/openclaw.mjs.map +1 -0
  128. package/dist/frameworks/registry.cjs +31 -0
  129. package/dist/frameworks/registry.cjs.map +1 -0
  130. package/dist/frameworks/registry.d.cts +2 -0
  131. package/dist/frameworks/registry.d.mts +2 -0
  132. package/dist/frameworks/registry.mjs +26 -0
  133. package/dist/frameworks/registry.mjs.map +1 -0
  134. package/dist/frameworks/registry.test.cjs +110 -0
  135. package/dist/frameworks/registry.test.cjs.map +1 -0
  136. package/dist/frameworks/registry.test.d.cts +1 -0
  137. package/dist/frameworks/registry.test.d.mts +1 -0
  138. package/dist/frameworks/registry.test.mjs +111 -0
  139. package/dist/frameworks/registry.test.mjs.map +1 -0
  140. package/dist/frameworks/types.cjs +0 -0
  141. package/dist/frameworks/types.d.cts +2 -0
  142. package/dist/frameworks/types.d.mts +2 -0
  143. package/dist/frameworks/types.mjs +1 -0
  144. package/dist/frameworks/zeroclaw.cjs +123 -0
  145. package/dist/frameworks/zeroclaw.cjs.map +1 -0
  146. package/dist/frameworks/zeroclaw.d.cts +2 -0
  147. package/dist/frameworks/zeroclaw.d.mts +2 -0
  148. package/dist/frameworks/zeroclaw.mjs +122 -0
  149. package/dist/frameworks/zeroclaw.mjs.map +1 -0
  150. package/dist/generate.cjs +64 -13
  151. package/dist/generate.cjs.map +1 -1
  152. package/dist/generate.d.cts +5 -2
  153. package/dist/generate.d.cts.map +1 -1
  154. package/dist/generate.d.mts +5 -2
  155. package/dist/generate.d.mts.map +1 -1
  156. package/dist/generate.mjs +63 -12
  157. package/dist/generate.mjs.map +1 -1
  158. package/dist/generate.test.cjs +42 -6
  159. package/dist/generate.test.cjs.map +1 -1
  160. package/dist/generate.test.mjs +41 -5
  161. package/dist/generate.test.mjs.map +1 -1
  162. package/dist/generators/bare-metal-install.d.cts +1 -1
  163. package/dist/generators/bare-metal-install.d.mts +1 -1
  164. package/dist/generators/bare-metal-install.test.cjs +1 -1
  165. package/dist/generators/bare-metal-install.test.mjs +1 -1
  166. package/dist/generators/caddy.cjs +9 -3
  167. package/dist/generators/caddy.cjs.map +1 -1
  168. package/dist/generators/caddy.d.cts +1 -1
  169. package/dist/generators/caddy.d.mts +1 -1
  170. package/dist/generators/caddy.mjs +9 -3
  171. package/dist/generators/caddy.mjs.map +1 -1
  172. package/dist/generators/caddy.test.cjs +30 -2
  173. package/dist/generators/caddy.test.cjs.map +1 -1
  174. package/dist/generators/caddy.test.mjs +30 -2
  175. package/dist/generators/caddy.test.mjs.map +1 -1
  176. package/dist/generators/clone-repos.cjs.map +1 -1
  177. package/dist/generators/clone-repos.d.cts +1 -1
  178. package/dist/generators/clone-repos.d.mts +1 -1
  179. package/dist/generators/clone-repos.mjs.map +1 -1
  180. package/dist/generators/clone-repos.test.cjs +1 -1
  181. package/dist/generators/clone-repos.test.cjs.map +1 -1
  182. package/dist/generators/clone-repos.test.mjs +1 -1
  183. package/dist/generators/clone-repos.test.mjs.map +1 -1
  184. package/dist/generators/env.cjs +28 -103
  185. package/dist/generators/env.cjs.map +1 -1
  186. package/dist/generators/env.d.cts +4 -1
  187. package/dist/generators/env.d.cts.map +1 -1
  188. package/dist/generators/env.d.mts +4 -1
  189. package/dist/generators/env.d.mts.map +1 -1
  190. package/dist/generators/env.mjs +27 -102
  191. package/dist/generators/env.mjs.map +1 -1
  192. package/dist/generators/env.test.cjs +3 -3
  193. package/dist/generators/env.test.cjs.map +1 -1
  194. package/dist/generators/env.test.mjs +3 -3
  195. package/dist/generators/env.test.mjs.map +1 -1
  196. package/dist/generators/get-shit-done.d.cts +1 -1
  197. package/dist/generators/get-shit-done.d.mts +1 -1
  198. package/dist/generators/health-check.cjs +6 -6
  199. package/dist/generators/health-check.cjs.map +1 -1
  200. package/dist/generators/health-check.d.cts +1 -1
  201. package/dist/generators/health-check.d.mts +1 -1
  202. package/dist/generators/health-check.mjs +6 -6
  203. package/dist/generators/health-check.mjs.map +1 -1
  204. package/dist/generators/health-check.test.cjs +1 -1
  205. package/dist/generators/health-check.test.mjs +1 -1
  206. package/dist/generators/n8n-workflows.d.cts +1 -1
  207. package/dist/generators/n8n-workflows.d.mts +1 -1
  208. package/dist/generators/native-services.d.cts +1 -1
  209. package/dist/generators/native-services.d.mts +1 -1
  210. package/dist/generators/openclaw-json.cjs +60 -4
  211. package/dist/generators/openclaw-json.cjs.map +1 -1
  212. package/dist/generators/openclaw-json.d.cts +1 -5
  213. package/dist/generators/openclaw-json.d.cts.map +1 -1
  214. package/dist/generators/openclaw-json.d.mts +1 -5
  215. package/dist/generators/openclaw-json.d.mts.map +1 -1
  216. package/dist/generators/openclaw-json.mjs +60 -4
  217. package/dist/generators/openclaw-json.mjs.map +1 -1
  218. package/dist/generators/postgres-init.cjs +20 -0
  219. package/dist/generators/postgres-init.cjs.map +1 -1
  220. package/dist/generators/postgres-init.d.cts +1 -1
  221. package/dist/generators/postgres-init.d.cts.map +1 -1
  222. package/dist/generators/postgres-init.d.mts +1 -1
  223. package/dist/generators/postgres-init.d.mts.map +1 -1
  224. package/dist/generators/postgres-init.mjs +20 -0
  225. package/dist/generators/postgres-init.mjs.map +1 -1
  226. package/dist/generators/prometheus.d.cts +1 -1
  227. package/dist/generators/prometheus.d.mts +1 -1
  228. package/dist/generators/readme.cjs +50 -7
  229. package/dist/generators/readme.cjs.map +1 -1
  230. package/dist/generators/readme.d.cts +3 -1
  231. package/dist/generators/readme.d.cts.map +1 -1
  232. package/dist/generators/readme.d.mts +3 -1
  233. package/dist/generators/readme.d.mts.map +1 -1
  234. package/dist/generators/readme.mjs +50 -7
  235. package/dist/generators/readme.mjs.map +1 -1
  236. package/dist/generators/scripts.test.cjs +2 -2
  237. package/dist/generators/scripts.test.cjs.map +1 -1
  238. package/dist/generators/scripts.test.mjs +2 -2
  239. package/dist/generators/scripts.test.mjs.map +1 -1
  240. package/dist/generators/skills.cjs +1 -1
  241. package/dist/generators/skills.d.cts +1 -1
  242. package/dist/generators/skills.d.cts.map +1 -1
  243. package/dist/generators/skills.d.mts +1 -1
  244. package/dist/generators/skills.d.mts.map +1 -1
  245. package/dist/generators/skills.mjs +310 -0
  246. package/dist/generators/skills.mjs.map +1 -1
  247. package/dist/generators/stack-manifest.d.cts +1 -1
  248. package/dist/generators/stack-manifest.d.mts +1 -1
  249. package/dist/generators/traefik.d.cts +1 -1
  250. package/dist/generators/traefik.d.mts +1 -1
  251. package/dist/generators/traefik.test.cjs +12 -12
  252. package/dist/generators/traefik.test.cjs.map +1 -1
  253. package/dist/generators/traefik.test.mjs +12 -12
  254. package/dist/generators/traefik.test.mjs.map +1 -1
  255. package/dist/index.cjs +20 -2
  256. package/dist/index.d.cts +14 -7
  257. package/dist/index.d.mts +14 -7
  258. package/dist/index.mjs +10 -3
  259. package/dist/logger/__tests__/logger.test.cjs +308 -0
  260. package/dist/logger/__tests__/logger.test.cjs.map +1 -0
  261. package/dist/logger/__tests__/logger.test.d.cts +1 -0
  262. package/dist/logger/__tests__/logger.test.d.mts +1 -0
  263. package/dist/logger/__tests__/logger.test.mjs +308 -0
  264. package/dist/logger/__tests__/logger.test.mjs.map +1 -0
  265. package/dist/logger/index.cjs +10 -0
  266. package/dist/logger/index.d.cts +6 -0
  267. package/dist/logger/index.d.mts +6 -0
  268. package/dist/logger/index.mjs +5 -0
  269. package/dist/logger/logger.cjs +270 -0
  270. package/dist/logger/logger.cjs.map +1 -0
  271. package/dist/logger/logger.d.cts +2 -0
  272. package/dist/logger/logger.d.mts +2 -0
  273. package/dist/logger/logger.mjs +267 -0
  274. package/dist/logger/logger.mjs.map +1 -0
  275. package/dist/logger/sinks/callback-sink.cjs +18 -0
  276. package/dist/logger/sinks/callback-sink.cjs.map +1 -0
  277. package/dist/logger/sinks/callback-sink.d.cts +2 -0
  278. package/dist/logger/sinks/callback-sink.d.mts +2 -0
  279. package/dist/logger/sinks/callback-sink.mjs +17 -0
  280. package/dist/logger/sinks/callback-sink.mjs.map +1 -0
  281. package/dist/logger/sinks/console-sink.cjs +39 -0
  282. package/dist/logger/sinks/console-sink.cjs.map +1 -0
  283. package/dist/logger/sinks/console-sink.d.cts +2 -0
  284. package/dist/logger/sinks/console-sink.d.mts +2 -0
  285. package/dist/logger/sinks/console-sink.mjs +38 -0
  286. package/dist/logger/sinks/console-sink.mjs.map +1 -0
  287. package/dist/logger/sinks/file-sink.cjs +72 -0
  288. package/dist/logger/sinks/file-sink.cjs.map +1 -0
  289. package/dist/logger/sinks/file-sink.d.cts +36 -0
  290. package/dist/logger/sinks/file-sink.d.cts.map +1 -0
  291. package/dist/logger/sinks/file-sink.d.mts +36 -0
  292. package/dist/logger/sinks/file-sink.d.mts.map +1 -0
  293. package/dist/logger/sinks/file-sink.mjs +70 -0
  294. package/dist/logger/sinks/file-sink.mjs.map +1 -0
  295. package/dist/logger/types.cjs +0 -0
  296. package/dist/logger/types.d.cts +2 -0
  297. package/dist/logger/types.d.mts +2 -0
  298. package/dist/logger/types.mjs +1 -0
  299. package/dist/logger-CZ0Qnyiu.d.mts +66 -0
  300. package/dist/logger-CZ0Qnyiu.d.mts.map +1 -0
  301. package/dist/logger-DDfwai-A.d.cts +66 -0
  302. package/dist/logger-DDfwai-A.d.cts.map +1 -0
  303. package/dist/memu-BfRXtwmL.d.cts +7 -0
  304. package/dist/memu-BfRXtwmL.d.cts.map +1 -0
  305. package/dist/memu-C-fXbWr-.d.mts +7 -0
  306. package/dist/memu-C-fXbWr-.d.mts.map +1 -0
  307. package/dist/migrations.cjs +17 -9
  308. package/dist/migrations.cjs.map +1 -1
  309. package/dist/migrations.d.cts +1 -1
  310. package/dist/migrations.d.cts.map +1 -1
  311. package/dist/migrations.d.mts +1 -1
  312. package/dist/migrations.d.mts.map +1 -1
  313. package/dist/migrations.mjs +17 -9
  314. package/dist/migrations.mjs.map +1 -1
  315. package/dist/migrations.test.cjs +4 -4
  316. package/dist/migrations.test.mjs +4 -4
  317. package/dist/nanobot-2c0bS4lu.d.cts +7 -0
  318. package/dist/nanobot-2c0bS4lu.d.cts.map +1 -0
  319. package/dist/nanobot-BUO6pVQc.d.mts +7 -0
  320. package/dist/nanobot-BUO6pVQc.d.mts.map +1 -0
  321. package/dist/nanoclaw-CgHubEig.d.mts +7 -0
  322. package/dist/nanoclaw-CgHubEig.d.mts.map +1 -0
  323. package/dist/nanoclaw-Dvz0ef6J.d.cts +7 -0
  324. package/dist/nanoclaw-Dvz0ef6J.d.cts.map +1 -0
  325. package/dist/openclaw-D8lVecjC.d.mts +7 -0
  326. package/dist/openclaw-D8lVecjC.d.mts.map +1 -0
  327. package/dist/openclaw-DThj8i3N.d.cts +7 -0
  328. package/dist/openclaw-DThj8i3N.d.cts.map +1 -0
  329. package/dist/port-scanner.d.cts +1 -1
  330. package/dist/port-scanner.d.mts +1 -1
  331. package/dist/presets/presets.test.cjs +5 -5
  332. package/dist/presets/presets.test.cjs.map +1 -1
  333. package/dist/presets/presets.test.mjs +4 -4
  334. package/dist/presets/presets.test.mjs.map +1 -1
  335. package/dist/presets/registry.d.cts +1 -1
  336. package/dist/presets/registry.d.mts +1 -1
  337. package/dist/presets/registry.test.cjs +7 -7
  338. package/dist/presets/registry.test.cjs.map +1 -1
  339. package/dist/presets/registry.test.mjs +7 -7
  340. package/dist/presets/registry.test.mjs.map +1 -1
  341. package/dist/registry-DHX7vnVo.d.cts +16 -0
  342. package/dist/registry-DHX7vnVo.d.cts.map +1 -0
  343. package/dist/registry-DTAILnga.d.mts +16 -0
  344. package/dist/registry-DTAILnga.d.mts.map +1 -0
  345. package/dist/resolver.cjs +13 -3
  346. package/dist/resolver.cjs.map +1 -1
  347. package/dist/resolver.d.cts +1 -1
  348. package/dist/resolver.d.cts.map +1 -1
  349. package/dist/resolver.d.mts +1 -1
  350. package/dist/resolver.d.mts.map +1 -1
  351. package/dist/resolver.mjs +13 -3
  352. package/dist/resolver.mjs.map +1 -1
  353. package/dist/resolver.test.cjs +35 -3
  354. package/dist/resolver.test.cjs.map +1 -1
  355. package/dist/resolver.test.mjs +35 -3
  356. package/dist/resolver.test.mjs.map +1 -1
  357. package/dist/{schema-BQnZrcw8.d.cts → schema-BSl9wiFe.d.mts} +134 -2
  358. package/dist/schema-BSl9wiFe.d.mts.map +1 -0
  359. package/dist/{schema-SBpL0bdI.d.mts → schema-Bd9l2r7p.d.cts} +134 -2
  360. package/dist/schema-Bd9l2r7p.d.cts.map +1 -0
  361. package/dist/schema.cjs +28 -4
  362. package/dist/schema.cjs.map +1 -1
  363. package/dist/schema.d.cts +2 -2
  364. package/dist/schema.d.mts +2 -2
  365. package/dist/schema.mjs +27 -4
  366. package/dist/schema.mjs.map +1 -1
  367. package/dist/schema.test.cjs +3 -3
  368. package/dist/schema.test.cjs.map +1 -1
  369. package/dist/schema.test.mjs +3 -3
  370. package/dist/schema.test.mjs.map +1 -1
  371. package/dist/services/definitions/adguard-home.d.cts +1 -1
  372. package/dist/services/definitions/adguard-home.d.mts +1 -1
  373. package/dist/services/definitions/agent-browser.cjs +161 -0
  374. package/dist/services/definitions/agent-browser.cjs.map +1 -0
  375. package/dist/services/definitions/agent-browser.d.cts +7 -0
  376. package/dist/services/definitions/agent-browser.d.cts.map +1 -0
  377. package/dist/services/definitions/agent-browser.d.mts +7 -0
  378. package/dist/services/definitions/agent-browser.d.mts.map +1 -0
  379. package/dist/services/definitions/agent-browser.mjs +160 -0
  380. package/dist/services/definitions/agent-browser.mjs.map +1 -0
  381. package/dist/services/definitions/airbyte.d.cts +1 -1
  382. package/dist/services/definitions/airbyte.d.mts +1 -1
  383. package/dist/services/definitions/airflow.d.cts +1 -1
  384. package/dist/services/definitions/airflow.d.mts +1 -1
  385. package/dist/services/definitions/anything-llm.d.cts +1 -1
  386. package/dist/services/definitions/anything-llm.d.mts +1 -1
  387. package/dist/services/definitions/appflowy.d.cts +1 -1
  388. package/dist/services/definitions/appflowy.d.mts +1 -1
  389. package/dist/services/definitions/apptension-saas.cjs.map +1 -1
  390. package/dist/services/definitions/apptension-saas.d.cts +1 -1
  391. package/dist/services/definitions/apptension-saas.d.mts +1 -1
  392. package/dist/services/definitions/apptension-saas.mjs.map +1 -1
  393. package/dist/services/definitions/appwrite.d.cts +1 -1
  394. package/dist/services/definitions/appwrite.d.mts +1 -1
  395. package/dist/services/definitions/audiobookshelf.d.cts +1 -1
  396. package/dist/services/definitions/audiobookshelf.d.mts +1 -1
  397. package/dist/services/definitions/authelia.d.cts +1 -1
  398. package/dist/services/definitions/authelia.d.mts +1 -1
  399. package/dist/services/definitions/authentik.d.cts +1 -1
  400. package/dist/services/definitions/authentik.d.mts +1 -1
  401. package/dist/services/definitions/axolotl.d.cts +1 -1
  402. package/dist/services/definitions/axolotl.d.mts +1 -1
  403. package/dist/services/definitions/baserow.d.cts +1 -1
  404. package/dist/services/definitions/baserow.d.mts +1 -1
  405. package/dist/services/definitions/beszel.d.cts +1 -1
  406. package/dist/services/definitions/beszel.d.mts +1 -1
  407. package/dist/services/definitions/boxyhq-saas.d.cts +1 -1
  408. package/dist/services/definitions/boxyhq-saas.d.mts +1 -1
  409. package/dist/services/definitions/browserless.d.cts +1 -1
  410. package/dist/services/definitions/browserless.d.mts +1 -1
  411. package/dist/services/definitions/burnlink.d.cts +1 -1
  412. package/dist/services/definitions/burnlink.d.mts +1 -1
  413. package/dist/services/definitions/caddy.d.cts +1 -1
  414. package/dist/services/definitions/caddy.d.mts +1 -1
  415. package/dist/services/definitions/cal-com.d.cts +1 -1
  416. package/dist/services/definitions/cal-com.d.mts +1 -1
  417. package/dist/services/definitions/calibre-web.d.cts +1 -1
  418. package/dist/services/definitions/calibre-web.d.mts +1 -1
  419. package/dist/services/definitions/chatwoot-worker.d.cts +1 -1
  420. package/dist/services/definitions/chatwoot-worker.d.mts +1 -1
  421. package/dist/services/definitions/chatwoot.d.cts +1 -1
  422. package/dist/services/definitions/chatwoot.d.mts +1 -1
  423. package/dist/services/definitions/chromadb.cjs +4 -1
  424. package/dist/services/definitions/chromadb.cjs.map +1 -1
  425. package/dist/services/definitions/chromadb.d.cts +1 -1
  426. package/dist/services/definitions/chromadb.d.mts +1 -1
  427. package/dist/services/definitions/chromadb.mjs +4 -1
  428. package/dist/services/definitions/chromadb.mjs.map +1 -1
  429. package/dist/services/definitions/claude-code.cjs +1 -1
  430. package/dist/services/definitions/claude-code.cjs.map +1 -1
  431. package/dist/services/definitions/claude-code.d.cts +1 -1
  432. package/dist/services/definitions/claude-code.d.mts +1 -1
  433. package/dist/services/definitions/claude-code.mjs +1 -1
  434. package/dist/services/definitions/claude-code.mjs.map +1 -1
  435. package/dist/services/definitions/clawrouter.cjs +138 -0
  436. package/dist/services/definitions/clawrouter.cjs.map +1 -0
  437. package/dist/services/definitions/clawrouter.d.cts +7 -0
  438. package/dist/services/definitions/clawrouter.d.cts.map +1 -0
  439. package/dist/services/definitions/clawrouter.d.mts +7 -0
  440. package/dist/services/definitions/clawrouter.d.mts.map +1 -0
  441. package/dist/services/definitions/clawrouter.mjs +137 -0
  442. package/dist/services/definitions/clawrouter.mjs.map +1 -0
  443. package/dist/services/definitions/clickhouse.d.cts +1 -1
  444. package/dist/services/definitions/clickhouse.d.mts +1 -1
  445. package/dist/services/definitions/cloudflared.d.cts +1 -1
  446. package/dist/services/definitions/cloudflared.d.mts +1 -1
  447. package/dist/services/definitions/cmsaas-starter.d.cts +1 -1
  448. package/dist/services/definitions/cmsaas-starter.d.mts +1 -1
  449. package/dist/services/definitions/cockroachdb.d.cts +1 -1
  450. package/dist/services/definitions/cockroachdb.d.mts +1 -1
  451. package/dist/services/definitions/code-server.d.cts +1 -1
  452. package/dist/services/definitions/code-server.d.mts +1 -1
  453. package/dist/services/definitions/coder.d.cts +1 -1
  454. package/dist/services/definitions/coder.d.mts +1 -1
  455. package/dist/services/definitions/codex.cjs +1 -1
  456. package/dist/services/definitions/codex.cjs.map +1 -1
  457. package/dist/services/definitions/codex.d.cts +1 -1
  458. package/dist/services/definitions/codex.d.mts +1 -1
  459. package/dist/services/definitions/codex.mjs +1 -1
  460. package/dist/services/definitions/codex.mjs.map +1 -1
  461. package/dist/services/definitions/comfyui.d.cts +1 -1
  462. package/dist/services/definitions/comfyui.d.mts +1 -1
  463. package/dist/services/definitions/convex-dashboard.d.cts +1 -1
  464. package/dist/services/definitions/convex-dashboard.d.mts +1 -1
  465. package/dist/services/definitions/convex.cjs.map +1 -1
  466. package/dist/services/definitions/convex.d.cts +1 -1
  467. package/dist/services/definitions/convex.d.mts +1 -1
  468. package/dist/services/definitions/convex.mjs.map +1 -1
  469. package/dist/services/definitions/coolify.d.cts +1 -1
  470. package/dist/services/definitions/coolify.d.mts +1 -1
  471. package/dist/services/definitions/copaw.cjs +97 -0
  472. package/dist/services/definitions/copaw.cjs.map +1 -0
  473. package/dist/services/definitions/copaw.d.cts +7 -0
  474. package/dist/services/definitions/copaw.d.cts.map +1 -0
  475. package/dist/services/definitions/copaw.d.mts +7 -0
  476. package/dist/services/definitions/copaw.d.mts.map +1 -0
  477. package/dist/services/definitions/copaw.mjs +96 -0
  478. package/dist/services/definitions/copaw.mjs.map +1 -0
  479. package/dist/services/definitions/crowdsec.d.cts +1 -1
  480. package/dist/services/definitions/crowdsec.d.mts +1 -1
  481. package/dist/services/definitions/dagster.d.cts +1 -1
  482. package/dist/services/definitions/dagster.d.mts +1 -1
  483. package/dist/services/definitions/desktop-environment.cjs +2 -1
  484. package/dist/services/definitions/desktop-environment.cjs.map +1 -1
  485. package/dist/services/definitions/desktop-environment.d.cts +1 -1
  486. package/dist/services/definitions/desktop-environment.d.mts +1 -1
  487. package/dist/services/definitions/desktop-environment.mjs +2 -1
  488. package/dist/services/definitions/desktop-environment.mjs.map +1 -1
  489. package/dist/services/definitions/dify.d.cts +1 -1
  490. package/dist/services/definitions/dify.d.mts +1 -1
  491. package/dist/services/definitions/directus.d.cts +1 -1
  492. package/dist/services/definitions/directus.d.mts +1 -1
  493. package/dist/services/definitions/docsgpt.d.cts +1 -1
  494. package/dist/services/definitions/docsgpt.d.mts +1 -1
  495. package/dist/services/definitions/dokploy.d.cts +1 -1
  496. package/dist/services/definitions/dokploy.d.mts +1 -1
  497. package/dist/services/definitions/dozzle.d.cts +1 -1
  498. package/dist/services/definitions/dozzle.d.mts +1 -1
  499. package/dist/services/definitions/dragonfly.d.cts +1 -1
  500. package/dist/services/definitions/dragonfly.d.mts +1 -1
  501. package/dist/services/definitions/drone-ci.d.cts +1 -1
  502. package/dist/services/definitions/drone-ci.d.mts +1 -1
  503. package/dist/services/definitions/duplicati.d.cts +1 -1
  504. package/dist/services/definitions/duplicati.d.mts +1 -1
  505. package/dist/services/definitions/element-web.d.cts +1 -1
  506. package/dist/services/definitions/element-web.d.mts +1 -1
  507. package/dist/services/definitions/excalidraw.d.cts +1 -1
  508. package/dist/services/definitions/excalidraw.d.mts +1 -1
  509. package/dist/services/definitions/ffmpeg.d.cts +1 -1
  510. package/dist/services/definitions/ffmpeg.d.mts +1 -1
  511. package/dist/services/definitions/firecrawl-playwright.d.cts +1 -1
  512. package/dist/services/definitions/firecrawl-playwright.d.mts +1 -1
  513. package/dist/services/definitions/firecrawl.d.cts +1 -1
  514. package/dist/services/definitions/firecrawl.d.mts +1 -1
  515. package/dist/services/definitions/flagsmith.d.cts +1 -1
  516. package/dist/services/definitions/flagsmith.d.mts +1 -1
  517. package/dist/services/definitions/flowise.d.cts +1 -1
  518. package/dist/services/definitions/flowise.d.mts +1 -1
  519. package/dist/services/definitions/focalboard.d.cts +1 -1
  520. package/dist/services/definitions/focalboard.d.mts +1 -1
  521. package/dist/services/definitions/fonoster.d.cts +1 -1
  522. package/dist/services/definitions/fonoster.d.mts +1 -1
  523. package/dist/services/definitions/forgejo.d.cts +1 -1
  524. package/dist/services/definitions/forgejo.d.mts +1 -1
  525. package/dist/services/definitions/formbricks.d.cts +1 -1
  526. package/dist/services/definitions/formbricks.d.mts +1 -1
  527. package/dist/services/definitions/gemini-cli.d.cts +1 -1
  528. package/dist/services/definitions/gemini-cli.d.mts +1 -1
  529. package/dist/services/definitions/ghost.d.cts +1 -1
  530. package/dist/services/definitions/ghost.d.mts +1 -1
  531. package/dist/services/definitions/gitea.d.cts +1 -1
  532. package/dist/services/definitions/gitea.d.mts +1 -1
  533. package/dist/services/definitions/gotify.d.cts +1 -1
  534. package/dist/services/definitions/gotify.d.mts +1 -1
  535. package/dist/services/definitions/grafana.d.cts +1 -1
  536. package/dist/services/definitions/grafana.d.mts +1 -1
  537. package/dist/services/definitions/graylog.d.cts +1 -1
  538. package/dist/services/definitions/graylog.d.mts +1 -1
  539. package/dist/services/definitions/headscale.d.cts +1 -1
  540. package/dist/services/definitions/headscale.d.mts +1 -1
  541. package/dist/services/definitions/hedgedoc.d.cts +1 -1
  542. package/dist/services/definitions/hedgedoc.d.mts +1 -1
  543. package/dist/services/definitions/hexstrike.d.cts +1 -1
  544. package/dist/services/definitions/hexstrike.d.mts +1 -1
  545. package/dist/services/definitions/heyform.d.cts +1 -1
  546. package/dist/services/definitions/heyform.d.mts +1 -1
  547. package/dist/services/definitions/hindsight.cjs +4 -1
  548. package/dist/services/definitions/hindsight.cjs.map +1 -1
  549. package/dist/services/definitions/hindsight.d.cts +1 -1
  550. package/dist/services/definitions/hindsight.d.mts +1 -1
  551. package/dist/services/definitions/hindsight.mjs +4 -1
  552. package/dist/services/definitions/hindsight.mjs.map +1 -1
  553. package/dist/services/definitions/homeassistant.d.cts +1 -1
  554. package/dist/services/definitions/homeassistant.d.mts +1 -1
  555. package/dist/services/definitions/hoppscotch.d.cts +1 -1
  556. package/dist/services/definitions/hoppscotch.d.mts +1 -1
  557. package/dist/services/definitions/immich.d.cts +1 -1
  558. package/dist/services/definitions/immich.d.mts +1 -1
  559. package/dist/services/definitions/index.cjs +42 -6
  560. package/dist/services/definitions/index.cjs.map +1 -1
  561. package/dist/services/definitions/index.d.cts +16 -4
  562. package/dist/services/definitions/index.d.cts.map +1 -1
  563. package/dist/services/definitions/index.d.mts +16 -4
  564. package/dist/services/definitions/index.d.mts.map +1 -1
  565. package/dist/services/definitions/index.mjs +31 -7
  566. package/dist/services/definitions/index.mjs.map +1 -1
  567. package/dist/services/definitions/infisical.d.cts +1 -1
  568. package/dist/services/definitions/infisical.d.mts +1 -1
  569. package/dist/services/definitions/influxdb.d.cts +1 -1
  570. package/dist/services/definitions/influxdb.d.mts +1 -1
  571. package/dist/services/definitions/invoke-ai.d.cts +1 -1
  572. package/dist/services/definitions/invoke-ai.d.mts +1 -1
  573. package/dist/services/definitions/ixartz-saas.d.cts +1 -1
  574. package/dist/services/definitions/ixartz-saas.d.mts +1 -1
  575. package/dist/services/definitions/jaeger.d.cts +1 -1
  576. package/dist/services/definitions/jaeger.d.mts +1 -1
  577. package/dist/services/definitions/jan.d.cts +1 -1
  578. package/dist/services/definitions/jan.d.mts +1 -1
  579. package/dist/services/definitions/jellyfin.d.cts +1 -1
  580. package/dist/services/definitions/jellyfin.d.mts +1 -1
  581. package/dist/services/definitions/jenkins.d.cts +1 -1
  582. package/dist/services/definitions/jenkins.d.mts +1 -1
  583. package/dist/services/definitions/jitsi-meet.d.cts +1 -1
  584. package/dist/services/definitions/jitsi-meet.d.mts +1 -1
  585. package/dist/services/definitions/keycloak.d.cts +1 -1
  586. package/dist/services/definitions/keycloak.d.mts +1 -1
  587. package/dist/services/definitions/kimi.d.cts +1 -1
  588. package/dist/services/definitions/kimi.d.mts +1 -1
  589. package/dist/services/definitions/kong.d.cts +1 -1
  590. package/dist/services/definitions/kong.d.mts +1 -1
  591. package/dist/services/definitions/lago.d.cts +1 -1
  592. package/dist/services/definitions/lago.d.mts +1 -1
  593. package/dist/services/definitions/langflow.d.cts +1 -1
  594. package/dist/services/definitions/langflow.d.mts +1 -1
  595. package/dist/services/definitions/langfuse.d.cts +1 -1
  596. package/dist/services/definitions/langfuse.d.mts +1 -1
  597. package/dist/services/definitions/lasuite-meet-agents.d.cts +1 -1
  598. package/dist/services/definitions/lasuite-meet-agents.d.mts +1 -1
  599. package/dist/services/definitions/lasuite-meet-backend.d.cts +1 -1
  600. package/dist/services/definitions/lasuite-meet-backend.d.mts +1 -1
  601. package/dist/services/definitions/lasuite-meet-frontend.d.cts +1 -1
  602. package/dist/services/definitions/lasuite-meet-frontend.d.mts +1 -1
  603. package/dist/services/definitions/librechat.d.cts +1 -1
  604. package/dist/services/definitions/librechat.d.mts +1 -1
  605. package/dist/services/definitions/lightpanda.d.cts +1 -1
  606. package/dist/services/definitions/lightpanda.d.mts +1 -1
  607. package/dist/services/definitions/listmonk.d.cts +1 -1
  608. package/dist/services/definitions/listmonk.d.mts +1 -1
  609. package/dist/services/definitions/litellm.d.cts +1 -1
  610. package/dist/services/definitions/litellm.d.mts +1 -1
  611. package/dist/services/definitions/livekit.d.cts +1 -1
  612. package/dist/services/definitions/livekit.d.mts +1 -1
  613. package/dist/services/definitions/local-ai.d.cts +1 -1
  614. package/dist/services/definitions/local-ai.d.mts +1 -1
  615. package/dist/services/definitions/loki.d.cts +1 -1
  616. package/dist/services/definitions/loki.d.mts +1 -1
  617. package/dist/services/definitions/mariadb.d.cts +1 -1
  618. package/dist/services/definitions/mariadb.d.mts +1 -1
  619. package/dist/services/definitions/matomo.d.cts +1 -1
  620. package/dist/services/definitions/matomo.d.mts +1 -1
  621. package/dist/services/definitions/matrix-synapse.d.cts +1 -1
  622. package/dist/services/definitions/matrix-synapse.d.mts +1 -1
  623. package/dist/services/definitions/mattermost.d.cts +1 -1
  624. package/dist/services/definitions/mattermost.d.mts +1 -1
  625. package/dist/services/definitions/mautic.d.cts +1 -1
  626. package/dist/services/definitions/mautic.d.mts +1 -1
  627. package/dist/services/definitions/medusa.d.cts +1 -1
  628. package/dist/services/definitions/medusa.d.mts +1 -1
  629. package/dist/services/definitions/meilisearch.d.cts +1 -1
  630. package/dist/services/definitions/meilisearch.d.mts +1 -1
  631. package/dist/services/definitions/mem0.cjs +133 -0
  632. package/dist/services/definitions/mem0.cjs.map +1 -0
  633. package/dist/services/definitions/mem0.d.cts +7 -0
  634. package/dist/services/definitions/mem0.d.cts.map +1 -0
  635. package/dist/services/definitions/mem0.d.mts +7 -0
  636. package/dist/services/definitions/mem0.d.mts.map +1 -0
  637. package/dist/services/definitions/mem0.mjs +132 -0
  638. package/dist/services/definitions/mem0.mjs.map +1 -0
  639. package/dist/services/definitions/memu.cjs +96 -0
  640. package/dist/services/definitions/memu.cjs.map +1 -0
  641. package/dist/services/definitions/memu.d.cts +7 -0
  642. package/dist/services/definitions/memu.d.cts.map +1 -0
  643. package/dist/services/definitions/memu.d.mts +7 -0
  644. package/dist/services/definitions/memu.d.mts.map +1 -0
  645. package/dist/services/definitions/memu.mjs +95 -0
  646. package/dist/services/definitions/memu.mjs.map +1 -0
  647. package/dist/services/definitions/metabase.d.cts +1 -1
  648. package/dist/services/definitions/metabase.d.mts +1 -1
  649. package/dist/services/definitions/milvus.cjs +4 -1
  650. package/dist/services/definitions/milvus.cjs.map +1 -1
  651. package/dist/services/definitions/milvus.d.cts +1 -1
  652. package/dist/services/definitions/milvus.d.mts +1 -1
  653. package/dist/services/definitions/milvus.mjs +4 -1
  654. package/dist/services/definitions/milvus.mjs.map +1 -1
  655. package/dist/services/definitions/minio.d.cts +1 -1
  656. package/dist/services/definitions/minio.d.mts +1 -1
  657. package/dist/services/definitions/mission-control.d.cts +1 -1
  658. package/dist/services/definitions/mission-control.d.mts +1 -1
  659. package/dist/services/definitions/mixpost.d.cts +1 -1
  660. package/dist/services/definitions/mixpost.d.mts +1 -1
  661. package/dist/services/definitions/mosquitto.d.cts +1 -1
  662. package/dist/services/definitions/mosquitto.d.mts +1 -1
  663. package/dist/services/definitions/motion-canvas.d.cts +1 -1
  664. package/dist/services/definitions/motion-canvas.d.mts +1 -1
  665. package/dist/services/definitions/mysql.d.cts +1 -1
  666. package/dist/services/definitions/mysql.d.mts +1 -1
  667. package/dist/services/definitions/n8n.d.cts +1 -1
  668. package/dist/services/definitions/n8n.d.mts +1 -1
  669. package/dist/services/definitions/nanobot.cjs +86 -0
  670. package/dist/services/definitions/nanobot.cjs.map +1 -0
  671. package/dist/services/definitions/nanobot.d.cts +7 -0
  672. package/dist/services/definitions/nanobot.d.cts.map +1 -0
  673. package/dist/services/definitions/nanobot.d.mts +7 -0
  674. package/dist/services/definitions/nanobot.d.mts.map +1 -0
  675. package/dist/services/definitions/nanobot.mjs +85 -0
  676. package/dist/services/definitions/nanobot.mjs.map +1 -0
  677. package/dist/services/definitions/nanoclaw.cjs +79 -0
  678. package/dist/services/definitions/nanoclaw.cjs.map +1 -0
  679. package/dist/services/definitions/nanoclaw.d.cts +7 -0
  680. package/dist/services/definitions/nanoclaw.d.cts.map +1 -0
  681. package/dist/services/definitions/nanoclaw.d.mts +7 -0
  682. package/dist/services/definitions/nanoclaw.d.mts.map +1 -0
  683. package/dist/services/definitions/nanoclaw.mjs +78 -0
  684. package/dist/services/definitions/nanoclaw.mjs.map +1 -0
  685. package/dist/services/definitions/navidrome.d.cts +1 -1
  686. package/dist/services/definitions/navidrome.d.mts +1 -1
  687. package/dist/services/definitions/neo4j.d.cts +1 -1
  688. package/dist/services/definitions/neo4j.d.mts +1 -1
  689. package/dist/services/definitions/nextcloud.d.cts +1 -1
  690. package/dist/services/definitions/nextcloud.d.mts +1 -1
  691. package/dist/services/definitions/nginx-proxy-manager.d.cts +1 -1
  692. package/dist/services/definitions/nginx-proxy-manager.d.mts +1 -1
  693. package/dist/services/definitions/nocodb.d.cts +1 -1
  694. package/dist/services/definitions/nocodb.d.mts +1 -1
  695. package/dist/services/definitions/node-red.d.cts +1 -1
  696. package/dist/services/definitions/node-red.d.mts +1 -1
  697. package/dist/services/definitions/ntfy.d.cts +1 -1
  698. package/dist/services/definitions/ntfy.d.mts +1 -1
  699. package/dist/services/definitions/ollama.d.cts +1 -1
  700. package/dist/services/definitions/ollama.d.mts +1 -1
  701. package/dist/services/definitions/open-saas.d.cts +1 -1
  702. package/dist/services/definitions/open-saas.d.mts +1 -1
  703. package/dist/services/definitions/open-webui.d.cts +1 -1
  704. package/dist/services/definitions/open-webui.d.mts +1 -1
  705. package/dist/services/definitions/opencode.d.cts +1 -1
  706. package/dist/services/definitions/opencode.d.mts +1 -1
  707. package/dist/services/definitions/openhands.d.cts +1 -1
  708. package/dist/services/definitions/openhands.d.mts +1 -1
  709. package/dist/services/definitions/openpanel.d.cts +1 -1
  710. package/dist/services/definitions/openpanel.d.mts +1 -1
  711. package/dist/services/definitions/opensandbox.cjs +2 -1
  712. package/dist/services/definitions/opensandbox.cjs.map +1 -1
  713. package/dist/services/definitions/opensandbox.d.cts +1 -1
  714. package/dist/services/definitions/opensandbox.d.mts +1 -1
  715. package/dist/services/definitions/opensandbox.mjs +2 -1
  716. package/dist/services/definitions/opensandbox.mjs.map +1 -1
  717. package/dist/services/definitions/opensearch.d.cts +1 -1
  718. package/dist/services/definitions/opensearch.d.mts +1 -1
  719. package/dist/services/definitions/outline.d.cts +1 -1
  720. package/dist/services/definitions/outline.d.mts +1 -1
  721. package/dist/services/definitions/paperless-ngx.d.cts +1 -1
  722. package/dist/services/definitions/paperless-ngx.d.mts +1 -1
  723. package/dist/services/definitions/pentagi.d.cts +1 -1
  724. package/dist/services/definitions/pentagi.d.mts +1 -1
  725. package/dist/services/definitions/pentestagent.d.cts +1 -1
  726. package/dist/services/definitions/pentestagent.d.mts +1 -1
  727. package/dist/services/definitions/photoprism.d.cts +1 -1
  728. package/dist/services/definitions/photoprism.d.mts +1 -1
  729. package/dist/services/definitions/pihole.d.cts +1 -1
  730. package/dist/services/definitions/pihole.d.mts +1 -1
  731. package/dist/services/definitions/piper-tts.d.cts +1 -1
  732. package/dist/services/definitions/piper-tts.d.mts +1 -1
  733. package/dist/services/definitions/plane.d.cts +1 -1
  734. package/dist/services/definitions/plane.d.mts +1 -1
  735. package/dist/services/definitions/plausible.d.cts +1 -1
  736. package/dist/services/definitions/plausible.d.mts +1 -1
  737. package/dist/services/definitions/playwright-server.d.cts +1 -1
  738. package/dist/services/definitions/playwright-server.d.mts +1 -1
  739. package/dist/services/definitions/pocket-id.d.cts +1 -1
  740. package/dist/services/definitions/pocket-id.d.mts +1 -1
  741. package/dist/services/definitions/pocketbase.d.cts +1 -1
  742. package/dist/services/definitions/pocketbase.d.mts +1 -1
  743. package/dist/services/definitions/portainer.d.cts +1 -1
  744. package/dist/services/definitions/portainer.d.mts +1 -1
  745. package/dist/services/definitions/postgresql.d.cts +1 -1
  746. package/dist/services/definitions/postgresql.d.mts +1 -1
  747. package/dist/services/definitions/posthog.d.cts +1 -1
  748. package/dist/services/definitions/posthog.d.mts +1 -1
  749. package/dist/services/definitions/postiz.d.cts +1 -1
  750. package/dist/services/definitions/postiz.d.mts +1 -1
  751. package/dist/services/definitions/prometheus.d.cts +1 -1
  752. package/dist/services/definitions/prometheus.d.mts +1 -1
  753. package/dist/services/definitions/qdrant.d.cts +1 -1
  754. package/dist/services/definitions/qdrant.d.mts +1 -1
  755. package/dist/services/definitions/rabbitmq.d.cts +1 -1
  756. package/dist/services/definitions/rabbitmq.d.mts +1 -1
  757. package/dist/services/definitions/ragflow.d.cts +1 -1
  758. package/dist/services/definitions/ragflow.d.mts +1 -1
  759. package/dist/services/definitions/redis.d.cts +1 -1
  760. package/dist/services/definitions/redis.d.mts +1 -1
  761. package/dist/services/definitions/relaticle-horizon.cjs +48 -0
  762. package/dist/services/definitions/relaticle-horizon.cjs.map +1 -0
  763. package/dist/services/definitions/relaticle-horizon.d.cts +7 -0
  764. package/dist/services/definitions/relaticle-horizon.d.cts.map +1 -0
  765. package/dist/services/definitions/relaticle-horizon.d.mts +7 -0
  766. package/dist/services/definitions/relaticle-horizon.d.mts.map +1 -0
  767. package/dist/services/definitions/relaticle-horizon.mjs +48 -0
  768. package/dist/services/definitions/relaticle-horizon.mjs.map +1 -0
  769. package/dist/services/definitions/relaticle-scheduler.cjs +44 -0
  770. package/dist/services/definitions/relaticle-scheduler.cjs.map +1 -0
  771. package/dist/services/definitions/relaticle-scheduler.d.cts +7 -0
  772. package/dist/services/definitions/relaticle-scheduler.d.cts.map +1 -0
  773. package/dist/services/definitions/relaticle-scheduler.d.mts +7 -0
  774. package/dist/services/definitions/relaticle-scheduler.d.mts.map +1 -0
  775. package/dist/services/definitions/relaticle-scheduler.mjs +44 -0
  776. package/dist/services/definitions/relaticle-scheduler.mjs.map +1 -0
  777. package/dist/services/definitions/relaticle.cjs +151 -0
  778. package/dist/services/definitions/relaticle.cjs.map +1 -0
  779. package/dist/services/definitions/relaticle.d.cts +80 -0
  780. package/dist/services/definitions/relaticle.d.cts.map +1 -0
  781. package/dist/services/definitions/relaticle.d.mts +80 -0
  782. package/dist/services/definitions/relaticle.d.mts.map +1 -0
  783. package/dist/services/definitions/relaticle.mjs +149 -0
  784. package/dist/services/definitions/relaticle.mjs.map +1 -0
  785. package/dist/services/definitions/remotion.d.cts +1 -1
  786. package/dist/services/definitions/remotion.d.mts +1 -1
  787. package/dist/services/definitions/restic.d.cts +1 -1
  788. package/dist/services/definitions/restic.d.mts +1 -1
  789. package/dist/services/definitions/revolt.d.cts +1 -1
  790. package/dist/services/definitions/revolt.d.mts +1 -1
  791. package/dist/services/definitions/rocketchat.d.cts +1 -1
  792. package/dist/services/definitions/rocketchat.d.mts +1 -1
  793. package/dist/services/definitions/saleor.d.cts +1 -1
  794. package/dist/services/definitions/saleor.d.mts +1 -1
  795. package/dist/services/definitions/scrapling.d.cts +1 -1
  796. package/dist/services/definitions/scrapling.d.mts +1 -1
  797. package/dist/services/definitions/searxng.d.cts +1 -1
  798. package/dist/services/definitions/searxng.d.mts +1 -1
  799. package/dist/services/definitions/sentry.d.cts +1 -1
  800. package/dist/services/definitions/sentry.d.mts +1 -1
  801. package/dist/services/definitions/signoz.d.cts +1 -1
  802. package/dist/services/definitions/signoz.d.mts +1 -1
  803. package/dist/services/definitions/solidityguard.d.cts +1 -1
  804. package/dist/services/definitions/solidityguard.d.mts +1 -1
  805. package/dist/services/definitions/sonarqube.d.cts +1 -1
  806. package/dist/services/definitions/sonarqube.d.mts +1 -1
  807. package/dist/services/definitions/stable-diffusion.d.cts +1 -1
  808. package/dist/services/definitions/stable-diffusion.d.mts +1 -1
  809. package/dist/services/definitions/steel-browser.d.cts +1 -1
  810. package/dist/services/definitions/steel-browser.d.mts +1 -1
  811. package/dist/services/definitions/stirling-pdf.d.cts +1 -1
  812. package/dist/services/definitions/stirling-pdf.d.mts +1 -1
  813. package/dist/services/definitions/strapi.d.cts +1 -1
  814. package/dist/services/definitions/strapi.d.mts +1 -1
  815. package/dist/services/definitions/stream-gateway.d.cts +1 -1
  816. package/dist/services/definitions/stream-gateway.d.mts +1 -1
  817. package/dist/services/definitions/supabase.d.cts +1 -1
  818. package/dist/services/definitions/supabase.d.mts +1 -1
  819. package/dist/services/definitions/superset.d.cts +1 -1
  820. package/dist/services/definitions/superset.d.mts +1 -1
  821. package/dist/services/definitions/surrealdb.d.cts +1 -1
  822. package/dist/services/definitions/surrealdb.d.mts +1 -1
  823. package/dist/services/definitions/tabby-ml.d.cts +1 -1
  824. package/dist/services/definitions/tabby-ml.d.mts +1 -1
  825. package/dist/services/definitions/tailscale.d.cts +1 -1
  826. package/dist/services/definitions/tailscale.d.mts +1 -1
  827. package/dist/services/definitions/tempo.d.cts +1 -1
  828. package/dist/services/definitions/tempo.d.mts +1 -1
  829. package/dist/services/definitions/temporal.d.cts +1 -1
  830. package/dist/services/definitions/temporal.d.mts +1 -1
  831. package/dist/services/definitions/text-gen-webui.d.cts +1 -1
  832. package/dist/services/definitions/text-gen-webui.d.mts +1 -1
  833. package/dist/services/definitions/timescaledb.d.cts +1 -1
  834. package/dist/services/definitions/timescaledb.d.mts +1 -1
  835. package/dist/services/definitions/traefik.d.cts +1 -1
  836. package/dist/services/definitions/traefik.d.mts +1 -1
  837. package/dist/services/definitions/twenty-worker.cjs +73 -0
  838. package/dist/services/definitions/twenty-worker.cjs.map +1 -0
  839. package/dist/services/definitions/twenty-worker.d.cts +7 -0
  840. package/dist/services/definitions/twenty-worker.d.cts.map +1 -0
  841. package/dist/services/definitions/twenty-worker.d.mts +7 -0
  842. package/dist/services/definitions/twenty-worker.d.mts.map +1 -0
  843. package/dist/services/definitions/twenty-worker.mjs +72 -0
  844. package/dist/services/definitions/twenty-worker.mjs.map +1 -0
  845. package/dist/services/definitions/twenty.cjs +24 -2
  846. package/dist/services/definitions/twenty.cjs.map +1 -1
  847. package/dist/services/definitions/twenty.d.cts +1 -1
  848. package/dist/services/definitions/twenty.d.mts +1 -1
  849. package/dist/services/definitions/twenty.mjs +24 -2
  850. package/dist/services/definitions/twenty.mjs.map +1 -1
  851. package/dist/services/definitions/umami.d.cts +1 -1
  852. package/dist/services/definitions/umami.d.mts +1 -1
  853. package/dist/services/definitions/uptime-kuma.d.cts +1 -1
  854. package/dist/services/definitions/uptime-kuma.d.mts +1 -1
  855. package/dist/services/definitions/usesend.d.cts +1 -1
  856. package/dist/services/definitions/usesend.d.mts +1 -1
  857. package/dist/services/definitions/valkey.d.cts +1 -1
  858. package/dist/services/definitions/valkey.d.mts +1 -1
  859. package/dist/services/definitions/vault.d.cts +1 -1
  860. package/dist/services/definitions/vault.d.mts +1 -1
  861. package/dist/services/definitions/vaultwarden.d.cts +1 -1
  862. package/dist/services/definitions/vaultwarden.d.mts +1 -1
  863. package/dist/services/definitions/vector-log.d.cts +1 -1
  864. package/dist/services/definitions/vector-log.d.mts +1 -1
  865. package/dist/services/definitions/vikunja.d.cts +1 -1
  866. package/dist/services/definitions/vikunja.d.mts +1 -1
  867. package/dist/services/definitions/watchtower.d.cts +1 -1
  868. package/dist/services/definitions/watchtower.d.mts +1 -1
  869. package/dist/services/definitions/weaviate.cjs +4 -1
  870. package/dist/services/definitions/weaviate.cjs.map +1 -1
  871. package/dist/services/definitions/weaviate.d.cts +1 -1
  872. package/dist/services/definitions/weaviate.d.mts +1 -1
  873. package/dist/services/definitions/weaviate.mjs +4 -1
  874. package/dist/services/definitions/weaviate.mjs.map +1 -1
  875. package/dist/services/definitions/whisper.d.cts +1 -1
  876. package/dist/services/definitions/whisper.d.mts +1 -1
  877. package/dist/services/definitions/wireguard.d.cts +1 -1
  878. package/dist/services/definitions/wireguard.d.mts +1 -1
  879. package/dist/services/definitions/woodpecker-ci.d.cts +1 -1
  880. package/dist/services/definitions/woodpecker-ci.d.mts +1 -1
  881. package/dist/services/definitions/xyops.d.cts +1 -1
  882. package/dist/services/definitions/xyops.d.mts +1 -1
  883. package/dist/services/definitions/zeroclaw.cjs +103 -0
  884. package/dist/services/definitions/zeroclaw.cjs.map +1 -0
  885. package/dist/services/definitions/zeroclaw.d.cts +7 -0
  886. package/dist/services/definitions/zeroclaw.d.cts.map +1 -0
  887. package/dist/services/definitions/zeroclaw.d.mts +7 -0
  888. package/dist/services/definitions/zeroclaw.d.mts.map +1 -0
  889. package/dist/services/definitions/zeroclaw.mjs +102 -0
  890. package/dist/services/definitions/zeroclaw.mjs.map +1 -0
  891. package/dist/services/definitions/zulip.d.cts +1 -1
  892. package/dist/services/definitions/zulip.d.mts +1 -1
  893. package/dist/services/registry.d.cts +1 -1
  894. package/dist/services/registry.d.mts +1 -1
  895. package/dist/services/registry.test.cjs +8 -8
  896. package/dist/services/registry.test.cjs.map +1 -1
  897. package/dist/services/registry.test.mjs +8 -8
  898. package/dist/services/registry.test.mjs.map +1 -1
  899. package/dist/skills/registry.cjs +19 -0
  900. package/dist/skills/registry.cjs.map +1 -1
  901. package/dist/skills/registry.d.cts +1 -1
  902. package/dist/skills/registry.d.cts.map +1 -1
  903. package/dist/skills/registry.d.mts +1 -1
  904. package/dist/skills/registry.d.mts.map +1 -1
  905. package/dist/skills/registry.mjs +19 -0
  906. package/dist/skills/registry.mjs.map +1 -1
  907. package/dist/{skills-BSF7iNa4.cjs → skills-uPxJVmKk.cjs} +311 -1
  908. package/dist/skills-uPxJVmKk.cjs.map +1 -0
  909. package/dist/{test.CTcmp4Su-ClCHJ3FA.mjs → test.CTcmp4Su-BRa7-bTj.mjs} +2 -2
  910. package/dist/{test.CTcmp4Su-ClCHJ3FA.mjs.map → test.CTcmp4Su-BRa7-bTj.mjs.map} +1 -1
  911. package/dist/{test.CTcmp4Su-DlzTarwH.cjs → test.CTcmp4Su-BWSPM8ZQ.cjs} +19 -1
  912. package/dist/{test.CTcmp4Su-DlzTarwH.cjs.map → test.CTcmp4Su-BWSPM8ZQ.cjs.map} +1 -1
  913. package/dist/track-analytics.d.cts +1 -1
  914. package/dist/track-analytics.d.mts +1 -1
  915. package/dist/track-analytics.test.cjs +1 -1
  916. package/dist/track-analytics.test.mjs +1 -1
  917. package/dist/types-BREUfzzq.d.mts +77 -0
  918. package/dist/types-BREUfzzq.d.mts.map +1 -0
  919. package/dist/types-Bsn0XzSP.d.cts +95 -0
  920. package/dist/types-Bsn0XzSP.d.cts.map +1 -0
  921. package/dist/types-CyZ5mn6w.d.cts +77 -0
  922. package/dist/types-CyZ5mn6w.d.cts.map +1 -0
  923. package/dist/types-DIsPc-hb.d.cts +100 -0
  924. package/dist/types-DIsPc-hb.d.cts.map +1 -0
  925. package/dist/types-DbXajvYq.d.mts +100 -0
  926. package/dist/types-DbXajvYq.d.mts.map +1 -0
  927. package/dist/types-DwTKyCZ9.d.mts +95 -0
  928. package/dist/types-DwTKyCZ9.d.mts.map +1 -0
  929. package/dist/{types-CR83OJiq.d.cts → types-dyBnrHm9.d.cts} +5 -1
  930. package/dist/types-dyBnrHm9.d.cts.map +1 -0
  931. package/dist/{types-zYjGTuyn.d.mts → types-fRSnaZTX.d.mts} +5 -1
  932. package/dist/types-fRSnaZTX.d.mts.map +1 -0
  933. package/dist/types.cjs +7 -0
  934. package/dist/types.cjs.map +1 -1
  935. package/dist/types.d.cts +2 -93
  936. package/dist/types.d.mts +2 -93
  937. package/dist/types.mjs +7 -0
  938. package/dist/types.mjs.map +1 -1
  939. package/dist/validator.cjs +1 -1
  940. package/dist/validator.d.cts +1 -1
  941. package/dist/validator.d.mts +1 -1
  942. package/dist/validator.test.cjs +1 -1
  943. package/dist/validator.test.mjs +1 -1
  944. package/dist/version-manager.d.cts +1 -1
  945. package/dist/version-manager.d.mts +1 -1
  946. package/dist/version-manager.test.cjs +3 -3
  947. package/dist/version-manager.test.cjs.map +1 -1
  948. package/dist/version-manager.test.mjs +3 -3
  949. package/dist/version-manager.test.mjs.map +1 -1
  950. package/dist/zeroclaw-B-0TuOfZ.d.mts +7 -0
  951. package/dist/zeroclaw-B-0TuOfZ.d.mts.map +1 -0
  952. package/dist/zeroclaw-BvKpDHKe.d.cts +7 -0
  953. package/dist/zeroclaw-BvKpDHKe.d.cts.map +1 -0
  954. package/package.json +6 -2
  955. package/src/addon-stack.test.ts +19 -23
  956. package/src/addon-stack.ts +67 -44
  957. package/src/composer.test.ts +59 -0
  958. package/src/composer.ts +135 -194
  959. package/src/deployers/coolify.ts +38 -0
  960. package/src/deployers/dokploy.ts +38 -0
  961. package/src/deployers/types.ts +2 -0
  962. package/src/frameworks/claude-code-fw.ts +118 -0
  963. package/src/frameworks/codex-fw.ts +102 -0
  964. package/src/frameworks/copaw.ts +154 -0
  965. package/src/frameworks/index.ts +46 -0
  966. package/src/frameworks/memu.ts +149 -0
  967. package/src/frameworks/nanobot.ts +156 -0
  968. package/src/frameworks/nanoclaw.ts +126 -0
  969. package/src/frameworks/openclaw.ts +325 -0
  970. package/src/frameworks/registry.test.ts +131 -0
  971. package/src/frameworks/registry.ts +28 -0
  972. package/src/frameworks/types.ts +146 -0
  973. package/src/frameworks/zeroclaw.ts +148 -0
  974. package/src/generate.test.ts +55 -4
  975. package/src/generate.ts +67 -14
  976. package/src/generators/caddy.test.ts +41 -1
  977. package/src/generators/caddy.ts +16 -2
  978. package/src/generators/clone-repos.test.ts +1 -1
  979. package/src/generators/clone-repos.ts +7 -2
  980. package/src/generators/env.test.ts +2 -2
  981. package/src/generators/env.ts +30 -180
  982. package/src/generators/health-check.ts +4 -4
  983. package/src/generators/openclaw-json.ts +57 -5
  984. package/src/generators/postgres-init.ts +9 -0
  985. package/src/generators/readme.ts +75 -9
  986. package/src/generators/scripts.test.ts +1 -1
  987. package/src/generators/skills.ts +316 -0
  988. package/src/generators/traefik.test.ts +13 -13
  989. package/src/index.ts +46 -7
  990. package/src/logger/__tests__/logger.test.ts +388 -0
  991. package/src/logger/index.ts +14 -0
  992. package/src/logger/logger.ts +326 -0
  993. package/src/logger/sinks/callback-sink.ts +13 -0
  994. package/src/logger/sinks/console-sink.ts +51 -0
  995. package/src/logger/sinks/file-sink.ts +121 -0
  996. package/src/logger/types.ts +90 -0
  997. package/src/migrations.ts +8 -1
  998. package/src/presets/presets.test.ts +4 -4
  999. package/src/presets/registry.test.ts +6 -6
  1000. package/src/resolver.test.ts +31 -3
  1001. package/src/resolver.ts +19 -3
  1002. package/src/schema.test.ts +2 -2
  1003. package/src/schema.ts +58 -17
  1004. package/src/services/definitions/agent-browser.ts +177 -0
  1005. package/src/services/definitions/apptension-saas.ts +2 -1
  1006. package/src/services/definitions/chromadb.ts +1 -1
  1007. package/src/services/definitions/claude-code.ts +1 -1
  1008. package/src/services/definitions/clawrouter.ts +141 -0
  1009. package/src/services/definitions/codex.ts +1 -1
  1010. package/src/services/definitions/convex.ts +1 -2
  1011. package/src/services/definitions/copaw.ts +101 -0
  1012. package/src/services/definitions/desktop-environment.ts +1 -0
  1013. package/src/services/definitions/hindsight.ts +3 -2
  1014. package/src/services/definitions/index.ts +53 -16
  1015. package/src/services/definitions/mem0.ts +132 -0
  1016. package/src/services/definitions/memu.ts +96 -0
  1017. package/src/services/definitions/milvus.ts +1 -1
  1018. package/src/services/definitions/nanobot.ts +89 -0
  1019. package/src/services/definitions/nanoclaw.ts +78 -0
  1020. package/src/services/definitions/opensandbox.ts +6 -15
  1021. package/src/services/definitions/relaticle-horizon.ts +48 -0
  1022. package/src/services/definitions/relaticle-scheduler.ts +42 -0
  1023. package/src/services/definitions/relaticle.ts +142 -0
  1024. package/src/services/definitions/twenty-worker.ts +70 -0
  1025. package/src/services/definitions/twenty.ts +16 -2
  1026. package/src/services/definitions/weaviate.ts +1 -1
  1027. package/src/services/definitions/zeroclaw.ts +102 -0
  1028. package/src/services/registry.test.ts +7 -7
  1029. package/src/skills/registry.ts +10 -0
  1030. package/src/types.ts +11 -1
  1031. package/src/version-manager.test.ts +2 -2
  1032. package/dist/schema-BQnZrcw8.d.cts.map +0 -1
  1033. package/dist/schema-SBpL0bdI.d.mts.map +0 -1
  1034. package/dist/skills-BSF7iNa4.cjs.map +0 -1
  1035. package/dist/types-CR83OJiq.d.cts.map +0 -1
  1036. package/dist/types-zYjGTuyn.d.mts.map +0 -1
  1037. package/dist/types.d.cts.map +0 -1
  1038. package/dist/types.d.mts.map +0 -1
package/dist/generate.cjs CHANGED
@@ -1,5 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_skills = require("./skills-BSF7iNa4.cjs");
2
+ const require_skills = require("./skills-uPxJVmKk.cjs");
3
+ const require_frameworks_registry = require("./frameworks/registry.cjs");
4
+ require("./frameworks/index.cjs");
3
5
  const require_generators_postgres_init = require("./generators/postgres-init.cjs");
4
6
  const require_composer = require("./composer.cjs");
5
7
  const require_resolver = require("./resolver.cjs");
@@ -16,7 +18,6 @@ const require_generators_health_check = require("./generators/health-check.cjs")
16
18
  const require_generators_n8n_workflows = require("./generators/n8n-workflows.cjs");
17
19
  const require_generators_native_services = require("./generators/native-services.cjs");
18
20
  const require_generators_openclaw_install_script = require("./generators/openclaw-install-script.cjs");
19
- const require_generators_openclaw_json = require("./generators/openclaw-json.cjs");
20
21
  const require_generators_prometheus = require("./generators/prometheus.cjs");
21
22
  const require_generators_readme = require("./generators/readme.cjs");
22
23
  const require_generators_scripts = require("./generators/scripts.cjs");
@@ -34,19 +35,40 @@ function getComposePlatform(platform) {
34
35
  * Main orchestration function: takes generation input, resolves dependencies,
35
36
  * generates all files, validates, and returns the complete file tree.
36
37
  */
37
- function generate(rawInput) {
38
+ function generate(rawInput, options) {
39
+ const logger = options?.logger;
38
40
  const input = require_migrations.migrateConfig(rawInput);
39
41
  const composePlatform = getComposePlatform(input.platform);
40
- const resolved = require_resolver.resolve({
42
+ logger?.info("generation", "Starting stack generation", {
43
+ projectName: input.projectName,
44
+ services: input.services,
45
+ platform: input.platform,
46
+ proxy: input.proxy,
47
+ deploymentType: input.deploymentType
48
+ });
49
+ const resolverInput = {
41
50
  services: input.services,
42
51
  skillPacks: input.skillPacks,
43
52
  aiProviders: input.aiProviders,
53
+ primaryFramework: input.primaryFramework,
44
54
  proxy: input.proxy,
45
55
  gpu: input.gpu,
46
56
  platform: composePlatform,
47
57
  monitoring: input.monitoring
58
+ };
59
+ logger?.debug("resolution", "Resolving dependencies");
60
+ const resolved = require_resolver.resolve(resolverInput);
61
+ if (!resolved.isValid) {
62
+ const errMsg = `Invalid stack configuration: ${resolved.errors.map((e) => e.message).join("; ")}`;
63
+ logger?.error("resolution", errMsg);
64
+ throw new require_errors.StackConfigError(errMsg);
65
+ }
66
+ logger?.info("resolution", `Resolved ${resolved.services.length} services`, {
67
+ serviceCount: resolved.services.length,
68
+ addedDeps: resolved.addedDependencies.length,
69
+ warnings: resolved.warnings.length,
70
+ estimatedMemoryMB: resolved.estimatedMemoryMB
48
71
  });
49
- if (!resolved.isValid) throw new require_errors.StackConfigError(`Invalid stack configuration: ${resolved.errors.map((e) => e.message).join("; ")}`);
50
72
  const isBareMetal = input.deploymentType === "bare-metal";
51
73
  let resolvedForCompose = resolved;
52
74
  let nativeIds = /* @__PURE__ */ new Set();
@@ -59,10 +81,13 @@ function generate(rawInput) {
59
81
  nativeIds = partition.nativeIds;
60
82
  if (nativeServices.length > 0) resolvedForCompose = require_bare_metal_partition.resolvedWithOnlyServices(resolved, dockerOnlyServices);
61
83
  }
84
+ logger?.debug("generation", "Generating Docker Compose YAML");
62
85
  let traefikOutput;
63
86
  if (input.proxy === "traefik" && input.domain) traefikOutput = require_generators_traefik.generateTraefikConfig(resolvedForCompose, input.domain);
64
87
  const composeOptions = {
65
88
  projectName: input.projectName,
89
+ primaryFramework: input.primaryFramework,
90
+ companionFrameworks: input.companionFrameworks,
66
91
  proxy: input.proxy,
67
92
  proxyHttpPort: input.proxyHttpPort,
68
93
  proxyHttpsPort: input.proxyHttpsPort,
@@ -79,11 +104,17 @@ function generate(rawInput) {
79
104
  openclawInstallMethod: input.openclawInstallMethod ?? "docker"
80
105
  };
81
106
  const composeResult = require_composer.composeMultiFile(resolvedForCompose, composeOptions);
107
+ logger?.info("generation", `Generated ${Object.keys(composeResult.files).length} compose files`);
82
108
  const validation = require_validator.validate(resolvedForCompose, composeResult.files["docker-compose.yml"] ?? "", {
83
109
  domain: input.domain,
84
110
  generateSecrets: input.generateSecrets
85
111
  });
86
- if (!validation.valid) throw new require_errors.ValidationError(`Validation failed: ${validation.errors.map((e) => e.message).join("; ")}`);
112
+ if (!validation.valid) {
113
+ const errMsg = `Validation failed: ${validation.errors.map((e) => e.message).join("; ")}`;
114
+ logger?.error("validation", errMsg);
115
+ throw new require_errors.ValidationError(errMsg);
116
+ }
117
+ logger?.debug("validation", "Stack validation passed");
87
118
  const files = {};
88
119
  for (const [filename, content] of Object.entries(composeResult.files)) files[filename] = content;
89
120
  const envFiles = require_generators_env.generateEnvFiles(resolved, {
@@ -93,7 +124,8 @@ function generate(rawInput) {
93
124
  nativeServiceIds: isBareMetal ? nativeIds : void 0,
94
125
  composeFiles: Object.keys(composeResult.files),
95
126
  composeProfiles: composeResult.profiles,
96
- openclawImage: input.openclawImage
127
+ openclawImage: input.openclawImage,
128
+ primaryFramework: input.primaryFramework
97
129
  });
98
130
  files[".env.example"] = envFiles.envExample;
99
131
  files[".env"] = envFiles.env;
@@ -109,18 +141,23 @@ function generate(rawInput) {
109
141
  for (const [path, content] of Object.entries(manifestFiles)) files[path] = content;
110
142
  const skillFiles = require_skills.generateSkillFiles(resolved);
111
143
  for (const [path, content] of Object.entries(skillFiles)) files[path] = content;
112
- files["openclaw/config/openclaw.json"] = require_generators_openclaw_json.generateOpenClawConfig(resolved, {
113
- deploymentType: input.deploymentType,
114
- gatewayPort: 18789,
115
- openclawVersion: input.openclawVersion
116
- });
144
+ const framework = require_frameworks_registry.getFrameworkById(input.primaryFramework ?? "openclaw");
145
+ if (framework) {
146
+ const fwConfig = framework.generateConfig(resolved, {
147
+ deploymentType: input.deploymentType,
148
+ gatewayPort: 18789,
149
+ frameworkVersion: input.openclawVersion
150
+ });
151
+ if (fwConfig) files[fwConfig.path] = fwConfig.content;
152
+ }
117
153
  files["README.md"] = require_generators_readme.generateReadme(resolved, {
118
154
  projectName: input.projectName,
119
155
  domain: input.domain,
120
156
  proxy: input.proxy,
121
157
  deploymentType: input.deploymentType,
122
158
  hasNativeServices: isBareMetal && nativeServices.length > 0,
123
- openclawInstallMethod: input.openclawInstallMethod
159
+ openclawInstallMethod: input.openclawInstallMethod,
160
+ primaryFramework: input.primaryFramework
124
161
  });
125
162
  const scripts = require_generators_scripts.generateScripts({ hasGitServices: resolvedForCompose.services.some((s) => s.definition.gitSource) });
126
163
  for (const [path, content] of Object.entries(scripts)) files[path] = content;
@@ -185,6 +222,20 @@ function generate(rawInput) {
185
222
  gatewayPort: 18789
186
223
  });
187
224
  const skillCount = resolved.services.reduce((sum, s) => sum + s.definition.skills.length, 0);
225
+ const fileCount = Object.keys(files).length;
226
+ logger?.log({
227
+ level: "info",
228
+ category: "generation",
229
+ message: `Stack generation complete: ${fileCount} files, ${resolved.services.length} services`,
230
+ outcome: "success",
231
+ context: {
232
+ fileCount,
233
+ serviceCount: resolved.services.length,
234
+ skillCount,
235
+ estimatedMemoryMB: resolved.estimatedMemoryMB
236
+ },
237
+ filesAffected: { created: Object.keys(files) }
238
+ });
188
239
  return {
189
240
  files,
190
241
  metadata: {
@@ -1 +1 @@
1
- {"version":3,"file":"generate.cjs","names":["migrateConfig","resolve","StackConfigError","partitionBareMetal","resolvedWithOnlyServices","generateTraefikConfig","composeMultiFile","validate","ValidationError","generateEnvFiles","generateStackManifest","generateSkillFiles","generateOpenClawConfig","generateReadme","generateScripts","generateCloneScripts","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 { generateCloneScripts } from \"./generators/clone-repos.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\t\"repos/\",\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 hasGitServices = resolvedForCompose.services.some((s) => s.definition.gitSource);\n\tconst scripts = generateScripts({ hasGitServices });\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Clone scripts for git-based services (SaaS boilerplates)\n\tconst cloneScripts = generateCloneScripts(resolvedForCompose);\n\tfor (const [path, content] of Object.entries(cloneScripts)) {\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
+ {"version":3,"file":"generate.cjs","names":["migrateConfig","resolve","StackConfigError","partitionBareMetal","resolvedWithOnlyServices","generateTraefikConfig","composeMultiFile","validate","ValidationError","generateEnvFiles","generateStackManifest","generateSkillFiles","getFrameworkById","generateReadme","generateScripts","generateCloneScripts","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 { getFrameworkById } from \"./frameworks/index.js\";\nimport { generateBareMetalInstall } from \"./generators/bare-metal-install.js\";\nimport { generateCaddyfile } from \"./generators/caddy.js\";\nimport { generateCloneScripts } from \"./generators/clone-repos.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 { 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 type { OperationsLogger } from \"./logger/logger.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(\n\trawInput: GenerationInput,\n\toptions?: { logger?: OperationsLogger },\n): GenerationResult {\n\tconst logger = options?.logger;\n\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\tlogger?.info(\"generation\", \"Starting stack generation\", {\n\t\tprojectName: input.projectName,\n\t\tservices: input.services,\n\t\tplatform: input.platform,\n\t\tproxy: input.proxy,\n\t\tdeploymentType: input.deploymentType,\n\t});\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\tprimaryFramework: input.primaryFramework,\n\t\tproxy: input.proxy,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tmonitoring: input.monitoring,\n\t};\n\tlogger?.debug(\"resolution\", \"Resolving dependencies\");\n\tconst resolved = resolve(resolverInput);\n\n\tif (!resolved.isValid) {\n\t\tconst errMsg = `Invalid stack configuration: ${resolved.errors.map((e) => e.message).join(\"; \")}`;\n\t\tlogger?.error(\"resolution\", errMsg);\n\t\tthrow new StackConfigError(errMsg);\n\t}\n\n\tlogger?.info(\"resolution\", `Resolved ${resolved.services.length} services`, {\n\t\tserviceCount: resolved.services.length,\n\t\taddedDeps: resolved.addedDependencies.length,\n\t\twarnings: resolved.warnings.length,\n\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\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\tlogger?.debug(\"generation\", \"Generating Docker Compose YAML\");\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\tprimaryFramework: input.primaryFramework,\n\t\tcompanionFrameworks: input.companionFrameworks,\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\tlogger?.info(\"generation\", `Generated ${Object.keys(composeResult.files).length} compose files`);\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\tconst errMsg = `Validation failed: ${validation.errors.map((e) => e.message).join(\"; \")}`;\n\t\tlogger?.error(\"validation\", errMsg);\n\t\tthrow new ValidationError(errMsg);\n\t}\n\tlogger?.debug(\"validation\", \"Stack validation passed\");\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\tprimaryFramework: input.primaryFramework,\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\t\"repos/\",\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// Framework-specific configuration\n\tconst framework = getFrameworkById(input.primaryFramework ?? \"openclaw\");\n\tif (framework) {\n\t\tconst fwConfig = framework.generateConfig(resolved, {\n\t\t\tdeploymentType: input.deploymentType,\n\t\t\tgatewayPort: 18789,\n\t\t\tframeworkVersion: input.openclawVersion,\n\t\t});\n\t\tif (fwConfig) {\n\t\t\tfiles[fwConfig.path] = fwConfig.content;\n\t\t}\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\tprimaryFramework: input.primaryFramework,\n\t});\n\n\t// Scripts\n\tconst hasGitServices = resolvedForCompose.services.some((s) => s.definition.gitSource);\n\tconst scripts = generateScripts({ hasGitServices });\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Clone scripts for git-based services (SaaS boilerplates)\n\tconst cloneScripts = generateCloneScripts(resolvedForCompose);\n\tfor (const [path, content] of Object.entries(cloneScripts)) {\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\tconst fileCount = Object.keys(files).length;\n\n\tlogger?.log({\n\t\tlevel: \"info\",\n\t\tcategory: \"generation\",\n\t\tmessage: `Stack generation complete: ${fileCount} files, ${resolved.services.length} services`,\n\t\toutcome: \"success\",\n\t\tcontext: {\n\t\t\tfileCount,\n\t\t\tserviceCount: resolved.services.length,\n\t\t\tskillCount,\n\t\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\n\t\t},\n\t\tfilesAffected: { created: Object.keys(files) },\n\t});\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,11 +1,14 @@
1
- import { GenerationInput, GenerationResult, ResolverOutput } from "./types.cjs";
1
+ import { B as ResolverOutput, S as GenerationResult, b as GenerationInput } from "./types-Bsn0XzSP.cjs";
2
+ import { t as OperationsLogger } from "./logger-DDfwai-A.cjs";
2
3
 
3
4
  //#region src/generate.d.ts
4
5
  /**
5
6
  * Main orchestration function: takes generation input, resolves dependencies,
6
7
  * generates all files, validates, and returns the complete file tree.
7
8
  */
8
- declare function generate(rawInput: GenerationInput): GenerationResult;
9
+ declare function generate(rawInput: GenerationInput, options?: {
10
+ logger?: OperationsLogger;
11
+ }): GenerationResult;
9
12
  declare function generateServicesDoc(resolved: ResolverOutput): string;
10
13
  //#endregion
11
14
  export { generate, generateServicesDoc };
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.cts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;AA+CA;;iBAAgB,QAAA,CAAS,QAAA,EAAU,eAAA,GAAkB,gBAAA;AAAA,iBAqRrC,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
1
+ {"version":3,"file":"generate.d.cts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;;AAgDA;;iBAAgB,QAAA,CACf,QAAA,EAAU,eAAA,EACV,OAAA;EAAY,MAAA,GAAS,gBAAA;AAAA,IACnB,gBAAA;AAAA,iBAsUa,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
@@ -1,11 +1,14 @@
1
- import { GenerationInput, GenerationResult, ResolverOutput } from "./types.mjs";
1
+ import { B as ResolverOutput, S as GenerationResult, b as GenerationInput } from "./types-DwTKyCZ9.mjs";
2
+ import { t as OperationsLogger } from "./logger-CZ0Qnyiu.mjs";
2
3
 
3
4
  //#region src/generate.d.ts
4
5
  /**
5
6
  * Main orchestration function: takes generation input, resolves dependencies,
6
7
  * generates all files, validates, and returns the complete file tree.
7
8
  */
8
- declare function generate(rawInput: GenerationInput): GenerationResult;
9
+ declare function generate(rawInput: GenerationInput, options?: {
10
+ logger?: OperationsLogger;
11
+ }): GenerationResult;
9
12
  declare function generateServicesDoc(resolved: ResolverOutput): string;
10
13
  //#endregion
11
14
  export { generate, generateServicesDoc };
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.mts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;;AA+CA;iBAAgB,QAAA,CAAS,QAAA,EAAU,eAAA,GAAkB,gBAAA;AAAA,iBAqRrC,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
1
+ {"version":3,"file":"generate.d.mts","names":[],"sources":["../src/generate.ts"],"mappings":";;;;;;;AAgDA;iBAAgB,QAAA,CACf,QAAA,EAAU,eAAA,EACV,OAAA;EAAY,MAAA,GAAS,gBAAA;AAAA,IACnB,gBAAA;AAAA,iBAsUa,mBAAA,CAAoB,QAAA,EAAD,cAAA"}
package/dist/generate.mjs CHANGED
@@ -1,3 +1,5 @@
1
+ import { getFrameworkById } from "./frameworks/registry.mjs";
2
+ import "./frameworks/index.mjs";
1
3
  import { generatePostgresInit } from "./generators/postgres-init.mjs";
2
4
  import { composeMultiFile } from "./composer.mjs";
3
5
  import { generateSkillFiles } from "./generators/skills.mjs";
@@ -15,7 +17,6 @@ import { generateHealthCheck } from "./generators/health-check.mjs";
15
17
  import { generateN8nWorkflows } from "./generators/n8n-workflows.mjs";
16
18
  import { generateNativeInstallScripts } from "./generators/native-services.mjs";
17
19
  import { generateOpenclawInstallScript } from "./generators/openclaw-install-script.mjs";
18
- import { generateOpenClawConfig } from "./generators/openclaw-json.mjs";
19
20
  import { generatePrometheusConfig } from "./generators/prometheus.mjs";
20
21
  import { generateReadme } from "./generators/readme.mjs";
21
22
  import { generateScripts } from "./generators/scripts.mjs";
@@ -33,19 +34,40 @@ function getComposePlatform(platform) {
33
34
  * Main orchestration function: takes generation input, resolves dependencies,
34
35
  * generates all files, validates, and returns the complete file tree.
35
36
  */
36
- function generate(rawInput) {
37
+ function generate(rawInput, options) {
38
+ const logger = options?.logger;
37
39
  const input = migrateConfig(rawInput);
38
40
  const composePlatform = getComposePlatform(input.platform);
39
- const resolved = resolve({
41
+ logger?.info("generation", "Starting stack generation", {
42
+ projectName: input.projectName,
43
+ services: input.services,
44
+ platform: input.platform,
45
+ proxy: input.proxy,
46
+ deploymentType: input.deploymentType
47
+ });
48
+ const resolverInput = {
40
49
  services: input.services,
41
50
  skillPacks: input.skillPacks,
42
51
  aiProviders: input.aiProviders,
52
+ primaryFramework: input.primaryFramework,
43
53
  proxy: input.proxy,
44
54
  gpu: input.gpu,
45
55
  platform: composePlatform,
46
56
  monitoring: input.monitoring
57
+ };
58
+ logger?.debug("resolution", "Resolving dependencies");
59
+ const resolved = resolve(resolverInput);
60
+ if (!resolved.isValid) {
61
+ const errMsg = `Invalid stack configuration: ${resolved.errors.map((e) => e.message).join("; ")}`;
62
+ logger?.error("resolution", errMsg);
63
+ throw new StackConfigError(errMsg);
64
+ }
65
+ logger?.info("resolution", `Resolved ${resolved.services.length} services`, {
66
+ serviceCount: resolved.services.length,
67
+ addedDeps: resolved.addedDependencies.length,
68
+ warnings: resolved.warnings.length,
69
+ estimatedMemoryMB: resolved.estimatedMemoryMB
47
70
  });
48
- if (!resolved.isValid) throw new StackConfigError(`Invalid stack configuration: ${resolved.errors.map((e) => e.message).join("; ")}`);
49
71
  const isBareMetal = input.deploymentType === "bare-metal";
50
72
  let resolvedForCompose = resolved;
51
73
  let nativeIds = /* @__PURE__ */ new Set();
@@ -58,10 +80,13 @@ function generate(rawInput) {
58
80
  nativeIds = partition.nativeIds;
59
81
  if (nativeServices.length > 0) resolvedForCompose = resolvedWithOnlyServices(resolved, dockerOnlyServices);
60
82
  }
83
+ logger?.debug("generation", "Generating Docker Compose YAML");
61
84
  let traefikOutput;
62
85
  if (input.proxy === "traefik" && input.domain) traefikOutput = generateTraefikConfig(resolvedForCompose, input.domain);
63
86
  const composeOptions = {
64
87
  projectName: input.projectName,
88
+ primaryFramework: input.primaryFramework,
89
+ companionFrameworks: input.companionFrameworks,
65
90
  proxy: input.proxy,
66
91
  proxyHttpPort: input.proxyHttpPort,
67
92
  proxyHttpsPort: input.proxyHttpsPort,
@@ -78,11 +103,17 @@ function generate(rawInput) {
78
103
  openclawInstallMethod: input.openclawInstallMethod ?? "docker"
79
104
  };
80
105
  const composeResult = composeMultiFile(resolvedForCompose, composeOptions);
106
+ logger?.info("generation", `Generated ${Object.keys(composeResult.files).length} compose files`);
81
107
  const validation = validate(resolvedForCompose, composeResult.files["docker-compose.yml"] ?? "", {
82
108
  domain: input.domain,
83
109
  generateSecrets: input.generateSecrets
84
110
  });
85
- if (!validation.valid) throw new ValidationError(`Validation failed: ${validation.errors.map((e) => e.message).join("; ")}`);
111
+ if (!validation.valid) {
112
+ const errMsg = `Validation failed: ${validation.errors.map((e) => e.message).join("; ")}`;
113
+ logger?.error("validation", errMsg);
114
+ throw new ValidationError(errMsg);
115
+ }
116
+ logger?.debug("validation", "Stack validation passed");
86
117
  const files = {};
87
118
  for (const [filename, content] of Object.entries(composeResult.files)) files[filename] = content;
88
119
  const envFiles = generateEnvFiles(resolved, {
@@ -92,7 +123,8 @@ function generate(rawInput) {
92
123
  nativeServiceIds: isBareMetal ? nativeIds : void 0,
93
124
  composeFiles: Object.keys(composeResult.files),
94
125
  composeProfiles: composeResult.profiles,
95
- openclawImage: input.openclawImage
126
+ openclawImage: input.openclawImage,
127
+ primaryFramework: input.primaryFramework
96
128
  });
97
129
  files[".env.example"] = envFiles.envExample;
98
130
  files[".env"] = envFiles.env;
@@ -108,18 +140,23 @@ function generate(rawInput) {
108
140
  for (const [path, content] of Object.entries(manifestFiles)) files[path] = content;
109
141
  const skillFiles = generateSkillFiles(resolved);
110
142
  for (const [path, content] of Object.entries(skillFiles)) files[path] = content;
111
- files["openclaw/config/openclaw.json"] = generateOpenClawConfig(resolved, {
112
- deploymentType: input.deploymentType,
113
- gatewayPort: 18789,
114
- openclawVersion: input.openclawVersion
115
- });
143
+ const framework = getFrameworkById(input.primaryFramework ?? "openclaw");
144
+ if (framework) {
145
+ const fwConfig = framework.generateConfig(resolved, {
146
+ deploymentType: input.deploymentType,
147
+ gatewayPort: 18789,
148
+ frameworkVersion: input.openclawVersion
149
+ });
150
+ if (fwConfig) files[fwConfig.path] = fwConfig.content;
151
+ }
116
152
  files["README.md"] = generateReadme(resolved, {
117
153
  projectName: input.projectName,
118
154
  domain: input.domain,
119
155
  proxy: input.proxy,
120
156
  deploymentType: input.deploymentType,
121
157
  hasNativeServices: isBareMetal && nativeServices.length > 0,
122
- openclawInstallMethod: input.openclawInstallMethod
158
+ openclawInstallMethod: input.openclawInstallMethod,
159
+ primaryFramework: input.primaryFramework
123
160
  });
124
161
  const scripts = generateScripts({ hasGitServices: resolvedForCompose.services.some((s) => s.definition.gitSource) });
125
162
  for (const [path, content] of Object.entries(scripts)) files[path] = content;
@@ -184,6 +221,20 @@ function generate(rawInput) {
184
221
  gatewayPort: 18789
185
222
  });
186
223
  const skillCount = resolved.services.reduce((sum, s) => sum + s.definition.skills.length, 0);
224
+ const fileCount = Object.keys(files).length;
225
+ logger?.log({
226
+ level: "info",
227
+ category: "generation",
228
+ message: `Stack generation complete: ${fileCount} files, ${resolved.services.length} services`,
229
+ outcome: "success",
230
+ context: {
231
+ fileCount,
232
+ serviceCount: resolved.services.length,
233
+ skillCount,
234
+ estimatedMemoryMB: resolved.estimatedMemoryMB
235
+ },
236
+ filesAffected: { created: Object.keys(files) }
237
+ });
187
238
  return {
188
239
  files,
189
240
  metadata: {
@@ -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 { generateCloneScripts } from \"./generators/clone-repos.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\t\"repos/\",\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 hasGitServices = resolvedForCompose.services.some((s) => s.definition.gitSource);\n\tconst scripts = generateScripts({ hasGitServices });\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Clone scripts for git-based services (SaaS boilerplates)\n\tconst cloneScripts = generateCloneScripts(resolvedForCompose);\n\tfor (const [path, content] of Object.entries(cloneScripts)) {\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
+ {"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 { getFrameworkById } from \"./frameworks/index.js\";\nimport { generateBareMetalInstall } from \"./generators/bare-metal-install.js\";\nimport { generateCaddyfile } from \"./generators/caddy.js\";\nimport { generateCloneScripts } from \"./generators/clone-repos.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 { 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 type { OperationsLogger } from \"./logger/logger.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(\n\trawInput: GenerationInput,\n\toptions?: { logger?: OperationsLogger },\n): GenerationResult {\n\tconst logger = options?.logger;\n\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\tlogger?.info(\"generation\", \"Starting stack generation\", {\n\t\tprojectName: input.projectName,\n\t\tservices: input.services,\n\t\tplatform: input.platform,\n\t\tproxy: input.proxy,\n\t\tdeploymentType: input.deploymentType,\n\t});\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\tprimaryFramework: input.primaryFramework,\n\t\tproxy: input.proxy,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tmonitoring: input.monitoring,\n\t};\n\tlogger?.debug(\"resolution\", \"Resolving dependencies\");\n\tconst resolved = resolve(resolverInput);\n\n\tif (!resolved.isValid) {\n\t\tconst errMsg = `Invalid stack configuration: ${resolved.errors.map((e) => e.message).join(\"; \")}`;\n\t\tlogger?.error(\"resolution\", errMsg);\n\t\tthrow new StackConfigError(errMsg);\n\t}\n\n\tlogger?.info(\"resolution\", `Resolved ${resolved.services.length} services`, {\n\t\tserviceCount: resolved.services.length,\n\t\taddedDeps: resolved.addedDependencies.length,\n\t\twarnings: resolved.warnings.length,\n\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\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\tlogger?.debug(\"generation\", \"Generating Docker Compose YAML\");\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\tprimaryFramework: input.primaryFramework,\n\t\tcompanionFrameworks: input.companionFrameworks,\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\tlogger?.info(\"generation\", `Generated ${Object.keys(composeResult.files).length} compose files`);\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\tconst errMsg = `Validation failed: ${validation.errors.map((e) => e.message).join(\"; \")}`;\n\t\tlogger?.error(\"validation\", errMsg);\n\t\tthrow new ValidationError(errMsg);\n\t}\n\tlogger?.debug(\"validation\", \"Stack validation passed\");\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\tprimaryFramework: input.primaryFramework,\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\t\"repos/\",\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// Framework-specific configuration\n\tconst framework = getFrameworkById(input.primaryFramework ?? \"openclaw\");\n\tif (framework) {\n\t\tconst fwConfig = framework.generateConfig(resolved, {\n\t\t\tdeploymentType: input.deploymentType,\n\t\t\tgatewayPort: 18789,\n\t\t\tframeworkVersion: input.openclawVersion,\n\t\t});\n\t\tif (fwConfig) {\n\t\t\tfiles[fwConfig.path] = fwConfig.content;\n\t\t}\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\tprimaryFramework: input.primaryFramework,\n\t});\n\n\t// Scripts\n\tconst hasGitServices = resolvedForCompose.services.some((s) => s.definition.gitSource);\n\tconst scripts = generateScripts({ hasGitServices });\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// Clone scripts for git-based services (SaaS boilerplates)\n\tconst cloneScripts = generateCloneScripts(resolvedForCompose);\n\tfor (const [path, content] of Object.entries(cloneScripts)) {\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\tconst fileCount = Object.keys(files).length;\n\n\tlogger?.log({\n\t\tlevel: \"info\",\n\t\tcategory: \"generation\",\n\t\tmessage: `Stack generation complete: ${fileCount} files, ${resolved.services.length} services`,\n\t\toutcome: \"success\",\n\t\tcontext: {\n\t\t\tfileCount,\n\t\t\tserviceCount: resolved.services.length,\n\t\t\tskillCount,\n\t\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\n\t\t},\n\t\tfilesAffected: { created: Object.keys(files) },\n\t});\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,5 +1,5 @@
1
- require("./skills-BSF7iNa4.cjs");
2
- const require_test_CTcmp4Su = require("./test.CTcmp4Su-DlzTarwH.cjs");
1
+ require("./skills-uPxJVmKk.cjs");
2
+ const require_test_CTcmp4Su = require("./test.CTcmp4Su-BWSPM8ZQ.cjs");
3
3
  const require_generate = require("./generate.cjs");
4
4
  let yaml = require("yaml");
5
5
  //#region src/generate.test.ts
@@ -102,7 +102,7 @@ require_test_CTcmp4Su.describe("generate (end-to-end)", () => {
102
102
  openclawVersion: "latest"
103
103
  });
104
104
  require_test_CTcmp4Su.globalExpect(result.files).toHaveProperty("caddy/Caddyfile");
105
- require_test_CTcmp4Su.globalExpect(result.files["caddy/Caddyfile"].length).toBeGreaterThan(0);
105
+ require_test_CTcmp4Su.globalExpect(result.files["caddy/Caddyfile"]?.length).toBeGreaterThan(0);
106
106
  });
107
107
  require_test_CTcmp4Su.it("generates prometheus config when monitoring enabled", () => {
108
108
  const result = require_generate.generate({
@@ -239,9 +239,45 @@ require_test_CTcmp4Su.describe("generate (end-to-end)", () => {
239
239
  "scripts/status.sh"
240
240
  ]) {
241
241
  require_test_CTcmp4Su.globalExpect(result.files).toHaveProperty(script);
242
- require_test_CTcmp4Su.globalExpect(result.files[script].length).toBeGreaterThan(0);
242
+ require_test_CTcmp4Su.globalExpect(result.files[script]?.length).toBeGreaterThan(0);
243
243
  }
244
244
  });
245
+ require_test_CTcmp4Su.it("generates a stack with zeroclaw as primary framework", () => {
246
+ const composed = (0, yaml.parse)(require_generate.generate({
247
+ projectName: "zeroclaw-stack",
248
+ services: ["redis"],
249
+ skillPacks: [],
250
+ proxy: "none",
251
+ gpu: false,
252
+ platform: "linux/amd64",
253
+ deployment: "local",
254
+ generateSecrets: true,
255
+ openclawVersion: "latest",
256
+ primaryFramework: "zeroclaw"
257
+ }).files["docker-compose.yml"]);
258
+ require_test_CTcmp4Su.globalExpect(composed.services).toHaveProperty("zeroclaw-gateway");
259
+ require_test_CTcmp4Su.globalExpect(composed.services).not.toHaveProperty("openclaw-gateway");
260
+ require_test_CTcmp4Su.globalExpect(composed.services).not.toHaveProperty("convex");
261
+ require_test_CTcmp4Su.globalExpect(composed.services).not.toHaveProperty("mission-control");
262
+ require_test_CTcmp4Su.globalExpect(composed.services).not.toHaveProperty("tailscale");
263
+ require_test_CTcmp4Su.globalExpect(composed.networks).toHaveProperty("zeroclaw-network");
264
+ });
265
+ require_test_CTcmp4Su.it("generates a stack with companion frameworks", () => {
266
+ const composed = (0, yaml.parse)(require_generate.generate({
267
+ projectName: "multi-fw-stack",
268
+ services: ["redis"],
269
+ skillPacks: [],
270
+ proxy: "none",
271
+ gpu: false,
272
+ platform: "linux/amd64",
273
+ deployment: "local",
274
+ generateSecrets: true,
275
+ openclawVersion: "latest",
276
+ companionFrameworks: ["claude-code"]
277
+ }).files["docker-compose.yml"]);
278
+ require_test_CTcmp4Su.globalExpect(composed.services).toHaveProperty("openclaw-gateway");
279
+ require_test_CTcmp4Su.globalExpect(composed.services).toHaveProperty("claude-code-companion");
280
+ });
245
281
  require_test_CTcmp4Su.it("all generated .env.example vars have comments", () => {
246
282
  const lines = require_generate.generate({
247
283
  projectName: "env-comments-stack",
@@ -259,12 +295,12 @@ require_test_CTcmp4Su.describe("generate (end-to-end)", () => {
259
295
  openclawVersion: "latest"
260
296
  }).files[".env.example"].split("\n");
261
297
  for (let i = 0; i < lines.length; i++) {
262
- const line = lines[i].trim();
298
+ const line = lines[i]?.trim();
263
299
  if (line === "" || line.startsWith("#")) continue;
264
300
  if (line.includes("=")) {
265
301
  let foundComment = false;
266
302
  for (let j = i - 1; j >= 0; j--) {
267
- const prev = lines[j].trim();
303
+ const prev = lines[j]?.trim();
268
304
  if (prev === "") continue;
269
305
  if (prev.startsWith("#")) {
270
306
  foundComment = true;