@openpalm/ui 0.12.0-rc.1 → 0.12.0-rc.3

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 (345) 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/{C5EI77dn.js → 37oeDbOM.js} +1 -1
  6. package/build/client/_app/immutable/chunks/37oeDbOM.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/{C5EI77dn.js.gz → 37oeDbOM.js.gz} +0 -0
  8. package/build/client/_app/immutable/chunks/{D6NbA5vY.js → BMMTxmQF.js} +2 -2
  9. package/build/client/_app/immutable/chunks/BMMTxmQF.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/BMMTxmQF.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/D7U2TZGX.js +5 -0
  12. package/build/client/_app/immutable/chunks/D7U2TZGX.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/D7U2TZGX.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/{BihYGk9Y.js → DhPCzSpa.js} +1 -1
  15. package/build/client/_app/immutable/chunks/DhPCzSpa.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/DhPCzSpa.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/HlgKB0Yv.js +1 -0
  18. package/build/client/_app/immutable/chunks/HlgKB0Yv.js.br +2 -0
  19. package/build/client/_app/immutable/chunks/HlgKB0Yv.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.D4HjSNXN.js → app.D_h1885H.js} +2 -2
  24. package/build/client/_app/immutable/entry/app.D_h1885H.js.br +0 -0
  25. package/build/client/_app/immutable/entry/app.D_h1885H.js.gz +0 -0
  26. package/build/client/_app/immutable/entry/start.KkDWne9K.js +1 -0
  27. package/build/client/_app/immutable/entry/start.KkDWne9K.js.br +0 -0
  28. package/build/client/_app/immutable/entry/start.KkDWne9K.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.Cv1FI9RA.js → 1.m2br4sx_.js} +1 -1
  33. package/build/client/_app/immutable/nodes/1.m2br4sx_.js.br +0 -0
  34. package/build/client/_app/immutable/nodes/1.m2br4sx_.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/4.C6POwnGO.js +130 -0
  36. package/build/client/_app/immutable/nodes/4.C6POwnGO.js.br +0 -0
  37. package/build/client/_app/immutable/nodes/4.C6POwnGO.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/{5.B_jsAXs5.js → 5.BoZ0ezyr.js} +2 -2
  39. package/build/client/_app/immutable/nodes/5.BoZ0ezyr.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/5.BoZ0ezyr.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/{6.CD18u_qC.js → 6.D3HpNODC.js} +1 -1
  42. package/build/client/_app/immutable/nodes/6.D3HpNODC.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/6.D3HpNODC.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/{7.BXyjSbT8.js → 7.Cldb-l42.js} +1 -1
  45. package/build/client/_app/immutable/nodes/7.Cldb-l42.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/7.Cldb-l42.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/{8.CDTwcjzi.js → 8.BWkb2W3i.js} +1 -1
  48. package/build/client/_app/immutable/nodes/8.BWkb2W3i.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/8.BWkb2W3i.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-CvpyJciZ.js +9 -0
  56. package/build/server/chunks/{1-CVcQJtBc.js.map → 1-CvpyJciZ.js.map} +1 -1
  57. package/build/server/chunks/{10-W-ONZquv.js → 10-CX8_71GH.js} +4 -4
  58. package/build/server/chunks/{10-W-ONZquv.js.map → 10-CX8_71GH.js.map} +1 -1
  59. package/build/server/chunks/4-CGNm9qY9.js +9 -0
  60. package/build/server/chunks/{4-CTyDAO7N.js.map → 4-CGNm9qY9.js.map} +1 -1
  61. package/build/server/chunks/5-CCrG3Zq1.js +9 -0
  62. package/build/server/chunks/{5-BXILJ_BC.js.map → 5-CCrG3Zq1.js.map} +1 -1
  63. package/build/server/chunks/6-CJd5ozaP.js +9 -0
  64. package/build/server/chunks/{6-HdFbhR1m.js.map → 6-CJd5ozaP.js.map} +1 -1
  65. package/build/server/chunks/7-Bh7s1hZ3.js +9 -0
  66. package/build/server/chunks/{7-k9H-eD_d.js.map → 7-Bh7s1hZ3.js.map} +1 -1
  67. package/build/server/chunks/{8-CQmCVu_8.js → 8-CbIypXYv.js} +3 -3
  68. package/build/server/chunks/{8-CQmCVu_8.js.map → 8-CbIypXYv.js.map} +1 -1
  69. package/build/server/chunks/{ChatMessage-DfLmvrJq.js → ChatMessage-BAWjgbc_.js} +2 -2
  70. package/build/server/chunks/{ChatMessage-DfLmvrJq.js.map → ChatMessage-BAWjgbc_.js.map} +1 -1
  71. package/build/server/chunks/{Navbar-Dnxvfk10.js → Navbar-Bdk7TDAb.js} +4 -4
  72. package/build/server/chunks/{Navbar-Dnxvfk10.js.map → Navbar-Bdk7TDAb.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-Dea_LGsw.js → _page.svelte-2gtLQdWF.js} +6 -6
  76. package/build/server/chunks/{_page.svelte-Dea_LGsw.js.map → _page.svelte-2gtLQdWF.js.map} +1 -1
  77. package/build/server/chunks/{_page.svelte-DnHQefg6.js → _page.svelte-CUeuGP5U.js} +7 -7
  78. package/build/server/chunks/{_page.svelte-DnHQefg6.js.map → _page.svelte-CUeuGP5U.js.map} +1 -1
  79. package/build/server/chunks/{_page.svelte-CqkvpyUV.js → _page.svelte-Cjok9-7E.js} +3 -3
  80. package/build/server/chunks/{_page.svelte-CqkvpyUV.js.map → _page.svelte-Cjok9-7E.js.map} +1 -1
  81. package/build/server/chunks/{_page.svelte-BsDNnBfz.js → _page.svelte-F2VqpLAW.js} +234 -35
  82. package/build/server/chunks/_page.svelte-F2VqpLAW.js.map +1 -0
  83. package/build/server/chunks/{_page.svelte-DMBLB7p4.js → _page.svelte-bfGTUogD.js} +6 -6
  84. package/build/server/chunks/{_page.svelte-DMBLB7p4.js.map → _page.svelte-bfGTUogD.js.map} +1 -1
  85. package/build/server/chunks/{_server.ts-BzEFvvlp.js → _server.ts-0fJZ0VmG.js} +7 -7
  86. package/build/server/chunks/{_server.ts-BzEFvvlp.js.map → _server.ts-0fJZ0VmG.js.map} +1 -1
  87. package/build/server/chunks/{_server.ts-Dbnh0OAK.js → _server.ts-2jjEL-tJ.js} +5 -5
  88. package/build/server/chunks/{_server.ts-Dbnh0OAK.js.map → _server.ts-2jjEL-tJ.js.map} +1 -1
  89. package/build/server/chunks/{_server.ts-BsgERSUa.js → _server.ts-2qYNEWJW.js} +5 -5
  90. package/build/server/chunks/{_server.ts-BsgERSUa.js.map → _server.ts-2qYNEWJW.js.map} +1 -1
  91. package/build/server/chunks/{_server.ts-Z6Jl5czR.js → _server.ts-44XLCjje.js} +5 -5
  92. package/build/server/chunks/{_server.ts-Z6Jl5czR.js.map → _server.ts-44XLCjje.js.map} +1 -1
  93. package/build/server/chunks/{_server.ts-DSn8PZs3.js → _server.ts-5x4EV4ZH.js} +5 -5
  94. package/build/server/chunks/{_server.ts-DSn8PZs3.js.map → _server.ts-5x4EV4ZH.js.map} +1 -1
  95. package/build/server/chunks/{_server.ts-DzFK8bVm.js → _server.ts-70mUxM22.js} +5 -5
  96. package/build/server/chunks/{_server.ts-DzFK8bVm.js.map → _server.ts-70mUxM22.js.map} +1 -1
  97. package/build/server/chunks/{_server.ts-ALC_q9Pv.js → _server.ts-7YO0AJyT.js} +5 -5
  98. package/build/server/chunks/{_server.ts-ALC_q9Pv.js.map → _server.ts-7YO0AJyT.js.map} +1 -1
  99. package/build/server/chunks/_server.ts-B0cdV0wH.js +89 -0
  100. package/build/server/chunks/_server.ts-B0cdV0wH.js.map +1 -0
  101. package/build/server/chunks/{_server.ts-CHC5iyoo.js → _server.ts-B0f-lyzD.js} +4 -4
  102. package/build/server/chunks/{_server.ts-CHC5iyoo.js.map → _server.ts-B0f-lyzD.js.map} +1 -1
  103. package/build/server/chunks/{_server.ts-b0eG_upf.js → _server.ts-B8ExhGgO.js} +5 -5
  104. package/build/server/chunks/{_server.ts-b0eG_upf.js.map → _server.ts-B8ExhGgO.js.map} +1 -1
  105. package/build/server/chunks/{_server.ts-CPzXJpes.js → _server.ts-B8l8YmXh.js} +6 -6
  106. package/build/server/chunks/{_server.ts-CPzXJpes.js.map → _server.ts-B8l8YmXh.js.map} +1 -1
  107. package/build/server/chunks/{_server.ts-BfpKWyaE.js → _server.ts-BBHICsQa.js} +18 -6
  108. package/build/server/chunks/_server.ts-BBHICsQa.js.map +1 -0
  109. package/build/server/chunks/{_server.ts-CfZXoUH1.js → _server.ts-BFfdVNpH.js} +5 -5
  110. package/build/server/chunks/{_server.ts-CfZXoUH1.js.map → _server.ts-BFfdVNpH.js.map} +1 -1
  111. package/build/server/chunks/{_server.ts-tSnumHIh.js → _server.ts-BI0oEp2m.js} +5 -5
  112. package/build/server/chunks/{_server.ts-tSnumHIh.js.map → _server.ts-BI0oEp2m.js.map} +1 -1
  113. package/build/server/chunks/{_server.ts-D53Q4y2U.js → _server.ts-BJPmYqJQ.js} +5 -5
  114. package/build/server/chunks/{_server.ts-D53Q4y2U.js.map → _server.ts-BJPmYqJQ.js.map} +1 -1
  115. package/build/server/chunks/{_server.ts-Df_d0aal.js → _server.ts-BLqWydCg.js} +5 -5
  116. package/build/server/chunks/_server.ts-BLqWydCg.js.map +1 -0
  117. package/build/server/chunks/{_server.ts-BmQi3d-p.js → _server.ts-BPEwLxUz.js} +4 -4
  118. package/build/server/chunks/{_server.ts-BmQi3d-p.js.map → _server.ts-BPEwLxUz.js.map} +1 -1
  119. package/build/server/chunks/{_server.ts-vz7XppYp.js → _server.ts-BQSuiMBy.js} +5 -5
  120. package/build/server/chunks/{_server.ts-vz7XppYp.js.map → _server.ts-BQSuiMBy.js.map} +1 -1
  121. package/build/server/chunks/{_server.ts-Dsl30Kqm.js → _server.ts-BRzEk9EI.js} +5 -5
  122. package/build/server/chunks/{_server.ts-Dsl30Kqm.js.map → _server.ts-BRzEk9EI.js.map} +1 -1
  123. package/build/server/chunks/{_server.ts-LS-MWWTz.js → _server.ts-BTw50Sge.js} +6 -6
  124. package/build/server/chunks/{_server.ts-LS-MWWTz.js.map → _server.ts-BTw50Sge.js.map} +1 -1
  125. package/build/server/chunks/{_server.ts-Bs3oAE6C.js → _server.ts-BVLeyPrV.js} +5 -5
  126. package/build/server/chunks/{_server.ts-Bs3oAE6C.js.map → _server.ts-BVLeyPrV.js.map} +1 -1
  127. package/build/server/chunks/{_server.ts-CSZz4p8L.js → _server.ts-Ba3Y8mZb.js} +5 -5
  128. package/build/server/chunks/{_server.ts-CSZz4p8L.js.map → _server.ts-Ba3Y8mZb.js.map} +1 -1
  129. package/build/server/chunks/{_server.ts-Dbczo4Pv.js → _server.ts-BbXRF71R.js} +2 -2
  130. package/build/server/chunks/{_server.ts-Dbczo4Pv.js.map → _server.ts-BbXRF71R.js.map} +1 -1
  131. package/build/server/chunks/{_server.ts-CERCOBc3.js → _server.ts-BgZqc9BJ.js} +5 -5
  132. package/build/server/chunks/{_server.ts-CERCOBc3.js.map → _server.ts-BgZqc9BJ.js.map} +1 -1
  133. package/build/server/chunks/{_server.ts-anQxgBbg.js → _server.ts-BkgABCm4.js} +5 -5
  134. package/build/server/chunks/{_server.ts-anQxgBbg.js.map → _server.ts-BkgABCm4.js.map} +1 -1
  135. package/build/server/chunks/{_server.ts-DUJObAJG.js → _server.ts-BqNV9SKY.js} +6 -6
  136. package/build/server/chunks/{_server.ts-DUJObAJG.js.map → _server.ts-BqNV9SKY.js.map} +1 -1
  137. package/build/server/chunks/{_server.ts-DhF_U44B.js → _server.ts-Br8Q79vg.js} +5 -5
  138. package/build/server/chunks/{_server.ts-DhF_U44B.js.map → _server.ts-Br8Q79vg.js.map} +1 -1
  139. package/build/server/chunks/{_server.ts-tVOMHVfT.js → _server.ts-BsCi8U0T.js} +6 -6
  140. package/build/server/chunks/{_server.ts-tVOMHVfT.js.map → _server.ts-BsCi8U0T.js.map} +1 -1
  141. package/build/server/chunks/{_server.ts-keJe--oH.js → _server.ts-BtzqRqdc.js} +2 -2
  142. package/build/server/chunks/{_server.ts-keJe--oH.js.map → _server.ts-BtzqRqdc.js.map} +1 -1
  143. package/build/server/chunks/{_server.ts-B2osMaU8.js → _server.ts-BuvcU_rd.js} +5 -5
  144. package/build/server/chunks/{_server.ts-B2osMaU8.js.map → _server.ts-BuvcU_rd.js.map} +1 -1
  145. package/build/server/chunks/{_server.ts-ComhXvuD.js → _server.ts-BvYQG4dt.js} +5 -5
  146. package/build/server/chunks/{_server.ts-ComhXvuD.js.map → _server.ts-BvYQG4dt.js.map} +1 -1
  147. package/build/server/chunks/{_server.ts-WQLovWTW.js → _server.ts-Bvv8P8O9.js} +6 -6
  148. package/build/server/chunks/{_server.ts-WQLovWTW.js.map → _server.ts-Bvv8P8O9.js.map} +1 -1
  149. package/build/server/chunks/{_server.ts-CGlVN30h.js → _server.ts-ByNLf-MM.js} +5 -5
  150. package/build/server/chunks/{_server.ts-CGlVN30h.js.map → _server.ts-ByNLf-MM.js.map} +1 -1
  151. package/build/server/chunks/{_server.ts-C2oIwHOm.js → _server.ts-C1P---qO.js} +5 -5
  152. package/build/server/chunks/{_server.ts-C2oIwHOm.js.map → _server.ts-C1P---qO.js.map} +1 -1
  153. package/build/server/chunks/_server.ts-C6_HX3EG.js +81 -0
  154. package/build/server/chunks/_server.ts-C6_HX3EG.js.map +1 -0
  155. package/build/server/chunks/{_server.ts-D1v6AXVY.js → _server.ts-CGk9ZLGa.js} +2 -2
  156. package/build/server/chunks/{_server.ts-D1v6AXVY.js.map → _server.ts-CGk9ZLGa.js.map} +1 -1
  157. package/build/server/chunks/{_server.ts-DFfzCkBR.js → _server.ts-CIoiPQyf.js} +5 -5
  158. package/build/server/chunks/{_server.ts-DFfzCkBR.js.map → _server.ts-CIoiPQyf.js.map} +1 -1
  159. package/build/server/chunks/{_server.ts-D4lQjUia.js → _server.ts-CRzIDkX8.js} +7 -7
  160. package/build/server/chunks/{_server.ts-D4lQjUia.js.map → _server.ts-CRzIDkX8.js.map} +1 -1
  161. package/build/server/chunks/{_server.ts-BVQjwsMp.js → _server.ts-CSZ5Wh6G.js} +5 -5
  162. package/build/server/chunks/{_server.ts-BVQjwsMp.js.map → _server.ts-CSZ5Wh6G.js.map} +1 -1
  163. package/build/server/chunks/{_server.ts-Cya45Eco.js → _server.ts-CT1eXDu-.js} +5 -5
  164. package/build/server/chunks/{_server.ts-Cya45Eco.js.map → _server.ts-CT1eXDu-.js.map} +1 -1
  165. package/build/server/chunks/{_server.ts-BCfPFzEV.js → _server.ts-CUuJlm00.js} +6 -6
  166. package/build/server/chunks/{_server.ts-BCfPFzEV.js.map → _server.ts-CUuJlm00.js.map} +1 -1
  167. package/build/server/chunks/{_server.ts-D1dT173b.js → _server.ts-CZ-DRZvp.js} +5 -5
  168. package/build/server/chunks/{_server.ts-D1dT173b.js.map → _server.ts-CZ-DRZvp.js.map} +1 -1
  169. package/build/server/chunks/{_server.ts-Bu5_FYA-.js → _server.ts-Cc3N9css.js} +5 -5
  170. package/build/server/chunks/{_server.ts-Bu5_FYA-.js.map → _server.ts-Cc3N9css.js.map} +1 -1
  171. package/build/server/chunks/{_server.ts-DtJPTK6T.js → _server.ts-Cf65eLqq.js} +5 -5
  172. package/build/server/chunks/{_server.ts-DtJPTK6T.js.map → _server.ts-Cf65eLqq.js.map} +1 -1
  173. package/build/server/chunks/{_server.ts-CB1MjjTN.js → _server.ts-Cg6XEPy2.js} +6 -6
  174. package/build/server/chunks/{_server.ts-CB1MjjTN.js.map → _server.ts-Cg6XEPy2.js.map} +1 -1
  175. package/build/server/chunks/{_server.ts-DESj9ag6.js → _server.ts-CnP0tOCJ.js} +5 -5
  176. package/build/server/chunks/{_server.ts-DESj9ag6.js.map → _server.ts-CnP0tOCJ.js.map} +1 -1
  177. package/build/server/chunks/{_server.ts-xxCrP77n.js → _server.ts-CrJINkX_.js} +5 -5
  178. package/build/server/chunks/{_server.ts-xxCrP77n.js.map → _server.ts-CrJINkX_.js.map} +1 -1
  179. package/build/server/chunks/{_server.ts-Ckf8jQdl.js → _server.ts-Crjjd765.js} +6 -6
  180. package/build/server/chunks/{_server.ts-Ckf8jQdl.js.map → _server.ts-Crjjd765.js.map} +1 -1
  181. package/build/server/chunks/{_server.ts-D47IinIP.js → _server.ts-Cv8ofBVh.js} +7 -7
  182. package/build/server/chunks/{_server.ts-D47IinIP.js.map → _server.ts-Cv8ofBVh.js.map} +1 -1
  183. package/build/server/chunks/{_server.ts-BEdChB0B.js → _server.ts-CvjW0prw.js} +14 -7
  184. package/build/server/chunks/_server.ts-CvjW0prw.js.map +1 -0
  185. package/build/server/chunks/{_server.ts-CW_MqxCL.js → _server.ts-CzJEYcNT.js} +7 -7
  186. package/build/server/chunks/{_server.ts-CW_MqxCL.js.map → _server.ts-CzJEYcNT.js.map} +1 -1
  187. package/build/server/chunks/{_server.ts-gBd2rolQ.js → _server.ts-CzxUP04Y.js} +5 -5
  188. package/build/server/chunks/{_server.ts-gBd2rolQ.js.map → _server.ts-CzxUP04Y.js.map} +1 -1
  189. package/build/server/chunks/{_server.ts-B409KD6U.js → _server.ts-D01NZcYW.js} +25 -7
  190. package/build/server/chunks/_server.ts-D01NZcYW.js.map +1 -0
  191. package/build/server/chunks/_server.ts-D1AbREnq.js +78 -0
  192. package/build/server/chunks/_server.ts-D1AbREnq.js.map +1 -0
  193. package/build/server/chunks/{_server.ts-DYU3yoaF.js → _server.ts-D7Jx0nis.js} +5 -5
  194. package/build/server/chunks/{_server.ts-DYU3yoaF.js.map → _server.ts-D7Jx0nis.js.map} +1 -1
  195. package/build/server/chunks/{_server.ts-C40BmZoV.js → _server.ts-D81qWfpG.js} +5 -5
  196. package/build/server/chunks/{_server.ts-C40BmZoV.js.map → _server.ts-D81qWfpG.js.map} +1 -1
  197. package/build/server/chunks/{_server.ts-DMNpdAr1.js → _server.ts-D8cTdweQ.js} +5 -5
  198. package/build/server/chunks/{_server.ts-DMNpdAr1.js.map → _server.ts-D8cTdweQ.js.map} +1 -1
  199. package/build/server/chunks/{_server.ts-Dr56nQwT.js → _server.ts-DAyVdLae.js} +5 -5
  200. package/build/server/chunks/{_server.ts-Dr56nQwT.js.map → _server.ts-DAyVdLae.js.map} +1 -1
  201. package/build/server/chunks/{_server.ts-BP1-cpdO.js → _server.ts-DG6X2pCM.js} +6 -6
  202. package/build/server/chunks/{_server.ts-BP1-cpdO.js.map → _server.ts-DG6X2pCM.js.map} +1 -1
  203. package/build/server/chunks/{_server.ts-D2YDAvSW.js → _server.ts-DIot9Cws.js} +5 -5
  204. package/build/server/chunks/_server.ts-DIot9Cws.js.map +1 -0
  205. package/build/server/chunks/{_server.ts-BfRDa9Ak.js → _server.ts-DLN16A-H.js} +5 -5
  206. package/build/server/chunks/{_server.ts-BfRDa9Ak.js.map → _server.ts-DLN16A-H.js.map} +1 -1
  207. package/build/server/chunks/{_server.ts-DGkBTOLd.js → _server.ts-DNnk_Zxf.js} +5 -5
  208. package/build/server/chunks/{_server.ts-DGkBTOLd.js.map → _server.ts-DNnk_Zxf.js.map} +1 -1
  209. package/build/server/chunks/{_server.ts-Dwhv7KnR.js → _server.ts-DRtWVz82.js} +6 -6
  210. package/build/server/chunks/{_server.ts-Dwhv7KnR.js.map → _server.ts-DRtWVz82.js.map} +1 -1
  211. package/build/server/chunks/{_server.ts--ZXHd_7G.js → _server.ts-DWLgZ0Yv.js} +6 -6
  212. package/build/server/chunks/{_server.ts--ZXHd_7G.js.map → _server.ts-DWLgZ0Yv.js.map} +1 -1
  213. package/build/server/chunks/{_server.ts-CcKpUv9a.js → _server.ts-DWWvdqIf.js} +5 -5
  214. package/build/server/chunks/{_server.ts-CcKpUv9a.js.map → _server.ts-DWWvdqIf.js.map} +1 -1
  215. package/build/server/chunks/{_server.ts-Ou4LHoL0.js → _server.ts-DeYTt0bJ.js} +5 -5
  216. package/build/server/chunks/{_server.ts-Ou4LHoL0.js.map → _server.ts-DeYTt0bJ.js.map} +1 -1
  217. package/build/server/chunks/{_server.ts-Cg_nVcGe.js → _server.ts-DmJBOTT2.js} +6 -6
  218. package/build/server/chunks/{_server.ts-Cg_nVcGe.js.map → _server.ts-DmJBOTT2.js.map} +1 -1
  219. package/build/server/chunks/{_server.ts-BX19lZQE.js → _server.ts-DrOOY95Q.js} +5 -5
  220. package/build/server/chunks/{_server.ts-BX19lZQE.js.map → _server.ts-DrOOY95Q.js.map} +1 -1
  221. package/build/server/chunks/{_server.ts-DErSZ0aB.js → _server.ts-DtH3KC6o.js} +2 -2
  222. package/build/server/chunks/{_server.ts-DErSZ0aB.js.map → _server.ts-DtH3KC6o.js.map} +1 -1
  223. package/build/server/chunks/{_server.ts-DsXYP4wI.js → _server.ts-DwkMC38U.js} +5 -5
  224. package/build/server/chunks/{_server.ts-DsXYP4wI.js.map → _server.ts-DwkMC38U.js.map} +1 -1
  225. package/build/server/chunks/{_server.ts-BOYEjBGJ.js → _server.ts-DxG52eeA.js} +7 -7
  226. package/build/server/chunks/{_server.ts-BOYEjBGJ.js.map → _server.ts-DxG52eeA.js.map} +1 -1
  227. package/build/server/chunks/{_server.ts-JWoayilI.js → _server.ts-Dxuqlt4R.js} +15 -10
  228. package/build/server/chunks/_server.ts-Dxuqlt4R.js.map +1 -0
  229. package/build/server/chunks/{_server.ts-MPKhnT_9.js → _server.ts-DyCjXY9f.js} +5 -5
  230. package/build/server/chunks/{_server.ts-MPKhnT_9.js.map → _server.ts-DyCjXY9f.js.map} +1 -1
  231. package/build/server/chunks/{_server.ts-DJ8dviE4.js → _server.ts-FfM2gx8M.js} +8 -8
  232. package/build/server/chunks/{_server.ts-DJ8dviE4.js.map → _server.ts-FfM2gx8M.js.map} +1 -1
  233. package/build/server/chunks/{_server.ts-DjPUN7lf.js → _server.ts-FgmSApxO.js} +5 -5
  234. package/build/server/chunks/{_server.ts-DjPUN7lf.js.map → _server.ts-FgmSApxO.js.map} +1 -1
  235. package/build/server/chunks/{_server.ts-CI29Cyri.js → _server.ts-LoYAi4N3.js} +6 -6
  236. package/build/server/chunks/{_server.ts-CI29Cyri.js.map → _server.ts-LoYAi4N3.js.map} +1 -1
  237. package/build/server/chunks/{_server.ts-YGPIKWu1.js → _server.ts-UX21CkDV.js} +5 -5
  238. package/build/server/chunks/{_server.ts-YGPIKWu1.js.map → _server.ts-UX21CkDV.js.map} +1 -1
  239. package/build/server/chunks/{_server.ts-BaCAfVqq.js → _server.ts-bY2IL1Nj.js} +7 -7
  240. package/build/server/chunks/{_server.ts-BaCAfVqq.js.map → _server.ts-bY2IL1Nj.js.map} +1 -1
  241. package/build/server/chunks/_server.ts-fMGCvAmz.js +64 -0
  242. package/build/server/chunks/_server.ts-fMGCvAmz.js.map +1 -0
  243. package/build/server/chunks/{_server.ts-Cl0rLFUw.js → _server.ts-jmKRuOrt.js} +6 -6
  244. package/build/server/chunks/{_server.ts-Cl0rLFUw.js.map → _server.ts-jmKRuOrt.js.map} +1 -1
  245. package/build/server/chunks/{_server.ts-B1yfYKPg.js → _server.ts-nxWIvPny.js} +5 -5
  246. package/build/server/chunks/{_server.ts-B1yfYKPg.js.map → _server.ts-nxWIvPny.js.map} +1 -1
  247. package/build/server/chunks/{_server.ts-D30T84pQ.js → _server.ts-plme8zrC.js} +5 -5
  248. package/build/server/chunks/{_server.ts-D30T84pQ.js.map → _server.ts-plme8zrC.js.map} +1 -1
  249. package/build/server/chunks/{_server.ts-0B6ETUr-.js → _server.ts-sTPNb2pN.js} +5 -5
  250. package/build/server/chunks/{_server.ts-0B6ETUr-.js.map → _server.ts-sTPNb2pN.js.map} +1 -1
  251. package/build/server/chunks/{_server.ts-B5hR6mRJ.js → _server.ts-t27XF1J7.js} +2 -2
  252. package/build/server/chunks/{_server.ts-B5hR6mRJ.js.map → _server.ts-t27XF1J7.js.map} +1 -1
  253. package/build/server/chunks/{addon-helpers-CNp09lT6.js → addon-helpers-DY4O9SZB.js} +3 -3
  254. package/build/server/chunks/{addon-helpers-CNp09lT6.js.map → addon-helpers-DY4O9SZB.js.map} +1 -1
  255. package/build/server/chunks/{akm-Du5uQGJQ.js → akm-BSih7eOh.js} +2 -2
  256. package/build/server/chunks/{akm-Du5uQGJQ.js.map → akm-BSih7eOh.js.map} +1 -1
  257. package/build/server/chunks/{catalog-VJdRC16s.js → catalog-DyHJ6nBW.js} +5 -5
  258. package/build/server/chunks/{catalog-VJdRC16s.js.map → catalog-DyHJ6nBW.js.map} +1 -1
  259. package/build/server/chunks/{client-BQEOyapc.js → client-CnOg1BpV.js} +2 -2
  260. package/build/server/chunks/{client-BQEOyapc.js.map → client-CnOg1BpV.js.map} +1 -1
  261. package/build/server/chunks/{config-VQx1c1o2.js → config-BVnL1-S6.js} +2 -2
  262. package/build/server/chunks/{config-VQx1c1o2.js.map → config-BVnL1-S6.js.map} +1 -1
  263. package/build/server/chunks/{docker-DeSRsk_C.js → docker-QQYBC8du.js} +2 -2
  264. package/build/server/chunks/{docker-DeSRsk_C.js.map → docker-QQYBC8du.js.map} +1 -1
  265. package/build/server/chunks/{endpoints-CVaZyXGR.js → endpoints-BOzm3TR9.js} +2 -2
  266. package/build/server/chunks/{endpoints-CVaZyXGR.js.map → endpoints-BOzm3TR9.js.map} +1 -1
  267. package/build/server/chunks/{environment-BTWh1E9j.js → environment-DevEAj_M.js} +2 -2
  268. package/build/server/chunks/{environment-BTWh1E9j.js.map → environment-DevEAj_M.js.map} +1 -1
  269. package/build/server/chunks/{error.svelte-Cz7XJbXh.js → error.svelte-OEdYqdGu.js} +4 -4
  270. package/build/server/chunks/{error.svelte-Cz7XJbXh.js.map → error.svelte-OEdYqdGu.js.map} +1 -1
  271. package/build/server/chunks/{helpers-DEWuEDi5.js → helpers-lf-w8dFi.js} +3 -3
  272. package/build/server/chunks/{helpers-DEWuEDi5.js.map → helpers-lf-w8dFi.js.map} +1 -1
  273. package/build/server/chunks/{hooks.server-D_p0VTSA.js → hooks.server-yeur1GCR.js} +6 -6
  274. package/build/server/chunks/{hooks.server-D_p0VTSA.js.map → hooks.server-yeur1GCR.js.map} +1 -1
  275. package/build/server/chunks/{http-Bz9VDTR1.js → http-Bv92EpMx.js} +2 -2
  276. package/build/server/chunks/{http-Bz9VDTR1.js.map → http-Bv92EpMx.js.map} +1 -1
  277. package/build/server/chunks/{internal-CXonuT4k.js → internal-CQdgWpT6.js} +3 -3
  278. package/build/server/chunks/{internal-CXonuT4k.js.map → internal-CQdgWpT6.js.map} +1 -1
  279. package/build/server/chunks/{session-cookie-CQw8e0tc.js → session-cookie-DhA3swUc.js} +2 -2
  280. package/build/server/chunks/{session-cookie-CQw8e0tc.js.map → session-cookie-DhA3swUc.js.map} +1 -1
  281. package/build/server/chunks/{setup-deploy-BBl1pM-Q.js → setup-deploy-C0hLjImh.js} +2 -2
  282. package/build/server/chunks/{setup-deploy-BBl1pM-Q.js.map → setup-deploy-C0hLjImh.js.map} +1 -1
  283. package/build/server/chunks/{src-CHZNd5cO.js → src-B7oqi9q_.js} +517 -93
  284. package/build/server/chunks/src-B7oqi9q_.js.map +1 -0
  285. package/build/server/chunks/{state-BcQ5v_Ye.js → state-iFW46-kW.js} +2 -2
  286. package/build/server/chunks/{state-BcQ5v_Ye.js.map → state-iFW46-kW.js.map} +1 -1
  287. package/build/server/chunks/{state2-CGTr4dHs.js → state2-DkQitSl6.js} +2 -2
  288. package/build/server/chunks/{state2-CGTr4dHs.js.map → state2-DkQitSl6.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 +4 -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/BXh0hlRI.js +0 -1
  299. package/build/client/_app/immutable/chunks/BXh0hlRI.js.br +0 -0
  300. package/build/client/_app/immutable/chunks/BXh0hlRI.js.gz +0 -0
  301. package/build/client/_app/immutable/chunks/BihYGk9Y.js.br +0 -0
  302. package/build/client/_app/immutable/chunks/BihYGk9Y.js.gz +0 -0
  303. package/build/client/_app/immutable/chunks/C5EI77dn.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/CMRs-cy6.js +0 -5
  305. package/build/client/_app/immutable/chunks/CMRs-cy6.js.br +0 -0
  306. package/build/client/_app/immutable/chunks/CMRs-cy6.js.gz +0 -0
  307. package/build/client/_app/immutable/chunks/D6NbA5vY.js.br +0 -0
  308. package/build/client/_app/immutable/chunks/D6NbA5vY.js.gz +0 -0
  309. package/build/client/_app/immutable/chunks/lIgyewlB.js +0 -1
  310. package/build/client/_app/immutable/chunks/lIgyewlB.js.br +0 -2
  311. package/build/client/_app/immutable/chunks/lIgyewlB.js.gz +0 -0
  312. package/build/client/_app/immutable/entry/app.D4HjSNXN.js.br +0 -0
  313. package/build/client/_app/immutable/entry/app.D4HjSNXN.js.gz +0 -0
  314. package/build/client/_app/immutable/entry/start.BBmWGrcI.js +0 -1
  315. package/build/client/_app/immutable/entry/start.BBmWGrcI.js.br +0 -0
  316. package/build/client/_app/immutable/entry/start.BBmWGrcI.js.gz +0 -0
  317. package/build/client/_app/immutable/nodes/0.DEcud9DA.js.br +0 -0
  318. package/build/client/_app/immutable/nodes/0.DEcud9DA.js.gz +0 -0
  319. package/build/client/_app/immutable/nodes/1.Cv1FI9RA.js.br +0 -2
  320. package/build/client/_app/immutable/nodes/1.Cv1FI9RA.js.gz +0 -0
  321. package/build/client/_app/immutable/nodes/4.0ZfV2HFJ.js +0 -120
  322. package/build/client/_app/immutable/nodes/4.0ZfV2HFJ.js.br +0 -0
  323. package/build/client/_app/immutable/nodes/4.0ZfV2HFJ.js.gz +0 -0
  324. package/build/client/_app/immutable/nodes/5.B_jsAXs5.js.br +0 -0
  325. package/build/client/_app/immutable/nodes/5.B_jsAXs5.js.gz +0 -0
  326. package/build/client/_app/immutable/nodes/6.CD18u_qC.js.br +0 -0
  327. package/build/client/_app/immutable/nodes/6.CD18u_qC.js.gz +0 -0
  328. package/build/client/_app/immutable/nodes/7.BXyjSbT8.js.br +0 -0
  329. package/build/client/_app/immutable/nodes/7.BXyjSbT8.js.gz +0 -0
  330. package/build/client/_app/immutable/nodes/8.CDTwcjzi.js.br +0 -0
  331. package/build/client/_app/immutable/nodes/8.CDTwcjzi.js.gz +0 -0
  332. package/build/server/chunks/1-CVcQJtBc.js +0 -9
  333. package/build/server/chunks/4-CTyDAO7N.js +0 -9
  334. package/build/server/chunks/5-BXILJ_BC.js +0 -9
  335. package/build/server/chunks/6-HdFbhR1m.js +0 -9
  336. package/build/server/chunks/7-k9H-eD_d.js +0 -9
  337. package/build/server/chunks/_page.svelte-BsDNnBfz.js.map +0 -1
  338. package/build/server/chunks/_server.ts-B409KD6U.js.map +0 -1
  339. package/build/server/chunks/_server.ts-BEdChB0B.js.map +0 -1
  340. package/build/server/chunks/_server.ts-BfpKWyaE.js.map +0 -1
  341. package/build/server/chunks/_server.ts-D2YDAvSW.js.map +0 -1
  342. package/build/server/chunks/_server.ts-Df_d0aal.js.map +0 -1
  343. package/build/server/chunks/_server.ts-JWoayilI.js.map +0 -1
  344. package/build/server/chunks/src-CHZNd5cO.js.map +0 -1
  345. 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 {
@@ -261,7 +468,7 @@ function releaseInstallLock(handle) {
261
468
  }
262
469
  }
263
470
  //#endregion
264
- //#region ../lib/src/control-plane/env.ts
471
+ //#region ../lib/package.json
265
472
  var import_main = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
266
473
  var fs$1 = __require("fs");
267
474
  var path = __require("path");
@@ -529,6 +736,119 @@ var import_main = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
529
736
  module.exports.populate = DotenvModule.populate;
530
737
  module.exports = DotenvModule;
531
738
  })))();
739
+ var package_default = {
740
+ version: "0.12.0-rc.3"};
741
+ //#endregion
742
+ //#region ../lib/src/control-plane/versioning.ts
743
+ var SEMVER_RE = /^v?\d+\.\d+\.\d+(?:[-+].*)?$/;
744
+ /**
745
+ * The canonical control-plane / platform version.
746
+ *
747
+ * This is the ONE source of truth for "which @openpalm/lib (and therefore which
748
+ * RELEASE_MIGRATIONS + lifecycle) is running." It travels with the data/ui
749
+ * build (the published @openpalm/ui inlines this lib), so it self-updates in
750
+ * place — it is NOT the Electron harness version (see
751
+ * packages/electron/src/harness-contract.ts: HARNESS_CONTRACT_VERSION).
752
+ *
753
+ * Stored Docker-canonical (`v`-prefixed) because every consumer that stamps a
754
+ * version into stack.env / a skeleton / a migration target wants the Docker tag
755
+ * form. Use `formatForDisplay` for user-facing strings and `normalizeVersion`
756
+ * for npm-style (no-`v`) comparisons.
757
+ *
758
+ * Replaces the former implicit `v${libPkg.version}` scattered through lifecycle
759
+ * / migrations so the platform version has a single, named home.
760
+ */
761
+ var PLATFORM_VERSION = formatForDocker(package_default.version);
762
+ function isComparableSemver(version) {
763
+ return !!version && SEMVER_RE.test(version.trim());
764
+ }
765
+ function parseComparableVersion(version) {
766
+ const clean = normalizeVersion(version).split("+")[0];
767
+ const dashIdx = clean.indexOf("-");
768
+ const main = dashIdx === -1 ? clean : clean.slice(0, dashIdx);
769
+ const prerelease = dashIdx === -1 ? null : clean.slice(dashIdx + 1);
770
+ const [major = 0, minor = 0, patch = 0] = main.split(".").map(Number);
771
+ return {
772
+ major,
773
+ minor,
774
+ patch,
775
+ prerelease
776
+ };
777
+ }
778
+ function comparePrerelease(a, b) {
779
+ const aParts = a.split(".");
780
+ const bParts = b.split(".");
781
+ for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
782
+ if (i >= aParts.length) return -1;
783
+ if (i >= bParts.length) return 1;
784
+ const aNum = Number(aParts[i]);
785
+ const bNum = Number(bParts[i]);
786
+ const aIsNum = !Number.isNaN(aNum);
787
+ const bIsNum = !Number.isNaN(bNum);
788
+ if (aIsNum && bIsNum) {
789
+ if (aNum !== bNum) return aNum > bNum ? 1 : -1;
790
+ continue;
791
+ }
792
+ if (aIsNum !== bIsNum) return aIsNum ? -1 : 1;
793
+ if (aParts[i] !== bParts[i]) return aParts[i] > bParts[i] ? 1 : -1;
794
+ }
795
+ return 0;
796
+ }
797
+ function compareComparableVersions(a, b) {
798
+ const aParsed = parseComparableVersion(a);
799
+ const bParsed = parseComparableVersion(b);
800
+ if (aParsed.major !== bParsed.major) return aParsed.major > bParsed.major ? 1 : -1;
801
+ if (aParsed.minor !== bParsed.minor) return aParsed.minor > bParsed.minor ? 1 : -1;
802
+ if (aParsed.patch !== bParsed.patch) return aParsed.patch > bParsed.patch ? 1 : -1;
803
+ if (aParsed.prerelease === null && bParsed.prerelease !== null) return 1;
804
+ if (aParsed.prerelease !== null && bParsed.prerelease === null) return -1;
805
+ if (aParsed.prerelease !== null && bParsed.prerelease !== null) return comparePrerelease(aParsed.prerelease, bParsed.prerelease);
806
+ return 0;
807
+ }
808
+ function majorVersionOf(version) {
809
+ if (!isComparableSemver(version)) return null;
810
+ return parseComparableVersion(version).major;
811
+ }
812
+ function isSameMajorVersion(a, b) {
813
+ const aMajor = majorVersionOf(a);
814
+ const bMajor = majorVersionOf(b);
815
+ return aMajor !== null && bMajor !== null && aMajor === bMajor;
816
+ }
817
+ /**
818
+ * npm/display form: strip a single leading `v` and trim. `v0.12.0` → `0.12.0`.
819
+ * Pass-through for an already-bare version. Empty/whitespace → ''.
820
+ */
821
+ function normalizeVersion(version) {
822
+ return (version ?? "").trim().replace(/^v/, "");
823
+ }
824
+ /**
825
+ * Docker-tag form: ensure exactly one leading `v`. `0.12.0` → `v0.12.0`,
826
+ * `v0.12.0` → `v0.12.0`. Empty/whitespace → '' (callers gate on RELEASE_TAG_REGEX
827
+ * before treating a value as a real tag).
828
+ */
829
+ function formatForDocker(version) {
830
+ const bare = normalizeVersion(version);
831
+ return bare ? `v${bare}` : "";
832
+ }
833
+ /**
834
+ * True when `version` carries a semver pre-release segment (`0.12.0-rc.1`).
835
+ * Build metadata (`+build.5`) is NOT a pre-release. Non-semver → false.
836
+ */
837
+ function isPrerelease(version) {
838
+ if (!isComparableSemver(version)) return false;
839
+ return parseComparableVersion(version).prerelease !== null;
840
+ }
841
+ /**
842
+ * User-facing presentation form: drop the leading `v` so the UI shows one
843
+ * canonical spelling regardless of whether the value arrived as a Docker tag or
844
+ * an npm version. Non-semver values are returned trimmed but otherwise untouched
845
+ * (e.g. a moving `latest`/`dev` tag).
846
+ */
847
+ function formatForDisplay(version) {
848
+ return normalizeVersion(version);
849
+ }
850
+ //#endregion
851
+ //#region ../lib/src/control-plane/env.ts
532
852
  function parseEnvContent(content) {
533
853
  return (0, import_main.parse)(content);
534
854
  }
@@ -675,64 +995,6 @@ function buildPlatformImageTagEnv(tag, perImage, pinnedImages = []) {
675
995
  };
676
996
  }
677
997
  //#endregion
678
- //#region ../lib/src/control-plane/versioning.ts
679
- var SEMVER_RE = /^v?\d+\.\d+\.\d+(?:[-+].*)?$/;
680
- function isComparableSemver(version) {
681
- return !!version && SEMVER_RE.test(version.trim());
682
- }
683
- function parseComparableVersion(version) {
684
- const clean = version.trim().replace(/^v/, "").split("+")[0];
685
- const dashIdx = clean.indexOf("-");
686
- const main = dashIdx === -1 ? clean : clean.slice(0, dashIdx);
687
- const prerelease = dashIdx === -1 ? null : clean.slice(dashIdx + 1);
688
- const [major = 0, minor = 0, patch = 0] = main.split(".").map(Number);
689
- return {
690
- major,
691
- minor,
692
- patch,
693
- prerelease
694
- };
695
- }
696
- function comparePrerelease(a, b) {
697
- const aParts = a.split(".");
698
- const bParts = b.split(".");
699
- for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
700
- if (i >= aParts.length) return -1;
701
- if (i >= bParts.length) return 1;
702
- const aNum = Number(aParts[i]);
703
- const bNum = Number(bParts[i]);
704
- const aIsNum = !Number.isNaN(aNum);
705
- const bIsNum = !Number.isNaN(bNum);
706
- if (aIsNum && bIsNum) {
707
- if (aNum !== bNum) return aNum > bNum ? 1 : -1;
708
- continue;
709
- }
710
- if (aIsNum !== bIsNum) return aIsNum ? -1 : 1;
711
- if (aParts[i] !== bParts[i]) return aParts[i] > bParts[i] ? 1 : -1;
712
- }
713
- return 0;
714
- }
715
- function compareComparableVersions(a, b) {
716
- const aParsed = parseComparableVersion(a);
717
- const bParsed = parseComparableVersion(b);
718
- if (aParsed.major !== bParsed.major) return aParsed.major > bParsed.major ? 1 : -1;
719
- if (aParsed.minor !== bParsed.minor) return aParsed.minor > bParsed.minor ? 1 : -1;
720
- if (aParsed.patch !== bParsed.patch) return aParsed.patch > bParsed.patch ? 1 : -1;
721
- if (aParsed.prerelease === null && bParsed.prerelease !== null) return 1;
722
- if (aParsed.prerelease !== null && bParsed.prerelease === null) return -1;
723
- if (aParsed.prerelease !== null && bParsed.prerelease !== null) return comparePrerelease(aParsed.prerelease, bParsed.prerelease);
724
- return 0;
725
- }
726
- function majorVersionOf(version) {
727
- if (!isComparableSemver(version)) return null;
728
- return parseComparableVersion(version).major;
729
- }
730
- function isSameMajorVersion(a, b) {
731
- const aMajor = majorVersionOf(a);
732
- const bMajor = majorVersionOf(b);
733
- return aMajor !== null && bMajor !== null && aMajor === bMajor;
734
- }
735
- //#endregion
736
998
  //#region ../lib/src/control-plane/migrations.ts
737
999
  /**
738
1000
  * On-disk layout migration harness.
@@ -767,6 +1029,22 @@ var MigrationError = class extends Error {
767
1029
  this.name = "MigrationError";
768
1030
  }
769
1031
  };
1032
+ /**
1033
+ * Thrown when the pre-backup free-space check estimates the safety backup would
1034
+ * exceed a safe fraction of free disk. Surfaced so callers (CLI/UI) can present
1035
+ * a plain-language warning and re-run with explicit confirmation. NOTHING is
1036
+ * deleted — the migration aborts cleanly with no changes made.
1037
+ */
1038
+ var BackupSpaceError = class extends MigrationError {
1039
+ estimatedBytes;
1040
+ freeBytes;
1041
+ constructor(message, guidance, estimatedBytes, freeBytes) {
1042
+ super(message, guidance, null);
1043
+ this.estimatedBytes = estimatedBytes;
1044
+ this.freeBytes = freeBytes;
1045
+ this.name = "BackupSpaceError";
1046
+ }
1047
+ };
770
1048
  var RELEASE_VERSION_KEY = "OP_RELEASE_VERSION";
771
1049
  function resolveMigrationPaths(homeDir) {
772
1050
  return {
@@ -1218,7 +1496,7 @@ var RELEASE_MIGRATIONS = [
1218
1496
  verify(ctx) {}
1219
1497
  }
1220
1498
  ];
1221
- 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";
1499
+ 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";
1222
1500
  function resolveComparableReleaseTarget(rawVersion) {
1223
1501
  if (!rawVersion) return null;
1224
1502
  return isComparableSemver(rawVersion) ? rawVersion : null;
@@ -1256,6 +1534,7 @@ function runReleaseMigrations(ctxBase, releaseFrom, targetVersion) {
1256
1534
  function ensureMigrated(opts = {}) {
1257
1535
  const homeDir = opts.homeDir ? resolve(opts.homeDir) : process.env.OP_HOME ? resolve(process.env.OP_HOME) : resolve(process.env.HOME ?? "", ".openpalm");
1258
1536
  const dryRun = opts.dryRun ?? false;
1537
+ const confirmLowSpace = opts.confirmLowSpace ?? false;
1259
1538
  const log = opts.log ?? (() => {});
1260
1539
  const ctxBase = {
1261
1540
  ...resolveMigrationPaths(homeDir),
@@ -1299,6 +1578,8 @@ function ensureMigrated(opts = {}) {
1299
1578
  }
1300
1579
  lock = acquireInstallLock(ctxBase.dataDir);
1301
1580
  if (!lock) throw new MigrationError("Another install/upgrade is in progress.", RECOVERY_GUIDANCE, null);
1581
+ const spaceCheck = checkBackupFreeSpace(homeDir);
1582
+ if (spaceCheck.insufficient && !confirmLowSpace) throw new BackupSpaceError(describeBackupSpaceShortfall(spaceCheck), RECOVERY_GUIDANCE, spaceCheck.estimatedBytes, spaceCheck.freeBytes);
1302
1583
  log("Taking a full backup before migrating…");
1303
1584
  try {
1304
1585
  backupDir = backupOpenPalmHome(homeDir);
@@ -4734,10 +5015,6 @@ function resolveLocalOpenpalmDir() {
4734
5015
  */
4735
5016
  var NPM_REGISTRY = "https://registry.npmjs.org";
4736
5017
  var UI_PACKAGE = "@openpalm/ui";
4737
- /** Strip a single leading 'v' so a release ref (v1.2.3) becomes an npm version (1.2.3). */
4738
- function toNpmVersion(repoRef) {
4739
- return repoRef.replace(/^v/, "");
4740
- }
4741
5018
  /**
4742
5019
  * Resolve the npm manifest for `@openpalm/ui` by exact version OR dist-tag.
4743
5020
  * `GET <registry>/@openpalm/ui/<version-or-tag>` returns the abbreviated
@@ -4748,10 +5025,13 @@ async function fetchNpmUiManifest(versionOrTag) {
4748
5025
  if (!res.ok) throw new Error(`npm registry returned HTTP ${res.status} for ${UI_PACKAGE}@${versionOrTag}`);
4749
5026
  const m = await res.json();
4750
5027
  if (!m.version || !m.dist?.tarball) throw new Error(`npm manifest for ${UI_PACKAGE}@${versionOrTag} is missing version/dist.tarball`);
5028
+ const rawMin = typeof m.minHarnessContract === "number" ? m.minHarnessContract : Number(m.minHarnessContract);
5029
+ const minHarnessContract = Number.isFinite(rawMin) && rawMin > 0 ? rawMin : 0;
4751
5030
  return {
4752
5031
  version: m.version,
4753
5032
  tarball: m.dist.tarball,
4754
- integrity: m.dist.integrity ?? null
5033
+ integrity: m.dist.integrity ?? null,
5034
+ minHarnessContract
4755
5035
  };
4756
5036
  }
4757
5037
  /**
@@ -4828,7 +5108,7 @@ async function downloadNpmUiBundle(manifest, uiDir, dataDir) {
4828
5108
  async function seedUiBuild(repoRef, dataDir, options) {
4829
5109
  const uiDir = join(dataDir, "ui");
4830
5110
  mkdirSync(uiDir, { recursive: true });
4831
- const manifest = await fetchNpmUiManifest(toNpmVersion(repoRef));
5111
+ const manifest = await fetchNpmUiManifest(normalizeVersion(repoRef));
4832
5112
  logger$9.debug("downloading UI build from npm", { version: manifest.version });
4833
5113
  await downloadNpmUiBundle(manifest, uiDir, dataDir);
4834
5114
  }
@@ -5282,20 +5562,84 @@ function writeSystemEnv(state) {
5282
5562
  if (!hasUsableOperatorId(parsed, "OP_GID")) adminManaged.OP_GID = String(ids.gid);
5283
5563
  }
5284
5564
  if (!parsed.OP_HOME) adminManaged.OP_HOME = state.homeDir;
5285
- base = stripSecretLikeEnvKeys(base);
5565
+ const { content: strippedBase, removed } = stripSecretLikeEnvKeys(base);
5566
+ base = strippedBase;
5567
+ if (removed.length > 0) {
5568
+ logger$7.warn("Removed secret-looking keys from stack.env (they belong in Connections/secrets)", {
5569
+ removedKeys: removed,
5570
+ stackEnvPath: systemEnvPath
5571
+ });
5572
+ recordSecretStripNotice(state, removed);
5573
+ }
5286
5574
  assertNoSecretLikeStackEnvKeys(parseEnvContent(base));
5287
5575
  assertNoSecretLikeStackEnvKeys(adminManaged);
5288
5576
  writeFileSync(systemEnvPath, mergeEnvContent(base, adminManaged, { sectionHeader: "# ── Admin-managed ──────────────────────────────────────────────────" }), { mode: 384 });
5289
5577
  chmodSync(systemEnvPath, 384);
5290
5578
  }
5291
5579
  function stripSecretLikeEnvKeys(content) {
5292
- return content.split("\n").filter((line) => {
5293
- let trimmed = line.trim();
5294
- if (trimmed.startsWith("export ")) trimmed = trimmed.slice(7).trimStart();
5295
- const eq = trimmed.indexOf("=");
5296
- if (eq <= 0) return true;
5297
- return !isSecretLikeStackEnvKey(trimmed.slice(0, eq).trim());
5298
- }).join("\n");
5580
+ const removed = [];
5581
+ return {
5582
+ content: content.split("\n").filter((line) => {
5583
+ let trimmed = line.trim();
5584
+ if (trimmed.startsWith("export ")) trimmed = trimmed.slice(7).trimStart();
5585
+ const eq = trimmed.indexOf("=");
5586
+ if (eq <= 0) return true;
5587
+ const key = trimmed.slice(0, eq).trim();
5588
+ if (isSecretLikeStackEnvKey(key)) {
5589
+ removed.push(key);
5590
+ return false;
5591
+ }
5592
+ return true;
5593
+ }).join("\n"),
5594
+ removed
5595
+ };
5596
+ }
5597
+ /**
5598
+ * Path of the one-time "secret-looking values were removed from stack.env"
5599
+ * notice the UI reads and dismisses.
5600
+ */
5601
+ function secretStripNoticePath(state) {
5602
+ return `${state.dataDir}/secret-strip-notice.json`;
5603
+ }
5604
+ function recordSecretStripNotice(state, newlyRemoved) {
5605
+ const path = secretStripNoticePath(state);
5606
+ let keys = new Set(newlyRemoved);
5607
+ if (existsSync(path)) try {
5608
+ const prior = JSON.parse(readFileSync(path, "utf-8"));
5609
+ if (Array.isArray(prior.keys)) keys = new Set([...prior.keys, ...newlyRemoved]);
5610
+ } catch {}
5611
+ const notice = {
5612
+ keys: [...keys].sort(),
5613
+ at: (/* @__PURE__ */ new Date()).toISOString()
5614
+ };
5615
+ try {
5616
+ mkdirSync(state.dataDir, { recursive: true });
5617
+ writeFileSync(path, JSON.stringify(notice, null, 2));
5618
+ } catch (e) {
5619
+ logger$7.warn("Could not persist secret-strip notice", { error: e instanceof Error ? e.message : String(e) });
5620
+ }
5621
+ }
5622
+ /** Read the pending secret-strip notice, or null when there is none. */
5623
+ function readSecretStripNotice(state) {
5624
+ const path = secretStripNoticePath(state);
5625
+ if (!existsSync(path)) return null;
5626
+ try {
5627
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
5628
+ if (Array.isArray(parsed.keys) && parsed.keys.length > 0 && typeof parsed.at === "string") return {
5629
+ keys: parsed.keys,
5630
+ at: parsed.at
5631
+ };
5632
+ } catch {}
5633
+ return null;
5634
+ }
5635
+ /** Dismiss (delete) the pending secret-strip notice. */
5636
+ function dismissSecretStripNotice(state) {
5637
+ const path = secretStripNoticePath(state);
5638
+ if (existsSync(path)) try {
5639
+ rmSync(path);
5640
+ } catch (e) {
5641
+ logger$7.warn("Could not dismiss secret-strip notice", { error: e instanceof Error ? e.message : String(e) });
5642
+ }
5299
5643
  }
5300
5644
  function generateFallbackSystemEnv(state) {
5301
5645
  const ids = resolveOperatorIds(state.homeDir);
@@ -6723,8 +7067,6 @@ function writeFileAtomic(path, content, mode) {
6723
7067
  writeFileSync(tmp, content, mode !== void 0 ? { mode } : {});
6724
7068
  renameSync(tmp, path);
6725
7069
  }
6726
- var package_default = {
6727
- version: "0.12.0-rc.1"};
6728
7070
  //#endregion
6729
7071
  //#region ../lib/src/control-plane/rollback.ts
6730
7072
  /**
@@ -6878,9 +7220,12 @@ var DOCKER_REGISTRY_TIMEOUT_MS = 1e4;
6878
7220
  /**
6879
7221
  * Resolve the best Docker image tag from a registry tags payload.
6880
7222
  *
6881
- * Constraints (both optional):
6882
- * - `sameMajorAs` — only consider tags whose major component matches this tag.
6883
- * - `atOrBelow` — only consider tags whose version is <= this tag.
7223
+ * Constraints (all optional):
7224
+ * - `sameMajorAs` — only consider tags whose major component matches this tag.
7225
+ * - `atOrBelow` — only consider tags whose version is <= this tag.
7226
+ * - `skipPrerelease` — ignore prerelease tags (`-rc`, `-beta`, …). Used so a
7227
+ * STABLE base never auto-jumps onto a prerelease (#494),
7228
+ * mirroring the UI card's channel gate.
6884
7229
  *
6885
7230
  * With no constraints: returns the first semver tag found, or the first
6886
7231
  * non-"latest" tag as a fallback (mirrors the original resolveNewestDockerTag).
@@ -6889,8 +7234,8 @@ var DOCKER_REGISTRY_TIMEOUT_MS = 1e4;
6889
7234
  function resolveNewestDockerTag(payload, constraints = {}) {
6890
7235
  const results = payload?.results;
6891
7236
  if (!Array.isArray(results)) return null;
6892
- const { sameMajorAs, atOrBelow } = constraints;
6893
- if (!(sameMajorAs !== void 0 || atOrBelow !== void 0)) {
7237
+ const { sameMajorAs, atOrBelow, skipPrerelease } = constraints;
7238
+ if (!(sameMajorAs !== void 0 || atOrBelow !== void 0 || skipPrerelease === true)) {
6894
7239
  let fallback = null;
6895
7240
  for (const entry of results) {
6896
7241
  const name = typeof entry?.name === "string" ? entry.name.trim() : "";
@@ -6904,6 +7249,7 @@ function resolveNewestDockerTag(payload, constraints = {}) {
6904
7249
  for (const entry of results) {
6905
7250
  const name = typeof entry?.name === "string" ? entry.name.trim() : "";
6906
7251
  if (!isComparableSemver(name)) continue;
7252
+ if (skipPrerelease && isPrerelease(name)) continue;
6907
7253
  if (sameMajorAs !== void 0 && !isSameMajorVersion(name, sameMajorAs)) continue;
6908
7254
  if (atOrBelow !== void 0 && compareComparableVersions(name, atOrBelow) > 0) continue;
6909
7255
  if (!best || compareComparableVersions(name, best) > 0) best = name;
@@ -6913,7 +7259,69 @@ function resolveNewestDockerTag(payload, constraints = {}) {
6913
7259
  function resolvePlatformVersionPolicyBaseTag(state) {
6914
7260
  const configured = parseEnvFile(`${state.stashDir}/env/stack.env`).OP_IMAGE_TAG?.trim();
6915
7261
  if (isComparableSemver(configured)) return configured;
6916
- return `v${package_default.version}`;
7262
+ return PLATFORM_VERSION;
7263
+ }
7264
+ /**
7265
+ * Host-vs-target guard (#492), keyed on the RUNNING control-plane version.
7266
+ *
7267
+ * The migrations a release needs live inside the @openpalm/lib that is actually
7268
+ * executing — i.e. PLATFORM_VERSION (the version of the running data/ui build, or
7269
+ * the compiled-in CLI lib). If a user points the stack at a tag NEWER than the
7270
+ * control plane they're running, `ensureReleaseMigrated` runs an OLD migration
7271
+ * array that doesn't contain that release's migrations → the new images come up
7272
+ * against half-migrated files. There is no safe recovery, so this is a HARD block
7273
+ * (not a warning): nothing is written before it throws.
7274
+ *
7275
+ * The thin-harness design (§6.5) makes this satisfiable: the supervisor self-
7276
+ * updates data/ui to the current platform BEFORE the UI serves the upgrade
7277
+ * request, so "target ≤ running platform" only fails when the user genuinely
7278
+ * picks a tag the running control plane cannot migrate to — at which point the
7279
+ * fix is to update the app / control plane first, not to proceed.
7280
+ *
7281
+ * Non-semver targets (a moving `latest`/`dev` tag) are not comparable and are
7282
+ * left to the resolver paths that turn them into a concrete release first.
7283
+ */
7284
+ /**
7285
+ * Downgrade-needs-confirmation signal (#501).
7286
+ *
7287
+ * Release migrations are forward-only (copy-only, additive); they do NOT run
7288
+ * backward. Pointing the stack at an OLDER tag than the one currently running is
7289
+ * therefore a data-safety event, not a routine version change: the older images
7290
+ * may not understand files the newer release already migrated. We don't block it
7291
+ * (a user may legitimately need to roll back), but we require an explicit
7292
+ * confirmation so it can't happen by a stray dropdown selection. The UI catches
7293
+ * this by `code` and shows a plain warning + confirm; the CLI surfaces the
7294
+ * message and a `--confirm`/`--yes` path.
7295
+ */
7296
+ var DowngradeConfirmationRequired = class extends Error {
7297
+ code = "downgrade_confirmation_required";
7298
+ currentVersion;
7299
+ targetVersion;
7300
+ constructor(currentVersion, targetVersion) {
7301
+ 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.`);
7302
+ this.name = "DowngradeConfirmationRequired";
7303
+ this.currentVersion = currentVersion;
7304
+ this.targetVersion = targetVersion;
7305
+ }
7306
+ };
7307
+ /**
7308
+ * Throw {@link DowngradeConfirmationRequired} when `targetTag` is strictly older
7309
+ * than the version currently configured in stack.env, unless the caller passed
7310
+ * an explicit confirmation. Non-semver tags (a moving `latest`/`dev` ref, or a
7311
+ * first install with no current tag) are not comparable and pass through — the
7312
+ * resolver paths turn `latest` into a concrete release before this runs.
7313
+ */
7314
+ function assertNotUnconfirmedDowngrade(state, targetTag, confirmDowngrade) {
7315
+ if (confirmDowngrade) return;
7316
+ const currentTag = resolvePlatformVersionPolicyBaseTag(state);
7317
+ if (!isComparableSemver(targetTag) || !isComparableSemver(currentTag)) return;
7318
+ if (compareComparableVersions(targetTag, currentTag) >= 0) return;
7319
+ throw new DowngradeConfirmationRequired(currentTag, targetTag);
7320
+ }
7321
+ function assertTargetNotNewerThanPlatform(targetTag) {
7322
+ if (!isComparableSemver(targetTag) || !isComparableSemver(PLATFORM_VERSION)) return;
7323
+ if (compareComparableVersions(targetTag, PLATFORM_VERSION) <= 0) return;
7324
+ throw new Error(`Version ${formatForDisplay(targetTag)} is newer than the OpenPalm control plane you're running (${formatForDisplay(PLATFORM_VERSION)}). Update the OpenPalm app / control plane first, then update the stack. Nothing was changed.`);
6917
7325
  }
6918
7326
  function resolveImageNamespace(state) {
6919
7327
  const namespace = (parseEnvFile(`${state.stashDir}/env/stack.env`).OP_IMAGE_NAMESPACE ?? process.env.OP_IMAGE_NAMESPACE ?? "openpalm").trim().toLowerCase();
@@ -7017,9 +7425,22 @@ async function resolveLatestPlatformTag(namespace) {
7017
7425
  if (!latestTag) throw new Error("No usable Docker image tag found");
7018
7426
  return latestTag;
7019
7427
  }
7020
- async function resolveLatestPlatformTagForCurrentMajor(namespace, currentTag) {
7021
- const latestTag = resolveNewestDockerTag(await fetchDockerTagsPayload(namespace, "assistant"), { sameMajorAs: currentTag });
7022
- if (!latestTag) throw new Error(`No usable Docker image tag found in major ${currentTag.replace(/^v/, "").split(".")[0]}`);
7428
+ /**
7429
+ * Resolve the default target version for `openpalm migrate --dry-run`: the
7430
+ * newest published platform tag in the current major. Mirrors the resolver the
7431
+ * upgrade path uses (same namespace, same base tag, same prerelease policy) so a
7432
+ * dry-run preview reflects the exact version `openpalm update` would move to.
7433
+ */
7434
+ async function resolveDefaultMigrateTarget(state, opts = {}) {
7435
+ return resolveLatestPlatformTagForCurrentMajor(resolveImageNamespace(state), resolvePlatformVersionPolicyBaseTag(state), { allowPrerelease: opts.allowPrerelease });
7436
+ }
7437
+ async function resolveLatestPlatformTagForCurrentMajor(namespace, currentTag, opts = {}) {
7438
+ const skipPrerelease = !opts.allowPrerelease && !isPrerelease(currentTag);
7439
+ const latestTag = resolveNewestDockerTag(await fetchDockerTagsPayload(namespace, "assistant"), {
7440
+ sameMajorAs: currentTag,
7441
+ skipPrerelease
7442
+ });
7443
+ if (!latestTag) throw new Error(`No usable Docker image tag found in major ${majorVersionOf(currentTag) ?? currentTag}`);
7023
7444
  return latestTag;
7024
7445
  }
7025
7446
  async function updateStackEnvToLatestImageTag(state, resolvedTag) {
@@ -7077,11 +7498,12 @@ async function withStackEnvRollback(state, run) {
7077
7498
  *
7078
7499
  * Callers handle their own audit logging and admin self-recreation.
7079
7500
  */
7080
- async function performUpgrade(state) {
7501
+ async function performUpgrade(state, opts = {}) {
7081
7502
  return withStackEnvRollback(state, async () => {
7082
7503
  const composeOpts = buildComposeOptions(state);
7083
7504
  const namespace = resolveImageNamespace(state);
7084
- const imageTag = await resolveLatestPlatformTagForCurrentMajor(namespace, resolvePlatformVersionPolicyBaseTag(state));
7505
+ const imageTag = await resolveLatestPlatformTagForCurrentMajor(namespace, resolvePlatformVersionPolicyBaseTag(state), { allowPrerelease: opts.allowPrerelease });
7506
+ assertTargetNotNewerThanPlatform(imageTag);
7085
7507
  ensureReleaseMigrated({
7086
7508
  homeDir: state.homeDir,
7087
7509
  targetVersion: imageTag
@@ -7112,7 +7534,7 @@ async function performUpgrade(state) {
7112
7534
  * Set a specific image tag in stack.env then pull images and restart containers.
7113
7535
  * Used by the admin "set version" action — skips the auto-detect step in performUpgrade.
7114
7536
  */
7115
- async function applyTagChange(state, tag) {
7537
+ async function applyTagChange(state, tag, opts = {}) {
7116
7538
  return withStackEnvRollback(state, async () => {
7117
7539
  const namespace = resolveImageNamespace(state);
7118
7540
  const requested = tag.trim();
@@ -7123,6 +7545,8 @@ async function applyTagChange(state, tag) {
7123
7545
  const msg = e instanceof Error ? e.message : String(e);
7124
7546
  throw new Error(`Cannot resolve "latest" to a concrete release: ${msg}. Check your network connection or select a specific version.`);
7125
7547
  }
7548
+ assertTargetNotNewerThanPlatform(resolvedTag);
7549
+ assertNotUnconfirmedDowngrade(state, resolvedTag, opts.confirmDowngrade ?? false);
7126
7550
  const stackEnvPath = `${state.stashDir}/env/stack.env`;
7127
7551
  const currentEnv = parseEnvFile(stackEnvPath);
7128
7552
  const pinnedImages = parsePinnedImages(currentEnv.OP_PINNED_IMAGES);
@@ -7608,7 +8032,7 @@ async function runDeploy(state, options = {}) {
7608
8032
  const lock = acquireInstallLock(state.dataDir);
7609
8033
  if (!lock) {
7610
8034
  progress.deploying = false;
7611
- progress.deployError = "install_in_progress: A deploy is already running. Wait for it to finish.";
8035
+ 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.";
7612
8036
  emitProgress(options, progress);
7613
8037
  return progress;
7614
8038
  }
@@ -9282,7 +9706,7 @@ async function performSetup(input, opts) {
9282
9706
  const lockHandle = acquireInstallLock(state.dataDir);
9283
9707
  if (lockHandle === null) return {
9284
9708
  ok: false,
9285
- 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."
9709
+ 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."
9286
9710
  };
9287
9711
  logger.info("performing setup", { connectionCount: connections.length });
9288
9712
  const updates = buildOwnerEnvFromSetup(owner);
@@ -9768,5 +10192,5 @@ function collectBindAddressWarnings(env) {
9768
10192
  return warnings;
9769
10193
  }
9770
10194
 
9771
- export { getAddonProfiles as $, AKM_USER_ENV_REF as A, composeStop as B, CORE_SERVICES as C, composeUp as D, createLogger as E, createOpenCodeClient as F, createState as G, deleteUserEnvKey as H, deriveLaunchStatus as I, deriveLocalStackState as J, detectGpu as K, detectHostOpenCode as L, MigrationError as M, detectLocalProviders as N, detectRuntime as O, disableHostAkmSharing as P, enableHostAkmSharing as Q, ensureAkmUserEnv as R, ensureHomeDirs as S, ensureMigrated as T, ensureOpenCodeConfig as U, ensureOpenCodeSystemConfig as V, ensureSecrets as W, executeAutomation as X, fetchProviderModels as Y, getAddonProfileAvailability as Z, getAddonProfileSelection as _, addonProfileId as a, getAddonServiceNames as a0, getAkmStats as a1, getDockerEvents as a2, getHostAkmSharingStatus as a3, getRegistryAddonConfig as a4, hostAkmStashPath as a5, importHostOpenCode as a6, initializeStateSecrets as a7, isAllowedService as a8, isHostAkmAvailable as a9, resolveDataDir as aA, resolveDeployJournalPath as aB, resolveRuntimeFiles as aC, resolveStackDir as aD, runDeploy as aE, seedUiBuild as aF, setAddonEnabled as aG, setAddonProfileSelection as aH, summarizeComposeStderr as aI, useExistingProviderForAssistantCli as aJ, validateProposedState as aK, writeFileAtomic as aL, writeRuntimeFiles as aM, writeSecretFile as aN, writeStackSecretEnv as aO, writeTaskFile as aP, writeUserEnvKey as aQ, writeVoiceVars as aR, isSetupComplete as aa, listAssistantCliTools as ab, listAvailableAddonIds as ac, listEnabledAddonIds as ad, listSecretFiles as ae, loadAutomations as af, mapDockerError as ag, markSetupComplete as ah, parseComposeStderr as ai, parseEnvFile as aj, patchSecretsEnvFile as ak, performSetup as al, performUpgrade as am, readAutomationLogs as an, readDeployJournal as ao, readSecret as ap, readSecretFile as aq, readStackEnv as ar, readStackRuntimeEnv as as, readStackSecretEnv as at, readTaskFile as au, readUserEnvFile as av, recommendSetup as aw, removeSecretFile as ax, removeTaskFile as ay, resolveComposeProjectName 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, composeDown as s, composeLogs as t, composePreflight as u, composePs as v, composePull as w, composeRestart as x, composeStart as y, composeStats as z };
9772
- //# sourceMappingURL=src-CHZNd5cO.js.map
10195
+ 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 };
10196
+ //# sourceMappingURL=src-B7oqi9q_.js.map