@openpalm/ui 0.11.0 → 0.11.2-rc.1

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 (333) hide show
  1. package/build/.openpalm-ui-version +1 -1
  2. package/build/client/_app/immutable/assets/{0.DlIhzko8.css → 0.CFC7xzus.css} +1 -1
  3. package/build/client/_app/immutable/assets/0.CFC7xzus.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.CFC7xzus.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/4.B_s_XYKm.css +1 -0
  6. package/build/client/_app/immutable/assets/4.B_s_XYKm.css.br +0 -0
  7. package/build/client/_app/immutable/assets/4.B_s_XYKm.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/9.CK_nuPTW.css +1 -0
  9. package/build/client/_app/immutable/assets/9.CK_nuPTW.css.br +0 -0
  10. package/build/client/_app/immutable/assets/9.CK_nuPTW.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/VoiceProfileSelector.rd8K9qqK.css +1 -0
  12. package/build/client/_app/immutable/assets/VoiceProfileSelector.rd8K9qqK.css.br +0 -0
  13. package/build/client/_app/immutable/assets/VoiceProfileSelector.rd8K9qqK.css.gz +0 -0
  14. package/build/client/_app/immutable/chunks/7Y-z2Cs4.js +3 -0
  15. package/build/client/_app/immutable/chunks/7Y-z2Cs4.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/7Y-z2Cs4.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{HJd0QhDi.js → BbsmUDEz.js} +1 -1
  18. package/build/client/_app/immutable/chunks/BbsmUDEz.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/BbsmUDEz.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{Mj3AXROx.js → BxIEEPV3.js} +1 -1
  21. package/build/client/_app/immutable/chunks/BxIEEPV3.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/BxIEEPV3.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/DBtofX2R.js +1 -0
  24. package/build/client/_app/immutable/chunks/DBtofX2R.js.br +2 -0
  25. package/build/client/_app/immutable/chunks/DBtofX2R.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/jhtvkF_A.js +1 -0
  27. package/build/client/_app/immutable/chunks/jhtvkF_A.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/jhtvkF_A.js.gz +0 -0
  29. package/build/client/_app/immutable/entry/{app.8wJBndTj.js → app.DamaMvOo.js} +2 -2
  30. package/build/client/_app/immutable/entry/app.DamaMvOo.js.br +0 -0
  31. package/build/client/_app/immutable/entry/app.DamaMvOo.js.gz +0 -0
  32. package/build/client/_app/immutable/entry/start.CiFTF0Id.js +1 -0
  33. package/build/client/_app/immutable/entry/start.CiFTF0Id.js.br +0 -0
  34. package/build/client/_app/immutable/entry/start.CiFTF0Id.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/{1.BeVZsPun.js → 1.D_t9eVLg.js} +1 -1
  36. package/build/client/_app/immutable/nodes/1.D_t9eVLg.js.br +1 -0
  37. package/build/client/_app/immutable/nodes/1.D_t9eVLg.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/{4.BAthCCnr.js → 4.rszAmyBN.js} +9 -9
  39. package/build/client/_app/immutable/nodes/4.rszAmyBN.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/4.rszAmyBN.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/{5.Ci-IDy_L.js → 5.B5KOuICr.js} +1 -1
  42. package/build/client/_app/immutable/nodes/5.B5KOuICr.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/5.B5KOuICr.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/{6._GM9bF5h.js → 6.Bw69iLts.js} +1 -1
  45. package/build/client/_app/immutable/nodes/6.Bw69iLts.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/6.Bw69iLts.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/{7.Cx4EVpki.js → 7.ockxnYPK.js} +1 -1
  48. package/build/client/_app/immutable/nodes/7.ockxnYPK.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/7.ockxnYPK.js.gz +0 -0
  50. package/build/client/_app/immutable/nodes/{8.p0qRhws4.js → 8.Bt2Nswbt.js} +1 -1
  51. package/build/client/_app/immutable/nodes/8.Bt2Nswbt.js.br +0 -0
  52. package/build/client/_app/immutable/nodes/8.Bt2Nswbt.js.gz +0 -0
  53. package/build/client/_app/immutable/nodes/9.pk1c6xm-.js +4 -0
  54. package/build/client/_app/immutable/nodes/9.pk1c6xm-.js.br +0 -0
  55. package/build/client/_app/immutable/nodes/9.pk1c6xm-.js.gz +0 -0
  56. package/build/client/_app/version.json +1 -1
  57. package/build/client/_app/version.json.br +1 -1
  58. package/build/client/_app/version.json.gz +0 -0
  59. package/build/client/setup/wizard.css +144 -406
  60. package/build/client/setup/wizard.css.br +0 -0
  61. package/build/client/setup/wizard.css.gz +0 -0
  62. package/build/server/chunks/{0-CTzT7i_m.js → 0-BK7D9z9V.js} +3 -3
  63. package/build/server/chunks/{0-CTzT7i_m.js.map → 0-BK7D9z9V.js.map} +1 -1
  64. package/build/server/chunks/1-BTD70sT7.js +9 -0
  65. package/build/server/chunks/{1-DTcDogB5.js.map → 1-BTD70sT7.js.map} +1 -1
  66. package/build/server/chunks/4-CubOOlWA.js +9 -0
  67. package/build/server/chunks/{4-Dn-0_RAr.js.map → 4-CubOOlWA.js.map} +1 -1
  68. package/build/server/chunks/5-C5D5O8w1.js +9 -0
  69. package/build/server/chunks/{5-Cbcb8WMr.js.map → 5-C5D5O8w1.js.map} +1 -1
  70. package/build/server/chunks/{6-CUZpLn9e.js → 6-DCNMSRHJ.js} +3 -3
  71. package/build/server/chunks/{6-CUZpLn9e.js.map → 6-DCNMSRHJ.js.map} +1 -1
  72. package/build/server/chunks/7-jdfP4oIc.js +9 -0
  73. package/build/server/chunks/{7-C0-ssq7j.js.map → 7-jdfP4oIc.js.map} +1 -1
  74. package/build/server/chunks/{8-CIt0k_cP.js → 8-Dd434AgX.js} +3 -3
  75. package/build/server/chunks/{8-CIt0k_cP.js.map → 8-Dd434AgX.js.map} +1 -1
  76. package/build/server/chunks/9-Dj1CAYUs.js +9 -0
  77. package/build/server/chunks/{9-B8DzptsC.js.map → 9-Dj1CAYUs.js.map} +1 -1
  78. package/build/server/chunks/{Navbar-F9NE4GcT.js → Navbar-Bbr28xK9.js} +3 -3
  79. package/build/server/chunks/{Navbar-F9NE4GcT.js.map → Navbar-Bbr28xK9.js.map} +1 -1
  80. package/build/server/chunks/VoiceProfileSelector-CbOV_v5A.js.map +1 -1
  81. package/build/server/chunks/{_page.svelte-DeJqqBhp.js → _page.svelte-4qKAK6Tb.js} +5 -5
  82. package/build/server/chunks/{_page.svelte-DeJqqBhp.js.map → _page.svelte-4qKAK6Tb.js.map} +1 -1
  83. package/build/server/chunks/{_page.svelte-DLAHj-kk.js → _page.svelte-B0M8mXzs.js} +6 -2
  84. package/build/server/chunks/_page.svelte-B0M8mXzs.js.map +1 -0
  85. package/build/server/chunks/{_page.svelte-BgAgZqQA.js → _page.svelte-D-uhfsj5.js} +6 -6
  86. package/build/server/chunks/_page.svelte-D-uhfsj5.js.map +1 -0
  87. package/build/server/chunks/{_page.svelte-CqEu-vpE.js → _page.svelte-D7VlbGXj.js} +5 -5
  88. package/build/server/chunks/{_page.svelte-CqEu-vpE.js.map → _page.svelte-D7VlbGXj.js.map} +1 -1
  89. package/build/server/chunks/{_page.svelte-DnwUHFZ8.js → _page.svelte-Dfe5FJdv.js} +5 -5
  90. package/build/server/chunks/{_page.svelte-DnwUHFZ8.js.map → _page.svelte-Dfe5FJdv.js.map} +1 -1
  91. package/build/server/chunks/{_page.svelte--GbfGVnN.js → _page.svelte-fkfNgz2M.js} +3 -3
  92. package/build/server/chunks/{_page.svelte--GbfGVnN.js.map → _page.svelte-fkfNgz2M.js.map} +1 -1
  93. package/build/server/chunks/{_server.ts-BrExNZ-2.js → _server.ts--N8krQnw.js} +4 -4
  94. package/build/server/chunks/{_server.ts-BrExNZ-2.js.map → _server.ts--N8krQnw.js.map} +1 -1
  95. package/build/server/chunks/{_server.ts-XOLGzzNk.js → _server.ts-67vw7faX.js} +4 -4
  96. package/build/server/chunks/{_server.ts-XOLGzzNk.js.map → _server.ts-67vw7faX.js.map} +1 -1
  97. package/build/server/chunks/{_server.ts-CsUi6NWt.js → _server.ts-B1J6gmcu.js} +4 -4
  98. package/build/server/chunks/{_server.ts-CsUi6NWt.js.map → _server.ts-B1J6gmcu.js.map} +1 -1
  99. package/build/server/chunks/{_server.ts-C8YMhHYj.js → _server.ts-B3uS0ABl.js} +4 -4
  100. package/build/server/chunks/{_server.ts-C8YMhHYj.js.map → _server.ts-B3uS0ABl.js.map} +1 -1
  101. package/build/server/chunks/{_server.ts-DgIgXukK.js → _server.ts-B4p_jHqU.js} +38 -27
  102. package/build/server/chunks/_server.ts-B4p_jHqU.js.map +1 -0
  103. package/build/server/chunks/{_server.ts-BAsbrtjL.js → _server.ts-B7ST2I1g.js} +2 -2
  104. package/build/server/chunks/{_server.ts-BAsbrtjL.js.map → _server.ts-B7ST2I1g.js.map} +1 -1
  105. package/build/server/chunks/{_server.ts-DLHN_6MC.js → _server.ts-BAlnprxv.js} +4 -4
  106. package/build/server/chunks/{_server.ts-DLHN_6MC.js.map → _server.ts-BAlnprxv.js.map} +1 -1
  107. package/build/server/chunks/{_server.ts-B2RCiGeA.js → _server.ts-BAmfRgDu.js} +4 -4
  108. package/build/server/chunks/{_server.ts-B2RCiGeA.js.map → _server.ts-BAmfRgDu.js.map} +1 -1
  109. package/build/server/chunks/{_server.ts-CH8VLn03.js → _server.ts-BC7_zqMR.js} +4 -4
  110. package/build/server/chunks/{_server.ts-CH8VLn03.js.map → _server.ts-BC7_zqMR.js.map} +1 -1
  111. package/build/server/chunks/{_server.ts-__xVWUvt.js → _server.ts-BDGqI5pR.js} +4 -4
  112. package/build/server/chunks/{_server.ts-__xVWUvt.js.map → _server.ts-BDGqI5pR.js.map} +1 -1
  113. package/build/server/chunks/{_server.ts-l3A6IOvJ.js → _server.ts-BGBkyRka.js} +4 -4
  114. package/build/server/chunks/{_server.ts-l3A6IOvJ.js.map → _server.ts-BGBkyRka.js.map} +1 -1
  115. package/build/server/chunks/{_server.ts-D4zkfcxH.js → _server.ts-BJYAW2v_.js} +4 -4
  116. package/build/server/chunks/{_server.ts-D4zkfcxH.js.map → _server.ts-BJYAW2v_.js.map} +1 -1
  117. package/build/server/chunks/{_server.ts-8iOMau6K.js → _server.ts-BLWYsGx3.js} +4 -4
  118. package/build/server/chunks/{_server.ts-8iOMau6K.js.map → _server.ts-BLWYsGx3.js.map} +1 -1
  119. package/build/server/chunks/{_server.ts-C44tS0KC.js → _server.ts-BTwVVUpt.js} +4 -4
  120. package/build/server/chunks/{_server.ts-C44tS0KC.js.map → _server.ts-BTwVVUpt.js.map} +1 -1
  121. package/build/server/chunks/{_server.ts-N6WIc0vw.js → _server.ts-BXQH4Qlt.js} +4 -4
  122. package/build/server/chunks/{_server.ts-N6WIc0vw.js.map → _server.ts-BXQH4Qlt.js.map} +1 -1
  123. package/build/server/chunks/{_server.ts-ZE9PYnxj.js → _server.ts-BZV8kPh-.js} +4 -4
  124. package/build/server/chunks/_server.ts-BZV8kPh-.js.map +1 -0
  125. package/build/server/chunks/{_server.ts-BCcQdRne.js → _server.ts-Bb62UkjI.js} +4 -4
  126. package/build/server/chunks/{_server.ts-BCcQdRne.js.map → _server.ts-Bb62UkjI.js.map} +1 -1
  127. package/build/server/chunks/{_server.ts-vp9n_72N.js → _server.ts-BimilJxw.js} +4 -4
  128. package/build/server/chunks/{_server.ts-vp9n_72N.js.map → _server.ts-BimilJxw.js.map} +1 -1
  129. package/build/server/chunks/{_server.ts-D0FZ3wh5.js → _server.ts-BjsoTMxt.js} +4 -4
  130. package/build/server/chunks/{_server.ts-D0FZ3wh5.js.map → _server.ts-BjsoTMxt.js.map} +1 -1
  131. package/build/server/chunks/{_server.ts-BQZSWSLy.js → _server.ts-Bkz7Vyl7.js} +5 -5
  132. package/build/server/chunks/{_server.ts-BQZSWSLy.js.map → _server.ts-Bkz7Vyl7.js.map} +1 -1
  133. package/build/server/chunks/{_server.ts-DQcL5wr_.js → _server.ts-BtIfXnk8.js} +4 -4
  134. package/build/server/chunks/{_server.ts-DQcL5wr_.js.map → _server.ts-BtIfXnk8.js.map} +1 -1
  135. package/build/server/chunks/{_server.ts-BD6Urice.js → _server.ts-C2jZDeoI.js} +4 -4
  136. package/build/server/chunks/{_server.ts-BD6Urice.js.map → _server.ts-C2jZDeoI.js.map} +1 -1
  137. package/build/server/chunks/{_server.ts-DrM8VAOS.js → _server.ts-C3UA92-P.js} +4 -4
  138. package/build/server/chunks/{_server.ts-DrM8VAOS.js.map → _server.ts-C3UA92-P.js.map} +1 -1
  139. package/build/server/chunks/_server.ts-CAycEHO4.js +95 -0
  140. package/build/server/chunks/_server.ts-CAycEHO4.js.map +1 -0
  141. package/build/server/chunks/{_server.ts-DXOh4EZe.js → _server.ts-CBYvFEVS.js} +15 -6
  142. package/build/server/chunks/_server.ts-CBYvFEVS.js.map +1 -0
  143. package/build/server/chunks/{_server.ts-CQPWD_WN.js → _server.ts-CKkuDSSM.js} +4 -4
  144. package/build/server/chunks/{_server.ts-CQPWD_WN.js.map → _server.ts-CKkuDSSM.js.map} +1 -1
  145. package/build/server/chunks/{_server.ts-D5Q5mczv.js → _server.ts-CRUfNiEL.js} +4 -4
  146. package/build/server/chunks/{_server.ts-D5Q5mczv.js.map → _server.ts-CRUfNiEL.js.map} +1 -1
  147. package/build/server/chunks/{_server.ts-CG1nihTT.js → _server.ts-CRgQ6JvE.js} +4 -4
  148. package/build/server/chunks/{_server.ts-CG1nihTT.js.map → _server.ts-CRgQ6JvE.js.map} +1 -1
  149. package/build/server/chunks/{_server.ts-Bj_nJzpo.js → _server.ts-CVnGEGgz.js} +4 -4
  150. package/build/server/chunks/{_server.ts-Bj_nJzpo.js.map → _server.ts-CVnGEGgz.js.map} +1 -1
  151. package/build/server/chunks/{_server.ts-BVYIqRK2.js → _server.ts-C_o9u8JZ.js} +4 -4
  152. package/build/server/chunks/{_server.ts-BVYIqRK2.js.map → _server.ts-C_o9u8JZ.js.map} +1 -1
  153. package/build/server/chunks/{_server.ts-DbMkM72G.js → _server.ts-CaIBfM3d.js} +4 -4
  154. package/build/server/chunks/{_server.ts-DbMkM72G.js.map → _server.ts-CaIBfM3d.js.map} +1 -1
  155. package/build/server/chunks/{_server.ts-CPzbkayh.js → _server.ts-CcLqY7mC.js} +4 -4
  156. package/build/server/chunks/{_server.ts-CPzbkayh.js.map → _server.ts-CcLqY7mC.js.map} +1 -1
  157. package/build/server/chunks/{_server.ts-DAb50kOu.js → _server.ts-CgkGvTF0.js} +5 -5
  158. package/build/server/chunks/{_server.ts-DAb50kOu.js.map → _server.ts-CgkGvTF0.js.map} +1 -1
  159. package/build/server/chunks/{_server.ts-pLeJl6U2.js → _server.ts-Co5auLt6.js} +4 -4
  160. package/build/server/chunks/{_server.ts-pLeJl6U2.js.map → _server.ts-Co5auLt6.js.map} +1 -1
  161. package/build/server/chunks/{_server.ts-BaxB3oQq.js → _server.ts-CpO4xFnt.js} +4 -4
  162. package/build/server/chunks/{_server.ts-BaxB3oQq.js.map → _server.ts-CpO4xFnt.js.map} +1 -1
  163. package/build/server/chunks/{_server.ts-DtC0SjIr.js → _server.ts-Cw-3n_ep.js} +4 -4
  164. package/build/server/chunks/{_server.ts-DtC0SjIr.js.map → _server.ts-Cw-3n_ep.js.map} +1 -1
  165. package/build/server/chunks/{_server.ts-sEc4S_v5.js → _server.ts-D20tceEK.js} +6 -6
  166. package/build/server/chunks/{_server.ts-sEc4S_v5.js.map → _server.ts-D20tceEK.js.map} +1 -1
  167. package/build/server/chunks/{_server.ts-EBySP1Ew.js → _server.ts-D39hF3fC.js} +2 -2
  168. package/build/server/chunks/{_server.ts-EBySP1Ew.js.map → _server.ts-D39hF3fC.js.map} +1 -1
  169. package/build/server/chunks/{_server.ts-BlMOxGWA.js → _server.ts-D3isWFzo.js} +7 -7
  170. package/build/server/chunks/_server.ts-D3isWFzo.js.map +1 -0
  171. package/build/server/chunks/{_server.ts-iAOP7FW1.js → _server.ts-D9xZdloN.js} +11 -14
  172. package/build/server/chunks/_server.ts-D9xZdloN.js.map +1 -0
  173. package/build/server/chunks/{_server.ts-DcQTtmS3.js → _server.ts-DCg7u0gt.js} +4 -4
  174. package/build/server/chunks/{_server.ts-DcQTtmS3.js.map → _server.ts-DCg7u0gt.js.map} +1 -1
  175. package/build/server/chunks/{_server.ts-COORKWSc.js → _server.ts-DDNv0MDu.js} +4 -4
  176. package/build/server/chunks/{_server.ts-COORKWSc.js.map → _server.ts-DDNv0MDu.js.map} +1 -1
  177. package/build/server/chunks/{_server.ts-CC-mpNNj.js → _server.ts-DEB9v5s4.js} +4 -4
  178. package/build/server/chunks/{_server.ts-CC-mpNNj.js.map → _server.ts-DEB9v5s4.js.map} +1 -1
  179. package/build/server/chunks/{_server.ts-DjlikYHH.js → _server.ts-DFBCN73l.js} +5 -5
  180. package/build/server/chunks/{_server.ts-DjlikYHH.js.map → _server.ts-DFBCN73l.js.map} +1 -1
  181. package/build/server/chunks/{_server.ts-B8sdNvW5.js → _server.ts-DS6wkfxg.js} +4 -4
  182. package/build/server/chunks/{_server.ts-B8sdNvW5.js.map → _server.ts-DS6wkfxg.js.map} +1 -1
  183. package/build/server/chunks/{_server.ts-DjnK1iz8.js → _server.ts-DSUpiCQo.js} +4 -4
  184. package/build/server/chunks/{_server.ts-DjnK1iz8.js.map → _server.ts-DSUpiCQo.js.map} +1 -1
  185. package/build/server/chunks/{_server.ts-DFL8Mq_R.js → _server.ts-DUa6bwDM.js} +4 -4
  186. package/build/server/chunks/{_server.ts-DFL8Mq_R.js.map → _server.ts-DUa6bwDM.js.map} +1 -1
  187. package/build/server/chunks/{_server.ts-DQE5fd19.js → _server.ts-DVdrht9C.js} +4 -4
  188. package/build/server/chunks/{_server.ts-DQE5fd19.js.map → _server.ts-DVdrht9C.js.map} +1 -1
  189. package/build/server/chunks/{_server.ts-Ban3zjRc.js → _server.ts-DXBrPiAj.js} +4 -4
  190. package/build/server/chunks/{_server.ts-Ban3zjRc.js.map → _server.ts-DXBrPiAj.js.map} +1 -1
  191. package/build/server/chunks/{_server.ts-C7D2sok_.js → _server.ts-DYuZIg9l.js} +4 -4
  192. package/build/server/chunks/{_server.ts-C7D2sok_.js.map → _server.ts-DYuZIg9l.js.map} +1 -1
  193. package/build/server/chunks/{_server.ts-C5uu6b2a.js → _server.ts-DZyh2rB9.js} +6 -5
  194. package/build/server/chunks/_server.ts-DZyh2rB9.js.map +1 -0
  195. package/build/server/chunks/{_server.ts-BkGQezlX.js → _server.ts-Dbqne9eY.js} +6 -6
  196. package/build/server/chunks/{_server.ts-BkGQezlX.js.map → _server.ts-Dbqne9eY.js.map} +1 -1
  197. package/build/server/chunks/{_server.ts-BYTWLTxk.js → _server.ts-DguLVMDx.js} +6 -7
  198. package/build/server/chunks/_server.ts-DguLVMDx.js.map +1 -0
  199. package/build/server/chunks/{_server.ts-CSs35mBJ.js → _server.ts-DhXmrQhc.js} +4 -4
  200. package/build/server/chunks/{_server.ts-CSs35mBJ.js.map → _server.ts-DhXmrQhc.js.map} +1 -1
  201. package/build/server/chunks/{_server.ts-BG3UvxEU.js → _server.ts-DniIPBxO.js} +2 -2
  202. package/build/server/chunks/{_server.ts-BG3UvxEU.js.map → _server.ts-DniIPBxO.js.map} +1 -1
  203. package/build/server/chunks/{_server.ts-_o3Yebl6.js → _server.ts-DrZeLUaT.js} +4 -4
  204. package/build/server/chunks/{_server.ts-_o3Yebl6.js.map → _server.ts-DrZeLUaT.js.map} +1 -1
  205. package/build/server/chunks/{_server.ts-D9HJ0cWI.js → _server.ts-DteVoyg4.js} +4 -4
  206. package/build/server/chunks/{_server.ts-D9HJ0cWI.js.map → _server.ts-DteVoyg4.js.map} +1 -1
  207. package/build/server/chunks/{_server.ts-DuBJyo4e.js → _server.ts-Dw7_J4x-.js} +4 -4
  208. package/build/server/chunks/{_server.ts-DuBJyo4e.js.map → _server.ts-Dw7_J4x-.js.map} +1 -1
  209. package/build/server/chunks/{_server.ts-Me1rXUGo.js → _server.ts-Dw9IUnbc.js} +4 -4
  210. package/build/server/chunks/{_server.ts-Me1rXUGo.js.map → _server.ts-Dw9IUnbc.js.map} +1 -1
  211. package/build/server/chunks/{_server.ts-ypkZ9bJf.js → _server.ts-KOGE5rzJ.js} +2 -2
  212. package/build/server/chunks/{_server.ts-ypkZ9bJf.js.map → _server.ts-KOGE5rzJ.js.map} +1 -1
  213. package/build/server/chunks/{_server.ts-ccd1enMp.js → _server.ts-MJxff6j1.js} +4 -4
  214. package/build/server/chunks/{_server.ts-ccd1enMp.js.map → _server.ts-MJxff6j1.js.map} +1 -1
  215. package/build/server/chunks/{_server.ts-IkgMCbAi.js → _server.ts-SFkX7VFb.js} +6 -6
  216. package/build/server/chunks/{_server.ts-IkgMCbAi.js.map → _server.ts-SFkX7VFb.js.map} +1 -1
  217. package/build/server/chunks/{_server.ts-C5wVttUW.js → _server.ts-cFNIAAvs.js} +3 -3
  218. package/build/server/chunks/{_server.ts-C5wVttUW.js.map → _server.ts-cFNIAAvs.js.map} +1 -1
  219. package/build/server/chunks/{_server.ts-BZ8wMJ7l.js → _server.ts-fRYbSpUy.js} +4 -4
  220. package/build/server/chunks/{_server.ts-BZ8wMJ7l.js.map → _server.ts-fRYbSpUy.js.map} +1 -1
  221. package/build/server/chunks/{_server.ts-C1CpbG3_.js → _server.ts-kVbBWaDD.js} +4 -4
  222. package/build/server/chunks/{_server.ts-C1CpbG3_.js.map → _server.ts-kVbBWaDD.js.map} +1 -1
  223. package/build/server/chunks/{_server.ts-DRxZJQd6.js → _server.ts-oLxKZF14.js} +6 -6
  224. package/build/server/chunks/{_server.ts-DRxZJQd6.js.map → _server.ts-oLxKZF14.js.map} +1 -1
  225. package/build/server/chunks/{_server.ts-BVCET3CA.js → _server.ts-rGaZfdIc.js} +4 -4
  226. package/build/server/chunks/{_server.ts-BVCET3CA.js.map → _server.ts-rGaZfdIc.js.map} +1 -1
  227. package/build/server/chunks/{_server.ts-BTGThm9P.js → _server.ts-rP8pYqeQ.js} +4 -4
  228. package/build/server/chunks/{_server.ts-BTGThm9P.js.map → _server.ts-rP8pYqeQ.js.map} +1 -1
  229. package/build/server/chunks/{_server.ts-Mycnkmlz.js → _server.ts-swRf_u3E.js} +5 -5
  230. package/build/server/chunks/{_server.ts-Mycnkmlz.js.map → _server.ts-swRf_u3E.js.map} +1 -1
  231. package/build/server/chunks/{_server.ts-Cw2YXWgK.js → _server.ts-upBZRwnP.js} +5 -5
  232. package/build/server/chunks/{_server.ts-Cw2YXWgK.js.map → _server.ts-upBZRwnP.js.map} +1 -1
  233. package/build/server/chunks/{_server.ts-BD0Jit8e.js → _server.ts-vr1wDdjl.js} +4 -4
  234. package/build/server/chunks/{_server.ts-BD0Jit8e.js.map → _server.ts-vr1wDdjl.js.map} +1 -1
  235. package/build/server/chunks/{addon-helpers-B0E6L7iO.js → addon-helpers-DU7K-Jl-.js} +3 -3
  236. package/build/server/chunks/{addon-helpers-B0E6L7iO.js.map → addon-helpers-DU7K-Jl-.js.map} +1 -1
  237. package/build/server/chunks/{client-D0taHWmu.js → client-DlIaBp3l.js} +2 -2
  238. package/build/server/chunks/{client-D0taHWmu.js.map → client-DlIaBp3l.js.map} +1 -1
  239. package/build/server/chunks/{config-2pnPob92.js → config-DuMmS4Kk.js} +2 -2
  240. package/build/server/chunks/{config-2pnPob92.js.map → config-DuMmS4Kk.js.map} +1 -1
  241. package/build/server/chunks/{docker-D17EjIlp.js → docker-YA68OZn5.js} +2 -2
  242. package/build/server/chunks/{docker-D17EjIlp.js.map → docker-YA68OZn5.js.map} +1 -1
  243. package/build/server/chunks/{endpoints-DoIeO5WL.js → endpoints-CGm4oVfk.js} +2 -2
  244. package/build/server/chunks/{endpoints-DoIeO5WL.js.map → endpoints-CGm4oVfk.js.map} +1 -1
  245. package/build/server/chunks/{environment-B38QRFKh.js → environment-WrKoCzje.js} +2 -2
  246. package/build/server/chunks/{environment-B38QRFKh.js.map → environment-WrKoCzje.js.map} +1 -1
  247. package/build/server/chunks/{error.svelte-DB6X8EVo.js → error.svelte-D4IIBHJA.js} +4 -4
  248. package/build/server/chunks/{error.svelte-DB6X8EVo.js.map → error.svelte-D4IIBHJA.js.map} +1 -1
  249. package/build/server/chunks/{helpers-CeQwqpAT.js → helpers-h_Fq1SBb.js} +34 -8
  250. package/build/server/chunks/helpers-h_Fq1SBb.js.map +1 -0
  251. package/build/server/chunks/{hooks.server-2io-2N7D.js → hooks.server-SbPoC8s4.js} +13 -4
  252. package/build/server/chunks/hooks.server-SbPoC8s4.js.map +1 -0
  253. package/build/server/chunks/{http-CHmjTVGA.js → http-DbpsBgUe.js} +2 -2
  254. package/build/server/chunks/{http-CHmjTVGA.js.map → http-DbpsBgUe.js.map} +1 -1
  255. package/build/server/chunks/{internal-ClL4rso0.js → internal-DtdC4O8s.js} +3 -3
  256. package/build/server/chunks/{internal-ClL4rso0.js.map → internal-DtdC4O8s.js.map} +1 -1
  257. package/build/server/chunks/session-cookie-C61HbJV5.js +74 -0
  258. package/build/server/chunks/session-cookie-C61HbJV5.js.map +1 -0
  259. package/build/server/chunks/{setup-deploy-53S0fflh.js → setup-deploy-D0Om28m3.js} +19 -30
  260. package/build/server/chunks/setup-deploy-D0Om28m3.js.map +1 -0
  261. package/build/server/chunks/{src-D9YnoOnU.js → src-DJv-Q_k2.js} +365 -67
  262. package/build/server/chunks/src-DJv-Q_k2.js.map +1 -0
  263. package/build/server/chunks/{state-CO78UOQH.js → state-DGpfeO6d.js} +2 -2
  264. package/build/server/chunks/{state-CO78UOQH.js.map → state-DGpfeO6d.js.map} +1 -1
  265. package/build/server/index.js +2 -2
  266. package/build/server/manifest.js +86 -79
  267. package/build/server/manifest.js.map +1 -1
  268. package/package.json +2 -2
  269. package/build/client/_app/immutable/assets/0.DlIhzko8.css.br +0 -0
  270. package/build/client/_app/immutable/assets/0.DlIhzko8.css.gz +0 -0
  271. package/build/client/_app/immutable/assets/4.CLTnoKrH.css +0 -1
  272. package/build/client/_app/immutable/assets/4.CLTnoKrH.css.br +0 -0
  273. package/build/client/_app/immutable/assets/4.CLTnoKrH.css.gz +0 -0
  274. package/build/client/_app/immutable/assets/9.cpz_TytB.css +0 -1
  275. package/build/client/_app/immutable/assets/9.cpz_TytB.css.br +0 -0
  276. package/build/client/_app/immutable/assets/9.cpz_TytB.css.gz +0 -0
  277. package/build/client/_app/immutable/assets/VoiceProfileSelector.B8FTffwl.css +0 -1
  278. package/build/client/_app/immutable/assets/VoiceProfileSelector.B8FTffwl.css.br +0 -0
  279. package/build/client/_app/immutable/assets/VoiceProfileSelector.B8FTffwl.css.gz +0 -0
  280. package/build/client/_app/immutable/chunks/1sXFUT7r.js +0 -1
  281. package/build/client/_app/immutable/chunks/1sXFUT7r.js.br +0 -2
  282. package/build/client/_app/immutable/chunks/1sXFUT7r.js.gz +0 -0
  283. package/build/client/_app/immutable/chunks/BNcdU8Ou.js +0 -3
  284. package/build/client/_app/immutable/chunks/BNcdU8Ou.js.br +0 -0
  285. package/build/client/_app/immutable/chunks/BNcdU8Ou.js.gz +0 -0
  286. package/build/client/_app/immutable/chunks/BQrb5YOM.js +0 -1
  287. package/build/client/_app/immutable/chunks/BQrb5YOM.js.br +0 -0
  288. package/build/client/_app/immutable/chunks/BQrb5YOM.js.gz +0 -0
  289. package/build/client/_app/immutable/chunks/HJd0QhDi.js.br +0 -0
  290. package/build/client/_app/immutable/chunks/HJd0QhDi.js.gz +0 -0
  291. package/build/client/_app/immutable/chunks/Mj3AXROx.js.br +0 -0
  292. package/build/client/_app/immutable/chunks/Mj3AXROx.js.gz +0 -0
  293. package/build/client/_app/immutable/entry/app.8wJBndTj.js.br +0 -0
  294. package/build/client/_app/immutable/entry/app.8wJBndTj.js.gz +0 -0
  295. package/build/client/_app/immutable/entry/start.B6QaWAof.js +0 -1
  296. package/build/client/_app/immutable/entry/start.B6QaWAof.js.br +0 -0
  297. package/build/client/_app/immutable/entry/start.B6QaWAof.js.gz +0 -0
  298. package/build/client/_app/immutable/nodes/1.BeVZsPun.js.br +0 -1
  299. package/build/client/_app/immutable/nodes/1.BeVZsPun.js.gz +0 -0
  300. package/build/client/_app/immutable/nodes/4.BAthCCnr.js.br +0 -0
  301. package/build/client/_app/immutable/nodes/4.BAthCCnr.js.gz +0 -0
  302. package/build/client/_app/immutable/nodes/5.Ci-IDy_L.js.br +0 -0
  303. package/build/client/_app/immutable/nodes/5.Ci-IDy_L.js.gz +0 -0
  304. package/build/client/_app/immutable/nodes/6._GM9bF5h.js.br +0 -0
  305. package/build/client/_app/immutable/nodes/6._GM9bF5h.js.gz +0 -0
  306. package/build/client/_app/immutable/nodes/7.Cx4EVpki.js.br +0 -0
  307. package/build/client/_app/immutable/nodes/7.Cx4EVpki.js.gz +0 -0
  308. package/build/client/_app/immutable/nodes/8.p0qRhws4.js.br +0 -0
  309. package/build/client/_app/immutable/nodes/8.p0qRhws4.js.gz +0 -0
  310. package/build/client/_app/immutable/nodes/9.C1MP3zci.js +0 -2
  311. package/build/client/_app/immutable/nodes/9.C1MP3zci.js.br +0 -0
  312. package/build/client/_app/immutable/nodes/9.C1MP3zci.js.gz +0 -0
  313. package/build/server/chunks/1-DTcDogB5.js +0 -9
  314. package/build/server/chunks/4-Dn-0_RAr.js +0 -9
  315. package/build/server/chunks/5-Cbcb8WMr.js +0 -9
  316. package/build/server/chunks/7-C0-ssq7j.js +0 -9
  317. package/build/server/chunks/9-B8DzptsC.js +0 -9
  318. package/build/server/chunks/_page.svelte-BgAgZqQA.js.map +0 -1
  319. package/build/server/chunks/_page.svelte-DLAHj-kk.js.map +0 -1
  320. package/build/server/chunks/_server.ts-BYTWLTxk.js.map +0 -1
  321. package/build/server/chunks/_server.ts-BlMOxGWA.js.map +0 -1
  322. package/build/server/chunks/_server.ts-C5uu6b2a.js.map +0 -1
  323. package/build/server/chunks/_server.ts-DXOh4EZe.js.map +0 -1
  324. package/build/server/chunks/_server.ts-DgIgXukK.js.map +0 -1
  325. package/build/server/chunks/_server.ts-ZE9PYnxj.js.map +0 -1
  326. package/build/server/chunks/_server.ts-iAOP7FW1.js.map +0 -1
  327. package/build/server/chunks/helpers-CeQwqpAT.js.map +0 -1
  328. package/build/server/chunks/hooks.server-2io-2N7D.js.map +0 -1
  329. package/build/server/chunks/setup-deploy-53S0fflh.js.map +0 -1
  330. package/build/server/chunks/src-D9YnoOnU.js.map +0 -1
  331. /package/build/client/_app/immutable/nodes/{0.rwRC6zAi.js → 0.0pi4RS6G.js} +0 -0
  332. /package/build/client/_app/immutable/nodes/{0.rwRC6zAi.js.br → 0.0pi4RS6G.js.br} +0 -0
  333. /package/build/client/_app/immutable/nodes/{0.rwRC6zAi.js.gz → 0.0pi4RS6G.js.gz} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { _ as __commonJSMin, b as __require } from './chunk-CLZ62Ad-.js';
2
- import Vt, { existsSync, readFileSync, copyFileSync, chmodSync, mkdirSync, readdirSync, writeFileSync, renameSync, rmSync, statSync, cpSync, lstatSync, openSync, constants, writeSync, closeSync, realpathSync } from 'node:fs';
2
+ import Vt, { existsSync, readFileSync, copyFileSync, chmodSync, mkdirSync, readdirSync, writeFileSync, renameSync, rmSync, statSync, cpSync, lstatSync, openSync, constants, writeSync, closeSync, chownSync, realpathSync } from 'node:fs';
3
3
  import or, { basename, dirname, resolve, join, win32, posix } from 'node:path';
4
4
  import { Buffer as Buffer$1 } from 'buffer';
5
5
  import { homedir, tmpdir } from 'node:os';
@@ -6864,7 +6864,7 @@ function ensureHomeDirs() {
6864
6864
  * On any unexpected error (permissions, ENOSPC, etc.) we return null so the
6865
6865
  * caller surfaces "install_in_progress" rather than silently fake-acquiring.
6866
6866
  */
6867
- var logger$8 = createLogger("install-lock");
6867
+ var logger$10 = createLogger("install-lock");
6868
6868
  var STALE_AFTER_MS = 1800 * 1e3;
6869
6869
  function isProcessAlive(pid) {
6870
6870
  try {
@@ -6931,7 +6931,7 @@ function acquireInstallLock(dataDir) {
6931
6931
  try {
6932
6932
  mkdirSync(dataDir, { recursive: true });
6933
6933
  } catch (err) {
6934
- logger$8.warn("failed to ensure data dir for install lock", {
6934
+ logger$10.warn("failed to ensure data dir for install lock", {
6935
6935
  dataDir,
6936
6936
  error: err instanceof Error ? err.message : String(err)
6937
6937
  });
@@ -6941,18 +6941,18 @@ function acquireInstallLock(dataDir) {
6941
6941
  try {
6942
6942
  if (tryCreate(path)) return { path };
6943
6943
  } catch (err) {
6944
- logger$8.warn("unexpected error acquiring install lock", {
6944
+ logger$10.warn("unexpected error acquiring install lock", {
6945
6945
  path,
6946
6946
  error: err instanceof Error ? err.message : String(err)
6947
6947
  });
6948
6948
  return null;
6949
6949
  }
6950
6950
  if (!isStale(path)) return null;
6951
- logger$8.info("removing stale install lock and retrying acquire", { path });
6951
+ logger$10.info("removing stale install lock and retrying acquire", { path });
6952
6952
  try {
6953
6953
  rmSync(path, { force: true });
6954
6954
  } catch (err) {
6955
- logger$8.warn("failed to remove stale install lock", {
6955
+ logger$10.warn("failed to remove stale install lock", {
6956
6956
  path,
6957
6957
  error: err instanceof Error ? err.message : String(err)
6958
6958
  });
@@ -6961,7 +6961,7 @@ function acquireInstallLock(dataDir) {
6961
6961
  try {
6962
6962
  if (tryCreate(path)) return { path };
6963
6963
  } catch (err) {
6964
- logger$8.warn("unexpected error re-acquiring install lock", {
6964
+ logger$10.warn("unexpected error re-acquiring install lock", {
6965
6965
  path,
6966
6966
  error: err instanceof Error ? err.message : String(err)
6967
6967
  });
@@ -6974,7 +6974,7 @@ function releaseInstallLock(handle) {
6974
6974
  try {
6975
6975
  rmSync(handle.path, { force: true });
6976
6976
  } catch (err) {
6977
- logger$8.warn("failed to release install lock", {
6977
+ logger$10.warn("failed to release install lock", {
6978
6978
  path: handle.path,
6979
6979
  error: err instanceof Error ? err.message : String(err)
6980
6980
  });
@@ -10665,7 +10665,7 @@ var yo = (s) => {
10665
10665
  * 4. null → remote download (the UI build from the @openpalm/ui npm registry
10666
10666
  * tarball; the .openpalm skeleton from the GitHub repo tarball)
10667
10667
  */
10668
- var logger$7 = createLogger("lib:ui-assets");
10668
+ var logger$9 = createLogger("lib:ui-assets");
10669
10669
  async function fetchWithRetry(url, retries = 3) {
10670
10670
  for (let i = 0; i < retries; i++) try {
10671
10671
  const res = await fetch(url, { signal: AbortSignal.timeout(6e4) });
@@ -10761,7 +10761,7 @@ async function downloadNpmUiBundle(manifest, uiDir, dataDir) {
10761
10761
  const data = new Uint8Array(await res.arrayBuffer());
10762
10762
  if (!manifest.integrity) throw new Error(`npm manifest for ${UI_PACKAGE}@${manifest.version} has no integrity hash — refusing to install unverified`);
10763
10763
  verifyNpmIntegrity(data, manifest.integrity);
10764
- logger$7.debug("UI bundle integrity verified", { version: manifest.version });
10764
+ logger$9.debug("UI bundle integrity verified", { version: manifest.version });
10765
10765
  const tmpTar = join(dataDir, ".ui-build.tgz.tmp");
10766
10766
  const staging = join(dataDir, ".ui-build.staging");
10767
10767
  try {
@@ -10804,7 +10804,7 @@ async function seedUiBuild(repoRef, dataDir, options) {
10804
10804
  const uiDir = join(dataDir, "ui");
10805
10805
  mkdirSync(uiDir, { recursive: true });
10806
10806
  const manifest = await fetchNpmUiManifest(toNpmVersion(repoRef));
10807
- logger$7.debug("downloading UI build from npm", { version: manifest.version });
10807
+ logger$9.debug("downloading UI build from npm", { version: manifest.version });
10808
10808
  await downloadNpmUiBundle(manifest, uiDir, dataDir);
10809
10809
  }
10810
10810
  //#endregion
@@ -10925,7 +10925,7 @@ function removeSecretFile(stackDir, name) {
10925
10925
  //#region ../lib/src/control-plane/secrets.ts
10926
10926
  /** Secrets and capability key management. */
10927
10927
  var OPENCODE_STARTER_CONFIG = JSON.stringify({ $schema: "https://opencode.ai/config.json" }, null, 2) + "\n";
10928
- var logger$6 = createLogger("secrets");
10928
+ var logger$8 = createLogger("secrets");
10929
10929
  var VAULT_DIR_MODE = 448;
10930
10930
  var VAULT_FILE_MODE = 384;
10931
10931
  var SECRET_ENV_KEY_RE = /(?:^OP_UI_LOGIN_PASSWORD$|^OP_OPENCODE_PASSWORD$|_API_KEY$|_TOKEN$|_SECRET$|_PASSWORD$)/;
@@ -10945,7 +10945,7 @@ function enforceVaultDirMode(vaultDir) {
10945
10945
  try {
10946
10946
  chmodSync(vaultDir, VAULT_DIR_MODE);
10947
10947
  } catch (error) {
10948
- logger$6.warn("failed to enforce vault directory permissions", {
10948
+ logger$8.warn("failed to enforce vault directory permissions", {
10949
10949
  vaultDir,
10950
10950
  error: error instanceof Error ? error.message : String(error)
10951
10951
  });
@@ -10956,7 +10956,7 @@ function writeVaultFile(path, content) {
10956
10956
  try {
10957
10957
  chmodSync(path, VAULT_FILE_MODE);
10958
10958
  } catch (error) {
10959
- logger$6.warn("failed to enforce vault file permissions", {
10959
+ logger$8.warn("failed to enforce vault file permissions", {
10960
10960
  path,
10961
10961
  error: error instanceof Error ? error.message : String(error)
10962
10962
  });
@@ -11021,7 +11021,7 @@ function ensureAuthJson(state) {
11021
11021
  return;
11022
11022
  }
11023
11023
  } catch (error) {
11024
- logger$6.warn("failed to repair auth.json path", {
11024
+ logger$8.warn("failed to repair auth.json path", {
11025
11025
  path: authJsonPath$1,
11026
11026
  error: error instanceof Error ? error.message : String(error)
11027
11027
  });
@@ -11064,12 +11064,12 @@ function writeAuthJsonProviderKeys(state, providerKeys) {
11064
11064
  const corruptPath = `${authJsonPath$2}.corrupt-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}`;
11065
11065
  try {
11066
11066
  renameSync(authJsonPath$2, corruptPath);
11067
- logger$6.warn("corrupt auth.json renamed for recovery", {
11067
+ logger$8.warn("corrupt auth.json renamed for recovery", {
11068
11068
  original: authJsonPath$2,
11069
11069
  renamed: corruptPath
11070
11070
  });
11071
11071
  } catch (renameErr) {
11072
- logger$6.warn("could not rename corrupt auth.json; starting fresh", {
11072
+ logger$8.warn("could not rename corrupt auth.json; starting fresh", {
11073
11073
  path: authJsonPath$2,
11074
11074
  error: renameErr instanceof Error ? renameErr.message : String(renameErr)
11075
11075
  });
@@ -11301,6 +11301,7 @@ async function refreshCoreAssets(version) {
11301
11301
  * the rollback module (snapshot to OP_HOME/data/rollback/).
11302
11302
  */
11303
11303
  var DEFAULT_IMAGE_TAG = "latest";
11304
+ var logger$7 = createLogger("config-persistence");
11304
11305
  /**
11305
11306
  * Return the env files used for docker compose --env-file args.
11306
11307
  *
@@ -11437,6 +11438,7 @@ function ensureChannelSecret(stackDir, addon) {
11437
11438
  function ensureComposeVolumeTargets(state) {
11438
11439
  const composeFiles = discoverStackOverlays(state.stackDir, state.homeDir);
11439
11440
  if (composeFiles.length === 0) return;
11441
+ const operatorIds = resolveOperatorIds(state.homeDir);
11440
11442
  const envVars = {
11441
11443
  ...process.env,
11442
11444
  ...parseEnvFile(`${state.stashDir}/env/stack.env`)
@@ -11464,13 +11466,36 @@ function ensureComposeVolumeTargets(state) {
11464
11466
  if (!resolvedHostPath.startsWith(`${homeRoot}/`) && resolvedHostPath !== homeRoot) continue;
11465
11467
  if (existsSync(resolvedHostPath)) continue;
11466
11468
  if ((resolvedHostPath.split("/").pop() ?? "").includes(".")) {
11467
- mkdirSync(dirname(resolvedHostPath), { recursive: true });
11469
+ const parent = dirname(resolvedHostPath);
11470
+ mkdirSync(parent, { recursive: true });
11468
11471
  writeFileSync(resolvedHostPath, "");
11469
- } else mkdirSync(resolvedHostPath, { recursive: true });
11472
+ chownVolumeTarget(parent, operatorIds);
11473
+ chownVolumeTarget(resolvedHostPath, operatorIds);
11474
+ } else {
11475
+ mkdirSync(resolvedHostPath, { recursive: true });
11476
+ chownVolumeTarget(resolvedHostPath, operatorIds);
11477
+ }
11470
11478
  }
11471
11479
  }
11472
11480
  }
11473
11481
  }
11482
+ /**
11483
+ * chown a just-created bind-mount target to the operator UID/GID so the
11484
+ * non-root container (`user: ${OP_UID}:${OP_GID}`) can write to it.
11485
+ *
11486
+ * No-op on Windows (chown is meaningless there) or when no operator can be
11487
+ * resolved. A failure (e.g. not the owner) is logged and swallowed — the
11488
+ * mkdir already succeeded and Docker Desktop's gRPC-FUSE masks ownership
11489
+ * anyway, so a chown failure must not abort the install.
11490
+ */
11491
+ function chownVolumeTarget(path, operatorIds) {
11492
+ if (process.platform === "win32" || !operatorIds) return;
11493
+ try {
11494
+ chownSync(path, operatorIds.uid, operatorIds.gid);
11495
+ } catch (error) {
11496
+ logger$7.warn(`Could not chown volume target ${path} to ${operatorIds.uid}:${operatorIds.gid}: ${error instanceof Error ? error.message : String(error)}`);
11497
+ }
11498
+ }
11474
11499
  function writeRuntimeFiles(state) {
11475
11500
  mkdirSync(state.stackDir, { recursive: true });
11476
11501
  const composePath = `${state.stackDir}/core.compose.yml`;
@@ -11527,7 +11552,7 @@ function canonicalAddonProfileSelection(addon, profile) {
11527
11552
  * the runtime source of truth.
11528
11553
  */
11529
11554
  var VALID_NAME_RE = /^[a-z0-9][a-z0-9-]{0,62}$/;
11530
- var logger$5 = createLogger("registry");
11555
+ var logger$6 = createLogger("registry");
11531
11556
  var BUILTIN_ADDONS = [
11532
11557
  "api",
11533
11558
  "chat",
@@ -11728,7 +11753,7 @@ function readAddonServiceNamesFromContent(composeContent, composePath, addonName
11728
11753
  return Array.isArray(profiles) && profiles.some((p) => typeof p === "string" && p.startsWith(`addon.${addonName}`));
11729
11754
  }).map(([serviceName]) => serviceName);
11730
11755
  } catch (error) {
11731
- logger$5.warn("failed to parse addon compose services", {
11756
+ logger$6.warn("failed to parse addon compose services", {
11732
11757
  composePath,
11733
11758
  error: error instanceof Error ? error.message : String(error)
11734
11759
  });
@@ -11895,7 +11920,7 @@ function readAddonProfilesFromContent(composeContent, composePath) {
11895
11920
  try {
11896
11921
  parsed = (0, import_dist.parse)(composeContent);
11897
11922
  } catch (error) {
11898
- logger$5.warn("failed to parse addon compose profiles", {
11923
+ logger$6.warn("failed to parse addon compose profiles", {
11899
11924
  composePath,
11900
11925
  error: error instanceof Error ? error.message : String(error)
11901
11926
  });
@@ -12059,6 +12084,7 @@ function setAddonEnabled(homeDir, stackDir, name, enabled, state) {
12059
12084
  "discord",
12060
12085
  "slack"
12061
12086
  ]) ensureChannelSecret(stackDir, channel);
12087
+ if (state) ensureComposeVolumeTargets(state);
12062
12088
  }
12063
12089
  return {
12064
12090
  ok: true,
@@ -12594,7 +12620,7 @@ function importHostProfiles(state, hostConfigPath) {
12594
12620
  * We never write into the user's personal ~/.config/akm here. (Letting the host
12595
12621
  * akm see OpenPalm's knowledge is a future, explicit opt-in.)
12596
12622
  */
12597
- var logger$4 = createLogger("host-akm-sharing");
12623
+ var logger$5 = createLogger("host-akm-sharing");
12598
12624
  var ENV_KEY = "OP_HOST_AKM_STASH";
12599
12625
  function userHome() {
12600
12626
  return process.env.HOME ?? process.env.USERPROFILE ?? homedir();
@@ -12636,7 +12662,7 @@ function enableHostAkmSharing(state, opts = {}) {
12636
12662
  addHostStashToOpenpalmConfig(state, opts.writable ?? true);
12637
12663
  let profilesImported = [];
12638
12664
  if (opts.importProfiles) profilesImported = importHostProfiles(state, hostAkmConfigPath()).imported;
12639
- logger$4.info("host akm sharing enabled", {
12665
+ logger$5.info("host akm sharing enabled", {
12640
12666
  hostStashPath: hostAkmStashPath(),
12641
12667
  profilesImported
12642
12668
  });
@@ -12649,7 +12675,7 @@ function enableHostAkmSharing(state, opts = {}) {
12649
12675
  */
12650
12676
  function disableHostAkmSharing(state) {
12651
12677
  removeHostAkmSource(state);
12652
- logger$4.info("host akm sharing disabled");
12678
+ logger$5.info("host akm sharing disabled");
12653
12679
  }
12654
12680
  /** Report availability + whether the host-akm source is currently configured. */
12655
12681
  function getHostAkmSharingStatus(state) {
@@ -12870,7 +12896,7 @@ async function validateProposedState(state) {
12870
12896
  };
12871
12897
  }
12872
12898
  /** Execute docker with an argument array — no shell interpolation. */
12873
- function run(args, cwd, timeoutMs = 12e4, envOverrides) {
12899
+ function run$1(args, cwd, timeoutMs = 12e4, envOverrides) {
12874
12900
  return new Promise((resolve) => {
12875
12901
  execFile("docker", args, {
12876
12902
  cwd,
@@ -12896,6 +12922,66 @@ function run(args, cwd, timeoutMs = 12e4, envOverrides) {
12896
12922
  function resolveComposeProjectName(envOverrides = {}) {
12897
12923
  return envOverrides.OP_PROJECT_NAME?.trim() || envOverrides.COMPOSE_PROJECT_NAME?.trim() || process.env.OP_PROJECT_NAME?.trim() || process.env.COMPOSE_PROJECT_NAME?.trim() || "openpalm";
12898
12924
  }
12925
+ /**
12926
+ * Decide whether a running compose project (identified by its
12927
+ * `com.docker.compose.project.working_dir` label) is OURS — i.e. was launched
12928
+ * from this install's working dir. An empty/unknown label can't prove foreign,
12929
+ * so it counts as ours (reconcile rather than wrongly refuse a redeploy).
12930
+ *
12931
+ * Pure decision split out from detectExistingProject so the ours-vs-foreign
12932
+ * rule is unit-testable without a Docker daemon.
12933
+ */
12934
+ function isProjectOurs(workingDirLabel, expectedWorkingDir) {
12935
+ const label = workingDirLabel.trim();
12936
+ return label === "" || label === expectedWorkingDir;
12937
+ }
12938
+ /**
12939
+ * Probe the Docker daemon for a running compose project that shares
12940
+ * `projectName`. Decides ours-vs-foreign by comparing the project's
12941
+ * `com.docker.compose.project.working_dir` label against `expectedWorkingDir`
12942
+ * (the install's OP_HOME / compose context).
12943
+ *
12944
+ * Returns `{ exists:false }` on any docker error (daemon down, no permission) —
12945
+ * detection is best-effort and never blocks the caller; a real failure surfaces
12946
+ * later through composeUp.
12947
+ */
12948
+ function detectExistingProject(opts) {
12949
+ const none = {
12950
+ exists: false,
12951
+ isOurs: false,
12952
+ workingDir: ""
12953
+ };
12954
+ return new Promise((resolve) => {
12955
+ execFile("docker", [
12956
+ "ps",
12957
+ "-q",
12958
+ "--filter",
12959
+ `label=com.docker.compose.project=${opts.projectName}`
12960
+ ], { timeout: 1e4 }, (err, stdout) => {
12961
+ if (err) return resolve(none);
12962
+ const ids = stdout.toString().trim().split(/\s+/).filter(Boolean);
12963
+ if (ids.length === 0) return resolve(none);
12964
+ execFile("docker", [
12965
+ "inspect",
12966
+ "--format",
12967
+ "{{ index .Config.Labels \"com.docker.compose.project.working_dir\" }}",
12968
+ ids[0]
12969
+ ], { timeout: 1e4 }, (err2, stdout2) => {
12970
+ if (err2) return resolve({
12971
+ exists: true,
12972
+ isOurs: false,
12973
+ workingDir: ""
12974
+ });
12975
+ const workingDir = stdout2.toString().trim();
12976
+ resolve({
12977
+ exists: true,
12978
+ isOurs: isProjectOurs(workingDir, opts.expectedWorkingDir),
12979
+ workingDir
12980
+ });
12981
+ });
12982
+ });
12983
+ });
12984
+ }
12899
12985
  /** Check if Docker is available */
12900
12986
  async function checkDocker() {
12901
12987
  return new Promise((resolve) => {
@@ -12954,7 +13040,7 @@ function collectEnvOverrides(envFiles) {
12954
13040
  async function composePreflight(options) {
12955
13041
  const args = buildComposeArgs(options);
12956
13042
  args.push("config", "--quiet");
12957
- return run(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
13043
+ return run$1(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
12958
13044
  }
12959
13045
  /**
12960
13046
  * Run compose config preflight validation before any mutation.
@@ -12974,7 +13060,7 @@ async function runPreflight(options) {
12974
13060
  async function composeConfigServices(options) {
12975
13061
  const args = buildComposeArgs(options);
12976
13062
  args.push("config", "--services");
12977
- const result = await run(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
13063
+ const result = await run$1(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
12978
13064
  if (!result.ok) return {
12979
13065
  ok: false,
12980
13066
  services: []
@@ -13001,7 +13087,20 @@ async function composeUp(options) {
13001
13087
  if (options.forceRecreate) args.push("--force-recreate");
13002
13088
  if (options.removeOrphans) args.push("--remove-orphans");
13003
13089
  if (options.services?.length) args.push(...options.services);
13004
- return run(args, void 0, 3e5, collectEnvOverrides(options.envFiles));
13090
+ return run$1(args, void 0, composeUpTimeoutMs(), collectEnvOverrides(options.envFiles));
13091
+ }
13092
+ /**
13093
+ * Timeout budget for `compose up`. A first install extracts multi-GB images
13094
+ * (voice CUDA ~7.6 GB) onto slow disks; the previous hard 5-minute cap
13095
+ * SIGTERM-killed the start mid-extraction and surfaced as an empty/opaque
13096
+ * error. Default 30 min, override with OP_COMPOSE_UP_TIMEOUT_MS. Kept bounded
13097
+ * (never removed) so a genuinely hung start still eventually fails.
13098
+ */
13099
+ function composeUpTimeoutMs() {
13100
+ const raw = process.env.OP_COMPOSE_UP_TIMEOUT_MS?.trim();
13101
+ const parsed = raw ? Number(raw) : NaN;
13102
+ if (Number.isFinite(parsed) && parsed > 0) return parsed;
13103
+ return 30 * 6e4;
13005
13104
  }
13006
13105
  /**
13007
13106
  * Run `docker compose down` to stop and remove containers.
@@ -13017,7 +13116,7 @@ async function composeDown(options) {
13017
13116
  const args = buildComposeArgs(options);
13018
13117
  args.push("down");
13019
13118
  if (options.removeVolumes) args.push("-v");
13020
- return run(args, void 0);
13119
+ return run$1(args, void 0);
13021
13120
  }
13022
13121
  /**
13023
13122
  * Restart specific services.
@@ -13033,7 +13132,7 @@ async function composeRestart(services, options) {
13033
13132
  };
13034
13133
  const args = buildComposeArgs(options);
13035
13134
  args.push("restart", ...services);
13036
- return run(args, void 0);
13135
+ return run$1(args, void 0);
13037
13136
  }
13038
13137
  /**
13039
13138
  * Stop specific services.
@@ -13042,7 +13141,7 @@ async function composeStop(services, options) {
13042
13141
  await runPreflight(options);
13043
13142
  const args = buildComposeArgs(options);
13044
13143
  args.push("stop", ...services);
13045
- return run(args, void 0);
13144
+ return run$1(args, void 0);
13046
13145
  }
13047
13146
  /**
13048
13147
  * Start specific services (must already be created).
@@ -13051,14 +13150,14 @@ async function composeStart(services, options) {
13051
13150
  await runPreflight(options);
13052
13151
  const args = buildComposeArgs(options);
13053
13152
  args.push("up", "-d", ...services);
13054
- return run(args, void 0);
13153
+ return run$1(args, void 0);
13055
13154
  }
13056
13155
  /**
13057
13156
  * Get the status of all containers in the project.
13058
13157
  */
13059
13158
  async function composePs(options) {
13060
13159
  const primaryFile = options.files[0];
13061
- if (!existsSync(primaryFile)) return run([
13160
+ if (!existsSync(primaryFile)) return run$1([
13062
13161
  "ps",
13063
13162
  "--filter",
13064
13163
  `label=com.docker.compose.project=${resolveComposeProjectName()}`,
@@ -13067,7 +13166,7 @@ async function composePs(options) {
13067
13166
  ], void 0);
13068
13167
  const args = buildComposeArgs(options);
13069
13168
  args.push("ps", "--format", "json");
13070
- return run(args, void 0);
13169
+ return run$1(args, void 0);
13071
13170
  }
13072
13171
  /**
13073
13172
  * Get logs for specific services or all services.
@@ -13077,14 +13176,14 @@ async function composeLogs(services, tail, options) {
13077
13176
  args.push("logs", "--tail", String(tail));
13078
13177
  if (options.since) args.push("--since", options.since);
13079
13178
  if (services && services.length > 0) args.push(...services);
13080
- return run(args, void 0);
13179
+ return run$1(args, void 0);
13081
13180
  }
13082
13181
  var PULL_TIMEOUT_MS = 60 * 6e4;
13083
13182
  async function composePull(options) {
13084
13183
  await runPreflight(options);
13085
13184
  const args = buildComposeArgs(options);
13086
13185
  args.push("pull");
13087
- return run(args, void 0, PULL_TIMEOUT_MS, collectEnvOverrides(options.envFiles));
13186
+ return run$1(args, void 0, PULL_TIMEOUT_MS, collectEnvOverrides(options.envFiles));
13088
13187
  }
13089
13188
  /**
13090
13189
  * Get resource usage stats for all containers in the project.
@@ -13092,13 +13191,13 @@ async function composePull(options) {
13092
13191
  async function composeStats(options) {
13093
13192
  const args = buildComposeArgs(options);
13094
13193
  args.push("stats", "--no-stream", "--format", "json");
13095
- return run(args, void 0);
13194
+ return run$1(args, void 0);
13096
13195
  }
13097
13196
  /**
13098
13197
  * Get recent Docker events for the compose project.
13099
13198
  */
13100
13199
  async function getDockerEvents(projectName, since = "1h") {
13101
- return run([
13200
+ return run$1([
13102
13201
  "events",
13103
13202
  "--filter",
13104
13203
  `label=com.docker.compose.project=${projectName}`,
@@ -13249,10 +13348,23 @@ function resolveNewestDockerTag(payload) {
13249
13348
  }
13250
13349
  return fallback;
13251
13350
  }
13252
- async function updateStackEnvToLatestImageTag(state) {
13253
- const systemEnvPath = `${state.stashDir}/env/stack.env`;
13254
- const namespace = (parseEnvFile(systemEnvPath).OP_IMAGE_NAMESPACE ?? process.env.OP_IMAGE_NAMESPACE ?? "openpalm").trim().toLowerCase();
13351
+ function resolveImageNamespace(state) {
13352
+ const namespace = (parseEnvFile(`${state.stashDir}/env/stack.env`).OP_IMAGE_NAMESPACE ?? process.env.OP_IMAGE_NAMESPACE ?? "openpalm").trim().toLowerCase();
13255
13353
  if (!IMAGE_NAMESPACE_RE.test(namespace)) throw new Error(`Invalid image namespace in system.env: ${namespace}`);
13354
+ return namespace;
13355
+ }
13356
+ /**
13357
+ * Resolve the newest published platform tag from the Docker registry.
13358
+ *
13359
+ * `assistant` is the version-of-record image: all platform images
13360
+ * (assistant, guardian, channel, voice) are published in lockstep under the
13361
+ * same OP_IMAGE_TAG, so its newest tag is the canonical platform version.
13362
+ *
13363
+ * Used both to auto-detect during "Update now" and to resolve a requested
13364
+ * `latest` selection into a concrete release tag before fetching stack assets
13365
+ * (GitHub has no asset tree at a `latest` ref).
13366
+ */
13367
+ async function resolveLatestPlatformTag(namespace) {
13256
13368
  let response;
13257
13369
  try {
13258
13370
  response = await fetch(`https://registry.hub.docker.com/v2/repositories/${namespace}/assistant/tags?page_size=25&ordering=last_updated`, { headers: { Accept: "application/json" } });
@@ -13262,6 +13374,12 @@ async function updateStackEnvToLatestImageTag(state) {
13262
13374
  if (!response.ok) throw new Error(`Docker tag lookup failed (${response.status})`);
13263
13375
  const latestTag = resolveNewestDockerTag(await response.json());
13264
13376
  if (!latestTag) throw new Error("No usable Docker image tag found");
13377
+ return latestTag;
13378
+ }
13379
+ async function updateStackEnvToLatestImageTag(state) {
13380
+ const systemEnvPath = `${state.stashDir}/env/stack.env`;
13381
+ const namespace = resolveImageNamespace(state);
13382
+ const latestTag = await resolveLatestPlatformTag(namespace);
13265
13383
  writeFileSync(systemEnvPath, mergeEnvContent(existsSync(systemEnvPath) ? readFileSync(systemEnvPath, "utf-8") : "", { OP_IMAGE_TAG: latestTag }, { uncomment: true }));
13266
13384
  return {
13267
13385
  namespace,
@@ -13315,6 +13433,7 @@ async function performUpgrade(state) {
13315
13433
  const upResult = await composeUp({
13316
13434
  ...composeOpts,
13317
13435
  services,
13436
+ forceRecreate: true,
13318
13437
  removeOrphans: true
13319
13438
  });
13320
13439
  if (!upResult.ok) throw new Error(`Images pulled but failed to recreate containers: ${upResult.stderr}`);
@@ -13331,12 +13450,21 @@ async function performUpgrade(state) {
13331
13450
  * Used by the admin "set version" action — skips the auto-detect step in performUpgrade.
13332
13451
  */
13333
13452
  async function applyTagChange(state, tag) {
13453
+ const namespace = resolveImageNamespace(state);
13454
+ const requested = tag.trim();
13455
+ let resolvedTag = requested;
13456
+ if (requested === "" || requested.toLowerCase() === "latest") try {
13457
+ resolvedTag = await resolveLatestPlatformTag(namespace);
13458
+ } catch (e) {
13459
+ const msg = e instanceof Error ? e.message : String(e);
13460
+ throw new Error(`Cannot resolve "latest" to a concrete release: ${msg}. Check your network connection or select a specific version.`);
13461
+ }
13334
13462
  const stackEnvPath = `${state.stashDir}/env/stack.env`;
13335
- writeFileSync(stackEnvPath, mergeEnvContent(existsSync(stackEnvPath) ? readFileSync(stackEnvPath, "utf-8") : "", { OP_IMAGE_TAG: tag }, { uncomment: true }));
13336
- const upgradeResult = await applyUpgrade(state, tag);
13463
+ writeFileSync(stackEnvPath, mergeEnvContent(existsSync(stackEnvPath) ? readFileSync(stackEnvPath, "utf-8") : "", { OP_IMAGE_TAG: resolvedTag }, { uncomment: true }));
13464
+ const upgradeResult = await applyUpgrade(state, resolvedTag);
13337
13465
  return {
13338
- imageTag: tag,
13339
- namespace: "openpalm",
13466
+ imageTag: resolvedTag,
13467
+ namespace,
13340
13468
  backupDir: upgradeResult.backupDir,
13341
13469
  assetsUpdated: upgradeResult.updated,
13342
13470
  restarted: upgradeResult.restarted
@@ -13347,13 +13475,16 @@ function buildComposeFileList(state) {
13347
13475
  }
13348
13476
  async function buildManagedServices(state) {
13349
13477
  const composeOpts = buildComposeOptions(state);
13478
+ const services = new Set(CORE_SERVICES);
13350
13479
  if (composeOpts.files.length > 0 && !process.env.OP_SKIP_COMPOSE_PREFLIGHT) {
13351
13480
  const result = await composeConfigServices(composeOpts);
13352
- if (result.ok && result.services.length > 0) return result.services;
13481
+ if (result.ok && result.services.length > 0) {
13482
+ for (const s of result.services) services.add(s);
13483
+ return [...services];
13484
+ }
13353
13485
  }
13354
- const services = [...CORE_SERVICES];
13355
- for (const addon of listEnabledAddonIds(state.homeDir)) services.push(...getAddonServiceNames(state.homeDir, addon));
13356
- return services;
13486
+ for (const addon of listEnabledAddonIds(state.homeDir)) for (const s of getAddonServiceNames(state.homeDir, addon)) services.add(s);
13487
+ return [...services];
13357
13488
  }
13358
13489
  //#endregion
13359
13490
  //#region ../lib/src/control-plane/markdown-task.ts
@@ -13365,14 +13496,14 @@ async function buildManagedServices(state) {
13365
13496
  * prompt — `prompt: <text>` inline prompt text
13366
13497
  * workflow — `workflow: workflow:<ref>` + optional `params` map
13367
13498
  */
13368
- var logger$3 = createLogger("task-file");
13499
+ var logger$4 = createLogger("task-file");
13369
13500
  function parseMarkdownTask(filePath) {
13370
13501
  const id = basename(filePath).replace(/\.(?:ya?ml|md)$/, "");
13371
13502
  let raw;
13372
13503
  try {
13373
13504
  raw = readFileSync(filePath, "utf-8");
13374
13505
  } catch (err) {
13375
- logger$3.warn("failed to read task file", {
13506
+ logger$4.warn("failed to read task file", {
13376
13507
  filePath,
13377
13508
  error: String(err)
13378
13509
  });
@@ -13383,12 +13514,12 @@ function parseMarkdownTask(filePath) {
13383
13514
  try {
13384
13515
  const parsed = (0, import_dist.parse)(frontmatter);
13385
13516
  if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
13386
- logger$3.warn("task YAML is not an object", { filePath });
13517
+ logger$4.warn("task YAML is not an object", { filePath });
13387
13518
  return null;
13388
13519
  }
13389
13520
  fm = parsed;
13390
13521
  } catch (err) {
13391
- logger$3.warn("failed to parse task YAML", {
13522
+ logger$4.warn("failed to parse task YAML", {
13392
13523
  filePath,
13393
13524
  error: String(err)
13394
13525
  });
@@ -13396,14 +13527,14 @@ function parseMarkdownTask(filePath) {
13396
13527
  }
13397
13528
  const schedule = fm.schedule;
13398
13529
  if (typeof schedule !== "string" || !schedule.trim()) {
13399
- logger$3.warn("task missing or empty 'schedule'", { filePath });
13530
+ logger$4.warn("task missing or empty 'schedule'", { filePath });
13400
13531
  return null;
13401
13532
  }
13402
13533
  let target;
13403
13534
  if (fm.command !== void 0) {
13404
13535
  const cmd = Array.isArray(fm.command) ? fm.command.map(String) : typeof fm.command === "string" ? [fm.command] : null;
13405
13536
  if (!cmd || cmd.length === 0) {
13406
- logger$3.warn("task 'command' must be a non-empty array", { filePath });
13537
+ logger$4.warn("task 'command' must be a non-empty array", { filePath });
13407
13538
  return null;
13408
13539
  }
13409
13540
  target = {
@@ -13412,12 +13543,12 @@ function parseMarkdownTask(filePath) {
13412
13543
  };
13413
13544
  } else if (fm.prompt !== void 0) {
13414
13545
  if (typeof fm.prompt !== "string" || !fm.prompt.trim()) {
13415
- logger$3.warn("task 'prompt' must be a non-empty string", { filePath });
13546
+ logger$4.warn("task 'prompt' must be a non-empty string", { filePath });
13416
13547
  return null;
13417
13548
  }
13418
13549
  const promptBody = fm.prompt.trim() === "inline" ? body.trim() : fm.prompt.trim();
13419
13550
  if (!promptBody) {
13420
- logger$3.warn("task prompt body is empty", { filePath });
13551
+ logger$4.warn("task prompt body is empty", { filePath });
13421
13552
  return null;
13422
13553
  }
13423
13554
  target = {
@@ -13427,7 +13558,7 @@ function parseMarkdownTask(filePath) {
13427
13558
  };
13428
13559
  } else if (fm.workflow !== void 0) {
13429
13560
  if (typeof fm.workflow !== "string") {
13430
- logger$3.warn("task 'workflow' must be a string ref", { filePath });
13561
+ logger$4.warn("task 'workflow' must be a string ref", { filePath });
13431
13562
  return null;
13432
13563
  }
13433
13564
  target = {
@@ -13436,7 +13567,7 @@ function parseMarkdownTask(filePath) {
13436
13567
  params: fm.params && typeof fm.params === "object" && !Array.isArray(fm.params) ? fm.params : {}
13437
13568
  };
13438
13569
  } else {
13439
- logger$3.warn("task must have one of: command, prompt, workflow", { filePath });
13570
+ logger$4.warn("task must have one of: command, prompt, workflow", { filePath });
13440
13571
  return null;
13441
13572
  }
13442
13573
  return {
@@ -13653,7 +13784,7 @@ function readUserEnvFile(envPath) {
13653
13784
  * Scheduling is handled by the OS cron daemon (via `akm tasks sync`).
13654
13785
  * Execution is handled by `akm tasks run <id>`.
13655
13786
  */
13656
- var logger$2 = createLogger("scheduler");
13787
+ var logger$3 = createLogger("scheduler");
13657
13788
  function loadAutomations(stashDir) {
13658
13789
  return loadMarkdownTasks(stashDir).map(taskToAutomationConfig);
13659
13790
  }
@@ -13671,7 +13802,7 @@ async function executeAutomation(id, akmEnv) {
13671
13802
  } }, (error, _stdout, stderr) => {
13672
13803
  if (error) {
13673
13804
  const msg = stderr?.trim() || error.message;
13674
- logger$2.warn("akm tasks run failed", {
13805
+ logger$3.warn("akm tasks run failed", {
13675
13806
  id: taskId,
13676
13807
  error: msg
13677
13808
  });
@@ -13711,7 +13842,7 @@ function readAutomationLogs(id, dataDir, limit = 50) {
13711
13842
  *
13712
13843
  * Probes well-known endpoints for Docker Model Runner, Ollama, and LM Studio.
13713
13844
  */
13714
- var logger$1 = createLogger("local-providers");
13845
+ var logger$2 = createLogger("local-providers");
13715
13846
  /** Ollama's root endpoint returns "Ollama is running" — use this to distinguish from other services on :11434. */
13716
13847
  async function validateOllamaResponse(res) {
13717
13848
  try {
@@ -13784,13 +13915,13 @@ async function detectLocalProviders() {
13784
13915
  const res = await fetch(probeUrl, { signal: AbortSignal.timeout(3e3) });
13785
13916
  if (res.ok) {
13786
13917
  if (validate && !await validate(res)) {
13787
- logger$1.debug("provider probe response failed validation", {
13918
+ logger$2.debug("provider probe response failed validation", {
13788
13919
  provider,
13789
13920
  url: baseUrl
13790
13921
  });
13791
13922
  continue;
13792
13923
  }
13793
- logger$1.debug("detected local provider", {
13924
+ logger$2.debug("detected local provider", {
13794
13925
  provider,
13795
13926
  url: baseUrl
13796
13927
  });
@@ -13809,6 +13940,173 @@ async function detectLocalProviders() {
13809
13940
  }));
13810
13941
  }
13811
13942
  //#endregion
13943
+ //#region ../lib/src/control-plane/hardware-detect.ts
13944
+ var logger$1 = createLogger("hardware-detect");
13945
+ /** Parse `nvidia-smi --query-gpu=name,memory.total --format=csv,noheader,nounits`. */
13946
+ function parseNvidiaSmi(stdout) {
13947
+ return stdout.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => {
13948
+ const idx = line.lastIndexOf(",");
13949
+ if (idx === -1) return null;
13950
+ const name = line.slice(0, idx).trim();
13951
+ const vramMb = Number.parseInt(line.slice(idx + 1).trim(), 10);
13952
+ if (!name || !Number.isFinite(vramMb)) return null;
13953
+ return {
13954
+ vendor: "nvidia",
13955
+ name,
13956
+ vramMb
13957
+ };
13958
+ }).filter((g) => g !== null);
13959
+ }
13960
+ /** Parse `rocm-smi --showmeminfo vram --showproductname --json`. */
13961
+ function parseRocmSmi(stdout) {
13962
+ let doc;
13963
+ try {
13964
+ doc = JSON.parse(stdout);
13965
+ } catch {
13966
+ return [];
13967
+ }
13968
+ const out = [];
13969
+ for (const card of Object.values(doc)) {
13970
+ if (!card || typeof card !== "object") continue;
13971
+ const vramKey = Object.keys(card).find((k) => /vram total memory/i.test(k));
13972
+ const nameKey = Object.keys(card).find((k) => /product name|card series|gfx/i.test(k));
13973
+ const bytes = vramKey ? Number.parseInt(String(card[vramKey]).trim(), 10) : NaN;
13974
+ const vramMb = Number.isFinite(bytes) ? Math.round(bytes / (1024 * 1024)) : 0;
13975
+ out.push({
13976
+ vendor: "amd",
13977
+ name: nameKey ? String(card[nameKey]).trim() : "AMD GPU",
13978
+ vramMb
13979
+ });
13980
+ }
13981
+ return out;
13982
+ }
13983
+ /**
13984
+ * Parse `sysctl -n hw.memsize hw.model` (two lines: total bytes, then model id)
13985
+ * into an Apple-Silicon GpuInfo. `hw.memsize` is UNIFIED memory shared between
13986
+ * CPU and GPU, carried here as vramMb for informational display only — callers
13987
+ * must NOT treat it like discrete VRAM (see setup-recommendation). Pure; never throws.
13988
+ */
13989
+ function parseAppleSilicon(stdout) {
13990
+ const lines = stdout.split("\n").map((l) => l.trim()).filter(Boolean);
13991
+ if (lines.length === 0) return [];
13992
+ const bytes = Number.parseInt(lines[0] ?? "", 10);
13993
+ if (!Number.isFinite(bytes) || bytes <= 0) return [];
13994
+ const vramMb = Math.round(bytes / (1024 * 1024));
13995
+ return [{
13996
+ vendor: "apple",
13997
+ name: `Apple Silicon (${lines[1] && lines[1].length > 0 ? lines[1] : "arm64"})`,
13998
+ vramMb
13999
+ }];
14000
+ }
14001
+ var GPU_PROBES = [
14002
+ {
14003
+ vendor: "nvidia",
14004
+ command: "nvidia-smi",
14005
+ args: ["--query-gpu=name,memory.total", "--format=csv,noheader,nounits"],
14006
+ parse: parseNvidiaSmi
14007
+ },
14008
+ {
14009
+ vendor: "amd",
14010
+ command: "rocm-smi",
14011
+ args: [
14012
+ "--showmeminfo",
14013
+ "vram",
14014
+ "--showproductname",
14015
+ "--json"
14016
+ ],
14017
+ parse: parseRocmSmi
14018
+ },
14019
+ {
14020
+ vendor: "apple",
14021
+ command: "sysctl",
14022
+ args: [
14023
+ "-n",
14024
+ "hw.memsize",
14025
+ "hw.model"
14026
+ ],
14027
+ parse: parseAppleSilicon,
14028
+ enabled: process.platform === "darwin" && process.arch === "arm64"
14029
+ }
14030
+ ];
14031
+ function run(command, args, timeoutMs = 3e3) {
14032
+ return new Promise((resolve) => {
14033
+ execFile(command, args, { timeout: timeoutMs }, (err, stdout) => {
14034
+ resolve(err ? null : stdout?.toString() ?? "");
14035
+ });
14036
+ });
14037
+ }
14038
+ /**
14039
+ * Detect the host's best GPU. Returns the highest-VRAM adapter across all probes,
14040
+ * or null when none is found. Never throws.
14041
+ */
14042
+ async function detectGpu() {
14043
+ const found = [];
14044
+ await Promise.all(GPU_PROBES.map(async (probe) => {
14045
+ if (probe.enabled === false) return;
14046
+ const stdout = await run(probe.command, probe.args);
14047
+ if (stdout === null) return;
14048
+ try {
14049
+ found.push(...probe.parse(stdout));
14050
+ } catch (error) {
14051
+ logger$1.debug("gpu probe parse failed", {
14052
+ vendor: probe.vendor,
14053
+ error: String(error)
14054
+ });
14055
+ }
14056
+ }));
14057
+ if (found.length === 0) return null;
14058
+ return found.reduce((best, g) => g.vramMb > best.vramMb ? g : best);
14059
+ }
14060
+ /** Ollama hardware-profile variant chosen per GPU vendor. Extend per new vendor. */
14061
+ var VENDOR_PROFILE_VARIANT = {
14062
+ nvidia: "cuda",
14063
+ amd: "rocm",
14064
+ apple: "cpu",
14065
+ unknown: "cpu"
14066
+ };
14067
+ function gpuToProfileVariant(gpu) {
14068
+ return VENDOR_PROFILE_VARIANT[gpu.vendor] ?? "cpu";
14069
+ }
14070
+ var fmtGb = (mb) => (mb / 1024).toFixed(mb % 1024 === 0 ? 0 : 1);
14071
+ var labelHostProviders = (h) => h.map((p) => p.provider).join(" and ");
14072
+ /**
14073
+ * Decide what setup should do, given detected providers + hardware.
14074
+ *
14075
+ * Order (first match wins):
14076
+ * 1. cloud provider connected -> use it.
14077
+ * 2. host-local provider running -> add it, proceed.
14078
+ * 3. darwin + apple GPU -> guide to HOST Ollama (Metal); never in-stack.
14079
+ * 4. capable GPU (>= threshold) -> enable in-stack Ollama.
14080
+ * 5. otherwise -> ask the user to connect a provider.
14081
+ */
14082
+ function recommendSetup(input) {
14083
+ const { cloudProviders, hostProviders, gpu } = input;
14084
+ const platform = input.platform ?? process.platform;
14085
+ if (cloudProviders.length > 0) return {
14086
+ action: "use-cloud",
14087
+ cloudProviders
14088
+ };
14089
+ if (hostProviders.length > 0) return {
14090
+ action: "use-host-providers",
14091
+ hostProviders,
14092
+ alert: `No cloud AI provider was detected, but ${labelHostProviders(hostProviders)} ${hostProviders.length > 1 ? "are" : "is"} running on your computer — added automatically. Pick your models on the next step.`
14093
+ };
14094
+ if (platform === "darwin" && gpu && gpu.vendor === "apple") return {
14095
+ action: "connect-manually",
14096
+ alert: "No AI provider was detected. On macOS, fast local models need Ollama running natively (it uses your Apple Silicon / Metal GPU) — the bundled in-stack Ollama runs in Linux and cannot reach Metal. Install Ollama for macOS (https://ollama.com/download), or connect a provider on the next step."
14097
+ };
14098
+ if (gpu && gpu.vramMb >= 8192) return {
14099
+ action: "enable-ollama",
14100
+ profileVariant: gpuToProfileVariant(gpu),
14101
+ gpu,
14102
+ alert: `No AI provider was detected, but a capable GPU was found (${gpu.name}, ${fmtGb(gpu.vramMb)} GB). Local models via Ollama have been enabled for you.`
14103
+ };
14104
+ return {
14105
+ action: "connect-manually",
14106
+ alert: "No AI provider was detected and no GPU with enough memory for local models was found. Connect a provider to continue — sign in to a provider on the next step, or add a custom OpenAI-compatible endpoint and key."
14107
+ };
14108
+ }
14109
+ //#endregion
13812
14110
  //#region ../lib/src/control-plane/compose-errors.ts
13813
14111
  /**
13814
14112
  * Lines we recognise as per-service failure indicators. The compose CLI
@@ -14433,5 +14731,5 @@ function importHostOpenCode(state, options = {}) {
14433
14731
  };
14434
14732
  }
14435
14733
 
14436
- export { isHostAkmAvailable as $, AKM_USER_ENV_REF as A, createState as B, CORE_SERVICES as C, deleteUserEnvKey as D, detectHostOpenCode as E, detectLocalProviders as F, disableHostAkmSharing as G, enableHostAkmSharing as H, ensureAkmUserEnv as I, ensureHomeDirs as J, ensureMigrated as K, ensureOpenCodeConfig as L, MigrationError as M, ensureOpenCodeSystemConfig as N, ensureSecrets as O, executeAutomation as P, fetchProviderModels as Q, getAddonProfileAvailability as R, getAddonProfileSelection as S, getAddonProfiles as T, getAddonServiceNames as U, getDockerEvents as V, getHostAkmSharingStatus as W, getRegistryAddonConfig as X, hostAkmStashPath as Y, importHostOpenCode as Z, isAllowedService as _, addonProfileId as a, isSetupComplete as a0, listAvailableAddonIds as a1, listEnabledAddonIds as a2, listSecretFiles as a3, loadAutomations as a4, parseComposeStderr as a5, parseEnvFile as a6, performSetup as a7, performUpgrade as a8, readAutomationLogs as a9, readSecret as aa, readSecretFile as ab, readStackEnv as ac, readStackRuntimeEnv as ad, readStackSecretEnv as ae, readTaskFile as af, readUserEnvFile as ag, removeSecretFile as ah, removeTaskFile as ai, resolveComposeProjectName as aj, resolveDataDir as ak, resolveRuntimeFiles as al, resolveStackDir as am, seedUiBuild as an, setAddonEnabled as ao, setAddonProfileSelection as ap, summarizeComposeStderr as aq, validateProposedState as ar, writeFileAtomic as as, writeRuntimeFiles as at, writeSecretFile as au, writeStackSecretEnv as av, writeTaskFile as aw, writeUserEnvKey as ax, writeVoiceVars as ay, annotateAddonProfileAvailability as b, applyInstall as c, applyTagChange as d, applyUninstall as e, applyUpdate as f, assertSafeSecretFilename as g, assertSafeTaskFilename as h, authJsonPath as i, buildAkmEnv as j, buildComposeOptions as k, buildManagedServices as l, checkDocker as m, checkDockerCompose as n, composeDown as o, composeLogs as p, composePreflight as q, composePs as r, composePull as s, composeRestart as t, composeStart as u, composeStats as v, composeStop as w, composeUp as x, createLogger as y, createOpenCodeClient as z };
14437
- //# sourceMappingURL=src-D9YnoOnU.js.map
14734
+ export { hostAkmStashPath as $, AKM_USER_ENV_REF as A, createState as B, CORE_SERVICES as C, deleteUserEnvKey as D, detectExistingProject as E, detectGpu as F, detectHostOpenCode as G, detectLocalProviders as H, disableHostAkmSharing as I, enableHostAkmSharing as J, ensureAkmUserEnv as K, ensureHomeDirs as L, MigrationError as M, ensureMigrated as N, ensureOpenCodeConfig as O, PROVIDER_KEY_MAP as P, ensureOpenCodeSystemConfig as Q, ensureSecrets as R, executeAutomation as S, fetchProviderModels as T, getAddonProfileAvailability as U, getAddonProfileSelection as V, getAddonProfiles as W, getAddonServiceNames as X, getDockerEvents as Y, getHostAkmSharingStatus as Z, getRegistryAddonConfig as _, addonProfileId as a, importHostOpenCode as a0, isAllowedService as a1, isHostAkmAvailable as a2, isSetupComplete as a3, listAvailableAddonIds as a4, listEnabledAddonIds as a5, listSecretFiles as a6, loadAutomations as a7, parseComposeStderr as a8, parseEnvFile as a9, writeTaskFile as aA, writeUserEnvKey as aB, writeVoiceVars as aC, performSetup as aa, performUpgrade as ab, readAutomationLogs as ac, readSecret as ad, readSecretFile as ae, readStackEnv as af, readStackRuntimeEnv as ag, readStackSecretEnv as ah, readTaskFile as ai, readUserEnvFile as aj, recommendSetup as ak, removeSecretFile as al, removeTaskFile as am, resolveComposeProjectName as an, resolveDataDir as ao, resolveRuntimeFiles as ap, resolveStackDir as aq, seedUiBuild as ar, setAddonEnabled as as, setAddonProfileSelection as at, summarizeComposeStderr as au, validateProposedState as av, writeFileAtomic as aw, writeRuntimeFiles as ax, writeSecretFile as ay, writeStackSecretEnv 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, buildAkmEnv as j, buildComposeOptions as k, buildManagedServices as l, checkDocker as m, checkDockerCompose as n, composeDown as o, composeLogs as p, composePreflight as q, composePs as r, composePull as s, composeRestart as t, composeStart as u, composeStats as v, composeStop as w, composeUp as x, createLogger as y, createOpenCodeClient as z };
14735
+ //# sourceMappingURL=src-DJv-Q_k2.js.map