@openpalm/ui 0.11.0-rc.10

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 (339) hide show
  1. package/README.md +160 -0
  2. package/build/.openpalm-ui-version +1 -0
  3. package/build/client/_app/immutable/assets/0.p3iHeEvq.css +1 -0
  4. package/build/client/_app/immutable/assets/0.p3iHeEvq.css.br +0 -0
  5. package/build/client/_app/immutable/assets/0.p3iHeEvq.css.gz +0 -0
  6. package/build/client/_app/immutable/assets/4.BakrtzGF.css +1 -0
  7. package/build/client/_app/immutable/assets/4.BakrtzGF.css.br +0 -0
  8. package/build/client/_app/immutable/assets/4.BakrtzGF.css.gz +0 -0
  9. package/build/client/_app/immutable/assets/5.Cj0Mk9Gn.css +1 -0
  10. package/build/client/_app/immutable/assets/5.Cj0Mk9Gn.css.br +0 -0
  11. package/build/client/_app/immutable/assets/5.Cj0Mk9Gn.css.gz +0 -0
  12. package/build/client/_app/immutable/assets/6.B0Z8tVIH.css +1 -0
  13. package/build/client/_app/immutable/assets/6.B0Z8tVIH.css.br +1 -0
  14. package/build/client/_app/immutable/assets/6.B0Z8tVIH.css.gz +0 -0
  15. package/build/client/_app/immutable/assets/7.Cucah5cY.css +1 -0
  16. package/build/client/_app/immutable/assets/7.Cucah5cY.css.br +0 -0
  17. package/build/client/_app/immutable/assets/7.Cucah5cY.css.gz +0 -0
  18. package/build/client/_app/immutable/assets/8.DjrHy5wu.css +1 -0
  19. package/build/client/_app/immutable/assets/8.DjrHy5wu.css.br +0 -0
  20. package/build/client/_app/immutable/assets/8.DjrHy5wu.css.gz +0 -0
  21. package/build/client/_app/immutable/assets/AuthGate.B8fOC_pJ.css +1 -0
  22. package/build/client/_app/immutable/assets/AuthGate.B8fOC_pJ.css.br +0 -0
  23. package/build/client/_app/immutable/assets/AuthGate.B8fOC_pJ.css.gz +0 -0
  24. package/build/client/_app/immutable/assets/ModeSwitch.RmRIDur-.css +1 -0
  25. package/build/client/_app/immutable/assets/ModeSwitch.RmRIDur-.css.br +0 -0
  26. package/build/client/_app/immutable/assets/ModeSwitch.RmRIDur-.css.gz +0 -0
  27. package/build/client/_app/immutable/assets/VoiceProfileSelector.CM_o2XIa.css +1 -0
  28. package/build/client/_app/immutable/assets/VoiceProfileSelector.CM_o2XIa.css.br +0 -0
  29. package/build/client/_app/immutable/assets/VoiceProfileSelector.CM_o2XIa.css.gz +0 -0
  30. package/build/client/_app/immutable/chunks/BDFsK-cU.js +5 -0
  31. package/build/client/_app/immutable/chunks/BDFsK-cU.js.br +0 -0
  32. package/build/client/_app/immutable/chunks/BDFsK-cU.js.gz +0 -0
  33. package/build/client/_app/immutable/chunks/BOq4Y36A.js +1 -0
  34. package/build/client/_app/immutable/chunks/BOq4Y36A.js.br +0 -0
  35. package/build/client/_app/immutable/chunks/BOq4Y36A.js.gz +0 -0
  36. package/build/client/_app/immutable/chunks/Bdvti_5C.js +1 -0
  37. package/build/client/_app/immutable/chunks/Bdvti_5C.js.br +0 -0
  38. package/build/client/_app/immutable/chunks/Bdvti_5C.js.gz +0 -0
  39. package/build/client/_app/immutable/chunks/BuFlayix.js +1 -0
  40. package/build/client/_app/immutable/chunks/BuFlayix.js.br +0 -0
  41. package/build/client/_app/immutable/chunks/BuFlayix.js.gz +0 -0
  42. package/build/client/_app/immutable/chunks/BwTF6U35.js +3 -0
  43. package/build/client/_app/immutable/chunks/BwTF6U35.js.br +0 -0
  44. package/build/client/_app/immutable/chunks/BwTF6U35.js.gz +0 -0
  45. package/build/client/_app/immutable/chunks/CJkMgfFh.js +1 -0
  46. package/build/client/_app/immutable/chunks/CJkMgfFh.js.br +0 -0
  47. package/build/client/_app/immutable/chunks/CJkMgfFh.js.gz +0 -0
  48. package/build/client/_app/immutable/chunks/DQCVeARi.js +1 -0
  49. package/build/client/_app/immutable/chunks/DQCVeARi.js.br +0 -0
  50. package/build/client/_app/immutable/chunks/DQCVeARi.js.gz +0 -0
  51. package/build/client/_app/immutable/chunks/DpdFx-ph.js +1 -0
  52. package/build/client/_app/immutable/chunks/DpdFx-ph.js.br +0 -0
  53. package/build/client/_app/immutable/chunks/DpdFx-ph.js.gz +0 -0
  54. package/build/client/_app/immutable/chunks/kNaey6uv.js +1 -0
  55. package/build/client/_app/immutable/chunks/kNaey6uv.js.br +0 -0
  56. package/build/client/_app/immutable/chunks/kNaey6uv.js.gz +0 -0
  57. package/build/client/_app/immutable/chunks/os2NZ37U.js +1 -0
  58. package/build/client/_app/immutable/chunks/os2NZ37U.js.br +1 -0
  59. package/build/client/_app/immutable/chunks/os2NZ37U.js.gz +0 -0
  60. package/build/client/_app/immutable/chunks/xihTtKlq.js +1 -0
  61. package/build/client/_app/immutable/chunks/xihTtKlq.js.br +1 -0
  62. package/build/client/_app/immutable/chunks/xihTtKlq.js.gz +0 -0
  63. package/build/client/_app/immutable/entry/app.Coaz9qVz.js +2 -0
  64. package/build/client/_app/immutable/entry/app.Coaz9qVz.js.br +0 -0
  65. package/build/client/_app/immutable/entry/app.Coaz9qVz.js.gz +0 -0
  66. package/build/client/_app/immutable/entry/start.CaHQB6hU.js +1 -0
  67. package/build/client/_app/immutable/entry/start.CaHQB6hU.js.br +1 -0
  68. package/build/client/_app/immutable/entry/start.CaHQB6hU.js.gz +0 -0
  69. package/build/client/_app/immutable/nodes/0.BUaVTC13.js +1 -0
  70. package/build/client/_app/immutable/nodes/0.BUaVTC13.js.br +0 -0
  71. package/build/client/_app/immutable/nodes/0.BUaVTC13.js.gz +0 -0
  72. package/build/client/_app/immutable/nodes/1.DpM9NN8J.js +1 -0
  73. package/build/client/_app/immutable/nodes/1.DpM9NN8J.js.br +0 -0
  74. package/build/client/_app/immutable/nodes/1.DpM9NN8J.js.gz +0 -0
  75. package/build/client/_app/immutable/nodes/2.ojh8oE7F.js +1 -0
  76. package/build/client/_app/immutable/nodes/2.ojh8oE7F.js.br +0 -0
  77. package/build/client/_app/immutable/nodes/2.ojh8oE7F.js.gz +0 -0
  78. package/build/client/_app/immutable/nodes/3.DeAC3yVJ.js +1 -0
  79. package/build/client/_app/immutable/nodes/3.DeAC3yVJ.js.br +0 -0
  80. package/build/client/_app/immutable/nodes/3.DeAC3yVJ.js.gz +0 -0
  81. package/build/client/_app/immutable/nodes/4.8L-_wsn9.js +18 -0
  82. package/build/client/_app/immutable/nodes/4.8L-_wsn9.js.br +0 -0
  83. package/build/client/_app/immutable/nodes/4.8L-_wsn9.js.gz +0 -0
  84. package/build/client/_app/immutable/nodes/5.kb9iVd3S.js +4 -0
  85. package/build/client/_app/immutable/nodes/5.kb9iVd3S.js.br +0 -0
  86. package/build/client/_app/immutable/nodes/5.kb9iVd3S.js.gz +0 -0
  87. package/build/client/_app/immutable/nodes/6.DtmDzmki.js +1 -0
  88. package/build/client/_app/immutable/nodes/6.DtmDzmki.js.br +0 -0
  89. package/build/client/_app/immutable/nodes/6.DtmDzmki.js.gz +0 -0
  90. package/build/client/_app/immutable/nodes/7.-Pv5Qce0.js +15 -0
  91. package/build/client/_app/immutable/nodes/7.-Pv5Qce0.js.br +0 -0
  92. package/build/client/_app/immutable/nodes/7.-Pv5Qce0.js.gz +0 -0
  93. package/build/client/_app/immutable/nodes/8.Rc3xcFgu.js +2 -0
  94. package/build/client/_app/immutable/nodes/8.Rc3xcFgu.js.br +0 -0
  95. package/build/client/_app/immutable/nodes/8.Rc3xcFgu.js.gz +0 -0
  96. package/build/client/_app/version.json +1 -0
  97. package/build/client/_app/version.json.br +1 -0
  98. package/build/client/_app/version.json.gz +0 -0
  99. package/build/client/banner.png +0 -0
  100. package/build/client/fu-128.png +0 -0
  101. package/build/client/fu.png +0 -0
  102. package/build/client/logo-128.png +0 -0
  103. package/build/client/logo.png +0 -0
  104. package/build/client/setup/wizard.css +1639 -0
  105. package/build/client/setup/wizard.css.br +0 -0
  106. package/build/client/setup/wizard.css.gz +0 -0
  107. package/build/client/wizard-128.png +0 -0
  108. package/build/client/wizard.png +0 -0
  109. package/build/env.js +94 -0
  110. package/build/handler.js +1494 -0
  111. package/build/index.js +345 -0
  112. package/build/server/chunks/0-TTdZdv8o.js +9 -0
  113. package/build/server/chunks/0-TTdZdv8o.js.map +1 -0
  114. package/build/server/chunks/1-XPMbcj69.js +9 -0
  115. package/build/server/chunks/1-XPMbcj69.js.map +1 -0
  116. package/build/server/chunks/2-C2y4ydWU.js +9 -0
  117. package/build/server/chunks/2-C2y4ydWU.js.map +1 -0
  118. package/build/server/chunks/3-BgeGdVvT.js +23 -0
  119. package/build/server/chunks/3-BgeGdVvT.js.map +1 -0
  120. package/build/server/chunks/4-v8u4eatk.js +9 -0
  121. package/build/server/chunks/4-v8u4eatk.js.map +1 -0
  122. package/build/server/chunks/5-BkUoZ2K4.js +9 -0
  123. package/build/server/chunks/5-BkUoZ2K4.js.map +1 -0
  124. package/build/server/chunks/6-Cep4AGS2.js +9 -0
  125. package/build/server/chunks/6-Cep4AGS2.js.map +1 -0
  126. package/build/server/chunks/7-DOEFGynd.js +9 -0
  127. package/build/server/chunks/7-DOEFGynd.js.map +1 -0
  128. package/build/server/chunks/8-EJHw3wqt.js +9 -0
  129. package/build/server/chunks/8-EJHw3wqt.js.map +1 -0
  130. package/build/server/chunks/AuthGate-UhfWI3rb.js +741 -0
  131. package/build/server/chunks/AuthGate-UhfWI3rb.js.map +1 -0
  132. package/build/server/chunks/ModeSwitch-S3I-WINb.js +15 -0
  133. package/build/server/chunks/ModeSwitch-S3I-WINb.js.map +1 -0
  134. package/build/server/chunks/_helpers-B_lb4-jB.js +74 -0
  135. package/build/server/chunks/_helpers-B_lb4-jB.js.map +1 -0
  136. package/build/server/chunks/_layout.svelte-B93aaRP_.js +11 -0
  137. package/build/server/chunks/_layout.svelte-B93aaRP_.js.map +1 -0
  138. package/build/server/chunks/_layout.svelte-CcloHuB_.js +60 -0
  139. package/build/server/chunks/_layout.svelte-CcloHuB_.js.map +1 -0
  140. package/build/server/chunks/_page.svelte-9RQ3rYiU.js +69 -0
  141. package/build/server/chunks/_page.svelte-9RQ3rYiU.js.map +1 -0
  142. package/build/server/chunks/_page.svelte-BP2EdQl3.js +5 -0
  143. package/build/server/chunks/_page.svelte-BP2EdQl3.js.map +1 -0
  144. package/build/server/chunks/_page.svelte-CKARhLvT.js +408 -0
  145. package/build/server/chunks/_page.svelte-CKARhLvT.js.map +1 -0
  146. package/build/server/chunks/_page.svelte-CnZsPxgJ.js +5540 -0
  147. package/build/server/chunks/_page.svelte-CnZsPxgJ.js.map +1 -0
  148. package/build/server/chunks/_page.svelte-D0gMlmzQ.js +104 -0
  149. package/build/server/chunks/_page.svelte-D0gMlmzQ.js.map +1 -0
  150. package/build/server/chunks/_page.svelte-pxsCzB7-.js +106 -0
  151. package/build/server/chunks/_page.svelte-pxsCzB7-.js.map +1 -0
  152. package/build/server/chunks/_server.ts-33LuQvHu.js +19 -0
  153. package/build/server/chunks/_server.ts-33LuQvHu.js.map +1 -0
  154. package/build/server/chunks/_server.ts-5CjguYY3.js +514 -0
  155. package/build/server/chunks/_server.ts-5CjguYY3.js.map +1 -0
  156. package/build/server/chunks/_server.ts-B3tjtq2m.js +64 -0
  157. package/build/server/chunks/_server.ts-B3tjtq2m.js.map +1 -0
  158. package/build/server/chunks/_server.ts-B4N5gO26.js +70 -0
  159. package/build/server/chunks/_server.ts-B4N5gO26.js.map +1 -0
  160. package/build/server/chunks/_server.ts-B6FENZO7.js +82 -0
  161. package/build/server/chunks/_server.ts-B6FENZO7.js.map +1 -0
  162. package/build/server/chunks/_server.ts-B8JtVHLy.js +41 -0
  163. package/build/server/chunks/_server.ts-B8JtVHLy.js.map +1 -0
  164. package/build/server/chunks/_server.ts-BR9OrjcE.js +68 -0
  165. package/build/server/chunks/_server.ts-BR9OrjcE.js.map +1 -0
  166. package/build/server/chunks/_server.ts-BYVcXj0z.js +107 -0
  167. package/build/server/chunks/_server.ts-BYVcXj0z.js.map +1 -0
  168. package/build/server/chunks/_server.ts-BYdXdnje.js +97 -0
  169. package/build/server/chunks/_server.ts-BYdXdnje.js.map +1 -0
  170. package/build/server/chunks/_server.ts-BaxRyhZ8.js +44 -0
  171. package/build/server/chunks/_server.ts-BaxRyhZ8.js.map +1 -0
  172. package/build/server/chunks/_server.ts-BclZ3UFT.js +41 -0
  173. package/build/server/chunks/_server.ts-BclZ3UFT.js.map +1 -0
  174. package/build/server/chunks/_server.ts-Bd_I8GjG.js +60 -0
  175. package/build/server/chunks/_server.ts-Bd_I8GjG.js.map +1 -0
  176. package/build/server/chunks/_server.ts-Bdry_CdG.js +33 -0
  177. package/build/server/chunks/_server.ts-Bdry_CdG.js.map +1 -0
  178. package/build/server/chunks/_server.ts-Bg8OpPuA.js +65 -0
  179. package/build/server/chunks/_server.ts-Bg8OpPuA.js.map +1 -0
  180. package/build/server/chunks/_server.ts-BjrO7pvn.js +73 -0
  181. package/build/server/chunks/_server.ts-BjrO7pvn.js.map +1 -0
  182. package/build/server/chunks/_server.ts-BkoJOqrr.js +70 -0
  183. package/build/server/chunks/_server.ts-BkoJOqrr.js.map +1 -0
  184. package/build/server/chunks/_server.ts-Bl0YOh50.js +40 -0
  185. package/build/server/chunks/_server.ts-Bl0YOh50.js.map +1 -0
  186. package/build/server/chunks/_server.ts-BmZlEy27.js +55 -0
  187. package/build/server/chunks/_server.ts-BmZlEy27.js.map +1 -0
  188. package/build/server/chunks/_server.ts-Bq2S1OMq.js +163 -0
  189. package/build/server/chunks/_server.ts-Bq2S1OMq.js.map +1 -0
  190. package/build/server/chunks/_server.ts-BwHojI4i.js +59 -0
  191. package/build/server/chunks/_server.ts-BwHojI4i.js.map +1 -0
  192. package/build/server/chunks/_server.ts-C-lN2ZUO.js +33 -0
  193. package/build/server/chunks/_server.ts-C-lN2ZUO.js.map +1 -0
  194. package/build/server/chunks/_server.ts-C1DcK_rP.js +200 -0
  195. package/build/server/chunks/_server.ts-C1DcK_rP.js.map +1 -0
  196. package/build/server/chunks/_server.ts-C1y3X6iK.js +52 -0
  197. package/build/server/chunks/_server.ts-C1y3X6iK.js.map +1 -0
  198. package/build/server/chunks/_server.ts-C5s-OXCm.js +79 -0
  199. package/build/server/chunks/_server.ts-C5s-OXCm.js.map +1 -0
  200. package/build/server/chunks/_server.ts-CAKTZL2t.js +63 -0
  201. package/build/server/chunks/_server.ts-CAKTZL2t.js.map +1 -0
  202. package/build/server/chunks/_server.ts-CDtOOD3Q.js +83 -0
  203. package/build/server/chunks/_server.ts-CDtOOD3Q.js.map +1 -0
  204. package/build/server/chunks/_server.ts-CG409cWi.js +46 -0
  205. package/build/server/chunks/_server.ts-CG409cWi.js.map +1 -0
  206. package/build/server/chunks/_server.ts-CJL8da0o.js +56 -0
  207. package/build/server/chunks/_server.ts-CJL8da0o.js.map +1 -0
  208. package/build/server/chunks/_server.ts-CLBKpKeH.js +204 -0
  209. package/build/server/chunks/_server.ts-CLBKpKeH.js.map +1 -0
  210. package/build/server/chunks/_server.ts-CLiYOnOv.js +50 -0
  211. package/build/server/chunks/_server.ts-CLiYOnOv.js.map +1 -0
  212. package/build/server/chunks/_server.ts-CMvY0ZDz.js +101 -0
  213. package/build/server/chunks/_server.ts-CMvY0ZDz.js.map +1 -0
  214. package/build/server/chunks/_server.ts-CQqURrHY.js +41 -0
  215. package/build/server/chunks/_server.ts-CQqURrHY.js.map +1 -0
  216. package/build/server/chunks/_server.ts-CSgPjCYv.js +79 -0
  217. package/build/server/chunks/_server.ts-CSgPjCYv.js.map +1 -0
  218. package/build/server/chunks/_server.ts-C_fNO73y.js +44 -0
  219. package/build/server/chunks/_server.ts-C_fNO73y.js.map +1 -0
  220. package/build/server/chunks/_server.ts-CcTt5aAs.js +41 -0
  221. package/build/server/chunks/_server.ts-CcTt5aAs.js.map +1 -0
  222. package/build/server/chunks/_server.ts-CfLbEufw.js +53 -0
  223. package/build/server/chunks/_server.ts-CfLbEufw.js.map +1 -0
  224. package/build/server/chunks/_server.ts-CqHMhINi.js +53 -0
  225. package/build/server/chunks/_server.ts-CqHMhINi.js.map +1 -0
  226. package/build/server/chunks/_server.ts-CrU9r7-F.js +88 -0
  227. package/build/server/chunks/_server.ts-CrU9r7-F.js.map +1 -0
  228. package/build/server/chunks/_server.ts-CtZuKotA.js +70 -0
  229. package/build/server/chunks/_server.ts-CtZuKotA.js.map +1 -0
  230. package/build/server/chunks/_server.ts-D-sjM5kn.js +103 -0
  231. package/build/server/chunks/_server.ts-D-sjM5kn.js.map +1 -0
  232. package/build/server/chunks/_server.ts-D2wlMMJl.js +41 -0
  233. package/build/server/chunks/_server.ts-D2wlMMJl.js.map +1 -0
  234. package/build/server/chunks/_server.ts-D7L27_xI.js +65 -0
  235. package/build/server/chunks/_server.ts-D7L27_xI.js.map +1 -0
  236. package/build/server/chunks/_server.ts-DMKIHwKi.js +90 -0
  237. package/build/server/chunks/_server.ts-DMKIHwKi.js.map +1 -0
  238. package/build/server/chunks/_server.ts-DTyZan5L.js +33 -0
  239. package/build/server/chunks/_server.ts-DTyZan5L.js.map +1 -0
  240. package/build/server/chunks/_server.ts-DVekHgMN.js +96 -0
  241. package/build/server/chunks/_server.ts-DVekHgMN.js.map +1 -0
  242. package/build/server/chunks/_server.ts-DWLkr6Qg.js +54 -0
  243. package/build/server/chunks/_server.ts-DWLkr6Qg.js.map +1 -0
  244. package/build/server/chunks/_server.ts-DWN6TJv0.js +149 -0
  245. package/build/server/chunks/_server.ts-DWN6TJv0.js.map +1 -0
  246. package/build/server/chunks/_server.ts-D_dO8hvJ.js +56 -0
  247. package/build/server/chunks/_server.ts-D_dO8hvJ.js.map +1 -0
  248. package/build/server/chunks/_server.ts-Da9y6lio.js +82 -0
  249. package/build/server/chunks/_server.ts-Da9y6lio.js.map +1 -0
  250. package/build/server/chunks/_server.ts-DbO3cg55.js +54 -0
  251. package/build/server/chunks/_server.ts-DbO3cg55.js.map +1 -0
  252. package/build/server/chunks/_server.ts-DclRsTpW.js +44 -0
  253. package/build/server/chunks/_server.ts-DclRsTpW.js.map +1 -0
  254. package/build/server/chunks/_server.ts-DdlF1vjy.js +159 -0
  255. package/build/server/chunks/_server.ts-DdlF1vjy.js.map +1 -0
  256. package/build/server/chunks/_server.ts-De7IOs2z.js +759 -0
  257. package/build/server/chunks/_server.ts-De7IOs2z.js.map +1 -0
  258. package/build/server/chunks/_server.ts-DmyOp1yq.js +40 -0
  259. package/build/server/chunks/_server.ts-DmyOp1yq.js.map +1 -0
  260. package/build/server/chunks/_server.ts-DnKTcT9x.js +46 -0
  261. package/build/server/chunks/_server.ts-DnKTcT9x.js.map +1 -0
  262. package/build/server/chunks/_server.ts-Dq82kHyx.js +72 -0
  263. package/build/server/chunks/_server.ts-Dq82kHyx.js.map +1 -0
  264. package/build/server/chunks/_server.ts-DqVJ1NqI.js +55 -0
  265. package/build/server/chunks/_server.ts-DqVJ1NqI.js.map +1 -0
  266. package/build/server/chunks/_server.ts-DzWtvjem.js +46 -0
  267. package/build/server/chunks/_server.ts-DzWtvjem.js.map +1 -0
  268. package/build/server/chunks/_server.ts-EZS5Qan4.js +62 -0
  269. package/build/server/chunks/_server.ts-EZS5Qan4.js.map +1 -0
  270. package/build/server/chunks/_server.ts-I0iKpsyr.js +77 -0
  271. package/build/server/chunks/_server.ts-I0iKpsyr.js.map +1 -0
  272. package/build/server/chunks/_server.ts-P4pmd9NX.js +55 -0
  273. package/build/server/chunks/_server.ts-P4pmd9NX.js.map +1 -0
  274. package/build/server/chunks/_server.ts-UF_kxNaU.js +79 -0
  275. package/build/server/chunks/_server.ts-UF_kxNaU.js.map +1 -0
  276. package/build/server/chunks/_server.ts-b3mVtmkb.js +121 -0
  277. package/build/server/chunks/_server.ts-b3mVtmkb.js.map +1 -0
  278. package/build/server/chunks/_server.ts-dhkEt2p6.js +63 -0
  279. package/build/server/chunks/_server.ts-dhkEt2p6.js.map +1 -0
  280. package/build/server/chunks/_server.ts-eK_9jY-9.js +67 -0
  281. package/build/server/chunks/_server.ts-eK_9jY-9.js.map +1 -0
  282. package/build/server/chunks/_server.ts-fsEmx9mw.js +42 -0
  283. package/build/server/chunks/_server.ts-fsEmx9mw.js.map +1 -0
  284. package/build/server/chunks/_server.ts-l4CK3c4j.js +109 -0
  285. package/build/server/chunks/_server.ts-l4CK3c4j.js.map +1 -0
  286. package/build/server/chunks/_server.ts-otJRaSSq.js +139 -0
  287. package/build/server/chunks/_server.ts-otJRaSSq.js.map +1 -0
  288. package/build/server/chunks/_server.ts-rXhjnBtw.js +49 -0
  289. package/build/server/chunks/_server.ts-rXhjnBtw.js.map +1 -0
  290. package/build/server/chunks/_server.ts-wZ88P3nX.js +157 -0
  291. package/build/server/chunks/_server.ts-wZ88P3nX.js.map +1 -0
  292. package/build/server/chunks/_server.ts-xO4nhxDx.js +60 -0
  293. package/build/server/chunks/_server.ts-xO4nhxDx.js.map +1 -0
  294. package/build/server/chunks/_server.ts-yimewsjO.js +57 -0
  295. package/build/server/chunks/_server.ts-yimewsjO.js.map +1 -0
  296. package/build/server/chunks/addon-helpers-BpnH-GEc.js +49 -0
  297. package/build/server/chunks/addon-helpers-BpnH-GEc.js.map +1 -0
  298. package/build/server/chunks/chunk-CLZ62Ad-.js +18 -0
  299. package/build/server/chunks/chunk-CLZ62Ad-.js.map +1 -0
  300. package/build/server/chunks/coercion-TNFJisCC.js +34 -0
  301. package/build/server/chunks/coercion-TNFJisCC.js.map +1 -0
  302. package/build/server/chunks/config-0LFudKuE.js +121 -0
  303. package/build/server/chunks/config-0LFudKuE.js.map +1 -0
  304. package/build/server/chunks/dev-DjANv7AF.js +4389 -0
  305. package/build/server/chunks/dev-DjANv7AF.js.map +1 -0
  306. package/build/server/chunks/docker-B23w4kr6.js +20 -0
  307. package/build/server/chunks/docker-B23w4kr6.js.map +1 -0
  308. package/build/server/chunks/endpoints-Drq_J-2Z.js +340 -0
  309. package/build/server/chunks/endpoints-Drq_J-2Z.js.map +1 -0
  310. package/build/server/chunks/error.svelte-ByNznOuj.js +16 -0
  311. package/build/server/chunks/error.svelte-ByNznOuj.js.map +1 -0
  312. package/build/server/chunks/exports-D1quPX8S.js +124 -0
  313. package/build/server/chunks/exports-D1quPX8S.js.map +1 -0
  314. package/build/server/chunks/helpers-CX6xRBmt.js +226 -0
  315. package/build/server/chunks/helpers-CX6xRBmt.js.map +1 -0
  316. package/build/server/chunks/hooks.server-BEVMYNQ4.js +86 -0
  317. package/build/server/chunks/hooks.server-BEVMYNQ4.js.map +1 -0
  318. package/build/server/chunks/http-VqOG8hyj.js +31 -0
  319. package/build/server/chunks/http-VqOG8hyj.js.map +1 -0
  320. package/build/server/chunks/internal-CeK24Lte.js +1544 -0
  321. package/build/server/chunks/internal-CeK24Lte.js.map +1 -0
  322. package/build/server/chunks/serial-queue-D9FEpYVv.js +22 -0
  323. package/build/server/chunks/serial-queue-D9FEpYVv.js.map +1 -0
  324. package/build/server/chunks/setup-deploy-B4oSSFYi.js +529 -0
  325. package/build/server/chunks/setup-deploy-B4oSSFYi.js.map +1 -0
  326. package/build/server/chunks/src-BkvQ5Uuf.js +14082 -0
  327. package/build/server/chunks/src-BkvQ5Uuf.js.map +1 -0
  328. package/build/server/chunks/state-D7JS-l_D.js +203 -0
  329. package/build/server/chunks/state-D7JS-l_D.js.map +1 -0
  330. package/build/server/chunks/theme-state.svelte-PtPMmKGN.js +520 -0
  331. package/build/server/chunks/theme-state.svelte-PtPMmKGN.js.map +1 -0
  332. package/build/server/chunks/utils-BSRjJDrZ.js +150 -0
  333. package/build/server/chunks/utils-BSRjJDrZ.js.map +1 -0
  334. package/build/server/index.js +4389 -0
  335. package/build/server/index.js.map +1 -0
  336. package/build/server/manifest.js +584 -0
  337. package/build/server/manifest.js.map +1 -0
  338. package/build/shims.js +32 -0
  339. package/package.json +68 -0
@@ -0,0 +1,741 @@
1
+ import { d as attr, p as escape_html, m as derived, e as attr_class, n as ensure_array_like } from './dev-DjANv7AF.js';
2
+ import { o as onDestroy, p as page } from './state-D7JS-l_D.js';
3
+ import { b as fetchEndpoints, k as setActiveEndpoint, l as listSessions, j as getSessionMessages, c as createSession, s as sendChatMessage, v as voiceState, m as speakText, o as stopSpeaking, d as destroyVoice, t as themeService } from './theme-state.svelte-PtPMmKGN.js';
4
+
5
+ //#region src/lib/components/ThemeToggle.svelte
6
+ function ThemeToggle($$renderer, $$props) {
7
+ $$renderer.component(($$renderer) => {
8
+ const isDark = derived(() => themeService.resolved === "dark");
9
+ const label = derived(() => isDark() ? "Switch to light mode" : "Switch to dark mode");
10
+ $$renderer.push(`<button type="button" class="theme-toggle svelte-1cmi4dh"${attr("aria-label", label())}${attr("aria-pressed", isDark())}${attr("title", label())}>`);
11
+ if (isDark()) {
12
+ $$renderer.push("<!--[0-->");
13
+ $$renderer.push(`<svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg>`);
14
+ } else {
15
+ $$renderer.push("<!--[-1-->");
16
+ $$renderer.push(`<svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"></path></svg>`);
17
+ }
18
+ $$renderer.push(`<!--]--></button>`);
19
+ });
20
+ }
21
+ //#endregion
22
+ //#region src/lib/chat/session-events.ts
23
+ var INITIAL_BACKOFF_MS = 1e3;
24
+ var MAX_BACKOFF_MS = 3e4;
25
+ var STREAM_URL = "/proxy/assistant/event";
26
+ /**
27
+ * Parse one `\n\n`-delimited SSE frame. Multi-line `data:` fields are
28
+ * concatenated with `\n` per the SSE spec.
29
+ */
30
+ function parseFrame(chunk) {
31
+ const frame = {};
32
+ const dataLines = [];
33
+ for (const rawLine of chunk.split("\n")) {
34
+ if (!rawLine || rawLine.startsWith(":")) continue;
35
+ if (rawLine.startsWith("data:")) dataLines.push(rawLine.replace(/^data:\s?/, ""));
36
+ else if (rawLine.startsWith("event:")) frame.event = rawLine.replace(/^event:\s?/, "");
37
+ else if (rawLine.startsWith("id:")) frame.id = rawLine.replace(/^id:\s?/, "");
38
+ }
39
+ if (dataLines.length > 0) frame.data = dataLines.join("\n");
40
+ return frame;
41
+ }
42
+ function dispatch(handlers, payload) {
43
+ const info = payload.properties?.info;
44
+ const id = info?.id;
45
+ if (!id) return;
46
+ switch (payload.type) {
47
+ case "session.created":
48
+ handlers.onCreated(id);
49
+ return;
50
+ case "session.updated":
51
+ handlers.onUpdated(id, {
52
+ title: info?.title,
53
+ updatedAt: info?.time?.updated
54
+ });
55
+ return;
56
+ case "session.deleted":
57
+ handlers.onDeleted(id);
58
+ return;
59
+ default: return;
60
+ }
61
+ }
62
+ /**
63
+ * Open an SSE connection to `/proxy/assistant/event` and dispatch
64
+ * session-scoped events. Returns an unsubscribe function that aborts the
65
+ * stream and prevents reconnection.
66
+ */
67
+ function subscribeSessionEvents(handlers) {
68
+ let stopped = false;
69
+ let controller = new AbortController();
70
+ let lastEventId;
71
+ const sleep = (ms) => new Promise((resolve) => {
72
+ const timer = setTimeout(resolve, ms);
73
+ controller.signal.addEventListener("abort", () => {
74
+ clearTimeout(timer);
75
+ resolve();
76
+ }, { once: true });
77
+ });
78
+ async function readStream() {
79
+ const headers = { accept: "text/event-stream" };
80
+ if (lastEventId !== void 0) headers["Last-Event-ID"] = lastEventId;
81
+ const response = await fetch(STREAM_URL, {
82
+ method: "GET",
83
+ headers,
84
+ credentials: "include",
85
+ signal: controller.signal
86
+ });
87
+ if (!response.ok || !response.body) throw new Error(`SSE stream failed: ${response.status} ${response.statusText}`);
88
+ handlers.onConnect?.();
89
+ const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
90
+ let buffer = "";
91
+ try {
92
+ while (true) {
93
+ const { done, value } = await reader.read();
94
+ if (done) break;
95
+ buffer += value;
96
+ const chunks = buffer.split("\n\n");
97
+ buffer = chunks.pop() ?? "";
98
+ for (const chunk of chunks) {
99
+ if (!chunk) continue;
100
+ const frame = parseFrame(chunk);
101
+ if (frame.id !== void 0) lastEventId = frame.id;
102
+ if (!frame.data) continue;
103
+ let payload;
104
+ try {
105
+ payload = JSON.parse(frame.data);
106
+ } catch (err) {
107
+ console.warn("[session-events] Bad JSON in SSE frame", err);
108
+ continue;
109
+ }
110
+ dispatch(handlers, payload);
111
+ }
112
+ }
113
+ } finally {
114
+ try {
115
+ reader.releaseLock();
116
+ } catch {}
117
+ }
118
+ }
119
+ (async () => {
120
+ let attempt = 0;
121
+ while (!stopped) try {
122
+ attempt++;
123
+ await readStream();
124
+ attempt = 0;
125
+ if (!stopped) await sleep(500);
126
+ } catch (err) {
127
+ if (stopped) return;
128
+ const error = err instanceof Error ? err : new Error(String(err));
129
+ if (error.name !== "AbortError") {
130
+ console.warn("[session-events] SSE error, reconnecting", error);
131
+ handlers.onDisconnect?.(error);
132
+ }
133
+ await sleep(Math.min(INITIAL_BACKOFF_MS * 2 ** Math.max(0, attempt - 1), MAX_BACKOFF_MS));
134
+ if (controller.signal.aborted && !stopped) controller = new AbortController();
135
+ }
136
+ })();
137
+ return () => {
138
+ stopped = true;
139
+ try {
140
+ controller.abort();
141
+ } catch {}
142
+ };
143
+ }
144
+ //#endregion
145
+ //#region src/lib/chat/chat-state.svelte.ts
146
+ function emptyEndpointState() {
147
+ return {
148
+ sessions: [],
149
+ sessionsLoaded: false,
150
+ sessionsLoading: false,
151
+ sessionsError: "",
152
+ activeSessionId: null
153
+ };
154
+ }
155
+ var ChatService = class {
156
+ /**
157
+ * Per-endpoint session cache. Reassigned on every mutation so Svelte 5
158
+ * picks up the change. Never mutate the existing Map in place.
159
+ */
160
+ byEndpoint = /* @__PURE__ */ new Map();
161
+ /**
162
+ * Mirrored from `endpointsService.activeId` via `onEndpointChanged()`
163
+ * so the chat layer doesn't have to import the endpoint store.
164
+ */
165
+ activeEndpointId = "default";
166
+ /** Messages for the currently rendered session only. */
167
+ entries = [];
168
+ entriesLoading = false;
169
+ sending = false;
170
+ error = "";
171
+ /**
172
+ * Set true while the SSE event stream is connected. Surfaced by the
173
+ * SessionPicker as a tiny green/gray dot so the operator can see at a
174
+ * glance whether live updates are flowing.
175
+ */
176
+ liveConnected = false;
177
+ /**
178
+ * Active SSE subscription handle. Reassigned on every endpoint switch.
179
+ * Plain field (not `$state`) — only the chat service touches it.
180
+ */
181
+ _unsubscribeEvents = null;
182
+ #activeSessionId = derived(() => this.byEndpoint.get(this.activeEndpointId)?.activeSessionId ?? null);
183
+ get activeSessionId() {
184
+ return this.#activeSessionId();
185
+ }
186
+ set activeSessionId($$value) {
187
+ return this.#activeSessionId($$value);
188
+ }
189
+ setEndpointState(id, patch) {
190
+ const next = {
191
+ ...this.byEndpoint.get(id) ?? emptyEndpointState(),
192
+ ...patch
193
+ };
194
+ this.byEndpoint = new Map(this.byEndpoint).set(id, next);
195
+ return next;
196
+ }
197
+ /**
198
+ * Handle an endpoint switch: load sessions, restore prior or pick
199
+ * newest, fetch messages. Mid-generation switches are blocked.
200
+ */
201
+ async onEndpointChanged(id) {
202
+ if (this.sending) {
203
+ this.error = "Wait for the current reply to finish before switching.";
204
+ return;
205
+ }
206
+ this.activeEndpointId = id;
207
+ this.entries = [];
208
+ this.error = "";
209
+ if (!this.byEndpoint.get(id)?.sessionsLoaded) await this.loadSessions();
210
+ const state = this.byEndpoint.get(id) ?? emptyEndpointState();
211
+ const sessions = state.sessions;
212
+ const previous = state.activeSessionId;
213
+ let nextSessionId = null;
214
+ if (previous && sessions.some((s) => s.id === previous)) nextSessionId = previous;
215
+ else if (sessions.length > 0) nextSessionId = sessions[0].id;
216
+ if (nextSessionId !== state.activeSessionId) this.setEndpointState(id, { activeSessionId: nextSessionId });
217
+ if (nextSessionId) await this.openSession(nextSessionId);
218
+ this._resubscribeEvents();
219
+ }
220
+ /**
221
+ * Tear down any prior SSE subscription and open a new one. Handlers
222
+ * dispatch session.created / updated / deleted into the per-endpoint
223
+ * cache, mirroring out-of-band changes (CLI, other clients).
224
+ */
225
+ _resubscribeEvents() {
226
+ if (this._unsubscribeEvents) {
227
+ try {
228
+ this._unsubscribeEvents();
229
+ } catch (err) {
230
+ console.warn("[chat] failed to unsubscribe from previous event stream", err);
231
+ }
232
+ this._unsubscribeEvents = null;
233
+ }
234
+ this.liveConnected = false;
235
+ this._unsubscribeEvents = subscribeSessionEvents({
236
+ onCreated: (id) => {
237
+ this._onSessionCreated(id);
238
+ },
239
+ onUpdated: (id, info) => {
240
+ this._onSessionUpdated(id, info);
241
+ },
242
+ onDeleted: (id) => {
243
+ this._onSessionDeleted(id);
244
+ },
245
+ onConnect: () => {
246
+ this.liveConnected = true;
247
+ },
248
+ onDisconnect: () => {
249
+ this.liveConnected = false;
250
+ }
251
+ });
252
+ }
253
+ /**
254
+ * A session was created out-of-band — prepend to the active endpoint's
255
+ * list if not already known. Do not auto-switch to it: the user owns
256
+ * navigation.
257
+ */
258
+ _onSessionCreated(sessionId) {
259
+ const endpointId = this.activeEndpointId;
260
+ const prev = this.byEndpoint.get(endpointId) ?? emptyEndpointState();
261
+ if (prev.sessions.some((s) => s.id === sessionId)) return;
262
+ const now = Date.now();
263
+ const summary = {
264
+ id: sessionId,
265
+ title: "",
266
+ createdAt: now,
267
+ updatedAt: now
268
+ };
269
+ this.setEndpointState(endpointId, {
270
+ sessions: [summary, ...prev.sessions],
271
+ sessionsLoaded: true
272
+ });
273
+ }
274
+ /**
275
+ * A session was touched out-of-band — patch its updatedAt (and title if
276
+ * the event carries one) and re-sort. Do NOT refetch messages: if the
277
+ * user is viewing this session, leave the in-memory entries alone for
278
+ * v1. A follow-up phase can reconcile message deltas via the assistant
279
+ * event stream.
280
+ */
281
+ _onSessionUpdated(sessionId, info) {
282
+ const endpointId = this.activeEndpointId;
283
+ const prev = this.byEndpoint.get(endpointId);
284
+ if (!prev) return;
285
+ const idx = prev.sessions.findIndex((s) => s.id === sessionId);
286
+ if (idx === -1) return;
287
+ const existing = prev.sessions[idx];
288
+ const sessions = [{
289
+ ...existing,
290
+ title: info?.title ?? existing.title,
291
+ updatedAt: info?.updatedAt ?? Date.now()
292
+ }, ...prev.sessions.filter((s) => s.id !== sessionId)];
293
+ sessions.sort((a, b) => b.updatedAt - a.updatedAt);
294
+ this.setEndpointState(endpointId, { sessions });
295
+ }
296
+ /**
297
+ * A session was deleted out-of-band. Remove it from the list; if it was
298
+ * the active session, fall back to the newest remaining session (or
299
+ * null) and reload its messages.
300
+ */
301
+ async _onSessionDeleted(sessionId) {
302
+ const endpointId = this.activeEndpointId;
303
+ const prev = this.byEndpoint.get(endpointId);
304
+ if (!prev) return;
305
+ if (!prev.sessions.some((s) => s.id === sessionId)) return;
306
+ const sessions = prev.sessions.filter((s) => s.id !== sessionId);
307
+ const wasActive = prev.activeSessionId === sessionId;
308
+ const nextActive = wasActive ? sessions[0]?.id ?? null : prev.activeSessionId;
309
+ this.setEndpointState(endpointId, {
310
+ sessions,
311
+ activeSessionId: nextActive
312
+ });
313
+ if (wasActive) {
314
+ this.entries = [];
315
+ if (nextActive) await this.openSession(nextActive);
316
+ }
317
+ }
318
+ /** Fetch the session list for the active endpoint. */
319
+ async loadSessions() {
320
+ const id = this.activeEndpointId;
321
+ this.setEndpointState(id, {
322
+ sessionsLoading: true,
323
+ sessionsError: ""
324
+ });
325
+ try {
326
+ const sessions = await listSessions();
327
+ this.setEndpointState(id, {
328
+ sessions,
329
+ sessionsLoaded: true,
330
+ sessionsLoading: false,
331
+ sessionsError: ""
332
+ });
333
+ } catch (e) {
334
+ const err = e;
335
+ const message = err.status === 503 || err.status === 502 ? "Assistant is not reachable." : err.message ?? "Failed to load sessions.";
336
+ this.setEndpointState(id, {
337
+ sessionsLoading: false,
338
+ sessionsError: message
339
+ });
340
+ }
341
+ }
342
+ /** Select a session and render its messages. */
343
+ async openSession(sessionId) {
344
+ if (this.sending) {
345
+ this.error = "Wait for the current reply to finish before switching.";
346
+ return;
347
+ }
348
+ const endpointId = this.activeEndpointId;
349
+ this.setEndpointState(endpointId, { activeSessionId: sessionId });
350
+ this.entries = [];
351
+ this.entriesLoading = true;
352
+ this.error = "";
353
+ try {
354
+ const messages = await getSessionMessages(sessionId);
355
+ if (this.activeEndpointId === endpointId && this.byEndpoint.get(endpointId)?.activeSessionId === sessionId) this.entries = messages;
356
+ } catch (e) {
357
+ const err = e;
358
+ if (err.status === 503 || err.status === 502) this.error = "Assistant is not reachable. Try reconnecting.";
359
+ else if (err.status === 401) this.error = "Sign-in required.";
360
+ else this.error = err.message ?? "Failed to load messages.";
361
+ } finally {
362
+ this.entriesLoading = false;
363
+ }
364
+ }
365
+ /** Create a new session on the active endpoint and select it. */
366
+ async startNewSession() {
367
+ if (this.sending) {
368
+ this.error = "Wait for the current reply to finish before switching.";
369
+ return null;
370
+ }
371
+ const endpointId = this.activeEndpointId;
372
+ this.error = "";
373
+ try {
374
+ const { id } = await createSession();
375
+ const now = Date.now();
376
+ const summary = {
377
+ id,
378
+ title: "",
379
+ createdAt: now,
380
+ updatedAt: now
381
+ };
382
+ const prev = this.byEndpoint.get(endpointId) ?? emptyEndpointState();
383
+ this.setEndpointState(endpointId, {
384
+ sessions: [summary, ...prev.sessions.filter((s) => s.id !== id)],
385
+ sessionsLoaded: true,
386
+ activeSessionId: id
387
+ });
388
+ this.entries = [];
389
+ return id;
390
+ } catch (e) {
391
+ const err = e;
392
+ this.error = `Failed to start session: ${err.message ?? "unknown error"}`;
393
+ return null;
394
+ }
395
+ }
396
+ /**
397
+ * Send a message in the active session. If none is active, create one
398
+ * first (matches the "zero sessions" empty-state flow).
399
+ */
400
+ async send(text) {
401
+ if (this.sending) return;
402
+ const trimmed = text.trim();
403
+ if (!trimmed) return;
404
+ let sessionId = this.activeSessionId;
405
+ if (!sessionId) {
406
+ sessionId = await this.startNewSession();
407
+ if (!sessionId) return;
408
+ }
409
+ const userEntry = {
410
+ id: crypto.randomUUID(),
411
+ role: "user",
412
+ text: trimmed,
413
+ timestamp: Date.now()
414
+ };
415
+ this.entries = [...this.entries, userEntry];
416
+ this.error = "";
417
+ this.sending = true;
418
+ try {
419
+ const replyText = (await sendChatMessage(sessionId, trimmed)).parts.filter((p) => p.type === "text" && p.text).map((p) => p.text ?? "").join("");
420
+ const assistantEntry = {
421
+ id: crypto.randomUUID(),
422
+ role: "assistant",
423
+ text: replyText || "(no response)",
424
+ timestamp: Date.now()
425
+ };
426
+ this.entries = [...this.entries, assistantEntry];
427
+ const endpointId = this.activeEndpointId;
428
+ const prev = this.byEndpoint.get(endpointId);
429
+ if (prev) {
430
+ const now = Date.now();
431
+ const existing = prev.sessions.find((s) => s.id === sessionId);
432
+ const updated = existing ? {
433
+ ...existing,
434
+ updatedAt: now
435
+ } : {
436
+ id: sessionId,
437
+ title: "",
438
+ createdAt: now,
439
+ updatedAt: now
440
+ };
441
+ const rest = prev.sessions.filter((s) => s.id !== sessionId);
442
+ this.setEndpointState(endpointId, { sessions: [updated, ...rest] });
443
+ }
444
+ if (voiceState.ttsSupported && voiceState.ttsAutoEnabled && replyText) speakText(replyText);
445
+ } catch (e) {
446
+ const err = e;
447
+ if (err.status === 503 || err.status === 502) {
448
+ this.error = "Assistant is not reachable. Try reconnecting.";
449
+ this.setEndpointState(this.activeEndpointId, { activeSessionId: null });
450
+ } else if (err.status === 401) this.error = "Sign-in required.";
451
+ else this.error = err.message ?? "Message failed.";
452
+ } finally {
453
+ this.sending = false;
454
+ }
455
+ }
456
+ reset() {
457
+ stopSpeaking();
458
+ this.entries = [];
459
+ this.error = "";
460
+ this.byEndpoint = /* @__PURE__ */ new Map();
461
+ if (this._unsubscribeEvents) {
462
+ try {
463
+ this._unsubscribeEvents();
464
+ } catch (err) {
465
+ console.warn("[chat] failed to unsubscribe from event stream during reset", err);
466
+ }
467
+ this._unsubscribeEvents = null;
468
+ }
469
+ this.liveConnected = false;
470
+ }
471
+ };
472
+ var chat = new ChatService();
473
+ //#endregion
474
+ //#region src/lib/endpoints-state.svelte.ts
475
+ var EndpointsService = class {
476
+ endpoints = [];
477
+ activeId = "default";
478
+ loading = false;
479
+ loaded = false;
480
+ error = "";
481
+ #active = derived(() => this.endpoints.find((e) => e.id === this.activeId) ?? this.endpoints[0] ?? null);
482
+ get active() {
483
+ return this.#active();
484
+ }
485
+ set active($$value) {
486
+ return this.#active($$value);
487
+ }
488
+ async load(force = false) {
489
+ if (this.loading) return;
490
+ if (this.loaded && !force) return;
491
+ this.loading = true;
492
+ this.error = "";
493
+ try {
494
+ const { endpoints, activeId } = await fetchEndpoints();
495
+ this.endpoints = endpoints;
496
+ this.activeId = activeId;
497
+ this.loaded = true;
498
+ } catch (e) {
499
+ const err = e;
500
+ if (err.status !== 401) this.error = err.message ?? "Failed to load endpoints";
501
+ } finally {
502
+ this.loading = false;
503
+ }
504
+ }
505
+ async activate(id) {
506
+ if (id === this.activeId) return;
507
+ if (chat.sending) {
508
+ this.error = "Wait for the current reply to finish before switching.";
509
+ throw new Error(this.error);
510
+ }
511
+ const previous = this.activeId;
512
+ this.activeId = id;
513
+ try {
514
+ await setActiveEndpoint(id);
515
+ await chat.onEndpointChanged(id);
516
+ } catch (e) {
517
+ this.activeId = previous;
518
+ const err = e;
519
+ this.error = err.message ?? "Failed to switch endpoint";
520
+ throw e;
521
+ }
522
+ }
523
+ };
524
+ var endpointsService = new EndpointsService();
525
+ //#endregion
526
+ //#region src/lib/components/EndpointSwitcher.svelte
527
+ function EndpointSwitcher($$renderer, $$props) {
528
+ $$renderer.component(($$renderer) => {
529
+ const menuId = "endpoint-menu";
530
+ let switching = false;
531
+ let isOpen = false;
532
+ const active = derived(() => endpointsService.active);
533
+ const endpoints = derived(() => endpointsService.endpoints);
534
+ const hasChoices = derived(() => endpoints().length > 1);
535
+ $$renderer.push(`<div class="switcher svelte-1gh51ee"><button type="button" class="trigger svelte-1gh51ee" id="endpoint-trigger"${attr("popovertarget", hasChoices() ? menuId : void 0)} aria-haspopup="menu"${attr("aria-expanded", isOpen)}${attr("aria-controls", menuId)}${attr("aria-label", active() ? `Assistant endpoint: ${active().label}` : "Assistant endpoints")}${attr("title", active() ? `Connected to: ${active().label} (${active().url})` : "Assistant endpoints")}${attr("disabled", endpointsService.loading, true)}><svg class="trigger-icon svelte-1gh51ee" aria-hidden="true" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect><rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect><line x1="6" y1="6" x2="6.01" y2="6"></line><line x1="6" y1="18" x2="6.01" y2="18"></line></svg> <span class="dot svelte-1gh51ee" aria-hidden="true"></span> <span class="label svelte-1gh51ee">${escape_html(active()?.label ?? "Endpoint…")}</span> <span class="caret svelte-1gh51ee" aria-hidden="true">▾</span></button> <div${attr("id", menuId)} class="menu svelte-1gh51ee" popover="auto" role="menu" tabindex="-1"><div class="menu-header svelte-1gh51ee">Assistant endpoint</div> <!--[-->`);
536
+ const each_array = ensure_array_like(endpoints());
537
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
538
+ let ep = each_array[$$index];
539
+ $$renderer.push(`<button type="button"${attr_class("menu-item svelte-1gh51ee", void 0, { "active": ep.id === active()?.id })} role="menuitemradio"${attr("aria-checked", ep.id === active()?.id)}${attr("popovertarget", menuId)} popovertargetaction="hide"${attr("disabled", switching, true)}><span class="check svelte-1gh51ee" aria-hidden="true">${escape_html(ep.id === active()?.id ? "●" : "○")}</span> <span class="menu-item-text svelte-1gh51ee"><span class="menu-item-label svelte-1gh51ee">${escape_html(ep.label)}</span> <span class="menu-item-url svelte-1gh51ee">${escape_html(ep.url)}</span></span></button>`);
540
+ }
541
+ $$renderer.push(`<!--]--> <div class="menu-divider svelte-1gh51ee"></div> <a class="menu-item link svelte-1gh51ee" href="/admin/endpoints" role="menuitem">Manage endpoints…</a></div></div>`);
542
+ });
543
+ }
544
+ //#endregion
545
+ //#region src/lib/components/SessionPicker.svelte
546
+ function SessionPicker($$renderer, $$props) {
547
+ $$renderer.component(($$renderer) => {
548
+ const menuId = "session-menu";
549
+ let isOpen = false;
550
+ const SESSION_LIST_CAP = 50;
551
+ const active = derived(() => endpointsService.active);
552
+ const endpointState = derived(() => active() ? chat.byEndpoint.get(active().id) ?? null : null);
553
+ const sessions = derived(() => endpointState()?.sessions ?? []);
554
+ const loading = derived(() => endpointState()?.sessionsLoading ?? false);
555
+ const error = derived(() => endpointState()?.sessionsError ?? "");
556
+ const activeSessionId = derived(() => chat.activeSessionId);
557
+ const activeSummary = derived(() => sessions().find((s) => s.id === activeSessionId()) ?? null);
558
+ const triggerLabel = derived(() => activeSummary() ? activeSummary().title || `Untitled · ${formatRelative(activeSummary().updatedAt)}` : "New session");
559
+ /**
560
+ * Live-updates indicator. True when the chat service's SSE stream to
561
+ * `/proxy/assistant/event` is connected — out-of-band session changes
562
+ * (CLI, other clients) will flow through. Shown as a tiny dot so the
563
+ * operator can tell at a glance whether the picker is reactive or
564
+ * snapshot.
565
+ */
566
+ const liveConnected = derived(() => chat.liveConnected);
567
+ const visibleSessions = derived(() => sessions().slice(0, SESSION_LIST_CAP));
568
+ const overflowCount = derived(() => Math.max(0, sessions().length - SESSION_LIST_CAP));
569
+ /**
570
+ * Tiny relative-time helper. No date-fns dep — that would be ~30 KB for
571
+ * 4 cases.
572
+ */
573
+ function formatRelative(ts) {
574
+ if (!ts) return "";
575
+ const diffSec = Math.max(0, (Date.now() - ts) / 1e3);
576
+ if (diffSec < 60) return "just now";
577
+ const min = Math.floor(diffSec / 60);
578
+ if (min < 60) return `${min}m ago`;
579
+ const hr = Math.floor(min / 60);
580
+ if (hr < 24) return `${hr}h ago`;
581
+ const day = Math.floor(hr / 24);
582
+ if (day === 1) return "yesterday";
583
+ if (day < 7) return `${day}d ago`;
584
+ const wk = Math.floor(day / 7);
585
+ if (wk < 5) return `${wk}w ago`;
586
+ const mo = Math.floor(day / 30);
587
+ if (mo < 12) return `${mo}mo ago`;
588
+ return `${Math.floor(day / 365)}y ago`;
589
+ }
590
+ $$renderer.push(`<div class="picker svelte-1owsj0q"><button type="button" class="trigger svelte-1owsj0q" id="session-trigger"${attr("popovertarget", menuId)} aria-haspopup="menu"${attr("aria-expanded", isOpen)}${attr("aria-controls", menuId)} aria-label="Sessions"${attr("title", triggerLabel())}><svg class="trigger-icon svelte-1owsj0q" aria-hidden="true" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 9a2 2 0 0 1-2 2H6l-4 4V4c0-1.1.9-2 2-2h8a2 2 0 0 1 2 2z"></path><path d="M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1"></path></svg> <span${attr_class("dot svelte-1owsj0q", void 0, { "connected": liveConnected() })} aria-hidden="true"${attr("title", liveConnected() ? "Live updates connected" : "Live updates disconnected")}></span> <span class="label svelte-1owsj0q">${escape_html(triggerLabel())}</span> <span class="caret svelte-1owsj0q" aria-hidden="true">▾</span></button> <div${attr("id", menuId)} class="menu svelte-1owsj0q" popover="auto" role="menu" tabindex="-1"><div class="menu-header svelte-1owsj0q">Sessions on ${escape_html(active()?.label ?? "this endpoint")}</div> `);
591
+ if (chat.sending) {
592
+ $$renderer.push("<!--[0-->");
593
+ $$renderer.push(`<div class="notice svelte-1owsj0q">Wait for the current reply to finish before switching.</div>`);
594
+ } else $$renderer.push("<!--[-1-->");
595
+ $$renderer.push(`<!--]--> <button type="button" class="menu-item new-btn svelte-1owsj0q" role="menuitem"${attr("popovertarget", menuId)} popovertargetaction="hide"${attr("disabled", chat.sending, true)}><span class="check svelte-1owsj0q" aria-hidden="true">+</span> <span class="menu-item-text svelte-1owsj0q"><span class="menu-item-label svelte-1owsj0q">New session</span></span></button> <div class="menu-divider svelte-1owsj0q"></div> `);
596
+ if (loading()) {
597
+ $$renderer.push("<!--[0-->");
598
+ $$renderer.push(`<div class="empty svelte-1owsj0q"><span class="spinner svelte-1owsj0q" aria-hidden="true"></span> <span>Loading sessions…</span></div>`);
599
+ } else if (error()) {
600
+ $$renderer.push("<!--[1-->");
601
+ $$renderer.push(`<div class="error svelte-1owsj0q"><span class="svelte-1owsj0q">${escape_html(error())}</span> <button type="button" class="retry-btn svelte-1owsj0q">Retry</button></div>`);
602
+ } else if (sessions().length === 0) {
603
+ $$renderer.push("<!--[2-->");
604
+ $$renderer.push(`<div class="empty svelte-1owsj0q">No sessions yet. Start the first one.</div>`);
605
+ } else {
606
+ $$renderer.push("<!--[-1-->");
607
+ $$renderer.push(`<div class="session-list svelte-1owsj0q" role="none"><!--[-->`);
608
+ const each_array = ensure_array_like(visibleSessions());
609
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
610
+ let s = each_array[$$index];
611
+ $$renderer.push(`<button type="button"${attr_class("menu-item session-item svelte-1owsj0q", void 0, { "active": s.id === activeSessionId() })} role="menuitemradio"${attr("aria-checked", s.id === activeSessionId())}${attr("popovertarget", menuId)} popovertargetaction="hide"${attr("disabled", chat.sending, true)}><span class="check svelte-1owsj0q" aria-hidden="true">${escape_html(s.id === activeSessionId() ? "●" : "○")}</span> <span class="menu-item-text svelte-1owsj0q"><span class="menu-item-label svelte-1owsj0q">${escape_html(s.title || "Untitled")}</span> <span class="menu-item-meta svelte-1owsj0q">${escape_html(formatRelative(s.updatedAt))}</span></span></button>`);
612
+ }
613
+ $$renderer.push(`<!--]--></div> `);
614
+ if (overflowCount() > 0) {
615
+ $$renderer.push("<!--[0-->");
616
+ $$renderer.push(`<button type="button" class="show-all svelte-1owsj0q">Show all (${escape_html(overflowCount())} more)</button>`);
617
+ } else $$renderer.push("<!--[-1-->");
618
+ $$renderer.push(`<!--]-->`);
619
+ }
620
+ $$renderer.push(`<!--]--></div></div>`);
621
+ });
622
+ }
623
+ //#endregion
624
+ //#region src/lib/components/VoiceControl.svelte
625
+ function VoiceControl($$renderer, $$props) {
626
+ $$renderer.component(($$renderer) => {
627
+ const MAX_INTERIM_CHARS = 48;
628
+ let mounted = false;
629
+ onDestroy(() => {
630
+ destroyVoice();
631
+ });
632
+ let supported = derived(() => mounted);
633
+ let ttsAvailable = derived(() => mounted);
634
+ let isRecording = derived(() => voiceState.status === "recording");
635
+ let isTranscribing = derived(() => voiceState.status === "transcribing");
636
+ let isProcessing = derived(() => !isRecording() && !isTranscribing() && chat.sending);
637
+ let isSpeaking = derived(() => voiceState.status === "speaking");
638
+ $$renderer.push(`<div class="voice-control svelte-1a5q9sh" role="toolbar" aria-label="Voice controls">`);
639
+ if (isRecording() && voiceState.interimTranscript) {
640
+ $$renderer.push("<!--[0-->");
641
+ $$renderer.push(`<span class="voice-interim svelte-1a5q9sh" aria-hidden="true"${attr("title", voiceState.interimTranscript)}>${escape_html(voiceState.interimTranscript.length > MAX_INTERIM_CHARS ? voiceState.interimTranscript.slice(0, MAX_INTERIM_CHARS) + "…" : voiceState.interimTranscript)}</span>`);
642
+ } else $$renderer.push("<!--[-1-->");
643
+ $$renderer.push(`<!--]--> `);
644
+ if (voiceState.autoplayBlocked) {
645
+ $$renderer.push("<!--[0-->");
646
+ $$renderer.push(`<button type="button" class="voice-autoplay-banner svelte-1a5q9sh" aria-label="Resume paused audio" title="Audio was blocked by the browser. Click to resume."><svg aria-hidden="true" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1a5q9sh"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" class="svelte-1a5q9sh"></polygon><line x1="23" y1="9" x2="17" y2="15" class="svelte-1a5q9sh"></line><line x1="17" y1="9" x2="23" y2="15" class="svelte-1a5q9sh"></line></svg> <span class="svelte-1a5q9sh">Audio paused — click to resume</span></button>`);
647
+ } else $$renderer.push("<!--[-1-->");
648
+ $$renderer.push(`<!--]--> `);
649
+ if (ttsAvailable()) {
650
+ $$renderer.push("<!--[0-->");
651
+ $$renderer.push(`<button${attr_class("voice-btn svelte-1a5q9sh", void 0, {
652
+ "voice-btn-on": voiceState.ttsAutoEnabled,
653
+ "voice-btn-speaking": isSpeaking()
654
+ })}${attr("aria-label", voiceState.ttsAutoEnabled ? "Turn off spoken responses" : "Turn on spoken responses")}${attr("aria-pressed", voiceState.ttsAutoEnabled)}${attr("title", isSpeaking() ? "Speaking — click to turn off spoken responses" : voiceState.ttsAutoEnabled ? "Spoken responses are on — click to turn off" : "Spoken responses are off — click to turn on")}><svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1a5q9sh"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" class="svelte-1a5q9sh"></polygon>`);
655
+ if (voiceState.ttsAutoEnabled) {
656
+ $$renderer.push("<!--[0-->");
657
+ $$renderer.push(`<path d="M15.54 8.46a5 5 0 0 1 0 7.07"${attr_class("svelte-1a5q9sh", void 0, { "wave-anim": isSpeaking() })}></path><path d="M19.07 4.93a10 10 0 0 1 0 14.14"${attr_class("svelte-1a5q9sh", void 0, { "wave-anim-2": isSpeaking() })}></path>`);
658
+ } else {
659
+ $$renderer.push("<!--[-1-->");
660
+ $$renderer.push(`<line x1="23" y1="9" x2="17" y2="15" class="svelte-1a5q9sh"></line><line x1="17" y1="9" x2="23" y2="15" class="svelte-1a5q9sh"></line>`);
661
+ }
662
+ $$renderer.push(`<!--]--></svg></button>`);
663
+ } else $$renderer.push("<!--[-1-->");
664
+ $$renderer.push(`<!--]--> <button${attr_class("voice-btn svelte-1a5q9sh", void 0, {
665
+ "voice-btn-active": isRecording(),
666
+ "voice-btn-processing": isProcessing() || isTranscribing(),
667
+ "voice-btn-disabled": !supported()
668
+ })}${attr("disabled", !supported() || isProcessing(), true)}${attr("aria-label", !supported() ? "Voice input unavailable" : isRecording() ? "Stop recording" : isTranscribing() ? "Transcribing…" : isProcessing() ? "Sending message…" : "Start recording")}${attr("aria-pressed", isRecording())}${attr("title", !supported() ? "Voice input is unavailable — no speech-to-text engine is configured for this browser" : isRecording() ? "Stop recording" : isTranscribing() ? "Transcribing…" : isProcessing() ? "Sending message…" : "Speak — message will be sent to the selected assistant")}>`);
669
+ if (!supported()) {
670
+ $$renderer.push("<!--[0-->");
671
+ $$renderer.push(`<svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1a5q9sh"><line x1="1" y1="1" x2="23" y2="23" class="svelte-1a5q9sh"></line><path d="M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6" class="svelte-1a5q9sh"></path><path d="M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23" class="svelte-1a5q9sh"></path><line x1="12" y1="19" x2="12" y2="23" class="svelte-1a5q9sh"></line><line x1="8" y1="23" x2="16" y2="23" class="svelte-1a5q9sh"></line></svg>`);
672
+ } else if (isTranscribing() || isProcessing()) {
673
+ $$renderer.push("<!--[1-->");
674
+ $$renderer.push(`<span class="voice-spinner svelte-1a5q9sh" aria-hidden="true"></span>`);
675
+ } else if (isRecording()) {
676
+ $$renderer.push("<!--[2-->");
677
+ $$renderer.push(`<svg aria-hidden="true" width="14" height="14" viewBox="0 0 24 24" fill="currentColor" class="svelte-1a5q9sh"><rect x="6" y="6" width="12" height="12" rx="1.5" class="svelte-1a5q9sh"></rect></svg> <span class="voice-pulse svelte-1a5q9sh" aria-hidden="true"></span>`);
678
+ } else {
679
+ $$renderer.push("<!--[-1-->");
680
+ $$renderer.push(`<svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1a5q9sh"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" class="svelte-1a5q9sh"></path><path d="M19 10v2a7 7 0 0 1-14 0v-2" class="svelte-1a5q9sh"></path><line x1="12" y1="19" x2="12" y2="23" class="svelte-1a5q9sh"></line><line x1="8" y1="23" x2="16" y2="23" class="svelte-1a5q9sh"></line></svg>`);
681
+ }
682
+ $$renderer.push(`<!--]--></button> <span class="sr-only svelte-1a5q9sh" aria-live="polite">${escape_html(isRecording() && voiceState.interimTranscript ? voiceState.interimTranscript : isRecording() ? "Recording" : isTranscribing() ? "Transcribing" : isProcessing() ? "Sending message to assistant" : isSpeaking() ? "Assistant is speaking" : voiceState.ttsAutoEnabled ? "Spoken responses on" : "")}</span></div>`);
683
+ });
684
+ }
685
+ //#endregion
686
+ //#region src/lib/components/Navbar.svelte
687
+ function Navbar($$renderer, $$props) {
688
+ $$renderer.component(($$renderer) => {
689
+ const pathname = derived(() => page.url?.pathname ?? "");
690
+ const onAdmin = derived(() => pathname() === "/admin" || pathname().startsWith("/admin/"));
691
+ const isLocalAssistant = derived(() => {
692
+ const url = endpointsService.active?.url ?? "";
693
+ if (!url) return true;
694
+ try {
695
+ const host = new URL(url).hostname;
696
+ return host === "localhost" || host === "127.0.0.1" || host === "::1" || host === "host.docker.internal";
697
+ } catch {
698
+ return true;
699
+ }
700
+ });
701
+ $$renderer.push(`<header class="navbar svelte-rfuq4y"><div class="navbar-inner svelte-rfuq4y"><a class="navbar-brand svelte-rfuq4y" href="/chat" aria-label="OpenPalm — go to chat"><span class="brand-icon svelte-rfuq4y" aria-hidden="true"><img src="/logo-128.png" alt="" class="svelte-rfuq4y"/></span> <span class="brand-text svelte-rfuq4y">OpenPalm</span></a> <div class="navbar-actions svelte-rfuq4y">`);
702
+ if (isLocalAssistant()) {
703
+ $$renderer.push("<!--[0-->");
704
+ $$renderer.push(`<a href="/admin"${attr_class("gear-btn svelte-rfuq4y", void 0, { "active": onAdmin() })} aria-label="Settings &amp; administration"${attr("aria-current", onAdmin() ? "page" : void 0)} title="Manage this machine"><svg aria-hidden="true" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-rfuq4y"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></a>`);
705
+ } else $$renderer.push("<!--[-1-->");
706
+ $$renderer.push(`<!--]--> `);
707
+ EndpointSwitcher($$renderer);
708
+ $$renderer.push(`<!----> `);
709
+ SessionPicker($$renderer);
710
+ $$renderer.push(`<!----> `);
711
+ ThemeToggle($$renderer);
712
+ $$renderer.push(`<!----> `);
713
+ VoiceControl($$renderer);
714
+ $$renderer.push(`<!----></div></div></header>`);
715
+ });
716
+ }
717
+ //#endregion
718
+ //#region src/lib/components/AuthGate.svelte
719
+ function AuthGate($$renderer, $$props) {
720
+ $$renderer.component(($$renderer) => {
721
+ let { onSuccess, loading, error } = $$props;
722
+ let tokenInput = "";
723
+ $$renderer.push(`<main class="auth-gate svelte-1vviwqr" aria-label="Admin login gate"><section class="auth-card svelte-1vviwqr"><div class="auth-brand svelte-1vviwqr"><span class="brand-icon svelte-1vviwqr"><img src="/logo-128.png" alt="OpenPalm Logo" class="svelte-1vviwqr"/></span> <div><h1 class="svelte-1vviwqr">OpenPalm Console</h1> <p class="svelte-1vviwqr">Enter your admin password to unlock the control plane.</p></div></div> <form class="auth-form svelte-1vviwqr"><label for="admin-token" class="svelte-1vviwqr">Admin Password</label> <input type="text" name="username" autocomplete="username" value="admin" class="sr-only svelte-1vviwqr" tabindex="-1" aria-hidden="true"/> <div class="token-input-wrapper svelte-1vviwqr"><input id="admin-token" name="admin-token"${attr("type", "password")}${attr("value", tokenInput)} placeholder="Enter admin password" autocomplete="current-password" class="svelte-1vviwqr"/> <button type="button" class="btn-toggle svelte-1vviwqr"${attr("aria-label", "Show token")}>`);
724
+ $$renderer.push("<!--[-1-->");
725
+ $$renderer.push(`<svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle></svg>`);
726
+ $$renderer.push(`<!--]--></button></div> `);
727
+ if (error) {
728
+ $$renderer.push("<!--[0-->");
729
+ $$renderer.push(`<p class="auth-error svelte-1vviwqr" role="alert">${escape_html(error)}</p>`);
730
+ } else $$renderer.push("<!--[-1-->");
731
+ $$renderer.push(`<!--]--> <button class="btn btn-primary" type="submit"${attr("disabled", loading || !tokenInput.trim(), true)}>`);
732
+ if (loading) {
733
+ $$renderer.push("<!--[0-->");
734
+ $$renderer.push(`<span class="spinner"></span>`);
735
+ } else $$renderer.push("<!--[-1-->");
736
+ $$renderer.push(`<!--]--> Unlock Console</button></form></section></main>`);
737
+ });
738
+ }
739
+
740
+ export { AuthGate as A, Navbar as N, chat as c, endpointsService as e };
741
+ //# sourceMappingURL=AuthGate-UhfWI3rb.js.map