@openpalm/ui 0.11.0-rc.9 → 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.
- package/build/.openpalm-ui-version +1 -1
- package/build/client/_app/immutable/assets/0.CFC7xzus.css +1 -0
- package/build/client/_app/immutable/assets/0.CFC7xzus.css.br +0 -0
- package/build/client/_app/immutable/assets/0.CFC7xzus.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.B_s_XYKm.css +1 -0
- package/build/client/_app/immutable/assets/4.B_s_XYKm.css.br +0 -0
- package/build/client/_app/immutable/assets/4.B_s_XYKm.css.gz +0 -0
- package/build/client/_app/immutable/assets/6.Dr3r8AEl.css +1 -0
- package/build/client/_app/immutable/assets/6.Dr3r8AEl.css.br +0 -0
- package/build/client/_app/immutable/assets/6.Dr3r8AEl.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.DKl0e2Fb.css +1 -0
- package/build/client/_app/immutable/assets/7.DKl0e2Fb.css.br +0 -0
- package/build/client/_app/immutable/assets/7.DKl0e2Fb.css.gz +0 -0
- package/build/client/_app/immutable/assets/8.CY2RMSue.css +1 -0
- package/build/client/_app/immutable/assets/8.CY2RMSue.css.br +4 -0
- package/build/client/_app/immutable/assets/8.CY2RMSue.css.gz +0 -0
- package/build/client/_app/immutable/assets/9.Bg2RXe3B.css +1 -0
- package/build/client/_app/immutable/assets/9.Bg2RXe3B.css.br +0 -0
- package/build/client/_app/immutable/assets/9.Bg2RXe3B.css.gz +0 -0
- package/build/client/_app/immutable/assets/Navbar.Bnqciy-R.css +1 -0
- package/build/client/_app/immutable/assets/Navbar.Bnqciy-R.css.br +0 -0
- package/build/client/_app/immutable/assets/Navbar.Bnqciy-R.css.gz +0 -0
- package/build/client/_app/immutable/assets/Spinner.BtzHSsat.css +1 -0
- package/build/client/_app/immutable/assets/Spinner.BtzHSsat.css.br +2 -0
- package/build/client/_app/immutable/assets/Spinner.BtzHSsat.css.gz +0 -0
- package/build/client/_app/immutable/assets/VoiceProfileSelector.rd8K9qqK.css +1 -0
- package/build/client/_app/immutable/assets/VoiceProfileSelector.rd8K9qqK.css.br +0 -0
- package/build/client/_app/immutable/assets/VoiceProfileSelector.rd8K9qqK.css.gz +0 -0
- package/build/client/_app/immutable/chunks/0swOyi-5.js +3 -0
- package/build/client/_app/immutable/chunks/0swOyi-5.js.br +0 -0
- package/build/client/_app/immutable/chunks/0swOyi-5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BBdT9Cjm.js +1 -0
- package/build/client/_app/immutable/chunks/BBdT9Cjm.js.br +0 -0
- package/build/client/_app/immutable/chunks/BBdT9Cjm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BQ0vnNWj.js +1 -0
- package/build/client/_app/immutable/chunks/BQ0vnNWj.js.br +1 -0
- package/build/client/_app/immutable/chunks/BQ0vnNWj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bmfn2m9N.js +1 -0
- package/build/client/_app/immutable/chunks/Bmfn2m9N.js.br +1 -0
- package/build/client/_app/immutable/chunks/Bmfn2m9N.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BsFaG4Si.js +1 -0
- package/build/client/_app/immutable/chunks/BsFaG4Si.js.br +2 -0
- package/build/client/_app/immutable/chunks/BsFaG4Si.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C5xMso3V.js +1 -0
- package/build/client/_app/immutable/chunks/C5xMso3V.js.br +0 -0
- package/build/client/_app/immutable/chunks/C5xMso3V.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BuFlayix.js → CymRgjIC.js} +1 -1
- package/build/client/_app/immutable/chunks/CymRgjIC.js.br +0 -0
- package/build/client/_app/immutable/chunks/CymRgjIC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DPsWof9T.js +3 -0
- package/build/client/_app/immutable/chunks/DPsWof9T.js.br +0 -0
- package/build/client/_app/immutable/chunks/DPsWof9T.js.gz +0 -0
- package/build/client/_app/immutable/chunks/jhtvkF_A.js +1 -0
- package/build/client/_app/immutable/chunks/jhtvkF_A.js.br +0 -0
- package/build/client/_app/immutable/chunks/jhtvkF_A.js.gz +0 -0
- package/build/client/_app/immutable/chunks/s4upGypb.js +5 -0
- package/build/client/_app/immutable/chunks/s4upGypb.js.br +0 -0
- package/build/client/_app/immutable/chunks/s4upGypb.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.BhaNzXRa.js +2 -0
- package/build/client/_app/immutable/entry/app.BhaNzXRa.js.br +0 -0
- package/build/client/_app/immutable/entry/app.BhaNzXRa.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.mqdezZzO.js +1 -0
- package/build/client/_app/immutable/entry/start.mqdezZzO.js.br +0 -0
- package/build/client/_app/immutable/entry/start.mqdezZzO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.0pi4RS6G.js +1 -0
- package/build/client/_app/immutable/nodes/0.0pi4RS6G.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.0pi4RS6G.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.B8IsMtPo.js +1 -0
- package/build/client/_app/immutable/nodes/1.B8IsMtPo.js.br +1 -0
- package/build/client/_app/immutable/nodes/1.B8IsMtPo.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.B-8ehRO1.js +1 -0
- package/build/client/_app/immutable/nodes/2.B-8ehRO1.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.B-8ehRO1.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.B_FXzjZB.js +1 -0
- package/build/client/_app/immutable/nodes/3.B_FXzjZB.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.B_FXzjZB.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.Jf5TbLTF.js +19 -0
- package/build/client/_app/immutable/nodes/4.Jf5TbLTF.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.Jf5TbLTF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.BXOM2W9q.js +4 -0
- package/build/client/_app/immutable/nodes/5.BXOM2W9q.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.BXOM2W9q.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.fVxTNYsE.js +1 -0
- package/build/client/_app/immutable/nodes/6.fVxTNYsE.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.fVxTNYsE.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.E4FAL2cc.js +15 -0
- package/build/client/_app/immutable/nodes/7.E4FAL2cc.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.E4FAL2cc.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.By5-pJpM.js +1 -0
- package/build/client/_app/immutable/nodes/8.By5-pJpM.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.By5-pJpM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.HfUnLyFj.js +2 -0
- package/build/client/_app/immutable/nodes/9.HfUnLyFj.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.HfUnLyFj.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/setup/wizard.css +134 -389
- package/build/client/setup/wizard.css.br +0 -0
- package/build/client/setup/wizard.css.gz +0 -0
- package/build/server/chunks/0-BK7D9z9V.js +9 -0
- package/build/server/chunks/{0-BV-dSgKl.js.map → 0-BK7D9z9V.js.map} +1 -1
- package/build/server/chunks/1-DiEYpQIN.js +9 -0
- package/build/server/chunks/{1-BaC08_Sf.js.map → 1-DiEYpQIN.js.map} +1 -1
- package/build/server/chunks/2-DQWoUtW1.js +9 -0
- package/build/server/chunks/{2-C2y4ydWU.js.map → 2-DQWoUtW1.js.map} +1 -1
- package/build/server/chunks/{3-BgeGdVvT.js → 3-COIGgysA.js} +2 -2
- package/build/server/chunks/{3-BgeGdVvT.js.map → 3-COIGgysA.js.map} +1 -1
- package/build/server/chunks/4-pHqpXb3H.js +9 -0
- package/build/server/chunks/4-pHqpXb3H.js.map +1 -0
- package/build/server/chunks/5-D48D_0uX.js +9 -0
- package/build/server/chunks/5-D48D_0uX.js.map +1 -0
- package/build/server/chunks/6-CQ5NktVc.js +9 -0
- package/build/server/chunks/6-CQ5NktVc.js.map +1 -0
- package/build/server/chunks/7-Cbs2uIrU.js +9 -0
- package/build/server/chunks/7-Cbs2uIrU.js.map +1 -0
- package/build/server/chunks/8-Cp8CGb0N.js +35 -0
- package/build/server/chunks/8-Cp8CGb0N.js.map +1 -0
- package/build/server/chunks/9-BKnkc58p.js +9 -0
- package/build/server/chunks/9-BKnkc58p.js.map +1 -0
- package/build/server/chunks/Navbar-PVEly3CX.js +1003 -0
- package/build/server/chunks/Navbar-PVEly3CX.js.map +1 -0
- package/build/server/chunks/Spinner-Bk6e83RX.js +12 -0
- package/build/server/chunks/Spinner-Bk6e83RX.js.map +1 -0
- package/build/server/chunks/VoiceProfileSelector-CbOV_v5A.js +306 -0
- package/build/server/chunks/VoiceProfileSelector-CbOV_v5A.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-B93aaRP_.js → _layout.svelte-BV7A7zff.js} +2 -2
- package/build/server/chunks/{_layout.svelte-B93aaRP_.js.map → _layout.svelte-BV7A7zff.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-CcloHuB_.js → _layout.svelte-COQuY-BN.js} +8 -8
- package/build/server/chunks/_layout.svelte-COQuY-BN.js.map +1 -0
- package/build/server/chunks/{_page.svelte-24A1xNrb.js → _page.svelte-B1SlSu-R.js} +78 -81
- package/build/server/chunks/_page.svelte-B1SlSu-R.js.map +1 -0
- package/build/server/chunks/_page.svelte-BY2APmQv.js +27 -0
- package/build/server/chunks/_page.svelte-BY2APmQv.js.map +1 -0
- package/build/server/chunks/{_page.svelte-D0gMlmzQ.js → _page.svelte-CDCe-J7o.js} +9 -15
- package/build/server/chunks/_page.svelte-CDCe-J7o.js.map +1 -0
- package/build/server/chunks/_page.svelte-CF6Wb9iE.js +2590 -0
- package/build/server/chunks/_page.svelte-CF6Wb9iE.js.map +1 -0
- package/build/server/chunks/_page.svelte-DadWXVrr.js +70 -0
- package/build/server/chunks/_page.svelte-DadWXVrr.js.map +1 -0
- package/build/server/chunks/_page.svelte-DtrBTed5.js +37 -0
- package/build/server/chunks/_page.svelte-DtrBTed5.js.map +1 -0
- package/build/server/chunks/{_server.ts-UF_kxNaU.js → _server.ts-31Wp0zcV.js} +8 -8
- package/build/server/chunks/{_server.ts-UF_kxNaU.js.map → _server.ts-31Wp0zcV.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bdry_CdG.js → _server.ts-8c17N53a.js} +8 -8
- package/build/server/chunks/{_server.ts-Bdry_CdG.js.map → _server.ts-8c17N53a.js.map} +1 -1
- package/build/server/chunks/{_server.ts-rXhjnBtw.js → _server.ts-B0CeVe_2.js} +8 -8
- package/build/server/chunks/{_server.ts-rXhjnBtw.js.map → _server.ts-B0CeVe_2.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D_dO8hvJ.js → _server.ts-B2vBBz6Q.js} +8 -8
- package/build/server/chunks/{_server.ts-D_dO8hvJ.js.map → _server.ts-B2vBBz6Q.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C1DcK_rP.js → _server.ts-B3uweiKb.js} +10 -10
- package/build/server/chunks/{_server.ts-C1DcK_rP.js.map → _server.ts-B3uweiKb.js.map} +1 -1
- package/build/server/chunks/_server.ts-B8pCRdwo.js +95 -0
- package/build/server/chunks/_server.ts-B8pCRdwo.js.map +1 -0
- package/build/server/chunks/{_server.ts-CLBKpKeH.js → _server.ts-BBsksu6b.js} +10 -10
- package/build/server/chunks/{_server.ts-CLBKpKeH.js.map → _server.ts-BBsksu6b.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DMKIHwKi.js → _server.ts-BDBz43vs.js} +8 -8
- package/build/server/chunks/{_server.ts-DMKIHwKi.js.map → _server.ts-BDBz43vs.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Da9y6lio.js → _server.ts-BLePivrN.js} +10 -10
- package/build/server/chunks/{_server.ts-Da9y6lio.js.map → _server.ts-BLePivrN.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DmyOp1yq.js → _server.ts-BMHPNIdu.js} +8 -8
- package/build/server/chunks/{_server.ts-DmyOp1yq.js.map → _server.ts-BMHPNIdu.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DdlF1vjy.js → _server.ts-BN3w-iUI.js} +8 -8
- package/build/server/chunks/{_server.ts-DdlF1vjy.js.map → _server.ts-BN3w-iUI.js.map} +1 -1
- package/build/server/chunks/{_server.ts-xO4nhxDx.js → _server.ts-BYUfQeRr.js} +10 -9
- package/build/server/chunks/_server.ts-BYUfQeRr.js.map +1 -0
- package/build/server/chunks/{_server.ts-BclZ3UFT.js → _server.ts-BdEX6joM.js} +8 -8
- package/build/server/chunks/{_server.ts-BclZ3UFT.js.map → _server.ts-BdEX6joM.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CAKTZL2t.js → _server.ts-Bde_Pi6A.js} +9 -9
- package/build/server/chunks/{_server.ts-CAKTZL2t.js.map → _server.ts-Bde_Pi6A.js.map} +1 -1
- package/build/server/chunks/{_server.ts-otJRaSSq.js → _server.ts-Bh_r4-Vs.js} +9 -9
- package/build/server/chunks/{_server.ts-otJRaSSq.js.map → _server.ts-Bh_r4-Vs.js.map} +1 -1
- package/build/server/chunks/{_server.ts-De7IOs2z.js → _server.ts-Big7vXEo.js} +7 -7
- package/build/server/chunks/{_server.ts-De7IOs2z.js.map → _server.ts-Big7vXEo.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CfLbEufw.js → _server.ts-Bl-41j0D.js} +8 -8
- package/build/server/chunks/{_server.ts-CfLbEufw.js.map → _server.ts-Bl-41j0D.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C_fNO73y.js → _server.ts-BnWc1lOg.js} +8 -8
- package/build/server/chunks/{_server.ts-C_fNO73y.js.map → _server.ts-BnWc1lOg.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bg8OpPuA.js → _server.ts-BoQ46bw9.js} +9 -9
- package/build/server/chunks/{_server.ts-Bg8OpPuA.js.map → _server.ts-BoQ46bw9.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D2wlMMJl.js → _server.ts-BwgtyrgF.js} +11 -11
- package/build/server/chunks/_server.ts-BwgtyrgF.js.map +1 -0
- package/build/server/chunks/{_server.ts-BjrO7pvn.js → _server.ts-By47s5kb.js} +9 -9
- package/build/server/chunks/{_server.ts-BjrO7pvn.js.map → _server.ts-By47s5kb.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CtZuKotA.js → _server.ts-C-9V_-cK.js} +31 -8
- package/build/server/chunks/_server.ts-C-9V_-cK.js.map +1 -0
- package/build/server/chunks/{_server.ts-B8JtVHLy.js → _server.ts-C-xID91b.js} +8 -8
- package/build/server/chunks/{_server.ts-B8JtVHLy.js.map → _server.ts-C-xID91b.js.map} +1 -1
- package/build/server/chunks/{_server.ts-wZ88P3nX.js → _server.ts-C1GoICVF.js} +10 -10
- package/build/server/chunks/{_server.ts-wZ88P3nX.js.map → _server.ts-C1GoICVF.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D7L27_xI.js → _server.ts-C25PdnDT.js} +5 -5
- package/build/server/chunks/{_server.ts-D7L27_xI.js.map → _server.ts-C25PdnDT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dq82kHyx.js → _server.ts-CCwIt_KL.js} +8 -8
- package/build/server/chunks/{_server.ts-Dq82kHyx.js.map → _server.ts-CCwIt_KL.js.map} +1 -1
- package/build/server/chunks/_server.ts-CKNmPEUu.js +101 -0
- package/build/server/chunks/_server.ts-CKNmPEUu.js.map +1 -0
- package/build/server/chunks/{_server.ts-DVekHgMN.js → _server.ts-COMRHDN4.js} +11 -10
- package/build/server/chunks/_server.ts-COMRHDN4.js.map +1 -0
- package/build/server/chunks/{_server.ts-CqHMhINi.js → _server.ts-CU1go_Ga.js} +8 -8
- package/build/server/chunks/{_server.ts-CqHMhINi.js.map → _server.ts-CU1go_Ga.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BaxRyhZ8.js → _server.ts-CbZzxQR_.js} +8 -8
- package/build/server/chunks/{_server.ts-BaxRyhZ8.js.map → _server.ts-CbZzxQR_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DclRsTpW.js → _server.ts-Cm9oppJJ.js} +8 -8
- package/build/server/chunks/{_server.ts-DclRsTpW.js.map → _server.ts-Cm9oppJJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BwHojI4i.js → _server.ts-CmMcnrpu.js} +6 -6
- package/build/server/chunks/{_server.ts-BwHojI4i.js.map → _server.ts-CmMcnrpu.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CrU9r7-F.js → _server.ts-CqkM3R41.js} +8 -8
- package/build/server/chunks/{_server.ts-CrU9r7-F.js.map → _server.ts-CqkM3R41.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B6FENZO7.js → _server.ts-Cszg5Fas.js} +8 -8
- package/build/server/chunks/{_server.ts-B6FENZO7.js.map → _server.ts-Cszg5Fas.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bd_I8GjG.js → _server.ts-CxJxINit.js} +8 -8
- package/build/server/chunks/{_server.ts-Bd_I8GjG.js.map → _server.ts-CxJxINit.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DnKTcT9x.js → _server.ts-D-9t8-nD.js} +7 -7
- package/build/server/chunks/{_server.ts-DnKTcT9x.js.map → _server.ts-D-9t8-nD.js.map} +1 -1
- package/build/server/chunks/{_server.ts-EZS5Qan4.js → _server.ts-D1bJgR3K.js} +8 -8
- package/build/server/chunks/{_server.ts-EZS5Qan4.js.map → _server.ts-D1bJgR3K.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BYdXdnje.js → _server.ts-D2DzSUG5.js} +8 -8
- package/build/server/chunks/{_server.ts-BYdXdnje.js.map → _server.ts-D2DzSUG5.js.map} +1 -1
- package/build/server/chunks/{_server.ts-eK_9jY-9.js → _server.ts-D2HqJdkr.js} +8 -8
- package/build/server/chunks/{_server.ts-eK_9jY-9.js.map → _server.ts-D2HqJdkr.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CSgPjCYv.js → _server.ts-D2QOo_fa.js} +8 -8
- package/build/server/chunks/{_server.ts-CSgPjCYv.js.map → _server.ts-D2QOo_fa.js.map} +1 -1
- package/build/server/chunks/{_server.ts-dhkEt2p6.js → _server.ts-D4Vu3KCM.js} +8 -8
- package/build/server/chunks/{_server.ts-dhkEt2p6.js.map → _server.ts-D4Vu3KCM.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CG409cWi.js → _server.ts-D68iKpcP.js} +8 -8
- package/build/server/chunks/{_server.ts-CG409cWi.js.map → _server.ts-D68iKpcP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DTyZan5L.js → _server.ts-D7vymw_o.js} +8 -8
- package/build/server/chunks/{_server.ts-DTyZan5L.js.map → _server.ts-D7vymw_o.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B3tjtq2m.js → _server.ts-DL9CCFsk.js} +8 -8
- package/build/server/chunks/{_server.ts-B3tjtq2m.js.map → _server.ts-DL9CCFsk.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bq2S1OMq.js → _server.ts-DSBUjxDK.js} +8 -8
- package/build/server/chunks/{_server.ts-Bq2S1OMq.js.map → _server.ts-DSBUjxDK.js.map} +1 -1
- package/build/server/chunks/{_server.ts-fsEmx9mw.js → _server.ts-DSlYMYYk.js} +8 -8
- package/build/server/chunks/{_server.ts-fsEmx9mw.js.map → _server.ts-DSlYMYYk.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DzWtvjem.js → _server.ts-DTJuIcDg.js} +8 -8
- package/build/server/chunks/{_server.ts-DzWtvjem.js.map → _server.ts-DTJuIcDg.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C1y3X6iK.js → _server.ts-DUmy4wsR.js} +9 -9
- package/build/server/chunks/{_server.ts-C1y3X6iK.js.map → _server.ts-DUmy4wsR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-5CjguYY3.js → _server.ts-DfFo95a7.js} +8 -8
- package/build/server/chunks/{_server.ts-5CjguYY3.js.map → _server.ts-DfFo95a7.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DqVJ1NqI.js → _server.ts-Dfx9HNlr.js} +10 -11
- package/build/server/chunks/_server.ts-Dfx9HNlr.js.map +1 -0
- package/build/server/chunks/{_server.ts-yimewsjO.js → _server.ts-DgQDDDEz.js} +8 -8
- package/build/server/chunks/{_server.ts-yimewsjO.js.map → _server.ts-DgQDDDEz.js.map} +1 -1
- package/build/server/chunks/{_server.ts-l4CK3c4j.js → _server.ts-DgZ2d-BT.js} +8 -8
- package/build/server/chunks/{_server.ts-l4CK3c4j.js.map → _server.ts-DgZ2d-BT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CQqURrHY.js → _server.ts-DijnYBzX.js} +8 -8
- package/build/server/chunks/{_server.ts-CQqURrHY.js.map → _server.ts-DijnYBzX.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CDtOOD3Q.js → _server.ts-DlzI77bJ.js} +8 -8
- package/build/server/chunks/{_server.ts-CDtOOD3Q.js.map → _server.ts-DlzI77bJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bl0YOh50.js → _server.ts-DnBzi352.js} +8 -8
- package/build/server/chunks/{_server.ts-Bl0YOh50.js.map → _server.ts-DnBzi352.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CLiYOnOv.js → _server.ts-Dnh6b7-J.js} +8 -8
- package/build/server/chunks/{_server.ts-CLiYOnOv.js.map → _server.ts-Dnh6b7-J.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B4N5gO26.js → _server.ts-Dvh0Hoso.js} +8 -8
- package/build/server/chunks/{_server.ts-B4N5gO26.js.map → _server.ts-Dvh0Hoso.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CJL8da0o.js → _server.ts-DwB3oRpy.js} +8 -8
- package/build/server/chunks/{_server.ts-CJL8da0o.js.map → _server.ts-DwB3oRpy.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BkoJOqrr.js → _server.ts-DxGR3bmq.js} +7 -7
- package/build/server/chunks/{_server.ts-BkoJOqrr.js.map → _server.ts-DxGR3bmq.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C-lN2ZUO.js → _server.ts-DzbC2VQR.js} +6 -6
- package/build/server/chunks/{_server.ts-C-lN2ZUO.js.map → _server.ts-DzbC2VQR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-P4pmd9NX.js → _server.ts-GxTTkaRQ.js} +8 -8
- package/build/server/chunks/{_server.ts-P4pmd9NX.js.map → _server.ts-GxTTkaRQ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-I0iKpsyr.js → _server.ts-K4R4Q6b_.js} +9 -9
- package/build/server/chunks/{_server.ts-I0iKpsyr.js.map → _server.ts-K4R4Q6b_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BR9OrjcE.js → _server.ts-MNOR6YaX.js} +8 -8
- package/build/server/chunks/{_server.ts-BR9OrjcE.js.map → _server.ts-MNOR6YaX.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D-sjM5kn.js → _server.ts-MtHT_432.js} +8 -8
- package/build/server/chunks/{_server.ts-D-sjM5kn.js.map → _server.ts-MtHT_432.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DbO3cg55.js → _server.ts-Om-m3OOe.js} +8 -8
- package/build/server/chunks/{_server.ts-DbO3cg55.js.map → _server.ts-Om-m3OOe.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DWN6TJv0.js → _server.ts-URUUrX13.js} +7 -15
- package/build/server/chunks/_server.ts-URUUrX13.js.map +1 -0
- package/build/server/chunks/{_server.ts-C5s-OXCm.js → _server.ts-__ul4l8J.js} +8 -8
- package/build/server/chunks/_server.ts-__ul4l8J.js.map +1 -0
- package/build/server/chunks/{_server.ts-BmZlEy27.js → _server.ts-oqC79KoF.js} +8 -8
- package/build/server/chunks/{_server.ts-BmZlEy27.js.map → _server.ts-oqC79KoF.js.map} +1 -1
- package/build/server/chunks/{_server.ts-b3mVtmkb.js → _server.ts-w34_y9d_.js} +8 -8
- package/build/server/chunks/{_server.ts-b3mVtmkb.js.map → _server.ts-w34_y9d_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DWLkr6Qg.js → _server.ts-yvQ-qjyI.js} +8 -8
- package/build/server/chunks/{_server.ts-DWLkr6Qg.js.map → _server.ts-yvQ-qjyI.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CcTt5aAs.js → _server.ts-zHkS9Tnj.js} +6 -6
- package/build/server/chunks/{_server.ts-CcTt5aAs.js.map → _server.ts-zHkS9Tnj.js.map} +1 -1
- package/build/server/chunks/{addon-helpers-BpnH-GEc.js → addon-helpers-CZyPj8WN.js} +3 -3
- package/build/server/chunks/{addon-helpers-BpnH-GEc.js.map → addon-helpers-CZyPj8WN.js.map} +1 -1
- package/build/server/chunks/{state-D0tEXcn4.js → client-CiyZ88m2.js} +29 -56
- package/build/server/chunks/client-CiyZ88m2.js.map +1 -0
- package/build/server/chunks/{config-0LFudKuE.js → config-BKCgm_AV.js} +2 -2
- package/build/server/chunks/{config-0LFudKuE.js.map → config-BKCgm_AV.js.map} +1 -1
- package/build/server/chunks/{dev-DjANv7AF.js → dev-B6xUe35c.js} +23 -2
- package/build/server/chunks/dev-B6xUe35c.js.map +1 -0
- package/build/server/chunks/{docker-B23w4kr6.js → docker-8AuF7CwZ.js} +2 -2
- package/build/server/chunks/{docker-B23w4kr6.js.map → docker-8AuF7CwZ.js.map} +1 -1
- package/build/server/chunks/{endpoints-Drq_J-2Z.js → endpoints-DaDle7pk.js} +2 -2
- package/build/server/chunks/{endpoints-Drq_J-2Z.js.map → endpoints-DaDle7pk.js.map} +1 -1
- package/build/server/chunks/environment-Cp1uhq6U.js +36 -0
- package/build/server/chunks/environment-Cp1uhq6U.js.map +1 -0
- package/build/server/chunks/{error.svelte-B_yfxYYS.js → error.svelte-m6KMTHAJ.js} +6 -5
- package/build/server/chunks/{error.svelte-B_yfxYYS.js.map → error.svelte-m6KMTHAJ.js.map} +1 -1
- package/build/server/chunks/{helpers-CX6xRBmt.js → helpers-BACi22nU.js} +44 -8
- package/build/server/chunks/helpers-BACi22nU.js.map +1 -0
- package/build/server/chunks/{hooks.server-BEVMYNQ4.js → hooks.server-BdyM6mgJ.js} +23 -8
- package/build/server/chunks/hooks.server-BdyM6mgJ.js.map +1 -0
- package/build/server/chunks/{http-VqOG8hyj.js → http-B8eIxVUs.js} +2 -2
- package/build/server/chunks/{http-VqOG8hyj.js.map → http-B8eIxVUs.js.map} +1 -1
- package/build/server/chunks/{internal-DRqRyEjV.js → internal-BxEwVWRz.js} +4 -4
- package/build/server/chunks/internal-BxEwVWRz.js.map +1 -0
- package/build/server/chunks/session-cookie-CFbH9CoY.js +74 -0
- package/build/server/chunks/session-cookie-CFbH9CoY.js.map +1 -0
- package/build/server/chunks/{setup-deploy-B4oSSFYi.js → setup-deploy-Ck_d_qcE.js} +2 -2
- package/build/server/chunks/{setup-deploy-B4oSSFYi.js.map → setup-deploy-Ck_d_qcE.js.map} +1 -1
- package/build/server/chunks/{src-BkvQ5Uuf.js → src-CQbie-rx.js} +4012 -3472
- package/build/server/chunks/src-CQbie-rx.js.map +1 -0
- package/build/server/chunks/state-oN2SUx4y.js +62 -0
- package/build/server/chunks/state-oN2SUx4y.js.map +1 -0
- package/build/server/chunks/{theme-state.svelte-PtPMmKGN.js → theme-state.svelte-CE13yM0n.js} +18 -27
- package/build/server/chunks/theme-state.svelte-CE13yM0n.js.map +1 -0
- package/build/server/index.js +3 -33
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +102 -80
- package/build/server/manifest.js.map +1 -1
- package/package.json +8 -6
- package/build/client/_app/immutable/assets/0.DS8L5ANe.css +0 -1
- package/build/client/_app/immutable/assets/0.DS8L5ANe.css.br +0 -0
- package/build/client/_app/immutable/assets/0.DS8L5ANe.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.Dj7oigNN.css +0 -1
- package/build/client/_app/immutable/assets/4.Dj7oigNN.css.br +0 -0
- package/build/client/_app/immutable/assets/4.Dj7oigNN.css.gz +0 -0
- package/build/client/_app/immutable/assets/6.COn4HE1H.css +0 -1
- package/build/client/_app/immutable/assets/6.COn4HE1H.css.br +0 -0
- package/build/client/_app/immutable/assets/6.COn4HE1H.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.gblpY08p.css +0 -1
- package/build/client/_app/immutable/assets/7.gblpY08p.css.br +0 -0
- package/build/client/_app/immutable/assets/7.gblpY08p.css.gz +0 -0
- package/build/client/_app/immutable/assets/8.DjrHy5wu.css +0 -1
- package/build/client/_app/immutable/assets/8.DjrHy5wu.css.br +0 -0
- package/build/client/_app/immutable/assets/8.DjrHy5wu.css.gz +0 -0
- package/build/client/_app/immutable/assets/AuthGate.BTdwrgKg.css +0 -1
- package/build/client/_app/immutable/assets/AuthGate.BTdwrgKg.css.br +0 -0
- package/build/client/_app/immutable/assets/AuthGate.BTdwrgKg.css.gz +0 -0
- package/build/client/_app/immutable/assets/VoiceProfileSelector.Dp7tWdKe.css +0 -1
- package/build/client/_app/immutable/assets/VoiceProfileSelector.Dp7tWdKe.css.br +0 -0
- package/build/client/_app/immutable/assets/VoiceProfileSelector.Dp7tWdKe.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B7bBnuEe.js +0 -1
- package/build/client/_app/immutable/chunks/B7bBnuEe.js.br +0 -0
- package/build/client/_app/immutable/chunks/B7bBnuEe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BW39ik5x.js +0 -1
- package/build/client/_app/immutable/chunks/BW39ik5x.js.br +0 -0
- package/build/client/_app/immutable/chunks/BW39ik5x.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BuFlayix.js.br +0 -0
- package/build/client/_app/immutable/chunks/BuFlayix.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BwTF6U35.js +0 -3
- package/build/client/_app/immutable/chunks/BwTF6U35.js.br +0 -0
- package/build/client/_app/immutable/chunks/BwTF6U35.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cb_i8bV9.js +0 -1
- package/build/client/_app/immutable/chunks/Cb_i8bV9.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cb_i8bV9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DXseS2Vw.js +0 -1
- package/build/client/_app/immutable/chunks/DXseS2Vw.js.br +0 -0
- package/build/client/_app/immutable/chunks/DXseS2Vw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/os2NZ37U.js +0 -1
- package/build/client/_app/immutable/chunks/os2NZ37U.js.br +0 -1
- package/build/client/_app/immutable/chunks/os2NZ37U.js.gz +0 -0
- package/build/client/_app/immutable/chunks/yIwPo_wo.js +0 -5
- package/build/client/_app/immutable/chunks/yIwPo_wo.js.br +0 -0
- package/build/client/_app/immutable/chunks/yIwPo_wo.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.v-Fuqj7D.js +0 -2
- package/build/client/_app/immutable/entry/app.v-Fuqj7D.js.br +0 -0
- package/build/client/_app/immutable/entry/app.v-Fuqj7D.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.h2IOTLqd.js +0 -1
- package/build/client/_app/immutable/entry/start.h2IOTLqd.js.br +0 -0
- package/build/client/_app/immutable/entry/start.h2IOTLqd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.BHFOJkcF.js +0 -1
- package/build/client/_app/immutable/nodes/0.BHFOJkcF.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.BHFOJkcF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.DZaTVyfp.js +0 -1
- package/build/client/_app/immutable/nodes/1.DZaTVyfp.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.DZaTVyfp.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.ojh8oE7F.js +0 -1
- package/build/client/_app/immutable/nodes/2.ojh8oE7F.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.ojh8oE7F.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.DeAC3yVJ.js +0 -1
- package/build/client/_app/immutable/nodes/3.DeAC3yVJ.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.DeAC3yVJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.DXR2B9JX.js +0 -19
- package/build/client/_app/immutable/nodes/4.DXR2B9JX.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.DXR2B9JX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DOoWjdno.js +0 -4
- package/build/client/_app/immutable/nodes/5.DOoWjdno.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DOoWjdno.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.Rdn2byIl.js +0 -1
- package/build/client/_app/immutable/nodes/6.Rdn2byIl.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.Rdn2byIl.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.BPYbekMv.js +0 -15
- package/build/client/_app/immutable/nodes/7.BPYbekMv.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BPYbekMv.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.DNsQWKjK.js +0 -2
- package/build/client/_app/immutable/nodes/8.DNsQWKjK.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.DNsQWKjK.js.gz +0 -0
- package/build/server/chunks/0-BV-dSgKl.js +0 -9
- package/build/server/chunks/1-BaC08_Sf.js +0 -9
- package/build/server/chunks/2-C2y4ydWU.js +0 -9
- package/build/server/chunks/4-aThWANXD.js +0 -9
- package/build/server/chunks/4-aThWANXD.js.map +0 -1
- package/build/server/chunks/5-DLhgTDFN.js +0 -9
- package/build/server/chunks/5-DLhgTDFN.js.map +0 -1
- package/build/server/chunks/6-DwkLbgop.js +0 -9
- package/build/server/chunks/6-DwkLbgop.js.map +0 -1
- package/build/server/chunks/7-D5gXKRbq.js +0 -9
- package/build/server/chunks/7-D5gXKRbq.js.map +0 -1
- package/build/server/chunks/8-b9MOJ1zI.js +0 -9
- package/build/server/chunks/8-b9MOJ1zI.js.map +0 -1
- package/build/server/chunks/AuthGate-DL3Htqtl.js +0 -773
- package/build/server/chunks/AuthGate-DL3Htqtl.js.map +0 -1
- package/build/server/chunks/_layout.svelte-CcloHuB_.js.map +0 -1
- package/build/server/chunks/_page.svelte-24A1xNrb.js.map +0 -1
- package/build/server/chunks/_page.svelte-BNcatsUe.js +0 -414
- package/build/server/chunks/_page.svelte-BNcatsUe.js.map +0 -1
- package/build/server/chunks/_page.svelte-CQXBb6Vv.js +0 -106
- package/build/server/chunks/_page.svelte-CQXBb6Vv.js.map +0 -1
- package/build/server/chunks/_page.svelte-D0gMlmzQ.js.map +0 -1
- package/build/server/chunks/_page.svelte-DJuM-_YW.js +0 -66
- package/build/server/chunks/_page.svelte-DJuM-_YW.js.map +0 -1
- package/build/server/chunks/_server.ts-C5s-OXCm.js.map +0 -1
- package/build/server/chunks/_server.ts-CtZuKotA.js.map +0 -1
- package/build/server/chunks/_server.ts-D2wlMMJl.js.map +0 -1
- package/build/server/chunks/_server.ts-DVekHgMN.js.map +0 -1
- package/build/server/chunks/_server.ts-DWN6TJv0.js.map +0 -1
- package/build/server/chunks/_server.ts-DqVJ1NqI.js.map +0 -1
- package/build/server/chunks/_server.ts-xO4nhxDx.js.map +0 -1
- package/build/server/chunks/dev-DjANv7AF.js.map +0 -1
- package/build/server/chunks/helpers-CX6xRBmt.js.map +0 -1
- package/build/server/chunks/hooks.server-BEVMYNQ4.js.map +0 -1
- package/build/server/chunks/internal-DRqRyEjV.js.map +0 -1
- package/build/server/chunks/src-BkvQ5Uuf.js.map +0 -1
- package/build/server/chunks/state-D0tEXcn4.js.map +0 -1
- package/build/server/chunks/theme-state.svelte-PtPMmKGN.js.map +0 -1
|
@@ -0,0 +1,1003 @@
|
|
|
1
|
+
import { o as derived, r as escape_html, p as ensure_array_like, e as attr_class, d as attr, a8 as stringify, f as attr_style } from './dev-B6xUe35c.js';
|
|
2
|
+
import { o as onDestroy, g as goto } from './client-CiyZ88m2.js';
|
|
3
|
+
import { g as fetchEndpoints, m as setActiveEndpoint, l as listSessions, k as getSessionMessages, c as createSession, s as sendChatMessage, v as voiceState, p as speakText, q as stopSpeaking, d as destroyVoice, t as themeService } from './theme-state.svelte-CE13yM0n.js';
|
|
4
|
+
import { p as page } from './state-oN2SUx4y.js';
|
|
5
|
+
import { S as Spinner } from './Spinner-Bk6e83RX.js';
|
|
6
|
+
|
|
7
|
+
//#region src/lib/format-date.ts
|
|
8
|
+
var TIME_FMT = new Intl.DateTimeFormat(void 0, {
|
|
9
|
+
hour: "numeric",
|
|
10
|
+
minute: "2-digit"
|
|
11
|
+
});
|
|
12
|
+
var DATE_TIME_FMT = new Intl.DateTimeFormat(void 0, {
|
|
13
|
+
year: "numeric",
|
|
14
|
+
month: "short",
|
|
15
|
+
day: "numeric",
|
|
16
|
+
hour: "numeric",
|
|
17
|
+
minute: "2-digit"
|
|
18
|
+
});
|
|
19
|
+
/** Time of day, e.g. "3:42 PM" (locale-aware). Empty string for a falsy input. */
|
|
20
|
+
function formatTime(ts) {
|
|
21
|
+
if (!ts) return "";
|
|
22
|
+
return TIME_FMT.format(ts);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Absolute date + time, e.g. "Jun 7, 2026, 3:42 PM". Use for tooltips / full
|
|
26
|
+
* context where a relative label alone is ambiguous. Empty for a falsy input.
|
|
27
|
+
*/
|
|
28
|
+
function formatDateTime(ts) {
|
|
29
|
+
if (!ts) return "";
|
|
30
|
+
return DATE_TIME_FMT.format(ts);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compact relative time, e.g. "just now", "5m ago", "yesterday", "3w ago".
|
|
34
|
+
* Empty string for a falsy input. No date-fns dependency — that would be ~30 KB
|
|
35
|
+
* for these few cases.
|
|
36
|
+
*/
|
|
37
|
+
function formatRelativeTime(ts) {
|
|
38
|
+
if (!ts) return "";
|
|
39
|
+
const diffSec = Math.max(0, (Date.now() - ts) / 1e3);
|
|
40
|
+
if (diffSec < 60) return "just now";
|
|
41
|
+
const min = Math.floor(diffSec / 60);
|
|
42
|
+
if (min < 60) return `${min}m ago`;
|
|
43
|
+
const hr = Math.floor(min / 60);
|
|
44
|
+
if (hr < 24) return `${hr}h ago`;
|
|
45
|
+
const day = Math.floor(hr / 24);
|
|
46
|
+
if (day === 1) return "yesterday";
|
|
47
|
+
if (day < 7) return `${day}d ago`;
|
|
48
|
+
const wk = Math.floor(day / 7);
|
|
49
|
+
if (wk < 5) return `${wk}w ago`;
|
|
50
|
+
const mo = Math.floor(day / 30);
|
|
51
|
+
if (mo < 12) return `${mo}mo ago`;
|
|
52
|
+
return `${Math.floor(day / 365)}y ago`;
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/lib/components/common/IconButton.svelte
|
|
56
|
+
function IconButton($$renderer, $$props) {
|
|
57
|
+
/** Icon contents (an inline <svg> or spinner). */
|
|
58
|
+
/** Optional visible label; when present the button grows from a square to a pill. */
|
|
59
|
+
/** Render as an anchor instead of a button when a destination is given. */
|
|
60
|
+
/** "On"/active look (used by ToggleButton and active states). */
|
|
61
|
+
/** Colour of the selected state. */
|
|
62
|
+
/** Mirrors the toggle state for assistive tech (set by ToggleButton). */
|
|
63
|
+
let { icon, label, title, ariaLabel, disabled = false, href, onclick, type = "button", selected = false, tone = "primary", ariaPressed } = $$props;
|
|
64
|
+
if (href) {
|
|
65
|
+
$$renderer.push("<!--[0-->");
|
|
66
|
+
$$renderer.push(`<a${attr_class("icon-btn svelte-vx1yib", void 0, {
|
|
67
|
+
"has-label": label,
|
|
68
|
+
"selected": selected,
|
|
69
|
+
"tone-danger": tone === "danger"
|
|
70
|
+
})}${attr("href", href)}${attr("title", title ?? ariaLabel ?? label)}${attr("aria-label", ariaLabel ?? label)}${attr("aria-disabled", disabled || void 0)}>`);
|
|
71
|
+
icon($$renderer);
|
|
72
|
+
$$renderer.push(`<!----> `);
|
|
73
|
+
if (label) {
|
|
74
|
+
$$renderer.push("<!--[0-->");
|
|
75
|
+
$$renderer.push(`<span class="icon-btn-label svelte-vx1yib">${escape_html(label)}</span>`);
|
|
76
|
+
} else $$renderer.push("<!--[-1-->");
|
|
77
|
+
$$renderer.push(`<!--]--></a>`);
|
|
78
|
+
} else {
|
|
79
|
+
$$renderer.push("<!--[-1-->");
|
|
80
|
+
$$renderer.push(`<button${attr_class("icon-btn svelte-vx1yib", void 0, {
|
|
81
|
+
"has-label": label,
|
|
82
|
+
"selected": selected,
|
|
83
|
+
"tone-danger": tone === "danger"
|
|
84
|
+
})}${attr("type", type)}${attr("disabled", disabled, true)}${attr("title", title ?? ariaLabel ?? label)}${attr("aria-label", ariaLabel ?? label)}${attr("aria-pressed", ariaPressed)}>`);
|
|
85
|
+
icon($$renderer);
|
|
86
|
+
$$renderer.push(`<!----> `);
|
|
87
|
+
if (label) {
|
|
88
|
+
$$renderer.push("<!--[0-->");
|
|
89
|
+
$$renderer.push(`<span class="icon-btn-label svelte-vx1yib">${escape_html(label)}</span>`);
|
|
90
|
+
} else $$renderer.push("<!--[-1-->");
|
|
91
|
+
$$renderer.push(`<!--]--></button>`);
|
|
92
|
+
}
|
|
93
|
+
$$renderer.push(`<!--]-->`);
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/lib/components/common/ToggleButton.svelte
|
|
97
|
+
function ToggleButton($$renderer, $$props) {
|
|
98
|
+
/** Icon shown when off (and when on, if no selectedIcon is given). */
|
|
99
|
+
/** Optional distinct icon shown when on. */
|
|
100
|
+
/** Colour of the on state. */
|
|
101
|
+
let { pressed, onToggle, icon, selectedIcon, label, title, ariaLabel, disabled = false, tone = "primary" } = $$props;
|
|
102
|
+
IconButton($$renderer, {
|
|
103
|
+
icon: pressed && selectedIcon ? selectedIcon : icon,
|
|
104
|
+
label,
|
|
105
|
+
title,
|
|
106
|
+
ariaLabel,
|
|
107
|
+
disabled,
|
|
108
|
+
tone,
|
|
109
|
+
selected: pressed,
|
|
110
|
+
ariaPressed: pressed,
|
|
111
|
+
onclick: onToggle
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/lib/components/chrome/ModeSwitch.svelte
|
|
116
|
+
function advancedIcon($$renderer) {
|
|
117
|
+
$$renderer.push(`<svg aria-hidden="true" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><path d="m7 9 3 3-3 3"></path><line x1="13" y1="15" x2="17" y2="15"></line></svg>`);
|
|
118
|
+
}
|
|
119
|
+
function ModeSwitch($$renderer, $$props) {
|
|
120
|
+
$$renderer.component(($$renderer) => {
|
|
121
|
+
const pathname = derived(() => page.url?.pathname ?? "");
|
|
122
|
+
const onAdvanced = derived(() => pathname() === "/advanced" || pathname().startsWith("/advanced/"));
|
|
123
|
+
function toggle() {
|
|
124
|
+
goto(onAdvanced() ? "/chat" : "/advanced");
|
|
125
|
+
}
|
|
126
|
+
ToggleButton($$renderer, {
|
|
127
|
+
pressed: onAdvanced(),
|
|
128
|
+
onToggle: toggle,
|
|
129
|
+
ariaLabel: "Advanced mode",
|
|
130
|
+
title: "Advanced mode (embedded OpenCode)",
|
|
131
|
+
icon: advancedIcon
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/lib/components/common/Drawer.svelte
|
|
137
|
+
function Drawer($$renderer, $$props) {
|
|
138
|
+
$$renderer.component(($$renderer) => {
|
|
139
|
+
/** Optional content rendered at the start of the header (e.g. a back button). */
|
|
140
|
+
/** Drawer width (CSS length). */
|
|
141
|
+
let { open, title, onClose, children, footer, headerStart, width = "32rem" } = $$props;
|
|
142
|
+
if (open) {
|
|
143
|
+
$$renderer.push("<!--[0-->");
|
|
144
|
+
$$renderer.push(`<div class="drawer-scrim svelte-1u2o1qj"></div> <div class="drawer svelte-1u2o1qj"${attr_style(`--drawer-width: ${stringify(width)}`)} role="dialog" aria-modal="true"${attr("aria-label", title)} tabindex="-1"><header class="drawer-header svelte-1u2o1qj">`);
|
|
145
|
+
if (headerStart) {
|
|
146
|
+
$$renderer.push("<!--[0-->");
|
|
147
|
+
headerStart($$renderer);
|
|
148
|
+
$$renderer.push(`<!---->`);
|
|
149
|
+
} else $$renderer.push("<!--[-1-->");
|
|
150
|
+
$$renderer.push(`<!--]--> <h3 class="drawer-title svelte-1u2o1qj">${escape_html(title)}</h3> <button class="drawer-close svelte-1u2o1qj" aria-label="Close"><svg aria-hidden="true" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></button></header> <div class="drawer-body svelte-1u2o1qj">`);
|
|
151
|
+
children($$renderer);
|
|
152
|
+
$$renderer.push(`<!----></div> `);
|
|
153
|
+
if (footer) {
|
|
154
|
+
$$renderer.push("<!--[0-->");
|
|
155
|
+
$$renderer.push(`<footer class="drawer-footer svelte-1u2o1qj">`);
|
|
156
|
+
footer($$renderer);
|
|
157
|
+
$$renderer.push(`<!----></footer>`);
|
|
158
|
+
} else $$renderer.push("<!--[-1-->");
|
|
159
|
+
$$renderer.push(`<!--]--></div>`);
|
|
160
|
+
} else $$renderer.push("<!--[-1-->");
|
|
161
|
+
$$renderer.push(`<!--]-->`);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region src/lib/components/chrome/SettingsDrawer.svelte
|
|
166
|
+
function gearIcon($$renderer) {
|
|
167
|
+
$$renderer.push(`<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"><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>`);
|
|
168
|
+
}
|
|
169
|
+
function SettingsDrawer($$renderer, $$props) {
|
|
170
|
+
$$renderer.component(($$renderer) => {
|
|
171
|
+
let { showManageAssistant = true } = $$props;
|
|
172
|
+
let open = false;
|
|
173
|
+
function setTheme(event) {
|
|
174
|
+
const next = event.currentTarget.value;
|
|
175
|
+
if (next === "light" || next === "dark" || next === "system") themeService.setPreference(next);
|
|
176
|
+
}
|
|
177
|
+
IconButton($$renderer, {
|
|
178
|
+
icon: gearIcon,
|
|
179
|
+
ariaLabel: "Settings",
|
|
180
|
+
title: "Settings",
|
|
181
|
+
selected: open,
|
|
182
|
+
ariaPressed: open,
|
|
183
|
+
onclick: () => open = true
|
|
184
|
+
});
|
|
185
|
+
$$renderer.push(`<!----> `);
|
|
186
|
+
Drawer($$renderer, {
|
|
187
|
+
open,
|
|
188
|
+
title: "Settings",
|
|
189
|
+
onClose: () => open = false,
|
|
190
|
+
width: "24rem",
|
|
191
|
+
children: ($$renderer) => {
|
|
192
|
+
$$renderer.push(`<div class="settings-drawer svelte-4kbm5j"><label class="field svelte-4kbm5j" for="theme-preference"><span class="field-label svelte-4kbm5j">Theme</span> `);
|
|
193
|
+
$$renderer.select({
|
|
194
|
+
id: "theme-preference",
|
|
195
|
+
class: "field-select",
|
|
196
|
+
value: themeService.preference,
|
|
197
|
+
onchange: setTheme
|
|
198
|
+
}, ($$renderer) => {
|
|
199
|
+
$$renderer.option({ value: "system" }, ($$renderer) => {
|
|
200
|
+
$$renderer.push(`System`);
|
|
201
|
+
});
|
|
202
|
+
$$renderer.option({ value: "light" }, ($$renderer) => {
|
|
203
|
+
$$renderer.push(`Light`);
|
|
204
|
+
});
|
|
205
|
+
$$renderer.option({ value: "dark" }, ($$renderer) => {
|
|
206
|
+
$$renderer.push(`Dark`);
|
|
207
|
+
});
|
|
208
|
+
}, "svelte-4kbm5j");
|
|
209
|
+
$$renderer.push(`</label> <nav class="settings-links svelte-4kbm5j" aria-label="Settings links">`);
|
|
210
|
+
if (showManageAssistant) {
|
|
211
|
+
$$renderer.push("<!--[0-->");
|
|
212
|
+
$$renderer.push(`<a class="settings-link svelte-4kbm5j" href="/admin">Manage this assistant...</a>`);
|
|
213
|
+
} else $$renderer.push("<!--[-1-->");
|
|
214
|
+
$$renderer.push(`<!--]--> <a class="settings-link svelte-4kbm5j" href="/admin/endpoints">Manage assistant connections...</a></nav></div>`);
|
|
215
|
+
}});
|
|
216
|
+
$$renderer.push(`<!---->`);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
//#endregion
|
|
220
|
+
//#region src/lib/chat/session-events.ts
|
|
221
|
+
var INITIAL_BACKOFF_MS = 1e3;
|
|
222
|
+
var MAX_BACKOFF_MS = 3e4;
|
|
223
|
+
var STREAM_URL = "/proxy/assistant/event";
|
|
224
|
+
/**
|
|
225
|
+
* Parse one `\n\n`-delimited SSE frame. Multi-line `data:` fields are
|
|
226
|
+
* concatenated with `\n` per the SSE spec.
|
|
227
|
+
*/
|
|
228
|
+
function parseFrame(chunk) {
|
|
229
|
+
const frame = {};
|
|
230
|
+
const dataLines = [];
|
|
231
|
+
for (const rawLine of chunk.split("\n")) {
|
|
232
|
+
if (!rawLine || rawLine.startsWith(":")) continue;
|
|
233
|
+
if (rawLine.startsWith("data:")) dataLines.push(rawLine.replace(/^data:\s?/, ""));
|
|
234
|
+
else if (rawLine.startsWith("event:")) frame.event = rawLine.replace(/^event:\s?/, "");
|
|
235
|
+
else if (rawLine.startsWith("id:")) frame.id = rawLine.replace(/^id:\s?/, "");
|
|
236
|
+
}
|
|
237
|
+
if (dataLines.length > 0) frame.data = dataLines.join("\n");
|
|
238
|
+
return frame;
|
|
239
|
+
}
|
|
240
|
+
function dispatch(handlers, payload) {
|
|
241
|
+
const info = payload.properties?.info;
|
|
242
|
+
const id = info?.id;
|
|
243
|
+
if (!id) return;
|
|
244
|
+
switch (payload.type) {
|
|
245
|
+
case "session.created":
|
|
246
|
+
handlers.onCreated(id);
|
|
247
|
+
return;
|
|
248
|
+
case "session.updated":
|
|
249
|
+
handlers.onUpdated(id, {
|
|
250
|
+
title: info?.title,
|
|
251
|
+
updatedAt: info?.time?.updated
|
|
252
|
+
});
|
|
253
|
+
return;
|
|
254
|
+
case "session.deleted":
|
|
255
|
+
handlers.onDeleted(id);
|
|
256
|
+
return;
|
|
257
|
+
default: return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Open an SSE connection to `/proxy/assistant/event` and dispatch
|
|
262
|
+
* session-scoped events. Returns an unsubscribe function that aborts the
|
|
263
|
+
* stream and prevents reconnection.
|
|
264
|
+
*/
|
|
265
|
+
function subscribeSessionEvents(handlers) {
|
|
266
|
+
let stopped = false;
|
|
267
|
+
let controller = new AbortController();
|
|
268
|
+
let lastEventId;
|
|
269
|
+
const sleep = (ms) => new Promise((resolve) => {
|
|
270
|
+
const timer = setTimeout(resolve, ms);
|
|
271
|
+
controller.signal.addEventListener("abort", () => {
|
|
272
|
+
clearTimeout(timer);
|
|
273
|
+
resolve();
|
|
274
|
+
}, { once: true });
|
|
275
|
+
});
|
|
276
|
+
async function readStream() {
|
|
277
|
+
const headers = { accept: "text/event-stream" };
|
|
278
|
+
if (lastEventId !== void 0) headers["Last-Event-ID"] = lastEventId;
|
|
279
|
+
const response = await fetch(STREAM_URL, {
|
|
280
|
+
method: "GET",
|
|
281
|
+
headers,
|
|
282
|
+
credentials: "include",
|
|
283
|
+
signal: controller.signal
|
|
284
|
+
});
|
|
285
|
+
if (!response.ok || !response.body) throw new Error(`SSE stream failed: ${response.status} ${response.statusText}`);
|
|
286
|
+
handlers.onConnect?.();
|
|
287
|
+
const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
|
|
288
|
+
let buffer = "";
|
|
289
|
+
try {
|
|
290
|
+
while (true) {
|
|
291
|
+
const { done, value } = await reader.read();
|
|
292
|
+
if (done) break;
|
|
293
|
+
buffer += value;
|
|
294
|
+
const chunks = buffer.split("\n\n");
|
|
295
|
+
buffer = chunks.pop() ?? "";
|
|
296
|
+
for (const chunk of chunks) {
|
|
297
|
+
if (!chunk) continue;
|
|
298
|
+
const frame = parseFrame(chunk);
|
|
299
|
+
if (frame.id !== void 0) lastEventId = frame.id;
|
|
300
|
+
if (!frame.data) continue;
|
|
301
|
+
let payload;
|
|
302
|
+
try {
|
|
303
|
+
payload = JSON.parse(frame.data);
|
|
304
|
+
} catch (err) {
|
|
305
|
+
console.warn("[session-events] Bad JSON in SSE frame", err);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
dispatch(handlers, payload);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
} finally {
|
|
312
|
+
try {
|
|
313
|
+
reader.releaseLock();
|
|
314
|
+
} catch {}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
(async () => {
|
|
318
|
+
let attempt = 0;
|
|
319
|
+
while (!stopped) try {
|
|
320
|
+
attempt++;
|
|
321
|
+
await readStream();
|
|
322
|
+
attempt = 0;
|
|
323
|
+
if (!stopped) await sleep(500);
|
|
324
|
+
} catch (err) {
|
|
325
|
+
if (stopped) return;
|
|
326
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
327
|
+
if (error.name !== "AbortError") {
|
|
328
|
+
console.warn("[session-events] SSE error, reconnecting", error);
|
|
329
|
+
handlers.onDisconnect?.(error);
|
|
330
|
+
}
|
|
331
|
+
await sleep(Math.min(INITIAL_BACKOFF_MS * 2 ** Math.max(0, attempt - 1), MAX_BACKOFF_MS));
|
|
332
|
+
if (controller.signal.aborted && !stopped) controller = new AbortController();
|
|
333
|
+
}
|
|
334
|
+
})();
|
|
335
|
+
return () => {
|
|
336
|
+
stopped = true;
|
|
337
|
+
try {
|
|
338
|
+
controller.abort();
|
|
339
|
+
} catch {}
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//#endregion
|
|
343
|
+
//#region src/lib/chat/chat-state.svelte.ts
|
|
344
|
+
function emptyEndpointState() {
|
|
345
|
+
return {
|
|
346
|
+
sessions: [],
|
|
347
|
+
sessionsLoaded: false,
|
|
348
|
+
sessionsLoading: false,
|
|
349
|
+
sessionsError: "",
|
|
350
|
+
activeSessionId: null
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
var ChatService = class {
|
|
354
|
+
/**
|
|
355
|
+
* Per-endpoint session cache. Reassigned on every mutation so Svelte 5
|
|
356
|
+
* picks up the change. Never mutate the existing Map in place.
|
|
357
|
+
*/
|
|
358
|
+
byEndpoint = /* @__PURE__ */ new Map();
|
|
359
|
+
/**
|
|
360
|
+
* Mirrored from `endpointsService.activeId` via `onEndpointChanged()`
|
|
361
|
+
* so the chat layer doesn't have to import the endpoint store.
|
|
362
|
+
*/
|
|
363
|
+
activeEndpointId = "default";
|
|
364
|
+
/** Messages for the currently rendered session only. */
|
|
365
|
+
entries = [];
|
|
366
|
+
entriesLoading = false;
|
|
367
|
+
sending = false;
|
|
368
|
+
error = "";
|
|
369
|
+
/**
|
|
370
|
+
* Set true while the SSE event stream is connected. Surfaced by the
|
|
371
|
+
* SessionPicker as a tiny green/gray dot so the operator can see at a
|
|
372
|
+
* glance whether live updates are flowing.
|
|
373
|
+
*/
|
|
374
|
+
liveConnected = false;
|
|
375
|
+
/**
|
|
376
|
+
* Active SSE subscription handle. Reassigned on every endpoint switch.
|
|
377
|
+
* Plain field (not `$state`) — only the chat service touches it.
|
|
378
|
+
*/
|
|
379
|
+
_unsubscribeEvents = null;
|
|
380
|
+
#activeSessionId = derived(() => this.byEndpoint.get(this.activeEndpointId)?.activeSessionId ?? null);
|
|
381
|
+
get activeSessionId() {
|
|
382
|
+
return this.#activeSessionId();
|
|
383
|
+
}
|
|
384
|
+
set activeSessionId($$value) {
|
|
385
|
+
return this.#activeSessionId($$value);
|
|
386
|
+
}
|
|
387
|
+
setEndpointState(id, patch) {
|
|
388
|
+
const next = {
|
|
389
|
+
...this.byEndpoint.get(id) ?? emptyEndpointState(),
|
|
390
|
+
...patch
|
|
391
|
+
};
|
|
392
|
+
this.byEndpoint = new Map(this.byEndpoint).set(id, next);
|
|
393
|
+
return next;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Handle an endpoint switch: load sessions, restore prior or pick
|
|
397
|
+
* newest, fetch messages. Mid-generation switches are blocked.
|
|
398
|
+
*/
|
|
399
|
+
async onEndpointChanged(id) {
|
|
400
|
+
if (this.sending) {
|
|
401
|
+
this.error = "Wait for the current reply to finish before switching.";
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
this.activeEndpointId = id;
|
|
405
|
+
this.entries = [];
|
|
406
|
+
this.error = "";
|
|
407
|
+
if (!this.byEndpoint.get(id)?.sessionsLoaded) await this.loadSessions();
|
|
408
|
+
const state = this.byEndpoint.get(id) ?? emptyEndpointState();
|
|
409
|
+
const sessions = state.sessions;
|
|
410
|
+
const previous = state.activeSessionId;
|
|
411
|
+
let nextSessionId = null;
|
|
412
|
+
if (previous && sessions.some((s) => s.id === previous)) nextSessionId = previous;
|
|
413
|
+
else if (sessions.length > 0) nextSessionId = sessions[0].id;
|
|
414
|
+
if (nextSessionId !== state.activeSessionId) this.setEndpointState(id, { activeSessionId: nextSessionId });
|
|
415
|
+
if (nextSessionId) await this.openSession(nextSessionId);
|
|
416
|
+
this._resubscribeEvents();
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Tear down any prior SSE subscription and open a new one. Handlers
|
|
420
|
+
* dispatch session.created / updated / deleted into the per-endpoint
|
|
421
|
+
* cache, mirroring out-of-band changes (CLI, other clients).
|
|
422
|
+
*/
|
|
423
|
+
_resubscribeEvents() {
|
|
424
|
+
if (this._unsubscribeEvents) {
|
|
425
|
+
try {
|
|
426
|
+
this._unsubscribeEvents();
|
|
427
|
+
} catch (err) {
|
|
428
|
+
console.warn("[chat] failed to unsubscribe from previous event stream", err);
|
|
429
|
+
}
|
|
430
|
+
this._unsubscribeEvents = null;
|
|
431
|
+
}
|
|
432
|
+
this.liveConnected = false;
|
|
433
|
+
this._unsubscribeEvents = subscribeSessionEvents({
|
|
434
|
+
onCreated: (id) => {
|
|
435
|
+
this._onSessionCreated(id);
|
|
436
|
+
},
|
|
437
|
+
onUpdated: (id, info) => {
|
|
438
|
+
this._onSessionUpdated(id, info);
|
|
439
|
+
},
|
|
440
|
+
onDeleted: (id) => {
|
|
441
|
+
this._onSessionDeleted(id);
|
|
442
|
+
},
|
|
443
|
+
onConnect: () => {
|
|
444
|
+
this.liveConnected = true;
|
|
445
|
+
},
|
|
446
|
+
onDisconnect: () => {
|
|
447
|
+
this.liveConnected = false;
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* A session was created out-of-band — prepend to the active endpoint's
|
|
453
|
+
* list if not already known. Do not auto-switch to it: the user owns
|
|
454
|
+
* navigation.
|
|
455
|
+
*/
|
|
456
|
+
_onSessionCreated(sessionId) {
|
|
457
|
+
const endpointId = this.activeEndpointId;
|
|
458
|
+
const prev = this.byEndpoint.get(endpointId) ?? emptyEndpointState();
|
|
459
|
+
if (prev.sessions.some((s) => s.id === sessionId)) return;
|
|
460
|
+
const now = Date.now();
|
|
461
|
+
const summary = {
|
|
462
|
+
id: sessionId,
|
|
463
|
+
title: "",
|
|
464
|
+
createdAt: now,
|
|
465
|
+
updatedAt: now
|
|
466
|
+
};
|
|
467
|
+
this.setEndpointState(endpointId, {
|
|
468
|
+
sessions: [summary, ...prev.sessions],
|
|
469
|
+
sessionsLoaded: true
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* A session was touched out-of-band — patch its updatedAt (and title if
|
|
474
|
+
* the event carries one) and re-sort. Do NOT refetch messages: if the
|
|
475
|
+
* user is viewing this session, leave the in-memory entries alone for
|
|
476
|
+
* v1. A follow-up phase can reconcile message deltas via the assistant
|
|
477
|
+
* event stream.
|
|
478
|
+
*/
|
|
479
|
+
_onSessionUpdated(sessionId, info) {
|
|
480
|
+
const endpointId = this.activeEndpointId;
|
|
481
|
+
const prev = this.byEndpoint.get(endpointId);
|
|
482
|
+
if (!prev) return;
|
|
483
|
+
const idx = prev.sessions.findIndex((s) => s.id === sessionId);
|
|
484
|
+
if (idx === -1) return;
|
|
485
|
+
const existing = prev.sessions[idx];
|
|
486
|
+
const sessions = [{
|
|
487
|
+
...existing,
|
|
488
|
+
title: info?.title ?? existing.title,
|
|
489
|
+
updatedAt: info?.updatedAt ?? Date.now()
|
|
490
|
+
}, ...prev.sessions.filter((s) => s.id !== sessionId)];
|
|
491
|
+
sessions.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
492
|
+
this.setEndpointState(endpointId, { sessions });
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* A session was deleted out-of-band. Remove it from the list; if it was
|
|
496
|
+
* the active session, fall back to the newest remaining session (or
|
|
497
|
+
* null) and reload its messages.
|
|
498
|
+
*/
|
|
499
|
+
async _onSessionDeleted(sessionId) {
|
|
500
|
+
const endpointId = this.activeEndpointId;
|
|
501
|
+
const prev = this.byEndpoint.get(endpointId);
|
|
502
|
+
if (!prev) return;
|
|
503
|
+
if (!prev.sessions.some((s) => s.id === sessionId)) return;
|
|
504
|
+
const sessions = prev.sessions.filter((s) => s.id !== sessionId);
|
|
505
|
+
const wasActive = prev.activeSessionId === sessionId;
|
|
506
|
+
const nextActive = wasActive ? sessions[0]?.id ?? null : prev.activeSessionId;
|
|
507
|
+
this.setEndpointState(endpointId, {
|
|
508
|
+
sessions,
|
|
509
|
+
activeSessionId: nextActive
|
|
510
|
+
});
|
|
511
|
+
if (wasActive) {
|
|
512
|
+
this.entries = [];
|
|
513
|
+
if (nextActive) await this.openSession(nextActive);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/** Fetch the session list for the active endpoint. */
|
|
517
|
+
async loadSessions() {
|
|
518
|
+
const id = this.activeEndpointId;
|
|
519
|
+
this.setEndpointState(id, {
|
|
520
|
+
sessionsLoading: true,
|
|
521
|
+
sessionsError: ""
|
|
522
|
+
});
|
|
523
|
+
try {
|
|
524
|
+
const sessions = await listSessions();
|
|
525
|
+
this.setEndpointState(id, {
|
|
526
|
+
sessions,
|
|
527
|
+
sessionsLoaded: true,
|
|
528
|
+
sessionsLoading: false,
|
|
529
|
+
sessionsError: ""
|
|
530
|
+
});
|
|
531
|
+
} catch (e) {
|
|
532
|
+
const err = e;
|
|
533
|
+
const message = err.status === 503 || err.status === 502 ? "Assistant is not reachable." : err.message ?? "Failed to load sessions.";
|
|
534
|
+
this.setEndpointState(id, {
|
|
535
|
+
sessionsLoading: false,
|
|
536
|
+
sessionsError: message
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
/** Select a session and render its messages. */
|
|
541
|
+
async openSession(sessionId) {
|
|
542
|
+
if (this.sending) {
|
|
543
|
+
this.error = "Wait for the current reply to finish before switching.";
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
const endpointId = this.activeEndpointId;
|
|
547
|
+
this.setEndpointState(endpointId, { activeSessionId: sessionId });
|
|
548
|
+
this.entries = [];
|
|
549
|
+
this.entriesLoading = true;
|
|
550
|
+
this.error = "";
|
|
551
|
+
try {
|
|
552
|
+
const messages = await getSessionMessages(sessionId);
|
|
553
|
+
if (this.activeEndpointId === endpointId && this.byEndpoint.get(endpointId)?.activeSessionId === sessionId) this.entries = messages;
|
|
554
|
+
} catch (e) {
|
|
555
|
+
const err = e;
|
|
556
|
+
if (err.status === 503 || err.status === 502) this.error = "Assistant is not reachable. Try reconnecting.";
|
|
557
|
+
else if (err.status === 401) this.error = "Sign-in required.";
|
|
558
|
+
else this.error = err.message ?? "Failed to load messages.";
|
|
559
|
+
} finally {
|
|
560
|
+
this.entriesLoading = false;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
/** Create a new session on the active endpoint and select it. */
|
|
564
|
+
async startNewSession() {
|
|
565
|
+
if (this.sending) {
|
|
566
|
+
this.error = "Wait for the current reply to finish before switching.";
|
|
567
|
+
return null;
|
|
568
|
+
}
|
|
569
|
+
const endpointId = this.activeEndpointId;
|
|
570
|
+
this.error = "";
|
|
571
|
+
try {
|
|
572
|
+
const { id } = await createSession();
|
|
573
|
+
const now = Date.now();
|
|
574
|
+
const summary = {
|
|
575
|
+
id,
|
|
576
|
+
title: "",
|
|
577
|
+
createdAt: now,
|
|
578
|
+
updatedAt: now
|
|
579
|
+
};
|
|
580
|
+
const prev = this.byEndpoint.get(endpointId) ?? emptyEndpointState();
|
|
581
|
+
this.setEndpointState(endpointId, {
|
|
582
|
+
sessions: [summary, ...prev.sessions.filter((s) => s.id !== id)],
|
|
583
|
+
sessionsLoaded: true,
|
|
584
|
+
activeSessionId: id
|
|
585
|
+
});
|
|
586
|
+
this.entries = [];
|
|
587
|
+
return id;
|
|
588
|
+
} catch (e) {
|
|
589
|
+
const err = e;
|
|
590
|
+
this.error = `Failed to start session: ${err.message ?? "unknown error"}`;
|
|
591
|
+
return null;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Send a message in the active session. If none is active, create one
|
|
596
|
+
* first (matches the "zero sessions" empty-state flow).
|
|
597
|
+
*/
|
|
598
|
+
async send(text) {
|
|
599
|
+
if (this.sending) return;
|
|
600
|
+
const trimmed = text.trim();
|
|
601
|
+
if (!trimmed) return;
|
|
602
|
+
let sessionId = this.activeSessionId;
|
|
603
|
+
if (!sessionId) {
|
|
604
|
+
sessionId = await this.startNewSession();
|
|
605
|
+
if (!sessionId) return;
|
|
606
|
+
}
|
|
607
|
+
const userEntry = {
|
|
608
|
+
id: crypto.randomUUID(),
|
|
609
|
+
role: "user",
|
|
610
|
+
text: trimmed,
|
|
611
|
+
timestamp: Date.now()
|
|
612
|
+
};
|
|
613
|
+
this.entries = [...this.entries, userEntry];
|
|
614
|
+
this.error = "";
|
|
615
|
+
this.sending = true;
|
|
616
|
+
try {
|
|
617
|
+
const replyText = (await sendChatMessage(sessionId, trimmed)).parts.filter((p) => p.type === "text" && p.text).map((p) => p.text ?? "").join("");
|
|
618
|
+
const assistantEntry = {
|
|
619
|
+
id: crypto.randomUUID(),
|
|
620
|
+
role: "assistant",
|
|
621
|
+
text: replyText || "(no response)",
|
|
622
|
+
timestamp: Date.now()
|
|
623
|
+
};
|
|
624
|
+
this.entries = [...this.entries, assistantEntry];
|
|
625
|
+
const endpointId = this.activeEndpointId;
|
|
626
|
+
const prev = this.byEndpoint.get(endpointId);
|
|
627
|
+
if (prev) {
|
|
628
|
+
const now = Date.now();
|
|
629
|
+
const existing = prev.sessions.find((s) => s.id === sessionId);
|
|
630
|
+
const updated = existing ? {
|
|
631
|
+
...existing,
|
|
632
|
+
updatedAt: now
|
|
633
|
+
} : {
|
|
634
|
+
id: sessionId,
|
|
635
|
+
title: "",
|
|
636
|
+
createdAt: now,
|
|
637
|
+
updatedAt: now
|
|
638
|
+
};
|
|
639
|
+
const rest = prev.sessions.filter((s) => s.id !== sessionId);
|
|
640
|
+
this.setEndpointState(endpointId, { sessions: [updated, ...rest] });
|
|
641
|
+
}
|
|
642
|
+
if (voiceState.ttsSupported && voiceState.ttsAutoEnabled && replyText) speakText(replyText);
|
|
643
|
+
} catch (e) {
|
|
644
|
+
const err = e;
|
|
645
|
+
if (err.status === 503 || err.status === 502) {
|
|
646
|
+
this.error = "Assistant is not reachable. Try reconnecting.";
|
|
647
|
+
this.setEndpointState(this.activeEndpointId, { activeSessionId: null });
|
|
648
|
+
} else if (err.status === 401) this.error = "Sign-in required.";
|
|
649
|
+
else this.error = err.message ?? "Message failed.";
|
|
650
|
+
} finally {
|
|
651
|
+
this.sending = false;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
reset() {
|
|
655
|
+
stopSpeaking();
|
|
656
|
+
this.entries = [];
|
|
657
|
+
this.error = "";
|
|
658
|
+
this.byEndpoint = /* @__PURE__ */ new Map();
|
|
659
|
+
if (this._unsubscribeEvents) {
|
|
660
|
+
try {
|
|
661
|
+
this._unsubscribeEvents();
|
|
662
|
+
} catch (err) {
|
|
663
|
+
console.warn("[chat] failed to unsubscribe from event stream during reset", err);
|
|
664
|
+
}
|
|
665
|
+
this._unsubscribeEvents = null;
|
|
666
|
+
}
|
|
667
|
+
this.liveConnected = false;
|
|
668
|
+
}
|
|
669
|
+
};
|
|
670
|
+
var chat = new ChatService();
|
|
671
|
+
//#endregion
|
|
672
|
+
//#region src/lib/endpoints-state.svelte.ts
|
|
673
|
+
var EndpointsService = class {
|
|
674
|
+
endpoints = [];
|
|
675
|
+
activeId = "default";
|
|
676
|
+
loading = false;
|
|
677
|
+
loaded = false;
|
|
678
|
+
error = "";
|
|
679
|
+
#active = derived(() => this.endpoints.find((e) => e.id === this.activeId) ?? this.endpoints[0] ?? null);
|
|
680
|
+
get active() {
|
|
681
|
+
return this.#active();
|
|
682
|
+
}
|
|
683
|
+
set active($$value) {
|
|
684
|
+
return this.#active($$value);
|
|
685
|
+
}
|
|
686
|
+
async load(force = false) {
|
|
687
|
+
if (this.loading) return;
|
|
688
|
+
if (this.loaded && !force) return;
|
|
689
|
+
this.loading = true;
|
|
690
|
+
this.error = "";
|
|
691
|
+
try {
|
|
692
|
+
const { endpoints, activeId } = await fetchEndpoints();
|
|
693
|
+
this.endpoints = endpoints;
|
|
694
|
+
this.activeId = activeId;
|
|
695
|
+
this.loaded = true;
|
|
696
|
+
} catch (e) {
|
|
697
|
+
const err = e;
|
|
698
|
+
if (err.status !== 401) this.error = err.message ?? "Failed to load endpoints";
|
|
699
|
+
} finally {
|
|
700
|
+
this.loading = false;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
async activate(id) {
|
|
704
|
+
if (id === this.activeId) return;
|
|
705
|
+
if (chat.sending) {
|
|
706
|
+
this.error = "Wait for the current reply to finish before switching.";
|
|
707
|
+
throw new Error(this.error);
|
|
708
|
+
}
|
|
709
|
+
const previous = this.activeId;
|
|
710
|
+
this.activeId = id;
|
|
711
|
+
try {
|
|
712
|
+
await setActiveEndpoint(id);
|
|
713
|
+
await chat.onEndpointChanged(id);
|
|
714
|
+
} catch (e) {
|
|
715
|
+
this.activeId = previous;
|
|
716
|
+
const err = e;
|
|
717
|
+
this.error = err.message ?? "Failed to switch endpoint";
|
|
718
|
+
throw e;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
};
|
|
722
|
+
var endpointsService = new EndpointsService();
|
|
723
|
+
//#endregion
|
|
724
|
+
//#region src/lib/assistant-endpoint.ts
|
|
725
|
+
function isLocalAssistantUrl(url) {
|
|
726
|
+
if (!url) return true;
|
|
727
|
+
try {
|
|
728
|
+
const host = new URL(url).hostname;
|
|
729
|
+
return host === "localhost" || host === "127.0.0.1" || host === "::1" || host === "host.docker.internal";
|
|
730
|
+
} catch {
|
|
731
|
+
return true;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
//#endregion
|
|
735
|
+
//#region src/lib/components/chat/EndpointList.svelte
|
|
736
|
+
function EndpointList($$renderer, $$props) {
|
|
737
|
+
$$renderer.component(($$renderer) => {
|
|
738
|
+
/** Called after the active endpoint changes (e.g. to close the drawer). */
|
|
739
|
+
let { onChosen } = $$props;
|
|
740
|
+
const active = derived(() => endpointsService.active);
|
|
741
|
+
const endpoints = derived(() => endpointsService.endpoints);
|
|
742
|
+
const showManageAssistant = derived(() => isLocalAssistantUrl(active()?.url));
|
|
743
|
+
let switching = false;
|
|
744
|
+
$$renderer.push(`<div class="endpoint-list svelte-dlw00e">`);
|
|
745
|
+
if (endpointsService.error) {
|
|
746
|
+
$$renderer.push("<!--[0-->");
|
|
747
|
+
$$renderer.push(`<p class="list-error svelte-dlw00e" role="alert">${escape_html(endpointsService.error)}</p>`);
|
|
748
|
+
} else $$renderer.push("<!--[-1-->");
|
|
749
|
+
$$renderer.push(`<!--]--> <div class="group" role="group" aria-label="Assistant endpoints"><!--[-->`);
|
|
750
|
+
const each_array = ensure_array_like(endpoints());
|
|
751
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
752
|
+
let ep = each_array[$$index];
|
|
753
|
+
$$renderer.push(`<button type="button"${attr_class("list-item svelte-dlw00e", void 0, { "active": ep.id === active()?.id })}${attr("aria-current", ep.id === active()?.id ? "true" : void 0)}${attr("disabled", switching, true)}><span class="item-text svelte-dlw00e"><span class="item-label svelte-dlw00e">${escape_html(ep.label)}`);
|
|
754
|
+
if (ep.id === active()?.id) {
|
|
755
|
+
$$renderer.push("<!--[0-->");
|
|
756
|
+
$$renderer.push(`<span class="sr-only svelte-dlw00e">(current)</span>`);
|
|
757
|
+
} else $$renderer.push("<!--[-1-->");
|
|
758
|
+
$$renderer.push(`<!--]--></span> <span class="item-url svelte-dlw00e">${escape_html(ep.url)}</span></span></button>`);
|
|
759
|
+
}
|
|
760
|
+
$$renderer.push(`<!--]--></div> <div class="divider svelte-dlw00e"></div> `);
|
|
761
|
+
if (showManageAssistant()) {
|
|
762
|
+
$$renderer.push("<!--[0-->");
|
|
763
|
+
$$renderer.push(`<a class="list-item link svelte-dlw00e" href="/admin">Manage this assistant…</a>`);
|
|
764
|
+
} else $$renderer.push("<!--[-1-->");
|
|
765
|
+
$$renderer.push(`<!--]--> <a class="list-item link svelte-dlw00e" href="/admin/endpoints">Manage assistant connections…</a></div>`);
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
//#endregion
|
|
769
|
+
//#region src/lib/components/chat/EndpointSwitcher.svelte
|
|
770
|
+
function EndpointSwitcher($$renderer, $$props) {
|
|
771
|
+
$$renderer.component(($$renderer) => {
|
|
772
|
+
let open = false;
|
|
773
|
+
const active = derived(() => endpointsService.active);
|
|
774
|
+
$$renderer.push(`<button type="button" class="trigger svelte-48xr05" aria-haspopup="dialog"${attr("aria-expanded", open)}${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-48xr05" 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-48xr05" aria-hidden="true"></span> <span class="label svelte-48xr05">${escape_html(active()?.label ?? "Endpoint…")}</span> <span class="caret svelte-48xr05" aria-hidden="true">▾</span></button> `);
|
|
775
|
+
Drawer($$renderer, {
|
|
776
|
+
open,
|
|
777
|
+
title: "Assistant endpoint",
|
|
778
|
+
onClose: () => open = false,
|
|
779
|
+
width: "26rem",
|
|
780
|
+
children: ($$renderer) => {
|
|
781
|
+
EndpointList($$renderer, { onChosen: () => open = false });
|
|
782
|
+
}});
|
|
783
|
+
$$renderer.push(`<!---->`);
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
//#endregion
|
|
787
|
+
//#region src/lib/session-title.ts
|
|
788
|
+
var DEFAULT_TITLE_RE = /^New session - (\d{4}-\d{2}-\d{2}T[0-9:.]+Z?)$/;
|
|
789
|
+
/** Resolve a session's display title. */
|
|
790
|
+
function resolveSessionTitle(title) {
|
|
791
|
+
const trimmed = (title ?? "").trim();
|
|
792
|
+
if (!trimmed) return "Untitled session";
|
|
793
|
+
const match = DEFAULT_TITLE_RE.exec(trimmed);
|
|
794
|
+
if (match) {
|
|
795
|
+
const ts = Date.parse(match[1]);
|
|
796
|
+
if (!Number.isNaN(ts)) return formatDateTime(ts);
|
|
797
|
+
}
|
|
798
|
+
return trimmed;
|
|
799
|
+
}
|
|
800
|
+
//#endregion
|
|
801
|
+
//#region src/lib/components/chat/SessionTitle.svelte
|
|
802
|
+
function SessionTitle($$renderer, $$props) {
|
|
803
|
+
$$renderer.component(($$renderer) => {
|
|
804
|
+
let { title } = $$props;
|
|
805
|
+
const display = derived(() => resolveSessionTitle(title));
|
|
806
|
+
$$renderer.push(`<!---->${escape_html(display())}`);
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
//#endregion
|
|
810
|
+
//#region src/lib/components/chat/SessionList.svelte
|
|
811
|
+
function SessionList($$renderer, $$props) {
|
|
812
|
+
$$renderer.component(($$renderer) => {
|
|
813
|
+
/** Called after a session is opened or started (e.g. to close the drawer). */
|
|
814
|
+
let { onChosen } = $$props;
|
|
815
|
+
const SESSION_LIST_CAP = 50;
|
|
816
|
+
const active = derived(() => endpointsService.active);
|
|
817
|
+
const endpointState = derived(() => active() ? chat.byEndpoint.get(active().id) ?? null : null);
|
|
818
|
+
const sessions = derived(() => endpointState()?.sessions ?? []);
|
|
819
|
+
const loading = derived(() => endpointState()?.sessionsLoading ?? false);
|
|
820
|
+
const error = derived(() => endpointState()?.sessionsError ?? "");
|
|
821
|
+
const activeSessionId = derived(() => chat.activeSessionId);
|
|
822
|
+
const visibleSessions = derived(() => sessions().slice(0, SESSION_LIST_CAP));
|
|
823
|
+
const overflowCount = derived(() => Math.max(0, sessions().length - SESSION_LIST_CAP));
|
|
824
|
+
$$renderer.push(`<div class="session-body svelte-1o6rxhb">`);
|
|
825
|
+
if (chat.sending) {
|
|
826
|
+
$$renderer.push("<!--[0-->");
|
|
827
|
+
$$renderer.push(`<div class="notice svelte-1o6rxhb">Wait for the current reply to finish before switching.</div>`);
|
|
828
|
+
} else $$renderer.push("<!--[-1-->");
|
|
829
|
+
$$renderer.push(`<!--]--> `);
|
|
830
|
+
if (loading()) {
|
|
831
|
+
$$renderer.push("<!--[0-->");
|
|
832
|
+
$$renderer.push(`<div class="empty svelte-1o6rxhb">`);
|
|
833
|
+
Spinner($$renderer, { size: 12 });
|
|
834
|
+
$$renderer.push(`<!----><span>Loading sessions…</span></div>`);
|
|
835
|
+
} else if (error()) {
|
|
836
|
+
$$renderer.push("<!--[1-->");
|
|
837
|
+
$$renderer.push(`<div class="list-error svelte-1o6rxhb"><span class="svelte-1o6rxhb">${escape_html(error())}</span> <button type="button" class="retry-btn svelte-1o6rxhb">Retry</button></div>`);
|
|
838
|
+
} else if (sessions().length === 0) {
|
|
839
|
+
$$renderer.push("<!--[2-->");
|
|
840
|
+
$$renderer.push(`<div class="empty svelte-1o6rxhb">No sessions yet. Start the first one.</div>`);
|
|
841
|
+
} else {
|
|
842
|
+
$$renderer.push("<!--[-1-->");
|
|
843
|
+
$$renderer.push(`<div class="session-list svelte-1o6rxhb" role="group" aria-label="Sessions"><!--[-->`);
|
|
844
|
+
const each_array = ensure_array_like(visibleSessions());
|
|
845
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
846
|
+
let s = each_array[$$index];
|
|
847
|
+
$$renderer.push(`<button type="button"${attr_class("list-item session-item svelte-1o6rxhb", void 0, { "active": s.id === activeSessionId() })}${attr("aria-current", s.id === activeSessionId() ? "true" : void 0)}${attr("disabled", chat.sending, true)}${attr("title", formatDateTime(s.updatedAt))}><span class="item-text svelte-1o6rxhb"><span class="item-label svelte-1o6rxhb">`);
|
|
848
|
+
SessionTitle($$renderer, { title: s.title });
|
|
849
|
+
$$renderer.push(`<!---->`);
|
|
850
|
+
if (s.id === activeSessionId()) {
|
|
851
|
+
$$renderer.push("<!--[0-->");
|
|
852
|
+
$$renderer.push(`<span class="sr-only svelte-1o6rxhb">(current)</span>`);
|
|
853
|
+
} else $$renderer.push("<!--[-1-->");
|
|
854
|
+
$$renderer.push(`<!--]--></span> <span class="item-meta svelte-1o6rxhb">${escape_html(formatRelativeTime(s.updatedAt))}</span></span></button>`);
|
|
855
|
+
}
|
|
856
|
+
$$renderer.push(`<!--]--></div> `);
|
|
857
|
+
if (overflowCount() > 0) {
|
|
858
|
+
$$renderer.push("<!--[0-->");
|
|
859
|
+
$$renderer.push(`<button type="button" class="show-all svelte-1o6rxhb">Show all (${escape_html(overflowCount())} more)</button>`);
|
|
860
|
+
} else $$renderer.push("<!--[-1-->");
|
|
861
|
+
$$renderer.push(`<!--]-->`);
|
|
862
|
+
}
|
|
863
|
+
$$renderer.push(`<!--]--> <div class="divider svelte-1o6rxhb"></div> <button type="button" class="list-item new-btn svelte-1o6rxhb"${attr("disabled", chat.sending, true)}><span class="check svelte-1o6rxhb" aria-hidden="true">+</span> <span class="item-text svelte-1o6rxhb"><span class="item-label svelte-1o6rxhb">New session</span></span></button></div>`);
|
|
864
|
+
});
|
|
865
|
+
}
|
|
866
|
+
//#endregion
|
|
867
|
+
//#region src/lib/components/chat/SessionPicker.svelte
|
|
868
|
+
function SessionPicker($$renderer, $$props) {
|
|
869
|
+
$$renderer.component(($$renderer) => {
|
|
870
|
+
let open = false;
|
|
871
|
+
const active = derived(() => endpointsService.active);
|
|
872
|
+
const endpointState = derived(() => active() ? chat.byEndpoint.get(active().id) ?? null : null);
|
|
873
|
+
const sessions = derived(() => endpointState()?.sessions ?? []);
|
|
874
|
+
const activeSessionId = derived(() => chat.activeSessionId);
|
|
875
|
+
const liveConnected = derived(() => chat.liveConnected);
|
|
876
|
+
const activeSummary = derived(() => sessions().find((s) => s.id === activeSessionId()) ?? null);
|
|
877
|
+
const triggerLabel = derived(() => activeSummary() ? resolveSessionTitle(activeSummary().title) : "New session");
|
|
878
|
+
$$renderer.push(`<button type="button" class="trigger svelte-cihcnl" aria-haspopup="dialog"${attr("aria-expanded", open)} aria-label="Sessions"${attr("title", triggerLabel())}><svg class="trigger-icon svelte-cihcnl" 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-cihcnl", void 0, { "connected": liveConnected() })} aria-hidden="true"${attr("title", liveConnected() ? "Live updates connected" : "Live updates disconnected")}></span> <span class="label svelte-cihcnl">${escape_html(triggerLabel())}</span> <span class="caret svelte-cihcnl" aria-hidden="true">▾</span></button> `);
|
|
879
|
+
Drawer($$renderer, {
|
|
880
|
+
open,
|
|
881
|
+
title: `Sessions on ${stringify(active()?.label ?? "this endpoint")}`,
|
|
882
|
+
onClose: () => open = false,
|
|
883
|
+
width: "26rem",
|
|
884
|
+
children: ($$renderer) => {
|
|
885
|
+
SessionList($$renderer, { onChosen: () => open = false });
|
|
886
|
+
}});
|
|
887
|
+
$$renderer.push(`<!---->`);
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
//#endregion
|
|
891
|
+
//#region src/lib/components/chat/VoiceControl.svelte
|
|
892
|
+
function VoiceControl($$renderer, $$props) {
|
|
893
|
+
$$renderer.component(($$renderer) => {
|
|
894
|
+
const MAX_INTERIM_CHARS = 48;
|
|
895
|
+
let mounted = false;
|
|
896
|
+
let removeGlobalMicToggle = null;
|
|
897
|
+
onDestroy(() => {
|
|
898
|
+
window.openpalm?.setTrayMicRecording?.(false);
|
|
899
|
+
removeGlobalMicToggle?.();
|
|
900
|
+
removeGlobalMicToggle = null;
|
|
901
|
+
destroyVoice();
|
|
902
|
+
});
|
|
903
|
+
let supported = derived(() => mounted);
|
|
904
|
+
let ttsAvailable = derived(() => mounted);
|
|
905
|
+
let isRecording = derived(() => voiceState.status === "recording");
|
|
906
|
+
let isTranscribing = derived(() => voiceState.status === "transcribing");
|
|
907
|
+
let isProcessing = derived(() => !isRecording() && !isTranscribing() && chat.sending);
|
|
908
|
+
let isSpeaking = derived(() => voiceState.status === "speaking");
|
|
909
|
+
$$renderer.push(`<div class="voice-control svelte-7elv0w" role="toolbar" aria-label="Voice controls">`);
|
|
910
|
+
if (isRecording() && voiceState.interimTranscript) {
|
|
911
|
+
$$renderer.push("<!--[0-->");
|
|
912
|
+
$$renderer.push(`<span class="voice-interim svelte-7elv0w" 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>`);
|
|
913
|
+
} else $$renderer.push("<!--[-1-->");
|
|
914
|
+
$$renderer.push(`<!--]--> `);
|
|
915
|
+
if (voiceState.autoplayBlocked) {
|
|
916
|
+
$$renderer.push("<!--[0-->");
|
|
917
|
+
$$renderer.push(`<button type="button" class="voice-autoplay-banner svelte-7elv0w" 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-7elv0w"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" class="svelte-7elv0w"></polygon><line x1="23" y1="9" x2="17" y2="15" class="svelte-7elv0w"></line><line x1="17" y1="9" x2="23" y2="15" class="svelte-7elv0w"></line></svg> <span class="svelte-7elv0w">Audio paused — click to resume</span></button>`);
|
|
918
|
+
} else $$renderer.push("<!--[-1-->");
|
|
919
|
+
$$renderer.push(`<!--]--> `);
|
|
920
|
+
if (ttsAvailable()) {
|
|
921
|
+
$$renderer.push("<!--[0-->");
|
|
922
|
+
$$renderer.push(`<button${attr_class("voice-btn svelte-7elv0w", void 0, {
|
|
923
|
+
"voice-btn-on": voiceState.ttsAutoEnabled,
|
|
924
|
+
"voice-btn-speaking": isSpeaking()
|
|
925
|
+
})}${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-7elv0w"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" class="svelte-7elv0w"></polygon>`);
|
|
926
|
+
if (voiceState.ttsAutoEnabled) {
|
|
927
|
+
$$renderer.push("<!--[0-->");
|
|
928
|
+
$$renderer.push(`<path d="M15.54 8.46a5 5 0 0 1 0 7.07"${attr_class("svelte-7elv0w", void 0, { "wave-anim": isSpeaking() })}></path><path d="M19.07 4.93a10 10 0 0 1 0 14.14"${attr_class("svelte-7elv0w", void 0, { "wave-anim-2": isSpeaking() })}></path>`);
|
|
929
|
+
} else {
|
|
930
|
+
$$renderer.push("<!--[-1-->");
|
|
931
|
+
$$renderer.push(`<line x1="23" y1="9" x2="17" y2="15" class="svelte-7elv0w"></line><line x1="17" y1="9" x2="23" y2="15" class="svelte-7elv0w"></line>`);
|
|
932
|
+
}
|
|
933
|
+
$$renderer.push(`<!--]--></svg></button>`);
|
|
934
|
+
} else $$renderer.push("<!--[-1-->");
|
|
935
|
+
$$renderer.push(`<!--]--> <button${attr_class("voice-btn svelte-7elv0w", void 0, {
|
|
936
|
+
"voice-btn-active": isRecording(),
|
|
937
|
+
"voice-btn-processing": isProcessing() || isTranscribing(),
|
|
938
|
+
"voice-btn-disabled": !supported()
|
|
939
|
+
})}${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")}>`);
|
|
940
|
+
if (!supported()) {
|
|
941
|
+
$$renderer.push("<!--[0-->");
|
|
942
|
+
$$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-7elv0w"><line x1="1" y1="1" x2="23" y2="23" class="svelte-7elv0w"></line><path d="M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6" class="svelte-7elv0w"></path><path d="M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23" class="svelte-7elv0w"></path><line x1="12" y1="19" x2="12" y2="23" class="svelte-7elv0w"></line><line x1="8" y1="23" x2="16" y2="23" class="svelte-7elv0w"></line></svg>`);
|
|
943
|
+
} else if (isTranscribing() || isProcessing()) {
|
|
944
|
+
$$renderer.push("<!--[1-->");
|
|
945
|
+
$$renderer.push(`<span class="voice-spinner svelte-7elv0w" aria-hidden="true"></span>`);
|
|
946
|
+
} else if (isRecording()) {
|
|
947
|
+
$$renderer.push("<!--[2-->");
|
|
948
|
+
$$renderer.push(`<svg aria-hidden="true" width="14" height="14" viewBox="0 0 24 24" fill="currentColor" class="svelte-7elv0w"><rect x="6" y="6" width="12" height="12" rx="1.5" class="svelte-7elv0w"></rect></svg> <span class="voice-pulse svelte-7elv0w" aria-hidden="true"></span>`);
|
|
949
|
+
} else {
|
|
950
|
+
$$renderer.push("<!--[-1-->");
|
|
951
|
+
$$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-7elv0w"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" class="svelte-7elv0w"></path><path d="M19 10v2a7 7 0 0 1-14 0v-2" class="svelte-7elv0w"></path><line x1="12" y1="19" x2="12" y2="23" class="svelte-7elv0w"></line><line x1="8" y1="23" x2="16" y2="23" class="svelte-7elv0w"></line></svg>`);
|
|
952
|
+
}
|
|
953
|
+
$$renderer.push(`<!--]--></button> <span class="sr-only svelte-7elv0w" 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>`);
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
//#endregion
|
|
957
|
+
//#region src/lib/components/chrome/Navbar.svelte
|
|
958
|
+
function chatIcon($$renderer) {
|
|
959
|
+
$$renderer.push(`<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"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>`);
|
|
960
|
+
}
|
|
961
|
+
function Navbar($$renderer, $$props) {
|
|
962
|
+
$$renderer.component(($$renderer) => {
|
|
963
|
+
const pathname = derived(() => page.url?.pathname ?? "");
|
|
964
|
+
const onAdmin = derived(() => pathname() === "/admin" || pathname().startsWith("/admin/"));
|
|
965
|
+
const onChatSurface = derived(() => pathname() === "/chat" || pathname().startsWith("/chat/"));
|
|
966
|
+
const onAdvancedSurface = derived(() => pathname() === "/advanced" || pathname().startsWith("/advanced/"));
|
|
967
|
+
const isLocalAssistant = derived(() => {
|
|
968
|
+
return isLocalAssistantUrl(endpointsService.active?.url);
|
|
969
|
+
});
|
|
970
|
+
$$renderer.push(`<header class="navbar svelte-66bgq1"><div class="navbar-inner svelte-66bgq1"><a class="navbar-brand svelte-66bgq1" href="/chat" aria-label="OpenPalm — go to chat"><span class="brand-icon svelte-66bgq1" aria-hidden="true"><img src="/logo-128.png" alt="" class="svelte-66bgq1"/></span> <span class="brand-text svelte-66bgq1">OpenPalm</span></a> <div class="navbar-actions svelte-66bgq1">`);
|
|
971
|
+
if (onAdmin()) {
|
|
972
|
+
$$renderer.push("<!--[0-->");
|
|
973
|
+
IconButton($$renderer, {
|
|
974
|
+
href: "/chat",
|
|
975
|
+
ariaLabel: "Back to chat",
|
|
976
|
+
title: "Chat",
|
|
977
|
+
icon: chatIcon
|
|
978
|
+
});
|
|
979
|
+
} else $$renderer.push("<!--[-1-->");
|
|
980
|
+
$$renderer.push(`<!--]--> `);
|
|
981
|
+
SettingsDrawer($$renderer, { showManageAssistant: isLocalAssistant() });
|
|
982
|
+
$$renderer.push(`<!----> `);
|
|
983
|
+
if (onChatSurface()) {
|
|
984
|
+
$$renderer.push("<!--[0-->");
|
|
985
|
+
$$renderer.push(`<span class="chat-selectors svelte-66bgq1">`);
|
|
986
|
+
EndpointSwitcher($$renderer);
|
|
987
|
+
$$renderer.push(`<!----> `);
|
|
988
|
+
SessionPicker($$renderer);
|
|
989
|
+
$$renderer.push(`<!----></span>`);
|
|
990
|
+
} else $$renderer.push("<!--[-1-->");
|
|
991
|
+
$$renderer.push(`<!--]--> `);
|
|
992
|
+
if (onChatSurface() || onAdvancedSurface()) {
|
|
993
|
+
$$renderer.push("<!--[0-->");
|
|
994
|
+
ModeSwitch($$renderer);
|
|
995
|
+
} else $$renderer.push("<!--[-1-->");
|
|
996
|
+
$$renderer.push(`<!--]--> `);
|
|
997
|
+
VoiceControl($$renderer);
|
|
998
|
+
$$renderer.push(`<!----></div></div></header>`);
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
export { EndpointList as E, IconButton as I, Navbar as N, SessionList as S, chat as c, endpointsService as e, formatTime as f };
|
|
1003
|
+
//# sourceMappingURL=Navbar-PVEly3CX.js.map
|