@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.
Files changed (344) hide show
  1. package/build/.openpalm-ui-version +1 -1
  2. package/build/client/_app/immutable/assets/4.4BLkUSeP.css +1 -0
  3. package/build/client/_app/immutable/assets/4.4BLkUSeP.css.br +0 -0
  4. package/build/client/_app/immutable/assets/4.4BLkUSeP.css.gz +0 -0
  5. package/build/client/_app/immutable/chunks/BqFl1zbV.js +5 -0
  6. package/build/client/_app/immutable/chunks/BqFl1zbV.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/BqFl1zbV.js.gz +0 -0
  8. package/build/client/_app/immutable/chunks/CmFpvFC0.js +3 -0
  9. package/build/client/_app/immutable/chunks/CmFpvFC0.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/CmFpvFC0.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/CuPMacDQ.js +1 -0
  12. package/build/client/_app/immutable/chunks/CuPMacDQ.js.br +2 -0
  13. package/build/client/_app/immutable/chunks/CuPMacDQ.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/{DOWJsT_T.js → DHUWL49y.js} +1 -1
  15. package/build/client/_app/immutable/chunks/DHUWL49y.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/DHUWL49y.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{BEuC-NYT.js → DL5sMDxv.js} +1 -1
  18. package/build/client/_app/immutable/chunks/DL5sMDxv.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/DL5sMDxv.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/qjfxE7Kl.js +1 -0
  21. package/build/client/_app/immutable/chunks/qjfxE7Kl.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/qjfxE7Kl.js.gz +0 -0
  23. package/build/client/_app/immutable/entry/{app.Dgd8Sqiz.js → app.CafiV7-w.js} +2 -2
  24. package/build/client/_app/immutable/entry/app.CafiV7-w.js.br +0 -0
  25. package/build/client/_app/immutable/entry/app.CafiV7-w.js.gz +0 -0
  26. package/build/client/_app/immutable/entry/start.D9RjvJJI.js +1 -0
  27. package/build/client/_app/immutable/entry/start.D9RjvJJI.js.br +0 -0
  28. package/build/client/_app/immutable/entry/start.D9RjvJJI.js.gz +0 -0
  29. package/build/client/_app/immutable/nodes/{0.DEcud9DA.js → 0.CoKytf3n.js} +1 -1
  30. package/build/client/_app/immutable/nodes/0.CoKytf3n.js.br +0 -0
  31. package/build/client/_app/immutable/nodes/0.CoKytf3n.js.gz +0 -0
  32. package/build/client/_app/immutable/nodes/{1.DiTVmAJ4.js → 1.Bds7gMIH.js} +1 -1
  33. package/build/client/_app/immutable/nodes/1.Bds7gMIH.js.br +2 -0
  34. package/build/client/_app/immutable/nodes/1.Bds7gMIH.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/4.bkv3exaP.js +130 -0
  36. package/build/client/_app/immutable/nodes/4.bkv3exaP.js.br +0 -0
  37. package/build/client/_app/immutable/nodes/4.bkv3exaP.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/{5.WMP0f8pf.js → 5.CGnOiX1Q.js} +2 -2
  39. package/build/client/_app/immutable/nodes/5.CGnOiX1Q.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/5.CGnOiX1Q.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/{6.9o6Bephx.js → 6.BW2RFNrq.js} +1 -1
  42. package/build/client/_app/immutable/nodes/6.BW2RFNrq.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/6.BW2RFNrq.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/{7._N3I_xWy.js → 7.B3oQeWT9.js} +1 -1
  45. package/build/client/_app/immutable/nodes/7.B3oQeWT9.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/7.B3oQeWT9.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/{8.aWZ5mSKB.js → 8.BzjCWne1.js} +1 -1
  48. package/build/client/_app/immutable/nodes/8.BzjCWne1.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/8.BzjCWne1.js.gz +0 -0
  50. package/build/client/_app/version.json +1 -1
  51. package/build/client/_app/version.json.br +1 -1
  52. package/build/client/_app/version.json.gz +0 -0
  53. package/build/server/chunks/{0-u2E6UMPO.js → 0-_Ek7fSWr.js} +3 -3
  54. package/build/server/chunks/{0-u2E6UMPO.js.map → 0-_Ek7fSWr.js.map} +1 -1
  55. package/build/server/chunks/1-DXcmr_zA.js +9 -0
  56. package/build/server/chunks/{1-BdcHiFUZ.js.map → 1-DXcmr_zA.js.map} +1 -1
  57. package/build/server/chunks/{10-DMi_4x3S.js → 10-BW3Y4qaZ.js} +4 -4
  58. package/build/server/chunks/{10-DMi_4x3S.js.map → 10-BW3Y4qaZ.js.map} +1 -1
  59. package/build/server/chunks/4-BY7QM2MS.js +9 -0
  60. package/build/server/chunks/{4-siztlnPA.js.map → 4-BY7QM2MS.js.map} +1 -1
  61. package/build/server/chunks/5-P-f6Al-B.js +9 -0
  62. package/build/server/chunks/{5-DR1iBcbj.js.map → 5-P-f6Al-B.js.map} +1 -1
  63. package/build/server/chunks/6-BHZeYa5G.js +9 -0
  64. package/build/server/chunks/{6-BdZadUUO.js.map → 6-BHZeYa5G.js.map} +1 -1
  65. package/build/server/chunks/7-eE6c3_3B.js +9 -0
  66. package/build/server/chunks/{7-CjmZOzkF.js.map → 7-eE6c3_3B.js.map} +1 -1
  67. package/build/server/chunks/{8-DVpEHTHq.js → 8-DJTatpgo.js} +3 -3
  68. package/build/server/chunks/{8-DVpEHTHq.js.map → 8-DJTatpgo.js.map} +1 -1
  69. package/build/server/chunks/{ChatMessage-BNxQgrRW.js → ChatMessage-DqfLIJ0l.js} +2 -2
  70. package/build/server/chunks/{ChatMessage-BNxQgrRW.js.map → ChatMessage-DqfLIJ0l.js.map} +1 -1
  71. package/build/server/chunks/{Navbar-UVOusnw-.js → Navbar-BUZwbKR7.js} +4 -4
  72. package/build/server/chunks/{Navbar-UVOusnw-.js.map → Navbar-BUZwbKR7.js.map} +1 -1
  73. package/build/server/chunks/{_layout.svelte-DKvvz-xQ.js → _layout.svelte-CFKjimed.js} +2 -2
  74. package/build/server/chunks/{_layout.svelte-DKvvz-xQ.js.map → _layout.svelte-CFKjimed.js.map} +1 -1
  75. package/build/server/chunks/{_page.svelte-CMyq-t3Q.js → _page.svelte-BGI4E82g.js} +185 -32
  76. package/build/server/chunks/_page.svelte-BGI4E82g.js.map +1 -0
  77. package/build/server/chunks/{_page.svelte-B5xh8SJ5.js → _page.svelte-BNJwzskB.js} +7 -7
  78. package/build/server/chunks/{_page.svelte-B5xh8SJ5.js.map → _page.svelte-BNJwzskB.js.map} +1 -1
  79. package/build/server/chunks/{_page.svelte-w4SS3sVN.js → _page.svelte-BqrpD9EJ.js} +6 -6
  80. package/build/server/chunks/{_page.svelte-w4SS3sVN.js.map → _page.svelte-BqrpD9EJ.js.map} +1 -1
  81. package/build/server/chunks/{_page.svelte-B7FQDg28.js → _page.svelte-CLi7npId.js} +6 -6
  82. package/build/server/chunks/{_page.svelte-B7FQDg28.js.map → _page.svelte-CLi7npId.js.map} +1 -1
  83. package/build/server/chunks/{_page.svelte-D4Zivreu.js → _page.svelte-Da2QrUlJ.js} +3 -3
  84. package/build/server/chunks/{_page.svelte-D4Zivreu.js.map → _page.svelte-Da2QrUlJ.js.map} +1 -1
  85. package/build/server/chunks/{_server.ts-C_c_15ac.js → _server.ts--5gGceMl.js} +5 -5
  86. package/build/server/chunks/{_server.ts-C_c_15ac.js.map → _server.ts--5gGceMl.js.map} +1 -1
  87. package/build/server/chunks/{_server.ts-B7Fkprd8.js → _server.ts-4J6w-r81.js} +2 -2
  88. package/build/server/chunks/{_server.ts-B7Fkprd8.js.map → _server.ts-4J6w-r81.js.map} +1 -1
  89. package/build/server/chunks/{_server.ts-Bf3mh1Vw.js → _server.ts-8PqopElV.js} +5 -5
  90. package/build/server/chunks/{_server.ts-Bf3mh1Vw.js.map → _server.ts-8PqopElV.js.map} +1 -1
  91. package/build/server/chunks/{_server.ts-DPpj-ZUv.js → _server.ts-B28oMCZG.js} +5 -5
  92. package/build/server/chunks/{_server.ts-DPpj-ZUv.js.map → _server.ts-B28oMCZG.js.map} +1 -1
  93. package/build/server/chunks/{_server.ts-CfAx4ndA.js → _server.ts-B2veS97o.js} +5 -5
  94. package/build/server/chunks/{_server.ts-CfAx4ndA.js.map → _server.ts-B2veS97o.js.map} +1 -1
  95. package/build/server/chunks/{_server.ts-bClum6wa.js → _server.ts-B6X0dkuW.js} +5 -5
  96. package/build/server/chunks/{_server.ts-bClum6wa.js.map → _server.ts-B6X0dkuW.js.map} +1 -1
  97. package/build/server/chunks/{_server.ts-B1Ka3iiX.js → _server.ts-B9U_bYQy.js} +6 -6
  98. package/build/server/chunks/{_server.ts-B1Ka3iiX.js.map → _server.ts-B9U_bYQy.js.map} +1 -1
  99. package/build/server/chunks/{_server.ts-BHIqLHCr.js → _server.ts-BDjrSCF8.js} +2 -2
  100. package/build/server/chunks/{_server.ts-BHIqLHCr.js.map → _server.ts-BDjrSCF8.js.map} +1 -1
  101. package/build/server/chunks/{_server.ts-gLH0uvQH.js → _server.ts-BHJzuoOM.js} +6 -6
  102. package/build/server/chunks/{_server.ts-gLH0uvQH.js.map → _server.ts-BHJzuoOM.js.map} +1 -1
  103. package/build/server/chunks/{_server.ts-748DtXrC.js → _server.ts-BI3XQ7Fe.js} +5 -5
  104. package/build/server/chunks/{_server.ts-748DtXrC.js.map → _server.ts-BI3XQ7Fe.js.map} +1 -1
  105. package/build/server/chunks/{_server.ts-BR_JejQG.js → _server.ts-BLyLxx8a.js} +5 -5
  106. package/build/server/chunks/{_server.ts-BR_JejQG.js.map → _server.ts-BLyLxx8a.js.map} +1 -1
  107. package/build/server/chunks/{_server.ts-CN8iu9En.js → _server.ts-BNqC9EUT.js} +5 -5
  108. package/build/server/chunks/{_server.ts-CN8iu9En.js.map → _server.ts-BNqC9EUT.js.map} +1 -1
  109. package/build/server/chunks/{_server.ts-CCEnPIKA.js → _server.ts-BP--7Yt5.js} +5 -5
  110. package/build/server/chunks/{_server.ts-CCEnPIKA.js.map → _server.ts-BP--7Yt5.js.map} +1 -1
  111. package/build/server/chunks/{_server.ts-6sLoCHl6.js → _server.ts-BTG7yKQJ.js} +5 -5
  112. package/build/server/chunks/{_server.ts-6sLoCHl6.js.map → _server.ts-BTG7yKQJ.js.map} +1 -1
  113. package/build/server/chunks/{_server.ts-DQP6uEx5.js → _server.ts-BVvTNLyM.js} +5 -5
  114. package/build/server/chunks/{_server.ts-DQP6uEx5.js.map → _server.ts-BVvTNLyM.js.map} +1 -1
  115. package/build/server/chunks/{_server.ts-CDLW9TPG.js → _server.ts-BddFxHWB.js} +6 -6
  116. package/build/server/chunks/{_server.ts-CDLW9TPG.js.map → _server.ts-BddFxHWB.js.map} +1 -1
  117. package/build/server/chunks/{_server.ts-CzTX8a_p.js → _server.ts-BiL6n-uG.js} +5 -5
  118. package/build/server/chunks/{_server.ts-CzTX8a_p.js.map → _server.ts-BiL6n-uG.js.map} +1 -1
  119. package/build/server/chunks/{_server.ts-BhzFTv-h.js → _server.ts-Bnc-nxXp.js} +6 -6
  120. package/build/server/chunks/{_server.ts-BhzFTv-h.js.map → _server.ts-Bnc-nxXp.js.map} +1 -1
  121. package/build/server/chunks/{_server.ts-D2tkCP8q.js → _server.ts-BobwONzr.js} +5 -5
  122. package/build/server/chunks/{_server.ts-D2tkCP8q.js.map → _server.ts-BobwONzr.js.map} +1 -1
  123. package/build/server/chunks/{_server.ts-C9E9tYAO.js → _server.ts-BpNoIDkC.js} +5 -5
  124. package/build/server/chunks/{_server.ts-C9E9tYAO.js.map → _server.ts-BpNoIDkC.js.map} +1 -1
  125. package/build/server/chunks/{_server.ts-Dr6ShsbQ.js → _server.ts-BqBnHeP7.js} +5 -5
  126. package/build/server/chunks/{_server.ts-Dr6ShsbQ.js.map → _server.ts-BqBnHeP7.js.map} +1 -1
  127. package/build/server/chunks/{_server.ts-Dpk6ddyU.js → _server.ts-Bqs67HUU.js} +7 -7
  128. package/build/server/chunks/{_server.ts-Dpk6ddyU.js.map → _server.ts-Bqs67HUU.js.map} +1 -1
  129. package/build/server/chunks/{_server.ts-DT8fIE9B.js → _server.ts-BteARe-C.js} +5 -5
  130. package/build/server/chunks/{_server.ts-DT8fIE9B.js.map → _server.ts-BteARe-C.js.map} +1 -1
  131. package/build/server/chunks/{_server.ts-BdN5NtL4.js → _server.ts-Bx9WEYbj.js} +5 -5
  132. package/build/server/chunks/{_server.ts-BdN5NtL4.js.map → _server.ts-Bx9WEYbj.js.map} +1 -1
  133. package/build/server/chunks/{_server.ts-BaTXv_bR.js → _server.ts-C1ZgpST1.js} +5 -5
  134. package/build/server/chunks/{_server.ts-BaTXv_bR.js.map → _server.ts-C1ZgpST1.js.map} +1 -1
  135. package/build/server/chunks/{_server.ts-BEgkYvNh.js → _server.ts-C5bfYlSP.js} +5 -5
  136. package/build/server/chunks/{_server.ts-BEgkYvNh.js.map → _server.ts-C5bfYlSP.js.map} +1 -1
  137. package/build/server/chunks/{_server.ts-CILn0WEi.js → _server.ts-C77r_Slf.js} +5 -5
  138. package/build/server/chunks/{_server.ts-CILn0WEi.js.map → _server.ts-C77r_Slf.js.map} +1 -1
  139. package/build/server/chunks/{_server.ts-CxWx02dy.js → _server.ts-CK46ky8H.js} +5 -5
  140. package/build/server/chunks/_server.ts-CK46ky8H.js.map +1 -0
  141. package/build/server/chunks/{_server.ts-Ts6pcZ0d.js → _server.ts-CKF9vpjm.js} +5 -5
  142. package/build/server/chunks/{_server.ts-Ts6pcZ0d.js.map → _server.ts-CKF9vpjm.js.map} +1 -1
  143. package/build/server/chunks/{_server.ts-DsbN7dr7.js → _server.ts-CPmZZ9aQ.js} +5 -5
  144. package/build/server/chunks/{_server.ts-DsbN7dr7.js.map → _server.ts-CPmZZ9aQ.js.map} +1 -1
  145. package/build/server/chunks/{_server.ts-CgPqNf7-.js → _server.ts-CTMjNL2a.js} +5 -5
  146. package/build/server/chunks/{_server.ts-CgPqNf7-.js.map → _server.ts-CTMjNL2a.js.map} +1 -1
  147. package/build/server/chunks/{_server.ts-MJdHZvPF.js → _server.ts-CTQGj2tV.js} +5 -5
  148. package/build/server/chunks/_server.ts-CTQGj2tV.js.map +1 -0
  149. package/build/server/chunks/{_server.ts-DMTF4KjV.js → _server.ts-CVV2PdRo.js} +2 -2
  150. package/build/server/chunks/{_server.ts-DMTF4KjV.js.map → _server.ts-CVV2PdRo.js.map} +1 -1
  151. package/build/server/chunks/{_server.ts-CV30eOSb.js → _server.ts-CWFma6OW.js} +6 -6
  152. package/build/server/chunks/{_server.ts-CV30eOSb.js.map → _server.ts-CWFma6OW.js.map} +1 -1
  153. package/build/server/chunks/{_server.ts-C3ic1HZf.js → _server.ts-CaocPhJi.js} +5 -5
  154. package/build/server/chunks/{_server.ts-C3ic1HZf.js.map → _server.ts-CaocPhJi.js.map} +1 -1
  155. package/build/server/chunks/{_server.ts-Cscu5y6A.js → _server.ts-CfJR6lH-.js} +6 -6
  156. package/build/server/chunks/{_server.ts-Cscu5y6A.js.map → _server.ts-CfJR6lH-.js.map} +1 -1
  157. package/build/server/chunks/{_server.ts-CZ9rxA09.js → _server.ts-ClwJWqVa.js} +5 -5
  158. package/build/server/chunks/{_server.ts-CZ9rxA09.js.map → _server.ts-ClwJWqVa.js.map} +1 -1
  159. package/build/server/chunks/{_server.ts-CTKPnd64.js → _server.ts-CrY-tcDK.js} +7 -7
  160. package/build/server/chunks/{_server.ts-CTKPnd64.js.map → _server.ts-CrY-tcDK.js.map} +1 -1
  161. package/build/server/chunks/{_server.ts-op5C3XGb.js → _server.ts-Cs8lC4CS.js} +6 -6
  162. package/build/server/chunks/{_server.ts-op5C3XGb.js.map → _server.ts-Cs8lC4CS.js.map} +1 -1
  163. package/build/server/chunks/{_server.ts-DEV3GiN8.js → _server.ts-CxBdr3hE.js} +5 -5
  164. package/build/server/chunks/{_server.ts-DEV3GiN8.js.map → _server.ts-CxBdr3hE.js.map} +1 -1
  165. package/build/server/chunks/{_server.ts-RagJb3I4.js → _server.ts-D-u20jUU.js} +5 -5
  166. package/build/server/chunks/{_server.ts-RagJb3I4.js.map → _server.ts-D-u20jUU.js.map} +1 -1
  167. package/build/server/chunks/{_server.ts-Djimbzpw.js → _server.ts-D9dsMRF-.js} +7 -7
  168. package/build/server/chunks/{_server.ts-Djimbzpw.js.map → _server.ts-D9dsMRF-.js.map} +1 -1
  169. package/build/server/chunks/{_server.ts-D5WwDggN.js → _server.ts-DAQcUe9k.js} +5 -5
  170. package/build/server/chunks/{_server.ts-D5WwDggN.js.map → _server.ts-DAQcUe9k.js.map} +1 -1
  171. package/build/server/chunks/{_server.ts-BMeLIoiB.js → _server.ts-DAlXBvhR.js} +6 -6
  172. package/build/server/chunks/{_server.ts-BMeLIoiB.js.map → _server.ts-DAlXBvhR.js.map} +1 -1
  173. package/build/server/chunks/_server.ts-DC8kKPsd.js +81 -0
  174. package/build/server/chunks/_server.ts-DC8kKPsd.js.map +1 -0
  175. package/build/server/chunks/{_server.ts-Cs7f-gaR.js → _server.ts-DGUVJH31.js} +6 -6
  176. package/build/server/chunks/{_server.ts-Cs7f-gaR.js.map → _server.ts-DGUVJH31.js.map} +1 -1
  177. package/build/server/chunks/{_server.ts-DFhNnn-G.js → _server.ts-DHfTcOkp.js} +5 -5
  178. package/build/server/chunks/{_server.ts-DFhNnn-G.js.map → _server.ts-DHfTcOkp.js.map} +1 -1
  179. package/build/server/chunks/{_server.ts-CCtCwyZb.js → _server.ts-DMH-RbZr.js} +6 -6
  180. package/build/server/chunks/{_server.ts-CCtCwyZb.js.map → _server.ts-DMH-RbZr.js.map} +1 -1
  181. package/build/server/chunks/{_server.ts-CSN60plL.js → _server.ts-DP2uRN66.js} +2 -2
  182. package/build/server/chunks/{_server.ts-CSN60plL.js.map → _server.ts-DP2uRN66.js.map} +1 -1
  183. package/build/server/chunks/{_server.ts-JPsLUf_g.js → _server.ts-DR2bRoGJ.js} +5 -5
  184. package/build/server/chunks/{_server.ts-JPsLUf_g.js.map → _server.ts-DR2bRoGJ.js.map} +1 -1
  185. package/build/server/chunks/{_server.ts-DjJu23jV.js → _server.ts-DX2VL0w3.js} +5 -5
  186. package/build/server/chunks/{_server.ts-DjJu23jV.js.map → _server.ts-DX2VL0w3.js.map} +1 -1
  187. package/build/server/chunks/{_server.ts-Dv7xll_B.js → _server.ts-DY0Tkqlv.js} +6 -6
  188. package/build/server/chunks/{_server.ts-Dv7xll_B.js.map → _server.ts-DY0Tkqlv.js.map} +1 -1
  189. package/build/server/chunks/{_server.ts-zUZknmZx.js → _server.ts-DZ5v5q0V.js} +6 -6
  190. package/build/server/chunks/{_server.ts-zUZknmZx.js.map → _server.ts-DZ5v5q0V.js.map} +1 -1
  191. package/build/server/chunks/{_server.ts-BCKweCGM.js → _server.ts-DZlNWTv1.js} +4 -4
  192. package/build/server/chunks/{_server.ts-BCKweCGM.js.map → _server.ts-DZlNWTv1.js.map} +1 -1
  193. package/build/server/chunks/{_server.ts-DPw4QRWb.js → _server.ts-D_5BJC_z.js} +5 -5
  194. package/build/server/chunks/{_server.ts-DPw4QRWb.js.map → _server.ts-D_5BJC_z.js.map} +1 -1
  195. package/build/server/chunks/{_server.ts-BSxbdNXo.js → _server.ts-Da_AbetR.js} +5 -5
  196. package/build/server/chunks/{_server.ts-BSxbdNXo.js.map → _server.ts-Da_AbetR.js.map} +1 -1
  197. package/build/server/chunks/{_server.ts-BkxwpAv2.js → _server.ts-DbEaJJqa.js} +5 -5
  198. package/build/server/chunks/{_server.ts-BkxwpAv2.js.map → _server.ts-DbEaJJqa.js.map} +1 -1
  199. package/build/server/chunks/_server.ts-DnC_IrzP.js +78 -0
  200. package/build/server/chunks/_server.ts-DnC_IrzP.js.map +1 -0
  201. package/build/server/chunks/{_server.ts-Cc-c2ehY.js → _server.ts-DpAumRrq.js} +5 -5
  202. package/build/server/chunks/{_server.ts-Cc-c2ehY.js.map → _server.ts-DpAumRrq.js.map} +1 -1
  203. package/build/server/chunks/_server.ts-Dq1UL_W-.js +89 -0
  204. package/build/server/chunks/_server.ts-Dq1UL_W-.js.map +1 -0
  205. package/build/server/chunks/{_server.ts-Ieve8Oxl.js → _server.ts-DuDeloL8.js} +8 -8
  206. package/build/server/chunks/{_server.ts-Ieve8Oxl.js.map → _server.ts-DuDeloL8.js.map} +1 -1
  207. package/build/server/chunks/{_server.ts-BiwKKu1y.js → _server.ts-EZhgk1ej.js} +5 -5
  208. package/build/server/chunks/{_server.ts-BiwKKu1y.js.map → _server.ts-EZhgk1ej.js.map} +1 -1
  209. package/build/server/chunks/{_server.ts-DAv3C7oW.js → _server.ts-J-kbq-R4.js} +5 -5
  210. package/build/server/chunks/{_server.ts-DAv3C7oW.js.map → _server.ts-J-kbq-R4.js.map} +1 -1
  211. package/build/server/chunks/{_server.ts-BXOIslIH.js → _server.ts-MkaNzvkX.js} +5 -5
  212. package/build/server/chunks/{_server.ts-BXOIslIH.js.map → _server.ts-MkaNzvkX.js.map} +1 -1
  213. package/build/server/chunks/{_server.ts-lmfAKx6b.js → _server.ts-NKH2c4tC.js} +7 -7
  214. package/build/server/chunks/{_server.ts-lmfAKx6b.js.map → _server.ts-NKH2c4tC.js.map} +1 -1
  215. package/build/server/chunks/{_server.ts-B4WEAp6B.js → _server.ts-UDLeVWXU.js} +18 -6
  216. package/build/server/chunks/_server.ts-UDLeVWXU.js.map +1 -0
  217. package/build/server/chunks/{_server.ts-DRpXmKSI.js → _server.ts-X8_yz_cF.js} +6 -6
  218. package/build/server/chunks/{_server.ts-DRpXmKSI.js.map → _server.ts-X8_yz_cF.js.map} +1 -1
  219. package/build/server/chunks/{_server.ts-B2kJ3mfg.js → _server.ts-XqgZHMH_.js} +7 -7
  220. package/build/server/chunks/{_server.ts-B2kJ3mfg.js.map → _server.ts-XqgZHMH_.js.map} +1 -1
  221. package/build/server/chunks/{_server.ts-BFp9Fobi.js → _server.ts-YAPI25bu.js} +4 -4
  222. package/build/server/chunks/{_server.ts-BFp9Fobi.js.map → _server.ts-YAPI25bu.js.map} +1 -1
  223. package/build/server/chunks/{_server.ts-QdyZiBuA.js → _server.ts-_7nvJE2X.js} +5 -5
  224. package/build/server/chunks/{_server.ts-QdyZiBuA.js.map → _server.ts-_7nvJE2X.js.map} +1 -1
  225. package/build/server/chunks/{_server.ts-Cwuo2EyS.js → _server.ts-aC8GMqDc.js} +5 -5
  226. package/build/server/chunks/{_server.ts-Cwuo2EyS.js.map → _server.ts-aC8GMqDc.js.map} +1 -1
  227. package/build/server/chunks/{_server.ts-B_du9gRB.js → _server.ts-dRdq38xL.js} +5 -5
  228. package/build/server/chunks/{_server.ts-B_du9gRB.js.map → _server.ts-dRdq38xL.js.map} +1 -1
  229. package/build/server/chunks/{_server.ts-VuZwBycD.js → _server.ts-f-vnJ7Ie.js} +5 -5
  230. package/build/server/chunks/{_server.ts-VuZwBycD.js.map → _server.ts-f-vnJ7Ie.js.map} +1 -1
  231. package/build/server/chunks/{_server.ts-CMytohFo.js → _server.ts-fCMXRvRH.js} +5 -5
  232. package/build/server/chunks/{_server.ts-CMytohFo.js.map → _server.ts-fCMXRvRH.js.map} +1 -1
  233. package/build/server/chunks/{_server.ts-4Pwhm5iv.js → _server.ts-fn52Uf3f.js} +5 -5
  234. package/build/server/chunks/{_server.ts-4Pwhm5iv.js.map → _server.ts-fn52Uf3f.js.map} +1 -1
  235. package/build/server/chunks/{_server.ts-B25xvhiX.js → _server.ts-iw5QZKgP.js} +5 -5
  236. package/build/server/chunks/{_server.ts-B25xvhiX.js.map → _server.ts-iw5QZKgP.js.map} +1 -1
  237. package/build/server/chunks/{_server.ts-Byc_SyKx.js → _server.ts-lU516yVf.js} +5 -5
  238. package/build/server/chunks/{_server.ts-Byc_SyKx.js.map → _server.ts-lU516yVf.js.map} +1 -1
  239. package/build/server/chunks/_server.ts-mDvjMxar.js +64 -0
  240. package/build/server/chunks/_server.ts-mDvjMxar.js.map +1 -0
  241. package/build/server/chunks/{_server.ts-5cUQFkT_.js → _server.ts-n_99rmOB.js} +2 -2
  242. package/build/server/chunks/{_server.ts-5cUQFkT_.js.map → _server.ts-n_99rmOB.js.map} +1 -1
  243. package/build/server/chunks/{_server.ts-9zKJx2eV.js → _server.ts-pJnbal79.js} +5 -5
  244. package/build/server/chunks/{_server.ts-9zKJx2eV.js.map → _server.ts-pJnbal79.js.map} +1 -1
  245. package/build/server/chunks/{_server.ts-DY4maxIB.js → _server.ts-rEZaxK90.js} +6 -6
  246. package/build/server/chunks/{_server.ts-DY4maxIB.js.map → _server.ts-rEZaxK90.js.map} +1 -1
  247. package/build/server/chunks/{_server.ts-DE_dFybU.js → _server.ts-tyT3Bjv3.js} +7 -7
  248. package/build/server/chunks/{_server.ts-DE_dFybU.js.map → _server.ts-tyT3Bjv3.js.map} +1 -1
  249. package/build/server/chunks/{_server.ts-MORzCMU7.js → _server.ts-ug73AQNb.js} +5 -5
  250. package/build/server/chunks/{_server.ts-MORzCMU7.js.map → _server.ts-ug73AQNb.js.map} +1 -1
  251. package/build/server/chunks/{_server.ts-D4B9IkKh.js → _server.ts-ugLDRTpb.js} +5 -5
  252. package/build/server/chunks/{_server.ts-D4B9IkKh.js.map → _server.ts-ugLDRTpb.js.map} +1 -1
  253. package/build/server/chunks/{addon-helpers-CoPzjA3s.js → addon-helpers-CkQjHBvL.js} +3 -3
  254. package/build/server/chunks/{addon-helpers-CoPzjA3s.js.map → addon-helpers-CkQjHBvL.js.map} +1 -1
  255. package/build/server/chunks/{akm-BS59M7h3.js → akm-_cUsiv9b.js} +2 -2
  256. package/build/server/chunks/{akm-BS59M7h3.js.map → akm-_cUsiv9b.js.map} +1 -1
  257. package/build/server/chunks/{catalog-DAQWike4.js → catalog-CVQgQDZT.js} +5 -5
  258. package/build/server/chunks/{catalog-DAQWike4.js.map → catalog-CVQgQDZT.js.map} +1 -1
  259. package/build/server/chunks/{client-B3vN-Uvc.js → client-CK_EEC7q.js} +2 -2
  260. package/build/server/chunks/{client-B3vN-Uvc.js.map → client-CK_EEC7q.js.map} +1 -1
  261. package/build/server/chunks/{config-Bdb4ZTos.js → config-CW8zrJxw.js} +2 -2
  262. package/build/server/chunks/{config-Bdb4ZTos.js.map → config-CW8zrJxw.js.map} +1 -1
  263. package/build/server/chunks/{docker-DaU_SNhi.js → docker-BxDkWUiU.js} +2 -2
  264. package/build/server/chunks/{docker-DaU_SNhi.js.map → docker-BxDkWUiU.js.map} +1 -1
  265. package/build/server/chunks/{endpoints-1byh0xs8.js → endpoints-C9sjcucN.js} +2 -2
  266. package/build/server/chunks/{endpoints-1byh0xs8.js.map → endpoints-C9sjcucN.js.map} +1 -1
  267. package/build/server/chunks/{environment-BQh6a8iU.js → environment-D344CnXa.js} +2 -2
  268. package/build/server/chunks/{environment-BQh6a8iU.js.map → environment-D344CnXa.js.map} +1 -1
  269. package/build/server/chunks/{error.svelte-CEj0_dRA.js → error.svelte-CI7YrCLE.js} +4 -4
  270. package/build/server/chunks/{error.svelte-CEj0_dRA.js.map → error.svelte-CI7YrCLE.js.map} +1 -1
  271. package/build/server/chunks/{helpers-Be-wOei2.js → helpers-Bebo0tHj.js} +3 -3
  272. package/build/server/chunks/{helpers-Be-wOei2.js.map → helpers-Bebo0tHj.js.map} +1 -1
  273. package/build/server/chunks/{hooks.server-DlA1ck_e.js → hooks.server-ixIaeil8.js} +6 -6
  274. package/build/server/chunks/{hooks.server-DlA1ck_e.js.map → hooks.server-ixIaeil8.js.map} +1 -1
  275. package/build/server/chunks/{http-BbFgukqs.js → http-B9H_dpeX.js} +2 -2
  276. package/build/server/chunks/{http-BbFgukqs.js.map → http-B9H_dpeX.js.map} +1 -1
  277. package/build/server/chunks/{internal-CP-qQJfY.js → internal-Da04QZzQ.js} +3 -3
  278. package/build/server/chunks/{internal-CP-qQJfY.js.map → internal-Da04QZzQ.js.map} +1 -1
  279. package/build/server/chunks/{session-cookie-C-kIy9pI.js → session-cookie-DI4jIKdM.js} +2 -2
  280. package/build/server/chunks/{session-cookie-C-kIy9pI.js.map → session-cookie-DI4jIKdM.js.map} +1 -1
  281. package/build/server/chunks/{setup-deploy-BL_wmz6j.js → setup-deploy-NZRJZiNw.js} +2 -2
  282. package/build/server/chunks/{setup-deploy-BL_wmz6j.js.map → setup-deploy-NZRJZiNw.js.map} +1 -1
  283. package/build/server/chunks/{src-BEj0DuSB.js → src-kpR902Zr.js} +542 -122
  284. package/build/server/chunks/src-kpR902Zr.js.map +1 -0
  285. package/build/server/chunks/{state-DAPDF26p.js → state-TG4xDwlK.js} +2 -2
  286. package/build/server/chunks/{state-DAPDF26p.js.map → state-TG4xDwlK.js.map} +1 -1
  287. package/build/server/chunks/{state2-3fEu-ReG.js → state2-BqCIx1V7.js} +2 -2
  288. package/build/server/chunks/{state2-3fEu-ReG.js.map → state2-BqCIx1V7.js.map} +1 -1
  289. package/build/server/chunks/{theme-state.svelte-CUVpUHOv.js → theme-state.svelte-8qSluhfu.js} +35 -4
  290. package/build/server/chunks/theme-state.svelte-8qSluhfu.js.map +1 -0
  291. package/build/server/index.js +2 -2
  292. package/build/server/manifest.js +117 -89
  293. package/build/server/manifest.js.map +1 -1
  294. package/package.json +2 -2
  295. package/build/client/_app/immutable/assets/4.D-9LGiQD.css +0 -1
  296. package/build/client/_app/immutable/assets/4.D-9LGiQD.css.br +0 -0
  297. package/build/client/_app/immutable/assets/4.D-9LGiQD.css.gz +0 -0
  298. package/build/client/_app/immutable/chunks/B7L0wlSY.js +0 -1
  299. package/build/client/_app/immutable/chunks/B7L0wlSY.js.br +0 -2
  300. package/build/client/_app/immutable/chunks/B7L0wlSY.js.gz +0 -0
  301. package/build/client/_app/immutable/chunks/BEuC-NYT.js.br +0 -0
  302. package/build/client/_app/immutable/chunks/BEuC-NYT.js.gz +0 -0
  303. package/build/client/_app/immutable/chunks/BXh0hlRI.js +0 -1
  304. package/build/client/_app/immutable/chunks/BXh0hlRI.js.br +0 -0
  305. package/build/client/_app/immutable/chunks/BXh0hlRI.js.gz +0 -0
  306. package/build/client/_app/immutable/chunks/DHRKaBFV.js +0 -3
  307. package/build/client/_app/immutable/chunks/DHRKaBFV.js.br +0 -0
  308. package/build/client/_app/immutable/chunks/DHRKaBFV.js.gz +0 -0
  309. package/build/client/_app/immutable/chunks/DOWJsT_T.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/DOWJsT_T.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/DkCRM8d5.js +0 -5
  312. package/build/client/_app/immutable/chunks/DkCRM8d5.js.br +0 -0
  313. package/build/client/_app/immutable/chunks/DkCRM8d5.js.gz +0 -0
  314. package/build/client/_app/immutable/entry/app.Dgd8Sqiz.js.br +0 -0
  315. package/build/client/_app/immutable/entry/app.Dgd8Sqiz.js.gz +0 -0
  316. package/build/client/_app/immutable/entry/start.DN4LafZw.js +0 -1
  317. package/build/client/_app/immutable/entry/start.DN4LafZw.js.br +0 -1
  318. package/build/client/_app/immutable/entry/start.DN4LafZw.js.gz +0 -0
  319. package/build/client/_app/immutable/nodes/0.DEcud9DA.js.br +0 -0
  320. package/build/client/_app/immutable/nodes/0.DEcud9DA.js.gz +0 -0
  321. package/build/client/_app/immutable/nodes/1.DiTVmAJ4.js.br +0 -3
  322. package/build/client/_app/immutable/nodes/1.DiTVmAJ4.js.gz +0 -0
  323. package/build/client/_app/immutable/nodes/4.C-pAk-ut.js +0 -121
  324. package/build/client/_app/immutable/nodes/4.C-pAk-ut.js.br +0 -0
  325. package/build/client/_app/immutable/nodes/4.C-pAk-ut.js.gz +0 -0
  326. package/build/client/_app/immutable/nodes/5.WMP0f8pf.js.br +0 -0
  327. package/build/client/_app/immutable/nodes/5.WMP0f8pf.js.gz +0 -0
  328. package/build/client/_app/immutable/nodes/6.9o6Bephx.js.br +0 -0
  329. package/build/client/_app/immutable/nodes/6.9o6Bephx.js.gz +0 -0
  330. package/build/client/_app/immutable/nodes/7._N3I_xWy.js.br +0 -0
  331. package/build/client/_app/immutable/nodes/7._N3I_xWy.js.gz +0 -0
  332. package/build/client/_app/immutable/nodes/8.aWZ5mSKB.js.br +0 -0
  333. package/build/client/_app/immutable/nodes/8.aWZ5mSKB.js.gz +0 -0
  334. package/build/server/chunks/1-BdcHiFUZ.js +0 -9
  335. package/build/server/chunks/4-siztlnPA.js +0 -9
  336. package/build/server/chunks/5-DR1iBcbj.js +0 -9
  337. package/build/server/chunks/6-BdZadUUO.js +0 -9
  338. package/build/server/chunks/7-CjmZOzkF.js +0 -9
  339. package/build/server/chunks/_page.svelte-CMyq-t3Q.js.map +0 -1
  340. package/build/server/chunks/_server.ts-B4WEAp6B.js.map +0 -1
  341. package/build/server/chunks/_server.ts-CxWx02dy.js.map +0 -1
  342. package/build/server/chunks/_server.ts-MJdHZvPF.js.map +0 -1
  343. package/build/server/chunks/src-BEj0DuSB.js.map +0 -1
  344. 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.2"};
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 COPY-ONLY / additive (never delete the old layout), so a
807
- * mid-run failure leaves the home fully recoverable.
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 1;
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. To recover, restore the backup (see docs/operations/backup-restore.md) or run `openpalm migrate --dry-run` to preview the current copy-only migration. Full guide: docs/operations/upgrade-0.10-to-0.11.md";
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 !== 1;
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 < 1).sort((a, b) => a.from - b.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: 1
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, 1);
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: 1,
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
- base = stripSecretLikeEnvKeys(base);
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
- return content.split("\n").filter((line) => {
5347
- let trimmed = line.trim();
5348
- if (trimmed.startsWith("export ")) trimmed = trimmed.slice(7).trimStart();
5349
- const eq = trimmed.indexOf("=");
5350
- if (eq <= 0) return true;
5351
- return !isSecretLikeStackEnvKey(trimmed.slice(0, eq).trim());
5352
- }).join("\n");
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=1`,
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, or remove state/.install.lock if you're sure no install is running."
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 { formatForDisplay as $, AKM_USER_ENV_REF as A, composeStats as B, CORE_SERVICES as C, composeStop as D, composeUp as E, createLogger as F, createOpenCodeClient as G, createState as H, deleteUserEnvKey as I, deriveLaunchStatus as J, deriveLocalStackState as K, detectGpu as L, MigrationError as M, detectHostOpenCode as N, detectLocalProviders as O, PLATFORM_VERSION as P, detectRuntime as Q, disableHostAkmSharing as R, enableHostAkmSharing as S, ensureAkmUserEnv as T, ensureHomeDirs as U, ensureMigrated as V, ensureOpenCodeConfig as W, ensureOpenCodeSystemConfig as X, ensureSecrets as Y, executeAutomation as Z, fetchProviderModels as _, addonProfileId as a, getAddonProfileAvailability as a0, getAddonProfileSelection as a1, getAddonProfiles as a2, getAddonServiceNames as a3, getAkmStats as a4, getDockerEvents as a5, getHostAkmSharingStatus as a6, getRegistryAddonConfig as a7, hostAkmStashPath as a8, importHostOpenCode as a9, recommendSetup as aA, removeSecretFile as aB, removeTaskFile as aC, resolveComposeProjectName as aD, resolveDataDir as aE, resolveDeployJournalPath as aF, resolveRuntimeFiles as aG, resolveStackDir as aH, runDeploy as aI, seedUiBuild as aJ, setAddonEnabled as aK, setAddonProfileSelection as aL, summarizeComposeStderr as aM, useExistingProviderForAssistantCli as aN, validateProposedState as aO, writeFileAtomic as aP, writeRuntimeFiles as aQ, writeSecretFile as aR, writeStackSecretEnv as aS, writeTaskFile as aT, writeUserEnvKey as aU, writeVoiceVars as aV, initializeStateSecrets as aa, isAllowedService as ab, isComparableSemver as ac, isHostAkmAvailable as ad, isSetupComplete as ae, listAssistantCliTools as af, listAvailableAddonIds as ag, listEnabledAddonIds as ah, listSecretFiles as ai, loadAutomations as aj, mapDockerError as ak, markSetupComplete as al, parseComposeStderr as am, parseEnvFile as an, patchSecretsEnvFile as ao, performSetup as ap, performUpgrade as aq, readAutomationLogs as ar, readDeployJournal as as, readSecret as at, readSecretFile as au, readStackEnv as av, readStackRuntimeEnv as aw, readStackSecretEnv as ax, readTaskFile as ay, readUserEnvFile as az, annotateAddonProfileAvailability as b, 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 };
9859
- //# sourceMappingURL=src-BEj0DuSB.js.map
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