@better-openclaw/core 1.0.22 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/dist/composer.cjs +27 -13
  2. package/dist/composer.cjs.map +1 -1
  3. package/dist/composer.d.cts.map +1 -1
  4. package/dist/composer.d.mts.map +1 -1
  5. package/dist/composer.mjs +27 -13
  6. package/dist/composer.mjs.map +1 -1
  7. package/dist/generate.cjs +1 -0
  8. package/dist/generate.cjs.map +1 -1
  9. package/dist/generate.d.cts.map +1 -1
  10. package/dist/generate.d.mts.map +1 -1
  11. package/dist/generate.mjs +1 -0
  12. package/dist/generate.mjs.map +1 -1
  13. package/dist/generators/env.cjs +146 -0
  14. package/dist/generators/env.cjs.map +1 -1
  15. package/dist/generators/env.d.cts.map +1 -1
  16. package/dist/generators/env.d.mts.map +1 -1
  17. package/dist/generators/env.mjs +146 -0
  18. package/dist/generators/env.mjs.map +1 -1
  19. package/dist/generators/openclaw-json.cjs +102 -7
  20. package/dist/generators/openclaw-json.cjs.map +1 -1
  21. package/dist/generators/openclaw-json.mjs +102 -7
  22. package/dist/generators/openclaw-json.mjs.map +1 -1
  23. package/dist/generators/readme.cjs +2 -1
  24. package/dist/generators/readme.cjs.map +1 -1
  25. package/dist/generators/readme.mjs +2 -1
  26. package/dist/generators/readme.mjs.map +1 -1
  27. package/dist/index.d.cts +1 -1
  28. package/dist/index.d.mts +1 -1
  29. package/dist/presets/registry.cjs +19 -0
  30. package/dist/presets/registry.cjs.map +1 -1
  31. package/dist/presets/registry.d.cts.map +1 -1
  32. package/dist/presets/registry.d.mts.map +1 -1
  33. package/dist/presets/registry.mjs +19 -0
  34. package/dist/presets/registry.mjs.map +1 -1
  35. package/dist/{schema-C_hc7e4k.d.cts → schema-B4c64P8N.d.cts} +17 -1
  36. package/dist/schema-B4c64P8N.d.cts.map +1 -0
  37. package/dist/{schema-CaesJaS2.d.mts → schema-CXNhYci1.d.mts} +17 -1
  38. package/dist/schema-CXNhYci1.d.mts.map +1 -0
  39. package/dist/schema.cjs +5 -1
  40. package/dist/schema.cjs.map +1 -1
  41. package/dist/schema.d.cts +1 -1
  42. package/dist/schema.d.mts +1 -1
  43. package/dist/schema.mjs +5 -1
  44. package/dist/schema.mjs.map +1 -1
  45. package/dist/services/definitions/adguard-home.cjs +74 -0
  46. package/dist/services/definitions/adguard-home.cjs.map +1 -0
  47. package/dist/services/definitions/adguard-home.d.cts +7 -0
  48. package/dist/services/definitions/adguard-home.d.cts.map +1 -0
  49. package/dist/services/definitions/adguard-home.d.mts +7 -0
  50. package/dist/services/definitions/adguard-home.d.mts.map +1 -0
  51. package/dist/services/definitions/adguard-home.mjs +73 -0
  52. package/dist/services/definitions/adguard-home.mjs.map +1 -0
  53. package/dist/services/definitions/audiobookshelf.cjs +81 -0
  54. package/dist/services/definitions/audiobookshelf.cjs.map +1 -0
  55. package/dist/services/definitions/audiobookshelf.d.cts +7 -0
  56. package/dist/services/definitions/audiobookshelf.d.cts.map +1 -0
  57. package/dist/services/definitions/audiobookshelf.d.mts +7 -0
  58. package/dist/services/definitions/audiobookshelf.d.mts.map +1 -0
  59. package/dist/services/definitions/audiobookshelf.mjs +80 -0
  60. package/dist/services/definitions/audiobookshelf.mjs.map +1 -0
  61. package/dist/services/definitions/baserow.cjs +115 -0
  62. package/dist/services/definitions/baserow.cjs.map +1 -0
  63. package/dist/services/definitions/baserow.d.cts +7 -0
  64. package/dist/services/definitions/baserow.d.cts.map +1 -0
  65. package/dist/services/definitions/baserow.d.mts +7 -0
  66. package/dist/services/definitions/baserow.d.mts.map +1 -0
  67. package/dist/services/definitions/baserow.mjs +114 -0
  68. package/dist/services/definitions/baserow.mjs.map +1 -0
  69. package/dist/services/definitions/calibre-web.cjs +91 -0
  70. package/dist/services/definitions/calibre-web.cjs.map +1 -0
  71. package/dist/services/definitions/calibre-web.d.cts +7 -0
  72. package/dist/services/definitions/calibre-web.d.cts.map +1 -0
  73. package/dist/services/definitions/calibre-web.d.mts +7 -0
  74. package/dist/services/definitions/calibre-web.d.mts.map +1 -0
  75. package/dist/services/definitions/calibre-web.mjs +90 -0
  76. package/dist/services/definitions/calibre-web.mjs.map +1 -0
  77. package/dist/services/definitions/clickhouse.cjs +113 -0
  78. package/dist/services/definitions/clickhouse.cjs.map +1 -0
  79. package/dist/services/definitions/clickhouse.d.cts +7 -0
  80. package/dist/services/definitions/clickhouse.d.cts.map +1 -0
  81. package/dist/services/definitions/clickhouse.d.mts +7 -0
  82. package/dist/services/definitions/clickhouse.d.mts.map +1 -0
  83. package/dist/services/definitions/clickhouse.mjs +112 -0
  84. package/dist/services/definitions/clickhouse.mjs.map +1 -0
  85. package/dist/services/definitions/cloudflared.cjs +55 -0
  86. package/dist/services/definitions/cloudflared.cjs.map +1 -0
  87. package/dist/services/definitions/cloudflared.d.cts +7 -0
  88. package/dist/services/definitions/cloudflared.d.cts.map +1 -0
  89. package/dist/services/definitions/cloudflared.d.mts +7 -0
  90. package/dist/services/definitions/cloudflared.d.mts.map +1 -0
  91. package/dist/services/definitions/cloudflared.mjs +54 -0
  92. package/dist/services/definitions/cloudflared.mjs.map +1 -0
  93. package/dist/services/definitions/cockroachdb.cjs +70 -0
  94. package/dist/services/definitions/cockroachdb.cjs.map +1 -0
  95. package/dist/services/definitions/cockroachdb.d.cts +7 -0
  96. package/dist/services/definitions/cockroachdb.d.cts.map +1 -0
  97. package/dist/services/definitions/cockroachdb.d.mts +7 -0
  98. package/dist/services/definitions/cockroachdb.d.mts.map +1 -0
  99. package/dist/services/definitions/cockroachdb.mjs +69 -0
  100. package/dist/services/definitions/cockroachdb.mjs.map +1 -0
  101. package/dist/services/definitions/coder.cjs +64 -0
  102. package/dist/services/definitions/coder.cjs.map +1 -0
  103. package/dist/services/definitions/coder.d.cts +7 -0
  104. package/dist/services/definitions/coder.d.cts.map +1 -0
  105. package/dist/services/definitions/coder.d.mts +7 -0
  106. package/dist/services/definitions/coder.d.mts.map +1 -0
  107. package/dist/services/definitions/coder.mjs +63 -0
  108. package/dist/services/definitions/coder.mjs.map +1 -0
  109. package/dist/services/definitions/dragonfly.cjs +64 -0
  110. package/dist/services/definitions/dragonfly.cjs.map +1 -0
  111. package/dist/services/definitions/dragonfly.d.cts +7 -0
  112. package/dist/services/definitions/dragonfly.d.cts.map +1 -0
  113. package/dist/services/definitions/dragonfly.d.mts +7 -0
  114. package/dist/services/definitions/dragonfly.d.mts.map +1 -0
  115. package/dist/services/definitions/dragonfly.mjs +63 -0
  116. package/dist/services/definitions/dragonfly.mjs.map +1 -0
  117. package/dist/services/definitions/drone-ci.cjs +95 -0
  118. package/dist/services/definitions/drone-ci.cjs.map +1 -0
  119. package/dist/services/definitions/drone-ci.d.cts +7 -0
  120. package/dist/services/definitions/drone-ci.d.cts.map +1 -0
  121. package/dist/services/definitions/drone-ci.d.mts +7 -0
  122. package/dist/services/definitions/drone-ci.d.mts.map +1 -0
  123. package/dist/services/definitions/drone-ci.mjs +94 -0
  124. package/dist/services/definitions/drone-ci.mjs.map +1 -0
  125. package/dist/services/definitions/element-web.cjs +61 -0
  126. package/dist/services/definitions/element-web.cjs.map +1 -0
  127. package/dist/services/definitions/element-web.d.cts +7 -0
  128. package/dist/services/definitions/element-web.d.cts.map +1 -0
  129. package/dist/services/definitions/element-web.d.mts +7 -0
  130. package/dist/services/definitions/element-web.d.mts.map +1 -0
  131. package/dist/services/definitions/element-web.mjs +60 -0
  132. package/dist/services/definitions/element-web.mjs.map +1 -0
  133. package/dist/services/definitions/focalboard.cjs +65 -0
  134. package/dist/services/definitions/focalboard.cjs.map +1 -0
  135. package/dist/services/definitions/focalboard.d.cts +7 -0
  136. package/dist/services/definitions/focalboard.d.cts.map +1 -0
  137. package/dist/services/definitions/focalboard.d.mts +7 -0
  138. package/dist/services/definitions/focalboard.d.mts.map +1 -0
  139. package/dist/services/definitions/focalboard.mjs +64 -0
  140. package/dist/services/definitions/focalboard.mjs.map +1 -0
  141. package/dist/services/definitions/forgejo.cjs +108 -0
  142. package/dist/services/definitions/forgejo.cjs.map +1 -0
  143. package/dist/services/definitions/forgejo.d.cts +7 -0
  144. package/dist/services/definitions/forgejo.d.cts.map +1 -0
  145. package/dist/services/definitions/forgejo.d.mts +7 -0
  146. package/dist/services/definitions/forgejo.d.mts.map +1 -0
  147. package/dist/services/definitions/forgejo.mjs +107 -0
  148. package/dist/services/definitions/forgejo.mjs.map +1 -0
  149. package/dist/services/definitions/graylog.cjs +103 -0
  150. package/dist/services/definitions/graylog.cjs.map +1 -0
  151. package/dist/services/definitions/graylog.d.cts +7 -0
  152. package/dist/services/definitions/graylog.d.cts.map +1 -0
  153. package/dist/services/definitions/graylog.d.mts +7 -0
  154. package/dist/services/definitions/graylog.d.mts.map +1 -0
  155. package/dist/services/definitions/graylog.mjs +102 -0
  156. package/dist/services/definitions/graylog.mjs.map +1 -0
  157. package/dist/services/definitions/index.cjs +139 -1
  158. package/dist/services/definitions/index.cjs.map +1 -1
  159. package/dist/services/definitions/index.d.cts +47 -1
  160. package/dist/services/definitions/index.d.cts.map +1 -1
  161. package/dist/services/definitions/index.d.mts +47 -1
  162. package/dist/services/definitions/index.d.mts.map +1 -1
  163. package/dist/services/definitions/index.mjs +94 -2
  164. package/dist/services/definitions/index.mjs.map +1 -1
  165. package/dist/services/definitions/influxdb.cjs +105 -0
  166. package/dist/services/definitions/influxdb.cjs.map +1 -0
  167. package/dist/services/definitions/influxdb.d.cts +7 -0
  168. package/dist/services/definitions/influxdb.d.cts.map +1 -0
  169. package/dist/services/definitions/influxdb.d.mts +7 -0
  170. package/dist/services/definitions/influxdb.d.mts.map +1 -0
  171. package/dist/services/definitions/influxdb.mjs +104 -0
  172. package/dist/services/definitions/influxdb.mjs.map +1 -0
  173. package/dist/services/definitions/invoke-ai.cjs +70 -0
  174. package/dist/services/definitions/invoke-ai.cjs.map +1 -0
  175. package/dist/services/definitions/invoke-ai.d.cts +7 -0
  176. package/dist/services/definitions/invoke-ai.d.cts.map +1 -0
  177. package/dist/services/definitions/invoke-ai.d.mts +7 -0
  178. package/dist/services/definitions/invoke-ai.d.mts.map +1 -0
  179. package/dist/services/definitions/invoke-ai.mjs +69 -0
  180. package/dist/services/definitions/invoke-ai.mjs.map +1 -0
  181. package/dist/services/definitions/jaeger.cjs +95 -0
  182. package/dist/services/definitions/jaeger.cjs.map +1 -0
  183. package/dist/services/definitions/jaeger.d.cts +7 -0
  184. package/dist/services/definitions/jaeger.d.cts.map +1 -0
  185. package/dist/services/definitions/jaeger.d.mts +7 -0
  186. package/dist/services/definitions/jaeger.d.mts.map +1 -0
  187. package/dist/services/definitions/jaeger.mjs +94 -0
  188. package/dist/services/definitions/jaeger.mjs.map +1 -0
  189. package/dist/services/definitions/jan.cjs +64 -0
  190. package/dist/services/definitions/jan.cjs.map +1 -0
  191. package/dist/services/definitions/jan.d.cts +7 -0
  192. package/dist/services/definitions/jan.d.cts.map +1 -0
  193. package/dist/services/definitions/jan.d.mts +7 -0
  194. package/dist/services/definitions/jan.d.mts.map +1 -0
  195. package/dist/services/definitions/jan.mjs +63 -0
  196. package/dist/services/definitions/jan.mjs.map +1 -0
  197. package/dist/services/definitions/jitsi-meet.cjs +102 -0
  198. package/dist/services/definitions/jitsi-meet.cjs.map +1 -0
  199. package/dist/services/definitions/jitsi-meet.d.cts +7 -0
  200. package/dist/services/definitions/jitsi-meet.d.cts.map +1 -0
  201. package/dist/services/definitions/jitsi-meet.d.mts +7 -0
  202. package/dist/services/definitions/jitsi-meet.d.mts.map +1 -0
  203. package/dist/services/definitions/jitsi-meet.mjs +101 -0
  204. package/dist/services/definitions/jitsi-meet.mjs.map +1 -0
  205. package/dist/services/definitions/local-ai.cjs +86 -0
  206. package/dist/services/definitions/local-ai.cjs.map +1 -0
  207. package/dist/services/definitions/local-ai.d.cts +7 -0
  208. package/dist/services/definitions/local-ai.d.cts.map +1 -0
  209. package/dist/services/definitions/local-ai.d.mts +7 -0
  210. package/dist/services/definitions/local-ai.d.mts.map +1 -0
  211. package/dist/services/definitions/local-ai.mjs +85 -0
  212. package/dist/services/definitions/local-ai.mjs.map +1 -0
  213. package/dist/services/definitions/metabase.cjs +108 -0
  214. package/dist/services/definitions/metabase.cjs.map +1 -0
  215. package/dist/services/definitions/metabase.d.cts +7 -0
  216. package/dist/services/definitions/metabase.d.cts.map +1 -0
  217. package/dist/services/definitions/metabase.d.mts +7 -0
  218. package/dist/services/definitions/metabase.d.mts.map +1 -0
  219. package/dist/services/definitions/metabase.mjs +107 -0
  220. package/dist/services/definitions/metabase.mjs.map +1 -0
  221. package/dist/services/definitions/mosquitto.cjs +82 -0
  222. package/dist/services/definitions/mosquitto.cjs.map +1 -0
  223. package/dist/services/definitions/mosquitto.d.cts +7 -0
  224. package/dist/services/definitions/mosquitto.d.cts.map +1 -0
  225. package/dist/services/definitions/mosquitto.d.mts +7 -0
  226. package/dist/services/definitions/mosquitto.d.mts.map +1 -0
  227. package/dist/services/definitions/mosquitto.mjs +81 -0
  228. package/dist/services/definitions/mosquitto.mjs.map +1 -0
  229. package/dist/services/definitions/navidrome.cjs +90 -0
  230. package/dist/services/definitions/navidrome.cjs.map +1 -0
  231. package/dist/services/definitions/navidrome.d.cts +7 -0
  232. package/dist/services/definitions/navidrome.d.cts.map +1 -0
  233. package/dist/services/definitions/navidrome.d.mts +7 -0
  234. package/dist/services/definitions/navidrome.d.mts.map +1 -0
  235. package/dist/services/definitions/navidrome.mjs +89 -0
  236. package/dist/services/definitions/navidrome.mjs.map +1 -0
  237. package/dist/services/definitions/nginx-proxy-manager.cjs +71 -0
  238. package/dist/services/definitions/nginx-proxy-manager.cjs.map +1 -0
  239. package/dist/services/definitions/nginx-proxy-manager.d.cts +7 -0
  240. package/dist/services/definitions/nginx-proxy-manager.d.cts.map +1 -0
  241. package/dist/services/definitions/nginx-proxy-manager.d.mts +7 -0
  242. package/dist/services/definitions/nginx-proxy-manager.d.mts.map +1 -0
  243. package/dist/services/definitions/nginx-proxy-manager.mjs +70 -0
  244. package/dist/services/definitions/nginx-proxy-manager.mjs.map +1 -0
  245. package/dist/services/definitions/node-red.cjs +77 -0
  246. package/dist/services/definitions/node-red.cjs.map +1 -0
  247. package/dist/services/definitions/node-red.d.cts +7 -0
  248. package/dist/services/definitions/node-red.d.cts.map +1 -0
  249. package/dist/services/definitions/node-red.d.mts +7 -0
  250. package/dist/services/definitions/node-red.d.mts.map +1 -0
  251. package/dist/services/definitions/node-red.mjs +76 -0
  252. package/dist/services/definitions/node-red.mjs.map +1 -0
  253. package/dist/services/definitions/photoprism.cjs +126 -0
  254. package/dist/services/definitions/photoprism.cjs.map +1 -0
  255. package/dist/services/definitions/photoprism.d.cts +7 -0
  256. package/dist/services/definitions/photoprism.d.cts.map +1 -0
  257. package/dist/services/definitions/photoprism.d.mts +7 -0
  258. package/dist/services/definitions/photoprism.d.mts.map +1 -0
  259. package/dist/services/definitions/photoprism.mjs +125 -0
  260. package/dist/services/definitions/photoprism.mjs.map +1 -0
  261. package/dist/services/definitions/pihole.cjs +73 -0
  262. package/dist/services/definitions/pihole.cjs.map +1 -0
  263. package/dist/services/definitions/pihole.d.cts +7 -0
  264. package/dist/services/definitions/pihole.d.cts.map +1 -0
  265. package/dist/services/definitions/pihole.d.mts +7 -0
  266. package/dist/services/definitions/pihole.d.mts.map +1 -0
  267. package/dist/services/definitions/pihole.mjs +72 -0
  268. package/dist/services/definitions/pihole.mjs.map +1 -0
  269. package/dist/services/definitions/piper-tts.cjs +70 -0
  270. package/dist/services/definitions/piper-tts.cjs.map +1 -0
  271. package/dist/services/definitions/piper-tts.d.cts +7 -0
  272. package/dist/services/definitions/piper-tts.d.cts.map +1 -0
  273. package/dist/services/definitions/piper-tts.d.mts +7 -0
  274. package/dist/services/definitions/piper-tts.d.mts.map +1 -0
  275. package/dist/services/definitions/piper-tts.mjs +69 -0
  276. package/dist/services/definitions/piper-tts.mjs.map +1 -0
  277. package/dist/services/definitions/plane.cjs +75 -0
  278. package/dist/services/definitions/plane.cjs.map +1 -0
  279. package/dist/services/definitions/plane.d.cts +7 -0
  280. package/dist/services/definitions/plane.d.cts.map +1 -0
  281. package/dist/services/definitions/plane.d.mts +7 -0
  282. package/dist/services/definitions/plane.d.mts.map +1 -0
  283. package/dist/services/definitions/plane.mjs +74 -0
  284. package/dist/services/definitions/plane.mjs.map +1 -0
  285. package/dist/services/definitions/plausible.cjs +94 -0
  286. package/dist/services/definitions/plausible.cjs.map +1 -0
  287. package/dist/services/definitions/plausible.d.cts +7 -0
  288. package/dist/services/definitions/plausible.d.cts.map +1 -0
  289. package/dist/services/definitions/plausible.d.mts +7 -0
  290. package/dist/services/definitions/plausible.d.mts.map +1 -0
  291. package/dist/services/definitions/plausible.mjs +93 -0
  292. package/dist/services/definitions/plausible.mjs.map +1 -0
  293. package/dist/services/definitions/pocket-id.cjs +101 -0
  294. package/dist/services/definitions/pocket-id.cjs.map +1 -0
  295. package/dist/services/definitions/pocket-id.d.cts +7 -0
  296. package/dist/services/definitions/pocket-id.d.cts.map +1 -0
  297. package/dist/services/definitions/pocket-id.d.mts +7 -0
  298. package/dist/services/definitions/pocket-id.d.mts.map +1 -0
  299. package/dist/services/definitions/pocket-id.mjs +100 -0
  300. package/dist/services/definitions/pocket-id.mjs.map +1 -0
  301. package/dist/services/definitions/posthog.cjs +94 -0
  302. package/dist/services/definitions/posthog.cjs.map +1 -0
  303. package/dist/services/definitions/posthog.d.cts +7 -0
  304. package/dist/services/definitions/posthog.d.cts.map +1 -0
  305. package/dist/services/definitions/posthog.d.mts +7 -0
  306. package/dist/services/definitions/posthog.d.mts.map +1 -0
  307. package/dist/services/definitions/posthog.mjs +93 -0
  308. package/dist/services/definitions/posthog.mjs.map +1 -0
  309. package/dist/services/definitions/redis.cjs +1 -1
  310. package/dist/services/definitions/redis.cjs.map +1 -1
  311. package/dist/services/definitions/redis.mjs +1 -1
  312. package/dist/services/definitions/redis.mjs.map +1 -1
  313. package/dist/services/definitions/revolt.cjs +64 -0
  314. package/dist/services/definitions/revolt.cjs.map +1 -0
  315. package/dist/services/definitions/revolt.d.cts +7 -0
  316. package/dist/services/definitions/revolt.d.cts.map +1 -0
  317. package/dist/services/definitions/revolt.d.mts +7 -0
  318. package/dist/services/definitions/revolt.d.mts.map +1 -0
  319. package/dist/services/definitions/revolt.mjs +63 -0
  320. package/dist/services/definitions/revolt.mjs.map +1 -0
  321. package/dist/services/definitions/sentry.cjs +101 -0
  322. package/dist/services/definitions/sentry.cjs.map +1 -0
  323. package/dist/services/definitions/sentry.d.cts +7 -0
  324. package/dist/services/definitions/sentry.d.cts.map +1 -0
  325. package/dist/services/definitions/sentry.d.mts +7 -0
  326. package/dist/services/definitions/sentry.d.mts.map +1 -0
  327. package/dist/services/definitions/sentry.mjs +100 -0
  328. package/dist/services/definitions/sentry.mjs.map +1 -0
  329. package/dist/services/definitions/sonarqube.cjs +86 -0
  330. package/dist/services/definitions/sonarqube.cjs.map +1 -0
  331. package/dist/services/definitions/sonarqube.d.cts +7 -0
  332. package/dist/services/definitions/sonarqube.d.cts.map +1 -0
  333. package/dist/services/definitions/sonarqube.d.mts +7 -0
  334. package/dist/services/definitions/sonarqube.d.mts.map +1 -0
  335. package/dist/services/definitions/sonarqube.mjs +85 -0
  336. package/dist/services/definitions/sonarqube.mjs.map +1 -0
  337. package/dist/services/definitions/superset.cjs +77 -0
  338. package/dist/services/definitions/superset.cjs.map +1 -0
  339. package/dist/services/definitions/superset.d.cts +7 -0
  340. package/dist/services/definitions/superset.d.cts.map +1 -0
  341. package/dist/services/definitions/superset.d.mts +7 -0
  342. package/dist/services/definitions/superset.d.mts.map +1 -0
  343. package/dist/services/definitions/superset.mjs +76 -0
  344. package/dist/services/definitions/superset.mjs.map +1 -0
  345. package/dist/services/definitions/surrealdb.cjs +72 -0
  346. package/dist/services/definitions/surrealdb.cjs.map +1 -0
  347. package/dist/services/definitions/surrealdb.d.cts +7 -0
  348. package/dist/services/definitions/surrealdb.d.cts.map +1 -0
  349. package/dist/services/definitions/surrealdb.d.mts +7 -0
  350. package/dist/services/definitions/surrealdb.d.mts.map +1 -0
  351. package/dist/services/definitions/surrealdb.mjs +71 -0
  352. package/dist/services/definitions/surrealdb.mjs.map +1 -0
  353. package/dist/services/definitions/tabby-ml.cjs +70 -0
  354. package/dist/services/definitions/tabby-ml.cjs.map +1 -0
  355. package/dist/services/definitions/tabby-ml.d.cts +7 -0
  356. package/dist/services/definitions/tabby-ml.d.cts.map +1 -0
  357. package/dist/services/definitions/tabby-ml.d.mts +7 -0
  358. package/dist/services/definitions/tabby-ml.d.mts.map +1 -0
  359. package/dist/services/definitions/tabby-ml.mjs +69 -0
  360. package/dist/services/definitions/tabby-ml.mjs.map +1 -0
  361. package/dist/services/definitions/tempo.cjs +57 -0
  362. package/dist/services/definitions/tempo.cjs.map +1 -0
  363. package/dist/services/definitions/tempo.d.cts +7 -0
  364. package/dist/services/definitions/tempo.d.cts.map +1 -0
  365. package/dist/services/definitions/tempo.d.mts +7 -0
  366. package/dist/services/definitions/tempo.d.mts.map +1 -0
  367. package/dist/services/definitions/tempo.mjs +56 -0
  368. package/dist/services/definitions/tempo.mjs.map +1 -0
  369. package/dist/services/definitions/text-gen-webui.cjs +88 -0
  370. package/dist/services/definitions/text-gen-webui.cjs.map +1 -0
  371. package/dist/services/definitions/text-gen-webui.d.cts +7 -0
  372. package/dist/services/definitions/text-gen-webui.d.cts.map +1 -0
  373. package/dist/services/definitions/text-gen-webui.d.mts +7 -0
  374. package/dist/services/definitions/text-gen-webui.d.mts.map +1 -0
  375. package/dist/services/definitions/text-gen-webui.mjs +87 -0
  376. package/dist/services/definitions/text-gen-webui.mjs.map +1 -0
  377. package/dist/services/definitions/timescaledb.cjs +87 -0
  378. package/dist/services/definitions/timescaledb.cjs.map +1 -0
  379. package/dist/services/definitions/timescaledb.d.cts +7 -0
  380. package/dist/services/definitions/timescaledb.d.cts.map +1 -0
  381. package/dist/services/definitions/timescaledb.d.mts +7 -0
  382. package/dist/services/definitions/timescaledb.d.mts.map +1 -0
  383. package/dist/services/definitions/timescaledb.mjs +86 -0
  384. package/dist/services/definitions/timescaledb.mjs.map +1 -0
  385. package/dist/services/definitions/valkey.cjs +1 -1
  386. package/dist/services/definitions/valkey.cjs.map +1 -1
  387. package/dist/services/definitions/valkey.mjs +1 -1
  388. package/dist/services/definitions/valkey.mjs.map +1 -1
  389. package/dist/services/definitions/vector-log.cjs +59 -0
  390. package/dist/services/definitions/vector-log.cjs.map +1 -0
  391. package/dist/services/definitions/vector-log.d.cts +7 -0
  392. package/dist/services/definitions/vector-log.d.cts.map +1 -0
  393. package/dist/services/definitions/vector-log.d.mts +7 -0
  394. package/dist/services/definitions/vector-log.d.mts.map +1 -0
  395. package/dist/services/definitions/vector-log.mjs +58 -0
  396. package/dist/services/definitions/vector-log.mjs.map +1 -0
  397. package/dist/services/definitions/vikunja.cjs +96 -0
  398. package/dist/services/definitions/vikunja.cjs.map +1 -0
  399. package/dist/services/definitions/vikunja.d.cts +7 -0
  400. package/dist/services/definitions/vikunja.d.cts.map +1 -0
  401. package/dist/services/definitions/vikunja.d.mts +7 -0
  402. package/dist/services/definitions/vikunja.d.mts.map +1 -0
  403. package/dist/services/definitions/vikunja.mjs +95 -0
  404. package/dist/services/definitions/vikunja.mjs.map +1 -0
  405. package/dist/services/definitions/wireguard.cjs +88 -0
  406. package/dist/services/definitions/wireguard.cjs.map +1 -0
  407. package/dist/services/definitions/wireguard.d.cts +7 -0
  408. package/dist/services/definitions/wireguard.d.cts.map +1 -0
  409. package/dist/services/definitions/wireguard.d.mts +7 -0
  410. package/dist/services/definitions/wireguard.d.mts.map +1 -0
  411. package/dist/services/definitions/wireguard.mjs +87 -0
  412. package/dist/services/definitions/wireguard.mjs.map +1 -0
  413. package/dist/services/definitions/woodpecker-ci.cjs +93 -0
  414. package/dist/services/definitions/woodpecker-ci.cjs.map +1 -0
  415. package/dist/services/definitions/woodpecker-ci.d.cts +7 -0
  416. package/dist/services/definitions/woodpecker-ci.d.cts.map +1 -0
  417. package/dist/services/definitions/woodpecker-ci.d.mts +7 -0
  418. package/dist/services/definitions/woodpecker-ci.d.mts.map +1 -0
  419. package/dist/services/definitions/woodpecker-ci.mjs +92 -0
  420. package/dist/services/definitions/woodpecker-ci.mjs.map +1 -0
  421. package/dist/services/definitions/zulip.cjs +116 -0
  422. package/dist/services/definitions/zulip.cjs.map +1 -0
  423. package/dist/services/definitions/zulip.d.cts +7 -0
  424. package/dist/services/definitions/zulip.d.cts.map +1 -0
  425. package/dist/services/definitions/zulip.d.mts +7 -0
  426. package/dist/services/definitions/zulip.d.mts.map +1 -0
  427. package/dist/services/definitions/zulip.mjs +115 -0
  428. package/dist/services/definitions/zulip.mjs.map +1 -0
  429. package/dist/types.cjs +28 -0
  430. package/dist/types.cjs.map +1 -1
  431. package/dist/types.d.cts +2 -1
  432. package/dist/types.d.cts.map +1 -1
  433. package/dist/types.d.mts +2 -1
  434. package/dist/types.d.mts.map +1 -1
  435. package/dist/types.mjs +28 -0
  436. package/dist/types.mjs.map +1 -1
  437. package/package.json +1 -1
  438. package/src/__snapshots__/composer.snapshot.test.ts.snap +130 -65
  439. package/src/composer.ts +25 -15
  440. package/src/generate.ts +1 -0
  441. package/src/generators/env.ts +214 -0
  442. package/src/generators/openclaw-json.ts +156 -1
  443. package/src/generators/readme.ts +2 -1
  444. package/src/presets/registry.ts +329 -221
  445. package/src/schema.ts +4 -0
  446. package/src/services/definitions/adguard-home.ts +79 -0
  447. package/src/services/definitions/audiobookshelf.ts +83 -0
  448. package/src/services/definitions/baserow.ts +118 -0
  449. package/src/services/definitions/calibre-web.ts +95 -0
  450. package/src/services/definitions/clickhouse.ts +115 -0
  451. package/src/services/definitions/cloudflared.ts +55 -0
  452. package/src/services/definitions/cockroachdb.ts +75 -0
  453. package/src/services/definitions/coder.ts +68 -0
  454. package/src/services/definitions/dragonfly.ts +68 -0
  455. package/src/services/definitions/drone-ci.ts +96 -0
  456. package/src/services/definitions/element-web.ts +62 -0
  457. package/src/services/definitions/focalboard.ts +69 -0
  458. package/src/services/definitions/forgejo.ts +109 -0
  459. package/src/services/definitions/graylog.ts +101 -0
  460. package/src/services/definitions/index.ts +139 -0
  461. package/src/services/definitions/influxdb.ts +109 -0
  462. package/src/services/definitions/invoke-ai.ts +76 -0
  463. package/src/services/definitions/jaeger.ts +94 -0
  464. package/src/services/definitions/jan.ts +68 -0
  465. package/src/services/definitions/jitsi-meet.ts +108 -0
  466. package/src/services/definitions/local-ai.ts +90 -0
  467. package/src/services/definitions/metabase.ts +111 -0
  468. package/src/services/definitions/mosquitto.ts +84 -0
  469. package/src/services/definitions/navidrome.ts +95 -0
  470. package/src/services/definitions/nginx-proxy-manager.ts +70 -0
  471. package/src/services/definitions/node-red.ts +83 -0
  472. package/src/services/definitions/photoprism.ts +130 -0
  473. package/src/services/definitions/pihole.ts +79 -0
  474. package/src/services/definitions/piper-tts.ts +76 -0
  475. package/src/services/definitions/plane.ts +75 -0
  476. package/src/services/definitions/plausible.ts +97 -0
  477. package/src/services/definitions/pocket-id.ts +98 -0
  478. package/src/services/definitions/posthog.ts +97 -0
  479. package/src/services/definitions/redis.ts +1 -1
  480. package/src/services/definitions/revolt.ts +68 -0
  481. package/src/services/definitions/sentry.ts +104 -0
  482. package/src/services/definitions/sonarqube.ts +85 -0
  483. package/src/services/definitions/superset.ts +84 -0
  484. package/src/services/definitions/surrealdb.ts +77 -0
  485. package/src/services/definitions/tabby-ml.ts +76 -0
  486. package/src/services/definitions/tempo.ts +59 -0
  487. package/src/services/definitions/text-gen-webui.ts +92 -0
  488. package/src/services/definitions/timescaledb.ts +90 -0
  489. package/src/services/definitions/valkey.ts +1 -1
  490. package/src/services/definitions/vector-log.ts +61 -0
  491. package/src/services/definitions/vikunja.ts +96 -0
  492. package/src/services/definitions/wireguard.ts +89 -0
  493. package/src/services/definitions/woodpecker-ci.ts +97 -0
  494. package/src/services/definitions/zulip.ts +117 -0
  495. package/src/types.ts +29 -0
  496. package/dist/schema-C_hc7e4k.d.cts.map +0 -1
  497. package/dist/schema-CaesJaS2.d.mts.map +0 -1
@@ -467,7 +467,25 @@ function generateOpenClawConfig(resolved, options) {
467
467
  workspace: isDocker ? "/home/node/.openclaw/workspace" : "./workspace",
468
468
  compaction: { mode: "safeguard" },
469
469
  maxConcurrent: 4,
470
- subagents: { maxConcurrent: 8 }
470
+ subagents: {
471
+ maxConcurrent: 8,
472
+ allowAgents: ["*"]
473
+ },
474
+ ...isDocker ? { sandbox: {
475
+ docker: {
476
+ containerPrefix: "openclaw-sandbox",
477
+ workdir: "/workspace",
478
+ readOnlyRoot: true,
479
+ network: "none",
480
+ capDrop: ["ALL"],
481
+ pidsLimit: 256,
482
+ memory: "512m"
483
+ },
484
+ browser: {
485
+ enabled: false,
486
+ autoStart: false
487
+ }
488
+ } } : {}
471
489
  } },
472
490
  messages: { ackReactionScope: "group-mentions" },
473
491
  commands: {
@@ -485,12 +503,16 @@ function generateOpenClawConfig(resolved, options) {
485
503
  }
486
504
  } },
487
505
  web: { enabled: true },
488
- discovery: { wideArea: { enabled: true } },
506
+ discovery: {
507
+ wideArea: { enabled: true },
508
+ mdns: { mode: isDocker ? "off" : "minimal" }
509
+ },
489
510
  canvasHost: {
490
511
  enabled: true,
491
512
  liveReload: true
492
513
  },
493
514
  channels: {},
515
+ nodeHost: { browserProxy: { enabled: true } },
494
516
  gateway: {
495
517
  port: options.gatewayPort,
496
518
  mode: "local",
@@ -509,17 +531,90 @@ function generateOpenClawConfig(resolved, options) {
509
531
  mode: "serve",
510
532
  resetOnExit: true
511
533
  } },
512
- nodes: { denyCommands: [
513
- "camera.snap",
514
- "camera.clip",
515
- "screen.record"
516
- ] }
534
+ reload: { mode: "hybrid" },
535
+ http: { endpoints: {
536
+ chatCompletions: { enabled: false },
537
+ responses: { enabled: false }
538
+ } },
539
+ nodes: {
540
+ browser: { mode: "auto" },
541
+ allowCommands: [],
542
+ denyCommands: [
543
+ "camera.snap",
544
+ "camera.clip",
545
+ "screen.record"
546
+ ]
547
+ },
548
+ remote: { transport: "direct" },
549
+ channelHealthCheckMinutes: 5
550
+ },
551
+ browser: {
552
+ enabled: true,
553
+ ...isDocker ? {} : { relayBindHost: "127.0.0.1" }
517
554
  },
518
555
  skills: {
519
556
  install: { nodeManager: "pnpm" },
520
557
  load: { watch: true },
521
558
  ...Object.keys(defaultSkills).length > 0 ? { entries: defaultSkills } : {}
522
559
  },
560
+ acp: {
561
+ enabled: false,
562
+ dispatch: { enabled: false },
563
+ maxConcurrentSessions: 4,
564
+ stream: {
565
+ deliveryMode: "live",
566
+ repeatSuppression: true
567
+ },
568
+ runtime: { ttlMinutes: 30 }
569
+ },
570
+ tools: {
571
+ web: {
572
+ search: {
573
+ enabled: true,
574
+ provider: "brave",
575
+ maxResults: 5,
576
+ timeoutSeconds: 10,
577
+ cacheTtlMinutes: 60
578
+ },
579
+ fetch: {
580
+ enabled: true,
581
+ maxChars: 3e4,
582
+ timeoutSeconds: 15,
583
+ cacheTtlMinutes: 30,
584
+ readability: true
585
+ }
586
+ },
587
+ exec: {
588
+ host: isDocker ? "sandbox" : "gateway",
589
+ security: "allowlist",
590
+ ask: "on-miss",
591
+ backgroundMs: 3e4,
592
+ timeoutSec: 300
593
+ },
594
+ fs: { workspaceOnly: !isDocker },
595
+ loopDetection: {
596
+ enabled: true,
597
+ historySize: 30,
598
+ warningThreshold: 10,
599
+ criticalThreshold: 20,
600
+ globalCircuitBreakerThreshold: 30
601
+ },
602
+ sessions: { visibility: "tree" },
603
+ agentToAgent: {
604
+ enabled: true,
605
+ allow: ["*"]
606
+ }
607
+ },
608
+ session: { agentToAgent: { maxPingPongTurns: 5 } },
609
+ memory: {
610
+ backend: "builtin",
611
+ citations: "auto"
612
+ },
613
+ ui: { assistant: { name: "OpenClaw" } },
614
+ media: {
615
+ preserveFilenames: true,
616
+ ttlHours: 168
617
+ },
523
618
  plugins: {
524
619
  enabled: true,
525
620
  entries: {
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw-json.mjs","names":[],"sources":["../../src/generators/openclaw-json.ts"],"sourcesContent":["import type { AiProvider, DeploymentType, ResolverOutput } from \"../types.js\";\n\nexport interface OpenClawConfigOptions {\n\tdeploymentType: DeploymentType;\n\tgatewayPort: number;\n\topenclawVersion: string;\n}\n\nconst PROVIDER_CONFIGS: Record<AiProvider, any> = {\n\topenai: {\n\t\tbaseUrl: \"https://api.openai.com/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${OPENAI_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"gpt-5\",\n\t\t\t\tname: \"GPT-5\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 2.5, output: 10, cacheRead: 1.25, cacheWrite: 2.5 },\n\t\t\t\tcontextWindow: 128000,\n\t\t\t\tmaxTokens: 16384,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"o4-mini\",\n\t\t\t\tname: \"o4-mini\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 1.1, output: 4.4, cacheRead: 0.55, cacheWrite: 1.1 },\n\t\t\t\tcontextWindow: 200000,\n\t\t\t\tmaxTokens: 100000,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"gpt-5-mini\",\n\t\t\t\tname: \"GPT-5 Mini\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0.15 },\n\t\t\t\tcontextWindow: 128000,\n\t\t\t\tmaxTokens: 16384,\n\t\t\t},\n\t\t],\n\t},\n\tanthropic: {\n\t\tbaseUrl: \"https://api.anthropic.com/v1/messages\",\n\t\tapi: \"anthropic-messages\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${ANTHROPIC_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"claude-opus-4-6\",\n\t\t\t\tname: \"Claude 4.6 Opus\",\n\t\t\t\tapi: \"anthropic-messages\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 15.0, output: 75.0, cacheRead: 1.5, cacheWrite: 18.75 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 128000,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"claude-sonnet-4-6\",\n\t\t\t\tname: \"Claude 4.6 Sonnet\",\n\t\t\t\tapi: \"anthropic-messages\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 3.0, output: 15.0, cacheRead: 0.3, cacheWrite: 3.75 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 128000,\n\t\t\t},\n\t\t],\n\t},\n\tgoogle: {\n\t\tbaseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${GOOGLE_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"gemini-3.1-pro-preview\",\n\t\t\t\tname: \"Gemini 3.1 Pro\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 2.0, output: 8.0, cacheRead: 0.5, cacheWrite: 2.0 },\n\t\t\t\tcontextWindow: 2000000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"gemini-3-flash-preview\",\n\t\t\t\tname: \"Gemini 3 Flash\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.15, output: 0.6, cacheRead: 0.0375, cacheWrite: 0.15 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\txai: {\n\t\tbaseUrl: \"https://api.x.ai/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${XAI_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"grok-4-fast\",\n\t\t\t\tname: \"Grok 4 Fast\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 2.0, output: 10.0, cacheRead: 1.0, cacheWrite: 2.0 },\n\t\t\t\tcontextWindow: 256000,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t],\n\t},\n\tdeepseek: {\n\t\tbaseUrl: \"https://api.deepseek.com/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${DEEPSEEK_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"deepseek-chat\",\n\t\t\t\tname: \"DeepSeek V3\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0.14, output: 0.28, cacheRead: 0.014, cacheWrite: 0.14 },\n\t\t\t\tcontextWindow: 65536,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"deepseek-reasoner\",\n\t\t\t\tname: \"DeepSeek R1\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0.55, output: 2.19, cacheRead: 0.14, cacheWrite: 0.55 },\n\t\t\t\tcontextWindow: 65536,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\tgroq: {\n\t\tbaseUrl: \"https://api.groq.com/openai/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${GROQ_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"llama-4-maverick\",\n\t\t\t\tname: \"LLaMA 4 Maverick (Groq)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.59, output: 0.79 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t],\n\t},\n\topenrouter: {\n\t\tbaseUrl: \"https://openrouter.ai/api/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${OPENROUTER_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"anthropic/claude-opus-4-6\",\n\t\t\t\tname: \"Claude 4.6 Opus (OpenRouter)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 15.0, output: 75.0 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 128000,\n\t\t\t},\n\t\t],\n\t},\n\tmistral: {\n\t\tbaseUrl: \"https://api.mistral.ai/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${MISTRAL_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"mistral-large-latest\",\n\t\t\t\tname: \"Mistral Large\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 2.0, output: 6.0 },\n\t\t\t\tcontextWindow: 131000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\ttogether: {\n\t\tbaseUrl: \"https://api.together.xyz/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${TOGETHER_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\", // \"meta-llama/Llama-4-Maverick-Instruct-Turbo\",\n\t\t\t\tname: \"LLaMA 4 Maverick (Together)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.88, output: 0.88 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t],\n\t},\n\tollama: {\n\t\tbaseUrl: null, // dynamic: resolved at generation time based on deployment type\n\t\tapi: \"openai-completions\",\n\t\tauth: \"none\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"llama3:latest\",\n\t\t\t\tname: \"LLaMA 3 (Local)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"deepseek-r1:latest\",\n\t\t\t\tname: \"DeepSeek R1 (Local)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t],\n\t},\n\t\"ollama-cloud\": {\n\t\tbaseUrl: \"https://ollama.com/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${OLLAMA_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"qwen3.5:397b-cloud\",\n\t\t\t\tname: \"Qwen 3.5 397B (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"glm-5:cloud\",\n\t\t\t\tname: \"GLM-5 (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"minimax-m2.5:cloud\",\n\t\t\t\tname: \"MiniMax M2.5 (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"kimi-k2.5:cloud\",\n\t\t\t\tname: \"Kimi K2.5 (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"gemini-3-flash-preview:cloud\",\n\t\t\t\tname: \"Gemini 3 Flash (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\tlmstudio: {\n\t\tbaseUrl: null, // dynamic: resolved at generation time based on deployment type\n\t\tapi: \"openai-completions\",\n\t\tauth: \"none\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"local-model\",\n\t\t\t\tname: \"LM Studio Model\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t],\n\t},\n\tvllm: {\n\t\tbaseUrl: null, // dynamic: resolved at generation time based on deployment type\n\t\tapi: \"openai-completions\",\n\t\tauth: \"none\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"local-model\",\n\t\t\t\tname: \"vLLM Model\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t],\n\t},\n};\n\n/** Default ports for local inference providers (ollama, lmstudio, vllm). */\nconst LOCAL_PROVIDER_PORTS: Record<string, number> = {\n\tollama: 11434,\n\tlmstudio: 1234,\n\tvllm: 8000,\n};\n\n/**\n * Generates a default `openclaw/config/openclaw.json` tailored\n * to the services installed in the stack.\n */\nexport function generateOpenClawConfig(\n\tresolved: ResolverOutput,\n\toptions: OpenClawConfigOptions,\n): string {\n\tconst isDocker = options.deploymentType === \"docker\";\n\t// Docker containers reach host services via host.docker.internal; bare-metal uses localhost\n\tconst localInferenceHost = isDocker ? \"host.docker.internal\" : \"localhost\";\n\t// Docker: bind to all interfaces (0.0.0.0) so port mapping works from host\n\t// Bare-metal/local: bind to loopback (127.0.0.1) for security, Tailscale can expose if needed\n\tconst gatewayBind = isDocker ? \"lan\" : \"loopback\";\n\tconst defaultSkills: Record<string, { enabled: boolean }> = {};\n\n\t// Auto-enable any OpenClaw skills attached to installed companion services\n\tfor (const { definition } of resolved.services) {\n\t\tfor (const skill of definition.skills) {\n\t\t\tif (skill.autoInstall) {\n\t\t\t\tdefaultSkills[skill.skillId] = { enabled: true };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst providers: Record<string, any> = {};\n\tconst agentsModels: Record<string, { alias: string }> = {};\n\tlet primaryModel = \"\";\n\n\t// Always default to empty or the first choice, fallback to openai if nothing was passed\n\tconst selectedProviders =\n\t\tresolved.aiProviders && resolved.aiProviders.length > 0\n\t\t\t? resolved.aiProviders\n\t\t\t: ([\"openai\"] as AiProvider[]);\n\n\tfor (const provider of selectedProviders) {\n\t\tconst meta = PROVIDER_CONFIGS[provider];\n\t\tif (!meta) continue;\n\n\t\t// Local inference providers have null baseUrl — resolve dynamically based on deployment type\n\t\tconst baseUrl =\n\t\t\tmeta.baseUrl ?? `http://${localInferenceHost}:${LOCAL_PROVIDER_PORTS[provider] ?? 8000}/v1`;\n\n\t\tproviders[provider] = {\n\t\t\tbaseUrl,\n\t\t\tapi: meta.api,\n\t\t\tauth: meta.auth,\n\t\t\t...(meta.apiKey ? { apiKey: meta.apiKey } : {}),\n\t\t\tmodels: meta.models,\n\t\t};\n\n\t\tfor (const m of meta.models) {\n\t\t\tconst fullId = `${provider}/${m.id}`;\n\t\t\tagentsModels[fullId] = { alias: m.name };\n\t\t\tif (!primaryModel) primaryModel = fullId; // Use the very first model mapped as the global system default\n\t\t}\n\t}\n\n\tconst authProfiles: Record<string, any> = {\n\t\t\"local:default\": {\n\t\t\tprovider: \"local\",\n\t\t\tmode: \"token\",\n\t\t},\n\t};\n\n\t// Add provider auth profiles too\n\tfor (const provider of Object.keys(providers)) {\n\t\tauthProfiles[`${provider}:default`] = {\n\t\t\tprovider: provider,\n\t\t\tmode: \"api_key\",\n\t\t};\n\t}\n\n\tconst config = {\n\t\tmeta: {\n\t\t\tlastTouchedVersion: options.openclawVersion,\n\t\t\tlastTouchedAt: new Date().toISOString(),\n\t\t},\n\t\tenv: {\n\t\t\tshellEnv: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t\tvars: {},\n\t\t},\n\t\twizard: {\n\t\t\tlastRunAt: new Date().toISOString(),\n\t\t\tlastRunVersion: options.openclawVersion,\n\t\t\tlastRunCommand: \"auto-generated-by-better-openclaw\",\n\t\t\tlastRunMode: \"local\",\n\t\t},\n\t\tlogging: {\n\t\t\tredactSensitive: \"tools\",\n\t\t},\n\t\tupdate: {\n\t\t\tcheckOnStart: true,\n\t\t},\n\t\tauth: {\n\t\t\tprofiles: authProfiles,\n\t\t},\n\t\tmodels: {\n\t\t\tmode: \"merge\",\n\t\t\tproviders,\n\t\t},\n\t\tagents: {\n\t\t\tdefaults: {\n\t\t\t\tmodel: {\n\t\t\t\t\tprimary: primaryModel,\n\t\t\t\t},\n\t\t\t\tmodels: agentsModels,\n\t\t\t\tworkspace: isDocker ? \"/home/node/.openclaw/workspace\" : \"./workspace\",\n\t\t\t\tcompaction: { mode: \"safeguard\" },\n\t\t\t\tmaxConcurrent: 4,\n\t\t\t\tsubagents: { maxConcurrent: 8 },\n\t\t\t},\n\t\t},\n\t\tmessages: {\n\t\t\tackReactionScope: \"group-mentions\",\n\t\t},\n\t\tcommands: {\n\t\t\tnative: \"auto\",\n\t\t\tnativeSkills: \"auto\",\n\t\t},\n\t\tcron: {\n\t\t\tenabled: true,\n\t\t},\n\t\thooks: {\n\t\t\tinternal: {\n\t\t\t\tenabled: true,\n\t\t\t\tentries: {\n\t\t\t\t\t\"boot-md\": { enabled: true },\n\t\t\t\t\t\"bootstrap-extra-files\": { enabled: true },\n\t\t\t\t\t\"command-logger\": { enabled: true },\n\t\t\t\t\t\"session-memory\": { enabled: true },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tweb: {\n\t\t\tenabled: true,\n\t\t},\n\t\tdiscovery: {\n\t\t\twideArea: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t},\n\t\tcanvasHost: {\n\t\t\tenabled: true,\n\t\t\tliveReload: true,\n\t\t},\n\t\tchannels: {},\n\t\tgateway: {\n\t\t\tport: options.gatewayPort,\n\t\t\tmode: \"local\",\n\t\t\tbind: gatewayBind,\n\t\t\tcontrolUi: {\n\t\t\t\tenabled: true,\n\t\t\t\t// Docker NAT makes browser connections appear external — skip device pairing, use token-only auth\n\t\t\t\t...(isDocker ? { allowInsecureAuth: true } : {}),\n\t\t\t\t// Non-loopback binds need explicit origin allowlist for control UI CORS\n\t\t\t\t// Reference: docker-setup.sh ensure_control_ui_allowed_origins()\n\t\t\t\t...(gatewayBind !== \"loopback\"\n\t\t\t\t\t? { allowedOrigins: [`http://127.0.0.1:${options.gatewayPort}`] }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tauth: {\n\t\t\t\tmode: \"token\",\n\t\t\t\ttoken: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t\t\t...(isDocker ? {} : { allowTailscale: true }),\n\t\t\t},\n\t\t\t// Tailscale serve only works on bare-metal/local (not inside Docker containers)\n\t\t\t...(isDocker ? {} : { tailscale: { mode: \"serve\", resetOnExit: true } }),\n\t\t\tnodes: {\n\t\t\t\tdenyCommands: [\"camera.snap\", \"camera.clip\", \"screen.record\"],\n\t\t\t},\n\t\t},\n\t\tskills: {\n\t\t\tinstall: { nodeManager: \"pnpm\" },\n\t\t\tload: {\n\t\t\t\twatch: true,\n\t\t\t},\n\t\t\t...(Object.keys(defaultSkills).length > 0 ? { entries: defaultSkills } : {}),\n\t\t},\n\t\tplugins: {\n\t\t\tenabled: true,\n\t\t\tentries: {\n\t\t\t\ttelegram: { enabled: true },\n\t\t\t\twhatsapp: { enabled: true },\n\t\t\t\tdiscord: { enabled: true },\n\t\t\t\t\"memory-core\": { enabled: true },\n\t\t\t},\n\t\t},\n\t};\n\n\treturn JSON.stringify(config, null, 2);\n}\n"],"mappings":";AAQA,MAAM,mBAA4C;CACjD,QAAQ;EACP,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;GACP;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,QAAQ,QAAQ;IACxB,MAAM;KAAE,OAAO;KAAK,QAAQ;KAAI,WAAW;KAAM,YAAY;KAAK;IAClE,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAK,QAAQ;KAAK,WAAW;KAAM,YAAY;KAAK;IACnE,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,QAAQ,QAAQ;IACxB,MAAM;KAAE,OAAO;KAAM,QAAQ;KAAK,WAAW;KAAO,YAAY;KAAM;IACtE,eAAe;IACf,WAAW;IACX;GACD;EACD;CACD,WAAW;EACV,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM,WAAW;IAAK,YAAY;IAAO;GACtE,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAM,WAAW;IAAK,YAAY;IAAM;GACpE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,QAAQ;EACP,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAK,WAAW;IAAK,YAAY;IAAK;GAClE,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAK,WAAW;IAAQ,YAAY;IAAM;GACvE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,KAAK;EACJ,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAM,WAAW;IAAK,YAAY;IAAK;GACnE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,UAAU;EACT,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM,WAAW;IAAO,YAAY;IAAM;GACvE,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM,WAAW;IAAM,YAAY;IAAM;GACtE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,MAAM;EACL,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM;GACnC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,YAAY;EACX,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM;GACnC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,SAAS;EACR,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAK;GACjC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,UAAU;EACT,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM;GACnC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,QAAQ;EACP,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,gBAAgB;EACf,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;GACP;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,QAAQ,QAAQ;IACxB,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;EACD;CACD,UAAU;EACT,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,MAAM;EACL,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD;;AAGD,MAAM,uBAA+C;CACpD,QAAQ;CACR,UAAU;CACV,MAAM;CACN;;;;;AAMD,SAAgB,uBACf,UACA,SACS;CACT,MAAM,WAAW,QAAQ,mBAAmB;CAE5C,MAAM,qBAAqB,WAAW,yBAAyB;CAG/D,MAAM,cAAc,WAAW,QAAQ;CACvC,MAAM,gBAAsD,EAAE;AAG9D,MAAK,MAAM,EAAE,gBAAgB,SAAS,SACrC,MAAK,MAAM,SAAS,WAAW,OAC9B,KAAI,MAAM,YACT,eAAc,MAAM,WAAW,EAAE,SAAS,MAAM;CAKnD,MAAM,YAAiC,EAAE;CACzC,MAAM,eAAkD,EAAE;CAC1D,IAAI,eAAe;CAGnB,MAAM,oBACL,SAAS,eAAe,SAAS,YAAY,SAAS,IACnD,SAAS,cACR,CAAC,SAAS;AAEf,MAAK,MAAM,YAAY,mBAAmB;EACzC,MAAM,OAAO,iBAAiB;AAC9B,MAAI,CAAC,KAAM;AAMX,YAAU,YAAY;GACrB,SAHA,KAAK,WAAW,UAAU,mBAAmB,GAAG,qBAAqB,aAAa,IAAK;GAIvF,KAAK,KAAK;GACV,MAAM,KAAK;GACX,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE;GAC9C,QAAQ,KAAK;GACb;AAED,OAAK,MAAM,KAAK,KAAK,QAAQ;GAC5B,MAAM,SAAS,GAAG,SAAS,GAAG,EAAE;AAChC,gBAAa,UAAU,EAAE,OAAO,EAAE,MAAM;AACxC,OAAI,CAAC,aAAc,gBAAe;;;CAIpC,MAAM,eAAoC,EACzC,iBAAiB;EAChB,UAAU;EACV,MAAM;EACN,EACD;AAGD,MAAK,MAAM,YAAY,OAAO,KAAK,UAAU,CAC5C,cAAa,GAAG,SAAS,aAAa;EAC3B;EACV,MAAM;EACN;CAGF,MAAM,SAAS;EACd,MAAM;GACL,oBAAoB,QAAQ;GAC5B,gCAAe,IAAI,MAAM,EAAC,aAAa;GACvC;EACD,KAAK;GACJ,UAAU,EACT,SAAS,MACT;GACD,MAAM,EAAE;GACR;EACD,QAAQ;GACP,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,gBAAgB,QAAQ;GACxB,gBAAgB;GAChB,aAAa;GACb;EACD,SAAS,EACR,iBAAiB,SACjB;EACD,QAAQ,EACP,cAAc,MACd;EACD,MAAM,EACL,UAAU,cACV;EACD,QAAQ;GACP,MAAM;GACN;GACA;EACD,QAAQ,EACP,UAAU;GACT,OAAO,EACN,SAAS,cACT;GACD,QAAQ;GACR,WAAW,WAAW,mCAAmC;GACzD,YAAY,EAAE,MAAM,aAAa;GACjC,eAAe;GACf,WAAW,EAAE,eAAe,GAAG;GAC/B,EACD;EACD,UAAU,EACT,kBAAkB,kBAClB;EACD,UAAU;GACT,QAAQ;GACR,cAAc;GACd;EACD,MAAM,EACL,SAAS,MACT;EACD,OAAO,EACN,UAAU;GACT,SAAS;GACT,SAAS;IACR,WAAW,EAAE,SAAS,MAAM;IAC5B,yBAAyB,EAAE,SAAS,MAAM;IAC1C,kBAAkB,EAAE,SAAS,MAAM;IACnC,kBAAkB,EAAE,SAAS,MAAM;IACnC;GACD,EACD;EACD,KAAK,EACJ,SAAS,MACT;EACD,WAAW,EACV,UAAU,EACT,SAAS,MACT,EACD;EACD,YAAY;GACX,SAAS;GACT,YAAY;GACZ;EACD,UAAU,EAAE;EACZ,SAAS;GACR,MAAM,QAAQ;GACd,MAAM;GACN,MAAM;GACN,WAAW;IACV,SAAS;IAET,GAAI,WAAW,EAAE,mBAAmB,MAAM,GAAG,EAAE;IAG/C,GAAI,gBAAgB,aACjB,EAAE,gBAAgB,CAAC,oBAAoB,QAAQ,cAAc,EAAE,GAC/D,EAAE;IACL;GACD,MAAM;IACL,MAAM;IACN,OAAO;IACP,GAAI,WAAW,EAAE,GAAG,EAAE,gBAAgB,MAAM;IAC5C;GAED,GAAI,WAAW,EAAE,GAAG,EAAE,WAAW;IAAE,MAAM;IAAS,aAAa;IAAM,EAAE;GACvE,OAAO,EACN,cAAc;IAAC;IAAe;IAAe;IAAgB,EAC7D;GACD;EACD,QAAQ;GACP,SAAS,EAAE,aAAa,QAAQ;GAChC,MAAM,EACL,OAAO,MACP;GACD,GAAI,OAAO,KAAK,cAAc,CAAC,SAAS,IAAI,EAAE,SAAS,eAAe,GAAG,EAAE;GAC3E;EACD,SAAS;GACR,SAAS;GACT,SAAS;IACR,UAAU,EAAE,SAAS,MAAM;IAC3B,UAAU,EAAE,SAAS,MAAM;IAC3B,SAAS,EAAE,SAAS,MAAM;IAC1B,eAAe,EAAE,SAAS,MAAM;IAChC;GACD;EACD;AAED,QAAO,KAAK,UAAU,QAAQ,MAAM,EAAE"}
1
+ {"version":3,"file":"openclaw-json.mjs","names":[],"sources":["../../src/generators/openclaw-json.ts"],"sourcesContent":["import type { AiProvider, DeploymentType, ResolverOutput } from \"../types.js\";\n\nexport interface OpenClawConfigOptions {\n\tdeploymentType: DeploymentType;\n\tgatewayPort: number;\n\topenclawVersion: string;\n}\n\nconst PROVIDER_CONFIGS: Record<AiProvider, any> = {\n\topenai: {\n\t\tbaseUrl: \"https://api.openai.com/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${OPENAI_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"gpt-5\",\n\t\t\t\tname: \"GPT-5\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 2.5, output: 10, cacheRead: 1.25, cacheWrite: 2.5 },\n\t\t\t\tcontextWindow: 128000,\n\t\t\t\tmaxTokens: 16384,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"o4-mini\",\n\t\t\t\tname: \"o4-mini\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 1.1, output: 4.4, cacheRead: 0.55, cacheWrite: 1.1 },\n\t\t\t\tcontextWindow: 200000,\n\t\t\t\tmaxTokens: 100000,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"gpt-5-mini\",\n\t\t\t\tname: \"GPT-5 Mini\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0.15 },\n\t\t\t\tcontextWindow: 128000,\n\t\t\t\tmaxTokens: 16384,\n\t\t\t},\n\t\t],\n\t},\n\tanthropic: {\n\t\tbaseUrl: \"https://api.anthropic.com/v1/messages\",\n\t\tapi: \"anthropic-messages\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${ANTHROPIC_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"claude-opus-4-6\",\n\t\t\t\tname: \"Claude 4.6 Opus\",\n\t\t\t\tapi: \"anthropic-messages\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 15.0, output: 75.0, cacheRead: 1.5, cacheWrite: 18.75 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 128000,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"claude-sonnet-4-6\",\n\t\t\t\tname: \"Claude 4.6 Sonnet\",\n\t\t\t\tapi: \"anthropic-messages\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 3.0, output: 15.0, cacheRead: 0.3, cacheWrite: 3.75 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 128000,\n\t\t\t},\n\t\t],\n\t},\n\tgoogle: {\n\t\tbaseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${GOOGLE_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"gemini-3.1-pro-preview\",\n\t\t\t\tname: \"Gemini 3.1 Pro\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 2.0, output: 8.0, cacheRead: 0.5, cacheWrite: 2.0 },\n\t\t\t\tcontextWindow: 2000000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"gemini-3-flash-preview\",\n\t\t\t\tname: \"Gemini 3 Flash\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.15, output: 0.6, cacheRead: 0.0375, cacheWrite: 0.15 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\txai: {\n\t\tbaseUrl: \"https://api.x.ai/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${XAI_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"grok-4-fast\",\n\t\t\t\tname: \"Grok 4 Fast\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 2.0, output: 10.0, cacheRead: 1.0, cacheWrite: 2.0 },\n\t\t\t\tcontextWindow: 256000,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t],\n\t},\n\tdeepseek: {\n\t\tbaseUrl: \"https://api.deepseek.com/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${DEEPSEEK_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"deepseek-chat\",\n\t\t\t\tname: \"DeepSeek V3\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0.14, output: 0.28, cacheRead: 0.014, cacheWrite: 0.14 },\n\t\t\t\tcontextWindow: 65536,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"deepseek-reasoner\",\n\t\t\t\tname: \"DeepSeek R1\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0.55, output: 2.19, cacheRead: 0.14, cacheWrite: 0.55 },\n\t\t\t\tcontextWindow: 65536,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\tgroq: {\n\t\tbaseUrl: \"https://api.groq.com/openai/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${GROQ_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"llama-4-maverick\",\n\t\t\t\tname: \"LLaMA 4 Maverick (Groq)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.59, output: 0.79 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t],\n\t},\n\topenrouter: {\n\t\tbaseUrl: \"https://openrouter.ai/api/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${OPENROUTER_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"anthropic/claude-opus-4-6\",\n\t\t\t\tname: \"Claude 4.6 Opus (OpenRouter)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 15.0, output: 75.0 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 128000,\n\t\t\t},\n\t\t],\n\t},\n\tmistral: {\n\t\tbaseUrl: \"https://api.mistral.ai/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${MISTRAL_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"mistral-large-latest\",\n\t\t\t\tname: \"Mistral Large\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 2.0, output: 6.0 },\n\t\t\t\tcontextWindow: 131000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\ttogether: {\n\t\tbaseUrl: \"https://api.together.xyz/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${TOGETHER_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\", // \"meta-llama/Llama-4-Maverick-Instruct-Turbo\",\n\t\t\t\tname: \"LLaMA 4 Maverick (Together)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0.88, output: 0.88 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t],\n\t},\n\tollama: {\n\t\tbaseUrl: null, // dynamic: resolved at generation time based on deployment type\n\t\tapi: \"openai-completions\",\n\t\tauth: \"none\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"llama3:latest\",\n\t\t\t\tname: \"LLaMA 3 (Local)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"deepseek-r1:latest\",\n\t\t\t\tname: \"DeepSeek R1 (Local)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: true,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t],\n\t},\n\t\"ollama-cloud\": {\n\t\tbaseUrl: \"https://ollama.com/v1\",\n\t\tapi: \"openai-completions\",\n\t\tauth: \"api-key\",\n\t\tapiKey: \"${OLLAMA_API_KEY}\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"qwen3.5:397b-cloud\",\n\t\t\t\tname: \"Qwen 3.5 397B (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"glm-5:cloud\",\n\t\t\t\tname: \"GLM-5 (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"minimax-m2.5:cloud\",\n\t\t\t\tname: \"MiniMax M2.5 (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"kimi-k2.5:cloud\",\n\t\t\t\tname: \"Kimi K2.5 (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 131072,\n\t\t\t\tmaxTokens: 32768,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"gemini-3-flash-preview:cloud\",\n\t\t\t\tname: \"Gemini 3 Flash (Cloud)\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\", \"image\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 1000000,\n\t\t\t\tmaxTokens: 8192,\n\t\t\t},\n\t\t],\n\t},\n\tlmstudio: {\n\t\tbaseUrl: null, // dynamic: resolved at generation time based on deployment type\n\t\tapi: \"openai-completions\",\n\t\tauth: \"none\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"local-model\",\n\t\t\t\tname: \"LM Studio Model\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t],\n\t},\n\tvllm: {\n\t\tbaseUrl: null, // dynamic: resolved at generation time based on deployment type\n\t\tapi: \"openai-completions\",\n\t\tauth: \"none\",\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: \"local-model\",\n\t\t\t\tname: \"vLLM Model\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\treasoning: false,\n\t\t\t\tinput: [\"text\"],\n\t\t\t\tcost: { input: 0, output: 0 },\n\t\t\t\tcontextWindow: 8192,\n\t\t\t\tmaxTokens: 4096,\n\t\t\t},\n\t\t],\n\t},\n};\n\n/** Default ports for local inference providers (ollama, lmstudio, vllm). */\nconst LOCAL_PROVIDER_PORTS: Record<string, number> = {\n\tollama: 11434,\n\tlmstudio: 1234,\n\tvllm: 8000,\n};\n\n/**\n * Generates a default `openclaw/config/openclaw.json` tailored\n * to the services installed in the stack.\n */\nexport function generateOpenClawConfig(\n\tresolved: ResolverOutput,\n\toptions: OpenClawConfigOptions,\n): string {\n\tconst isDocker = options.deploymentType === \"docker\";\n\t// Docker containers reach host services via host.docker.internal; bare-metal uses localhost\n\tconst localInferenceHost = isDocker ? \"host.docker.internal\" : \"localhost\";\n\t// Docker: bind to all interfaces (0.0.0.0) so port mapping works from host\n\t// Bare-metal/local: bind to loopback (127.0.0.1) for security, Tailscale can expose if needed\n\tconst gatewayBind = isDocker ? \"lan\" : \"loopback\";\n\tconst defaultSkills: Record<string, { enabled: boolean }> = {};\n\n\t// Auto-enable any OpenClaw skills attached to installed companion services\n\tfor (const { definition } of resolved.services) {\n\t\tfor (const skill of definition.skills) {\n\t\t\tif (skill.autoInstall) {\n\t\t\t\tdefaultSkills[skill.skillId] = { enabled: true };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst providers: Record<string, any> = {};\n\tconst agentsModels: Record<string, { alias: string }> = {};\n\tlet primaryModel = \"\";\n\n\t// Always default to empty or the first choice, fallback to openai if nothing was passed\n\tconst selectedProviders =\n\t\tresolved.aiProviders && resolved.aiProviders.length > 0\n\t\t\t? resolved.aiProviders\n\t\t\t: ([\"openai\"] as AiProvider[]);\n\n\tfor (const provider of selectedProviders) {\n\t\tconst meta = PROVIDER_CONFIGS[provider];\n\t\tif (!meta) continue;\n\n\t\t// Local inference providers have null baseUrl — resolve dynamically based on deployment type\n\t\tconst baseUrl =\n\t\t\tmeta.baseUrl ?? `http://${localInferenceHost}:${LOCAL_PROVIDER_PORTS[provider] ?? 8000}/v1`;\n\n\t\tproviders[provider] = {\n\t\t\tbaseUrl,\n\t\t\tapi: meta.api,\n\t\t\tauth: meta.auth,\n\t\t\t...(meta.apiKey ? { apiKey: meta.apiKey } : {}),\n\t\t\tmodels: meta.models,\n\t\t};\n\n\t\tfor (const m of meta.models) {\n\t\t\tconst fullId = `${provider}/${m.id}`;\n\t\t\tagentsModels[fullId] = { alias: m.name };\n\t\t\tif (!primaryModel) primaryModel = fullId; // Use the very first model mapped as the global system default\n\t\t}\n\t}\n\n\tconst authProfiles: Record<string, any> = {\n\t\t\"local:default\": {\n\t\t\tprovider: \"local\",\n\t\t\tmode: \"token\",\n\t\t},\n\t};\n\n\t// Add provider auth profiles too\n\tfor (const provider of Object.keys(providers)) {\n\t\tauthProfiles[`${provider}:default`] = {\n\t\t\tprovider: provider,\n\t\t\tmode: \"api_key\",\n\t\t};\n\t}\n\n\tconst config = {\n\t\tmeta: {\n\t\t\tlastTouchedVersion: options.openclawVersion,\n\t\t\tlastTouchedAt: new Date().toISOString(),\n\t\t},\n\t\tenv: {\n\t\t\tshellEnv: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t\tvars: {},\n\t\t},\n\t\twizard: {\n\t\t\tlastRunAt: new Date().toISOString(),\n\t\t\tlastRunVersion: options.openclawVersion,\n\t\t\tlastRunCommand: \"auto-generated-by-better-openclaw\",\n\t\t\tlastRunMode: \"local\",\n\t\t},\n\t\tlogging: {\n\t\t\tredactSensitive: \"tools\",\n\t\t},\n\t\tupdate: {\n\t\t\tcheckOnStart: true,\n\t\t},\n\t\tauth: {\n\t\t\tprofiles: authProfiles,\n\t\t},\n\t\tmodels: {\n\t\t\tmode: \"merge\",\n\t\t\tproviders,\n\t\t},\n\t\tagents: {\n\t\t\tdefaults: {\n\t\t\t\tmodel: {\n\t\t\t\t\tprimary: primaryModel,\n\t\t\t\t},\n\t\t\t\tmodels: agentsModels,\n\t\t\t\tworkspace: isDocker ? \"/home/node/.openclaw/workspace\" : \"./workspace\",\n\t\t\t\tcompaction: { mode: \"safeguard\" },\n\t\t\t\tmaxConcurrent: 4,\n\t\t\t\tsubagents: {\n\t\t\t\t\tmaxConcurrent: 8,\n\t\t\t\t\t// Allow spawning sub-agents under any agent ID (essential for swarm collaboration)\n\t\t\t\t\tallowAgents: [\"*\"],\n\t\t\t\t},\n\t\t\t\t// Sandbox defaults for agent exec isolation\n\t\t\t\t...(isDocker\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tsandbox: {\n\t\t\t\t\t\t\t\tdocker: {\n\t\t\t\t\t\t\t\t\tcontainerPrefix: \"openclaw-sandbox\",\n\t\t\t\t\t\t\t\t\tworkdir: \"/workspace\",\n\t\t\t\t\t\t\t\t\treadOnlyRoot: true,\n\t\t\t\t\t\t\t\t\tnetwork: \"none\",\n\t\t\t\t\t\t\t\t\tcapDrop: [\"ALL\"],\n\t\t\t\t\t\t\t\t\tpidsLimit: 256,\n\t\t\t\t\t\t\t\t\tmemory: \"512m\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tbrowser: {\n\t\t\t\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\t\t\t\tautoStart: false,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t},\n\t\tmessages: {\n\t\t\tackReactionScope: \"group-mentions\",\n\t\t},\n\t\tcommands: {\n\t\t\tnative: \"auto\",\n\t\t\tnativeSkills: \"auto\",\n\t\t},\n\t\tcron: {\n\t\t\tenabled: true,\n\t\t},\n\t\thooks: {\n\t\t\tinternal: {\n\t\t\t\tenabled: true,\n\t\t\t\tentries: {\n\t\t\t\t\t\"boot-md\": { enabled: true },\n\t\t\t\t\t\"bootstrap-extra-files\": { enabled: true },\n\t\t\t\t\t\"command-logger\": { enabled: true },\n\t\t\t\t\t\"session-memory\": { enabled: true },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tweb: {\n\t\t\tenabled: true,\n\t\t},\n\t\tdiscovery: {\n\t\t\twideArea: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t\t// mDNS/Bonjour for local-network instance discovery (swarm auto-discovery)\n\t\t\t// \"minimal\" hides sensitive metadata; \"full\" exposes cliPath/sshPort for easier discovery\n\t\t\tmdns: {\n\t\t\t\tmode: isDocker ? \"off\" : \"minimal\",\n\t\t\t},\n\t\t},\n\t\tcanvasHost: {\n\t\t\tenabled: true,\n\t\t\tliveReload: true,\n\t\t},\n\t\tchannels: {},\n\t\t// Node host config — controls how this instance exposes services to other gateway nodes\n\t\tnodeHost: {\n\t\t\tbrowserProxy: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t},\n\t\tgateway: {\n\t\t\tport: options.gatewayPort,\n\t\t\tmode: \"local\",\n\t\t\tbind: gatewayBind,\n\t\t\tcontrolUi: {\n\t\t\t\tenabled: true,\n\t\t\t\t// Docker NAT makes browser connections appear external — skip device pairing, use token-only auth\n\t\t\t\t...(isDocker ? { allowInsecureAuth: true } : {}),\n\t\t\t\t// Non-loopback binds need explicit origin allowlist for control UI CORS\n\t\t\t\t// Reference: docker-setup.sh ensure_control_ui_allowed_origins()\n\t\t\t\t...(gatewayBind !== \"loopback\"\n\t\t\t\t\t? { allowedOrigins: [`http://127.0.0.1:${options.gatewayPort}`] }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tauth: {\n\t\t\t\tmode: \"token\",\n\t\t\t\ttoken: \"${OPENCLAW_GATEWAY_TOKEN}\",\n\t\t\t\t...(isDocker ? {} : { allowTailscale: true }),\n\t\t\t},\n\t\t\t// Tailscale serve only works on bare-metal/local (not inside Docker containers)\n\t\t\t...(isDocker ? {} : { tailscale: { mode: \"serve\", resetOnExit: true } }),\n\t\t\treload: {\n\t\t\t\tmode: \"hybrid\",\n\t\t\t},\n\t\t\thttp: {\n\t\t\t\tendpoints: {\n\t\t\t\t\tchatCompletions: { enabled: false },\n\t\t\t\t\tresponses: { enabled: false },\n\t\t\t\t},\n\t\t\t},\n\t\t\tnodes: {\n\t\t\t\tbrowser: {\n\t\t\t\t\t// \"auto\" lets gateway pick best node for browser proxying; \"manual\" pins to specific node\n\t\t\t\t\tmode: \"auto\",\n\t\t\t\t},\n\t\t\t\t// Allowlist/denylist for node.invoke commands across the swarm\n\t\t\t\tallowCommands: [],\n\t\t\t\tdenyCommands: [\"camera.snap\", \"camera.clip\", \"screen.record\"],\n\t\t\t},\n\t\t\t// Remote gateway connection — enables this instance to connect to another OpenClaw gateway\n\t\t\t// Configure for swarm topologies: each instance can connect to one upstream gateway\n\t\t\t// Transport: \"direct\" = WebSocket (ws/wss), \"ssh\" = SSH tunnel for secure remote access\n\t\t\tremote: {\n\t\t\t\t// url: \"wss://gateway.example.com:18789\", // Remote gateway WebSocket URL\n\t\t\t\ttransport: \"direct\",\n\t\t\t\t// token: \"${OPENCLAW_REMOTE_GATEWAY_TOKEN}\", // Auth token for the remote gateway\n\t\t\t\t// sshTarget: \"user@gateway-host\", // For SSH tunnel transport\n\t\t\t\t// sshIdentity: \"~/.ssh/id_ed25519\", // SSH key for tunnel\n\t\t\t\t// tlsFingerprint: \"\", // Pin remote gateway TLS cert (sha256)\n\t\t\t},\n\t\t\tchannelHealthCheckMinutes: 5,\n\t\t},\n\t\tbrowser: {\n\t\t\tenabled: true,\n\t\t\t// WSL2 users may need relayBindHost: \"0.0.0.0\" for cross-namespace access\n\t\t\t...(isDocker ? {} : { relayBindHost: \"127.0.0.1\" }),\n\t\t},\n\t\tskills: {\n\t\t\tinstall: { nodeManager: \"pnpm\" },\n\t\t\tload: {\n\t\t\t\twatch: true,\n\t\t\t},\n\t\t\t...(Object.keys(defaultSkills).length > 0 ? { entries: defaultSkills } : {}),\n\t\t},\n\t\t// ACP (Agent Client Protocol) — external agents can connect to the gateway\n\t\t// Disabled by default; enable when using ACP-compatible agents (e.g. acpx)\n\t\tacp: {\n\t\t\tenabled: false,\n\t\t\tdispatch: { enabled: false },\n\t\t\tmaxConcurrentSessions: 4,\n\t\t\tstream: {\n\t\t\t\tdeliveryMode: \"live\",\n\t\t\t\trepeatSuppression: true,\n\t\t\t},\n\t\t\truntime: {\n\t\t\t\tttlMinutes: 30,\n\t\t\t},\n\t\t},\n\t\t// Tools configuration — web search, fetch, exec security, loop detection\n\t\ttools: {\n\t\t\tweb: {\n\t\t\t\tsearch: {\n\t\t\t\t\t// Enabled when a search API key is available (BRAVE_API_KEY, etc.)\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tprovider: \"brave\",\n\t\t\t\t\tmaxResults: 5,\n\t\t\t\t\ttimeoutSeconds: 10,\n\t\t\t\t\tcacheTtlMinutes: 60,\n\t\t\t\t},\n\t\t\t\tfetch: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tmaxChars: 30000,\n\t\t\t\t\ttimeoutSeconds: 15,\n\t\t\t\t\tcacheTtlMinutes: 30,\n\t\t\t\t\treadability: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\texec: {\n\t\t\t\t// Docker: sandbox exec inside a nested container; bare-metal: deny by default\n\t\t\t\thost: isDocker ? \"sandbox\" : \"gateway\",\n\t\t\t\tsecurity: \"allowlist\",\n\t\t\t\task: \"on-miss\",\n\t\t\t\tbackgroundMs: 30000,\n\t\t\t\ttimeoutSec: 300,\n\t\t\t},\n\t\t\t// Filesystem path guards\n\t\t\tfs: {\n\t\t\t\t// In Docker the workspace is already isolated; on bare-metal restrict to workspace\n\t\t\t\tworkspaceOnly: !isDocker,\n\t\t\t},\n\t\t\t// Prevent stuck tool-call loops\n\t\t\tloopDetection: {\n\t\t\t\tenabled: true,\n\t\t\t\thistorySize: 30,\n\t\t\t\twarningThreshold: 10,\n\t\t\t\tcriticalThreshold: 20,\n\t\t\t\tglobalCircuitBreakerThreshold: 30,\n\t\t\t},\n\t\t\tsessions: {\n\t\t\t\tvisibility: \"tree\",\n\t\t\t},\n\t\t\t// Agent-to-agent messaging — allows agents to invoke each other at runtime\n\t\t\t// Essential for swarm architectures where multiple OpenClaw instances collaborate\n\t\t\tagentToAgent: {\n\t\t\t\tenabled: true,\n\t\t\t\t// Allowlist of agent IDs or patterns that can be reached; \"*\" = any agent\n\t\t\t\tallow: [\"*\"],\n\t\t\t},\n\t\t},\n\t\t// Session-level agent-to-agent safety limits\n\t\tsession: {\n\t\t\tagentToAgent: {\n\t\t\t\t// Max ping-pong turns between requester and target agent (prevents infinite loops)\n\t\t\t\tmaxPingPongTurns: 5,\n\t\t\t},\n\t\t},\n\t\t// Memory — vector search over session history and markdown notes\n\t\tmemory: {\n\t\t\tbackend: \"builtin\",\n\t\t\tcitations: \"auto\",\n\t\t},\n\t\t// UI customization\n\t\tui: {\n\t\t\tassistant: {\n\t\t\t\tname: \"OpenClaw\",\n\t\t\t},\n\t\t},\n\t\t// Media retention\n\t\tmedia: {\n\t\t\tpreserveFilenames: true,\n\t\t\tttlHours: 168, // 7 days\n\t\t},\n\t\tplugins: {\n\t\t\tenabled: true,\n\t\t\tentries: {\n\t\t\t\ttelegram: { enabled: true },\n\t\t\t\twhatsapp: { enabled: true },\n\t\t\t\tdiscord: { enabled: true },\n\t\t\t\t\"memory-core\": { enabled: true },\n\t\t\t},\n\t\t},\n\t};\n\n\treturn JSON.stringify(config, null, 2);\n}\n"],"mappings":";AAQA,MAAM,mBAA4C;CACjD,QAAQ;EACP,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;GACP;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,QAAQ,QAAQ;IACxB,MAAM;KAAE,OAAO;KAAK,QAAQ;KAAI,WAAW;KAAM,YAAY;KAAK;IAClE,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAK,QAAQ;KAAK,WAAW;KAAM,YAAY;KAAK;IACnE,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,QAAQ,QAAQ;IACxB,MAAM;KAAE,OAAO;KAAM,QAAQ;KAAK,WAAW;KAAO,YAAY;KAAM;IACtE,eAAe;IACf,WAAW;IACX;GACD;EACD;CACD,WAAW;EACV,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM,WAAW;IAAK,YAAY;IAAO;GACtE,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAM,WAAW;IAAK,YAAY;IAAM;GACpE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,QAAQ;EACP,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAK,WAAW;IAAK,YAAY;IAAK;GAClE,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAK,WAAW;IAAQ,YAAY;IAAM;GACvE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,KAAK;EACJ,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAM,WAAW;IAAK,YAAY;IAAK;GACnE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,UAAU;EACT,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM,WAAW;IAAO,YAAY;IAAM;GACvE,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM,WAAW;IAAM,YAAY;IAAM;GACtE,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,MAAM;EACL,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM;GACnC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,YAAY;EACX,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM;GACnC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,SAAS;EACR,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAK,QAAQ;IAAK;GACjC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,UAAU;EACT,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,QAAQ,QAAQ;GACxB,MAAM;IAAE,OAAO;IAAM,QAAQ;IAAM;GACnC,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,QAAQ;EACP,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,EACD;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,gBAAgB;EACf,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;GACP;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,OAAO;IACf,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;IACC,IAAI;IACJ,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO,CAAC,QAAQ,QAAQ;IACxB,MAAM;KAAE,OAAO;KAAG,QAAQ;KAAG;IAC7B,eAAe;IACf,WAAW;IACX;GACD;EACD;CACD,UAAU;EACT,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD,MAAM;EACL,SAAS;EACT,KAAK;EACL,MAAM;EACN,QAAQ,CACP;GACC,IAAI;GACJ,MAAM;GACN,KAAK;GACL,WAAW;GACX,OAAO,CAAC,OAAO;GACf,MAAM;IAAE,OAAO;IAAG,QAAQ;IAAG;GAC7B,eAAe;GACf,WAAW;GACX,CACD;EACD;CACD;;AAGD,MAAM,uBAA+C;CACpD,QAAQ;CACR,UAAU;CACV,MAAM;CACN;;;;;AAMD,SAAgB,uBACf,UACA,SACS;CACT,MAAM,WAAW,QAAQ,mBAAmB;CAE5C,MAAM,qBAAqB,WAAW,yBAAyB;CAG/D,MAAM,cAAc,WAAW,QAAQ;CACvC,MAAM,gBAAsD,EAAE;AAG9D,MAAK,MAAM,EAAE,gBAAgB,SAAS,SACrC,MAAK,MAAM,SAAS,WAAW,OAC9B,KAAI,MAAM,YACT,eAAc,MAAM,WAAW,EAAE,SAAS,MAAM;CAKnD,MAAM,YAAiC,EAAE;CACzC,MAAM,eAAkD,EAAE;CAC1D,IAAI,eAAe;CAGnB,MAAM,oBACL,SAAS,eAAe,SAAS,YAAY,SAAS,IACnD,SAAS,cACR,CAAC,SAAS;AAEf,MAAK,MAAM,YAAY,mBAAmB;EACzC,MAAM,OAAO,iBAAiB;AAC9B,MAAI,CAAC,KAAM;AAMX,YAAU,YAAY;GACrB,SAHA,KAAK,WAAW,UAAU,mBAAmB,GAAG,qBAAqB,aAAa,IAAK;GAIvF,KAAK,KAAK;GACV,MAAM,KAAK;GACX,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE;GAC9C,QAAQ,KAAK;GACb;AAED,OAAK,MAAM,KAAK,KAAK,QAAQ;GAC5B,MAAM,SAAS,GAAG,SAAS,GAAG,EAAE;AAChC,gBAAa,UAAU,EAAE,OAAO,EAAE,MAAM;AACxC,OAAI,CAAC,aAAc,gBAAe;;;CAIpC,MAAM,eAAoC,EACzC,iBAAiB;EAChB,UAAU;EACV,MAAM;EACN,EACD;AAGD,MAAK,MAAM,YAAY,OAAO,KAAK,UAAU,CAC5C,cAAa,GAAG,SAAS,aAAa;EAC3B;EACV,MAAM;EACN;CAGF,MAAM,SAAS;EACd,MAAM;GACL,oBAAoB,QAAQ;GAC5B,gCAAe,IAAI,MAAM,EAAC,aAAa;GACvC;EACD,KAAK;GACJ,UAAU,EACT,SAAS,MACT;GACD,MAAM,EAAE;GACR;EACD,QAAQ;GACP,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,gBAAgB,QAAQ;GACxB,gBAAgB;GAChB,aAAa;GACb;EACD,SAAS,EACR,iBAAiB,SACjB;EACD,QAAQ,EACP,cAAc,MACd;EACD,MAAM,EACL,UAAU,cACV;EACD,QAAQ;GACP,MAAM;GACN;GACA;EACD,QAAQ,EACP,UAAU;GACT,OAAO,EACN,SAAS,cACT;GACD,QAAQ;GACR,WAAW,WAAW,mCAAmC;GACzD,YAAY,EAAE,MAAM,aAAa;GACjC,eAAe;GACf,WAAW;IACV,eAAe;IAEf,aAAa,CAAC,IAAI;IAClB;GAED,GAAI,WACD,EACA,SAAS;IACR,QAAQ;KACP,iBAAiB;KACjB,SAAS;KACT,cAAc;KACd,SAAS;KACT,SAAS,CAAC,MAAM;KAChB,WAAW;KACX,QAAQ;KACR;IACD,SAAS;KACR,SAAS;KACT,WAAW;KACX;IACD,EACD,GACA,EAAE;GACL,EACD;EACD,UAAU,EACT,kBAAkB,kBAClB;EACD,UAAU;GACT,QAAQ;GACR,cAAc;GACd;EACD,MAAM,EACL,SAAS,MACT;EACD,OAAO,EACN,UAAU;GACT,SAAS;GACT,SAAS;IACR,WAAW,EAAE,SAAS,MAAM;IAC5B,yBAAyB,EAAE,SAAS,MAAM;IAC1C,kBAAkB,EAAE,SAAS,MAAM;IACnC,kBAAkB,EAAE,SAAS,MAAM;IACnC;GACD,EACD;EACD,KAAK,EACJ,SAAS,MACT;EACD,WAAW;GACV,UAAU,EACT,SAAS,MACT;GAGD,MAAM,EACL,MAAM,WAAW,QAAQ,WACzB;GACD;EACD,YAAY;GACX,SAAS;GACT,YAAY;GACZ;EACD,UAAU,EAAE;EAEZ,UAAU,EACT,cAAc,EACb,SAAS,MACT,EACD;EACD,SAAS;GACR,MAAM,QAAQ;GACd,MAAM;GACN,MAAM;GACN,WAAW;IACV,SAAS;IAET,GAAI,WAAW,EAAE,mBAAmB,MAAM,GAAG,EAAE;IAG/C,GAAI,gBAAgB,aACjB,EAAE,gBAAgB,CAAC,oBAAoB,QAAQ,cAAc,EAAE,GAC/D,EAAE;IACL;GACD,MAAM;IACL,MAAM;IACN,OAAO;IACP,GAAI,WAAW,EAAE,GAAG,EAAE,gBAAgB,MAAM;IAC5C;GAED,GAAI,WAAW,EAAE,GAAG,EAAE,WAAW;IAAE,MAAM;IAAS,aAAa;IAAM,EAAE;GACvE,QAAQ,EACP,MAAM,UACN;GACD,MAAM,EACL,WAAW;IACV,iBAAiB,EAAE,SAAS,OAAO;IACnC,WAAW,EAAE,SAAS,OAAO;IAC7B,EACD;GACD,OAAO;IACN,SAAS,EAER,MAAM,QACN;IAED,eAAe,EAAE;IACjB,cAAc;KAAC;KAAe;KAAe;KAAgB;IAC7D;GAID,QAAQ,EAEP,WAAW,UAKX;GACD,2BAA2B;GAC3B;EACD,SAAS;GACR,SAAS;GAET,GAAI,WAAW,EAAE,GAAG,EAAE,eAAe,aAAa;GAClD;EACD,QAAQ;GACP,SAAS,EAAE,aAAa,QAAQ;GAChC,MAAM,EACL,OAAO,MACP;GACD,GAAI,OAAO,KAAK,cAAc,CAAC,SAAS,IAAI,EAAE,SAAS,eAAe,GAAG,EAAE;GAC3E;EAGD,KAAK;GACJ,SAAS;GACT,UAAU,EAAE,SAAS,OAAO;GAC5B,uBAAuB;GACvB,QAAQ;IACP,cAAc;IACd,mBAAmB;IACnB;GACD,SAAS,EACR,YAAY,IACZ;GACD;EAED,OAAO;GACN,KAAK;IACJ,QAAQ;KAEP,SAAS;KACT,UAAU;KACV,YAAY;KACZ,gBAAgB;KAChB,iBAAiB;KACjB;IACD,OAAO;KACN,SAAS;KACT,UAAU;KACV,gBAAgB;KAChB,iBAAiB;KACjB,aAAa;KACb;IACD;GACD,MAAM;IAEL,MAAM,WAAW,YAAY;IAC7B,UAAU;IACV,KAAK;IACL,cAAc;IACd,YAAY;IACZ;GAED,IAAI,EAEH,eAAe,CAAC,UAChB;GAED,eAAe;IACd,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,mBAAmB;IACnB,+BAA+B;IAC/B;GACD,UAAU,EACT,YAAY,QACZ;GAGD,cAAc;IACb,SAAS;IAET,OAAO,CAAC,IAAI;IACZ;GACD;EAED,SAAS,EACR,cAAc,EAEb,kBAAkB,GAClB,EACD;EAED,QAAQ;GACP,SAAS;GACT,WAAW;GACX;EAED,IAAI,EACH,WAAW,EACV,MAAM,YACN,EACD;EAED,OAAO;GACN,mBAAmB;GACnB,UAAU;GACV;EACD,SAAS;GACR,SAAS;GACT,SAAS;IACR,UAAU,EAAE,SAAS,MAAM;IAC3B,UAAU,EAAE,SAAS,MAAM;IAC3B,SAAS,EAAE,SAAS,MAAM;IAC1B,eAAe,EAAE,SAAS,MAAM;IAChC;GACD;EACD;AAED,QAAO,KAAK,UAAU,QAAQ,MAAM,EAAE"}
@@ -275,7 +275,8 @@ ${warningList}
275
275
  }
276
276
  sections.push(`---
277
277
 
278
- Generated by [OpenClaw](https://openclaw.dev) • ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}
278
+ Generated by [better-openclaw](https://better-openclaw.dev) • ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}
279
+ Deploy without managing servers: [Clawexa Cloud](https://clawexa.net)
279
280
  `);
280
281
  return sections.join("\n");
281
282
  }
@@ -1 +1 @@
1
- {"version":3,"file":"readme.cjs","names":[],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod } =\n\t\toptions;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? \" OpenClaw itself runs directly on the host (not in Docker).\" : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? \"\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack.\" : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f openclaw-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Based on openclaw_docker-setup.sh post-deploy instructions\n\n\tif (isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [OpenClaw](https://openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"readme.cjs","names":[],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod } =\n\t\toptions;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? \" OpenClaw itself runs directly on the host (not in Docker).\" : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? \"\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack.\" : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f openclaw-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Based on openclaw_docker-setup.sh post-deploy instructions\n\n\tif (isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [better-openclaw](https://better-openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\nDeploy without managing servers: [Clawexa Cloud](https://clawexa.net)\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -274,7 +274,8 @@ ${warningList}
274
274
  }
275
275
  sections.push(`---
276
276
 
277
- Generated by [OpenClaw](https://openclaw.dev) • ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}
277
+ Generated by [better-openclaw](https://better-openclaw.dev) • ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}
278
+ Deploy without managing servers: [Clawexa Cloud](https://clawexa.net)
278
279
  `);
279
280
  return sections.join("\n");
280
281
  }
@@ -1 +1 @@
1
- {"version":3,"file":"readme.mjs","names":[],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod } =\n\t\toptions;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? \" OpenClaw itself runs directly on the host (not in Docker).\" : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? \"\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack.\" : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f openclaw-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Based on openclaw_docker-setup.sh post-deploy instructions\n\n\tif (isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [OpenClaw](https://openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"readme.mjs","names":[],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod } =\n\t\toptions;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? \" OpenClaw itself runs directly on the host (not in Docker).\" : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? \"\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack.\" : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f openclaw-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Based on openclaw_docker-setup.sh post-deploy instructions\n\n\tif (isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [better-openclaw](https://better-openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\nDeploy without managing servers: [Clawexa Cloud](https://clawexa.net)\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as ServiceDefinitionSchema, C as PresetSchema, D as ResourceLimitsSchema, E as ResolverOutputSchema, F as VolumeMappingSchema, I as WarningSchema, M as SkillPackSchema, N as ValidateRequestSchema, O as RestartPolicySchema, P as ValidateResponseSchema, S as PortMappingSchema, T as ResolvedServiceSchema, _ as NativeRecipeSchema, b as OutputFormatSchema, c as DeploymentTargetSchema, d as ErrorSchema, f as GenerationInputSchema, g as NativePlatformSchema, h as MaturitySchema, i as ComposeOptionsSchema, j as SkillBindingSchema, k as ServiceCategorySchema, l as DeploymentTypeSchema, m as HealthCheckSchema, o as DeploySchema, r as ApiErrorSchema, s as DeployTargetSchema, t as AddedDependencySchema, u as EnvVariableSchema, v as OpenclawImageVariantSchema, w as ProxyTypeSchema, x as PlatformSchema, y as OpenclawInstallMethodSchema } from "./schema-C_hc7e4k.cjs";
1
+ import { A as ServiceDefinitionSchema, C as PresetSchema, D as ResourceLimitsSchema, E as ResolverOutputSchema, F as VolumeMappingSchema, I as WarningSchema, M as SkillPackSchema, N as ValidateRequestSchema, O as RestartPolicySchema, P as ValidateResponseSchema, S as PortMappingSchema, T as ResolvedServiceSchema, _ as NativeRecipeSchema, b as OutputFormatSchema, c as DeploymentTargetSchema, d as ErrorSchema, f as GenerationInputSchema, g as NativePlatformSchema, h as MaturitySchema, i as ComposeOptionsSchema, j as SkillBindingSchema, k as ServiceCategorySchema, l as DeploymentTypeSchema, m as HealthCheckSchema, o as DeploySchema, r as ApiErrorSchema, s as DeployTargetSchema, t as AddedDependencySchema, u as EnvVariableSchema, v as OpenclawImageVariantSchema, w as ProxyTypeSchema, x as PlatformSchema, y as OpenclawInstallMethodSchema } from "./schema-B4c64P8N.cjs";
2
2
  import { AddedDependency, AiProvider, ApiError, CategoryInfo, ComposeOptions, Deploy, DeployTarget, DeploymentTarget, DeploymentType, EnvVariable, GeneratedFiles, GenerationInput, GenerationMetadata, GenerationResult, GsdRuntime, HealthCheck, Maturity, NativePlatform, NativeRecipe, OpenclawImageVariant, OpenclawInstallMethod, OutputFormat, Platform, PortMapping, Preset, ProxyType, ResolvedService, ResolverError, ResolverInput, ResolverOutput, ResourceLimits, RestartPolicy, SERVICE_CATEGORIES, ServiceCategory, ServiceDefinition, SkillBinding, SkillPack, ValidateRequest, ValidateResponse, VolumeMapping, Warning } from "./types.cjs";
3
3
  import { partitionBareMetal, platformToNativePlatform, resolvedWithOnlyServices } from "./bare-metal-partition.cjs";
4
4
  import { ComposeResult, compose, composeMultiFile } from "./composer.cjs";
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as ServiceDefinitionSchema, C as PresetSchema, D as ResourceLimitsSchema, E as ResolverOutputSchema, F as VolumeMappingSchema, I as WarningSchema, M as SkillPackSchema, N as ValidateRequestSchema, O as RestartPolicySchema, P as ValidateResponseSchema, S as PortMappingSchema, T as ResolvedServiceSchema, _ as NativeRecipeSchema, b as OutputFormatSchema, c as DeploymentTargetSchema, d as ErrorSchema, f as GenerationInputSchema, g as NativePlatformSchema, h as MaturitySchema, i as ComposeOptionsSchema, j as SkillBindingSchema, k as ServiceCategorySchema, l as DeploymentTypeSchema, m as HealthCheckSchema, o as DeploySchema, r as ApiErrorSchema, s as DeployTargetSchema, t as AddedDependencySchema, u as EnvVariableSchema, v as OpenclawImageVariantSchema, w as ProxyTypeSchema, x as PlatformSchema, y as OpenclawInstallMethodSchema } from "./schema-CaesJaS2.mjs";
1
+ import { A as ServiceDefinitionSchema, C as PresetSchema, D as ResourceLimitsSchema, E as ResolverOutputSchema, F as VolumeMappingSchema, I as WarningSchema, M as SkillPackSchema, N as ValidateRequestSchema, O as RestartPolicySchema, P as ValidateResponseSchema, S as PortMappingSchema, T as ResolvedServiceSchema, _ as NativeRecipeSchema, b as OutputFormatSchema, c as DeploymentTargetSchema, d as ErrorSchema, f as GenerationInputSchema, g as NativePlatformSchema, h as MaturitySchema, i as ComposeOptionsSchema, j as SkillBindingSchema, k as ServiceCategorySchema, l as DeploymentTypeSchema, m as HealthCheckSchema, o as DeploySchema, r as ApiErrorSchema, s as DeployTargetSchema, t as AddedDependencySchema, u as EnvVariableSchema, v as OpenclawImageVariantSchema, w as ProxyTypeSchema, x as PlatformSchema, y as OpenclawInstallMethodSchema } from "./schema-CXNhYci1.mjs";
2
2
  import { AddedDependency, AiProvider, ApiError, CategoryInfo, ComposeOptions, Deploy, DeployTarget, DeploymentTarget, DeploymentType, EnvVariable, GeneratedFiles, GenerationInput, GenerationMetadata, GenerationResult, GsdRuntime, HealthCheck, Maturity, NativePlatform, NativeRecipe, OpenclawImageVariant, OpenclawInstallMethod, OutputFormat, Platform, PortMapping, Preset, ProxyType, ResolvedService, ResolverError, ResolverInput, ResolverOutput, ResourceLimits, RestartPolicy, SERVICE_CATEGORIES, ServiceCategory, ServiceDefinition, SkillBinding, SkillPack, ValidateRequest, ValidateResponse, VolumeMapping, Warning } from "./types.mjs";
3
3
  import { partitionBareMetal, platformToNativePlatform, resolvedWithOnlyServices } from "./bare-metal-partition.mjs";
4
4
  import { ComposeResult, compose, composeMultiFile } from "./composer.mjs";
@@ -138,6 +138,25 @@ const presets = [
138
138
  skillPacks: ["ai-playground"],
139
139
  estimatedMemoryMB: 4096
140
140
  },
141
+ {
142
+ id: "ai-virtual-desktop",
143
+ name: "AI Virtual Desktop",
144
+ description: "Self-hosted autonomous AI agent with local LLM, vector memory, web search, browser automation, and workflow orchestration. The open-source alternative to Manus and Perplexity Computer.",
145
+ services: [
146
+ "ollama",
147
+ "qdrant",
148
+ "postgresql",
149
+ "redis",
150
+ "minio",
151
+ "n8n",
152
+ "browserless",
153
+ "open-webui",
154
+ "searxng",
155
+ "caddy"
156
+ ],
157
+ skillPacks: ["research-agent", "dev-ops"],
158
+ estimatedMemoryMB: 6144
159
+ },
141
160
  {
142
161
  id: "coding-team",
143
162
  name: "Coding Team",
@@ -1 +1 @@
1
- {"version":3,"file":"registry.cjs","names":[],"sources":["../../src/presets/registry.ts"],"sourcesContent":["import type { Preset } from \"../types.js\";\n\nconst presets: Preset[] = [\n\t{\n\t\tid: \"minimal\",\n\t\tname: \"Minimal\",\n\t\tdescription: \"OpenClaw + Redis for caching and session management\",\n\t\tservices: [\"redis\", \"caddy\"],\n\t\tskillPacks: [],\n\t\testimatedMemoryMB: 1024,\n\t},\n\t{\n\t\tid: \"creator\",\n\t\tname: \"Creator\",\n\t\tdescription: \"Full media creation stack with FFmpeg, Remotion, and MinIO storage\",\n\t\tservices: [\"ffmpeg\", \"remotion\", \"minio\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"video-creator\"],\n\t\testimatedMemoryMB: 2048,\n\t},\n\t{\n\t\tid: \"researcher\",\n\t\tname: \"Researcher\",\n\t\tdescription: \"Research agent with vector search, web scraping, and meta search\",\n\t\tservices: [\"qdrant\", \"searxng\", \"browserless\", \"redis\", \"caddy\", \"postgresql\"],\n\t\tskillPacks: [\"research-agent\"],\n\t\testimatedMemoryMB: 2560,\n\t},\n\t{\n\t\tid: \"devops\",\n\t\tname: \"DevOps\",\n\t\tdescription: \"Full monitoring and automation stack with n8n, Grafana, and Uptime Kuma\",\n\t\tservices: [\"n8n\", \"postgresql\", \"redis\", \"uptime-kuma\", \"grafana\", \"prometheus\", \"caddy\"],\n\t\tskillPacks: [\"dev-ops\"],\n\t\testimatedMemoryMB: 3072,\n\t},\n\t{\n\t\tid: \"full\",\n\t\tname: \"Full Stack\",\n\t\tdescription: \"Everything enabled — all services and skill packs\",\n\t\tservices: [\n\t\t\t\"redis\",\n\t\t\t\"postgresql\",\n\t\t\t\"qdrant\",\n\t\t\t\"n8n\",\n\t\t\t\"ffmpeg\",\n\t\t\t\"remotion\",\n\t\t\t\"minio\",\n\t\t\t\"caddy\",\n\t\t\t\"browserless\",\n\t\t\t\"searxng\",\n\t\t\t\"meilisearch\",\n\t\t\t\"uptime-kuma\",\n\t\t\t\"grafana\",\n\t\t\t\"prometheus\",\n\t\t\t\"ollama\",\n\t\t\t\"whisper\",\n\t\t\t\"gotify\",\n\t\t],\n\t\tskillPacks: [\n\t\t\t\"video-creator\",\n\t\t\t\"research-agent\",\n\t\t\t\"social-media\",\n\t\t\t\"dev-ops\",\n\t\t\t\"knowledge-base\",\n\t\t\t\"local-ai\",\n\t\t],\n\t\testimatedMemoryMB: 8192,\n\t},\n\t{\n\t\tid: \"content-creator\",\n\t\tname: \"Content Creator\",\n\t\tdescription: \"Social media scheduling with Postiz, media processing, and analytics\",\n\t\tservices: [\"postiz\", \"ffmpeg\", \"minio\", \"redis\", \"postgresql\", \"umami\", \"caddy\"],\n\t\tskillPacks: [\"content-creator\"],\n\t\testimatedMemoryMB: 2048,\n\t},\n\t{\n\t\tid: \"ai-playground\",\n\t\tname: \"AI Playground\",\n\t\tdescription: \"Local AI stack with Ollama, Open WebUI, LiteLLM gateway, and document chat\",\n\t\tservices: [\"ollama\", \"open-webui\", \"litellm\", \"anything-llm\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"ai-playground\"],\n\t\testimatedMemoryMB: 4096,\n\t},\n\t{\n\t\tid: \"ai-powerhouse\",\n\t\tname: \"AI Powerhouse\",\n\t\tdescription: \"Local AI stack with Ollama, Open WebUI, LiteLLM gateway, and document chat\",\n\t\tservices: [\n\t\t\t\"ollama\",\n\t\t\t\"redis\",\n\t\t\t\"qdrant\",\n\t\t\t\"minio\",\n\t\t\t\"litellm\",\n\t\t\t\"anything-llm\",\n\t\t\t\"n8n\",\n\t\t\t\"postgresql\",\n\t\t\t\"caddy\",\n\t\t\t\"open-webui\",\n\t\t\t\"searxng\",\n\t\t],\n\t\tskillPacks: [\"ai-playground\"],\n\t\testimatedMemoryMB: 4096,\n\t},\n\t{\n\t\tid: \"coding-team\",\n\t\tname: \"Coding Team\",\n\t\tdescription: \"AI development environment with coding agents, Git, and browser IDE\",\n\t\tservices: [\"claude-code\", \"opencode\", \"gitea\", \"code-server\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"coding-team\"],\n\t\testimatedMemoryMB: 2560,\n\t},\n\t{\n\t\tid: \"lasuite-meet\",\n\t\tname: \"La Suite Meet\",\n\t\tdescription: \"Open-source video conferencing from La Suite numérique (Django + LiveKit)\",\n\t\tservices: [\n\t\t\t\"postgresql\",\n\t\t\t\"redis\",\n\t\t\t\"livekit\",\n\t\t\t\"lasuite-meet-backend\",\n\t\t\t\"lasuite-meet-frontend\",\n\t\t\t\"lasuite-meet-agents\",\n\t\t\t\"whisper\",\n\t\t\t\"ollama\",\n\t\t\t\"caddy\",\n\t\t],\n\t\tskillPacks: [],\n\t\testimatedMemoryMB: 2048,\n\t},\n\t// ── New service presets ─────────────────────────────────────────────────\n\t{\n\t\tid: \"backend-platform\",\n\t\tname: \"Backend Platform\",\n\t\tdescription:\n\t\t\t\"BaaS stack with Appwrite, MariaDB, Redis, RabbitMQ for auth, storage, and async workflows\",\n\t\tservices: [\"appwrite\", \"mariadb\", \"redis\", \"rabbitmq\", \"caddy\"],\n\t\tskillPacks: [\"appwrite-platform\"],\n\t\testimatedMemoryMB: 3072,\n\t},\n\t{\n\t\tid: \"rag-platform\",\n\t\tname: \"RAG Platform\",\n\t\tdescription:\n\t\t\t\"RAGFlow with MySQL, Redis, MinIO, OpenSearch for knowledge ingestion and grounded AI assistants\",\n\t\tservices: [\"ragflow\", \"mysql\", \"redis\", \"minio\", \"opensearch\", \"caddy\"],\n\t\tskillPacks: [\"ragflow-platform\"],\n\t\testimatedMemoryMB: 6144,\n\t},\n\t{\n\t\tid: \"zero-trust\",\n\t\tname: \"Zero-Trust Security\",\n\t\tdescription:\n\t\t\t\"SSO, secrets management, and access control with Authelia, Keycloak, and Infisical\",\n\t\tservices: [\"authelia\", \"keycloak\", \"infisical\", \"postgresql\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"authelia-security\"],\n\t\testimatedMemoryMB: 3584,\n\t},\n\t{\n\t\tid: \"content-platform\",\n\t\tname: \"Content Platform\",\n\t\tdescription: \"CMS and newsletter stack with Directus, Strapi, Listmonk, and Stirling PDF\",\n\t\tservices: [\"directus\", \"strapi\", \"listmonk\", \"postgresql\", \"redis\", \"stirling-pdf\", \"caddy\"],\n\t\tskillPacks: [\"cms-stack\"],\n\t\testimatedMemoryMB: 3584,\n\t},\n\t{\n\t\tid: \"ai-orchestrator\",\n\t\tname: \"AI Orchestrator\",\n\t\tdescription: \"Langflow and Firecrawl for building and deploying AI workflows\",\n\t\tservices: [\"langflow\", \"firecrawl\", \"postgresql\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"ai-agent-orchestra\"],\n\t\testimatedMemoryMB: 3072,\n\t},\n\t// ── New Presets (from feature analysis) ───────────────────────────────────\n\t{\n\t\tid: \"support-desk\",\n\t\tname: \"Support Desk\",\n\t\tdescription:\n\t\t\t\"AI-powered customer support with live chat, LLM observability, and ticket management\",\n\t\tservices: [\"chatwoot\", \"chatwoot-worker\", \"langfuse\", \"redis\", \"postgresql\", \"caddy\"],\n\t\tskillPacks: [\"customer-support\"],\n\t\testimatedMemoryMB: 3072,\n\t},\n\t{\n\t\tid: \"sales-machine\",\n\t\tname: \"Sales Machine\",\n\t\tdescription:\n\t\t\t\"CRM-driven sales pipeline with email marketing, newsletters, and workflow automation\",\n\t\tservices: [\"twenty\", \"mautic\", \"listmonk\", \"n8n\", \"postgresql\", \"mysql\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"sales-pipeline\"],\n\t\testimatedMemoryMB: 4096,\n\t},\n\t{\n\t\tid: \"data-warehouse\",\n\t\tname: \"Data Warehouse\",\n\t\tdescription: \"End-to-end data pipeline with DAG orchestration, 300+ connectors, and monitoring\",\n\t\tservices: [\"airflow\", \"airbyte\", \"postgresql\", \"grafana\", \"prometheus\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"data-pipeline\"],\n\t\testimatedMemoryMB: 4096,\n\t},\n\t{\n\t\tid: \"voice-center\",\n\t\tname: \"Voice Center\",\n\t\tdescription:\n\t\t\t\"AI voice agent stack with programmable telephony, transcription, and real-time comms\",\n\t\tservices: [\"fonoster\", \"livekit\", \"whisper\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"voice-agent\"],\n\t\testimatedMemoryMB: 3072,\n\t},\n\t{\n\t\tid: \"shopfront\",\n\t\tname: \"Shopfront\",\n\t\tdescription: \"AI-managed headless e-commerce with product management and object storage\",\n\t\tservices: [\"medusa\", \"minio\", \"postgresql\", \"redis\", \"caddy\"],\n\t\tskillPacks: [\"ecommerce-ops\"],\n\t\testimatedMemoryMB: 2560,\n\t},\n];\n\nconst presetMap = new Map<string, Preset>();\nfor (const preset of presets) {\n\tif (presetMap.has(preset.id)) {\n\t\tthrow new Error(`Duplicate preset ID: \"${preset.id}\"`);\n\t}\n\tpresetMap.set(preset.id, preset);\n}\n\nexport const presetRegistry: ReadonlyMap<string, Preset> = presetMap;\n\nexport function getPresetById(id: string): Preset | undefined {\n\treturn presetMap.get(id);\n}\n\nexport function getAllPresets(): Preset[] {\n\treturn [...presets];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.cjs","names":[],"sources":["../../src/presets/registry.ts"],"sourcesContent":["import type { Preset } from \"../types.js\";\n\nconst presets: Preset[] = [\n {\n id: \"minimal\",\n name: \"Minimal\",\n description: \"OpenClaw + Redis for caching and session management\",\n services: [\"redis\", \"caddy\"],\n skillPacks: [],\n estimatedMemoryMB: 1024,\n },\n {\n id: \"creator\",\n name: \"Creator\",\n description:\n \"Full media creation stack with FFmpeg, Remotion, and MinIO storage\",\n services: [\"ffmpeg\", \"remotion\", \"minio\", \"redis\", \"caddy\"],\n skillPacks: [\"video-creator\"],\n estimatedMemoryMB: 2048,\n },\n {\n id: \"researcher\",\n name: \"Researcher\",\n description:\n \"Research agent with vector search, web scraping, and meta search\",\n services: [\n \"qdrant\",\n \"searxng\",\n \"browserless\",\n \"redis\",\n \"caddy\",\n \"postgresql\",\n ],\n skillPacks: [\"research-agent\"],\n estimatedMemoryMB: 2560,\n },\n {\n id: \"devops\",\n name: \"DevOps\",\n description:\n \"Full monitoring and automation stack with n8n, Grafana, and Uptime Kuma\",\n services: [\n \"n8n\",\n \"postgresql\",\n \"redis\",\n \"uptime-kuma\",\n \"grafana\",\n \"prometheus\",\n \"caddy\",\n ],\n skillPacks: [\"dev-ops\"],\n estimatedMemoryMB: 3072,\n },\n {\n id: \"full\",\n name: \"Full Stack\",\n description: \"Everything enabled — all services and skill packs\",\n services: [\n \"redis\",\n \"postgresql\",\n \"qdrant\",\n \"n8n\",\n \"ffmpeg\",\n \"remotion\",\n \"minio\",\n \"caddy\",\n \"browserless\",\n \"searxng\",\n \"meilisearch\",\n \"uptime-kuma\",\n \"grafana\",\n \"prometheus\",\n \"ollama\",\n \"whisper\",\n \"gotify\",\n ],\n skillPacks: [\n \"video-creator\",\n \"research-agent\",\n \"social-media\",\n \"dev-ops\",\n \"knowledge-base\",\n \"local-ai\",\n ],\n estimatedMemoryMB: 8192,\n },\n {\n id: \"content-creator\",\n name: \"Content Creator\",\n description:\n \"Social media scheduling with Postiz, media processing, and analytics\",\n services: [\n \"postiz\",\n \"ffmpeg\",\n \"minio\",\n \"redis\",\n \"postgresql\",\n \"umami\",\n \"caddy\",\n ],\n skillPacks: [\"content-creator\"],\n estimatedMemoryMB: 2048,\n },\n {\n id: \"ai-playground\",\n name: \"AI Playground\",\n description:\n \"Local AI stack with Ollama, Open WebUI, LiteLLM gateway, and document chat\",\n services: [\n \"ollama\",\n \"open-webui\",\n \"litellm\",\n \"anything-llm\",\n \"redis\",\n \"caddy\",\n ],\n skillPacks: [\"ai-playground\"],\n estimatedMemoryMB: 4096,\n },\n {\n id: \"ai-powerhouse\",\n name: \"AI Powerhouse\",\n description:\n \"Local AI stack with Ollama, Open WebUI, LiteLLM gateway, and document chat\",\n services: [\n \"ollama\",\n \"redis\",\n \"qdrant\",\n \"minio\",\n \"litellm\",\n \"anything-llm\",\n \"n8n\",\n \"postgresql\",\n \"caddy\",\n \"open-webui\",\n \"searxng\",\n ],\n skillPacks: [\"ai-playground\"],\n estimatedMemoryMB: 4096,\n },\n {\n id: \"ai-virtual-desktop\",\n name: \"AI Virtual Desktop\",\n description:\n \"Self-hosted autonomous AI agent with local LLM, vector memory, web search, browser automation, and workflow orchestration. The open-source alternative to Manus and Perplexity Computer.\",\n services: [\n \"ollama\",\n \"qdrant\",\n \"postgresql\",\n \"redis\",\n \"minio\",\n \"n8n\",\n \"browserless\",\n \"open-webui\",\n \"searxng\",\n \"caddy\",\n ],\n skillPacks: [\"research-agent\", \"dev-ops\"],\n estimatedMemoryMB: 6144,\n },\n {\n id: \"coding-team\",\n name: \"Coding Team\",\n description:\n \"AI development environment with coding agents, Git, and browser IDE\",\n services: [\n \"claude-code\",\n \"opencode\",\n \"gitea\",\n \"code-server\",\n \"redis\",\n \"caddy\",\n ],\n skillPacks: [\"coding-team\"],\n estimatedMemoryMB: 2560,\n },\n {\n id: \"lasuite-meet\",\n name: \"La Suite Meet\",\n description:\n \"Open-source video conferencing from La Suite numérique (Django + LiveKit)\",\n services: [\n \"postgresql\",\n \"redis\",\n \"livekit\",\n \"lasuite-meet-backend\",\n \"lasuite-meet-frontend\",\n \"lasuite-meet-agents\",\n \"whisper\",\n \"ollama\",\n \"caddy\",\n ],\n skillPacks: [],\n estimatedMemoryMB: 2048,\n },\n // ── New service presets ─────────────────────────────────────────────────\n {\n id: \"backend-platform\",\n name: \"Backend Platform\",\n description:\n \"BaaS stack with Appwrite, MariaDB, Redis, RabbitMQ for auth, storage, and async workflows\",\n services: [\"appwrite\", \"mariadb\", \"redis\", \"rabbitmq\", \"caddy\"],\n skillPacks: [\"appwrite-platform\"],\n estimatedMemoryMB: 3072,\n },\n {\n id: \"rag-platform\",\n name: \"RAG Platform\",\n description:\n \"RAGFlow with MySQL, Redis, MinIO, OpenSearch for knowledge ingestion and grounded AI assistants\",\n services: [\"ragflow\", \"mysql\", \"redis\", \"minio\", \"opensearch\", \"caddy\"],\n skillPacks: [\"ragflow-platform\"],\n estimatedMemoryMB: 6144,\n },\n {\n id: \"zero-trust\",\n name: \"Zero-Trust Security\",\n description:\n \"SSO, secrets management, and access control with Authelia, Keycloak, and Infisical\",\n services: [\n \"authelia\",\n \"keycloak\",\n \"infisical\",\n \"postgresql\",\n \"redis\",\n \"caddy\",\n ],\n skillPacks: [\"authelia-security\"],\n estimatedMemoryMB: 3584,\n },\n {\n id: \"content-platform\",\n name: \"Content Platform\",\n description:\n \"CMS and newsletter stack with Directus, Strapi, Listmonk, and Stirling PDF\",\n services: [\n \"directus\",\n \"strapi\",\n \"listmonk\",\n \"postgresql\",\n \"redis\",\n \"stirling-pdf\",\n \"caddy\",\n ],\n skillPacks: [\"cms-stack\"],\n estimatedMemoryMB: 3584,\n },\n {\n id: \"ai-orchestrator\",\n name: \"AI Orchestrator\",\n description:\n \"Langflow and Firecrawl for building and deploying AI workflows\",\n services: [\"langflow\", \"firecrawl\", \"postgresql\", \"redis\", \"caddy\"],\n skillPacks: [\"ai-agent-orchestra\"],\n estimatedMemoryMB: 3072,\n },\n // ── New Presets (from feature analysis) ───────────────────────────────────\n {\n id: \"support-desk\",\n name: \"Support Desk\",\n description:\n \"AI-powered customer support with live chat, LLM observability, and ticket management\",\n services: [\n \"chatwoot\",\n \"chatwoot-worker\",\n \"langfuse\",\n \"redis\",\n \"postgresql\",\n \"caddy\",\n ],\n skillPacks: [\"customer-support\"],\n estimatedMemoryMB: 3072,\n },\n {\n id: \"sales-machine\",\n name: \"Sales Machine\",\n description:\n \"CRM-driven sales pipeline with email marketing, newsletters, and workflow automation\",\n services: [\n \"twenty\",\n \"mautic\",\n \"listmonk\",\n \"n8n\",\n \"postgresql\",\n \"mysql\",\n \"redis\",\n \"caddy\",\n ],\n skillPacks: [\"sales-pipeline\"],\n estimatedMemoryMB: 4096,\n },\n {\n id: \"data-warehouse\",\n name: \"Data Warehouse\",\n description:\n \"End-to-end data pipeline with DAG orchestration, 300+ connectors, and monitoring\",\n services: [\n \"airflow\",\n \"airbyte\",\n \"postgresql\",\n \"grafana\",\n \"prometheus\",\n \"redis\",\n \"caddy\",\n ],\n skillPacks: [\"data-pipeline\"],\n estimatedMemoryMB: 4096,\n },\n {\n id: \"voice-center\",\n name: \"Voice Center\",\n description:\n \"AI voice agent stack with programmable telephony, transcription, and real-time comms\",\n services: [\"fonoster\", \"livekit\", \"whisper\", \"redis\", \"caddy\"],\n skillPacks: [\"voice-agent\"],\n estimatedMemoryMB: 3072,\n },\n {\n id: \"shopfront\",\n name: \"Shopfront\",\n description:\n \"AI-managed headless e-commerce with product management and object storage\",\n services: [\"medusa\", \"minio\", \"postgresql\", \"redis\", \"caddy\"],\n skillPacks: [\"ecommerce-ops\"],\n estimatedMemoryMB: 2560,\n },\n];\n\nconst presetMap = new Map<string, Preset>();\nfor (const preset of presets) {\n if (presetMap.has(preset.id)) {\n throw new Error(`Duplicate preset ID: \"${preset.id}\"`);\n }\n presetMap.set(preset.id, preset);\n}\n\nexport const presetRegistry: ReadonlyMap<string, Preset> = presetMap;\n\nexport function getPresetById(id: string): Preset | undefined {\n return presetMap.get(id);\n}\n\nexport function getAllPresets(): Preset[] {\n return [...presets];\n}\n"],"mappings":";;AAEA,MAAM,UAAoB;CACxB;EACE,IAAI;EACJ,MAAM;EACN,aAAa;EACb,UAAU,CAAC,SAAS,QAAQ;EAC5B,YAAY,EAAE;EACd,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GAAC;GAAU;GAAY;GAAS;GAAS;GAAQ;EAC3D,YAAY,CAAC,gBAAgB;EAC7B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,iBAAiB;EAC9B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,UAAU;EACvB,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aAAa;EACb,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;GACV;GACA;GACA;GACA;GACA;GACA;GACD;EACD,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,kBAAkB;EAC/B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,gBAAgB;EAC7B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,gBAAgB;EAC7B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,kBAAkB,UAAU;EACzC,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,cAAc;EAC3B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,EAAE;EACd,mBAAmB;EACpB;CAED;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GAAC;GAAY;GAAW;GAAS;GAAY;GAAQ;EAC/D,YAAY,CAAC,oBAAoB;EACjC,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GAAC;GAAW;GAAS;GAAS;GAAS;GAAc;GAAQ;EACvE,YAAY,CAAC,mBAAmB;EAChC,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,oBAAoB;EACjC,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,YAAY;EACzB,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GAAC;GAAY;GAAa;GAAc;GAAS;GAAQ;EACnE,YAAY,CAAC,qBAAqB;EAClC,mBAAmB;EACpB;CAED;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,mBAAmB;EAChC,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,iBAAiB;EAC9B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CAAC,gBAAgB;EAC7B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GAAC;GAAY;GAAW;GAAW;GAAS;GAAQ;EAC9D,YAAY,CAAC,cAAc;EAC3B,mBAAmB;EACpB;CACD;EACE,IAAI;EACJ,MAAM;EACN,aACE;EACF,UAAU;GAAC;GAAU;GAAS;GAAc;GAAS;GAAQ;EAC7D,YAAY,CAAC,gBAAgB;EAC7B,mBAAmB;EACpB;CACF;AAED,MAAM,4BAAY,IAAI,KAAqB;AAC3C,KAAK,MAAM,UAAU,SAAS;AAC5B,KAAI,UAAU,IAAI,OAAO,GAAG,CAC1B,OAAM,IAAI,MAAM,yBAAyB,OAAO,GAAG,GAAG;AAExD,WAAU,IAAI,OAAO,IAAI,OAAO;;AAGlC,MAAa,iBAA8C;AAE3D,SAAgB,cAAc,IAAgC;AAC5D,QAAO,UAAU,IAAI,GAAG;;AAG1B,SAAgB,gBAA0B;AACxC,QAAO,CAAC,GAAG,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.cts","names":[],"sources":["../../src/presets/registry.ts"],"mappings":";;;cAoOa,cAAA,EAAgB,WAAA,SAAoB,MAAA;AAAA,iBAEjC,aAAA,CAAc,EAAA,WAAa,MAAA;AAAA,iBAI3B,aAAA,CAAA,GAAiB,MAAA"}
1
+ {"version":3,"file":"registry.d.cts","names":[],"sources":["../../src/presets/registry.ts"],"mappings":";;;cAgVa,cAAA,EAAgB,WAAA,SAAoB,MAAA;AAAA,iBAEjC,aAAA,CAAc,EAAA,WAAa,MAAA;AAAA,iBAI3B,aAAA,CAAA,GAAiB,MAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.mts","names":[],"sources":["../../src/presets/registry.ts"],"mappings":";;;cAoOa,cAAA,EAAgB,WAAA,SAAoB,MAAA;AAAA,iBAEjC,aAAA,CAAc,EAAA,WAAa,MAAA;AAAA,iBAI3B,aAAA,CAAA,GAAiB,MAAA"}
1
+ {"version":3,"file":"registry.d.mts","names":[],"sources":["../../src/presets/registry.ts"],"mappings":";;;cAgVa,cAAA,EAAgB,WAAA,SAAoB,MAAA;AAAA,iBAEjC,aAAA,CAAc,EAAA,WAAa,MAAA;AAAA,iBAI3B,aAAA,CAAA,GAAiB,MAAA"}
@@ -137,6 +137,25 @@ const presets = [
137
137
  skillPacks: ["ai-playground"],
138
138
  estimatedMemoryMB: 4096
139
139
  },
140
+ {
141
+ id: "ai-virtual-desktop",
142
+ name: "AI Virtual Desktop",
143
+ description: "Self-hosted autonomous AI agent with local LLM, vector memory, web search, browser automation, and workflow orchestration. The open-source alternative to Manus and Perplexity Computer.",
144
+ services: [
145
+ "ollama",
146
+ "qdrant",
147
+ "postgresql",
148
+ "redis",
149
+ "minio",
150
+ "n8n",
151
+ "browserless",
152
+ "open-webui",
153
+ "searxng",
154
+ "caddy"
155
+ ],
156
+ skillPacks: ["research-agent", "dev-ops"],
157
+ estimatedMemoryMB: 6144
158
+ },
140
159
  {
141
160
  id: "coding-team",
142
161
  name: "Coding Team",