@better-openclaw/core 1.0.16 → 1.0.18

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 (970) hide show
  1. package/README.md +27 -0
  2. package/dist/bare-metal-partition.cjs +53 -0
  3. package/dist/bare-metal-partition.cjs.map +1 -0
  4. package/dist/bare-metal-partition.d.cts +26 -0
  5. package/dist/bare-metal-partition.d.cts.map +1 -0
  6. package/dist/bare-metal-partition.test.cjs +57 -0
  7. package/dist/bare-metal-partition.test.cjs.map +1 -0
  8. package/dist/bare-metal-partition.test.d.cts +1 -0
  9. package/dist/bare-metal-partition.test.mjs +1 -1
  10. package/dist/chunk-C0xms8kb.cjs +34 -0
  11. package/dist/compose-validation.test.cjs +67 -0
  12. package/dist/compose-validation.test.cjs.map +1 -0
  13. package/dist/compose-validation.test.d.cts +1 -0
  14. package/dist/compose-validation.test.d.mts +1 -0
  15. package/dist/compose-validation.test.mjs +66 -0
  16. package/dist/compose-validation.test.mjs.map +1 -0
  17. package/dist/composer.cjs +462 -0
  18. package/dist/composer.cjs.map +1 -0
  19. package/dist/composer.d.cts +21 -0
  20. package/dist/composer.d.cts.map +1 -0
  21. package/dist/composer.d.mts.map +1 -1
  22. package/dist/composer.mjs +187 -27
  23. package/dist/composer.mjs.map +1 -1
  24. package/dist/composer.snapshot.test.cjs +91 -0
  25. package/dist/composer.snapshot.test.cjs.map +1 -0
  26. package/dist/composer.snapshot.test.d.cts +1 -0
  27. package/dist/composer.snapshot.test.mjs +1 -1
  28. package/dist/composer.test.cjs +166 -0
  29. package/dist/composer.test.cjs.map +1 -0
  30. package/dist/composer.test.d.cts +1 -0
  31. package/dist/composer.test.mjs +2 -2
  32. package/dist/composer.test.mjs.map +1 -1
  33. package/dist/deployers/coolify.cjs +174 -0
  34. package/dist/deployers/coolify.cjs.map +1 -0
  35. package/dist/deployers/coolify.d.cts +25 -0
  36. package/dist/deployers/coolify.d.cts.map +1 -0
  37. package/dist/deployers/coolify.d.mts +25 -0
  38. package/dist/deployers/coolify.d.mts.map +1 -0
  39. package/dist/deployers/coolify.mjs +172 -0
  40. package/dist/deployers/coolify.mjs.map +1 -0
  41. package/dist/deployers/dokploy.cjs +141 -0
  42. package/dist/deployers/dokploy.cjs.map +1 -0
  43. package/dist/deployers/dokploy.d.cts +24 -0
  44. package/dist/deployers/dokploy.d.cts.map +1 -0
  45. package/dist/deployers/dokploy.d.mts +24 -0
  46. package/dist/deployers/dokploy.d.mts.map +1 -0
  47. package/dist/deployers/dokploy.mjs +139 -0
  48. package/dist/deployers/dokploy.mjs.map +1 -0
  49. package/dist/deployers/index.cjs +26 -0
  50. package/dist/deployers/index.cjs.map +1 -0
  51. package/dist/deployers/index.d.cts +14 -0
  52. package/dist/deployers/index.d.cts.map +1 -0
  53. package/dist/deployers/index.d.mts +14 -0
  54. package/dist/deployers/index.d.mts.map +1 -0
  55. package/dist/deployers/index.mjs +21 -0
  56. package/dist/deployers/index.mjs.map +1 -0
  57. package/dist/deployers/types.cjs +0 -0
  58. package/dist/deployers/types.d.cts +72 -0
  59. package/dist/deployers/types.d.cts.map +1 -0
  60. package/dist/deployers/types.d.mts +72 -0
  61. package/dist/deployers/types.d.mts.map +1 -0
  62. package/dist/deployers/types.mjs +1 -0
  63. package/dist/errors.cjs +27 -0
  64. package/dist/errors.cjs.map +1 -0
  65. package/dist/errors.d.cts +17 -0
  66. package/dist/errors.d.cts.map +1 -0
  67. package/dist/generate.cjs +225 -0
  68. package/dist/generate.cjs.map +1 -0
  69. package/dist/generate.d.cts +12 -0
  70. package/dist/generate.d.cts.map +1 -0
  71. package/dist/generate.d.mts.map +1 -1
  72. package/dist/generate.mjs +34 -5
  73. package/dist/generate.mjs.map +1 -1
  74. package/dist/generate.test.cjs +283 -0
  75. package/dist/generate.test.cjs.map +1 -0
  76. package/dist/generate.test.d.cts +1 -0
  77. package/dist/generate.test.mjs +1 -1
  78. package/dist/generators/bare-metal-install.cjs +226 -0
  79. package/dist/generators/bare-metal-install.cjs.map +1 -0
  80. package/dist/generators/bare-metal-install.d.cts +17 -0
  81. package/dist/generators/bare-metal-install.d.cts.map +1 -0
  82. package/dist/generators/bare-metal-install.test.cjs +47 -0
  83. package/dist/generators/bare-metal-install.test.cjs.map +1 -0
  84. package/dist/generators/bare-metal-install.test.d.cts +1 -0
  85. package/dist/generators/bare-metal-install.test.mjs +1 -1
  86. package/dist/generators/caddy.cjs +79 -0
  87. package/dist/generators/caddy.cjs.map +1 -0
  88. package/dist/generators/caddy.d.cts +17 -0
  89. package/dist/generators/caddy.d.cts.map +1 -0
  90. package/dist/generators/caddy.test.cjs +44 -0
  91. package/dist/generators/caddy.test.cjs.map +1 -0
  92. package/dist/generators/caddy.test.d.cts +1 -0
  93. package/dist/generators/caddy.test.mjs +1 -1
  94. package/dist/generators/cloud-init.cjs +132 -0
  95. package/dist/generators/cloud-init.cjs.map +1 -0
  96. package/dist/generators/cloud-init.d.cts +25 -0
  97. package/dist/generators/cloud-init.d.cts.map +1 -0
  98. package/dist/generators/cloud-init.d.mts +25 -0
  99. package/dist/generators/cloud-init.d.mts.map +1 -0
  100. package/dist/generators/cloud-init.mjs +130 -0
  101. package/dist/generators/cloud-init.mjs.map +1 -0
  102. package/dist/generators/env.cjs +325 -0
  103. package/dist/generators/env.cjs.map +1 -0
  104. package/dist/generators/env.d.cts +52 -0
  105. package/dist/generators/env.d.cts.map +1 -0
  106. package/dist/generators/env.d.mts +6 -0
  107. package/dist/generators/env.d.mts.map +1 -1
  108. package/dist/generators/env.mjs +58 -6
  109. package/dist/generators/env.mjs.map +1 -1
  110. package/dist/generators/env.test.cjs +59 -0
  111. package/dist/generators/env.test.cjs.map +1 -0
  112. package/dist/generators/env.test.d.cts +1 -0
  113. package/dist/generators/env.test.mjs +1 -1
  114. package/dist/generators/get-shit-done.cjs +40 -0
  115. package/dist/generators/get-shit-done.cjs.map +1 -0
  116. package/dist/generators/get-shit-done.d.cts +10 -0
  117. package/dist/generators/get-shit-done.d.cts.map +1 -0
  118. package/dist/generators/grafana.cjs +296 -0
  119. package/dist/generators/grafana.cjs.map +1 -0
  120. package/dist/generators/grafana.d.cts +22 -0
  121. package/dist/generators/grafana.d.cts.map +1 -0
  122. package/dist/generators/health-check.cjs +707 -0
  123. package/dist/generators/health-check.cjs.map +1 -0
  124. package/dist/generators/health-check.d.cts +18 -0
  125. package/dist/generators/health-check.d.cts.map +1 -0
  126. package/dist/generators/health-check.d.mts +2 -2
  127. package/dist/generators/health-check.d.mts.map +1 -1
  128. package/dist/generators/health-check.mjs.map +1 -1
  129. package/dist/generators/health-check.test.cjs +84 -0
  130. package/dist/generators/health-check.test.cjs.map +1 -0
  131. package/dist/generators/health-check.test.d.cts +1 -0
  132. package/dist/generators/health-check.test.mjs +1 -1
  133. package/dist/generators/n8n-workflows.cjs +77 -0
  134. package/dist/generators/n8n-workflows.cjs.map +1 -0
  135. package/dist/generators/n8n-workflows.d.cts +11 -0
  136. package/dist/generators/n8n-workflows.d.cts.map +1 -0
  137. package/dist/generators/native-services.cjs +80 -0
  138. package/dist/generators/native-services.cjs.map +1 -0
  139. package/dist/generators/native-services.d.cts +17 -0
  140. package/dist/generators/native-services.d.cts.map +1 -0
  141. package/dist/generators/openclaw-install-script.cjs +68 -0
  142. package/dist/generators/openclaw-install-script.cjs.map +1 -0
  143. package/dist/generators/openclaw-install-script.d.cts +12 -0
  144. package/dist/generators/openclaw-install-script.d.cts.map +1 -0
  145. package/dist/generators/openclaw-install-script.d.mts +12 -0
  146. package/dist/generators/openclaw-install-script.d.mts.map +1 -0
  147. package/dist/generators/openclaw-install-script.mjs +66 -0
  148. package/dist/generators/openclaw-install-script.mjs.map +1 -0
  149. package/dist/generators/openclaw-json.cjs +540 -0
  150. package/dist/generators/openclaw-json.cjs.map +1 -0
  151. package/dist/generators/openclaw-json.d.cts +16 -0
  152. package/dist/generators/openclaw-json.d.cts.map +1 -0
  153. package/dist/generators/openclaw-json.d.mts +8 -3
  154. package/dist/generators/openclaw-json.d.mts.map +1 -1
  155. package/dist/generators/openclaw-json.mjs +214 -86
  156. package/dist/generators/openclaw-json.mjs.map +1 -1
  157. package/dist/generators/postgres-init.cjs +189 -0
  158. package/dist/generators/postgres-init.cjs.map +1 -0
  159. package/dist/generators/postgres-init.d.cts +30 -0
  160. package/dist/generators/postgres-init.d.cts.map +1 -0
  161. package/dist/generators/postgres-init.d.mts.map +1 -1
  162. package/dist/generators/postgres-init.mjs +35 -0
  163. package/dist/generators/postgres-init.mjs.map +1 -1
  164. package/dist/generators/prometheus.cjs +109 -0
  165. package/dist/generators/prometheus.cjs.map +1 -0
  166. package/dist/generators/prometheus.d.cts +14 -0
  167. package/dist/generators/prometheus.d.cts.map +1 -0
  168. package/dist/generators/readme.cjs +286 -0
  169. package/dist/generators/readme.cjs.map +1 -0
  170. package/dist/generators/readme.d.cts +27 -0
  171. package/dist/generators/readme.d.cts.map +1 -0
  172. package/dist/generators/readme.d.mts +3 -1
  173. package/dist/generators/readme.d.mts.map +1 -1
  174. package/dist/generators/readme.mjs +88 -3
  175. package/dist/generators/readme.mjs.map +1 -1
  176. package/dist/generators/scripts.cjs +353 -0
  177. package/dist/generators/scripts.cjs.map +1 -0
  178. package/dist/generators/scripts.d.cts +10 -0
  179. package/dist/generators/scripts.d.cts.map +1 -0
  180. package/dist/generators/scripts.test.cjs +51 -0
  181. package/dist/generators/scripts.test.cjs.map +1 -0
  182. package/dist/generators/scripts.test.d.cts +1 -0
  183. package/dist/generators/scripts.test.mjs +1 -1
  184. package/dist/generators/skills.cjs +590 -0
  185. package/dist/generators/skills.cjs.map +1 -0
  186. package/dist/generators/skills.d.cts +14 -0
  187. package/dist/generators/skills.d.cts.map +1 -0
  188. package/dist/generators/stack-manifest.cjs +70 -0
  189. package/dist/generators/stack-manifest.cjs.map +1 -0
  190. package/dist/generators/stack-manifest.d.cts +51 -0
  191. package/dist/generators/stack-manifest.d.cts.map +1 -0
  192. package/dist/generators/stack-manifest.d.mts +51 -0
  193. package/dist/generators/stack-manifest.d.mts.map +1 -0
  194. package/dist/generators/stack-manifest.mjs +68 -0
  195. package/dist/generators/stack-manifest.mjs.map +1 -0
  196. package/dist/generators/traefik.cjs +88 -0
  197. package/dist/generators/traefik.cjs.map +1 -0
  198. package/dist/generators/traefik.d.cts +19 -0
  199. package/dist/generators/traefik.d.cts.map +1 -0
  200. package/dist/generators/traefik.test.cjs +68 -0
  201. package/dist/generators/traefik.test.cjs.map +1 -0
  202. package/dist/generators/traefik.test.d.cts +1 -0
  203. package/dist/generators/traefik.test.mjs +1 -1
  204. package/dist/index.cjs +118 -0
  205. package/dist/index.d.cts +31 -0
  206. package/dist/index.d.mts +9 -3
  207. package/dist/index.mjs +8 -3
  208. package/dist/magic-string.es-D2agHT3I.cjs +1015 -0
  209. package/dist/magic-string.es-D2agHT3I.cjs.map +1 -0
  210. package/dist/manifest-4uLbISXV.cjs +1190 -0
  211. package/dist/manifest-4uLbISXV.cjs.map +1 -0
  212. package/dist/migrations.cjs +37 -0
  213. package/dist/migrations.cjs.map +1 -0
  214. package/dist/migrations.d.cts +14 -0
  215. package/dist/migrations.d.cts.map +1 -0
  216. package/dist/migrations.test.cjs +41 -0
  217. package/dist/migrations.test.cjs.map +1 -0
  218. package/dist/migrations.test.d.cts +1 -0
  219. package/dist/migrations.test.mjs +1 -1
  220. package/dist/port-scanner.cjs +125 -0
  221. package/dist/port-scanner.cjs.map +1 -0
  222. package/dist/port-scanner.d.cts +27 -0
  223. package/dist/port-scanner.d.cts.map +1 -0
  224. package/dist/port-scanner.d.mts +27 -0
  225. package/dist/port-scanner.d.mts.map +1 -0
  226. package/dist/port-scanner.mjs +122 -0
  227. package/dist/port-scanner.mjs.map +1 -0
  228. package/dist/presets/presets.test.cjs +65 -0
  229. package/dist/presets/presets.test.cjs.map +1 -0
  230. package/dist/presets/presets.test.d.cts +1 -0
  231. package/dist/presets/presets.test.d.mts +1 -0
  232. package/dist/presets/presets.test.mjs +64 -0
  233. package/dist/presets/presets.test.mjs.map +1 -0
  234. package/dist/presets/registry.cjs +193 -0
  235. package/dist/presets/registry.cjs.map +1 -0
  236. package/dist/presets/registry.d.cts +9 -0
  237. package/dist/presets/registry.d.cts.map +1 -0
  238. package/dist/presets/registry.d.mts.map +1 -1
  239. package/dist/presets/registry.mjs +38 -8
  240. package/dist/presets/registry.mjs.map +1 -1
  241. package/dist/presets/registry.test.cjs +36 -0
  242. package/dist/presets/registry.test.cjs.map +1 -0
  243. package/dist/presets/registry.test.d.cts +1 -0
  244. package/dist/presets/registry.test.mjs +5 -2
  245. package/dist/presets/registry.test.mjs.map +1 -1
  246. package/dist/resolver.cjs +217 -0
  247. package/dist/resolver.cjs.map +1 -0
  248. package/dist/resolver.d.cts +26 -0
  249. package/dist/resolver.d.cts.map +1 -0
  250. package/dist/resolver.mjs +2 -0
  251. package/dist/resolver.mjs.map +1 -1
  252. package/dist/resolver.test.cjs +236 -0
  253. package/dist/resolver.test.cjs.map +1 -0
  254. package/dist/resolver.test.d.cts +1 -0
  255. package/dist/resolver.test.mjs +1 -1
  256. package/dist/schema.cjs +354 -0
  257. package/dist/schema.cjs.map +1 -0
  258. package/dist/schema.d.cts +854 -0
  259. package/dist/schema.d.cts.map +1 -0
  260. package/dist/schema.d.mts +56 -1
  261. package/dist/schema.d.mts.map +1 -1
  262. package/dist/schema.mjs +31 -4
  263. package/dist/schema.mjs.map +1 -1
  264. package/dist/schema.test.cjs +263 -0
  265. package/dist/schema.test.cjs.map +1 -0
  266. package/dist/schema.test.d.cts +1 -0
  267. package/dist/schema.test.mjs +1 -1
  268. package/dist/services/definitions/anything-llm.cjs +46 -0
  269. package/dist/services/definitions/anything-llm.cjs.map +1 -0
  270. package/dist/services/definitions/anything-llm.d.cts +7 -0
  271. package/dist/services/definitions/anything-llm.d.cts.map +1 -0
  272. package/dist/services/definitions/anything-llm.mjs +2 -2
  273. package/dist/services/definitions/anything-llm.mjs.map +1 -1
  274. package/dist/services/definitions/appflowy.cjs +47 -0
  275. package/dist/services/definitions/appflowy.cjs.map +1 -0
  276. package/dist/services/definitions/appflowy.d.cts +7 -0
  277. package/dist/services/definitions/appflowy.d.cts.map +1 -0
  278. package/dist/services/definitions/appflowy.mjs +1 -1
  279. package/dist/services/definitions/appflowy.mjs.map +1 -1
  280. package/dist/services/definitions/authentik.cjs +107 -0
  281. package/dist/services/definitions/authentik.cjs.map +1 -0
  282. package/dist/services/definitions/authentik.d.cts +7 -0
  283. package/dist/services/definitions/authentik.d.cts.map +1 -0
  284. package/dist/services/definitions/authentik.mjs +5 -5
  285. package/dist/services/definitions/authentik.mjs.map +1 -1
  286. package/dist/services/definitions/beszel.cjs +47 -0
  287. package/dist/services/definitions/beszel.cjs.map +1 -0
  288. package/dist/services/definitions/beszel.d.cts +7 -0
  289. package/dist/services/definitions/beszel.d.cts.map +1 -0
  290. package/dist/services/definitions/beszel.mjs +1 -1
  291. package/dist/services/definitions/beszel.mjs.map +1 -1
  292. package/dist/services/definitions/browserless.cjs +87 -0
  293. package/dist/services/definitions/browserless.cjs.map +1 -0
  294. package/dist/services/definitions/browserless.d.cts +7 -0
  295. package/dist/services/definitions/browserless.d.cts.map +1 -0
  296. package/dist/services/definitions/browserless.mjs +1 -1
  297. package/dist/services/definitions/browserless.mjs.map +1 -1
  298. package/dist/services/definitions/caddy.cjs +73 -0
  299. package/dist/services/definitions/caddy.cjs.map +1 -0
  300. package/dist/services/definitions/caddy.d.cts +7 -0
  301. package/dist/services/definitions/caddy.d.cts.map +1 -0
  302. package/dist/services/definitions/caddy.mjs +2 -2
  303. package/dist/services/definitions/caddy.mjs.map +1 -1
  304. package/dist/services/definitions/cal-com.cjs +90 -0
  305. package/dist/services/definitions/cal-com.cjs.map +1 -0
  306. package/dist/services/definitions/cal-com.d.cts +7 -0
  307. package/dist/services/definitions/cal-com.d.cts.map +1 -0
  308. package/dist/services/definitions/cal-com.mjs +2 -2
  309. package/dist/services/definitions/cal-com.mjs.map +1 -1
  310. package/dist/services/definitions/chromadb.cjs +65 -0
  311. package/dist/services/definitions/chromadb.cjs.map +1 -0
  312. package/dist/services/definitions/chromadb.d.cts +7 -0
  313. package/dist/services/definitions/chromadb.d.cts.map +1 -0
  314. package/dist/services/definitions/chromadb.mjs +3 -3
  315. package/dist/services/definitions/chromadb.mjs.map +1 -1
  316. package/dist/services/definitions/claude-code.cjs +54 -0
  317. package/dist/services/definitions/claude-code.cjs.map +1 -0
  318. package/dist/services/definitions/claude-code.d.cts +7 -0
  319. package/dist/services/definitions/claude-code.d.cts.map +1 -0
  320. package/dist/services/definitions/claude-code.mjs +1 -1
  321. package/dist/services/definitions/claude-code.mjs.map +1 -1
  322. package/dist/services/definitions/code-server.cjs +68 -0
  323. package/dist/services/definitions/code-server.cjs.map +1 -0
  324. package/dist/services/definitions/code-server.d.cts +7 -0
  325. package/dist/services/definitions/code-server.d.cts.map +1 -0
  326. package/dist/services/definitions/code-server.mjs +1 -1
  327. package/dist/services/definitions/code-server.mjs.map +1 -1
  328. package/dist/services/definitions/codex.cjs +47 -0
  329. package/dist/services/definitions/codex.cjs.map +1 -0
  330. package/dist/services/definitions/codex.d.cts +7 -0
  331. package/dist/services/definitions/codex.d.cts.map +1 -0
  332. package/dist/services/definitions/codex.mjs +1 -1
  333. package/dist/services/definitions/codex.mjs.map +1 -1
  334. package/dist/services/definitions/comfyui.cjs +85 -0
  335. package/dist/services/definitions/comfyui.cjs.map +1 -0
  336. package/dist/services/definitions/comfyui.d.cts +7 -0
  337. package/dist/services/definitions/comfyui.d.cts.map +1 -0
  338. package/dist/services/definitions/comfyui.mjs +1 -1
  339. package/dist/services/definitions/comfyui.mjs.map +1 -1
  340. package/dist/services/definitions/convex-dashboard.cjs +48 -0
  341. package/dist/services/definitions/convex-dashboard.cjs.map +1 -0
  342. package/dist/services/definitions/convex-dashboard.d.cts +7 -0
  343. package/dist/services/definitions/convex-dashboard.d.cts.map +1 -0
  344. package/dist/services/definitions/convex.cjs +120 -0
  345. package/dist/services/definitions/convex.cjs.map +1 -0
  346. package/dist/services/definitions/convex.d.cts +7 -0
  347. package/dist/services/definitions/convex.d.cts.map +1 -0
  348. package/dist/services/definitions/coolify.cjs +51 -0
  349. package/dist/services/definitions/coolify.cjs.map +1 -0
  350. package/dist/services/definitions/coolify.d.cts +7 -0
  351. package/dist/services/definitions/coolify.d.cts.map +1 -0
  352. package/dist/services/definitions/coolify.mjs +1 -1
  353. package/dist/services/definitions/coolify.mjs.map +1 -1
  354. package/dist/services/definitions/crowdsec.cjs +64 -0
  355. package/dist/services/definitions/crowdsec.cjs.map +1 -0
  356. package/dist/services/definitions/crowdsec.d.cts +7 -0
  357. package/dist/services/definitions/crowdsec.d.cts.map +1 -0
  358. package/dist/services/definitions/crowdsec.mjs +2 -2
  359. package/dist/services/definitions/crowdsec.mjs.map +1 -1
  360. package/dist/services/definitions/desktop-environment.cjs +155 -0
  361. package/dist/services/definitions/desktop-environment.cjs.map +1 -0
  362. package/dist/services/definitions/desktop-environment.d.cts +7 -0
  363. package/dist/services/definitions/desktop-environment.d.cts.map +1 -0
  364. package/dist/services/definitions/desktop-environment.mjs +1 -1
  365. package/dist/services/definitions/desktop-environment.mjs.map +1 -1
  366. package/dist/services/definitions/dify.cjs +83 -0
  367. package/dist/services/definitions/dify.cjs.map +1 -0
  368. package/dist/services/definitions/dify.d.cts +7 -0
  369. package/dist/services/definitions/dify.d.cts.map +1 -0
  370. package/dist/services/definitions/dify.mjs +1 -1
  371. package/dist/services/definitions/dify.mjs.map +1 -1
  372. package/dist/services/definitions/docsgpt.cjs +47 -0
  373. package/dist/services/definitions/docsgpt.cjs.map +1 -0
  374. package/dist/services/definitions/docsgpt.d.cts +7 -0
  375. package/dist/services/definitions/docsgpt.d.cts.map +1 -0
  376. package/dist/services/definitions/docsgpt.mjs +1 -1
  377. package/dist/services/definitions/docsgpt.mjs.map +1 -1
  378. package/dist/services/definitions/dokploy.cjs +51 -0
  379. package/dist/services/definitions/dokploy.cjs.map +1 -0
  380. package/dist/services/definitions/dokploy.d.cts +7 -0
  381. package/dist/services/definitions/dokploy.d.cts.map +1 -0
  382. package/dist/services/definitions/dokploy.mjs +2 -2
  383. package/dist/services/definitions/dokploy.mjs.map +1 -1
  384. package/dist/services/definitions/dozzle.cjs +43 -0
  385. package/dist/services/definitions/dozzle.cjs.map +1 -0
  386. package/dist/services/definitions/dozzle.d.cts +7 -0
  387. package/dist/services/definitions/dozzle.d.cts.map +1 -0
  388. package/dist/services/definitions/dozzle.mjs +1 -1
  389. package/dist/services/definitions/dozzle.mjs.map +1 -1
  390. package/dist/services/definitions/ffmpeg.cjs +68 -0
  391. package/dist/services/definitions/ffmpeg.cjs.map +1 -0
  392. package/dist/services/definitions/ffmpeg.d.cts +7 -0
  393. package/dist/services/definitions/ffmpeg.d.cts.map +1 -0
  394. package/dist/services/definitions/ffmpeg.mjs +2 -2
  395. package/dist/services/definitions/ffmpeg.mjs.map +1 -1
  396. package/dist/services/definitions/flowise.cjs +47 -0
  397. package/dist/services/definitions/flowise.cjs.map +1 -0
  398. package/dist/services/definitions/flowise.d.cts +7 -0
  399. package/dist/services/definitions/flowise.d.cts.map +1 -0
  400. package/dist/services/definitions/flowise.mjs +1 -1
  401. package/dist/services/definitions/flowise.mjs.map +1 -1
  402. package/dist/services/definitions/gemini-cli.cjs +54 -0
  403. package/dist/services/definitions/gemini-cli.cjs.map +1 -0
  404. package/dist/services/definitions/gemini-cli.d.cts +7 -0
  405. package/dist/services/definitions/gemini-cli.d.cts.map +1 -0
  406. package/dist/services/definitions/gemini-cli.mjs +7 -1
  407. package/dist/services/definitions/gemini-cli.mjs.map +1 -1
  408. package/dist/services/definitions/ghost.cjs +60 -0
  409. package/dist/services/definitions/ghost.cjs.map +1 -0
  410. package/dist/services/definitions/ghost.d.cts +7 -0
  411. package/dist/services/definitions/ghost.d.cts.map +1 -0
  412. package/dist/services/definitions/ghost.mjs +1 -1
  413. package/dist/services/definitions/ghost.mjs.map +1 -1
  414. package/dist/services/definitions/gitea.cjs +51 -0
  415. package/dist/services/definitions/gitea.cjs.map +1 -0
  416. package/dist/services/definitions/gitea.d.cts +7 -0
  417. package/dist/services/definitions/gitea.d.cts.map +1 -0
  418. package/dist/services/definitions/gitea.mjs +1 -1
  419. package/dist/services/definitions/gitea.mjs.map +1 -1
  420. package/dist/services/definitions/gotify.cjs +64 -0
  421. package/dist/services/definitions/gotify.cjs.map +1 -0
  422. package/dist/services/definitions/gotify.d.cts +7 -0
  423. package/dist/services/definitions/gotify.d.cts.map +1 -0
  424. package/dist/services/definitions/gotify.mjs +3 -3
  425. package/dist/services/definitions/gotify.mjs.map +1 -1
  426. package/dist/services/definitions/grafana.cjs +77 -0
  427. package/dist/services/definitions/grafana.cjs.map +1 -0
  428. package/dist/services/definitions/grafana.d.cts +7 -0
  429. package/dist/services/definitions/grafana.d.cts.map +1 -0
  430. package/dist/services/definitions/grafana.mjs +2 -2
  431. package/dist/services/definitions/grafana.mjs.map +1 -1
  432. package/dist/services/definitions/headscale.cjs +73 -0
  433. package/dist/services/definitions/headscale.cjs.map +1 -0
  434. package/dist/services/definitions/headscale.d.cts +7 -0
  435. package/dist/services/definitions/headscale.d.cts.map +1 -0
  436. package/dist/services/definitions/headscale.mjs +2 -2
  437. package/dist/services/definitions/headscale.mjs.map +1 -1
  438. package/dist/services/definitions/hexstrike.cjs +46 -0
  439. package/dist/services/definitions/hexstrike.cjs.map +1 -0
  440. package/dist/services/definitions/hexstrike.d.cts +7 -0
  441. package/dist/services/definitions/hexstrike.d.cts.map +1 -0
  442. package/dist/services/definitions/hexstrike.mjs +1 -1
  443. package/dist/services/definitions/hexstrike.mjs.map +1 -1
  444. package/dist/services/definitions/homeassistant.cjs +63 -0
  445. package/dist/services/definitions/homeassistant.cjs.map +1 -0
  446. package/dist/services/definitions/homeassistant.d.cts +7 -0
  447. package/dist/services/definitions/homeassistant.d.cts.map +1 -0
  448. package/dist/services/definitions/homeassistant.mjs +1 -1
  449. package/dist/services/definitions/homeassistant.mjs.map +1 -1
  450. package/dist/services/definitions/immich.cjs +94 -0
  451. package/dist/services/definitions/immich.cjs.map +1 -0
  452. package/dist/services/definitions/immich.d.cts +7 -0
  453. package/dist/services/definitions/immich.d.cts.map +1 -0
  454. package/dist/services/definitions/immich.mjs +6 -6
  455. package/dist/services/definitions/immich.mjs.map +1 -1
  456. package/dist/services/definitions/index.cjs +291 -0
  457. package/dist/services/definitions/index.cjs.map +1 -0
  458. package/dist/services/definitions/index.d.cts +101 -0
  459. package/dist/services/definitions/index.d.cts.map +1 -0
  460. package/dist/services/definitions/jellyfin.cjs +64 -0
  461. package/dist/services/definitions/jellyfin.cjs.map +1 -0
  462. package/dist/services/definitions/jellyfin.d.cts +7 -0
  463. package/dist/services/definitions/jellyfin.d.cts.map +1 -0
  464. package/dist/services/definitions/jellyfin.mjs +1 -1
  465. package/dist/services/definitions/jellyfin.mjs.map +1 -1
  466. package/dist/services/definitions/jenkins.cjs +64 -0
  467. package/dist/services/definitions/jenkins.cjs.map +1 -0
  468. package/dist/services/definitions/jenkins.d.cts +7 -0
  469. package/dist/services/definitions/jenkins.d.cts.map +1 -0
  470. package/dist/services/definitions/jenkins.mjs +1 -1
  471. package/dist/services/definitions/jenkins.mjs.map +1 -1
  472. package/dist/services/definitions/kimi.cjs +48 -0
  473. package/dist/services/definitions/kimi.cjs.map +1 -0
  474. package/dist/services/definitions/kimi.d.cts +7 -0
  475. package/dist/services/definitions/kimi.d.cts.map +1 -0
  476. package/dist/services/definitions/kimi.mjs +1 -1
  477. package/dist/services/definitions/kimi.mjs.map +1 -1
  478. package/dist/services/definitions/lasuite-meet-agents.cjs +38 -0
  479. package/dist/services/definitions/lasuite-meet-agents.cjs.map +1 -0
  480. package/dist/services/definitions/lasuite-meet-agents.d.cts +7 -0
  481. package/dist/services/definitions/lasuite-meet-agents.d.cts.map +1 -0
  482. package/dist/services/definitions/lasuite-meet-agents.mjs +1 -1
  483. package/dist/services/definitions/lasuite-meet-agents.mjs.map +1 -1
  484. package/dist/services/definitions/lasuite-meet-backend.cjs +136 -0
  485. package/dist/services/definitions/lasuite-meet-backend.cjs.map +1 -0
  486. package/dist/services/definitions/lasuite-meet-backend.d.cts +7 -0
  487. package/dist/services/definitions/lasuite-meet-backend.d.cts.map +1 -0
  488. package/dist/services/definitions/lasuite-meet-backend.mjs +3 -3
  489. package/dist/services/definitions/lasuite-meet-backend.mjs.map +1 -1
  490. package/dist/services/definitions/lasuite-meet-frontend.cjs +50 -0
  491. package/dist/services/definitions/lasuite-meet-frontend.cjs.map +1 -0
  492. package/dist/services/definitions/lasuite-meet-frontend.d.cts +7 -0
  493. package/dist/services/definitions/lasuite-meet-frontend.d.cts.map +1 -0
  494. package/dist/services/definitions/lasuite-meet-frontend.mjs +3 -3
  495. package/dist/services/definitions/lasuite-meet-frontend.mjs.map +1 -1
  496. package/dist/services/definitions/librechat.cjs +52 -0
  497. package/dist/services/definitions/librechat.cjs.map +1 -0
  498. package/dist/services/definitions/librechat.d.cts +7 -0
  499. package/dist/services/definitions/librechat.d.cts.map +1 -0
  500. package/dist/services/definitions/librechat.mjs +1 -1
  501. package/dist/services/definitions/librechat.mjs.map +1 -1
  502. package/dist/services/definitions/lightpanda.cjs +61 -0
  503. package/dist/services/definitions/lightpanda.cjs.map +1 -0
  504. package/dist/services/definitions/lightpanda.d.cts +7 -0
  505. package/dist/services/definitions/lightpanda.d.cts.map +1 -0
  506. package/dist/services/definitions/litellm.cjs +49 -0
  507. package/dist/services/definitions/litellm.cjs.map +1 -0
  508. package/dist/services/definitions/litellm.d.cts +7 -0
  509. package/dist/services/definitions/litellm.d.cts.map +1 -0
  510. package/dist/services/definitions/litellm.mjs +1 -1
  511. package/dist/services/definitions/litellm.mjs.map +1 -1
  512. package/dist/services/definitions/livekit.cjs +58 -0
  513. package/dist/services/definitions/livekit.cjs.map +1 -0
  514. package/dist/services/definitions/livekit.d.cts +7 -0
  515. package/dist/services/definitions/livekit.d.cts.map +1 -0
  516. package/dist/services/definitions/loki.cjs +53 -0
  517. package/dist/services/definitions/loki.cjs.map +1 -0
  518. package/dist/services/definitions/loki.d.cts +7 -0
  519. package/dist/services/definitions/loki.d.cts.map +1 -0
  520. package/dist/services/definitions/loki.mjs +1 -1
  521. package/dist/services/definitions/loki.mjs.map +1 -1
  522. package/dist/services/definitions/matomo.cjs +82 -0
  523. package/dist/services/definitions/matomo.cjs.map +1 -0
  524. package/dist/services/definitions/matomo.d.cts +7 -0
  525. package/dist/services/definitions/matomo.d.cts.map +1 -0
  526. package/dist/services/definitions/matomo.mjs +1 -1
  527. package/dist/services/definitions/matomo.mjs.map +1 -1
  528. package/dist/services/definitions/matrix-synapse.cjs +90 -0
  529. package/dist/services/definitions/matrix-synapse.cjs.map +1 -0
  530. package/dist/services/definitions/matrix-synapse.d.cts +7 -0
  531. package/dist/services/definitions/matrix-synapse.d.cts.map +1 -0
  532. package/dist/services/definitions/matrix-synapse.mjs +1 -1
  533. package/dist/services/definitions/matrix-synapse.mjs.map +1 -1
  534. package/dist/services/definitions/mattermost.cjs +63 -0
  535. package/dist/services/definitions/mattermost.cjs.map +1 -0
  536. package/dist/services/definitions/mattermost.d.cts +7 -0
  537. package/dist/services/definitions/mattermost.d.cts.map +1 -0
  538. package/dist/services/definitions/mattermost.mjs +1 -1
  539. package/dist/services/definitions/mattermost.mjs.map +1 -1
  540. package/dist/services/definitions/meilisearch.cjs +80 -0
  541. package/dist/services/definitions/meilisearch.cjs.map +1 -0
  542. package/dist/services/definitions/meilisearch.d.cts +7 -0
  543. package/dist/services/definitions/meilisearch.d.cts.map +1 -0
  544. package/dist/services/definitions/meilisearch.mjs +4 -4
  545. package/dist/services/definitions/meilisearch.mjs.map +1 -1
  546. package/dist/services/definitions/milvus.cjs +77 -0
  547. package/dist/services/definitions/milvus.cjs.map +1 -0
  548. package/dist/services/definitions/milvus.d.cts +7 -0
  549. package/dist/services/definitions/milvus.d.cts.map +1 -0
  550. package/dist/services/definitions/milvus.mjs +1 -1
  551. package/dist/services/definitions/milvus.mjs.map +1 -1
  552. package/dist/services/definitions/minio.cjs +104 -0
  553. package/dist/services/definitions/minio.cjs.map +1 -0
  554. package/dist/services/definitions/minio.d.cts +7 -0
  555. package/dist/services/definitions/minio.d.cts.map +1 -0
  556. package/dist/services/definitions/minio.mjs +1 -1
  557. package/dist/services/definitions/minio.mjs.map +1 -1
  558. package/dist/services/definitions/mission-control.cjs +69 -0
  559. package/dist/services/definitions/mission-control.cjs.map +1 -0
  560. package/dist/services/definitions/mission-control.d.cts +7 -0
  561. package/dist/services/definitions/mission-control.d.cts.map +1 -0
  562. package/dist/services/definitions/mixpost.cjs +89 -0
  563. package/dist/services/definitions/mixpost.cjs.map +1 -0
  564. package/dist/services/definitions/mixpost.d.cts +7 -0
  565. package/dist/services/definitions/mixpost.d.cts.map +1 -0
  566. package/dist/services/definitions/mixpost.mjs +1 -1
  567. package/dist/services/definitions/mixpost.mjs.map +1 -1
  568. package/dist/services/definitions/motion-canvas.cjs +54 -0
  569. package/dist/services/definitions/motion-canvas.cjs.map +1 -0
  570. package/dist/services/definitions/motion-canvas.d.cts +7 -0
  571. package/dist/services/definitions/motion-canvas.d.cts.map +1 -0
  572. package/dist/services/definitions/motion-canvas.mjs +1 -1
  573. package/dist/services/definitions/motion-canvas.mjs.map +1 -1
  574. package/dist/services/definitions/n8n.cjs +156 -0
  575. package/dist/services/definitions/n8n.cjs.map +1 -0
  576. package/dist/services/definitions/n8n.d.cts +7 -0
  577. package/dist/services/definitions/n8n.d.cts.map +1 -0
  578. package/dist/services/definitions/n8n.mjs +1 -1
  579. package/dist/services/definitions/n8n.mjs.map +1 -1
  580. package/dist/services/definitions/neo4j.cjs +93 -0
  581. package/dist/services/definitions/neo4j.cjs.map +1 -0
  582. package/dist/services/definitions/neo4j.d.cts +7 -0
  583. package/dist/services/definitions/neo4j.d.cts.map +1 -0
  584. package/dist/services/definitions/neo4j.mjs +1 -1
  585. package/dist/services/definitions/neo4j.mjs.map +1 -1
  586. package/dist/services/definitions/nextcloud.cjs +82 -0
  587. package/dist/services/definitions/nextcloud.cjs.map +1 -0
  588. package/dist/services/definitions/nextcloud.d.cts +7 -0
  589. package/dist/services/definitions/nextcloud.d.cts.map +1 -0
  590. package/dist/services/definitions/nextcloud.mjs +19 -19
  591. package/dist/services/definitions/nextcloud.mjs.map +1 -1
  592. package/dist/services/definitions/nocodb.cjs +47 -0
  593. package/dist/services/definitions/nocodb.cjs.map +1 -0
  594. package/dist/services/definitions/nocodb.d.cts +7 -0
  595. package/dist/services/definitions/nocodb.d.cts.map +1 -0
  596. package/dist/services/definitions/nocodb.mjs +1 -1
  597. package/dist/services/definitions/nocodb.mjs.map +1 -1
  598. package/dist/services/definitions/ntfy.cjs +65 -0
  599. package/dist/services/definitions/ntfy.cjs.map +1 -0
  600. package/dist/services/definitions/ntfy.d.cts +7 -0
  601. package/dist/services/definitions/ntfy.d.cts.map +1 -0
  602. package/dist/services/definitions/ntfy.mjs +2 -2
  603. package/dist/services/definitions/ntfy.mjs.map +1 -1
  604. package/dist/services/definitions/ollama.cjs +68 -0
  605. package/dist/services/definitions/ollama.cjs.map +1 -0
  606. package/dist/services/definitions/ollama.d.cts +7 -0
  607. package/dist/services/definitions/ollama.d.cts.map +1 -0
  608. package/dist/services/definitions/ollama.mjs +1 -1
  609. package/dist/services/definitions/ollama.mjs.map +1 -1
  610. package/dist/services/definitions/open-webui.cjs +52 -0
  611. package/dist/services/definitions/open-webui.cjs.map +1 -0
  612. package/dist/services/definitions/open-webui.d.cts +7 -0
  613. package/dist/services/definitions/open-webui.d.cts.map +1 -0
  614. package/dist/services/definitions/open-webui.mjs +1 -1
  615. package/dist/services/definitions/open-webui.mjs.map +1 -1
  616. package/dist/services/definitions/opencode.cjs +52 -0
  617. package/dist/services/definitions/opencode.cjs.map +1 -0
  618. package/dist/services/definitions/opencode.d.cts +7 -0
  619. package/dist/services/definitions/opencode.d.cts.map +1 -0
  620. package/dist/services/definitions/opencode.mjs +1 -1
  621. package/dist/services/definitions/opencode.mjs.map +1 -1
  622. package/dist/services/definitions/openpanel.cjs +48 -0
  623. package/dist/services/definitions/openpanel.cjs.map +1 -0
  624. package/dist/services/definitions/openpanel.d.cts +7 -0
  625. package/dist/services/definitions/openpanel.d.cts.map +1 -0
  626. package/dist/services/definitions/openpanel.mjs +3 -3
  627. package/dist/services/definitions/openpanel.mjs.map +1 -1
  628. package/dist/services/definitions/outline.cjs +76 -0
  629. package/dist/services/definitions/outline.cjs.map +1 -0
  630. package/dist/services/definitions/outline.d.cts +7 -0
  631. package/dist/services/definitions/outline.d.cts.map +1 -0
  632. package/dist/services/definitions/paperless-ngx.cjs +95 -0
  633. package/dist/services/definitions/paperless-ngx.cjs.map +1 -0
  634. package/dist/services/definitions/paperless-ngx.d.cts +7 -0
  635. package/dist/services/definitions/paperless-ngx.d.cts.map +1 -0
  636. package/dist/services/definitions/paperless-ngx.mjs +1 -1
  637. package/dist/services/definitions/paperless-ngx.mjs.map +1 -1
  638. package/dist/services/definitions/pentagi.cjs +46 -0
  639. package/dist/services/definitions/pentagi.cjs.map +1 -0
  640. package/dist/services/definitions/pentagi.d.cts +7 -0
  641. package/dist/services/definitions/pentagi.d.cts.map +1 -0
  642. package/dist/services/definitions/pentagi.mjs +2 -2
  643. package/dist/services/definitions/pentagi.mjs.map +1 -1
  644. package/dist/services/definitions/pentestagent.cjs +41 -0
  645. package/dist/services/definitions/pentestagent.cjs.map +1 -0
  646. package/dist/services/definitions/pentestagent.d.cts +7 -0
  647. package/dist/services/definitions/pentestagent.d.cts.map +1 -0
  648. package/dist/services/definitions/playwright-server.cjs +44 -0
  649. package/dist/services/definitions/playwright-server.cjs.map +1 -0
  650. package/dist/services/definitions/playwright-server.d.cts +7 -0
  651. package/dist/services/definitions/playwright-server.d.cts.map +1 -0
  652. package/dist/services/definitions/playwright-server.mjs +1 -1
  653. package/dist/services/definitions/playwright-server.mjs.map +1 -1
  654. package/dist/services/definitions/portainer.cjs +51 -0
  655. package/dist/services/definitions/portainer.cjs.map +1 -0
  656. package/dist/services/definitions/portainer.d.cts +7 -0
  657. package/dist/services/definitions/portainer.d.cts.map +1 -0
  658. package/dist/services/definitions/portainer.mjs +1 -1
  659. package/dist/services/definitions/portainer.mjs.map +1 -1
  660. package/dist/services/definitions/postgresql.cjs +86 -0
  661. package/dist/services/definitions/postgresql.cjs.map +1 -0
  662. package/dist/services/definitions/postgresql.d.cts +7 -0
  663. package/dist/services/definitions/postgresql.d.cts.map +1 -0
  664. package/dist/services/definitions/postgresql.mjs +1 -1
  665. package/dist/services/definitions/postgresql.mjs.map +1 -1
  666. package/dist/services/definitions/postiz.cjs +85 -0
  667. package/dist/services/definitions/postiz.cjs.map +1 -0
  668. package/dist/services/definitions/postiz.d.cts +7 -0
  669. package/dist/services/definitions/postiz.d.cts.map +1 -0
  670. package/dist/services/definitions/postiz.mjs +1 -1
  671. package/dist/services/definitions/postiz.mjs.map +1 -1
  672. package/dist/services/definitions/prometheus.cjs +54 -0
  673. package/dist/services/definitions/prometheus.cjs.map +1 -0
  674. package/dist/services/definitions/prometheus.d.cts +7 -0
  675. package/dist/services/definitions/prometheus.d.cts.map +1 -0
  676. package/dist/services/definitions/prometheus.mjs +1 -1
  677. package/dist/services/definitions/prometheus.mjs.map +1 -1
  678. package/dist/services/definitions/qdrant.cjs +79 -0
  679. package/dist/services/definitions/qdrant.cjs.map +1 -0
  680. package/dist/services/definitions/qdrant.d.cts +7 -0
  681. package/dist/services/definitions/qdrant.d.cts.map +1 -0
  682. package/dist/services/definitions/qdrant.mjs +1 -1
  683. package/dist/services/definitions/qdrant.mjs.map +1 -1
  684. package/dist/services/definitions/redis.cjs +93 -0
  685. package/dist/services/definitions/redis.cjs.map +1 -0
  686. package/dist/services/definitions/redis.d.cts +7 -0
  687. package/dist/services/definitions/redis.d.cts.map +1 -0
  688. package/dist/services/definitions/redis.mjs +1 -1
  689. package/dist/services/definitions/redis.mjs.map +1 -1
  690. package/dist/services/definitions/remotion.cjs +57 -0
  691. package/dist/services/definitions/remotion.cjs.map +1 -0
  692. package/dist/services/definitions/remotion.d.cts +7 -0
  693. package/dist/services/definitions/remotion.d.cts.map +1 -0
  694. package/dist/services/definitions/remotion.mjs +1 -1
  695. package/dist/services/definitions/remotion.mjs.map +1 -1
  696. package/dist/services/definitions/rocketchat.cjs +59 -0
  697. package/dist/services/definitions/rocketchat.cjs.map +1 -0
  698. package/dist/services/definitions/rocketchat.d.cts +7 -0
  699. package/dist/services/definitions/rocketchat.d.cts.map +1 -0
  700. package/dist/services/definitions/rocketchat.mjs +1 -1
  701. package/dist/services/definitions/rocketchat.mjs.map +1 -1
  702. package/dist/services/definitions/scrapling.cjs +46 -0
  703. package/dist/services/definitions/scrapling.cjs.map +1 -0
  704. package/dist/services/definitions/scrapling.d.cts +7 -0
  705. package/dist/services/definitions/scrapling.d.cts.map +1 -0
  706. package/dist/services/definitions/scrapling.mjs +2 -2
  707. package/dist/services/definitions/scrapling.mjs.map +1 -1
  708. package/dist/services/definitions/searxng.cjs +67 -0
  709. package/dist/services/definitions/searxng.cjs.map +1 -0
  710. package/dist/services/definitions/searxng.d.cts +7 -0
  711. package/dist/services/definitions/searxng.d.cts.map +1 -0
  712. package/dist/services/definitions/searxng.mjs +1 -1
  713. package/dist/services/definitions/searxng.mjs.map +1 -1
  714. package/dist/services/definitions/signoz.cjs +56 -0
  715. package/dist/services/definitions/signoz.cjs.map +1 -0
  716. package/dist/services/definitions/signoz.d.cts +7 -0
  717. package/dist/services/definitions/signoz.d.cts.map +1 -0
  718. package/dist/services/definitions/signoz.mjs +2 -2
  719. package/dist/services/definitions/signoz.mjs.map +1 -1
  720. package/dist/services/definitions/solidityguard.cjs +51 -0
  721. package/dist/services/definitions/solidityguard.cjs.map +1 -0
  722. package/dist/services/definitions/solidityguard.d.cts +7 -0
  723. package/dist/services/definitions/solidityguard.d.cts.map +1 -0
  724. package/dist/services/definitions/solidityguard.mjs +1 -1
  725. package/dist/services/definitions/solidityguard.mjs.map +1 -1
  726. package/dist/services/definitions/stable-diffusion.cjs +50 -0
  727. package/dist/services/definitions/stable-diffusion.cjs.map +1 -0
  728. package/dist/services/definitions/stable-diffusion.d.cts +7 -0
  729. package/dist/services/definitions/stable-diffusion.d.cts.map +1 -0
  730. package/dist/services/definitions/stable-diffusion.mjs +1 -1
  731. package/dist/services/definitions/stable-diffusion.mjs.map +1 -1
  732. package/dist/services/definitions/steel-browser.cjs +79 -0
  733. package/dist/services/definitions/steel-browser.cjs.map +1 -0
  734. package/dist/services/definitions/steel-browser.d.cts +7 -0
  735. package/dist/services/definitions/steel-browser.d.cts.map +1 -0
  736. package/dist/services/definitions/steel-browser.mjs +1 -1
  737. package/dist/services/definitions/steel-browser.mjs.map +1 -1
  738. package/dist/services/definitions/stream-gateway.cjs +135 -0
  739. package/dist/services/definitions/stream-gateway.cjs.map +1 -0
  740. package/dist/services/definitions/stream-gateway.d.cts +7 -0
  741. package/dist/services/definitions/stream-gateway.d.cts.map +1 -0
  742. package/dist/services/definitions/stream-gateway.mjs +2 -2
  743. package/dist/services/definitions/stream-gateway.mjs.map +1 -1
  744. package/dist/services/definitions/supabase.cjs +71 -0
  745. package/dist/services/definitions/supabase.cjs.map +1 -0
  746. package/dist/services/definitions/supabase.d.cts +7 -0
  747. package/dist/services/definitions/supabase.d.cts.map +1 -0
  748. package/dist/services/definitions/supabase.mjs +2 -2
  749. package/dist/services/definitions/supabase.mjs.map +1 -1
  750. package/dist/services/definitions/tailscale.cjs +72 -0
  751. package/dist/services/definitions/tailscale.cjs.map +1 -0
  752. package/dist/services/definitions/tailscale.d.cts +7 -0
  753. package/dist/services/definitions/tailscale.d.cts.map +1 -0
  754. package/dist/services/definitions/tailscale.mjs +1 -1
  755. package/dist/services/definitions/tailscale.mjs.map +1 -1
  756. package/dist/services/definitions/temporal.cjs +102 -0
  757. package/dist/services/definitions/temporal.cjs.map +1 -0
  758. package/dist/services/definitions/temporal.d.cts +7 -0
  759. package/dist/services/definitions/temporal.d.cts.map +1 -0
  760. package/dist/services/definitions/traefik.cjs +59 -0
  761. package/dist/services/definitions/traefik.cjs.map +1 -0
  762. package/dist/services/definitions/traefik.d.cts +7 -0
  763. package/dist/services/definitions/traefik.d.cts.map +1 -0
  764. package/dist/services/definitions/traefik.mjs +1 -1
  765. package/dist/services/definitions/traefik.mjs.map +1 -1
  766. package/dist/services/definitions/umami.cjs +48 -0
  767. package/dist/services/definitions/umami.cjs.map +1 -0
  768. package/dist/services/definitions/umami.d.cts +7 -0
  769. package/dist/services/definitions/umami.d.cts.map +1 -0
  770. package/dist/services/definitions/uptime-kuma.cjs +53 -0
  771. package/dist/services/definitions/uptime-kuma.cjs.map +1 -0
  772. package/dist/services/definitions/uptime-kuma.d.cts +7 -0
  773. package/dist/services/definitions/uptime-kuma.d.cts.map +1 -0
  774. package/dist/services/definitions/uptime-kuma.mjs +2 -2
  775. package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
  776. package/dist/services/definitions/usesend.cjs +101 -0
  777. package/dist/services/definitions/usesend.cjs.map +1 -0
  778. package/dist/services/definitions/usesend.d.cts +7 -0
  779. package/dist/services/definitions/usesend.d.cts.map +1 -0
  780. package/dist/services/definitions/usesend.mjs +4 -4
  781. package/dist/services/definitions/usesend.mjs.map +1 -1
  782. package/dist/services/definitions/valkey.cjs +63 -0
  783. package/dist/services/definitions/valkey.cjs.map +1 -0
  784. package/dist/services/definitions/valkey.d.cts +7 -0
  785. package/dist/services/definitions/valkey.d.cts.map +1 -0
  786. package/dist/services/definitions/valkey.mjs +1 -1
  787. package/dist/services/definitions/valkey.mjs.map +1 -1
  788. package/dist/services/definitions/vaultwarden.cjs +65 -0
  789. package/dist/services/definitions/vaultwarden.cjs.map +1 -0
  790. package/dist/services/definitions/vaultwarden.d.cts +7 -0
  791. package/dist/services/definitions/vaultwarden.d.cts.map +1 -0
  792. package/dist/services/definitions/vaultwarden.mjs +2 -2
  793. package/dist/services/definitions/vaultwarden.mjs.map +1 -1
  794. package/dist/services/definitions/watchtower.cjs +49 -0
  795. package/dist/services/definitions/watchtower.cjs.map +1 -0
  796. package/dist/services/definitions/watchtower.d.cts +7 -0
  797. package/dist/services/definitions/watchtower.d.cts.map +1 -0
  798. package/dist/services/definitions/weaviate.cjs +92 -0
  799. package/dist/services/definitions/weaviate.cjs.map +1 -0
  800. package/dist/services/definitions/weaviate.d.cts +7 -0
  801. package/dist/services/definitions/weaviate.d.cts.map +1 -0
  802. package/dist/services/definitions/weaviate.mjs +2 -2
  803. package/dist/services/definitions/weaviate.mjs.map +1 -1
  804. package/dist/services/definitions/whisper.cjs +64 -0
  805. package/dist/services/definitions/whisper.cjs.map +1 -0
  806. package/dist/services/definitions/whisper.d.cts +7 -0
  807. package/dist/services/definitions/whisper.d.cts.map +1 -0
  808. package/dist/services/definitions/whisper.mjs +2 -2
  809. package/dist/services/definitions/whisper.mjs.map +1 -1
  810. package/dist/services/definitions/xyops.cjs +88 -0
  811. package/dist/services/definitions/xyops.cjs.map +1 -0
  812. package/dist/services/definitions/xyops.d.cts +7 -0
  813. package/dist/services/definitions/xyops.d.cts.map +1 -0
  814. package/dist/services/definitions/xyops.mjs +1 -1
  815. package/dist/services/definitions/xyops.mjs.map +1 -1
  816. package/dist/services/registry.cjs +35 -0
  817. package/dist/services/registry.cjs.map +1 -0
  818. package/dist/services/registry.d.cts +16 -0
  819. package/dist/services/registry.d.cts.map +1 -0
  820. package/dist/services/registry.test.cjs +63 -0
  821. package/dist/services/registry.test.cjs.map +1 -0
  822. package/dist/services/registry.test.d.cts +1 -0
  823. package/dist/services/registry.test.mjs +1 -1
  824. package/dist/skills/registry.cjs +712 -0
  825. package/dist/skills/registry.cjs.map +1 -0
  826. package/dist/skills/registry.d.cts +11 -0
  827. package/dist/skills/registry.d.cts.map +1 -0
  828. package/dist/skills/skill-manifest.cjs +23 -0
  829. package/dist/skills/skill-manifest.cjs.map +1 -0
  830. package/dist/skills/skill-manifest.d.cts +20 -0
  831. package/dist/skills/skill-manifest.d.cts.map +1 -0
  832. package/dist/types.cjs +149 -0
  833. package/dist/types.cjs.map +1 -0
  834. package/dist/types.d.cts +82 -0
  835. package/dist/types.d.cts.map +1 -0
  836. package/dist/types.d.mts +9 -2
  837. package/dist/types.d.mts.map +1 -1
  838. package/dist/types.mjs +40 -0
  839. package/dist/types.mjs.map +1 -1
  840. package/dist/validator.cjs +124 -0
  841. package/dist/validator.cjs.map +1 -0
  842. package/dist/validator.d.cts +20 -0
  843. package/dist/validator.d.cts.map +1 -0
  844. package/dist/validator.test.cjs +64 -0
  845. package/dist/validator.test.cjs.map +1 -0
  846. package/dist/validator.test.d.cts +1 -0
  847. package/dist/validator.test.mjs +1 -1
  848. package/dist/version-manager.cjs +65 -0
  849. package/dist/version-manager.cjs.map +1 -0
  850. package/dist/version-manager.d.cts +14 -0
  851. package/dist/version-manager.d.cts.map +1 -0
  852. package/dist/version-manager.test.cjs +101 -0
  853. package/dist/version-manager.test.cjs.map +1 -0
  854. package/dist/version-manager.test.d.cts +1 -0
  855. package/dist/version-manager.test.mjs +1 -1
  856. package/dist/vi.2VT5v0um-BmRMvymT.cjs +12934 -0
  857. package/dist/vi.2VT5v0um-BmRMvymT.cjs.map +1 -0
  858. package/dist/{vi.2VT5v0um-BgmKutxR.mjs → vi.2VT5v0um-CFyDIn0m.mjs} +5 -5
  859. package/dist/{vi.2VT5v0um-BgmKutxR.mjs.map → vi.2VT5v0um-CFyDIn0m.mjs.map} +1 -1
  860. package/package.json +24 -3
  861. package/src/__snapshots__/composer.snapshot.test.ts.snap +20 -20
  862. package/src/compose-validation.test.ts +102 -0
  863. package/src/composer.test.ts +1 -1
  864. package/src/composer.ts +331 -53
  865. package/src/deployers/coolify.ts +241 -0
  866. package/src/deployers/dokploy.ts +174 -0
  867. package/src/deployers/index.ts +36 -0
  868. package/src/deployers/types.ts +70 -0
  869. package/src/generate.ts +45 -1
  870. package/src/generators/cloud-init.ts +137 -0
  871. package/src/generators/env.ts +112 -6
  872. package/src/generators/health-check.ts +2 -2
  873. package/src/generators/openclaw-install-script.ts +77 -0
  874. package/src/generators/openclaw-json.ts +195 -58
  875. package/src/generators/postgres-init.ts +11 -0
  876. package/src/generators/readme.ts +103 -4
  877. package/src/generators/stack-manifest.ts +127 -0
  878. package/src/index.ts +30 -0
  879. package/src/port-scanner.ts +189 -0
  880. package/src/presets/presets.test.ts +73 -0
  881. package/src/presets/registry.test.ts +3 -0
  882. package/src/presets/registry.ts +30 -7
  883. package/src/resolver.ts +2 -0
  884. package/src/schema.ts +30 -1
  885. package/src/services/definitions/anything-llm.ts +2 -2
  886. package/src/services/definitions/appflowy.ts +1 -1
  887. package/src/services/definitions/authentik.ts +5 -5
  888. package/src/services/definitions/beszel.ts +1 -1
  889. package/src/services/definitions/browserless.ts +1 -1
  890. package/src/services/definitions/caddy.ts +2 -2
  891. package/src/services/definitions/cal-com.ts +2 -2
  892. package/src/services/definitions/chromadb.ts +3 -3
  893. package/src/services/definitions/claude-code.ts +1 -1
  894. package/src/services/definitions/code-server.ts +1 -1
  895. package/src/services/definitions/codex.ts +1 -1
  896. package/src/services/definitions/comfyui.ts +1 -1
  897. package/src/services/definitions/coolify.ts +1 -1
  898. package/src/services/definitions/crowdsec.ts +2 -2
  899. package/src/services/definitions/desktop-environment.ts +1 -1
  900. package/src/services/definitions/dify.ts +1 -1
  901. package/src/services/definitions/docsgpt.ts +1 -1
  902. package/src/services/definitions/dokploy.ts +2 -2
  903. package/src/services/definitions/dozzle.ts +1 -1
  904. package/src/services/definitions/ffmpeg.ts +2 -2
  905. package/src/services/definitions/flowise.ts +1 -1
  906. package/src/services/definitions/gemini-cli.ts +8 -1
  907. package/src/services/definitions/ghost.ts +1 -1
  908. package/src/services/definitions/gitea.ts +1 -1
  909. package/src/services/definitions/gotify.ts +3 -3
  910. package/src/services/definitions/grafana.ts +2 -2
  911. package/src/services/definitions/headscale.ts +68 -68
  912. package/src/services/definitions/hexstrike.ts +1 -1
  913. package/src/services/definitions/homeassistant.ts +1 -1
  914. package/src/services/definitions/immich.ts +6 -6
  915. package/src/services/definitions/jellyfin.ts +1 -1
  916. package/src/services/definitions/jenkins.ts +1 -1
  917. package/src/services/definitions/kimi.ts +1 -1
  918. package/src/services/definitions/lasuite-meet-agents.ts +1 -1
  919. package/src/services/definitions/lasuite-meet-backend.ts +3 -3
  920. package/src/services/definitions/lasuite-meet-frontend.ts +3 -3
  921. package/src/services/definitions/librechat.ts +1 -1
  922. package/src/services/definitions/litellm.ts +1 -1
  923. package/src/services/definitions/loki.ts +1 -1
  924. package/src/services/definitions/matomo.ts +1 -1
  925. package/src/services/definitions/matrix-synapse.ts +1 -1
  926. package/src/services/definitions/mattermost.ts +1 -1
  927. package/src/services/definitions/meilisearch.ts +4 -4
  928. package/src/services/definitions/milvus.ts +1 -1
  929. package/src/services/definitions/minio.ts +1 -1
  930. package/src/services/definitions/mixpost.ts +1 -1
  931. package/src/services/definitions/motion-canvas.ts +1 -1
  932. package/src/services/definitions/n8n.ts +1 -1
  933. package/src/services/definitions/neo4j.ts +1 -1
  934. package/src/services/definitions/nextcloud.ts +19 -19
  935. package/src/services/definitions/nocodb.ts +1 -1
  936. package/src/services/definitions/ntfy.ts +2 -2
  937. package/src/services/definitions/ollama.ts +1 -1
  938. package/src/services/definitions/open-webui.ts +1 -1
  939. package/src/services/definitions/opencode.ts +1 -1
  940. package/src/services/definitions/openpanel.ts +3 -3
  941. package/src/services/definitions/paperless-ngx.ts +1 -1
  942. package/src/services/definitions/pentagi.ts +2 -2
  943. package/src/services/definitions/playwright-server.ts +1 -1
  944. package/src/services/definitions/portainer.ts +1 -1
  945. package/src/services/definitions/postgresql.ts +1 -1
  946. package/src/services/definitions/postiz.ts +1 -1
  947. package/src/services/definitions/prometheus.ts +1 -1
  948. package/src/services/definitions/qdrant.ts +1 -1
  949. package/src/services/definitions/redis.ts +1 -1
  950. package/src/services/definitions/remotion.ts +1 -1
  951. package/src/services/definitions/rocketchat.ts +1 -1
  952. package/src/services/definitions/scrapling.ts +2 -2
  953. package/src/services/definitions/searxng.ts +1 -1
  954. package/src/services/definitions/signoz.ts +2 -2
  955. package/src/services/definitions/solidityguard.ts +1 -1
  956. package/src/services/definitions/stable-diffusion.ts +1 -1
  957. package/src/services/definitions/steel-browser.ts +1 -1
  958. package/src/services/definitions/stream-gateway.ts +2 -2
  959. package/src/services/definitions/supabase.ts +2 -2
  960. package/src/services/definitions/tailscale.ts +1 -1
  961. package/src/services/definitions/traefik.ts +1 -1
  962. package/src/services/definitions/uptime-kuma.ts +2 -2
  963. package/src/services/definitions/usesend.ts +4 -4
  964. package/src/services/definitions/valkey.ts +1 -1
  965. package/src/services/definitions/vaultwarden.ts +2 -2
  966. package/src/services/definitions/weaviate.ts +2 -2
  967. package/src/services/definitions/whisper.ts +2 -2
  968. package/src/services/definitions/xyops.ts +1 -1
  969. package/src/types.ts +138 -20
  970. package/tsdown.config.ts +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.cjs","names":["getSkillPackById","getServiceById"],"sources":["../src/resolver.ts"],"sourcesContent":["import { getServiceById } from \"./services/registry.js\";\nimport { getSkillPackById } from \"./skills/registry.js\";\nimport type {\n\tAddedDependency,\n\tResolvedService,\n\tResolverError,\n\tResolverInput,\n\tResolverOutput,\n\tServiceDefinition,\n\tWarning,\n} from \"./types.js\";\n\nexport interface MemoryThresholds {\n\tinfo: number;\n\twarning: number;\n\tcritical: number;\n}\n\nconst DEFAULT_MEMORY_THRESHOLDS: MemoryThresholds = {\n\tinfo: 2048,\n\twarning: 4096,\n\tcritical: 8192,\n};\n\n/**\n * Resolves user selections into a complete, valid service list.\n *\n * Algorithm:\n * 1. Expand skill pack requirements into service list\n * 2. Resolve transitive `requires` dependencies (iterate until stable)\n * 3. Detect `conflictsWith` violations\n * 4. Check platform compatibility and GPU requirements\n * 5. Estimate total memory (sum minMemoryMB)\n * 6. Deduplicate\n * 7. Topological sort by dependency graph, alphabetical for ties\n *\n * Deterministic: same input -> same output, always.\n */\nexport function resolve(input: ResolverInput): ResolverOutput {\n\tconst addedDependencies: AddedDependency[] = [];\n\tconst warnings: Warning[] = [];\n\tconst errors: ResolverError[] = [];\n\n\t// Track all service IDs needed\n\tconst serviceIds = new Set<string>(input.services);\n\tconst serviceAddedBy = new Map<string, ResolvedService[\"addedBy\"]>();\n\n\t// Mark user-selected services\n\tfor (const id of input.services) {\n\t\tserviceAddedBy.set(id, \"user\");\n\t}\n\n\t// 1. Expand skill pack requirements\n\tfor (const packId of input.skillPacks) {\n\t\tconst pack = getSkillPackById(packId);\n\t\tif (!pack) {\n\t\t\terrors.push({\n\t\t\t\ttype: \"unknown_skill_pack\",\n\t\t\t\tmessage: `Unknown skill pack: \"${packId}\"`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const requiredService of pack.requiredServices) {\n\t\t\tif (!serviceIds.has(requiredService)) {\n\t\t\t\tserviceIds.add(requiredService);\n\t\t\t\tserviceAddedBy.set(requiredService, \"skill-pack\");\n\t\t\t\taddedDependencies.push({\n\t\t\t\t\tservice: requiredService,\n\t\t\t\t\treason: `Required by skill pack: ${pack.name}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add proxy if specified\n\tif (input.proxy && input.proxy !== \"none\") {\n\t\tif (!serviceIds.has(input.proxy)) {\n\t\t\tserviceIds.add(input.proxy);\n\t\t\tserviceAddedBy.set(input.proxy, \"proxy\");\n\t\t\taddedDependencies.push({\n\t\t\t\tservice: input.proxy,\n\t\t\t\treason: `Selected as reverse proxy`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Add monitoring stack if requested\n\tif (input.monitoring) {\n\t\tconst monitoringServices = [\"uptime-kuma\", \"grafana\", \"prometheus\"];\n\t\tfor (const svc of monitoringServices) {\n\t\t\tif (!serviceIds.has(svc)) {\n\t\t\t\tserviceIds.add(svc);\n\t\t\t\tserviceAddedBy.set(svc, \"monitoring\");\n\t\t\t\taddedDependencies.push({\n\t\t\t\t\tservice: svc,\n\t\t\t\t\treason: \"Included with monitoring stack\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate all service IDs exist\n\tconst unknownIds: string[] = [];\n\tfor (const id of serviceIds) {\n\t\tif (!getServiceById(id)) {\n\t\t\tunknownIds.push(id);\n\t\t}\n\t}\n\tif (unknownIds.length > 0) {\n\t\tfor (const id of unknownIds) {\n\t\t\terrors.push({\n\t\t\t\ttype: \"unknown_service\",\n\t\t\t\tmessage: `Unknown service: \"${id}\"`,\n\t\t\t});\n\t\t\tserviceIds.delete(id);\n\t\t}\n\t}\n\n\t// 2. Resolve transitive dependencies (iterate until stable)\n\tlet changed = true;\n\tconst maxIterations = 50; // safety bound\n\tlet iteration = 0;\n\twhile (changed && iteration < maxIterations) {\n\t\tchanged = false;\n\t\titeration++;\n\t\tfor (const id of [...serviceIds]) {\n\t\t\tconst def = getServiceById(id);\n\t\t\tif (!def) continue;\n\t\t\tfor (const reqId of def.requires) {\n\t\t\t\tif (!serviceIds.has(reqId)) {\n\t\t\t\t\tserviceIds.add(reqId);\n\t\t\t\t\tserviceAddedBy.set(reqId, \"dependency\");\n\t\t\t\t\taddedDependencies.push({\n\t\t\t\t\t\tservice: reqId,\n\t\t\t\t\t\tserviceId: reqId,\n\t\t\t\t\t\trequiredBy: def.name,\n\t\t\t\t\t\treason: `Required by ${def.name}`,\n\t\t\t\t\t});\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (iteration >= maxIterations) {\n\t\twarnings.push({\n\t\t\ttype: \"resolution\",\n\t\t\tmessage: `Dependency resolution reached maximum iterations (${maxIterations}). Some transitive dependencies may not be fully resolved.`,\n\t\t});\n\t}\n\n\t// Check recommended services\n\tfor (const id of serviceIds) {\n\t\tconst def = getServiceById(id);\n\t\tif (!def) continue;\n\t\tfor (const recId of def.recommends) {\n\t\t\tif (!serviceIds.has(recId) && getServiceById(recId)) {\n\t\t\t\twarnings.push({\n\t\t\t\t\ttype: \"recommendation\",\n\t\t\t\t\tmessage: `${def.name} recommends \"${recId}\" for enhanced functionality`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 3. Detect conflicts\n\tconst resolvedDefs: ServiceDefinition[] = [];\n\tfor (const id of serviceIds) {\n\t\tconst def = getServiceById(id);\n\t\tif (def) resolvedDefs.push(def);\n\t}\n\n\tfor (let i = 0; i < resolvedDefs.length; i++) {\n\t\tfor (let j = i + 1; j < resolvedDefs.length; j++) {\n\t\t\tconst a = resolvedDefs[i]!;\n\t\t\tconst b = resolvedDefs[j]!;\n\t\t\tif (a.conflictsWith.includes(b.id) || b.conflictsWith.includes(a.id)) {\n\t\t\t\terrors.push({\n\t\t\t\t\ttype: \"conflict\",\n\t\t\t\t\tmessage: `${a.name} and ${b.name} cannot be used together`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 4. Check platform compatibility\n\tif (input.platform) {\n\t\tfor (const def of resolvedDefs) {\n\t\t\tif (def.platforms && def.platforms.length > 0 && !def.platforms.includes(input.platform)) {\n\t\t\t\twarnings.push({\n\t\t\t\t\ttype: \"platform\",\n\t\t\t\t\tmessage: `${def.name} may not be compatible with ${input.platform}. Supported: ${def.platforms.join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check GPU requirements\n\tconst gpuServices = resolvedDefs.filter((d) => d.gpuRequired);\n\tif (gpuServices.length > 0 && !input.gpu) {\n\t\tfor (const svc of gpuServices) {\n\t\t\twarnings.push({\n\t\t\t\ttype: \"gpu\",\n\t\t\t\tmessage: `${svc.name} requires GPU passthrough. Enable --gpu flag for optimal performance.`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// 5. Estimate total memory\n\tlet estimatedMemoryMB = 512; // Base for OpenClaw itself\n\tfor (const def of resolvedDefs) {\n\t\testimatedMemoryMB += def.minMemoryMB ?? 128;\n\t}\n\n\t// Memory warnings\n\tconst thresholds = input.memoryThresholds ?? DEFAULT_MEMORY_THRESHOLDS;\n\tif (estimatedMemoryMB > thresholds.critical) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required. Ensure your server has sufficient resources.`,\n\t\t});\n\t} else if (estimatedMemoryMB > thresholds.warning) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required. A server with at least 8GB RAM is recommended.`,\n\t\t});\n\t} else if (estimatedMemoryMB > thresholds.info) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required.`,\n\t\t});\n\t}\n\n\t// 7. Topological sort by dependency graph\n\tconst sorted = topologicalSort(resolvedDefs);\n\n\t// Build final resolved services list\n\tconst services: ResolvedService[] = sorted.map((def) => ({\n\t\tdefinition: def,\n\t\taddedBy: serviceAddedBy.get(def.id) ?? \"user\",\n\t}));\n\n\tconst isValid = errors.length === 0;\n\n\treturn {\n\t\tservices,\n\t\taddedDependencies,\n\t\tremovedConflicts: [],\n\t\twarnings,\n\t\terrors,\n\t\tisValid,\n\t\testimatedMemoryMB,\n\t\taiProviders: input.aiProviders ?? [],\n\t\tgsdRuntimes: [],\n\t};\n}\n\n/**\n * Topological sort using Kahn's algorithm.\n * Ties broken alphabetically by service ID for determinism.\n */\nfunction topologicalSort(definitions: ServiceDefinition[]): ServiceDefinition[] {\n\tconst idSet = new Set(definitions.map((d) => d.id));\n\tconst graph = new Map<string, string[]>(); // id -> list of IDs that depend on it\n\tconst inDegree = new Map<string, number>();\n\n\t// Initialize\n\tfor (const def of definitions) {\n\t\tgraph.set(def.id, []);\n\t\tinDegree.set(def.id, 0);\n\t}\n\n\t// Build edges: if A requires B, then B -> A (B must come before A)\n\tfor (const def of definitions) {\n\t\tfor (const reqId of [...def.requires, ...def.dependsOn]) {\n\t\t\tif (idSet.has(reqId)) {\n\t\t\t\tgraph.get(reqId)?.push(def.id);\n\t\t\t\tinDegree.set(def.id, (inDegree.get(def.id) ?? 0) + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Kahn's algorithm with alphabetical tie-breaking\n\tconst queue: string[] = [];\n\tfor (const [id, deg] of inDegree) {\n\t\tif (deg === 0) queue.push(id);\n\t}\n\tqueue.sort(); // alphabetical for determinism\n\n\tconst sorted: ServiceDefinition[] = [];\n\tconst defMap = new Map(definitions.map((d) => [d.id, d]));\n\n\twhile (queue.length > 0) {\n\t\tconst id = queue.shift()!;\n\t\tconst def = defMap.get(id);\n\t\tif (def) sorted.push(def);\n\n\t\tconst neighbors = graph.get(id) ?? [];\n\t\tconst newReady: string[] = [];\n\t\tfor (const neighbor of neighbors) {\n\t\t\tconst deg = (inDegree.get(neighbor) ?? 0) - 1;\n\t\t\tinDegree.set(neighbor, deg);\n\t\t\tif (deg === 0) newReady.push(neighbor);\n\t\t}\n\t\t// Sort newly ready nodes alphabetically and add to queue in order\n\t\tnewReady.sort();\n\t\tqueue.push(...newReady);\n\t}\n\n\t// If not all nodes are in sorted, there's a cycle\n\tif (sorted.length < definitions.length) {\n\t\t// Return what we have plus remaining (cycle detected but we still produce output)\n\t\tconst sortedIds = new Set(sorted.map((d) => d.id));\n\t\tconst remaining = definitions.filter((d) => !sortedIds.has(d.id));\n\t\tremaining.sort((a, b) => a.id.localeCompare(b.id));\n\t\tsorted.push(...remaining);\n\t}\n\n\treturn sorted;\n}\n"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ResolverInput, ResolverOutput } from "./types.cjs";
2
+
3
+ //#region src/resolver.d.ts
4
+ interface MemoryThresholds {
5
+ info: number;
6
+ warning: number;
7
+ critical: number;
8
+ }
9
+ /**
10
+ * Resolves user selections into a complete, valid service list.
11
+ *
12
+ * Algorithm:
13
+ * 1. Expand skill pack requirements into service list
14
+ * 2. Resolve transitive `requires` dependencies (iterate until stable)
15
+ * 3. Detect `conflictsWith` violations
16
+ * 4. Check platform compatibility and GPU requirements
17
+ * 5. Estimate total memory (sum minMemoryMB)
18
+ * 6. Deduplicate
19
+ * 7. Topological sort by dependency graph, alphabetical for ties
20
+ *
21
+ * Deterministic: same input -> same output, always.
22
+ */
23
+ declare function resolve(input: ResolverInput): ResolverOutput;
24
+ //#endregion
25
+ export { MemoryThresholds, resolve };
26
+ //# sourceMappingURL=resolver.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.cts","names":[],"sources":["../src/resolver.ts"],"mappings":";;;UAYiB,gBAAA;EAChB,IAAA;EACA,OAAA;EACA,QAAA;AAAA;;;;;;;AAuBD;;;;;;;;iBAAgB,OAAA,CAAQ,KAAA,EAAO,aAAA,GAAgB,cAAA"}
package/dist/resolver.mjs CHANGED
@@ -93,6 +93,8 @@ function resolve(input) {
93
93
  serviceAddedBy.set(reqId, "dependency");
94
94
  addedDependencies.push({
95
95
  service: reqId,
96
+ serviceId: reqId,
97
+ requiredBy: def.name,
96
98
  reason: `Required by ${def.name}`
97
99
  });
98
100
  changed = true;
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.mjs","names":[],"sources":["../src/resolver.ts"],"sourcesContent":["import { getServiceById } from \"./services/registry.js\";\nimport { getSkillPackById } from \"./skills/registry.js\";\nimport type {\n\tAddedDependency,\n\tResolvedService,\n\tResolverError,\n\tResolverInput,\n\tResolverOutput,\n\tServiceDefinition,\n\tWarning,\n} from \"./types.js\";\n\nexport interface MemoryThresholds {\n\tinfo: number;\n\twarning: number;\n\tcritical: number;\n}\n\nconst DEFAULT_MEMORY_THRESHOLDS: MemoryThresholds = {\n\tinfo: 2048,\n\twarning: 4096,\n\tcritical: 8192,\n};\n\n/**\n * Resolves user selections into a complete, valid service list.\n *\n * Algorithm:\n * 1. Expand skill pack requirements into service list\n * 2. Resolve transitive `requires` dependencies (iterate until stable)\n * 3. Detect `conflictsWith` violations\n * 4. Check platform compatibility and GPU requirements\n * 5. Estimate total memory (sum minMemoryMB)\n * 6. Deduplicate\n * 7. Topological sort by dependency graph, alphabetical for ties\n *\n * Deterministic: same input -> same output, always.\n */\nexport function resolve(input: ResolverInput): ResolverOutput {\n\tconst addedDependencies: AddedDependency[] = [];\n\tconst warnings: Warning[] = [];\n\tconst errors: ResolverError[] = [];\n\n\t// Track all service IDs needed\n\tconst serviceIds = new Set<string>(input.services);\n\tconst serviceAddedBy = new Map<string, ResolvedService[\"addedBy\"]>();\n\n\t// Mark user-selected services\n\tfor (const id of input.services) {\n\t\tserviceAddedBy.set(id, \"user\");\n\t}\n\n\t// 1. Expand skill pack requirements\n\tfor (const packId of input.skillPacks) {\n\t\tconst pack = getSkillPackById(packId);\n\t\tif (!pack) {\n\t\t\terrors.push({\n\t\t\t\ttype: \"unknown_skill_pack\",\n\t\t\t\tmessage: `Unknown skill pack: \"${packId}\"`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const requiredService of pack.requiredServices) {\n\t\t\tif (!serviceIds.has(requiredService)) {\n\t\t\t\tserviceIds.add(requiredService);\n\t\t\t\tserviceAddedBy.set(requiredService, \"skill-pack\");\n\t\t\t\taddedDependencies.push({\n\t\t\t\t\tservice: requiredService,\n\t\t\t\t\treason: `Required by skill pack: ${pack.name}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add proxy if specified\n\tif (input.proxy && input.proxy !== \"none\") {\n\t\tif (!serviceIds.has(input.proxy)) {\n\t\t\tserviceIds.add(input.proxy);\n\t\t\tserviceAddedBy.set(input.proxy, \"proxy\");\n\t\t\taddedDependencies.push({\n\t\t\t\tservice: input.proxy,\n\t\t\t\treason: `Selected as reverse proxy`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Add monitoring stack if requested\n\tif (input.monitoring) {\n\t\tconst monitoringServices = [\"uptime-kuma\", \"grafana\", \"prometheus\"];\n\t\tfor (const svc of monitoringServices) {\n\t\t\tif (!serviceIds.has(svc)) {\n\t\t\t\tserviceIds.add(svc);\n\t\t\t\tserviceAddedBy.set(svc, \"monitoring\");\n\t\t\t\taddedDependencies.push({\n\t\t\t\t\tservice: svc,\n\t\t\t\t\treason: \"Included with monitoring stack\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate all service IDs exist\n\tconst unknownIds: string[] = [];\n\tfor (const id of serviceIds) {\n\t\tif (!getServiceById(id)) {\n\t\t\tunknownIds.push(id);\n\t\t}\n\t}\n\tif (unknownIds.length > 0) {\n\t\tfor (const id of unknownIds) {\n\t\t\terrors.push({\n\t\t\t\ttype: \"unknown_service\",\n\t\t\t\tmessage: `Unknown service: \"${id}\"`,\n\t\t\t});\n\t\t\tserviceIds.delete(id);\n\t\t}\n\t}\n\n\t// 2. Resolve transitive dependencies (iterate until stable)\n\tlet changed = true;\n\tconst maxIterations = 50; // safety bound\n\tlet iteration = 0;\n\twhile (changed && iteration < maxIterations) {\n\t\tchanged = false;\n\t\titeration++;\n\t\tfor (const id of [...serviceIds]) {\n\t\t\tconst def = getServiceById(id);\n\t\t\tif (!def) continue;\n\t\t\tfor (const reqId of def.requires) {\n\t\t\t\tif (!serviceIds.has(reqId)) {\n\t\t\t\t\tserviceIds.add(reqId);\n\t\t\t\t\tserviceAddedBy.set(reqId, \"dependency\");\n\t\t\t\t\taddedDependencies.push({\n\t\t\t\t\t\tservice: reqId,\n\t\t\t\t\t\treason: `Required by ${def.name}`,\n\t\t\t\t\t});\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (iteration >= maxIterations) {\n\t\twarnings.push({\n\t\t\ttype: \"resolution\",\n\t\t\tmessage: `Dependency resolution reached maximum iterations (${maxIterations}). Some transitive dependencies may not be fully resolved.`,\n\t\t});\n\t}\n\n\t// Check recommended services\n\tfor (const id of serviceIds) {\n\t\tconst def = getServiceById(id);\n\t\tif (!def) continue;\n\t\tfor (const recId of def.recommends) {\n\t\t\tif (!serviceIds.has(recId) && getServiceById(recId)) {\n\t\t\t\twarnings.push({\n\t\t\t\t\ttype: \"recommendation\",\n\t\t\t\t\tmessage: `${def.name} recommends \"${recId}\" for enhanced functionality`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 3. Detect conflicts\n\tconst resolvedDefs: ServiceDefinition[] = [];\n\tfor (const id of serviceIds) {\n\t\tconst def = getServiceById(id);\n\t\tif (def) resolvedDefs.push(def);\n\t}\n\n\tfor (let i = 0; i < resolvedDefs.length; i++) {\n\t\tfor (let j = i + 1; j < resolvedDefs.length; j++) {\n\t\t\tconst a = resolvedDefs[i]!;\n\t\t\tconst b = resolvedDefs[j]!;\n\t\t\tif (a.conflictsWith.includes(b.id) || b.conflictsWith.includes(a.id)) {\n\t\t\t\terrors.push({\n\t\t\t\t\ttype: \"conflict\",\n\t\t\t\t\tmessage: `${a.name} and ${b.name} cannot be used together`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 4. Check platform compatibility\n\tif (input.platform) {\n\t\tfor (const def of resolvedDefs) {\n\t\t\tif (def.platforms && def.platforms.length > 0 && !def.platforms.includes(input.platform)) {\n\t\t\t\twarnings.push({\n\t\t\t\t\ttype: \"platform\",\n\t\t\t\t\tmessage: `${def.name} may not be compatible with ${input.platform}. Supported: ${def.platforms.join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check GPU requirements\n\tconst gpuServices = resolvedDefs.filter((d) => d.gpuRequired);\n\tif (gpuServices.length > 0 && !input.gpu) {\n\t\tfor (const svc of gpuServices) {\n\t\t\twarnings.push({\n\t\t\t\ttype: \"gpu\",\n\t\t\t\tmessage: `${svc.name} requires GPU passthrough. Enable --gpu flag for optimal performance.`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// 5. Estimate total memory\n\tlet estimatedMemoryMB = 512; // Base for OpenClaw itself\n\tfor (const def of resolvedDefs) {\n\t\testimatedMemoryMB += def.minMemoryMB ?? 128;\n\t}\n\n\t// Memory warnings\n\tconst thresholds = input.memoryThresholds ?? DEFAULT_MEMORY_THRESHOLDS;\n\tif (estimatedMemoryMB > thresholds.critical) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required. Ensure your server has sufficient resources.`,\n\t\t});\n\t} else if (estimatedMemoryMB > thresholds.warning) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required. A server with at least 8GB RAM is recommended.`,\n\t\t});\n\t} else if (estimatedMemoryMB > thresholds.info) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required.`,\n\t\t});\n\t}\n\n\t// 7. Topological sort by dependency graph\n\tconst sorted = topologicalSort(resolvedDefs);\n\n\t// Build final resolved services list\n\tconst services: ResolvedService[] = sorted.map((def) => ({\n\t\tdefinition: def,\n\t\taddedBy: serviceAddedBy.get(def.id) ?? \"user\",\n\t}));\n\n\tconst isValid = errors.length === 0;\n\n\treturn {\n\t\tservices,\n\t\taddedDependencies,\n\t\tremovedConflicts: [],\n\t\twarnings,\n\t\terrors,\n\t\tisValid,\n\t\testimatedMemoryMB,\n\t\taiProviders: input.aiProviders ?? [],\n\t\tgsdRuntimes: [],\n\t};\n}\n\n/**\n * Topological sort using Kahn's algorithm.\n * Ties broken alphabetically by service ID for determinism.\n */\nfunction topologicalSort(definitions: ServiceDefinition[]): ServiceDefinition[] {\n\tconst idSet = new Set(definitions.map((d) => d.id));\n\tconst graph = new Map<string, string[]>(); // id -> list of IDs that depend on it\n\tconst inDegree = new Map<string, number>();\n\n\t// Initialize\n\tfor (const def of definitions) {\n\t\tgraph.set(def.id, []);\n\t\tinDegree.set(def.id, 0);\n\t}\n\n\t// Build edges: if A requires B, then B -> A (B must come before A)\n\tfor (const def of definitions) {\n\t\tfor (const reqId of [...def.requires, ...def.dependsOn]) {\n\t\t\tif (idSet.has(reqId)) {\n\t\t\t\tgraph.get(reqId)?.push(def.id);\n\t\t\t\tinDegree.set(def.id, (inDegree.get(def.id) ?? 0) + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Kahn's algorithm with alphabetical tie-breaking\n\tconst queue: string[] = [];\n\tfor (const [id, deg] of inDegree) {\n\t\tif (deg === 0) queue.push(id);\n\t}\n\tqueue.sort(); // alphabetical for determinism\n\n\tconst sorted: ServiceDefinition[] = [];\n\tconst defMap = new Map(definitions.map((d) => [d.id, d]));\n\n\twhile (queue.length > 0) {\n\t\tconst id = queue.shift()!;\n\t\tconst def = defMap.get(id);\n\t\tif (def) sorted.push(def);\n\n\t\tconst neighbors = graph.get(id) ?? [];\n\t\tconst newReady: string[] = [];\n\t\tfor (const neighbor of neighbors) {\n\t\t\tconst deg = (inDegree.get(neighbor) ?? 0) - 1;\n\t\t\tinDegree.set(neighbor, deg);\n\t\t\tif (deg === 0) newReady.push(neighbor);\n\t\t}\n\t\t// Sort newly ready nodes alphabetically and add to queue in order\n\t\tnewReady.sort();\n\t\tqueue.push(...newReady);\n\t}\n\n\t// If not all nodes are in sorted, there's a cycle\n\tif (sorted.length < definitions.length) {\n\t\t// Return what we have plus remaining (cycle detected but we still produce output)\n\t\tconst sortedIds = new Set(sorted.map((d) => d.id));\n\t\tconst remaining = definitions.filter((d) => !sortedIds.has(d.id));\n\t\tremaining.sort((a, b) => a.id.localeCompare(b.id));\n\t\tsorted.push(...remaining);\n\t}\n\n\treturn sorted;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolver.mjs","names":[],"sources":["../src/resolver.ts"],"sourcesContent":["import { getServiceById } from \"./services/registry.js\";\nimport { getSkillPackById } from \"./skills/registry.js\";\nimport type {\n\tAddedDependency,\n\tResolvedService,\n\tResolverError,\n\tResolverInput,\n\tResolverOutput,\n\tServiceDefinition,\n\tWarning,\n} from \"./types.js\";\n\nexport interface MemoryThresholds {\n\tinfo: number;\n\twarning: number;\n\tcritical: number;\n}\n\nconst DEFAULT_MEMORY_THRESHOLDS: MemoryThresholds = {\n\tinfo: 2048,\n\twarning: 4096,\n\tcritical: 8192,\n};\n\n/**\n * Resolves user selections into a complete, valid service list.\n *\n * Algorithm:\n * 1. Expand skill pack requirements into service list\n * 2. Resolve transitive `requires` dependencies (iterate until stable)\n * 3. Detect `conflictsWith` violations\n * 4. Check platform compatibility and GPU requirements\n * 5. Estimate total memory (sum minMemoryMB)\n * 6. Deduplicate\n * 7. Topological sort by dependency graph, alphabetical for ties\n *\n * Deterministic: same input -> same output, always.\n */\nexport function resolve(input: ResolverInput): ResolverOutput {\n\tconst addedDependencies: AddedDependency[] = [];\n\tconst warnings: Warning[] = [];\n\tconst errors: ResolverError[] = [];\n\n\t// Track all service IDs needed\n\tconst serviceIds = new Set<string>(input.services);\n\tconst serviceAddedBy = new Map<string, ResolvedService[\"addedBy\"]>();\n\n\t// Mark user-selected services\n\tfor (const id of input.services) {\n\t\tserviceAddedBy.set(id, \"user\");\n\t}\n\n\t// 1. Expand skill pack requirements\n\tfor (const packId of input.skillPacks) {\n\t\tconst pack = getSkillPackById(packId);\n\t\tif (!pack) {\n\t\t\terrors.push({\n\t\t\t\ttype: \"unknown_skill_pack\",\n\t\t\t\tmessage: `Unknown skill pack: \"${packId}\"`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const requiredService of pack.requiredServices) {\n\t\t\tif (!serviceIds.has(requiredService)) {\n\t\t\t\tserviceIds.add(requiredService);\n\t\t\t\tserviceAddedBy.set(requiredService, \"skill-pack\");\n\t\t\t\taddedDependencies.push({\n\t\t\t\t\tservice: requiredService,\n\t\t\t\t\treason: `Required by skill pack: ${pack.name}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add proxy if specified\n\tif (input.proxy && input.proxy !== \"none\") {\n\t\tif (!serviceIds.has(input.proxy)) {\n\t\t\tserviceIds.add(input.proxy);\n\t\t\tserviceAddedBy.set(input.proxy, \"proxy\");\n\t\t\taddedDependencies.push({\n\t\t\t\tservice: input.proxy,\n\t\t\t\treason: `Selected as reverse proxy`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Add monitoring stack if requested\n\tif (input.monitoring) {\n\t\tconst monitoringServices = [\"uptime-kuma\", \"grafana\", \"prometheus\"];\n\t\tfor (const svc of monitoringServices) {\n\t\t\tif (!serviceIds.has(svc)) {\n\t\t\t\tserviceIds.add(svc);\n\t\t\t\tserviceAddedBy.set(svc, \"monitoring\");\n\t\t\t\taddedDependencies.push({\n\t\t\t\t\tservice: svc,\n\t\t\t\t\treason: \"Included with monitoring stack\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate all service IDs exist\n\tconst unknownIds: string[] = [];\n\tfor (const id of serviceIds) {\n\t\tif (!getServiceById(id)) {\n\t\t\tunknownIds.push(id);\n\t\t}\n\t}\n\tif (unknownIds.length > 0) {\n\t\tfor (const id of unknownIds) {\n\t\t\terrors.push({\n\t\t\t\ttype: \"unknown_service\",\n\t\t\t\tmessage: `Unknown service: \"${id}\"`,\n\t\t\t});\n\t\t\tserviceIds.delete(id);\n\t\t}\n\t}\n\n\t// 2. Resolve transitive dependencies (iterate until stable)\n\tlet changed = true;\n\tconst maxIterations = 50; // safety bound\n\tlet iteration = 0;\n\twhile (changed && iteration < maxIterations) {\n\t\tchanged = false;\n\t\titeration++;\n\t\tfor (const id of [...serviceIds]) {\n\t\t\tconst def = getServiceById(id);\n\t\t\tif (!def) continue;\n\t\t\tfor (const reqId of def.requires) {\n\t\t\t\tif (!serviceIds.has(reqId)) {\n\t\t\t\t\tserviceIds.add(reqId);\n\t\t\t\t\tserviceAddedBy.set(reqId, \"dependency\");\n\t\t\t\t\taddedDependencies.push({\n\t\t\t\t\t\tservice: reqId,\n\t\t\t\t\t\tserviceId: reqId,\n\t\t\t\t\t\trequiredBy: def.name,\n\t\t\t\t\t\treason: `Required by ${def.name}`,\n\t\t\t\t\t});\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (iteration >= maxIterations) {\n\t\twarnings.push({\n\t\t\ttype: \"resolution\",\n\t\t\tmessage: `Dependency resolution reached maximum iterations (${maxIterations}). Some transitive dependencies may not be fully resolved.`,\n\t\t});\n\t}\n\n\t// Check recommended services\n\tfor (const id of serviceIds) {\n\t\tconst def = getServiceById(id);\n\t\tif (!def) continue;\n\t\tfor (const recId of def.recommends) {\n\t\t\tif (!serviceIds.has(recId) && getServiceById(recId)) {\n\t\t\t\twarnings.push({\n\t\t\t\t\ttype: \"recommendation\",\n\t\t\t\t\tmessage: `${def.name} recommends \"${recId}\" for enhanced functionality`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 3. Detect conflicts\n\tconst resolvedDefs: ServiceDefinition[] = [];\n\tfor (const id of serviceIds) {\n\t\tconst def = getServiceById(id);\n\t\tif (def) resolvedDefs.push(def);\n\t}\n\n\tfor (let i = 0; i < resolvedDefs.length; i++) {\n\t\tfor (let j = i + 1; j < resolvedDefs.length; j++) {\n\t\t\tconst a = resolvedDefs[i]!;\n\t\t\tconst b = resolvedDefs[j]!;\n\t\t\tif (a.conflictsWith.includes(b.id) || b.conflictsWith.includes(a.id)) {\n\t\t\t\terrors.push({\n\t\t\t\t\ttype: \"conflict\",\n\t\t\t\t\tmessage: `${a.name} and ${b.name} cannot be used together`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 4. Check platform compatibility\n\tif (input.platform) {\n\t\tfor (const def of resolvedDefs) {\n\t\t\tif (def.platforms && def.platforms.length > 0 && !def.platforms.includes(input.platform)) {\n\t\t\t\twarnings.push({\n\t\t\t\t\ttype: \"platform\",\n\t\t\t\t\tmessage: `${def.name} may not be compatible with ${input.platform}. Supported: ${def.platforms.join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check GPU requirements\n\tconst gpuServices = resolvedDefs.filter((d) => d.gpuRequired);\n\tif (gpuServices.length > 0 && !input.gpu) {\n\t\tfor (const svc of gpuServices) {\n\t\t\twarnings.push({\n\t\t\t\ttype: \"gpu\",\n\t\t\t\tmessage: `${svc.name} requires GPU passthrough. Enable --gpu flag for optimal performance.`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// 5. Estimate total memory\n\tlet estimatedMemoryMB = 512; // Base for OpenClaw itself\n\tfor (const def of resolvedDefs) {\n\t\testimatedMemoryMB += def.minMemoryMB ?? 128;\n\t}\n\n\t// Memory warnings\n\tconst thresholds = input.memoryThresholds ?? DEFAULT_MEMORY_THRESHOLDS;\n\tif (estimatedMemoryMB > thresholds.critical) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required. Ensure your server has sufficient resources.`,\n\t\t});\n\t} else if (estimatedMemoryMB > thresholds.warning) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required. A server with at least 8GB RAM is recommended.`,\n\t\t});\n\t} else if (estimatedMemoryMB > thresholds.info) {\n\t\twarnings.push({\n\t\t\ttype: \"memory\",\n\t\t\tmessage: `Estimated ${(estimatedMemoryMB / 1024).toFixed(1)}GB RAM required.`,\n\t\t});\n\t}\n\n\t// 7. Topological sort by dependency graph\n\tconst sorted = topologicalSort(resolvedDefs);\n\n\t// Build final resolved services list\n\tconst services: ResolvedService[] = sorted.map((def) => ({\n\t\tdefinition: def,\n\t\taddedBy: serviceAddedBy.get(def.id) ?? \"user\",\n\t}));\n\n\tconst isValid = errors.length === 0;\n\n\treturn {\n\t\tservices,\n\t\taddedDependencies,\n\t\tremovedConflicts: [],\n\t\twarnings,\n\t\terrors,\n\t\tisValid,\n\t\testimatedMemoryMB,\n\t\taiProviders: input.aiProviders ?? [],\n\t\tgsdRuntimes: [],\n\t};\n}\n\n/**\n * Topological sort using Kahn's algorithm.\n * Ties broken alphabetically by service ID for determinism.\n */\nfunction topologicalSort(definitions: ServiceDefinition[]): ServiceDefinition[] {\n\tconst idSet = new Set(definitions.map((d) => d.id));\n\tconst graph = new Map<string, string[]>(); // id -> list of IDs that depend on it\n\tconst inDegree = new Map<string, number>();\n\n\t// Initialize\n\tfor (const def of definitions) {\n\t\tgraph.set(def.id, []);\n\t\tinDegree.set(def.id, 0);\n\t}\n\n\t// Build edges: if A requires B, then B -> A (B must come before A)\n\tfor (const def of definitions) {\n\t\tfor (const reqId of [...def.requires, ...def.dependsOn]) {\n\t\t\tif (idSet.has(reqId)) {\n\t\t\t\tgraph.get(reqId)?.push(def.id);\n\t\t\t\tinDegree.set(def.id, (inDegree.get(def.id) ?? 0) + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Kahn's algorithm with alphabetical tie-breaking\n\tconst queue: string[] = [];\n\tfor (const [id, deg] of inDegree) {\n\t\tif (deg === 0) queue.push(id);\n\t}\n\tqueue.sort(); // alphabetical for determinism\n\n\tconst sorted: ServiceDefinition[] = [];\n\tconst defMap = new Map(definitions.map((d) => [d.id, d]));\n\n\twhile (queue.length > 0) {\n\t\tconst id = queue.shift()!;\n\t\tconst def = defMap.get(id);\n\t\tif (def) sorted.push(def);\n\n\t\tconst neighbors = graph.get(id) ?? [];\n\t\tconst newReady: string[] = [];\n\t\tfor (const neighbor of neighbors) {\n\t\t\tconst deg = (inDegree.get(neighbor) ?? 0) - 1;\n\t\t\tinDegree.set(neighbor, deg);\n\t\t\tif (deg === 0) newReady.push(neighbor);\n\t\t}\n\t\t// Sort newly ready nodes alphabetically and add to queue in order\n\t\tnewReady.sort();\n\t\tqueue.push(...newReady);\n\t}\n\n\t// If not all nodes are in sorted, there's a cycle\n\tif (sorted.length < definitions.length) {\n\t\t// Return what we have plus remaining (cycle detected but we still produce output)\n\t\tconst sortedIds = new Set(sorted.map((d) => d.id));\n\t\tconst remaining = definitions.filter((d) => !sortedIds.has(d.id));\n\t\tremaining.sort((a, b) => a.id.localeCompare(b.id));\n\t\tsorted.push(...remaining);\n\t}\n\n\treturn sorted;\n}\n"],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ const require_vi_2VT5v0um = require('./vi.2VT5v0um-BmRMvymT.cjs');
2
+ const require_resolver = require('./resolver.cjs');
3
+
4
+ //#region src/resolver.test.ts
5
+ require_vi_2VT5v0um.describe("resolve", () => {
6
+ require_vi_2VT5v0um.it("returns empty services for empty input", () => {
7
+ const result = require_resolver.resolve({
8
+ services: [],
9
+ skillPacks: []
10
+ });
11
+ require_vi_2VT5v0um.globalExpect(result.services).toHaveLength(0);
12
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
13
+ require_vi_2VT5v0um.globalExpect(result.estimatedMemoryMB).toBe(512);
14
+ });
15
+ require_vi_2VT5v0um.it("resolves a single service with no dependencies", () => {
16
+ const result = require_resolver.resolve({
17
+ services: ["redis"],
18
+ skillPacks: []
19
+ });
20
+ require_vi_2VT5v0um.globalExpect(result.services).toHaveLength(1);
21
+ require_vi_2VT5v0um.globalExpect(result.services[0].definition.id).toBe("redis");
22
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
23
+ });
24
+ require_vi_2VT5v0um.it("auto-adds PostgreSQL when n8n is selected", () => {
25
+ const result = require_resolver.resolve({
26
+ services: ["n8n"],
27
+ skillPacks: []
28
+ });
29
+ const ids = result.services.map((s) => s.definition.id);
30
+ require_vi_2VT5v0um.globalExpect(ids).toContain("n8n");
31
+ require_vi_2VT5v0um.globalExpect(ids).toContain("postgresql");
32
+ require_vi_2VT5v0um.globalExpect(result.addedDependencies).toContainEqual(require_vi_2VT5v0um.globalExpect.objectContaining({ service: "postgresql" }));
33
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
34
+ });
35
+ require_vi_2VT5v0um.it("auto-adds Prometheus when Grafana is selected", () => {
36
+ const ids = require_resolver.resolve({
37
+ services: ["grafana"],
38
+ skillPacks: []
39
+ }).services.map((s) => s.definition.id);
40
+ require_vi_2VT5v0um.globalExpect(ids).toContain("grafana");
41
+ require_vi_2VT5v0um.globalExpect(ids).toContain("prometheus");
42
+ });
43
+ require_vi_2VT5v0um.it("detects Redis + Valkey conflict", () => {
44
+ const result = require_resolver.resolve({
45
+ services: ["redis", "valkey"],
46
+ skillPacks: []
47
+ });
48
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(false);
49
+ require_vi_2VT5v0um.globalExpect(result.errors).toContainEqual(require_vi_2VT5v0um.globalExpect.objectContaining({ type: "conflict" }));
50
+ });
51
+ require_vi_2VT5v0um.it("detects Caddy + Traefik conflict", () => {
52
+ const result = require_resolver.resolve({
53
+ services: ["caddy", "traefik"],
54
+ skillPacks: []
55
+ });
56
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(false);
57
+ require_vi_2VT5v0um.globalExpect(result.errors).toContainEqual(require_vi_2VT5v0um.globalExpect.objectContaining({ type: "conflict" }));
58
+ });
59
+ require_vi_2VT5v0um.it("expands research-agent skill pack", () => {
60
+ const result = require_resolver.resolve({
61
+ services: [],
62
+ skillPacks: ["research-agent"]
63
+ });
64
+ const ids = result.services.map((s) => s.definition.id);
65
+ require_vi_2VT5v0um.globalExpect(ids).toContain("qdrant");
66
+ require_vi_2VT5v0um.globalExpect(ids).toContain("searxng");
67
+ require_vi_2VT5v0um.globalExpect(ids).toContain("browserless");
68
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
69
+ });
70
+ require_vi_2VT5v0um.it("expands video-creator skill pack", () => {
71
+ const ids = require_resolver.resolve({
72
+ services: [],
73
+ skillPacks: ["video-creator"]
74
+ }).services.map((s) => s.definition.id);
75
+ require_vi_2VT5v0um.globalExpect(ids).toContain("ffmpeg");
76
+ require_vi_2VT5v0um.globalExpect(ids).toContain("remotion");
77
+ require_vi_2VT5v0um.globalExpect(ids).toContain("minio");
78
+ });
79
+ require_vi_2VT5v0um.it("expands dev-ops skill pack with transitive deps", () => {
80
+ const ids = require_resolver.resolve({
81
+ services: [],
82
+ skillPacks: ["dev-ops"]
83
+ }).services.map((s) => s.definition.id);
84
+ require_vi_2VT5v0um.globalExpect(ids).toContain("n8n");
85
+ require_vi_2VT5v0um.globalExpect(ids).toContain("redis");
86
+ require_vi_2VT5v0um.globalExpect(ids).toContain("uptime-kuma");
87
+ require_vi_2VT5v0um.globalExpect(ids).toContain("grafana");
88
+ require_vi_2VT5v0um.globalExpect(ids).toContain("prometheus");
89
+ require_vi_2VT5v0um.globalExpect(ids).toContain("postgresql");
90
+ });
91
+ require_vi_2VT5v0um.it("reports unknown service IDs", () => {
92
+ require_vi_2VT5v0um.globalExpect(require_resolver.resolve({
93
+ services: ["nonexistent"],
94
+ skillPacks: []
95
+ }).errors).toContainEqual(require_vi_2VT5v0um.globalExpect.objectContaining({ type: "unknown_service" }));
96
+ });
97
+ require_vi_2VT5v0um.it("reports unknown skill pack IDs", () => {
98
+ require_vi_2VT5v0um.globalExpect(require_resolver.resolve({
99
+ services: [],
100
+ skillPacks: ["nonexistent-pack"]
101
+ }).errors).toContainEqual(require_vi_2VT5v0um.globalExpect.objectContaining({ type: "unknown_skill_pack" }));
102
+ });
103
+ require_vi_2VT5v0um.it("does not duplicate services already selected by user", () => {
104
+ const qdrantCount = require_resolver.resolve({
105
+ services: [
106
+ "qdrant",
107
+ "searxng",
108
+ "browserless"
109
+ ],
110
+ skillPacks: ["research-agent"]
111
+ }).services.map((s) => s.definition.id).filter((id) => id === "qdrant").length;
112
+ require_vi_2VT5v0um.globalExpect(qdrantCount).toBe(1);
113
+ });
114
+ require_vi_2VT5v0um.it("estimates memory correctly", () => {
115
+ require_vi_2VT5v0um.globalExpect(require_resolver.resolve({
116
+ services: ["redis"],
117
+ skillPacks: []
118
+ }).estimatedMemoryMB).toBe(640);
119
+ });
120
+ require_vi_2VT5v0um.it("adds proxy service when specified", () => {
121
+ require_vi_2VT5v0um.globalExpect(require_resolver.resolve({
122
+ services: ["redis"],
123
+ skillPacks: [],
124
+ proxy: "caddy"
125
+ }).services.map((s) => s.definition.id)).toContain("caddy");
126
+ });
127
+ require_vi_2VT5v0um.it("adds monitoring stack when flag is set", () => {
128
+ const ids = require_resolver.resolve({
129
+ services: [],
130
+ skillPacks: [],
131
+ monitoring: true
132
+ }).services.map((s) => s.definition.id);
133
+ require_vi_2VT5v0um.globalExpect(ids).toContain("uptime-kuma");
134
+ require_vi_2VT5v0um.globalExpect(ids).toContain("grafana");
135
+ require_vi_2VT5v0um.globalExpect(ids).toContain("prometheus");
136
+ });
137
+ require_vi_2VT5v0um.it("is deterministic - same input gives same output", () => {
138
+ const input = {
139
+ services: [
140
+ "redis",
141
+ "qdrant",
142
+ "n8n"
143
+ ],
144
+ skillPacks: ["research-agent"]
145
+ };
146
+ const result1 = require_resolver.resolve(input);
147
+ const result2 = require_resolver.resolve(input);
148
+ const ids1 = result1.services.map((s) => s.definition.id);
149
+ const ids2 = result2.services.map((s) => s.definition.id);
150
+ require_vi_2VT5v0um.globalExpect(ids1).toEqual(ids2);
151
+ });
152
+ require_vi_2VT5v0um.it("topologically sorts dependencies before dependents", () => {
153
+ const ids = require_resolver.resolve({
154
+ services: ["n8n"],
155
+ skillPacks: []
156
+ }).services.map((s) => s.definition.id);
157
+ const pgIndex = ids.indexOf("postgresql");
158
+ const n8nIndex = ids.indexOf("n8n");
159
+ require_vi_2VT5v0um.globalExpect(pgIndex).toBeLessThan(n8nIndex);
160
+ });
161
+ require_vi_2VT5v0um.it("warns about GPU when AI services selected without gpu flag", () => {
162
+ require_vi_2VT5v0um.globalExpect(require_resolver.resolve({
163
+ services: ["redis"],
164
+ skillPacks: [],
165
+ gpu: false
166
+ }).warnings.filter((w) => w.type === "gpu")).toHaveLength(0);
167
+ });
168
+ require_vi_2VT5v0um.it("resolves tailscale as single service with no dependencies", () => {
169
+ const result = require_resolver.resolve({
170
+ services: ["tailscale"],
171
+ skillPacks: []
172
+ });
173
+ require_vi_2VT5v0um.globalExpect(result.services).toHaveLength(1);
174
+ require_vi_2VT5v0um.globalExpect(result.services[0].definition.id).toBe("tailscale");
175
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
176
+ });
177
+ require_vi_2VT5v0um.it("resolves coolify and dokploy as single services", () => {
178
+ const result = require_resolver.resolve({
179
+ services: ["coolify", "dokploy"],
180
+ skillPacks: []
181
+ });
182
+ const ids = result.services.map((s) => s.definition.id);
183
+ require_vi_2VT5v0um.globalExpect(ids).toContain("coolify");
184
+ require_vi_2VT5v0um.globalExpect(ids).toContain("dokploy");
185
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
186
+ });
187
+ require_vi_2VT5v0um.it("auto-adds postgresql, redis, and livekit when lasuite-meet-backend is selected", () => {
188
+ const result = require_resolver.resolve({
189
+ services: ["lasuite-meet-backend"],
190
+ skillPacks: []
191
+ });
192
+ const ids = result.services.map((s) => s.definition.id);
193
+ require_vi_2VT5v0um.globalExpect(ids).toContain("lasuite-meet-backend");
194
+ require_vi_2VT5v0um.globalExpect(ids).toContain("postgresql");
195
+ require_vi_2VT5v0um.globalExpect(ids).toContain("redis");
196
+ require_vi_2VT5v0um.globalExpect(ids).toContain("livekit");
197
+ require_vi_2VT5v0um.globalExpect(result.addedDependencies.some((a) => a.service === "postgresql")).toBe(true);
198
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
199
+ });
200
+ require_vi_2VT5v0um.it("resolves La Suite Meet preset (postgresql, redis, livekit, backend, frontend, agents)", () => {
201
+ const lasuiteMeetServices = [
202
+ "postgresql",
203
+ "redis",
204
+ "livekit",
205
+ "lasuite-meet-backend",
206
+ "lasuite-meet-frontend",
207
+ "lasuite-meet-agents"
208
+ ];
209
+ const result = require_resolver.resolve({
210
+ services: lasuiteMeetServices,
211
+ skillPacks: []
212
+ });
213
+ const ids = result.services.map((s) => s.definition.id);
214
+ for (const id of lasuiteMeetServices) require_vi_2VT5v0um.globalExpect(ids).toContain(id);
215
+ require_vi_2VT5v0um.globalExpect(result.isValid).toBe(true);
216
+ });
217
+ require_vi_2VT5v0um.it("orders lasuite-meet-backend after postgresql, redis, and livekit", () => {
218
+ const ids = require_resolver.resolve({
219
+ services: ["lasuite-meet-backend", "lasuite-meet-frontend"],
220
+ skillPacks: []
221
+ }).services.map((s) => s.definition.id);
222
+ const pgIdx = ids.indexOf("postgresql");
223
+ const redisIdx = ids.indexOf("redis");
224
+ const livekitIdx = ids.indexOf("livekit");
225
+ const backendIdx = ids.indexOf("lasuite-meet-backend");
226
+ const frontendIdx = ids.indexOf("lasuite-meet-frontend");
227
+ require_vi_2VT5v0um.globalExpect(pgIdx).toBeGreaterThanOrEqual(0);
228
+ require_vi_2VT5v0um.globalExpect(backendIdx).toBeGreaterThan(pgIdx);
229
+ require_vi_2VT5v0um.globalExpect(backendIdx).toBeGreaterThan(redisIdx);
230
+ require_vi_2VT5v0um.globalExpect(backendIdx).toBeGreaterThan(livekitIdx);
231
+ require_vi_2VT5v0um.globalExpect(frontendIdx).toBeGreaterThan(backendIdx);
232
+ });
233
+ });
234
+
235
+ //#endregion
236
+ //# sourceMappingURL=resolver.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.test.cjs","names":["describe","resolve","expect"],"sources":["../src/resolver.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"./resolver.js\";\n\ndescribe(\"resolve\", () => {\n\tit(\"returns empty services for empty input\", () => {\n\t\tconst result = resolve({ services: [], skillPacks: [] });\n\t\texpect(result.services).toHaveLength(0);\n\t\texpect(result.isValid).toBe(true);\n\t\texpect(result.estimatedMemoryMB).toBe(512); // base OpenClaw only\n\t});\n\n\tit(\"resolves a single service with no dependencies\", () => {\n\t\tconst result = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\texpect(result.services).toHaveLength(1);\n\t\texpect(result.services[0]!.definition.id).toBe(\"redis\");\n\t\texpect(result.isValid).toBe(true);\n\t});\n\n\tit(\"auto-adds PostgreSQL when n8n is selected\", () => {\n\t\tconst result = resolve({ services: [\"n8n\"], skillPacks: [] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"n8n\");\n\t\texpect(ids).toContain(\"postgresql\");\n\t\texpect(result.addedDependencies).toContainEqual(\n\t\t\texpect.objectContaining({ service: \"postgresql\" }),\n\t\t);\n\t\texpect(result.isValid).toBe(true);\n\t});\n\n\tit(\"auto-adds Prometheus when Grafana is selected\", () => {\n\t\tconst result = resolve({ services: [\"grafana\"], skillPacks: [] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"grafana\");\n\t\texpect(ids).toContain(\"prometheus\");\n\t});\n\n\tit(\"detects Redis + Valkey conflict\", () => {\n\t\tconst result = resolve({ services: [\"redis\", \"valkey\"], skillPacks: [] });\n\t\texpect(result.isValid).toBe(false);\n\t\texpect(result.errors).toContainEqual(expect.objectContaining({ type: \"conflict\" }));\n\t});\n\n\tit(\"detects Caddy + Traefik conflict\", () => {\n\t\tconst result = resolve({ services: [\"caddy\", \"traefik\"], skillPacks: [] });\n\t\texpect(result.isValid).toBe(false);\n\t\texpect(result.errors).toContainEqual(expect.objectContaining({ type: \"conflict\" }));\n\t});\n\n\tit(\"expands research-agent skill pack\", () => {\n\t\tconst result = resolve({ services: [], skillPacks: [\"research-agent\"] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"qdrant\");\n\t\texpect(ids).toContain(\"searxng\");\n\t\texpect(ids).toContain(\"browserless\");\n\t\texpect(result.isValid).toBe(true);\n\t});\n\n\tit(\"expands video-creator skill pack\", () => {\n\t\tconst result = resolve({ services: [], skillPacks: [\"video-creator\"] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"ffmpeg\");\n\t\texpect(ids).toContain(\"remotion\");\n\t\texpect(ids).toContain(\"minio\");\n\t});\n\n\tit(\"expands dev-ops skill pack with transitive deps\", () => {\n\t\tconst result = resolve({ services: [], skillPacks: [\"dev-ops\"] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"n8n\");\n\t\texpect(ids).toContain(\"redis\");\n\t\texpect(ids).toContain(\"uptime-kuma\");\n\t\texpect(ids).toContain(\"grafana\");\n\t\texpect(ids).toContain(\"prometheus\");\n\t\t// n8n requires postgresql (transitive)\n\t\texpect(ids).toContain(\"postgresql\");\n\t});\n\n\tit(\"reports unknown service IDs\", () => {\n\t\tconst result = resolve({ services: [\"nonexistent\"], skillPacks: [] });\n\t\texpect(result.errors).toContainEqual(expect.objectContaining({ type: \"unknown_service\" }));\n\t});\n\n\tit(\"reports unknown skill pack IDs\", () => {\n\t\tconst result = resolve({ services: [], skillPacks: [\"nonexistent-pack\"] });\n\t\texpect(result.errors).toContainEqual(expect.objectContaining({ type: \"unknown_skill_pack\" }));\n\t});\n\n\tit(\"does not duplicate services already selected by user\", () => {\n\t\tconst result = resolve({\n\t\t\tservices: [\"qdrant\", \"searxng\", \"browserless\"],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t});\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\tconst qdrantCount = ids.filter((id) => id === \"qdrant\").length;\n\t\texpect(qdrantCount).toBe(1);\n\t});\n\n\tit(\"estimates memory correctly\", () => {\n\t\tconst result = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\t// 512 (base) + 128 (redis) = 640\n\t\texpect(result.estimatedMemoryMB).toBe(640);\n\t});\n\n\tit(\"adds proxy service when specified\", () => {\n\t\tconst result = resolve({ services: [\"redis\"], skillPacks: [], proxy: \"caddy\" });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"caddy\");\n\t});\n\n\tit(\"adds monitoring stack when flag is set\", () => {\n\t\tconst result = resolve({ services: [], skillPacks: [], monitoring: true });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"uptime-kuma\");\n\t\texpect(ids).toContain(\"grafana\");\n\t\texpect(ids).toContain(\"prometheus\");\n\t});\n\n\tit(\"is deterministic - same input gives same output\", () => {\n\t\tconst input = { services: [\"redis\", \"qdrant\", \"n8n\"], skillPacks: [\"research-agent\"] };\n\t\tconst result1 = resolve(input);\n\t\tconst result2 = resolve(input);\n\t\tconst ids1 = result1.services.map((s) => s.definition.id);\n\t\tconst ids2 = result2.services.map((s) => s.definition.id);\n\t\texpect(ids1).toEqual(ids2);\n\t});\n\n\tit(\"topologically sorts dependencies before dependents\", () => {\n\t\tconst result = resolve({ services: [\"n8n\"], skillPacks: [] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\tconst pgIndex = ids.indexOf(\"postgresql\");\n\t\tconst n8nIndex = ids.indexOf(\"n8n\");\n\t\texpect(pgIndex).toBeLessThan(n8nIndex);\n\t});\n\n\tit(\"warns about GPU when AI services selected without gpu flag\", () => {\n\t\t// Ollama doesn't have gpuRequired=true (it's recommended not required)\n\t\t// but we should still check GPU warning logic works\n\t\tconst result = resolve({ services: [\"redis\"], skillPacks: [], gpu: false });\n\t\t// Redis doesn't need GPU, so no GPU warnings\n\t\tconst gpuWarnings = result.warnings.filter((w) => w.type === \"gpu\");\n\t\texpect(gpuWarnings).toHaveLength(0);\n\t});\n\n\tit(\"resolves tailscale as single service with no dependencies\", () => {\n\t\tconst result = resolve({ services: [\"tailscale\"], skillPacks: [] });\n\t\texpect(result.services).toHaveLength(1);\n\t\texpect(result.services[0]!.definition.id).toBe(\"tailscale\");\n\t\texpect(result.isValid).toBe(true);\n\t});\n\n\tit(\"resolves coolify and dokploy as single services\", () => {\n\t\tconst result = resolve({ services: [\"coolify\", \"dokploy\"], skillPacks: [] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"coolify\");\n\t\texpect(ids).toContain(\"dokploy\");\n\t\texpect(result.isValid).toBe(true);\n\t});\n\n\tit(\"auto-adds postgresql, redis, and livekit when lasuite-meet-backend is selected\", () => {\n\t\tconst result = resolve({ services: [\"lasuite-meet-backend\"], skillPacks: [] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\texpect(ids).toContain(\"lasuite-meet-backend\");\n\t\texpect(ids).toContain(\"postgresql\");\n\t\texpect(ids).toContain(\"redis\");\n\t\texpect(ids).toContain(\"livekit\");\n\t\texpect(result.addedDependencies.some((a) => a.service === \"postgresql\")).toBe(true);\n\t\texpect(result.isValid).toBe(true);\n\t});\n\n\tit(\"resolves La Suite Meet preset (postgresql, redis, livekit, backend, frontend, agents)\", () => {\n\t\tconst lasuiteMeetServices = [\n\t\t\t\"postgresql\",\n\t\t\t\"redis\",\n\t\t\t\"livekit\",\n\t\t\t\"lasuite-meet-backend\",\n\t\t\t\"lasuite-meet-frontend\",\n\t\t\t\"lasuite-meet-agents\",\n\t\t];\n\t\tconst result = resolve({ services: lasuiteMeetServices, skillPacks: [] });\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\tfor (const id of lasuiteMeetServices) {\n\t\t\texpect(ids).toContain(id);\n\t\t}\n\t\texpect(result.isValid).toBe(true);\n\t});\n\n\tit(\"orders lasuite-meet-backend after postgresql, redis, and livekit\", () => {\n\t\tconst result = resolve({\n\t\t\tservices: [\"lasuite-meet-backend\", \"lasuite-meet-frontend\"],\n\t\t\tskillPacks: [],\n\t\t});\n\t\tconst ids = result.services.map((s) => s.definition.id);\n\t\tconst pgIdx = ids.indexOf(\"postgresql\");\n\t\tconst redisIdx = ids.indexOf(\"redis\");\n\t\tconst livekitIdx = ids.indexOf(\"livekit\");\n\t\tconst backendIdx = ids.indexOf(\"lasuite-meet-backend\");\n\t\tconst frontendIdx = ids.indexOf(\"lasuite-meet-frontend\");\n\t\texpect(pgIdx).toBeGreaterThanOrEqual(0);\n\t\texpect(backendIdx).toBeGreaterThan(pgIdx);\n\t\texpect(backendIdx).toBeGreaterThan(redisIdx);\n\t\texpect(backendIdx).toBeGreaterThan(livekitIdx);\n\t\texpect(frontendIdx).toBeGreaterThan(backendIdx);\n\t});\n});\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -1,4 +1,4 @@
1
- import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-BgmKutxR.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-CFyDIn0m.mjs";
2
2
  import { resolve } from "./resolver.mjs";
3
3
 
4
4
  //#region src/resolver.test.ts