@openpalm/ui 0.11.0-rc.2
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/README.md +129 -0
- package/build/.openpalm-ui-version +1 -0
- package/build/client/_app/immutable/assets/0.BK7X4bPu.css +1 -0
- package/build/client/_app/immutable/assets/0.BK7X4bPu.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BK7X4bPu.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.D9MwgTDo.css +1 -0
- package/build/client/_app/immutable/assets/4.D9MwgTDo.css.br +0 -0
- package/build/client/_app/immutable/assets/4.D9MwgTDo.css.gz +0 -0
- package/build/client/_app/immutable/assets/5.Cj0Mk9Gn.css +1 -0
- package/build/client/_app/immutable/assets/5.Cj0Mk9Gn.css.br +0 -0
- package/build/client/_app/immutable/assets/5.Cj0Mk9Gn.css.gz +0 -0
- package/build/client/_app/immutable/assets/6.DJenXolA.css +1 -0
- package/build/client/_app/immutable/assets/6.DJenXolA.css.br +0 -0
- package/build/client/_app/immutable/assets/6.DJenXolA.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.BHUsSUvX.css +1 -0
- package/build/client/_app/immutable/assets/7.BHUsSUvX.css.br +0 -0
- package/build/client/_app/immutable/assets/7.BHUsSUvX.css.gz +0 -0
- package/build/client/_app/immutable/assets/8.DjrHy5wu.css +1 -0
- 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.BtJV-xXj.css +1 -0
- package/build/client/_app/immutable/assets/AuthGate.BtJV-xXj.css.br +0 -0
- package/build/client/_app/immutable/assets/AuthGate.BtJV-xXj.css.gz +0 -0
- package/build/client/_app/immutable/assets/VoiceProfileSelector.Dp7tWdKe.css +1 -0
- 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/BuFlayix.js +1 -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 +3 -0
- 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/C8qMxft1.js +1 -0
- package/build/client/_app/immutable/chunks/C8qMxft1.js.br +0 -0
- package/build/client/_app/immutable/chunks/C8qMxft1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cb_i8bV9.js +1 -0
- 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/CzXGhlNF.js +1 -0
- package/build/client/_app/immutable/chunks/CzXGhlNF.js.br +0 -0
- package/build/client/_app/immutable/chunks/CzXGhlNF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DYskO3Sk.js +5 -0
- package/build/client/_app/immutable/chunks/DYskO3Sk.js.br +0 -0
- package/build/client/_app/immutable/chunks/DYskO3Sk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ak2ISc8B.js +1 -0
- package/build/client/_app/immutable/chunks/ak2ISc8B.js.br +0 -0
- package/build/client/_app/immutable/chunks/ak2ISc8B.js.gz +0 -0
- package/build/client/_app/immutable/chunks/kNaey6uv.js +1 -0
- package/build/client/_app/immutable/chunks/kNaey6uv.js.br +0 -0
- package/build/client/_app/immutable/chunks/kNaey6uv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/os2NZ37U.js +1 -0
- package/build/client/_app/immutable/chunks/os2NZ37U.js.br +1 -0
- package/build/client/_app/immutable/chunks/os2NZ37U.js.gz +0 -0
- package/build/client/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/build/client/_app/immutable/chunks/xihTtKlq.js.br +1 -0
- package/build/client/_app/immutable/chunks/xihTtKlq.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.C_eSlUyi.js +2 -0
- package/build/client/_app/immutable/entry/app.C_eSlUyi.js.br +0 -0
- package/build/client/_app/immutable/entry/app.C_eSlUyi.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BAta_Cih.js +1 -0
- package/build/client/_app/immutable/entry/start.BAta_Cih.js.br +0 -0
- package/build/client/_app/immutable/entry/start.BAta_Cih.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.Bi_of0So.js +1 -0
- package/build/client/_app/immutable/nodes/0.Bi_of0So.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Bi_of0So.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.qjZsjpWC.js +1 -0
- package/build/client/_app/immutable/nodes/1.qjZsjpWC.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.qjZsjpWC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.ojh8oE7F.js +1 -0
- 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 +1 -0
- 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.BYtA2xx-.js +19 -0
- package/build/client/_app/immutable/nodes/4.BYtA2xx-.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.BYtA2xx-.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.ChSoAFFd.js +4 -0
- package/build/client/_app/immutable/nodes/5.ChSoAFFd.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.ChSoAFFd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BRG0vYmH.js +1 -0
- package/build/client/_app/immutable/nodes/6.BRG0vYmH.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BRG0vYmH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.BVvy1f_p.js +15 -0
- package/build/client/_app/immutable/nodes/7.BVvy1f_p.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BVvy1f_p.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.Cb4MWMah.js +2 -0
- package/build/client/_app/immutable/nodes/8.Cb4MWMah.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.Cb4MWMah.js.gz +0 -0
- package/build/client/_app/version.json +1 -0
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/banner.png +0 -0
- package/build/client/fu-128.png +0 -0
- package/build/client/fu.png +0 -0
- package/build/client/logo-128.png +0 -0
- package/build/client/logo.png +0 -0
- package/build/client/setup/wizard.css +1639 -0
- package/build/client/setup/wizard.css.br +0 -0
- package/build/client/setup/wizard.css.gz +0 -0
- package/build/client/wizard-128.png +0 -0
- package/build/client/wizard.png +0 -0
- package/build/env.js +94 -0
- package/build/handler.js +1494 -0
- package/build/index.js +345 -0
- package/build/server/chunks/0-Dk6RRhi2.js +9 -0
- package/build/server/chunks/0-Dk6RRhi2.js.map +1 -0
- package/build/server/chunks/1-CWcY3PRs.js +9 -0
- package/build/server/chunks/1-CWcY3PRs.js.map +1 -0
- package/build/server/chunks/2-C2y4ydWU.js +9 -0
- package/build/server/chunks/2-C2y4ydWU.js.map +1 -0
- package/build/server/chunks/3-BgeGdVvT.js +23 -0
- package/build/server/chunks/3-BgeGdVvT.js.map +1 -0
- package/build/server/chunks/4-DeAt_mYc.js +9 -0
- package/build/server/chunks/4-DeAt_mYc.js.map +1 -0
- package/build/server/chunks/5-qTXiNPEM.js +9 -0
- package/build/server/chunks/5-qTXiNPEM.js.map +1 -0
- package/build/server/chunks/6-C444Mr69.js +9 -0
- package/build/server/chunks/6-C444Mr69.js.map +1 -0
- package/build/server/chunks/7-Dg_sVly5.js +9 -0
- package/build/server/chunks/7-Dg_sVly5.js.map +1 -0
- package/build/server/chunks/8-CF5kn4AY.js +9 -0
- package/build/server/chunks/8-CF5kn4AY.js.map +1 -0
- package/build/server/chunks/AuthGate-keg7G6rX.js +707 -0
- package/build/server/chunks/AuthGate-keg7G6rX.js.map +1 -0
- package/build/server/chunks/_helpers-B_lb4-jB.js +74 -0
- package/build/server/chunks/_helpers-B_lb4-jB.js.map +1 -0
- package/build/server/chunks/_layout.svelte-B93aaRP_.js +11 -0
- package/build/server/chunks/_layout.svelte-B93aaRP_.js.map +1 -0
- package/build/server/chunks/_layout.svelte-BNWepgTx.js +58 -0
- package/build/server/chunks/_layout.svelte-BNWepgTx.js.map +1 -0
- package/build/server/chunks/_page.svelte-BP2EdQl3.js +5 -0
- package/build/server/chunks/_page.svelte-BP2EdQl3.js.map +1 -0
- package/build/server/chunks/_page.svelte-BdYSYjmj.js +67 -0
- package/build/server/chunks/_page.svelte-BdYSYjmj.js.map +1 -0
- package/build/server/chunks/_page.svelte-BiKY57wg.js +533 -0
- package/build/server/chunks/_page.svelte-BiKY57wg.js.map +1 -0
- package/build/server/chunks/_page.svelte-CtX_8pMq.js +5528 -0
- package/build/server/chunks/_page.svelte-CtX_8pMq.js.map +1 -0
- package/build/server/chunks/_page.svelte-D0gMlmzQ.js +104 -0
- package/build/server/chunks/_page.svelte-D0gMlmzQ.js.map +1 -0
- package/build/server/chunks/_page.svelte-DwMiUmq6.js +107 -0
- package/build/server/chunks/_page.svelte-DwMiUmq6.js.map +1 -0
- package/build/server/chunks/_server.ts-0FuXkx70.js +56 -0
- package/build/server/chunks/_server.ts-0FuXkx70.js.map +1 -0
- package/build/server/chunks/_server.ts-33LuQvHu.js +19 -0
- package/build/server/chunks/_server.ts-33LuQvHu.js.map +1 -0
- package/build/server/chunks/_server.ts-5Q0J3F4-.js +55 -0
- package/build/server/chunks/_server.ts-5Q0J3F4-.js.map +1 -0
- package/build/server/chunks/_server.ts-AJk0xBLJ.js +46 -0
- package/build/server/chunks/_server.ts-AJk0xBLJ.js.map +1 -0
- package/build/server/chunks/_server.ts-AQe1PIYE.js +68 -0
- package/build/server/chunks/_server.ts-AQe1PIYE.js.map +1 -0
- package/build/server/chunks/_server.ts-B0N2Nj7L.js +44 -0
- package/build/server/chunks/_server.ts-B0N2Nj7L.js.map +1 -0
- package/build/server/chunks/_server.ts-BDBJ6fxs.js +67 -0
- package/build/server/chunks/_server.ts-BDBJ6fxs.js.map +1 -0
- package/build/server/chunks/_server.ts-BEeaI665.js +79 -0
- package/build/server/chunks/_server.ts-BEeaI665.js.map +1 -0
- package/build/server/chunks/_server.ts-BM4QuGQf.js +53 -0
- package/build/server/chunks/_server.ts-BM4QuGQf.js.map +1 -0
- package/build/server/chunks/_server.ts-BSIZMZVn.js +50 -0
- package/build/server/chunks/_server.ts-BSIZMZVn.js.map +1 -0
- package/build/server/chunks/_server.ts-BV-6Mum8.js +54 -0
- package/build/server/chunks/_server.ts-BV-6Mum8.js.map +1 -0
- package/build/server/chunks/_server.ts-BdnJF23z.js +44 -0
- package/build/server/chunks/_server.ts-BdnJF23z.js.map +1 -0
- package/build/server/chunks/_server.ts-Bfy4RFhe.js +41 -0
- package/build/server/chunks/_server.ts-Bfy4RFhe.js.map +1 -0
- package/build/server/chunks/_server.ts-Bhh33s6N.js +149 -0
- package/build/server/chunks/_server.ts-Bhh33s6N.js.map +1 -0
- package/build/server/chunks/_server.ts-BiSuK8jN.js +41 -0
- package/build/server/chunks/_server.ts-BiSuK8jN.js.map +1 -0
- package/build/server/chunks/_server.ts-BjiyoKWK.js +41 -0
- package/build/server/chunks/_server.ts-BjiyoKWK.js.map +1 -0
- package/build/server/chunks/_server.ts-BnEeEd9g.js +57 -0
- package/build/server/chunks/_server.ts-BnEeEd9g.js.map +1 -0
- package/build/server/chunks/_server.ts-Bq2dkWvj.js +33 -0
- package/build/server/chunks/_server.ts-Bq2dkWvj.js.map +1 -0
- package/build/server/chunks/_server.ts-Br16AqpO.js +82 -0
- package/build/server/chunks/_server.ts-Br16AqpO.js.map +1 -0
- package/build/server/chunks/_server.ts-BsZrddQT.js +200 -0
- package/build/server/chunks/_server.ts-BsZrddQT.js.map +1 -0
- package/build/server/chunks/_server.ts-Btbzy89u.js +65 -0
- package/build/server/chunks/_server.ts-Btbzy89u.js.map +1 -0
- package/build/server/chunks/_server.ts-BudQlGOx.js +70 -0
- package/build/server/chunks/_server.ts-BudQlGOx.js.map +1 -0
- package/build/server/chunks/_server.ts-BxPYakCb.js +59 -0
- package/build/server/chunks/_server.ts-BxPYakCb.js.map +1 -0
- package/build/server/chunks/_server.ts-ByyRcwFy.js +79 -0
- package/build/server/chunks/_server.ts-ByyRcwFy.js.map +1 -0
- package/build/server/chunks/_server.ts-C7rtn3mH.js +103 -0
- package/build/server/chunks/_server.ts-C7rtn3mH.js.map +1 -0
- package/build/server/chunks/_server.ts-C88qd-ju.js +46 -0
- package/build/server/chunks/_server.ts-C88qd-ju.js.map +1 -0
- package/build/server/chunks/_server.ts-CD6LeslU.js +55 -0
- package/build/server/chunks/_server.ts-CD6LeslU.js.map +1 -0
- package/build/server/chunks/_server.ts-CDlWxA5S.js +60 -0
- package/build/server/chunks/_server.ts-CDlWxA5S.js.map +1 -0
- package/build/server/chunks/_server.ts-CGqrfNlv.js +514 -0
- package/build/server/chunks/_server.ts-CGqrfNlv.js.map +1 -0
- package/build/server/chunks/_server.ts-CGwYZUuw.js +759 -0
- package/build/server/chunks/_server.ts-CGwYZUuw.js.map +1 -0
- package/build/server/chunks/_server.ts-CHVs0yya.js +54 -0
- package/build/server/chunks/_server.ts-CHVs0yya.js.map +1 -0
- package/build/server/chunks/_server.ts-CMEY6oQe.js +121 -0
- package/build/server/chunks/_server.ts-CMEY6oQe.js.map +1 -0
- package/build/server/chunks/_server.ts-CS73tiTY.js +63 -0
- package/build/server/chunks/_server.ts-CS73tiTY.js.map +1 -0
- package/build/server/chunks/_server.ts-CWwgmo8z.js +33 -0
- package/build/server/chunks/_server.ts-CWwgmo8z.js.map +1 -0
- package/build/server/chunks/_server.ts-CXzZeGlQ.js +55 -0
- package/build/server/chunks/_server.ts-CXzZeGlQ.js.map +1 -0
- package/build/server/chunks/_server.ts-C_kseo_y.js +72 -0
- package/build/server/chunks/_server.ts-C_kseo_y.js.map +1 -0
- package/build/server/chunks/_server.ts-Cbk-UThV.js +73 -0
- package/build/server/chunks/_server.ts-Cbk-UThV.js.map +1 -0
- package/build/server/chunks/_server.ts-CboRRTK1.js +139 -0
- package/build/server/chunks/_server.ts-CboRRTK1.js.map +1 -0
- package/build/server/chunks/_server.ts-CgD8-EFl.js +52 -0
- package/build/server/chunks/_server.ts-CgD8-EFl.js.map +1 -0
- package/build/server/chunks/_server.ts-Ci-q0BiD.js +79 -0
- package/build/server/chunks/_server.ts-Ci-q0BiD.js.map +1 -0
- package/build/server/chunks/_server.ts-Cn7ahHlk.js +44 -0
- package/build/server/chunks/_server.ts-Cn7ahHlk.js.map +1 -0
- package/build/server/chunks/_server.ts-Cy36-qGT.js +60 -0
- package/build/server/chunks/_server.ts-Cy36-qGT.js.map +1 -0
- package/build/server/chunks/_server.ts-CyFZ9OZQ.js +97 -0
- package/build/server/chunks/_server.ts-CyFZ9OZQ.js.map +1 -0
- package/build/server/chunks/_server.ts-D-UAqhor.js +33 -0
- package/build/server/chunks/_server.ts-D-UAqhor.js.map +1 -0
- package/build/server/chunks/_server.ts-D1cb1hmF.js +90 -0
- package/build/server/chunks/_server.ts-D1cb1hmF.js.map +1 -0
- package/build/server/chunks/_server.ts-D33gvU5B.js +65 -0
- package/build/server/chunks/_server.ts-D33gvU5B.js.map +1 -0
- package/build/server/chunks/_server.ts-DDwiNChJ.js +88 -0
- package/build/server/chunks/_server.ts-DDwiNChJ.js.map +1 -0
- package/build/server/chunks/_server.ts-DEnxvwcJ.js +46 -0
- package/build/server/chunks/_server.ts-DEnxvwcJ.js.map +1 -0
- package/build/server/chunks/_server.ts-DHXmcRrP.js +41 -0
- package/build/server/chunks/_server.ts-DHXmcRrP.js.map +1 -0
- package/build/server/chunks/_server.ts-DQxY-pHZ.js +64 -0
- package/build/server/chunks/_server.ts-DQxY-pHZ.js.map +1 -0
- package/build/server/chunks/_server.ts-DXNJ2LJu.js +83 -0
- package/build/server/chunks/_server.ts-DXNJ2LJu.js.map +1 -0
- package/build/server/chunks/_server.ts-Dbly1Fe-.js +96 -0
- package/build/server/chunks/_server.ts-Dbly1Fe-.js.map +1 -0
- package/build/server/chunks/_server.ts-DffjWMNC.js +53 -0
- package/build/server/chunks/_server.ts-DffjWMNC.js.map +1 -0
- package/build/server/chunks/_server.ts-Di-8UJYw.js +40 -0
- package/build/server/chunks/_server.ts-Di-8UJYw.js.map +1 -0
- package/build/server/chunks/_server.ts-DsEzCr9k.js +109 -0
- package/build/server/chunks/_server.ts-DsEzCr9k.js.map +1 -0
- package/build/server/chunks/_server.ts-DwXd92Ow.js +63 -0
- package/build/server/chunks/_server.ts-DwXd92Ow.js.map +1 -0
- package/build/server/chunks/_server.ts-DwjjO7L5.js +41 -0
- package/build/server/chunks/_server.ts-DwjjO7L5.js.map +1 -0
- package/build/server/chunks/_server.ts-DyEbcQS0.js +62 -0
- package/build/server/chunks/_server.ts-DyEbcQS0.js.map +1 -0
- package/build/server/chunks/_server.ts-HxcM6xQA.js +70 -0
- package/build/server/chunks/_server.ts-HxcM6xQA.js.map +1 -0
- package/build/server/chunks/_server.ts-JItoNB1Z.js +57 -0
- package/build/server/chunks/_server.ts-JItoNB1Z.js.map +1 -0
- package/build/server/chunks/_server.ts-KpT_vKKo.js +77 -0
- package/build/server/chunks/_server.ts-KpT_vKKo.js.map +1 -0
- package/build/server/chunks/_server.ts-WbY7XmtT.js +157 -0
- package/build/server/chunks/_server.ts-WbY7XmtT.js.map +1 -0
- package/build/server/chunks/_server.ts-Yy0BWsSd.js +70 -0
- package/build/server/chunks/_server.ts-Yy0BWsSd.js.map +1 -0
- package/build/server/chunks/_server.ts-b9yNYKW6.js +49 -0
- package/build/server/chunks/_server.ts-b9yNYKW6.js.map +1 -0
- package/build/server/chunks/_server.ts-bAJXjaCc.js +42 -0
- package/build/server/chunks/_server.ts-bAJXjaCc.js.map +1 -0
- package/build/server/chunks/_server.ts-cwRl-tZ-.js +40 -0
- package/build/server/chunks/_server.ts-cwRl-tZ-.js.map +1 -0
- package/build/server/chunks/_server.ts-hMTx0DC3.js +159 -0
- package/build/server/chunks/_server.ts-hMTx0DC3.js.map +1 -0
- package/build/server/chunks/_server.ts-l_HoZ2_I.js +163 -0
- package/build/server/chunks/_server.ts-l_HoZ2_I.js.map +1 -0
- package/build/server/chunks/_server.ts-uLRX2uy0.js +107 -0
- package/build/server/chunks/_server.ts-uLRX2uy0.js.map +1 -0
- package/build/server/chunks/_server.ts-uWfb47S6.js +204 -0
- package/build/server/chunks/_server.ts-uWfb47S6.js.map +1 -0
- package/build/server/chunks/addon-helpers-Bnj3aKJ2.js +49 -0
- package/build/server/chunks/addon-helpers-Bnj3aKJ2.js.map +1 -0
- package/build/server/chunks/chunk-CLZ62Ad-.js +18 -0
- package/build/server/chunks/chunk-CLZ62Ad-.js.map +1 -0
- package/build/server/chunks/coercion-TNFJisCC.js +34 -0
- package/build/server/chunks/coercion-TNFJisCC.js.map +1 -0
- package/build/server/chunks/config-CEYPfvQh.js +121 -0
- package/build/server/chunks/config-CEYPfvQh.js.map +1 -0
- package/build/server/chunks/dev-DjANv7AF.js +4389 -0
- package/build/server/chunks/dev-DjANv7AF.js.map +1 -0
- package/build/server/chunks/docker-sGFTjRfy.js +20 -0
- package/build/server/chunks/docker-sGFTjRfy.js.map +1 -0
- package/build/server/chunks/endpoints-L7Wjvq44.js +340 -0
- package/build/server/chunks/endpoints-L7Wjvq44.js.map +1 -0
- package/build/server/chunks/environment-BnT49Gi3.js +36 -0
- package/build/server/chunks/environment-BnT49Gi3.js.map +1 -0
- package/build/server/chunks/error.svelte-PJnhZZCy.js +16 -0
- package/build/server/chunks/error.svelte-PJnhZZCy.js.map +1 -0
- package/build/server/chunks/exports-D1quPX8S.js +124 -0
- package/build/server/chunks/exports-D1quPX8S.js.map +1 -0
- package/build/server/chunks/helpers-5jd3ccud.js +226 -0
- package/build/server/chunks/helpers-5jd3ccud.js.map +1 -0
- package/build/server/chunks/hooks.server-Al9-eO5K.js +82 -0
- package/build/server/chunks/hooks.server-Al9-eO5K.js.map +1 -0
- package/build/server/chunks/http-D5xo_m60.js +31 -0
- package/build/server/chunks/http-D5xo_m60.js.map +1 -0
- package/build/server/chunks/internal-CJBOAkaQ.js +1544 -0
- package/build/server/chunks/internal-CJBOAkaQ.js.map +1 -0
- package/build/server/chunks/serial-queue-D9FEpYVv.js +22 -0
- package/build/server/chunks/serial-queue-D9FEpYVv.js.map +1 -0
- package/build/server/chunks/setup-deploy-UKTSVAC0.js +529 -0
- package/build/server/chunks/setup-deploy-UKTSVAC0.js.map +1 -0
- package/build/server/chunks/src-FpMyngcw.js +14064 -0
- package/build/server/chunks/src-FpMyngcw.js.map +1 -0
- package/build/server/chunks/state-BI-lJPhE.js +203 -0
- package/build/server/chunks/state-BI-lJPhE.js.map +1 -0
- package/build/server/chunks/utils-BSRjJDrZ.js +150 -0
- package/build/server/chunks/utils-BSRjJDrZ.js.map +1 -0
- package/build/server/chunks/voice-state.svelte-CQp8u0bn.js +437 -0
- package/build/server/chunks/voice-state.svelte-CQp8u0bn.js.map +1 -0
- package/build/server/index.js +4359 -0
- package/build/server/index.js.map +1 -0
- package/build/server/manifest.js +570 -0
- package/build/server/manifest.js.map +1 -0
- package/build/shims.js +32 -0
- package/package.json +61 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
//#region src/lib/api.ts
|
|
2
|
+
var apiBase = "";
|
|
3
|
+
function buildHeaders() {
|
|
4
|
+
return {
|
|
5
|
+
"x-request-id": crypto.randomUUID(),
|
|
6
|
+
"x-requested-by": "ui"
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
async function request(method, path, body) {
|
|
10
|
+
const headers = {
|
|
11
|
+
...body !== void 0 ? { "content-type": "application/json" } : {},
|
|
12
|
+
...buildHeaders()
|
|
13
|
+
};
|
|
14
|
+
return fetch(`${apiBase}${path}`, {
|
|
15
|
+
method,
|
|
16
|
+
headers,
|
|
17
|
+
credentials: "include",
|
|
18
|
+
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async function readErrorMessage(res, fallback = `Request failed (HTTP ${res.status})`) {
|
|
22
|
+
if ((res.headers.get("content-type") ?? "").includes("application/json")) {
|
|
23
|
+
const data = await res.clone().json().catch((e) => {
|
|
24
|
+
console.warn("[api] Failed to parse JSON error response:", e);
|
|
25
|
+
return null;
|
|
26
|
+
});
|
|
27
|
+
if (data && typeof data.message === "string" && data.message.length > 0) return data.message;
|
|
28
|
+
if (data && typeof data.error === "string" && data.error.length > 0) return data.error;
|
|
29
|
+
}
|
|
30
|
+
return await res.text().catch((e) => {
|
|
31
|
+
console.warn("[api] Failed to read error response text:", e);
|
|
32
|
+
return "";
|
|
33
|
+
}) || fallback;
|
|
34
|
+
}
|
|
35
|
+
/** Throw on 401; throw readErrorMessage on non-OK. Returns the response. */
|
|
36
|
+
async function requireOk(res, fallback) {
|
|
37
|
+
if (res.status === 401) throw Object.assign(/* @__PURE__ */ new Error("Sign-in required."), { status: 401 });
|
|
38
|
+
if (!res.ok) throw new Error(await readErrorMessage(res, fallback));
|
|
39
|
+
return res;
|
|
40
|
+
}
|
|
41
|
+
async function fetchHealth() {
|
|
42
|
+
const [adminRes, guardianRes] = await Promise.all([request("GET", "/health"), request("GET", "/guardian/health").catch((e) => {
|
|
43
|
+
console.warn("[api] Guardian health check failed:", e);
|
|
44
|
+
return null;
|
|
45
|
+
})]);
|
|
46
|
+
const admin = await adminRes.json();
|
|
47
|
+
let guardian = null;
|
|
48
|
+
if (guardianRes) try {
|
|
49
|
+
guardian = await guardianRes.json();
|
|
50
|
+
} catch (e) {
|
|
51
|
+
console.warn("[api] Failed to parse guardian health response:", e);
|
|
52
|
+
guardian = {
|
|
53
|
+
status: "unavailable",
|
|
54
|
+
service: "guardian"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
admin,
|
|
59
|
+
guardian
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function fetchContainers() {
|
|
63
|
+
return await (await requireOk(await request("GET", "/admin/containers/list"))).json();
|
|
64
|
+
}
|
|
65
|
+
async function applyChanges() {
|
|
66
|
+
const res = await request("POST", "/admin/update", {});
|
|
67
|
+
if (res.status === 401) throw Object.assign(/* @__PURE__ */ new Error("Sign-in required."), { status: 401 });
|
|
68
|
+
if (!(res.headers.get("content-type") ?? "").includes("application/json")) throw new Error(await readErrorMessage(res, `Apply failed (HTTP ${res.status})`));
|
|
69
|
+
return await res.json();
|
|
70
|
+
}
|
|
71
|
+
async function upgradeStack() {
|
|
72
|
+
return await (await requireOk(await request("POST", "/admin/upgrade", {}))).json();
|
|
73
|
+
}
|
|
74
|
+
async function fetchVersions() {
|
|
75
|
+
return await (await requireOk(await request("GET", "/admin/versions"))).json();
|
|
76
|
+
}
|
|
77
|
+
async function fetchReleases() {
|
|
78
|
+
try {
|
|
79
|
+
const res = await request("GET", "/admin/versions/releases");
|
|
80
|
+
if (!res.ok) return { releases: [] };
|
|
81
|
+
return await res.json();
|
|
82
|
+
} catch {
|
|
83
|
+
return { releases: [] };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function setStackVersion(tag) {
|
|
87
|
+
return await (await requireOk(await request("PATCH", "/admin/stack-version", { tag }))).json();
|
|
88
|
+
}
|
|
89
|
+
async function downloadUiVersion(tag) {
|
|
90
|
+
return await (await requireOk(await request("POST", "/admin/ui-version", { tag }))).json();
|
|
91
|
+
}
|
|
92
|
+
async function fetchAutomations() {
|
|
93
|
+
return await (await requireOk(await request("GET", "/admin/automations"))).json();
|
|
94
|
+
}
|
|
95
|
+
async function fetchEndpoints() {
|
|
96
|
+
return await (await requireOk(await request("GET", "/admin/endpoints"))).json();
|
|
97
|
+
}
|
|
98
|
+
async function setActiveEndpoint(id) {
|
|
99
|
+
return await (await requireOk(await request("POST", "/admin/endpoints/active", { id }))).json();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a new OpenCode session via the SvelteKit broker.
|
|
103
|
+
*
|
|
104
|
+
* Only `/proxy/assistant/*` is reachable from the browser. The active
|
|
105
|
+
* OpenCode instance is selected server-side via the connection switcher.
|
|
106
|
+
*/
|
|
107
|
+
async function createSession() {
|
|
108
|
+
return await (await requireOk(await request("POST", `/proxy/assistant/session`, {}))).json();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* List sessions on the active OpenCode endpoint.
|
|
112
|
+
*
|
|
113
|
+
* OpenCode returns `Array<Session>` with no ordering guarantee; we sort
|
|
114
|
+
* desc by `time.updated` here so consumers can rely on it. See
|
|
115
|
+
* docs/technical/multi-endpoint-session-ux.md §2.
|
|
116
|
+
*/
|
|
117
|
+
async function listSessions() {
|
|
118
|
+
const summaries = (await (await requireOk(await request("GET", "/proxy/assistant/session"))).json()).map((s) => ({
|
|
119
|
+
id: s.id,
|
|
120
|
+
title: s.title ?? "",
|
|
121
|
+
createdAt: s.time?.created ?? 0,
|
|
122
|
+
updatedAt: s.time?.updated ?? s.time?.created ?? 0
|
|
123
|
+
}));
|
|
124
|
+
summaries.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
125
|
+
return summaries;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Fetch the messages for a session and map them to UI `ChatMessage`s.
|
|
129
|
+
*
|
|
130
|
+
* Skips non-text parts (tool calls, files, reasoning, etc.). Empty-text
|
|
131
|
+
* messages are dropped so the UI doesn't render placeholder bubbles.
|
|
132
|
+
*/
|
|
133
|
+
async function getSessionMessages(sessionId) {
|
|
134
|
+
const rows = await (await requireOk(await request("GET", `/proxy/assistant/session/${encodeURIComponent(sessionId)}/message`))).json();
|
|
135
|
+
const messages = [];
|
|
136
|
+
for (const row of rows) {
|
|
137
|
+
const text = row.parts.filter((p) => p.type === "text" && p.text).map((p) => p.text ?? "").join("");
|
|
138
|
+
if (!text) continue;
|
|
139
|
+
messages.push({
|
|
140
|
+
id: row.info.id,
|
|
141
|
+
role: row.info.role,
|
|
142
|
+
text,
|
|
143
|
+
timestamp: row.info.time?.created ?? Date.now()
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return messages;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Send a message to an existing OpenCode session via the SvelteKit broker.
|
|
150
|
+
* Uses direct fetch with a 150s AbortSignal timeout — OpenCode responses
|
|
151
|
+
* can take 30–120s.
|
|
152
|
+
*/
|
|
153
|
+
async function sendChatMessage(sessionId, text) {
|
|
154
|
+
const res = await fetch(`/proxy/assistant/session/${encodeURIComponent(sessionId)}/message`, {
|
|
155
|
+
method: "POST",
|
|
156
|
+
headers: {
|
|
157
|
+
"content-type": "application/json",
|
|
158
|
+
...buildHeaders()
|
|
159
|
+
},
|
|
160
|
+
credentials: "include",
|
|
161
|
+
body: JSON.stringify({ parts: [{
|
|
162
|
+
type: "text",
|
|
163
|
+
text
|
|
164
|
+
}] }),
|
|
165
|
+
signal: AbortSignal.timeout(15e4)
|
|
166
|
+
});
|
|
167
|
+
if (res.status === 401) throw Object.assign(/* @__PURE__ */ new Error("Sign-in required."), { status: 401 });
|
|
168
|
+
if (!res.ok) {
|
|
169
|
+
const msg = await readErrorMessage(res);
|
|
170
|
+
throw Object.assign(new Error(msg), { status: res.status });
|
|
171
|
+
}
|
|
172
|
+
return await res.json();
|
|
173
|
+
}
|
|
174
|
+
//#endregion
|
|
175
|
+
//#region src/lib/notifications.svelte.ts
|
|
176
|
+
var DEFAULT_TIMEOUTS = {
|
|
177
|
+
info: 4e3,
|
|
178
|
+
success: 5e3,
|
|
179
|
+
error: 8e3
|
|
180
|
+
};
|
|
181
|
+
var Notifications = class {
|
|
182
|
+
toasts = [];
|
|
183
|
+
timers = /* @__PURE__ */ new Map();
|
|
184
|
+
push(kind, message, opts = {}) {
|
|
185
|
+
const id = opts.replaceId ?? (typeof crypto !== "undefined" && "randomUUID" in crypto ? crypto.randomUUID() : `t-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
186
|
+
const ttlMs = opts.sticky ? null : opts.ttlMs ?? DEFAULT_TIMEOUTS[kind];
|
|
187
|
+
const toast = {
|
|
188
|
+
id,
|
|
189
|
+
kind,
|
|
190
|
+
message,
|
|
191
|
+
ttlMs
|
|
192
|
+
};
|
|
193
|
+
const existingTimer = this.timers.get(id);
|
|
194
|
+
if (existingTimer) {
|
|
195
|
+
clearTimeout(existingTimer);
|
|
196
|
+
this.timers.delete(id);
|
|
197
|
+
}
|
|
198
|
+
const existingIdx = this.toasts.findIndex((t) => t.id === id);
|
|
199
|
+
if (existingIdx >= 0) {
|
|
200
|
+
const next = [...this.toasts];
|
|
201
|
+
next[existingIdx] = toast;
|
|
202
|
+
this.toasts = next;
|
|
203
|
+
} else this.toasts = [...this.toasts, toast];
|
|
204
|
+
if (ttlMs !== null) {
|
|
205
|
+
const timer = setTimeout(() => this.dismiss(id), ttlMs);
|
|
206
|
+
this.timers.set(id, timer);
|
|
207
|
+
}
|
|
208
|
+
return id;
|
|
209
|
+
}
|
|
210
|
+
dismiss(id) {
|
|
211
|
+
const timer = this.timers.get(id);
|
|
212
|
+
if (timer) {
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
this.timers.delete(id);
|
|
215
|
+
}
|
|
216
|
+
this.toasts = this.toasts.filter((t) => t.id !== id);
|
|
217
|
+
}
|
|
218
|
+
clear() {
|
|
219
|
+
for (const timer of this.timers.values()) clearTimeout(timer);
|
|
220
|
+
this.timers.clear();
|
|
221
|
+
this.toasts = [];
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
var notifications = new Notifications();
|
|
225
|
+
//#endregion
|
|
226
|
+
//#region src/lib/voice/voice-state.svelte.ts
|
|
227
|
+
var VoiceState = class {
|
|
228
|
+
status = "idle";
|
|
229
|
+
/** True when the configured STT engine is actually usable from this browser. */
|
|
230
|
+
sttSupported = false;
|
|
231
|
+
ttsSupported = false;
|
|
232
|
+
errorMessage = "";
|
|
233
|
+
/** Partial transcript text while browser STT is mid-utterance. Cleared on stop/error. */
|
|
234
|
+
interimTranscript = "";
|
|
235
|
+
/** Active engine resolved from /admin/voice. */
|
|
236
|
+
sttEngine = "disabled";
|
|
237
|
+
ttsEngine = "disabled";
|
|
238
|
+
/** Optional language hint (forwarded to /api/transcribe). */
|
|
239
|
+
sttLanguage = "";
|
|
240
|
+
/** Global toggle: when true, assistant chat replies are spoken automatically. */
|
|
241
|
+
ttsAutoEnabled = false;
|
|
242
|
+
/**
|
|
243
|
+
* True when an audio.play() was rejected by the browser's autoplay
|
|
244
|
+
* policy and we have a pending utterance waiting for a user gesture.
|
|
245
|
+
* The chat UI renders a small "click to resume" banner; clicking it
|
|
246
|
+
* calls resumeAutoplay() to actually play.
|
|
247
|
+
*/
|
|
248
|
+
autoplayBlocked = false;
|
|
249
|
+
/**
|
|
250
|
+
* Set when the configured STT engine is technically present in the
|
|
251
|
+
* window but known to fail at runtime on this UA (e.g. iOS Safari
|
|
252
|
+
* exposes SpeechRecognition but `start()` immediately errors with
|
|
253
|
+
* `service-not-allowed`). The Voice settings tab uses this to hide or
|
|
254
|
+
* disable the Browser STT card with the reason as a tooltip.
|
|
255
|
+
*/
|
|
256
|
+
browserSttUnsupportedReason = "";
|
|
257
|
+
};
|
|
258
|
+
var voiceState = new VoiceState();
|
|
259
|
+
var activeAudio = null;
|
|
260
|
+
var activeAudioUrl = null;
|
|
261
|
+
var SPEAK_QUEUE_MAX = 3;
|
|
262
|
+
var speakQueue = [];
|
|
263
|
+
var overflowNoticed = false;
|
|
264
|
+
var pendingAutoplayAudio = null;
|
|
265
|
+
var pendingAutoplayUrl = null;
|
|
266
|
+
function teardownActiveAudio() {
|
|
267
|
+
if (activeAudio) {
|
|
268
|
+
activeAudio.onerror = null;
|
|
269
|
+
activeAudio.onended = null;
|
|
270
|
+
try {
|
|
271
|
+
activeAudio.pause();
|
|
272
|
+
} catch {}
|
|
273
|
+
activeAudio.src = "";
|
|
274
|
+
activeAudio = null;
|
|
275
|
+
}
|
|
276
|
+
if (activeAudioUrl) {
|
|
277
|
+
URL.revokeObjectURL(activeAudioUrl);
|
|
278
|
+
activeAudioUrl = null;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
function teardownPendingAutoplay() {
|
|
282
|
+
if (pendingAutoplayAudio) {
|
|
283
|
+
pendingAutoplayAudio.onerror = null;
|
|
284
|
+
pendingAutoplayAudio.onended = null;
|
|
285
|
+
try {
|
|
286
|
+
pendingAutoplayAudio.pause();
|
|
287
|
+
} catch {}
|
|
288
|
+
pendingAutoplayAudio.src = "";
|
|
289
|
+
pendingAutoplayAudio = null;
|
|
290
|
+
}
|
|
291
|
+
if (pendingAutoplayUrl) {
|
|
292
|
+
URL.revokeObjectURL(pendingAutoplayUrl);
|
|
293
|
+
pendingAutoplayUrl = null;
|
|
294
|
+
}
|
|
295
|
+
voiceState.autoplayBlocked = false;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Read text aloud. Tries server-side TTS via /api/speak first (when the
|
|
299
|
+
* configured engine is openpalm-voice or remote); falls back to browser
|
|
300
|
+
* speech synthesis. Silent no-op if neither path is available.
|
|
301
|
+
*
|
|
302
|
+
* If a previous utterance is still playing, queues this one (FIFO, cap 3)
|
|
303
|
+
* instead of cutting it off mid-sentence.
|
|
304
|
+
*/
|
|
305
|
+
async function speakText(text) {
|
|
306
|
+
if (typeof window === "undefined" || !text.trim()) return;
|
|
307
|
+
if (voiceState.status === "speaking") {
|
|
308
|
+
speakQueue.push(text);
|
|
309
|
+
let dropped = 0;
|
|
310
|
+
while (speakQueue.length > SPEAK_QUEUE_MAX) {
|
|
311
|
+
speakQueue.shift();
|
|
312
|
+
dropped += 1;
|
|
313
|
+
}
|
|
314
|
+
if (dropped > 0 && !overflowNoticed) {
|
|
315
|
+
overflowNoticed = true;
|
|
316
|
+
notifications.push("info", `Skipped ${dropped} spoken ${dropped === 1 ? "reply" : "replies"} — too much overlap. Lower the auto-speak chat rate.`);
|
|
317
|
+
}
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
await playOne(text);
|
|
321
|
+
}
|
|
322
|
+
/** Internal: actually trigger the audio for one text chunk. */
|
|
323
|
+
async function playOne(text) {
|
|
324
|
+
if (typeof window === "undefined" || !text.trim()) return;
|
|
325
|
+
teardownPendingAutoplay();
|
|
326
|
+
teardownActiveAudio();
|
|
327
|
+
if ("speechSynthesis" in window) window.speechSynthesis.cancel();
|
|
328
|
+
voiceState.errorMessage = "";
|
|
329
|
+
const engine = voiceState.ttsEngine;
|
|
330
|
+
const useServer = engine === "openpalm-voice" || engine === "remote";
|
|
331
|
+
if (useServer) {
|
|
332
|
+
let res;
|
|
333
|
+
try {
|
|
334
|
+
res = await fetch("/api/speak", {
|
|
335
|
+
method: "POST",
|
|
336
|
+
headers: { "content-type": "application/json" },
|
|
337
|
+
credentials: "include",
|
|
338
|
+
body: JSON.stringify({ text })
|
|
339
|
+
});
|
|
340
|
+
} catch {}
|
|
341
|
+
if (res && res.ok && res.headers.get("content-type")?.startsWith("audio/")) {
|
|
342
|
+
const blob = await res.blob();
|
|
343
|
+
const url = URL.createObjectURL(blob);
|
|
344
|
+
const audio = new Audio(url);
|
|
345
|
+
activeAudio = audio;
|
|
346
|
+
activeAudioUrl = url;
|
|
347
|
+
audio.onended = () => {
|
|
348
|
+
voiceState.status = "idle";
|
|
349
|
+
teardownActiveAudio();
|
|
350
|
+
const next = speakQueue.shift();
|
|
351
|
+
if (next) playOne(next);
|
|
352
|
+
else overflowNoticed = false;
|
|
353
|
+
};
|
|
354
|
+
audio.onerror = () => {
|
|
355
|
+
voiceState.status = "idle";
|
|
356
|
+
voiceState.errorMessage = "Audio playback failed.";
|
|
357
|
+
teardownActiveAudio();
|
|
358
|
+
const next = speakQueue.shift();
|
|
359
|
+
if (next) playOne(next);
|
|
360
|
+
else overflowNoticed = false;
|
|
361
|
+
};
|
|
362
|
+
voiceState.status = "speaking";
|
|
363
|
+
try {
|
|
364
|
+
await audio.play();
|
|
365
|
+
} catch {
|
|
366
|
+
voiceState.status = "idle";
|
|
367
|
+
pendingAutoplayAudio = audio;
|
|
368
|
+
pendingAutoplayUrl = url;
|
|
369
|
+
activeAudio = null;
|
|
370
|
+
activeAudioUrl = null;
|
|
371
|
+
voiceState.autoplayBlocked = true;
|
|
372
|
+
}
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (res && !res.ok) voiceState.errorMessage = await extractSpeakError(res);
|
|
376
|
+
}
|
|
377
|
+
if (!("speechSynthesis" in window)) return;
|
|
378
|
+
if (useServer) voiceState.errorMessage = "";
|
|
379
|
+
const utterance = new SpeechSynthesisUtterance(text);
|
|
380
|
+
utterance.onstart = () => {
|
|
381
|
+
voiceState.status = "speaking";
|
|
382
|
+
};
|
|
383
|
+
utterance.onend = () => {
|
|
384
|
+
voiceState.status = "idle";
|
|
385
|
+
const next = speakQueue.shift();
|
|
386
|
+
if (next) playOne(next);
|
|
387
|
+
else overflowNoticed = false;
|
|
388
|
+
};
|
|
389
|
+
utterance.onerror = () => {
|
|
390
|
+
voiceState.status = "idle";
|
|
391
|
+
const next = speakQueue.shift();
|
|
392
|
+
if (next) playOne(next);
|
|
393
|
+
else overflowNoticed = false;
|
|
394
|
+
};
|
|
395
|
+
window.speechSynthesis.speak(utterance);
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Convert a non-OK /api/speak response into a human-readable string.
|
|
399
|
+
* Recognises the two common shapes the route returns; falls back to a
|
|
400
|
+
* generic message keyed off the HTTP status.
|
|
401
|
+
*/
|
|
402
|
+
async function extractSpeakError(res) {
|
|
403
|
+
let code;
|
|
404
|
+
try {
|
|
405
|
+
const data = await res.clone().json();
|
|
406
|
+
if (typeof data.error === "string") code = data.error;
|
|
407
|
+
} catch {}
|
|
408
|
+
if (code === "tts_not_configured") return "TTS is not configured.";
|
|
409
|
+
if (code === "upstream_error" || res.status === 502 || res.status === 503) return "Voice engine is warming up — try again in a moment.";
|
|
410
|
+
return `TTS failed (HTTP ${res.status}).`;
|
|
411
|
+
}
|
|
412
|
+
/** Cancel speech synthesis. Drops the entire queue. */
|
|
413
|
+
function stopSpeaking() {
|
|
414
|
+
speakQueue.length = 0;
|
|
415
|
+
overflowNoticed = false;
|
|
416
|
+
teardownPendingAutoplay();
|
|
417
|
+
teardownActiveAudio();
|
|
418
|
+
if (typeof window !== "undefined" && "speechSynthesis" in window) window.speechSynthesis.cancel();
|
|
419
|
+
voiceState.status = "idle";
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Tear down per-component voice resources on unmount. Only cancels
|
|
423
|
+
* any in-flight recording / recognition.
|
|
424
|
+
*
|
|
425
|
+
* Deliberately does NOT cancel `speechSynthesis` — that queue is a
|
|
426
|
+
* window-level singleton and the user's auto-TTS toggle is persistent,
|
|
427
|
+
* so a page navigation must not interrupt the assistant mid-utterance.
|
|
428
|
+
* Explicit user actions (logout, mic click, toggle off) call
|
|
429
|
+
* `stopSpeaking` directly.
|
|
430
|
+
*/
|
|
431
|
+
function destroyVoice() {
|
|
432
|
+
voiceState.interimTranscript = "";
|
|
433
|
+
voiceState.status = "idle";
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
export { applyChanges as a, downloadUiVersion as b, createSession as c, destroyVoice as d, fetchContainers as e, fetchAutomations as f, fetchEndpoints as g, fetchHealth as h, fetchReleases as i, fetchVersions as j, getSessionMessages as k, listSessions as l, setActiveEndpoint as m, notifications as n, setStackVersion as o, speakText as p, stopSpeaking as q, sendChatMessage as s, upgradeStack as u, voiceState as v };
|
|
437
|
+
//# sourceMappingURL=voice-state.svelte-CQp8u0bn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-state.svelte-CQp8u0bn.js","sources":["../../../.svelte-kit/adapter-node/chunks/voice-state.svelte.js"],"sourcesContent":["import \"./dev.js\";\n//#region src/lib/api.ts\nvar apiBase = \"\";\nfunction buildHeaders() {\n\treturn {\n\t\t\"x-request-id\": crypto.randomUUID(),\n\t\t\"x-requested-by\": \"ui\"\n\t};\n}\nasync function request(method, path, body) {\n\tconst headers = {\n\t\t...body !== void 0 ? { \"content-type\": \"application/json\" } : {},\n\t\t...buildHeaders()\n\t};\n\treturn fetch(`${apiBase}${path}`, {\n\t\tmethod,\n\t\theaders,\n\t\tcredentials: \"include\",\n\t\t...body !== void 0 ? { body: JSON.stringify(body) } : {}\n\t});\n}\nasync function readErrorMessage(res, fallback = `Request failed (HTTP ${res.status})`) {\n\tif ((res.headers.get(\"content-type\") ?? \"\").includes(\"application/json\")) {\n\t\tconst data = await res.clone().json().catch((e) => {\n\t\t\tconsole.warn(\"[api] Failed to parse JSON error response:\", e);\n\t\t\treturn null;\n\t\t});\n\t\tif (data && typeof data.message === \"string\" && data.message.length > 0) return data.message;\n\t\tif (data && typeof data.error === \"string\" && data.error.length > 0) return data.error;\n\t}\n\treturn await res.text().catch((e) => {\n\t\tconsole.warn(\"[api] Failed to read error response text:\", e);\n\t\treturn \"\";\n\t}) || fallback;\n}\n/** Throw on 401; throw readErrorMessage on non-OK. Returns the response. */\nasync function requireOk(res, fallback) {\n\tif (res.status === 401) throw Object.assign(/* @__PURE__ */ new Error(\"Sign-in required.\"), { status: 401 });\n\tif (!res.ok) throw new Error(await readErrorMessage(res, fallback));\n\treturn res;\n}\nasync function fetchHealth() {\n\tconst [adminRes, guardianRes] = await Promise.all([request(\"GET\", \"/health\"), request(\"GET\", \"/guardian/health\").catch((e) => {\n\t\tconsole.warn(\"[api] Guardian health check failed:\", e);\n\t\treturn null;\n\t})]);\n\tconst admin = await adminRes.json();\n\tlet guardian = null;\n\tif (guardianRes) try {\n\t\tguardian = await guardianRes.json();\n\t} catch (e) {\n\t\tconsole.warn(\"[api] Failed to parse guardian health response:\", e);\n\t\tguardian = {\n\t\t\tstatus: \"unavailable\",\n\t\t\tservice: \"guardian\"\n\t\t};\n\t}\n\treturn {\n\t\tadmin,\n\t\tguardian\n\t};\n}\nasync function fetchContainers() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/containers/list\"))).json();\n}\nasync function containerAction(action, containerId) {\n\tawait requireOk(await request(\"POST\", {\n\t\tstart: \"/admin/containers/up\",\n\t\tstop: \"/admin/containers/down\",\n\t\trestart: \"/admin/containers/restart\"\n\t}[action], { service: containerId }));\n}\nasync function applyChanges() {\n\tconst res = await request(\"POST\", \"/admin/update\", {});\n\tif (res.status === 401) throw Object.assign(/* @__PURE__ */ new Error(\"Sign-in required.\"), { status: 401 });\n\tif (!(res.headers.get(\"content-type\") ?? \"\").includes(\"application/json\")) throw new Error(await readErrorMessage(res, `Apply failed (HTTP ${res.status})`));\n\treturn await res.json();\n}\nasync function upgradeStack() {\n\treturn await (await requireOk(await request(\"POST\", \"/admin/upgrade\", {}))).json();\n}\nasync function fetchVersions() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/versions\"))).json();\n}\nasync function fetchReleases() {\n\ttry {\n\t\tconst res = await request(\"GET\", \"/admin/versions/releases\");\n\t\tif (!res.ok) return { releases: [] };\n\t\treturn await res.json();\n\t} catch {\n\t\treturn { releases: [] };\n\t}\n}\nasync function setStackVersion(tag) {\n\treturn await (await requireOk(await request(\"PATCH\", \"/admin/stack-version\", { tag }))).json();\n}\nasync function downloadUiVersion(tag) {\n\treturn await (await requireOk(await request(\"POST\", \"/admin/ui-version\", { tag }))).json();\n}\nasync function fetchAutomations() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/automations\"))).json();\n}\nasync function fetchServiceLogs(options) {\n\tconst params = new URLSearchParams();\n\tif (options?.service) params.set(\"service\", options.service);\n\tif (options?.tail) params.set(\"tail\", String(options.tail));\n\tif (options?.since) params.set(\"since\", options.since);\n\tconst qs = params.toString();\n\treturn await (await requireOk(await request(\"GET\", `/admin/logs${qs ? `?${qs}` : \"\"}`))).json();\n}\nasync function fetchAddons() {\n\treturn (await (await requireOk(await request(\"GET\", \"/admin/addons\"))).json()).addons;\n}\nasync function fetchSecretFiles() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/secrets\"))).json();\n}\nasync function fetchVoiceConfig() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/voice\"))).json();\n}\nasync function fetchAkmConfig() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/akm\"))).json();\n}\nasync function fetchHostAkmSharing() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/akm/host-sharing\"))).json();\n}\nasync function pullImages() {\n\tawait requireOk(await request(\"POST\", \"/admin/containers/pull\", {}));\n}\nasync function fetchEndpoints() {\n\treturn await (await requireOk(await request(\"GET\", \"/admin/endpoints\"))).json();\n}\nasync function setActiveEndpoint(id) {\n\treturn await (await requireOk(await request(\"POST\", \"/admin/endpoints/active\", { id }))).json();\n}\n/**\n* Create a new OpenCode session via the SvelteKit broker.\n*\n* Only `/proxy/assistant/*` is reachable from the browser. The active\n* OpenCode instance is selected server-side via the connection switcher.\n*/\nasync function createSession() {\n\treturn await (await requireOk(await request(\"POST\", `/proxy/assistant/session`, {}))).json();\n}\n/**\n* List sessions on the active OpenCode endpoint.\n*\n* OpenCode returns `Array<Session>` with no ordering guarantee; we sort\n* desc by `time.updated` here so consumers can rely on it. See\n* docs/technical/multi-endpoint-session-ux.md §2.\n*/\nasync function listSessions() {\n\tconst summaries = (await (await requireOk(await request(\"GET\", \"/proxy/assistant/session\"))).json()).map((s) => ({\n\t\tid: s.id,\n\t\ttitle: s.title ?? \"\",\n\t\tcreatedAt: s.time?.created ?? 0,\n\t\tupdatedAt: s.time?.updated ?? s.time?.created ?? 0\n\t}));\n\tsummaries.sort((a, b) => b.updatedAt - a.updatedAt);\n\treturn summaries;\n}\n/**\n* Fetch the messages for a session and map them to UI `ChatMessage`s.\n*\n* Skips non-text parts (tool calls, files, reasoning, etc.). Empty-text\n* messages are dropped so the UI doesn't render placeholder bubbles.\n*/\nasync function getSessionMessages(sessionId) {\n\tconst rows = await (await requireOk(await request(\"GET\", `/proxy/assistant/session/${encodeURIComponent(sessionId)}/message`))).json();\n\tconst messages = [];\n\tfor (const row of rows) {\n\t\tconst text = row.parts.filter((p) => p.type === \"text\" && p.text).map((p) => p.text ?? \"\").join(\"\");\n\t\tif (!text) continue;\n\t\tmessages.push({\n\t\t\tid: row.info.id,\n\t\t\trole: row.info.role,\n\t\t\ttext,\n\t\t\ttimestamp: row.info.time?.created ?? Date.now()\n\t\t});\n\t}\n\treturn messages;\n}\n/**\n* Send a message to an existing OpenCode session via the SvelteKit broker.\n* Uses direct fetch with a 150s AbortSignal timeout — OpenCode responses\n* can take 30–120s.\n*/\nasync function sendChatMessage(sessionId, text) {\n\tconst res = await fetch(`/proxy/assistant/session/${encodeURIComponent(sessionId)}/message`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"content-type\": \"application/json\",\n\t\t\t...buildHeaders()\n\t\t},\n\t\tcredentials: \"include\",\n\t\tbody: JSON.stringify({ parts: [{\n\t\t\ttype: \"text\",\n\t\t\ttext\n\t\t}] }),\n\t\tsignal: AbortSignal.timeout(15e4)\n\t});\n\tif (res.status === 401) throw Object.assign(/* @__PURE__ */ new Error(\"Sign-in required.\"), { status: 401 });\n\tif (!res.ok) {\n\t\tconst msg = await readErrorMessage(res);\n\t\tthrow Object.assign(new Error(msg), { status: res.status });\n\t}\n\treturn await res.json();\n}\n//#endregion\n//#region src/lib/notifications.svelte.ts\nvar DEFAULT_TIMEOUTS = {\n\tinfo: 4e3,\n\tsuccess: 5e3,\n\terror: 8e3\n};\nvar Notifications = class {\n\ttoasts = [];\n\ttimers = /* @__PURE__ */ new Map();\n\tpush(kind, message, opts = {}) {\n\t\tconst id = opts.replaceId ?? (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto ? crypto.randomUUID() : `t-${Date.now()}-${Math.random().toString(36).slice(2)}`);\n\t\tconst ttlMs = opts.sticky ? null : opts.ttlMs ?? DEFAULT_TIMEOUTS[kind];\n\t\tconst toast = {\n\t\t\tid,\n\t\t\tkind,\n\t\t\tmessage,\n\t\t\tttlMs\n\t\t};\n\t\tconst existingTimer = this.timers.get(id);\n\t\tif (existingTimer) {\n\t\t\tclearTimeout(existingTimer);\n\t\t\tthis.timers.delete(id);\n\t\t}\n\t\tconst existingIdx = this.toasts.findIndex((t) => t.id === id);\n\t\tif (existingIdx >= 0) {\n\t\t\tconst next = [...this.toasts];\n\t\t\tnext[existingIdx] = toast;\n\t\t\tthis.toasts = next;\n\t\t} else this.toasts = [...this.toasts, toast];\n\t\tif (ttlMs !== null) {\n\t\t\tconst timer = setTimeout(() => this.dismiss(id), ttlMs);\n\t\t\tthis.timers.set(id, timer);\n\t\t}\n\t\treturn id;\n\t}\n\tdismiss(id) {\n\t\tconst timer = this.timers.get(id);\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\tthis.timers.delete(id);\n\t\t}\n\t\tthis.toasts = this.toasts.filter((t) => t.id !== id);\n\t}\n\tclear() {\n\t\tfor (const timer of this.timers.values()) clearTimeout(timer);\n\t\tthis.timers.clear();\n\t\tthis.toasts = [];\n\t}\n};\nvar notifications = new Notifications();\n//#endregion\n//#region src/lib/voice/voice-state.svelte.ts\nvar VoiceState = class {\n\tstatus = \"idle\";\n\t/** True when the configured STT engine is actually usable from this browser. */\n\tsttSupported = false;\n\tttsSupported = false;\n\terrorMessage = \"\";\n\t/** Partial transcript text while browser STT is mid-utterance. Cleared on stop/error. */\n\tinterimTranscript = \"\";\n\t/** Active engine resolved from /admin/voice. */\n\tsttEngine = \"disabled\";\n\tttsEngine = \"disabled\";\n\t/** Optional language hint (forwarded to /api/transcribe). */\n\tsttLanguage = \"\";\n\t/** Global toggle: when true, assistant chat replies are spoken automatically. */\n\tttsAutoEnabled = false;\n\t/**\n\t* True when an audio.play() was rejected by the browser's autoplay\n\t* policy and we have a pending utterance waiting for a user gesture.\n\t* The chat UI renders a small \"click to resume\" banner; clicking it\n\t* calls resumeAutoplay() to actually play.\n\t*/\n\tautoplayBlocked = false;\n\t/**\n\t* Set when the configured STT engine is technically present in the\n\t* window but known to fail at runtime on this UA (e.g. iOS Safari\n\t* exposes SpeechRecognition but `start()` immediately errors with\n\t* `service-not-allowed`). The Voice settings tab uses this to hide or\n\t* disable the Browser STT card with the reason as a tooltip.\n\t*/\n\tbrowserSttUnsupportedReason = \"\";\n};\nvar voiceState = new VoiceState();\nvar TTS_AUTO_STORAGE_KEY = \"openpalm.tts.auto\";\nvar activeRecording = null;\nvar activeRecognition = null;\nvar recordingTimeout = null;\n/** Resolve the SpeechRecognition constructor (Chrome prefixes it). */\nfunction getSpeechRecognitionCtor() {\n\tif (typeof window === \"undefined\") return void 0;\n\treturn window.SpeechRecognition ?? window.webkitSpeechRecognition ?? void 0;\n}\n/**\n* iOS Safari (and all WebKit-based browsers on iOS — Chrome/Edge/Firefox\n* on iOS are required by Apple to use WebKit) exposes SpeechRecognition\n* but `start()` immediately fires `error: service-not-allowed`. Detect\n* the UA up front so the picker can hide the Browser STT card rather\n* than let the user click a mic that silently does nothing.\n*\n* `MSStream` excludes old IE on Windows Phone, which used to spoof iPad\n* in the UA; harmless on modern browsers (always undefined).\n*/\nfunction isIosSafari() {\n\tif (typeof navigator === \"undefined\") return false;\n\tconst ua = navigator.userAgent ?? \"\";\n\tconst isIos = /iPad|iPhone|iPod/.test(ua);\n\tconst msStream = window.MSStream;\n\treturn isIos && !msStream;\n}\nfunction isMediaRecorderSupported() {\n\tif (typeof window === \"undefined\") return false;\n\tif (typeof MediaRecorder === \"undefined\") return false;\n\tif (!navigator?.mediaDevices?.getUserMedia) return false;\n\treturn true;\n}\nfunction resolveEngineSupport(engine) {\n\tswitch (engine) {\n\t\tcase \"browser\":\n\t\t\tif (voiceState.browserSttUnsupportedReason) return false;\n\t\t\treturn Boolean(getSpeechRecognitionCtor());\n\t\tcase \"remote\":\n\t\tcase \"openpalm-voice\": return isMediaRecorderSupported();\n\t\tdefault: return false;\n\t}\n}\nfunction normalizeEngine(raw) {\n\tif (raw === \"browser\" || raw === \"browser-stt\") return \"browser\";\n\tif (raw === \"openpalm-voice\") return \"openpalm-voice\";\n\tif (raw && !raw.startsWith(\"skip-\")) return \"remote\";\n\treturn \"disabled\";\n}\n/**\n* Probe browser capabilities and resolve which STT engine is active.\n* Must be called from onMount or $effect (client-side only).\n*/\nasync function initVoice() {\n\tconst browserTts = typeof window !== \"undefined\" && \"speechSynthesis\" in window;\n\tif (typeof window !== \"undefined\") try {\n\t\tvoiceState.ttsAutoEnabled = window.localStorage.getItem(TTS_AUTO_STORAGE_KEY) === \"1\";\n\t} catch {}\n\ttry {\n\t\tconst cfg = await fetchVoiceConfig();\n\t\tconst stt = cfg.stt ?? {};\n\t\tconst tts = cfg.tts ?? {};\n\t\tconst rawSttEngine = typeof stt.engine === \"string\" ? stt.engine : \"\";\n\t\tconst rawTtsEngine = typeof tts.engine === \"string\" ? tts.engine : \"\";\n\t\tvoiceState.sttLanguage = typeof stt.language === \"string\" ? stt.language : \"\";\n\t\tvoiceState.sttEngine = normalizeEngine(rawSttEngine);\n\t\tvoiceState.ttsEngine = normalizeEngine(rawTtsEngine);\n\t} catch {\n\t\tvoiceState.sttEngine = \"disabled\";\n\t\tvoiceState.ttsEngine = \"disabled\";\n\t}\n\tvoiceState.ttsSupported = voiceState.ttsEngine === \"openpalm-voice\" || voiceState.ttsEngine === \"remote\" || voiceState.ttsEngine === \"browser\" && browserTts;\n\tif (isIosSafari() && getSpeechRecognitionCtor()) {\n\t\tvoiceState.browserSttUnsupportedReason = \"iOS Safari does not support Web Speech recognition\";\n\t\tif (voiceState.sttEngine === \"browser\") voiceState.sttEngine = \"disabled\";\n\t} else voiceState.browserSttUnsupportedReason = \"\";\n\tif (voiceState.sttEngine === \"disabled\" && getSpeechRecognitionCtor() && !voiceState.browserSttUnsupportedReason) voiceState.sttEngine = \"browser\";\n\tvoiceState.sttSupported = resolveEngineSupport(voiceState.sttEngine);\n}\nvar activeAudio = null;\nvar activeAudioUrl = null;\nvar SPEAK_QUEUE_MAX = 3;\nvar speakQueue = [];\nvar overflowNoticed = false;\nvar pendingAutoplayAudio = null;\nvar pendingAutoplayUrl = null;\nfunction teardownActiveAudio() {\n\tif (activeAudio) {\n\t\tactiveAudio.onerror = null;\n\t\tactiveAudio.onended = null;\n\t\ttry {\n\t\t\tactiveAudio.pause();\n\t\t} catch {}\n\t\tactiveAudio.src = \"\";\n\t\tactiveAudio = null;\n\t}\n\tif (activeAudioUrl) {\n\t\tURL.revokeObjectURL(activeAudioUrl);\n\t\tactiveAudioUrl = null;\n\t}\n}\nfunction teardownPendingAutoplay() {\n\tif (pendingAutoplayAudio) {\n\t\tpendingAutoplayAudio.onerror = null;\n\t\tpendingAutoplayAudio.onended = null;\n\t\ttry {\n\t\t\tpendingAutoplayAudio.pause();\n\t\t} catch {}\n\t\tpendingAutoplayAudio.src = \"\";\n\t\tpendingAutoplayAudio = null;\n\t}\n\tif (pendingAutoplayUrl) {\n\t\tURL.revokeObjectURL(pendingAutoplayUrl);\n\t\tpendingAutoplayUrl = null;\n\t}\n\tvoiceState.autoplayBlocked = false;\n}\n/**\n* Read text aloud. Tries server-side TTS via /api/speak first (when the\n* configured engine is openpalm-voice or remote); falls back to browser\n* speech synthesis. Silent no-op if neither path is available.\n*\n* If a previous utterance is still playing, queues this one (FIFO, cap 3)\n* instead of cutting it off mid-sentence.\n*/\nasync function speakText(text) {\n\tif (typeof window === \"undefined\" || !text.trim()) return;\n\tif (voiceState.status === \"speaking\") {\n\t\tspeakQueue.push(text);\n\t\tlet dropped = 0;\n\t\twhile (speakQueue.length > SPEAK_QUEUE_MAX) {\n\t\t\tspeakQueue.shift();\n\t\t\tdropped += 1;\n\t\t}\n\t\tif (dropped > 0 && !overflowNoticed) {\n\t\t\toverflowNoticed = true;\n\t\t\tnotifications.push(\"info\", `Skipped ${dropped} spoken ${dropped === 1 ? \"reply\" : \"replies\"} — too much overlap. Lower the auto-speak chat rate.`);\n\t\t}\n\t\treturn;\n\t}\n\tawait playOne(text);\n}\n/** Internal: actually trigger the audio for one text chunk. */\nasync function playOne(text) {\n\tif (typeof window === \"undefined\" || !text.trim()) return;\n\tteardownPendingAutoplay();\n\tteardownActiveAudio();\n\tif (\"speechSynthesis\" in window) window.speechSynthesis.cancel();\n\tvoiceState.errorMessage = \"\";\n\tconst engine = voiceState.ttsEngine;\n\tconst useServer = engine === \"openpalm-voice\" || engine === \"remote\";\n\tif (useServer) {\n\t\tlet res;\n\t\ttry {\n\t\t\tres = await fetch(\"/api/speak\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tbody: JSON.stringify({ text })\n\t\t\t});\n\t\t} catch {}\n\t\tif (res && res.ok && res.headers.get(\"content-type\")?.startsWith(\"audio/\")) {\n\t\t\tconst blob = await res.blob();\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst audio = new Audio(url);\n\t\t\tactiveAudio = audio;\n\t\t\tactiveAudioUrl = url;\n\t\t\taudio.onended = () => {\n\t\t\t\tvoiceState.status = \"idle\";\n\t\t\t\tteardownActiveAudio();\n\t\t\t\tconst next = speakQueue.shift();\n\t\t\t\tif (next) playOne(next);\n\t\t\t\telse overflowNoticed = false;\n\t\t\t};\n\t\t\taudio.onerror = () => {\n\t\t\t\tvoiceState.status = \"idle\";\n\t\t\t\tvoiceState.errorMessage = \"Audio playback failed.\";\n\t\t\t\tteardownActiveAudio();\n\t\t\t\tconst next = speakQueue.shift();\n\t\t\t\tif (next) playOne(next);\n\t\t\t\telse overflowNoticed = false;\n\t\t\t};\n\t\t\tvoiceState.status = \"speaking\";\n\t\t\ttry {\n\t\t\t\tawait audio.play();\n\t\t\t} catch {\n\t\t\t\tvoiceState.status = \"idle\";\n\t\t\t\tpendingAutoplayAudio = audio;\n\t\t\t\tpendingAutoplayUrl = url;\n\t\t\t\tactiveAudio = null;\n\t\t\t\tactiveAudioUrl = null;\n\t\t\t\tvoiceState.autoplayBlocked = true;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (res && !res.ok) voiceState.errorMessage = await extractSpeakError(res);\n\t}\n\tif (!(\"speechSynthesis\" in window)) return;\n\tif (useServer) voiceState.errorMessage = \"\";\n\tconst utterance = new SpeechSynthesisUtterance(text);\n\tutterance.onstart = () => {\n\t\tvoiceState.status = \"speaking\";\n\t};\n\tutterance.onend = () => {\n\t\tvoiceState.status = \"idle\";\n\t\tconst next = speakQueue.shift();\n\t\tif (next) playOne(next);\n\t\telse overflowNoticed = false;\n\t};\n\tutterance.onerror = () => {\n\t\tvoiceState.status = \"idle\";\n\t\tconst next = speakQueue.shift();\n\t\tif (next) playOne(next);\n\t\telse overflowNoticed = false;\n\t};\n\twindow.speechSynthesis.speak(utterance);\n}\n/**\n* Convert a non-OK /api/speak response into a human-readable string.\n* Recognises the two common shapes the route returns; falls back to a\n* generic message keyed off the HTTP status.\n*/\nasync function extractSpeakError(res) {\n\tlet code;\n\ttry {\n\t\tconst data = await res.clone().json();\n\t\tif (typeof data.error === \"string\") code = data.error;\n\t} catch {}\n\tif (code === \"tts_not_configured\") return \"TTS is not configured.\";\n\tif (code === \"upstream_error\" || res.status === 502 || res.status === 503) return \"Voice engine is warming up — try again in a moment.\";\n\treturn `TTS failed (HTTP ${res.status}).`;\n}\n/** Cancel speech synthesis. Drops the entire queue. */\nfunction stopSpeaking() {\n\tspeakQueue.length = 0;\n\toverflowNoticed = false;\n\tteardownPendingAutoplay();\n\tteardownActiveAudio();\n\tif (typeof window !== \"undefined\" && \"speechSynthesis\" in window) window.speechSynthesis.cancel();\n\tvoiceState.status = \"idle\";\n}\n/**\n* Tear down per-component voice resources on unmount. Only cancels\n* any in-flight recording / recognition.\n*\n* Deliberately does NOT cancel `speechSynthesis` — that queue is a\n* window-level singleton and the user's auto-TTS toggle is persistent,\n* so a page navigation must not interrupt the assistant mid-utterance.\n* Explicit user actions (logout, mic click, toggle off) call\n* `stopSpeaking` directly.\n*/\nfunction destroyVoice() {\n\tif (recordingTimeout) {\n\t\tclearTimeout(recordingTimeout);\n\t\trecordingTimeout = null;\n\t}\n\tif (activeRecording) {\n\t\ttry {\n\t\t\tactiveRecording.cancel();\n\t\t} catch {}\n\t\tactiveRecording = null;\n\t}\n\tif (activeRecognition) {\n\t\ttry {\n\t\t\tactiveRecognition.stop();\n\t\t} catch {}\n\t\tactiveRecognition = null;\n\t}\n\tvoiceState.interimTranscript = \"\";\n\tvoiceState.status = \"idle\";\n}\n//#endregion\nexport { upgradeStack as A, fetchVoiceConfig as C, sendChatMessage as D, pullImages as E, setActiveEndpoint as O, fetchVersions as S, listSessions as T, fetchHealth as _, voiceState as a, fetchSecretFiles as b, buildHeaders as c, downloadUiVersion as d, fetchAddons as f, fetchEndpoints as g, fetchContainers as h, stopSpeaking as i, setStackVersion as k, containerAction as l, fetchAutomations as m, initVoice as n, notifications as o, fetchAkmConfig as p, speakText as r, applyChanges as s, destroyVoice as t, createSession as u, fetchHostAkmSharing as v, getSessionMessages as w, fetchServiceLogs as x, fetchReleases as y };\n"],"names":[],"mappings":"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"}
|