@openpalm/ui 0.12.18 → 0.12.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/.openpalm-ui-version +1 -1
- package/build/client/_app/immutable/assets/4.DQdAwaDZ.css +1 -0
- package/build/client/_app/immutable/assets/4.DQdAwaDZ.css.br +0 -0
- package/build/client/_app/immutable/assets/4.DQdAwaDZ.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B88bDQ93.js +1 -0
- package/build/client/_app/immutable/chunks/B88bDQ93.js.br +2 -0
- package/build/client/_app/immutable/chunks/B88bDQ93.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B8C5qi9U.js → BjCyXDZy.js} +1 -1
- package/build/client/_app/immutable/chunks/BjCyXDZy.js.br +0 -0
- package/build/client/_app/immutable/chunks/BjCyXDZy.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CAAiIhwC.js +3 -0
- package/build/client/_app/immutable/chunks/CAAiIhwC.js.br +0 -0
- package/build/client/_app/immutable/chunks/CAAiIhwC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DYXGFYr6.js → CP1N4Jy5.js} +1 -1
- package/build/client/_app/immutable/chunks/CP1N4Jy5.js.br +0 -0
- package/build/client/_app/immutable/chunks/CP1N4Jy5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Dcw6L0GF.js → CgDyA2Qw.js} +2 -2
- package/build/client/_app/immutable/chunks/CgDyA2Qw.js.br +0 -0
- package/build/client/_app/immutable/chunks/CgDyA2Qw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CLgRRUN_.js → DpHEXvQk.js} +1 -1
- package/build/client/_app/immutable/chunks/DpHEXvQk.js.br +0 -0
- package/build/client/_app/immutable/chunks/DpHEXvQk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dr8nRIOR.js +1 -0
- package/build/client/_app/immutable/chunks/Dr8nRIOR.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dr8nRIOR.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.CVxCoIFs.js → app.BcL08IcT.js} +2 -2
- package/build/client/_app/immutable/entry/app.BcL08IcT.js.br +0 -0
- package/build/client/_app/immutable/entry/app.BcL08IcT.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CAuRWqZB.js +1 -0
- package/build/client/_app/immutable/entry/start.CAuRWqZB.js.br +0 -0
- package/build/client/_app/immutable/entry/start.CAuRWqZB.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.Bb8qAGW8.js → 0.AZnG4POF.js} +1 -1
- package/build/client/_app/immutable/nodes/0.AZnG4POF.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.AZnG4POF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.Co_TaqLI.js → 1.uNWROKRa.js} +1 -1
- package/build/client/_app/immutable/nodes/1.uNWROKRa.js.br +2 -0
- package/build/client/_app/immutable/nodes/1.uNWROKRa.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.CNN_a8JB.js +126 -0
- package/build/client/_app/immutable/nodes/4.CNN_a8JB.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CNN_a8JB.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.Fw13EXte.js → 5.rZSa9V3W.js} +2 -2
- package/build/client/_app/immutable/nodes/5.rZSa9V3W.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.rZSa9V3W.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{6.CWy0yXnu.js → 6.DUAMcwSm.js} +1 -1
- package/build/client/_app/immutable/nodes/6.DUAMcwSm.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DUAMcwSm.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7.CsM4M8Ul.js → 7.B1u5a8yO.js} +1 -1
- package/build/client/_app/immutable/nodes/7.B1u5a8yO.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.B1u5a8yO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{8.V6hY0p8a.js → 8.DW8zKXS4.js} +1 -1
- package/build/client/_app/immutable/nodes/8.DW8zKXS4.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.DW8zKXS4.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +1 -1
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/{0-DrD9dfbN.js → 0-DL6Jfu7F.js} +3 -3
- package/build/server/chunks/{0-DrD9dfbN.js.map → 0-DL6Jfu7F.js.map} +1 -1
- package/build/server/chunks/1-B2LhxwPN.js +9 -0
- package/build/server/chunks/{1-DvZDBGww.js.map → 1-B2LhxwPN.js.map} +1 -1
- package/build/server/chunks/{10-C96Thueb.js → 10-DQCiYDxy.js} +5 -5
- package/build/server/chunks/10-DQCiYDxy.js.map +1 -0
- package/build/server/chunks/4-2GARyIXu.js +9 -0
- package/build/server/chunks/{4-BYdi8hv_.js.map → 4-2GARyIXu.js.map} +1 -1
- package/build/server/chunks/{5-DIQyHPcz.js → 5-BPq_SUbr.js} +3 -3
- package/build/server/chunks/{5-DIQyHPcz.js.map → 5-BPq_SUbr.js.map} +1 -1
- package/build/server/chunks/6-Bnw_JRXO.js +9 -0
- package/build/server/chunks/{6-BsZngRIA.js.map → 6-Bnw_JRXO.js.map} +1 -1
- package/build/server/chunks/{7-CXWUMHvV.js → 7-ZktGMDHm.js} +3 -3
- package/build/server/chunks/{7-CXWUMHvV.js.map → 7-ZktGMDHm.js.map} +1 -1
- package/build/server/chunks/{8-l173yBhm.js → 8-V3DHLq7L.js} +3 -3
- package/build/server/chunks/{8-l173yBhm.js.map → 8-V3DHLq7L.js.map} +1 -1
- package/build/server/chunks/{IconMic-BM_3hm2T.js → IconMic-DK0ZRKNm.js} +2 -2
- package/build/server/chunks/{IconMic-BM_3hm2T.js.map → IconMic-DK0ZRKNm.js.map} +1 -1
- package/build/server/chunks/{Navbar-BZ_eb99a.js → Navbar-CRs8Q1Ed.js} +5 -5
- package/build/server/chunks/{Navbar-BZ_eb99a.js.map → Navbar-CRs8Q1Ed.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-Dd-1jqRZ.js → _layout.svelte-CtPb7AoM.js} +2 -2
- package/build/server/chunks/{_layout.svelte-Dd-1jqRZ.js.map → _layout.svelte-CtPb7AoM.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Bbooaanj.js → _page.svelte-BtDkjht-.js} +7 -7
- package/build/server/chunks/{_page.svelte-Bbooaanj.js.map → _page.svelte-BtDkjht-.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-D0wEoV5A.js → _page.svelte-CXr3izpr.js} +5 -5
- package/build/server/chunks/{_page.svelte-D0wEoV5A.js.map → _page.svelte-CXr3izpr.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-WYgjKj38.js → _page.svelte-D6dWiRVl.js} +31 -715
- package/build/server/chunks/_page.svelte-D6dWiRVl.js.map +1 -0
- package/build/server/chunks/{_page.svelte-C4jw4RUN.js → _page.svelte-Lhm6ya_b.js} +3 -3
- package/build/server/chunks/{_page.svelte-C4jw4RUN.js.map → _page.svelte-Lhm6ya_b.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-E9h2ASFv.js → _page.svelte-m5t0OVcz.js} +7 -7
- package/build/server/chunks/{_page.svelte-E9h2ASFv.js.map → _page.svelte-m5t0OVcz.js.map} +1 -1
- package/build/server/chunks/{_server.ts-_qXm__Gf.js → _server.ts-7h410aJe.js} +5 -5
- package/build/server/chunks/{_server.ts-_qXm__Gf.js.map → _server.ts-7h410aJe.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Baeek88H.js → _server.ts-B-io71lH.js} +5 -5
- package/build/server/chunks/_server.ts-B-io71lH.js.map +1 -0
- package/build/server/chunks/{_server.ts-BnNG0uRK.js → _server.ts-B7oFBy_Y.js} +6 -6
- package/build/server/chunks/{_server.ts-BnNG0uRK.js.map → _server.ts-B7oFBy_Y.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B8D1t67g.js → _server.ts-BEsxh5-r.js} +7 -7
- package/build/server/chunks/_server.ts-BEsxh5-r.js.map +1 -0
- package/build/server/chunks/{_server.ts-DM6Jm6KP.js → _server.ts-BFQCNuCf.js} +5 -5
- package/build/server/chunks/_server.ts-BFQCNuCf.js.map +1 -0
- package/build/server/chunks/{_server.ts-DXoq1VzO.js → _server.ts-BIJomr8k.js} +5 -5
- package/build/server/chunks/_server.ts-BIJomr8k.js.map +1 -0
- package/build/server/chunks/{_server.ts-CU5_9yaM.js → _server.ts-BJd_BeRX.js} +5 -5
- package/build/server/chunks/{_server.ts-CU5_9yaM.js.map → _server.ts-BJd_BeRX.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BlVBulWB.js → _server.ts-BLnGiLfS.js} +4 -4
- package/build/server/chunks/_server.ts-BLnGiLfS.js.map +1 -0
- package/build/server/chunks/{_server.ts-Decw7JxO.js → _server.ts-BMTnompE.js} +5 -5
- package/build/server/chunks/_server.ts-BMTnompE.js.map +1 -0
- package/build/server/chunks/_server.ts-BTeSTLAx.js +89 -0
- package/build/server/chunks/_server.ts-BTeSTLAx.js.map +1 -0
- package/build/server/chunks/{_server.ts-DFV-gf9Q.js → _server.ts-BaqsSmFS.js} +5 -5
- package/build/server/chunks/{_server.ts-DFV-gf9Q.js.map → _server.ts-BaqsSmFS.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C5jyYbFm.js → _server.ts-BcIPGO7x.js} +17 -8
- package/build/server/chunks/_server.ts-BcIPGO7x.js.map +1 -0
- package/build/server/chunks/{_server.ts-Bxk1V3Ev.js → _server.ts-BdPGrcpF.js} +5 -5
- package/build/server/chunks/{_server.ts-Bxk1V3Ev.js.map → _server.ts-BdPGrcpF.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bx3uIrpl.js → _server.ts-BeXMVrJG.js} +5 -5
- package/build/server/chunks/{_server.ts-Bx3uIrpl.js.map → _server.ts-BeXMVrJG.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DBQ7TD4o.js → _server.ts-BghreOti.js} +5 -5
- package/build/server/chunks/_server.ts-BghreOti.js.map +1 -0
- package/build/server/chunks/{_server.ts-D4tyRvFi.js → _server.ts-Bi33i7c7.js} +2 -2
- package/build/server/chunks/{_server.ts-D4tyRvFi.js.map → _server.ts-Bi33i7c7.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C_dk6ZLP.js → _server.ts-BjSX-JsT.js} +6 -6
- package/build/server/chunks/{_server.ts-C_dk6ZLP.js.map → _server.ts-BjSX-JsT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CuBCKbP8.js → _server.ts-BokcuCWE.js} +6 -6
- package/build/server/chunks/{_server.ts-CuBCKbP8.js.map → _server.ts-BokcuCWE.js.map} +1 -1
- package/build/server/chunks/{_server.ts-2fxcxBzC.js → _server.ts-BwQSiREZ.js} +5 -5
- package/build/server/chunks/_server.ts-BwQSiREZ.js.map +1 -0
- package/build/server/chunks/{_server.ts-CzgA6LXe.js → _server.ts-Bw_r9OtK.js} +5 -5
- package/build/server/chunks/{_server.ts-CzgA6LXe.js.map → _server.ts-Bw_r9OtK.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DYsP_lpr.js → _server.ts-Byn8EbtL.js} +7 -7
- package/build/server/chunks/_server.ts-Byn8EbtL.js.map +1 -0
- package/build/server/chunks/{_server.ts-BRTk2wfW.js → _server.ts-C0b2kLwv.js} +5 -5
- package/build/server/chunks/{_server.ts-BRTk2wfW.js.map → _server.ts-C0b2kLwv.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CFNWzRBr.js → _server.ts-C2dpWx7K.js} +4 -4
- package/build/server/chunks/{_server.ts-CFNWzRBr.js.map → _server.ts-C2dpWx7K.js.map} +1 -1
- package/build/server/chunks/{_server.ts-F0nw0UvB.js → _server.ts-C3asto5q.js} +5 -5
- package/build/server/chunks/{_server.ts-F0nw0UvB.js.map → _server.ts-C3asto5q.js.map} +1 -1
- package/build/server/chunks/{_server.ts-YRWN3sJm.js → _server.ts-C4WOD37G.js} +5 -5
- package/build/server/chunks/{_server.ts-YRWN3sJm.js.map → _server.ts-C4WOD37G.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DilgsSMu.js → _server.ts-C8LFsdDG.js} +5 -5
- package/build/server/chunks/{_server.ts-DilgsSMu.js.map → _server.ts-C8LFsdDG.js.map} +1 -1
- package/build/server/chunks/{_server.ts-wvbMWir6.js → _server.ts-C8xyXBY5.js} +6 -6
- package/build/server/chunks/{_server.ts-wvbMWir6.js.map → _server.ts-C8xyXBY5.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dq8RxTkW.js → _server.ts-CAlt9gW0.js} +5 -5
- package/build/server/chunks/{_server.ts-Dq8RxTkW.js.map → _server.ts-CAlt9gW0.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DPDQh75Z.js → _server.ts-CBEVK-Yt.js} +2 -2
- package/build/server/chunks/{_server.ts-DPDQh75Z.js.map → _server.ts-CBEVK-Yt.js.map} +1 -1
- package/build/server/chunks/_server.ts-CGzgULKV.js +84 -0
- package/build/server/chunks/_server.ts-CGzgULKV.js.map +1 -0
- package/build/server/chunks/{_server.ts-B9iU6foL.js → _server.ts-CJWPhww2.js} +5 -5
- package/build/server/chunks/{_server.ts-B9iU6foL.js.map → _server.ts-CJWPhww2.js.map} +1 -1
- package/build/server/chunks/{_server.ts-ChH8nHr7.js → _server.ts-CLt4mqCt.js} +7 -7
- package/build/server/chunks/{_server.ts-ChH8nHr7.js.map → _server.ts-CLt4mqCt.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CM1BFa2O.js → _server.ts-CQH5FEPp.js} +6 -6
- package/build/server/chunks/_server.ts-CQH5FEPp.js.map +1 -0
- package/build/server/chunks/{_server.ts-IW-zQmmb.js → _server.ts-CRY9d7-F.js} +5 -5
- package/build/server/chunks/_server.ts-CRY9d7-F.js.map +1 -0
- package/build/server/chunks/{_server.ts-DR7y5OQ3.js → _server.ts-CWNf8Ve1.js} +5 -5
- package/build/server/chunks/{_server.ts-DR7y5OQ3.js.map → _server.ts-CWNf8Ve1.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CmyqMhn9.js → _server.ts-C_qyw2yL.js} +5 -5
- package/build/server/chunks/{_server.ts-CmyqMhn9.js.map → _server.ts-C_qyw2yL.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CRVqyjYH.js → _server.ts-CaZ1wy9x.js} +7 -7
- package/build/server/chunks/{_server.ts-CRVqyjYH.js.map → _server.ts-CaZ1wy9x.js.map} +1 -1
- package/build/server/chunks/{_server.ts-kfc0Us0E.js → _server.ts-Cdq3e7xA.js} +5 -5
- package/build/server/chunks/{_server.ts-kfc0Us0E.js.map → _server.ts-Cdq3e7xA.js.map} +1 -1
- package/build/server/chunks/{_server.ts-WePF2DAq.js → _server.ts-ChI4fTd4.js} +5 -5
- package/build/server/chunks/_server.ts-ChI4fTd4.js.map +1 -0
- package/build/server/chunks/{_server.ts-DzCUdAPH.js → _server.ts-CiWKQbiz.js} +5 -5
- package/build/server/chunks/{_server.ts-DzCUdAPH.js.map → _server.ts-CiWKQbiz.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dcawi9b4.js → _server.ts-CtVWuskm.js} +2 -2
- package/build/server/chunks/_server.ts-CtVWuskm.js.map +1 -0
- package/build/server/chunks/{_server.ts-FPubTa2q.js → _server.ts-CwPqNJOY.js} +5 -5
- package/build/server/chunks/{_server.ts-FPubTa2q.js.map → _server.ts-CwPqNJOY.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DdzFOqZm.js → _server.ts-D-pLD7Xu.js} +5 -5
- package/build/server/chunks/{_server.ts-DdzFOqZm.js.map → _server.ts-D-pLD7Xu.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CQM2RG5K.js → _server.ts-D0RXp78c.js} +5 -5
- package/build/server/chunks/{_server.ts-CQM2RG5K.js.map → _server.ts-D0RXp78c.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DRvqTDLx.js → _server.ts-D9jCVXyy.js} +5 -5
- package/build/server/chunks/_server.ts-D9jCVXyy.js.map +1 -0
- package/build/server/chunks/{_server.ts-BMCfB7xN.js → _server.ts-DBFkIfX3.js} +5 -5
- package/build/server/chunks/{_server.ts-BMCfB7xN.js.map → _server.ts-DBFkIfX3.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D-jGSj8O.js → _server.ts-DBRLxv1J.js} +6 -6
- package/build/server/chunks/{_server.ts-D-jGSj8O.js.map → _server.ts-DBRLxv1J.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cap2Myq0.js → _server.ts-DH2KwFMm.js} +9 -6
- package/build/server/chunks/_server.ts-DH2KwFMm.js.map +1 -0
- package/build/server/chunks/{_server.ts-0UwoVmus.js → _server.ts-DN9DIE7V.js} +6 -6
- package/build/server/chunks/{_server.ts-0UwoVmus.js.map → _server.ts-DN9DIE7V.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Brb7lRFE.js → _server.ts-DNQDl4In.js} +5 -5
- package/build/server/chunks/_server.ts-DNQDl4In.js.map +1 -0
- package/build/server/chunks/{_server.ts-D07mQlNk.js → _server.ts-DQCc-bcg.js} +5 -5
- package/build/server/chunks/{_server.ts-D07mQlNk.js.map → _server.ts-DQCc-bcg.js.map} +1 -1
- package/build/server/chunks/{_server.ts-VvJjpVtp.js → _server.ts-DVJYo8_h.js} +6 -6
- package/build/server/chunks/{_server.ts-VvJjpVtp.js.map → _server.ts-DVJYo8_h.js.map} +1 -1
- package/build/server/chunks/{_server.ts-5M6DY-PN.js → _server.ts-DXMBj9CH.js} +8 -8
- package/build/server/chunks/{_server.ts-5M6DY-PN.js.map → _server.ts-DXMBj9CH.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DX3B53H8.js → _server.ts-DY8vqCzu.js} +5 -5
- package/build/server/chunks/{_server.ts-DX3B53H8.js.map → _server.ts-DY8vqCzu.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C9-ewPaY.js → _server.ts-D_iVYIT5.js} +5 -5
- package/build/server/chunks/_server.ts-D_iVYIT5.js.map +1 -0
- package/build/server/chunks/{_server.ts-Dg4ouUjZ.js → _server.ts-Dc-DuHRl.js} +5 -5
- package/build/server/chunks/_server.ts-Dc-DuHRl.js.map +1 -0
- package/build/server/chunks/{_server.ts-CQt3NLuS.js → _server.ts-DeDvsRmd.js} +5 -5
- package/build/server/chunks/{_server.ts-CQt3NLuS.js.map → _server.ts-DeDvsRmd.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bi5ToBtl.js → _server.ts-DgU1uBsl.js} +5 -5
- package/build/server/chunks/{_server.ts-Bi5ToBtl.js.map → _server.ts-DgU1uBsl.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DSfVK8xc.js → _server.ts-DiUBKtYa.js} +5 -5
- package/build/server/chunks/{_server.ts-DSfVK8xc.js.map → _server.ts-DiUBKtYa.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CwPiZPmZ.js → _server.ts-DlONqa0N.js} +6 -6
- package/build/server/chunks/{_server.ts-CwPiZPmZ.js.map → _server.ts-DlONqa0N.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cb-e8WyG.js → _server.ts-Do8_4nUh.js} +5 -5
- package/build/server/chunks/{_server.ts-Cb-e8WyG.js.map → _server.ts-Do8_4nUh.js.map} +1 -1
- package/build/server/chunks/{_server.ts-lK-oXISB.js → _server.ts-DtVcRD5A.js} +5 -5
- package/build/server/chunks/{_server.ts-lK-oXISB.js.map → _server.ts-DtVcRD5A.js.map} +1 -1
- package/build/server/chunks/{_server.ts-hAoIbHpc.js → _server.ts-DueQnU1L.js} +6 -6
- package/build/server/chunks/{_server.ts-hAoIbHpc.js.map → _server.ts-DueQnU1L.js.map} +1 -1
- package/build/server/chunks/{_server.ts-aw8KYE5U.js → _server.ts-DvsmHJew.js} +5 -5
- package/build/server/chunks/{_server.ts-aw8KYE5U.js.map → _server.ts-DvsmHJew.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DUy4kkr_.js → _server.ts-DxYoYjKM.js} +5 -5
- package/build/server/chunks/{_server.ts-DUy4kkr_.js.map → _server.ts-DxYoYjKM.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BDe-TnAi.js → _server.ts-Eq4SzuV_.js} +5 -5
- package/build/server/chunks/{_server.ts-BDe-TnAi.js.map → _server.ts-Eq4SzuV_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DDCEmU_P.js → _server.ts-KuD8Wpms.js} +6 -10
- package/build/server/chunks/_server.ts-KuD8Wpms.js.map +1 -0
- package/build/server/chunks/{_server.ts-BnL3TLuz.js → _server.ts-Q60q44Je.js} +5 -5
- package/build/server/chunks/{_server.ts-BnL3TLuz.js.map → _server.ts-Q60q44Je.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DMj9WYdv.js → _server.ts-RfzeE7tM.js} +2 -2
- package/build/server/chunks/{_server.ts-DMj9WYdv.js.map → _server.ts-RfzeE7tM.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B6AN-mYa.js → _server.ts-Rigt7lcd.js} +7 -7
- package/build/server/chunks/{_server.ts-B6AN-mYa.js.map → _server.ts-Rigt7lcd.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C7Scn_Ur.js → _server.ts-XhNvTVYt.js} +5 -5
- package/build/server/chunks/_server.ts-XhNvTVYt.js.map +1 -0
- package/build/server/chunks/{_server.ts-BETcFeB8.js → _server.ts-Zui06dcA.js} +5 -5
- package/build/server/chunks/_server.ts-Zui06dcA.js.map +1 -0
- package/build/server/chunks/{_server.ts-BwnoppTC.js → _server.ts-a1r-EHX0.js} +6 -6
- package/build/server/chunks/{_server.ts-BwnoppTC.js.map → _server.ts-a1r-EHX0.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CosKSZGO.js → _server.ts-cHc1drrp.js} +2 -2
- package/build/server/chunks/{_server.ts-CosKSZGO.js.map → _server.ts-cHc1drrp.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B5PHfuR5.js → _server.ts-eYpUsioT.js} +6 -6
- package/build/server/chunks/{_server.ts-B5PHfuR5.js.map → _server.ts-eYpUsioT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CGMuaSY3.js → _server.ts-iKClbuyO.js} +5 -5
- package/build/server/chunks/{_server.ts-CGMuaSY3.js.map → _server.ts-iKClbuyO.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C37SDJxC.js → _server.ts-j1haXquD.js} +5 -5
- package/build/server/chunks/{_server.ts-C37SDJxC.js.map → _server.ts-j1haXquD.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BW46dP9B.js → _server.ts-k5rG5cUI.js} +7 -7
- package/build/server/chunks/{_server.ts-BW46dP9B.js.map → _server.ts-k5rG5cUI.js.map} +1 -1
- package/build/server/chunks/{_server.ts-5aqdy9Zn.js → _server.ts-k9P3ZBDK.js} +25 -17
- package/build/server/chunks/_server.ts-k9P3ZBDK.js.map +1 -0
- package/build/server/chunks/{_server.ts-CcyVh5fg.js → _server.ts-ll-0r5dM.js} +5 -5
- package/build/server/chunks/{_server.ts-CcyVh5fg.js.map → _server.ts-ll-0r5dM.js.map} +1 -1
- package/build/server/chunks/{_server.ts-r07PDC8q.js → _server.ts-m1RQkdUW.js} +5 -5
- package/build/server/chunks/{_server.ts-r07PDC8q.js.map → _server.ts-m1RQkdUW.js.map} +1 -1
- package/build/server/chunks/{_server.ts-avgx1pPX.js → _server.ts-nVEAwKYe.js} +5 -5
- package/build/server/chunks/{_server.ts-avgx1pPX.js.map → _server.ts-nVEAwKYe.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DP28Ocqs.js → _server.ts-vZTWdH4v.js} +5 -5
- package/build/server/chunks/{_server.ts-DP28Ocqs.js.map → _server.ts-vZTWdH4v.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DiDI1Ie6.js → _server.ts-vpAn0Uxn.js} +6 -6
- package/build/server/chunks/{_server.ts-DiDI1Ie6.js.map → _server.ts-vpAn0Uxn.js.map} +1 -1
- package/build/server/chunks/{addon-helpers-ChYTbRSK.js → addon-helpers-kNrSUlMe.js} +3 -3
- package/build/server/chunks/addon-helpers-kNrSUlMe.js.map +1 -0
- package/build/server/chunks/{akm-BLz9zl09.js → akm-IP8X7RlR.js} +2 -2
- package/build/server/chunks/{akm-BLz9zl09.js.map → akm-IP8X7RlR.js.map} +1 -1
- package/build/server/chunks/{catalog-CY6FvvAs.js → catalog-DcLI63rn.js} +5 -5
- package/build/server/chunks/{catalog-CY6FvvAs.js.map → catalog-DcLI63rn.js.map} +1 -1
- package/build/server/chunks/{client-FcHtkEV-.js → client-CIUwkogU.js} +2 -2
- package/build/server/chunks/{client-FcHtkEV-.js.map → client-CIUwkogU.js.map} +1 -1
- package/build/server/chunks/{config-WS3yDsjb.js → config-EKy5PAZU.js} +2 -2
- package/build/server/chunks/{config-WS3yDsjb.js.map → config-EKy5PAZU.js.map} +1 -1
- package/build/server/chunks/{docker-CDcBV4aX.js → docker-BhJS_Y28.js} +2 -2
- package/build/server/chunks/{docker-CDcBV4aX.js.map → docker-BhJS_Y28.js.map} +1 -1
- package/build/server/chunks/{endpoints-BnI8UQUm.js → endpoints-Dq-IqF1t.js} +2 -2
- package/build/server/chunks/{endpoints-BnI8UQUm.js.map → endpoints-Dq-IqF1t.js.map} +1 -1
- package/build/server/chunks/{error.svelte-DeB-Po5T.js → error.svelte-Dbj-WAaz.js} +4 -4
- package/build/server/chunks/{error.svelte-DeB-Po5T.js.map → error.svelte-Dbj-WAaz.js.map} +1 -1
- package/build/server/chunks/{helpers-uzTc9A0Q.js → helpers-s8d3gE38.js} +3 -3
- package/build/server/chunks/{helpers-uzTc9A0Q.js.map → helpers-s8d3gE38.js.map} +1 -1
- package/build/server/chunks/{hooks.server-DaC85A-N.js → hooks.server-Cy1D3efR.js} +7 -7
- package/build/server/chunks/hooks.server-Cy1D3efR.js.map +1 -0
- package/build/server/chunks/{http-DWCniA5n.js → http-BCF8LO-V.js} +2 -2
- package/build/server/chunks/{http-DWCniA5n.js.map → http-BCF8LO-V.js.map} +1 -1
- package/build/server/chunks/{internal-DRthfYRK.js → internal-CcLms467.js} +3 -3
- package/build/server/chunks/{internal-DRthfYRK.js.map → internal-CcLms467.js.map} +1 -1
- package/build/server/chunks/{migration-status-Blvg_RFt.js → migration-status-BgiG_Rm6.js} +2 -2
- package/build/server/chunks/{migration-status-Blvg_RFt.js.map → migration-status-BgiG_Rm6.js.map} +1 -1
- package/build/server/chunks/{session-cookie-DOONPnJ5.js → session-cookie-F6DkHp5H.js} +2 -2
- package/build/server/chunks/{session-cookie-DOONPnJ5.js.map → session-cookie-F6DkHp5H.js.map} +1 -1
- package/build/server/chunks/{setup-deploy-CeeF_6ze.js → setup-deploy-BtgW_nbb.js} +2 -2
- package/build/server/chunks/{setup-deploy-CeeF_6ze.js.map → setup-deploy-BtgW_nbb.js.map} +1 -1
- package/build/server/chunks/{src-B3g4Ry1X.js → src-BN-m14sE.js} +198 -639
- package/build/server/chunks/src-BN-m14sE.js.map +1 -0
- package/build/server/chunks/{state-CL9Kv-vm.js → state-BjAIjYtQ.js} +2 -2
- package/build/server/chunks/{state-CL9Kv-vm.js.map → state-BjAIjYtQ.js.map} +1 -1
- package/build/server/chunks/{state2-Cim9_nHe.js → state2-CeseXnTO.js} +2 -2
- package/build/server/chunks/{state2-Cim9_nHe.js.map → state2-CeseXnTO.js.map} +1 -1
- package/build/server/chunks/{theme-state.svelte-BgBXJ060.js → theme-state.svelte-DshW_ZYI.js} +2 -81
- package/build/server/chunks/theme-state.svelte-DshW_ZYI.js.map +1 -0
- package/build/server/index.js +32 -2
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +93 -107
- package/build/server/manifest.js.map +1 -1
- package/package.json +2 -2
- package/build/client/_app/immutable/assets/4.BLk6Mqyj.css +0 -1
- package/build/client/_app/immutable/assets/4.BLk6Mqyj.css.br +0 -0
- package/build/client/_app/immutable/assets/4.BLk6Mqyj.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B8C5qi9U.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8C5qi9U.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Br6Mrpf0.js +0 -3
- package/build/client/_app/immutable/chunks/Br6Mrpf0.js.br +0 -0
- package/build/client/_app/immutable/chunks/Br6Mrpf0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CLgRRUN_.js.br +0 -0
- package/build/client/_app/immutable/chunks/CLgRRUN_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ch85wCT5.js +0 -1
- package/build/client/_app/immutable/chunks/Ch85wCT5.js.br +0 -2
- package/build/client/_app/immutable/chunks/Ch85wCT5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DRHnoVLf.js +0 -1
- package/build/client/_app/immutable/chunks/DRHnoVLf.js.br +0 -0
- package/build/client/_app/immutable/chunks/DRHnoVLf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DYXGFYr6.js.br +0 -0
- package/build/client/_app/immutable/chunks/DYXGFYr6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dcw6L0GF.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dcw6L0GF.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CVxCoIFs.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CVxCoIFs.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CQqNtgHJ.js +0 -1
- package/build/client/_app/immutable/entry/start.CQqNtgHJ.js.br +0 -0
- package/build/client/_app/immutable/entry/start.CQqNtgHJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.Bb8qAGW8.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Bb8qAGW8.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Co_TaqLI.js.br +0 -2
- package/build/client/_app/immutable/nodes/1.Co_TaqLI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.agNu3Ryl.js +0 -130
- package/build/client/_app/immutable/nodes/4.agNu3Ryl.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.agNu3Ryl.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.Fw13EXte.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.Fw13EXte.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.CWy0yXnu.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.CWy0yXnu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.CsM4M8Ul.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.CsM4M8Ul.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.V6hY0p8a.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.V6hY0p8a.js.gz +0 -0
- package/build/server/chunks/1-DvZDBGww.js +0 -9
- package/build/server/chunks/10-C96Thueb.js.map +0 -1
- package/build/server/chunks/4-BYdi8hv_.js +0 -9
- package/build/server/chunks/6-BsZngRIA.js +0 -9
- package/build/server/chunks/_page.svelte-WYgjKj38.js.map +0 -1
- package/build/server/chunks/_server.ts-2fxcxBzC.js.map +0 -1
- package/build/server/chunks/_server.ts-5aqdy9Zn.js.map +0 -1
- package/build/server/chunks/_server.ts-B8D1t67g.js.map +0 -1
- package/build/server/chunks/_server.ts-BETcFeB8.js.map +0 -1
- package/build/server/chunks/_server.ts-BM0AExGa.js +0 -121
- package/build/server/chunks/_server.ts-BM0AExGa.js.map +0 -1
- package/build/server/chunks/_server.ts-Baeek88H.js.map +0 -1
- package/build/server/chunks/_server.ts-BlVBulWB.js.map +0 -1
- package/build/server/chunks/_server.ts-Brb7lRFE.js.map +0 -1
- package/build/server/chunks/_server.ts-C5jyYbFm.js.map +0 -1
- package/build/server/chunks/_server.ts-C7Scn_Ur.js.map +0 -1
- package/build/server/chunks/_server.ts-C9-ewPaY.js.map +0 -1
- package/build/server/chunks/_server.ts-CM1BFa2O.js.map +0 -1
- package/build/server/chunks/_server.ts-Cap2Myq0.js.map +0 -1
- package/build/server/chunks/_server.ts-DBQ7TD4o.js.map +0 -1
- package/build/server/chunks/_server.ts-DDCEmU_P.js.map +0 -1
- package/build/server/chunks/_server.ts-DLLNA3jY.js +0 -47
- package/build/server/chunks/_server.ts-DLLNA3jY.js.map +0 -1
- package/build/server/chunks/_server.ts-DM6Jm6KP.js.map +0 -1
- package/build/server/chunks/_server.ts-DRvqTDLx.js.map +0 -1
- package/build/server/chunks/_server.ts-DXoq1VzO.js.map +0 -1
- package/build/server/chunks/_server.ts-DYsP_lpr.js.map +0 -1
- package/build/server/chunks/_server.ts-DZ-yNYeI.js +0 -64
- package/build/server/chunks/_server.ts-DZ-yNYeI.js.map +0 -1
- package/build/server/chunks/_server.ts-Dcawi9b4.js.map +0 -1
- package/build/server/chunks/_server.ts-Decw7JxO.js.map +0 -1
- package/build/server/chunks/_server.ts-Dg4ouUjZ.js.map +0 -1
- package/build/server/chunks/_server.ts-IW-zQmmb.js.map +0 -1
- package/build/server/chunks/_server.ts-WePF2DAq.js.map +0 -1
- package/build/server/chunks/_server.ts-k339Bhm3.js +0 -88
- package/build/server/chunks/_server.ts-k339Bhm3.js.map +0 -1
- package/build/server/chunks/addon-helpers-ChYTbRSK.js.map +0 -1
- package/build/server/chunks/environment-D-dkDBwd.js +0 -36
- package/build/server/chunks/environment-D-dkDBwd.js.map +0 -1
- package/build/server/chunks/hooks.server-DaC85A-N.js.map +0 -1
- package/build/server/chunks/src-B3g4Ry1X.js.map +0 -1
- package/build/server/chunks/theme-state.svelte-BgBXJ060.js.map +0 -1
- package/build/server/chunks/version-cache-CSnmLqxQ.js +0 -54
- 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.
|
|
741
|
+
version: "0.12.23"};
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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:${
|
|
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
|
-
*
|
|
6495
|
-
*
|
|
6496
|
-
*
|
|
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.
|
|
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
|
-
*
|
|
8075
|
-
*
|
|
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
|
-
*
|
|
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,
|
|
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
|
|
7829
|
+
const releaseTag = "platform-" + normalizeVersion(PLATFORM_VERSION);
|
|
8084
7830
|
ensureReleaseMigrated({
|
|
8085
7831
|
homeDir: state.homeDir,
|
|
8086
|
-
targetVersion:
|
|
7832
|
+
targetVersion: PLATFORM_VERSION
|
|
8087
7833
|
});
|
|
8088
|
-
const
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
10915
|
-
//# sourceMappingURL=src-
|
|
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-BN-m14sE.js.map
|