@openpalm/ui 0.12.0-rc.2 → 0.12.0-rc.4
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.4BLkUSeP.css +1 -0
- package/build/client/_app/immutable/assets/4.4BLkUSeP.css.br +0 -0
- package/build/client/_app/immutable/assets/4.4BLkUSeP.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BqFl1zbV.js +5 -0
- package/build/client/_app/immutable/chunks/BqFl1zbV.js.br +0 -0
- package/build/client/_app/immutable/chunks/BqFl1zbV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CmFpvFC0.js +3 -0
- package/build/client/_app/immutable/chunks/CmFpvFC0.js.br +0 -0
- package/build/client/_app/immutable/chunks/CmFpvFC0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CuPMacDQ.js +1 -0
- package/build/client/_app/immutable/chunks/CuPMacDQ.js.br +2 -0
- package/build/client/_app/immutable/chunks/CuPMacDQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DOWJsT_T.js → DHUWL49y.js} +1 -1
- package/build/client/_app/immutable/chunks/DHUWL49y.js.br +0 -0
- package/build/client/_app/immutable/chunks/DHUWL49y.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BEuC-NYT.js → DL5sMDxv.js} +1 -1
- package/build/client/_app/immutable/chunks/DL5sMDxv.js.br +0 -0
- package/build/client/_app/immutable/chunks/DL5sMDxv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/qjfxE7Kl.js +1 -0
- package/build/client/_app/immutable/chunks/qjfxE7Kl.js.br +0 -0
- package/build/client/_app/immutable/chunks/qjfxE7Kl.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.Dgd8Sqiz.js → app.CafiV7-w.js} +2 -2
- package/build/client/_app/immutable/entry/app.CafiV7-w.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CafiV7-w.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.D9RjvJJI.js +1 -0
- package/build/client/_app/immutable/entry/start.D9RjvJJI.js.br +0 -0
- package/build/client/_app/immutable/entry/start.D9RjvJJI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.DEcud9DA.js → 0.CoKytf3n.js} +1 -1
- package/build/client/_app/immutable/nodes/0.CoKytf3n.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CoKytf3n.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.DiTVmAJ4.js → 1.Bds7gMIH.js} +1 -1
- package/build/client/_app/immutable/nodes/1.Bds7gMIH.js.br +2 -0
- package/build/client/_app/immutable/nodes/1.Bds7gMIH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.bkv3exaP.js +130 -0
- package/build/client/_app/immutable/nodes/4.bkv3exaP.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.bkv3exaP.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.WMP0f8pf.js → 5.CGnOiX1Q.js} +2 -2
- package/build/client/_app/immutable/nodes/5.CGnOiX1Q.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.CGnOiX1Q.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{6.9o6Bephx.js → 6.BW2RFNrq.js} +1 -1
- package/build/client/_app/immutable/nodes/6.BW2RFNrq.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BW2RFNrq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7._N3I_xWy.js → 7.B3oQeWT9.js} +1 -1
- package/build/client/_app/immutable/nodes/7.B3oQeWT9.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.B3oQeWT9.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{8.aWZ5mSKB.js → 8.BzjCWne1.js} +1 -1
- package/build/client/_app/immutable/nodes/8.BzjCWne1.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BzjCWne1.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-u2E6UMPO.js → 0-_Ek7fSWr.js} +3 -3
- package/build/server/chunks/{0-u2E6UMPO.js.map → 0-_Ek7fSWr.js.map} +1 -1
- package/build/server/chunks/1-DXcmr_zA.js +9 -0
- package/build/server/chunks/{1-BdcHiFUZ.js.map → 1-DXcmr_zA.js.map} +1 -1
- package/build/server/chunks/{10-DMi_4x3S.js → 10-BW3Y4qaZ.js} +4 -4
- package/build/server/chunks/{10-DMi_4x3S.js.map → 10-BW3Y4qaZ.js.map} +1 -1
- package/build/server/chunks/4-BY7QM2MS.js +9 -0
- package/build/server/chunks/{4-siztlnPA.js.map → 4-BY7QM2MS.js.map} +1 -1
- package/build/server/chunks/5-P-f6Al-B.js +9 -0
- package/build/server/chunks/{5-DR1iBcbj.js.map → 5-P-f6Al-B.js.map} +1 -1
- package/build/server/chunks/6-BHZeYa5G.js +9 -0
- package/build/server/chunks/{6-BdZadUUO.js.map → 6-BHZeYa5G.js.map} +1 -1
- package/build/server/chunks/7-eE6c3_3B.js +9 -0
- package/build/server/chunks/{7-CjmZOzkF.js.map → 7-eE6c3_3B.js.map} +1 -1
- package/build/server/chunks/{8-DVpEHTHq.js → 8-DJTatpgo.js} +3 -3
- package/build/server/chunks/{8-DVpEHTHq.js.map → 8-DJTatpgo.js.map} +1 -1
- package/build/server/chunks/{ChatMessage-BNxQgrRW.js → ChatMessage-DqfLIJ0l.js} +2 -2
- package/build/server/chunks/{ChatMessage-BNxQgrRW.js.map → ChatMessage-DqfLIJ0l.js.map} +1 -1
- package/build/server/chunks/{Navbar-UVOusnw-.js → Navbar-BUZwbKR7.js} +4 -4
- package/build/server/chunks/{Navbar-UVOusnw-.js.map → Navbar-BUZwbKR7.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-DKvvz-xQ.js → _layout.svelte-CFKjimed.js} +2 -2
- package/build/server/chunks/{_layout.svelte-DKvvz-xQ.js.map → _layout.svelte-CFKjimed.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-CMyq-t3Q.js → _page.svelte-BGI4E82g.js} +185 -32
- package/build/server/chunks/_page.svelte-BGI4E82g.js.map +1 -0
- package/build/server/chunks/{_page.svelte-B5xh8SJ5.js → _page.svelte-BNJwzskB.js} +7 -7
- package/build/server/chunks/{_page.svelte-B5xh8SJ5.js.map → _page.svelte-BNJwzskB.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-w4SS3sVN.js → _page.svelte-BqrpD9EJ.js} +6 -6
- package/build/server/chunks/{_page.svelte-w4SS3sVN.js.map → _page.svelte-BqrpD9EJ.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-B7FQDg28.js → _page.svelte-CLi7npId.js} +6 -6
- package/build/server/chunks/{_page.svelte-B7FQDg28.js.map → _page.svelte-CLi7npId.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-D4Zivreu.js → _page.svelte-Da2QrUlJ.js} +3 -3
- package/build/server/chunks/{_page.svelte-D4Zivreu.js.map → _page.svelte-Da2QrUlJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C_c_15ac.js → _server.ts--5gGceMl.js} +5 -5
- package/build/server/chunks/{_server.ts-C_c_15ac.js.map → _server.ts--5gGceMl.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B7Fkprd8.js → _server.ts-4J6w-r81.js} +2 -2
- package/build/server/chunks/{_server.ts-B7Fkprd8.js.map → _server.ts-4J6w-r81.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bf3mh1Vw.js → _server.ts-8PqopElV.js} +5 -5
- package/build/server/chunks/{_server.ts-Bf3mh1Vw.js.map → _server.ts-8PqopElV.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DPpj-ZUv.js → _server.ts-B28oMCZG.js} +5 -5
- package/build/server/chunks/{_server.ts-DPpj-ZUv.js.map → _server.ts-B28oMCZG.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CfAx4ndA.js → _server.ts-B2veS97o.js} +5 -5
- package/build/server/chunks/{_server.ts-CfAx4ndA.js.map → _server.ts-B2veS97o.js.map} +1 -1
- package/build/server/chunks/{_server.ts-bClum6wa.js → _server.ts-B6X0dkuW.js} +5 -5
- package/build/server/chunks/{_server.ts-bClum6wa.js.map → _server.ts-B6X0dkuW.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B1Ka3iiX.js → _server.ts-B9U_bYQy.js} +6 -6
- package/build/server/chunks/{_server.ts-B1Ka3iiX.js.map → _server.ts-B9U_bYQy.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BHIqLHCr.js → _server.ts-BDjrSCF8.js} +2 -2
- package/build/server/chunks/{_server.ts-BHIqLHCr.js.map → _server.ts-BDjrSCF8.js.map} +1 -1
- package/build/server/chunks/{_server.ts-gLH0uvQH.js → _server.ts-BHJzuoOM.js} +6 -6
- package/build/server/chunks/{_server.ts-gLH0uvQH.js.map → _server.ts-BHJzuoOM.js.map} +1 -1
- package/build/server/chunks/{_server.ts-748DtXrC.js → _server.ts-BI3XQ7Fe.js} +5 -5
- package/build/server/chunks/{_server.ts-748DtXrC.js.map → _server.ts-BI3XQ7Fe.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BR_JejQG.js → _server.ts-BLyLxx8a.js} +5 -5
- package/build/server/chunks/{_server.ts-BR_JejQG.js.map → _server.ts-BLyLxx8a.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CN8iu9En.js → _server.ts-BNqC9EUT.js} +5 -5
- package/build/server/chunks/{_server.ts-CN8iu9En.js.map → _server.ts-BNqC9EUT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CCEnPIKA.js → _server.ts-BP--7Yt5.js} +5 -5
- package/build/server/chunks/{_server.ts-CCEnPIKA.js.map → _server.ts-BP--7Yt5.js.map} +1 -1
- package/build/server/chunks/{_server.ts-6sLoCHl6.js → _server.ts-BTG7yKQJ.js} +5 -5
- package/build/server/chunks/{_server.ts-6sLoCHl6.js.map → _server.ts-BTG7yKQJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DQP6uEx5.js → _server.ts-BVvTNLyM.js} +5 -5
- package/build/server/chunks/{_server.ts-DQP6uEx5.js.map → _server.ts-BVvTNLyM.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CDLW9TPG.js → _server.ts-BddFxHWB.js} +6 -6
- package/build/server/chunks/{_server.ts-CDLW9TPG.js.map → _server.ts-BddFxHWB.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CzTX8a_p.js → _server.ts-BiL6n-uG.js} +5 -5
- package/build/server/chunks/{_server.ts-CzTX8a_p.js.map → _server.ts-BiL6n-uG.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BhzFTv-h.js → _server.ts-Bnc-nxXp.js} +6 -6
- package/build/server/chunks/{_server.ts-BhzFTv-h.js.map → _server.ts-Bnc-nxXp.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D2tkCP8q.js → _server.ts-BobwONzr.js} +5 -5
- package/build/server/chunks/{_server.ts-D2tkCP8q.js.map → _server.ts-BobwONzr.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C9E9tYAO.js → _server.ts-BpNoIDkC.js} +5 -5
- package/build/server/chunks/{_server.ts-C9E9tYAO.js.map → _server.ts-BpNoIDkC.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dr6ShsbQ.js → _server.ts-BqBnHeP7.js} +5 -5
- package/build/server/chunks/{_server.ts-Dr6ShsbQ.js.map → _server.ts-BqBnHeP7.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dpk6ddyU.js → _server.ts-Bqs67HUU.js} +7 -7
- package/build/server/chunks/{_server.ts-Dpk6ddyU.js.map → _server.ts-Bqs67HUU.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DT8fIE9B.js → _server.ts-BteARe-C.js} +5 -5
- package/build/server/chunks/{_server.ts-DT8fIE9B.js.map → _server.ts-BteARe-C.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BdN5NtL4.js → _server.ts-Bx9WEYbj.js} +5 -5
- package/build/server/chunks/{_server.ts-BdN5NtL4.js.map → _server.ts-Bx9WEYbj.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BaTXv_bR.js → _server.ts-C1ZgpST1.js} +5 -5
- package/build/server/chunks/{_server.ts-BaTXv_bR.js.map → _server.ts-C1ZgpST1.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BEgkYvNh.js → _server.ts-C5bfYlSP.js} +5 -5
- package/build/server/chunks/{_server.ts-BEgkYvNh.js.map → _server.ts-C5bfYlSP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CILn0WEi.js → _server.ts-C77r_Slf.js} +5 -5
- package/build/server/chunks/{_server.ts-CILn0WEi.js.map → _server.ts-C77r_Slf.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CxWx02dy.js → _server.ts-CK46ky8H.js} +5 -5
- package/build/server/chunks/_server.ts-CK46ky8H.js.map +1 -0
- package/build/server/chunks/{_server.ts-Ts6pcZ0d.js → _server.ts-CKF9vpjm.js} +5 -5
- package/build/server/chunks/{_server.ts-Ts6pcZ0d.js.map → _server.ts-CKF9vpjm.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DsbN7dr7.js → _server.ts-CPmZZ9aQ.js} +5 -5
- package/build/server/chunks/{_server.ts-DsbN7dr7.js.map → _server.ts-CPmZZ9aQ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CgPqNf7-.js → _server.ts-CTMjNL2a.js} +5 -5
- package/build/server/chunks/{_server.ts-CgPqNf7-.js.map → _server.ts-CTMjNL2a.js.map} +1 -1
- package/build/server/chunks/{_server.ts-MJdHZvPF.js → _server.ts-CTQGj2tV.js} +5 -5
- package/build/server/chunks/_server.ts-CTQGj2tV.js.map +1 -0
- package/build/server/chunks/{_server.ts-DMTF4KjV.js → _server.ts-CVV2PdRo.js} +2 -2
- package/build/server/chunks/{_server.ts-DMTF4KjV.js.map → _server.ts-CVV2PdRo.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CV30eOSb.js → _server.ts-CWFma6OW.js} +6 -6
- package/build/server/chunks/{_server.ts-CV30eOSb.js.map → _server.ts-CWFma6OW.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C3ic1HZf.js → _server.ts-CaocPhJi.js} +5 -5
- package/build/server/chunks/{_server.ts-C3ic1HZf.js.map → _server.ts-CaocPhJi.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cscu5y6A.js → _server.ts-CfJR6lH-.js} +6 -6
- package/build/server/chunks/{_server.ts-Cscu5y6A.js.map → _server.ts-CfJR6lH-.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CZ9rxA09.js → _server.ts-ClwJWqVa.js} +5 -5
- package/build/server/chunks/{_server.ts-CZ9rxA09.js.map → _server.ts-ClwJWqVa.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CTKPnd64.js → _server.ts-CrY-tcDK.js} +7 -7
- package/build/server/chunks/{_server.ts-CTKPnd64.js.map → _server.ts-CrY-tcDK.js.map} +1 -1
- package/build/server/chunks/{_server.ts-op5C3XGb.js → _server.ts-Cs8lC4CS.js} +6 -6
- package/build/server/chunks/{_server.ts-op5C3XGb.js.map → _server.ts-Cs8lC4CS.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DEV3GiN8.js → _server.ts-CxBdr3hE.js} +5 -5
- package/build/server/chunks/{_server.ts-DEV3GiN8.js.map → _server.ts-CxBdr3hE.js.map} +1 -1
- package/build/server/chunks/{_server.ts-RagJb3I4.js → _server.ts-D-u20jUU.js} +5 -5
- package/build/server/chunks/{_server.ts-RagJb3I4.js.map → _server.ts-D-u20jUU.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Djimbzpw.js → _server.ts-D9dsMRF-.js} +7 -7
- package/build/server/chunks/{_server.ts-Djimbzpw.js.map → _server.ts-D9dsMRF-.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D5WwDggN.js → _server.ts-DAQcUe9k.js} +5 -5
- package/build/server/chunks/{_server.ts-D5WwDggN.js.map → _server.ts-DAQcUe9k.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BMeLIoiB.js → _server.ts-DAlXBvhR.js} +6 -6
- package/build/server/chunks/{_server.ts-BMeLIoiB.js.map → _server.ts-DAlXBvhR.js.map} +1 -1
- package/build/server/chunks/_server.ts-DC8kKPsd.js +81 -0
- package/build/server/chunks/_server.ts-DC8kKPsd.js.map +1 -0
- package/build/server/chunks/{_server.ts-Cs7f-gaR.js → _server.ts-DGUVJH31.js} +6 -6
- package/build/server/chunks/{_server.ts-Cs7f-gaR.js.map → _server.ts-DGUVJH31.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DFhNnn-G.js → _server.ts-DHfTcOkp.js} +5 -5
- package/build/server/chunks/{_server.ts-DFhNnn-G.js.map → _server.ts-DHfTcOkp.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CCtCwyZb.js → _server.ts-DMH-RbZr.js} +6 -6
- package/build/server/chunks/{_server.ts-CCtCwyZb.js.map → _server.ts-DMH-RbZr.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CSN60plL.js → _server.ts-DP2uRN66.js} +2 -2
- package/build/server/chunks/{_server.ts-CSN60plL.js.map → _server.ts-DP2uRN66.js.map} +1 -1
- package/build/server/chunks/{_server.ts-JPsLUf_g.js → _server.ts-DR2bRoGJ.js} +5 -5
- package/build/server/chunks/{_server.ts-JPsLUf_g.js.map → _server.ts-DR2bRoGJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DjJu23jV.js → _server.ts-DX2VL0w3.js} +5 -5
- package/build/server/chunks/{_server.ts-DjJu23jV.js.map → _server.ts-DX2VL0w3.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dv7xll_B.js → _server.ts-DY0Tkqlv.js} +6 -6
- package/build/server/chunks/{_server.ts-Dv7xll_B.js.map → _server.ts-DY0Tkqlv.js.map} +1 -1
- package/build/server/chunks/{_server.ts-zUZknmZx.js → _server.ts-DZ5v5q0V.js} +6 -6
- package/build/server/chunks/{_server.ts-zUZknmZx.js.map → _server.ts-DZ5v5q0V.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BCKweCGM.js → _server.ts-DZlNWTv1.js} +4 -4
- package/build/server/chunks/{_server.ts-BCKweCGM.js.map → _server.ts-DZlNWTv1.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DPw4QRWb.js → _server.ts-D_5BJC_z.js} +5 -5
- package/build/server/chunks/{_server.ts-DPw4QRWb.js.map → _server.ts-D_5BJC_z.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BSxbdNXo.js → _server.ts-Da_AbetR.js} +5 -5
- package/build/server/chunks/{_server.ts-BSxbdNXo.js.map → _server.ts-Da_AbetR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BkxwpAv2.js → _server.ts-DbEaJJqa.js} +5 -5
- package/build/server/chunks/{_server.ts-BkxwpAv2.js.map → _server.ts-DbEaJJqa.js.map} +1 -1
- package/build/server/chunks/_server.ts-DnC_IrzP.js +78 -0
- package/build/server/chunks/_server.ts-DnC_IrzP.js.map +1 -0
- package/build/server/chunks/{_server.ts-Cc-c2ehY.js → _server.ts-DpAumRrq.js} +5 -5
- package/build/server/chunks/{_server.ts-Cc-c2ehY.js.map → _server.ts-DpAumRrq.js.map} +1 -1
- package/build/server/chunks/_server.ts-Dq1UL_W-.js +89 -0
- package/build/server/chunks/_server.ts-Dq1UL_W-.js.map +1 -0
- package/build/server/chunks/{_server.ts-Ieve8Oxl.js → _server.ts-DuDeloL8.js} +8 -8
- package/build/server/chunks/{_server.ts-Ieve8Oxl.js.map → _server.ts-DuDeloL8.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BiwKKu1y.js → _server.ts-EZhgk1ej.js} +5 -5
- package/build/server/chunks/{_server.ts-BiwKKu1y.js.map → _server.ts-EZhgk1ej.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DAv3C7oW.js → _server.ts-J-kbq-R4.js} +5 -5
- package/build/server/chunks/{_server.ts-DAv3C7oW.js.map → _server.ts-J-kbq-R4.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BXOIslIH.js → _server.ts-MkaNzvkX.js} +5 -5
- package/build/server/chunks/{_server.ts-BXOIslIH.js.map → _server.ts-MkaNzvkX.js.map} +1 -1
- package/build/server/chunks/{_server.ts-lmfAKx6b.js → _server.ts-NKH2c4tC.js} +7 -7
- package/build/server/chunks/{_server.ts-lmfAKx6b.js.map → _server.ts-NKH2c4tC.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B4WEAp6B.js → _server.ts-UDLeVWXU.js} +18 -6
- package/build/server/chunks/_server.ts-UDLeVWXU.js.map +1 -0
- package/build/server/chunks/{_server.ts-DRpXmKSI.js → _server.ts-X8_yz_cF.js} +6 -6
- package/build/server/chunks/{_server.ts-DRpXmKSI.js.map → _server.ts-X8_yz_cF.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B2kJ3mfg.js → _server.ts-XqgZHMH_.js} +7 -7
- package/build/server/chunks/{_server.ts-B2kJ3mfg.js.map → _server.ts-XqgZHMH_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BFp9Fobi.js → _server.ts-YAPI25bu.js} +4 -4
- package/build/server/chunks/{_server.ts-BFp9Fobi.js.map → _server.ts-YAPI25bu.js.map} +1 -1
- package/build/server/chunks/{_server.ts-QdyZiBuA.js → _server.ts-_7nvJE2X.js} +5 -5
- package/build/server/chunks/{_server.ts-QdyZiBuA.js.map → _server.ts-_7nvJE2X.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cwuo2EyS.js → _server.ts-aC8GMqDc.js} +5 -5
- package/build/server/chunks/{_server.ts-Cwuo2EyS.js.map → _server.ts-aC8GMqDc.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B_du9gRB.js → _server.ts-dRdq38xL.js} +5 -5
- package/build/server/chunks/{_server.ts-B_du9gRB.js.map → _server.ts-dRdq38xL.js.map} +1 -1
- package/build/server/chunks/{_server.ts-VuZwBycD.js → _server.ts-f-vnJ7Ie.js} +5 -5
- package/build/server/chunks/{_server.ts-VuZwBycD.js.map → _server.ts-f-vnJ7Ie.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CMytohFo.js → _server.ts-fCMXRvRH.js} +5 -5
- package/build/server/chunks/{_server.ts-CMytohFo.js.map → _server.ts-fCMXRvRH.js.map} +1 -1
- package/build/server/chunks/{_server.ts-4Pwhm5iv.js → _server.ts-fn52Uf3f.js} +5 -5
- package/build/server/chunks/{_server.ts-4Pwhm5iv.js.map → _server.ts-fn52Uf3f.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B25xvhiX.js → _server.ts-iw5QZKgP.js} +5 -5
- package/build/server/chunks/{_server.ts-B25xvhiX.js.map → _server.ts-iw5QZKgP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Byc_SyKx.js → _server.ts-lU516yVf.js} +5 -5
- package/build/server/chunks/{_server.ts-Byc_SyKx.js.map → _server.ts-lU516yVf.js.map} +1 -1
- package/build/server/chunks/_server.ts-mDvjMxar.js +64 -0
- package/build/server/chunks/_server.ts-mDvjMxar.js.map +1 -0
- package/build/server/chunks/{_server.ts-5cUQFkT_.js → _server.ts-n_99rmOB.js} +2 -2
- package/build/server/chunks/{_server.ts-5cUQFkT_.js.map → _server.ts-n_99rmOB.js.map} +1 -1
- package/build/server/chunks/{_server.ts-9zKJx2eV.js → _server.ts-pJnbal79.js} +5 -5
- package/build/server/chunks/{_server.ts-9zKJx2eV.js.map → _server.ts-pJnbal79.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DY4maxIB.js → _server.ts-rEZaxK90.js} +6 -6
- package/build/server/chunks/{_server.ts-DY4maxIB.js.map → _server.ts-rEZaxK90.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DE_dFybU.js → _server.ts-tyT3Bjv3.js} +7 -7
- package/build/server/chunks/{_server.ts-DE_dFybU.js.map → _server.ts-tyT3Bjv3.js.map} +1 -1
- package/build/server/chunks/{_server.ts-MORzCMU7.js → _server.ts-ug73AQNb.js} +5 -5
- package/build/server/chunks/{_server.ts-MORzCMU7.js.map → _server.ts-ug73AQNb.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D4B9IkKh.js → _server.ts-ugLDRTpb.js} +5 -5
- package/build/server/chunks/{_server.ts-D4B9IkKh.js.map → _server.ts-ugLDRTpb.js.map} +1 -1
- package/build/server/chunks/{addon-helpers-CoPzjA3s.js → addon-helpers-CkQjHBvL.js} +3 -3
- package/build/server/chunks/{addon-helpers-CoPzjA3s.js.map → addon-helpers-CkQjHBvL.js.map} +1 -1
- package/build/server/chunks/{akm-BS59M7h3.js → akm-_cUsiv9b.js} +2 -2
- package/build/server/chunks/{akm-BS59M7h3.js.map → akm-_cUsiv9b.js.map} +1 -1
- package/build/server/chunks/{catalog-DAQWike4.js → catalog-CVQgQDZT.js} +5 -5
- package/build/server/chunks/{catalog-DAQWike4.js.map → catalog-CVQgQDZT.js.map} +1 -1
- package/build/server/chunks/{client-B3vN-Uvc.js → client-CK_EEC7q.js} +2 -2
- package/build/server/chunks/{client-B3vN-Uvc.js.map → client-CK_EEC7q.js.map} +1 -1
- package/build/server/chunks/{config-Bdb4ZTos.js → config-CW8zrJxw.js} +2 -2
- package/build/server/chunks/{config-Bdb4ZTos.js.map → config-CW8zrJxw.js.map} +1 -1
- package/build/server/chunks/{docker-DaU_SNhi.js → docker-BxDkWUiU.js} +2 -2
- package/build/server/chunks/{docker-DaU_SNhi.js.map → docker-BxDkWUiU.js.map} +1 -1
- package/build/server/chunks/{endpoints-1byh0xs8.js → endpoints-C9sjcucN.js} +2 -2
- package/build/server/chunks/{endpoints-1byh0xs8.js.map → endpoints-C9sjcucN.js.map} +1 -1
- package/build/server/chunks/{environment-BQh6a8iU.js → environment-D344CnXa.js} +2 -2
- package/build/server/chunks/{environment-BQh6a8iU.js.map → environment-D344CnXa.js.map} +1 -1
- package/build/server/chunks/{error.svelte-CEj0_dRA.js → error.svelte-CI7YrCLE.js} +4 -4
- package/build/server/chunks/{error.svelte-CEj0_dRA.js.map → error.svelte-CI7YrCLE.js.map} +1 -1
- package/build/server/chunks/{helpers-Be-wOei2.js → helpers-Bebo0tHj.js} +3 -3
- package/build/server/chunks/{helpers-Be-wOei2.js.map → helpers-Bebo0tHj.js.map} +1 -1
- package/build/server/chunks/{hooks.server-DlA1ck_e.js → hooks.server-ixIaeil8.js} +6 -6
- package/build/server/chunks/{hooks.server-DlA1ck_e.js.map → hooks.server-ixIaeil8.js.map} +1 -1
- package/build/server/chunks/{http-BbFgukqs.js → http-B9H_dpeX.js} +2 -2
- package/build/server/chunks/{http-BbFgukqs.js.map → http-B9H_dpeX.js.map} +1 -1
- package/build/server/chunks/{internal-CP-qQJfY.js → internal-Da04QZzQ.js} +3 -3
- package/build/server/chunks/{internal-CP-qQJfY.js.map → internal-Da04QZzQ.js.map} +1 -1
- package/build/server/chunks/{session-cookie-C-kIy9pI.js → session-cookie-DI4jIKdM.js} +2 -2
- package/build/server/chunks/{session-cookie-C-kIy9pI.js.map → session-cookie-DI4jIKdM.js.map} +1 -1
- package/build/server/chunks/{setup-deploy-BL_wmz6j.js → setup-deploy-NZRJZiNw.js} +2 -2
- package/build/server/chunks/{setup-deploy-BL_wmz6j.js.map → setup-deploy-NZRJZiNw.js.map} +1 -1
- package/build/server/chunks/{src-BEj0DuSB.js → src-kpR902Zr.js} +542 -122
- package/build/server/chunks/src-kpR902Zr.js.map +1 -0
- package/build/server/chunks/{state-DAPDF26p.js → state-TG4xDwlK.js} +2 -2
- package/build/server/chunks/{state-DAPDF26p.js.map → state-TG4xDwlK.js.map} +1 -1
- package/build/server/chunks/{state2-3fEu-ReG.js → state2-BqCIx1V7.js} +2 -2
- package/build/server/chunks/{state2-3fEu-ReG.js.map → state2-BqCIx1V7.js.map} +1 -1
- package/build/server/chunks/{theme-state.svelte-CUVpUHOv.js → theme-state.svelte-8qSluhfu.js} +35 -4
- package/build/server/chunks/theme-state.svelte-8qSluhfu.js.map +1 -0
- package/build/server/index.js +2 -2
- package/build/server/manifest.js +117 -89
- package/build/server/manifest.js.map +1 -1
- package/package.json +2 -2
- package/build/client/_app/immutable/assets/4.D-9LGiQD.css +0 -1
- package/build/client/_app/immutable/assets/4.D-9LGiQD.css.br +0 -0
- package/build/client/_app/immutable/assets/4.D-9LGiQD.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B7L0wlSY.js +0 -1
- package/build/client/_app/immutable/chunks/B7L0wlSY.js.br +0 -2
- package/build/client/_app/immutable/chunks/B7L0wlSY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BEuC-NYT.js.br +0 -0
- package/build/client/_app/immutable/chunks/BEuC-NYT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BXh0hlRI.js +0 -1
- package/build/client/_app/immutable/chunks/BXh0hlRI.js.br +0 -0
- package/build/client/_app/immutable/chunks/BXh0hlRI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DHRKaBFV.js +0 -3
- package/build/client/_app/immutable/chunks/DHRKaBFV.js.br +0 -0
- package/build/client/_app/immutable/chunks/DHRKaBFV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DOWJsT_T.js.br +0 -0
- package/build/client/_app/immutable/chunks/DOWJsT_T.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DkCRM8d5.js +0 -5
- package/build/client/_app/immutable/chunks/DkCRM8d5.js.br +0 -0
- package/build/client/_app/immutable/chunks/DkCRM8d5.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Dgd8Sqiz.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Dgd8Sqiz.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DN4LafZw.js +0 -1
- package/build/client/_app/immutable/entry/start.DN4LafZw.js.br +0 -1
- package/build/client/_app/immutable/entry/start.DN4LafZw.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.DEcud9DA.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.DEcud9DA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.DiTVmAJ4.js.br +0 -3
- package/build/client/_app/immutable/nodes/1.DiTVmAJ4.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.C-pAk-ut.js +0 -121
- package/build/client/_app/immutable/nodes/4.C-pAk-ut.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.C-pAk-ut.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.WMP0f8pf.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.WMP0f8pf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.9o6Bephx.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.9o6Bephx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7._N3I_xWy.js.br +0 -0
- package/build/client/_app/immutable/nodes/7._N3I_xWy.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.aWZ5mSKB.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.aWZ5mSKB.js.gz +0 -0
- package/build/server/chunks/1-BdcHiFUZ.js +0 -9
- package/build/server/chunks/4-siztlnPA.js +0 -9
- package/build/server/chunks/5-DR1iBcbj.js +0 -9
- package/build/server/chunks/6-BdZadUUO.js +0 -9
- package/build/server/chunks/7-CjmZOzkF.js +0 -9
- package/build/server/chunks/_page.svelte-CMyq-t3Q.js.map +0 -1
- package/build/server/chunks/_server.ts-B4WEAp6B.js.map +0 -1
- package/build/server/chunks/_server.ts-CxWx02dy.js.map +0 -1
- package/build/server/chunks/_server.ts-MJdHZvPF.js.map +0 -1
- package/build/server/chunks/src-BEj0DuSB.js.map +0 -1
- package/build/server/chunks/theme-state.svelte-CUVpUHOv.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { _ as __commonJSMin, b as __require } from './chunk-CLZ62Ad-.js';
|
|
2
2
|
import { P as PROVIDER_DEFAULT_URLS, a as PROVIDER_KEY_MAP } from './provider-constants-DPrj3yBX.js';
|
|
3
3
|
import { r as require_dist } from './dist-DOFcG0Zp.js';
|
|
4
|
-
import Vt, { existsSync, readFileSync, copyFileSync, chmodSync, mkdirSync, lstatSync, rmSync, readdirSync, writeFileSync, renameSync, statSync, cpSync, openSync, constants, writeSync, closeSync, chownSync, realpathSync } from 'node:fs';
|
|
4
|
+
import Vt, { existsSync, readFileSync, copyFileSync, chmodSync, mkdirSync, lstatSync, rmSync, readdirSync, writeFileSync, renameSync, statSync, statfsSync, cpSync, openSync, constants, writeSync, closeSync, chownSync, realpathSync } from 'node:fs';
|
|
5
5
|
import or, { join, basename, dirname, resolve, win32, posix } from 'node:path';
|
|
6
6
|
import { Buffer as Buffer$1 } from 'buffer';
|
|
7
7
|
import I from 'fs';
|
|
@@ -96,6 +96,84 @@ function timestampDirName(now = /* @__PURE__ */ new Date()) {
|
|
|
96
96
|
return now.toISOString().replace(/[:.]/g, "-");
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
|
+
* Recursively sum the apparent size (in bytes) of every file under `path`,
|
|
100
|
+
* excluding the existing backups directory (we never back up backups).
|
|
101
|
+
*
|
|
102
|
+
* Cheap enough for a pre-backup estimate; errors on individual entries are
|
|
103
|
+
* skipped (a transient unreadable file should not block the safety copy).
|
|
104
|
+
*/
|
|
105
|
+
function estimateHomeBackupBytes(homeDir) {
|
|
106
|
+
if (!existsSync(homeDir)) return 0;
|
|
107
|
+
const backupsDir = join(homeDir, "data", "backups");
|
|
108
|
+
let total = 0;
|
|
109
|
+
const walk = (dir) => {
|
|
110
|
+
let entries;
|
|
111
|
+
try {
|
|
112
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
113
|
+
} catch {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
const full = join(dir, entry.name);
|
|
118
|
+
if (full === backupsDir) continue;
|
|
119
|
+
if (entry.isDirectory()) walk(full);
|
|
120
|
+
else if (entry.isFile()) try {
|
|
121
|
+
total += statSync(full).size;
|
|
122
|
+
} catch {}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
walk(homeDir);
|
|
126
|
+
return total;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Estimate whether a full-home backup would fit safely on disk.
|
|
130
|
+
*
|
|
131
|
+
* Returns a structured result; the caller decides whether to warn, block, or
|
|
132
|
+
* (with explicit confirmation) proceed. This NEVER deletes anything — it only
|
|
133
|
+
* measures. `threshold` is the fraction of currently-free space the backup may
|
|
134
|
+
* consume before it is flagged `insufficient` (default 80%).
|
|
135
|
+
*/
|
|
136
|
+
function checkBackupFreeSpace(homeDir, threshold = .8) {
|
|
137
|
+
const estimatedBytes = estimateHomeBackupBytes(homeDir);
|
|
138
|
+
let freeBytes = Number.POSITIVE_INFINITY;
|
|
139
|
+
try {
|
|
140
|
+
const stat = statfsSync(homeDir);
|
|
141
|
+
freeBytes = stat.bavail * stat.bsize;
|
|
142
|
+
} catch {}
|
|
143
|
+
const ratio = freeBytes > 0 ? estimatedBytes / freeBytes : Number.POSITIVE_INFINITY;
|
|
144
|
+
return {
|
|
145
|
+
estimatedBytes,
|
|
146
|
+
freeBytes,
|
|
147
|
+
ratio,
|
|
148
|
+
insufficient: estimatedBytes > freeBytes * threshold,
|
|
149
|
+
threshold
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function formatBytes(bytes) {
|
|
153
|
+
if (!Number.isFinite(bytes)) return "unknown";
|
|
154
|
+
const units = [
|
|
155
|
+
"B",
|
|
156
|
+
"KB",
|
|
157
|
+
"MB",
|
|
158
|
+
"GB",
|
|
159
|
+
"TB"
|
|
160
|
+
];
|
|
161
|
+
let value = bytes;
|
|
162
|
+
let i = 0;
|
|
163
|
+
while (value >= 1024 && i < units.length - 1) {
|
|
164
|
+
value /= 1024;
|
|
165
|
+
i += 1;
|
|
166
|
+
}
|
|
167
|
+
return `${value.toFixed(value >= 10 || i === 0 ? 0 : 1)} ${units[i]}`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Human-readable, plain-language explanation of a low-free-space situation,
|
|
171
|
+
* suitable for a CLI warning or a UI notice.
|
|
172
|
+
*/
|
|
173
|
+
function describeBackupSpaceShortfall(check) {
|
|
174
|
+
return `The safety backup is estimated at ${formatBytes(check.estimatedBytes)}, but only ${formatBytes(check.freeBytes)} is free on this disk. Backing up could fill the disk. Free up space (your old backups are under data/backups/ — review them with \`openpalm backups list\`), or re-run with confirmation to proceed anyway. Nothing was changed or deleted.`;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
99
177
|
* Create a durable backup snapshot of the current OP_HOME contents.
|
|
100
178
|
*
|
|
101
179
|
* The backup is written under OP_HOME/data/backups/<timestamp>/ and excludes
|
|
@@ -123,6 +201,62 @@ function backupOpenPalmHome(homeDir) {
|
|
|
123
201
|
}
|
|
124
202
|
return copiedAny ? backupDir : null;
|
|
125
203
|
}
|
|
204
|
+
function listBackupDirs(homeDir) {
|
|
205
|
+
const backupsDir = join(homeDir, "data", "backups");
|
|
206
|
+
if (!existsSync(backupsDir)) return [];
|
|
207
|
+
return readdirSync(backupsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => join(backupsDir, entry.name)).sort((a, b) => b.localeCompare(a));
|
|
208
|
+
}
|
|
209
|
+
function dirSizeBytes(dir) {
|
|
210
|
+
let total = 0;
|
|
211
|
+
let entries;
|
|
212
|
+
try {
|
|
213
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
214
|
+
} catch {
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
for (const entry of entries) {
|
|
218
|
+
const full = join(dir, entry.name);
|
|
219
|
+
if (entry.isDirectory()) total += dirSizeBytes(full);
|
|
220
|
+
else if (entry.isFile()) try {
|
|
221
|
+
total += statSync(full).size;
|
|
222
|
+
} catch {}
|
|
223
|
+
}
|
|
224
|
+
return total;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Summarize the upgrade backup snapshots for UI visibility (count, total size,
|
|
228
|
+
* last-backup time, per-backup sizes). Read-only — never deletes anything.
|
|
229
|
+
*/
|
|
230
|
+
function summarizeBackups(homeDir) {
|
|
231
|
+
const backups = listBackupDirs(homeDir).map((path) => {
|
|
232
|
+
let createdAt = "";
|
|
233
|
+
try {
|
|
234
|
+
createdAt = statSync(path).mtime.toISOString();
|
|
235
|
+
} catch {}
|
|
236
|
+
return {
|
|
237
|
+
path,
|
|
238
|
+
name: path.slice(path.lastIndexOf("/") + 1),
|
|
239
|
+
sizeBytes: dirSizeBytes(path),
|
|
240
|
+
createdAt
|
|
241
|
+
};
|
|
242
|
+
});
|
|
243
|
+
const totalBytes = backups.reduce((sum, b) => sum + b.sizeBytes, 0);
|
|
244
|
+
return {
|
|
245
|
+
count: backups.length,
|
|
246
|
+
totalBytes,
|
|
247
|
+
lastBackupAt: backups[0]?.createdAt || null,
|
|
248
|
+
backups
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function pruneBackupDirs(homeDir, keep) {
|
|
252
|
+
if (!Number.isInteger(keep) || keep < 0) throw new Error("keep must be a non-negative integer");
|
|
253
|
+
const toDelete = listBackupDirs(homeDir).slice(keep);
|
|
254
|
+
for (const backupDir of toDelete) rmSync(backupDir, {
|
|
255
|
+
recursive: true,
|
|
256
|
+
force: true
|
|
257
|
+
});
|
|
258
|
+
return toDelete;
|
|
259
|
+
}
|
|
126
260
|
//#endregion
|
|
127
261
|
//#region ../lib/src/control-plane/install-lock.ts
|
|
128
262
|
var import_dist = require_dist();
|
|
@@ -249,6 +383,79 @@ function acquireInstallLock(dataDir) {
|
|
|
249
383
|
}
|
|
250
384
|
return null;
|
|
251
385
|
}
|
|
386
|
+
var INSTALL_LOCK_STALE_AFTER_MS = STALE_AFTER_MS;
|
|
387
|
+
/**
|
|
388
|
+
* Inspect the install lock under `dataDir` without modifying it. Used by the
|
|
389
|
+
* `openpalm unlock` command and the UI "operation stuck?" affordance to decide
|
|
390
|
+
* whether a removal is safe.
|
|
391
|
+
*/
|
|
392
|
+
function inspectInstallLock(dataDir) {
|
|
393
|
+
const path = join(dataDir, ".install.lock");
|
|
394
|
+
let content;
|
|
395
|
+
try {
|
|
396
|
+
content = readFileSync(path, "utf-8");
|
|
397
|
+
} catch (err) {
|
|
398
|
+
if (err.code === "ENOENT") return {
|
|
399
|
+
present: false,
|
|
400
|
+
path
|
|
401
|
+
};
|
|
402
|
+
let ageMs = null;
|
|
403
|
+
try {
|
|
404
|
+
ageMs = Date.now() - statSync(path).mtimeMs;
|
|
405
|
+
} catch {}
|
|
406
|
+
return {
|
|
407
|
+
present: true,
|
|
408
|
+
path,
|
|
409
|
+
pid: null,
|
|
410
|
+
timestamp: null,
|
|
411
|
+
ageMs,
|
|
412
|
+
stale: isStale(path)
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
const { pid, timestamp } = parseLockContent(content);
|
|
416
|
+
return {
|
|
417
|
+
present: true,
|
|
418
|
+
path,
|
|
419
|
+
pid,
|
|
420
|
+
timestamp,
|
|
421
|
+
ageMs: timestamp !== null ? Date.now() - timestamp : null,
|
|
422
|
+
stale: isStale(path)
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Remove the install lock ONLY if it is stale (dead holder PID or older than
|
|
427
|
+
* the 30-minute staleness window). Never blind-removes a lock held by a live,
|
|
428
|
+
* recent install. Returns `{ ok: false, reason: "live" }` when the lock is
|
|
429
|
+
* still active so the caller can surface a clear message instead of forcing.
|
|
430
|
+
*/
|
|
431
|
+
function unlockInstallLock(dataDir) {
|
|
432
|
+
const status = inspectInstallLock(dataDir);
|
|
433
|
+
if (!status.present) return {
|
|
434
|
+
ok: true,
|
|
435
|
+
removed: false,
|
|
436
|
+
status
|
|
437
|
+
};
|
|
438
|
+
if (!status.stale) return {
|
|
439
|
+
ok: false,
|
|
440
|
+
reason: "live",
|
|
441
|
+
status
|
|
442
|
+
};
|
|
443
|
+
try {
|
|
444
|
+
rmSync(status.path, { force: true });
|
|
445
|
+
logger$11.info("removed stale install lock via unlock", { path: status.path });
|
|
446
|
+
} catch (err) {
|
|
447
|
+
logger$11.warn("failed to remove stale install lock during unlock", {
|
|
448
|
+
path: status.path,
|
|
449
|
+
error: err instanceof Error ? err.message : String(err)
|
|
450
|
+
});
|
|
451
|
+
throw err;
|
|
452
|
+
}
|
|
453
|
+
return {
|
|
454
|
+
ok: true,
|
|
455
|
+
removed: true,
|
|
456
|
+
status
|
|
457
|
+
};
|
|
458
|
+
}
|
|
252
459
|
function releaseInstallLock(handle) {
|
|
253
460
|
if (!handle) return;
|
|
254
461
|
try {
|
|
@@ -530,7 +737,7 @@ var import_main = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
530
737
|
module.exports = DotenvModule;
|
|
531
738
|
})))();
|
|
532
739
|
var package_default = {
|
|
533
|
-
version: "0.12.0-rc.
|
|
740
|
+
version: "0.12.0-rc.4"};
|
|
534
741
|
//#endregion
|
|
535
742
|
//#region ../lib/src/control-plane/versioning.ts
|
|
536
743
|
var SEMVER_RE = /^v?\d+\.\d+\.\d+(?:[-+].*)?$/;
|
|
@@ -739,6 +946,146 @@ function mergeEnvContent(content, updates, options = {}) {
|
|
|
739
946
|
return lines.join("\n");
|
|
740
947
|
}
|
|
741
948
|
//#endregion
|
|
949
|
+
//#region ../lib/src/control-plane/addon-env-schemas.ts
|
|
950
|
+
/**
|
|
951
|
+
* Built-in addon env-config SCHEMAS — a LEAF module (no imports) so it can be
|
|
952
|
+
* shared by both `addons.ts` (which has a heavy import graph) and the migration
|
|
953
|
+
* harness without creating an import cycle (lifecycle → migrations → addons → …).
|
|
954
|
+
*
|
|
955
|
+
* Each schema is an env-file-shaped string: `KEY=default` lines annotated with
|
|
956
|
+
* `# @required` / `# @sensitive` comment lines directly above the key.
|
|
957
|
+
*/
|
|
958
|
+
var BUILTIN_ADDON_ENV_SCHEMAS = {
|
|
959
|
+
api: `# API Gateway portal configuration
|
|
960
|
+
# ---
|
|
961
|
+
`,
|
|
962
|
+
chat: `# Web Chat portal configuration
|
|
963
|
+
# ---
|
|
964
|
+
`,
|
|
965
|
+
discord: `# Discord bot configuration
|
|
966
|
+
# ---
|
|
967
|
+
|
|
968
|
+
# Discord credentials
|
|
969
|
+
# ---
|
|
970
|
+
|
|
971
|
+
# Application ID from the Discord Developer Portal.
|
|
972
|
+
# https://discord.com/developers/applications
|
|
973
|
+
# @required
|
|
974
|
+
DISCORD_APPLICATION_ID=
|
|
975
|
+
|
|
976
|
+
# Bot token from the Discord Developer Portal (Bot → Token).
|
|
977
|
+
# @required @sensitive
|
|
978
|
+
DISCORD_BOT_TOKEN=
|
|
979
|
+
|
|
980
|
+
# ---
|
|
981
|
+
# Access control
|
|
982
|
+
# ---
|
|
983
|
+
|
|
984
|
+
# Comma-separated allowed guild (server) IDs. Empty = all joined guilds.
|
|
985
|
+
DISCORD_ALLOWED_GUILDS=
|
|
986
|
+
|
|
987
|
+
# Comma-separated allowed role IDs.
|
|
988
|
+
DISCORD_ALLOWED_ROLES=
|
|
989
|
+
|
|
990
|
+
# Comma-separated allowed user IDs.
|
|
991
|
+
DISCORD_ALLOWED_USERS=
|
|
992
|
+
|
|
993
|
+
# Comma-separated blocked user IDs (denied even if otherwise allowed).
|
|
994
|
+
DISCORD_BLOCKED_USERS=
|
|
995
|
+
|
|
996
|
+
# ---
|
|
997
|
+
# Behavior
|
|
998
|
+
# ---
|
|
999
|
+
|
|
1000
|
+
# Register slash commands on startup.
|
|
1001
|
+
DISCORD_REGISTER_COMMANDS=true
|
|
1002
|
+
|
|
1003
|
+
# Hours before a conversation thread expires.
|
|
1004
|
+
DISCORD_THREAD_TTL_HOURS=24
|
|
1005
|
+
|
|
1006
|
+
# Milliseconds to wait before forwarding a message (0 = immediate).
|
|
1007
|
+
DISCORD_FORWARD_TIMEOUT_MS=0
|
|
1008
|
+
`,
|
|
1009
|
+
slack: `# Slack bot configuration
|
|
1010
|
+
# ---
|
|
1011
|
+
|
|
1012
|
+
# Slack credentials
|
|
1013
|
+
# ---
|
|
1014
|
+
|
|
1015
|
+
# Bot User OAuth Token (OAuth & Permissions → Bot User OAuth Token).
|
|
1016
|
+
# @required @sensitive
|
|
1017
|
+
SLACK_BOT_TOKEN=
|
|
1018
|
+
|
|
1019
|
+
# App-Level Token with connections:write (Basic Information → App-Level Tokens).
|
|
1020
|
+
# @required @sensitive
|
|
1021
|
+
SLACK_APP_TOKEN=
|
|
1022
|
+
|
|
1023
|
+
# ---
|
|
1024
|
+
# Access control
|
|
1025
|
+
# ---
|
|
1026
|
+
|
|
1027
|
+
# Comma-separated allowed channel IDs. Empty = all channels the bot is in.
|
|
1028
|
+
SLACK_ALLOWED_CHANNELS=
|
|
1029
|
+
|
|
1030
|
+
# Comma-separated allowed user IDs.
|
|
1031
|
+
SLACK_ALLOWED_USERS=
|
|
1032
|
+
|
|
1033
|
+
# Comma-separated blocked user IDs.
|
|
1034
|
+
SLACK_BLOCKED_USERS=
|
|
1035
|
+
|
|
1036
|
+
`,
|
|
1037
|
+
gateway: "",
|
|
1038
|
+
ollama: "",
|
|
1039
|
+
voice: `# OpenPalm Voice (Kokoro TTS + Whisper STT) configuration
|
|
1040
|
+
# ---
|
|
1041
|
+
# Local inference server — no upstream API or key. Values are optional; the
|
|
1042
|
+
# compose overlay supplies safe defaults.
|
|
1043
|
+
|
|
1044
|
+
# faster-whisper model id. Default base.en is baked into the image.
|
|
1045
|
+
# @required
|
|
1046
|
+
OP_VOICE_WHISPER_MODEL=base.en
|
|
1047
|
+
|
|
1048
|
+
# Default Kokoro voice id (54 bundled voices, e.g. af_heart, am_michael).
|
|
1049
|
+
OP_VOICE_KOKORO_VOICE=bf_isabella
|
|
1050
|
+
|
|
1051
|
+
# Python logging level: debug, info, warning, error.
|
|
1052
|
+
OP_VOICE_LOG_LEVEL=info
|
|
1053
|
+
`
|
|
1054
|
+
};
|
|
1055
|
+
/**
|
|
1056
|
+
* The set of NON-sensitive addon env keys declared in BUILTIN_ADDON_ENV_SCHEMAS
|
|
1057
|
+
* — a `KEY=` line whose annotation comment block does NOT carry `@sensitive`.
|
|
1058
|
+
*
|
|
1059
|
+
* This is the ALLOWLIST for the C4 `knowledge/secrets/` → `stack.env` migration:
|
|
1060
|
+
* it must only ever promote real, declared, non-sensitive addon config. The
|
|
1061
|
+
* secrets dir is a GENERAL secret store (ssh keys, github/OAuth creds, akm
|
|
1062
|
+
* secrets, per-portal verification secrets) — a file must never be copied into
|
|
1063
|
+
* the non-secret stack.env just because its name lacks a `_TOKEN/_SECRET/...`
|
|
1064
|
+
* suffix.
|
|
1065
|
+
*/
|
|
1066
|
+
function nonSensitiveAddonEnvKeys() {
|
|
1067
|
+
const keys = /* @__PURE__ */ new Set();
|
|
1068
|
+
const KEY_RE = /^([A-Z][A-Z0-9_]*)=/;
|
|
1069
|
+
for (const schema of Object.values(BUILTIN_ADDON_ENV_SCHEMAS)) {
|
|
1070
|
+
let sensitive = false;
|
|
1071
|
+
for (const raw of schema.split("\n")) {
|
|
1072
|
+
const trimmed = raw.trim();
|
|
1073
|
+
if (trimmed.startsWith("#")) {
|
|
1074
|
+
if (/@sensitive\b/.test(trimmed)) sensitive = true;
|
|
1075
|
+
continue;
|
|
1076
|
+
}
|
|
1077
|
+
const m = raw.match(KEY_RE);
|
|
1078
|
+
if (m) {
|
|
1079
|
+
if (!sensitive) keys.add(m[1]);
|
|
1080
|
+
sensitive = false;
|
|
1081
|
+
continue;
|
|
1082
|
+
}
|
|
1083
|
+
if (trimmed === "") sensitive = false;
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
return keys;
|
|
1087
|
+
}
|
|
1088
|
+
//#endregion
|
|
742
1089
|
//#region ../lib/src/control-plane/image-tags.ts
|
|
743
1090
|
var PLATFORM_IMAGE_TAG_KEYS = [
|
|
744
1091
|
"OP_ASSISTANT_IMAGE_TAG",
|
|
@@ -803,8 +1150,11 @@ function buildPlatformImageTagEnv(tag, perImage, pinnedImages = []) {
|
|
|
803
1150
|
* - Otherwise: acquire the install lock, take a FULL-HOME backup first, and
|
|
804
1151
|
* abort the whole upgrade if the backup fails (never migrate without a
|
|
805
1152
|
* verified safety copy).
|
|
806
|
-
* - Migrations are
|
|
807
|
-
*
|
|
1153
|
+
* - Migrations are additive for USER data (never delete/overwrite user files;
|
|
1154
|
+
* relocate, don't drop). They MAY remove SYSTEM-managed inert files (e.g. a
|
|
1155
|
+
* compose overlay the control plane no longer loads) via an explicit
|
|
1156
|
+
* allowlist — but only because the FULL-HOME backup above runs first, so the
|
|
1157
|
+
* home stays fully recoverable. Never a heuristic sweep, never user data.
|
|
808
1158
|
* - The OP_LAYOUT_VERSION bump is the LAST step (the commit point); a crash
|
|
809
1159
|
* before it just re-runs next time (idempotent).
|
|
810
1160
|
* - On failure, throw MigrationError carrying the backup path + recovery
|
|
@@ -822,6 +1172,22 @@ var MigrationError = class extends Error {
|
|
|
822
1172
|
this.name = "MigrationError";
|
|
823
1173
|
}
|
|
824
1174
|
};
|
|
1175
|
+
/**
|
|
1176
|
+
* Thrown when the pre-backup free-space check estimates the safety backup would
|
|
1177
|
+
* exceed a safe fraction of free disk. Surfaced so callers (CLI/UI) can present
|
|
1178
|
+
* a plain-language warning and re-run with explicit confirmation. NOTHING is
|
|
1179
|
+
* deleted — the migration aborts cleanly with no changes made.
|
|
1180
|
+
*/
|
|
1181
|
+
var BackupSpaceError = class extends MigrationError {
|
|
1182
|
+
estimatedBytes;
|
|
1183
|
+
freeBytes;
|
|
1184
|
+
constructor(message, guidance, estimatedBytes, freeBytes) {
|
|
1185
|
+
super(message, guidance, null);
|
|
1186
|
+
this.estimatedBytes = estimatedBytes;
|
|
1187
|
+
this.freeBytes = freeBytes;
|
|
1188
|
+
this.name = "BackupSpaceError";
|
|
1189
|
+
}
|
|
1190
|
+
};
|
|
825
1191
|
var RELEASE_VERSION_KEY = "OP_RELEASE_VERSION";
|
|
826
1192
|
function resolveMigrationPaths(homeDir) {
|
|
827
1193
|
return {
|
|
@@ -866,7 +1232,7 @@ function readLayoutVersion(ctx) {
|
|
|
866
1232
|
if (m) return Number(m[1]);
|
|
867
1233
|
}
|
|
868
1234
|
if (existsSync(join(ctx.homeDir, "vault"))) return 0;
|
|
869
|
-
return
|
|
1235
|
+
return 2;
|
|
870
1236
|
}
|
|
871
1237
|
function readStampedLayoutVersion(stashDir) {
|
|
872
1238
|
const raw = readStackEnvValue(stashDir, LAYOUT_VERSION_KEY);
|
|
@@ -980,9 +1346,11 @@ function migrateAddonConfigToStackEnv(ctx) {
|
|
|
980
1346
|
if (!existsSync(secretsDir)) return;
|
|
981
1347
|
const stackContent = readFileSync(envPath, "utf-8");
|
|
982
1348
|
const additions = {};
|
|
1349
|
+
const allowedKeys = nonSensitiveAddonEnvKeys();
|
|
983
1350
|
for (const filename of readdirSync(secretsDir)) {
|
|
984
1351
|
if (filename.includes(".") || filename.includes("/")) continue;
|
|
985
1352
|
const envKey = filename.toUpperCase();
|
|
1353
|
+
if (!allowedKeys.has(envKey)) continue;
|
|
986
1354
|
if (ADDON_SENSITIVE_KEY_RE.test(envKey)) continue;
|
|
987
1355
|
if (new RegExp(`^${envKey}=`, "m").test(stackContent)) {
|
|
988
1356
|
ctx.log(`skip (exists in stack.env): ${envKey}`);
|
|
@@ -1230,6 +1598,32 @@ function readLegacyStackYmlAddons(ctx) {
|
|
|
1230
1598
|
}
|
|
1231
1599
|
return [];
|
|
1232
1600
|
}
|
|
1601
|
+
/**
|
|
1602
|
+
* SYSTEM-managed files the 0.12.0 control plane no longer materializes or reads.
|
|
1603
|
+
* Removed so OP_HOME holds only the current managed asset set. This is an explicit
|
|
1604
|
+
* ALLOWLIST of system files — NEVER user data, NEVER a heuristic sweep:
|
|
1605
|
+
* - config/stack/channels.compose.yml — renamed to portals.compose.yml in 0.12.0;
|
|
1606
|
+
* the control plane loads an explicit overlay list (not a glob), so it is inert.
|
|
1607
|
+
* - config/stack/stack.yml — the StackSpec was removed in 0.11.0 (addons live in
|
|
1608
|
+
* OP_ENABLED_ADDONS; the 0→1 migration already extracts any legacy addons[]).
|
|
1609
|
+
* Removal is safe because the layout-migration path takes a FULL OP_HOME backup
|
|
1610
|
+
* first and aborts if it fails (see ensureMigrated), so a stamped layout bump is
|
|
1611
|
+
* always recoverable. User data is never removed; if a future inert path actually
|
|
1612
|
+
* holds user data it must be MOVED to its proper location here, not deleted.
|
|
1613
|
+
*/
|
|
1614
|
+
var INERT_LAYOUT_V2_FILES = [join("config", "stack", "channels.compose.yml"), join("config", "stack", "stack.yml")];
|
|
1615
|
+
function migrate1to2(ctx) {
|
|
1616
|
+
for (const rel of INERT_LAYOUT_V2_FILES) {
|
|
1617
|
+
const full = join(ctx.homeDir, rel);
|
|
1618
|
+
if (!existsSync(full)) continue;
|
|
1619
|
+
if (ctx.dryRun) {
|
|
1620
|
+
ctx.log(`[dry-run] remove inert system file: ${rel}`);
|
|
1621
|
+
continue;
|
|
1622
|
+
}
|
|
1623
|
+
rmSync(full, { force: true });
|
|
1624
|
+
ctx.log(`removed inert pre-0.12.0 system file: ${rel}`);
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1233
1627
|
var MIGRATIONS = [{
|
|
1234
1628
|
from: 0,
|
|
1235
1629
|
to: 1,
|
|
@@ -1239,6 +1633,15 @@ var MIGRATIONS = [{
|
|
|
1239
1633
|
if (ctx.dryRun) return;
|
|
1240
1634
|
if (!existsSync(stackEnvFile(ctx.stashDir))) throw new Error("post-migration check failed: knowledge/env/stack.env is missing");
|
|
1241
1635
|
}
|
|
1636
|
+
}, {
|
|
1637
|
+
from: 1,
|
|
1638
|
+
to: 2,
|
|
1639
|
+
describe: "drop inert pre-0.12.0 system files (channels.compose.yml, stack.yml)",
|
|
1640
|
+
apply: migrate1to2,
|
|
1641
|
+
verify(ctx) {
|
|
1642
|
+
if (ctx.dryRun) return;
|
|
1643
|
+
for (const rel of INERT_LAYOUT_V2_FILES) if (existsSync(join(ctx.homeDir, rel))) throw new Error(`post-migration check failed: inert ${rel} still present`);
|
|
1644
|
+
}
|
|
1242
1645
|
}];
|
|
1243
1646
|
var RELEASE_MIGRATIONS = [
|
|
1244
1647
|
{
|
|
@@ -1273,7 +1676,7 @@ var RELEASE_MIGRATIONS = [
|
|
|
1273
1676
|
verify(ctx) {}
|
|
1274
1677
|
}
|
|
1275
1678
|
];
|
|
1276
|
-
var RECOVERY_GUIDANCE = "Your original files were left untouched and a full backup was taken first.
|
|
1679
|
+
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";
|
|
1277
1680
|
function resolveComparableReleaseTarget(rawVersion) {
|
|
1278
1681
|
if (!rawVersion) return null;
|
|
1279
1682
|
return isComparableSemver(rawVersion) ? rawVersion : null;
|
|
@@ -1311,6 +1714,7 @@ function runReleaseMigrations(ctxBase, releaseFrom, targetVersion) {
|
|
|
1311
1714
|
function ensureMigrated(opts = {}) {
|
|
1312
1715
|
const homeDir = opts.homeDir ? resolve(opts.homeDir) : process.env.OP_HOME ? resolve(process.env.OP_HOME) : resolve(process.env.HOME ?? "", ".openpalm");
|
|
1313
1716
|
const dryRun = opts.dryRun ?? false;
|
|
1717
|
+
const confirmLowSpace = opts.confirmLowSpace ?? false;
|
|
1314
1718
|
const log = opts.log ?? (() => {});
|
|
1315
1719
|
const ctxBase = {
|
|
1316
1720
|
...resolveMigrationPaths(homeDir),
|
|
@@ -1324,7 +1728,7 @@ function ensureMigrated(opts = {}) {
|
|
|
1324
1728
|
const layoutStamp = readStampedLayoutVersion(ctxBase.stashDir);
|
|
1325
1729
|
const releaseTargetRaw = releaseStamp ?? readImageTag(ctxBase.stashDir);
|
|
1326
1730
|
const comparableReleaseTarget = resolveComparableReleaseTarget(releaseTargetRaw);
|
|
1327
|
-
const needsLayoutStamp = layoutStamp !==
|
|
1731
|
+
const needsLayoutStamp = layoutStamp !== 2;
|
|
1328
1732
|
const needsReleaseStamp = comparableReleaseTarget !== null && releaseStamp !== comparableReleaseTarget;
|
|
1329
1733
|
const empty = {
|
|
1330
1734
|
migrated: false,
|
|
@@ -1337,11 +1741,11 @@ function ensureMigrated(opts = {}) {
|
|
|
1337
1741
|
releaseTo: comparableReleaseTarget ?? releaseFrom ?? "",
|
|
1338
1742
|
releaseApplied: []
|
|
1339
1743
|
};
|
|
1340
|
-
const pending = MIGRATIONS.filter((m) => m.from >= from && m.from <
|
|
1744
|
+
const pending = MIGRATIONS.filter((m) => m.from >= from && m.from < 2).sort((a, b) => a.from - b.from);
|
|
1341
1745
|
const pendingRelease = comparableReleaseTarget ? selectPendingReleaseMigrations(releaseFrom, comparableReleaseTarget) : [];
|
|
1342
1746
|
if (pending.length === 0 && pendingRelease.length === 0 && !needsLayoutStamp && !needsReleaseStamp) return {
|
|
1343
1747
|
...empty,
|
|
1344
|
-
to:
|
|
1748
|
+
to: 2
|
|
1345
1749
|
};
|
|
1346
1750
|
let lock = null;
|
|
1347
1751
|
let backupDir = null;
|
|
@@ -1354,6 +1758,8 @@ function ensureMigrated(opts = {}) {
|
|
|
1354
1758
|
}
|
|
1355
1759
|
lock = acquireInstallLock(ctxBase.dataDir);
|
|
1356
1760
|
if (!lock) throw new MigrationError("Another install/upgrade is in progress.", RECOVERY_GUIDANCE, null);
|
|
1761
|
+
const spaceCheck = checkBackupFreeSpace(homeDir);
|
|
1762
|
+
if (spaceCheck.insufficient && !confirmLowSpace) throw new BackupSpaceError(describeBackupSpaceShortfall(spaceCheck), RECOVERY_GUIDANCE, spaceCheck.estimatedBytes, spaceCheck.freeBytes);
|
|
1357
1763
|
log("Taking a full backup before migrating…");
|
|
1358
1764
|
try {
|
|
1359
1765
|
backupDir = backupOpenPalmHome(homeDir);
|
|
@@ -1381,13 +1787,13 @@ function ensureMigrated(opts = {}) {
|
|
|
1381
1787
|
}, releaseFrom, releaseTargetRaw);
|
|
1382
1788
|
if (!dryRun && releaseTargetRaw && comparableReleaseTarget === null) logSkippedNonComparableReleaseStamp(log, notes, releaseTargetRaw);
|
|
1383
1789
|
if (!dryRun) {
|
|
1384
|
-
stampLayoutVersion(ctxBase.stashDir,
|
|
1790
|
+
stampLayoutVersion(ctxBase.stashDir, 2);
|
|
1385
1791
|
if (comparableReleaseTarget) stampReleaseVersion(ctxBase.stashDir, comparableReleaseTarget);
|
|
1386
1792
|
}
|
|
1387
1793
|
return {
|
|
1388
1794
|
migrated: true,
|
|
1389
1795
|
from,
|
|
1390
|
-
to:
|
|
1796
|
+
to: 2,
|
|
1391
1797
|
applied,
|
|
1392
1798
|
backupDir,
|
|
1393
1799
|
notes,
|
|
@@ -5336,20 +5742,84 @@ function writeSystemEnv(state) {
|
|
|
5336
5742
|
if (!hasUsableOperatorId(parsed, "OP_GID")) adminManaged.OP_GID = String(ids.gid);
|
|
5337
5743
|
}
|
|
5338
5744
|
if (!parsed.OP_HOME) adminManaged.OP_HOME = state.homeDir;
|
|
5339
|
-
|
|
5745
|
+
const { content: strippedBase, removed } = stripSecretLikeEnvKeys(base);
|
|
5746
|
+
base = strippedBase;
|
|
5747
|
+
if (removed.length > 0) {
|
|
5748
|
+
logger$7.warn("Removed secret-looking keys from stack.env (they belong in Connections/secrets)", {
|
|
5749
|
+
removedKeys: removed,
|
|
5750
|
+
stackEnvPath: systemEnvPath
|
|
5751
|
+
});
|
|
5752
|
+
recordSecretStripNotice(state, removed);
|
|
5753
|
+
}
|
|
5340
5754
|
assertNoSecretLikeStackEnvKeys(parseEnvContent(base));
|
|
5341
5755
|
assertNoSecretLikeStackEnvKeys(adminManaged);
|
|
5342
5756
|
writeFileSync(systemEnvPath, mergeEnvContent(base, adminManaged, { sectionHeader: "# ── Admin-managed ──────────────────────────────────────────────────" }), { mode: 384 });
|
|
5343
5757
|
chmodSync(systemEnvPath, 384);
|
|
5344
5758
|
}
|
|
5345
5759
|
function stripSecretLikeEnvKeys(content) {
|
|
5346
|
-
|
|
5347
|
-
|
|
5348
|
-
|
|
5349
|
-
|
|
5350
|
-
|
|
5351
|
-
|
|
5352
|
-
|
|
5760
|
+
const removed = [];
|
|
5761
|
+
return {
|
|
5762
|
+
content: content.split("\n").filter((line) => {
|
|
5763
|
+
let trimmed = line.trim();
|
|
5764
|
+
if (trimmed.startsWith("export ")) trimmed = trimmed.slice(7).trimStart();
|
|
5765
|
+
const eq = trimmed.indexOf("=");
|
|
5766
|
+
if (eq <= 0) return true;
|
|
5767
|
+
const key = trimmed.slice(0, eq).trim();
|
|
5768
|
+
if (isSecretLikeStackEnvKey(key)) {
|
|
5769
|
+
removed.push(key);
|
|
5770
|
+
return false;
|
|
5771
|
+
}
|
|
5772
|
+
return true;
|
|
5773
|
+
}).join("\n"),
|
|
5774
|
+
removed
|
|
5775
|
+
};
|
|
5776
|
+
}
|
|
5777
|
+
/**
|
|
5778
|
+
* Path of the one-time "secret-looking values were removed from stack.env"
|
|
5779
|
+
* notice the UI reads and dismisses.
|
|
5780
|
+
*/
|
|
5781
|
+
function secretStripNoticePath(state) {
|
|
5782
|
+
return `${state.dataDir}/secret-strip-notice.json`;
|
|
5783
|
+
}
|
|
5784
|
+
function recordSecretStripNotice(state, newlyRemoved) {
|
|
5785
|
+
const path = secretStripNoticePath(state);
|
|
5786
|
+
let keys = new Set(newlyRemoved);
|
|
5787
|
+
if (existsSync(path)) try {
|
|
5788
|
+
const prior = JSON.parse(readFileSync(path, "utf-8"));
|
|
5789
|
+
if (Array.isArray(prior.keys)) keys = new Set([...prior.keys, ...newlyRemoved]);
|
|
5790
|
+
} catch {}
|
|
5791
|
+
const notice = {
|
|
5792
|
+
keys: [...keys].sort(),
|
|
5793
|
+
at: (/* @__PURE__ */ new Date()).toISOString()
|
|
5794
|
+
};
|
|
5795
|
+
try {
|
|
5796
|
+
mkdirSync(state.dataDir, { recursive: true });
|
|
5797
|
+
writeFileSync(path, JSON.stringify(notice, null, 2));
|
|
5798
|
+
} catch (e) {
|
|
5799
|
+
logger$7.warn("Could not persist secret-strip notice", { error: e instanceof Error ? e.message : String(e) });
|
|
5800
|
+
}
|
|
5801
|
+
}
|
|
5802
|
+
/** Read the pending secret-strip notice, or null when there is none. */
|
|
5803
|
+
function readSecretStripNotice(state) {
|
|
5804
|
+
const path = secretStripNoticePath(state);
|
|
5805
|
+
if (!existsSync(path)) return null;
|
|
5806
|
+
try {
|
|
5807
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
5808
|
+
if (Array.isArray(parsed.keys) && parsed.keys.length > 0 && typeof parsed.at === "string") return {
|
|
5809
|
+
keys: parsed.keys,
|
|
5810
|
+
at: parsed.at
|
|
5811
|
+
};
|
|
5812
|
+
} catch {}
|
|
5813
|
+
return null;
|
|
5814
|
+
}
|
|
5815
|
+
/** Dismiss (delete) the pending secret-strip notice. */
|
|
5816
|
+
function dismissSecretStripNotice(state) {
|
|
5817
|
+
const path = secretStripNoticePath(state);
|
|
5818
|
+
if (existsSync(path)) try {
|
|
5819
|
+
rmSync(path);
|
|
5820
|
+
} catch (e) {
|
|
5821
|
+
logger$7.warn("Could not dismiss secret-strip notice", { error: e instanceof Error ? e.message : String(e) });
|
|
5822
|
+
}
|
|
5353
5823
|
}
|
|
5354
5824
|
function generateFallbackSystemEnv(state) {
|
|
5355
5825
|
const ids = resolveOperatorIds(state.homeDir);
|
|
@@ -5367,7 +5837,7 @@ function generateFallbackSystemEnv(state) {
|
|
|
5367
5837
|
...Object.entries(buildPlatformImageTagEnv(DEFAULT_IMAGE_TAG)).map(([key, value]) => `${key}=${value}`),
|
|
5368
5838
|
"",
|
|
5369
5839
|
"# ── Layout (on-disk schema version; managed by the migration harness) ──",
|
|
5370
|
-
`OP_LAYOUT_VERSION=
|
|
5840
|
+
`OP_LAYOUT_VERSION=2`,
|
|
5371
5841
|
"",
|
|
5372
5842
|
"# ── Enabled addons (comma-separated; managed via the Add-ons UI / CLI) ──",
|
|
5373
5843
|
"OP_ENABLED_ADDONS=",
|
|
@@ -5563,103 +6033,6 @@ var BUILTIN_ADDONS = [
|
|
|
5563
6033
|
"ssh",
|
|
5564
6034
|
"voice"
|
|
5565
6035
|
];
|
|
5566
|
-
var BUILTIN_ADDON_ENV_SCHEMAS = {
|
|
5567
|
-
api: `# API Gateway portal configuration
|
|
5568
|
-
# ---
|
|
5569
|
-
`,
|
|
5570
|
-
chat: `# Web Chat portal configuration
|
|
5571
|
-
# ---
|
|
5572
|
-
`,
|
|
5573
|
-
discord: `# Discord bot configuration
|
|
5574
|
-
# ---
|
|
5575
|
-
|
|
5576
|
-
# Discord credentials
|
|
5577
|
-
# ---
|
|
5578
|
-
|
|
5579
|
-
# Application ID from the Discord Developer Portal.
|
|
5580
|
-
# https://discord.com/developers/applications
|
|
5581
|
-
# @required
|
|
5582
|
-
DISCORD_APPLICATION_ID=
|
|
5583
|
-
|
|
5584
|
-
# Bot token from the Discord Developer Portal (Bot → Token).
|
|
5585
|
-
# @required @sensitive
|
|
5586
|
-
DISCORD_BOT_TOKEN=
|
|
5587
|
-
|
|
5588
|
-
# ---
|
|
5589
|
-
# Access control
|
|
5590
|
-
# ---
|
|
5591
|
-
|
|
5592
|
-
# Comma-separated allowed guild (server) IDs. Empty = all joined guilds.
|
|
5593
|
-
DISCORD_ALLOWED_GUILDS=
|
|
5594
|
-
|
|
5595
|
-
# Comma-separated allowed role IDs.
|
|
5596
|
-
DISCORD_ALLOWED_ROLES=
|
|
5597
|
-
|
|
5598
|
-
# Comma-separated allowed user IDs.
|
|
5599
|
-
DISCORD_ALLOWED_USERS=
|
|
5600
|
-
|
|
5601
|
-
# Comma-separated blocked user IDs (denied even if otherwise allowed).
|
|
5602
|
-
DISCORD_BLOCKED_USERS=
|
|
5603
|
-
|
|
5604
|
-
# ---
|
|
5605
|
-
# Behavior
|
|
5606
|
-
# ---
|
|
5607
|
-
|
|
5608
|
-
# Register slash commands on startup.
|
|
5609
|
-
DISCORD_REGISTER_COMMANDS=true
|
|
5610
|
-
|
|
5611
|
-
# Hours before a conversation thread expires.
|
|
5612
|
-
DISCORD_THREAD_TTL_HOURS=24
|
|
5613
|
-
|
|
5614
|
-
# Milliseconds to wait before forwarding a message (0 = immediate).
|
|
5615
|
-
DISCORD_FORWARD_TIMEOUT_MS=0
|
|
5616
|
-
`,
|
|
5617
|
-
slack: `# Slack bot configuration
|
|
5618
|
-
# ---
|
|
5619
|
-
|
|
5620
|
-
# Slack credentials
|
|
5621
|
-
# ---
|
|
5622
|
-
|
|
5623
|
-
# Bot User OAuth Token (OAuth & Permissions → Bot User OAuth Token).
|
|
5624
|
-
# @required @sensitive
|
|
5625
|
-
SLACK_BOT_TOKEN=
|
|
5626
|
-
|
|
5627
|
-
# App-Level Token with connections:write (Basic Information → App-Level Tokens).
|
|
5628
|
-
# @required @sensitive
|
|
5629
|
-
SLACK_APP_TOKEN=
|
|
5630
|
-
|
|
5631
|
-
# ---
|
|
5632
|
-
# Access control
|
|
5633
|
-
# ---
|
|
5634
|
-
|
|
5635
|
-
# Comma-separated allowed channel IDs. Empty = all channels the bot is in.
|
|
5636
|
-
SLACK_ALLOWED_CHANNELS=
|
|
5637
|
-
|
|
5638
|
-
# Comma-separated allowed user IDs.
|
|
5639
|
-
SLACK_ALLOWED_USERS=
|
|
5640
|
-
|
|
5641
|
-
# Comma-separated blocked user IDs.
|
|
5642
|
-
SLACK_BLOCKED_USERS=
|
|
5643
|
-
|
|
5644
|
-
`,
|
|
5645
|
-
gateway: "",
|
|
5646
|
-
ollama: "",
|
|
5647
|
-
voice: `# OpenPalm Voice (Kokoro TTS + Whisper STT) configuration
|
|
5648
|
-
# ---
|
|
5649
|
-
# Local inference server — no upstream API or key. Values are optional; the
|
|
5650
|
-
# compose overlay supplies safe defaults.
|
|
5651
|
-
|
|
5652
|
-
# faster-whisper model id. Default base.en is baked into the image.
|
|
5653
|
-
# @required
|
|
5654
|
-
OP_VOICE_WHISPER_MODEL=base.en
|
|
5655
|
-
|
|
5656
|
-
# Default Kokoro voice id (54 bundled voices, e.g. af_heart, am_michael).
|
|
5657
|
-
OP_VOICE_KOKORO_VOICE=bf_isabella
|
|
5658
|
-
|
|
5659
|
-
# Python logging level: debug, info, warning, error.
|
|
5660
|
-
OP_VOICE_LOG_LEVEL=info
|
|
5661
|
-
`
|
|
5662
|
-
};
|
|
5663
6036
|
function getRegistryAutomation(name) {
|
|
5664
6037
|
if (!VALID_NAME_RE.test(name)) return null;
|
|
5665
6038
|
const localOpenpalmDir = resolveLocalOpenpalmDir();
|
|
@@ -6991,6 +7364,43 @@ function resolvePlatformVersionPolicyBaseTag(state) {
|
|
|
6991
7364
|
* Non-semver targets (a moving `latest`/`dev` tag) are not comparable and are
|
|
6992
7365
|
* left to the resolver paths that turn them into a concrete release first.
|
|
6993
7366
|
*/
|
|
7367
|
+
/**
|
|
7368
|
+
* Downgrade-needs-confirmation signal (#501).
|
|
7369
|
+
*
|
|
7370
|
+
* Release migrations are forward-only (copy-only, additive); they do NOT run
|
|
7371
|
+
* backward. Pointing the stack at an OLDER tag than the one currently running is
|
|
7372
|
+
* therefore a data-safety event, not a routine version change: the older images
|
|
7373
|
+
* may not understand files the newer release already migrated. We don't block it
|
|
7374
|
+
* (a user may legitimately need to roll back), but we require an explicit
|
|
7375
|
+
* confirmation so it can't happen by a stray dropdown selection. The UI catches
|
|
7376
|
+
* this by `code` and shows a plain warning + confirm; the CLI surfaces the
|
|
7377
|
+
* message and a `--confirm`/`--yes` path.
|
|
7378
|
+
*/
|
|
7379
|
+
var DowngradeConfirmationRequired = class extends Error {
|
|
7380
|
+
code = "downgrade_confirmation_required";
|
|
7381
|
+
currentVersion;
|
|
7382
|
+
targetVersion;
|
|
7383
|
+
constructor(currentVersion, targetVersion) {
|
|
7384
|
+
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.`);
|
|
7385
|
+
this.name = "DowngradeConfirmationRequired";
|
|
7386
|
+
this.currentVersion = currentVersion;
|
|
7387
|
+
this.targetVersion = targetVersion;
|
|
7388
|
+
}
|
|
7389
|
+
};
|
|
7390
|
+
/**
|
|
7391
|
+
* Throw {@link DowngradeConfirmationRequired} when `targetTag` is strictly older
|
|
7392
|
+
* than the version currently configured in stack.env, unless the caller passed
|
|
7393
|
+
* an explicit confirmation. Non-semver tags (a moving `latest`/`dev` ref, or a
|
|
7394
|
+
* first install with no current tag) are not comparable and pass through — the
|
|
7395
|
+
* resolver paths turn `latest` into a concrete release before this runs.
|
|
7396
|
+
*/
|
|
7397
|
+
function assertNotUnconfirmedDowngrade(state, targetTag, confirmDowngrade) {
|
|
7398
|
+
if (confirmDowngrade) return;
|
|
7399
|
+
const currentTag = resolvePlatformVersionPolicyBaseTag(state);
|
|
7400
|
+
if (!isComparableSemver(targetTag) || !isComparableSemver(currentTag)) return;
|
|
7401
|
+
if (compareComparableVersions(targetTag, currentTag) >= 0) return;
|
|
7402
|
+
throw new DowngradeConfirmationRequired(currentTag, targetTag);
|
|
7403
|
+
}
|
|
6994
7404
|
function assertTargetNotNewerThanPlatform(targetTag) {
|
|
6995
7405
|
if (!isComparableSemver(targetTag) || !isComparableSemver(PLATFORM_VERSION)) return;
|
|
6996
7406
|
if (compareComparableVersions(targetTag, PLATFORM_VERSION) <= 0) return;
|
|
@@ -7098,6 +7508,15 @@ async function resolveLatestPlatformTag(namespace) {
|
|
|
7098
7508
|
if (!latestTag) throw new Error("No usable Docker image tag found");
|
|
7099
7509
|
return latestTag;
|
|
7100
7510
|
}
|
|
7511
|
+
/**
|
|
7512
|
+
* Resolve the default target version for `openpalm migrate --dry-run`: the
|
|
7513
|
+
* newest published platform tag in the current major. Mirrors the resolver the
|
|
7514
|
+
* upgrade path uses (same namespace, same base tag, same prerelease policy) so a
|
|
7515
|
+
* dry-run preview reflects the exact version `openpalm update` would move to.
|
|
7516
|
+
*/
|
|
7517
|
+
async function resolveDefaultMigrateTarget(state, opts = {}) {
|
|
7518
|
+
return resolveLatestPlatformTagForCurrentMajor(resolveImageNamespace(state), resolvePlatformVersionPolicyBaseTag(state), { allowPrerelease: opts.allowPrerelease });
|
|
7519
|
+
}
|
|
7101
7520
|
async function resolveLatestPlatformTagForCurrentMajor(namespace, currentTag, opts = {}) {
|
|
7102
7521
|
const skipPrerelease = !opts.allowPrerelease && !isPrerelease(currentTag);
|
|
7103
7522
|
const latestTag = resolveNewestDockerTag(await fetchDockerTagsPayload(namespace, "assistant"), {
|
|
@@ -7198,7 +7617,7 @@ async function performUpgrade(state, opts = {}) {
|
|
|
7198
7617
|
* Set a specific image tag in stack.env then pull images and restart containers.
|
|
7199
7618
|
* Used by the admin "set version" action — skips the auto-detect step in performUpgrade.
|
|
7200
7619
|
*/
|
|
7201
|
-
async function applyTagChange(state, tag) {
|
|
7620
|
+
async function applyTagChange(state, tag, opts = {}) {
|
|
7202
7621
|
return withStackEnvRollback(state, async () => {
|
|
7203
7622
|
const namespace = resolveImageNamespace(state);
|
|
7204
7623
|
const requested = tag.trim();
|
|
@@ -7210,6 +7629,7 @@ async function applyTagChange(state, tag) {
|
|
|
7210
7629
|
throw new Error(`Cannot resolve "latest" to a concrete release: ${msg}. Check your network connection or select a specific version.`);
|
|
7211
7630
|
}
|
|
7212
7631
|
assertTargetNotNewerThanPlatform(resolvedTag);
|
|
7632
|
+
assertNotUnconfirmedDowngrade(state, resolvedTag, opts.confirmDowngrade ?? false);
|
|
7213
7633
|
const stackEnvPath = `${state.stashDir}/env/stack.env`;
|
|
7214
7634
|
const currentEnv = parseEnvFile(stackEnvPath);
|
|
7215
7635
|
const pinnedImages = parsePinnedImages(currentEnv.OP_PINNED_IMAGES);
|
|
@@ -7695,7 +8115,7 @@ async function runDeploy(state, options = {}) {
|
|
|
7695
8115
|
const lock = acquireInstallLock(state.dataDir);
|
|
7696
8116
|
if (!lock) {
|
|
7697
8117
|
progress.deploying = false;
|
|
7698
|
-
progress.deployError = "install_in_progress: A deploy is already running. Wait for it to finish.";
|
|
8118
|
+
progress.deployError = "install_in_progress: A deploy is already running. Wait for it to finish (the lock clears itself automatically after 30 minutes). If you're sure nothing is running, run 'openpalm unlock' to clear a stale lock.";
|
|
7699
8119
|
emitProgress(options, progress);
|
|
7700
8120
|
return progress;
|
|
7701
8121
|
}
|
|
@@ -9369,7 +9789,7 @@ async function performSetup(input, opts) {
|
|
|
9369
9789
|
const lockHandle = acquireInstallLock(state.dataDir);
|
|
9370
9790
|
if (lockHandle === null) return {
|
|
9371
9791
|
ok: false,
|
|
9372
|
-
error: "install_in_progress: Another install is in progress. Wait for it to finish
|
|
9792
|
+
error: "install_in_progress: Another install is in progress. Wait for it to finish (the lock clears itself automatically after 30 minutes). If you're sure nothing is running, run 'openpalm unlock' to clear a stale lock."
|
|
9373
9793
|
};
|
|
9374
9794
|
logger.info("performing setup", { connectionCount: connections.length });
|
|
9375
9795
|
const updates = buildOwnerEnvFromSetup(owner);
|
|
@@ -9855,5 +10275,5 @@ function collectBindAddressWarnings(env) {
|
|
|
9855
10275
|
return warnings;
|
|
9856
10276
|
}
|
|
9857
10277
|
|
|
9858
|
-
export {
|
|
9859
|
-
//# sourceMappingURL=src-
|
|
10278
|
+
export { ensureReleaseMigrated as $, AKM_USER_ENV_REF as A, composeStats as B, CORE_SERVICES as C, DowngradeConfirmationRequired as D, composeStop as E, composeUp as F, createLogger as G, createOpenCodeClient as H, INSTALL_LOCK_STALE_AFTER_MS as I, createState as J, deleteUserEnvKey as K, deriveLaunchStatus as L, MigrationError as M, deriveLocalStackState as N, detectGpu as O, PLATFORM_VERSION as P, detectHostOpenCode as Q, detectLocalProviders as R, detectRuntime as S, disableHostAkmSharing as T, dismissSecretStripNotice as U, enableHostAkmSharing as V, ensureAkmUserEnv as W, ensureHomeDirs as X, ensureMigrated as Y, ensureOpenCodeConfig as Z, ensureOpenCodeSystemConfig as _, addonProfileId as a, writeRuntimeFiles as a$, ensureSecrets as a0, executeAutomation as a1, fetchProviderModels as a2, formatForDisplay as a3, getAddonProfileAvailability as a4, getAddonProfileSelection as a5, getAddonProfiles as a6, getAddonServiceNames as a7, getAkmStats as a8, getDockerEvents as a9, readSecret as aA, readSecretFile as aB, readSecretStripNotice as aC, readStackEnv as aD, readStackRuntimeEnv as aE, readStackSecretEnv as aF, readTaskFile as aG, readUserEnvFile as aH, recommendSetup as aI, removeSecretFile as aJ, removeTaskFile as aK, resolveComposeProjectName as aL, resolveDataDir as aM, resolveDefaultMigrateTarget as aN, resolveDeployJournalPath as aO, resolveRuntimeFiles as aP, resolveStackDir as aQ, runDeploy as aR, seedUiBuild as aS, setAddonEnabled as aT, setAddonProfileSelection as aU, summarizeBackups as aV, summarizeComposeStderr as aW, unlockInstallLock as aX, useExistingProviderForAssistantCli as aY, validateProposedState as aZ, writeFileAtomic as a_, getHostAkmSharingStatus as aa, getRegistryAddonConfig as ab, hostAkmStashPath as ac, importHostOpenCode as ad, initializeStateSecrets as ae, inspectInstallLock as af, isAllowedService as ag, isComparableSemver as ah, isHostAkmAvailable as ai, isSetupComplete as aj, listAssistantCliTools as ak, listAvailableAddonIds as al, listBackupDirs as am, listEnabledAddonIds as an, listSecretFiles as ao, loadAutomations as ap, mapDockerError as aq, markSetupComplete as ar, parseComposeStderr as as, parseEnvFile as at, patchSecretsEnvFile as au, performSetup as av, performUpgrade as aw, pruneBackupDirs as ax, readAutomationLogs as ay, readDeployJournal as az, annotateAddonProfileAvailability as b, writeSecretFile as b0, writeStackSecretEnv as b1, writeTaskFile as b2, writeUserEnvKey as b3, writeVoiceVars as b4, applyInstall as c, applyTagChange 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, compareComparableVersions as s, composeDown as t, composeLogs as u, composePreflight as v, composePs as w, composePull as x, composeRestart as y, composeStart as z };
|
|
10279
|
+
//# sourceMappingURL=src-kpR902Zr.js.map
|