@better-openclaw/core 1.0.23 → 1.0.25

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 (335) hide show
  1. package/dist/addon-stack.cjs +673 -0
  2. package/dist/addon-stack.cjs.map +1 -0
  3. package/dist/addon-stack.d.cts +23 -0
  4. package/dist/addon-stack.d.cts.map +1 -0
  5. package/dist/addon-stack.d.mts +23 -0
  6. package/dist/addon-stack.d.mts.map +1 -0
  7. package/dist/addon-stack.mjs +671 -0
  8. package/dist/addon-stack.mjs.map +1 -0
  9. package/dist/addon-stack.test.cjs +349 -0
  10. package/dist/addon-stack.test.cjs.map +1 -0
  11. package/dist/addon-stack.test.d.cts +1 -0
  12. package/dist/addon-stack.test.d.mts +1 -0
  13. package/dist/addon-stack.test.mjs +349 -0
  14. package/dist/addon-stack.test.mjs.map +1 -0
  15. package/dist/bare-metal-partition.test.cjs +20 -21
  16. package/dist/bare-metal-partition.test.cjs.map +1 -1
  17. package/dist/bare-metal-partition.test.mjs +4 -5
  18. package/dist/bare-metal-partition.test.mjs.map +1 -1
  19. package/dist/composer.cjs +17 -1
  20. package/dist/composer.cjs.map +1 -1
  21. package/dist/composer.d.cts +24 -1
  22. package/dist/composer.d.cts.map +1 -1
  23. package/dist/composer.d.mts +24 -1
  24. package/dist/composer.d.mts.map +1 -1
  25. package/dist/composer.mjs +14 -2
  26. package/dist/composer.mjs.map +1 -1
  27. package/dist/composer.snapshot.test.cjs +20 -20
  28. package/dist/composer.snapshot.test.cjs.map +1 -1
  29. package/dist/composer.snapshot.test.mjs +2 -2
  30. package/dist/composer.test.cjs +53 -52
  31. package/dist/composer.test.cjs.map +1 -1
  32. package/dist/composer.test.mjs +4 -3
  33. package/dist/composer.test.mjs.map +1 -1
  34. package/dist/deployers/strip-host-ports.test.cjs +26 -26
  35. package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
  36. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  37. package/dist/generate.cjs +8 -4
  38. package/dist/generate.cjs.map +1 -1
  39. package/dist/generate.d.cts.map +1 -1
  40. package/dist/generate.d.mts.map +1 -1
  41. package/dist/generate.mjs +9 -5
  42. package/dist/generate.mjs.map +1 -1
  43. package/dist/generate.test.cjs +55 -55
  44. package/dist/generate.test.cjs.map +1 -1
  45. package/dist/generate.test.mjs +2 -2
  46. package/dist/generate.test.mjs.map +1 -1
  47. package/dist/generators/bare-metal-install.test.cjs +18 -18
  48. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  49. package/dist/generators/bare-metal-install.test.mjs +1 -1
  50. package/dist/generators/caddy.test.cjs +13 -13
  51. package/dist/generators/caddy.test.cjs.map +1 -1
  52. package/dist/generators/caddy.test.mjs +1 -1
  53. package/dist/generators/clone-repos.cjs +140 -0
  54. package/dist/generators/clone-repos.cjs.map +1 -0
  55. package/dist/generators/clone-repos.d.cts +11 -0
  56. package/dist/generators/clone-repos.d.cts.map +1 -0
  57. package/dist/generators/clone-repos.d.mts +11 -0
  58. package/dist/generators/clone-repos.d.mts.map +1 -0
  59. package/dist/generators/clone-repos.mjs +139 -0
  60. package/dist/generators/clone-repos.mjs.map +1 -0
  61. package/dist/generators/clone-repos.test.cjs +140 -0
  62. package/dist/generators/clone-repos.test.cjs.map +1 -0
  63. package/dist/generators/clone-repos.test.d.cts +1 -0
  64. package/dist/generators/clone-repos.test.d.mts +1 -0
  65. package/dist/generators/clone-repos.test.mjs +141 -0
  66. package/dist/generators/clone-repos.test.mjs.map +1 -0
  67. package/dist/generators/env.test.cjs +17 -17
  68. package/dist/generators/env.test.cjs.map +1 -1
  69. package/dist/generators/env.test.mjs +1 -1
  70. package/dist/generators/health-check.test.cjs +39 -39
  71. package/dist/generators/health-check.test.cjs.map +1 -1
  72. package/dist/generators/health-check.test.mjs +1 -1
  73. package/dist/generators/postgres-init.cjs +20 -0
  74. package/dist/generators/postgres-init.cjs.map +1 -1
  75. package/dist/generators/postgres-init.d.cts.map +1 -1
  76. package/dist/generators/postgres-init.d.mts.map +1 -1
  77. package/dist/generators/postgres-init.mjs +20 -0
  78. package/dist/generators/postgres-init.mjs.map +1 -1
  79. package/dist/generators/scripts.cjs +332 -3
  80. package/dist/generators/scripts.cjs.map +1 -1
  81. package/dist/generators/scripts.d.cts +3 -1
  82. package/dist/generators/scripts.d.cts.map +1 -1
  83. package/dist/generators/scripts.d.mts +3 -1
  84. package/dist/generators/scripts.d.mts.map +1 -1
  85. package/dist/generators/scripts.mjs +332 -3
  86. package/dist/generators/scripts.mjs.map +1 -1
  87. package/dist/generators/scripts.test.cjs +57 -23
  88. package/dist/generators/scripts.test.cjs.map +1 -1
  89. package/dist/generators/scripts.test.mjs +39 -5
  90. package/dist/generators/scripts.test.mjs.map +1 -1
  91. package/dist/generators/stack-manifest.cjs +1 -0
  92. package/dist/generators/stack-manifest.cjs.map +1 -1
  93. package/dist/generators/stack-manifest.d.cts +3 -2
  94. package/dist/generators/stack-manifest.d.cts.map +1 -1
  95. package/dist/generators/stack-manifest.d.mts +3 -2
  96. package/dist/generators/stack-manifest.d.mts.map +1 -1
  97. package/dist/generators/stack-manifest.mjs +1 -0
  98. package/dist/generators/stack-manifest.mjs.map +1 -1
  99. package/dist/generators/traefik.test.cjs +32 -32
  100. package/dist/generators/traefik.test.cjs.map +1 -1
  101. package/dist/generators/traefik.test.mjs +1 -1
  102. package/dist/index.cjs +28 -5
  103. package/dist/index.d.cts +7 -4
  104. package/dist/index.d.mts +7 -4
  105. package/dist/index.mjs +10 -7
  106. package/dist/migrations.test.cjs +16 -16
  107. package/dist/migrations.test.cjs.map +1 -1
  108. package/dist/migrations.test.mjs +1 -1
  109. package/dist/presets/registry.cjs.map +1 -1
  110. package/dist/presets/registry.d.cts.map +1 -1
  111. package/dist/presets/registry.d.mts.map +1 -1
  112. package/dist/presets/registry.mjs.map +1 -1
  113. package/dist/presets/registry.test.cjs +14 -14
  114. package/dist/presets/registry.test.cjs.map +1 -1
  115. package/dist/presets/registry.test.mjs +1 -1
  116. package/dist/resolver.cjs +8 -0
  117. package/dist/resolver.cjs.map +1 -1
  118. package/dist/resolver.mjs +9 -1
  119. package/dist/resolver.mjs.map +1 -1
  120. package/dist/resolver.test.cjs +125 -90
  121. package/dist/resolver.test.cjs.map +1 -1
  122. package/dist/resolver.test.mjs +47 -12
  123. package/dist/resolver.test.mjs.map +1 -1
  124. package/dist/{schema-B4c64P8N.d.cts → schema-CKBRu-Rt.d.cts} +355 -8
  125. package/dist/schema-CKBRu-Rt.d.cts.map +1 -0
  126. package/dist/{schema-CXNhYci1.d.mts → schema-Dn-_Jpb6.d.mts} +355 -8
  127. package/dist/schema-Dn-_Jpb6.d.mts.map +1 -0
  128. package/dist/schema.cjs +160 -5
  129. package/dist/schema.cjs.map +1 -1
  130. package/dist/schema.d.cts +2 -2
  131. package/dist/schema.d.mts +2 -2
  132. package/dist/schema.mjs +150 -6
  133. package/dist/schema.mjs.map +1 -1
  134. package/dist/schema.test.cjs +86 -86
  135. package/dist/schema.test.cjs.map +1 -1
  136. package/dist/schema.test.mjs +1 -1
  137. package/dist/services/definitions/apptension-saas.cjs +87 -0
  138. package/dist/services/definitions/apptension-saas.cjs.map +1 -0
  139. package/dist/services/definitions/apptension-saas.d.cts +7 -0
  140. package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
  141. package/dist/services/definitions/apptension-saas.d.mts +7 -0
  142. package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
  143. package/dist/services/definitions/apptension-saas.mjs +86 -0
  144. package/dist/services/definitions/apptension-saas.mjs.map +1 -0
  145. package/dist/services/definitions/boxyhq-saas.cjs +88 -0
  146. package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
  147. package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
  148. package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
  149. package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
  150. package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
  151. package/dist/services/definitions/boxyhq-saas.mjs +87 -0
  152. package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
  153. package/dist/services/definitions/browserless.cjs +4 -1
  154. package/dist/services/definitions/browserless.cjs.map +1 -1
  155. package/dist/services/definitions/browserless.mjs +4 -1
  156. package/dist/services/definitions/browserless.mjs.map +1 -1
  157. package/dist/services/definitions/cmsaas-starter.cjs +86 -0
  158. package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
  159. package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
  160. package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
  161. package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
  162. package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
  163. package/dist/services/definitions/cmsaas-starter.mjs +85 -0
  164. package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
  165. package/dist/services/definitions/convex.cjs +43 -1
  166. package/dist/services/definitions/convex.cjs.map +1 -1
  167. package/dist/services/definitions/convex.mjs +43 -1
  168. package/dist/services/definitions/convex.mjs.map +1 -1
  169. package/dist/services/definitions/grafana.cjs +11 -1
  170. package/dist/services/definitions/grafana.cjs.map +1 -1
  171. package/dist/services/definitions/grafana.mjs +11 -1
  172. package/dist/services/definitions/grafana.mjs.map +1 -1
  173. package/dist/services/definitions/index.cjs +51 -36
  174. package/dist/services/definitions/index.cjs.map +1 -1
  175. package/dist/services/definitions/index.d.cts +30 -25
  176. package/dist/services/definitions/index.d.cts.map +1 -1
  177. package/dist/services/definitions/index.d.mts +30 -25
  178. package/dist/services/definitions/index.d.mts.map +1 -1
  179. package/dist/services/definitions/index.mjs +47 -37
  180. package/dist/services/definitions/index.mjs.map +1 -1
  181. package/dist/services/definitions/ixartz-saas.cjs +88 -0
  182. package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
  183. package/dist/services/definitions/ixartz-saas.d.cts +7 -0
  184. package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
  185. package/dist/services/definitions/ixartz-saas.d.mts +7 -0
  186. package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
  187. package/dist/services/definitions/ixartz-saas.mjs +87 -0
  188. package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
  189. package/dist/services/definitions/meilisearch.cjs +11 -1
  190. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  191. package/dist/services/definitions/meilisearch.mjs +11 -1
  192. package/dist/services/definitions/meilisearch.mjs.map +1 -1
  193. package/dist/services/definitions/minio.cjs +3 -1
  194. package/dist/services/definitions/minio.cjs.map +1 -1
  195. package/dist/services/definitions/minio.mjs +3 -1
  196. package/dist/services/definitions/minio.mjs.map +1 -1
  197. package/dist/services/definitions/mission-control.cjs +16 -2
  198. package/dist/services/definitions/mission-control.cjs.map +1 -1
  199. package/dist/services/definitions/mission-control.mjs +16 -2
  200. package/dist/services/definitions/mission-control.mjs.map +1 -1
  201. package/dist/services/definitions/n8n.cjs +11 -1
  202. package/dist/services/definitions/n8n.cjs.map +1 -1
  203. package/dist/services/definitions/n8n.mjs +11 -1
  204. package/dist/services/definitions/n8n.mjs.map +1 -1
  205. package/dist/services/definitions/ollama.cjs +3 -1
  206. package/dist/services/definitions/ollama.cjs.map +1 -1
  207. package/dist/services/definitions/ollama.mjs +3 -1
  208. package/dist/services/definitions/ollama.mjs.map +1 -1
  209. package/dist/services/definitions/open-saas.cjs +81 -0
  210. package/dist/services/definitions/open-saas.cjs.map +1 -0
  211. package/dist/services/definitions/open-saas.d.cts +7 -0
  212. package/dist/services/definitions/open-saas.d.cts.map +1 -0
  213. package/dist/services/definitions/open-saas.d.mts +7 -0
  214. package/dist/services/definitions/open-saas.d.mts.map +1 -0
  215. package/dist/services/definitions/open-saas.mjs +80 -0
  216. package/dist/services/definitions/open-saas.mjs.map +1 -0
  217. package/dist/services/definitions/qdrant.cjs +3 -1
  218. package/dist/services/definitions/qdrant.cjs.map +1 -1
  219. package/dist/services/definitions/qdrant.mjs +3 -1
  220. package/dist/services/definitions/qdrant.mjs.map +1 -1
  221. package/dist/services/definitions/searxng.cjs +8 -1
  222. package/dist/services/definitions/searxng.cjs.map +1 -1
  223. package/dist/services/definitions/searxng.mjs +8 -1
  224. package/dist/services/definitions/searxng.mjs.map +1 -1
  225. package/dist/services/definitions/uptime-kuma.cjs +8 -1
  226. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  227. package/dist/services/definitions/uptime-kuma.mjs +8 -1
  228. package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
  229. package/dist/services/registry.cjs +3 -0
  230. package/dist/services/registry.cjs.map +1 -1
  231. package/dist/services/registry.d.cts.map +1 -1
  232. package/dist/services/registry.d.mts.map +1 -1
  233. package/dist/services/registry.mjs +3 -0
  234. package/dist/services/registry.mjs.map +1 -1
  235. package/dist/services/registry.test.cjs +40 -33
  236. package/dist/services/registry.test.cjs.map +1 -1
  237. package/dist/services/registry.test.mjs +8 -1
  238. package/dist/services/registry.test.mjs.map +1 -1
  239. package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
  240. package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
  241. package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
  242. package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
  243. package/dist/skills/registry.cjs +3 -3
  244. package/dist/skills/registry.cjs.map +1 -1
  245. package/dist/skills/registry.mjs +3 -3
  246. package/dist/skills/registry.mjs.map +1 -1
  247. package/dist/skills/skill-manifest.cjs +1 -1
  248. package/dist/skills/skill-manifest.mjs +1 -1
  249. package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → test.CTcmp4Su-ClCHJ3FA.mjs} +6793 -6403
  250. package/dist/test.CTcmp4Su-ClCHJ3FA.mjs.map +1 -0
  251. package/dist/{vi.2VT5v0um-CRqXre87.cjs → test.CTcmp4Su-DlzTarwH.cjs} +6793 -6403
  252. package/dist/test.CTcmp4Su-DlzTarwH.cjs.map +1 -0
  253. package/dist/track-analytics.cjs +50 -0
  254. package/dist/track-analytics.cjs.map +1 -0
  255. package/dist/track-analytics.d.cts +34 -0
  256. package/dist/track-analytics.d.cts.map +1 -0
  257. package/dist/track-analytics.d.mts +34 -0
  258. package/dist/track-analytics.d.mts.map +1 -0
  259. package/dist/track-analytics.mjs +48 -0
  260. package/dist/track-analytics.mjs.map +1 -0
  261. package/dist/track-analytics.test.cjs +91 -0
  262. package/dist/track-analytics.test.cjs.map +1 -0
  263. package/dist/track-analytics.test.d.cts +1 -0
  264. package/dist/track-analytics.test.d.mts +1 -0
  265. package/dist/track-analytics.test.mjs +92 -0
  266. package/dist/track-analytics.test.mjs.map +1 -0
  267. package/dist/types.cjs +7 -0
  268. package/dist/types.cjs.map +1 -1
  269. package/dist/types.d.cts +12 -2
  270. package/dist/types.d.cts.map +1 -1
  271. package/dist/types.d.mts +12 -2
  272. package/dist/types.d.mts.map +1 -1
  273. package/dist/types.mjs +7 -0
  274. package/dist/types.mjs.map +1 -1
  275. package/dist/validator.test.cjs +15 -15
  276. package/dist/validator.test.cjs.map +1 -1
  277. package/dist/validator.test.mjs +2 -2
  278. package/dist/version-manager.cjs +1 -1
  279. package/dist/version-manager.cjs.map +1 -1
  280. package/dist/version-manager.mjs +1 -1
  281. package/dist/version-manager.mjs.map +1 -1
  282. package/dist/version-manager.test.cjs +40 -38
  283. package/dist/version-manager.test.cjs.map +1 -1
  284. package/dist/version-manager.test.mjs +7 -5
  285. package/dist/version-manager.test.mjs.map +1 -1
  286. package/package.json +4 -4
  287. package/src/__snapshots__/composer.snapshot.test.ts.snap +160 -0
  288. package/src/addon-stack.test.ts +490 -0
  289. package/src/addon-stack.ts +998 -0
  290. package/src/bare-metal-partition.test.ts +4 -3
  291. package/src/composer.test.ts +4 -2
  292. package/src/composer.ts +24 -5
  293. package/src/generate.test.ts +2 -1
  294. package/src/generate.ts +10 -1
  295. package/src/generators/clone-repos.test.ts +154 -0
  296. package/src/generators/clone-repos.ts +159 -0
  297. package/src/generators/postgres-init.ts +17 -0
  298. package/src/generators/scripts.test.ts +52 -4
  299. package/src/generators/scripts.ts +351 -3
  300. package/src/generators/stack-manifest.ts +4 -2
  301. package/src/index.ts +28 -2
  302. package/src/presets/registry.ts +241 -329
  303. package/src/resolver.test.ts +53 -15
  304. package/src/resolver.ts +13 -1
  305. package/src/schema.ts +216 -4
  306. package/src/services/definitions/apptension-saas.ts +84 -0
  307. package/src/services/definitions/boxyhq-saas.ts +84 -0
  308. package/src/services/definitions/browserless.ts +3 -0
  309. package/src/services/definitions/cmsaas-starter.ts +84 -0
  310. package/src/services/definitions/convex.ts +31 -0
  311. package/src/services/definitions/grafana.ts +9 -0
  312. package/src/services/definitions/index.ts +90 -70
  313. package/src/services/definitions/ixartz-saas.ts +84 -0
  314. package/src/services/definitions/meilisearch.ts +9 -0
  315. package/src/services/definitions/minio.ts +2 -0
  316. package/src/services/definitions/mission-control.ts +19 -2
  317. package/src/services/definitions/n8n.ts +9 -0
  318. package/src/services/definitions/ollama.ts +2 -0
  319. package/src/services/definitions/open-saas.ts +79 -0
  320. package/src/services/definitions/qdrant.ts +2 -0
  321. package/src/services/definitions/searxng.ts +3 -0
  322. package/src/services/definitions/uptime-kuma.ts +3 -0
  323. package/src/services/registry.test.ts +8 -0
  324. package/src/services/registry.ts +7 -0
  325. package/src/skills/manifest.json +64 -0
  326. package/src/skills/registry.ts +3 -3
  327. package/src/track-analytics.test.ts +82 -0
  328. package/src/track-analytics.ts +76 -0
  329. package/src/types.ts +29 -0
  330. package/src/version-manager.test.ts +10 -5
  331. package/src/version-manager.ts +1 -1
  332. package/dist/schema-B4c64P8N.d.cts.map +0 -1
  333. package/dist/schema-CXNhYci1.d.mts.map +0 -1
  334. package/dist/vi.2VT5v0um-CRqXre87.cjs.map +0 -1
  335. package/dist/vi.2VT5v0um-DvC3SVNc.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type {\n\tAddedDependencySchema,\n\tAiProviderSchema,\n\tApiErrorSchema,\n\tComposeOptionsSchema,\n\tDeploymentTargetSchema,\n\tDeploymentTypeSchema,\n\tDeploySchema,\n\tDeployTargetSchema,\n\tEnvVariableSchema,\n\tErrorSchema,\n\tGenerationInputSchema,\n\tGsdRuntimeSchema,\n\tHealthCheckSchema,\n\tMaturitySchema,\n\tNativePlatformSchema,\n\tNativeRecipeSchema,\n\tOpenclawImageVariantSchema,\n\tOpenclawInstallMethodSchema,\n\tOutputFormatSchema,\n\tPlatformSchema,\n\tPortMappingSchema,\n\tPresetSchema,\n\tProxyTypeSchema,\n\tResolvedServiceSchema,\n\tResolverOutputSchema,\n\tResourceLimitsSchema,\n\tRestartPolicySchema,\n\tServiceCategorySchema,\n\tServiceDefinitionSchema,\n\tSkillBindingSchema,\n\tSkillPackSchema,\n\tValidateRequestSchema,\n\tValidateResponseSchema,\n\tVolumeMappingSchema,\n\tWarningSchema,\n} from \"./schema.js\";\n\n// ─── Inferred Types ─────────────────────────────────────────────────────────\n\nexport type AiProvider = z.infer<typeof AiProviderSchema>;\nexport type GsdRuntime = z.infer<typeof GsdRuntimeSchema>;\nexport type ServiceCategory = z.infer<typeof ServiceCategorySchema>;\nexport type Maturity = z.infer<typeof MaturitySchema>;\nexport type Platform = z.infer<typeof PlatformSchema>;\nexport type RestartPolicy = z.infer<typeof RestartPolicySchema>;\nexport type ProxyType = z.infer<typeof ProxyTypeSchema>;\nexport type DeploymentTarget = z.infer<typeof DeploymentTargetSchema>;\nexport type DeploymentType = z.infer<typeof DeploymentTypeSchema>;\nexport type NativePlatform = z.infer<typeof NativePlatformSchema>;\nexport type NativeRecipe = z.infer<typeof NativeRecipeSchema>;\nexport type OutputFormat = z.infer<typeof OutputFormatSchema>;\nexport type OpenclawImageVariant = z.infer<typeof OpenclawImageVariantSchema>;\nexport type OpenclawInstallMethod = z.infer<typeof OpenclawInstallMethodSchema>;\nexport type DeployTarget = z.infer<typeof DeployTargetSchema>;\n\nexport type PortMapping = z.infer<typeof PortMappingSchema>;\nexport type VolumeMapping = z.infer<typeof VolumeMappingSchema>;\nexport type EnvVariable = z.infer<typeof EnvVariableSchema>;\nexport type HealthCheck = z.infer<typeof HealthCheckSchema>;\nexport type ResourceLimits = z.infer<typeof ResourceLimitsSchema>;\nexport type Deploy = z.infer<typeof DeploySchema>;\nexport type SkillBinding = z.infer<typeof SkillBindingSchema>;\n\nexport type ServiceDefinition = z.infer<typeof ServiceDefinitionSchema>;\nexport type SkillPack = z.infer<typeof SkillPackSchema>;\nexport type Preset = z.infer<typeof PresetSchema>;\n\nexport type GenerationInput = z.infer<typeof GenerationInputSchema>;\nexport type ComposeOptions = z.infer<typeof ComposeOptionsSchema> & {\n\t/** Dynamic Traefik labels per service, computed by the Traefik generator. */\n\ttraefikLabels?: Map<string, Record<string, string>>;\n};\nexport type ResolvedService = z.infer<typeof ResolvedServiceSchema>;\nexport type AddedDependency = z.infer<typeof AddedDependencySchema>;\nexport type Warning = z.infer<typeof WarningSchema>;\nexport type ResolverError = z.infer<typeof ErrorSchema>;\nexport type ResolverOutput = z.infer<typeof ResolverOutputSchema>;\n\nexport type ValidateRequest = z.infer<typeof ValidateRequestSchema>;\nexport type ValidateResponse = z.infer<typeof ValidateResponseSchema>;\nexport type ApiError = z.infer<typeof ApiErrorSchema>;\n\n// ─── Additional Types ───────────────────────────────────────────────────────\n\nexport interface ResolverInput {\n\tservices: string[];\n\tskillPacks: string[];\n\taiProviders?: AiProvider[];\n\tgsdRuntimes?: GsdRuntime[];\n\tproxy?: ProxyType;\n\tgpu?: boolean;\n\tplatform?: Platform;\n\tdeployment?: DeploymentType;\n\tdeploymentType?: DeploymentType;\n\tmonitoring?: boolean;\n\tmemoryThresholds?: { info: number; warning: number; critical: number };\n}\n\nexport interface GeneratedFiles {\n\t[path: string]: string;\n}\n\nexport interface GenerationMetadata {\n\tserviceCount: number;\n\tskillCount: number;\n\testimatedMemoryMB: number;\n\tresolvedServices: string[];\n\tgeneratedAt: string;\n}\n\nexport interface GenerationResult {\n\tfiles: GeneratedFiles;\n\tmetadata: GenerationMetadata;\n}\n\nexport interface CategoryInfo {\n\tid: ServiceCategory;\n\tname: string;\n\tdescription?: string;\n\tlabel?: string;\n\ticon: string;\n}\n\nexport const SERVICE_CATEGORIES: CategoryInfo[] = [\n\t{\n\t\tid: \"coding-agent\",\n\t\tname: \"AI Coding Agents\",\n\t\tdescription: \"AI Coding Agents\",\n\t\tlabel: \"AI Coding Agents\",\n\t\ticon: \"💻\",\n\t},\n\t{\n\t\tid: \"ai-platform\",\n\t\tname: \"AI Platforms & Chat UIs\",\n\t\tdescription: \"AI Platforms & Chat UIs\",\n\t\tlabel: \"AI Platforms & Chat UIs\",\n\t\ticon: \"🧪\",\n\t},\n\t{\n\t\tid: \"ai\",\n\t\tname: \"AI / Local Models\",\n\t\tdescription: \"AI / Local Models\",\n\t\tlabel: \"AI / Local Models\",\n\t\ticon: \"🤖\",\n\t},\n\t{\n\t\tid: \"automation\",\n\t\tname: \"Automation & Workflows\",\n\t\tdescription: \"Automation & Workflows\",\n\t\tlabel: \"Automation & Workflows\",\n\t\ticon: \"🔄\",\n\t},\n\t{\n\t\tid: \"vector-db\",\n\t\tname: \"Vector Databases\",\n\t\tdescription: \"Vector Databases\",\n\t\tlabel: \"Vector Databases\",\n\t\ticon: \"🧠\",\n\t},\n\t{\n\t\tid: \"media\",\n\t\tname: \"Media & Video\",\n\t\tdescription: \"Media & Video\",\n\t\tlabel: \"Media & Video\",\n\t\ticon: \"🎬\",\n\t},\n\t{\n\t\tid: \"social-media\",\n\t\tname: \"Social Media\",\n\t\tdescription: \"Social Media\",\n\t\tlabel: \"Social Media\",\n\t\ticon: \"📱\",\n\t},\n\t{\n\t\tid: \"analytics\",\n\t\tname: \"Analytics\",\n\t\tdescription: \"Analytics\",\n\t\tlabel: \"Analytics\",\n\t\ticon: \"📊\",\n\t},\n\t{\n\t\tid: \"knowledge\",\n\t\tname: \"Knowledge & Documents\",\n\t\tdescription: \"Knowledge & Documents\",\n\t\tlabel: \"Knowledge & Documents\",\n\t\ticon: \"📚\",\n\t},\n\t{\n\t\tid: \"storage\",\n\t\tname: \"Object Storage\",\n\t\tdescription: \"Object Storage\",\n\t\tlabel: \"Object Storage\",\n\t\ticon: \"💾\",\n\t},\n\t{\n\t\tid: \"database\",\n\t\tname: \"Databases & Caching\",\n\t\tdescription: \"Databases & Caching\",\n\t\tlabel: \"Databases & Caching\",\n\t\ticon: \"🗄️\",\n\t},\n\t{\n\t\tid: \"dev-tools\",\n\t\tname: \"Developer Tools\",\n\t\tdescription: \"Developer Tools\",\n\t\tlabel: \"Developer Tools\",\n\t\ticon: \"🛠️\",\n\t},\n\t{\n\t\tid: \"proxy\",\n\t\tname: \"Reverse Proxy\",\n\t\tdescription: \"Reverse Proxy\",\n\t\tlabel: \"Reverse Proxy\",\n\t\ticon: \"🌐\",\n\t},\n\t{\n\t\tid: \"monitoring\",\n\t\tname: \"Monitoring\",\n\t\tdescription: \"Monitoring\",\n\t\tlabel: \"Monitoring\",\n\t\ticon: \"📡\",\n\t},\n\t{\n\t\tid: \"browser\",\n\t\tname: \"Browser Automation\",\n\t\tdescription: \"Browser Automation\",\n\t\tlabel: \"Browser Automation\",\n\t\ticon: \"🌐\",\n\t},\n\t{\n\t\tid: \"search\",\n\t\tname: \"Search\",\n\t\tdescription: \"Search\",\n\t\tlabel: \"Search\",\n\t\ticon: \"🔍\",\n\t},\n\t{\n\t\tid: \"communication\",\n\t\tname: \"Notifications\",\n\t\tdescription: \"Notifications\",\n\t\tlabel: \"Notifications\",\n\t\ticon: \"🔔\",\n\t},\n\t{\n\t\tid: \"desktop\",\n\t\tname: \"Desktop Environment\",\n\t\tdescription: \"Desktop Environment\",\n\t\tlabel: \"Desktop Environment\",\n\t\ticon: \"🖥️\",\n\t},\n\t{\n\t\tid: \"streaming\",\n\t\tname: \"Streaming & Relay\",\n\t\tdescription: \"Streaming & Relay\",\n\t\tlabel: \"Streaming & Relay\",\n\t\ticon: \"📺\",\n\t},\n\t{\n\t\tid: \"security\",\n\t\tname: \"Security & Pentesting\",\n\t\tdescription: \"Security & Pentesting\",\n\t\tlabel: \"Security & Pentesting\",\n\t\ticon: \"🛡️\",\n\t},\n\t{\n\t\tid: \"billing\",\n\t\tname: \"Billing & Payments\",\n\t\tdescription: \"Billing & Payments\",\n\t\tlabel: \"Billing & Payments\",\n\t\ticon: \"💳\",\n\t},\n\t{\n\t\tid: \"crm\",\n\t\tname: \"CRM & Customer Management\",\n\t\tdescription: \"CRM & Customer Management\",\n\t\tlabel: \"CRM & Customer Management\",\n\t\ticon: \"🤝\",\n\t},\n\t{\n\t\tid: \"email-marketing\",\n\t\tname: \"Email & Marketing\",\n\t\tdescription: \"Email & Marketing\",\n\t\tlabel: \"Email & Marketing\",\n\t\ticon: \"📧\",\n\t},\n\t{\n\t\tid: \"forms\",\n\t\tname: \"Forms & Surveys\",\n\t\tdescription: \"Forms & Surveys\",\n\t\tlabel: \"Forms & Surveys\",\n\t\ticon: \"📋\",\n\t},\n\t{\n\t\tid: \"api-gateway\",\n\t\tname: \"API Management\",\n\t\tdescription: \"API Management\",\n\t\tlabel: \"API Management\",\n\t\ticon: \"🔌\",\n\t},\n\t{\n\t\tid: \"backup\",\n\t\tname: \"Backup & Recovery\",\n\t\tdescription: \"Backup & Recovery\",\n\t\tlabel: \"Backup & Recovery\",\n\t\ticon: \"💾\",\n\t},\n\t{\n\t\tid: \"voice\",\n\t\tname: \"Voice & Telephony\",\n\t\tdescription: \"Voice & Telephony\",\n\t\tlabel: \"Voice & Telephony\",\n\t\ticon: \"📞\",\n\t},\n\t{\n\t\tid: \"ecommerce\",\n\t\tname: \"E-Commerce\",\n\t\tdescription: \"E-Commerce\",\n\t\tlabel: \"E-Commerce\",\n\t\ticon: \"🛒\",\n\t},\n\t{\n\t\tid: \"collaboration\",\n\t\tname: \"Real-Time Collaboration\",\n\t\tdescription: \"Real-Time Collaboration\",\n\t\tlabel: \"Real-Time Collaboration\",\n\t\ticon: \"✏️\",\n\t},\n\t{\n\t\tid: \"ai-observability\",\n\t\tname: \"AI Observability\",\n\t\tdescription: \"AI Observability\",\n\t\tlabel: \"AI Observability\",\n\t\ticon: \"🔭\",\n\t},\n\t{\n\t\tid: \"fine-tuning\",\n\t\tname: \"AI Fine-Tuning\",\n\t\tdescription: \"AI Fine-Tuning\",\n\t\tlabel: \"AI Fine-Tuning\",\n\t\ticon: \"🎯\",\n\t},\n\t{\n\t\tid: \"project-management\",\n\t\tname: \"Project Management\",\n\t\tdescription: \"Project Management\",\n\t\tlabel: \"Project Management\",\n\t\ticon: \"📋\",\n\t},\n\t{\n\t\tid: \"business-intelligence\",\n\t\tname: \"Business Intelligence\",\n\t\tdescription: \"Business Intelligence\",\n\t\tlabel: \"Business Intelligence\",\n\t\ticon: \"📈\",\n\t},\n\t{\n\t\tid: \"dns-networking\",\n\t\tname: \"DNS & Networking\",\n\t\tdescription: \"DNS & Networking\",\n\t\tlabel: \"DNS & Networking\",\n\t\ticon: \"🌐\",\n\t},\n\t{\n\t\tid: \"iot\",\n\t\tname: \"IoT & Edge\",\n\t\tdescription: \"IoT & Edge\",\n\t\tlabel: \"IoT & Edge\",\n\t\ticon: \"📡\",\n\t},\n];\n"],"mappings":";AA6HA,MAAa,qBAAqC;CACjD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD"}
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type {\n\tAddonStackInputSchema,\n\tAddonStackResultSchema,\n\tAddonStackUpdateInputSchema,\n\tAddonStackUpdateResultSchema,\n\tAddedDependencySchema,\n\tAiProviderSchema,\n\tApiErrorSchema,\n\tBuildContextSchema,\n\tComposeOptionsSchema,\n\tDeploymentTargetSchema,\n\tDeploymentTypeSchema,\n\tDeploySchema,\n\tDeployTargetSchema,\n\tEnvQuirkFixSchema,\n\tEnvQuirkSchema,\n\tEnvVariableSchema,\n\tErrorSchema,\n\tGenerationInputSchema,\n\tGitSourceSchema,\n\tGsdRuntimeSchema,\n\tHealthCheckSchema,\n\tMaturitySchema,\n\tNativePlatformSchema,\n\tNativeRecipeSchema,\n\tOpenclawImageVariantSchema,\n\tOpenclawInstallMethodSchema,\n\tOutputFormatSchema,\n\tPlatformSchema,\n\tPortMappingSchema,\n\tPresetSchema,\n\tProxyRouteSchema,\n\tProxyTypeSchema,\n\tResolvedServiceSchema,\n\tResolverOutputSchema,\n\tResourceLimitsSchema,\n\tRestartPolicySchema,\n\tServiceCategorySchema,\n\tServiceDefinitionSchema,\n\tSkillBindingSchema,\n\tSkillPackSchema,\n\tSkippedServiceSchema,\n\tValidateRequestSchema,\n\tValidateResponseSchema,\n\tVolumeMappingSchema,\n\tWarningSchema,\n} from \"./schema.js\";\n\n// ─── Inferred Types ─────────────────────────────────────────────────────────\n\nexport type AiProvider = z.infer<typeof AiProviderSchema>;\nexport type GsdRuntime = z.infer<typeof GsdRuntimeSchema>;\nexport type ServiceCategory = z.infer<typeof ServiceCategorySchema>;\nexport type Maturity = z.infer<typeof MaturitySchema>;\nexport type Platform = z.infer<typeof PlatformSchema>;\nexport type RestartPolicy = z.infer<typeof RestartPolicySchema>;\nexport type ProxyType = z.infer<typeof ProxyTypeSchema>;\nexport type DeploymentTarget = z.infer<typeof DeploymentTargetSchema>;\nexport type DeploymentType = z.infer<typeof DeploymentTypeSchema>;\nexport type NativePlatform = z.infer<typeof NativePlatformSchema>;\nexport type NativeRecipe = z.infer<typeof NativeRecipeSchema>;\nexport type GitSource = z.infer<typeof GitSourceSchema>;\nexport type BuildContext = z.infer<typeof BuildContextSchema>;\nexport type OutputFormat = z.infer<typeof OutputFormatSchema>;\nexport type OpenclawImageVariant = z.infer<typeof OpenclawImageVariantSchema>;\nexport type OpenclawInstallMethod = z.infer<typeof OpenclawInstallMethodSchema>;\nexport type DeployTarget = z.infer<typeof DeployTargetSchema>;\n\nexport type PortMapping = z.infer<typeof PortMappingSchema>;\nexport type VolumeMapping = z.infer<typeof VolumeMappingSchema>;\nexport type EnvVariable = z.infer<typeof EnvVariableSchema>;\nexport type HealthCheck = z.infer<typeof HealthCheckSchema>;\nexport type ResourceLimits = z.infer<typeof ResourceLimitsSchema>;\nexport type Deploy = z.infer<typeof DeploySchema>;\nexport type SkillBinding = z.infer<typeof SkillBindingSchema>;\n\nexport type ServiceDefinition = z.infer<typeof ServiceDefinitionSchema>;\nexport type SkillPack = z.infer<typeof SkillPackSchema>;\nexport type Preset = z.infer<typeof PresetSchema>;\n\nexport type GenerationInput = z.infer<typeof GenerationInputSchema>;\nexport type ComposeOptions = z.infer<typeof ComposeOptionsSchema> & {\n\t/** Dynamic Traefik labels per service, computed by the Traefik generator. */\n\ttraefikLabels?: Map<string, Record<string, string>>;\n};\nexport type ResolvedService = z.infer<typeof ResolvedServiceSchema>;\nexport type AddedDependency = z.infer<typeof AddedDependencySchema>;\nexport type Warning = z.infer<typeof WarningSchema>;\nexport type ResolverError = z.infer<typeof ErrorSchema>;\nexport type ResolverOutput = z.infer<typeof ResolverOutputSchema>;\n\nexport type ValidateRequest = z.infer<typeof ValidateRequestSchema>;\nexport type ValidateResponse = z.infer<typeof ValidateResponseSchema>;\nexport type ApiError = z.infer<typeof ApiErrorSchema>;\n\n// Addon Stack (Clawexa)\nexport type EnvQuirkFix = z.infer<typeof EnvQuirkFixSchema>;\nexport type EnvQuirk = z.infer<typeof EnvQuirkSchema>;\nexport type ProxyRoute = z.infer<typeof ProxyRouteSchema>;\nexport type SkippedService = z.infer<typeof SkippedServiceSchema>;\nexport type AddonStackInput = z.infer<typeof AddonStackInputSchema>;\nexport type AddonStackResult = z.infer<typeof AddonStackResultSchema>;\nexport type AddonStackUpdateInput = z.infer<typeof AddonStackUpdateInputSchema>;\nexport type AddonStackUpdateResult = z.infer<typeof AddonStackUpdateResultSchema>;\n\n// ─── Additional Types ───────────────────────────────────────────────────────\n\nexport interface ResolverInput {\n\tservices: string[];\n\tskillPacks: string[];\n\taiProviders?: AiProvider[];\n\tgsdRuntimes?: GsdRuntime[];\n\tproxy?: ProxyType;\n\tgpu?: boolean;\n\tplatform?: Platform;\n\tdeployment?: DeploymentType;\n\tdeploymentType?: DeploymentType;\n\tmonitoring?: boolean;\n\tmemoryThresholds?: { info: number; warning: number; critical: number };\n}\n\nexport interface GeneratedFiles {\n\t[path: string]: string;\n}\n\nexport interface GenerationMetadata {\n\tserviceCount: number;\n\tskillCount: number;\n\testimatedMemoryMB: number;\n\tresolvedServices: string[];\n\tgeneratedAt: string;\n}\n\nexport interface GenerationResult {\n\tfiles: GeneratedFiles;\n\tmetadata: GenerationMetadata;\n}\n\nexport interface CategoryInfo {\n\tid: ServiceCategory;\n\tname: string;\n\tdescription?: string;\n\tlabel?: string;\n\ticon: string;\n}\n\nexport const SERVICE_CATEGORIES: CategoryInfo[] = [\n\t{\n\t\tid: \"coding-agent\",\n\t\tname: \"AI Coding Agents\",\n\t\tdescription: \"AI Coding Agents\",\n\t\tlabel: \"AI Coding Agents\",\n\t\ticon: \"💻\",\n\t},\n\t{\n\t\tid: \"ai-platform\",\n\t\tname: \"AI Platforms & Chat UIs\",\n\t\tdescription: \"AI Platforms & Chat UIs\",\n\t\tlabel: \"AI Platforms & Chat UIs\",\n\t\ticon: \"🧪\",\n\t},\n\t{\n\t\tid: \"ai\",\n\t\tname: \"AI / Local Models\",\n\t\tdescription: \"AI / Local Models\",\n\t\tlabel: \"AI / Local Models\",\n\t\ticon: \"🤖\",\n\t},\n\t{\n\t\tid: \"automation\",\n\t\tname: \"Automation & Workflows\",\n\t\tdescription: \"Automation & Workflows\",\n\t\tlabel: \"Automation & Workflows\",\n\t\ticon: \"🔄\",\n\t},\n\t{\n\t\tid: \"vector-db\",\n\t\tname: \"Vector Databases\",\n\t\tdescription: \"Vector Databases\",\n\t\tlabel: \"Vector Databases\",\n\t\ticon: \"🧠\",\n\t},\n\t{\n\t\tid: \"media\",\n\t\tname: \"Media & Video\",\n\t\tdescription: \"Media & Video\",\n\t\tlabel: \"Media & Video\",\n\t\ticon: \"🎬\",\n\t},\n\t{\n\t\tid: \"social-media\",\n\t\tname: \"Social Media\",\n\t\tdescription: \"Social Media\",\n\t\tlabel: \"Social Media\",\n\t\ticon: \"📱\",\n\t},\n\t{\n\t\tid: \"analytics\",\n\t\tname: \"Analytics\",\n\t\tdescription: \"Analytics\",\n\t\tlabel: \"Analytics\",\n\t\ticon: \"📊\",\n\t},\n\t{\n\t\tid: \"knowledge\",\n\t\tname: \"Knowledge & Documents\",\n\t\tdescription: \"Knowledge & Documents\",\n\t\tlabel: \"Knowledge & Documents\",\n\t\ticon: \"📚\",\n\t},\n\t{\n\t\tid: \"storage\",\n\t\tname: \"Object Storage\",\n\t\tdescription: \"Object Storage\",\n\t\tlabel: \"Object Storage\",\n\t\ticon: \"💾\",\n\t},\n\t{\n\t\tid: \"database\",\n\t\tname: \"Databases & Caching\",\n\t\tdescription: \"Databases & Caching\",\n\t\tlabel: \"Databases & Caching\",\n\t\ticon: \"🗄️\",\n\t},\n\t{\n\t\tid: \"dev-tools\",\n\t\tname: \"Developer Tools\",\n\t\tdescription: \"Developer Tools\",\n\t\tlabel: \"Developer Tools\",\n\t\ticon: \"🛠️\",\n\t},\n\t{\n\t\tid: \"proxy\",\n\t\tname: \"Reverse Proxy\",\n\t\tdescription: \"Reverse Proxy\",\n\t\tlabel: \"Reverse Proxy\",\n\t\ticon: \"🌐\",\n\t},\n\t{\n\t\tid: \"monitoring\",\n\t\tname: \"Monitoring\",\n\t\tdescription: \"Monitoring\",\n\t\tlabel: \"Monitoring\",\n\t\ticon: \"📡\",\n\t},\n\t{\n\t\tid: \"browser\",\n\t\tname: \"Browser Automation\",\n\t\tdescription: \"Browser Automation\",\n\t\tlabel: \"Browser Automation\",\n\t\ticon: \"🌐\",\n\t},\n\t{\n\t\tid: \"search\",\n\t\tname: \"Search\",\n\t\tdescription: \"Search\",\n\t\tlabel: \"Search\",\n\t\ticon: \"🔍\",\n\t},\n\t{\n\t\tid: \"communication\",\n\t\tname: \"Notifications\",\n\t\tdescription: \"Notifications\",\n\t\tlabel: \"Notifications\",\n\t\ticon: \"🔔\",\n\t},\n\t{\n\t\tid: \"desktop\",\n\t\tname: \"Desktop Environment\",\n\t\tdescription: \"Desktop Environment\",\n\t\tlabel: \"Desktop Environment\",\n\t\ticon: \"🖥️\",\n\t},\n\t{\n\t\tid: \"streaming\",\n\t\tname: \"Streaming & Relay\",\n\t\tdescription: \"Streaming & Relay\",\n\t\tlabel: \"Streaming & Relay\",\n\t\ticon: \"📺\",\n\t},\n\t{\n\t\tid: \"security\",\n\t\tname: \"Security & Pentesting\",\n\t\tdescription: \"Security & Pentesting\",\n\t\tlabel: \"Security & Pentesting\",\n\t\ticon: \"🛡️\",\n\t},\n\t{\n\t\tid: \"billing\",\n\t\tname: \"Billing & Payments\",\n\t\tdescription: \"Billing & Payments\",\n\t\tlabel: \"Billing & Payments\",\n\t\ticon: \"💳\",\n\t},\n\t{\n\t\tid: \"crm\",\n\t\tname: \"CRM & Customer Management\",\n\t\tdescription: \"CRM & Customer Management\",\n\t\tlabel: \"CRM & Customer Management\",\n\t\ticon: \"🤝\",\n\t},\n\t{\n\t\tid: \"email-marketing\",\n\t\tname: \"Email & Marketing\",\n\t\tdescription: \"Email & Marketing\",\n\t\tlabel: \"Email & Marketing\",\n\t\ticon: \"📧\",\n\t},\n\t{\n\t\tid: \"forms\",\n\t\tname: \"Forms & Surveys\",\n\t\tdescription: \"Forms & Surveys\",\n\t\tlabel: \"Forms & Surveys\",\n\t\ticon: \"📋\",\n\t},\n\t{\n\t\tid: \"api-gateway\",\n\t\tname: \"API Management\",\n\t\tdescription: \"API Management\",\n\t\tlabel: \"API Management\",\n\t\ticon: \"🔌\",\n\t},\n\t{\n\t\tid: \"backup\",\n\t\tname: \"Backup & Recovery\",\n\t\tdescription: \"Backup & Recovery\",\n\t\tlabel: \"Backup & Recovery\",\n\t\ticon: \"💾\",\n\t},\n\t{\n\t\tid: \"voice\",\n\t\tname: \"Voice & Telephony\",\n\t\tdescription: \"Voice & Telephony\",\n\t\tlabel: \"Voice & Telephony\",\n\t\ticon: \"📞\",\n\t},\n\t{\n\t\tid: \"ecommerce\",\n\t\tname: \"E-Commerce\",\n\t\tdescription: \"E-Commerce\",\n\t\tlabel: \"E-Commerce\",\n\t\ticon: \"🛒\",\n\t},\n\t{\n\t\tid: \"collaboration\",\n\t\tname: \"Real-Time Collaboration\",\n\t\tdescription: \"Real-Time Collaboration\",\n\t\tlabel: \"Real-Time Collaboration\",\n\t\ticon: \"✏️\",\n\t},\n\t{\n\t\tid: \"ai-observability\",\n\t\tname: \"AI Observability\",\n\t\tdescription: \"AI Observability\",\n\t\tlabel: \"AI Observability\",\n\t\ticon: \"🔭\",\n\t},\n\t{\n\t\tid: \"fine-tuning\",\n\t\tname: \"AI Fine-Tuning\",\n\t\tdescription: \"AI Fine-Tuning\",\n\t\tlabel: \"AI Fine-Tuning\",\n\t\ticon: \"🎯\",\n\t},\n\t{\n\t\tid: \"project-management\",\n\t\tname: \"Project Management\",\n\t\tdescription: \"Project Management\",\n\t\tlabel: \"Project Management\",\n\t\ticon: \"📋\",\n\t},\n\t{\n\t\tid: \"business-intelligence\",\n\t\tname: \"Business Intelligence\",\n\t\tdescription: \"Business Intelligence\",\n\t\tlabel: \"Business Intelligence\",\n\t\ticon: \"📈\",\n\t},\n\t{\n\t\tid: \"dns-networking\",\n\t\tname: \"DNS & Networking\",\n\t\tdescription: \"DNS & Networking\",\n\t\tlabel: \"DNS & Networking\",\n\t\ticon: \"🌐\",\n\t},\n\t{\n\t\tid: \"iot\",\n\t\tname: \"IoT & Edge\",\n\t\tdescription: \"IoT & Edge\",\n\t\tlabel: \"IoT & Edge\",\n\t\ticon: \"📡\",\n\t},\n\t{\n\t\tid: \"saas-boilerplate\",\n\t\tname: \"SaaS Boilerplates\",\n\t\tdescription: \"Full-stack SaaS starter kits and boilerplates\",\n\t\tlabel: \"SaaS Boilerplates\",\n\t\ticon: \"🚀\",\n\t},\n];\n"],"mappings":";AAmJA,MAAa,qBAAqC;CACjD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,MAAM;EACN;CACD"}
@@ -1,6 +1,6 @@
1
- const require_vi_2VT5v0um = require("./vi.2VT5v0um-CRqXre87.cjs");
2
- const require_resolver = require("./resolver.cjs");
1
+ const require_test_CTcmp4Su = require("./test.CTcmp4Su-DlzTarwH.cjs");
3
2
  const require_composer = require("./composer.cjs");
3
+ const require_resolver = require("./resolver.cjs");
4
4
  const require_validator = require("./validator.cjs");
5
5
  //#region src/validator.test.ts
6
6
  const defaultComposeOptions = {
@@ -11,37 +11,37 @@ const defaultComposeOptions = {
11
11
  deployment: "local",
12
12
  openclawVersion: "latest"
13
13
  };
14
- require_vi_2VT5v0um.describe("validate", () => {
15
- require_vi_2VT5v0um.it("validates a valid minimal stack", () => {
14
+ require_test_CTcmp4Su.describe("validate", () => {
15
+ require_test_CTcmp4Su.it("validates a valid minimal stack", () => {
16
16
  const resolved = require_resolver.resolve({
17
17
  services: ["redis"],
18
18
  skillPacks: []
19
19
  });
20
20
  const result = require_validator.validate(resolved, require_composer.compose(resolved, defaultComposeOptions));
21
- require_vi_2VT5v0um.globalExpect(result.valid).toBe(true);
22
- require_vi_2VT5v0um.globalExpect(result.errors).toHaveLength(0);
21
+ require_test_CTcmp4Su.globalExpect(result.valid).toBe(true);
22
+ require_test_CTcmp4Su.globalExpect(result.errors).toHaveLength(0);
23
23
  });
24
- require_vi_2VT5v0um.it("detects invalid YAML", () => {
25
- require_vi_2VT5v0um.globalExpect(require_validator.validate(require_resolver.resolve({
24
+ require_test_CTcmp4Su.it("detects invalid YAML", () => {
25
+ require_test_CTcmp4Su.globalExpect(require_validator.validate(require_resolver.resolve({
26
26
  services: ["redis"],
27
27
  skillPacks: []
28
28
  }), "services:\n redis:\n image: redis\n bad_indent:\n- broken\n::: invalid").errors.filter((e) => e.type === "yaml_invalid").length).toBeGreaterThanOrEqual(1);
29
29
  });
30
- require_vi_2VT5v0um.it("detects invalid domain", () => {
30
+ require_test_CTcmp4Su.it("detects invalid domain", () => {
31
31
  const resolved = require_resolver.resolve({
32
32
  services: ["redis"],
33
33
  skillPacks: []
34
34
  });
35
- require_vi_2VT5v0um.globalExpect(require_validator.validate(resolved, require_composer.compose(resolved, defaultComposeOptions), { domain: "not-a-domain" }).errors.filter((e) => e.type === "invalid_domain").length).toBeGreaterThanOrEqual(1);
35
+ require_test_CTcmp4Su.globalExpect(require_validator.validate(resolved, require_composer.compose(resolved, defaultComposeOptions), { domain: "not-a-domain" }).errors.filter((e) => e.type === "invalid_domain").length).toBeGreaterThanOrEqual(1);
36
36
  });
37
- require_vi_2VT5v0um.it("accepts valid domain", () => {
37
+ require_test_CTcmp4Su.it("accepts valid domain", () => {
38
38
  const resolved = require_resolver.resolve({
39
39
  services: ["redis"],
40
40
  skillPacks: []
41
41
  });
42
- require_vi_2VT5v0um.globalExpect(require_validator.validate(resolved, require_composer.compose(resolved, defaultComposeOptions), { domain: "example.com" }).errors.filter((e) => e.type === "invalid_domain")).toHaveLength(0);
42
+ require_test_CTcmp4Su.globalExpect(require_validator.validate(resolved, require_composer.compose(resolved, defaultComposeOptions), { domain: "example.com" }).errors.filter((e) => e.type === "invalid_domain")).toHaveLength(0);
43
43
  });
44
- require_vi_2VT5v0um.it("validates full stack without errors", () => {
44
+ require_test_CTcmp4Su.it("validates full stack without errors", () => {
45
45
  const resolved = require_resolver.resolve({
46
46
  services: [
47
47
  "redis",
@@ -54,8 +54,8 @@ require_vi_2VT5v0um.describe("validate", () => {
54
54
  skillPacks: []
55
55
  });
56
56
  const result = require_validator.validate(resolved, require_composer.compose(resolved, defaultComposeOptions));
57
- require_vi_2VT5v0um.globalExpect(result.valid).toBe(true);
58
- require_vi_2VT5v0um.globalExpect(result.errors).toHaveLength(0);
57
+ require_test_CTcmp4Su.globalExpect(result.valid).toBe(true);
58
+ require_test_CTcmp4Su.globalExpect(result.errors).toHaveLength(0);
59
59
  });
60
60
  });
61
61
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"validator.test.cjs","names":["describe","resolve","validate","compose"],"sources":["../src/validator.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { compose } from \"./composer.js\";\nimport { resolve } from \"./resolver.js\";\nimport type { ComposeOptions } from \"./types.js\";\nimport { validate } from \"./validator.js\";\n\nconst defaultComposeOptions: ComposeOptions = {\n\tprojectName: \"test-project\",\n\tproxy: \"none\",\n\tgpu: false,\n\tplatform: \"linux/amd64\",\n\tdeployment: \"local\",\n\topenclawVersion: \"latest\",\n};\n\ndescribe(\"validate\", () => {\n\tit(\"validates a valid minimal stack\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml);\n\n\t\texpect(result.valid).toBe(true);\n\t\texpect(result.errors).toHaveLength(0);\n\t});\n\n\tit(\"detects invalid YAML\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst brokenYaml =\n\t\t\t\"services:\\n redis:\\n image: redis\\n bad_indent:\\n- broken\\n::: invalid\";\n\n\t\tconst result = validate(resolved, brokenYaml);\n\n\t\tconst yamlErrors = result.errors.filter((e) => e.type === \"yaml_invalid\");\n\t\texpect(yamlErrors.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"detects invalid domain\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml, { domain: \"not-a-domain\" });\n\n\t\tconst domainErrors = result.errors.filter((e) => e.type === \"invalid_domain\");\n\t\texpect(domainErrors.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"accepts valid domain\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml, { domain: \"example.com\" });\n\n\t\tconst domainErrors = result.errors.filter((e) => e.type === \"invalid_domain\");\n\t\texpect(domainErrors).toHaveLength(0);\n\t});\n\n\tit(\"validates full stack without errors\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"qdrant\", \"n8n\", \"minio\", \"browserless\", \"searxng\"],\n\t\t\tskillPacks: [],\n\t\t});\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml);\n\n\t\texpect(result.valid).toBe(true);\n\t\texpect(result.errors).toHaveLength(0);\n\t});\n});\n"],"mappings":";;;;;AAMA,MAAM,wBAAwC;CAC7C,aAAa;CACb,OAAO;CACP,KAAK;CACL,UAAU;CACV,YAAY;CACZ,iBAAiB;CACjB;AAEDA,oBAAAA,SAAS,kBAAkB;AAC1B,qBAAA,GAAG,yCAAyC;EAC3C,MAAM,WAAWC,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC;EAEjE,MAAM,SAASC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,CACd;AAEvC,sBAAA,aAAO,OAAO,MAAM,CAAC,KAAK,KAAK;AAC/B,sBAAA,aAAO,OAAO,OAAO,CAAC,aAAa,EAAE;GACpC;AAEF,qBAAA,GAAG,8BAA8B;AAQhC,sBAAA,aAHeD,kBAAAA,SAJED,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC,EAEhE,8EAE4C,CAEnB,OAAO,QAAQ,MAAM,EAAE,SAAS,eAAe,CACvD,OAAO,CAAC,uBAAuB,EAAE;GAClD;AAEF,qBAAA,GAAG,gCAAgC;EAClC,MAAM,WAAWA,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC;AAKjE,sBAAA,aAHeC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,EACb,EAAE,QAAQ,gBAAgB,CAAC,CAEvC,OAAO,QAAQ,MAAM,EAAE,SAAS,iBAAiB,CACzD,OAAO,CAAC,uBAAuB,EAAE;GACpD;AAEF,qBAAA,GAAG,8BAA8B;EAChC,MAAM,WAAWF,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC;AAKjE,sBAAA,aAHeC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,EACb,EAAE,QAAQ,eAAe,CAAC,CAEtC,OAAO,QAAQ,MAAM,EAAE,SAAS,iBAAiB,CACzD,CAAC,aAAa,EAAE;GACnC;AAEF,qBAAA,GAAG,6CAA6C;EAC/C,MAAM,WAAWF,iBAAAA,QAAQ;GACxB,UAAU;IAAC;IAAS;IAAU;IAAO;IAAS;IAAe;IAAU;GACvE,YAAY,EAAE;GACd,CAAC;EAEF,MAAM,SAASC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,CACd;AAEvC,sBAAA,aAAO,OAAO,MAAM,CAAC,KAAK,KAAK;AAC/B,sBAAA,aAAO,OAAO,OAAO,CAAC,aAAa,EAAE;GACpC;EACD"}
1
+ {"version":3,"file":"validator.test.cjs","names":["describe","resolve","validate","compose"],"sources":["../src/validator.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { compose } from \"./composer.js\";\nimport { resolve } from \"./resolver.js\";\nimport type { ComposeOptions } from \"./types.js\";\nimport { validate } from \"./validator.js\";\n\nconst defaultComposeOptions: ComposeOptions = {\n\tprojectName: \"test-project\",\n\tproxy: \"none\",\n\tgpu: false,\n\tplatform: \"linux/amd64\",\n\tdeployment: \"local\",\n\topenclawVersion: \"latest\",\n};\n\ndescribe(\"validate\", () => {\n\tit(\"validates a valid minimal stack\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml);\n\n\t\texpect(result.valid).toBe(true);\n\t\texpect(result.errors).toHaveLength(0);\n\t});\n\n\tit(\"detects invalid YAML\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst brokenYaml =\n\t\t\t\"services:\\n redis:\\n image: redis\\n bad_indent:\\n- broken\\n::: invalid\";\n\n\t\tconst result = validate(resolved, brokenYaml);\n\n\t\tconst yamlErrors = result.errors.filter((e) => e.type === \"yaml_invalid\");\n\t\texpect(yamlErrors.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"detects invalid domain\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml, { domain: \"not-a-domain\" });\n\n\t\tconst domainErrors = result.errors.filter((e) => e.type === \"invalid_domain\");\n\t\texpect(domainErrors.length).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"accepts valid domain\", () => {\n\t\tconst resolved = resolve({ services: [\"redis\"], skillPacks: [] });\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml, { domain: \"example.com\" });\n\n\t\tconst domainErrors = result.errors.filter((e) => e.type === \"invalid_domain\");\n\t\texpect(domainErrors).toHaveLength(0);\n\t});\n\n\tit(\"validates full stack without errors\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"qdrant\", \"n8n\", \"minio\", \"browserless\", \"searxng\"],\n\t\t\tskillPacks: [],\n\t\t});\n\t\tconst yaml = compose(resolved, defaultComposeOptions);\n\t\tconst result = validate(resolved, yaml);\n\n\t\texpect(result.valid).toBe(true);\n\t\texpect(result.errors).toHaveLength(0);\n\t});\n});\n"],"mappings":";;;;;AAMA,MAAM,wBAAwC;CAC7C,aAAa;CACb,OAAO;CACP,KAAK;CACL,UAAU;CACV,YAAY;CACZ,iBAAiB;CACjB;AAEDA,sBAAAA,SAAS,kBAAkB;AAC1B,uBAAA,GAAG,yCAAyC;EAC3C,MAAM,WAAWC,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC;EAEjE,MAAM,SAASC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,CACd;AAEvC,wBAAA,aAAO,OAAO,MAAM,CAAC,KAAK,KAAK;AAC/B,wBAAA,aAAO,OAAO,OAAO,CAAC,aAAa,EAAE;GACpC;AAEF,uBAAA,GAAG,8BAA8B;AAQhC,wBAAA,aAHeD,kBAAAA,SAJED,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC,EAEhE,8EAE4C,CAEnB,OAAO,QAAQ,MAAM,EAAE,SAAS,eAAe,CACvD,OAAO,CAAC,uBAAuB,EAAE;GAClD;AAEF,uBAAA,GAAG,gCAAgC;EAClC,MAAM,WAAWA,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC;AAKjE,wBAAA,aAHeC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,EACb,EAAE,QAAQ,gBAAgB,CAAC,CAEvC,OAAO,QAAQ,MAAM,EAAE,SAAS,iBAAiB,CACzD,OAAO,CAAC,uBAAuB,EAAE;GACpD;AAEF,uBAAA,GAAG,8BAA8B;EAChC,MAAM,WAAWF,iBAAAA,QAAQ;GAAE,UAAU,CAAC,QAAQ;GAAE,YAAY,EAAE;GAAE,CAAC;AAKjE,wBAAA,aAHeC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,EACb,EAAE,QAAQ,eAAe,CAAC,CAEtC,OAAO,QAAQ,MAAM,EAAE,SAAS,iBAAiB,CACzD,CAAC,aAAa,EAAE;GACnC;AAEF,uBAAA,GAAG,6CAA6C;EAC/C,MAAM,WAAWF,iBAAAA,QAAQ;GACxB,UAAU;IAAC;IAAS;IAAU;IAAO;IAAS;IAAe;IAAU;GACvE,YAAY,EAAE;GACd,CAAC;EAEF,MAAM,SAASC,kBAAAA,SAAS,UADXC,iBAAAA,QAAQ,UAAU,sBAAsB,CACd;AAEvC,wBAAA,aAAO,OAAO,MAAM,CAAC,KAAK,KAAK;AAC/B,wBAAA,aAAO,OAAO,OAAO,CAAC,aAAa,EAAE;GACpC;EACD"}
@@ -1,6 +1,6 @@
1
- import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-DvC3SVNc.mjs";
2
- import { resolve } from "./resolver.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "./test.CTcmp4Su-ClCHJ3FA.mjs";
3
2
  import { compose } from "./composer.mjs";
3
+ import { resolve } from "./resolver.mjs";
4
4
  import { validate } from "./validator.mjs";
5
5
  //#region src/validator.test.ts
6
6
  const defaultComposeOptions = {
@@ -8,7 +8,7 @@ function getImageTag(serviceId) {
8
8
  /** Get the full image reference (image:tag) for a service */
9
9
  function getImageReference(serviceId) {
10
10
  const svc = require_services_registry.getServiceById(serviceId);
11
- if (!svc) return void 0;
11
+ if (!svc || !svc.image || !svc.imageTag) return void 0;
12
12
  return `${svc.image}:${svc.imageTag}`;
13
13
  }
14
14
  /** Pin all service image tags to the registry-defined versions (returns a copy) */
@@ -1 +1 @@
1
- {"version":3,"file":"version-manager.cjs","names":["getServiceById"],"sources":["../src/version-manager.ts"],"sourcesContent":["import { getServiceById } from \"./services/registry.js\";\nimport type { ResolverOutput, ServiceDefinition, Warning } from \"./types.js\";\n\n/** Get the pinned image tag for a service */\nexport function getImageTag(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\treturn svc?.imageTag;\n}\n\n/** Get the full image reference (image:tag) for a service */\nexport function getImageReference(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\tif (!svc) return undefined;\n\treturn `${svc.image}:${svc.imageTag}`;\n}\n\n/** Pin all service image tags to the registry-defined versions (returns a copy) */\nexport function pinImageTags(resolved: ResolverOutput): ResolverOutput {\n\treturn {\n\t\t...resolved,\n\t\tservices: resolved.services.map((s) => {\n\t\t\tconst registryDef = getServiceById(s.definition.id);\n\t\t\tconst pinnedTag = registryDef?.imageTag ?? s.definition.imageTag;\n\t\t\treturn {\n\t\t\t\t...s,\n\t\t\t\tdefinition: {\n\t\t\t\t\t...s.definition,\n\t\t\t\t\timageTag: pinnedTag,\n\t\t\t\t},\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/** Check for known compatibility issues between services */\nexport function checkCompatibility(services: ServiceDefinition[]): Warning[] {\n\tconst warnings: Warning[] = [];\n\tconst ids = new Set(services.map((s) => s.id));\n\n\t// Redis + Valkey conflict (should already be caught by resolver, but double-check)\n\tif (ids.has(\"redis\") && ids.has(\"valkey\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Redis and Valkey cannot coexist. Choose one.\",\n\t\t});\n\t}\n\t// Caddy + Traefik conflict\n\tif (ids.has(\"caddy\") && ids.has(\"traefik\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Caddy and Traefik cannot coexist. Choose one reverse proxy.\",\n\t\t});\n\t}\n\t// Multiple vector DBs warning\n\tconst vectorDbs = [\"qdrant\", \"chromadb\", \"weaviate\"].filter((id) => ids.has(id));\n\tif (vectorDbs.length > 1) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Multiple vector databases selected (${vectorDbs.join(\", \")}). Consider using just one to reduce resource usage.`,\n\t\t});\n\t}\n\t// GPU services without GPU\n\tconst gpuServices = services.filter((s) => s.gpuRequired);\n\tif (gpuServices.length > 0) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Services requiring GPU: ${gpuServices.map((s) => s.name).join(\", \")}. Ensure NVIDIA Container Toolkit is installed.`,\n\t\t});\n\t}\n\n\treturn warnings;\n}\n"],"mappings":";;;;AAIA,SAAgB,YAAY,WAAuC;AAElE,QADYA,0BAAAA,eAAe,UAAU,EACzB;;;AAIb,SAAgB,kBAAkB,WAAuC;CACxE,MAAM,MAAMA,0BAAAA,eAAe,UAAU;AACrC,KAAI,CAAC,IAAK,QAAO,KAAA;AACjB,QAAO,GAAG,IAAI,MAAM,GAAG,IAAI;;;AAI5B,SAAgB,aAAa,UAA0C;AACtE,QAAO;EACN,GAAG;EACH,UAAU,SAAS,SAAS,KAAK,MAAM;GAEtC,MAAM,YADcA,0BAAAA,eAAe,EAAE,WAAW,GAAG,EACpB,YAAY,EAAE,WAAW;AACxD,UAAO;IACN,GAAG;IACH,YAAY;KACX,GAAG,EAAE;KACL,UAAU;KACV;IACD;IACA;EACF;;;AAIF,SAAgB,mBAAmB,UAA0C;CAC5E,MAAM,WAAsB,EAAE;CAC9B,MAAM,MAAM,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,GAAG,CAAC;AAG9C,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,CACxC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;AAGH,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,UAAU,CACzC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;CAGH,MAAM,YAAY;EAAC;EAAU;EAAY;EAAW,CAAC,QAAQ,OAAO,IAAI,IAAI,GAAG,CAAC;AAChF,KAAI,UAAU,SAAS,EACtB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,uCAAuC,UAAU,KAAK,KAAK,CAAC;EACrE,CAAC;CAGH,MAAM,cAAc,SAAS,QAAQ,MAAM,EAAE,YAAY;AACzD,KAAI,YAAY,SAAS,EACxB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,2BAA2B,YAAY,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC;EAC9E,CAAC;AAGH,QAAO"}
1
+ {"version":3,"file":"version-manager.cjs","names":["getServiceById"],"sources":["../src/version-manager.ts"],"sourcesContent":["import { getServiceById } from \"./services/registry.js\";\nimport type { ResolverOutput, ServiceDefinition, Warning } from \"./types.js\";\n\n/** Get the pinned image tag for a service */\nexport function getImageTag(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\treturn svc?.imageTag;\n}\n\n/** Get the full image reference (image:tag) for a service */\nexport function getImageReference(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\tif (!svc || !svc.image || !svc.imageTag) return undefined;\n\treturn `${svc.image}:${svc.imageTag}`;\n}\n\n/** Pin all service image tags to the registry-defined versions (returns a copy) */\nexport function pinImageTags(resolved: ResolverOutput): ResolverOutput {\n\treturn {\n\t\t...resolved,\n\t\tservices: resolved.services.map((s) => {\n\t\t\tconst registryDef = getServiceById(s.definition.id);\n\t\t\tconst pinnedTag = registryDef?.imageTag ?? s.definition.imageTag;\n\t\t\treturn {\n\t\t\t\t...s,\n\t\t\t\tdefinition: {\n\t\t\t\t\t...s.definition,\n\t\t\t\t\timageTag: pinnedTag,\n\t\t\t\t},\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/** Check for known compatibility issues between services */\nexport function checkCompatibility(services: ServiceDefinition[]): Warning[] {\n\tconst warnings: Warning[] = [];\n\tconst ids = new Set(services.map((s) => s.id));\n\n\t// Redis + Valkey conflict (should already be caught by resolver, but double-check)\n\tif (ids.has(\"redis\") && ids.has(\"valkey\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Redis and Valkey cannot coexist. Choose one.\",\n\t\t});\n\t}\n\t// Caddy + Traefik conflict\n\tif (ids.has(\"caddy\") && ids.has(\"traefik\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Caddy and Traefik cannot coexist. Choose one reverse proxy.\",\n\t\t});\n\t}\n\t// Multiple vector DBs warning\n\tconst vectorDbs = [\"qdrant\", \"chromadb\", \"weaviate\"].filter((id) => ids.has(id));\n\tif (vectorDbs.length > 1) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Multiple vector databases selected (${vectorDbs.join(\", \")}). Consider using just one to reduce resource usage.`,\n\t\t});\n\t}\n\t// GPU services without GPU\n\tconst gpuServices = services.filter((s) => s.gpuRequired);\n\tif (gpuServices.length > 0) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Services requiring GPU: ${gpuServices.map((s) => s.name).join(\", \")}. Ensure NVIDIA Container Toolkit is installed.`,\n\t\t});\n\t}\n\n\treturn warnings;\n}\n"],"mappings":";;;;AAIA,SAAgB,YAAY,WAAuC;AAElE,QADYA,0BAAAA,eAAe,UAAU,EACzB;;;AAIb,SAAgB,kBAAkB,WAAuC;CACxE,MAAM,MAAMA,0BAAAA,eAAe,UAAU;AACrC,KAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,SAAU,QAAO,KAAA;AAChD,QAAO,GAAG,IAAI,MAAM,GAAG,IAAI;;;AAI5B,SAAgB,aAAa,UAA0C;AACtE,QAAO;EACN,GAAG;EACH,UAAU,SAAS,SAAS,KAAK,MAAM;GAEtC,MAAM,YADcA,0BAAAA,eAAe,EAAE,WAAW,GAAG,EACpB,YAAY,EAAE,WAAW;AACxD,UAAO;IACN,GAAG;IACH,YAAY;KACX,GAAG,EAAE;KACL,UAAU;KACV;IACD;IACA;EACF;;;AAIF,SAAgB,mBAAmB,UAA0C;CAC5E,MAAM,WAAsB,EAAE;CAC9B,MAAM,MAAM,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,GAAG,CAAC;AAG9C,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,CACxC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;AAGH,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,UAAU,CACzC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;CAGH,MAAM,YAAY;EAAC;EAAU;EAAY;EAAW,CAAC,QAAQ,OAAO,IAAI,IAAI,GAAG,CAAC;AAChF,KAAI,UAAU,SAAS,EACtB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,uCAAuC,UAAU,KAAK,KAAK,CAAC;EACrE,CAAC;CAGH,MAAM,cAAc,SAAS,QAAQ,MAAM,EAAE,YAAY;AACzD,KAAI,YAAY,SAAS,EACxB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,2BAA2B,YAAY,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC;EAC9E,CAAC;AAGH,QAAO"}
@@ -7,7 +7,7 @@ function getImageTag(serviceId) {
7
7
  /** Get the full image reference (image:tag) for a service */
8
8
  function getImageReference(serviceId) {
9
9
  const svc = getServiceById(serviceId);
10
- if (!svc) return void 0;
10
+ if (!svc || !svc.image || !svc.imageTag) return void 0;
11
11
  return `${svc.image}:${svc.imageTag}`;
12
12
  }
13
13
  /** Pin all service image tags to the registry-defined versions (returns a copy) */
@@ -1 +1 @@
1
- {"version":3,"file":"version-manager.mjs","names":[],"sources":["../src/version-manager.ts"],"sourcesContent":["import { getServiceById } from \"./services/registry.js\";\nimport type { ResolverOutput, ServiceDefinition, Warning } from \"./types.js\";\n\n/** Get the pinned image tag for a service */\nexport function getImageTag(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\treturn svc?.imageTag;\n}\n\n/** Get the full image reference (image:tag) for a service */\nexport function getImageReference(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\tif (!svc) return undefined;\n\treturn `${svc.image}:${svc.imageTag}`;\n}\n\n/** Pin all service image tags to the registry-defined versions (returns a copy) */\nexport function pinImageTags(resolved: ResolverOutput): ResolverOutput {\n\treturn {\n\t\t...resolved,\n\t\tservices: resolved.services.map((s) => {\n\t\t\tconst registryDef = getServiceById(s.definition.id);\n\t\t\tconst pinnedTag = registryDef?.imageTag ?? s.definition.imageTag;\n\t\t\treturn {\n\t\t\t\t...s,\n\t\t\t\tdefinition: {\n\t\t\t\t\t...s.definition,\n\t\t\t\t\timageTag: pinnedTag,\n\t\t\t\t},\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/** Check for known compatibility issues between services */\nexport function checkCompatibility(services: ServiceDefinition[]): Warning[] {\n\tconst warnings: Warning[] = [];\n\tconst ids = new Set(services.map((s) => s.id));\n\n\t// Redis + Valkey conflict (should already be caught by resolver, but double-check)\n\tif (ids.has(\"redis\") && ids.has(\"valkey\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Redis and Valkey cannot coexist. Choose one.\",\n\t\t});\n\t}\n\t// Caddy + Traefik conflict\n\tif (ids.has(\"caddy\") && ids.has(\"traefik\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Caddy and Traefik cannot coexist. Choose one reverse proxy.\",\n\t\t});\n\t}\n\t// Multiple vector DBs warning\n\tconst vectorDbs = [\"qdrant\", \"chromadb\", \"weaviate\"].filter((id) => ids.has(id));\n\tif (vectorDbs.length > 1) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Multiple vector databases selected (${vectorDbs.join(\", \")}). Consider using just one to reduce resource usage.`,\n\t\t});\n\t}\n\t// GPU services without GPU\n\tconst gpuServices = services.filter((s) => s.gpuRequired);\n\tif (gpuServices.length > 0) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Services requiring GPU: ${gpuServices.map((s) => s.name).join(\", \")}. Ensure NVIDIA Container Toolkit is installed.`,\n\t\t});\n\t}\n\n\treturn warnings;\n}\n"],"mappings":";;;AAIA,SAAgB,YAAY,WAAuC;AAElE,QADY,eAAe,UAAU,EACzB;;;AAIb,SAAgB,kBAAkB,WAAuC;CACxE,MAAM,MAAM,eAAe,UAAU;AACrC,KAAI,CAAC,IAAK,QAAO,KAAA;AACjB,QAAO,GAAG,IAAI,MAAM,GAAG,IAAI;;;AAI5B,SAAgB,aAAa,UAA0C;AACtE,QAAO;EACN,GAAG;EACH,UAAU,SAAS,SAAS,KAAK,MAAM;GAEtC,MAAM,YADc,eAAe,EAAE,WAAW,GAAG,EACpB,YAAY,EAAE,WAAW;AACxD,UAAO;IACN,GAAG;IACH,YAAY;KACX,GAAG,EAAE;KACL,UAAU;KACV;IACD;IACA;EACF;;;AAIF,SAAgB,mBAAmB,UAA0C;CAC5E,MAAM,WAAsB,EAAE;CAC9B,MAAM,MAAM,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,GAAG,CAAC;AAG9C,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,CACxC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;AAGH,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,UAAU,CACzC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;CAGH,MAAM,YAAY;EAAC;EAAU;EAAY;EAAW,CAAC,QAAQ,OAAO,IAAI,IAAI,GAAG,CAAC;AAChF,KAAI,UAAU,SAAS,EACtB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,uCAAuC,UAAU,KAAK,KAAK,CAAC;EACrE,CAAC;CAGH,MAAM,cAAc,SAAS,QAAQ,MAAM,EAAE,YAAY;AACzD,KAAI,YAAY,SAAS,EACxB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,2BAA2B,YAAY,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC;EAC9E,CAAC;AAGH,QAAO"}
1
+ {"version":3,"file":"version-manager.mjs","names":[],"sources":["../src/version-manager.ts"],"sourcesContent":["import { getServiceById } from \"./services/registry.js\";\nimport type { ResolverOutput, ServiceDefinition, Warning } from \"./types.js\";\n\n/** Get the pinned image tag for a service */\nexport function getImageTag(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\treturn svc?.imageTag;\n}\n\n/** Get the full image reference (image:tag) for a service */\nexport function getImageReference(serviceId: string): string | undefined {\n\tconst svc = getServiceById(serviceId);\n\tif (!svc || !svc.image || !svc.imageTag) return undefined;\n\treturn `${svc.image}:${svc.imageTag}`;\n}\n\n/** Pin all service image tags to the registry-defined versions (returns a copy) */\nexport function pinImageTags(resolved: ResolverOutput): ResolverOutput {\n\treturn {\n\t\t...resolved,\n\t\tservices: resolved.services.map((s) => {\n\t\t\tconst registryDef = getServiceById(s.definition.id);\n\t\t\tconst pinnedTag = registryDef?.imageTag ?? s.definition.imageTag;\n\t\t\treturn {\n\t\t\t\t...s,\n\t\t\t\tdefinition: {\n\t\t\t\t\t...s.definition,\n\t\t\t\t\timageTag: pinnedTag,\n\t\t\t\t},\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/** Check for known compatibility issues between services */\nexport function checkCompatibility(services: ServiceDefinition[]): Warning[] {\n\tconst warnings: Warning[] = [];\n\tconst ids = new Set(services.map((s) => s.id));\n\n\t// Redis + Valkey conflict (should already be caught by resolver, but double-check)\n\tif (ids.has(\"redis\") && ids.has(\"valkey\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Redis and Valkey cannot coexist. Choose one.\",\n\t\t});\n\t}\n\t// Caddy + Traefik conflict\n\tif (ids.has(\"caddy\") && ids.has(\"traefik\")) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: \"Caddy and Traefik cannot coexist. Choose one reverse proxy.\",\n\t\t});\n\t}\n\t// Multiple vector DBs warning\n\tconst vectorDbs = [\"qdrant\", \"chromadb\", \"weaviate\"].filter((id) => ids.has(id));\n\tif (vectorDbs.length > 1) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Multiple vector databases selected (${vectorDbs.join(\", \")}). Consider using just one to reduce resource usage.`,\n\t\t});\n\t}\n\t// GPU services without GPU\n\tconst gpuServices = services.filter((s) => s.gpuRequired);\n\tif (gpuServices.length > 0) {\n\t\twarnings.push({\n\t\t\ttype: \"compatibility\",\n\t\t\tmessage: `Services requiring GPU: ${gpuServices.map((s) => s.name).join(\", \")}. Ensure NVIDIA Container Toolkit is installed.`,\n\t\t});\n\t}\n\n\treturn warnings;\n}\n"],"mappings":";;;AAIA,SAAgB,YAAY,WAAuC;AAElE,QADY,eAAe,UAAU,EACzB;;;AAIb,SAAgB,kBAAkB,WAAuC;CACxE,MAAM,MAAM,eAAe,UAAU;AACrC,KAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,SAAU,QAAO,KAAA;AAChD,QAAO,GAAG,IAAI,MAAM,GAAG,IAAI;;;AAI5B,SAAgB,aAAa,UAA0C;AACtE,QAAO;EACN,GAAG;EACH,UAAU,SAAS,SAAS,KAAK,MAAM;GAEtC,MAAM,YADc,eAAe,EAAE,WAAW,GAAG,EACpB,YAAY,EAAE,WAAW;AACxD,UAAO;IACN,GAAG;IACH,YAAY;KACX,GAAG,EAAE;KACL,UAAU;KACV;IACD;IACA;EACF;;;AAIF,SAAgB,mBAAmB,UAA0C;CAC5E,MAAM,WAAsB,EAAE;CAC9B,MAAM,MAAM,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,GAAG,CAAC;AAG9C,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,CACxC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;AAGH,KAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,UAAU,CACzC,UAAS,KAAK;EACb,MAAM;EACN,SAAS;EACT,CAAC;CAGH,MAAM,YAAY;EAAC;EAAU;EAAY;EAAW,CAAC,QAAQ,OAAO,IAAI,IAAI,GAAG,CAAC;AAChF,KAAI,UAAU,SAAS,EACtB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,uCAAuC,UAAU,KAAK,KAAK,CAAC;EACrE,CAAC;CAGH,MAAM,cAAc,SAAS,QAAQ,MAAM,EAAE,YAAY;AACzD,KAAI,YAAY,SAAS,EACxB,UAAS,KAAK;EACb,MAAM;EACN,SAAS,2BAA2B,YAAY,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC;EAC9E,CAAC;AAGH,QAAO"}
@@ -1,31 +1,31 @@
1
- const require_vi_2VT5v0um = require("./vi.2VT5v0um-CRqXre87.cjs");
1
+ const require_test_CTcmp4Su = require("./test.CTcmp4Su-DlzTarwH.cjs");
2
2
  const require_services_registry = require("./services/registry.cjs");
3
3
  const require_resolver = require("./resolver.cjs");
4
4
  const require_version_manager = require("./version-manager.cjs");
5
5
  //#region src/version-manager.test.ts
6
- require_vi_2VT5v0um.describe("getImageTag", () => {
7
- require_vi_2VT5v0um.it("returns the tag for a known service", () => {
6
+ require_test_CTcmp4Su.describe("getImageTag", () => {
7
+ require_test_CTcmp4Su.it("returns the tag for a known service", () => {
8
8
  const tag = require_version_manager.getImageTag("redis");
9
- require_vi_2VT5v0um.globalExpect(tag).toBeDefined();
10
- require_vi_2VT5v0um.globalExpect(typeof tag).toBe("string");
9
+ require_test_CTcmp4Su.globalExpect(tag).toBeDefined();
10
+ require_test_CTcmp4Su.globalExpect(typeof tag).toBe("string");
11
11
  });
12
- require_vi_2VT5v0um.it("returns undefined for an unknown service", () => {
13
- require_vi_2VT5v0um.globalExpect(require_version_manager.getImageTag("nonexistent-service-xyz")).toBeUndefined();
12
+ require_test_CTcmp4Su.it("returns undefined for an unknown service", () => {
13
+ require_test_CTcmp4Su.globalExpect(require_version_manager.getImageTag("nonexistent-service-xyz")).toBeUndefined();
14
14
  });
15
15
  });
16
- require_vi_2VT5v0um.describe("getImageReference", () => {
17
- require_vi_2VT5v0um.it("returns image:tag for a known service", () => {
16
+ require_test_CTcmp4Su.describe("getImageReference", () => {
17
+ require_test_CTcmp4Su.it("returns image:tag for a known service", () => {
18
18
  const ref = require_version_manager.getImageReference("redis");
19
- require_vi_2VT5v0um.globalExpect(ref).toBeDefined();
20
- require_vi_2VT5v0um.globalExpect(ref).toContain(":");
21
- require_vi_2VT5v0um.globalExpect(ref).toMatch(/^.+:.+$/);
19
+ require_test_CTcmp4Su.globalExpect(ref).toBeDefined();
20
+ require_test_CTcmp4Su.globalExpect(ref).toContain(":");
21
+ require_test_CTcmp4Su.globalExpect(ref).toMatch(/^.+:.+$/);
22
22
  });
23
- require_vi_2VT5v0um.it("returns undefined for an unknown service", () => {
24
- require_vi_2VT5v0um.globalExpect(require_version_manager.getImageReference("nonexistent-service-xyz")).toBeUndefined();
23
+ require_test_CTcmp4Su.it("returns undefined for an unknown service", () => {
24
+ require_test_CTcmp4Su.globalExpect(require_version_manager.getImageReference("nonexistent-service-xyz")).toBeUndefined();
25
25
  });
26
26
  });
27
- require_vi_2VT5v0um.describe("pinImageTags", () => {
28
- require_vi_2VT5v0um.it("pins image tags from the registry for all services", () => {
27
+ require_test_CTcmp4Su.describe("pinImageTags", () => {
28
+ require_test_CTcmp4Su.it("pins image tags from the registry for all services", () => {
29
29
  const resolved = require_resolver.resolve({
30
30
  services: ["redis", "postgresql"],
31
31
  skillPacks: [],
@@ -34,14 +34,15 @@ require_vi_2VT5v0um.describe("pinImageTags", () => {
34
34
  platform: "linux/amd64"
35
35
  });
36
36
  const pinned = require_version_manager.pinImageTags(resolved);
37
- require_vi_2VT5v0um.globalExpect(pinned.services).toHaveLength(resolved.services.length);
37
+ require_test_CTcmp4Su.globalExpect(pinned.services).toHaveLength(resolved.services.length);
38
38
  for (const svc of pinned.services) {
39
- require_vi_2VT5v0um.globalExpect(svc.definition.imageTag).toBeDefined();
40
- require_vi_2VT5v0um.globalExpect(typeof svc.definition.imageTag).toBe("string");
41
- require_vi_2VT5v0um.globalExpect(svc.definition.imageTag.length).toBeGreaterThan(0);
39
+ if (svc.definition.gitSource) continue;
40
+ require_test_CTcmp4Su.globalExpect(svc.definition.imageTag).toBeDefined();
41
+ require_test_CTcmp4Su.globalExpect(typeof svc.definition.imageTag).toBe("string");
42
+ require_test_CTcmp4Su.globalExpect(svc.definition.imageTag.length).toBeGreaterThan(0);
42
43
  }
43
44
  });
44
- require_vi_2VT5v0um.it("does not mutate the original resolved output", () => {
45
+ require_test_CTcmp4Su.it("does not mutate the original resolved output", () => {
45
46
  const resolved = require_resolver.resolve({
46
47
  services: ["redis"],
47
48
  skillPacks: [],
@@ -49,11 +50,11 @@ require_vi_2VT5v0um.describe("pinImageTags", () => {
49
50
  gpu: false,
50
51
  platform: "linux/amd64"
51
52
  });
52
- const originalTag = resolved.services[0]?.definition.imageTag;
53
+ const originalTag = resolved.services.find((s) => s.definition.id === "redis")?.definition.imageTag;
53
54
  require_version_manager.pinImageTags(resolved);
54
- require_vi_2VT5v0um.globalExpect(resolved.services[0]?.definition.imageTag).toBe(originalTag);
55
+ require_test_CTcmp4Su.globalExpect(resolved.services.find((s) => s.definition.id === "redis")?.definition.imageTag).toBe(originalTag);
55
56
  });
56
- require_vi_2VT5v0um.it("preserves non-tag properties", () => {
57
+ require_test_CTcmp4Su.it("preserves non-tag properties", () => {
57
58
  const resolved = require_resolver.resolve({
58
59
  services: ["redis"],
59
60
  skillPacks: [],
@@ -62,37 +63,38 @@ require_vi_2VT5v0um.describe("pinImageTags", () => {
62
63
  platform: "linux/amd64"
63
64
  });
64
65
  const pinned = require_version_manager.pinImageTags(resolved);
65
- require_vi_2VT5v0um.globalExpect(pinned.services[0]?.definition.id).toBe("redis");
66
- require_vi_2VT5v0um.globalExpect(pinned.services[0]?.definition.name).toBe("Redis");
67
- require_vi_2VT5v0um.globalExpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);
66
+ const redis = pinned.services.find((s) => s.definition.id === "redis");
67
+ require_test_CTcmp4Su.globalExpect(redis).toBeDefined();
68
+ require_test_CTcmp4Su.globalExpect(redis.definition.name).toBe("Redis");
69
+ require_test_CTcmp4Su.globalExpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);
68
70
  });
69
71
  });
70
- require_vi_2VT5v0um.describe("checkCompatibility", () => {
71
- require_vi_2VT5v0um.it("warns when Redis and Valkey are both selected", () => {
72
+ require_test_CTcmp4Su.describe("checkCompatibility", () => {
73
+ require_test_CTcmp4Su.it("warns when Redis and Valkey are both selected", () => {
72
74
  const all = require_services_registry.getAllServices();
73
75
  const redis = all.find((s) => s.id === "redis");
74
76
  const valkey = all.find((s) => s.id === "valkey");
75
- if (redis && valkey) require_vi_2VT5v0um.globalExpect(require_version_manager.checkCompatibility([redis, valkey]).some((w) => w.message.includes("Redis") && w.message.includes("Valkey"))).toBe(true);
77
+ if (redis && valkey) require_test_CTcmp4Su.globalExpect(require_version_manager.checkCompatibility([redis, valkey]).some((w) => w.message.includes("Redis") && w.message.includes("Valkey"))).toBe(true);
76
78
  });
77
- require_vi_2VT5v0um.it("warns when Caddy and Traefik are both selected", () => {
79
+ require_test_CTcmp4Su.it("warns when Caddy and Traefik are both selected", () => {
78
80
  const all = require_services_registry.getAllServices();
79
81
  const caddy = all.find((s) => s.id === "caddy");
80
82
  const traefik = all.find((s) => s.id === "traefik");
81
- if (caddy && traefik) require_vi_2VT5v0um.globalExpect(require_version_manager.checkCompatibility([caddy, traefik]).some((w) => w.message.includes("Caddy") && w.message.includes("Traefik"))).toBe(true);
83
+ if (caddy && traefik) require_test_CTcmp4Su.globalExpect(require_version_manager.checkCompatibility([caddy, traefik]).some((w) => w.message.includes("Caddy") && w.message.includes("Traefik"))).toBe(true);
82
84
  });
83
- require_vi_2VT5v0um.it("warns about multiple vector databases", () => {
85
+ require_test_CTcmp4Su.it("warns about multiple vector databases", () => {
84
86
  const all = require_services_registry.getAllServices();
85
87
  const qdrant = all.find((s) => s.id === "qdrant");
86
88
  const chromadb = all.find((s) => s.id === "chromadb");
87
- if (qdrant && chromadb) require_vi_2VT5v0um.globalExpect(require_version_manager.checkCompatibility([qdrant, chromadb]).some((w) => w.message.includes("vector database"))).toBe(true);
89
+ if (qdrant && chromadb) require_test_CTcmp4Su.globalExpect(require_version_manager.checkCompatibility([qdrant, chromadb]).some((w) => w.message.includes("vector database"))).toBe(true);
88
90
  });
89
- require_vi_2VT5v0um.it("warns about GPU services", () => {
91
+ require_test_CTcmp4Su.it("warns about GPU services", () => {
90
92
  const gpuService = require_services_registry.getAllServices().find((s) => s.gpuRequired);
91
- if (gpuService) require_vi_2VT5v0um.globalExpect(require_version_manager.checkCompatibility([gpuService]).some((w) => w.message.includes("GPU"))).toBe(true);
93
+ if (gpuService) require_test_CTcmp4Su.globalExpect(require_version_manager.checkCompatibility([gpuService]).some((w) => w.message.includes("GPU"))).toBe(true);
92
94
  });
93
- require_vi_2VT5v0um.it("returns no warnings for a single non-conflicting service", () => {
95
+ require_test_CTcmp4Su.it("returns no warnings for a single non-conflicting service", () => {
94
96
  const redis = require_services_registry.getServiceById("redis");
95
- if (redis) require_vi_2VT5v0um.globalExpect(require_version_manager.checkCompatibility([redis]).filter((w) => w.type === "compatibility" && !w.message.includes("GPU"))).toHaveLength(0);
97
+ if (redis) require_test_CTcmp4Su.globalExpect(require_version_manager.checkCompatibility([redis]).filter((w) => w.type === "compatibility" && !w.message.includes("GPU"))).toHaveLength(0);
96
98
  });
97
99
  });
98
100
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"version-manager.test.cjs","names":["describe","getImageTag","getImageReference","resolve","pinImageTags","getAllServices","checkCompatibility","getServiceById"],"sources":["../src/version-manager.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"./resolver.js\";\nimport { getAllServices, getServiceById } from \"./services/registry.js\";\nimport {\n\tcheckCompatibility,\n\tgetImageReference,\n\tgetImageTag,\n\tpinImageTags,\n} from \"./version-manager.js\";\n\ndescribe(\"getImageTag\", () => {\n\tit(\"returns the tag for a known service\", () => {\n\t\tconst tag = getImageTag(\"redis\");\n\t\texpect(tag).toBeDefined();\n\t\texpect(typeof tag).toBe(\"string\");\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageTag(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"getImageReference\", () => {\n\tit(\"returns image:tag for a known service\", () => {\n\t\tconst ref = getImageReference(\"redis\");\n\t\texpect(ref).toBeDefined();\n\t\texpect(ref).toContain(\":\");\n\t\texpect(ref).toMatch(/^.+:.+$/);\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageReference(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"pinImageTags\", () => {\n\tit(\"pins image tags from the registry for all services\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"postgresql\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\n\t\texpect(pinned.services).toHaveLength(resolved.services.length);\n\n\t\tfor (const svc of pinned.services) {\n\t\t\texpect(svc.definition.imageTag).toBeDefined();\n\t\t\texpect(typeof svc.definition.imageTag).toBe(\"string\");\n\t\t\texpect(svc.definition.imageTag.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"does not mutate the original resolved output\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst originalTag = resolved.services[0]?.definition.imageTag;\n\t\tpinImageTags(resolved);\n\n\t\texpect(resolved.services[0]?.definition.imageTag).toBe(originalTag);\n\t});\n\n\tit(\"preserves non-tag properties\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\t\texpect(pinned.services[0]?.definition.id).toBe(\"redis\");\n\t\texpect(pinned.services[0]?.definition.name).toBe(\"Redis\");\n\t\texpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);\n\t});\n});\n\ndescribe(\"checkCompatibility\", () => {\n\tit(\"warns when Redis and Valkey are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst redis = all.find((s) => s.id === \"redis\");\n\t\tconst valkey = all.find((s) => s.id === \"valkey\");\n\n\t\tif (redis && valkey) {\n\t\t\tconst warnings = checkCompatibility([redis, valkey]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Redis\") && w.message.includes(\"Valkey\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns when Caddy and Traefik are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst caddy = all.find((s) => s.id === \"caddy\");\n\t\tconst traefik = all.find((s) => s.id === \"traefik\");\n\n\t\tif (caddy && traefik) {\n\t\t\tconst warnings = checkCompatibility([caddy, traefik]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Caddy\") && w.message.includes(\"Traefik\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about multiple vector databases\", () => {\n\t\tconst all = getAllServices();\n\t\tconst qdrant = all.find((s) => s.id === \"qdrant\");\n\t\tconst chromadb = all.find((s) => s.id === \"chromadb\");\n\n\t\tif (qdrant && chromadb) {\n\t\t\tconst warnings = checkCompatibility([qdrant, chromadb]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"vector database\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about GPU services\", () => {\n\t\tconst all = getAllServices();\n\t\tconst gpuService = all.find((s) => s.gpuRequired);\n\n\t\tif (gpuService) {\n\t\t\tconst warnings = checkCompatibility([gpuService]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"GPU\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"returns no warnings for a single non-conflicting service\", () => {\n\t\tconst redis = getServiceById(\"redis\");\n\t\tif (redis) {\n\t\t\tconst warnings = checkCompatibility([redis]);\n\t\t\texpect(\n\t\t\t\twarnings.filter((w) => w.type === \"compatibility\" && !w.message.includes(\"GPU\")),\n\t\t\t).toHaveLength(0);\n\t\t}\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"version-manager.test.cjs","names":["describe","getImageTag","getImageReference","resolve","pinImageTags","getAllServices","checkCompatibility","getServiceById"],"sources":["../src/version-manager.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"./resolver.js\";\nimport { getAllServices, getServiceById } from \"./services/registry.js\";\nimport {\n\tcheckCompatibility,\n\tgetImageReference,\n\tgetImageTag,\n\tpinImageTags,\n} from \"./version-manager.js\";\n\ndescribe(\"getImageTag\", () => {\n\tit(\"returns the tag for a known service\", () => {\n\t\tconst tag = getImageTag(\"redis\");\n\t\texpect(tag).toBeDefined();\n\t\texpect(typeof tag).toBe(\"string\");\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageTag(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"getImageReference\", () => {\n\tit(\"returns image:tag for a known service\", () => {\n\t\tconst ref = getImageReference(\"redis\");\n\t\texpect(ref).toBeDefined();\n\t\texpect(ref).toContain(\":\");\n\t\texpect(ref).toMatch(/^.+:.+$/);\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageReference(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"pinImageTags\", () => {\n\tit(\"pins image tags from the registry for all services\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"postgresql\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\n\t\texpect(pinned.services).toHaveLength(resolved.services.length);\n\n\t\tfor (const svc of pinned.services) {\n\t\t\t// Git-based services (e.g., mission-control) don't have imageTag\n\t\t\tif (svc.definition.gitSource) continue;\n\t\t\texpect(svc.definition.imageTag).toBeDefined();\n\t\t\texpect(typeof svc.definition.imageTag).toBe(\"string\");\n\t\t\texpect(svc.definition.imageTag!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"does not mutate the original resolved output\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst redis = resolved.services.find((s) => s.definition.id === \"redis\");\n\t\tconst originalTag = redis?.definition.imageTag;\n\t\tpinImageTags(resolved);\n\n\t\tconst redisAfter = resolved.services.find((s) => s.definition.id === \"redis\");\n\t\texpect(redisAfter?.definition.imageTag).toBe(originalTag);\n\t});\n\n\tit(\"preserves non-tag properties\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\t\tconst redis = pinned.services.find((s) => s.definition.id === \"redis\");\n\t\texpect(redis).toBeDefined();\n\t\texpect(redis!.definition.name).toBe(\"Redis\");\n\t\texpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);\n\t});\n});\n\ndescribe(\"checkCompatibility\", () => {\n\tit(\"warns when Redis and Valkey are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst redis = all.find((s) => s.id === \"redis\");\n\t\tconst valkey = all.find((s) => s.id === \"valkey\");\n\n\t\tif (redis && valkey) {\n\t\t\tconst warnings = checkCompatibility([redis, valkey]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Redis\") && w.message.includes(\"Valkey\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns when Caddy and Traefik are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst caddy = all.find((s) => s.id === \"caddy\");\n\t\tconst traefik = all.find((s) => s.id === \"traefik\");\n\n\t\tif (caddy && traefik) {\n\t\t\tconst warnings = checkCompatibility([caddy, traefik]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Caddy\") && w.message.includes(\"Traefik\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about multiple vector databases\", () => {\n\t\tconst all = getAllServices();\n\t\tconst qdrant = all.find((s) => s.id === \"qdrant\");\n\t\tconst chromadb = all.find((s) => s.id === \"chromadb\");\n\n\t\tif (qdrant && chromadb) {\n\t\t\tconst warnings = checkCompatibility([qdrant, chromadb]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"vector database\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about GPU services\", () => {\n\t\tconst all = getAllServices();\n\t\tconst gpuService = all.find((s) => s.gpuRequired);\n\n\t\tif (gpuService) {\n\t\t\tconst warnings = checkCompatibility([gpuService]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"GPU\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"returns no warnings for a single non-conflicting service\", () => {\n\t\tconst redis = getServiceById(\"redis\");\n\t\tif (redis) {\n\t\t\tconst warnings = checkCompatibility([redis]);\n\t\t\texpect(\n\t\t\t\twarnings.filter((w) => w.type === \"compatibility\" && !w.message.includes(\"GPU\")),\n\t\t\t).toHaveLength(0);\n\t\t}\n\t});\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-DvC3SVNc.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "./test.CTcmp4Su-ClCHJ3FA.mjs";
2
2
  import { getAllServices, getServiceById } from "./services/registry.mjs";
3
3
  import { resolve } from "./resolver.mjs";
4
4
  import { checkCompatibility, getImageReference, getImageTag, pinImageTags } from "./version-manager.mjs";
@@ -36,6 +36,7 @@ describe("pinImageTags", () => {
36
36
  const pinned = pinImageTags(resolved);
37
37
  globalExpect(pinned.services).toHaveLength(resolved.services.length);
38
38
  for (const svc of pinned.services) {
39
+ if (svc.definition.gitSource) continue;
39
40
  globalExpect(svc.definition.imageTag).toBeDefined();
40
41
  globalExpect(typeof svc.definition.imageTag).toBe("string");
41
42
  globalExpect(svc.definition.imageTag.length).toBeGreaterThan(0);
@@ -49,9 +50,9 @@ describe("pinImageTags", () => {
49
50
  gpu: false,
50
51
  platform: "linux/amd64"
51
52
  });
52
- const originalTag = resolved.services[0]?.definition.imageTag;
53
+ const originalTag = resolved.services.find((s) => s.definition.id === "redis")?.definition.imageTag;
53
54
  pinImageTags(resolved);
54
- globalExpect(resolved.services[0]?.definition.imageTag).toBe(originalTag);
55
+ globalExpect(resolved.services.find((s) => s.definition.id === "redis")?.definition.imageTag).toBe(originalTag);
55
56
  });
56
57
  it("preserves non-tag properties", () => {
57
58
  const resolved = resolve({
@@ -62,8 +63,9 @@ describe("pinImageTags", () => {
62
63
  platform: "linux/amd64"
63
64
  });
64
65
  const pinned = pinImageTags(resolved);
65
- globalExpect(pinned.services[0]?.definition.id).toBe("redis");
66
- globalExpect(pinned.services[0]?.definition.name).toBe("Redis");
66
+ const redis = pinned.services.find((s) => s.definition.id === "redis");
67
+ globalExpect(redis).toBeDefined();
68
+ globalExpect(redis.definition.name).toBe("Redis");
67
69
  globalExpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);
68
70
  });
69
71
  });
@@ -1 +1 @@
1
- {"version":3,"file":"version-manager.test.mjs","names":[],"sources":["../src/version-manager.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"./resolver.js\";\nimport { getAllServices, getServiceById } from \"./services/registry.js\";\nimport {\n\tcheckCompatibility,\n\tgetImageReference,\n\tgetImageTag,\n\tpinImageTags,\n} from \"./version-manager.js\";\n\ndescribe(\"getImageTag\", () => {\n\tit(\"returns the tag for a known service\", () => {\n\t\tconst tag = getImageTag(\"redis\");\n\t\texpect(tag).toBeDefined();\n\t\texpect(typeof tag).toBe(\"string\");\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageTag(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"getImageReference\", () => {\n\tit(\"returns image:tag for a known service\", () => {\n\t\tconst ref = getImageReference(\"redis\");\n\t\texpect(ref).toBeDefined();\n\t\texpect(ref).toContain(\":\");\n\t\texpect(ref).toMatch(/^.+:.+$/);\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageReference(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"pinImageTags\", () => {\n\tit(\"pins image tags from the registry for all services\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"postgresql\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\n\t\texpect(pinned.services).toHaveLength(resolved.services.length);\n\n\t\tfor (const svc of pinned.services) {\n\t\t\texpect(svc.definition.imageTag).toBeDefined();\n\t\t\texpect(typeof svc.definition.imageTag).toBe(\"string\");\n\t\t\texpect(svc.definition.imageTag.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"does not mutate the original resolved output\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst originalTag = resolved.services[0]?.definition.imageTag;\n\t\tpinImageTags(resolved);\n\n\t\texpect(resolved.services[0]?.definition.imageTag).toBe(originalTag);\n\t});\n\n\tit(\"preserves non-tag properties\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\t\texpect(pinned.services[0]?.definition.id).toBe(\"redis\");\n\t\texpect(pinned.services[0]?.definition.name).toBe(\"Redis\");\n\t\texpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);\n\t});\n});\n\ndescribe(\"checkCompatibility\", () => {\n\tit(\"warns when Redis and Valkey are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst redis = all.find((s) => s.id === \"redis\");\n\t\tconst valkey = all.find((s) => s.id === \"valkey\");\n\n\t\tif (redis && valkey) {\n\t\t\tconst warnings = checkCompatibility([redis, valkey]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Redis\") && w.message.includes(\"Valkey\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns when Caddy and Traefik are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst caddy = all.find((s) => s.id === \"caddy\");\n\t\tconst traefik = all.find((s) => s.id === \"traefik\");\n\n\t\tif (caddy && traefik) {\n\t\t\tconst warnings = checkCompatibility([caddy, traefik]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Caddy\") && w.message.includes(\"Traefik\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about multiple vector databases\", () => {\n\t\tconst all = getAllServices();\n\t\tconst qdrant = all.find((s) => s.id === \"qdrant\");\n\t\tconst chromadb = all.find((s) => s.id === \"chromadb\");\n\n\t\tif (qdrant && chromadb) {\n\t\t\tconst warnings = checkCompatibility([qdrant, chromadb]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"vector database\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about GPU services\", () => {\n\t\tconst all = getAllServices();\n\t\tconst gpuService = all.find((s) => s.gpuRequired);\n\n\t\tif (gpuService) {\n\t\t\tconst warnings = checkCompatibility([gpuService]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"GPU\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"returns no warnings for a single non-conflicting service\", () => {\n\t\tconst redis = getServiceById(\"redis\");\n\t\tif (redis) {\n\t\t\tconst warnings = checkCompatibility([redis]);\n\t\t\texpect(\n\t\t\t\twarnings.filter((w) => w.type === \"compatibility\" && !w.message.includes(\"GPU\")),\n\t\t\t).toHaveLength(0);\n\t\t}\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"version-manager.test.mjs","names":[],"sources":["../src/version-manager.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"./resolver.js\";\nimport { getAllServices, getServiceById } from \"./services/registry.js\";\nimport {\n\tcheckCompatibility,\n\tgetImageReference,\n\tgetImageTag,\n\tpinImageTags,\n} from \"./version-manager.js\";\n\ndescribe(\"getImageTag\", () => {\n\tit(\"returns the tag for a known service\", () => {\n\t\tconst tag = getImageTag(\"redis\");\n\t\texpect(tag).toBeDefined();\n\t\texpect(typeof tag).toBe(\"string\");\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageTag(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"getImageReference\", () => {\n\tit(\"returns image:tag for a known service\", () => {\n\t\tconst ref = getImageReference(\"redis\");\n\t\texpect(ref).toBeDefined();\n\t\texpect(ref).toContain(\":\");\n\t\texpect(ref).toMatch(/^.+:.+$/);\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageReference(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"pinImageTags\", () => {\n\tit(\"pins image tags from the registry for all services\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"postgresql\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\n\t\texpect(pinned.services).toHaveLength(resolved.services.length);\n\n\t\tfor (const svc of pinned.services) {\n\t\t\t// Git-based services (e.g., mission-control) don't have imageTag\n\t\t\tif (svc.definition.gitSource) continue;\n\t\t\texpect(svc.definition.imageTag).toBeDefined();\n\t\t\texpect(typeof svc.definition.imageTag).toBe(\"string\");\n\t\t\texpect(svc.definition.imageTag!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"does not mutate the original resolved output\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst redis = resolved.services.find((s) => s.definition.id === \"redis\");\n\t\tconst originalTag = redis?.definition.imageTag;\n\t\tpinImageTags(resolved);\n\n\t\tconst redisAfter = resolved.services.find((s) => s.definition.id === \"redis\");\n\t\texpect(redisAfter?.definition.imageTag).toBe(originalTag);\n\t});\n\n\tit(\"preserves non-tag properties\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\t\tconst redis = pinned.services.find((s) => s.definition.id === \"redis\");\n\t\texpect(redis).toBeDefined();\n\t\texpect(redis!.definition.name).toBe(\"Redis\");\n\t\texpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);\n\t});\n});\n\ndescribe(\"checkCompatibility\", () => {\n\tit(\"warns when Redis and Valkey are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst redis = all.find((s) => s.id === \"redis\");\n\t\tconst valkey = all.find((s) => s.id === \"valkey\");\n\n\t\tif (redis && valkey) {\n\t\t\tconst warnings = checkCompatibility([redis, valkey]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Redis\") && w.message.includes(\"Valkey\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns when Caddy and Traefik are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst caddy = all.find((s) => s.id === \"caddy\");\n\t\tconst traefik = all.find((s) => s.id === \"traefik\");\n\n\t\tif (caddy && traefik) {\n\t\t\tconst warnings = checkCompatibility([caddy, traefik]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Caddy\") && w.message.includes(\"Traefik\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about multiple vector databases\", () => {\n\t\tconst all = getAllServices();\n\t\tconst qdrant = all.find((s) => s.id === \"qdrant\");\n\t\tconst chromadb = all.find((s) => s.id === \"chromadb\");\n\n\t\tif (qdrant && chromadb) {\n\t\t\tconst warnings = checkCompatibility([qdrant, chromadb]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"vector database\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about GPU services\", () => {\n\t\tconst all = getAllServices();\n\t\tconst gpuService = all.find((s) => s.gpuRequired);\n\n\t\tif (gpuService) {\n\t\t\tconst warnings = checkCompatibility([gpuService]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"GPU\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"returns no warnings for a single non-conflicting service\", () => {\n\t\tconst redis = getServiceById(\"redis\");\n\t\tif (redis) {\n\t\t\tconst warnings = checkCompatibility([redis]);\n\t\t\texpect(\n\t\t\t\twarnings.filter((w) => w.type === \"compatibility\" && !w.message.includes(\"GPU\")),\n\t\t\t).toHaveLength(0);\n\t\t}\n\t});\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-openclaw/core",
3
- "version": "1.0.23",
3
+ "version": "1.0.25",
4
4
  "private": false,
5
5
  "description": "Core logic for better-openclaw: schemas, service registry, resolver, composer, validators and generators",
6
6
  "author": "bidew.io <bachir@bidew.io>",
@@ -48,9 +48,9 @@
48
48
  "zod": "^4.3.6"
49
49
  },
50
50
  "devDependencies": {
51
- "@biomejs/biome": "^2.4.4",
52
- "@types/node": "^25.3.3",
53
- "tsdown": "^0.21.0",
51
+ "@biomejs/biome": "^2.4.6",
52
+ "@types/node": "^25.3.5",
53
+ "tsdown": "^0.21.1",
54
54
  "typescript": "^5.9.3",
55
55
  "vitest": "^4.0.18"
56
56
  },