@openpalm/ui 0.12.18 → 0.12.22

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 (381) hide show
  1. package/build/.openpalm-ui-version +1 -1
  2. package/build/client/_app/immutable/assets/4.DQdAwaDZ.css +1 -0
  3. package/build/client/_app/immutable/assets/4.DQdAwaDZ.css.br +0 -0
  4. package/build/client/_app/immutable/assets/4.DQdAwaDZ.css.gz +0 -0
  5. package/build/client/_app/immutable/chunks/{B8C5qi9U.js → BRX6kifW.js} +1 -1
  6. package/build/client/_app/immutable/chunks/BRX6kifW.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/BRX6kifW.js.gz +0 -0
  8. package/build/client/_app/immutable/chunks/{Br6Mrpf0.js → BXNfEZOa.js} +2 -2
  9. package/build/client/_app/immutable/chunks/BXNfEZOa.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/BXNfEZOa.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/{Dcw6L0GF.js → CgDyA2Qw.js} +2 -2
  12. package/build/client/_app/immutable/chunks/CgDyA2Qw.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/CgDyA2Qw.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/DLcBqErP.js +1 -0
  15. package/build/client/_app/immutable/chunks/DLcBqErP.js.br +2 -0
  16. package/build/client/_app/immutable/chunks/DLcBqErP.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{CLgRRUN_.js → DpHEXvQk.js} +1 -1
  18. package/build/client/_app/immutable/chunks/DpHEXvQk.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/DpHEXvQk.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/Dr8nRIOR.js +1 -0
  21. package/build/client/_app/immutable/chunks/Dr8nRIOR.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/Dr8nRIOR.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/{DYXGFYr6.js → _60-pFCk.js} +1 -1
  24. package/build/client/_app/immutable/chunks/_60-pFCk.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/_60-pFCk.js.gz +0 -0
  26. package/build/client/_app/immutable/entry/{app.CVxCoIFs.js → app.BjL1fvKO.js} +2 -2
  27. package/build/client/_app/immutable/entry/app.BjL1fvKO.js.br +0 -0
  28. package/build/client/_app/immutable/entry/app.BjL1fvKO.js.gz +0 -0
  29. package/build/client/_app/immutable/entry/start.De0IKYiu.js +1 -0
  30. package/build/client/_app/immutable/entry/start.De0IKYiu.js.br +0 -0
  31. package/build/client/_app/immutable/entry/start.De0IKYiu.js.gz +0 -0
  32. package/build/client/_app/immutable/nodes/{0.Bb8qAGW8.js → 0.AZnG4POF.js} +1 -1
  33. package/build/client/_app/immutable/nodes/0.AZnG4POF.js.br +0 -0
  34. package/build/client/_app/immutable/nodes/0.AZnG4POF.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/{1.Co_TaqLI.js → 1.B7a7Tm6Z.js} +1 -1
  36. package/build/client/_app/immutable/nodes/1.B7a7Tm6Z.js.br +0 -0
  37. package/build/client/_app/immutable/nodes/1.B7a7Tm6Z.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/4.DI__DjJl.js +126 -0
  39. package/build/client/_app/immutable/nodes/4.DI__DjJl.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/4.DI__DjJl.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/{5.Fw13EXte.js → 5.B9AKDWT5.js} +2 -2
  42. package/build/client/_app/immutable/nodes/5.B9AKDWT5.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/5.B9AKDWT5.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/{6.CWy0yXnu.js → 6.hyWOgJjN.js} +1 -1
  45. package/build/client/_app/immutable/nodes/6.hyWOgJjN.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/6.hyWOgJjN.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/{7.CsM4M8Ul.js → 7.nZLq6rhJ.js} +1 -1
  48. package/build/client/_app/immutable/nodes/7.nZLq6rhJ.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/7.nZLq6rhJ.js.gz +0 -0
  50. package/build/client/_app/immutable/nodes/{8.V6hY0p8a.js → 8.DHYGH125.js} +1 -1
  51. package/build/client/_app/immutable/nodes/8.DHYGH125.js.br +0 -0
  52. package/build/client/_app/immutable/nodes/8.DHYGH125.js.gz +0 -0
  53. package/build/client/_app/version.json +1 -1
  54. package/build/client/_app/version.json.br +1 -1
  55. package/build/client/_app/version.json.gz +0 -0
  56. package/build/server/chunks/{0-DrD9dfbN.js → 0-DL6Jfu7F.js} +3 -3
  57. package/build/server/chunks/{0-DrD9dfbN.js.map → 0-DL6Jfu7F.js.map} +1 -1
  58. package/build/server/chunks/1-DC1YDW9y.js +9 -0
  59. package/build/server/chunks/{1-DvZDBGww.js.map → 1-DC1YDW9y.js.map} +1 -1
  60. package/build/server/chunks/{10-C96Thueb.js → 10-BnN-v5b4.js} +5 -5
  61. package/build/server/chunks/10-BnN-v5b4.js.map +1 -0
  62. package/build/server/chunks/4-BnTXsRc6.js +9 -0
  63. package/build/server/chunks/{4-BYdi8hv_.js.map → 4-BnTXsRc6.js.map} +1 -1
  64. package/build/server/chunks/{5-DIQyHPcz.js → 5-C26TlGBo.js} +3 -3
  65. package/build/server/chunks/{5-DIQyHPcz.js.map → 5-C26TlGBo.js.map} +1 -1
  66. package/build/server/chunks/6-D1YRT-u9.js +9 -0
  67. package/build/server/chunks/{6-BsZngRIA.js.map → 6-D1YRT-u9.js.map} +1 -1
  68. package/build/server/chunks/{7-CXWUMHvV.js → 7-DB2WCCTk.js} +3 -3
  69. package/build/server/chunks/{7-CXWUMHvV.js.map → 7-DB2WCCTk.js.map} +1 -1
  70. package/build/server/chunks/{8-l173yBhm.js → 8-D9q3TEwk.js} +3 -3
  71. package/build/server/chunks/{8-l173yBhm.js.map → 8-D9q3TEwk.js.map} +1 -1
  72. package/build/server/chunks/{IconMic-BM_3hm2T.js → IconMic-DK0ZRKNm.js} +2 -2
  73. package/build/server/chunks/{IconMic-BM_3hm2T.js.map → IconMic-DK0ZRKNm.js.map} +1 -1
  74. package/build/server/chunks/{Navbar-BZ_eb99a.js → Navbar-Bx84i9hX.js} +5 -5
  75. package/build/server/chunks/{Navbar-BZ_eb99a.js.map → Navbar-Bx84i9hX.js.map} +1 -1
  76. package/build/server/chunks/{_layout.svelte-Dd-1jqRZ.js → _layout.svelte-CtPb7AoM.js} +2 -2
  77. package/build/server/chunks/{_layout.svelte-Dd-1jqRZ.js.map → _layout.svelte-CtPb7AoM.js.map} +1 -1
  78. package/build/server/chunks/{_page.svelte-E9h2ASFv.js → _page.svelte-1gYVQfSX.js} +7 -7
  79. package/build/server/chunks/{_page.svelte-E9h2ASFv.js.map → _page.svelte-1gYVQfSX.js.map} +1 -1
  80. package/build/server/chunks/{_page.svelte-Bbooaanj.js → _page.svelte-Ce5yuZKH.js} +7 -7
  81. package/build/server/chunks/{_page.svelte-Bbooaanj.js.map → _page.svelte-Ce5yuZKH.js.map} +1 -1
  82. package/build/server/chunks/{_page.svelte-D0wEoV5A.js → _page.svelte-DhqtAyz4.js} +5 -5
  83. package/build/server/chunks/{_page.svelte-D0wEoV5A.js.map → _page.svelte-DhqtAyz4.js.map} +1 -1
  84. package/build/server/chunks/{_page.svelte-C4jw4RUN.js → _page.svelte-Dlch5rzj.js} +3 -3
  85. package/build/server/chunks/{_page.svelte-C4jw4RUN.js.map → _page.svelte-Dlch5rzj.js.map} +1 -1
  86. package/build/server/chunks/{_page.svelte-WYgjKj38.js → _page.svelte-VwZb1o-L.js} +31 -715
  87. package/build/server/chunks/_page.svelte-VwZb1o-L.js.map +1 -0
  88. package/build/server/chunks/{_server.ts-DPDQh75Z.js → _server.ts-29oJfZHd.js} +2 -2
  89. package/build/server/chunks/{_server.ts-DPDQh75Z.js.map → _server.ts-29oJfZHd.js.map} +1 -1
  90. package/build/server/chunks/{_server.ts-VvJjpVtp.js → _server.ts-54pdKqwY.js} +6 -6
  91. package/build/server/chunks/{_server.ts-VvJjpVtp.js.map → _server.ts-54pdKqwY.js.map} +1 -1
  92. package/build/server/chunks/{_server.ts-CQt3NLuS.js → _server.ts-8R-n-zEh.js} +5 -5
  93. package/build/server/chunks/{_server.ts-CQt3NLuS.js.map → _server.ts-8R-n-zEh.js.map} +1 -1
  94. package/build/server/chunks/_server.ts-8b481A1c.js +89 -0
  95. package/build/server/chunks/_server.ts-8b481A1c.js.map +1 -0
  96. package/build/server/chunks/{_server.ts-wvbMWir6.js → _server.ts-9AjUEqAT.js} +6 -6
  97. package/build/server/chunks/{_server.ts-wvbMWir6.js.map → _server.ts-9AjUEqAT.js.map} +1 -1
  98. package/build/server/chunks/{_server.ts-F0nw0UvB.js → _server.ts-9qPwtSPc.js} +5 -5
  99. package/build/server/chunks/{_server.ts-F0nw0UvB.js.map → _server.ts-9qPwtSPc.js.map} +1 -1
  100. package/build/server/chunks/{_server.ts-DM6Jm6KP.js → _server.ts-B1qG26BE.js} +5 -5
  101. package/build/server/chunks/_server.ts-B1qG26BE.js.map +1 -0
  102. package/build/server/chunks/{_server.ts-CwPiZPmZ.js → _server.ts-B5JZoMbG.js} +6 -6
  103. package/build/server/chunks/{_server.ts-CwPiZPmZ.js.map → _server.ts-B5JZoMbG.js.map} +1 -1
  104. package/build/server/chunks/{_server.ts-CQM2RG5K.js → _server.ts-B8xyYAeq.js} +5 -5
  105. package/build/server/chunks/{_server.ts-CQM2RG5K.js.map → _server.ts-B8xyYAeq.js.map} +1 -1
  106. package/build/server/chunks/{_server.ts-CFNWzRBr.js → _server.ts-B9CQbSjg.js} +4 -4
  107. package/build/server/chunks/{_server.ts-CFNWzRBr.js.map → _server.ts-B9CQbSjg.js.map} +1 -1
  108. package/build/server/chunks/{_server.ts-D4tyRvFi.js → _server.ts-B9ykDkc2.js} +2 -2
  109. package/build/server/chunks/{_server.ts-D4tyRvFi.js.map → _server.ts-B9ykDkc2.js.map} +1 -1
  110. package/build/server/chunks/{_server.ts-DR7y5OQ3.js → _server.ts-BPdeRlDI.js} +5 -5
  111. package/build/server/chunks/{_server.ts-DR7y5OQ3.js.map → _server.ts-BPdeRlDI.js.map} +1 -1
  112. package/build/server/chunks/{_server.ts-B9iU6foL.js → _server.ts-B_0VQmyi.js} +5 -5
  113. package/build/server/chunks/{_server.ts-B9iU6foL.js.map → _server.ts-B_0VQmyi.js.map} +1 -1
  114. package/build/server/chunks/{_server.ts-DRvqTDLx.js → _server.ts-B__xH1cU.js} +5 -5
  115. package/build/server/chunks/_server.ts-B__xH1cU.js.map +1 -0
  116. package/build/server/chunks/{_server.ts-DiDI1Ie6.js → _server.ts-Bc4VE_mK.js} +6 -6
  117. package/build/server/chunks/{_server.ts-DiDI1Ie6.js.map → _server.ts-Bc4VE_mK.js.map} +1 -1
  118. package/build/server/chunks/{_server.ts-IW-zQmmb.js → _server.ts-BdDIXPU0.js} +5 -5
  119. package/build/server/chunks/_server.ts-BdDIXPU0.js.map +1 -0
  120. package/build/server/chunks/{_server.ts-CGMuaSY3.js → _server.ts-BeSu9n9F.js} +5 -5
  121. package/build/server/chunks/{_server.ts-CGMuaSY3.js.map → _server.ts-BeSu9n9F.js.map} +1 -1
  122. package/build/server/chunks/{_server.ts-D-jGSj8O.js → _server.ts-BjAWFnFv.js} +6 -6
  123. package/build/server/chunks/{_server.ts-D-jGSj8O.js.map → _server.ts-BjAWFnFv.js.map} +1 -1
  124. package/build/server/chunks/{_server.ts-2fxcxBzC.js → _server.ts-Bk-SzSGo.js} +5 -5
  125. package/build/server/chunks/_server.ts-Bk-SzSGo.js.map +1 -0
  126. package/build/server/chunks/{_server.ts-BnL3TLuz.js → _server.ts-BswBNUz0.js} +5 -5
  127. package/build/server/chunks/{_server.ts-BnL3TLuz.js.map → _server.ts-BswBNUz0.js.map} +1 -1
  128. package/build/server/chunks/{_server.ts-DUy4kkr_.js → _server.ts-BtlnrMKD.js} +5 -5
  129. package/build/server/chunks/{_server.ts-DUy4kkr_.js.map → _server.ts-BtlnrMKD.js.map} +1 -1
  130. package/build/server/chunks/{_server.ts-BDe-TnAi.js → _server.ts-BxRGCjoH.js} +5 -5
  131. package/build/server/chunks/{_server.ts-BDe-TnAi.js.map → _server.ts-BxRGCjoH.js.map} +1 -1
  132. package/build/server/chunks/{_server.ts-DDCEmU_P.js → _server.ts-By1az2OR.js} +6 -10
  133. package/build/server/chunks/_server.ts-By1az2OR.js.map +1 -0
  134. package/build/server/chunks/{_server.ts-Dcawi9b4.js → _server.ts-C0ch963P.js} +2 -2
  135. package/build/server/chunks/_server.ts-C0ch963P.js.map +1 -0
  136. package/build/server/chunks/{_server.ts-DP28Ocqs.js → _server.ts-C2NuRv8K.js} +5 -5
  137. package/build/server/chunks/{_server.ts-DP28Ocqs.js.map → _server.ts-C2NuRv8K.js.map} +1 -1
  138. package/build/server/chunks/{_server.ts-DXoq1VzO.js → _server.ts-C4I0eH50.js} +5 -5
  139. package/build/server/chunks/_server.ts-C4I0eH50.js.map +1 -0
  140. package/build/server/chunks/{_server.ts-D07mQlNk.js → _server.ts-C6geMqYp.js} +5 -5
  141. package/build/server/chunks/{_server.ts-D07mQlNk.js.map → _server.ts-C6geMqYp.js.map} +1 -1
  142. package/build/server/chunks/{_server.ts-YRWN3sJm.js → _server.ts-C9QeDhXf.js} +5 -5
  143. package/build/server/chunks/{_server.ts-YRWN3sJm.js.map → _server.ts-C9QeDhXf.js.map} +1 -1
  144. package/build/server/chunks/{_server.ts-DzCUdAPH.js → _server.ts-C9cnB4KZ.js} +5 -5
  145. package/build/server/chunks/{_server.ts-DzCUdAPH.js.map → _server.ts-C9cnB4KZ.js.map} +1 -1
  146. package/build/server/chunks/{_server.ts-CzgA6LXe.js → _server.ts-CAwWO268.js} +5 -5
  147. package/build/server/chunks/{_server.ts-CzgA6LXe.js.map → _server.ts-CAwWO268.js.map} +1 -1
  148. package/build/server/chunks/{_server.ts-DdzFOqZm.js → _server.ts-CBIx55nw.js} +5 -5
  149. package/build/server/chunks/{_server.ts-DdzFOqZm.js.map → _server.ts-CBIx55nw.js.map} +1 -1
  150. package/build/server/chunks/{_server.ts-C37SDJxC.js → _server.ts-CDHXmvId.js} +5 -5
  151. package/build/server/chunks/{_server.ts-C37SDJxC.js.map → _server.ts-CDHXmvId.js.map} +1 -1
  152. package/build/server/chunks/{_server.ts-hAoIbHpc.js → _server.ts-CHGTPklX.js} +6 -6
  153. package/build/server/chunks/{_server.ts-hAoIbHpc.js.map → _server.ts-CHGTPklX.js.map} +1 -1
  154. package/build/server/chunks/{_server.ts-BETcFeB8.js → _server.ts-CKblTbUe.js} +5 -5
  155. package/build/server/chunks/_server.ts-CKblTbUe.js.map +1 -0
  156. package/build/server/chunks/{_server.ts-C_dk6ZLP.js → _server.ts-CN-ITxq_.js} +6 -6
  157. package/build/server/chunks/{_server.ts-C_dk6ZLP.js.map → _server.ts-CN-ITxq_.js.map} +1 -1
  158. package/build/server/chunks/{_server.ts-BMCfB7xN.js → _server.ts-CNy4jIvv.js} +5 -5
  159. package/build/server/chunks/{_server.ts-BMCfB7xN.js.map → _server.ts-CNy4jIvv.js.map} +1 -1
  160. package/build/server/chunks/{_server.ts-CuBCKbP8.js → _server.ts-CQgWS2hB.js} +6 -6
  161. package/build/server/chunks/{_server.ts-CuBCKbP8.js.map → _server.ts-CQgWS2hB.js.map} +1 -1
  162. package/build/server/chunks/{_server.ts-Cap2Myq0.js → _server.ts-CRSZ1H_z.js} +9 -6
  163. package/build/server/chunks/_server.ts-CRSZ1H_z.js.map +1 -0
  164. package/build/server/chunks/{_server.ts-_qXm__Gf.js → _server.ts-CYCJvxkC.js} +5 -5
  165. package/build/server/chunks/{_server.ts-_qXm__Gf.js.map → _server.ts-CYCJvxkC.js.map} +1 -1
  166. package/build/server/chunks/{_server.ts-DilgsSMu.js → _server.ts-CcyDtTCy.js} +5 -5
  167. package/build/server/chunks/{_server.ts-DilgsSMu.js.map → _server.ts-CcyDtTCy.js.map} +1 -1
  168. package/build/server/chunks/{_server.ts-kfc0Us0E.js → _server.ts-CdHxUlD_.js} +5 -5
  169. package/build/server/chunks/{_server.ts-kfc0Us0E.js.map → _server.ts-CdHxUlD_.js.map} +1 -1
  170. package/build/server/chunks/{_server.ts-5M6DY-PN.js → _server.ts-CeGOgSlg.js} +8 -8
  171. package/build/server/chunks/{_server.ts-5M6DY-PN.js.map → _server.ts-CeGOgSlg.js.map} +1 -1
  172. package/build/server/chunks/{_server.ts-DMj9WYdv.js → _server.ts-CejBAnbx.js} +2 -2
  173. package/build/server/chunks/{_server.ts-DMj9WYdv.js.map → _server.ts-CejBAnbx.js.map} +1 -1
  174. package/build/server/chunks/{_server.ts-BwnoppTC.js → _server.ts-ChJzwk4k.js} +6 -6
  175. package/build/server/chunks/{_server.ts-BwnoppTC.js.map → _server.ts-ChJzwk4k.js.map} +1 -1
  176. package/build/server/chunks/{_server.ts-0UwoVmus.js → _server.ts-CibQYGvX.js} +6 -6
  177. package/build/server/chunks/{_server.ts-0UwoVmus.js.map → _server.ts-CibQYGvX.js.map} +1 -1
  178. package/build/server/chunks/{_server.ts-B6AN-mYa.js → _server.ts-CloVt7eS.js} +7 -7
  179. package/build/server/chunks/{_server.ts-B6AN-mYa.js.map → _server.ts-CloVt7eS.js.map} +1 -1
  180. package/build/server/chunks/{_server.ts-B5PHfuR5.js → _server.ts-CmjNZw87.js} +6 -6
  181. package/build/server/chunks/{_server.ts-B5PHfuR5.js.map → _server.ts-CmjNZw87.js.map} +1 -1
  182. package/build/server/chunks/{_server.ts-B8D1t67g.js → _server.ts-Cn7LfLF_.js} +7 -7
  183. package/build/server/chunks/_server.ts-Cn7LfLF_.js.map +1 -0
  184. package/build/server/chunks/{_server.ts-aw8KYE5U.js → _server.ts-Crdovz8j.js} +5 -5
  185. package/build/server/chunks/{_server.ts-aw8KYE5U.js.map → _server.ts-Crdovz8j.js.map} +1 -1
  186. package/build/server/chunks/{_server.ts-lK-oXISB.js → _server.ts-CuYIpIzp.js} +5 -5
  187. package/build/server/chunks/{_server.ts-lK-oXISB.js.map → _server.ts-CuYIpIzp.js.map} +1 -1
  188. package/build/server/chunks/{_server.ts-CRVqyjYH.js → _server.ts-CwgY6ghJ.js} +7 -7
  189. package/build/server/chunks/{_server.ts-CRVqyjYH.js.map → _server.ts-CwgY6ghJ.js.map} +1 -1
  190. package/build/server/chunks/{_server.ts-C7Scn_Ur.js → _server.ts-CxxrQ9Wz.js} +5 -5
  191. package/build/server/chunks/_server.ts-CxxrQ9Wz.js.map +1 -0
  192. package/build/server/chunks/{_server.ts-C9-ewPaY.js → _server.ts-D6BJWhEf.js} +5 -5
  193. package/build/server/chunks/_server.ts-D6BJWhEf.js.map +1 -0
  194. package/build/server/chunks/{_server.ts-CosKSZGO.js → _server.ts-D6Y4c9rj.js} +2 -2
  195. package/build/server/chunks/{_server.ts-CosKSZGO.js.map → _server.ts-D6Y4c9rj.js.map} +1 -1
  196. package/build/server/chunks/{_server.ts-CU5_9yaM.js → _server.ts-D8EweJQC.js} +5 -5
  197. package/build/server/chunks/{_server.ts-CU5_9yaM.js.map → _server.ts-D8EweJQC.js.map} +1 -1
  198. package/build/server/chunks/{_server.ts-Dq8RxTkW.js → _server.ts-D91I-wzU.js} +5 -5
  199. package/build/server/chunks/{_server.ts-Dq8RxTkW.js.map → _server.ts-D91I-wzU.js.map} +1 -1
  200. package/build/server/chunks/{_server.ts-CcyVh5fg.js → _server.ts-D9yPVLtB.js} +5 -5
  201. package/build/server/chunks/{_server.ts-CcyVh5fg.js.map → _server.ts-D9yPVLtB.js.map} +1 -1
  202. package/build/server/chunks/{_server.ts-avgx1pPX.js → _server.ts-DC0rWv53.js} +5 -5
  203. package/build/server/chunks/{_server.ts-avgx1pPX.js.map → _server.ts-DC0rWv53.js.map} +1 -1
  204. package/build/server/chunks/{_server.ts-Bi5ToBtl.js → _server.ts-DGHL7uho.js} +5 -5
  205. package/build/server/chunks/{_server.ts-Bi5ToBtl.js.map → _server.ts-DGHL7uho.js.map} +1 -1
  206. package/build/server/chunks/{_server.ts-Baeek88H.js → _server.ts-DHBjlBuv.js} +5 -5
  207. package/build/server/chunks/_server.ts-DHBjlBuv.js.map +1 -0
  208. package/build/server/chunks/{_server.ts-FPubTa2q.js → _server.ts-DIUdkrLE.js} +5 -5
  209. package/build/server/chunks/{_server.ts-FPubTa2q.js.map → _server.ts-DIUdkrLE.js.map} +1 -1
  210. package/build/server/chunks/{_server.ts-5aqdy9Zn.js → _server.ts-DNag2rCU.js} +25 -17
  211. package/build/server/chunks/_server.ts-DNag2rCU.js.map +1 -0
  212. package/build/server/chunks/{_server.ts-DBQ7TD4o.js → _server.ts-DWXKoPC3.js} +5 -5
  213. package/build/server/chunks/_server.ts-DWXKoPC3.js.map +1 -0
  214. package/build/server/chunks/{_server.ts-DSfVK8xc.js → _server.ts-D_Zne8zk.js} +5 -5
  215. package/build/server/chunks/{_server.ts-DSfVK8xc.js.map → _server.ts-D_Zne8zk.js.map} +1 -1
  216. package/build/server/chunks/{_server.ts-Brb7lRFE.js → _server.ts-DarGs6EN.js} +5 -5
  217. package/build/server/chunks/_server.ts-DarGs6EN.js.map +1 -0
  218. package/build/server/chunks/{_server.ts-Cb-e8WyG.js → _server.ts-DdjZAsqc.js} +5 -5
  219. package/build/server/chunks/{_server.ts-Cb-e8WyG.js.map → _server.ts-DdjZAsqc.js.map} +1 -1
  220. package/build/server/chunks/_server.ts-DhgUx_Ar.js +84 -0
  221. package/build/server/chunks/_server.ts-DhgUx_Ar.js.map +1 -0
  222. package/build/server/chunks/{_server.ts-CmyqMhn9.js → _server.ts-Ds26GwEH.js} +5 -5
  223. package/build/server/chunks/{_server.ts-CmyqMhn9.js.map → _server.ts-Ds26GwEH.js.map} +1 -1
  224. package/build/server/chunks/{_server.ts-Bxk1V3Ev.js → _server.ts-Dx-W9dxd.js} +5 -5
  225. package/build/server/chunks/{_server.ts-Bxk1V3Ev.js.map → _server.ts-Dx-W9dxd.js.map} +1 -1
  226. package/build/server/chunks/{_server.ts-BnNG0uRK.js → _server.ts-DyAZoRvd.js} +6 -6
  227. package/build/server/chunks/{_server.ts-BnNG0uRK.js.map → _server.ts-DyAZoRvd.js.map} +1 -1
  228. package/build/server/chunks/{_server.ts-WePF2DAq.js → _server.ts-EYK0bXvj.js} +5 -5
  229. package/build/server/chunks/_server.ts-EYK0bXvj.js.map +1 -0
  230. package/build/server/chunks/{_server.ts-DFV-gf9Q.js → _server.ts-GB9Cj5oM.js} +5 -5
  231. package/build/server/chunks/{_server.ts-DFV-gf9Q.js.map → _server.ts-GB9Cj5oM.js.map} +1 -1
  232. package/build/server/chunks/{_server.ts-DYsP_lpr.js → _server.ts-KhshtfY7.js} +7 -7
  233. package/build/server/chunks/_server.ts-KhshtfY7.js.map +1 -0
  234. package/build/server/chunks/{_server.ts-ChH8nHr7.js → _server.ts-W0CmGtTj.js} +7 -7
  235. package/build/server/chunks/{_server.ts-ChH8nHr7.js.map → _server.ts-W0CmGtTj.js.map} +1 -1
  236. package/build/server/chunks/{_server.ts-C5jyYbFm.js → _server.ts-X_5reIBA.js} +17 -8
  237. package/build/server/chunks/_server.ts-X_5reIBA.js.map +1 -0
  238. package/build/server/chunks/{_server.ts-r07PDC8q.js → _server.ts-YHTGVduj.js} +5 -5
  239. package/build/server/chunks/{_server.ts-r07PDC8q.js.map → _server.ts-YHTGVduj.js.map} +1 -1
  240. package/build/server/chunks/{_server.ts-BRTk2wfW.js → _server.ts-c9nn_lEh.js} +5 -5
  241. package/build/server/chunks/{_server.ts-BRTk2wfW.js.map → _server.ts-c9nn_lEh.js.map} +1 -1
  242. package/build/server/chunks/{_server.ts-BW46dP9B.js → _server.ts-cNcqERWY.js} +7 -7
  243. package/build/server/chunks/{_server.ts-BW46dP9B.js.map → _server.ts-cNcqERWY.js.map} +1 -1
  244. package/build/server/chunks/{_server.ts-BlVBulWB.js → _server.ts-e-kt0L13.js} +4 -4
  245. package/build/server/chunks/_server.ts-e-kt0L13.js.map +1 -0
  246. package/build/server/chunks/{_server.ts-DX3B53H8.js → _server.ts-fV4HpgOz.js} +5 -5
  247. package/build/server/chunks/{_server.ts-DX3B53H8.js.map → _server.ts-fV4HpgOz.js.map} +1 -1
  248. package/build/server/chunks/{_server.ts-Dg4ouUjZ.js → _server.ts-hqvYcJBt.js} +5 -5
  249. package/build/server/chunks/_server.ts-hqvYcJBt.js.map +1 -0
  250. package/build/server/chunks/{_server.ts-CM1BFa2O.js → _server.ts-iCDhsOOY.js} +6 -6
  251. package/build/server/chunks/_server.ts-iCDhsOOY.js.map +1 -0
  252. package/build/server/chunks/{_server.ts-Bx3uIrpl.js → _server.ts-jyQMP3IC.js} +5 -5
  253. package/build/server/chunks/{_server.ts-Bx3uIrpl.js.map → _server.ts-jyQMP3IC.js.map} +1 -1
  254. package/build/server/chunks/{_server.ts-Decw7JxO.js → _server.ts-sY8nzvys.js} +5 -5
  255. package/build/server/chunks/_server.ts-sY8nzvys.js.map +1 -0
  256. package/build/server/chunks/{addon-helpers-ChYTbRSK.js → addon-helpers-DmjAK3BO.js} +3 -3
  257. package/build/server/chunks/addon-helpers-DmjAK3BO.js.map +1 -0
  258. package/build/server/chunks/{akm-BLz9zl09.js → akm-B44WQaeD.js} +2 -2
  259. package/build/server/chunks/{akm-BLz9zl09.js.map → akm-B44WQaeD.js.map} +1 -1
  260. package/build/server/chunks/{catalog-CY6FvvAs.js → catalog-C8yZ2uH2.js} +5 -5
  261. package/build/server/chunks/{catalog-CY6FvvAs.js.map → catalog-C8yZ2uH2.js.map} +1 -1
  262. package/build/server/chunks/{client-FcHtkEV-.js → client-Dv5ruwWL.js} +2 -2
  263. package/build/server/chunks/{client-FcHtkEV-.js.map → client-Dv5ruwWL.js.map} +1 -1
  264. package/build/server/chunks/{config-WS3yDsjb.js → config-BXCHMmv_.js} +2 -2
  265. package/build/server/chunks/{config-WS3yDsjb.js.map → config-BXCHMmv_.js.map} +1 -1
  266. package/build/server/chunks/{docker-CDcBV4aX.js → docker-qBTgU_Qa.js} +2 -2
  267. package/build/server/chunks/{docker-CDcBV4aX.js.map → docker-qBTgU_Qa.js.map} +1 -1
  268. package/build/server/chunks/{endpoints-BnI8UQUm.js → endpoints-BJw6odky.js} +2 -2
  269. package/build/server/chunks/{endpoints-BnI8UQUm.js.map → endpoints-BJw6odky.js.map} +1 -1
  270. package/build/server/chunks/{error.svelte-DeB-Po5T.js → error.svelte-Bk8x64a4.js} +4 -4
  271. package/build/server/chunks/{error.svelte-DeB-Po5T.js.map → error.svelte-Bk8x64a4.js.map} +1 -1
  272. package/build/server/chunks/{helpers-uzTc9A0Q.js → helpers-DB3Oat0M.js} +3 -3
  273. package/build/server/chunks/{helpers-uzTc9A0Q.js.map → helpers-DB3Oat0M.js.map} +1 -1
  274. package/build/server/chunks/{hooks.server-DaC85A-N.js → hooks.server-DoW_3zHD.js} +7 -7
  275. package/build/server/chunks/hooks.server-DoW_3zHD.js.map +1 -0
  276. package/build/server/chunks/{http-DWCniA5n.js → http-C4WWfxK-.js} +2 -2
  277. package/build/server/chunks/{http-DWCniA5n.js.map → http-C4WWfxK-.js.map} +1 -1
  278. package/build/server/chunks/{internal-DRthfYRK.js → internal-Bkw-piFD.js} +3 -3
  279. package/build/server/chunks/{internal-DRthfYRK.js.map → internal-Bkw-piFD.js.map} +1 -1
  280. package/build/server/chunks/{migration-status-Blvg_RFt.js → migration-status-C-gFVWrV.js} +2 -2
  281. package/build/server/chunks/{migration-status-Blvg_RFt.js.map → migration-status-C-gFVWrV.js.map} +1 -1
  282. package/build/server/chunks/{session-cookie-DOONPnJ5.js → session-cookie-DYlRFqU6.js} +2 -2
  283. package/build/server/chunks/{session-cookie-DOONPnJ5.js.map → session-cookie-DYlRFqU6.js.map} +1 -1
  284. package/build/server/chunks/{setup-deploy-CeeF_6ze.js → setup-deploy-D3XucKIu.js} +2 -2
  285. package/build/server/chunks/{setup-deploy-CeeF_6ze.js.map → setup-deploy-D3XucKIu.js.map} +1 -1
  286. package/build/server/chunks/{src-B3g4Ry1X.js → src-DPd0Zos1.js} +198 -639
  287. package/build/server/chunks/src-DPd0Zos1.js.map +1 -0
  288. package/build/server/chunks/{state-CL9Kv-vm.js → state-CmEW57i2.js} +2 -2
  289. package/build/server/chunks/{state-CL9Kv-vm.js.map → state-CmEW57i2.js.map} +1 -1
  290. package/build/server/chunks/{state2-Cim9_nHe.js → state2-zSoANrav.js} +2 -2
  291. package/build/server/chunks/{state2-Cim9_nHe.js.map → state2-zSoANrav.js.map} +1 -1
  292. package/build/server/chunks/{theme-state.svelte-BgBXJ060.js → theme-state.svelte-DshW_ZYI.js} +2 -81
  293. package/build/server/chunks/theme-state.svelte-DshW_ZYI.js.map +1 -0
  294. package/build/server/index.js +32 -2
  295. package/build/server/index.js.map +1 -1
  296. package/build/server/manifest.js +93 -107
  297. package/build/server/manifest.js.map +1 -1
  298. package/package.json +2 -2
  299. package/build/client/_app/immutable/assets/4.BLk6Mqyj.css +0 -1
  300. package/build/client/_app/immutable/assets/4.BLk6Mqyj.css.br +0 -0
  301. package/build/client/_app/immutable/assets/4.BLk6Mqyj.css.gz +0 -0
  302. package/build/client/_app/immutable/chunks/B8C5qi9U.js.br +0 -0
  303. package/build/client/_app/immutable/chunks/B8C5qi9U.js.gz +0 -0
  304. package/build/client/_app/immutable/chunks/Br6Mrpf0.js.br +0 -0
  305. package/build/client/_app/immutable/chunks/Br6Mrpf0.js.gz +0 -0
  306. package/build/client/_app/immutable/chunks/CLgRRUN_.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/CLgRRUN_.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/Ch85wCT5.js +0 -1
  309. package/build/client/_app/immutable/chunks/Ch85wCT5.js.br +0 -2
  310. package/build/client/_app/immutable/chunks/Ch85wCT5.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/DRHnoVLf.js +0 -1
  312. package/build/client/_app/immutable/chunks/DRHnoVLf.js.br +0 -0
  313. package/build/client/_app/immutable/chunks/DRHnoVLf.js.gz +0 -0
  314. package/build/client/_app/immutable/chunks/DYXGFYr6.js.br +0 -0
  315. package/build/client/_app/immutable/chunks/DYXGFYr6.js.gz +0 -0
  316. package/build/client/_app/immutable/chunks/Dcw6L0GF.js.br +0 -0
  317. package/build/client/_app/immutable/chunks/Dcw6L0GF.js.gz +0 -0
  318. package/build/client/_app/immutable/entry/app.CVxCoIFs.js.br +0 -0
  319. package/build/client/_app/immutable/entry/app.CVxCoIFs.js.gz +0 -0
  320. package/build/client/_app/immutable/entry/start.CQqNtgHJ.js +0 -1
  321. package/build/client/_app/immutable/entry/start.CQqNtgHJ.js.br +0 -0
  322. package/build/client/_app/immutable/entry/start.CQqNtgHJ.js.gz +0 -0
  323. package/build/client/_app/immutable/nodes/0.Bb8qAGW8.js.br +0 -0
  324. package/build/client/_app/immutable/nodes/0.Bb8qAGW8.js.gz +0 -0
  325. package/build/client/_app/immutable/nodes/1.Co_TaqLI.js.br +0 -2
  326. package/build/client/_app/immutable/nodes/1.Co_TaqLI.js.gz +0 -0
  327. package/build/client/_app/immutable/nodes/4.agNu3Ryl.js +0 -130
  328. package/build/client/_app/immutable/nodes/4.agNu3Ryl.js.br +0 -0
  329. package/build/client/_app/immutable/nodes/4.agNu3Ryl.js.gz +0 -0
  330. package/build/client/_app/immutable/nodes/5.Fw13EXte.js.br +0 -0
  331. package/build/client/_app/immutable/nodes/5.Fw13EXte.js.gz +0 -0
  332. package/build/client/_app/immutable/nodes/6.CWy0yXnu.js.br +0 -0
  333. package/build/client/_app/immutable/nodes/6.CWy0yXnu.js.gz +0 -0
  334. package/build/client/_app/immutable/nodes/7.CsM4M8Ul.js.br +0 -0
  335. package/build/client/_app/immutable/nodes/7.CsM4M8Ul.js.gz +0 -0
  336. package/build/client/_app/immutable/nodes/8.V6hY0p8a.js.br +0 -0
  337. package/build/client/_app/immutable/nodes/8.V6hY0p8a.js.gz +0 -0
  338. package/build/server/chunks/1-DvZDBGww.js +0 -9
  339. package/build/server/chunks/10-C96Thueb.js.map +0 -1
  340. package/build/server/chunks/4-BYdi8hv_.js +0 -9
  341. package/build/server/chunks/6-BsZngRIA.js +0 -9
  342. package/build/server/chunks/_page.svelte-WYgjKj38.js.map +0 -1
  343. package/build/server/chunks/_server.ts-2fxcxBzC.js.map +0 -1
  344. package/build/server/chunks/_server.ts-5aqdy9Zn.js.map +0 -1
  345. package/build/server/chunks/_server.ts-B8D1t67g.js.map +0 -1
  346. package/build/server/chunks/_server.ts-BETcFeB8.js.map +0 -1
  347. package/build/server/chunks/_server.ts-BM0AExGa.js +0 -121
  348. package/build/server/chunks/_server.ts-BM0AExGa.js.map +0 -1
  349. package/build/server/chunks/_server.ts-Baeek88H.js.map +0 -1
  350. package/build/server/chunks/_server.ts-BlVBulWB.js.map +0 -1
  351. package/build/server/chunks/_server.ts-Brb7lRFE.js.map +0 -1
  352. package/build/server/chunks/_server.ts-C5jyYbFm.js.map +0 -1
  353. package/build/server/chunks/_server.ts-C7Scn_Ur.js.map +0 -1
  354. package/build/server/chunks/_server.ts-C9-ewPaY.js.map +0 -1
  355. package/build/server/chunks/_server.ts-CM1BFa2O.js.map +0 -1
  356. package/build/server/chunks/_server.ts-Cap2Myq0.js.map +0 -1
  357. package/build/server/chunks/_server.ts-DBQ7TD4o.js.map +0 -1
  358. package/build/server/chunks/_server.ts-DDCEmU_P.js.map +0 -1
  359. package/build/server/chunks/_server.ts-DLLNA3jY.js +0 -47
  360. package/build/server/chunks/_server.ts-DLLNA3jY.js.map +0 -1
  361. package/build/server/chunks/_server.ts-DM6Jm6KP.js.map +0 -1
  362. package/build/server/chunks/_server.ts-DRvqTDLx.js.map +0 -1
  363. package/build/server/chunks/_server.ts-DXoq1VzO.js.map +0 -1
  364. package/build/server/chunks/_server.ts-DYsP_lpr.js.map +0 -1
  365. package/build/server/chunks/_server.ts-DZ-yNYeI.js +0 -64
  366. package/build/server/chunks/_server.ts-DZ-yNYeI.js.map +0 -1
  367. package/build/server/chunks/_server.ts-Dcawi9b4.js.map +0 -1
  368. package/build/server/chunks/_server.ts-Decw7JxO.js.map +0 -1
  369. package/build/server/chunks/_server.ts-Dg4ouUjZ.js.map +0 -1
  370. package/build/server/chunks/_server.ts-IW-zQmmb.js.map +0 -1
  371. package/build/server/chunks/_server.ts-WePF2DAq.js.map +0 -1
  372. package/build/server/chunks/_server.ts-k339Bhm3.js +0 -88
  373. package/build/server/chunks/_server.ts-k339Bhm3.js.map +0 -1
  374. package/build/server/chunks/addon-helpers-ChYTbRSK.js.map +0 -1
  375. package/build/server/chunks/environment-D-dkDBwd.js +0 -36
  376. package/build/server/chunks/environment-D-dkDBwd.js.map +0 -1
  377. package/build/server/chunks/hooks.server-DaC85A-N.js.map +0 -1
  378. package/build/server/chunks/src-B3g4Ry1X.js.map +0 -1
  379. package/build/server/chunks/theme-state.svelte-BgBXJ060.js.map +0 -1
  380. package/build/server/chunks/version-cache-CSnmLqxQ.js +0 -54
  381. package/build/server/chunks/version-cache-CSnmLqxQ.js.map +0 -1
@@ -738,7 +738,7 @@ var import_main = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
738
738
  module.exports = DotenvModule;
739
739
  })))();
740
740
  var package_default = {
741
- version: "0.12.18"};
741
+ version: "0.12.22"};
742
742
  //#endregion
743
743
  //#region ../lib/src/control-plane/versioning.ts
744
744
  var SEMVER_RE = /^v?\d+\.\d+\.\d+(?:[-+].*)?$/;
@@ -806,15 +806,6 @@ function compareComparableVersions(a, b) {
806
806
  if (aParsed.prerelease !== null && bParsed.prerelease !== null) return comparePrerelease(aParsed.prerelease, bParsed.prerelease);
807
807
  return 0;
808
808
  }
809
- function majorVersionOf(version) {
810
- if (!isComparableSemver(version)) return null;
811
- return parseComparableVersion(version).major;
812
- }
813
- function isSameMajorVersion(a, b) {
814
- const aMajor = majorVersionOf(a);
815
- const bMajor = majorVersionOf(b);
816
- return aMajor !== null && bMajor !== null && aMajor === bMajor;
817
- }
818
809
  /**
819
810
  * npm/display form: strip a single leading `v` and trim. `v0.12.0` → `0.12.0`.
820
811
  * Pass-through for an already-bare version. Empty/whitespace → ''.
@@ -1087,82 +1078,6 @@ function nonSensitiveAddonEnvKeys() {
1087
1078
  return keys;
1088
1079
  }
1089
1080
  //#endregion
1090
- //#region ../lib/src/control-plane/image-tags.ts
1091
- var PLATFORM_IMAGE_TAG_KEYS = [
1092
- "OP_ASSISTANT_IMAGE_TAG",
1093
- "OP_GUARDIAN_IMAGE_TAG",
1094
- "OP_PORTAL_IMAGE_TAG"
1095
- ];
1096
- var PINNABLE_PLATFORM_IMAGE_SET = new Set(["guardian", "portal"]);
1097
- function parsePinnedImages(value) {
1098
- if (!value) return [];
1099
- return [...new Set(value.split(",").map((entry) => entry.trim().toLowerCase()).filter((entry) => PINNABLE_PLATFORM_IMAGE_SET.has(entry)))].sort();
1100
- }
1101
- function platformImageTagKeyFor(image) {
1102
- switch (image) {
1103
- case "guardian": return "OP_GUARDIAN_IMAGE_TAG";
1104
- case "portal": return "OP_PORTAL_IMAGE_TAG";
1105
- }
1106
- }
1107
- function resolveEffectivePlatformImageTag(env, image) {
1108
- const primary = env[platformImageTagKeyFor(image)]?.trim();
1109
- if (primary) return primary;
1110
- if (image === "portal") {
1111
- const legacy = env.OP_CHANNEL_IMAGE_TAG?.trim();
1112
- if (legacy) return legacy;
1113
- }
1114
- return env.OP_IMAGE_TAG?.trim() || "latest";
1115
- }
1116
- function buildPinnedImageTagEnv(env, pinnedImages) {
1117
- const updates = {};
1118
- for (const image of pinnedImages) updates[platformImageTagKeyFor(image)] = resolveEffectivePlatformImageTag(env, image);
1119
- return updates;
1120
- }
1121
- var DEPLOYABLE_UNITS = [
1122
- "assistant",
1123
- "guardian",
1124
- "portals",
1125
- "voice"
1126
- ];
1127
- var DEPLOYABLE_UNIT_IMAGE_NAMES = {
1128
- assistant: "assistant",
1129
- guardian: "guardian",
1130
- portals: "portal",
1131
- voice: "voice"
1132
- };
1133
- var DEPLOYABLE_UNIT_IMAGE_TAG_KEYS = {
1134
- assistant: "OP_ASSISTANT_IMAGE_TAG",
1135
- guardian: "OP_GUARDIAN_IMAGE_TAG",
1136
- portals: "OP_PORTAL_IMAGE_TAG",
1137
- voice: "OP_VOICE_IMAGE_TAG"
1138
- };
1139
- function isDeployableUnit(value) {
1140
- return DEPLOYABLE_UNITS.includes(value);
1141
- }
1142
- function deployableUnitImageName(unit) {
1143
- return DEPLOYABLE_UNIT_IMAGE_NAMES[unit];
1144
- }
1145
- function deployableUnitImageTagKey(unit) {
1146
- return DEPLOYABLE_UNIT_IMAGE_TAG_KEYS[unit];
1147
- }
1148
- /**
1149
- * Build the stack.env image-tag entries for a platform release.
1150
- *
1151
- * `tag` is the platform version-of-record (the assistant tag). Per-image
1152
- * overrides let guardian/portal ride an older published tag when a release
1153
- * shipped only a subset of images (#477). OP_IMAGE_TAG stays as the compose
1154
- * fallback for pre-per-image installs.
1155
- */
1156
- function buildPlatformImageTagEnv(tag, perImage, pinnedImages = []) {
1157
- const pinned = new Set(pinnedImages);
1158
- return {
1159
- OP_IMAGE_TAG: tag,
1160
- OP_ASSISTANT_IMAGE_TAG: perImage?.OP_ASSISTANT_IMAGE_TAG ?? tag,
1161
- ...pinned.has("guardian") ? {} : { OP_GUARDIAN_IMAGE_TAG: perImage?.OP_GUARDIAN_IMAGE_TAG ?? tag },
1162
- ...pinned.has("portal") ? {} : { OP_PORTAL_IMAGE_TAG: perImage?.OP_PORTAL_IMAGE_TAG ?? perImage?.OP_CHANNEL_IMAGE_TAG ?? tag }
1163
- };
1164
- }
1165
- //#endregion
1166
1081
  //#region ../lib/src/control-plane/addon-ids.ts
1167
1082
  /**
1168
1083
  * Canonical list of built-in addon IDs.
@@ -1380,9 +1295,6 @@ function stampReleaseVersion(stashDir, version) {
1380
1295
  writeFileSync(envPath, next);
1381
1296
  return true;
1382
1297
  }
1383
- function upsertMany(content, values) {
1384
- return Object.entries(values).reduce((next, [key, value]) => upsertEnvValue(next, key, value), content);
1385
- }
1386
1298
  function ensureDir(ctx, dir) {
1387
1299
  if (ctx.dryRun) {
1388
1300
  ctx.log(`[dry-run] mkdir ${rel(ctx, dir)}`);
@@ -1424,23 +1336,7 @@ function writeFile600(ctx, path, content) {
1424
1336
  chmodSync(path, 384);
1425
1337
  } catch {}
1426
1338
  }
1427
- function seedPerImageTagVars(ctx) {
1428
- const envPath = stackEnvFile(ctx.stashDir);
1429
- if (!existsSync(envPath)) return;
1430
- const current = readFileSync(envPath, "utf-8");
1431
- const imageTag = current.match(/^OP_IMAGE_TAG=(.+)$/m)?.[1]?.trim();
1432
- if (!imageTag) return;
1433
- if (PLATFORM_IMAGE_TAG_KEYS.filter((key) => !new RegExp(`^${key}=`, "m").test(current)).length === 0) return;
1434
- if (ctx.dryRun) {
1435
- ctx.log(`[dry-run] seed per-image tag vars from OP_IMAGE_TAG=${imageTag}`);
1436
- return;
1437
- }
1438
- let next = upsertMany(current, buildPlatformImageTagEnv(imageTag));
1439
- const legacyPortalTag = readStackEnvValue(ctx.stashDir, "OP_CHANNEL_IMAGE_TAG");
1440
- if (legacyPortalTag && !/^OP_PORTAL_IMAGE_TAG=/m.test(next)) next = upsertEnvValue(next, "OP_PORTAL_IMAGE_TAG", legacyPortalTag);
1441
- writeFile600(ctx, envPath, next);
1442
- ctx.log(`seeded per-image tag vars from OP_IMAGE_TAG=${imageTag}`);
1443
- }
1339
+ function seedPerImageTagVars(_ctx) {}
1444
1340
  /**
1445
1341
  * Keys that are sensitive and must stay as compose secret files.
1446
1342
  * Matches the @sensitive annotation in BUILTIN_ADDON_ENV_SCHEMAS.
@@ -1958,19 +1854,73 @@ function patchPortalsComposeForThinHost(ctx) {
1958
1854
  writeFileSync(path, patched);
1959
1855
  ctx.log("patched portals.compose.yml: added OP_GUARDIAN_VERSION and PLATFORM_VERSION to guardian service env");
1960
1856
  }
1857
+ /**
1858
+ * Legacy image-tag keys removed by the version-system redesign. The single
1859
+ * whole-stack OP_IMAGE_TAG and the per-unit OP_*_IMAGE_TAG escape-hatch keys are
1860
+ * replaced by one explicit OP_*_VERSION var per image (no compose cascade).
1861
+ */
1862
+ var LEGACY_IMAGE_TAG_KEYS = [
1863
+ "OP_IMAGE_TAG",
1864
+ "OP_ASSISTANT_IMAGE_TAG",
1865
+ "OP_GUARDIAN_IMAGE_TAG",
1866
+ "OP_PORTAL_IMAGE_TAG",
1867
+ "OP_CHANNEL_IMAGE_TAG"
1868
+ ];
1869
+ /**
1870
+ * Map an existing install's legacy image-tag vars onto the new per-image
1871
+ * OP_*_VERSION vars, then strip the legacy keys.
1872
+ *
1873
+ * Each new var is seeded from the most specific legacy source: the per-unit
1874
+ * OP_<UNIT>_IMAGE_TAG when set, else the whole-stack OP_IMAGE_TAG, else "latest"
1875
+ * (the moving default). Voice never had a managed tag var, so it defaults to
1876
+ * "latest". The legacy keys are then removed (they are SYSTEM-managed compose
1877
+ * config, not user data — and the layout migration path takes a full-home backup
1878
+ * first; here ensureReleaseMigrated takes a targeted stack.env backup).
1879
+ *
1880
+ * Idempotent: once the legacy keys are gone and the new vars are present, a
1881
+ * second run is a no-op (mapped values already exist; nothing to strip).
1882
+ */
1883
+ function migrateImageTagsToVersionVars(ctx) {
1884
+ const envPath = stackEnvFile(ctx.stashDir);
1885
+ if (!existsSync(envPath)) return;
1886
+ let content = readFileSync(envPath, "utf-8");
1887
+ const read = (key) => {
1888
+ const m = content.match(new RegExp(`^${key}=(.*)$`, "m"));
1889
+ return m ? m[1].trim() : void 0;
1890
+ };
1891
+ const has = (key) => new RegExp(`^${key}=`, "m").test(content);
1892
+ const imageTag = read("OP_IMAGE_TAG");
1893
+ const fallback = imageTag && imageTag.length > 0 ? imageTag : "latest";
1894
+ const mapped = {
1895
+ OP_ASSISTANT_VERSION: read("OP_ASSISTANT_IMAGE_TAG") ?? fallback,
1896
+ OP_GUARDIAN_VERSION: read("OP_GUARDIAN_IMAGE_TAG") ?? fallback,
1897
+ OP_PORTAL_VERSION: read("OP_PORTAL_IMAGE_TAG") ?? fallback,
1898
+ OP_VOICE_VERSION: "latest"
1899
+ };
1900
+ const hasLegacy = LEGACY_IMAGE_TAG_KEYS.some(has);
1901
+ const missingNew = Object.keys(mapped).some((k) => !has(k));
1902
+ if (!hasLegacy && !missingNew) return;
1903
+ if (ctx.dryRun) {
1904
+ ctx.log(`[dry-run] would set ${Object.entries(mapped).map(([k, v]) => `${k}=${v}`).join(", ")}`);
1905
+ if (hasLegacy) ctx.log(`[dry-run] would remove legacy image-tag keys: ${LEGACY_IMAGE_TAG_KEYS.filter(has).join(", ")}`);
1906
+ return;
1907
+ }
1908
+ for (const [key, value] of Object.entries(mapped)) if (!has(key)) {
1909
+ content = upsertEnvValue(content, key, value);
1910
+ ctx.log(`set ${key}=${value}`);
1911
+ }
1912
+ for (const key of LEGACY_IMAGE_TAG_KEYS) if (has(key)) {
1913
+ content = removeEnvKey(content, key);
1914
+ ctx.log(`removed legacy image-tag key: ${key}`);
1915
+ }
1916
+ writeFile600(ctx, envPath, content);
1917
+ }
1961
1918
  var RELEASE_MIGRATIONS = [
1962
1919
  {
1963
1920
  version: "v0.11.5-rc.1",
1964
- describe: "seed per-image platform tags from OP_IMAGE_TAG",
1921
+ describe: "seed per-image platform tags from OP_IMAGE_TAG (no-op: compose now resolves every service from OP_IMAGE_TAG)",
1965
1922
  apply: seedPerImageTagVars,
1966
- verify(ctx) {
1967
- if (ctx.dryRun) return;
1968
- const envPath = stackEnvFile(ctx.stashDir);
1969
- if (!existsSync(envPath)) return;
1970
- const content = readFileSync(envPath, "utf-8");
1971
- if (!/^OP_IMAGE_TAG=/m.test(content)) return;
1972
- for (const key of PLATFORM_IMAGE_TAG_KEYS) if (!new RegExp(`^${key}=`, "m").test(content)) throw new Error(`post-migration check failed: ${key} is missing`);
1973
- }
1923
+ verify() {}
1974
1924
  },
1975
1925
  {
1976
1926
  version: "v0.12.0-rc.1",
@@ -2016,6 +1966,24 @@ var RELEASE_MIGRATIONS = [
2016
1966
  if (!content.includes("OP_GUARDIAN_VERSION:")) throw new Error("post-migration check failed: OP_GUARDIAN_VERSION still missing from portals.compose.yml");
2017
1967
  if (!content.includes(" OP_ASSISTANT_URL: http://assistant:4096")) throw new Error("post-migration check failed: portals.compose.yml is missing the expected anchor line (OP_ASSISTANT_URL: http://assistant:4096). The file may be structurally corrupt.");
2018
1968
  }
1969
+ },
1970
+ {
1971
+ version: "v0.12.19-rc.1",
1972
+ describe: "map OP_IMAGE_TAG / OP_*_IMAGE_TAG -> OP_*_VERSION and remove legacy image-tag keys",
1973
+ apply: migrateImageTagsToVersionVars,
1974
+ verify(ctx) {
1975
+ if (ctx.dryRun) return;
1976
+ const envPath = stackEnvFile(ctx.stashDir);
1977
+ if (!existsSync(envPath)) return;
1978
+ const content = readFileSync(envPath, "utf-8");
1979
+ for (const key of LEGACY_IMAGE_TAG_KEYS) if (new RegExp(`^${key}=`, "m").test(content)) throw new Error(`post-migration check failed: legacy image-tag key '${key}' still present in stack.env`);
1980
+ for (const key of [
1981
+ "OP_ASSISTANT_VERSION",
1982
+ "OP_GUARDIAN_VERSION",
1983
+ "OP_PORTAL_VERSION",
1984
+ "OP_VOICE_VERSION"
1985
+ ]) if (!new RegExp(`^${key}=`, "m").test(content)) throw new Error(`post-migration check failed: ${key} missing from stack.env after version migration`);
1986
+ }
2019
1987
  }
2020
1988
  ];
2021
1989
  var RECOVERY_GUIDANCE = "Your original files were left untouched and a full backup was taken first. If something went wrong, run `openpalm rollback` to restore your previous state, or restore the backup manually (see docs/operations/backup-restore.md). You can also run `openpalm migrate --dry-run` to preview the current copy-only migration. Full guide: docs/operations/upgrade-0.10-to-0.11.md";
@@ -5560,7 +5528,7 @@ function resolveLocalOpenpalmDir() {
5560
5528
  * aware — unlike `releases/latest`, which silently excludes prereleases),
5561
5529
  * immutable versions, and a sha512 integrity we verify fail-closed.
5562
5530
  */
5563
- var NPM_REGISTRY$1 = "https://registry.npmjs.org";
5531
+ var NPM_REGISTRY = "https://registry.npmjs.org";
5564
5532
  var UI_PACKAGE = "@openpalm/ui";
5565
5533
  /**
5566
5534
  * Resolve the npm manifest for `@openpalm/ui` by exact version OR dist-tag.
@@ -5568,7 +5536,7 @@ var UI_PACKAGE = "@openpalm/ui";
5568
5536
  * manifest (version + dist.tarball + dist.integrity). Throws on non-OK.
5569
5537
  */
5570
5538
  async function fetchNpmUiManifest(versionOrTag) {
5571
- const res = await fetchWithRetry(`${NPM_REGISTRY$1}/${UI_PACKAGE}/${versionOrTag}`);
5539
+ const res = await fetchWithRetry(`${NPM_REGISTRY}/${UI_PACKAGE}/${versionOrTag}`);
5572
5540
  if (!res.ok) throw new Error(`npm registry returned HTTP ${res.status} for ${UI_PACKAGE}@${versionOrTag}`);
5573
5541
  const m = await res.json();
5574
5542
  if (!m.version || !m.dist?.tarball) throw new Error(`npm manifest for ${UI_PACKAGE}@${versionOrTag} is missing version/dist.tarball`);
@@ -6065,6 +6033,88 @@ var STACK_DEFAULTS = {
6065
6033
  assistant: 3800,
6066
6034
  hostUi: 3880}};
6067
6035
  //#endregion
6036
+ //#region ../lib/src/control-plane/versions.ts
6037
+ /**
6038
+ * Version variable management for the OpenPalm control plane.
6039
+ *
6040
+ * The stack carries two kinds of version pins in knowledge/env/stack.env:
6041
+ *
6042
+ * - SERVICE versions (`OP_*_VERSION`) are Docker image tags. They take an exact
6043
+ * tag ("v0.12.18"), the moving "latest" / "next" refs, or empty (compose
6044
+ * falls back to "latest"). They are NEVER semver ranges — Docker image tags
6045
+ * are concrete refs, not range expressions.
6046
+ * - NPM versions (`OP_*_NPM_VERSION` / `OP_TOOL_*_VERSION`) pin npm packages
6047
+ * installed at container boot (guardian thin-host, assistant CLI tools). These
6048
+ * accept semver ranges ("^1.17.0", "~0.8.14") because npm resolves them.
6049
+ *
6050
+ * Compose reads every SERVICE_VERSION_KEY directly via
6051
+ * `${OP_*_VERSION:-latest}` — there is no cascade fallback to a single platform
6052
+ * tag anymore. Each image rides its own var.
6053
+ */
6054
+ /** Docker image tag pins — one per deployable image. Exact tag / "latest" / "next". */
6055
+ var SERVICE_VERSION_KEYS = [
6056
+ "OP_ASSISTANT_VERSION",
6057
+ "OP_GUARDIAN_VERSION",
6058
+ "OP_PORTAL_VERSION",
6059
+ "OP_VOICE_VERSION"
6060
+ ];
6061
+ /** npm package pins installed at container boot. Semver ranges allowed. */
6062
+ var NPM_VERSION_KEYS = [
6063
+ "OP_GUARDIAN_NPM_VERSION",
6064
+ "OP_TOOL_OPENCODE_VERSION",
6065
+ "OP_TOOL_AKM_VERSION",
6066
+ "OP_TOOL_CLAUDE_CODE_VERSION",
6067
+ "OP_TOOL_CODEX_VERSION"
6068
+ ];
6069
+ /** Every version key the control plane reads/writes in stack.env. */
6070
+ var ALL_VERSION_KEYS = [...SERVICE_VERSION_KEYS, ...NPM_VERSION_KEYS];
6071
+ var VERSION_KEY_SET = new Set(ALL_VERSION_KEYS);
6072
+ /** Default values seeded into a fresh stack.env (and returned for unset keys). */
6073
+ var VERSION_DEFAULTS = {
6074
+ OP_ASSISTANT_VERSION: "latest",
6075
+ OP_GUARDIAN_VERSION: "latest",
6076
+ OP_PORTAL_VERSION: "latest",
6077
+ OP_VOICE_VERSION: "latest",
6078
+ OP_GUARDIAN_NPM_VERSION: "",
6079
+ OP_TOOL_OPENCODE_VERSION: "^1.17.0",
6080
+ OP_TOOL_AKM_VERSION: "^0.8.14",
6081
+ OP_TOOL_CLAUDE_CODE_VERSION: "^1.5.0",
6082
+ OP_TOOL_CODEX_VERSION: "^0.1.0"
6083
+ };
6084
+ function isVersionKey(key) {
6085
+ return VERSION_KEY_SET.has(key);
6086
+ }
6087
+ function stackEnvPath$1(state) {
6088
+ return `${state.stashDir}/env/stack.env`;
6089
+ }
6090
+ /**
6091
+ * Read every version key from stack.env. Keys that are absent fall back to their
6092
+ * documented default (so callers always get the full ALL_VERSION_KEYS set).
6093
+ */
6094
+ function readVersions(state) {
6095
+ const path = stackEnvPath$1(state);
6096
+ const parsed = existsSync(path) ? parseEnvFile(path) : {};
6097
+ const out = {};
6098
+ for (const key of ALL_VERSION_KEYS) out[key] = parsed[key] ?? VERSION_DEFAULTS[key];
6099
+ return out;
6100
+ }
6101
+ /**
6102
+ * Write validated version keys into stack.env. Only keys in the
6103
+ * ALL_VERSION_KEYS allowlist are written; anything else is rejected so a typo or
6104
+ * a hostile caller can't smuggle arbitrary env into the stack config. Uses
6105
+ * mergeEnvContent so existing non-version keys (and comments) are preserved.
6106
+ */
6107
+ function writeVersions(state, updates) {
6108
+ const accepted = {};
6109
+ for (const [key, value] of Object.entries(updates)) {
6110
+ if (!isVersionKey(key)) throw new Error(`Refusing to write unknown version key: ${key}`);
6111
+ accepted[key] = (value ?? "").trim();
6112
+ }
6113
+ if (Object.keys(accepted).length === 0) return;
6114
+ const path = stackEnvPath$1(state);
6115
+ writeFileSync(path, mergeEnvContent(existsSync(path) ? readFileSync(path, "utf-8") : "", accepted), { mode: 384 });
6116
+ }
6117
+ //#endregion
6068
6118
  //#region ../lib/src/control-plane/config-persistence.ts
6069
6119
  /**
6070
6120
  * Runtime file resolution and persistence for the OpenPalm control plane.
@@ -6073,7 +6123,6 @@ var STACK_DEFAULTS = {
6073
6123
  * Files are validated in-place before writing; rollback is handled by
6074
6124
  * the rollback module (snapshot to OP_HOME/data/rollback/).
6075
6125
  */
6076
- var DEFAULT_IMAGE_TAG = "latest";
6077
6126
  var logger$8 = createLogger("config-persistence");
6078
6127
  /**
6079
6128
  * Return the env files used for docker compose --env-file args.
@@ -6201,7 +6250,12 @@ function generateFallbackSystemEnv(state) {
6201
6250
  "",
6202
6251
  "# ── Images ──────────────────────────────────────────────────────────",
6203
6252
  `OP_IMAGE_NAMESPACE=${process.env.OP_IMAGE_NAMESPACE ?? "openpalm"}`,
6204
- ...Object.entries(buildPlatformImageTagEnv(DEFAULT_IMAGE_TAG)).map(([key, value]) => `${key}=${value}`),
6253
+ "# Docker image tags (exact tag, \"latest\", or \"next\" — no semver ranges).",
6254
+ ...SERVICE_VERSION_KEYS.map((key) => `${key}=${VERSION_DEFAULTS[key]}`),
6255
+ "",
6256
+ "# ── npm package versions (semver ranges supported) ──────────────────",
6257
+ "# OP_GUARDIAN_NPM_VERSION empty ⇒ use the GUARDIAN_VERSION baked into the image.",
6258
+ ...NPM_VERSION_KEYS.map((key) => `${key}=${VERSION_DEFAULTS[key]}`),
6205
6259
  "",
6206
6260
  "# ── Layout (on-disk schema version; managed by the migration harness) ──",
6207
6261
  `OP_LAYOUT_VERSION=2`,
@@ -6488,17 +6542,18 @@ function execFileNoThrow(cmd, args, timeoutMs) {
6488
6542
  /**
6489
6543
  * Compute the openpalm/voice image ref for a given GPU variant, matching
6490
6544
  * the substitution chain in the addon compose file:
6491
- * ${OP_IMAGE_NAMESPACE:-openpalm}/voice:${OP_VOICE_IMAGE_TAG:-latest-<variant>}
6545
+ * ${OP_IMAGE_NAMESPACE:-openpalm}/voice:${OP_VOICE_VERSION:-latest-<variant>}
6492
6546
  *
6493
6547
  * Voice images are published OUT OF BAND (publish-voice.yml), decoupled from the
6494
- * platform OP_IMAGE_TAG — they are heavy and rarely change. So the default is
6495
- * the moving `latest-<variant>` voice tag; operators pin a specific build by
6496
- * setting OP_VOICE_IMAGE_TAG (e.g. `v1.0.0-cpu`).
6548
+ * other service images — they are heavy and rarely change. So the default is the
6549
+ * moving `latest-<variant>` voice tag; operators pin a specific build by setting
6550
+ * OP_VOICE_VERSION (e.g. `v1.0.0-cpu`). A bare `latest` (the seeded default) is
6551
+ * treated as "unset" so the GPU-variant default still applies.
6497
6552
  */
6498
6553
  function voiceImageRef(variant) {
6499
6554
  const namespace = process.env.OP_IMAGE_NAMESPACE?.trim() || "openpalm";
6500
- const explicit = process.env.OP_VOICE_IMAGE_TAG?.trim();
6501
- if (explicit) return `${namespace}/voice:${explicit}`;
6555
+ const explicit = process.env.OP_VOICE_VERSION?.trim();
6556
+ if (explicit && explicit !== "latest") return `${namespace}/voice:${explicit}`;
6502
6557
  return `${namespace}/voice:latest-${variant}`;
6503
6558
  }
6504
6559
  /**
@@ -7611,13 +7666,6 @@ function hasArmedSnapshot() {
7611
7666
  //#region ../lib/src/control-plane/lifecycle.ts
7612
7667
  /** Lifecycle helpers — state factory, apply transitions, compose file list. */
7613
7668
  var IMAGE_NAMESPACE_RE = /^[a-z0-9]+(?:[._-][a-z0-9]+)*$/;
7614
- var SEMVER_TAG_RE = /^v\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
7615
- var PLATFORM_IMAGE_NAMES = [
7616
- "assistant",
7617
- "guardian",
7618
- "portal"
7619
- ];
7620
- var AUTH_TRANSITION_BOUNDARY_TAG = "v0.12.0";
7621
7669
  function createState() {
7622
7670
  const homeDir = resolveOpenPalmHome();
7623
7671
  const configDir = resolveConfigDir();
@@ -7712,317 +7760,11 @@ async function applyUninstall(state, opts) {
7712
7760
  releaseLifecycleLock(lock, opts);
7713
7761
  }
7714
7762
  }
7715
- var DOCKER_REGISTRY_TIMEOUT_MS = 1e4;
7716
- /**
7717
- * Resolve the best Docker image tag from a registry tags payload.
7718
- *
7719
- * Constraints (all optional):
7720
- * - `sameMajorAs` — only consider tags whose major component matches this tag.
7721
- * - `atOrBelow` — only consider tags whose version is <= this tag.
7722
- * - `skipPrerelease` — ignore prerelease tags (`-rc`, `-beta`, …). Used so a
7723
- * STABLE base never auto-jumps onto a prerelease (#494),
7724
- * mirroring the UI card's channel gate.
7725
- *
7726
- * With no constraints: returns the first semver tag found, or the first
7727
- * non-"latest" tag as a fallback (mirrors the original resolveNewestDockerTag).
7728
- * With constraints: returns the highest semver tag satisfying all constraints.
7729
- */
7730
- function resolveNewestDockerTag(payload, constraints = {}) {
7731
- const results = payload?.results;
7732
- if (!Array.isArray(results)) return null;
7733
- const { sameMajorAs, atOrBelow, skipPrerelease } = constraints;
7734
- if (!(sameMajorAs !== void 0 || atOrBelow !== void 0 || skipPrerelease === true)) {
7735
- let fallback = null;
7736
- for (const entry of results) {
7737
- const name = typeof entry?.name === "string" ? entry.name.trim() : "";
7738
- if (!name || name === "latest") continue;
7739
- if (SEMVER_TAG_RE.test(name)) return name;
7740
- if (!fallback) fallback = name;
7741
- }
7742
- return fallback;
7743
- }
7744
- let best = null;
7745
- for (const entry of results) {
7746
- const name = typeof entry?.name === "string" ? entry.name.trim() : "";
7747
- if (!isComparableSemver(name)) continue;
7748
- if (skipPrerelease && isPrerelease(name)) continue;
7749
- if (sameMajorAs !== void 0 && !isSameMajorVersion(name, sameMajorAs)) continue;
7750
- if (atOrBelow !== void 0 && compareComparableVersions(name, atOrBelow) > 0) continue;
7751
- if (!best || compareComparableVersions(name, best) > 0) best = name;
7752
- }
7753
- return best;
7754
- }
7755
- function resolvePlatformVersionPolicyBaseTag(state) {
7756
- const configured = parseEnvFile(`${state.stashDir}/env/stack.env`).OP_IMAGE_TAG?.trim();
7757
- if (isComparableSemver(configured)) return configured;
7758
- return PLATFORM_VERSION;
7759
- }
7760
- /**
7761
- * Host-vs-target guard (#492), keyed on the RUNNING control-plane version.
7762
- *
7763
- * The migrations a release needs live inside the @openpalm/lib that is actually
7764
- * executing — i.e. PLATFORM_VERSION (the version of the running data/ui build, or
7765
- * the compiled-in CLI lib). If a user points the stack at a tag NEWER than the
7766
- * control plane they're running, `ensureReleaseMigrated` runs an OLD migration
7767
- * array that doesn't contain that release's migrations → the new images come up
7768
- * against half-migrated files. There is no safe recovery, so this is a HARD block
7769
- * (not a warning): nothing is written before it throws.
7770
- *
7771
- * The thin-harness design (§6.5) makes this satisfiable: the supervisor self-
7772
- * updates data/ui to the current platform BEFORE the UI serves the upgrade
7773
- * request, so "target ≤ running platform" only fails when the user genuinely
7774
- * picks a tag the running control plane cannot migrate to — at which point the
7775
- * fix is to update the app / control plane first, not to proceed.
7776
- *
7777
- * Non-semver targets (a moving `latest`/`dev` tag) are not comparable and are
7778
- * left to the resolver paths that turn them into a concrete release first.
7779
- */
7780
- /**
7781
- * Downgrade-needs-confirmation signal (#501).
7782
- *
7783
- * Release migrations are forward-only (copy-only, additive); they do NOT run
7784
- * backward. Pointing the stack at an OLDER tag than the one currently running is
7785
- * therefore a data-safety event, not a routine version change: the older images
7786
- * may not understand files the newer release already migrated. We don't block it
7787
- * (a user may legitimately need to roll back), but we require an explicit
7788
- * confirmation so it can't happen by a stray dropdown selection. The UI catches
7789
- * this by `code` and shows a plain warning + confirm; the CLI surfaces the
7790
- * message and a `--confirm`/`--yes` path.
7791
- */
7792
- var DowngradeConfirmationRequired = class extends Error {
7793
- code = "downgrade_confirmation_required";
7794
- currentVersion;
7795
- targetVersion;
7796
- constructor(currentVersion, targetVersion) {
7797
- super(`Version ${formatForDisplay(targetVersion)} is older than the version you're running (${formatForDisplay(currentVersion)}). This is a downgrade. Release migrations don't run backward; your data may not be compatible — restore from backup if needed. Re-run with confirmation to proceed. Nothing was changed.`);
7798
- this.name = "DowngradeConfirmationRequired";
7799
- this.currentVersion = currentVersion;
7800
- this.targetVersion = targetVersion;
7801
- }
7802
- };
7803
- /**
7804
- * Throw {@link DowngradeConfirmationRequired} when `targetTag` is strictly older
7805
- * than the version currently configured in stack.env, unless the caller passed
7806
- * an explicit confirmation. Non-semver tags (a moving `latest`/`dev` ref, or a
7807
- * first install with no current tag) are not comparable and pass through — the
7808
- * resolver paths turn `latest` into a concrete release before this runs.
7809
- */
7810
- function assertNotUnconfirmedDowngrade(state, targetTag, confirmDowngrade) {
7811
- if (confirmDowngrade) return;
7812
- const currentTag = resolvePlatformVersionPolicyBaseTag(state);
7813
- if (!isComparableSemver(targetTag) || !isComparableSemver(currentTag)) return;
7814
- if (compareComparableVersions(targetTag, currentTag) >= 0) return;
7815
- throw new DowngradeConfirmationRequired(currentTag, targetTag);
7816
- }
7817
- /**
7818
- * Convert a release git tag to a Docker image tag.
7819
- *
7820
- * The new per-unit release scheme uses prefixed git tags (platform-X.Y.Z,
7821
- * portals-X.Y.Z, etc.) while Docker images always use the v-prefixed form
7822
- * (v0.12.5). This function strips the unit prefix so applyTagChange can
7823
- * resolve the correct Docker image tag from a GitHub release tag.
7824
- */
7825
- function extractDockerTagFromReleaseTag(tag) {
7826
- const unitPrefixMatch = tag.match(/^(?:platform|portals|assistant|guardian)-(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]*)?)$/);
7827
- if (unitPrefixMatch) return formatForDocker(unitPrefixMatch[1]);
7828
- return formatForDocker(tag);
7829
- }
7830
7763
  function resolveImageNamespace(state) {
7831
7764
  const namespace = (parseEnvFile(`${state.stashDir}/env/stack.env`).OP_IMAGE_NAMESPACE ?? process.env.OP_IMAGE_NAMESPACE ?? "openpalm").trim().toLowerCase();
7832
7765
  if (!IMAGE_NAMESPACE_RE.test(namespace)) throw new Error(`Invalid image namespace in system.env: ${namespace}`);
7833
7766
  return namespace;
7834
7767
  }
7835
- function resolveRequiredPlatformImages(state) {
7836
- const required = new Set(["assistant"]);
7837
- if (hasEnabledPortal(listEnabledAddonIds(state.homeDir))) {
7838
- required.add("guardian");
7839
- required.add("portal");
7840
- }
7841
- return PLATFORM_IMAGE_NAMES.filter((name) => required.has(name));
7842
- }
7843
- async function isDockerImageTagPublished(namespace, imageName, tag) {
7844
- let response;
7845
- try {
7846
- response = await fetch(`https://registry.hub.docker.com/v2/repositories/${namespace}/${imageName}/tags/${tag}`, {
7847
- headers: { Accept: "application/json" },
7848
- signal: AbortSignal.timeout(DOCKER_REGISTRY_TIMEOUT_MS)
7849
- });
7850
- } catch (e) {
7851
- throw new Error(`Failed to verify Docker image tag ${namespace}/${imageName}:${tag}: ${e instanceof Error ? e.message : String(e)}`);
7852
- }
7853
- if (response.status === 404) return false;
7854
- if (!response.ok) throw new Error(`Docker tag verification failed for ${namespace}/${imageName}:${tag} (${response.status})`);
7855
- return true;
7856
- }
7857
- async function fetchDockerTagsPayload(namespace, imageName) {
7858
- let response;
7859
- try {
7860
- response = await fetch(`https://registry.hub.docker.com/v2/repositories/${namespace}/${imageName}/tags?page_size=25&ordering=last_updated`, {
7861
- headers: { Accept: "application/json" },
7862
- signal: AbortSignal.timeout(DOCKER_REGISTRY_TIMEOUT_MS)
7863
- });
7864
- } catch (e) {
7865
- throw new Error(`Failed to query Docker tags: ${e instanceof Error ? e.message : String(e)}`);
7866
- }
7867
- if (!response.ok) throw new Error(`Docker tag lookup failed (${response.status})`);
7868
- return response.json();
7869
- }
7870
- /**
7871
- * Resolve the per-image tag env for a target platform tag (#477).
7872
- *
7873
- * `assistant` is the version-of-record image and must be published at the
7874
- * platform tag. Guardian/portal may lag: a release that ships only a subset
7875
- * of images leaves them at an older tag, so each falls back to its newest
7876
- * published tag <= the platform tag in the same major. Fail closed only when
7877
- * a required image (guardian/portal with a portal addon enabled) has no
7878
- * usable tag at all.
7879
- */
7880
- async function resolvePlatformImageTags(state, namespace, platformTag, pinnedImages) {
7881
- if (namespace !== "openpalm") return buildPlatformImageTagEnv(platformTag, void 0, pinnedImages);
7882
- if (!await isDockerImageTagPublished(namespace, "assistant", platformTag)) throw new Error(`Refusing to update to ${namespace}/assistant:${platformTag}: tag is not published. stack.env was left unchanged.`);
7883
- const required = new Set(resolveRequiredPlatformImages(state));
7884
- const perImage = {};
7885
- for (const imageName of ["guardian", "portal"]) {
7886
- if (pinnedImages.includes(imageName)) continue;
7887
- if (await isDockerImageTagPublished(namespace, imageName, platformTag)) continue;
7888
- const fallbackTag = resolveNewestDockerTag(await fetchDockerTagsPayload(namespace, imageName), {
7889
- sameMajorAs: platformTag,
7890
- atOrBelow: platformTag
7891
- });
7892
- if (fallbackTag) {
7893
- perImage[`OP_${imageName.toUpperCase()}_IMAGE_TAG`] = fallbackTag;
7894
- continue;
7895
- }
7896
- if (required.has(imageName)) throw new Error(`Refusing to update to ${namespace}/*:${platformTag}: no published tag found for ${imageName} at or below ${platformTag}. This release is incomplete for the enabled services; stack.env was left unchanged.`);
7897
- }
7898
- return buildPlatformImageTagEnv(platformTag, perImage, pinnedImages);
7899
- }
7900
- function collectPinnedImageWarnings(currentEnv, pinnedImages, platformTag) {
7901
- if (!isComparableSemver(platformTag) || compareComparableVersions(platformTag, AUTH_TRANSITION_BOUNDARY_TAG) < 0) return [];
7902
- const warnings = [];
7903
- for (const image of pinnedImages) {
7904
- const pinnedTag = resolveEffectivePlatformImageTag(currentEnv, image);
7905
- if (!isComparableSemver(pinnedTag) || compareComparableVersions(pinnedTag, AUTH_TRANSITION_BOUNDARY_TAG) >= 0) continue;
7906
- warnings.push(JSON.stringify({
7907
- event: "unsupported-cross-boundary-pin",
7908
- service: image,
7909
- pinnedTag,
7910
- platformTag,
7911
- message: `Pinned ${image} image ${pinnedTag} is older than ${AUTH_TRANSITION_BOUNDARY_TAG} while the platform tag is ${platformTag}. Mixed-auth pinning across the 0.12 boundary is unsupported.`
7912
- }));
7913
- }
7914
- return warnings;
7915
- }
7916
- /**
7917
- * Resolve the newest published tag for a SPECIFIC image on Docker Hub.
7918
- *
7919
- * `assistant` is the version-of-record image, but with independently versioned
7920
- * units each image (guardian, portal, voice) has its own release line. This
7921
- * resolves the newest semver tag for the given image name so a per-unit update
7922
- * check compares against the unit's own latest, not the assistant's.
7923
- *
7924
- * Used both to auto-detect during "Update now" and to resolve a requested
7925
- * `latest` selection into a concrete release tag before fetching stack assets
7926
- * (GitHub has no asset tree at a `latest` ref).
7927
- */
7928
- async function resolveLatestImageTag(namespace, imageName) {
7929
- const latestTag = resolveNewestDockerTag(await fetchDockerTagsPayload(namespace, imageName), {});
7930
- if (!latestTag) throw new Error(`No usable Docker image tag found for ${namespace}/${imageName}`);
7931
- return latestTag;
7932
- }
7933
- /**
7934
- * Resolve the newest published tag for a SPECIFIC image, scoped to the current
7935
- * major version of `currentTag`. Mirrors {@link resolveLatestImageTag} with the
7936
- * same major-scoping + prerelease policy as the platform resolver.
7937
- */
7938
- async function resolveLatestImageTagForCurrentMajor(namespace, imageName, currentTag, opts = {}) {
7939
- const skipPrerelease = !opts.allowPrerelease && !isPrerelease(currentTag);
7940
- const latestTag = resolveNewestDockerTag(await fetchDockerTagsPayload(namespace, imageName), {
7941
- sameMajorAs: currentTag,
7942
- skipPrerelease
7943
- });
7944
- if (!latestTag) throw new Error(`No usable Docker image tag found for ${namespace}/${imageName} in major ${majorVersionOf(currentTag) ?? currentTag}`);
7945
- return latestTag;
7946
- }
7947
- /**
7948
- * List published Docker image tags for a SPECIFIC image, filtered + sorted.
7949
- *
7950
- * Mirrors {@link resolveLatestImageTag} / {@link resolveLatestImageTagForCurrentMajor}
7951
- * but returns ALL matching tags (not just the newest), sorted newest (highest
7952
- * semver) first. Used by the admin UI's per-unit version picker dropdowns so the
7953
- * user can pin/rollback to any published tag — Docker Hub is the authoritative
7954
- * source for what's available to deploy, per unit.
7955
- *
7956
- * Constraints (all optional):
7957
- * - `sameMajorAs` — only tags whose major component matches this tag.
7958
- * - `skipPrerelease` — ignore prerelease tags (`-rc`, `-beta`, …). Default false
7959
- * so the picker shows every tag on the line, including rcs.
7960
- * - `max` — cap the returned list (default 20).
7961
- *
7962
- * Tags are returned in Docker-canonical form (`v`-prefixed, as Docker Hub returns
7963
- * them). The UI strips the `v` for display via `formatForDisplay`.
7964
- */
7965
- async function listDockerImageTags(namespace, imageName, opts = {}) {
7966
- const { sameMajorAs, skipPrerelease = false, max = 20 } = opts;
7967
- const results = (await fetchDockerTagsPayload(namespace, imageName))?.results;
7968
- if (!Array.isArray(results)) return [];
7969
- const tags = [];
7970
- for (const entry of results) {
7971
- const name = typeof entry?.name === "string" ? entry.name.trim() : "";
7972
- if (!name || name === "latest") continue;
7973
- if (!isComparableSemver(name)) continue;
7974
- if (skipPrerelease && isPrerelease(name)) continue;
7975
- if (sameMajorAs !== void 0 && !isSameMajorVersion(name, sameMajorAs)) continue;
7976
- tags.push(name);
7977
- }
7978
- tags.sort((a, b) => compareComparableVersions(b, a));
7979
- return tags.slice(0, max);
7980
- }
7981
- /**
7982
- * Resolve the newest published platform tag from the Docker registry.
7983
- *
7984
- * `assistant` is the version-of-record image: its newest tag is the canonical
7985
- * platform version. Guardian/portal may lag behind it when a release shipped
7986
- * only a subset of images — see resolvePlatformImageTags.
7987
- *
7988
- * Used both to auto-detect during "Update now" and to resolve a requested
7989
- * `latest` selection into a concrete release tag before fetching stack assets
7990
- * (GitHub has no asset tree at a `latest` ref).
7991
- */
7992
- async function resolveLatestPlatformTag(namespace) {
7993
- return resolveLatestImageTag(namespace, "assistant");
7994
- }
7995
- /**
7996
- * Resolve the default target version for `openpalm migrate --dry-run`: the
7997
- * newest published platform tag in the current major. Mirrors the resolver the
7998
- * upgrade path uses (same namespace, same base tag, same prerelease policy) so a
7999
- * dry-run preview reflects the exact version `openpalm update` would move to.
8000
- */
8001
- async function resolveDefaultMigrateTarget(state, opts = {}) {
8002
- return resolveLatestPlatformTagForCurrentMajor(resolveImageNamespace(state), resolvePlatformVersionPolicyBaseTag(state), { allowPrerelease: opts.allowPrerelease });
8003
- }
8004
- async function resolveLatestPlatformTagForCurrentMajor(namespace, currentTag, opts = {}) {
8005
- return resolveLatestImageTagForCurrentMajor(namespace, "assistant", currentTag, opts);
8006
- }
8007
- async function updateStackEnvToLatestImageTag(state, resolvedTag) {
8008
- const systemEnvPath = `${state.stashDir}/env/stack.env`;
8009
- const currentEnv = parseEnvFile(systemEnvPath);
8010
- const pinnedImages = parsePinnedImages(currentEnv.OP_PINNED_IMAGES);
8011
- const namespace = resolveImageNamespace(state);
8012
- const latestTag = resolvedTag ?? await resolveLatestPlatformTagForCurrentMajor(namespace, resolvePlatformVersionPolicyBaseTag(state));
8013
- const imageTagEnv = await resolvePlatformImageTags(state, namespace, latestTag, pinnedImages);
8014
- const pinnedImageEnv = buildPinnedImageTagEnv(currentEnv, pinnedImages);
8015
- const warnings = collectPinnedImageWarnings(currentEnv, pinnedImages, latestTag);
8016
- writeFileSync(systemEnvPath, mergeEnvContent(existsSync(systemEnvPath) ? readFileSync(systemEnvPath, "utf-8") : "", {
8017
- ...pinnedImageEnv,
8018
- ...imageTagEnv
8019
- }));
8020
- return {
8021
- namespace,
8022
- tag: latestTag,
8023
- warnings
8024
- };
8025
- }
8026
7768
  async function applyUpgrade(state, version, opts) {
8027
7769
  const lock = resolveLifecycleLock(state, opts);
8028
7770
  if (!lock) throw new Error("Another install is already in progress");
@@ -8071,22 +7813,25 @@ async function withStackEnvRollback(state, run) {
8071
7813
  }
8072
7814
  }
8073
7815
  /**
8074
- * Full upgrade: resolve latest image tag, refresh assets, pull images,
8075
- * and recreate containers. Used by both the admin endpoint and CLI.
7816
+ * Update the stack to the running control-plane version: run forward release
7817
+ * migrations, refresh core stack assets (compose/config) for PLATFORM_VERSION,
7818
+ * then pull images and recreate containers honoring the per-image OP_*_VERSION
7819
+ * pins already written in stack.env.
8076
7820
  *
8077
- * Callers handle their own audit logging and admin self-recreation.
7821
+ * There are NO Docker Hub calls: image versions are user-managed in stack.env
7822
+ * (PATCH /admin/versions), and the platform asset version is the running lib's
7823
+ * PLATFORM_VERSION — never resolved from a remote registry.
8078
7824
  */
8079
- async function performUpgrade(state, opts = {}) {
7825
+ async function performUpgrade(state, _opts = {}) {
8080
7826
  return withStackEnvRollback(state, async () => {
8081
7827
  const composeOpts = buildComposeOptions(state);
8082
7828
  const namespace = resolveImageNamespace(state);
8083
- const imageTag = await resolveLatestPlatformTagForCurrentMajor(namespace, resolvePlatformVersionPolicyBaseTag(state), { allowPrerelease: opts.allowPrerelease });
7829
+ const releaseTag = "platform-" + normalizeVersion(PLATFORM_VERSION);
8084
7830
  ensureReleaseMigrated({
8085
7831
  homeDir: state.homeDir,
8086
- targetVersion: imageTag
7832
+ targetVersion: PLATFORM_VERSION
8087
7833
  });
8088
- const { tag: confirmedImageTag, warnings } = await updateStackEnvToLatestImageTag(state, imageTag);
8089
- const upgradeResult = await applyUpgrade(state, "platform-" + normalizeVersion(confirmedImageTag));
7834
+ const upgradeResult = await applyUpgrade(state, releaseTag);
8090
7835
  const pullResult = await composePull(composeOpts);
8091
7836
  if (!pullResult.ok) throw new Error(`Failed to pull images: ${pullResult.stderr}`);
8092
7837
  const services = await buildManagedServices(state);
@@ -8098,134 +7843,11 @@ async function performUpgrade(state, opts = {}) {
8098
7843
  });
8099
7844
  if (!upResult.ok) throw new Error(`Images pulled but failed to recreate containers: ${upResult.stderr}`);
8100
7845
  return {
8101
- imageTag: confirmedImageTag,
8102
- namespace,
8103
- backupDir: upgradeResult.backupDir,
8104
- assetsUpdated: upgradeResult.updated,
8105
- restarted: upgradeResult.restarted,
8106
- warnings
8107
- };
8108
- });
8109
- }
8110
- /**
8111
- * Set a specific image tag in stack.env then pull images and restart containers.
8112
- * Used by the admin "set version" action — skips the auto-detect step in performUpgrade.
8113
- */
8114
- async function applyTagChange(state, tag, opts = {}) {
8115
- return withStackEnvRollback(state, async () => {
8116
- const namespace = resolveImageNamespace(state);
8117
- const requested = tag.trim();
8118
- let resolvedTag = requested;
8119
- if (requested === "" || requested.toLowerCase() === "latest") try {
8120
- resolvedTag = await resolveLatestPlatformTag(namespace);
8121
- } catch (e) {
8122
- const msg = e instanceof Error ? e.message : String(e);
8123
- throw new Error(`Cannot resolve "latest" to a concrete release: ${msg}. Check your network connection or select a specific version.`);
8124
- }
8125
- assertNotUnconfirmedDowngrade(state, resolvedTag, opts.confirmDowngrade ?? false);
8126
- const dockerTag = extractDockerTagFromReleaseTag(resolvedTag);
8127
- const stackEnvPath = `${state.stashDir}/env/stack.env`;
8128
- const currentEnv = parseEnvFile(stackEnvPath);
8129
- const pinnedImages = parsePinnedImages(currentEnv.OP_PINNED_IMAGES);
8130
- const imageTagEnv = await resolvePlatformImageTags(state, namespace, dockerTag, pinnedImages);
8131
- const pinnedImageEnv = buildPinnedImageTagEnv(currentEnv, pinnedImages);
8132
- const warnings = collectPinnedImageWarnings(currentEnv, pinnedImages, dockerTag);
8133
- ensureReleaseMigrated({
8134
- homeDir: state.homeDir,
8135
- targetVersion: resolvedTag
8136
- });
8137
- writeFileSync(stackEnvPath, mergeEnvContent(existsSync(stackEnvPath) ? readFileSync(stackEnvPath, "utf-8") : "", {
8138
- ...pinnedImageEnv,
8139
- ...imageTagEnv
8140
- }));
8141
- const upgradeResult = await applyUpgrade(state, resolvedTag);
8142
- return {
8143
- imageTag: dockerTag,
7846
+ imageTag: PLATFORM_VERSION,
8144
7847
  namespace,
8145
7848
  backupDir: upgradeResult.backupDir,
8146
7849
  assetsUpdated: upgradeResult.updated,
8147
7850
  restarted: upgradeResult.restarted,
8148
- warnings
8149
- };
8150
- });
8151
- }
8152
- /**
8153
- * Read the currently-configured image tag for a single deployable unit from
8154
- * stack.env. Falls back to OP_IMAGE_TAG (the compose substitution fallback) and
8155
- * finally PLATFORM_VERSION, mirroring the compose `${OP_*_IMAGE_TAG:-…}` chain.
8156
- */
8157
- function resolveUnitCurrentTag(state, unit) {
8158
- const envVars = parseEnvFile(`${state.stashDir}/env/stack.env`);
8159
- const tag = envVars[deployableUnitImageTagKey(unit)]?.trim() || envVars.OP_IMAGE_TAG?.trim();
8160
- if (isComparableSemver(tag)) return tag;
8161
- return PLATFORM_VERSION;
8162
- }
8163
- /**
8164
- * Per-unit downgrade gate (#501). A target OLDER than the unit's CURRENT tag is
8165
- * a downgrade — forward-only release migrations don't run backward, so require
8166
- * explicit confirmation. Compared against the unit's own tag (not the platform
8167
- * OP_IMAGE_TAG) so pinning guardian back a patch doesn't trip on the assistant
8168
- * version.
8169
- */
8170
- function assertNotUnconfirmedUnitDowngrade(state, unit, targetTag, confirmDowngrade) {
8171
- if (confirmDowngrade) return;
8172
- const currentTag = resolveUnitCurrentTag(state, unit);
8173
- if (!isComparableSemver(targetTag) || !isComparableSemver(currentTag)) return;
8174
- if (compareComparableVersions(targetTag, currentTag) >= 0) return;
8175
- throw new DowngradeConfirmationRequired(currentTag, targetTag);
8176
- }
8177
- /**
8178
- * Pin a SINGLE deployable unit's image tag in stack.env, then pull + recreate.
8179
- *
8180
- * Unlike {@link applyTagChange} (a full platform upgrade), this writes only the
8181
- * one `OP_*_IMAGE_TAG` env var for the named unit and does NOT run release
8182
- * migrations or refresh stack compose assets — those are platform-level and run
8183
- * on `performUpgrade` / `applyTagChange`. Per-unit pinning is for rolling one
8184
- * image back to a known-good release or pinning it to a tested build without
8185
- * moving the rest of the stack.
8186
- *
8187
- * Non-destructive: the write uses `mergeEnvContent` so existing user keys
8188
- * (including commented-out ones) are preserved.
8189
- */
8190
- async function applyUnitImageTagChange(state, unit, tag, opts = {}) {
8191
- if (!isDeployableUnit(unit)) throw new Error(`Unknown deployable unit: ${unit}`);
8192
- const typedUnit = unit;
8193
- return withStackEnvRollback(state, async () => {
8194
- const namespace = resolveImageNamespace(state);
8195
- const imageName = deployableUnitImageName(typedUnit);
8196
- const envKey = deployableUnitImageTagKey(typedUnit);
8197
- const requested = tag.trim();
8198
- let resolvedTag = requested;
8199
- if (requested === "" || requested.toLowerCase() === "latest") try {
8200
- resolvedTag = await resolveLatestImageTag(namespace, imageName);
8201
- } catch (e) {
8202
- const msg = e instanceof Error ? e.message : String(e);
8203
- throw new Error(`Cannot resolve "latest" to a concrete release for ${typedUnit}: ${msg}. Check your network connection or select a specific version.`);
8204
- }
8205
- assertNotUnconfirmedUnitDowngrade(state, typedUnit, resolvedTag, opts.confirmDowngrade ?? false);
8206
- const dockerTag = extractDockerTagFromReleaseTag(resolvedTag);
8207
- if (namespace === "openpalm") {
8208
- if (!await isDockerImageTagPublished(namespace, imageName, dockerTag)) throw new Error(`Refusing to pin ${namespace}/${imageName}:${dockerTag}: tag is not published. stack.env was left unchanged.`);
8209
- }
8210
- const stackEnvPath = `${state.stashDir}/env/stack.env`;
8211
- writeFileSync(stackEnvPath, mergeEnvContent(existsSync(stackEnvPath) ? readFileSync(stackEnvPath, "utf-8") : "", { [envKey]: dockerTag }));
8212
- const composeOpts = buildComposeOptions(state);
8213
- const pullResult = await composePull(composeOpts);
8214
- if (!pullResult.ok) throw new Error(`Failed to pull images: ${pullResult.stderr}`);
8215
- const services = await buildManagedServices(state);
8216
- const upResult = await composeUp({
8217
- ...composeOpts,
8218
- services,
8219
- forceRecreate: true,
8220
- removeOrphans: true
8221
- });
8222
- if (!upResult.ok) throw new Error(`Images pulled but failed to recreate containers: ${upResult.stderr}`);
8223
- return {
8224
- imageTag: dockerTag,
8225
- namespace,
8226
- backupDir: null,
8227
- assetsUpdated: [],
8228
- restarted: services,
8229
7851
  warnings: []
8230
7852
  };
8231
7853
  });
@@ -8536,7 +8158,8 @@ function parseComposePsOutput(stdout) {
8536
8158
  return results;
8537
8159
  }
8538
8160
  function resolveImageTag(state) {
8539
- return parseEnvFile(`${state.stashDir}/env/stack.env`).OP_IMAGE_TAG ?? "";
8161
+ const env = parseEnvFile(`${state.stashDir}/env/stack.env`);
8162
+ return env.OP_ASSISTANT_VERSION ?? env.OP_IMAGE_TAG ?? "";
8540
8163
  }
8541
8164
  async function missingServiceImages(composeOpts, services) {
8542
8165
  if (services.length === 0) return [];
@@ -9412,71 +9035,6 @@ async function validateProposedState(state) {
9412
9035
  };
9413
9036
  }
9414
9037
  //#endregion
9415
- //#region ../lib/src/control-plane/npm-registry.ts
9416
- /**
9417
- * npm registry lookups — latest version + version list for any npm package.
9418
- *
9419
- * The admin UI's "Admin interface" picker (@openpalm/ui) and the platform
9420
- * latest-version check (@openpalm/lib) both read from the npm registry. Keeping
9421
- * these helpers in lib (not duplicated in the UI) follows the shared control-
9422
- * plane library rule: both CLI and admin import portable lookups from
9423
- * `@openpalm/lib`.
9424
- *
9425
- * Uses the Web Platform `fetch` built-in — no third-party deps.
9426
- */
9427
- var NPM_REGISTRY = "https://registry.npmjs.org";
9428
- var NPM_TIMEOUT_MS = 8e3;
9429
- async function fetchNpmPackument(packageName) {
9430
- let response;
9431
- try {
9432
- response = await fetch(`${NPM_REGISTRY}/${packageName}`, {
9433
- headers: {
9434
- "User-Agent": "openpalm-admin/1.0",
9435
- Accept: "application/json"
9436
- },
9437
- signal: AbortSignal.timeout(NPM_TIMEOUT_MS)
9438
- });
9439
- } catch (e) {
9440
- throw new Error(`Failed to query npm registry: ${e instanceof Error ? e.message : String(e)}`);
9441
- }
9442
- if (response.status === 404) return {};
9443
- if (!response.ok) throw new Error(`npm registry lookup failed (${response.status})`);
9444
- return await response.json();
9445
- }
9446
- /**
9447
- * Resolve the latest published version of an npm package from its dist-tags.
9448
- *
9449
- * `distTag` defaults to `'latest'`; pass `{ allowPrerelease: true }` (or
9450
- * `{ distTag: 'next' }`) to read the prerelease channel. Returns `null` when the
9451
- * package exists but the requested dist-tag is absent.
9452
- */
9453
- async function resolveLatestNpmVersion(packageName, opts = {}) {
9454
- const distTag = opts.distTag ?? (opts.allowPrerelease ? "next" : "latest");
9455
- const version = ((await fetchNpmPackument(packageName))["dist-tags"] ?? {})[distTag];
9456
- return typeof version === "string" ? version : null;
9457
- }
9458
- /**
9459
- * List published npm versions for a package, newest-first by publish time.
9460
- *
9461
- * Mirrors the shape the admin UI's `@openpalm/ui` picker expects. Returns at
9462
- * most `max` entries (default 20). A 404 (package not yet published) yields an
9463
- * empty list.
9464
- */
9465
- async function listNpmVersions(packageName, opts = {}) {
9466
- const { max = 20 } = opts;
9467
- const packument = await fetchNpmPackument(packageName);
9468
- const distTags = packument["dist-tags"] ?? {};
9469
- const versionToTag = /* @__PURE__ */ new Map();
9470
- for (const [tag, version] of Object.entries(distTags)) versionToTag.set(version, tag);
9471
- const time = packument.time ?? {};
9472
- return Object.keys(packument.versions ?? {}).map((version) => ({
9473
- version,
9474
- prerelease: version.includes("-"),
9475
- publishedAt: time[version] ?? null,
9476
- distTag: versionToTag.get(version) ?? null
9477
- })).sort((a, b) => (b.publishedAt ?? "").localeCompare(a.publishedAt ?? "")).slice(0, max);
9478
- }
9479
- //#endregion
9480
9038
  //#region ../lib/src/control-plane/markdown-task.ts
9481
9039
  /**
9482
9040
  * AKM task parser.
@@ -10455,7 +10013,8 @@ async function performSetup(input, opts) {
10455
10013
  try {
10456
10014
  const systemEnvForAkm = existsSync(`${state.stashDir}/env/stack.env`) ? readFileSync(`${state.stashDir}/env/stack.env`, "utf-8") : "";
10457
10015
  const akmUpdates = {};
10458
- Object.assign(akmUpdates, buildPlatformImageTagEnv(imageTag && imageTag.trim() ? imageTag.trim() : DEFAULT_IMAGE_TAG));
10016
+ const requestedTag = imageTag && imageTag.trim() ? imageTag.trim() : "latest";
10017
+ for (const key of SERVICE_VERSION_KEYS) akmUpdates[key] = requestedTag;
10459
10018
  if (Object.keys(akmUpdates).length > 0) writeFileAtomic(`${state.stashDir}/env/stack.env`, mergeEnvContent(systemEnvForAkm, akmUpdates), 384);
10460
10019
  if (llm || embedding) {
10461
10020
  const akmConfigDir = join(state.configDir, "akm");
@@ -10911,5 +10470,5 @@ function collectBindAddressWarnings(env) {
10911
10470
  return warnings;
10912
10471
  }
10913
10472
 
10914
- export { ensureOpenCodeSystemConfig as $, AKM_USER_ENV_REF as A, BackupSpaceError as B, CORE_SERVICES as C, DowngradeConfirmationRequired as D, composeStats as E, composeStop as F, composeUp as G, createLogger as H, INSTALL_LOCK_STALE_AFTER_MS as I, createOpenCodeClient as J, createState as K, deleteUserEnvKey as L, MigrationError as M, deriveLaunchStatus as N, deriveLocalStackState as O, PLATFORM_VERSION as P, detectGpu as Q, detectHostOpenCode as R, detectLocalProviders as S, detectRuntime as T, disableHostAkmSharing as U, dismissSecretStripNotice as V, enableHostAkmSharing as W, ensureAkmUserEnv as X, ensureHomeDirs as Y, ensureMigrated as Z, ensureOpenCodeConfig as _, addonProfileId as a, runDeploy as a$, ensureReleaseMigrated as a0, ensureSecrets as a1, executeAutomation as a2, fetchProviderModels as a3, formatForDisplay as a4, getAddonProfileAvailability as a5, getAddonProfileSelection as a6, getAddonProfiles as a7, getAddonServiceNames as a8, getAkmStats as a9, performSetup as aA, performUpgrade as aB, pruneBackupDirs as aC, readAutomationLogs as aD, readDeployJournal as aE, readSecret as aF, readSecretFile as aG, readSecretStripNotice as aH, readStackEnv as aI, readStackRuntimeEnv as aJ, readStackSecretEnv as aK, readTaskFile as aL, readUserEnvFile as aM, recommendSetup as aN, removeSecretFile as aO, removeTaskFile as aP, resolveComposeProjectName as aQ, resolveDataDir as aR, resolveDefaultMigrateTarget as aS, resolveDeployJournalPath as aT, resolveEffectivePlatformImageTag as aU, resolveLatestImageTag as aV, resolveLatestImageTagForCurrentMajor as aW, resolveLatestNpmVersion as aX, resolveRuntimeFiles as aY, resolveStackDir as aZ, runAssistantAkmCommand as a_, getDockerEvents as aa, getHostAkmSharingStatus as ab, getRegistryAddonConfig as ac, hostAkmStashPath as ad, importHostOpenCode as ae, initializeStateSecrets as af, inspectInstallLock as ag, isAllowedService as ah, isComparableSemver as ai, isDeployableUnit as aj, isHostAkmAvailable as ak, isPrerelease as al, isSetupComplete as am, listAssistantCliTools as an, listAvailableAddonIds as ao, listBackupDirs as ap, listDockerImageTags as aq, listEnabledAddonIds as ar, listNpmVersions as as, listSecretFiles as at, loadAutomations as au, mapDockerError as av, markSetupComplete as aw, parseComposeStderr as ax, parseEnvFile as ay, patchSecretsEnvFile as az, annotateAddonProfileAvailability as b, seedUiBuild as b0, setAddonEnabled as b1, setAddonProfileSelection as b2, summarizeBackups as b3, summarizeComposeStderr as b4, unlockInstallLock as b5, useExistingProviderForAssistantCli as b6, validateProposedState as b7, writeFileAtomic as b8, writeRuntimeFiles as b9, writeSecretFile as ba, writeStackSecretEnv as bb, writeTaskFile as bc, writeUserEnvKey as bd, writeVoiceVars as be, applyInstall as c, applyTagChange as d, applyUninstall as e, applyUnitImageTagChange as f, applyUpdate as g, assertSafeSecretFilename as h, assertSafeTaskFilename as i, authJsonPath as j, backupSetupInputs as k, buildAkmEndpoint as l, buildAkmEnv as m, buildComposeOptions as n, buildManagedServices as o, checkDocker as p, checkDockerCompose as q, classifyLocalInstall as r, collectBindAddressWarnings as s, composeDown as t, composeLogs as u, composePreflight as v, composePs as w, composePull as x, composeRestart as y, composeStart as z };
10915
- //# sourceMappingURL=src-B3g4Ry1X.js.map
10473
+ export { ensureSecrets as $, AKM_USER_ENV_REF as A, BackupSpaceError as B, CORE_SERVICES as C, composeStop as D, composeUp as E, createLogger as F, createOpenCodeClient as G, createState as H, INSTALL_LOCK_STALE_AFTER_MS as I, deleteUserEnvKey as J, deriveLaunchStatus as K, deriveLocalStackState as L, MigrationError as M, detectGpu as N, detectHostOpenCode as O, PLATFORM_VERSION as P, detectLocalProviders as Q, detectRuntime as R, disableHostAkmSharing as S, dismissSecretStripNotice as T, enableHostAkmSharing as U, ensureAkmUserEnv as V, ensureHomeDirs as W, ensureMigrated as X, ensureOpenCodeConfig as Y, ensureOpenCodeSystemConfig as Z, ensureReleaseMigrated as _, ALL_VERSION_KEYS as a, writeSecretFile as a$, executeAutomation as a0, fetchProviderModels as a1, formatForDisplay as a2, getAddonProfileAvailability as a3, getAddonProfileSelection as a4, getAddonProfiles as a5, getAddonServiceNames as a6, getAkmStats as a7, getDockerEvents as a8, getHostAkmSharingStatus as a9, readSecretStripNotice as aA, readStackEnv as aB, readStackRuntimeEnv as aC, readStackSecretEnv as aD, readTaskFile as aE, readUserEnvFile as aF, readVersions as aG, recommendSetup as aH, removeSecretFile as aI, removeTaskFile as aJ, resolveComposeProjectName as aK, resolveDataDir as aL, resolveDeployJournalPath as aM, resolveRuntimeFiles as aN, resolveStackDir as aO, runAssistantAkmCommand as aP, runDeploy as aQ, seedUiBuild as aR, setAddonEnabled as aS, setAddonProfileSelection as aT, summarizeBackups as aU, summarizeComposeStderr as aV, unlockInstallLock as aW, useExistingProviderForAssistantCli as aX, validateProposedState as aY, writeFileAtomic as aZ, writeRuntimeFiles as a_, getRegistryAddonConfig as aa, hostAkmStashPath as ab, importHostOpenCode as ac, initializeStateSecrets as ad, inspectInstallLock as ae, isAllowedService as af, isHostAkmAvailable as ag, isPrerelease as ah, isSetupComplete as ai, listAssistantCliTools as aj, listAvailableAddonIds as ak, listBackupDirs as al, listEnabledAddonIds as am, listSecretFiles as an, loadAutomations as ao, mapDockerError as ap, markSetupComplete as aq, parseComposeStderr as ar, patchSecretsEnvFile as as, performSetup as at, performUpgrade as au, pruneBackupDirs as av, readAutomationLogs as aw, readDeployJournal as ax, readSecret as ay, readSecretFile as az, addonProfileId as b, writeStackSecretEnv as b0, writeTaskFile as b1, writeUserEnvKey as b2, writeVersions as b3, writeVoiceVars as b4, annotateAddonProfileAvailability as c, applyInstall as d, applyUninstall as e, applyUpdate as f, assertSafeSecretFilename as g, assertSafeTaskFilename as h, authJsonPath as i, backupSetupInputs as j, buildAkmEndpoint as k, buildAkmEnv as l, buildComposeOptions as m, buildManagedServices as n, checkDocker as o, checkDockerCompose as p, classifyLocalInstall as q, collectBindAddressWarnings as r, composeDown as s, composeLogs as t, composePreflight as u, composePs as v, composePull as w, composeRestart as x, composeStart as y, composeStats as z };
10474
+ //# sourceMappingURL=src-DPd0Zos1.js.map