@openpalm/ui 0.12.14-rc.2 → 0.12.14-rc.3
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.D6BIYX56.css +1 -0
- package/build/client/_app/immutable/assets/0.D6BIYX56.css.br +0 -0
- package/build/client/_app/immutable/assets/0.D6BIYX56.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.DJsfjbxv.css +1 -0
- package/build/client/_app/immutable/assets/4.DJsfjbxv.css.br +0 -0
- package/build/client/_app/immutable/assets/4.DJsfjbxv.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.D_dlnlzL.css +1 -0
- package/build/client/_app/immutable/assets/7.D_dlnlzL.css.br +0 -0
- package/build/client/_app/immutable/assets/7.D_dlnlzL.css.gz +0 -0
- package/build/client/_app/immutable/assets/8.DdhLOSFx.css +1 -0
- package/build/client/_app/immutable/assets/8.DdhLOSFx.css.br +0 -0
- package/build/client/_app/immutable/assets/8.DdhLOSFx.css.gz +0 -0
- package/build/client/_app/immutable/assets/ChatMessage.DNqxl--Z.css +1 -0
- package/build/client/_app/immutable/assets/ChatMessage.DNqxl--Z.css.br +0 -0
- package/build/client/_app/immutable/assets/ChatMessage.DNqxl--Z.css.gz +0 -0
- package/build/client/_app/immutable/assets/IconSoundOn.BsTA83Hx.css +1 -0
- package/build/client/_app/immutable/assets/IconSoundOn.BsTA83Hx.css.br +0 -0
- package/build/client/_app/immutable/assets/IconSoundOn.BsTA83Hx.css.gz +0 -0
- package/build/client/_app/immutable/assets/Navbar.BCkoyl0c.css +1 -0
- package/build/client/_app/immutable/assets/Navbar.BCkoyl0c.css.br +0 -0
- package/build/client/_app/immutable/assets/Navbar.BCkoyl0c.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B-OdB0ya.js +1 -0
- package/build/client/_app/immutable/chunks/B-OdB0ya.js.br +1 -0
- package/build/client/_app/immutable/chunks/B-OdB0ya.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CYr0uwbO.js → B7DfqWBV.js} +1 -1
- package/build/client/_app/immutable/chunks/B7DfqWBV.js.br +0 -0
- package/build/client/_app/immutable/chunks/B7DfqWBV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BBI__kVO.js → BBmCuFN9.js} +2 -2
- package/build/client/_app/immutable/chunks/BBmCuFN9.js.br +0 -0
- package/build/client/_app/immutable/chunks/BBmCuFN9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BrljzgEP.js +1 -0
- package/build/client/_app/immutable/chunks/BrljzgEP.js.br +2 -0
- package/build/client/_app/immutable/chunks/BrljzgEP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BOoHSrzv.js → CSKyGi1L.js} +2 -2
- package/build/client/_app/immutable/chunks/CSKyGi1L.js.br +0 -0
- package/build/client/_app/immutable/chunks/CSKyGi1L.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C_wImxso.js +1 -0
- package/build/client/_app/immutable/chunks/C_wImxso.js.br +0 -0
- package/build/client/_app/immutable/chunks/C_wImxso.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cc7opt01.js +1 -0
- package/build/client/_app/immutable/chunks/Cc7opt01.js.br +1 -0
- package/build/client/_app/immutable/chunks/Cc7opt01.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{ClHlMH38.js → Cu0QA2z5.js} +3 -3
- package/build/client/_app/immutable/chunks/Cu0QA2z5.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cu0QA2z5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CuMVaUdT.js +5 -0
- package/build/client/_app/immutable/chunks/CuMVaUdT.js.br +0 -0
- package/build/client/_app/immutable/chunks/CuMVaUdT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ddg98Z_b.js +1 -0
- package/build/client/_app/immutable/chunks/Ddg98Z_b.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ddg98Z_b.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dg7k_AWm.js +1 -0
- package/build/client/_app/immutable/chunks/Dg7k_AWm.js.br +2 -0
- package/build/client/_app/immutable/chunks/Dg7k_AWm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/hYpEVCK8.js +1 -0
- package/build/client/_app/immutable/chunks/hYpEVCK8.js.br +1 -0
- package/build/client/_app/immutable/chunks/hYpEVCK8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CKjCR-mV.js → mHe1Neql.js} +1 -1
- package/build/client/_app/immutable/chunks/mHe1Neql.js.br +0 -0
- package/build/client/_app/immutable/chunks/mHe1Neql.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Djgo2S9D.js +2 -0
- package/build/client/_app/immutable/entry/app.Djgo2S9D.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Djgo2S9D.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.B1qJxX5I.js +1 -0
- package/build/client/_app/immutable/entry/start.B1qJxX5I.js.br +0 -0
- package/build/client/_app/immutable/entry/start.B1qJxX5I.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.D_ZMMqS4.js +1 -0
- package/build/client/_app/immutable/nodes/0.D_ZMMqS4.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.D_ZMMqS4.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CS7JTDHg.js +1 -0
- package/build/client/_app/immutable/nodes/1.CS7JTDHg.js.br +4 -0
- package/build/client/_app/immutable/nodes/1.CS7JTDHg.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.CB-G9A6q.js +3 -0
- package/build/client/_app/immutable/nodes/10.CB-G9A6q.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.CB-G9A6q.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.BYJdYmf4.js +1 -0
- package/build/client/_app/immutable/nodes/2.BYJdYmf4.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.BYJdYmf4.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.Dngt3zj1.js +1 -0
- package/build/client/_app/immutable/nodes/3.Dngt3zj1.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.Dngt3zj1.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.CL7zR5o2.js +131 -0
- package/build/client/_app/immutable/nodes/4.CL7zR5o2.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CL7zR5o2.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.BqcyISYx.js +4 -0
- package/build/client/_app/immutable/nodes/5.BqcyISYx.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.BqcyISYx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.DzjmcpTi.js +1 -0
- package/build/client/_app/immutable/nodes/6.DzjmcpTi.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DzjmcpTi.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.C2-tbjVe.js +1 -0
- package/build/client/_app/immutable/nodes/7.C2-tbjVe.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.C2-tbjVe.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.BQmNOjqi.js +1 -0
- package/build/client/_app/immutable/nodes/8.BQmNOjqi.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BQmNOjqi.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.CzlHO0G_.js +6 -0
- package/build/client/_app/immutable/nodes/9.CzlHO0G_.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.CzlHO0G_.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +1 -1
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/0-2r94gkUA.js +9 -0
- package/build/server/chunks/0-2r94gkUA.js.map +1 -0
- package/build/server/chunks/1-LS_hH0aE.js +9 -0
- package/build/server/chunks/{1-DGncWjNE.js.map → 1-LS_hH0aE.js.map} +1 -1
- package/build/server/chunks/{10-CUIcNLN8.js → 10-DTrEAGYa.js} +7 -7
- package/build/server/chunks/{10-CUIcNLN8.js.map → 10-DTrEAGYa.js.map} +1 -1
- package/build/server/chunks/2-0UAd5Kiq.js +9 -0
- package/build/server/chunks/{2-z6oPo7ca.js.map → 2-0UAd5Kiq.js.map} +1 -1
- package/build/server/chunks/{3-DRJ4lnhG.js → 3-Dr5ba683.js} +2 -2
- package/build/server/chunks/{3-DRJ4lnhG.js.map → 3-Dr5ba683.js.map} +1 -1
- package/build/server/chunks/4-f8DE7FfJ.js +9 -0
- package/build/server/chunks/4-f8DE7FfJ.js.map +1 -0
- package/build/server/chunks/5-DjsLsMCN.js +9 -0
- package/build/server/chunks/5-DjsLsMCN.js.map +1 -0
- package/build/server/chunks/6-IPVwLxgZ.js +9 -0
- package/build/server/chunks/6-IPVwLxgZ.js.map +1 -0
- package/build/server/chunks/7-B51BxEom.js +9 -0
- package/build/server/chunks/{7-eEOVyUMC.js.map → 7-B51BxEom.js.map} +1 -1
- package/build/server/chunks/{8-uPijFcwB.js → 8-CDFgJSAy.js} +4 -4
- package/build/server/chunks/{8-uPijFcwB.js.map → 8-CDFgJSAy.js.map} +1 -1
- package/build/server/chunks/9-D9Y6jy2u.js +9 -0
- package/build/server/chunks/9-D9Y6jy2u.js.map +1 -0
- package/build/server/chunks/{ChatMessage-ClLIqnwB.js → ChatMessage-DhpP_Bir.js} +6 -6
- package/build/server/chunks/{ChatMessage-ClLIqnwB.js.map → ChatMessage-DhpP_Bir.js.map} +1 -1
- package/build/server/chunks/IconInfo-yYiI9uGe.js +10 -0
- package/build/server/chunks/IconInfo-yYiI9uGe.js.map +1 -0
- package/build/server/chunks/IconLogo-Iv-7q8aY.js +10 -0
- package/build/server/chunks/IconLogo-Iv-7q8aY.js.map +1 -0
- package/build/server/chunks/{SessionList-CWKGPQSI.js → IconSoundOn-Dras8sRQ.js} +61 -7
- package/build/server/chunks/IconSoundOn-Dras8sRQ.js.map +1 -0
- package/build/server/chunks/{Navbar-WKJhx255.js → Navbar-DAdn8Q8R.js} +73 -25
- package/build/server/chunks/Navbar-DAdn8Q8R.js.map +1 -0
- package/build/server/chunks/{Spinner-Bk6e83RX.js → Spinner-CITitSMt.js} +2 -2
- package/build/server/chunks/{Spinner-Bk6e83RX.js.map → Spinner-CITitSMt.js.map} +1 -1
- package/build/server/chunks/_layout.svelte-DSusy536.js +69 -0
- package/build/server/chunks/_layout.svelte-DSusy536.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-BV7A7zff.js → _layout.svelte-OgWmBAyy.js} +2 -2
- package/build/server/chunks/{_layout.svelte-BV7A7zff.js.map → _layout.svelte-OgWmBAyy.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-CigItPjU.js → _page.svelte-481po5Nx.js} +3 -3
- package/build/server/chunks/_page.svelte-481po5Nx.js.map +1 -0
- package/build/server/chunks/{_page.svelte-DiR3VgLO.js → _page.svelte-7CRIwc6V.js} +10 -9
- package/build/server/chunks/{_page.svelte-DiR3VgLO.js.map → _page.svelte-7CRIwc6V.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-dXTqinDv.js → _page.svelte-BEhrU3Us.js} +11 -5
- package/build/server/chunks/_page.svelte-BEhrU3Us.js.map +1 -0
- package/build/server/chunks/{_page.svelte-Bn3LEN1Y.js → _page.svelte-BOiYIq5w.js} +65 -38
- package/build/server/chunks/_page.svelte-BOiYIq5w.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BFw3Q_1i.js → _page.svelte-CqdW5epW.js} +10 -9
- package/build/server/chunks/{_page.svelte-BFw3Q_1i.js.map → _page.svelte-CqdW5epW.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Bu9dlKgJ.js → _page.svelte-Dauq1qtZ.js} +213 -78
- package/build/server/chunks/_page.svelte-Dauq1qtZ.js.map +1 -0
- package/build/server/chunks/{_page.svelte-D98QHSOI.js → _page.svelte-rf-Q89lq.js} +6 -3
- package/build/server/chunks/_page.svelte-rf-Q89lq.js.map +1 -0
- package/build/server/chunks/{_server.ts-DNIpT33Y.js → _server.ts--k5FrKqK.js} +5 -5
- package/build/server/chunks/{_server.ts-DNIpT33Y.js.map → _server.ts--k5FrKqK.js.map} +1 -1
- package/build/server/chunks/{_server.ts-ZIBkLslU.js → _server.ts-2UiG1cfl.js} +4 -4
- package/build/server/chunks/{_server.ts-ZIBkLslU.js.map → _server.ts-2UiG1cfl.js.map} +1 -1
- package/build/server/chunks/{_server.ts-3hq6duN5.js → _server.ts-6nPsco_4.js} +5 -5
- package/build/server/chunks/{_server.ts-3hq6duN5.js.map → _server.ts-6nPsco_4.js.map} +1 -1
- package/build/server/chunks/{_server.ts-H5vCMoq2.js → _server.ts-B2ASLTY1.js} +5 -5
- package/build/server/chunks/{_server.ts-H5vCMoq2.js.map → _server.ts-B2ASLTY1.js.map} +1 -1
- package/build/server/chunks/{_server.ts-5J3teSsM.js → _server.ts-B315mybQ.js} +5 -5
- package/build/server/chunks/{_server.ts-5J3teSsM.js.map → _server.ts-B315mybQ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B-0BHMd8.js → _server.ts-B8Bw_OE6.js} +5 -5
- package/build/server/chunks/{_server.ts-B-0BHMd8.js.map → _server.ts-B8Bw_OE6.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Czq_pl77.js → _server.ts-BEB0Hv3q.js} +2 -2
- package/build/server/chunks/{_server.ts-Czq_pl77.js.map → _server.ts-BEB0Hv3q.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DSRQICoU.js → _server.ts-BEYAXPuT.js} +5 -5
- package/build/server/chunks/{_server.ts-DSRQICoU.js.map → _server.ts-BEYAXPuT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BMSQcPVt.js → _server.ts-BJX8lr5s.js} +5 -5
- package/build/server/chunks/{_server.ts-BMSQcPVt.js.map → _server.ts-BJX8lr5s.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DIm0kGBr.js → _server.ts-BLSdrC6z.js} +5 -5
- package/build/server/chunks/{_server.ts-DIm0kGBr.js.map → _server.ts-BLSdrC6z.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CXI09kn_.js → _server.ts-BRlfeBH7.js} +5 -5
- package/build/server/chunks/{_server.ts-CXI09kn_.js.map → _server.ts-BRlfeBH7.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BQ0nlggl.js → _server.ts-BSZnl5gn.js} +5 -5
- package/build/server/chunks/{_server.ts-BQ0nlggl.js.map → _server.ts-BSZnl5gn.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BdFtQHIt.js → _server.ts-BUrP3NWD.js} +7 -7
- package/build/server/chunks/{_server.ts-BdFtQHIt.js.map → _server.ts-BUrP3NWD.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BxC5ZKb1.js → _server.ts-BY0yt8II.js} +5 -5
- package/build/server/chunks/{_server.ts-BxC5ZKb1.js.map → _server.ts-BY0yt8II.js.map} +1 -1
- package/build/server/chunks/{_server.ts-RcsU-1TD.js → _server.ts-BYauRpIR.js} +5 -5
- package/build/server/chunks/{_server.ts-RcsU-1TD.js.map → _server.ts-BYauRpIR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BLpgHk0r.js → _server.ts-BaTYSs6M.js} +5 -5
- package/build/server/chunks/{_server.ts-BLpgHk0r.js.map → _server.ts-BaTYSs6M.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dm3Ody_4.js → _server.ts-BbVopvda.js} +5 -5
- package/build/server/chunks/{_server.ts-Dm3Ody_4.js.map → _server.ts-BbVopvda.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CC89oRQb.js → _server.ts-BbohQ_QV.js} +5 -5
- package/build/server/chunks/{_server.ts-CC89oRQb.js.map → _server.ts-BbohQ_QV.js.map} +1 -1
- package/build/server/chunks/{_server.ts-bNxt1bsR.js → _server.ts-BcSd1bZr.js} +5 -5
- package/build/server/chunks/{_server.ts-bNxt1bsR.js.map → _server.ts-BcSd1bZr.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DbPdz__M.js → _server.ts-BcWLXcc7.js} +5 -5
- package/build/server/chunks/{_server.ts-DbPdz__M.js.map → _server.ts-BcWLXcc7.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DvQ7Yyrs.js → _server.ts-BcXFY5-k.js} +5 -5
- package/build/server/chunks/{_server.ts-DvQ7Yyrs.js.map → _server.ts-BcXFY5-k.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CrTz5-dA.js → _server.ts-Bd5xUNdJ.js} +6 -6
- package/build/server/chunks/{_server.ts-CrTz5-dA.js.map → _server.ts-Bd5xUNdJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BiHLOi__.js → _server.ts-BdihxHoP.js} +2 -2
- package/build/server/chunks/{_server.ts-BiHLOi__.js.map → _server.ts-BdihxHoP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-f_Fm0mY7.js → _server.ts-BfgX5zOd.js} +5 -5
- package/build/server/chunks/{_server.ts-f_Fm0mY7.js.map → _server.ts-BfgX5zOd.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CQdxe3SE.js → _server.ts-BqryU83_.js} +5 -5
- package/build/server/chunks/{_server.ts-CQdxe3SE.js.map → _server.ts-BqryU83_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bjg6d3IQ.js → _server.ts-BrN2g0zE.js} +5 -5
- package/build/server/chunks/{_server.ts-Bjg6d3IQ.js.map → _server.ts-BrN2g0zE.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bcr46k0d.js → _server.ts-Bt9Jrsj0.js} +6 -6
- package/build/server/chunks/{_server.ts-Bcr46k0d.js.map → _server.ts-Bt9Jrsj0.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DqkFprj2.js → _server.ts-BtYYWflR.js} +5 -5
- package/build/server/chunks/{_server.ts-DqkFprj2.js.map → _server.ts-BtYYWflR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B2N62gZN.js → _server.ts-Bxbx-bO1.js} +5 -5
- package/build/server/chunks/{_server.ts-B2N62gZN.js.map → _server.ts-Bxbx-bO1.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D4hzMTQU.js → _server.ts-ByTiXoZG.js} +5 -5
- package/build/server/chunks/{_server.ts-D4hzMTQU.js.map → _server.ts-ByTiXoZG.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BxjHH8Cu.js → _server.ts-C-at_m0B.js} +6 -6
- package/build/server/chunks/{_server.ts-BxjHH8Cu.js.map → _server.ts-C-at_m0B.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bk_5nIRj.js → _server.ts-C2RC249_.js} +5 -5
- package/build/server/chunks/{_server.ts-Bk_5nIRj.js.map → _server.ts-C2RC249_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B_rkgFAI.js → _server.ts-C3N4_5NJ.js} +6 -6
- package/build/server/chunks/{_server.ts-B_rkgFAI.js.map → _server.ts-C3N4_5NJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DiHBwwTk.js → _server.ts-C5tty7kH.js} +7 -7
- package/build/server/chunks/{_server.ts-DiHBwwTk.js.map → _server.ts-C5tty7kH.js.map} +1 -1
- package/build/server/chunks/{_server.ts-KG2_Nr0X.js → _server.ts-C8RfYcPG.js} +5 -5
- package/build/server/chunks/{_server.ts-KG2_Nr0X.js.map → _server.ts-C8RfYcPG.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BOzDwuQF.js → _server.ts-C94XKDVr.js} +5 -5
- package/build/server/chunks/{_server.ts-BOzDwuQF.js.map → _server.ts-C94XKDVr.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C4aE3vlW.js → _server.ts-CAo1GJzm.js} +7 -7
- package/build/server/chunks/{_server.ts-C4aE3vlW.js.map → _server.ts-CAo1GJzm.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CXLfPt6T.js → _server.ts-CBdtUOpb.js} +5 -5
- package/build/server/chunks/{_server.ts-CXLfPt6T.js.map → _server.ts-CBdtUOpb.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Eo8pjAJS.js → _server.ts-CFOvDvVP.js} +5 -5
- package/build/server/chunks/{_server.ts-Eo8pjAJS.js.map → _server.ts-CFOvDvVP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-y6dXGze5.js → _server.ts-CFecZ1QR.js} +6 -6
- package/build/server/chunks/{_server.ts-y6dXGze5.js.map → _server.ts-CFecZ1QR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DCPlj3ra.js → _server.ts-CGYv-sJO.js} +5 -5
- package/build/server/chunks/{_server.ts-DCPlj3ra.js.map → _server.ts-CGYv-sJO.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CFyDRY6I.js → _server.ts-CLGWmBly.js} +5 -5
- package/build/server/chunks/{_server.ts-CFyDRY6I.js.map → _server.ts-CLGWmBly.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DpAYUx4p.js → _server.ts-COSz7VA-.js} +5 -5
- package/build/server/chunks/{_server.ts-DpAYUx4p.js.map → _server.ts-COSz7VA-.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CooAA10u.js → _server.ts-CQaCFN5Q.js} +7 -7
- package/build/server/chunks/{_server.ts-CooAA10u.js.map → _server.ts-CQaCFN5Q.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DyRhMhLt.js → _server.ts-CcfMgscc.js} +5 -5
- package/build/server/chunks/{_server.ts-DyRhMhLt.js.map → _server.ts-CcfMgscc.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CxVcCd_Y.js → _server.ts-CdnHLmnS.js} +4 -4
- package/build/server/chunks/{_server.ts-CxVcCd_Y.js.map → _server.ts-CdnHLmnS.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BQSWDfWh.js → _server.ts-CeYY_N3s.js} +7 -7
- package/build/server/chunks/{_server.ts-BQSWDfWh.js.map → _server.ts-CeYY_N3s.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CJM-f1kV.js → _server.ts-CgDSl-bZ.js} +6 -6
- package/build/server/chunks/{_server.ts-CJM-f1kV.js.map → _server.ts-CgDSl-bZ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CeEe4BDJ.js → _server.ts-Chb5ZQfn.js} +6 -6
- package/build/server/chunks/{_server.ts-CeEe4BDJ.js.map → _server.ts-Chb5ZQfn.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BP5O5ed-.js → _server.ts-Cn8Degal.js} +5 -5
- package/build/server/chunks/{_server.ts-BP5O5ed-.js.map → _server.ts-Cn8Degal.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BOsxJsio.js → _server.ts-Cp5vEyC3.js} +5 -5
- package/build/server/chunks/{_server.ts-BOsxJsio.js.map → _server.ts-Cp5vEyC3.js.map} +1 -1
- package/build/server/chunks/{_server.ts-trTG34Ww.js → _server.ts-CvK7mSvu.js} +5 -5
- package/build/server/chunks/{_server.ts-trTG34Ww.js.map → _server.ts-CvK7mSvu.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BwfxIKqK.js → _server.ts-Cxmz45DV.js} +2 -2
- package/build/server/chunks/{_server.ts-BwfxIKqK.js.map → _server.ts-Cxmz45DV.js.map} +1 -1
- package/build/server/chunks/{_server.ts--aziOyXy.js → _server.ts-D8QSM1cU.js} +6 -6
- package/build/server/chunks/{_server.ts--aziOyXy.js.map → _server.ts-D8QSM1cU.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BogVyDDl.js → _server.ts-DCX-XJUs.js} +5 -5
- package/build/server/chunks/{_server.ts-BogVyDDl.js.map → _server.ts-DCX-XJUs.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BozIsI8t.js → _server.ts-DCxOyE_l.js} +2 -2
- package/build/server/chunks/{_server.ts-BozIsI8t.js.map → _server.ts-DCxOyE_l.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D0jZhKGm.js → _server.ts-DH9BpAjd.js} +5 -5
- package/build/server/chunks/{_server.ts-D0jZhKGm.js.map → _server.ts-DH9BpAjd.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CgceKoNO.js → _server.ts-DP28_8KL.js} +5 -5
- package/build/server/chunks/{_server.ts-CgceKoNO.js.map → _server.ts-DP28_8KL.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CIZwntFK.js → _server.ts-DTTG8sjo.js} +5 -5
- package/build/server/chunks/{_server.ts-CIZwntFK.js.map → _server.ts-DTTG8sjo.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BO-Kapkc.js → _server.ts-D_MCO1MW.js} +6 -6
- package/build/server/chunks/{_server.ts-BO-Kapkc.js.map → _server.ts-D_MCO1MW.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DB3vn4az.js → _server.ts-DayoUQLx.js} +5 -5
- package/build/server/chunks/{_server.ts-DB3vn4az.js.map → _server.ts-DayoUQLx.js.map} +1 -1
- package/build/server/chunks/{_server.ts-SR2gSUo0.js → _server.ts-Dd0neT0d.js} +6 -6
- package/build/server/chunks/{_server.ts-SR2gSUo0.js.map → _server.ts-Dd0neT0d.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B_zah2wM.js → _server.ts-Dd7eYw-S.js} +8 -8
- package/build/server/chunks/{_server.ts-B_zah2wM.js.map → _server.ts-Dd7eYw-S.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B7ty4kVZ.js → _server.ts-Df1flAyY.js} +5 -5
- package/build/server/chunks/{_server.ts-B7ty4kVZ.js.map → _server.ts-Df1flAyY.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C_dR7wd9.js → _server.ts-Dq1UMLfO.js} +5 -5
- package/build/server/chunks/{_server.ts-C_dR7wd9.js.map → _server.ts-Dq1UMLfO.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B0TacAX6.js → _server.ts-Ffi_ygyt.js} +5 -5
- package/build/server/chunks/{_server.ts-B0TacAX6.js.map → _server.ts-Ffi_ygyt.js.map} +1 -1
- package/build/server/chunks/{_server.ts-G_z9XUCx.js → _server.ts-HL6jgRsr.js} +5 -5
- package/build/server/chunks/{_server.ts-G_z9XUCx.js.map → _server.ts-HL6jgRsr.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DVlKJb45.js → _server.ts-HvCsZh8e.js} +7 -7
- package/build/server/chunks/{_server.ts-DVlKJb45.js.map → _server.ts-HvCsZh8e.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BYV57dSO.js → _server.ts-IsoRW9Br.js} +5 -5
- package/build/server/chunks/{_server.ts-BYV57dSO.js.map → _server.ts-IsoRW9Br.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Q2ybJgOp.js → _server.ts-LMOpUE0X.js} +5 -5
- package/build/server/chunks/{_server.ts-Q2ybJgOp.js.map → _server.ts-LMOpUE0X.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CEfp34Xm.js → _server.ts-N6eVXe-M.js} +5 -5
- package/build/server/chunks/{_server.ts-CEfp34Xm.js.map → _server.ts-N6eVXe-M.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DwBWu6vf.js → _server.ts-RGstlQCl.js} +5 -5
- package/build/server/chunks/{_server.ts-DwBWu6vf.js.map → _server.ts-RGstlQCl.js.map} +1 -1
- package/build/server/chunks/{_server.ts-zzTbT1lZ.js → _server.ts-TE0TvsaN.js} +5 -5
- package/build/server/chunks/{_server.ts-zzTbT1lZ.js.map → _server.ts-TE0TvsaN.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BJ9ADv6Y.js → _server.ts-Z9pccGKT.js} +5 -5
- package/build/server/chunks/{_server.ts-BJ9ADv6Y.js.map → _server.ts-Z9pccGKT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B-MFuYiv.js → _server.ts-ZE0-NCSb.js} +6 -6
- package/build/server/chunks/{_server.ts-B-MFuYiv.js.map → _server.ts-ZE0-NCSb.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DdLfiCsa.js → _server.ts-dloW7Ue4.js} +5 -5
- package/build/server/chunks/{_server.ts-DdLfiCsa.js.map → _server.ts-dloW7Ue4.js.map} +1 -1
- package/build/server/chunks/{_server.ts-KLjpgpz8.js → _server.ts-dmI-XP3j.js} +5 -5
- package/build/server/chunks/{_server.ts-KLjpgpz8.js.map → _server.ts-dmI-XP3j.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BTyvXFiC.js → _server.ts-g0KkEEM2.js} +5 -5
- package/build/server/chunks/{_server.ts-BTyvXFiC.js.map → _server.ts-g0KkEEM2.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B_-Usu1x.js → _server.ts-kT5Yc92m.js} +2 -2
- package/build/server/chunks/{_server.ts-B_-Usu1x.js.map → _server.ts-kT5Yc92m.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bv2Pfo96.js → _server.ts-m_iK_Em9.js} +6 -6
- package/build/server/chunks/{_server.ts-Bv2Pfo96.js.map → _server.ts-m_iK_Em9.js.map} +1 -1
- package/build/server/chunks/{_server.ts-QuYs6sVA.js → _server.ts-qBgjGLYw.js} +6 -6
- package/build/server/chunks/{_server.ts-QuYs6sVA.js.map → _server.ts-qBgjGLYw.js.map} +1 -1
- package/build/server/chunks/{_server.ts-EOe8blar.js → _server.ts-qX9D3XhU.js} +5 -5
- package/build/server/chunks/{_server.ts-EOe8blar.js.map → _server.ts-qX9D3XhU.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CcHtPXgD.js → _server.ts-v34cjJkP.js} +5 -5
- package/build/server/chunks/{_server.ts-CcHtPXgD.js.map → _server.ts-v34cjJkP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-lMyqm-sM.js → _server.ts-xnv-wtwZ.js} +5 -5
- package/build/server/chunks/{_server.ts-lMyqm-sM.js.map → _server.ts-xnv-wtwZ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cif0oA-v.js → _server.ts-xyHQUOKx.js} +5 -5
- package/build/server/chunks/{_server.ts-Cif0oA-v.js.map → _server.ts-xyHQUOKx.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DrX2a5IF.js → _server.ts-y73fn8cW.js} +5 -5
- package/build/server/chunks/{_server.ts-DrX2a5IF.js.map → _server.ts-y73fn8cW.js.map} +1 -1
- package/build/server/chunks/{addon-helpers-COKT7Ji7.js → addon-helpers-dO2HRltp.js} +3 -3
- package/build/server/chunks/{addon-helpers-COKT7Ji7.js.map → addon-helpers-dO2HRltp.js.map} +1 -1
- package/build/server/chunks/{akm-C6A_jotZ.js → akm-C0ZnW6yS.js} +2 -2
- package/build/server/chunks/{akm-C6A_jotZ.js.map → akm-C0ZnW6yS.js.map} +1 -1
- package/build/server/chunks/{catalog-mZKY9YmN.js → catalog-B6MqIeOh.js} +5 -5
- package/build/server/chunks/{catalog-mZKY9YmN.js.map → catalog-B6MqIeOh.js.map} +1 -1
- package/build/server/chunks/{client-CrZpBhn6.js → client-DGHd5bAO.js} +3 -3
- package/build/server/chunks/client-DGHd5bAO.js.map +1 -0
- package/build/server/chunks/{config-CzgGZizD.js → config-nzqKqJkh.js} +2 -2
- package/build/server/chunks/{config-CzgGZizD.js.map → config-nzqKqJkh.js.map} +1 -1
- package/build/server/chunks/{dev-B6xUe35c.js → dev-D85DamNs.js} +2 -2
- package/build/server/chunks/{dev-B6xUe35c.js.map → dev-D85DamNs.js.map} +1 -1
- package/build/server/chunks/{docker-zAeaSN-J.js → docker-BIBTvza-.js} +2 -2
- package/build/server/chunks/{docker-zAeaSN-J.js.map → docker-BIBTvza-.js.map} +1 -1
- package/build/server/chunks/{endpoints-B1ZxJCU2.js → endpoints-B4l0zBcd.js} +2 -2
- package/build/server/chunks/{endpoints-B1ZxJCU2.js.map → endpoints-B4l0zBcd.js.map} +1 -1
- package/build/server/chunks/{environment-_alEnmZ3.js → environment-RkCHtNRX.js} +2 -2
- package/build/server/chunks/{environment-_alEnmZ3.js.map → environment-RkCHtNRX.js.map} +1 -1
- package/build/server/chunks/{error.svelte-CE-SzuQM.js → error.svelte-BjLah9Xk.js} +5 -5
- package/build/server/chunks/{error.svelte-CE-SzuQM.js.map → error.svelte-BjLah9Xk.js.map} +1 -1
- package/build/server/chunks/{helpers-eo3bfAj_.js → helpers-C3L6sfug.js} +3 -3
- package/build/server/chunks/{helpers-eo3bfAj_.js.map → helpers-C3L6sfug.js.map} +1 -1
- package/build/server/chunks/{hooks.server-edJqtsSL.js → hooks.server-BVGSE7-Z.js} +7 -7
- package/build/server/chunks/{hooks.server-edJqtsSL.js.map → hooks.server-BVGSE7-Z.js.map} +1 -1
- package/build/server/chunks/{http-BDiXrfdJ.js → http-CiHVRX16.js} +2 -2
- package/build/server/chunks/{http-BDiXrfdJ.js.map → http-CiHVRX16.js.map} +1 -1
- package/build/server/chunks/{internal-CeRZ03-m.js → internal-CZXS5gg1.js} +4 -4
- package/build/server/chunks/{internal-CeRZ03-m.js.map → internal-CZXS5gg1.js.map} +1 -1
- package/build/server/chunks/{migration-status-BmGtFtCs.js → migration-status-l1Fpnwut.js} +2 -2
- package/build/server/chunks/{migration-status-BmGtFtCs.js.map → migration-status-l1Fpnwut.js.map} +1 -1
- package/build/server/chunks/{session-cookie-BmuBN9f8.js → session-cookie-BOOm2iOG.js} +2 -2
- package/build/server/chunks/{session-cookie-BmuBN9f8.js.map → session-cookie-BOOm2iOG.js.map} +1 -1
- package/build/server/chunks/{setup-deploy-lCSIdKo9.js → setup-deploy-DYRGSVor.js} +2 -2
- package/build/server/chunks/{setup-deploy-lCSIdKo9.js.map → setup-deploy-DYRGSVor.js.map} +1 -1
- package/build/server/chunks/{src-Nk3p3REZ.js → src-UD1DW1SL.js} +2 -2
- package/build/server/chunks/{src-Nk3p3REZ.js.map → src-UD1DW1SL.js.map} +1 -1
- package/build/server/chunks/{state-CAh1dzAu.js → state-DY1YkVZ1.js} +2 -2
- package/build/server/chunks/{state-CAh1dzAu.js.map → state-DY1YkVZ1.js.map} +1 -1
- package/build/server/chunks/{state2-Clg3QDTN.js → state2-DWJks95y.js} +3 -3
- package/build/server/chunks/{state2-Clg3QDTN.js.map → state2-DWJks95y.js.map} +1 -1
- package/build/server/chunks/{theme-state.svelte-BsNoJAjT.js → theme-state.svelte-X1AAjj_J.js} +3 -2
- package/build/server/chunks/{theme-state.svelte-BsNoJAjT.js.map → theme-state.svelte-X1AAjj_J.js.map} +1 -1
- package/build/server/index.js +3 -3
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +98 -98
- package/build/server/manifest.js.map +1 -1
- package/package.json +2 -2
- package/build/client/_app/immutable/assets/0.Ba7WTgwx.css +0 -1
- package/build/client/_app/immutable/assets/0.Ba7WTgwx.css.br +0 -0
- package/build/client/_app/immutable/assets/0.Ba7WTgwx.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.BsRZqXxs.css +0 -1
- package/build/client/_app/immutable/assets/4.BsRZqXxs.css.br +0 -0
- package/build/client/_app/immutable/assets/4.BsRZqXxs.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.B8cq9Hgz.css +0 -1
- package/build/client/_app/immutable/assets/7.B8cq9Hgz.css.br +0 -0
- package/build/client/_app/immutable/assets/7.B8cq9Hgz.css.gz +0 -0
- package/build/client/_app/immutable/assets/8.CRX_TWKQ.css +0 -1
- package/build/client/_app/immutable/assets/8.CRX_TWKQ.css.br +0 -0
- package/build/client/_app/immutable/assets/8.CRX_TWKQ.css.gz +0 -0
- package/build/client/_app/immutable/assets/ChatMessage.D17mQUgG.css +0 -1
- package/build/client/_app/immutable/assets/ChatMessage.D17mQUgG.css.br +0 -0
- package/build/client/_app/immutable/assets/ChatMessage.D17mQUgG.css.gz +0 -0
- package/build/client/_app/immutable/assets/Navbar.DprsYQ5V.css +0 -1
- package/build/client/_app/immutable/assets/Navbar.DprsYQ5V.css.br +0 -0
- package/build/client/_app/immutable/assets/Navbar.DprsYQ5V.css.gz +0 -0
- package/build/client/_app/immutable/assets/SessionList.Bu2Ms4Fb.css +0 -1
- package/build/client/_app/immutable/assets/SessionList.Bu2Ms4Fb.css.br +0 -4
- package/build/client/_app/immutable/assets/SessionList.Bu2Ms4Fb.css.gz +0 -0
- package/build/client/_app/immutable/chunks/9fMyFnaz.js +0 -1
- package/build/client/_app/immutable/chunks/9fMyFnaz.js.br +0 -1
- package/build/client/_app/immutable/chunks/9fMyFnaz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BBI__kVO.js.br +0 -0
- package/build/client/_app/immutable/chunks/BBI__kVO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BI9E6yNi.js +0 -1
- package/build/client/_app/immutable/chunks/BI9E6yNi.js.br +0 -0
- package/build/client/_app/immutable/chunks/BI9E6yNi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOoHSrzv.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOoHSrzv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C8DbTCsH.js +0 -5
- package/build/client/_app/immutable/chunks/C8DbTCsH.js.br +0 -0
- package/build/client/_app/immutable/chunks/C8DbTCsH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CKjCR-mV.js.br +0 -0
- package/build/client/_app/immutable/chunks/CKjCR-mV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CNbsMvcJ.js +0 -1
- package/build/client/_app/immutable/chunks/CNbsMvcJ.js.br +0 -2
- package/build/client/_app/immutable/chunks/CNbsMvcJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CYr0uwbO.js.br +0 -0
- package/build/client/_app/immutable/chunks/CYr0uwbO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ClHlMH38.js.br +0 -0
- package/build/client/_app/immutable/chunks/ClHlMH38.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D-V3sSGz.js +0 -1
- package/build/client/_app/immutable/chunks/D-V3sSGz.js.br +0 -1
- package/build/client/_app/immutable/chunks/D-V3sSGz.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DVdGCA2w.js +0 -2
- package/build/client/_app/immutable/entry/app.DVdGCA2w.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DVdGCA2w.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DXmwlCGx.js +0 -1
- package/build/client/_app/immutable/entry/start.DXmwlCGx.js.br +0 -0
- package/build/client/_app/immutable/entry/start.DXmwlCGx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.Bc84QpLA.js +0 -1
- package/build/client/_app/immutable/nodes/0.Bc84QpLA.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Bc84QpLA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Be9tz5dE.js +0 -1
- package/build/client/_app/immutable/nodes/1.Be9tz5dE.js.br +0 -2
- package/build/client/_app/immutable/nodes/1.Be9tz5dE.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.D8Hw0nH7.js +0 -3
- package/build/client/_app/immutable/nodes/10.D8Hw0nH7.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.D8Hw0nH7.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.CWCgggRE.js +0 -1
- package/build/client/_app/immutable/nodes/2.CWCgggRE.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CWCgggRE.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.s6beQKPO.js +0 -1
- package/build/client/_app/immutable/nodes/3.s6beQKPO.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.s6beQKPO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.zj19gkHO.js +0 -131
- package/build/client/_app/immutable/nodes/4.zj19gkHO.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.zj19gkHO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.CAmlmAqL.js +0 -4
- package/build/client/_app/immutable/nodes/5.CAmlmAqL.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.CAmlmAqL.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BjXg7nup.js +0 -1
- package/build/client/_app/immutable/nodes/6.BjXg7nup.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BjXg7nup.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.IGZCMNtw.js +0 -1
- package/build/client/_app/immutable/nodes/7.IGZCMNtw.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.IGZCMNtw.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.DfEOJulU.js +0 -1
- package/build/client/_app/immutable/nodes/8.DfEOJulU.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.DfEOJulU.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.By6OD0XG.js +0 -6
- package/build/client/_app/immutable/nodes/9.By6OD0XG.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.By6OD0XG.js.gz +0 -0
- package/build/server/chunks/0-UVlzJ0C2.js +0 -9
- package/build/server/chunks/0-UVlzJ0C2.js.map +0 -1
- package/build/server/chunks/1-DGncWjNE.js +0 -9
- package/build/server/chunks/2-z6oPo7ca.js +0 -9
- package/build/server/chunks/4-C_wBnJ9G.js +0 -9
- package/build/server/chunks/4-C_wBnJ9G.js.map +0 -1
- package/build/server/chunks/5-_bvgZb_f.js +0 -9
- package/build/server/chunks/5-_bvgZb_f.js.map +0 -1
- package/build/server/chunks/6-CCWtpCVk.js +0 -9
- package/build/server/chunks/6-CCWtpCVk.js.map +0 -1
- package/build/server/chunks/7-eEOVyUMC.js +0 -9
- package/build/server/chunks/9-BhL47FUJ.js +0 -9
- package/build/server/chunks/9-BhL47FUJ.js.map +0 -1
- package/build/server/chunks/Navbar-WKJhx255.js.map +0 -1
- package/build/server/chunks/SessionList-CWKGPQSI.js.map +0 -1
- package/build/server/chunks/_layout.svelte-oFWL-MU8.js +0 -60
- package/build/server/chunks/_layout.svelte-oFWL-MU8.js.map +0 -1
- package/build/server/chunks/_page.svelte-Bn3LEN1Y.js.map +0 -1
- package/build/server/chunks/_page.svelte-Bu9dlKgJ.js.map +0 -1
- package/build/server/chunks/_page.svelte-CigItPjU.js.map +0 -1
- package/build/server/chunks/_page.svelte-D98QHSOI.js.map +0 -1
- package/build/server/chunks/_page.svelte-dXTqinDv.js.map +0 -1
- package/build/server/chunks/client-CrZpBhn6.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_page.svelte-CigItPjU.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js"],"sourcesContent":["import { H as escape_html, V as attr, a as derived, n as attr_class, o as ensure_array_like, r as attr_style, s as head, u as stringify } from \"../../../chunks/dev.js\";\nimport \"../../../chunks/index-server.js\";\nimport { a as addonProfileId, n as OLLAMA_DEFAULT_CHAT_MODEL, t as KNOWN_EMBEDDING_MODEL_DIMS } from \"../../../chunks/provider-constants.js\";\nimport { t as Spinner } from \"../../../chunks/Spinner.js\";\n//#region src/lib/client/constants.ts\nvar PROVIDERS = [\n\t{\n\t\tid: \"ollama\",\n\t\tname: \"Ollama\",\n\t\tkind: \"local\",\n\t\tgroup: \"recommended\",\n\t\torder: 1,\n\t\ticon: \"🦙\",\n\t\tdesc: \"Run open models on your hardware\",\n\t\tneedsKey: false,\n\t\tplaceholder: \"\",\n\t\tbaseUrl: \"http://localhost:11434\",\n\t\tllmModel: \"llama3.2\",\n\t\tembModel: \"nomic-embed-text\",\n\t\tembDims: 768,\n\t\tcanDetect: true\n\t},\n\t{\n\t\tid: \"huggingface\",\n\t\tname: \"Hugging Face\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"recommended\",\n\t\torder: 2,\n\t\ticon: \"🤗\",\n\t\tdesc: \"10,000+ open models via Inference Providers\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"hf_...\",\n\t\tbaseUrl: \"https://router.huggingface.co/v1\",\n\t\tllmModel: \"Qwen/Qwen3-32B\",\n\t\tembModel: \"intfloat/multilingual-e5-large\",\n\t\tembDims: 1024,\n\t\tkeyPrefix: \"hf_\"\n\t},\n\t{\n\t\tid: \"openai\",\n\t\tname: \"OpenAI\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"recommended\",\n\t\torder: 3,\n\t\ticon: \"◐\",\n\t\tdesc: \"GPT and o-series reasoning models\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"sk-...\",\n\t\tbaseUrl: \"https://api.openai.com\",\n\t\tllmModel: \"gpt-4o\",\n\t\tembModel: \"text-embedding-3-small\",\n\t\tembDims: 1536\n\t},\n\t{\n\t\tid: \"google\",\n\t\tname: \"Google\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"recommended\",\n\t\torder: 4,\n\t\ticon: \"◆\",\n\t\tdesc: \"Gemini models with large context\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"AIza...\",\n\t\tbaseUrl: \"https://generativelanguage.googleapis.com\",\n\t\tllmModel: \"gemini-2.5-flash\",\n\t\tembModel: \"\",\n\t\tembDims: 0,\n\t\tkeyPrefix: \"AI\"\n\t},\n\t{\n\t\tid: \"model-runner\",\n\t\tname: \"Docker Model Runner\",\n\t\tkind: \"local\",\n\t\tgroup: \"local\",\n\t\torder: 1,\n\t\ticon: \"🐳\",\n\t\tdesc: \"Docker-managed model runtime\",\n\t\tneedsKey: false,\n\t\tplaceholder: \"\",\n\t\tbaseUrl: \"http://localhost:12434\",\n\t\tllmModel: \"ai/llama3.2\",\n\t\tembModel: \"ai/mxbai-embed-large-v1\",\n\t\tembDims: 1024,\n\t\tcanDetect: true\n\t},\n\t{\n\t\tid: \"lmstudio\",\n\t\tname: \"LM Studio\",\n\t\tkind: \"local\",\n\t\tgroup: \"local\",\n\t\torder: 2,\n\t\ticon: \"🔬\",\n\t\tdesc: \"Desktop app for local inference\",\n\t\tneedsKey: false,\n\t\tplaceholder: \"\",\n\t\tbaseUrl: \"http://localhost:1234\",\n\t\tllmModel: \"loaded-model\",\n\t\tembModel: \"\",\n\t\tembDims: 0,\n\t\tcanDetect: true\n\t},\n\t{\n\t\tid: \"groq\",\n\t\tname: \"Groq\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"cloud\",\n\t\torder: 1,\n\t\ticon: \"⚡\",\n\t\tdesc: \"Ultra-fast inference\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"gsk_...\",\n\t\tbaseUrl: \"https://api.groq.com/openai\",\n\t\tllmModel: \"llama-3.3-70b-versatile\",\n\t\tembModel: \"\",\n\t\tembDims: 0\n\t},\n\t{\n\t\tid: \"mistral\",\n\t\tname: \"Mistral\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"cloud\",\n\t\torder: 2,\n\t\ticon: \"◆\",\n\t\tdesc: \"Mistral & Codestral models\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"...\",\n\t\tbaseUrl: \"https://api.mistral.ai\",\n\t\tllmModel: \"mistral-large-latest\",\n\t\tembModel: \"mistral-embed\",\n\t\tembDims: 1024\n\t},\n\t{\n\t\tid: \"together\",\n\t\tname: \"Together AI\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"cloud\",\n\t\torder: 3,\n\t\ticon: \"✦\",\n\t\tdesc: \"Open models at scale\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"...\",\n\t\tbaseUrl: \"https://api.together.xyz\",\n\t\tllmModel: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n\t\tembModel: \"\",\n\t\tembDims: 0\n\t},\n\t{\n\t\tid: \"deepseek\",\n\t\tname: \"DeepSeek\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"advanced\",\n\t\torder: 1,\n\t\ticon: \"◎\",\n\t\tdesc: \"DeepSeek chat & reasoning\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"sk-...\",\n\t\tbaseUrl: \"https://api.deepseek.com\",\n\t\tllmModel: \"deepseek-chat\",\n\t\tembModel: \"\",\n\t\tembDims: 0\n\t},\n\t{\n\t\tid: \"xai\",\n\t\tname: \"xAI (Grok)\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"advanced\",\n\t\torder: 2,\n\t\ticon: \"✦\",\n\t\tdesc: \"Grok models\",\n\t\tneedsKey: true,\n\t\tplaceholder: \"xai-...\",\n\t\tbaseUrl: \"https://api.x.ai\",\n\t\tllmModel: \"grok-2\",\n\t\tembModel: \"\",\n\t\tembDims: 0\n\t},\n\t{\n\t\tid: \"openai-compatible\",\n\t\tname: \"Custom API server\",\n\t\tkind: \"cloud\",\n\t\tgroup: \"advanced\",\n\t\torder: 3,\n\t\ticon: \"🔧\",\n\t\tdesc: \"Connect any AI server that uses the standard OpenAI API format.\",\n\t\tneedsKey: false,\n\t\tneedsUrl: true,\n\t\toptionalKey: true,\n\t\tplaceholder: \"API key (optional)\",\n\t\tbaseUrl: \"\",\n\t\tllmModel: \"\",\n\t\tembModel: \"\",\n\t\tembDims: 0\n\t}\n];\n/** Provider IDs excluded from the setup wizard's OAuth provider list. */\nvar WIZARD_EXCLUDED_PROVIDERS = new Set([\"anthropic\"]);\nvar PORTALS = [\n\t{\n\t\tid: \"api\",\n\t\tname: \"API\",\n\t\ticon: \"🔌\",\n\t\tdesc: \"OpenAI-compatible REST API endpoint\",\n\t\tlocked: true\n\t},\n\t{\n\t\tid: \"discord\",\n\t\tname: \"Discord\",\n\t\ticon: \"🎮\",\n\t\tdesc: \"Connect to a Discord server\",\n\t\tcredentials: [{\n\t\t\tkey: \"botToken\",\n\t\t\tlabel: \"Bot Token\",\n\t\t\tplaceholder: \"Paste Discord bot token\",\n\t\t\trequired: true\n\t\t}, {\n\t\t\tkey: \"applicationId\",\n\t\t\tlabel: \"Application ID\",\n\t\t\tplaceholder: \"Discord application ID\",\n\t\t\tsecret: false\n\t\t}]\n\t},\n\t{\n\t\tid: \"slack\",\n\t\tname: \"Slack\",\n\t\ticon: \"💼\",\n\t\tdesc: \"Access via Slack bot\",\n\t\tcredentials: [{\n\t\t\tkey: \"slackBotToken\",\n\t\t\tlabel: \"Bot Token\",\n\t\t\tplaceholder: \"xoxb-...\",\n\t\t\trequired: true\n\t\t}, {\n\t\t\tkey: \"slackAppToken\",\n\t\t\tlabel: \"App Token\",\n\t\t\tplaceholder: \"xapp-...\",\n\t\t\trequired: true\n\t\t}]\n\t}\n];\n//#endregion\n//#region src/lib/client/helpers.ts\nfunction selectAddonProfileId(profiles, addon, gpuDetected, variant) {\n\tconst avail = (p) => p.available !== false;\n\tconst preferred = addonProfileId(addon, variant ?? (gpuDetected ? \"cuda\" : \"cpu\"));\n\tconst cpu = addonProfileId(addon, \"cpu\");\n\treturn (profiles.find((p) => p.id === preferred && avail(p)) ?? profiles.find((p) => p.default && avail(p)) ?? profiles.find((p) => p.id === cpu && avail(p)) ?? profiles.find((p) => avail(p)))?.id;\n}\n/** Strip an Ollama-style \":tag\" suffix so \"llama3.2\" matches \"llama3.2:latest\". */\nfunction baseModelId(model) {\n\treturn model.replace(/:.*$/, \"\");\n}\n/** True for embedding models — never offered/auto-picked for the chat/small role. */\nfunction isEmbeddingModelId(model) {\n\tconst base = baseModelId(model);\n\tif (KNOWN_EMBEDDING_MODEL_DIMS[model] !== void 0 || KNOWN_EMBEDDING_MODEL_DIMS[base] !== void 0) return true;\n\treturn /(?:^|[-/_.])(embed|embedding|bge|gte|e5|nomic|mxbai|arctic-embed|minilm)/i.test(model);\n}\n/** Heuristic score for a chat ('llm') or 'small' model. Higher = better default. */\nfunction scoreModelForRole(roleId, model) {\n\tconst m = model.toLowerCase();\n\tlet s = 0;\n\tif (/instruct|chat|-it\\b|\\bit\\b/.test(m)) s += 30;\n\tif (/coder|code/.test(m)) s += 8;\n\tconst sizeMatch = m.match(/(\\d+(?:\\.\\d+)?)\\s*x?\\s*b\\b/);\n\tconst sizeB = sizeMatch ? parseFloat(sizeMatch[1]) : 0;\n\tif (roleId === \"llm\") s += Math.min(40, sizeB);\n\telse s += Math.max(0, 20 - Math.min(20, sizeB));\n\treturn s;\n}\nvar LOCAL_PROVIDER_IDS = new Set([\n\t\"ollama\",\n\t\"lmstudio\",\n\t\"model-runner\"\n]);\n/**\n* Build the ranked list of model options for a role across all verified\n* providers. For chat/small: embedding models are excluded and results are\n* ordered best-first (host/cloud before local, provider's declared default,\n* then the role heuristic) so options[0] is the sensible auto-pick. For\n* embedding: only real embedding models are returned (may be empty — akm\n* self-embeds locally, so an empty list is fine and the role is auto-handled).\n*/\nfunction buildModelOptions(roleId, verifiedProviders, providerState) {\n\tconst options = [];\n\tfor (const p of verifiedProviders) {\n\t\tconst st = providerState[p.id];\n\t\tif (!st) continue;\n\t\tconst defaultModel = roleId === \"embedding\" ? p.embModel : p.llmModel;\n\t\tconst models = st.models.length > 0 ? st.models : [];\n\t\tconst matchedDefault = defaultModel ? models.find((m) => m === defaultModel || baseModelId(m) === baseModelId(defaultModel)) : void 0;\n\t\tfor (const m of models) {\n\t\t\tif (roleId !== \"embedding\" && isEmbeddingModelId(m)) continue;\n\t\t\tconst dims = roleId === \"embedding\" ? KNOWN_EMBEDDING_MODEL_DIMS[m] ?? KNOWN_EMBEDDING_MODEL_DIMS[baseModelId(m)] ?? (m === matchedDefault ? p.embDims : 0) ?? 0 : 0;\n\t\t\toptions.push({\n\t\t\t\tid: m,\n\t\t\t\tconnId: p.id,\n\t\t\t\tproviderName: p.name,\n\t\t\t\tbaseUrl: st.baseUrl || p.baseUrl,\n\t\t\t\tisDefault: m === matchedDefault,\n\t\t\t\tdims\n\t\t\t});\n\t\t}\n\t}\n\tif (roleId === \"embedding\") return options.filter((o) => o.isDefault || o.dims > 0);\n\treturn options.sort((a, b) => (LOCAL_PROVIDER_IDS.has(a.connId) ? 1 : 0) - (LOCAL_PROVIDER_IDS.has(b.connId) ? 1 : 0) || (b.isDefault ? 1 : 0) - (a.isDefault ? 1 : 0) || scoreModelForRole(roleId, b.id) - scoreModelForRole(roleId, a.id));\n}\n/**\n* Resolve which voice engine to use for one side (TTS or STT).\n*\n* - An explicit engine in `side` wins unconditionally.\n* - No explicit engine + bundled voice enabled → openpalm-voice.\n* - No explicit engine + bundled voice off → fallback engine (e.g. 'browser-tts').\n*\n* Pass fallbackEngine='' for the \"persisted\" form (nothing saved when untouched).\n* Pass a concrete fallback for the \"displayed\" form so the UI shows the real default.\n*/\nfunction resolveVoiceSide(side, enableVoice, fallbackEngine) {\n\tif (side.engine) return side;\n\tif (enableVoice) return { engine: \"openpalm-voice\" };\n\treturn { engine: fallbackEngine };\n}\nfunction isPortalEnabled(portalSelection, chId, locked) {\n\tif (locked) return true;\n\tconst sel = portalSelection[chId];\n\tif (typeof sel === \"object\" && sel !== null) return sel.enabled;\n\treturn !!sel;\n}\nfunction getCredValue(portalSelection, chId, key) {\n\tconst sel = portalSelection[chId];\n\tif (typeof sel === \"object\" && sel !== null) return String(sel[key] ?? \"\");\n\treturn \"\";\n}\n//#endregion\n//#region src/lib/client/error-messages.ts\nvar DOCKER_LINK = {\n\tlabel: \"Docker setup\",\n\thref: \"https://docs.docker.com/get-docker/\"\n};\nfunction rawText(raw) {\n\tif (!raw) return \"\";\n\tif (raw instanceof Error) return raw.message;\n\tif (typeof raw === \"string\") return raw;\n\ttry {\n\t\treturn JSON.stringify(raw);\n\t} catch {\n\t\treturn String(raw);\n\t}\n}\nfunction friendlyError(raw, context = \"generic\", opts = {}) {\n\tconst text = rawText(raw);\n\tconst lower = text.toLowerCase();\n\tconst providerLabel = opts.providerName ? `${opts.providerName} didn't accept that key` : \"API key rejected\";\n\tif (/\\b(401|403|unauthorized|forbidden|invalid.?api.?key)\\b/i.test(text)) return {\n\t\ttitle: providerLabel,\n\t\tbody: \"The provider rejected the API key.\",\n\t\thint: \"Common causes: extra spaces, wrong account, or the key was revoked. Double-check the key and that it has access to the model you selected. Most providers show the key in their dashboard.\",\n\t\traw: text\n\t};\n\tif (/\\b(ENOTFOUND|ECONNREFUSED|getaddrinfo|EAI_AGAIN|EHOSTUNREACH)\\b/i.test(text)) return {\n\t\ttitle: \"Couldn't reach the host\",\n\t\tbody: text,\n\t\thint: \"Confirm the URL is correct and the service is online. For local providers (Ollama, LM Studio) make sure the server is running on this machine.\",\n\t\traw: text\n\t};\n\tif (/(timeout|timed out|AbortError|ETIMEDOUT)/i.test(text)) return {\n\t\ttitle: \"Request timed out\",\n\t\tbody: \"The provider didn't respond in time.\",\n\t\thint: \"It may be slow or temporarily down. Try again in a moment.\",\n\t\traw: text\n\t};\n\tif (lower.includes(\"docker\") || lower.includes(\"compose\") || lower.includes(\"daemon\")) return {\n\t\ttitle: \"Docker isn't available\",\n\t\tbody: \"OpenPalm needs Docker (with Compose v2) installed and running.\",\n\t\thint: \"Start Docker Desktop (macOS/Windows) or the docker daemon (Linux), then retry.\",\n\t\tlinks: [DOCKER_LINK],\n\t\traw: text\n\t};\n\tif (/EADDRINUSE/i.test(text) || /port.*in.?use/i.test(lower)) return {\n\t\ttitle: \"A required port is already in use\",\n\t\tbody: text,\n\t\thint: \"Another program is using one of OpenPalm's default ports. Quit the conflicting app, or change OpenPalm's port from the Admin Dashboard after setup.\",\n\t\traw: text\n\t};\n\tif (/EACCES|EPERM|permission denied/i.test(text)) return {\n\t\ttitle: \"Permission denied\",\n\t\tbody: text,\n\t\thint: \"OpenPalm couldn't write to its data directory. Check that ~/.openpalm/ is writable by your user.\",\n\t\traw: text\n\t};\n\tswitch (context) {\n\t\tcase \"provider-verify\":\n\t\tcase \"model-fetch\": return {\n\t\t\ttitle: \"Couldn't connect to the provider\",\n\t\t\tbody: text || \"Verification failed.\",\n\t\t\thint: \"Check the API key and base URL, then click Verify again.\",\n\t\t\traw: text\n\t\t};\n\t\tcase \"setup-complete\": return {\n\t\t\ttitle: \"Setup couldn't finish\",\n\t\t\tbody: text || \"Writing configuration failed.\",\n\t\t\thint: \"Check the technical details below, then retry. If the issue persists, the admin dashboard logs may help.\",\n\t\t\traw: text\n\t\t};\n\t\tcase \"deploy\":\n\t\tcase \"deploy-poll\": return {\n\t\t\ttitle: \"Deployment ran into a problem\",\n\t\t\tbody: text || \"One or more services failed to start.\",\n\t\t\thint: \"Image pulls can take several minutes on first install. Retry to attempt again; check Docker logs if it keeps failing.\",\n\t\t\traw: text\n\t\t};\n\t\tcase \"system-check\": return {\n\t\t\ttitle: \"System check failed\",\n\t\t\tbody: text || \"A required dependency is missing.\",\n\t\t\thint: \"Resolve the failing check above, then click Retry.\",\n\t\t\traw: text\n\t\t};\n\t\tcase \"portal\": return {\n\t\t\ttitle: \"Portal credential issue\",\n\t\t\tbody: text || \"A required field is missing or invalid.\",\n\t\t\thint: \"Confirm the bot token and other required fields are correct.\",\n\t\t\traw: text\n\t\t};\n\t\tcase \"port-conflict\": return {\n\t\t\ttitle: \"A required port is already in use\",\n\t\t\tbody: text || \"Another process is using one of OpenPalm's ports.\",\n\t\t\thint: \"Another program is using one of OpenPalm's default ports. Quit the conflicting app, or change OpenPalm's port from the Admin Dashboard after setup.\",\n\t\t\traw: text\n\t\t};\n\t\tdefault: return {\n\t\t\ttitle: \"Something went wrong\",\n\t\t\tbody: text || \"An unexpected error occurred.\",\n\t\t\thint: \"Try again. If the problem persists, check the admin dashboard logs.\",\n\t\t\traw: text\n\t\t};\n\t}\n}\n//#endregion\n//#region src/lib/components/common/FriendlyError.svelte\nfunction FriendlyError($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/** Render compactly without the technical-details disclosure (inline forms). */\n\t\tlet { error, role = \"alert\", compact = false } = $$props;\n\t\tif (error) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"friendly-error svelte-iqsgzf\"${attr(\"role\", role)}><div class=\"friendly-error-header svelte-iqsgzf\"><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=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line></svg> <strong class=\"friendly-error-title svelte-iqsgzf\">${escape_html(error.title)}</strong></div> `);\n\t\t\tif (error.body) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"friendly-error-body svelte-iqsgzf\">${escape_html(error.body)}</p>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\tif (error.hint) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"friendly-error-hint svelte-iqsgzf\">${escape_html(error.hint)}</p>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\tif (error.links && error.links.length > 0) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<div class=\"friendly-error-links svelte-iqsgzf\"><!--[-->`);\n\t\t\t\tconst each_array = ensure_array_like(error.links);\n\t\t\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\t\t\tlet link = each_array[$$index];\n\t\t\t\t\t$$renderer.push(`<a${attr(\"href\", link.href)} target=\"_blank\" rel=\"noopener noreferrer\" class=\"friendly-error-link svelte-iqsgzf\">${escape_html(link.label)} →</a>`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--></div>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\tif (!compact && error.raw && error.raw !== error.body) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<details class=\"friendly-error-details svelte-iqsgzf\"><summary class=\"svelte-iqsgzf\">Technical details</summary> <pre class=\"svelte-iqsgzf\">${escape_html(error.raw)}</pre></details>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]-->`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/SystemCheckStep.svelte\nfunction SystemCheckStep($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/** True when re-running an existing install; suppresses misleading\n\t\t* port-conflict warnings that just reflect the running stack itself. */\n\t\tlet { onnext, onpass, ongpudetected, isRerun = false } = $$props;\n\t\tlet loading = true;\n\t\tlet result = null;\n\t\tconst portConflicts = derived(() => isRerun ? [] : []);\n\t\tconst blockingPortConflicts = derived(() => portConflicts().filter((p) => p.blocking));\n\t\tderived(() => blockingPortConflicts().length > 0);\n\t\tderived(() => false);\n\t\t$$renderer.push(`<h2>System Check</h2> <p class=\"step-description\">Let's make sure your machine has everything OpenPalm needs.</p> `);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> <div class=\"syscheck-list svelte-1txhq2p\" aria-live=\"polite\"><div${attr_class(\"syscheck-row svelte-1txhq2p\", void 0, {\n\t\t\t\"syscheck-row--ok\": void 0,\n\t\t\t\"syscheck-row--fail\": result\n\t\t})}><div class=\"syscheck-icon svelte-1txhq2p\">`);\n\t\t$$renderer.push(\"<!--[0-->\");\n\t\tSpinner($$renderer, { size: 16 });\n\t\t$$renderer.push(`<!--]--></div> <div class=\"syscheck-body svelte-1txhq2p\"><div class=\"syscheck-title svelte-1txhq2p\">Docker is installed and running</div> `);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--></div></div> <div${attr_class(\"syscheck-row svelte-1txhq2p\", void 0, {\n\t\t\t\"syscheck-row--ok\": void 0,\n\t\t\t\"syscheck-row--fail\": result\n\t\t})}><div class=\"syscheck-icon svelte-1txhq2p\">`);\n\t\t$$renderer.push(\"<!--[0-->\");\n\t\tSpinner($$renderer, { size: 16 });\n\t\t$$renderer.push(`<!--]--></div> <div class=\"syscheck-body svelte-1txhq2p\"><div class=\"syscheck-title svelte-1txhq2p\">Docker can run multi-container apps</div> `);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--></div></div> `);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--></div> <div class=\"step-actions\"><button class=\"btn btn-secondary\" id=\"btn-syscheck-retry\"${attr(\"disabled\", loading, true)}>${escape_html(\"Checking…\")}</button> <button class=\"btn btn-primary\" id=\"btn-syscheck-next\"${attr(\"disabled\", loading, true)}>Continue</button></div>`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/ProviderOAuthList.svelte\nfunction ProviderOAuthList($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/**\n\t\t* ProviderOAuthList — OAuth provider list for CloudAttachPanel.\n\t\t*\n\t\t* Renders a compact vertical list of OAuth-capable providers,\n\t\t* filtered through WIZARD_EXCLUDED_PROVIDERS (no Anthropic).\n\t\t*\n\t\t* Props:\n\t\t* opencodeProviders — full list from /api/setup/recommend\n\t\t* opencodeAuth — auth methods per provider id\n\t\t* providerState — current verification state per provider id\n\t\t* onoauthstart — called when the user clicks \"Sign in\" for a provider\n\t\t* onoauthcancel — called when OAuth poll should be aborted\n\t\t*/\n\t\tlet { opencodeProviders, opencodeAuth, providerState, onoauthstart, onoauthcancel } = $$props;\n\t\tconst RECOGNIZABLE_FIRST = [\n\t\t\t\"openai\",\n\t\t\t\"google\",\n\t\t\t\"github-copilot\",\n\t\t\t\"groq\",\n\t\t\t\"mistral\",\n\t\t\t\"huggingface\"\n\t\t];\n\t\tconst filteredProviders = derived(() => opencodeProviders.filter((p) => {\n\t\t\tif (WIZARD_EXCLUDED_PROVIDERS.has(p.id)) return false;\n\t\t\tif (providerState[p.id]?.verified) return false;\n\t\t\treturn (opencodeAuth[p.id] ?? []).some((m) => m.type === \"oauth\");\n\t\t}).sort((a, b) => {\n\t\t\tconst ia = RECOGNIZABLE_FIRST.indexOf(a.id);\n\t\t\tconst ib = RECOGNIZABLE_FIRST.indexOf(b.id);\n\t\t\treturn (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib);\n\t\t}));\n\t\tconst OAUTH_CAP = 4;\n\t\tconst visibleOauth = derived(() => filteredProviders().slice(0, OAUTH_CAP));\n\t\tconst hiddenOauthCount = derived(() => Math.max(0, filteredProviders().length - OAUTH_CAP));\n\t\tfunction getState(id) {\n\t\t\treturn providerState[id] ?? {\n\t\t\t\tselected: false,\n\t\t\t\tverified: false,\n\t\t\t\tverifying: false,\n\t\t\t\terror: false,\n\t\t\t\tapiKey: \"\",\n\t\t\t\tbaseUrl: \"\",\n\t\t\t\tmodels: [],\n\t\t\t\tollamaMode: null\n\t\t\t};\n\t\t}\n\t\tfunction oauthMethod(id) {\n\t\t\treturn (opencodeAuth[id] ?? []).find((m) => m.type === \"oauth\");\n\t\t}\n\t\tfunction oauthMethodIndex(id) {\n\t\t\treturn (opencodeAuth[id] ?? []).findIndex((m) => m.type === \"oauth\");\n\t\t}\n\t\t$$renderer.push(`<div class=\"oauth-list svelte-1kgjxt0\" role=\"list\">`);\n\t\tif (filteredProviders().length === 0) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<p class=\"oauth-empty svelte-1kgjxt0\">Nothing more to add — you're all connected.</p>`);\n\t\t} else {\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--[-->`);\n\t\t\tconst each_array = ensure_array_like(visibleOauth());\n\t\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\t\tlet provider = each_array[$$index];\n\t\t\t\tconst st = getState(provider.id);\n\t\t\t\toauthMethod(provider.id);\n\t\t\t\toauthMethodIndex(provider.id);\n\t\t\t\t$$renderer.push(`<div class=\"oauth-row svelte-1kgjxt0\" role=\"listitem\"${attr(\"data-provider\", provider.id)}><span class=\"oauth-name svelte-1kgjxt0\">${escape_html(provider.name)}</span> `);\n\t\t\t\tif (st.verified) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<span class=\"oauth-status oauth-status--ok svelte-1kgjxt0\"${attr(\"aria-label\", `${stringify(provider.name)} connected`)}>Connected ✓</span>`);\n\t\t\t\t} else if (st.oauthPolling) {\n\t\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t\t$$renderer.push(`<div class=\"oauth-polling svelte-1kgjxt0\">`);\n\t\t\t\t\tif (st.oauthUrl) {\n\t\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t\t$$renderer.push(`<a${attr(\"href\", st.oauthUrl)} target=\"_blank\" rel=\"noopener\" class=\"oauth-open-link svelte-1kgjxt0\">Open authorization page →</a>`);\n\t\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\t\t\tif (st.oauthInstructions) {\n\t\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t\t$$renderer.push(`<p class=\"oauth-instructions svelte-1kgjxt0\">${escape_html(st.oauthInstructions)}</p>`);\n\t\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`<!--]--> <div class=\"oauth-waiting svelte-1kgjxt0\">`);\n\t\t\t\t\tSpinner($$renderer, {});\n\t\t\t\t\t$$renderer.push(`<!----> Waiting for authorization…</div> <button type=\"button\" class=\"btn-oauth-cancel svelte-1kgjxt0\">Cancel</button></div>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`<button type=\"button\" class=\"btn btn-secondary btn-sm\"${attr(\"disabled\", st.verifying, true)}>${escape_html(st.verifying ? \"Signing in…\" : \"Sign in\")}</button>`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\t\tif (st.error && !st.oauthPolling) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<span class=\"oauth-error svelte-1kgjxt0\" role=\"alert\">${escape_html(st.errorMessage ?? \"Authorization failed\")}</span>`);\n\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<!--]--></div>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\tif (hiddenOauthCount() > 0) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<button type=\"button\" class=\"oauth-more svelte-1kgjxt0\">${escape_html(`Show ${hiddenOauthCount()} more services`)}</button>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]-->`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></div>`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/CloudAttachPanel.svelte\nfunction CloudAttachPanel($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/**\n\t\t* CloudAttachPanel — the simplest possible \"connect your AI\" step.\n\t\t*\n\t\t* Two states only, no jargon:\n\t\t* - An AI account was found on this computer → one \"Use this account\" button.\n\t\t* - Otherwise (or \"use a different account\") → sign-in buttons.\n\t\t*\n\t\t* Deliberately NO provider count/list, NO \"other options\", and NO custom\n\t\t* endpoint / API-key fields — those are power-user concerns that live in the\n\t\t* admin dashboard after setup, not in first-run.\n\t\t*/\n\t\tlet { credentialCount = 0, cloudProviders = [], opencodeProviders = [], opencodeAuth = {}, providerState = {}, hostImporting = false, verifiedCount = 0, onhostimport, onoauthstart, onoauthcancel } = $$props;\n\t\tconst hasFoundAccount = derived(() => credentialCount > 0 || cloudProviders.length > 0);\n\t\tconst connected = derived(() => verifiedCount > 0);\n\t\tlet signInInstead = false;\n\t\tconst showSignIn = derived(() => !hasFoundAccount() || signInInstead);\n\t\t$$renderer.push(`<div class=\"cloud-attach svelte-v318we\">`);\n\t\tif (!showSignIn()) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\tif (connected()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"connected svelte-v318we\" role=\"status\"><span class=\"check svelte-v318we\" aria-hidden=\"true\">✓</span> Connected your AI account.</p> <button type=\"button\" class=\"account-link svelte-v318we\">Use a different account</button>`);\n\t\t\t} else if (hostImporting) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`<p class=\"connecting svelte-v318we\" role=\"status\">`);\n\t\t\t\tSpinner($$renderer, {});\n\t\t\t\t$$renderer.push(`<!----> Connecting your AI account…</p>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<p class=\"lead svelte-v318we\">We found an AI account on this computer.</p> <button type=\"button\" class=\"btn-connect svelte-v318we\" id=\"btn-host-import\">Use this account</button> <button type=\"button\" class=\"account-link svelte-v318we\">Use a different account</button>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]-->`);\n\t\t} else {\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<p class=\"lead svelte-v318we\">Sign in to your AI service:</p> `);\n\t\t\tProviderOAuthList($$renderer, {\n\t\t\t\topencodeProviders,\n\t\t\t\topencodeAuth,\n\t\t\t\tproviderState,\n\t\t\t\tonoauthstart: (id, idx) => onoauthstart?.(id, idx),\n\t\t\t\tonoauthcancel: (id) => onoauthcancel?.(id)\n\t\t\t});\n\t\t\t$$renderer.push(`<!----> `);\n\t\t\tif (hasFoundAccount()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<button type=\"button\" class=\"account-link svelte-v318we\">Use the account on this computer instead</button>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]-->`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></div>`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/LocalModelsStatus.svelte\nfunction LocalModelsStatus($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/**\n\t\t* LocalModelsStatus — shows the local model runtime state for Screen 1.\n\t\t*\n\t\t* Props:\n\t\t* hostProviders — runtimes already running on the host (ollama / lmstudio / model-runner)\n\t\t* gpuVramMb — detected VRAM in MiB (0 = not detected)\n\t\t* gpuVendor — 'apple' | 'nvidia' | 'amd' | '' (empty = not detected)\n\t\t* gpuName — human-readable GPU name from detection\n\t\t* ollamaEnabled — true when in-stack Ollama will be added\n\t\t* selectedOllamaProfile — Ollama profile id (cuda / rocm / cpu)\n\t\t* onrecheck — called when the user clicks Re-check (re-calls GET /api/setup/recommend)\n\t\t*/\n\t\tlet { hostProviders = [], gpuVramMb = 0, gpuVendor = \"\", gpuName = \"\", ollamaEnabled = false, selectedOllamaProfile = \"\", onrecheck } = $$props;\n\t\tconst isAppleSilicon = derived(() => gpuVendor === \"apple\");\n\t\tconst hasRunningRuntime = derived(() => hostProviders.length > 0);\n\t\tconst gpuGb = derived(() => Math.round(gpuVramMb / 1024));\n\t\tconst profileLabel = derived(() => selectedOllamaProfile.endsWith(\"cuda\") ? \"CUDA\" : selectedOllamaProfile.endsWith(\"rocm\") ? \"ROCm\" : \"CPU\");\n\t\tfunction runtimeLabel(provider) {\n\t\t\tif (provider === \"ollama\") return \"Ollama\";\n\t\t\tif (provider === \"lmstudio\") return \"LM Studio\";\n\t\t\tif (provider === \"model-runner\") return \"Docker Model Runner\";\n\t\t\treturn provider;\n\t\t}\n\t\t$$renderer.push(`<div class=\"local-models-status svelte-1fl6n4z\">`);\n\t\tif (hasRunningRuntime()) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"status-row status-row--running svelte-1fl6n4z\" role=\"status\"><span class=\"status-icon svelte-1fl6n4z\" aria-hidden=\"true\">●</span> <span class=\"status-text svelte-1fl6n4z\">Using ${escape_html(hostProviders.map((p) => runtimeLabel(p.provider)).join(\", \"))} already running on your machine.</span></div>`);\n\t\t} else if (isAppleSilicon()) {\n\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t$$renderer.push(`<div class=\"status-callout status-callout--apple svelte-1fl6n4z\" role=\"note\"><div class=\"callout-icon svelte-1fl6n4z\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg></div> <div class=\"callout-body svelte-1fl6n4z\"><p class=\"callout-title svelte-1fl6n4z\">Apple Silicon detected</p> <p class=\"callout-desc svelte-1fl6n4z\">For best performance, install <a href=\"https://ollama.com/download\" target=\"_blank\" rel=\"noopener\" class=\"svelte-1fl6n4z\">Ollama for macOS</a> and leave it running before continuing. Once Ollama is running, click Re-check to continue.</p> <button class=\"btn-recheck svelte-1fl6n4z\" type=\"button\" id=\"btn-local-recheck\">Re-check</button></div></div>`);\n\t\t} else if (ollamaEnabled && gpuVramMb >= 8192) {\n\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t$$renderer.push(`<div class=\"status-row status-row--will-install svelte-1fl6n4z\" role=\"status\"><span class=\"status-icon svelte-1fl6n4z\" aria-hidden=\"true\">◎</span> <span class=\"status-text svelte-1fl6n4z\">Will install Ollama in the stack `);\n\t\t\tif (gpuName) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`(GPU: ${escape_html(gpuName)}, ${escape_html(gpuGb())} GB, profile: ${escape_html(profileLabel())})`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]-->.\n First pull downloads ~4–8 GB.</span></div>`);\n\t\t} else if (ollamaEnabled) {\n\t\t\t$$renderer.push(\"<!--[3-->\");\n\t\t\t$$renderer.push(`<div class=\"status-row status-row--will-install svelte-1fl6n4z\" role=\"status\"><span class=\"status-icon svelte-1fl6n4z\" aria-hidden=\"true\">◎</span> <span class=\"status-text svelte-1fl6n4z\">Will install Ollama in the stack (CPU mode). First pull downloads ~4–8 GB.</span></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--></div>`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/Screen1ModelsStep.svelte\nfunction Screen1ModelsStep($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/**\n\t\t* Screen1ModelsStep — \"Connect your AI brain\"\n\t\t*\n\t\t* Redesigned flat RadioRow layout (spec: /tmp/wiz/connect-redesign.html).\n\t\t* Three primary choices in a hairline-divided list:\n\t\t* 1. Detected cloud service (shown only when verifiedCount > 0 or llmProvider set)\n\t\t* 2. Run on this computer (local AI — co-equal primary option)\n\t\t* 3. Sign in to a cloud service (expands ProviderOAuthList inline)\n\t\t*\n\t\t* Props:\n\t\t* modelMode — currently selected mode ('cloud'|'local'|'both')\n\t\t* detectionLoading — true while /api/setup/recommend is in flight\n\t\t* detectionTimedOut — true when detection did not complete within 3s\n\t\t* systemCheckError — non-empty string when SystemCheck failed (shows inline alert)\n\t\t* systemCheckRetrying — true while system check retry is in progress\n\t\t* gpuVramMb — VRAM in MiB (0 = not detected)\n\t\t* gpuVendor — 'apple' | 'nvidia' | 'amd' | '' (empty = none detected)\n\t\t* gpuName — human-readable GPU name\n\t\t* hostProviders — local runtimes running on host\n\t\t* credentialCount — importable host credential count\n\t\t* cloudProviders — provider ids configured on host\n\t\t* opencodeProviders — all OpenCode providers (for OAuth list)\n\t\t* opencodeAuth — auth methods per provider id\n\t\t* providerState — verification state per provider id\n\t\t* ollamaEnabled — whether in-stack Ollama is active\n\t\t* selectedOllamaProfile — ollama profile id (cuda/rocm/cpu)\n\t\t* hostImporting — true while host import is in flight\n\t\t* verifiedCount — number of providers currently verified\n\t\t* allowEmptyInstall — whether \"install without provider\" escape is active\n\t\t* llmModel — selected chat model id\n\t\t* llmProvider — provider name for selected chat model\n\t\t*\n\t\t* Events:\n\t\t* onmodelmodechange — user picked a different model mode\n\t\t* onhostimport — trigger host provider import\n\t\t* onoauthstart — OAuth flow start\n\t\t* onoauthcancel — OAuth flow cancel\n\t\t* onbaseurl — custom base URL changed\n\t\t* onapikey — custom API key changed\n\t\t* onverify — verify custom endpoint\n\t\t* onrecheck — re-call /api/setup/recommend\n\t\t* onsystemcheckretry — retry the system check\n\t\t* onallowemptyinstallchange — toggle empty install escape\n\t\t* onnext — proceed to Screen 2\n\t\t*/\n\t\t/** Currently selected model mode. */\n\t\t/** True while Phase-0 detection is in flight. */\n\t\t/** True when the 3-second detection timeout elapsed. */\n\t\t/** Non-empty string = SystemCheck failed; shown as inline alert on this screen. */\n\t\t/** True while the system check retry is running. */\n\t\t/** VRAM in MiB from detection (0 = not detected). */\n\t\t/** GPU vendor from detection ('apple'|'nvidia'|'amd'|''). */\n\t\t/** Human-readable GPU name. */\n\t\t/** Local runtimes already running on the host. */\n\t\t/** Number of importable host credentials. */\n\t\t/** Provider ids detected as configured on the host. */\n\t\t/** Full OpenCode provider list (for OAuth sub-panel). */\n\t\t/** Auth methods per provider id. */\n\t\t/** Verification state per provider id. */\n\t\t/** Whether in-stack Ollama will be added. */\n\t\t/** Selected Ollama profile (cuda/rocm/cpu). */\n\t\t/** True while host-import is in flight. */\n\t\t/** Number of currently verified providers. */\n\t\t/** Whether the \"install without provider\" escape is checked. */\n\t\t/** Currently selected chat model id. */\n\t\t/** Provider name for the selected chat model (connId). */\n\t\t/** Chat-model options across verified providers (for the model picker). */\n\t\t/** Stable connId of the detected cloud service (persists across local↔cloud switches). */\n\t\t/** Choose the default chat model. */\n\t\tconst MIN_LOCAL_GPU_VRAM_MB = 8192;\n\t\tconst SERVICE_LABELS = {\n\t\t\topenai: \"ChatGPT (OpenAI)\",\n\t\t\tgoogle: \"Gemini (Google)\",\n\t\t\t\"github-copilot\": \"GitHub Copilot\",\n\t\t\tgroq: \"Groq\",\n\t\t\tanthropic: \"Claude (Anthropic)\",\n\t\t\tmistral: \"Mistral\",\n\t\t\tcohere: \"Cohere\"\n\t\t};\n\t\tlet { modelMode, detectionLoading = false, detectionTimedOut = false, systemCheckError = \"\", systemCheckRetrying = false, gpuVramMb = 0, gpuVendor = \"\", gpuName = \"\", hostProviders = [], credentialCount = 0, cloudProviders = [], opencodeProviders = [], opencodeAuth = {}, providerState = {}, ollamaEnabled = false, selectedOllamaProfile = \"\", hostImporting = false, verifiedCount = 0, allowEmptyInstall = false, llmModel = \"\", llmProvider = \"\", llmModelOptions = [], detectedCloudConn = \"\", onselectmodel, onmodelmodechange, onhostimport, onoauthstart, onoauthcancel, onbaseurl, onapikey, onverify, onrecheck, onsystemcheckretry, onallowemptyinstallchange, onnext } = $$props;\n\t\tconst localAvailable = derived(() => gpuVramMb >= MIN_LOCAL_GPU_VRAM_MB || gpuVendor === \"apple\" || hostProviders.length > 0);\n\t\tderived(() => allowEmptyInstall || verifiedCount > 0 || ollamaEnabled || hostProviders.length > 0);\n\t\tfunction friendlyServiceLabel(connId) {\n\t\t\tif (SERVICE_LABELS[connId]) return SERVICE_LABELS[connId];\n\t\t\tconst fromProviders = opencodeProviders.find((p) => p.id === connId)?.name;\n\t\t\tif (fromProviders) return fromProviders;\n\t\t\treturn connId;\n\t\t}\n\t\tconst LOCAL_PROVIDER_IDS = new Set([\n\t\t\t\"ollama\",\n\t\t\t\"lmstudio\",\n\t\t\t\"llamacpp\",\n\t\t\t\"localai\",\n\t\t\t\"model-runner\"\n\t\t]);\n\t\tconst detectedConn = derived(() => detectedCloudConn || (llmProvider && !LOCAL_PROVIDER_IDS.has(llmProvider) ? llmProvider : \"\"));\n\t\tconst detectedServiceLabel = derived(() => detectedConn() ? friendlyServiceLabel(detectedConn()) : \"\");\n\t\tderived(() => LOCAL_PROVIDER_IDS.has(llmProvider));\n\t\tconst showDetectedRow = derived(() => !!detectedConn() && verifiedCount > 0);\n\t\tconst showLocalPanel = derived(() => false);\n\t\tconst showSignInPanel = derived(() => false);\n\t\tconst cloudRowTitle = derived(() => showDetectedRow() ? \"Sign in to a different service\" : \"Sign in to a cloud AI service\");\n\t\tconst cloudRowSub = derived(() => showDetectedRow() ? \"Google Gemini, GitHub Copilot, and others\" : \"OpenAI, Google Gemini, GitHub Copilot, and others\");\n\t\t$$renderer.push(`<div data-testid=\"step-models\" class=\"screen-models svelte-z6usuj\">`);\n\t\tif (systemCheckError) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"s1-alert s1-alert--error svelte-z6usuj\" role=\"alert\"><span class=\"s1-alert-text svelte-z6usuj\">${escape_html(systemCheckError)}</span> <button type=\"button\" class=\"s1-alert-btn svelte-z6usuj\" id=\"btn-syscheck-retry\"${attr(\"disabled\", systemCheckRetrying, true)}>${escape_html(systemCheckRetrying ? \"Checking…\" : \"Retry\")}</button></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (detectionTimedOut && true) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"s1-alert s1-alert--warn svelte-z6usuj\" role=\"alert\"><span class=\"s1-alert-text svelte-z6usuj\">Detection timed out — results may be incomplete.</span> <button type=\"button\" class=\"s1-alert-btn s1-alert-btn--warn svelte-z6usuj\">Re-run detection</button> <button type=\"button\" class=\"s1-dismiss svelte-z6usuj\" aria-label=\"Dismiss\">✕</button></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (detectionLoading || hostImporting) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"s1-shimmer svelte-z6usuj\" aria-busy=\"true\" aria-label=\"Detecting AI services…\"><span class=\"s1-shimmer-bar svelte-z6usuj\"></span> <span class=\"s1-shimmer-bar s1-shimmer-bar--short svelte-z6usuj\"></span> <span class=\"s1-shimmer-bar s1-shimmer-bar--shorter svelte-z6usuj\"></span></div>`);\n\t\t} else {\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\tif (verifiedCount > 0 && showDetectedRow()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<div class=\"s1-detected-banner svelte-z6usuj\" role=\"status\"><div class=\"s1-detected-check svelte-z6usuj\" aria-hidden=\"true\">✓</div> <div class=\"s1-detected-text svelte-z6usuj\"><div class=\"s1-detected-title svelte-z6usuj\">${escape_html(detectedServiceLabel())} is already connected — you're good to go</div> <div class=\"s1-detected-sub svelte-z6usuj\">We found your account on this computer. Just continue, or choose something different below.</div></div></div>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> <div class=\"s1-choice-list svelte-z6usuj\" role=\"radiogroup\" aria-label=\"Which AI should your assistant use\">`);\n\t\t\tif (showDetectedRow()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<button type=\"button\"${attr_class(\"s1-choice-row svelte-z6usuj\", void 0, { \"s1-choice-row--selected\": false })} role=\"radio\"${attr(\"aria-checked\", false)}><div class=\"s1-radio-dot svelte-z6usuj\"><div class=\"s1-radio-dot-inner svelte-z6usuj\"></div></div> <div class=\"s1-choice-body svelte-z6usuj\"><div class=\"s1-choice-title svelte-z6usuj\">${escape_html(detectedServiceLabel())}</div> <div class=\"s1-choice-sub svelte-z6usuj\">Use your existing ${escape_html(detectedServiceLabel())} subscription</div></div> <span class=\"s1-badge-recommended svelte-z6usuj\">Recommended</span></button>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> <button type=\"button\"${attr_class(\"s1-choice-row svelte-z6usuj\", void 0, {\n\t\t\t\t\"s1-choice-row--selected\": false,\n\t\t\t\t\"s1-choice-row--unavailable\": !localAvailable()\n\t\t\t})} role=\"radio\"${attr(\"aria-checked\", false)}${attr(\"disabled\", !localAvailable(), true)}><div class=\"s1-radio-dot svelte-z6usuj\"><div class=\"s1-radio-dot-inner svelte-z6usuj\"></div></div> <div class=\"s1-choice-icon svelte-z6usuj\" aria-hidden=\"true\"><svg viewBox=\"0 0 18 18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" class=\"svelte-z6usuj\"><rect x=\"1.5\" y=\"2.5\" width=\"15\" height=\"10\" rx=\"1.5\" class=\"svelte-z6usuj\"></rect><path d=\"M5.5 15.5h7M9 12.5v3\" stroke-linecap=\"round\" class=\"svelte-z6usuj\"></path><circle cx=\"9\" cy=\"7.5\" r=\"2.5\" class=\"svelte-z6usuj\"></circle></svg></div> <div class=\"s1-choice-body svelte-z6usuj\"><div class=\"s1-choice-title svelte-z6usuj\">Run on this computer</div> <div class=\"s1-choice-sub svelte-z6usuj\">`);\n\t\t\tif (localAvailable()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`Private & free — no account needed, no data leaves your machine`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`Needs a more capable computer — requires 8 GB+ graphics card or Apple Silicon`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--></div></div></button> `);\n\t\t\tif (showLocalPanel()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<div class=\"s1-local-panel svelte-z6usuj\" aria-live=\"polite\">`);\n\t\t\t\tLocalModelsStatus($$renderer, {\n\t\t\t\t\thostProviders,\n\t\t\t\t\tgpuVramMb,\n\t\t\t\t\tgpuVendor,\n\t\t\t\t\tgpuName,\n\t\t\t\t\tollamaEnabled,\n\t\t\t\t\tselectedOllamaProfile,\n\t\t\t\t\tonrecheck\n\t\t\t\t});\n\t\t\t\t$$renderer.push(`<!----></div>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> <button type=\"button\"${attr_class(\"s1-choice-row svelte-z6usuj\", void 0, { \"s1-choice-row--selected\": false })} role=\"radio\"${attr(\"aria-checked\", false)}><div class=\"s1-radio-dot svelte-z6usuj\"><div class=\"s1-radio-dot-inner svelte-z6usuj\"></div></div> <div class=\"s1-choice-body svelte-z6usuj\"><div class=\"s1-choice-title svelte-z6usuj\">${escape_html(cloudRowTitle())}</div> <div class=\"s1-choice-sub svelte-z6usuj\">${escape_html(cloudRowSub())}</div></div></button> `);\n\t\t\tif (showSignInPanel()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<div class=\"s1-signin-panel svelte-z6usuj\" aria-live=\"polite\">`);\n\t\t\t\tCloudAttachPanel($$renderer, {\n\t\t\t\t\tcredentialCount: 0,\n\t\t\t\t\tcloudProviders: [],\n\t\t\t\t\topencodeProviders,\n\t\t\t\t\topencodeAuth,\n\t\t\t\t\tproviderState,\n\t\t\t\t\thostImporting,\n\t\t\t\t\tverifiedCount,\n\t\t\t\t\tonhostimport,\n\t\t\t\t\tonoauthstart: (id, idx) => onoauthstart?.(id, idx),\n\t\t\t\t\tonoauthcancel: (id) => onoauthcancel?.(id),\n\t\t\t\t\tonbaseurl: (id, url) => onbaseurl?.(id, url),\n\t\t\t\t\tonapikey: (id, key) => onapikey?.(id, key),\n\t\t\t\t\tonverify: (id) => onverify?.(id)\n\t\t\t\t});\n\t\t\t\t$$renderer.push(`<!----></div>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></div> `);\n\t\t\tif (!llmModel && !allowEmptyInstall) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<div class=\"s1-empty-install-row svelte-z6usuj\"><p class=\"s1-empty-install-hint svelte-z6usuj\">No AI here? You can still continue — connect this app to an assistant\n running on another computer, or add a provider later from your dashboard.</p> <button type=\"button\" class=\"s1-btn-empty-install svelte-z6usuj\">I'll set this up later</button></div>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]-->`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></div>`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/Screen2ExtrasStep.svelte\nfunction Screen2ExtrasStep($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/**\n\t\t* Screen2ExtrasStep — \"Optional extras\"\n\t\t*\n\t\t* Flat hairline-row layout (spec: /tmp/wiz/extras-finish-redesign.html).\n\t\t* Three rows with inline accordion expansion (no modal, no bordered cards,\n\t\t* no sub-section headings):\n\t\t* 1. Voice — bundled openpalm-voice; toggle drives onvoiceenabledchange + engine defaults\n\t\t* 2. Discord — botToken + applicationId credential fields\n\t\t* 3. Slack — slackBotToken + slackAppToken credential fields\n\t\t*\n\t\t* Props:\n\t\t* modelMode — 'cloud' | 'local' | 'both' — drives voice default selection\n\t\t* voiceEnabled — explicit voice on/off toggle state (OFF by default)\n\t\t* voiceTts — current TTS engine value\n\t\t* voiceStt — current STT engine value\n\t\t* hasOpenAI — true if OpenAI is a verified provider (affects voice default)\n\t\t* voiceProfiles — available voice addon hardware profiles\n\t\t* selectedVoiceProfile — currently selected voice profile id\n\t\t* portalSelection — current portal enable + credential state\n\t\t* onvoiceenabledchange — called when voice toggle flips\n\t\t* onchangetts — called when TTS engine/config changes\n\t\t* onchangestt — called when STT engine/config changes\n\t\t* onvoiceprofilechange — called when voice hardware profile changes\n\t\t* onportaltoggle — called when a portal toggle flips\n\t\t* oncredentialchange — called when a portal credential field changes\n\t\t* onnext — proceed to Screen 3 (always enabled)\n\t\t*/\n\t\t/** Which model mode was chosen on Screen 1. Drives voice default logic. */\n\t\t/**\n\t\t* Explicit voice on/off state — OFF by default.\n\t\t* CRITICAL: must not be derived from engine selection. The parent owns this\n\t\t* as $state(false) and passes it down. Only when this is true should voice\n\t\t* addon be included in the payload.\n\t\t*/\n\t\t/** Current TTS engine value. */\n\t\t/** Current STT engine value. */\n\t\t/** True when OpenAI is a verified provider (affects default engine). */\n\t\t/** Voice addon hardware profiles (CPU / CUDA / ROCm). */\n\t\t/** Currently selected voice profile id. */\n\t\t/** Portal enable + credential state (discord, slack). */\n\t\tlet { modelMode, voiceEnabled, voiceTts, voiceStt, hasOpenAI = false, portalSelection = {}, onvoiceenabledchange, onchangetts, onchangestt, onportaltoggle, oncredentialchange, onnext: _onnext } = $$props;\n\t\tfunction isPortalEnabled$2(chId, locked) {\n\t\t\treturn isPortalEnabled(portalSelection, chId, locked);\n\t\t}\n\t\tfunction getCredValue$1(chId, key) {\n\t\t\treturn getCredValue(portalSelection, chId, key);\n\t\t}\n\t\tconst configurablePortals = derived(() => PORTALS.filter((ch) => !ch.locked));\n\t\tconst discordCh = derived(() => configurablePortals().find((ch) => ch.id === \"discord\"));\n\t\tconst slackCh = derived(() => configurablePortals().find((ch) => ch.id === \"slack\"));\n\t\tconst discordOn = derived(() => isPortalEnabled$2(\"discord\"));\n\t\tconst slackOn = derived(() => isPortalEnabled$2(\"slack\"));\n\t\t$$renderer.push(`<div data-testid=\"step-extras\" class=\"addon-list svelte-85kisn\" role=\"list\"><div class=\"addon-row svelte-85kisn\" role=\"listitem\"><div class=\"addon-row-header svelte-85kisn\"><div class=\"addon-icon voice-icon svelte-85kisn\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#3b82f6\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"svelte-85kisn\"><rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\"></rect><path d=\"M5 11a7 7 0 0014 0M12 18v3\"></path></svg></div> <div class=\"addon-body svelte-85kisn\"><div class=\"addon-title svelte-85kisn\">Voice</div> <div class=\"addon-sub svelte-85kisn\">Talk to your assistant and hear it reply</div></div> <div class=\"toggle-wrap svelte-85kisn\"><label class=\"toggle svelte-85kisn\" aria-label=\"Enable Voice\"><input type=\"checkbox\"${attr(\"checked\", voiceEnabled, true)} class=\"svelte-85kisn\"/> <div class=\"toggle-track svelte-85kisn\"></div> <div class=\"toggle-thumb svelte-85kisn\"></div></label></div></div> <div${attr_class(\"addon-panel svelte-85kisn\", void 0, { \"open\": voiceEnabled })} aria-live=\"polite\"><div class=\"addon-panel-inner svelte-85kisn\"><p class=\"panel-question svelte-85kisn\">How should your assistant speak?</p> <div class=\"voice-option svelte-85kisn\"><div class=\"voice-option-dot svelte-85kisn\"><div class=\"voice-option-dot-inner svelte-85kisn\"></div></div> <div><div class=\"voice-option-text svelte-85kisn\">Built-in voice — free, runs on this computer</div> <div class=\"voice-option-sub svelte-85kisn\">No internet needed. Sounds natural, works out of the box.</div></div></div></div></div></div> `);\n\t\tif (discordCh()) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"addon-row svelte-85kisn\" role=\"listitem\"><div class=\"addon-row-header svelte-85kisn\"><div class=\"addon-icon discord-icon svelte-85kisn\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"#5865f2\" class=\"svelte-85kisn\"><path d=\"M19 5.3A16 16 0 0015 4l-.2.4a14 14 0 00-4 0L10.5 4a16 16 0 00-4 1.3C4 9 3.3 12.6 3.6 16.2A16 16 0 008.5 18.7c.4-.5.8-1.1 1-1.7a9 9 0 01-1.6-.8l.4-.3a11 11 0 009.4 0l.4.3a9 9 0 01-1.6.8c.3.6.6 1.2 1 1.7a16 16 0 004.9-2.5c.4-4.2-.7-7.8-2.4-10.9zM9 14c-.8 0-1.4-.7-1.4-1.6S8.2 10.8 9 10.8s1.4.7 1.4 1.6S9.8 14 9 14zm6 0c-.8 0-1.4-.7-1.4-1.6s.6-1.6 1.4-1.6 1.4.7 1.4 1.6S15.8 14 15 14z\"></path></svg></div> <div class=\"addon-body svelte-85kisn\"><div class=\"addon-title svelte-85kisn\">Discord</div> <div class=\"addon-sub svelte-85kisn\">Reach your assistant from a Discord server</div></div> <div class=\"toggle-wrap svelte-85kisn\"><label class=\"toggle svelte-85kisn\" aria-label=\"Enable Discord\"><input type=\"checkbox\"${attr(\"checked\", discordOn(), true)} class=\"svelte-85kisn\"/> <div class=\"toggle-track svelte-85kisn\"></div> <div class=\"toggle-thumb svelte-85kisn\"></div></label></div></div> <div${attr_class(\"addon-panel svelte-85kisn\", void 0, { \"open\": discordOn() })} aria-live=\"polite\"><div class=\"addon-panel-inner svelte-85kisn\"><div class=\"field-group svelte-85kisn\"><div><label class=\"field-label svelte-85kisn\" for=\"cred-discord-botToken\">Bot token</label> <input class=\"field-input svelte-85kisn\" type=\"password\" id=\"cred-discord-botToken\" placeholder=\"Paste your bot token here\" autocomplete=\"off\"${attr(\"value\", getCredValue$1(\"discord\", \"botToken\"))}/> <p class=\"field-help svelte-85kisn\"><a href=\"https://discord.com/developers/docs/quick-start/getting-started\" target=\"_blank\" rel=\"noopener\" class=\"svelte-85kisn\">How to create a Discord bot and get your token →</a></p></div> <div><label class=\"field-label svelte-85kisn\" for=\"cred-discord-applicationId\">Application ID</label> <input class=\"field-input svelte-85kisn\" type=\"text\" id=\"cred-discord-applicationId\" placeholder=\"Your app's numeric ID\" autocomplete=\"off\"${attr(\"value\", getCredValue$1(\"discord\", \"applicationId\"))}/> <p class=\"field-help svelte-85kisn\">Found in the Discord Developer Portal under your application's General Information page.</p></div></div></div></div></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (slackCh()) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"addon-row svelte-85kisn\" role=\"listitem\"><div class=\"addon-row-header svelte-85kisn\"><div class=\"addon-icon slack-icon svelte-85kisn\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" class=\"svelte-85kisn\"><path fill=\"#36C5F0\" d=\"M9 13.5a2 2 0 11-2-2h2v2z\"></path><path fill=\"#2EB67D\" d=\"M10.5 9a2 2 0 112 2H10.5v-2z\"></path><path fill=\"#ECB22E\" d=\"M15 10.5a2 2 0 112 2h-2v-2z\"></path><path fill=\"#E01E5A\" d=\"M13.5 15a2 2 0 11-2 2v-2h2z\"></path></svg></div> <div class=\"addon-body svelte-85kisn\"><div class=\"addon-title svelte-85kisn\">Slack</div> <div class=\"addon-sub svelte-85kisn\">Reach your assistant from a Slack workspace</div></div> <div class=\"toggle-wrap svelte-85kisn\"><label class=\"toggle svelte-85kisn\" aria-label=\"Enable Slack\"><input type=\"checkbox\"${attr(\"checked\", slackOn(), true)} class=\"svelte-85kisn\"/> <div class=\"toggle-track svelte-85kisn\"></div> <div class=\"toggle-thumb svelte-85kisn\"></div></label></div></div> <div${attr_class(\"addon-panel svelte-85kisn\", void 0, { \"open\": slackOn() })} aria-live=\"polite\"><div class=\"addon-panel-inner svelte-85kisn\"><div class=\"field-group svelte-85kisn\"><div><label class=\"field-label svelte-85kisn\" for=\"cred-slack-slackBotToken\">Bot token</label> <input class=\"field-input svelte-85kisn\" type=\"password\" id=\"cred-slack-slackBotToken\" placeholder=\"xoxb-…\" autocomplete=\"off\"${attr(\"value\", getCredValue$1(\"slack\", \"slackBotToken\"))}/></div> <div><label class=\"field-label svelte-85kisn\" for=\"cred-slack-slackAppToken\">App-level token</label> <input class=\"field-input svelte-85kisn\" type=\"password\" id=\"cred-slack-slackAppToken\" placeholder=\"xapp-…\" autocomplete=\"off\"${attr(\"value\", getCredValue$1(\"slack\", \"slackAppToken\"))}/> <p class=\"field-help svelte-85kisn\"><a href=\"https://api.slack.com/quickstart\" target=\"_blank\" rel=\"noopener\" class=\"svelte-85kisn\">How to create a Slack app and get your tokens →</a></p></div></div></div></div></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--></div>`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/ReviewStep.svelte\nfunction ReviewStep($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/** When true and no host provider running, hide the Infrastructure card entirely. */\n\t\t/** Label for the running host provider (e.g. \"Ollama\"). Shown when ollamaEnabled is false. */\n\t\tlet { uiLoginPassword, verifiedProviders, modelSelection, activeTts, activeStt, portalSelection, ollamaEnabled, hostProviderLabel = \"\", payload, installError, installing, isRerun = false, systemCheckPassed = true, onback: _onback, oninstall: _oninstall, oneditmodels, oneditextras } = $$props;\n\t\tconst LOCAL_PROVIDER_IDS = new Set([\n\t\t\t\"ollama\",\n\t\t\t\"lmstudio\",\n\t\t\t\"llamacpp\",\n\t\t\t\"localai\",\n\t\t\t\"model-runner\"\n\t\t]);\n\t\tfunction friendlyProviderName(connId) {\n\t\t\tif (!connId) return \"\";\n\t\t\tif (connId === \"openai\") return \"ChatGPT (OpenAI)\";\n\t\t\tif (connId === \"google\") return \"Gemini (Google)\";\n\t\t\tif (connId === \"github-copilot\") return \"GitHub Copilot\";\n\t\t\tif (connId === \"groq\") return \"Groq\";\n\t\t\tif (LOCAL_PROVIDER_IDS.has(connId)) return \"Runs on this computer\";\n\t\t\treturn PROVIDERS.find((p) => p.id === connId)?.name ?? connId;\n\t\t}\n\t\tfunction isPortalEnabled$1(chId, locked) {\n\t\t\treturn isPortalEnabled(portalSelection, chId, locked);\n\t\t}\n\t\tconst aiLabel = derived(() => {\n\t\t\tconst connId = modelSelection.llm?.connId;\n\t\t\tif (!connId) return \"\";\n\t\t\treturn friendlyProviderName(connId);\n\t\t});\n\t\tconst voiceActive = derived(() => !!(activeTts && !activeTts.startsWith(\"skip-\")) || !!(activeStt && !activeStt.startsWith(\"skip-\")));\n\t\tconst activePortals = derived(() => PORTALS.filter((ch) => !ch.locked && isPortalEnabled$1(ch.id, ch.locked)));\n\t\tlet passwordCopied = false;\n\t\tderived(() => !installing && systemCheckPassed);\n\t\tif (verifiedProviders.length === 0) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"review-note svelte-1q74f52\">No AI set up here yet — that's fine. After install you can connect this app to an\n assistant running on another computer, or add a provider, anytime from your dashboard.</div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (!isRerun) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"password-block svelte-1q74f52\"><p class=\"password-label svelte-1q74f52\">Sign-in password</p> <div class=\"password-row svelte-1q74f52\">`);\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<span class=\"password-value password-value--dots svelte-1q74f52\" aria-label=\"Sign-in password\">••••••••••••••••</span>`);\n\t\t\t$$renderer.push(`<!--]--> <div class=\"password-actions svelte-1q74f52\"><button type=\"button\" class=\"btn-icon svelte-1q74f52\"${attr(\"aria-label\", \"Show password\")}${attr(\"title\", \"Show\")}>`);\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M1 8s2.5-5 7-5 7 5 7 5-2.5 5-7 5-7-5-7-5z\"></path><circle cx=\"8\" cy=\"8\" r=\"2\"></circle></svg>`);\n\t\t\t$$renderer.push(`<!--]--></button> <button type=\"button\"${attr_class(\"btn-icon svelte-1q74f52\", void 0, { \"btn-icon--copied\": passwordCopied })}${attr(\"aria-label\", \"Copy password\")} title=\"Copy\">`);\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.5\"></rect><path d=\"M3 11V3h8\"></path></svg>`);\n\t\t\t$$renderer.push(`<!--]--></button></div></div> <p class=\"password-note svelte-1q74f52\">Already saved on this computer — keep a copy somewhere safe just in case.</p></div>`);\n\t\t} else {\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<div class=\"password-block svelte-1q74f52\"><p class=\"password-label svelte-1q74f52\">Sign-in password</p> <div class=\"password-row svelte-1q74f52\"><span class=\"password-value password-value--dots svelte-1q74f52\" aria-label=\"Sign-in password\">••••••••</span> <div class=\"password-actions svelte-1q74f52\"><span class=\"rerun-note svelte-1q74f52\">Previously set — not changed.</span></div></div></div>`);\n\t\t}\n\t\t$$renderer.push(`<!--]--> <div class=\"summary-list svelte-1q74f52\" aria-label=\"What's set up\"><p class=\"summary-section-label svelte-1q74f52\">What's being set up</p> `);\n\t\tif (aiLabel()) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"summary-row svelte-1q74f52\"><span class=\"summary-icon svelte-1q74f52\" aria-hidden=\"true\">🤖</span> <div class=\"summary-body svelte-1q74f52\"><div class=\"summary-key svelte-1q74f52\">AI</div> <div class=\"summary-val svelte-1q74f52\">${escape_html(aiLabel())}</div></div> <button type=\"button\" class=\"btn-change svelte-1q74f52\">Change</button></div>`);\n\t\t} else if (verifiedProviders.length > 0) {\n\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t$$renderer.push(`<div class=\"summary-row svelte-1q74f52\"><span class=\"summary-icon svelte-1q74f52\" aria-hidden=\"true\">🤖</span> <div class=\"summary-body svelte-1q74f52\"><div class=\"summary-key svelte-1q74f52\">AI</div> <div class=\"summary-val svelte-1q74f52\">${escape_html(friendlyProviderName(verifiedProviders[0].id))}</div></div> <button type=\"button\" class=\"btn-change svelte-1q74f52\">Change</button></div>`);\n\t\t} else if (ollamaEnabled) {\n\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t$$renderer.push(`<div class=\"summary-row svelte-1q74f52\"><span class=\"summary-icon svelte-1q74f52\" aria-hidden=\"true\">🤖</span> <div class=\"summary-body svelte-1q74f52\"><div class=\"summary-key svelte-1q74f52\">AI</div> <div class=\"summary-val svelte-1q74f52\">Runs on this computer</div></div> <button type=\"button\" class=\"btn-change svelte-1q74f52\">Change</button></div>`);\n\t\t} else if (hostProviderLabel) {\n\t\t\t$$renderer.push(\"<!--[3-->\");\n\t\t\t$$renderer.push(`<div class=\"summary-row svelte-1q74f52\"><span class=\"summary-icon svelte-1q74f52\" aria-hidden=\"true\">🤖</span> <div class=\"summary-body svelte-1q74f52\"><div class=\"summary-key svelte-1q74f52\">AI</div> <div class=\"summary-val svelte-1q74f52\">${escape_html(friendlyProviderName(hostProviderLabel))}</div></div> <button type=\"button\" class=\"btn-change svelte-1q74f52\">Change</button></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (voiceActive()) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"summary-row svelte-1q74f52\"><span class=\"summary-icon svelte-1q74f52\" aria-hidden=\"true\">🎙</span> <div class=\"summary-body svelte-1q74f52\"><div class=\"summary-key svelte-1q74f52\">Voice</div> <div class=\"summary-val svelte-1q74f52\">On — built-in voice</div></div> <button type=\"button\" class=\"btn-change svelte-1q74f52\">Change</button></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> <!--[-->`);\n\t\tconst each_array = ensure_array_like(activePortals());\n\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\tlet ch = each_array[$$index];\n\t\t\t$$renderer.push(`<div class=\"summary-row svelte-1q74f52\"><span class=\"summary-icon svelte-1q74f52\" aria-hidden=\"true\">${escape_html(ch.icon)}</span> <div class=\"summary-body svelte-1q74f52\"><div class=\"summary-key svelte-1q74f52\">Chat app</div> <div class=\"summary-val svelte-1q74f52\">${escape_html(ch.name)}</div></div> <button type=\"button\" class=\"btn-change svelte-1q74f52\">Change</button></div>`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></div> `);\n\t\tif (installError) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\tFriendlyError($$renderer, { error: friendlyError(installError, \"setup-complete\") });\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (!systemCheckPassed) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"review-warning svelte-1q74f52\" role=\"alert\">⚠ System check has not passed yet — Install is disabled until Docker is confirmed available.</div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> <div class=\"review-save-row svelte-1q74f52\"><button type=\"button\" class=\"btn-save svelte-1q74f52\" aria-label=\"Save configuration as JSON file\">Save configuration</button></div>`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/steps/DeployStep.svelte\nfunction DeployStep($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\t/** Non-fatal: install used cached images because the registry pull failed. */\n\t\t/** Terminal state reached with non-running rows that are all warnings. */\n\t\tlet { deployData, deployDone, deployHasWarnings = false, deployError, onback, onretry } = $$props;\n\t\tconst warningRows = derived(() => (deployData.deployStatus ?? []).filter((s) => s.status === \"warning\"));\n\t\tconst isElectron = typeof window !== \"undefined\" && !!window.openpalm;\n\t\tconst windowPort = typeof window !== \"undefined\" ? Number(window.location.port) || 3880 : 3880;\n\t\tconst adminPort = derived(() => deployData.ports?.admin ?? windowPort);\n\t\tconst assistantPort = derived(() => deployData.ports?.assistant ?? 3800);\n\t\tconst serviceLinks = derived(() => ({\n\t\t\tassistant: {\n\t\t\t\tport: assistantPort(),\n\t\t\t\tlabel: \"Assistant (OpenCode)\",\n\t\t\t\tpath: \"\"\n\t\t\t},\n\t\t\tadmin: {\n\t\t\t\tport: adminPort(),\n\t\t\t\tlabel: \"Admin Dashboard\",\n\t\t\t\tpath: \"\"\n\t\t\t}\n\t\t}));\n\t\tconst services = derived(() => deployData.deployStatus ?? []);\n\t\tconst total = derived(() => services().length);\n\t\tconst running = derived(() => services().filter((s) => s.status === \"running\").length);\n\t\tconst pct = derived(() => total() > 0 ? Math.round(running() / total() * 100) : 0);\n\t\tconst phase = derived(() => deployData.phase ?? \"writing-config\");\n\t\tconst voiceEnabled = derived(() => services().some((s) => /^voice(-cuda|-rocm)?$/.test(s.service ?? \"\")));\n\t\tconst deployTitle = derived(() => {\n\t\t\tif (deployDone) return deployHasWarnings ? \"Setup Complete (with warnings)\" : \"Setup Complete\";\n\t\t\tif (deployError) return \"Deployment Issue\";\n\t\t\tswitch (phase()) {\n\t\t\t\tcase \"writing-config\": return \"Preparing Configuration…\";\n\t\t\t\tcase \"pulling-images\": return voiceEnabled() ? \"Downloading Images (incl. Voice ~2.4 GB)…\" : \"Downloading Images…\";\n\t\t\t\tcase \"starting\": return \"Starting Services…\";\n\t\t\t\tcase \"starting-voice\": return \"Starting Voice Addon…\";\n\t\t\t\tcase \"ready\": return \"Setup Complete\";\n\t\t\t}\n\t\t\treturn \"Deploying…\";\n\t\t});\n\t\tconst deploySubtitle = derived(() => {\n\t\t\tif (deployDone) return deployHasWarnings ? \"Setup is complete. Some services are still warming up in the background — they will be ready shortly.\" : \"Your OpenPalm stack is up and running.\";\n\t\t\tif (deployError) return \"Setup could not finish starting the stack.\";\n\t\t\tswitch (phase()) {\n\t\t\t\tcase \"writing-config\": return \"Writing config files and validating settings.\";\n\t\t\t\tcase \"pulling-images\": return voiceEnabled() ? \"Downloading container images. The voice model (~2.4 GB) is the largest — on a typical home connection this step can take 10–30 minutes. The wizard will wait — keep this tab open.\" : \"Downloading container images — first install can take 3–8 minutes depending on connection.\";\n\t\t\t\tcase \"starting\": return `${running()} of ${total()} services running.`;\n\t\t\t\tcase \"starting-voice\": return \"Pulling the voice image (~2.4 GB) and warming up Kokoro + Whisper models. First launch can take 5–30 minutes on slow connections — the wizard will wait.\";\n\t\t\t\tcase \"ready\": return \"All services are up.\";\n\t\t\t}\n\t\t\treturn \"Writing configuration and starting services.\";\n\t\t});\n\t\tconst noStartMode = derived(() => deployDone && services().length === 0);\n\t\t$$renderer.push(`<div class=\"deploy-header\"><h2 id=\"deploy-title\">${escape_html(deployTitle())}</h2> <p class=\"step-description\" id=\"deploy-subtitle\">${escape_html(deploySubtitle())}</p></div> <div class=\"deploy-progress-summary\"><div class=\"deploy-progress-meta\"><span class=\"deploy-progress-label\">Progress</span> <span${attr_class(`deploy-progress-value ${deployError ? \"deploy-progress-value--error\" : \"\"}`)} id=\"deploy-progress-value\">`);\n\t\tif (deployError) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`Error`);\n\t\t} else if (deployDone) {\n\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t$$renderer.push(`${escape_html(services().length > 0 ? \"100%\" : \"\")}`);\n\t\t} else {\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`${escape_html(pct())}%`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></span></div> <div class=\"deploy-progress-bar\"><div class=\"deploy-progress-fill\" id=\"deploy-progress-fill\"${attr_style(`width:${stringify(deployDone && services().length > 0 ? 100 : deployDone ? 0 : pct())}%`)}></div></div></div> <div class=\"deploy-services\" id=\"deploy-services\"><!--[-->`);\n\t\tconst each_array = ensure_array_like(services());\n\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\tlet svc = each_array[$$index];\n\t\t\t$$renderer.push(`<div class=\"deploy-service-row\"><div class=\"deploy-service-indicator\">`);\n\t\t\tif (svc.status === \"running\") {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<span class=\"deploy-check\"><svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--s-moss)\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg></span>`);\n\t\t\t} else if (svc.status === \"error\" || svc.status === \"warning\") {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`<span class=\"deploy-warning\"><svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--s-ink-2)\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 9v4\"></path><path d=\"M12 17h.01\"></path><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path></svg></span>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<span class=\"deploy-spinner\">`);\n\t\t\t\tSpinner($$renderer, {});\n\t\t\t\t$$renderer.push(`<!----></span>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--></div> <div class=\"deploy-service-info\"><span class=\"deploy-service-name\">${escape_html(svc.service || svc.label || \"\")}</span> <span class=\"deploy-service-status\">${escape_html(svc.label || svc.status)}</span></div> <div class=\"deploy-service-bar\"><div${attr_class(`deploy-bar-fill ${svc.status === \"running\" ? \"complete\" : svc.status === \"ready\" ? \"ready\" : svc.status === \"warning\" ? \"warning\" : svc.status === \"error\" ? \"stopped\" : \"indeterminate\"}`, \"svelte-1orw49v\")}></div></div></div>`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></div> `);\n\t\tif (deployError) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div id=\"deploy-failure\">`);\n\t\t\tFriendlyError($$renderer, { error: friendlyError(deployError, \"deploy\") });\n\t\t\t$$renderer.push(`<!----></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (!deployDone && !deployError) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<aside class=\"deploy-tips\" id=\"deploy-tips\"><div class=\"deploy-tips-header\"><span class=\"deploy-tips-kicker\">Tips</span> <h3>${escape_html(voiceEnabled() ? \"First install may take 10–30 minutes\" : \"First startup takes a few minutes\")}</h3></div> <ul>`);\n\t\t\tif (voiceEnabled()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<li>The OpenPalm Voice image is ~2.4 GB — the largest piece by far. Download speed depends on your internet connection.</li> <li>The wizard waits as long as the download takes. Progress bars below show each service's state.</li>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<li>Container images are being downloaded for the first time.</li>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--> <li>The admin console will be available once all services are healthy.</li> `);\n\t\t\tif (isElectron) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<li>You can leave this window — we'll let you know when it's ready.</li>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<li><strong>Keep this tab open while installation runs.</strong></li>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--></ul></aside>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (deployDone) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"done-state\" id=\"deploy-done\"><div class=\"done-icon\"><svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--s-moss)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path><polyline points=\"22 4 12 14.01 9 11.01\"></polyline></svg></div> <h2>${escape_html(deployHasWarnings ? \"Setup Complete (with warnings)\" : \"Setup Complete\")}</h2> `);\n\t\t\tif (noStartMode()) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"done-subtitle\">Configuration saved. Run 'openpalm start' to start services.</p>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<p class=\"done-subtitle\">${escape_html(deployHasWarnings ? \"Setup is complete. Some services are still warming up in the background.\" : \"Your OpenPalm stack is up and running.\")}</p> `);\n\t\t\t\tif (deployHasWarnings && warningRows().length > 0) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<div class=\"deploy-warnings-note svelte-1orw49v\" role=\"status\" id=\"deploy-warnings-note\">Still warming up: ${escape_html(warningRows().map((s) => s.label || s.service).join(\", \"))}. You can finish setup now — these will be ready shortly.</div>`);\n\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\t\tif (deployData.imageWarning) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<div class=\"feedback feedback--warning\" role=\"status\" id=\"deploy-image-warning\" style=\"margin-top:12px\"><span>⚠ ${escape_html(deployData.imageWarning)}</span></div>`);\n\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\t\tif (!isElectron) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<p class=\"done-close-hint svelte-1orw49v\">Setup is complete. You can safely close this tab now.</p>`);\n\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<!--]--> <ul class=\"service-list\" id=\"deploy-service-list\"><!--[-->`);\n\t\t\t\tconst each_array_1 = ensure_array_like(services());\n\t\t\t\tfor (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {\n\t\t\t\t\tlet svc = each_array_1[$$index_1];\n\t\t\t\t\tconst name = svc.service || svc.label || \"\";\n\t\t\t\t\tconst linkInfo = serviceLinks()[name];\n\t\t\t\t\tconst isWarming = svc.status === \"warning\";\n\t\t\t\t\t$$renderer.push(`<li>`);\n\t\t\t\t\tif (linkInfo) {\n\t\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t\tconst url = \"http://127.0.0.1:\" + linkInfo.port + linkInfo.path;\n\t\t\t\t\t\t$$renderer.push(`<span class=\"deploy-svc-name\">${escape_html(linkInfo.label)}</span> <a${attr(\"href\", url)} target=\"_blank\" rel=\"noopener\" class=\"deploy-svc-link\">${escape_html(url)}</a> <span class=\"deploy-svc-status\">${escape_html(isWarming ? svc.label || \"⚠ Warming up\" : \"✓ Running\")}</span>`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t\t$$renderer.push(`<span class=\"deploy-svc-name\">${escape_html(name)}</span> <span class=\"deploy-svc-status\">${escape_html(isWarming ? svc.label || \"⚠ Warming up\" : \"✓ Running\")}</span>`);\n\t\t\t\t\t}\n\t\t\t\t\t$$renderer.push(`<!--]--></li>`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--></ul> <div class=\"done-links\"><a href=\"/chat\" class=\"btn btn-primary\">Open Chat</a> <a${attr(\"href\", `http://127.0.0.1:${stringify(assistantPort())}`)} target=\"_blank\" rel=\"noopener\" class=\"btn btn-secondary\">OpenCode UI</a> <a href=\"/\" class=\"btn btn-secondary\">Admin Dashboard</a></div>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (deployError) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div class=\"step-actions\" id=\"deploy-error-actions\"><button class=\"btn btn-secondary\" id=\"btn-deploy-back\">Back to Review</button> <button class=\"btn btn-primary\" id=\"btn-deploy-retry\">Retry</button></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]-->`);\n\t});\n}\n//#endregion\n//#region src/routes/setup/+page.svelte\nfunction _page($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\tlet currentStep = 0;\n\t\tlet maxVisitedStep = 0;\n\t\tlet showDeploy = false;\n\t\tlet systemCheckPassed = false;\n\t\tlet modelMode = \"cloud\";\n\t\tlet voiceEnabled = false;\n\t\tlet uiLoginPassword = \"\";\n\t\tlet autoModeImporting = false;\n\t\tlet gpuDetected = false;\n\t\tlet providerState = {};\n\t\tlet detectedHostProviders = [];\n\t\tconst hostLocalLlmRunning = derived(() => providerState[\"ollama\"]?.ollamaMode === \"running\" || detectedHostProviders.some((p) => p.provider === \"ollama\" || p.provider === \"lmstudio\"));\n\t\tlet opencodeProviders = [];\n\t\tlet opencodeAuth = {};\n\t\tlet hostProviderCount = 0;\n\t\tlet allowEmptyInstall = false;\n\t\tlet recommendation = null;\n\t\tlet recommendationAlert = \"\";\n\t\tlet recommendationApplied = false;\n\t\tlet detectedGpuVramMb = 0;\n\t\tlet detectedGpuVendor = \"\";\n\t\tlet detectedGpuName = \"\";\n\t\tlet detectedCloudProviders = [];\n\t\t/** Generation counter per provider — discard stale verify results */\n\t\tconst verifyGeneration = {};\n\t\t/** AbortControllers for in-flight OAuth long-poll requests */\n\t\tconst oauthAbortControllers = {};\n\t\tlet modelSelection = {};\n\t\tlet voiceTts = { engine: \"\" };\n\t\tlet voiceStt = { engine: \"\" };\n\t\tconst enableVoice = derived(() => voiceTts.engine === \"openpalm-voice\" || voiceStt.engine === \"openpalm-voice\");\n\t\tlet voiceProfiles = [];\n\t\tlet selectedVoiceProfile = \"\";\n\t\tlet portalSelection = {\n\t\t\tdiscord: {\n\t\t\t\tenabled: false,\n\t\t\t\tbotToken: \"\",\n\t\t\t\tapplicationId: \"\"\n\t\t\t},\n\t\t\tslack: {\n\t\t\t\tenabled: false,\n\t\t\t\tslackBotToken: \"\",\n\t\t\t\tslackAppToken: \"\"\n\t\t\t}\n\t\t};\n\t\tlet ollamaEnabled = false;\n\t\tlet ollamaProfiles = [];\n\t\tlet selectedOllamaProfile = \"\";\n\t\tlet imageTag = \"\";\n\t\tlet installError = \"\";\n\t\tlet installing = false;\n\t\tlet emptyAiAck = false;\n\t\tlet deployData = {};\n\t\tlet deployDone = false;\n\t\tlet deployHasWarnings = false;\n\t\tlet deployError = null;\n\t\tlet deployTimer = null;\n\t\tlet deployPollErrors = 0;\n\t\tconst verifiedCount = derived(() => {\n\t\t\treturn PROVIDERS.map((p) => p.id).filter((id) => providerState[id]?.verified).length;\n\t\t});\n\t\tconst hasUsableAI = derived(() => !!modelSelection.llm?.model);\n\t\tconst verifiedProviders = derived(() => {\n\t\t\treturn PROVIDERS.filter((p) => providerState[p.id]?.verified);\n\t\t});\n\t\tderived(() => PROVIDERS.some((p) => p.id === \"ollama\" && providerState[p.id]?.verified));\n\t\tderived(() => verifiedProviders().length > 0);\n\t\tconst canComplete = derived(() => !!modelSelection.llm?.model || allowEmptyInstall);\n\t\tconst llmModelOptions = derived(() => buildModelOptions(\"llm\", verifiedProviders(), providerState));\n\t\tconst hasOpenAI = derived(() => PROVIDERS.some((p) => p.id === \"openai\" && providerState[p.id]?.verified));\n\t\tconst voiceDefaults = derived(() => hasOpenAI() ? {\n\t\t\ttts: \"openai-tts\",\n\t\t\tstt: \"openai-stt\"\n\t\t} : {\n\t\t\ttts: \"browser-tts\",\n\t\t\tstt: \"browser-stt\"\n\t\t});\n\t\tconst displayedVoiceTts = derived(() => resolveVoiceSide(voiceTts, enableVoice(), voiceDefaults().tts));\n\t\tconst displayedVoiceStt = derived(() => resolveVoiceSide(voiceStt, enableVoice(), voiceDefaults().stt));\n\t\tconst persistedVoiceTts = derived(() => resolveVoiceSide(voiceTts, enableVoice(), \"\"));\n\t\tconst persistedVoiceStt = derived(() => resolveVoiceSide(voiceStt, enableVoice(), \"\"));\n\t\tconst selectedVoiceProfileLabel = derived(() => {\n\t\t\tif (!selectedVoiceProfile) return \"\";\n\t\t\tconst profile = voiceProfiles.find((p) => p.id === selectedVoiceProfile);\n\t\t\treturn profile?.label ?? profile?.id ?? selectedVoiceProfile;\n\t\t});\n\t\tconst selectedOllamaProfileLabel = derived(() => {\n\t\t\tif (!selectedOllamaProfile) return \"\";\n\t\t\tconst profile = ollamaProfiles.find((p) => p.id === selectedOllamaProfile);\n\t\t\treturn profile?.label ?? profile?.id ?? selectedOllamaProfile;\n\t\t});\n\t\tconst payload = derived(() => {\n\t\t\tconst llm = modelSelection.llm;\n\t\t\tconst emb = modelSelection.embedding;\n\t\t\tconst small = modelSelection.small;\n\t\t\tconst capabilityProviderIds = {};\n\t\t\tif (llm) capabilityProviderIds[llm.connId] = true;\n\t\t\tif (emb) capabilityProviderIds[emb.connId] = true;\n\t\t\tif (small?.model) capabilityProviderIds[small.connId] = true;\n\t\t\tconst capabilities = verifiedProviders().filter((p) => capabilityProviderIds[p.id]).map((p) => {\n\t\t\t\tconst st = providerState[p.id];\n\t\t\t\treturn {\n\t\t\t\t\tid: p.id,\n\t\t\t\t\tname: p.name,\n\t\t\t\t\tprovider: p.id,\n\t\t\t\t\tbaseUrl: st?.baseUrl ?? p.baseUrl,\n\t\t\t\t\tapiKey: st?.apiKey ?? \"\"\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst llmConnId = llm?.connId ?? \"\";\n\t\t\tconst embConnId = emb?.connId ?? \"\";\n\t\t\tconst llmCap = capabilities.find((c) => c.id === llmConnId);\n\t\t\tconst embCap = capabilities.find((c) => c.id === embConnId);\n\t\t\tconst llmProvider = llmCap?.provider ?? \"\";\n\t\t\tconst embProvider = embCap?.provider ?? \"\";\n\t\t\tconst addons = {};\n\t\t\tif (ollamaEnabled && !hostLocalLlmRunning()) addons.ollama = true;\n\t\t\tif (persistedVoiceTts().engine === \"openpalm-voice\" || persistedVoiceStt().engine === \"openpalm-voice\") addons.voice = true;\n\t\t\tconst portalCredentials = {};\n\t\t\tconst portalsConfig = buildPortalsConfig();\n\t\t\tfor (const chId of Object.keys(portalsConfig)) {\n\t\t\t\tconst chVal = portalsConfig[chId];\n\t\t\t\tif (chVal === true) addons[chId] = true;\n\t\t\t\telse if (typeof chVal === \"object\" && chVal !== null) {\n\t\t\t\t\taddons[chId] = true;\n\t\t\t\t\tconst creds = {};\n\t\t\t\t\tfor (const key of Object.keys(chVal)) if (key !== \"enabled\" && chVal[key]) creds[key] = String(chVal[key]);\n\t\t\t\t\tif (Object.keys(creds).length > 0) portalCredentials[chId] = creds;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst result = {\n\t\t\t\tversion: 2,\n\t\t\t\taddons,\n\t\t\t\tsecurity: { uiLoginPassword },\n\t\t\t\tconnections: capabilities\n\t\t\t};\n\t\t\tif (llmProvider && llm?.model) result.llm = {\n\t\t\t\tprovider: llmProvider,\n\t\t\t\tmodel: llm.model,\n\t\t\t\tbaseUrl: llmCap?.baseUrl ?? \"\"\n\t\t\t};\n\t\t\tif (embProvider && emb?.model) result.embedding = {\n\t\t\t\tprovider: embProvider,\n\t\t\t\tmodel: emb.model,\n\t\t\t\tdims: emb.dims ?? 1536,\n\t\t\t\tbaseUrl: embCap?.baseUrl ?? \"\"\n\t\t\t};\n\t\t\tconst voicePayload = (v) => {\n\t\t\t\tif (!v.engine || v.engine.startsWith(\"skip-\")) return void 0;\n\t\t\t\tconst out = {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tengine: v.engine\n\t\t\t\t};\n\t\t\t\tif (v.provider) out.provider = v.provider;\n\t\t\t\tif (v.baseURL) out.baseURL = v.baseURL;\n\t\t\t\tif (v.model) out.model = v.model;\n\t\t\t\tif (v.voice) out.voice = v.voice;\n\t\t\t\tif (v.language) out.language = v.language;\n\t\t\t\tif (v.apiKey) out.apiKey = v.apiKey;\n\t\t\t\treturn out;\n\t\t\t};\n\t\t\tconst ttsCap = voicePayload(persistedVoiceTts());\n\t\t\tif (ttsCap) result.tts = ttsCap;\n\t\t\tconst sttCap = voicePayload(persistedVoiceStt());\n\t\t\tif (sttCap) result.stt = sttCap;\n\t\t\tif ((persistedVoiceTts().engine === \"openpalm-voice\" || persistedVoiceStt().engine === \"openpalm-voice\") && selectedVoiceProfile) result.voiceProfile = selectedVoiceProfile;\n\t\t\tif (ollamaEnabled && selectedOllamaProfile) result.ollamaProfile = selectedOllamaProfile;\n\t\t\tif (Object.keys(portalCredentials).length > 0) result.portalCredentials = portalCredentials;\n\t\t\tif (imageTag.trim());\n\t\t\treturn result;\n\t\t});\n\t\tfunction buildPortalsConfig() {\n\t\t\tconst result = {};\n\t\t\tfor (const ch of PORTALS) {\n\t\t\t\tconst sel = portalSelection[ch.id];\n\t\t\t\tif (ch.locked) result[ch.id] = true;\n\t\t\t\telse if (typeof sel === \"object\" && sel !== null) {\n\t\t\t\t\tif (sel.enabled) {\n\t\t\t\t\t\tconst entry = { enabled: true };\n\t\t\t\t\t\tif (ch.credentials) for (const cred of ch.credentials) {\n\t\t\t\t\t\t\tconst v = sel[cred.key];\n\t\t\t\t\t\t\tif (v) entry[cred.key] = v;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult[ch.id] = entry;\n\t\t\t\t\t}\n\t\t\t\t} else if (sel) result[ch.id] = true;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\tfunction enableRecommendedOllama(variant) {\n\t\t\tollamaEnabled = true;\n\t\t\tconst st = providerState[\"ollama\"];\n\t\t\tif (st) {\n\t\t\t\tst.selected = true;\n\t\t\t\tst.verified = true;\n\t\t\t\tst.ollamaMode = \"instack\";\n\t\t\t\tst.baseUrl = \"http://ollama:11434\";\n\t\t\t\tif (st.models.length === 0) st.models = [OLLAMA_DEFAULT_CHAT_MODEL];\n\t\t\t}\n\t\t\tselectedOllamaProfile = selectAddonProfileId(ollamaProfiles, \"ollama\", gpuDetected, variant) ?? addonProfileId(\"ollama\", variant ?? (gpuDetected ? \"cuda\" : \"cpu\"));\n\t\t}\n\t\tconst LOCAL_PROVIDER_IDS = new Set([\n\t\t\t\"ollama\",\n\t\t\t\"lmstudio\",\n\t\t\t\"llamacpp\",\n\t\t\t\"localai\",\n\t\t\t\"model-runner\"\n\t\t]);\n\t\tlet savedCloudLlm = void 0;\n\t\tlet detectedCloudConn = \"\";\n\t\tfunction handleConnectModeChange(mode) {\n\t\t\tmodelMode = mode;\n\t\t\tif (mode === \"local\") {\n\t\t\t\tif (modelSelection.llm && !LOCAL_PROVIDER_IDS.has(modelSelection.llm.connId)) savedCloudLlm = modelSelection.llm;\n\t\t\t\tif (!hostLocalLlmRunning()) enableRecommendedOllama();\n\t\t\t\tconst localOpt = getModelOptionsForRole(\"llm\").find((o) => LOCAL_PROVIDER_IDS.has(o.connId));\n\t\t\t\tmodelSelection.llm = localOpt ? {\n\t\t\t\t\tconnId: localOpt.connId,\n\t\t\t\t\tmodel: localOpt.id,\n\t\t\t\t\tdims: localOpt.dims\n\t\t\t\t} : {\n\t\t\t\t\tconnId: \"ollama\",\n\t\t\t\t\tmodel: OLLAMA_DEFAULT_CHAT_MODEL,\n\t\t\t\t\tdims: 0\n\t\t\t\t};\n\t\t\t} else if (mode === \"cloud\") {\n\t\t\t\tif (savedCloudLlm) modelSelection.llm = savedCloudLlm;\n\t\t\t}\n\t\t}\n\t\tasync function fetchAndApplyRecommendation() {\n\t\t\tif (recommendationApplied) return;\n\t\t\tlet rec;\n\t\t\tif (recommendation) rec = recommendation;\n\t\t\telse try {\n\t\t\t\tconst res = await fetch(\"/api/setup/recommend\");\n\t\t\t\tif (!res.ok) return;\n\t\t\t\tconst data = await res.json();\n\t\t\t\tif (!data.ok || !data.recommendation) return;\n\t\t\t\trec = data.recommendation;\n\t\t\t\tif (Array.isArray(data.hostProviders)) detectedHostProviders = data.hostProviders;\n\t\t\t\tif (data.gpu) {\n\t\t\t\t\tdetectedGpuVramMb = data.gpu.vramMb ?? 0;\n\t\t\t\t\tdetectedGpuVendor = data.gpu.vendor ?? \"\";\n\t\t\t\t\tdetectedGpuName = data.gpu.name ?? \"\";\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(data.cloudProviders)) detectedCloudProviders = data.cloudProviders;\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trecommendationApplied = true;\n\t\t\trecommendation = rec;\n\t\t\tswitch (rec.action) {\n\t\t\t\tcase \"use-cloud\":\n\t\t\t\t\trecommendationAlert = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"use-host-providers\":\n\t\t\t\t\trecommendationAlert = rec.alert;\n\t\t\t\t\tif (!hostImportTriggered) {\n\t\t\t\t\t\thostImportTriggered = true;\n\t\t\t\t\t\tawait handleHostImport();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"enable-ollama\":\n\t\t\t\t\trecommendationAlert = rec.alert;\n\t\t\t\t\tenableRecommendedOllama(rec.profileVariant);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"connect-manually\":\n\t\t\t\t\trecommendationAlert = rec.alert;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfunction handleEnableVoiceChange(v) {\n\t\t\tif (v) {\n\t\t\t\tif (voiceTts.engine !== \"openpalm-voice\") voiceTts = { engine: \"openpalm-voice\" };\n\t\t\t\tif (voiceStt.engine !== \"openpalm-voice\") voiceStt = { engine: \"openpalm-voice\" };\n\t\t\t\tif (!selectedVoiceProfile) {\n\t\t\t\t\tconst match = selectAddonProfileId(voiceProfiles, \"voice\", gpuDetected);\n\t\t\t\t\tif (match) selectedVoiceProfile = match;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (voiceTts.engine === \"openpalm-voice\") voiceTts = { engine: \"\" };\n\t\t\t\tif (voiceStt.engine === \"openpalm-voice\") voiceStt = { engine: \"\" };\n\t\t\t}\n\t\t}\n\t\tfunction goToStep(n) {\n\t\t\tif (n < 0 || n > 3) return;\n\t\t\tif (n > 0 && !systemCheckPassed) return;\n\t\t\tcurrentStep = n;\n\t\t\tif (n > maxVisitedStep) maxVisitedStep = n;\n\t\t\tshowDeploy = false;\n\t\t\tif (n === 1 && !isRerun) {\n\t\t\t\tfetchAndApplyRecommendation();\n\t\t\t\tautoSelectModels();\n\t\t\t}\n\t\t}\n\t\tfunction autoSelectModels() {\n\t\t\tfor (const roleId of [\n\t\t\t\t\"llm\",\n\t\t\t\t\"embedding\",\n\t\t\t\t\"small\"\n\t\t\t]) {\n\t\t\t\tif (modelSelection[roleId]) continue;\n\t\t\t\tif (roleId === \"embedding\") continue;\n\t\t\t\tconst options = getModelOptionsForRole(roleId);\n\t\t\t\tif (options.length === 0) continue;\n\t\t\t\tconst best = options[0];\n\t\t\t\tmodelSelection[roleId] = {\n\t\t\t\t\tconnId: best.connId,\n\t\t\t\t\tmodel: best.id,\n\t\t\t\t\tdims: best.dims\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tfunction getModelOptionsForRole(roleId) {\n\t\t\treturn buildModelOptions(roleId, verifiedProviders(), providerState);\n\t\t}\n\t\tasync function apiFetchModels(provider, baseUrl, apiKey) {\n\t\t\tconst url = \"/api/setup/models/\" + encodeURIComponent(provider);\n\t\t\tconst res = await fetch(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tapiKey: apiKey ?? \"\",\n\t\t\t\t\tbaseUrl: baseUrl ?? \"\"\n\t\t\t\t})\n\t\t\t});\n\t\t\tconst data = await res.json();\n\t\t\tif (!res.ok || data.status === \"recoverable_error\") throw new Error(data.error ?? \"Failed to fetch models (HTTP \" + res.status + \")\");\n\t\t\treturn data;\n\t\t}\n\t\tasync function verifyProvider(id) {\n\t\t\tconst p = PROVIDERS.find((x) => x.id === id);\n\t\t\tif (!p) return;\n\t\t\tconst st = providerState[id];\n\t\t\tif (!st) return;\n\t\t\tif (id === \"ollama\" && st.ollamaMode === \"instack\") {\n\t\t\t\tst.verified = true;\n\t\t\t\tst.error = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst gen = (verifyGeneration[id] ?? 0) + 1;\n\t\t\tverifyGeneration[id] = gen;\n\t\t\tst.verifying = true;\n\t\t\tst.error = false;\n\t\t\tconst baseUrl = (st.baseUrl || p.baseUrl).trim();\n\t\t\tconst apiKey = (st.apiKey ?? \"\").trim();\n\t\t\ttry {\n\t\t\t\tconst result = await apiFetchModels(id, baseUrl, apiKey);\n\t\t\t\tif (verifyGeneration[id] !== gen) return;\n\t\t\t\tst.verified = true;\n\t\t\t\tst.error = false;\n\t\t\t\tst.models = result.models ?? [];\n\t\t\t} catch (e) {\n\t\t\t\tif (verifyGeneration[id] !== gen) return;\n\t\t\t\tst.verified = false;\n\t\t\t\tst.error = true;\n\t\t\t\tst.errorMessage = e instanceof Error ? e.message : \"\";\n\t\t\t\tst.models = [];\n\t\t\t}\n\t\t\tst.verifying = false;\n\t\t}\n\t\tasync function startOpenCodeOAuth(providerId, methodIndex) {\n\t\t\tconst st = providerState[providerId];\n\t\t\tif (!st) return;\n\t\t\tst.verifying = true;\n\t\t\tst.error = false;\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(\"/api/setup/opencode/provider/\" + encodeURIComponent(providerId) + \"/oauth/authorize\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ method: methodIndex })\n\t\t\t\t});\n\t\t\t\tconst oauthRes = await res.json();\n\t\t\t\tif (!res.ok) throw new Error(oauthRes.message ?? \"OAuth failed\");\n\t\t\t\tst.oauthPolling = true;\n\t\t\t\tst.oauthUrl = oauthRes.url ?? \"\";\n\t\t\t\tst.oauthInstructions = oauthRes.instructions ?? \"\";\n\t\t\t\tif (oauthRes.url && oauthRes.method === \"auto\") window.open(oauthRes.url, \"_blank\");\n\t\t\t\tawait pollOpenCodeOAuth(providerId, methodIndex);\n\t\t\t} catch (e) {\n\t\t\t\tst.verifying = false;\n\t\t\t\tst.error = true;\n\t\t\t\tst.errorMessage = e instanceof Error ? e.message : \"OAuth failed\";\n\t\t\t\tst.oauthPolling = false;\n\t\t\t}\n\t\t}\n\t\tasync function pollOpenCodeOAuth(providerId, methodIndex) {\n\t\t\tconst st = providerState[providerId];\n\t\t\tconst ac = new AbortController();\n\t\t\toauthAbortControllers[providerId] = ac;\n\t\t\tconst timeoutSignal = AbortSignal.timeout(10 * 6e4);\n\t\t\tconst combinedSignal = AbortSignal.any ? AbortSignal.any([ac.signal, timeoutSignal]) : ac.signal;\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(\"/api/setup/opencode/provider/\" + encodeURIComponent(providerId) + \"/oauth/callback\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ method: methodIndex }),\n\t\t\t\t\tsignal: combinedSignal\n\t\t\t\t});\n\t\t\t\tconst data = await res.json().catch(() => null);\n\t\t\t\tif (res.ok && data?.ok) {\n\t\t\t\t\tst.verified = true;\n\t\t\t\t\tst.error = false;\n\t\t\t\t} else {\n\t\t\t\t\tst.error = true;\n\t\t\t\t\tst.errorMessage = data?.message ?? \"Authorization failed\";\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof Error && e.name === \"AbortError\" && ac.signal.aborted) return;\n\t\t\t\tif (e instanceof Error && e.name === \"AbortError\") {\n\t\t\t\t\tst.error = true;\n\t\t\t\t\tst.errorMessage = \"Authorization timed out. Try again.\";\n\t\t\t\t} else {\n\t\t\t\t\tst.error = true;\n\t\t\t\t\tst.errorMessage = e instanceof Error ? e.message : \"Authorization failed\";\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tdelete oauthAbortControllers[providerId];\n\t\t\t\tst.oauthPolling = false;\n\t\t\t\tst.verifying = false;\n\t\t\t}\n\t\t}\n\t\tasync function handleInstall() {\n\t\t\tif (installing) return;\n\t\t\tinstallError = \"\";\n\t\t\tif (!!!payload().llm && !isRerun && !emptyAiAck) {\n\t\t\t\tif (!window.confirm(\"No AI is set up here. You can connect this app to an assistant running on another computer, or add a provider later from your dashboard.\\n\\nInstall now?\")) return;\n\t\t\t\temptyAiAck = true;\n\t\t\t}\n\t\t\tinstalling = true;\n\t\t\tif ((persistedVoiceTts().engine === \"openpalm-voice\" || persistedVoiceStt().engine === \"openpalm-voice\") && !selectedVoiceProfile) selectedVoiceProfile = selectAddonProfileId(voiceProfiles, \"voice\", gpuDetected) ?? addonProfileId(\"voice\", \"cpu\");\n\t\t\tif (ollamaEnabled && !selectedOllamaProfile) selectedOllamaProfile = addonProfileId(\"ollama\", gpuDetected ? \"cuda\" : \"cpu\");\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(\"/api/setup/complete\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify(payload())\n\t\t\t\t});\n\t\t\t\tconst data = await res.json().catch(() => ({}));\n\t\t\t\tif (!res.ok || !data.ok) {\n\t\t\t\t\tinstallError = data.message ?? data.error ?? \"Install failed.\";\n\t\t\t\t\tinstalling = false;\n\t\t\t\t\tshowDeploy = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tshowDeploy = true;\n\t\t\t\tstartDeployPolling();\n\t\t\t} catch (e) {\n\t\t\t\tinstallError = \"Network error: \" + (e instanceof Error ? e.message : \"unable to reach server.\");\n\t\t\t\tinstalling = false;\n\t\t\t}\n\t\t}\n\t\tfunction startDeployPolling() {\n\t\t\tstopDeployPolling();\n\t\t\tpollDeployStatus();\n\t\t\tdeployTimer = setInterval(() => {\n\t\t\t\tpollDeployStatus();\n\t\t\t}, 2500);\n\t\t}\n\t\tfunction stopDeployPolling() {\n\t\t\tif (deployTimer) {\n\t\t\t\tclearInterval(deployTimer);\n\t\t\t\tdeployTimer = null;\n\t\t\t}\n\t\t}\n\t\tasync function pollDeployStatus() {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(\"/api/setup/deploy-status\");\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tdeployPollErrors++;\n\t\t\t\t\tif (deployPollErrors >= 5) {\n\t\t\t\t\t\tstopDeployPolling();\n\t\t\t\t\t\tdeployError = \"Lost contact with the installer. Services may still be starting in the background.\";\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst data = await res.json();\n\t\t\t\tdeployPollErrors = 0;\n\t\t\t\tif (data.deployStatus && data.deployStatus.length > 0) data.deployStatus.map((s) => ({\n\t\t\t\t\tservice: s.service,\n\t\t\t\t\tstatus: s.status,\n\t\t\t\t\tlabel: s.label\n\t\t\t\t}));\n\t\t\t\tdeployData = data;\n\t\t\t\tif (data.deployError) {\n\t\t\t\t\tstopDeployPolling();\n\t\t\t\t\tdeployError = data.deployError;\n\t\t\t\t} else if (data.setupComplete && data.deployStatus && data.deployStatus.length > 0) {\n\t\t\t\t\tconst rows = data.deployStatus;\n\t\t\t\t\tconst allRunning = rows.every((s) => s.status === \"running\");\n\t\t\t\t\tconst onlyWarningsLeft = !data.deploying && rows.every((s) => s.status === \"running\" || s.status === \"warning\") && rows.some((s) => s.status === \"warning\");\n\t\t\t\t\tif (allRunning) {\n\t\t\t\t\t\tstopDeployPolling();\n\t\t\t\t\t\tdeployDone = true;\n\t\t\t\t\t} else if (onlyWarningsLeft) {\n\t\t\t\t\t\tstopDeployPolling();\n\t\t\t\t\t\tdeployHasWarnings = true;\n\t\t\t\t\t\tdeployDone = true;\n\t\t\t\t\t}\n\t\t\t\t} else if (data.setupComplete && !data.deploying && (!data.deployStatus || data.deployStatus.length === 0)) {\n\t\t\t\t\tstopDeployPolling();\n\t\t\t\t\tdeployDone = true;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tdeployPollErrors++;\n\t\t\t\tif (deployPollErrors >= 5) {\n\t\t\t\t\tstopDeployPolling();\n\t\t\t\t\tdeployError = err instanceof Error ? `Lost contact with the installer: ${err.message}` : \"Lost contact with the installer.\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfunction handleVerify(id) {\n\t\t\tverifyProvider(id);\n\t\t}\n\t\tfunction handleApiKey(id, key) {\n\t\t\tconst st = providerState[id];\n\t\t\tif (st) st.apiKey = key;\n\t\t}\n\t\tfunction handleBaseUrl(id, url) {\n\t\t\tconst st = providerState[id];\n\t\t\tif (st) st.baseUrl = url;\n\t\t}\n\t\tfunction handlePortalToggle(id) {\n\t\t\tconst sel = portalSelection[id];\n\t\t\tif (typeof sel === \"object\" && sel !== null) sel.enabled = !sel.enabled;\n\t\t\telse portalSelection[id] = !sel;\n\t\t}\n\t\tfunction handleCredentialChange(chId, credKey, value) {\n\t\t\tconst sel = portalSelection[chId];\n\t\t\tif (typeof sel === \"object\" && sel !== null) sel[credKey] = value;\n\t\t}\n\t\tfunction handleSelectModel(role, connId, modelId, dims) {\n\t\t\tmodelSelection[role] = {\n\t\t\t\tconnId,\n\t\t\t\tmodel: modelId,\n\t\t\t\tdims\n\t\t\t};\n\t\t\tif (role === \"embedding\" && (dims <= 0 || dims === void 0)) {} else if (role === \"embedding\") {}\n\t\t}\n\t\tasync function handleDeployRetry() {\n\t\t\tinstalling = false;\n\t\t\tdeployError = null;\n\t\t\tdeployDone = false;\n\t\t\tdeployHasWarnings = false;\n\t\t\tdeployData = {};\n\t\t\tdeployPollErrors = 0;\n\t\t\tconst res = await fetch(\"/api/setup/retry-deploy\", { method: \"POST\" });\n\t\t\tconst payload = await res.json().catch(() => ({}));\n\t\t\tif (!res.ok || payload?.ok === false) {\n\t\t\t\tdeployError = payload?.message ?? \"Retry failed.\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinstalling = true;\n\t\t\tpollDeployStatus();\n\t\t}\n\t\tfunction handleDeployBack() {\n\t\t\tinstalling = false;\n\t\t\tdeployError = null;\n\t\t\tdeployDone = false;\n\t\t\tdeployHasWarnings = false;\n\t\t\tdeployData = {};\n\t\t\tdeployPollErrors = 0;\n\t\t\tshowDeploy = false;\n\t\t\tcurrentStep = 3;\n\t\t}\n\t\tlet hostImportTriggered = false;\n\t\tlet hostImporting = false;\n\t\tfunction markProviderVerifiedFromImport(id) {\n\t\t\tlet st = providerState[id];\n\t\t\tif (!st) {\n\t\t\t\tst = {\n\t\t\t\t\tselected: true,\n\t\t\t\t\tverified: true,\n\t\t\t\t\tverifying: false,\n\t\t\t\t\terror: false,\n\t\t\t\t\tapiKey: \"\",\n\t\t\t\t\tbaseUrl: \"\",\n\t\t\t\t\tmodels: [],\n\t\t\t\t\tollamaMode: null\n\t\t\t\t};\n\t\t\t\tproviderState[id] = st;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tst.verified = true;\n\t\t\tst.error = false;\n\t\t}\n\t\tasync function handleHostImport() {\n\t\t\thostImporting = true;\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(\"/api/setup/import-host\", { method: \"POST\" });\n\t\t\t\tconst data = await res.json().catch(() => null);\n\t\t\t\tif (!res.ok || !data?.ok) {\n\t\t\t\t\thostImporting = false;\n\t\t\t\t\tdata?.error && `${data.error}`;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst importedIds = data.importedProviders ?? data.pushedProviders ?? [];\n\t\t\t\tfor (const id of importedIds) markProviderVerifiedFromImport(id);\n\t\t\t\tawait Promise.allSettled(Object.keys(providerState).filter((id) => !providerState[id].verified && PROVIDERS.some((p) => p.id === id)).map((id) => verifyProvider(id)));\n\t\t\t\tautoSelectModels();\n\t\t\t\thostImporting = false;\n\t\t\t\tif (!isRerun) goToStep(1);\n\t\t\t} catch (e) {\n\t\t\t\thostImporting = false;\n\t\t\t\t`${e instanceof Error ? e.message : \"network error\"}`;\n\t\t\t}\n\t\t}\n\t\tlet isRerun = false;\n\t\thead(\"g40i6i\", $$renderer, ($$renderer) => {\n\t\t\t$$renderer.title(($$renderer) => {\n\t\t\t\t$$renderer.push(`<title>OpenPalm Setup</title>`);\n\t\t\t});\n\t\t});\n\t\t$$renderer.push(`<main class=\"setup-page\" aria-label=\"Setup wizard\">`);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (currentStep === 0 && !showDeploy) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div style=\"display:none\" aria-hidden=\"true\"><section class=\"step-content step-content--hidden\" id=\"step-0\" data-testid=\"step-system-check\">`);\n\t\t\tSystemCheckStep($$renderer, {\n\t\t\t\tisRerun,\n\t\t\t\tonpass: () => {\n\t\t\t\t\tsystemCheckPassed = true;\n\t\t\t\t\tgoToStep(1);\n\t\t\t\t},\n\t\t\t\tonnext: () => {\n\t\t\t\t\tsystemCheckPassed = true;\n\t\t\t\t\tgoToStep(1);\n\t\t\t\t},\n\t\t\t\tongpudetected: (_gpu) => {\n\t\t\t\t\tgpuDetected = true;\n\t\t\t\t\tif (voiceProfiles.length > 0 && selectedVoiceProfile !== addonProfileId(\"voice\", \"cuda\")) {\n\t\t\t\t\t\tconst cuda = voiceProfiles.find((p) => p.id === addonProfileId(\"voice\", \"cuda\") && p.available !== false);\n\t\t\t\t\t\tif (cuda) selectedVoiceProfile = cuda.id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t$$renderer.push(`<!----></section></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> `);\n\t\tif (showDeploy) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<div style=\"flex:1; padding: 32px; overflow-y: auto;\">`);\n\t\t\tDeployStep($$renderer, {\n\t\t\t\tdeployData,\n\t\t\t\tdeployDone,\n\t\t\t\tdeployHasWarnings,\n\t\t\t\tdeployError,\n\t\t\t\tonback: handleDeployBack,\n\t\t\t\tonretry: handleDeployRetry\n\t\t\t});\n\t\t\t$$renderer.push(`<!----></div>`);\n\t\t} else if (currentStep >= 1) {\n\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t$$renderer.push(`<header class=\"wiz-topbar\"><div class=\"wiz-wordmark\"><img src=\"/logo-128.png\" alt=\"OpenPalm\"/> <b>OpenPalm</b><span>setup</span></div> <nav class=\"wiz-ticker\" aria-label=\"Setup steps\"><!--[-->`);\n\t\t\tconst each_array = ensure_array_like([\n\t\t\t\t{\n\t\t\t\t\tn: 1,\n\t\t\t\t\tlabel: \"Connect\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tn: 2,\n\t\t\t\t\tlabel: \"Add-ons\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tn: 3,\n\t\t\t\t\tlabel: \"Finish\"\n\t\t\t\t}\n\t\t\t]);\n\t\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\t\tlet tick = each_array[$$index];\n\t\t\t\t$$renderer.push(`<div${attr_class(\"wiz-tick\", void 0, {\n\t\t\t\t\t\"wiz-tick--active\": currentStep === tick.n,\n\t\t\t\t\t\"wiz-tick--done\": currentStep > tick.n\n\t\t\t\t})}${attr(\"aria-current\", currentStep === tick.n ? \"step\" : void 0)}>`);\n\t\t\t\tif (currentStep > tick.n) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<svg viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"12\" height=\"12\" aria-hidden=\"true\"><path d=\"M2 6l3 3 5-5\"></path></svg>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`<span class=\"wiz-tick-num\">${escape_html(tick.n)}</span>`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--> ${escape_html(tick.label)}</div>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--></nav></header> <div class=\"wiz-stage\"><div class=\"wiz-content\"><div class=\"wiz-content-scroll\"><div class=\"wiz-eyebrow\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`STEP 1 · Connect`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`STEP 2 · Add-ons`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`STEP 3 · Finish`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></div> <h1 class=\"wiz-title\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`Connect your <span class=\"accent\">AI brain</span>`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`Optional <span class=\"accent\">extras</span>`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`You're all <span class=\"accent\">set</span>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></h1> <p class=\"wiz-lede\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\tif (hasUsableAI()) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`We found an AI service already set up. Just continue, or choose something different.`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`Your assistant needs a source of intelligence. Pick one and you're set — you can add more later.`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`All optional — turn on only what you want now. You can add or remove anything later from your dashboard.`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`OpenPalm is ready to install. Save the password you'll use to sign in.`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></p> `);\n\t\t\tif (recommendationAlert && currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<div class=\"feedback feedback--warning\" role=\"alert\" data-testid=\"recommendation-alert\"><span>${escape_html(recommendationAlert)}</span></div>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<section class=\"step-content\" id=\"step-1\">`);\n\t\t\t\tScreen1ModelsStep($$renderer, {\n\t\t\t\t\tmodelMode,\n\t\t\t\t\tdetectionLoading: autoModeImporting,\n\t\t\t\t\tsystemCheckError: systemCheckPassed ? \"\" : \"\",\n\t\t\t\t\thostProviders: detectedHostProviders,\n\t\t\t\t\tcredentialCount: hostProviderCount,\n\t\t\t\t\tcloudProviders: detectedCloudProviders,\n\t\t\t\t\topencodeProviders,\n\t\t\t\t\topencodeAuth,\n\t\t\t\t\tproviderState,\n\t\t\t\t\tollamaEnabled,\n\t\t\t\t\tselectedOllamaProfile,\n\t\t\t\t\thostImporting,\n\t\t\t\t\tverifiedCount: verifiedCount(),\n\t\t\t\t\tallowEmptyInstall,\n\t\t\t\t\tllmModel: modelSelection.llm?.model ?? \"\",\n\t\t\t\t\tllmProvider: modelSelection.llm?.connId ?? \"\",\n\t\t\t\t\tllmModelOptions: llmModelOptions(),\n\t\t\t\t\tdetectedCloudConn,\n\t\t\t\t\tonselectmodel: (connId, model, dims) => handleSelectModel(\"llm\", connId, model, dims),\n\t\t\t\t\tgpuVramMb: detectedGpuVramMb,\n\t\t\t\t\tgpuVendor: detectedGpuVendor,\n\t\t\t\t\tgpuName: detectedGpuName,\n\t\t\t\t\tonmodelmodechange: handleConnectModeChange,\n\t\t\t\t\tonhostimport: () => void handleHostImport(),\n\t\t\t\t\tonoauthstart: startOpenCodeOAuth,\n\t\t\t\t\tonoauthcancel: (id) => {\n\t\t\t\t\t\tconst ac = oauthAbortControllers[id];\n\t\t\t\t\t\tif (ac) {\n\t\t\t\t\t\t\tac.abort();\n\t\t\t\t\t\t\tdelete oauthAbortControllers[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst st = providerState[id];\n\t\t\t\t\t\tif (st) {\n\t\t\t\t\t\t\tst.oauthPolling = false;\n\t\t\t\t\t\t\tst.verifying = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonbaseurl: handleBaseUrl,\n\t\t\t\t\tonapikey: handleApiKey,\n\t\t\t\t\tonverify: handleVerify,\n\t\t\t\t\tonrecheck: () => void fetchAndApplyRecommendation(),\n\t\t\t\t\tonsystemcheckretry: () => {\n\t\t\t\t\t\tgoToStep(0);\n\t\t\t\t\t},\n\t\t\t\t\tonallowemptyinstallchange: (v) => {\n\t\t\t\t\t\tallowEmptyInstall = v;\n\t\t\t\t\t},\n\t\t\t\t\tonnext: () => goToStep(2)\n\t\t\t\t});\n\t\t\t\t$$renderer.push(`<!----></section>`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`<section class=\"step-content\" id=\"step-2\">`);\n\t\t\t\tScreen2ExtrasStep($$renderer, {\n\t\t\t\t\tmodelMode,\n\t\t\t\t\tvoiceEnabled,\n\t\t\t\t\tvoiceTts: displayedVoiceTts(),\n\t\t\t\t\tvoiceStt: displayedVoiceStt(),\n\t\t\t\t\thasOpenAI: hasOpenAI(),\n\t\t\t\t\tvoiceProfiles,\n\t\t\t\t\tselectedVoiceProfile,\n\t\t\t\t\tportalSelection,\n\t\t\t\t\tonvoiceenabledchange: (v) => {\n\t\t\t\t\t\tvoiceEnabled = v;\n\t\t\t\t\t\thandleEnableVoiceChange(v);\n\t\t\t\t\t},\n\t\t\t\t\tonchangetts: (v) => {\n\t\t\t\t\t\tvoiceTts = v;\n\t\t\t\t\t},\n\t\t\t\t\tonchangestt: (v) => {\n\t\t\t\t\t\tvoiceStt = v;\n\t\t\t\t\t},\n\t\t\t\t\tonvoiceprofilechange: (id) => {\n\t\t\t\t\t\tselectedVoiceProfile = id;\n\t\t\t\t\t},\n\t\t\t\t\tonportaltoggle: handlePortalToggle,\n\t\t\t\t\toncredentialchange: handleCredentialChange,\n\t\t\t\t\tonnext: () => goToStep(3)\n\t\t\t\t});\n\t\t\t\t$$renderer.push(`<!----></section>`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`<section class=\"step-content\" id=\"step-3\" data-testid=\"step-review\">`);\n\t\t\t\tReviewStep($$renderer, {\n\t\t\t\t\tuiLoginPassword,\n\t\t\t\t\tverifiedProviders: verifiedProviders(),\n\t\t\t\t\tmodelSelection,\n\t\t\t\t\tactiveTts: voiceEnabled ? displayedVoiceTts().engine : \"\",\n\t\t\t\t\tactiveStt: voiceEnabled ? displayedVoiceStt().engine : \"\",\n\t\t\t\t\tvoiceProfileLabel: selectedVoiceProfileLabel(),\n\t\t\t\t\tollamaProfileLabel: selectedOllamaProfileLabel(),\n\t\t\t\t\tportalSelection,\n\t\t\t\t\tollamaEnabled,\n\t\t\t\t\tcloudOnly: modelMode === \"cloud\" && !ollamaEnabled && detectedHostProviders.length === 0,\n\t\t\t\t\thostProviderLabel: detectedHostProviders.length > 0 ? detectedHostProviders[0].provider : \"\",\n\t\t\t\t\tpayload: payload(),\n\t\t\t\t\tinstallError,\n\t\t\t\t\tinstalling,\n\t\t\t\t\tisRerun,\n\t\t\t\t\tsystemCheckPassed,\n\t\t\t\t\tonback: () => goToStep(2),\n\t\t\t\t\toninstall: handleInstall,\n\t\t\t\t\toneditmodels: () => goToStep(1),\n\t\t\t\t\toneditextras: () => goToStep(2)\n\t\t\t\t});\n\t\t\t\t$$renderer.push(`<!----></section>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></div> <footer class=\"wiz-footer\"><div class=\"wiz-footer-left\">`);\n\t\t\tif (currentStep > 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<button class=\"btn btn-secondary\" aria-label=\"Back\">Back</button>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<div></div>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]--></div> <div class=\"wiz-footer-right\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<button class=\"btn btn-primary\" id=\"btn-screen1-next\"${attr(\"disabled\", !canComplete(), true)}>`);\n\t\t\t\tif (modelSelection.llm?.connId && ![\n\t\t\t\t\t\"ollama\",\n\t\t\t\t\t\"lmstudio\",\n\t\t\t\t\t\"llamacpp\",\n\t\t\t\t\t\"localai\",\n\t\t\t\t\t\"model-runner\"\n\t\t\t\t].includes(modelSelection.llm.connId)) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`Use ${escape_html(modelSelection.llm.connId === \"openai\" ? \"ChatGPT\" : modelSelection.llm.connId === \"google\" ? \"Gemini\" : modelSelection.llm.connId === \"github-copilot\" ? \"GitHub Copilot\" : modelSelection.llm.connId === \"groq\" ? \"Groq\" : opencodeProviders.find((p) => p.id === modelSelection.llm.connId)?.name ?? modelSelection.llm.connId)} — Continue`);\n\t\t\t\t} else if (ollamaEnabled || detectedHostProviders.length > 0 || modelSelection.llm?.connId && [\n\t\t\t\t\t\"ollama\",\n\t\t\t\t\t\"lmstudio\",\n\t\t\t\t\t\"llamacpp\",\n\t\t\t\t\t\"localai\",\n\t\t\t\t\t\"model-runner\"\n\t\t\t\t].includes(modelSelection.llm.connId)) {\n\t\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t\t$$renderer.push(`Use local AI — Continue`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`Continue`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--></button>`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`<button class=\"btn btn-primary\" id=\"btn-screen2-next\">Continue</button>`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`<button class=\"btn btn-primary\" id=\"btn-install\"${attr(\"disabled\", !canComplete() || installing, true)}>`);\n\t\t\t\tif (installing) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`Installing...`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`${escape_html(\"Install\")}`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--></button>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></div></footer></div> <aside class=\"wiz-aside\" aria-label=\"Setup guide\"><div class=\"wiz-aside-top\"><img class=\"wiz-mascot\" src=\"/wizard-128.png\" alt=\"OpenPalm setup guide\"/> <div><b class=\"wiz-greet-name\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\tif (hasUsableAI()) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`You're almost done!`);\n\t\t\t\t} else if (modelMode === \"local\" || ollamaEnabled || detectedHostProviders.length > 0) {\n\t\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t\t$$renderer.push(`Great choice.`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`Pick what works for you.`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`While you're here…`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`You're ready.`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></b> <span class=\"wiz-greet-sub\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`Your setup guide`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`A few optional extras`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`Everything's in order`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></span></div></div> <p class=\"wiz-guide-lede\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\tif (hasUsableAI()) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`We found an AI account on this computer. Just hit <strong>Continue</strong> and your assistant will use it automatically.`);\n\t\t\t\t} else if (modelMode === \"local\" || ollamaEnabled || detectedHostProviders.length > 0) {\n\t\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t\t$$renderer.push(`Running AI locally means your conversations never leave your machine. Perfect for privacy.`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`Sign in once and you're set. A browser tab will open for you to log in — come back here when you're done, it connects automatically.`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`All of this is optional. Skip this whole step if you want — your assistant works fine without any of these. You can turn them on whenever you're ready from the dashboard.`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`You're ready. Click <strong>Install OpenPalm</strong> and it'll start up in the background. The first launch pulls a few files — this takes a minute or two. When it's done, open your browser, sign in with that password, and you're good to go. Everything can be changed later from the dashboard.`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></p> <div class=\"wiz-guide-bullets\">`);\n\t\t\tif (currentStep === 1) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\tif (hasUsableAI()) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M9 12l2 2 4-4\"></path><circle cx=\"12\" cy=\"12\" r=\"9\"></circle></svg></div> <div>Your existing connection is ready to use. No extra setup needed — just continue to the next step.</div></div> <div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 3l1.5 4.5H18l-3.75 2.7 1.5 4.5L12 12l-3.75 2.7 1.5-4.5L6 7.5h4.5z\"></path></svg></div> <div>Want to use something different? Select another option from the list — you can switch any time from the dashboard.</div></div>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`<div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"8\" r=\"4\"></circle><path d=\"M4 20c0-4 3.6-7 8-7s8 3 8 7\"></path></svg></div> <div><strong>Cloud services</strong> like ChatGPT are fast and easy — you just sign in.</div></div> <div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\"></rect><path d=\"M8 20h8M12 16v4\"></path></svg></div> <div><strong>Running locally</strong> keeps everything on your computer — private, free, no internet needed.</div></div>`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t} else if (currentStep === 2) {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`<div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\"></rect><path d=\"M5 11a7 7 0 0014 0M12 18v3\"></path></svg></div> <div>Voice runs locally — free, no internet needed. A small model downloads the first time you use it.</div></div> <div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8v4l3 3\"></path></svg></div> <div>Setup help: <a href=\"https://discord.com/developers/docs/quick-start/getting-started\" target=\"_blank\" rel=\"noopener\">How to set up a Discord bot →</a></div></div> <div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M3 12h18M3 6h18M3 18h18\"></path></svg></div> <div><a href=\"https://api.slack.com/quickstart\" target=\"_blank\" rel=\"noopener\">How to set up a Slack app →</a></div></div>`);\n\t\t\t} else if (currentStep === 3) {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`<div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\"></rect><path d=\"M7 11V7a5 5 0 0110 0v4\"></path></svg></div> <div>Your sign-in password is already saved on this computer — keep a copy somewhere safe just in case.</div></div> <div class=\"wiz-bullet\"><div class=\"wiz-bullet-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M9 12l2 2 4-4\"></path><circle cx=\"12\" cy=\"12\" r=\"9\"></circle></svg></div> <div>Everything can be changed from the dashboard after install — providers, voice, portals, and more.</div></div>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></div> <div class=\"wiz-guide-privacy\"><svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\"><path d=\"M8 1.5L2 4v4c0 3.3 2.5 5.8 6 6.5 3.5-.7 6-3.2 6-6.5V4L8 1.5z\"></path></svg> <span>It's your own assistant, running right here on your computer.</span></div></aside></div>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--></main>`);\n\t});\n}\n//#endregion\nexport { _page as default };\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_page.svelte-D98QHSOI.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/splash/_page.svelte.js"],"sourcesContent":["import { H as escape_html, V as attr, a as derived, n as attr_class, o as ensure_array_like, s as head, u as stringify } from \"../../../chunks/dev.js\";\n//#region src/routes/splash/+page.svelte\nfunction _page($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\tlet { data } = $$props;\n\t\tconst view = derived(() => {\n\t\t\tconst m = data.migration;\n\t\t\tif (m.status === \"error\") return { kind: \"migration-error\" };\n\t\t\tif (m.status === \"pending\") return { kind: \"migration-pending\" };\n\t\t\treturn {\n\t\t\t\tkind: \"stack\",\n\t\t\t\tstate: data.launchStatus.local.state\n\t\t\t};\n\t\t});\n\t\tlet phase = { name: \"idle\" };\n\t\tfunction fmtBytes(n) {\n\t\t\tif (!Number.isFinite(n) || n <= 0) return \"—\";\n\t\t\tconst u = [\n\t\t\t\t\"B\",\n\t\t\t\t\"KB\",\n\t\t\t\t\"MB\",\n\t\t\t\t\"GB\",\n\t\t\t\t\"TB\"\n\t\t\t];\n\t\t\tlet i = 0, v = n;\n\t\t\twhile (v >= 1024 && i < u.length - 1) {\n\t\t\t\tv /= 1024;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\treturn `${v.toFixed(v < 10 && i > 0 ? 1 : 0)} ${u[i]}`;\n\t\t}\n\t\tfunction remoteLabel(s) {\n\t\t\treturn {\n\t\t\t\taccessible: \"Connected\",\n\t\t\t\tunreachable: \"Unreachable\",\n\t\t\t\tunauthorized: \"Needs sign-in\",\n\t\t\t\tunknown: \"Unknown\"\n\t\t\t}[s] ?? s;\n\t\t}\n\t\tconst stackCard = derived(() => {\n\t\t\tswitch (data.launchStatus.local.state) {\n\t\t\t\tcase \"not_installed\": return {\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\teyebrow: \"Welcome\",\n\t\t\t\t\ttitle: \"Let’s get you set up\",\n\t\t\t\t\tbody: \"OpenPalm isn’t installed yet. Run the quick setup to install your assistant, or connect to one running somewhere else.\"\n\t\t\t\t};\n\t\t\t\tcase \"setup_incomplete\": return {\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\teyebrow: \"Almost there\",\n\t\t\t\t\ttitle: \"Finish setting up\",\n\t\t\t\t\tbody: \"Installation was started but never finished. Pick up where you left off to get your assistant running.\"\n\t\t\t\t};\n\t\t\t\tcase \"installed_offline\": return {\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\teyebrow: \"Stopped\",\n\t\t\t\t\ttitle: \"Your assistant is offline\",\n\t\t\t\t\tbody: \"OpenPalm is installed but nothing is running right now. Open the dashboard to start it back up.\"\n\t\t\t\t};\n\t\t\t\tcase \"installed_broken\": return {\n\t\t\t\t\tseverity: \"danger\",\n\t\t\t\t\teyebrow: \"Needs attention\",\n\t\t\t\t\ttitle: \"Something needs a look\",\n\t\t\t\t\tbody: \"Your stack is running but one or more services are unhealthy. The diagnostics will show you what went wrong.\"\n\t\t\t\t};\n\t\t\t\tcase \"running\": return {\n\t\t\t\t\tseverity: \"success\",\n\t\t\t\t\teyebrow: \"Ready\",\n\t\t\t\t\ttitle: \"You’re all set\",\n\t\t\t\t\tbody: \"Everything is healthy. Open the chat to start talking to your assistant.\"\n\t\t\t\t};\n\t\t\t\tdefault: return {\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\teyebrow: \"Status\",\n\t\t\t\t\ttitle: \"OpenPalm\",\n\t\t\t\t\tbody: \"\"\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t\tconst runtime = derived(() => data.launchStatus.local.runtime);\n\t\tconst remotes = derived(() => data.launchStatus.remotes);\n\t\tconst accessibleRemote = derived(() => remotes().find((r) => r.state === \"accessible\"));\n\t\tconst liveMsg = derived(() => {\n\t\t\tif (view().kind !== \"migration-pending\") return \"\";\n\t\t\tswitch (phase.name) {\n\t\t\t\tcase \"applying\": return \"Updating your settings folder, please wait.\";\n\t\t\t\tcase \"done\": return \"Update complete. You can continue.\";\n\t\t\t\tcase \"error\": return \"The update did not complete.\";\n\t\t\t\tcase \"lowspace\": return \"Low disk space detected. Confirm to proceed.\";\n\t\t\t\tdefault: return \"\";\n\t\t\t}\n\t\t});\n\t\thead(\"pq79rg\", $$renderer, ($$renderer) => {\n\t\t\t$$renderer.title(($$renderer) => {\n\t\t\t\t$$renderer.push(`<title>OpenPalm</title>`);\n\t\t\t});\n\t\t});\n\t\t$$renderer.push(`<div class=\"setup-page\"><header class=\"wiz-topbar svelte-pq79rg\"><div class=\"wiz-wordmark\"><img src=\"/logo-128.png\" alt=\"\"/> <b>OpenPalm</b></div></header> <main class=\"splash-stage svelte-pq79rg\"><p class=\"sr-only svelte-pq79rg\" role=\"status\" aria-live=\"polite\">${escape_html(liveMsg())}</p> <div class=\"splash-panel svelte-pq79rg\">`);\n\t\tif (view().kind === \"migration-error\") {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<p class=\"wiz-eyebrow svelte-pq79rg\"><span class=\"sev-dot sev-danger svelte-pq79rg\" aria-hidden=\"true\"></span>Can’t continue</p> <h1 class=\"wiz-title\">We couldn’t read your <span class=\"accent\">settings</span></h1> `);\n\t\t\tif (data.migration.status === \"error\") {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"wiz-lede\">${escape_html(data.migration.message)}</p> <p class=\"splash-guidance svelte-pq79rg\">${escape_html(data.migration.guidance || \"If this keeps happening, check the application logs or re-run setup.\")}</p>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]-->`);\n\t\t} else if (view().kind === \"migration-pending\") {\n\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\tif (phase.name === \"done\") {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"wiz-eyebrow svelte-pq79rg\"><span class=\"sev-dot sev-success svelte-pq79rg\" aria-hidden=\"true\"></span>All done</p> <h1 class=\"wiz-title\">Your data is <span class=\"accent\">up to date</span></h1> <p class=\"wiz-lede\">OpenPalm finished updating your settings. Everything was backed up first.</p> <ul class=\"splash-summary svelte-pq79rg\">`);\n\t\t\t\tif (phase.backupDir) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<li class=\"svelte-pq79rg\"><span class=\"svelte-pq79rg\">Backed up to</span><code class=\"svelte-pq79rg\">${escape_html(phase.backupDir)}</code></li>`);\n\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<!--]--> <li class=\"svelte-pq79rg\"><span class=\"svelte-pq79rg\">What changed</span><span class=\"svelte-pq79rg\">Settings layout v${escape_html(phase.from)} → v${escape_html(phase.to)}</span></li></ul> `);\n\t\t\t\tif (phase.notes.length) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<ul class=\"splash-notes svelte-pq79rg\"><!--[-->`);\n\t\t\t\t\tconst each_array = ensure_array_like(phase.notes);\n\t\t\t\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\t\t\t\tlet note = each_array[$$index];\n\t\t\t\t\t\t$$renderer.push(`<li class=\"svelte-pq79rg\">${escape_html(note)}</li>`);\n\t\t\t\t\t}\n\t\t\t\t\t$$renderer.push(`<!--]--></ul>`);\n\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<!--]--> <div class=\"splash-actions svelte-pq79rg\"><button class=\"btn btn-primary btn-lg svelte-pq79rg\">Continue to OpenPalm</button></div>`);\n\t\t\t} else if (phase.name === \"error\") {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`<p class=\"wiz-eyebrow svelte-pq79rg\"><span class=\"sev-dot sev-danger svelte-pq79rg\" aria-hidden=\"true\"></span>Didn’t finish</p> <h1 class=\"wiz-title\">The update didn’t complete</h1> <p class=\"wiz-lede\">${escape_html(phase.message)}</p> <p class=\"splash-guidance svelte-pq79rg\">${escape_html(phase.guidance || \"Your files were not changed. Try again, or check the application logs if it keeps failing.\")}</p> <div class=\"splash-actions svelte-pq79rg\"><button class=\"btn btn-primary btn-lg svelte-pq79rg\">Try again</button></div>`);\n\t\t\t} else if (phase.name === \"lowspace\") {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`<p class=\"wiz-eyebrow svelte-pq79rg\"><span class=\"sev-dot sev-warning svelte-pq79rg\" aria-hidden=\"true\"></span>Low disk space</p> <h1 class=\"wiz-title\">The safety backup may not fit</h1> <p class=\"wiz-lede\">${escape_html(phase.message)}</p> <ul class=\"splash-summary svelte-pq79rg\"><li class=\"svelte-pq79rg\"><span class=\"svelte-pq79rg\">Backup needs</span><span class=\"svelte-pq79rg\">${escape_html(fmtBytes(phase.estimatedBytes))}</span></li> <li class=\"svelte-pq79rg\"><span class=\"svelte-pq79rg\">Free space</span><span class=\"svelte-pq79rg\">${escape_html(fmtBytes(phase.freeBytes))}</span></li></ul> <p class=\"splash-guidance svelte-pq79rg\">Your home is always backed up before updating, and nothing has changed yet.</p> <div class=\"splash-actions svelte-pq79rg\"><button class=\"btn btn-danger btn-lg svelte-pq79rg\">Apply anyway</button> <button class=\"btn btn-ghost btn-lg svelte-pq79rg\">Not now</button></div>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<p class=\"wiz-eyebrow svelte-pq79rg\"><span class=\"sev-dot sev-warning svelte-pq79rg\" aria-hidden=\"true\"></span>One quick step</p> <h1 class=\"wiz-title\">A small update to your <span class=\"accent\">settings</span></h1> <p class=\"wiz-lede\">Before you continue, OpenPalm needs to reorganize your settings folder to match this\n version. It’s safe — a full backup is taken first and your existing files are kept.</p> `);\n\t\t\t\tif (data.migration.status === \"pending\" && data.migration.notes.length) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<ul class=\"splash-notes svelte-pq79rg\"><!--[-->`);\n\t\t\t\t\tconst each_array_1 = ensure_array_like(data.migration.notes);\n\t\t\t\t\tfor (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {\n\t\t\t\t\t\tlet note = each_array_1[$$index_1];\n\t\t\t\t\t\t$$renderer.push(`<li class=\"svelte-pq79rg\">${escape_html(note)}</li>`);\n\t\t\t\t\t}\n\t\t\t\t\t$$renderer.push(`<!--]--></ul>`);\n\t\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t\t$$renderer.push(`<!--]--> <div class=\"splash-actions svelte-pq79rg\"><button class=\"btn btn-primary btn-lg svelte-pq79rg\"${attr(\"disabled\", phase.name === \"applying\", true)}>`);\n\t\t\t\tif (phase.name === \"applying\") {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<span class=\"spinner svelte-pq79rg\" aria-hidden=\"true\"></span>Updating…`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`Update now`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--></button></div> <p class=\"splash-reassure svelte-pq79rg\">This usually takes a few seconds. Your settings, secrets, and saved data are copied to a\n timestamped backup folder first, so you can always restore your previous state.</p>`);\n\t\t\t}\n\t\t\t$$renderer.push(`<!--]-->`);\n\t\t} else {\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<p class=\"wiz-eyebrow svelte-pq79rg\"><span${attr_class(`sev-dot sev-${stringify(stackCard().severity)}`, \"svelte-pq79rg\")} aria-hidden=\"true\"></span>${escape_html(stackCard().eyebrow)}</p> <h1 class=\"wiz-title\">${escape_html(stackCard().title)}</h1> <p class=\"wiz-lede\">${escape_html(stackCard().body)}</p> `);\n\t\t\tif (view().state === \"not_installed\" && runtime() && !runtime().dockerPresent) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"splash-guidance svelte-pq79rg\">No container runtime found. Install <a href=\"https://www.docker.com/products/docker-desktop/\" target=\"_blank\" rel=\"noreferrer\">Docker</a> (or OrbStack / Podman), start it, then reload this page.</p>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> `);\n\t\t\tif (view().state === \"installed_broken\") {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<p class=\"splash-guidance svelte-pq79rg\">Unhealthy services are listed in Diagnostics; the container logs show the underlying error.</p>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--> <div class=\"splash-actions svelte-pq79rg\">`);\n\t\t\tif (view().state === \"not_installed\") {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<a class=\"btn btn-primary btn-lg svelte-pq79rg\" href=\"/setup\">Run setup</a> `);\n\t\t\t\tif (accessibleRemote()) {\n\t\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t\t$$renderer.push(`<a class=\"btn btn-outline btn-lg svelte-pq79rg\" href=\"/chat\">Use ${escape_html(accessibleRemote().name)}</a>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t\t\t$$renderer.push(`<button class=\"btn btn-ghost btn-lg svelte-pq79rg\">Reload</button>`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t} else if (view().state === \"setup_incomplete\") {\n\t\t\t\t$$renderer.push(\"<!--[1-->\");\n\t\t\t\t$$renderer.push(`<a class=\"btn btn-primary btn-lg svelte-pq79rg\" href=\"/setup\">Resume setup</a>`);\n\t\t\t} else if (view().state === \"installed_offline\") {\n\t\t\t\t$$renderer.push(\"<!--[2-->\");\n\t\t\t\t$$renderer.push(`<a class=\"btn btn-primary btn-lg svelte-pq79rg\" href=\"/admin\">Open dashboard</a> <button class=\"btn btn-outline btn-lg svelte-pq79rg\">Reload</button>`);\n\t\t\t} else if (view().state === \"installed_broken\") {\n\t\t\t\t$$renderer.push(\"<!--[3-->\");\n\t\t\t\t$$renderer.push(`<a class=\"btn btn-primary btn-lg svelte-pq79rg\" href=\"/admin\">Open diagnostics</a> <button class=\"btn btn-outline btn-lg svelte-pq79rg\">Retry</button>`);\n\t\t\t} else if (view().state === \"running\") {\n\t\t\t\t$$renderer.push(\"<!--[4-->\");\n\t\t\t\t$$renderer.push(`<a class=\"btn btn-primary btn-lg svelte-pq79rg\" href=\"/chat\">Open chat</a> <a class=\"btn btn-ghost btn-lg svelte-pq79rg\" href=\"/admin\">Admin</a>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]--></div> `);\n\t\t\tif (remotes().length) {\n\t\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t\t$$renderer.push(`<ul class=\"splash-remotes svelte-pq79rg\" aria-label=\"Remote connections\"><!--[-->`);\n\t\t\t\tconst each_array_2 = ensure_array_like(remotes());\n\t\t\t\tfor (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {\n\t\t\t\t\tlet remote = each_array_2[$$index_2];\n\t\t\t\t\t$$renderer.push(`<li class=\"svelte-pq79rg\"><span${attr_class(`dot ${remote.state === \"accessible\" ? \"ok\" : \"bad\"}`, \"svelte-pq79rg\")} aria-hidden=\"true\"></span> <span class=\"rname svelte-pq79rg\">${escape_html(remote.name)}</span> <span class=\"rstate svelte-pq79rg\">${escape_html(remoteLabel(remote.state))}</span></li>`);\n\t\t\t\t}\n\t\t\t\t$$renderer.push(`<!--]--></ul>`);\n\t\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`<!--]-->`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></div></main></div>`);\n\t});\n}\n//#endregion\nexport { _page as default };\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_page.svelte-dXTqinDv.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js"],"sourcesContent":["import { H as escape_html, V as attr, s as head } from \"../../../chunks/dev.js\";\nimport { t as goto } from \"../../../chunks/client.js\";\nimport \"../../../chunks/navigation.js\";\nimport { t as Spinner } from \"../../../chunks/Spinner.js\";\n//#region src/lib/components/common/AuthGate.svelte\nfunction AuthGate($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\tlet { onSuccess, loading, error } = $$props;\n\t\tlet tokenInput = \"\";\n\t\t$$renderer.push(`<main class=\"s-gate svelte-zhbyfn\" aria-label=\"Admin login gate\"><div class=\"s-gate-inner svelte-zhbyfn\"><div class=\"s-gate-mark svelte-zhbyfn\">openpalm</div> <form class=\"s-gate-form svelte-zhbyfn\"><input type=\"text\" name=\"username\" autocomplete=\"username\" value=\"admin\" class=\"sr-only svelte-zhbyfn\" tabindex=\"-1\" aria-hidden=\"true\"/> <div class=\"s-gate-field svelte-zhbyfn\"><input id=\"admin-token\" name=\"admin-token\" class=\"s-gate-input svelte-zhbyfn\"${attr(\"type\", \"password\")}${attr(\"value\", tokenInput)} placeholder=\"password\" autocomplete=\"current-password\"/> <button type=\"button\" class=\"s-gate-reveal svelte-zhbyfn\"${attr(\"aria-label\", \"Show password\")}>`);\n\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<svg aria-hidden=\"true\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle></svg>`);\n\t\t$$renderer.push(`<!--]--></button></div> `);\n\t\tif (error) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\t$$renderer.push(`<p class=\"s-gate-error svelte-zhbyfn\" role=\"alert\">${escape_html(error)}</p>`);\n\t\t} else $$renderer.push(\"<!--[-1-->\");\n\t\t$$renderer.push(`<!--]--> <button class=\"s-gate-submit svelte-zhbyfn\" type=\"submit\"${attr(\"disabled\", loading || !tokenInput.trim(), true)}>`);\n\t\tif (loading) {\n\t\t\t$$renderer.push(\"<!--[0-->\");\n\t\t\tSpinner($$renderer, {});\n\t\t} else {\n\t\t\t$$renderer.push(\"<!--[-1-->\");\n\t\t\t$$renderer.push(`enter`);\n\t\t}\n\t\t$$renderer.push(`<!--]--></button></form></div></main>`);\n\t});\n}\n//#endregion\n//#region src/routes/login/+page.svelte\nfunction _page($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\tlet { data } = $$props;\n\t\tlet loading = false;\n\t\tlet error = \"\";\n\t\tasync function handleAuthSuccess(token) {\n\t\t\tif (loading) return false;\n\t\t\tconst target = data.redirectTo || \"/chat\";\n\t\t\tloading = true;\n\t\t\terror = \"\";\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(\"/admin/auth/login\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ password: token }),\n\t\t\t\t\tcredentials: \"include\"\n\t\t\t\t});\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\terror = res.status === 503 ? \"Admin password is not configured yet. Complete setup first.\" : \"Invalid password.\";\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tawait goto(target);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\terror = \"Unable to reach admin API.\";\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tloading = false;\n\t\t\t}\n\t\t}\n\t\thead(\"1x05zx6\", $$renderer, ($$renderer) => {\n\t\t\t$$renderer.title(($$renderer) => {\n\t\t\t\t$$renderer.push(`<title>Sign in — OpenPalm</title>`);\n\t\t\t});\n\t\t});\n\t\tAuthGate($$renderer, {\n\t\t\tonSuccess: handleAuthSuccess,\n\t\t\tloading,\n\t\t\terror\n\t\t});\n\t});\n}\n//#endregion\nexport { _page as default };\n"],"names":[],"mappings":";;;;;;;AAIA;AACA,SAAS,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE;AACvC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,UAAU,KAAK;AAEtC,EAAE,IAAI,UAAU,GAAG,EAAE;AACrB,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,scAAsc,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,mHAAmH,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5qB,EAAE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,kRAAkR,CAAC,CAAC;AACvS,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,wBAAwB,CAAC,CAAC;AAC7C,EAGS,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;AACtC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,kEAAkE,EAAE,IAAI,CAAC,UAAU,EAAa,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAChJ,EAGS;AACT,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;AAChC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AAC3B,EAAE;AACF,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,qCAAqC,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AACH;AACA;AACA;AACA,SAAS,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE;AACpC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,UAAU,KAAK;AACtC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO;AA4BxB,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,UAAU,KAAK;AAC9C,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK;AACpC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,iCAAiC,CAAC,CAAC;AACxD,GAAG,CAAC,CAAC;AACL,EAAE,CAAC,CAAC;AACJ,EAAE,QAAQ,CAAC,UAIR,CAAC;AACJ,CAAC,CAAC,CAAC;AACH;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-CrZpBhn6.js","sources":["../../../.svelte-kit/adapter-node/chunks/index-server.js","../../../.svelte-kit/adapter-node/chunks/client.js"],"sourcesContent":["import { n as __exportAll } from \"./chunk.js\";\nimport { $ as createContext, G as async_mode_flag, K as getAbortSignal, Q as run, W as get_render_context, Z as noop, ct as experimental_async_required, et as getAllContexts, it as ssr_context, lt as uneval, nt as hasContext, ot as hydratable_serialization_failed, rt as setContext, st as lifecycle_function_unavailable, tt as getContext } from \"./dev.js\";\n//#region ../../node_modules/.bun/svelte@5.55.9+b050a890ad81aed8/node_modules/svelte/src/internal/server/hydratable.js\n/** @import { HydratableLookupEntry } from '#server' */\n/**\n* @template T\n* @param {string} key\n* @param {() => T} fn\n* @returns {T}\n*/\nfunction hydratable(key, fn) {\n\tif (!async_mode_flag) experimental_async_required(\"hydratable\");\n\tconst { hydratable } = get_render_context();\n\tlet entry = hydratable.lookup.get(key);\n\tif (entry !== void 0) return entry.value;\n\tconst value = fn();\n\tentry = encode(key, value, hydratable.unresolved_promises);\n\thydratable.lookup.set(key, entry);\n\treturn value;\n}\n/**\n* @param {string} key\n* @param {any} value\n* @param {Map<Promise<any>, string>} [unresolved]\n*/\nfunction encode(key, value, unresolved) {\n\t/** @type {HydratableLookupEntry} */\n\tconst entry = {\n\t\tvalue,\n\t\tserialized: \"\"\n\t};\n\tlet uid = 1;\n\tentry.serialized = uneval(entry.value, (value, uneval) => {\n\t\tif (is_promise(value)) {\n\t\t\tconst placeholder = `\"${uid++}\"`;\n\t\t\tconst p = value.then((v) => {\n\t\t\t\tentry.serialized = entry.serialized.replace(placeholder, () => `r(${uneval(v)})`);\n\t\t\t}).catch((devalue_error) => hydratable_serialization_failed(key, serialization_stack(entry.stack, devalue_error?.stack)));\n\t\t\tunresolved?.set(p, key);\n\t\t\tp.catch(() => {}).finally(() => unresolved?.delete(p));\n\t\t\t(entry.promises ??= []).push(p);\n\t\t\treturn placeholder;\n\t\t}\n\t});\n\treturn entry;\n}\n/**\n* @param {any} value\n* @returns {value is Promise<any>}\n*/\nfunction is_promise(value) {\n\treturn Object.prototype.toString.call(value) === \"[object Promise]\";\n}\n/**\n* @param {string | undefined} root_stack\n* @param {string | undefined} uneval_stack\n*/\nfunction serialization_stack(root_stack, uneval_stack) {\n\tlet out = \"\";\n\tif (root_stack) out += root_stack + \"\\n\";\n\tif (uneval_stack) out += \"Caused by:\\n\" + uneval_stack + \"\\n\";\n\treturn out || \"<missing stack trace>\";\n}\n//#endregion\n//#region ../../node_modules/.bun/svelte@5.55.9+b050a890ad81aed8/node_modules/svelte/src/internal/server/blocks/snippet.js\n/** @import { Snippet } from 'svelte' */\n/** @import { Renderer } from '../renderer' */\n/** @import { Getters } from '#shared' */\n/**\n* Create a snippet programmatically\n* @template {unknown[]} Params\n* @param {(...params: Getters<Params>) => {\n* render: () => string\n* setup?: (element: Element) => void | (() => void)\n* }} fn\n* @returns {Snippet<Params>}\n*/\nfunction createRawSnippet(fn) {\n\treturn (renderer, ...args) => {\n\t\tvar getters = args.map((value) => () => value);\n\t\trenderer.push(fn(...getters).render().trim());\n\t};\n}\n//#endregion\n//#region ../../node_modules/.bun/svelte@5.55.9+b050a890ad81aed8/node_modules/svelte/src/index-server.js\n/** @import { SSRContext } from '#server' */\n/** @import { Renderer } from './internal/server/renderer.js' */\nvar index_server_exports = /* @__PURE__ */ __exportAll({\n\tafterUpdate: () => noop,\n\tbeforeUpdate: () => noop,\n\tcreateContext: () => createContext,\n\tcreateEventDispatcher: () => createEventDispatcher,\n\tcreateRawSnippet: () => createRawSnippet,\n\tflushSync: () => noop,\n\tfork: () => fork,\n\tgetAbortSignal: () => getAbortSignal,\n\tgetAllContexts: () => getAllContexts,\n\tgetContext: () => getContext,\n\thasContext: () => hasContext,\n\thydratable: () => hydratable,\n\thydrate: () => hydrate,\n\tmount: () => mount,\n\tonDestroy: () => onDestroy,\n\tonMount: () => noop,\n\tsetContext: () => setContext,\n\tsettled: () => settled,\n\ttick: () => tick,\n\tunmount: () => unmount,\n\tuntrack: () => run\n});\n/** @param {() => void} fn */\nfunction onDestroy(fn) {\n\t/** @type {Renderer} */ ssr_context.r.on_destroy(fn);\n}\nfunction createEventDispatcher() {\n\treturn noop;\n}\nfunction mount() {\n\tlifecycle_function_unavailable(\"mount\");\n}\nfunction hydrate() {\n\tlifecycle_function_unavailable(\"hydrate\");\n}\nfunction unmount() {\n\tlifecycle_function_unavailable(\"unmount\");\n}\nfunction fork() {\n\tlifecycle_function_unavailable(\"fork\");\n}\nasync function tick() {}\nasync function settled() {}\n//#endregion\nexport { hydratable as a, tick as i, onDestroy as n, settled as r, index_server_exports as t };\n","import { _ as unflatten, f as get_message, n as TRAILING_SLASH_PARAM, p as get_status, r as create_remote_key, t as INVALIDATED_PARAM, w as noop } from \"./shared.js\";\nimport { a as add_data_suffix, f as HttpError, m as SvelteKitError, p as Redirect, t as base64_decode } from \"./utils.js\";\nimport { u as base } from \"./environment.js\";\nimport { Z as noop$1, k as writable } from \"./dev.js\";\nimport { f as make_trackable, g as compact, h as noop_span, l as decode_params, p as normalize_path, s as hash, u as decode_pathname } from \"./exports2.js\";\nimport { i as tick$1, r as settled, t as index_server_exports } from \"./index-server.js\";\nimport \"./internal.js\";\nvar STATES_KEY = \"sveltekit:states\";\nvar HISTORY_INDEX = \"sveltekit:history\";\nvar NAVIGATION_INDEX = \"sveltekit:navigation\";\nvar PRELOAD_PRIORITIES = {\n\ttap: 1,\n\thover: 2,\n\tviewport: 3,\n\teager: 4,\n\toff: -1,\n\tfalse: -1\n};\n//#endregion\n//#region ../../node_modules/.bun/@sveltejs+kit@2.61.0+aeb06e9cf8e23ab6/node_modules/@sveltejs/kit/src/runtime/client/utils.js\nvar origin = \"\";\n/** @param {string | URL} url */\nfunction resolve_url(url) {\n\tif (url instanceof URL) return url;\n\tlet baseURI = document.baseURI;\n\tif (!baseURI) {\n\t\tconst baseTags = document.getElementsByTagName(\"base\");\n\t\tbaseURI = baseTags.length ? baseTags[0].href : document.URL;\n\t}\n\treturn new URL(url, baseURI);\n}\nfunction scroll_state() {\n\treturn {\n\t\tx: pageXOffset,\n\t\ty: pageYOffset\n\t};\n}\n({ ...PRELOAD_PRIORITIES }), PRELOAD_PRIORITIES.hover;\n/** @param {any} value */\nfunction notifiable_store(value) {\n\tconst store = writable(value);\n\tlet ready = true;\n\tfunction notify() {\n\t\tready = true;\n\t\tstore.update((val) => val);\n\t}\n\t/** @param {any} new_value */\n\tfunction set(new_value) {\n\t\tready = false;\n\t\tstore.set(new_value);\n\t}\n\t/** @param {(value: any) => void} run */\n\tfunction subscribe(run) {\n\t\t/** @type {any} */\n\t\tlet old_value;\n\t\treturn store.subscribe((new_value) => {\n\t\t\tif (old_value === void 0 || ready && new_value !== old_value) run(old_value = new_value);\n\t\t});\n\t}\n\treturn {\n\t\tnotify,\n\t\tset,\n\t\tsubscribe\n\t};\n}\nvar updated_listener = { v: noop };\nfunction create_updated_store() {\n\tconst { set, subscribe } = writable(false);\n\treturn {\n\t\tsubscribe,\n\t\tcheck: async () => false\n\t};\n}\n/**\n* Is external if\n* - origin different\n* - path doesn't start with base\n* - uses hash router and pathname is more than base\n* @param {URL} url\n* @param {string} base\n* @param {boolean} hash_routing\n*/\nfunction is_external_url(url, base, hash_routing) {\n\tif (url.origin !== origin || !url.pathname.startsWith(base)) return true;\n\tif (hash_routing) return url.pathname !== location.pathname;\n\treturn false;\n}\n//#endregion\n//#region ../../node_modules/.bun/@sveltejs+kit@2.61.0+aeb06e9cf8e23ab6/node_modules/@sveltejs/kit/src/runtime/client/state.svelte.js\nvar page;\nvar navigating;\nvar updated;\nvar is_legacy = noop$1.toString().includes(\"$$\") || /function \\w+\\(\\) \\{\\}/.test(noop$1.toString());\nvar placeholder_url = \"a:\";\nif (is_legacy) {\n\tpage = {\n\t\tdata: {},\n\t\tform: null,\n\t\terror: null,\n\t\tparams: {},\n\t\troute: { id: null },\n\t\tstate: {},\n\t\tstatus: -1,\n\t\turl: new URL(placeholder_url)\n\t};\n\tnavigating = { current: null };\n\tupdated = { current: false };\n} else {\n\tpage = new class Page {\n\t\tdata = {};\n\t\tform = null;\n\t\terror = null;\n\t\tparams = {};\n\t\troute = { id: null };\n\t\tstate = {};\n\t\tstatus = -1;\n\t\turl = new URL(placeholder_url);\n\t}();\n\tnavigating = new class Navigating {\n\t\tcurrent = null;\n\t}();\n\tupdated = new class Updated {\n\t\tcurrent = false;\n\t}();\n\tupdated_listener.v = () => updated.current = true;\n}\n/**\n* @param {import('@sveltejs/kit').Page} new_page\n*/\nfunction update(new_page) {\n\tObject.assign(page, new_page);\n}\nvar cache = /* @__PURE__ */ new Map();\n/**\n* Should be called on the initial run of load functions that hydrate the page.\n* Saves any requests with cache-control max-age to the cache.\n* @param {URL | string} resource\n* @param {RequestInit} [opts]\n*/\nfunction initial_fetch(resource, opts) {\n\tconst selector = build_selector(resource, opts);\n\tconst script = document.querySelector(selector);\n\tif (script?.textContent) {\n\t\tscript.remove();\n\t\tlet { body, ...init } = JSON.parse(script.textContent);\n\t\tconst ttl = script.getAttribute(\"data-ttl\");\n\t\tif (ttl) cache.set(selector, {\n\t\t\tbody,\n\t\t\tinit,\n\t\t\tttl: 1e3 * Number(ttl)\n\t\t});\n\t\tif (script.getAttribute(\"data-b64\") !== null) body = base64_decode(body);\n\t\treturn Promise.resolve(new Response(body, init));\n\t}\n\treturn window.fetch(resource, opts);\n}\n/**\n* Tries to get the response from the cache, if max-age allows it, else does a fetch.\n* @param {URL | string} resource\n* @param {string} resolved\n* @param {RequestInit} [opts]\n*/\nfunction subsequent_fetch(resource, resolved, opts) {\n\tif (cache.size > 0) {\n\t\tconst selector = build_selector(resource, opts);\n\t\tconst cached = cache.get(selector);\n\t\tif (cached) {\n\t\t\tif (performance.now() < cached.ttl && [\n\t\t\t\t\"default\",\n\t\t\t\t\"force-cache\",\n\t\t\t\t\"only-if-cached\",\n\t\t\t\tvoid 0\n\t\t\t].includes(opts?.cache)) return new Response(cached.body, cached.init);\n\t\t\tcache.delete(selector);\n\t\t}\n\t}\n\treturn window.fetch(resolved, opts);\n}\n/**\n* Build the cache key for a given request\n* @param {URL | RequestInfo} resource\n* @param {RequestInit} [opts]\n*/\nfunction build_selector(resource, opts) {\n\tlet selector = `script[data-sveltekit-fetched][data-url=${JSON.stringify(resource instanceof Request ? resource.url : resource)}]`;\n\tif (opts?.headers || opts?.body) {\n\t\t/** @type {import('types').StrictBody[]} */\n\t\tconst values = [];\n\t\tif (opts.headers) values.push([...new Headers(opts.headers)].join(\",\"));\n\t\tif (opts.body && (typeof opts.body === \"string\" || ArrayBuffer.isView(opts.body))) values.push(opts.body);\n\t\tselector += `[data-hash=\"${hash(...values)}\"]`;\n\t}\n\treturn selector;\n}\n//#endregion\n//#region ../../node_modules/.bun/@sveltejs+kit@2.61.0+aeb06e9cf8e23ab6/node_modules/@sveltejs/kit/src/runtime/client/session-storage.js\n/**\n* Read a value from `sessionStorage`\n* @param {string} key\n* @param {(value: string) => any} parse\n*/\n/* @__NO_SIDE_EFFECTS__ */\nfunction get(key, parse = JSON.parse) {\n\ttry {\n\t\treturn parse(sessionStorage[key]);\n\t} catch {}\n}\n//#endregion\n//#region ../../node_modules/.bun/@sveltejs+kit@2.61.0+aeb06e9cf8e23ab6/node_modules/@sveltejs/kit/src/runtime/client/ndjson.js\n/**\n* Yields parsed JSON objects from a ReadableStream of newline-delimited JSON.\n* Each yielded value is the raw `JSON.parse`'d object — callers handle deserialization.\n* @param {ReadableStreamDefaultReader<Uint8Array>} reader\n*/\nasync function* read_ndjson(reader) {\n\tlet done = false;\n\tlet buffer = \"\";\n\tconst decoder = new TextDecoder();\n\twhile (true) {\n\t\tlet split = buffer.indexOf(\"\\n\");\n\t\twhile (split !== -1) {\n\t\t\tconst line = buffer.slice(0, split).trim();\n\t\t\tbuffer = buffer.slice(split + 1);\n\t\t\tif (line) yield JSON.parse(line);\n\t\t\tsplit = buffer.indexOf(\"\\n\");\n\t\t}\n\t\tif (done) {\n\t\t\tconst line = buffer.trim();\n\t\t\tif (line) yield JSON.parse(line);\n\t\t\treturn;\n\t\t}\n\t\tconst chunk = await reader.read();\n\t\tdone = chunk.done;\n\t\tif (chunk.value) buffer += decoder.decode(chunk.value, { stream: true });\n\t\tif (done) buffer += decoder.decode();\n\t}\n}\n//#endregion\n//#region ../../node_modules/.bun/@sveltejs+kit@2.61.0+aeb06e9cf8e23ab6/node_modules/@sveltejs/kit/src/runtime/client/client.js\n/** @import { CacheEntry } from './remote-functions/cache.svelte.js' */\n/** @import { Query } from './remote-functions/query/instance.svelte.js' */\n/** @import { LiveQuery } from './remote-functions/query-live/instance.svelte.js' */\nvar { onMount, tick } = index_server_exports;\n/**\n* Set via transformError, reset and read at the end of navigate.\n* Necessary because a navigation might succeed loading but during rendering\n* an error occurs, at which point the navigation result needs to be overridden with the error result.\n* TODO this is all very hacky, rethink for SvelteKit 3 where we can assume Svelte 5 and do an overhaul of client.js\n* @type {{ error: App.Error, status: number } | null}\n*/\nvar rendering_error = null;\n/**\n* history index -> { x, y }\n* @type {Record<number, { x: number; y: number }>}\n*/\nvar scroll_positions = /* @__PURE__ */ get(\"sveltekit:scroll\") ?? {};\n/**\n* navigation index -> any\n* @type {Record<string, any[]>}\n*/\nvar snapshots = /* @__PURE__ */ get(\"sveltekit:snapshot\") ?? {};\nvar stores = {\n\turl: /* @__PURE__ */ notifiable_store({}),\n\tpage: /* @__PURE__ */ notifiable_store({}),\n\tnavigating: /* @__PURE__ */ writable(null),\n\tupdated: /* @__PURE__ */ create_updated_store()\n};\n/** @param {number} index */\nfunction update_scroll_positions(index) {\n\tscroll_positions[index] = scroll_state();\n}\n/**\n* @param {number} current_history_index\n* @param {number} current_navigation_index\n*/\nfunction clear_onward_history(current_history_index, current_navigation_index) {\n\tlet i = current_history_index + 1;\n\twhile (scroll_positions[i]) {\n\t\tdelete scroll_positions[i];\n\t\ti += 1;\n\t}\n\ti = current_navigation_index + 1;\n\twhile (snapshots[i]) {\n\t\tdelete snapshots[i];\n\t\ti += 1;\n\t}\n}\n/**\n* Loads `href` the old-fashioned way, with a full page reload.\n* Returns a `Promise` that never resolves (to prevent any\n* subsequent work, e.g. history manipulation, from happening)\n* @param {URL} url\n* @param {boolean} [replace] If `true`, will replace the current `history` entry rather than creating a new one with `pushState`\n*/\nfunction native_navigation(url, replace = false) {\n\tif (replace) location.replace(url.href);\n\telse location.href = url.href;\n\treturn new Promise(noop);\n}\n/**\n* Checks whether a service worker is registered, and if it is,\n* tries to update it.\n*/\nasync function update_service_worker() {\n\tif (\"serviceWorker\" in navigator) {\n\t\tconst registration = await navigator.serviceWorker.getRegistration(base || \"/\");\n\t\tif (registration) await registration.update();\n\t}\n}\n/** @type {import('types').CSRRoute[]} All routes of the app. Only available when kit.router.resolution=client */\nvar routes;\n/** @type {import('types').CSRPageNodeLoader} */\nvar default_layout_loader;\n/** @type {import('types').CSRPageNodeLoader} */\nvar default_error_loader;\n/** @type {HTMLElement} */\nvar target;\n/** @type {import('./types.js').SvelteKitApp} */\nvar app;\n/** @type {Array<((url: URL) => boolean)>} */\nvar invalidated = [];\n/**\n* An array of the `+layout.svelte` and `+page.svelte` component instances\n* that currently live on the page — used for capturing and restoring snapshots.\n* It's updated/manipulated through `bind:this` in `Root.svelte`.\n* @type {import('svelte').SvelteComponent[]}\n*/\nvar components = [];\n/** @type {{id: string, token: {}, promise: Promise<import('./types.js').NavigationResult>, fork: Promise<import('svelte').Fork | null> | null} | null} */\nvar load_cache = null;\nfunction discard_load_cache() {\n\tload_cache?.fork?.then((f) => f?.discard());\n\tload_cache = null;\n}\n/**\n* @type {Map<string, Promise<URL>>}\n* Cache for client-side rerouting, since it could contain async calls which we want to\n* avoid running multiple times which would slow down navigations (e.g. else preloading\n* wouldn't help because on navigation it would be called again). Since `reroute` should be\n* a pure function (i.e. always return the same) value it's safe to cache across navigations.\n* The server reroute calls don't need to be cached because they are called using `import(...)`\n* which is cached per the JS spec.\n*/\nvar reroute_cache = /* @__PURE__ */ new Map();\n/**\n* Note on before_navigate_callbacks, on_navigate_callbacks and after_navigate_callbacks:\n* do not re-assign as some closures keep references to these Sets\n*/\n/** @type {Set<(navigation: import('@sveltejs/kit').BeforeNavigate) => void>} */\nvar before_navigate_callbacks = /* @__PURE__ */ new Set();\n/** @type {Set<(navigation: import('@sveltejs/kit').OnNavigate) => import('types').MaybePromise<(() => void) | void>>} */\nvar on_navigate_callbacks = /* @__PURE__ */ new Set();\n/** @type {Set<(navigation: import('@sveltejs/kit').AfterNavigate) => void>} */\nvar after_navigate_callbacks = /* @__PURE__ */ new Set();\n/** @type {import('./types.js').NavigationState & { nav: import('@sveltejs/kit').NavigationEvent }} */\nvar current = {\n\tbranch: [],\n\terror: null,\n\turl: null,\n\tnav: null\n};\n/** this being true means we SSR'd */\nvar hydrated = false;\nvar started = false;\nvar autoscroll = true;\nvar is_navigating = false;\nvar force_invalidation = false;\n/** @type {import('svelte').SvelteComponent} */\nvar root;\n/** @type {number} keeping track of the history index in order to prevent popstate navigation events if needed */\nvar current_history_index;\n/** @type {number} */\nvar current_navigation_index;\n/** @type {{}} */\nvar token;\n/**\n* A set of tokens which are associated to current preloads.\n* If a preload becomes a real navigation, it's removed from the set.\n* If a preload token is in the set and the preload errors, the error\n* handling logic (for example reloading) is skipped.\n*/\nvar preload_tokens = /* @__PURE__ */ new Set();\n/**\n* @type {Map<string, Map<string, CacheEntry<Query<any>>>>}\n* A map of query id -> payload -> query internals for all active queries.\n*/\nvar query_map = /* @__PURE__ */ new Map();\n/**\n* @type {Map<string, Map<string, CacheEntry<LiveQuery<any>>>>}\n* A map of id -> payload -> live query internals for all active queries.\n*/\nvar live_query_map = /* @__PURE__ */ new Map();\nfunction reset_invalidation() {\n\tinvalidated.length = 0;\n\tforce_invalidation = false;\n}\n/** @param {number} index */\nfunction capture_snapshot(index) {\n\tif (components.some((c) => c?.snapshot)) snapshots[index] = components.map((c) => c?.snapshot?.capture());\n}\n/** @param {number} index */\nfunction restore_snapshot(index) {\n\tsnapshots[index]?.forEach((value, i) => {\n\t\tcomponents[i]?.snapshot?.restore(value);\n\t});\n}\n/**\n* @param {string | URL} url\n* @param {{ replaceState?: boolean; noScroll?: boolean; keepFocus?: boolean; invalidateAll?: boolean; invalidate?: Array<string | URL | ((url: URL) => boolean)>; state?: Record<string, any> }} options\n* @param {number} redirect_count\n* @param {{}} [nav_token]\n*/\nasync function _goto(url, options, redirect_count, nav_token) {\n\t/** @type {Set<string>} */\n\tlet query_keys;\n\t/** @type {Set<string>} */\n\tlet live_query_keys;\n\tif (options.invalidateAll) discard_load_cache();\n\tawait navigate({\n\t\ttype: \"goto\",\n\t\turl: resolve_url(url),\n\t\tkeepfocus: options.keepFocus,\n\t\tnoscroll: options.noScroll,\n\t\treplace_state: options.replaceState,\n\t\tstate: options.state,\n\t\tredirect_count,\n\t\tnav_token,\n\t\taccept: () => {\n\t\t\tif (options.invalidateAll) {\n\t\t\t\tforce_invalidation = true;\n\t\t\t\tquery_keys = /* @__PURE__ */ new Set();\n\t\t\t\tfor (const [id, entries] of query_map) for (const payload of entries.keys()) query_keys.add(create_remote_key(id, payload));\n\t\t\t\tlive_query_keys = /* @__PURE__ */ new Set();\n\t\t\t\tfor (const [id, entries] of live_query_map) for (const payload of entries.keys()) live_query_keys.add(create_remote_key(id, payload));\n\t\t\t}\n\t\t\tif (options.invalidate) options.invalidate.forEach(push_invalidated);\n\t\t}\n\t});\n\tif (options.invalidateAll) tick$1().then(tick$1).then(() => {\n\t\tfor (const [id, entries] of query_map) for (const [payload, { resource }] of entries) if (query_keys?.has(create_remote_key(id, payload))) resource.refresh();\n\t\tfor (const [id, entries] of live_query_map) for (const [payload, { resource }] of entries) if (live_query_keys?.has(create_remote_key(id, payload))) resource.reconnect();\n\t});\n}\n/**\n* @param {import('./types.js').NavigationFinished} result\n* @param {HTMLElement} target\n* @param {boolean} hydrate\n*/\nasync function initialize(result, target, hydrate) {\n\t/** @type {import('@sveltejs/kit').NavigationEvent} */\n\tconst nav = {\n\t\tparams: current.params,\n\t\troute: { id: current.route?.id ?? null },\n\t\turl: new URL(location.href)\n\t};\n\tcurrent = {\n\t\t...result.state,\n\t\tnav\n\t};\n\tupdate(result.props.page);\n\troot = new app.root({\n\t\ttarget,\n\t\tprops: {\n\t\t\t...result.props,\n\t\t\tstores,\n\t\t\tcomponents\n\t\t},\n\t\thydrate,\n\t\tsync: false,\n\t\ttransformError: void 0\n\t});\n\tawait Promise.resolve();\n\trestore_snapshot(current_navigation_index);\n\tif (hydrate) {\n\t\t/** @type {import('@sveltejs/kit').AfterNavigate} */\n\t\tconst navigation = {\n\t\t\tfrom: null,\n\t\t\tto: {\n\t\t\t\t...nav,\n\t\t\t\tscroll: scroll_positions[current_history_index] ?? scroll_state()\n\t\t\t},\n\t\t\twillUnload: false,\n\t\t\ttype: \"enter\",\n\t\t\tcomplete: Promise.resolve()\n\t\t};\n\t\tafter_navigate_callbacks.forEach((fn) => fn(navigation));\n\t}\n\tstarted = true;\n}\n/**\n*\n* @param {{\n* url: URL;\n* params: Record<string, string>;\n* branch: Array<import('./types.js').BranchNode | undefined>;\n* errors?: Array<import('types').CSRPageNodeLoader | undefined>;\n* status: number;\n* error: App.Error | null;\n* route: import('types').CSRRoute | null;\n* form?: Record<string, any> | null;\n* }} opts\n*/\nasync function get_navigation_result_from_branch({ url, params, branch, errors, status, error, route, form }) {\n\t/** @type {import('types').TrailingSlash} */\n\tlet slash = \"never\";\n\tif (base && (url.pathname === base || url.pathname === base + \"/\")) slash = \"always\";\n\telse for (const node of branch) if (node?.slash !== void 0) slash = node.slash;\n\turl.pathname = normalize_path(url.pathname, slash);\n\turl.search = url.search;\n\t/** @type {import('./types.js').NavigationFinished} */\n\tconst result = {\n\t\ttype: \"loaded\",\n\t\tstate: {\n\t\t\turl,\n\t\t\tparams,\n\t\t\tbranch,\n\t\t\terror,\n\t\t\troute\n\t\t},\n\t\tprops: {\n\t\t\tconstructors: compact(branch).map((branch_node) => branch_node.node.component),\n\t\t\tpage: clone_page(page)\n\t\t}\n\t};\n\tif (form !== void 0) result.props.form = form;\n\tlet data = {};\n\tlet data_changed = !page;\n\tlet p = 0;\n\tfor (let i = 0; i < Math.max(branch.length, current.branch.length); i += 1) {\n\t\tconst node = branch[i];\n\t\tconst prev = current.branch[i];\n\t\tif (node?.data !== prev?.data) data_changed = true;\n\t\tif (!node) continue;\n\t\tdata = {\n\t\t\t...data,\n\t\t\t...node.data\n\t\t};\n\t\tif (data_changed) result.props[`data_${p}`] = data;\n\t\tp += 1;\n\t}\n\tif (!current.url || url.href !== current.url.href || current.error !== error || form !== void 0 && form !== page.form || data_changed) result.props.page = {\n\t\terror,\n\t\tparams,\n\t\troute: { id: route?.id ?? null },\n\t\tstate: {},\n\t\tstatus,\n\t\turl: new URL(url),\n\t\tform: form ?? null,\n\t\tdata: data_changed ? data : page.data\n\t};\n\treturn result;\n}\n/**\n* Call the universal load function of the given node, if it exists.\n*\n* @param {{\n* loader: import('types').CSRPageNodeLoader;\n* \t parent: () => Promise<Record<string, any>>;\n* url: URL;\n* params: Record<string, string>;\n* route: { id: string | null };\n* \t server_data_node: import('./types.js').DataNode | null;\n* }} options\n* @returns {Promise<import('./types.js').BranchNode>}\n*/\nasync function load_node({ loader, parent, url, params, route, server_data_node }) {\n\t/** @type {Record<string, any> | null} */\n\tlet data = null;\n\tlet is_tracking = true;\n\t/** @type {import('types').Uses} */\n\tconst uses = {\n\t\tdependencies: /* @__PURE__ */ new Set(),\n\t\tparams: /* @__PURE__ */ new Set(),\n\t\tparent: false,\n\t\troute: false,\n\t\turl: false,\n\t\tsearch_params: /* @__PURE__ */ new Set()\n\t};\n\tconst node = await loader();\n\tif (node.universal?.load) {\n\t\t/** @param {string[]} deps */\n\t\tfunction depends(...deps) {\n\t\t\tfor (const dep of deps) {\n\t\t\t\tconst { href } = new URL(dep, url);\n\t\t\t\tuses.dependencies.add(href);\n\t\t\t}\n\t\t}\n\t\t/** @type {import('@sveltejs/kit').LoadEvent} */\n\t\tconst load_input = {\n\t\t\ttracing: {\n\t\t\t\tenabled: false,\n\t\t\t\troot: noop_span,\n\t\t\t\tcurrent: noop_span\n\t\t\t},\n\t\t\troute: new Proxy(route, { get: (target, key) => {\n\t\t\t\tif (is_tracking) uses.route = true;\n\t\t\t\treturn target[key];\n\t\t\t} }),\n\t\t\tparams: new Proxy(params, { get: (target, key) => {\n\t\t\t\tif (is_tracking) uses.params.add(key);\n\t\t\t\treturn target[key];\n\t\t\t} }),\n\t\t\tdata: server_data_node?.data ?? null,\n\t\t\turl: make_trackable(url, () => {\n\t\t\t\tif (is_tracking) uses.url = true;\n\t\t\t}, (param) => {\n\t\t\t\tif (is_tracking) uses.search_params.add(param);\n\t\t\t}, app.hash),\n\t\t\tasync fetch(resource, init) {\n\t\t\t\tif (resource instanceof Request) init = {\n\t\t\t\t\tbody: resource.method === \"GET\" || resource.method === \"HEAD\" ? void 0 : await resource.blob(),\n\t\t\t\t\tcache: resource.cache,\n\t\t\t\t\tcredentials: resource.credentials,\n\t\t\t\t\theaders: [...resource.headers].length > 0 ? resource?.headers : void 0,\n\t\t\t\t\tintegrity: resource.integrity,\n\t\t\t\t\tkeepalive: resource.keepalive,\n\t\t\t\t\tmethod: resource.method,\n\t\t\t\t\tmode: resource.mode,\n\t\t\t\t\tredirect: resource.redirect,\n\t\t\t\t\treferrer: resource.referrer,\n\t\t\t\t\treferrerPolicy: resource.referrerPolicy,\n\t\t\t\t\tsignal: resource.signal,\n\t\t\t\t\t...init\n\t\t\t\t};\n\t\t\t\tconst { resolved, promise } = resolve_fetch_url(resource, init, url);\n\t\t\t\tif (is_tracking) depends(resolved.href);\n\t\t\t\treturn promise;\n\t\t\t},\n\t\t\tsetHeaders: noop,\n\t\t\tdepends,\n\t\t\tparent() {\n\t\t\t\tif (is_tracking) uses.parent = true;\n\t\t\t\treturn parent();\n\t\t\t},\n\t\t\tuntrack(fn) {\n\t\t\t\tis_tracking = false;\n\t\t\t\ttry {\n\t\t\t\t\treturn fn();\n\t\t\t\t} finally {\n\t\t\t\t\tis_tracking = true;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tdata = await node.universal.load.call(null, load_input) ?? null;\n\t}\n\treturn {\n\t\tnode,\n\t\tloader,\n\t\tserver: server_data_node,\n\t\tuniversal: node.universal?.load ? {\n\t\t\ttype: \"data\",\n\t\t\tdata,\n\t\t\tuses\n\t\t} : null,\n\t\tdata: data ?? server_data_node?.data ?? null,\n\t\tslash: node.universal?.trailingSlash ?? server_data_node?.slash\n\t};\n}\n/**\n* @param {Request | string | URL} input\n* @param {RequestInit | undefined} init\n* @param {URL} url\n*/\nfunction resolve_fetch_url(input, init, url) {\n\tlet requested = input instanceof Request ? input.url : input;\n\tconst resolved = new URL(requested, url);\n\tif (resolved.origin === url.origin) requested = resolved.href.slice(url.origin.length);\n\treturn {\n\t\tresolved,\n\t\tpromise: started ? subsequent_fetch(requested, resolved.href, init) : initial_fetch(requested, init)\n\t};\n}\n/**\n* @param {boolean} parent_changed\n* @param {boolean} route_changed\n* @param {boolean} url_changed\n* @param {Set<string>} search_params_changed\n* @param {import('types').Uses | undefined} uses\n* @param {Record<string, string>} params\n*/\nfunction has_changed(parent_changed, route_changed, url_changed, search_params_changed, uses, params) {\n\tif (force_invalidation) return true;\n\tif (!uses) return false;\n\tif (uses.parent && parent_changed) return true;\n\tif (uses.route && route_changed) return true;\n\tif (uses.url && url_changed) return true;\n\tfor (const tracked_params of uses.search_params) if (search_params_changed.has(tracked_params)) return true;\n\tfor (const param of uses.params) if (params[param] !== current.params[param]) return true;\n\tfor (const href of uses.dependencies) if (invalidated.some((fn) => fn(new URL(href)))) return true;\n\treturn false;\n}\n/**\n* @param {import('types').ServerDataNode | import('types').ServerDataSkippedNode | null} node\n* @param {import('./types.js').DataNode | null} [previous]\n* @returns {import('./types.js').DataNode | null}\n*/\nfunction create_data_node(node, previous) {\n\tif (node?.type === \"data\") return node;\n\tif (node?.type === \"skip\") return previous ?? null;\n\treturn null;\n}\n/**\n* @param {URL | null} old_url\n* @param {URL} new_url\n*/\nfunction diff_search_params(old_url, new_url) {\n\tif (!old_url) return new Set(new_url.searchParams.keys());\n\tconst changed = new Set([...old_url.searchParams.keys(), ...new_url.searchParams.keys()]);\n\tfor (const key of changed) {\n\t\tconst old_values = old_url.searchParams.getAll(key);\n\t\tconst new_values = new_url.searchParams.getAll(key);\n\t\tif (old_values.every((value) => new_values.includes(value)) && new_values.every((value) => old_values.includes(value))) changed.delete(key);\n\t}\n\treturn changed;\n}\n/**\n* @param {Omit<import('./types.js').NavigationFinished['state'], 'branch'> & { error: App.Error }} opts\n* @returns {import('./types.js').NavigationFinished}\n*/\nfunction preload_error({ error, url, route, params }) {\n\treturn {\n\t\ttype: \"loaded\",\n\t\tstate: {\n\t\t\terror,\n\t\t\turl,\n\t\t\troute,\n\t\t\tparams,\n\t\t\tbranch: []\n\t\t},\n\t\tprops: {\n\t\t\tpage: clone_page(page),\n\t\t\tconstructors: []\n\t\t}\n\t};\n}\n/**\n* @param {import('./types.js').NavigationIntent & { preload?: {} }} intent\n* @returns {Promise<import('./types.js').NavigationResult>}\n*/\nasync function load_route({ id, invalidating, url, params, route, preload }) {\n\tif (load_cache?.id === id) {\n\t\tpreload_tokens.delete(load_cache.token);\n\t\treturn load_cache.promise;\n\t}\n\tconst { errors, layouts, leaf } = route;\n\tconst loaders = [...layouts, leaf];\n\terrors.forEach((loader) => loader?.().catch(noop));\n\tloaders.forEach((loader) => loader?.[1]().catch(noop));\n\t/** @type {import('types').ServerNodesResponse | import('types').ServerRedirectNode | null} */\n\tlet server_data = null;\n\tconst url_changed = current.url ? id !== get_page_key(current.url) : false;\n\tconst route_changed = current.route ? route.id !== current.route.id : false;\n\tconst search_params_changed = diff_search_params(current.url, url);\n\tlet parent_invalid = false;\n\t{\n\t\tconst invalid_server_nodes = loaders.map((loader, i) => {\n\t\t\tconst previous = current.branch[i];\n\t\t\tconst invalid = !!loader?.[0] && (previous?.loader !== loader[1] || has_changed(parent_invalid, route_changed, url_changed, search_params_changed, previous.server?.uses, params));\n\t\t\tif (invalid) parent_invalid = true;\n\t\t\treturn invalid;\n\t\t});\n\t\tif (invalid_server_nodes.some(Boolean)) {\n\t\t\ttry {\n\t\t\t\tserver_data = await load_data(url, invalid_server_nodes);\n\t\t\t} catch (error) {\n\t\t\t\tconst handled_error = await handle_error(error, {\n\t\t\t\t\turl,\n\t\t\t\t\tparams,\n\t\t\t\t\troute: { id }\n\t\t\t\t});\n\t\t\t\tif (preload_tokens.has(preload)) return preload_error({\n\t\t\t\t\terror: handled_error,\n\t\t\t\t\turl,\n\t\t\t\t\tparams,\n\t\t\t\t\troute\n\t\t\t\t});\n\t\t\t\treturn load_root_error_page({\n\t\t\t\t\tstatus: get_status(error),\n\t\t\t\t\terror: handled_error,\n\t\t\t\t\turl,\n\t\t\t\t\troute\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (server_data.type === \"redirect\") return server_data;\n\t\t}\n\t}\n\tconst server_data_nodes = server_data?.nodes;\n\tlet parent_changed = false;\n\tconst branch_promises = loaders.map(async (loader, i) => {\n\t\tif (!loader) return;\n\t\t/** @type {import('./types.js').BranchNode | undefined} */\n\t\tconst previous = current.branch[i];\n\t\tconst server_data_node = server_data_nodes?.[i];\n\t\tif ((!server_data_node || server_data_node.type === \"skip\") && loader[1] === previous?.loader && !has_changed(parent_changed, route_changed, url_changed, search_params_changed, previous.universal?.uses, params)) return previous;\n\t\tparent_changed = true;\n\t\tif (server_data_node?.type === \"error\") throw server_data_node;\n\t\treturn load_node({\n\t\t\tloader: loader[1],\n\t\t\turl,\n\t\t\tparams,\n\t\t\troute,\n\t\t\tparent: async () => {\n\t\t\t\tconst data = {};\n\t\t\t\tfor (let j = 0; j < i; j += 1) Object.assign(data, (await branch_promises[j])?.data);\n\t\t\t\treturn data;\n\t\t\t},\n\t\t\tserver_data_node: create_data_node(server_data_node === void 0 && loader[0] ? { type: \"skip\" } : server_data_node ?? null, loader[0] ? previous?.server : void 0)\n\t\t});\n\t});\n\tfor (const p of branch_promises) p.catch(noop);\n\t/** @type {Array<import('./types.js').BranchNode | undefined>} */\n\tconst branch = [];\n\tfor (let i = 0; i < loaders.length; i += 1) if (loaders[i]) try {\n\t\tbranch.push(await branch_promises[i]);\n\t} catch (err) {\n\t\tif (err instanceof Redirect) return {\n\t\t\ttype: \"redirect\",\n\t\t\tlocation: err.location\n\t\t};\n\t\tif (preload_tokens.has(preload)) return preload_error({\n\t\t\terror: await handle_error(err, {\n\t\t\t\tparams,\n\t\t\t\turl,\n\t\t\t\troute: { id: route.id }\n\t\t\t}),\n\t\t\turl,\n\t\t\tparams,\n\t\t\troute\n\t\t});\n\t\tlet status = get_status(err);\n\t\t/** @type {App.Error} */\n\t\tlet error;\n\t\tif (server_data_nodes?.includes(err)) {\n\t\t\tstatus = err.status ?? status;\n\t\t\terror = err.error;\n\t\t} else if (err instanceof HttpError) error = err.body;\n\t\telse {\n\t\t\tif (await stores.updated.check()) {\n\t\t\t\tawait update_service_worker();\n\t\t\t\treturn await native_navigation(url);\n\t\t\t}\n\t\t\terror = await handle_error(err, {\n\t\t\t\tparams,\n\t\t\t\turl,\n\t\t\t\troute: { id: route.id }\n\t\t\t});\n\t\t}\n\t\tconst error_load = await load_nearest_error_page(i, branch, errors);\n\t\tif (error_load) return get_navigation_result_from_branch({\n\t\t\turl,\n\t\t\tparams,\n\t\t\tbranch: branch.slice(0, error_load.idx).concat(error_load.node),\n\t\t\terrors,\n\t\t\tstatus,\n\t\t\terror,\n\t\t\troute\n\t\t});\n\t\telse return await server_fallback(url, { id: route.id }, error, status);\n\t}\n\telse branch.push(void 0);\n\treturn get_navigation_result_from_branch({\n\t\turl,\n\t\tparams,\n\t\tbranch,\n\t\terrors,\n\t\tstatus: 200,\n\t\terror: null,\n\t\troute,\n\t\tform: invalidating ? void 0 : null\n\t});\n}\n/**\n* @param {number} i Start index to backtrack from\n* @param {Array<import('./types.js').BranchNode | undefined>} branch Branch to backtrack\n* @param {Array<import('types').CSRPageNodeLoader | undefined>} errors All error pages for this branch\n* @returns {Promise<{idx: number; node: import('./types.js').BranchNode} | undefined>}\n*/\nasync function load_nearest_error_page(i, branch, errors) {\n\twhile (i--) if (errors[i]) {\n\t\tlet j = i;\n\t\twhile (!branch[j]) j -= 1;\n\t\ttry {\n\t\t\treturn {\n\t\t\t\tidx: j + 1,\n\t\t\t\tnode: {\n\t\t\t\t\tnode: await errors[i](),\n\t\t\t\t\tloader: errors[i],\n\t\t\t\t\tdata: {},\n\t\t\t\t\tserver: null,\n\t\t\t\t\tuniversal: null\n\t\t\t\t}\n\t\t\t};\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t}\n}\n/**\n* @param {{\n* status: number;\n* error: App.Error;\n* url: URL;\n* route: { id: string | null }\n* }} opts\n* @returns {Promise<import('./types.js').NavigationFinished>}\n*/\nasync function load_root_error_page({ status, error, url, route }) {\n\t/** @type {Record<string, string>} */\n\tconst params = {};\n\t/** @type {import('types').ServerDataNode | null} */\n\tlet server_data_node = null;\n\tif (app.server_loads[0] === 0) try {\n\t\tconst server_data = await load_data(url, [true]);\n\t\tif (server_data.type !== \"data\" || server_data.nodes[0] && server_data.nodes[0].type !== \"data\") throw 0;\n\t\tserver_data_node = server_data.nodes[0] ?? null;\n\t} catch {\n\t\tif (url.origin !== origin || url.pathname !== location.pathname || hydrated) await native_navigation(url);\n\t}\n\ttry {\n\t\treturn get_navigation_result_from_branch({\n\t\t\turl,\n\t\t\tparams,\n\t\t\tbranch: [await load_node({\n\t\t\t\tloader: default_layout_loader,\n\t\t\t\turl,\n\t\t\t\tparams,\n\t\t\t\troute,\n\t\t\t\tparent: () => Promise.resolve({}),\n\t\t\t\tserver_data_node: create_data_node(server_data_node)\n\t\t\t}), {\n\t\t\t\tnode: await default_error_loader(),\n\t\t\t\tloader: default_error_loader,\n\t\t\t\tuniversal: null,\n\t\t\t\tserver: null,\n\t\t\t\tdata: null\n\t\t\t}],\n\t\t\tstatus,\n\t\t\terror,\n\t\t\terrors: [],\n\t\t\troute: null\n\t\t});\n\t} catch (error) {\n\t\tif (error instanceof Redirect) return _goto(new URL(error.location, location.href), {}, 0);\n\t\tthrow error;\n\t}\n}\n/**\n* Resolve the relative rerouted URL for a client-side navigation\n* @param {URL} url\n* @returns {Promise<URL | undefined>}\n*/\nasync function get_rerouted_url(url) {\n\tconst href = url.href;\n\tif (reroute_cache.has(href)) return reroute_cache.get(href);\n\tlet rerouted;\n\ttry {\n\t\tconst promise = (async () => {\n\t\t\tlet rerouted = await app.hooks.reroute({\n\t\t\t\turl: new URL(url),\n\t\t\t\tfetch: async (input, init) => {\n\t\t\t\t\treturn resolve_fetch_url(input, init, url).promise;\n\t\t\t\t}\n\t\t\t}) ?? url;\n\t\t\tif (typeof rerouted === \"string\") {\n\t\t\t\tconst tmp = new URL(url);\n\t\t\t\tif (app.hash) tmp.hash = rerouted;\n\t\t\t\telse tmp.pathname = rerouted;\n\t\t\t\trerouted = tmp;\n\t\t\t}\n\t\t\treturn rerouted;\n\t\t})();\n\t\treroute_cache.set(href, promise);\n\t\trerouted = await promise;\n\t} catch (e) {\n\t\treroute_cache.delete(href);\n\t\treturn;\n\t}\n\treturn rerouted;\n}\n/**\n* Resolve the full info (which route, params, etc.) for a client-side navigation from the URL,\n* taking the reroute hook into account. If this isn't a client-side-navigation (or the URL is undefined),\n* returns undefined.\n* @param {URL | undefined} url\n* @param {boolean} invalidating\n* @returns {Promise<import('./types.js').NavigationIntent | undefined>}\n*/\nasync function get_navigation_intent(url, invalidating) {\n\tif (!url) return;\n\tif (is_external_url(url, base, app.hash)) return;\n\t{\n\t\tconst rerouted = await get_rerouted_url(url);\n\t\tif (!rerouted) return;\n\t\tconst path = get_url_path(rerouted);\n\t\tfor (const route of routes) {\n\t\t\tconst params = route.exec(path);\n\t\t\tif (params) return {\n\t\t\t\tid: get_page_key(url),\n\t\t\t\tinvalidating,\n\t\t\t\troute,\n\t\t\t\tparams: decode_params(params),\n\t\t\t\turl\n\t\t\t};\n\t\t}\n\t}\n}\n/** @param {URL} url */\nfunction get_url_path(url) {\n\treturn decode_pathname(app.hash ? url.hash.replace(/^#/, \"\").replace(/[?#].+/, \"\") : url.pathname.slice(base.length)) || \"/\";\n}\n/** @param {URL} url */\nfunction get_page_key(url) {\n\treturn (app.hash ? url.hash.replace(/^#/, \"\") : url.pathname) + url.search;\n}\n/**\n* @param {{\n* url: URL;\n* type: import('@sveltejs/kit').Navigation[\"type\"];\n* intent?: import('./types.js').NavigationIntent;\n* delta?: number;\n* event?: PopStateEvent | MouseEvent;\n* scroll?: { x: number, y: number };\n* }} opts\n*/\nfunction _before_navigate({ url, type, intent, delta, event, scroll }) {\n\tlet should_block = false;\n\tconst nav = create_navigation(current, intent, url, type, scroll ?? null);\n\tif (delta !== void 0) nav.navigation.delta = delta;\n\tif (event !== void 0) nav.navigation.event = event;\n\tconst cancellable = {\n\t\t...nav.navigation,\n\t\tcancel: () => {\n\t\t\tshould_block = true;\n\t\t\tnav.reject(/* @__PURE__ */ new Error(\"navigation cancelled\"));\n\t\t}\n\t};\n\tif (!is_navigating) before_navigate_callbacks.forEach((fn) => fn(cancellable));\n\treturn should_block ? null : nav;\n}\n/**\n* @param {{\n* type: import('@sveltejs/kit').NavigationType;\n* url: URL;\n* popped?: {\n* state: Record<string, any>;\n* scroll: { x: number, y: number };\n* delta: number;\n* };\n* keepfocus?: boolean;\n* noscroll?: boolean;\n* replace_state?: boolean;\n* state?: Record<string, any>;\n* redirect_count?: number;\n* nav_token?: {};\n* accept?: () => void;\n* block?: () => void;\n* event?: Event\n* }} opts\n*/\nasync function navigate({ type, url, popped, keepfocus, noscroll, replace_state, state = {}, redirect_count = 0, nav_token = {}, accept = noop, block = noop, event }) {\n\tconst prev_token = token;\n\ttoken = nav_token;\n\tconst intent = await get_navigation_intent(url, false);\n\tconst nav = type === \"enter\" ? create_navigation(current, intent, url, type) : _before_navigate({\n\t\turl,\n\t\ttype,\n\t\tdelta: popped?.delta,\n\t\tintent,\n\t\tscroll: popped?.scroll,\n\t\tevent\n\t});\n\tif (!nav) {\n\t\tblock();\n\t\tif (token === nav_token) token = prev_token;\n\t\treturn;\n\t}\n\tconst previous_history_index = current_history_index;\n\tconst previous_navigation_index = current_navigation_index;\n\taccept();\n\tis_navigating = true;\n\tif (started && nav.navigation.type !== \"enter\") stores.navigating.set(navigating.current = nav.navigation);\n\tlet navigation_result = intent && await load_route(intent);\n\tif (!navigation_result) if (is_external_url(url, base, app.hash)) return await native_navigation(url, replace_state);\n\telse navigation_result = await server_fallback(url, { id: null }, await handle_error(new SvelteKitError(404, \"Not Found\", `Not found: ${url.pathname}`), {\n\t\turl,\n\t\tparams: {},\n\t\troute: { id: null }\n\t}), 404, replace_state);\n\turl = intent?.url || url;\n\tif (token !== nav_token) {\n\t\tnav.reject(/* @__PURE__ */ new Error(\"navigation aborted\"));\n\t\treturn false;\n\t}\n\tif (navigation_result.type === \"redirect\") {\n\t\tif (redirect_count < 20) {\n\t\t\tawait navigate({\n\t\t\t\ttype,\n\t\t\t\turl: new URL(navigation_result.location, url),\n\t\t\t\tpopped,\n\t\t\t\tkeepfocus,\n\t\t\t\tnoscroll,\n\t\t\t\treplace_state,\n\t\t\t\tstate,\n\t\t\t\tredirect_count: redirect_count + 1,\n\t\t\t\tnav_token\n\t\t\t});\n\t\t\tnav.fulfil(void 0);\n\t\t\treturn;\n\t\t}\n\t\tnavigation_result = await load_root_error_page({\n\t\t\tstatus: 500,\n\t\t\terror: await handle_error(/* @__PURE__ */ new Error(\"Redirect loop\"), {\n\t\t\t\turl,\n\t\t\t\tparams: {},\n\t\t\t\troute: { id: null }\n\t\t\t}),\n\t\t\turl,\n\t\t\troute: { id: null }\n\t\t});\n\t} else if (navigation_result.props.page.status >= 400) {\n\t\tif (await stores.updated.check()) {\n\t\t\tawait update_service_worker();\n\t\t\tawait native_navigation(url, replace_state);\n\t\t}\n\t}\n\treset_invalidation();\n\tupdate_scroll_positions(previous_history_index);\n\tcapture_snapshot(previous_navigation_index);\n\tif (navigation_result.props.page.url.pathname !== url.pathname) url.pathname = navigation_result.props.page.url.pathname;\n\tstate = popped ? popped.state : state;\n\tif (!popped) {\n\t\tconst change = replace_state ? 0 : 1;\n\t\tconst entry = {\n\t\t\t[HISTORY_INDEX]: current_history_index += change,\n\t\t\t[NAVIGATION_INDEX]: current_navigation_index += change,\n\t\t\t[STATES_KEY]: state\n\t\t};\n\t\t(replace_state ? history.replaceState : history.pushState).call(history, entry, \"\", url);\n\t\tif (!replace_state) clear_onward_history(current_history_index, current_navigation_index);\n\t}\n\tconst load_cache_fork = intent && load_cache?.id === intent.id ? load_cache.fork : null;\n\tif (load_cache?.fork && !load_cache_fork) discard_load_cache();\n\tload_cache = null;\n\tnavigation_result.props.page.state = state;\n\t/**\n\t* @type {Promise<void> | undefined}\n\t*/\n\tlet commit_promise;\n\tif (started) {\n\t\tconst after_navigate = (await Promise.all(Array.from(on_navigate_callbacks, (fn) => fn(nav.navigation)))).filter(\n\t\t\t/** @returns {value is () => void} */\n\t\t\t(value) => typeof value === \"function\"\n\t\t);\n\t\tif (after_navigate.length > 0) {\n\t\t\tfunction cleanup() {\n\t\t\t\tafter_navigate.forEach((fn) => {\n\t\t\t\t\tafter_navigate_callbacks.delete(fn);\n\t\t\t\t});\n\t\t\t}\n\t\t\tafter_navigate.push(cleanup);\n\t\t\tafter_navigate.forEach((fn) => {\n\t\t\t\tafter_navigate_callbacks.add(fn);\n\t\t\t});\n\t\t}\n\t\tconst target = nav.navigation.to;\n\t\tcurrent = {\n\t\t\t...navigation_result.state,\n\t\t\tnav: {\n\t\t\t\tparams: target.params,\n\t\t\t\troute: target.route,\n\t\t\t\turl: target.url\n\t\t\t}\n\t\t};\n\t\tif (navigation_result.props.page) navigation_result.props.page.url = url;\n\t\tconst fork = load_cache_fork && await load_cache_fork;\n\t\tif (fork) commit_promise = fork.commit();\n\t\telse {\n\t\t\trendering_error = null;\n\t\t\troot.$set(navigation_result.props);\n\t\t\tif (rendering_error) Object.assign(navigation_result.props.page, rendering_error);\n\t\t\tupdate(navigation_result.props.page);\n\t\t\tcommit_promise = settled?.();\n\t\t}\n\t} else await initialize(navigation_result, target, false);\n\tconst { activeElement } = document;\n\tawait commit_promise;\n\tawait tick$1();\n\tawait tick$1();\n\tif (token !== nav_token) {\n\t\tnav.reject(/* @__PURE__ */ new Error(\"navigation aborted\"));\n\t\treturn false;\n\t}\n\tif (navigation_result.props.page && rendering_error) Object.assign(navigation_result.props.page, rendering_error);\n\t/** @type {Element | null | ''} */\n\tlet deep_linked = null;\n\tif (autoscroll) {\n\t\tconst scroll = popped ? popped.scroll : noscroll ? scroll_state() : null;\n\t\tif (scroll) scrollTo(scroll.x, scroll.y);\n\t\telse if (deep_linked = url.hash && document.getElementById(get_id(url))) deep_linked.scrollIntoView();\n\t\telse scrollTo(0, 0);\n\t}\n\tconst changed_focus = document.activeElement !== activeElement && document.activeElement !== document.body;\n\tif (!keepfocus && !changed_focus) reset_focus(url, !deep_linked);\n\tautoscroll = true;\n\tis_navigating = false;\n\tif (type === \"popstate\") restore_snapshot(current_navigation_index);\n\tnav.fulfil(void 0);\n\tif (nav.navigation.to) nav.navigation.to.scroll = scroll_state();\n\tafter_navigate_callbacks.forEach((fn) => fn(nav.navigation));\n\tstores.navigating.set(navigating.current = null);\n}\n/**\n* Does a full page reload if it wouldn't result in an endless loop in the SPA case\n* @param {URL} url\n* @param {{ id: string | null }} route\n* @param {App.Error} error\n* @param {number} status\n* @param {boolean} [replace_state]\n* @returns {Promise<import('./types.js').NavigationFinished>}\n*/\nasync function server_fallback(url, route, error, status, replace_state) {\n\tif (url.origin === origin && url.pathname === location.pathname && !hydrated) return await load_root_error_page({\n\t\tstatus,\n\t\terror,\n\t\turl,\n\t\troute\n\t});\n\treturn await native_navigation(url, replace_state);\n}\n/**\n* @param {unknown} error\n* @param {import('@sveltejs/kit').NavigationEvent} event\n* @returns {import('types').MaybePromise<App.Error>}\n*/\nfunction handle_error(error, event) {\n\tif (error instanceof HttpError) return error.body;\n\tconst status = get_status(error);\n\tconst message = get_message(error);\n\treturn app.hooks.handleError({\n\t\terror,\n\t\tevent,\n\t\tstatus,\n\t\tmessage\n\t}) ?? { message };\n}\n/**\n* Allows you to navigate programmatically to a given route, with options such as keeping the current element focused.\n* Returns a Promise that resolves when SvelteKit navigates (or fails to navigate, in which case the promise rejects) to the specified `url`.\n*\n* For external URLs, use `window.location = url` instead of calling `goto(url)`.\n*\n* @param {string | URL} url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://svelte.dev/docs/kit/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app.\n* @param {Object} [opts] Options related to the navigation\n* @param {boolean} [opts.replaceState] If `true`, will replace the current `history` entry rather than creating a new one with `pushState`\n* @param {boolean} [opts.noScroll] If `true`, the browser will maintain its scroll position rather than scrolling to the top of the page after navigation\n* @param {boolean} [opts.keepFocus] If `true`, the currently focused element will retain focus after navigation. Otherwise, focus will be reset to the body\n* @param {boolean} [opts.invalidateAll] If `true`, all `load` functions of the page will be rerun. See https://svelte.dev/docs/kit/load#rerunning-load-functions for more info on invalidation.\n* @param {Array<string | URL | ((url: URL) => boolean)>} [opts.invalidate] Causes any load functions to re-run if they depend on one of the urls\n* @param {App.PageState} [opts.state] An optional object that will be available as `page.state`\n* @returns {Promise<void>}\n*/\nfunction goto(url, opts = {}) {\n\tthrow new Error(\"Cannot call goto(...) on the server\");\n}\n/**\n* @param {string | URL | ((url: URL) => boolean)} resource The invalidated URL\n*/\nfunction push_invalidated(resource) {\n\tif (typeof resource === \"function\") invalidated.push(resource);\n\telse {\n\t\tconst { href } = new URL(resource, location.href);\n\t\tinvalidated.push((url) => url.href === href);\n\t}\n}\n/**\n* @param {URL} url\n* @param {boolean[]} invalid\n* @returns {Promise<import('types').ServerNodesResponse | import('types').ServerRedirectNode>}\n*/\nasync function load_data(url, invalid) {\n\tconst data_url = new URL(url);\n\tdata_url.pathname = add_data_suffix(url.pathname);\n\tif (url.pathname.endsWith(\"/\")) data_url.searchParams.append(TRAILING_SLASH_PARAM, \"1\");\n\tdata_url.searchParams.append(INVALIDATED_PARAM, invalid.map((i) => i ? \"1\" : \"0\").join(\"\"));\n\tconst res = await (0, window.fetch)(data_url.href, {});\n\tif (!res.ok) {\n\t\t/** @type {string | undefined} */\n\t\tlet message;\n\t\tif (res.headers.get(\"content-type\")?.includes(\"application/json\")) message = await res.json();\n\t\telse if (res.status === 404) message = \"Not Found\";\n\t\telse if (res.status === 500) message = \"Internal Error\";\n\t\tthrow new HttpError(res.status, message);\n\t}\n\treturn new Promise(async (resolve) => {\n\t\t/**\n\t\t* Map of deferred promises that will be resolved by a subsequent chunk of data\n\t\t* @type {Map<string, import('types').Deferred>}\n\t\t*/\n\t\tconst deferreds = /* @__PURE__ */ new Map();\n\t\tconst reader = res.body.getReader();\n\t\t/**\n\t\t* @param {any} data\n\t\t*/\n\t\tfunction deserialize(data) {\n\t\t\treturn unflatten(data, {\n\t\t\t\t...app.decoders,\n\t\t\t\tPromise: (id) => {\n\t\t\t\t\treturn new Promise((fulfil, reject) => {\n\t\t\t\t\t\tdeferreds.set(id, {\n\t\t\t\t\t\t\tfulfil,\n\t\t\t\t\t\t\treject\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tfor await (const node of read_ndjson(reader)) {\n\t\t\tif (node.type === \"redirect\") return resolve(node);\n\t\t\tif (node.type === \"data\") {\n\t\t\t\tnode.nodes?.forEach((node) => {\n\t\t\t\t\tif (node?.type === \"data\") {\n\t\t\t\t\t\tnode.uses = deserialize_uses(node.uses);\n\t\t\t\t\t\tnode.data = deserialize(node.data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresolve(node);\n\t\t\t} else if (node.type === \"chunk\") {\n\t\t\t\tconst { id, data, error } = node;\n\t\t\t\tconst deferred = deferreds.get(id);\n\t\t\t\tdeferreds.delete(id);\n\t\t\t\tif (error) deferred.reject(deserialize(error));\n\t\t\t\telse deferred.fulfil(deserialize(data));\n\t\t\t}\n\t\t}\n\t});\n}\n/**\n* @param {any} uses\n* @return {import('types').Uses}\n*/\nfunction deserialize_uses(uses) {\n\treturn {\n\t\tdependencies: new Set(uses?.dependencies ?? []),\n\t\tparams: new Set(uses?.params ?? []),\n\t\tparent: !!uses?.parent,\n\t\troute: !!uses?.route,\n\t\turl: !!uses?.url,\n\t\tsearch_params: new Set(uses?.search_params ?? [])\n\t};\n}\n/**\n* @param {URL} url\n* @param {boolean} [scroll]\n*/\nfunction reset_focus(url, scroll = true) {\n\tconst autofocus = document.querySelector(\"[autofocus]\");\n\tif (autofocus) autofocus.focus();\n\telse {\n\t\tconst id = get_id(url);\n\t\tif (id && document.getElementById(id)) {\n\t\t\tconst { x, y } = scroll_state();\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst history_state = history.state;\n\t\t\t\tlocation.replace(new URL(`#${id}`, location.href));\n\t\t\t\thistory.replaceState(history_state, \"\", url);\n\t\t\t\tif (scroll) scrollTo(x, y);\n\t\t\t});\n\t\t} else {\n\t\t\tconst root = document.body;\n\t\t\tconst tabindex = root.getAttribute(\"tabindex\");\n\t\t\troot.tabIndex = -1;\n\t\t\troot.focus({\n\t\t\t\tpreventScroll: true,\n\t\t\t\tfocusVisible: false\n\t\t\t});\n\t\t\tif (tabindex !== null) root.setAttribute(\"tabindex\", tabindex);\n\t\t\telse root.removeAttribute(\"tabindex\");\n\t\t}\n\t\tconst selection = getSelection();\n\t\tif (selection && selection.type !== \"None\") {\n\t\t\t/** @type {Range[]} */\n\t\t\tconst ranges = [];\n\t\t\tfor (let i = 0; i < selection.rangeCount; i += 1) ranges.push(selection.getRangeAt(i));\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (selection.rangeCount !== ranges.length) return;\n\t\t\t\tfor (let i = 0; i < selection.rangeCount; i += 1) {\n\t\t\t\t\tconst a = ranges[i];\n\t\t\t\t\tconst b = selection.getRangeAt(i);\n\t\t\t\t\tif (a.commonAncestorContainer !== b.commonAncestorContainer || a.startContainer !== b.startContainer || a.endContainer !== b.endContainer || a.startOffset !== b.startOffset || a.endOffset !== b.endOffset) return;\n\t\t\t\t}\n\t\t\t\tselection.removeAllRanges();\n\t\t\t});\n\t\t}\n\t}\n}\n/**\n* @template {import('@sveltejs/kit').NavigationType} T\n* @param {import('./types.js').NavigationState} current\n* @param {import('./types.js').NavigationIntent | undefined} intent\n* @param {URL | null} url\n* @param {T} type\n* @param {{ x: number, y: number } | null} [target_scroll] The scroll position for the target (for popstate navigations)\n*/\nfunction create_navigation(current, intent, url, type, target_scroll = null) {\n\t/** @type {(value: any) => void} */\n\tlet fulfil;\n\t/** @type {(error: any) => void} */\n\tlet reject;\n\tconst complete = new Promise((f, r) => {\n\t\tfulfil = f;\n\t\treject = r;\n\t});\n\tcomplete.catch(noop);\n\treturn {\n\t\tnavigation: {\n\t\t\tfrom: {\n\t\t\t\tparams: current.params,\n\t\t\t\troute: { id: current.route?.id ?? null },\n\t\t\t\turl: current.url,\n\t\t\t\tscroll: scroll_state()\n\t\t\t},\n\t\t\tto: url && {\n\t\t\t\tparams: intent?.params ?? null,\n\t\t\t\troute: { id: intent?.route?.id ?? null },\n\t\t\t\turl,\n\t\t\t\tscroll: target_scroll\n\t\t\t},\n\t\t\twillUnload: !intent,\n\t\t\ttype,\n\t\t\tcomplete\n\t\t},\n\t\tfulfil,\n\t\treject\n\t};\n}\n/**\n* TODO: remove this in 3.0 when the page store is also removed\n*\n* We need to assign a new page object so that subscribers are correctly notified.\n* However, spreading `{ ...page }` returns an empty object so we manually\n* assign to each property instead.\n*\n* @param {import('@sveltejs/kit').Page} page\n*/\nfunction clone_page(page) {\n\treturn {\n\t\tdata: page.data,\n\t\terror: page.error,\n\t\tform: page.form,\n\t\tparams: page.params,\n\t\troute: page.route,\n\t\tstate: page.state,\n\t\tstatus: page.status,\n\t\turl: page.url\n\t};\n}\n/**\n* @param {URL} url\n* @returns {string}\n*/\nfunction get_id(url) {\n\tlet id;\n\tif (app.hash) {\n\t\tconst [, , second] = url.hash.split(\"#\", 3);\n\t\tid = second ?? \"\";\n\t} else id = url.hash.slice(1);\n\treturn decodeURIComponent(id);\n}\n//#endregion\nexport { updated as a, page as i, stores as n, navigating as r, goto as t };\n"],"names":["tick","noop$1"],"mappings":"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"}
|