@openpalm/ui 0.11.0 → 0.11.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 (330) 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.Bg2RXe3B.css +1 -0
  9. package/build/client/_app/immutable/assets/9.Bg2RXe3B.css.br +0 -0
  10. package/build/client/_app/immutable/assets/9.Bg2RXe3B.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/BsFaG4Si.js +1 -0
  15. package/build/client/_app/immutable/chunks/BsFaG4Si.js.br +2 -0
  16. package/build/client/_app/immutable/chunks/BsFaG4Si.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{HJd0QhDi.js → C5xMso3V.js} +1 -1
  18. package/build/client/_app/immutable/chunks/C5xMso3V.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/C5xMso3V.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{BNcdU8Ou.js → DPsWof9T.js} +2 -2
  21. package/build/client/_app/immutable/chunks/DPsWof9T.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/DPsWof9T.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/jhtvkF_A.js +1 -0
  24. package/build/client/_app/immutable/chunks/jhtvkF_A.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/jhtvkF_A.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/{Mj3AXROx.js → s4upGypb.js} +1 -1
  27. package/build/client/_app/immutable/chunks/s4upGypb.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/s4upGypb.js.gz +0 -0
  29. package/build/client/_app/immutable/entry/{app.8wJBndTj.js → app.BhaNzXRa.js} +2 -2
  30. package/build/client/_app/immutable/entry/app.BhaNzXRa.js.br +0 -0
  31. package/build/client/_app/immutable/entry/app.BhaNzXRa.js.gz +0 -0
  32. package/build/client/_app/immutable/entry/start.mqdezZzO.js +1 -0
  33. package/build/client/_app/immutable/entry/start.mqdezZzO.js.br +0 -0
  34. package/build/client/_app/immutable/entry/start.mqdezZzO.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/{1.BeVZsPun.js → 1.B8IsMtPo.js} +1 -1
  36. package/build/client/_app/immutable/nodes/1.B8IsMtPo.js.br +1 -0
  37. package/build/client/_app/immutable/nodes/1.B8IsMtPo.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/{4.BAthCCnr.js → 4.Jf5TbLTF.js} +9 -9
  39. package/build/client/_app/immutable/nodes/4.Jf5TbLTF.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/4.Jf5TbLTF.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/{5.Ci-IDy_L.js → 5.BXOM2W9q.js} +1 -1
  42. package/build/client/_app/immutable/nodes/5.BXOM2W9q.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/5.BXOM2W9q.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/{6._GM9bF5h.js → 6.fVxTNYsE.js} +1 -1
  45. package/build/client/_app/immutable/nodes/6.fVxTNYsE.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/6.fVxTNYsE.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/{7.Cx4EVpki.js → 7.E4FAL2cc.js} +1 -1
  48. package/build/client/_app/immutable/nodes/7.E4FAL2cc.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/7.E4FAL2cc.js.gz +0 -0
  50. package/build/client/_app/immutable/nodes/{8.p0qRhws4.js → 8.By5-pJpM.js} +1 -1
  51. package/build/client/_app/immutable/nodes/8.By5-pJpM.js.br +0 -0
  52. package/build/client/_app/immutable/nodes/8.By5-pJpM.js.gz +0 -0
  53. package/build/client/_app/immutable/nodes/9.HfUnLyFj.js +2 -0
  54. package/build/client/_app/immutable/nodes/9.HfUnLyFj.js.br +0 -0
  55. package/build/client/_app/immutable/nodes/9.HfUnLyFj.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 +134 -389
  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-DiEYpQIN.js +9 -0
  65. package/build/server/chunks/{1-DTcDogB5.js.map → 1-DiEYpQIN.js.map} +1 -1
  66. package/build/server/chunks/4-pHqpXb3H.js +9 -0
  67. package/build/server/chunks/{4-Dn-0_RAr.js.map → 4-pHqpXb3H.js.map} +1 -1
  68. package/build/server/chunks/5-D48D_0uX.js +9 -0
  69. package/build/server/chunks/{5-Cbcb8WMr.js.map → 5-D48D_0uX.js.map} +1 -1
  70. package/build/server/chunks/{6-CUZpLn9e.js → 6-CQ5NktVc.js} +3 -3
  71. package/build/server/chunks/{6-CUZpLn9e.js.map → 6-CQ5NktVc.js.map} +1 -1
  72. package/build/server/chunks/7-Cbs2uIrU.js +9 -0
  73. package/build/server/chunks/{7-C0-ssq7j.js.map → 7-Cbs2uIrU.js.map} +1 -1
  74. package/build/server/chunks/{8-CIt0k_cP.js → 8-Cp8CGb0N.js} +3 -3
  75. package/build/server/chunks/{8-CIt0k_cP.js.map → 8-Cp8CGb0N.js.map} +1 -1
  76. package/build/server/chunks/9-BKnkc58p.js +9 -0
  77. package/build/server/chunks/{9-B8DzptsC.js.map → 9-BKnkc58p.js.map} +1 -1
  78. package/build/server/chunks/{Navbar-F9NE4GcT.js → Navbar-PVEly3CX.js} +3 -3
  79. package/build/server/chunks/{Navbar-F9NE4GcT.js.map → Navbar-PVEly3CX.js.map} +1 -1
  80. package/build/server/chunks/VoiceProfileSelector-CbOV_v5A.js.map +1 -1
  81. package/build/server/chunks/{_page.svelte-CqEu-vpE.js → _page.svelte-B1SlSu-R.js} +5 -5
  82. package/build/server/chunks/{_page.svelte-CqEu-vpE.js.map → _page.svelte-B1SlSu-R.js.map} +1 -1
  83. package/build/server/chunks/{_page.svelte-DnwUHFZ8.js → _page.svelte-BY2APmQv.js} +5 -5
  84. package/build/server/chunks/{_page.svelte-DnwUHFZ8.js.map → _page.svelte-BY2APmQv.js.map} +1 -1
  85. package/build/server/chunks/{_page.svelte-DLAHj-kk.js → _page.svelte-CDCe-J7o.js} +4 -2
  86. package/build/server/chunks/_page.svelte-CDCe-J7o.js.map +1 -0
  87. package/build/server/chunks/{_page.svelte-BgAgZqQA.js → _page.svelte-CF6Wb9iE.js} +6 -6
  88. package/build/server/chunks/_page.svelte-CF6Wb9iE.js.map +1 -0
  89. package/build/server/chunks/{_page.svelte-DeJqqBhp.js → _page.svelte-DadWXVrr.js} +5 -5
  90. package/build/server/chunks/{_page.svelte-DeJqqBhp.js.map → _page.svelte-DadWXVrr.js.map} +1 -1
  91. package/build/server/chunks/{_page.svelte--GbfGVnN.js → _page.svelte-DtrBTed5.js} +3 -3
  92. package/build/server/chunks/{_page.svelte--GbfGVnN.js.map → _page.svelte-DtrBTed5.js.map} +1 -1
  93. package/build/server/chunks/{_server.ts-CPzbkayh.js → _server.ts-31Wp0zcV.js} +4 -4
  94. package/build/server/chunks/{_server.ts-CPzbkayh.js.map → _server.ts-31Wp0zcV.js.map} +1 -1
  95. package/build/server/chunks/{_server.ts-DFL8Mq_R.js → _server.ts-8c17N53a.js} +4 -4
  96. package/build/server/chunks/{_server.ts-DFL8Mq_R.js.map → _server.ts-8c17N53a.js.map} +1 -1
  97. package/build/server/chunks/{_server.ts-BD6Urice.js → _server.ts-B0CeVe_2.js} +4 -4
  98. package/build/server/chunks/{_server.ts-BD6Urice.js.map → _server.ts-B0CeVe_2.js.map} +1 -1
  99. package/build/server/chunks/{_server.ts-C8YMhHYj.js → _server.ts-B2vBBz6Q.js} +4 -4
  100. package/build/server/chunks/{_server.ts-C8YMhHYj.js.map → _server.ts-B2vBBz6Q.js.map} +1 -1
  101. package/build/server/chunks/{_server.ts-DRxZJQd6.js → _server.ts-B3uweiKb.js} +6 -6
  102. package/build/server/chunks/{_server.ts-DRxZJQd6.js.map → _server.ts-B3uweiKb.js.map} +1 -1
  103. package/build/server/chunks/_server.ts-B8pCRdwo.js +95 -0
  104. package/build/server/chunks/_server.ts-B8pCRdwo.js.map +1 -0
  105. package/build/server/chunks/{_server.ts-IkgMCbAi.js → _server.ts-BBsksu6b.js} +6 -6
  106. package/build/server/chunks/{_server.ts-IkgMCbAi.js.map → _server.ts-BBsksu6b.js.map} +1 -1
  107. package/build/server/chunks/{_server.ts-B8sdNvW5.js → _server.ts-BDBz43vs.js} +4 -4
  108. package/build/server/chunks/{_server.ts-B8sdNvW5.js.map → _server.ts-BDBz43vs.js.map} +1 -1
  109. package/build/server/chunks/{_server.ts-sEc4S_v5.js → _server.ts-BLePivrN.js} +6 -6
  110. package/build/server/chunks/{_server.ts-sEc4S_v5.js.map → _server.ts-BLePivrN.js.map} +1 -1
  111. package/build/server/chunks/{_server.ts-D5Q5mczv.js → _server.ts-BMHPNIdu.js} +4 -4
  112. package/build/server/chunks/{_server.ts-D5Q5mczv.js.map → _server.ts-BMHPNIdu.js.map} +1 -1
  113. package/build/server/chunks/{_server.ts-Bj_nJzpo.js → _server.ts-BN3w-iUI.js} +4 -4
  114. package/build/server/chunks/{_server.ts-Bj_nJzpo.js.map → _server.ts-BN3w-iUI.js.map} +1 -1
  115. package/build/server/chunks/{_server.ts-C5uu6b2a.js → _server.ts-BYUfQeRr.js} +6 -5
  116. package/build/server/chunks/_server.ts-BYUfQeRr.js.map +1 -0
  117. package/build/server/chunks/{_server.ts-DQE5fd19.js → _server.ts-BdEX6joM.js} +4 -4
  118. package/build/server/chunks/{_server.ts-DQE5fd19.js.map → _server.ts-BdEX6joM.js.map} +1 -1
  119. package/build/server/chunks/{_server.ts-DjlikYHH.js → _server.ts-Bde_Pi6A.js} +5 -5
  120. package/build/server/chunks/{_server.ts-DjlikYHH.js.map → _server.ts-Bde_Pi6A.js.map} +1 -1
  121. package/build/server/chunks/{_server.ts-DgIgXukK.js → _server.ts-Bh_r4-Vs.js} +5 -5
  122. package/build/server/chunks/{_server.ts-DgIgXukK.js.map → _server.ts-Bh_r4-Vs.js.map} +1 -1
  123. package/build/server/chunks/{_server.ts-DbMkM72G.js → _server.ts-Big7vXEo.js} +4 -4
  124. package/build/server/chunks/{_server.ts-DbMkM72G.js.map → _server.ts-Big7vXEo.js.map} +1 -1
  125. package/build/server/chunks/{_server.ts-D0FZ3wh5.js → _server.ts-Bl-41j0D.js} +4 -4
  126. package/build/server/chunks/{_server.ts-D0FZ3wh5.js.map → _server.ts-Bl-41j0D.js.map} +1 -1
  127. package/build/server/chunks/{_server.ts-8iOMau6K.js → _server.ts-BnWc1lOg.js} +4 -4
  128. package/build/server/chunks/{_server.ts-8iOMau6K.js.map → _server.ts-BnWc1lOg.js.map} +1 -1
  129. package/build/server/chunks/{_server.ts-BQZSWSLy.js → _server.ts-BoQ46bw9.js} +5 -5
  130. package/build/server/chunks/{_server.ts-BQZSWSLy.js.map → _server.ts-BoQ46bw9.js.map} +1 -1
  131. package/build/server/chunks/{_server.ts-BlMOxGWA.js → _server.ts-BwgtyrgF.js} +7 -7
  132. package/build/server/chunks/_server.ts-BwgtyrgF.js.map +1 -0
  133. package/build/server/chunks/{_server.ts-Mycnkmlz.js → _server.ts-By47s5kb.js} +5 -5
  134. package/build/server/chunks/{_server.ts-Mycnkmlz.js.map → _server.ts-By47s5kb.js.map} +1 -1
  135. package/build/server/chunks/{_server.ts-CsUi6NWt.js → _server.ts-C-9V_-cK.js} +4 -4
  136. package/build/server/chunks/{_server.ts-CsUi6NWt.js.map → _server.ts-C-9V_-cK.js.map} +1 -1
  137. package/build/server/chunks/{_server.ts-DuBJyo4e.js → _server.ts-C-xID91b.js} +4 -4
  138. package/build/server/chunks/{_server.ts-DuBJyo4e.js.map → _server.ts-C-xID91b.js.map} +1 -1
  139. package/build/server/chunks/{_server.ts-BkGQezlX.js → _server.ts-C1GoICVF.js} +6 -6
  140. package/build/server/chunks/{_server.ts-BkGQezlX.js.map → _server.ts-C1GoICVF.js.map} +1 -1
  141. package/build/server/chunks/{_server.ts-ypkZ9bJf.js → _server.ts-C25PdnDT.js} +2 -2
  142. package/build/server/chunks/{_server.ts-ypkZ9bJf.js.map → _server.ts-C25PdnDT.js.map} +1 -1
  143. package/build/server/chunks/{_server.ts-BD0Jit8e.js → _server.ts-CCwIt_KL.js} +4 -4
  144. package/build/server/chunks/{_server.ts-BD0Jit8e.js.map → _server.ts-CCwIt_KL.js.map} +1 -1
  145. package/build/server/chunks/{_server.ts-BVYIqRK2.js → _server.ts-CKNmPEUu.js} +4 -4
  146. package/build/server/chunks/{_server.ts-BVYIqRK2.js.map → _server.ts-CKNmPEUu.js.map} +1 -1
  147. package/build/server/chunks/{_server.ts-DXOh4EZe.js → _server.ts-COMRHDN4.js} +7 -6
  148. package/build/server/chunks/_server.ts-COMRHDN4.js.map +1 -0
  149. package/build/server/chunks/{_server.ts-CC-mpNNj.js → _server.ts-CU1go_Ga.js} +4 -4
  150. package/build/server/chunks/{_server.ts-CC-mpNNj.js.map → _server.ts-CU1go_Ga.js.map} +1 -1
  151. package/build/server/chunks/{_server.ts-CH8VLn03.js → _server.ts-CbZzxQR_.js} +4 -4
  152. package/build/server/chunks/{_server.ts-CH8VLn03.js.map → _server.ts-CbZzxQR_.js.map} +1 -1
  153. package/build/server/chunks/{_server.ts-vp9n_72N.js → _server.ts-Cm9oppJJ.js} +4 -4
  154. package/build/server/chunks/{_server.ts-vp9n_72N.js.map → _server.ts-Cm9oppJJ.js.map} +1 -1
  155. package/build/server/chunks/{_server.ts-BG3UvxEU.js → _server.ts-CmMcnrpu.js} +2 -2
  156. package/build/server/chunks/{_server.ts-BG3UvxEU.js.map → _server.ts-CmMcnrpu.js.map} +1 -1
  157. package/build/server/chunks/{_server.ts-N6WIc0vw.js → _server.ts-CqkM3R41.js} +4 -4
  158. package/build/server/chunks/{_server.ts-N6WIc0vw.js.map → _server.ts-CqkM3R41.js.map} +1 -1
  159. package/build/server/chunks/{_server.ts-C7D2sok_.js → _server.ts-Cszg5Fas.js} +4 -4
  160. package/build/server/chunks/{_server.ts-C7D2sok_.js.map → _server.ts-Cszg5Fas.js.map} +1 -1
  161. package/build/server/chunks/{_server.ts-BrExNZ-2.js → _server.ts-CxJxINit.js} +4 -4
  162. package/build/server/chunks/{_server.ts-BrExNZ-2.js.map → _server.ts-CxJxINit.js.map} +1 -1
  163. package/build/server/chunks/{_server.ts-C5wVttUW.js → _server.ts-D-9t8-nD.js} +3 -3
  164. package/build/server/chunks/{_server.ts-C5wVttUW.js.map → _server.ts-D-9t8-nD.js.map} +1 -1
  165. package/build/server/chunks/{_server.ts-DtC0SjIr.js → _server.ts-D1bJgR3K.js} +4 -4
  166. package/build/server/chunks/{_server.ts-DtC0SjIr.js.map → _server.ts-D1bJgR3K.js.map} +1 -1
  167. package/build/server/chunks/{_server.ts-CQPWD_WN.js → _server.ts-D2DzSUG5.js} +4 -4
  168. package/build/server/chunks/{_server.ts-CQPWD_WN.js.map → _server.ts-D2DzSUG5.js.map} +1 -1
  169. package/build/server/chunks/{_server.ts-D4zkfcxH.js → _server.ts-D2HqJdkr.js} +4 -4
  170. package/build/server/chunks/{_server.ts-D4zkfcxH.js.map → _server.ts-D2HqJdkr.js.map} +1 -1
  171. package/build/server/chunks/{_server.ts-BZ8wMJ7l.js → _server.ts-D2QOo_fa.js} +4 -4
  172. package/build/server/chunks/{_server.ts-BZ8wMJ7l.js.map → _server.ts-D2QOo_fa.js.map} +1 -1
  173. package/build/server/chunks/{_server.ts-BCcQdRne.js → _server.ts-D4Vu3KCM.js} +4 -4
  174. package/build/server/chunks/{_server.ts-BCcQdRne.js.map → _server.ts-D4Vu3KCM.js.map} +1 -1
  175. package/build/server/chunks/{_server.ts-l3A6IOvJ.js → _server.ts-D68iKpcP.js} +4 -4
  176. package/build/server/chunks/{_server.ts-l3A6IOvJ.js.map → _server.ts-D68iKpcP.js.map} +1 -1
  177. package/build/server/chunks/{_server.ts-B2RCiGeA.js → _server.ts-D7vymw_o.js} +4 -4
  178. package/build/server/chunks/{_server.ts-B2RCiGeA.js.map → _server.ts-D7vymw_o.js.map} +1 -1
  179. package/build/server/chunks/{_server.ts-DrM8VAOS.js → _server.ts-DL9CCFsk.js} +4 -4
  180. package/build/server/chunks/{_server.ts-DrM8VAOS.js.map → _server.ts-DL9CCFsk.js.map} +1 -1
  181. package/build/server/chunks/{_server.ts-CSs35mBJ.js → _server.ts-DSBUjxDK.js} +4 -4
  182. package/build/server/chunks/{_server.ts-CSs35mBJ.js.map → _server.ts-DSBUjxDK.js.map} +1 -1
  183. package/build/server/chunks/{_server.ts-BVCET3CA.js → _server.ts-DSlYMYYk.js} +4 -4
  184. package/build/server/chunks/{_server.ts-BVCET3CA.js.map → _server.ts-DSlYMYYk.js.map} +1 -1
  185. package/build/server/chunks/{_server.ts-_o3Yebl6.js → _server.ts-DTJuIcDg.js} +4 -4
  186. package/build/server/chunks/{_server.ts-_o3Yebl6.js.map → _server.ts-DTJuIcDg.js.map} +1 -1
  187. package/build/server/chunks/{_server.ts-DAb50kOu.js → _server.ts-DUmy4wsR.js} +5 -5
  188. package/build/server/chunks/{_server.ts-DAb50kOu.js.map → _server.ts-DUmy4wsR.js.map} +1 -1
  189. package/build/server/chunks/{_server.ts-Ban3zjRc.js → _server.ts-DfFo95a7.js} +4 -4
  190. package/build/server/chunks/{_server.ts-Ban3zjRc.js.map → _server.ts-DfFo95a7.js.map} +1 -1
  191. package/build/server/chunks/{_server.ts-BYTWLTxk.js → _server.ts-Dfx9HNlr.js} +6 -7
  192. package/build/server/chunks/_server.ts-Dfx9HNlr.js.map +1 -0
  193. package/build/server/chunks/{_server.ts-DcQTtmS3.js → _server.ts-DgQDDDEz.js} +4 -4
  194. package/build/server/chunks/{_server.ts-DcQTtmS3.js.map → _server.ts-DgQDDDEz.js.map} +1 -1
  195. package/build/server/chunks/{_server.ts-DjnK1iz8.js → _server.ts-DgZ2d-BT.js} +4 -4
  196. package/build/server/chunks/{_server.ts-DjnK1iz8.js.map → _server.ts-DgZ2d-BT.js.map} +1 -1
  197. package/build/server/chunks/{_server.ts-ccd1enMp.js → _server.ts-DijnYBzX.js} +4 -4
  198. package/build/server/chunks/{_server.ts-ccd1enMp.js.map → _server.ts-DijnYBzX.js.map} +1 -1
  199. package/build/server/chunks/{_server.ts-COORKWSc.js → _server.ts-DlzI77bJ.js} +4 -4
  200. package/build/server/chunks/{_server.ts-COORKWSc.js.map → _server.ts-DlzI77bJ.js.map} +1 -1
  201. package/build/server/chunks/{_server.ts-Me1rXUGo.js → _server.ts-DnBzi352.js} +4 -4
  202. package/build/server/chunks/{_server.ts-Me1rXUGo.js.map → _server.ts-DnBzi352.js.map} +1 -1
  203. package/build/server/chunks/{_server.ts-CG1nihTT.js → _server.ts-Dnh6b7-J.js} +4 -4
  204. package/build/server/chunks/{_server.ts-CG1nihTT.js.map → _server.ts-Dnh6b7-J.js.map} +1 -1
  205. package/build/server/chunks/{_server.ts-BTGThm9P.js → _server.ts-Dvh0Hoso.js} +4 -4
  206. package/build/server/chunks/{_server.ts-BTGThm9P.js.map → _server.ts-Dvh0Hoso.js.map} +1 -1
  207. package/build/server/chunks/{_server.ts-XOLGzzNk.js → _server.ts-DwB3oRpy.js} +4 -4
  208. package/build/server/chunks/{_server.ts-XOLGzzNk.js.map → _server.ts-DwB3oRpy.js.map} +1 -1
  209. package/build/server/chunks/{_server.ts-pLeJl6U2.js → _server.ts-DxGR3bmq.js} +4 -4
  210. package/build/server/chunks/{_server.ts-pLeJl6U2.js.map → _server.ts-DxGR3bmq.js.map} +1 -1
  211. package/build/server/chunks/{_server.ts-EBySP1Ew.js → _server.ts-DzbC2VQR.js} +2 -2
  212. package/build/server/chunks/{_server.ts-EBySP1Ew.js.map → _server.ts-DzbC2VQR.js.map} +1 -1
  213. package/build/server/chunks/{_server.ts-D9HJ0cWI.js → _server.ts-GxTTkaRQ.js} +4 -4
  214. package/build/server/chunks/{_server.ts-D9HJ0cWI.js.map → _server.ts-GxTTkaRQ.js.map} +1 -1
  215. package/build/server/chunks/{_server.ts-Cw2YXWgK.js → _server.ts-K4R4Q6b_.js} +5 -5
  216. package/build/server/chunks/{_server.ts-Cw2YXWgK.js.map → _server.ts-K4R4Q6b_.js.map} +1 -1
  217. package/build/server/chunks/{_server.ts-DQcL5wr_.js → _server.ts-MNOR6YaX.js} +4 -4
  218. package/build/server/chunks/{_server.ts-DQcL5wr_.js.map → _server.ts-MNOR6YaX.js.map} +1 -1
  219. package/build/server/chunks/{_server.ts-__xVWUvt.js → _server.ts-MtHT_432.js} +4 -4
  220. package/build/server/chunks/{_server.ts-__xVWUvt.js.map → _server.ts-MtHT_432.js.map} +1 -1
  221. package/build/server/chunks/{_server.ts-C44tS0KC.js → _server.ts-Om-m3OOe.js} +4 -4
  222. package/build/server/chunks/{_server.ts-C44tS0KC.js.map → _server.ts-Om-m3OOe.js.map} +1 -1
  223. package/build/server/chunks/{_server.ts-iAOP7FW1.js → _server.ts-URUUrX13.js} +4 -12
  224. package/build/server/chunks/_server.ts-URUUrX13.js.map +1 -0
  225. package/build/server/chunks/{_server.ts-ZE9PYnxj.js → _server.ts-__ul4l8J.js} +4 -4
  226. package/build/server/chunks/_server.ts-__ul4l8J.js.map +1 -0
  227. package/build/server/chunks/{_server.ts-DLHN_6MC.js → _server.ts-oqC79KoF.js} +4 -4
  228. package/build/server/chunks/{_server.ts-DLHN_6MC.js.map → _server.ts-oqC79KoF.js.map} +1 -1
  229. package/build/server/chunks/{_server.ts-C1CpbG3_.js → _server.ts-w34_y9d_.js} +4 -4
  230. package/build/server/chunks/{_server.ts-C1CpbG3_.js.map → _server.ts-w34_y9d_.js.map} +1 -1
  231. package/build/server/chunks/{_server.ts-BaxB3oQq.js → _server.ts-yvQ-qjyI.js} +4 -4
  232. package/build/server/chunks/{_server.ts-BaxB3oQq.js.map → _server.ts-yvQ-qjyI.js.map} +1 -1
  233. package/build/server/chunks/{_server.ts-BAsbrtjL.js → _server.ts-zHkS9Tnj.js} +2 -2
  234. package/build/server/chunks/{_server.ts-BAsbrtjL.js.map → _server.ts-zHkS9Tnj.js.map} +1 -1
  235. package/build/server/chunks/{addon-helpers-B0E6L7iO.js → addon-helpers-CZyPj8WN.js} +3 -3
  236. package/build/server/chunks/{addon-helpers-B0E6L7iO.js.map → addon-helpers-CZyPj8WN.js.map} +1 -1
  237. package/build/server/chunks/{client-D0taHWmu.js → client-CiyZ88m2.js} +2 -2
  238. package/build/server/chunks/{client-D0taHWmu.js.map → client-CiyZ88m2.js.map} +1 -1
  239. package/build/server/chunks/{config-2pnPob92.js → config-BKCgm_AV.js} +2 -2
  240. package/build/server/chunks/{config-2pnPob92.js.map → config-BKCgm_AV.js.map} +1 -1
  241. package/build/server/chunks/{docker-D17EjIlp.js → docker-8AuF7CwZ.js} +2 -2
  242. package/build/server/chunks/{docker-D17EjIlp.js.map → docker-8AuF7CwZ.js.map} +1 -1
  243. package/build/server/chunks/{endpoints-DoIeO5WL.js → endpoints-DaDle7pk.js} +2 -2
  244. package/build/server/chunks/{endpoints-DoIeO5WL.js.map → endpoints-DaDle7pk.js.map} +1 -1
  245. package/build/server/chunks/{environment-B38QRFKh.js → environment-Cp1uhq6U.js} +2 -2
  246. package/build/server/chunks/{environment-B38QRFKh.js.map → environment-Cp1uhq6U.js.map} +1 -1
  247. package/build/server/chunks/{error.svelte-DB6X8EVo.js → error.svelte-m6KMTHAJ.js} +4 -4
  248. package/build/server/chunks/{error.svelte-DB6X8EVo.js.map → error.svelte-m6KMTHAJ.js.map} +1 -1
  249. package/build/server/chunks/{helpers-CeQwqpAT.js → helpers-BACi22nU.js} +34 -8
  250. package/build/server/chunks/helpers-BACi22nU.js.map +1 -0
  251. package/build/server/chunks/{hooks.server-2io-2N7D.js → hooks.server-BdyM6mgJ.js} +13 -4
  252. package/build/server/chunks/hooks.server-BdyM6mgJ.js.map +1 -0
  253. package/build/server/chunks/{http-CHmjTVGA.js → http-B8eIxVUs.js} +2 -2
  254. package/build/server/chunks/{http-CHmjTVGA.js.map → http-B8eIxVUs.js.map} +1 -1
  255. package/build/server/chunks/{internal-ClL4rso0.js → internal-BxEwVWRz.js} +3 -3
  256. package/build/server/chunks/{internal-ClL4rso0.js.map → internal-BxEwVWRz.js.map} +1 -1
  257. package/build/server/chunks/session-cookie-CFbH9CoY.js +74 -0
  258. package/build/server/chunks/session-cookie-CFbH9CoY.js.map +1 -0
  259. package/build/server/chunks/{setup-deploy-53S0fflh.js → setup-deploy-Ck_d_qcE.js} +2 -2
  260. package/build/server/chunks/{setup-deploy-53S0fflh.js.map → setup-deploy-Ck_d_qcE.js.map} +1 -1
  261. package/build/server/chunks/{src-D9YnoOnU.js → src-CQbie-rx.js} +252 -67
  262. package/build/server/chunks/src-CQbie-rx.js.map +1 -0
  263. package/build/server/chunks/{state-CO78UOQH.js → state-oN2SUx4y.js} +2 -2
  264. package/build/server/chunks/{state-CO78UOQH.js.map → state-oN2SUx4y.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.br +0 -0
  284. package/build/client/_app/immutable/chunks/BNcdU8Ou.js.gz +0 -0
  285. package/build/client/_app/immutable/chunks/BQrb5YOM.js +0 -1
  286. package/build/client/_app/immutable/chunks/BQrb5YOM.js.br +0 -0
  287. package/build/client/_app/immutable/chunks/BQrb5YOM.js.gz +0 -0
  288. package/build/client/_app/immutable/chunks/HJd0QhDi.js.br +0 -0
  289. package/build/client/_app/immutable/chunks/HJd0QhDi.js.gz +0 -0
  290. package/build/client/_app/immutable/chunks/Mj3AXROx.js.br +0 -0
  291. package/build/client/_app/immutable/chunks/Mj3AXROx.js.gz +0 -0
  292. package/build/client/_app/immutable/entry/app.8wJBndTj.js.br +0 -0
  293. package/build/client/_app/immutable/entry/app.8wJBndTj.js.gz +0 -0
  294. package/build/client/_app/immutable/entry/start.B6QaWAof.js +0 -1
  295. package/build/client/_app/immutable/entry/start.B6QaWAof.js.br +0 -0
  296. package/build/client/_app/immutable/entry/start.B6QaWAof.js.gz +0 -0
  297. package/build/client/_app/immutable/nodes/1.BeVZsPun.js.br +0 -1
  298. package/build/client/_app/immutable/nodes/1.BeVZsPun.js.gz +0 -0
  299. package/build/client/_app/immutable/nodes/4.BAthCCnr.js.br +0 -0
  300. package/build/client/_app/immutable/nodes/4.BAthCCnr.js.gz +0 -0
  301. package/build/client/_app/immutable/nodes/5.Ci-IDy_L.js.br +0 -0
  302. package/build/client/_app/immutable/nodes/5.Ci-IDy_L.js.gz +0 -0
  303. package/build/client/_app/immutable/nodes/6._GM9bF5h.js.br +0 -0
  304. package/build/client/_app/immutable/nodes/6._GM9bF5h.js.gz +0 -0
  305. package/build/client/_app/immutable/nodes/7.Cx4EVpki.js.br +0 -0
  306. package/build/client/_app/immutable/nodes/7.Cx4EVpki.js.gz +0 -0
  307. package/build/client/_app/immutable/nodes/8.p0qRhws4.js.br +0 -0
  308. package/build/client/_app/immutable/nodes/8.p0qRhws4.js.gz +0 -0
  309. package/build/client/_app/immutable/nodes/9.C1MP3zci.js +0 -2
  310. package/build/client/_app/immutable/nodes/9.C1MP3zci.js.br +0 -0
  311. package/build/client/_app/immutable/nodes/9.C1MP3zci.js.gz +0 -0
  312. package/build/server/chunks/1-DTcDogB5.js +0 -9
  313. package/build/server/chunks/4-Dn-0_RAr.js +0 -9
  314. package/build/server/chunks/5-Cbcb8WMr.js +0 -9
  315. package/build/server/chunks/7-C0-ssq7j.js +0 -9
  316. package/build/server/chunks/9-B8DzptsC.js +0 -9
  317. package/build/server/chunks/_page.svelte-BgAgZqQA.js.map +0 -1
  318. package/build/server/chunks/_page.svelte-DLAHj-kk.js.map +0 -1
  319. package/build/server/chunks/_server.ts-BYTWLTxk.js.map +0 -1
  320. package/build/server/chunks/_server.ts-BlMOxGWA.js.map +0 -1
  321. package/build/server/chunks/_server.ts-C5uu6b2a.js.map +0 -1
  322. package/build/server/chunks/_server.ts-DXOh4EZe.js.map +0 -1
  323. package/build/server/chunks/_server.ts-ZE9PYnxj.js.map +0 -1
  324. package/build/server/chunks/_server.ts-iAOP7FW1.js.map +0 -1
  325. package/build/server/chunks/helpers-CeQwqpAT.js.map +0 -1
  326. package/build/server/chunks/hooks.server-2io-2N7D.js.map +0 -1
  327. package/build/server/chunks/src-D9YnoOnU.js.map +0 -1
  328. /package/build/client/_app/immutable/nodes/{0.rwRC6zAi.js → 0.0pi4RS6G.js} +0 -0
  329. /package/build/client/_app/immutable/nodes/{0.rwRC6zAi.js.br → 0.0pi4RS6G.js.br} +0 -0
  330. /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,
@@ -12954,7 +12980,7 @@ function collectEnvOverrides(envFiles) {
12954
12980
  async function composePreflight(options) {
12955
12981
  const args = buildComposeArgs(options);
12956
12982
  args.push("config", "--quiet");
12957
- return run(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
12983
+ return run$1(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
12958
12984
  }
12959
12985
  /**
12960
12986
  * Run compose config preflight validation before any mutation.
@@ -12974,7 +13000,7 @@ async function runPreflight(options) {
12974
13000
  async function composeConfigServices(options) {
12975
13001
  const args = buildComposeArgs(options);
12976
13002
  args.push("config", "--services");
12977
- const result = await run(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
13003
+ const result = await run$1(args, void 0, 3e4, collectEnvOverrides(options.envFiles));
12978
13004
  if (!result.ok) return {
12979
13005
  ok: false,
12980
13006
  services: []
@@ -13001,7 +13027,7 @@ async function composeUp(options) {
13001
13027
  if (options.forceRecreate) args.push("--force-recreate");
13002
13028
  if (options.removeOrphans) args.push("--remove-orphans");
13003
13029
  if (options.services?.length) args.push(...options.services);
13004
- return run(args, void 0, 3e5, collectEnvOverrides(options.envFiles));
13030
+ return run$1(args, void 0, 3e5, collectEnvOverrides(options.envFiles));
13005
13031
  }
13006
13032
  /**
13007
13033
  * Run `docker compose down` to stop and remove containers.
@@ -13017,7 +13043,7 @@ async function composeDown(options) {
13017
13043
  const args = buildComposeArgs(options);
13018
13044
  args.push("down");
13019
13045
  if (options.removeVolumes) args.push("-v");
13020
- return run(args, void 0);
13046
+ return run$1(args, void 0);
13021
13047
  }
13022
13048
  /**
13023
13049
  * Restart specific services.
@@ -13033,7 +13059,7 @@ async function composeRestart(services, options) {
13033
13059
  };
13034
13060
  const args = buildComposeArgs(options);
13035
13061
  args.push("restart", ...services);
13036
- return run(args, void 0);
13062
+ return run$1(args, void 0);
13037
13063
  }
13038
13064
  /**
13039
13065
  * Stop specific services.
@@ -13042,7 +13068,7 @@ async function composeStop(services, options) {
13042
13068
  await runPreflight(options);
13043
13069
  const args = buildComposeArgs(options);
13044
13070
  args.push("stop", ...services);
13045
- return run(args, void 0);
13071
+ return run$1(args, void 0);
13046
13072
  }
13047
13073
  /**
13048
13074
  * Start specific services (must already be created).
@@ -13051,14 +13077,14 @@ async function composeStart(services, options) {
13051
13077
  await runPreflight(options);
13052
13078
  const args = buildComposeArgs(options);
13053
13079
  args.push("up", "-d", ...services);
13054
- return run(args, void 0);
13080
+ return run$1(args, void 0);
13055
13081
  }
13056
13082
  /**
13057
13083
  * Get the status of all containers in the project.
13058
13084
  */
13059
13085
  async function composePs(options) {
13060
13086
  const primaryFile = options.files[0];
13061
- if (!existsSync(primaryFile)) return run([
13087
+ if (!existsSync(primaryFile)) return run$1([
13062
13088
  "ps",
13063
13089
  "--filter",
13064
13090
  `label=com.docker.compose.project=${resolveComposeProjectName()}`,
@@ -13067,7 +13093,7 @@ async function composePs(options) {
13067
13093
  ], void 0);
13068
13094
  const args = buildComposeArgs(options);
13069
13095
  args.push("ps", "--format", "json");
13070
- return run(args, void 0);
13096
+ return run$1(args, void 0);
13071
13097
  }
13072
13098
  /**
13073
13099
  * Get logs for specific services or all services.
@@ -13077,14 +13103,14 @@ async function composeLogs(services, tail, options) {
13077
13103
  args.push("logs", "--tail", String(tail));
13078
13104
  if (options.since) args.push("--since", options.since);
13079
13105
  if (services && services.length > 0) args.push(...services);
13080
- return run(args, void 0);
13106
+ return run$1(args, void 0);
13081
13107
  }
13082
13108
  var PULL_TIMEOUT_MS = 60 * 6e4;
13083
13109
  async function composePull(options) {
13084
13110
  await runPreflight(options);
13085
13111
  const args = buildComposeArgs(options);
13086
13112
  args.push("pull");
13087
- return run(args, void 0, PULL_TIMEOUT_MS, collectEnvOverrides(options.envFiles));
13113
+ return run$1(args, void 0, PULL_TIMEOUT_MS, collectEnvOverrides(options.envFiles));
13088
13114
  }
13089
13115
  /**
13090
13116
  * Get resource usage stats for all containers in the project.
@@ -13092,13 +13118,13 @@ async function composePull(options) {
13092
13118
  async function composeStats(options) {
13093
13119
  const args = buildComposeArgs(options);
13094
13120
  args.push("stats", "--no-stream", "--format", "json");
13095
- return run(args, void 0);
13121
+ return run$1(args, void 0);
13096
13122
  }
13097
13123
  /**
13098
13124
  * Get recent Docker events for the compose project.
13099
13125
  */
13100
13126
  async function getDockerEvents(projectName, since = "1h") {
13101
- return run([
13127
+ return run$1([
13102
13128
  "events",
13103
13129
  "--filter",
13104
13130
  `label=com.docker.compose.project=${projectName}`,
@@ -13249,10 +13275,23 @@ function resolveNewestDockerTag(payload) {
13249
13275
  }
13250
13276
  return fallback;
13251
13277
  }
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();
13278
+ function resolveImageNamespace(state) {
13279
+ const namespace = (parseEnvFile(`${state.stashDir}/env/stack.env`).OP_IMAGE_NAMESPACE ?? process.env.OP_IMAGE_NAMESPACE ?? "openpalm").trim().toLowerCase();
13255
13280
  if (!IMAGE_NAMESPACE_RE.test(namespace)) throw new Error(`Invalid image namespace in system.env: ${namespace}`);
13281
+ return namespace;
13282
+ }
13283
+ /**
13284
+ * Resolve the newest published platform tag from the Docker registry.
13285
+ *
13286
+ * `assistant` is the version-of-record image: all platform images
13287
+ * (assistant, guardian, channel, voice) are published in lockstep under the
13288
+ * same OP_IMAGE_TAG, so its newest tag is the canonical platform version.
13289
+ *
13290
+ * Used both to auto-detect during "Update now" and to resolve a requested
13291
+ * `latest` selection into a concrete release tag before fetching stack assets
13292
+ * (GitHub has no asset tree at a `latest` ref).
13293
+ */
13294
+ async function resolveLatestPlatformTag(namespace) {
13256
13295
  let response;
13257
13296
  try {
13258
13297
  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 +13301,12 @@ async function updateStackEnvToLatestImageTag(state) {
13262
13301
  if (!response.ok) throw new Error(`Docker tag lookup failed (${response.status})`);
13263
13302
  const latestTag = resolveNewestDockerTag(await response.json());
13264
13303
  if (!latestTag) throw new Error("No usable Docker image tag found");
13304
+ return latestTag;
13305
+ }
13306
+ async function updateStackEnvToLatestImageTag(state) {
13307
+ const systemEnvPath = `${state.stashDir}/env/stack.env`;
13308
+ const namespace = resolveImageNamespace(state);
13309
+ const latestTag = await resolveLatestPlatformTag(namespace);
13265
13310
  writeFileSync(systemEnvPath, mergeEnvContent(existsSync(systemEnvPath) ? readFileSync(systemEnvPath, "utf-8") : "", { OP_IMAGE_TAG: latestTag }, { uncomment: true }));
13266
13311
  return {
13267
13312
  namespace,
@@ -13315,6 +13360,7 @@ async function performUpgrade(state) {
13315
13360
  const upResult = await composeUp({
13316
13361
  ...composeOpts,
13317
13362
  services,
13363
+ forceRecreate: true,
13318
13364
  removeOrphans: true
13319
13365
  });
13320
13366
  if (!upResult.ok) throw new Error(`Images pulled but failed to recreate containers: ${upResult.stderr}`);
@@ -13331,12 +13377,21 @@ async function performUpgrade(state) {
13331
13377
  * Used by the admin "set version" action — skips the auto-detect step in performUpgrade.
13332
13378
  */
13333
13379
  async function applyTagChange(state, tag) {
13380
+ const namespace = resolveImageNamespace(state);
13381
+ const requested = tag.trim();
13382
+ let resolvedTag = requested;
13383
+ if (requested === "" || requested.toLowerCase() === "latest") try {
13384
+ resolvedTag = await resolveLatestPlatformTag(namespace);
13385
+ } catch (e) {
13386
+ const msg = e instanceof Error ? e.message : String(e);
13387
+ throw new Error(`Cannot resolve "latest" to a concrete release: ${msg}. Check your network connection or select a specific version.`);
13388
+ }
13334
13389
  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);
13390
+ writeFileSync(stackEnvPath, mergeEnvContent(existsSync(stackEnvPath) ? readFileSync(stackEnvPath, "utf-8") : "", { OP_IMAGE_TAG: resolvedTag }, { uncomment: true }));
13391
+ const upgradeResult = await applyUpgrade(state, resolvedTag);
13337
13392
  return {
13338
- imageTag: tag,
13339
- namespace: "openpalm",
13393
+ imageTag: resolvedTag,
13394
+ namespace,
13340
13395
  backupDir: upgradeResult.backupDir,
13341
13396
  assetsUpdated: upgradeResult.updated,
13342
13397
  restarted: upgradeResult.restarted
@@ -13347,13 +13402,16 @@ function buildComposeFileList(state) {
13347
13402
  }
13348
13403
  async function buildManagedServices(state) {
13349
13404
  const composeOpts = buildComposeOptions(state);
13405
+ const services = new Set(CORE_SERVICES);
13350
13406
  if (composeOpts.files.length > 0 && !process.env.OP_SKIP_COMPOSE_PREFLIGHT) {
13351
13407
  const result = await composeConfigServices(composeOpts);
13352
- if (result.ok && result.services.length > 0) return result.services;
13408
+ if (result.ok && result.services.length > 0) {
13409
+ for (const s of result.services) services.add(s);
13410
+ return [...services];
13411
+ }
13353
13412
  }
13354
- const services = [...CORE_SERVICES];
13355
- for (const addon of listEnabledAddonIds(state.homeDir)) services.push(...getAddonServiceNames(state.homeDir, addon));
13356
- return services;
13413
+ for (const addon of listEnabledAddonIds(state.homeDir)) for (const s of getAddonServiceNames(state.homeDir, addon)) services.add(s);
13414
+ return [...services];
13357
13415
  }
13358
13416
  //#endregion
13359
13417
  //#region ../lib/src/control-plane/markdown-task.ts
@@ -13365,14 +13423,14 @@ async function buildManagedServices(state) {
13365
13423
  * prompt — `prompt: <text>` inline prompt text
13366
13424
  * workflow — `workflow: workflow:<ref>` + optional `params` map
13367
13425
  */
13368
- var logger$3 = createLogger("task-file");
13426
+ var logger$4 = createLogger("task-file");
13369
13427
  function parseMarkdownTask(filePath) {
13370
13428
  const id = basename(filePath).replace(/\.(?:ya?ml|md)$/, "");
13371
13429
  let raw;
13372
13430
  try {
13373
13431
  raw = readFileSync(filePath, "utf-8");
13374
13432
  } catch (err) {
13375
- logger$3.warn("failed to read task file", {
13433
+ logger$4.warn("failed to read task file", {
13376
13434
  filePath,
13377
13435
  error: String(err)
13378
13436
  });
@@ -13383,12 +13441,12 @@ function parseMarkdownTask(filePath) {
13383
13441
  try {
13384
13442
  const parsed = (0, import_dist.parse)(frontmatter);
13385
13443
  if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
13386
- logger$3.warn("task YAML is not an object", { filePath });
13444
+ logger$4.warn("task YAML is not an object", { filePath });
13387
13445
  return null;
13388
13446
  }
13389
13447
  fm = parsed;
13390
13448
  } catch (err) {
13391
- logger$3.warn("failed to parse task YAML", {
13449
+ logger$4.warn("failed to parse task YAML", {
13392
13450
  filePath,
13393
13451
  error: String(err)
13394
13452
  });
@@ -13396,14 +13454,14 @@ function parseMarkdownTask(filePath) {
13396
13454
  }
13397
13455
  const schedule = fm.schedule;
13398
13456
  if (typeof schedule !== "string" || !schedule.trim()) {
13399
- logger$3.warn("task missing or empty 'schedule'", { filePath });
13457
+ logger$4.warn("task missing or empty 'schedule'", { filePath });
13400
13458
  return null;
13401
13459
  }
13402
13460
  let target;
13403
13461
  if (fm.command !== void 0) {
13404
13462
  const cmd = Array.isArray(fm.command) ? fm.command.map(String) : typeof fm.command === "string" ? [fm.command] : null;
13405
13463
  if (!cmd || cmd.length === 0) {
13406
- logger$3.warn("task 'command' must be a non-empty array", { filePath });
13464
+ logger$4.warn("task 'command' must be a non-empty array", { filePath });
13407
13465
  return null;
13408
13466
  }
13409
13467
  target = {
@@ -13412,12 +13470,12 @@ function parseMarkdownTask(filePath) {
13412
13470
  };
13413
13471
  } else if (fm.prompt !== void 0) {
13414
13472
  if (typeof fm.prompt !== "string" || !fm.prompt.trim()) {
13415
- logger$3.warn("task 'prompt' must be a non-empty string", { filePath });
13473
+ logger$4.warn("task 'prompt' must be a non-empty string", { filePath });
13416
13474
  return null;
13417
13475
  }
13418
13476
  const promptBody = fm.prompt.trim() === "inline" ? body.trim() : fm.prompt.trim();
13419
13477
  if (!promptBody) {
13420
- logger$3.warn("task prompt body is empty", { filePath });
13478
+ logger$4.warn("task prompt body is empty", { filePath });
13421
13479
  return null;
13422
13480
  }
13423
13481
  target = {
@@ -13427,7 +13485,7 @@ function parseMarkdownTask(filePath) {
13427
13485
  };
13428
13486
  } else if (fm.workflow !== void 0) {
13429
13487
  if (typeof fm.workflow !== "string") {
13430
- logger$3.warn("task 'workflow' must be a string ref", { filePath });
13488
+ logger$4.warn("task 'workflow' must be a string ref", { filePath });
13431
13489
  return null;
13432
13490
  }
13433
13491
  target = {
@@ -13436,7 +13494,7 @@ function parseMarkdownTask(filePath) {
13436
13494
  params: fm.params && typeof fm.params === "object" && !Array.isArray(fm.params) ? fm.params : {}
13437
13495
  };
13438
13496
  } else {
13439
- logger$3.warn("task must have one of: command, prompt, workflow", { filePath });
13497
+ logger$4.warn("task must have one of: command, prompt, workflow", { filePath });
13440
13498
  return null;
13441
13499
  }
13442
13500
  return {
@@ -13653,7 +13711,7 @@ function readUserEnvFile(envPath) {
13653
13711
  * Scheduling is handled by the OS cron daemon (via `akm tasks sync`).
13654
13712
  * Execution is handled by `akm tasks run <id>`.
13655
13713
  */
13656
- var logger$2 = createLogger("scheduler");
13714
+ var logger$3 = createLogger("scheduler");
13657
13715
  function loadAutomations(stashDir) {
13658
13716
  return loadMarkdownTasks(stashDir).map(taskToAutomationConfig);
13659
13717
  }
@@ -13671,7 +13729,7 @@ async function executeAutomation(id, akmEnv) {
13671
13729
  } }, (error, _stdout, stderr) => {
13672
13730
  if (error) {
13673
13731
  const msg = stderr?.trim() || error.message;
13674
- logger$2.warn("akm tasks run failed", {
13732
+ logger$3.warn("akm tasks run failed", {
13675
13733
  id: taskId,
13676
13734
  error: msg
13677
13735
  });
@@ -13711,7 +13769,7 @@ function readAutomationLogs(id, dataDir, limit = 50) {
13711
13769
  *
13712
13770
  * Probes well-known endpoints for Docker Model Runner, Ollama, and LM Studio.
13713
13771
  */
13714
- var logger$1 = createLogger("local-providers");
13772
+ var logger$2 = createLogger("local-providers");
13715
13773
  /** Ollama's root endpoint returns "Ollama is running" — use this to distinguish from other services on :11434. */
13716
13774
  async function validateOllamaResponse(res) {
13717
13775
  try {
@@ -13784,13 +13842,13 @@ async function detectLocalProviders() {
13784
13842
  const res = await fetch(probeUrl, { signal: AbortSignal.timeout(3e3) });
13785
13843
  if (res.ok) {
13786
13844
  if (validate && !await validate(res)) {
13787
- logger$1.debug("provider probe response failed validation", {
13845
+ logger$2.debug("provider probe response failed validation", {
13788
13846
  provider,
13789
13847
  url: baseUrl
13790
13848
  });
13791
13849
  continue;
13792
13850
  }
13793
- logger$1.debug("detected local provider", {
13851
+ logger$2.debug("detected local provider", {
13794
13852
  provider,
13795
13853
  url: baseUrl
13796
13854
  });
@@ -13809,6 +13867,133 @@ async function detectLocalProviders() {
13809
13867
  }));
13810
13868
  }
13811
13869
  //#endregion
13870
+ //#region ../lib/src/control-plane/hardware-detect.ts
13871
+ var logger$1 = createLogger("hardware-detect");
13872
+ /** Parse `nvidia-smi --query-gpu=name,memory.total --format=csv,noheader,nounits`. */
13873
+ function parseNvidiaSmi(stdout) {
13874
+ return stdout.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => {
13875
+ const idx = line.lastIndexOf(",");
13876
+ if (idx === -1) return null;
13877
+ const name = line.slice(0, idx).trim();
13878
+ const vramMb = Number.parseInt(line.slice(idx + 1).trim(), 10);
13879
+ if (!name || !Number.isFinite(vramMb)) return null;
13880
+ return {
13881
+ vendor: "nvidia",
13882
+ name,
13883
+ vramMb
13884
+ };
13885
+ }).filter((g) => g !== null);
13886
+ }
13887
+ /** Parse `rocm-smi --showmeminfo vram --showproductname --json`. */
13888
+ function parseRocmSmi(stdout) {
13889
+ let doc;
13890
+ try {
13891
+ doc = JSON.parse(stdout);
13892
+ } catch {
13893
+ return [];
13894
+ }
13895
+ const out = [];
13896
+ for (const card of Object.values(doc)) {
13897
+ if (!card || typeof card !== "object") continue;
13898
+ const vramKey = Object.keys(card).find((k) => /vram total memory/i.test(k));
13899
+ const nameKey = Object.keys(card).find((k) => /product name|card series|gfx/i.test(k));
13900
+ const bytes = vramKey ? Number.parseInt(String(card[vramKey]).trim(), 10) : NaN;
13901
+ const vramMb = Number.isFinite(bytes) ? Math.round(bytes / (1024 * 1024)) : 0;
13902
+ out.push({
13903
+ vendor: "amd",
13904
+ name: nameKey ? String(card[nameKey]).trim() : "AMD GPU",
13905
+ vramMb
13906
+ });
13907
+ }
13908
+ return out;
13909
+ }
13910
+ var GPU_PROBES = [{
13911
+ vendor: "nvidia",
13912
+ command: "nvidia-smi",
13913
+ args: ["--query-gpu=name,memory.total", "--format=csv,noheader,nounits"],
13914
+ parse: parseNvidiaSmi
13915
+ }, {
13916
+ vendor: "amd",
13917
+ command: "rocm-smi",
13918
+ args: [
13919
+ "--showmeminfo",
13920
+ "vram",
13921
+ "--showproductname",
13922
+ "--json"
13923
+ ],
13924
+ parse: parseRocmSmi
13925
+ }];
13926
+ function run(command, args, timeoutMs = 3e3) {
13927
+ return new Promise((resolve) => {
13928
+ execFile(command, args, { timeout: timeoutMs }, (err, stdout) => {
13929
+ resolve(err ? null : stdout?.toString() ?? "");
13930
+ });
13931
+ });
13932
+ }
13933
+ /**
13934
+ * Detect the host's best GPU. Returns the highest-VRAM adapter across all probes,
13935
+ * or null when none is found. Never throws.
13936
+ */
13937
+ async function detectGpu() {
13938
+ const found = [];
13939
+ await Promise.all(GPU_PROBES.map(async (probe) => {
13940
+ const stdout = await run(probe.command, probe.args);
13941
+ if (stdout === null) return;
13942
+ try {
13943
+ found.push(...probe.parse(stdout));
13944
+ } catch (error) {
13945
+ logger$1.debug("gpu probe parse failed", {
13946
+ vendor: probe.vendor,
13947
+ error: String(error)
13948
+ });
13949
+ }
13950
+ }));
13951
+ if (found.length === 0) return null;
13952
+ return found.reduce((best, g) => g.vramMb > best.vramMb ? g : best);
13953
+ }
13954
+ /** Ollama hardware-profile variant chosen per GPU vendor. Extend per new vendor. */
13955
+ var VENDOR_PROFILE_VARIANT = {
13956
+ nvidia: "cuda",
13957
+ amd: "rocm",
13958
+ unknown: "cpu"
13959
+ };
13960
+ function gpuToProfileVariant(gpu) {
13961
+ return VENDOR_PROFILE_VARIANT[gpu.vendor] ?? "cpu";
13962
+ }
13963
+ var fmtGb = (mb) => (mb / 1024).toFixed(mb % 1024 === 0 ? 0 : 1);
13964
+ var labelHostProviders = (h) => h.map((p) => p.provider).join(" and ");
13965
+ /**
13966
+ * Decide what setup should do, given detected providers + hardware.
13967
+ *
13968
+ * Order (first match wins):
13969
+ * 1. cloud provider connected -> use it.
13970
+ * 2. host-local provider running -> add it, proceed.
13971
+ * 3. capable GPU (>= threshold) -> enable in-stack Ollama.
13972
+ * 4. otherwise -> ask the user to connect a provider.
13973
+ */
13974
+ function recommendSetup(input) {
13975
+ const { cloudProviders, hostProviders, gpu } = input;
13976
+ if (cloudProviders.length > 0) return {
13977
+ action: "use-cloud",
13978
+ cloudProviders
13979
+ };
13980
+ if (hostProviders.length > 0) return {
13981
+ action: "use-host-providers",
13982
+ hostProviders,
13983
+ 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.`
13984
+ };
13985
+ if (gpu && gpu.vramMb >= 8192) return {
13986
+ action: "enable-ollama",
13987
+ profileVariant: gpuToProfileVariant(gpu),
13988
+ gpu,
13989
+ 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.`
13990
+ };
13991
+ return {
13992
+ action: "connect-manually",
13993
+ 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."
13994
+ };
13995
+ }
13996
+ //#endregion
13812
13997
  //#region ../lib/src/control-plane/compose-errors.ts
13813
13998
  /**
13814
13999
  * Lines we recognise as per-service failure indicators. The compose CLI
@@ -14433,5 +14618,5 @@ function importHostOpenCode(state, options = {}) {
14433
14618
  };
14434
14619
  }
14435
14620
 
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
14621
+ export { importHostOpenCode as $, AKM_USER_ENV_REF as A, createState as B, CORE_SERVICES as C, deleteUserEnvKey as D, detectGpu as E, detectHostOpenCode as F, detectLocalProviders as G, disableHostAkmSharing as H, enableHostAkmSharing as I, ensureAkmUserEnv as J, ensureHomeDirs as K, ensureMigrated as L, MigrationError as M, ensureOpenCodeConfig as N, ensureOpenCodeSystemConfig as O, PROVIDER_KEY_MAP as P, ensureSecrets as Q, executeAutomation as R, fetchProviderModels as S, getAddonProfileAvailability as T, getAddonProfileSelection as U, getAddonProfiles as V, getAddonServiceNames as W, getDockerEvents as X, getHostAkmSharingStatus as Y, getRegistryAddonConfig as Z, hostAkmStashPath as _, addonProfileId as a, isAllowedService as a0, isHostAkmAvailable as a1, isSetupComplete as a2, listAvailableAddonIds as a3, listEnabledAddonIds as a4, listSecretFiles as a5, loadAutomations as a6, parseComposeStderr as a7, parseEnvFile as a8, performSetup as a9, writeUserEnvKey as aA, writeVoiceVars as aB, performUpgrade as aa, readAutomationLogs as ab, readSecret as ac, readSecretFile as ad, readStackEnv as ae, readStackRuntimeEnv as af, readStackSecretEnv as ag, readTaskFile as ah, readUserEnvFile as ai, recommendSetup as aj, removeSecretFile as ak, removeTaskFile as al, resolveComposeProjectName as am, resolveDataDir as an, resolveRuntimeFiles as ao, resolveStackDir as ap, seedUiBuild as aq, setAddonEnabled as ar, setAddonProfileSelection as as, summarizeComposeStderr as at, validateProposedState as au, writeFileAtomic as av, writeRuntimeFiles as aw, writeSecretFile as ax, writeStackSecretEnv as ay, writeTaskFile 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 };
14622
+ //# sourceMappingURL=src-CQbie-rx.js.map