@openpalm/ui 0.13.0-beta.7 → 0.13.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/build/.openpalm-ui-version +1 -1
- package/build/client/_app/immutable/assets/7.DHMKw-HL.css +1 -0
- package/build/client/_app/immutable/assets/7.DHMKw-HL.css.br +0 -0
- package/build/client/_app/immutable/assets/7.DHMKw-HL.css.gz +0 -0
- package/build/client/_app/immutable/assets/9.CmCaAuiy.css +1 -0
- package/build/client/_app/immutable/assets/9.CmCaAuiy.css.br +0 -0
- package/build/client/_app/immutable/assets/9.CmCaAuiy.css.gz +0 -0
- package/build/client/_app/immutable/chunks/{BE_4J5sS.js → B9uMOgDZ.js} +2 -2
- package/build/client/_app/immutable/chunks/B9uMOgDZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/B9uMOgDZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BwKrb5qD.js +1 -0
- package/build/client/_app/immutable/chunks/BwKrb5qD.js.br +2 -0
- package/build/client/_app/immutable/chunks/BwKrb5qD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{mNzUu332.js → C092q_Hl.js} +1 -1
- package/build/client/_app/immutable/chunks/C092q_Hl.js.br +0 -0
- package/build/client/_app/immutable/chunks/C092q_Hl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C7g46Pjm.js +1 -0
- package/build/client/_app/immutable/chunks/C7g46Pjm.js.br +0 -0
- package/build/client/_app/immutable/chunks/C7g46Pjm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CuKFR3Qo.js → CR3nChHO.js} +2 -2
- package/build/client/_app/immutable/chunks/CR3nChHO.js.br +0 -0
- package/build/client/_app/immutable/chunks/CR3nChHO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Clt9pCG1.js → CXv_deBx.js} +1 -1
- package/build/client/_app/immutable/chunks/CXv_deBx.js.br +0 -0
- package/build/client/_app/immutable/chunks/CXv_deBx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D-DB6zTo.js +9 -0
- package/build/client/_app/immutable/chunks/D-DB6zTo.js.br +0 -0
- package/build/client/_app/immutable/chunks/D-DB6zTo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DDSqq1hR.js +1 -0
- package/build/client/_app/immutable/chunks/DDSqq1hR.js.br +0 -0
- package/build/client/_app/immutable/chunks/DDSqq1hR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/d1cxvUgj.js +1 -0
- package/build/client/_app/immutable/chunks/d1cxvUgj.js.br +0 -0
- package/build/client/_app/immutable/chunks/d1cxvUgj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BdIq5WIo.js → qrqTdjh7.js} +1 -1
- package/build/client/_app/immutable/chunks/qrqTdjh7.js.br +0 -0
- package/build/client/_app/immutable/chunks/qrqTdjh7.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.DKG33-gU.js → app.CXHi3StM.js} +2 -2
- package/build/client/_app/immutable/entry/app.CXHi3StM.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CXHi3StM.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.eS_-xLIC.js +1 -0
- package/build/client/_app/immutable/entry/start.eS_-xLIC.js.br +1 -0
- package/build/client/_app/immutable/entry/start.eS_-xLIC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.eA5H3idZ.js → 0.Bfv0aXoG.js} +1 -1
- package/build/client/_app/immutable/nodes/0.Bfv0aXoG.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Bfv0aXoG.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.CvKFymDh.js → 1.B8Ebge5I.js} +1 -1
- package/build/client/_app/immutable/nodes/1.B8Ebge5I.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.B8Ebge5I.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{10.DFMf8WUQ.js → 10.Di4b61Rb.js} +1 -1
- package/build/client/_app/immutable/nodes/10.Di4b61Rb.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.Di4b61Rb.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.CUlazdDv.js +8 -0
- package/build/client/_app/immutable/nodes/11.CUlazdDv.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.CUlazdDv.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.DQOL0qY_.js +1 -0
- package/build/client/_app/immutable/nodes/4.DQOL0qY_.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.DQOL0qY_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.bgdUYUlr.js → 5.BGqmDWpO.js} +1 -1
- package/build/client/_app/immutable/nodes/5.BGqmDWpO.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.BGqmDWpO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.Cf2kRGl-.js +2 -0
- package/build/client/_app/immutable/nodes/6.Cf2kRGl-.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.Cf2kRGl-.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.CvaILUo5.js +16 -0
- package/build/client/_app/immutable/nodes/7.CvaILUo5.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.CvaILUo5.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DvOR66Q0.js +128 -0
- package/build/client/_app/immutable/nodes/9.DvOR66Q0.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DvOR66Q0.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-D9FIO-Bk.js → 0-D8UAPThv.js} +12 -6
- package/build/server/chunks/0-D8UAPThv.js.map +1 -0
- package/build/server/chunks/1-bS23Eg-d.js +9 -0
- package/build/server/chunks/{1-ItPJxTHP.js.map → 1-bS23Eg-d.js.map} +1 -1
- package/build/server/chunks/{10-B4fDiATl.js → 10-C5TUqG1t.js} +3 -3
- package/build/server/chunks/{10-B4fDiATl.js.map → 10-C5TUqG1t.js.map} +1 -1
- package/build/server/chunks/11-DSjZgp33.js +9 -0
- package/build/server/chunks/11-DSjZgp33.js.map +1 -0
- package/build/server/chunks/{3-DpC38K23.js → 3-D0iTJ9v2.js} +6 -6
- package/build/server/chunks/{3-DpC38K23.js.map → 3-D0iTJ9v2.js.map} +1 -1
- package/build/server/chunks/{4-DrJ64j1x.js → 4-CHJRF8qs.js} +3 -3
- package/build/server/chunks/{4-DrJ64j1x.js.map → 4-CHJRF8qs.js.map} +1 -1
- package/build/server/chunks/{5-BxzwX0rY.js → 5-CwCiwnFt.js} +3 -3
- package/build/server/chunks/{5-BxzwX0rY.js.map → 5-CwCiwnFt.js.map} +1 -1
- package/build/server/chunks/6-raswytzE.js +9 -0
- package/build/server/chunks/{6-DxXeT1e3.js.map → 6-raswytzE.js.map} +1 -1
- package/build/server/chunks/7-NC4-KlW9.js +9 -0
- package/build/server/chunks/7-NC4-KlW9.js.map +1 -0
- package/build/server/chunks/9-rIsHxfiY.js +9 -0
- package/build/server/chunks/9-rIsHxfiY.js.map +1 -0
- package/build/server/chunks/{ChatNavbar-CJYo_Hbc.js → ChatNavbar-DqdxDR5U.js} +9 -9
- package/build/server/chunks/{ChatNavbar-CJYo_Hbc.js.map → ChatNavbar-DqdxDR5U.js.map} +1 -1
- package/build/server/chunks/IconMic-CZN60P6B.js +10 -0
- package/build/server/chunks/IconMic-CZN60P6B.js.map +1 -0
- package/build/server/chunks/{IconServer-DkywyVFu.js → IconServer-BwcRjcsS.js} +4 -4
- package/build/server/chunks/{IconServer-DkywyVFu.js.map → IconServer-BwcRjcsS.js.map} +1 -1
- package/build/server/chunks/{IconSoundOn-DoAiK-qp.js → IconSoundOn-DTZuBn2-.js} +4 -4
- package/build/server/chunks/{IconSoundOn-DoAiK-qp.js.map → IconSoundOn-DTZuBn2-.js.map} +1 -1
- package/build/server/chunks/{IconStop-DKVpXPKq.js → IconStop-BxUfqTaV.js} +114 -847
- package/build/server/chunks/IconStop-BxUfqTaV.js.map +1 -0
- package/build/server/chunks/{QuestionCard-BCfoxMiS.js → QuestionCard-DOLuSSbI.js} +2 -2
- package/build/server/chunks/{QuestionCard-BCfoxMiS.js.map → QuestionCard-DOLuSSbI.js.map} +1 -1
- package/build/server/chunks/Spinner-2WZW6r_I.js +12 -0
- package/build/server/chunks/Spinner-2WZW6r_I.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-DArOWGd3.js → _layout.svelte-CBBWJ3m3.js} +2 -3
- package/build/server/chunks/{_layout.svelte-DArOWGd3.js.map → _layout.svelte-CBBWJ3m3.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-S90xJHRa.js → _page.svelte-CYzntFY4.js} +10 -10
- package/build/server/chunks/{_page.svelte-S90xJHRa.js.map → _page.svelte-CYzntFY4.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-CGEtuNmS.js → _page.svelte-CysG6Te2.js} +13 -13
- package/build/server/chunks/_page.svelte-CysG6Te2.js.map +1 -0
- package/build/server/chunks/{_page.svelte-Dpf94Jor.js → _page.svelte-D-_cPU8e.js} +3 -3
- package/build/server/chunks/{_page.svelte-Dpf94Jor.js.map → _page.svelte-D-_cPU8e.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-qxgG6hsh.js → _page.svelte-D4hOWjfm.js} +61 -351
- package/build/server/chunks/_page.svelte-D4hOWjfm.js.map +1 -0
- package/build/server/chunks/_page.svelte-D9au75wl.js +183 -0
- package/build/server/chunks/_page.svelte-D9au75wl.js.map +1 -0
- package/build/server/chunks/{_page.svelte-FOm-OMQe.js → _page.svelte-DjldYxQn.js} +25 -133
- package/build/server/chunks/_page.svelte-DjldYxQn.js.map +1 -0
- package/build/server/chunks/{_page.svelte-B2cX_j9w.js → _page.svelte-DsJgu4mW.js} +3 -3
- package/build/server/chunks/{_page.svelte-B2cX_j9w.js.map → _page.svelte-DsJgu4mW.js.map} +1 -1
- package/build/server/chunks/_server.ts-1qbl_1NY.js +87 -0
- package/build/server/chunks/_server.ts-1qbl_1NY.js.map +1 -0
- package/build/server/chunks/{_server.ts-DQI9hYcE.js → _server.ts-2VPdIZFH.js} +6 -6
- package/build/server/chunks/{_server.ts-DQI9hYcE.js.map → _server.ts-2VPdIZFH.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C5T_Zuoy.js → _server.ts-68MuZYx_.js} +7 -7
- package/build/server/chunks/{_server.ts-C5T_Zuoy.js.map → _server.ts-68MuZYx_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cph8nHvr.js → _server.ts-8AfutA1j.js} +6 -6
- package/build/server/chunks/{_server.ts-Cph8nHvr.js.map → _server.ts-8AfutA1j.js.map} +1 -1
- package/build/server/chunks/{_server.ts-ZKEBn-qW.js → _server.ts-B-5y1hA4.js} +8 -8
- package/build/server/chunks/{_server.ts-ZKEBn-qW.js.map → _server.ts-B-5y1hA4.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cjo35hc1.js → _server.ts-B1CunPF7.js} +6 -6
- package/build/server/chunks/{_server.ts-Cjo35hc1.js.map → _server.ts-B1CunPF7.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DYLc6Os9.js → _server.ts-B1KGSkdl.js} +6 -6
- package/build/server/chunks/{_server.ts-DYLc6Os9.js.map → _server.ts-B1KGSkdl.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B_7lGoo_.js → _server.ts-B2NALEcR.js} +6 -6
- package/build/server/chunks/{_server.ts-B_7lGoo_.js.map → _server.ts-B2NALEcR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-i9TaUbWr.js → _server.ts-B2iUBxXh.js} +8 -8
- package/build/server/chunks/{_server.ts-i9TaUbWr.js.map → _server.ts-B2iUBxXh.js.map} +1 -1
- package/build/server/chunks/{_server.ts-IEM_8o6U.js → _server.ts-BN8EkPAZ.js} +7 -7
- package/build/server/chunks/{_server.ts-IEM_8o6U.js.map → _server.ts-BN8EkPAZ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-N_mH0t0f.js → _server.ts-BQJfEfl9.js} +6 -6
- package/build/server/chunks/{_server.ts-N_mH0t0f.js.map → _server.ts-BQJfEfl9.js.map} +1 -1
- package/build/server/chunks/{_server.ts-C4tBc7fm.js → _server.ts-BQSMacks.js} +9 -9
- package/build/server/chunks/{_server.ts-C4tBc7fm.js.map → _server.ts-BQSMacks.js.map} +1 -1
- package/build/server/chunks/{_server.ts-vJBq3idp.js → _server.ts-BYt64wi5.js} +2 -2
- package/build/server/chunks/{_server.ts-vJBq3idp.js.map → _server.ts-BYt64wi5.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BWMJRzwx.js → _server.ts-Ba0MJSs9.js} +6 -6
- package/build/server/chunks/{_server.ts-BWMJRzwx.js.map → _server.ts-Ba0MJSs9.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B1vQkdVA.js → _server.ts-BdIM_pWg.js} +8 -8
- package/build/server/chunks/{_server.ts-B1vQkdVA.js.map → _server.ts-BdIM_pWg.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DYg52Wyj.js → _server.ts-BfxTJHa-.js} +6 -6
- package/build/server/chunks/{_server.ts-DYg52Wyj.js.map → _server.ts-BfxTJHa-.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CMfz71Do.js → _server.ts-BiVyFRNv.js} +6 -6
- package/build/server/chunks/{_server.ts-CMfz71Do.js.map → _server.ts-BiVyFRNv.js.map} +1 -1
- package/build/server/chunks/{_server.ts-vlaPk3to.js → _server.ts-BrgEQhDo.js} +6 -6
- package/build/server/chunks/{_server.ts-vlaPk3to.js.map → _server.ts-BrgEQhDo.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BKnCIXe5.js → _server.ts-BtZN_8lV.js} +6 -6
- package/build/server/chunks/{_server.ts-BKnCIXe5.js.map → _server.ts-BtZN_8lV.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BhA9ywuA.js → _server.ts-Bx0PXf1w.js} +6 -6
- package/build/server/chunks/{_server.ts-BhA9ywuA.js.map → _server.ts-Bx0PXf1w.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CkVeEW46.js → _server.ts-Byaj9iKd.js} +6 -6
- package/build/server/chunks/{_server.ts-CkVeEW46.js.map → _server.ts-Byaj9iKd.js.map} +1 -1
- package/build/server/chunks/{_server.ts-oSGbQw4A.js → _server.ts-C1kDLq6m.js} +6 -6
- package/build/server/chunks/{_server.ts-oSGbQw4A.js.map → _server.ts-C1kDLq6m.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CLMsuxkK.js → _server.ts-C28zIW49.js} +6 -6
- package/build/server/chunks/{_server.ts-CLMsuxkK.js.map → _server.ts-C28zIW49.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BHaFrgm9.js → _server.ts-C2F80x6V.js} +7 -7
- package/build/server/chunks/{_server.ts-BHaFrgm9.js.map → _server.ts-C2F80x6V.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BOn4TCRw.js → _server.ts-C70sKEjH.js} +7 -7
- package/build/server/chunks/{_server.ts-BOn4TCRw.js.map → _server.ts-C70sKEjH.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CYu5XSM8.js → _server.ts-C754EzJA.js} +6 -6
- package/build/server/chunks/{_server.ts-CYu5XSM8.js.map → _server.ts-C754EzJA.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B7319d6O.js → _server.ts-C8n83Xl1.js} +6 -6
- package/build/server/chunks/{_server.ts-B7319d6O.js.map → _server.ts-C8n83Xl1.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DQTJ_bFp.js → _server.ts-CC6Bt-9t.js} +7 -7
- package/build/server/chunks/{_server.ts-DQTJ_bFp.js.map → _server.ts-CC6Bt-9t.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Y5pBzFz4.js → _server.ts-CJ76gcOX.js} +6 -6
- package/build/server/chunks/{_server.ts-Y5pBzFz4.js.map → _server.ts-CJ76gcOX.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B3iKXyUo.js → _server.ts-CMW6wbwP.js} +6 -6
- package/build/server/chunks/{_server.ts-B3iKXyUo.js.map → _server.ts-CMW6wbwP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-pf6WrGLo.js → _server.ts-CNjG4x1a.js} +6 -6
- package/build/server/chunks/{_server.ts-pf6WrGLo.js.map → _server.ts-CNjG4x1a.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DhcBS9KQ.js → _server.ts-CRl7GqvU.js} +6 -6
- package/build/server/chunks/{_server.ts-DhcBS9KQ.js.map → _server.ts-CRl7GqvU.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D6-C5ctd.js → _server.ts-CUBWjRlp.js} +7 -7
- package/build/server/chunks/{_server.ts-D6-C5ctd.js.map → _server.ts-CUBWjRlp.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B-uAgtQC.js → _server.ts-CYoKjlbj.js} +6 -6
- package/build/server/chunks/{_server.ts-B-uAgtQC.js.map → _server.ts-CYoKjlbj.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Cu48eVwM.js → _server.ts-CafJDVBQ.js} +2 -2
- package/build/server/chunks/{_server.ts-Cu48eVwM.js.map → _server.ts-CafJDVBQ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CvjVUcFR.js → _server.ts-Cd9hDiKk.js} +6 -6
- package/build/server/chunks/{_server.ts-CvjVUcFR.js.map → _server.ts-Cd9hDiKk.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BgL3_hTS.js → _server.ts-CgQfVR3g.js} +7 -7
- package/build/server/chunks/{_server.ts-BgL3_hTS.js.map → _server.ts-CgQfVR3g.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BtZ9-ZYu.js → _server.ts-CilbVIRO.js} +2 -2
- package/build/server/chunks/{_server.ts-BtZ9-ZYu.js.map → _server.ts-CilbVIRO.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CSBd_6yC.js → _server.ts-Ck25Xm32.js} +7 -7
- package/build/server/chunks/{_server.ts-CSBd_6yC.js.map → _server.ts-Ck25Xm32.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DvUVX3X0.js → _server.ts-Cp-_qWC_.js} +7 -7
- package/build/server/chunks/{_server.ts-DvUVX3X0.js.map → _server.ts-Cp-_qWC_.js.map} +1 -1
- package/build/server/chunks/{_server.ts-7pcCO8Pf.js → _server.ts-CuEFmJ07.js} +7 -7
- package/build/server/chunks/{_server.ts-7pcCO8Pf.js.map → _server.ts-CuEFmJ07.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DR0kmbl9.js → _server.ts-D5vc4lGC.js} +6 -6
- package/build/server/chunks/{_server.ts-DR0kmbl9.js.map → _server.ts-D5vc4lGC.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CtkA_Ld0.js → _server.ts-DDLE66QT.js} +7 -7
- package/build/server/chunks/{_server.ts-CtkA_Ld0.js.map → _server.ts-DDLE66QT.js.map} +1 -1
- package/build/server/chunks/{_server.ts-xQhNjF_X.js → _server.ts-DEF1ChPD.js} +6 -6
- package/build/server/chunks/{_server.ts-xQhNjF_X.js.map → _server.ts-DEF1ChPD.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BH8Y1mmb.js → _server.ts-DHUtPRWK.js} +4 -4
- package/build/server/chunks/{_server.ts-BH8Y1mmb.js.map → _server.ts-DHUtPRWK.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B0MK-ynu.js → _server.ts-DHoTyKXL.js} +14 -10
- package/build/server/chunks/_server.ts-DHoTyKXL.js.map +1 -0
- package/build/server/chunks/{_server.ts-BaEUZaLH.js → _server.ts-DSB9Fzwa.js} +4 -4
- package/build/server/chunks/{_server.ts-BaEUZaLH.js.map → _server.ts-DSB9Fzwa.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Dc1s3sLN.js → _server.ts-DW36Vbiq.js} +6 -6
- package/build/server/chunks/{_server.ts-Dc1s3sLN.js.map → _server.ts-DW36Vbiq.js.map} +1 -1
- package/build/server/chunks/{_server.ts-v3cF2xWi.js → _server.ts-DWG4CKWG.js} +6 -6
- package/build/server/chunks/{_server.ts-v3cF2xWi.js.map → _server.ts-DWG4CKWG.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CCTZbI7L.js → _server.ts-DXxQIT2o.js} +7 -7
- package/build/server/chunks/{_server.ts-CCTZbI7L.js.map → _server.ts-DXxQIT2o.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CSYdjKAH.js → _server.ts-Da8_J1a4.js} +7 -7
- package/build/server/chunks/{_server.ts-CSYdjKAH.js.map → _server.ts-Da8_J1a4.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DeuURP8u.js → _server.ts-DcH5edss.js} +6 -6
- package/build/server/chunks/{_server.ts-DeuURP8u.js.map → _server.ts-DcH5edss.js.map} +1 -1
- package/build/server/chunks/{_server.ts-iXjPBf7J.js → _server.ts-DiHLYNbQ.js} +7 -7
- package/build/server/chunks/{_server.ts-iXjPBf7J.js.map → _server.ts-DiHLYNbQ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-fenM6Iln.js → _server.ts-Dio2CslE.js} +7 -7
- package/build/server/chunks/_server.ts-Dio2CslE.js.map +1 -0
- package/build/server/chunks/{_server.ts-DcpOpD6s.js → _server.ts-Dlt1obi9.js} +6 -6
- package/build/server/chunks/{_server.ts-DcpOpD6s.js.map → _server.ts-Dlt1obi9.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CEUFtmpE.js → _server.ts-Ds0U_zKR.js} +7 -7
- package/build/server/chunks/{_server.ts-CEUFtmpE.js.map → _server.ts-Ds0U_zKR.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DlKT-RbM.js → _server.ts-DsVsFcf8.js} +15 -10
- package/build/server/chunks/_server.ts-DsVsFcf8.js.map +1 -0
- package/build/server/chunks/{_server.ts-BCpQ8Qdr.js → _server.ts-Du3PIYf8.js} +6 -6
- package/build/server/chunks/{_server.ts-BCpQ8Qdr.js.map → _server.ts-Du3PIYf8.js.map} +1 -1
- package/build/server/chunks/{_server.ts-3bBG0DBN.js → _server.ts-Duzj6Wm_.js} +6 -18
- package/build/server/chunks/_server.ts-Duzj6Wm_.js.map +1 -0
- package/build/server/chunks/{_server.ts-BGTw6w-C.js → _server.ts-DyaoaWIS.js} +7 -7
- package/build/server/chunks/{_server.ts-BGTw6w-C.js.map → _server.ts-DyaoaWIS.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CxH-7UEc.js → _server.ts-EYtSo6HZ.js} +6 -6
- package/build/server/chunks/{_server.ts-CxH-7UEc.js.map → _server.ts-EYtSo6HZ.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BgOS_sDK.js → _server.ts-JvnkkOhX.js} +7 -7
- package/build/server/chunks/{_server.ts-BgOS_sDK.js.map → _server.ts-JvnkkOhX.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DzV6EO26.js → _server.ts-N0u5ruZe.js} +6 -6
- package/build/server/chunks/{_server.ts-DzV6EO26.js.map → _server.ts-N0u5ruZe.js.map} +1 -1
- package/build/server/chunks/{_server.ts-D0XsGdhx.js → _server.ts-NdCztCBP.js} +6 -6
- package/build/server/chunks/{_server.ts-D0XsGdhx.js.map → _server.ts-NdCztCBP.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CFKGqT4L.js → _server.ts-OGUKP5Tu.js} +6 -6
- package/build/server/chunks/{_server.ts-CFKGqT4L.js.map → _server.ts-OGUKP5Tu.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DuO_GU5A.js → _server.ts-Q1KEyBck.js} +6 -6
- package/build/server/chunks/{_server.ts-DuO_GU5A.js.map → _server.ts-Q1KEyBck.js.map} +1 -1
- package/build/server/chunks/{_server.ts-z5C3PAAB.js → _server.ts-TIRuudir.js} +2 -2
- package/build/server/chunks/{_server.ts-z5C3PAAB.js.map → _server.ts-TIRuudir.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DXwG4w1_.js → _server.ts-WTZtC5sX.js} +10 -4
- package/build/server/chunks/_server.ts-WTZtC5sX.js.map +1 -0
- package/build/server/chunks/{_server.ts-DR_9WXW4.js → _server.ts-WsWoJE5V.js} +8 -8
- package/build/server/chunks/{_server.ts-DR_9WXW4.js.map → _server.ts-WsWoJE5V.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CjeMP5Vf.js → _server.ts-X8GX4ChJ.js} +6 -6
- package/build/server/chunks/{_server.ts-CjeMP5Vf.js.map → _server.ts-X8GX4ChJ.js.map} +1 -1
- package/build/server/chunks/{_server.ts--F22byeV.js → _server.ts-XIc2PDRd.js} +7 -7
- package/build/server/chunks/{_server.ts--F22byeV.js.map → _server.ts-XIc2PDRd.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CQeqwCqj.js → _server.ts-YsFgaaVd.js} +6 -6
- package/build/server/chunks/{_server.ts-CQeqwCqj.js.map → _server.ts-YsFgaaVd.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CpyfojV9.js → _server.ts-bOcb37D9.js} +7 -7
- package/build/server/chunks/{_server.ts-CpyfojV9.js.map → _server.ts-bOcb37D9.js.map} +1 -1
- package/build/server/chunks/{_server.ts-yZ8CGJNE.js → _server.ts-e_8LykNe.js} +7 -7
- package/build/server/chunks/{_server.ts-yZ8CGJNE.js.map → _server.ts-e_8LykNe.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CY-GNKZT.js → _server.ts-hLimfy8i.js} +6 -6
- package/build/server/chunks/{_server.ts-CY-GNKZT.js.map → _server.ts-hLimfy8i.js.map} +1 -1
- package/build/server/chunks/{_server.ts-AC1zqetQ.js → _server.ts-khI1sqja.js} +2 -2
- package/build/server/chunks/{_server.ts-AC1zqetQ.js.map → _server.ts-khI1sqja.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BF5JzSrs.js → _server.ts-p1Z3DBlr.js} +6 -6
- package/build/server/chunks/{_server.ts-BF5JzSrs.js.map → _server.ts-p1Z3DBlr.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DvfnkNfI.js → _server.ts-uzB454LO.js} +7 -7
- package/build/server/chunks/{_server.ts-DvfnkNfI.js.map → _server.ts-uzB454LO.js.map} +1 -1
- package/build/server/chunks/{_server.ts-jqktLs6L.js → _server.ts-wKSTgSwf.js} +6 -6
- package/build/server/chunks/{_server.ts-jqktLs6L.js.map → _server.ts-wKSTgSwf.js.map} +1 -1
- package/build/server/chunks/addon-helpers-DaC3GR9u.js +153 -0
- package/build/server/chunks/addon-helpers-DaC3GR9u.js.map +1 -0
- package/build/server/chunks/{admin-update-lock-B-z4UE8R.js → admin-update-lock-Bu3VvAoN.js} +3 -3
- package/build/server/chunks/{admin-update-lock-B-z4UE8R.js.map → admin-update-lock-Bu3VvAoN.js.map} +1 -1
- package/build/server/chunks/{akm-C4NCZfJB.js → akm-DsJ8_uuW.js} +2 -2
- package/build/server/chunks/{akm-C4NCZfJB.js.map → akm-DsJ8_uuW.js.map} +1 -1
- package/build/server/chunks/{_server.ts-08JCSzPu.js → bring-up-BBKMJltU.js} +30 -228
- package/build/server/chunks/bring-up-BBKMJltU.js.map +1 -0
- package/build/server/chunks/{catalog-Czlhb_2V.js → catalog-8d-U0FbY.js} +5 -5
- package/build/server/chunks/{catalog-Czlhb_2V.js.map → catalog-8d-U0FbY.js.map} +1 -1
- package/build/server/chunks/{client-HEAniq5u.js → client-CHoZA_w9.js} +2 -2
- package/build/server/chunks/{client-HEAniq5u.js.map → client-CHoZA_w9.js.map} +1 -1
- package/build/server/chunks/{compose-args2-B1cYvF5r.js → compose-args2-C9sLS6QR.js} +2 -2
- package/build/server/chunks/compose-args2-C9sLS6QR.js.map +1 -0
- package/build/server/chunks/{config-C15S-ENd.js → config-ChxZZk6h.js} +2 -2
- package/build/server/chunks/{config-C15S-ENd.js.map → config-ChxZZk6h.js.map} +1 -1
- package/build/server/chunks/{docker2-CF7qyd1U.js → docker2-DGq6J3Kp.js} +2 -2
- package/build/server/chunks/docker2-DGq6J3Kp.js.map +1 -0
- package/build/server/chunks/{docker3-BsPagEza.js → docker3-DFlJ-o_d.js} +2 -2
- package/build/server/chunks/{docker3-BsPagEza.js.map → docker3-DFlJ-o_d.js.map} +1 -1
- package/build/server/chunks/environment-BYp8JQYM.js.map +1 -1
- package/build/server/chunks/{error.svelte-C-lukbaB.js → error.svelte-BXxIEYd4.js} +4 -4
- package/build/server/chunks/{error.svelte-C-lukbaB.js.map → error.svelte-BXxIEYd4.js.map} +1 -1
- package/build/server/chunks/{features-DltizIi4.js → features-D8Ez2vwC.js} +26 -4
- package/build/server/chunks/features-D8Ez2vwC.js.map +1 -0
- package/build/server/chunks/{helpers-DWpoPvHz.js → helpers-BrD1e__f.js} +4 -4
- package/build/server/chunks/{helpers-DWpoPvHz.js.map → helpers-BrD1e__f.js.map} +1 -1
- package/build/server/chunks/{hooks.server-BcdEyWVU.js → hooks.server-Blba-Qw7.js} +9 -9
- package/build/server/chunks/{hooks.server-BcdEyWVU.js.map → hooks.server-Blba-Qw7.js.map} +1 -1
- package/build/server/chunks/{http-7E5W3vGt.js → http-B4Us23Mo.js} +2 -2
- package/build/server/chunks/{http-7E5W3vGt.js.map → http-B4Us23Mo.js.map} +1 -1
- package/build/server/chunks/{internal-BNSUwl-r.js → internal-CSnzBDeT.js} +3 -3
- package/build/server/chunks/{internal-BNSUwl-r.js.map → internal-CSnzBDeT.js.map} +1 -1
- package/build/server/chunks/{landing-DY53l_CN.js → landing-DxFOhZxH.js} +5 -5
- package/build/server/chunks/{landing-DY53l_CN.js.map → landing-DxFOhZxH.js.map} +1 -1
- package/build/server/chunks/{opencode-target-DYD2zQ4l.js → opencode-target-D4BxXYHJ.js} +3 -3
- package/build/server/chunks/{opencode-target-DYD2zQ4l.js.map → opencode-target-D4BxXYHJ.js.map} +1 -1
- package/build/server/chunks/{paths-BVdkvR9U.js → paths-6f-5gYkd.js} +2 -2
- package/build/server/chunks/{paths-BVdkvR9U.js.map → paths-6f-5gYkd.js.map} +1 -1
- package/build/server/chunks/{session-cookie-D2_H1UEW.js → session-cookie-5J3xCH94.js} +2 -2
- package/build/server/chunks/{session-cookie-D2_H1UEW.js.map → session-cookie-5J3xCH94.js.map} +1 -1
- package/build/server/chunks/{setup-deploy-C1h733rH.js → setup-deploy-DUbX3fHm.js} +2 -2
- package/build/server/chunks/{setup-deploy-C1h733rH.js.map → setup-deploy-DUbX3fHm.js.map} +1 -1
- package/build/server/chunks/{src-B2-r_9oB.js → src-B2wHibme.js} +55 -70
- package/build/server/chunks/src-B2wHibme.js.map +1 -0
- package/build/server/chunks/{state-Dkjz2T4C.js → state-JIy0tegD.js} +2 -2
- package/build/server/chunks/{state-Dkjz2T4C.js.map → state-JIy0tegD.js.map} +1 -1
- package/build/server/chunks/{state2-CS9rhust.js → state2-Br2snAqo.js} +2 -2
- package/build/server/chunks/{state2-CS9rhust.js.map → state2-Br2snAqo.js.map} +1 -1
- package/build/server/chunks/voice-state.svelte-DU9g_xEh.js +1610 -0
- package/build/server/chunks/voice-state.svelte-DU9g_xEh.js.map +1 -0
- package/build/server/index.js +1 -1
- package/build/server/manifest.js +96 -110
- package/build/server/manifest.js.map +1 -1
- package/package.json +3 -3
- package/build/client/_app/immutable/assets/7.BsquVIMw.css +0 -1
- package/build/client/_app/immutable/assets/7.BsquVIMw.css.br +0 -0
- package/build/client/_app/immutable/assets/7.BsquVIMw.css.gz +0 -0
- package/build/client/_app/immutable/assets/9.D8zTZB7v.css +0 -1
- package/build/client/_app/immutable/assets/9.D8zTZB7v.css.br +0 -0
- package/build/client/_app/immutable/assets/9.D8zTZB7v.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BE_4J5sS.js.br +0 -0
- package/build/client/_app/immutable/chunks/BE_4J5sS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BdIq5WIo.js.br +0 -5
- package/build/client/_app/immutable/chunks/BdIq5WIo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Clt9pCG1.js.br +0 -0
- package/build/client/_app/immutable/chunks/Clt9pCG1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CuKFR3Qo.js.br +0 -0
- package/build/client/_app/immutable/chunks/CuKFR3Qo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D1VTYdXF.js +0 -1
- package/build/client/_app/immutable/chunks/D1VTYdXF.js.br +0 -0
- package/build/client/_app/immutable/chunks/D1VTYdXF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DF5Aoa59.js +0 -1
- package/build/client/_app/immutable/chunks/DF5Aoa59.js.br +0 -2
- package/build/client/_app/immutable/chunks/DF5Aoa59.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DaRQZQEK.js +0 -5
- package/build/client/_app/immutable/chunks/DaRQZQEK.js.br +0 -0
- package/build/client/_app/immutable/chunks/DaRQZQEK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dz-hw4Sz.js +0 -5
- package/build/client/_app/immutable/chunks/Dz-hw4Sz.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dz-hw4Sz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/mNzUu332.js.br +0 -0
- package/build/client/_app/immutable/chunks/mNzUu332.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DKG33-gU.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DKG33-gU.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.vDtUfDrT.js +0 -1
- package/build/client/_app/immutable/entry/start.vDtUfDrT.js.br +0 -1
- package/build/client/_app/immutable/entry/start.vDtUfDrT.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.eA5H3idZ.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.eA5H3idZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CvKFymDh.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.CvKFymDh.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.DFMf8WUQ.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.DFMf8WUQ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.BZQW5Y67.js +0 -8
- package/build/client/_app/immutable/nodes/11.BZQW5Y67.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.BZQW5Y67.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.B-36aGPk.js +0 -1
- package/build/client/_app/immutable/nodes/4.B-36aGPk.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.B-36aGPk.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.bgdUYUlr.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.bgdUYUlr.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.D0P837Li.js +0 -2
- package/build/client/_app/immutable/nodes/6.D0P837Li.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.D0P837Li.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.C4seSCJq.js +0 -14
- package/build/client/_app/immutable/nodes/7.C4seSCJq.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.C4seSCJq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DCgNAMuD.js +0 -128
- package/build/client/_app/immutable/nodes/9.DCgNAMuD.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DCgNAMuD.js.gz +0 -0
- package/build/server/chunks/0-D9FIO-Bk.js.map +0 -1
- package/build/server/chunks/1-ItPJxTHP.js +0 -9
- package/build/server/chunks/11-CZj9K6K7.js +0 -9
- package/build/server/chunks/11-CZj9K6K7.js.map +0 -1
- package/build/server/chunks/6-DxXeT1e3.js +0 -9
- package/build/server/chunks/7-CuHe_mFY.js +0 -9
- package/build/server/chunks/7-CuHe_mFY.js.map +0 -1
- package/build/server/chunks/9-CVIPxN5B.js +0 -9
- package/build/server/chunks/9-CVIPxN5B.js.map +0 -1
- package/build/server/chunks/IconMic-BbjkE_nG.js +0 -18
- package/build/server/chunks/IconMic-BbjkE_nG.js.map +0 -1
- package/build/server/chunks/IconStop-DKVpXPKq.js.map +0 -1
- package/build/server/chunks/_page.svelte-BcpGl-vl.js +0 -91
- package/build/server/chunks/_page.svelte-BcpGl-vl.js.map +0 -1
- package/build/server/chunks/_page.svelte-CGEtuNmS.js.map +0 -1
- package/build/server/chunks/_page.svelte-FOm-OMQe.js.map +0 -1
- package/build/server/chunks/_page.svelte-qxgG6hsh.js.map +0 -1
- package/build/server/chunks/_server.ts-08JCSzPu.js.map +0 -1
- package/build/server/chunks/_server.ts-3bBG0DBN.js.map +0 -1
- package/build/server/chunks/_server.ts-B0MK-ynu.js.map +0 -1
- package/build/server/chunks/_server.ts-BS4UTF4H.js +0 -93
- package/build/server/chunks/_server.ts-BS4UTF4H.js.map +0 -1
- package/build/server/chunks/_server.ts-DXwG4w1_.js.map +0 -1
- package/build/server/chunks/_server.ts-DlKT-RbM.js.map +0 -1
- package/build/server/chunks/_server.ts-fenM6Iln.js.map +0 -1
- package/build/server/chunks/_server.ts-zt3yI2wU.js +0 -97
- package/build/server/chunks/_server.ts-zt3yI2wU.js.map +0 -1
- package/build/server/chunks/addon-helpers-B7bkHg-K.js +0 -64
- package/build/server/chunks/addon-helpers-B7bkHg-K.js.map +0 -1
- package/build/server/chunks/compose-args2-B1cYvF5r.js.map +0 -1
- package/build/server/chunks/docker2-CF7qyd1U.js.map +0 -1
- package/build/server/chunks/features-DltizIi4.js.map +0 -1
- package/build/server/chunks/speakable-text-BflxDDdY.js +0 -65
- package/build/server/chunks/speakable-text-BflxDDdY.js.map +0 -1
- package/build/server/chunks/src-B2-r_9oB.js.map +0 -1
- package/build/server/chunks/voice-state.svelte-CSmyLPRH.js +0 -561
- package/build/server/chunks/voice-state.svelte-CSmyLPRH.js.map +0 -1
- /package/build/client/_app/immutable/chunks/{DD22UF1L.js → DD22UF1L2.js} +0 -0
- /package/build/client/_app/immutable/chunks/{DD22UF1L.js.br → DD22UF1L2.js.br} +0 -0
- /package/build/client/_app/immutable/chunks/{DD22UF1L.js.gz → DD22UF1L2.js.gz} +0 -0
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
import { p as derived, d as attr, e as attr_class, a9 as stringify } from './dev-D85DamNs.js';
|
|
2
|
-
import {
|
|
2
|
+
import { g as getConnectionStore, l as loadRuntimeConfig, s as setActiveConnection, i as isLoopbackHost, a as getTransport } from './voice-state.svelte-DU9g_xEh.js';
|
|
3
3
|
|
|
4
|
+
//#region ../ui-kit/src/lib/components/icons/IconThemeSystem.svelte
|
|
5
|
+
function IconThemeSystem($$renderer, $$props) {
|
|
6
|
+
let { size = 20, class: className = "" } = $$props;
|
|
7
|
+
$$renderer.push(`<svg xmlns="http://www.w3.org/2000/svg"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"${attr_class(`lucide lucide-sun-moon-icon lucide-sun-moon s-icon ${stringify(className)}`)}><path d="M12 2v2"></path><path d="M14.837 16.385a6 6 0 1 1-7.223-7.222c.624-.147.97.66.715 1.248a4 4 0 0 0 5.26 5.259c.589-.255 1.396.09 1.248.715"></path><path d="M16 12a4 4 0 0 0-4-4"></path><path d="m19 5-1.256 1.256"></path><path d="M20 12h2"></path></svg>`);
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region ../ui-kit/src/lib/components/icons/IconThemeLight.svelte
|
|
11
|
+
function IconThemeLight($$renderer, $$props) {
|
|
12
|
+
let { size = 20, class: className = "" } = $$props;
|
|
13
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"${attr_class(`s-icon ${stringify(className)}`)}><circle cx="12" cy="12" r="4"></circle><path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M19.4 4.6l-1.6 1.6M6.2 17.8l-1.6 1.6"></path></svg>`);
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region ../ui-kit/src/lib/components/icons/IconThemeDark.svelte
|
|
17
|
+
function IconThemeDark($$renderer, $$props) {
|
|
18
|
+
let { size = 20, class: className = "" } = $$props;
|
|
19
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"${attr_class(`s-icon ${stringify(className)}`)}><path d="M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z"></path></svg>`);
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
4
22
|
//#region src/lib/chat/tool-strip.ts
|
|
5
23
|
function valueToText$1(value) {
|
|
6
24
|
if (typeof value === "string") return value;
|
|
@@ -340,832 +358,6 @@ function flattenSessionMessages(rows) {
|
|
|
340
358
|
return messages;
|
|
341
359
|
}
|
|
342
360
|
//#endregion
|
|
343
|
-
//#region src/lib/connections/url-policy.ts
|
|
344
|
-
/**
|
|
345
|
-
* Browser-owned connection URL policy (Phase 3a — "One UI, delete the split").
|
|
346
|
-
*
|
|
347
|
-
* A leaf module with zero imports so both the direct transport
|
|
348
|
-
* (`probeHealth()` short-circuit) and the connections form can consult it
|
|
349
|
-
* without pulling in the IndexedDB store module. There is no guardian
|
|
350
|
-
* `/oc`-appending helper — Guardian is a transparent OpenCode proxy now, so
|
|
351
|
-
* the user provides the exact baseUrl and no path inference is performed.
|
|
352
|
-
*
|
|
353
|
-
* The ONLY refusal trigger: a plain-http, non-loopback connection URL is
|
|
354
|
-
* refused iff the app itself runs on an https: origin. This is exactly the
|
|
355
|
-
* platform mixed-content rule (an https origin cannot `fetch()` a plain-http
|
|
356
|
-
* cross-origin target — the request would never leave the browser), not a
|
|
357
|
-
* broader "https or non-loopback origin" check. Preserves:
|
|
358
|
-
* - loopback TARGETS from any origin (mixed-content loopback exemption —
|
|
359
|
-
* `http://127.0.0.1`/`localhost`/`::1` are "potentially trustworthy"),
|
|
360
|
-
* - plain-http LAN targets from a loopback-origin client (the zero-TLS
|
|
361
|
-
* desktop default — a `http://127.0.0.1` origin is a secure context),
|
|
362
|
-
* - plain-http LAN targets from a non-loopback http ORIGIN (the LAN-served
|
|
363
|
-
* tier: `rewriteLoopbackUrlForBrowserHost` in `./store.ts`).
|
|
364
|
-
*/
|
|
365
|
-
/** Canonical deep link to the TLS integration guide. Pinned by a test that
|
|
366
|
-
* the path segment names a real file, so a docs rename breaks CI instead of
|
|
367
|
-
* shipping a dead link. */
|
|
368
|
-
var TLS_GUIDE_URL = "https://github.com/itlackey/openpalm/blob/main/docs/remote-access-tls.md";
|
|
369
|
-
function isLoopbackHost(hostname) {
|
|
370
|
-
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1" || hostname === "[::1]";
|
|
371
|
-
}
|
|
372
|
-
/** Remove legacy URL-embedded credentials before a URL reaches UI or storage. */
|
|
373
|
-
function redactUrlUserinfo(rawUrl) {
|
|
374
|
-
try {
|
|
375
|
-
const url = new URL(rawUrl);
|
|
376
|
-
url.username = "";
|
|
377
|
-
url.password = "";
|
|
378
|
-
return url.toString().replace(/\/$/, url.pathname === "/" && !rawUrl.endsWith("/") ? "" : "/");
|
|
379
|
-
} catch {
|
|
380
|
-
return rawUrl;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Refuse a plain-http non-loopback connection URL iff the app's own origin is
|
|
385
|
-
* https: (mixed content — the request could never succeed, so refuse up front
|
|
386
|
-
* with guidance instead of a generic fetch failure).
|
|
387
|
-
*
|
|
388
|
-
* `origin` defaults to `globalThis.location`; a null/undefined origin
|
|
389
|
-
* (non-browser context — tests, SSR) always allows, since there is no browser
|
|
390
|
-
* mixed-content policy to enforce there.
|
|
391
|
-
*/
|
|
392
|
-
function validateConnectionUrl(rawUrl, origin = globalThis.location ?? null) {
|
|
393
|
-
let url;
|
|
394
|
-
try {
|
|
395
|
-
url = new URL(rawUrl);
|
|
396
|
-
} catch {
|
|
397
|
-
return {
|
|
398
|
-
ok: false,
|
|
399
|
-
reason: "invalid-url",
|
|
400
|
-
message: "Enter a valid URL."
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
if (url.protocol !== "http:" && url.protocol !== "https:") return {
|
|
404
|
-
ok: false,
|
|
405
|
-
reason: "invalid-url",
|
|
406
|
-
message: "The URL must use http:// or https://."
|
|
407
|
-
};
|
|
408
|
-
if (url.username || url.password) return {
|
|
409
|
-
ok: false,
|
|
410
|
-
reason: "userinfo-not-allowed",
|
|
411
|
-
message: "Do not put credentials in the URL. Use the Authentication fields instead."
|
|
412
|
-
};
|
|
413
|
-
if (url.protocol === "https:") return { ok: true };
|
|
414
|
-
if (isLoopbackHost(url.hostname)) return { ok: true };
|
|
415
|
-
if (origin?.protocol !== "https:") return { ok: true };
|
|
416
|
-
return {
|
|
417
|
-
ok: false,
|
|
418
|
-
reason: "insecure-remote",
|
|
419
|
-
message: "This app runs on a secure (https) origin, so browsers block plain-HTTP connections to remote servers. Use an https:// URL — see the TLS setup guide.",
|
|
420
|
-
guideUrl: TLS_GUIDE_URL
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
//#endregion
|
|
424
|
-
//#region src/lib/connections/store.ts
|
|
425
|
-
/**
|
|
426
|
-
* Browser-owned connection store (Phase 3a — "One UI, delete the split").
|
|
427
|
-
*
|
|
428
|
-
* Connection records persist behind a storage abstraction so the same store
|
|
429
|
-
* logic runs over IndexedDB in the browser (offline-readable) and over an
|
|
430
|
-
* in-memory backend in tests. The store API is async throughout (IndexedDB is
|
|
431
|
-
* async) and keeps NO state in store-instance fields — a page reload
|
|
432
|
-
* constructs a new store over the same backend and must see identical state.
|
|
433
|
-
*
|
|
434
|
-
* Locked/default entries are seeded from a runtime-config.json fetched from
|
|
435
|
-
* the app's own origin at boot. Absent file = no default connection.
|
|
436
|
-
*
|
|
437
|
-
* The Connection shape is `{ id, label, baseUrl, auth }` with auth narrowed to
|
|
438
|
-
* none | basic (Guardian is a transparent OpenCode proxy — Basic is the only
|
|
439
|
-
* connection credential model).
|
|
440
|
-
*/
|
|
441
|
-
function rewriteLoopbackUrlForBrowserHost(rawUrl) {
|
|
442
|
-
const locationLike = globalThis.location;
|
|
443
|
-
const redactedUrl = redactUrlUserinfo(rawUrl);
|
|
444
|
-
if (!locationLike || isLoopbackHost(locationLike.hostname)) return redactedUrl;
|
|
445
|
-
try {
|
|
446
|
-
const url = new URL(redactedUrl);
|
|
447
|
-
if (!isLoopbackHost(url.hostname)) return redactedUrl;
|
|
448
|
-
url.hostname = locationLike.hostname;
|
|
449
|
-
return url.toString();
|
|
450
|
-
} catch {
|
|
451
|
-
return redactedUrl;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
function redactEntryUrl(entry) {
|
|
455
|
-
const baseUrl = redactUrlUserinfo(entry.baseUrl);
|
|
456
|
-
return baseUrl === entry.baseUrl ? entry : {
|
|
457
|
-
...entry,
|
|
458
|
-
baseUrl
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
function assertUrlHasNoUserinfo(rawUrl) {
|
|
462
|
-
let url;
|
|
463
|
-
try {
|
|
464
|
-
url = new URL(rawUrl);
|
|
465
|
-
} catch {
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
if (url.username || url.password) throw new Error("Credentials must use the Authentication fields, not the connection URL.");
|
|
469
|
-
}
|
|
470
|
-
function adaptRuntimeConfigForBrowser(config) {
|
|
471
|
-
return { connections: config.connections.map((entry) => ({
|
|
472
|
-
...redactEntryUrl(entry),
|
|
473
|
-
baseUrl: entry.locked ? rewriteLoopbackUrlForBrowserHost(entry.baseUrl) : redactUrlUserinfo(entry.baseUrl)
|
|
474
|
-
})) };
|
|
475
|
-
}
|
|
476
|
-
var ACTIVE_ID_KEY = "activeId";
|
|
477
|
-
function clone(value) {
|
|
478
|
-
return structuredClone(value);
|
|
479
|
-
}
|
|
480
|
-
/** In-memory storage backend — same semantics as the IndexedDB one. */
|
|
481
|
-
function createMemoryStorage() {
|
|
482
|
-
const entries = /* @__PURE__ */ new Map();
|
|
483
|
-
const meta = /* @__PURE__ */ new Map();
|
|
484
|
-
let cryptoKey = null;
|
|
485
|
-
return {
|
|
486
|
-
async getAll() {
|
|
487
|
-
return [...entries.values()].map(clone);
|
|
488
|
-
},
|
|
489
|
-
async get(id) {
|
|
490
|
-
const entry = entries.get(id);
|
|
491
|
-
return entry ? clone(entry) : null;
|
|
492
|
-
},
|
|
493
|
-
async put(entry) {
|
|
494
|
-
entries.set(entry.id, clone(redactEntryUrl(entry)));
|
|
495
|
-
},
|
|
496
|
-
async delete(id) {
|
|
497
|
-
entries.delete(id);
|
|
498
|
-
},
|
|
499
|
-
async getMeta(key) {
|
|
500
|
-
return meta.get(key) ?? null;
|
|
501
|
-
},
|
|
502
|
-
async setMeta(key, value) {
|
|
503
|
-
if (value === null) meta.delete(key);
|
|
504
|
-
else meta.set(key, value);
|
|
505
|
-
},
|
|
506
|
-
async getCryptoKey() {
|
|
507
|
-
return cryptoKey;
|
|
508
|
-
},
|
|
509
|
-
async setCryptoKey(key) {
|
|
510
|
-
cryptoKey = key;
|
|
511
|
-
}
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
var IDB_NAME = "openpalm-ui-connections";
|
|
515
|
-
var IDB_VERSION = 1;
|
|
516
|
-
var STORE_CONNECTIONS = "connections";
|
|
517
|
-
var STORE_META = "meta";
|
|
518
|
-
var STORE_KEYS = "keys";
|
|
519
|
-
var CRYPTO_KEY_ID = "secret-store-aes-gcm-key";
|
|
520
|
-
function idbRequest(request) {
|
|
521
|
-
return new Promise((resolve, reject) => {
|
|
522
|
-
request.onsuccess = () => resolve(request.result);
|
|
523
|
-
request.onerror = () => reject(request.error ?? /* @__PURE__ */ new Error("IndexedDB request failed"));
|
|
524
|
-
});
|
|
525
|
-
}
|
|
526
|
-
/**
|
|
527
|
-
* F11 hardening: an IDB version bump with no `onblocked` handler and no
|
|
528
|
-
* `versionchange` listener can leave a boot hung forever with no error
|
|
529
|
-
* surfaced anywhere. `onblocked` rejects the open promise; `onVersionChange`
|
|
530
|
-
* is invoked once a successfully-opened connection later receives its OWN
|
|
531
|
-
* `versionchange` event (some other tab needs an upgrade): the connection
|
|
532
|
-
* closes itself immediately so it can't go on to block that upgrade in turn,
|
|
533
|
-
* and the caller uses the callback to drop its cached db promise so the NEXT
|
|
534
|
-
* storage operation reopens fresh.
|
|
535
|
-
*/
|
|
536
|
-
function openDatabase(onVersionChange) {
|
|
537
|
-
return new Promise((resolve, reject) => {
|
|
538
|
-
const request = indexedDB.open(IDB_NAME, IDB_VERSION);
|
|
539
|
-
request.onupgradeneeded = () => {
|
|
540
|
-
const db = request.result;
|
|
541
|
-
if (!db.objectStoreNames.contains(STORE_CONNECTIONS)) db.createObjectStore(STORE_CONNECTIONS, { keyPath: "id" });
|
|
542
|
-
if (!db.objectStoreNames.contains(STORE_META)) db.createObjectStore(STORE_META);
|
|
543
|
-
if (!db.objectStoreNames.contains(STORE_KEYS)) db.createObjectStore(STORE_KEYS);
|
|
544
|
-
};
|
|
545
|
-
request.onsuccess = () => {
|
|
546
|
-
const db = request.result;
|
|
547
|
-
db.onversionchange = () => {
|
|
548
|
-
db.close();
|
|
549
|
-
onVersionChange();
|
|
550
|
-
};
|
|
551
|
-
resolve(db);
|
|
552
|
-
};
|
|
553
|
-
request.onerror = () => reject(request.error ?? /* @__PURE__ */ new Error("IndexedDB open failed"));
|
|
554
|
-
request.onblocked = () => reject(/* @__PURE__ */ new Error("IndexedDB upgrade blocked by another open connection (close other tabs of this app and retry)"));
|
|
555
|
-
});
|
|
556
|
-
}
|
|
557
|
-
/**
|
|
558
|
-
* IndexedDB storage backend (raw IDB API, no deps). Lazily opens the database
|
|
559
|
-
* on first use; each operation runs in its own short transaction.
|
|
560
|
-
*/
|
|
561
|
-
function createIndexedDbStorage() {
|
|
562
|
-
let db = null;
|
|
563
|
-
const invalidate = () => {
|
|
564
|
-
db = null;
|
|
565
|
-
};
|
|
566
|
-
const database = () => {
|
|
567
|
-
db ??= openDatabase(invalidate);
|
|
568
|
-
return db;
|
|
569
|
-
};
|
|
570
|
-
const store = async (name, mode) => (await database()).transaction(name, mode).objectStore(name);
|
|
571
|
-
return {
|
|
572
|
-
async getAll() {
|
|
573
|
-
return idbRequest((await store(STORE_CONNECTIONS, "readonly")).getAll());
|
|
574
|
-
},
|
|
575
|
-
async get(id) {
|
|
576
|
-
return await idbRequest((await store(STORE_CONNECTIONS, "readonly")).get(id)) ?? null;
|
|
577
|
-
},
|
|
578
|
-
async put(entry) {
|
|
579
|
-
await idbRequest((await store(STORE_CONNECTIONS, "readwrite")).put(redactEntryUrl(entry)));
|
|
580
|
-
},
|
|
581
|
-
async delete(id) {
|
|
582
|
-
await idbRequest((await store(STORE_CONNECTIONS, "readwrite")).delete(id));
|
|
583
|
-
},
|
|
584
|
-
async getMeta(key) {
|
|
585
|
-
return await idbRequest((await store(STORE_META, "readonly")).get(key)) ?? null;
|
|
586
|
-
},
|
|
587
|
-
async setMeta(key, value) {
|
|
588
|
-
const metaStore = await store(STORE_META, "readwrite");
|
|
589
|
-
if (value === null) await idbRequest(metaStore.delete(key));
|
|
590
|
-
else await idbRequest(metaStore.put(value, key));
|
|
591
|
-
},
|
|
592
|
-
async getCryptoKey() {
|
|
593
|
-
return await idbRequest((await store(STORE_KEYS, "readonly")).get(CRYPTO_KEY_ID)) ?? null;
|
|
594
|
-
},
|
|
595
|
-
async setCryptoKey(key) {
|
|
596
|
-
await idbRequest((await store(STORE_KEYS, "readwrite")).put(key, CRYPTO_KEY_ID));
|
|
597
|
-
}
|
|
598
|
-
};
|
|
599
|
-
}
|
|
600
|
-
function createConnectionStore(options) {
|
|
601
|
-
const { storage } = options;
|
|
602
|
-
async function readEntry(id) {
|
|
603
|
-
const stored = await storage.get(id);
|
|
604
|
-
if (!stored) return null;
|
|
605
|
-
const entry = redactEntryUrl(stored);
|
|
606
|
-
if (entry.baseUrl !== stored.baseUrl) await storage.put(entry);
|
|
607
|
-
return entry;
|
|
608
|
-
}
|
|
609
|
-
async function requireEntry(id) {
|
|
610
|
-
const entry = await readEntry(id);
|
|
611
|
-
if (!entry) throw new Error(`Unknown connection: ${id}`);
|
|
612
|
-
return entry;
|
|
613
|
-
}
|
|
614
|
-
return {
|
|
615
|
-
async list() {
|
|
616
|
-
const stored = await storage.getAll();
|
|
617
|
-
const entries = stored.map(redactEntryUrl);
|
|
618
|
-
await Promise.all(entries.map((entry, index) => entry.baseUrl === stored[index]?.baseUrl ? Promise.resolve() : storage.put(entry)));
|
|
619
|
-
return entries;
|
|
620
|
-
},
|
|
621
|
-
get(id) {
|
|
622
|
-
return readEntry(id);
|
|
623
|
-
},
|
|
624
|
-
async add(input) {
|
|
625
|
-
assertUrlHasNoUserinfo(input.baseUrl);
|
|
626
|
-
const id = input.id ?? randomId();
|
|
627
|
-
if (await readEntry(id)) throw new Error(`Connection already exists: ${id}`);
|
|
628
|
-
const entry = {
|
|
629
|
-
...input,
|
|
630
|
-
id
|
|
631
|
-
};
|
|
632
|
-
await storage.put(entry);
|
|
633
|
-
return clone(entry);
|
|
634
|
-
},
|
|
635
|
-
async update(id, patch) {
|
|
636
|
-
if (patch.baseUrl !== void 0) assertUrlHasNoUserinfo(patch.baseUrl);
|
|
637
|
-
const entry = await requireEntry(id);
|
|
638
|
-
if (entry.locked) throw new Error(`Connection is locked (config-owned): ${id}`);
|
|
639
|
-
const updated = {
|
|
640
|
-
...entry,
|
|
641
|
-
...patch,
|
|
642
|
-
id
|
|
643
|
-
};
|
|
644
|
-
await storage.put(updated);
|
|
645
|
-
return clone(updated);
|
|
646
|
-
},
|
|
647
|
-
async remove(id) {
|
|
648
|
-
if ((await requireEntry(id)).locked) throw new Error(`Connection is locked (config-owned): ${id}`);
|
|
649
|
-
await storage.delete(id);
|
|
650
|
-
if (await storage.getMeta(ACTIVE_ID_KEY) === id) await storage.setMeta(ACTIVE_ID_KEY, null);
|
|
651
|
-
},
|
|
652
|
-
async setSecretRef(id, auth) {
|
|
653
|
-
const updated = {
|
|
654
|
-
...await requireEntry(id),
|
|
655
|
-
auth,
|
|
656
|
-
id
|
|
657
|
-
};
|
|
658
|
-
await storage.put(updated);
|
|
659
|
-
return clone(updated);
|
|
660
|
-
},
|
|
661
|
-
getActiveId() {
|
|
662
|
-
return storage.getMeta(ACTIVE_ID_KEY);
|
|
663
|
-
},
|
|
664
|
-
async getActive() {
|
|
665
|
-
const id = await storage.getMeta(ACTIVE_ID_KEY);
|
|
666
|
-
return id === null ? null : readEntry(id);
|
|
667
|
-
},
|
|
668
|
-
async setActive(id) {
|
|
669
|
-
await requireEntry(id);
|
|
670
|
-
await storage.setMeta(ACTIVE_ID_KEY, id);
|
|
671
|
-
},
|
|
672
|
-
async clearActive() {
|
|
673
|
-
await storage.setMeta(ACTIVE_ID_KEY, null);
|
|
674
|
-
},
|
|
675
|
-
async seedFromRuntimeConfig(config) {
|
|
676
|
-
if (!config) return;
|
|
677
|
-
const activeId = await storage.getMeta(ACTIVE_ID_KEY);
|
|
678
|
-
const configIds = new Set(config.connections.map((entry) => entry.id));
|
|
679
|
-
for (const existing of await storage.getAll()) {
|
|
680
|
-
if (!existing.locked || configIds.has(existing.id)) continue;
|
|
681
|
-
await storage.delete(existing.id);
|
|
682
|
-
if (activeId === existing.id) await storage.setMeta(ACTIVE_ID_KEY, null);
|
|
683
|
-
}
|
|
684
|
-
for (const entry of config.connections) {
|
|
685
|
-
const seededEntry = redactEntryUrl(entry);
|
|
686
|
-
const existing = await readEntry(entry.id);
|
|
687
|
-
if (!existing) await storage.put(clone(seededEntry));
|
|
688
|
-
else if (existing.locked) {
|
|
689
|
-
const seeded = clone(seededEntry);
|
|
690
|
-
const preserveAuth = existing.auth && existing.auth.mode !== "none";
|
|
691
|
-
await storage.put(preserveAuth ? {
|
|
692
|
-
...seeded,
|
|
693
|
-
auth: existing.auth
|
|
694
|
-
} : seeded);
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
if (await storage.getMeta(ACTIVE_ID_KEY) !== null) return;
|
|
698
|
-
const fallback = config.connections.find((entry) => entry.isDefault);
|
|
699
|
-
if (fallback && await storage.get(fallback.id)) await storage.setMeta(ACTIVE_ID_KEY, fallback.id);
|
|
700
|
-
}
|
|
701
|
-
};
|
|
702
|
-
}
|
|
703
|
-
/**
|
|
704
|
-
* Fetch '/runtime-config.json' from the app's OWN origin (relative URL — the
|
|
705
|
-
* static server ships the file beside the build; the app holds no other
|
|
706
|
-
* trusted origin at boot). Absent (404), unreachable (offline), or malformed
|
|
707
|
-
* -> null; never throws, so an offline PWA boot still reaches the stored
|
|
708
|
-
* connection list.
|
|
709
|
-
*/
|
|
710
|
-
async function loadRuntimeConfig(fetchImpl = globalThis.fetch) {
|
|
711
|
-
try {
|
|
712
|
-
const response = await fetchImpl("/runtime-config.json", {
|
|
713
|
-
method: "GET",
|
|
714
|
-
headers: { accept: "application/json" },
|
|
715
|
-
credentials: "omit"
|
|
716
|
-
});
|
|
717
|
-
if (!response.ok) return null;
|
|
718
|
-
const parsed = await response.json();
|
|
719
|
-
if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.connections)) return null;
|
|
720
|
-
return adaptRuntimeConfigForBrowser(parsed);
|
|
721
|
-
} catch {
|
|
722
|
-
return null;
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
//#endregion
|
|
726
|
-
//#region src/lib/connections/secrets.ts
|
|
727
|
-
var META_PREFIX = "secret:";
|
|
728
|
-
var ENCRYPTED_MARKER = 2;
|
|
729
|
-
var AES_GCM_LENGTH = 256;
|
|
730
|
-
var IV_BYTES = 12;
|
|
731
|
-
/**
|
|
732
|
-
* WebCrypto's `SubtleCrypto` is secure-context-only: on a plain-http LAN origin
|
|
733
|
-
* (the LAN-served tier) `crypto.subtle` is undefined, so encryption is simply
|
|
734
|
-
* not available there. Callers degrade to the legacy plaintext record shape —
|
|
735
|
-
* which `readMaterial` already reads — rather than throwing and blocking the
|
|
736
|
-
* user from saving a credential at all.
|
|
737
|
-
*/
|
|
738
|
-
function subtleAvailable() {
|
|
739
|
-
return typeof crypto !== "undefined" && !!crypto.subtle;
|
|
740
|
-
}
|
|
741
|
-
function isEncryptedRecord(value) {
|
|
742
|
-
return !!value && typeof value === "object" && value.v === ENCRYPTED_MARKER && typeof value.iv === "string" && typeof value.ciphertext === "string";
|
|
743
|
-
}
|
|
744
|
-
function bytesToBase64(bytes) {
|
|
745
|
-
let binary = "";
|
|
746
|
-
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
747
|
-
return btoa(binary);
|
|
748
|
-
}
|
|
749
|
-
function base64ToBytes(b64) {
|
|
750
|
-
const binary = atob(b64);
|
|
751
|
-
const bytes = new Uint8Array(binary.length);
|
|
752
|
-
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
|
|
753
|
-
return bytes;
|
|
754
|
-
}
|
|
755
|
-
var pendingKeys = /* @__PURE__ */ new WeakMap();
|
|
756
|
-
/** Generate-once, reuse-forever non-extractable AES-GCM key for this storage backend. */
|
|
757
|
-
async function getOrCreateKey(storage) {
|
|
758
|
-
const existing = await storage.getCryptoKey();
|
|
759
|
-
if (existing) return existing;
|
|
760
|
-
let pending = pendingKeys.get(storage);
|
|
761
|
-
if (!pending) {
|
|
762
|
-
pending = (async () => {
|
|
763
|
-
const key = await crypto.subtle.generateKey({
|
|
764
|
-
name: "AES-GCM",
|
|
765
|
-
length: AES_GCM_LENGTH
|
|
766
|
-
}, false, ["encrypt", "decrypt"]);
|
|
767
|
-
await storage.setCryptoKey(key);
|
|
768
|
-
return key;
|
|
769
|
-
})();
|
|
770
|
-
pendingKeys.set(storage, pending);
|
|
771
|
-
pending.catch(() => {
|
|
772
|
-
pendingKeys.delete(storage);
|
|
773
|
-
});
|
|
774
|
-
}
|
|
775
|
-
return pending;
|
|
776
|
-
}
|
|
777
|
-
async function encryptMaterial(key, material) {
|
|
778
|
-
const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES));
|
|
779
|
-
const plaintext = new TextEncoder().encode(JSON.stringify(material));
|
|
780
|
-
const ciphertext = new Uint8Array(await crypto.subtle.encrypt({
|
|
781
|
-
name: "AES-GCM",
|
|
782
|
-
iv
|
|
783
|
-
}, key, plaintext));
|
|
784
|
-
return {
|
|
785
|
-
v: ENCRYPTED_MARKER,
|
|
786
|
-
iv: bytesToBase64(iv),
|
|
787
|
-
ciphertext: bytesToBase64(ciphertext)
|
|
788
|
-
};
|
|
789
|
-
}
|
|
790
|
-
async function decryptRecord(key, record) {
|
|
791
|
-
const iv = base64ToBytes(record.iv);
|
|
792
|
-
const ciphertext = base64ToBytes(record.ciphertext);
|
|
793
|
-
const plaintext = await crypto.subtle.decrypt({
|
|
794
|
-
name: "AES-GCM",
|
|
795
|
-
iv
|
|
796
|
-
}, key, ciphertext);
|
|
797
|
-
return JSON.parse(new TextDecoder().decode(plaintext));
|
|
798
|
-
}
|
|
799
|
-
async function writeMaterial(storage, ref, material) {
|
|
800
|
-
if (!subtleAvailable()) {
|
|
801
|
-
await storage.setMeta(META_PREFIX + ref, JSON.stringify(material));
|
|
802
|
-
return;
|
|
803
|
-
}
|
|
804
|
-
const record = await encryptMaterial(await getOrCreateKey(storage), material);
|
|
805
|
-
await storage.setMeta(META_PREFIX + ref, JSON.stringify(record));
|
|
806
|
-
}
|
|
807
|
-
/**
|
|
808
|
-
* Read+decrypt a stored secret. Transparently migrates a legacy plaintext
|
|
809
|
-
* record by re-encrypting it in place before returning. Returns null for a
|
|
810
|
-
* missing ref or anything that can't be parsed/decrypted — the caller degrades
|
|
811
|
-
* gracefully rather than throwing.
|
|
812
|
-
*/
|
|
813
|
-
async function readMaterial(storage, ref) {
|
|
814
|
-
const raw = await storage.getMeta(META_PREFIX + ref);
|
|
815
|
-
if (raw === null) return null;
|
|
816
|
-
let parsed;
|
|
817
|
-
try {
|
|
818
|
-
parsed = JSON.parse(raw);
|
|
819
|
-
} catch {
|
|
820
|
-
return null;
|
|
821
|
-
}
|
|
822
|
-
if (isEncryptedRecord(parsed)) try {
|
|
823
|
-
return await decryptRecord(await getOrCreateKey(storage), parsed);
|
|
824
|
-
} catch {
|
|
825
|
-
return null;
|
|
826
|
-
}
|
|
827
|
-
const material = parsed;
|
|
828
|
-
if (subtleAvailable()) try {
|
|
829
|
-
await writeMaterial(storage, ref, material);
|
|
830
|
-
} catch {}
|
|
831
|
-
return material;
|
|
832
|
-
}
|
|
833
|
-
function createSecretStore(storage) {
|
|
834
|
-
return {
|
|
835
|
-
async set(ref, material) {
|
|
836
|
-
await writeMaterial(storage, ref, material);
|
|
837
|
-
},
|
|
838
|
-
async delete(ref) {
|
|
839
|
-
await storage.setMeta(META_PREFIX + ref, null);
|
|
840
|
-
},
|
|
841
|
-
async resolveAuth(entry) {
|
|
842
|
-
if (entry.auth.mode !== "basic" || !entry.auth.secretRef) return { mode: "none" };
|
|
843
|
-
const material = await readMaterial(storage, entry.auth.secretRef);
|
|
844
|
-
if (!material || typeof material.password !== "string") return { mode: "none" };
|
|
845
|
-
const username = entry.auth.username || material.username;
|
|
846
|
-
return username ? {
|
|
847
|
-
mode: "basic",
|
|
848
|
-
username,
|
|
849
|
-
password: material.password
|
|
850
|
-
} : {
|
|
851
|
-
mode: "basic",
|
|
852
|
-
password: material.password
|
|
853
|
-
};
|
|
854
|
-
},
|
|
855
|
-
async updateUsername(ref, username) {
|
|
856
|
-
const material = await readMaterial(storage, ref);
|
|
857
|
-
if (!material) return;
|
|
858
|
-
const updated = { ...material };
|
|
859
|
-
if (username === void 0) delete updated.username;
|
|
860
|
-
else updated.username = username;
|
|
861
|
-
await writeMaterial(storage, ref, updated);
|
|
862
|
-
}
|
|
863
|
-
};
|
|
864
|
-
}
|
|
865
|
-
//#endregion
|
|
866
|
-
//#region src/lib/chat/session-events.ts
|
|
867
|
-
/**
|
|
868
|
-
* SSE consumer for OpenCode's `/event` stream.
|
|
869
|
-
*
|
|
870
|
-
* Phase 3b ("One UI, delete the split"): the underlying stream is now opened by
|
|
871
|
-
* the browser-owned direct transport (`$lib/connections/boot.getTransport()`
|
|
872
|
-
* → `subscribeEvents(onFrame, signal)`), which talks to the active connection's
|
|
873
|
-
* OpenCode/Guardian base URL directly (no host proxy, no admin cookie) and
|
|
874
|
-
* REUSES this module's `parseFrame`. Reconnect/backoff, session-scoped dispatch,
|
|
875
|
-
* and abort semantics stay here — the chat layer's concern, not the transport's.
|
|
876
|
-
*
|
|
877
|
-
* Phase D of docs/technical/multi-endpoint-session-ux.md.
|
|
878
|
-
*/
|
|
879
|
-
var INITIAL_BACKOFF_MS = 1e3;
|
|
880
|
-
var MAX_BACKOFF_MS = 3e4;
|
|
881
|
-
/**
|
|
882
|
-
* Parse one `\n\n`-delimited SSE frame. Multi-line `data:` fields are
|
|
883
|
-
* concatenated with `\n` per the SSE spec. Reused by the direct transport.
|
|
884
|
-
*/
|
|
885
|
-
function parseFrame(chunk) {
|
|
886
|
-
const frame = {};
|
|
887
|
-
const dataLines = [];
|
|
888
|
-
for (const rawLine of chunk.split("\n")) {
|
|
889
|
-
if (!rawLine || rawLine.startsWith(":")) continue;
|
|
890
|
-
if (rawLine.startsWith("data:")) dataLines.push(rawLine.replace(/^data:\s?/, ""));
|
|
891
|
-
else if (rawLine.startsWith("event:")) frame.event = rawLine.replace(/^event:\s?/, "");
|
|
892
|
-
else if (rawLine.startsWith("id:")) frame.id = rawLine.replace(/^id:\s?/, "");
|
|
893
|
-
}
|
|
894
|
-
if (dataLines.length > 0) frame.data = dataLines.join("\n");
|
|
895
|
-
return frame;
|
|
896
|
-
}
|
|
897
|
-
function dispatch(handlers, payload) {
|
|
898
|
-
const info = payload.properties?.info;
|
|
899
|
-
const id = info?.id ?? payload.sessionID;
|
|
900
|
-
if (!id) return;
|
|
901
|
-
switch (payload.type) {
|
|
902
|
-
case "session.created":
|
|
903
|
-
handlers.onCreated(id);
|
|
904
|
-
return;
|
|
905
|
-
case "session.updated":
|
|
906
|
-
handlers.onUpdated(id, {
|
|
907
|
-
title: info?.title,
|
|
908
|
-
updatedAt: info?.time?.updated
|
|
909
|
-
});
|
|
910
|
-
return;
|
|
911
|
-
case "session.deleted":
|
|
912
|
-
handlers.onDeleted(id);
|
|
913
|
-
return;
|
|
914
|
-
default: return;
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
/**
|
|
918
|
-
* Open the active connection's `/event` SSE stream (via the direct transport)
|
|
919
|
-
* and dispatch session-scoped events. Returns an unsubscribe function that
|
|
920
|
-
* aborts the stream and prevents reconnection.
|
|
921
|
-
*
|
|
922
|
-
* `onConnect` fires on the first frame of each (re)connected stream — the point
|
|
923
|
-
* at which live updates are demonstrably flowing. The transport owns the fetch;
|
|
924
|
-
* this loop owns exponential-backoff reconnect and abort.
|
|
925
|
-
*/
|
|
926
|
-
function subscribeSessionEvents(handlers) {
|
|
927
|
-
let stopped = false;
|
|
928
|
-
let controller = new AbortController();
|
|
929
|
-
const sleep = (ms) => new Promise((resolve) => {
|
|
930
|
-
const timer = setTimeout(resolve, ms);
|
|
931
|
-
controller.signal.addEventListener("abort", () => {
|
|
932
|
-
clearTimeout(timer);
|
|
933
|
-
resolve();
|
|
934
|
-
}, { once: true });
|
|
935
|
-
});
|
|
936
|
-
async function readStream() {
|
|
937
|
-
let connected = false;
|
|
938
|
-
await getTransport().subscribeEvents((event) => {
|
|
939
|
-
if (!connected) {
|
|
940
|
-
connected = true;
|
|
941
|
-
handlers.onConnect?.();
|
|
942
|
-
}
|
|
943
|
-
const payload = event;
|
|
944
|
-
handlers.onEvent?.(payload);
|
|
945
|
-
dispatch(handlers, payload);
|
|
946
|
-
}, controller.signal);
|
|
947
|
-
}
|
|
948
|
-
(async () => {
|
|
949
|
-
let attempt = 0;
|
|
950
|
-
while (!stopped) try {
|
|
951
|
-
attempt++;
|
|
952
|
-
await readStream();
|
|
953
|
-
attempt = 0;
|
|
954
|
-
if (!stopped) await sleep(500);
|
|
955
|
-
} catch (err) {
|
|
956
|
-
if (stopped) return;
|
|
957
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
958
|
-
if (error.name !== "AbortError") {
|
|
959
|
-
console.warn("[session-events] SSE error, reconnecting", error);
|
|
960
|
-
handlers.onDisconnect?.(error);
|
|
961
|
-
}
|
|
962
|
-
await sleep(Math.min(INITIAL_BACKOFF_MS * 2 ** Math.max(0, attempt - 1), MAX_BACKOFF_MS));
|
|
963
|
-
if (controller.signal.aborted && !stopped) controller = new AbortController();
|
|
964
|
-
}
|
|
965
|
-
})();
|
|
966
|
-
return () => {
|
|
967
|
-
stopped = true;
|
|
968
|
-
try {
|
|
969
|
-
controller.abort();
|
|
970
|
-
} catch {}
|
|
971
|
-
};
|
|
972
|
-
}
|
|
973
|
-
//#endregion
|
|
974
|
-
//#region src/lib/transport/direct.ts
|
|
975
|
-
/**
|
|
976
|
-
* Minimal browser-owned direct transport (Phase 3a — "One UI, delete the
|
|
977
|
-
* split").
|
|
978
|
-
*
|
|
979
|
-
* Talks to a connection's OpenCode/Guardian base URL directly from the
|
|
980
|
-
* browser — no proxy, NO COOKIES (`credentials: 'omit'`). This is deliberately
|
|
981
|
-
* small: it exposes only the calls the ui chat layer needs and REUSES ui's
|
|
982
|
-
* existing SSE frame parser (`$lib/chat/session-events.ts` `parseFrame`) and
|
|
983
|
-
* event envelope type (`$lib/chat/oc-events.ts` `RawEvent`) rather than
|
|
984
|
-
* re-implementing them. Reconnect/backoff and session-scoped filtering are the
|
|
985
|
-
* chat layer's concern, not this transport's.
|
|
986
|
-
*/
|
|
987
|
-
var PROBE_TIMEOUT_MS = 5e3;
|
|
988
|
-
/**
|
|
989
|
-
* UTF-8-encode before base64ing: `btoa()` alone only accepts Latin-1 code
|
|
990
|
-
* points and throws a synchronous `InvalidCharacterError` for any password
|
|
991
|
-
* containing e.g. Cyrillic/CJK/emoji characters, before any network I/O.
|
|
992
|
-
*/
|
|
993
|
-
function base64Utf8(value) {
|
|
994
|
-
const bytes = new TextEncoder().encode(value);
|
|
995
|
-
let binary = "";
|
|
996
|
-
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
997
|
-
return btoa(binary);
|
|
998
|
-
}
|
|
999
|
-
/**
|
|
1000
|
-
* Build the `Authorization` header value for a resolved auth, or null for
|
|
1001
|
-
* `{ mode: 'none' }`. Basic username defaults to `'opencode'` (OpenCode's own
|
|
1002
|
-
* server default and what the host app sends).
|
|
1003
|
-
*/
|
|
1004
|
-
function authorizationHeader(auth) {
|
|
1005
|
-
if (auth.mode === "basic") return `Basic ${base64Utf8(`${auth.username ?? "opencode"}:${auth.password}`)}`;
|
|
1006
|
-
return null;
|
|
1007
|
-
}
|
|
1008
|
-
function createDirectTransport(getConnection, resolveAuth, fetchImpl = globalThis.fetch) {
|
|
1009
|
-
function requireConnection() {
|
|
1010
|
-
const connection = getConnection();
|
|
1011
|
-
if (!connection) throw new Error("No active connection");
|
|
1012
|
-
return connection;
|
|
1013
|
-
}
|
|
1014
|
-
/** Trailing-slash and path-prefix safe: reverse-proxied instances keep their prefix. */
|
|
1015
|
-
function baseFor(connection) {
|
|
1016
|
-
return connection.baseUrl.replace(/\/+$/, "");
|
|
1017
|
-
}
|
|
1018
|
-
async function authHeaders(connection) {
|
|
1019
|
-
const { authorization } = await resolveAuth(connection);
|
|
1020
|
-
return authorization ? { authorization } : {};
|
|
1021
|
-
}
|
|
1022
|
-
return {
|
|
1023
|
-
async request(method, path, body) {
|
|
1024
|
-
const connection = requireConnection();
|
|
1025
|
-
const init = {
|
|
1026
|
-
method,
|
|
1027
|
-
headers: {
|
|
1028
|
-
...body === void 0 ? {} : { "content-type": "application/json" },
|
|
1029
|
-
...await authHeaders(connection)
|
|
1030
|
-
},
|
|
1031
|
-
credentials: "omit"
|
|
1032
|
-
};
|
|
1033
|
-
if (body !== void 0) init.body = JSON.stringify(body);
|
|
1034
|
-
const response = await fetchImpl(`${baseFor(connection)}${path}`, init);
|
|
1035
|
-
if (!response.ok) throw Object.assign(/* @__PURE__ */ new Error(`HTTP ${response.status}`), { status: response.status });
|
|
1036
|
-
return response;
|
|
1037
|
-
},
|
|
1038
|
-
async subscribeEvents(onFrame, signal) {
|
|
1039
|
-
const connection = requireConnection();
|
|
1040
|
-
const response = await fetchImpl(`${baseFor(connection)}/event`, {
|
|
1041
|
-
method: "GET",
|
|
1042
|
-
headers: {
|
|
1043
|
-
accept: "text/event-stream",
|
|
1044
|
-
...await authHeaders(connection)
|
|
1045
|
-
},
|
|
1046
|
-
credentials: "omit",
|
|
1047
|
-
signal
|
|
1048
|
-
});
|
|
1049
|
-
if (!response.ok || !response.body) throw Object.assign(/* @__PURE__ */ new Error(`SSE stream failed: HTTP ${response.status}`), { status: response.status });
|
|
1050
|
-
const reader = response.body.getReader();
|
|
1051
|
-
const decoder = new TextDecoder();
|
|
1052
|
-
let buffer = "";
|
|
1053
|
-
try {
|
|
1054
|
-
while (true) {
|
|
1055
|
-
const { done, value } = await reader.read();
|
|
1056
|
-
if (done) break;
|
|
1057
|
-
buffer += decoder.decode(value, { stream: true });
|
|
1058
|
-
const chunks = buffer.split("\n\n");
|
|
1059
|
-
buffer = chunks.pop() ?? "";
|
|
1060
|
-
for (const chunk of chunks) {
|
|
1061
|
-
if (!chunk) continue;
|
|
1062
|
-
const frame = parseFrame(chunk);
|
|
1063
|
-
if (!frame.data) continue;
|
|
1064
|
-
let event;
|
|
1065
|
-
try {
|
|
1066
|
-
event = JSON.parse(frame.data);
|
|
1067
|
-
} catch {
|
|
1068
|
-
continue;
|
|
1069
|
-
}
|
|
1070
|
-
onFrame(event);
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
} finally {
|
|
1074
|
-
try {
|
|
1075
|
-
reader.releaseLock();
|
|
1076
|
-
} catch {}
|
|
1077
|
-
}
|
|
1078
|
-
},
|
|
1079
|
-
async probeHealth() {
|
|
1080
|
-
const connection = getConnection();
|
|
1081
|
-
if (!connection) return { status: "unreachable" };
|
|
1082
|
-
const base = baseFor(connection);
|
|
1083
|
-
const verdict = validateConnectionUrl(base);
|
|
1084
|
-
if (!verdict.ok && verdict.reason === "insecure-remote") return { status: "insecure" };
|
|
1085
|
-
try {
|
|
1086
|
-
const response = await fetchImpl(`${base}/`, {
|
|
1087
|
-
method: "GET",
|
|
1088
|
-
headers: await authHeaders(connection),
|
|
1089
|
-
credentials: "omit",
|
|
1090
|
-
cache: "no-store",
|
|
1091
|
-
signal: AbortSignal.timeout(PROBE_TIMEOUT_MS)
|
|
1092
|
-
});
|
|
1093
|
-
if (response.status === 401 || response.status === 403) return { status: "unauthorized" };
|
|
1094
|
-
if (response.ok || response.status >= 300 && response.status < 400) return { status: "accessible" };
|
|
1095
|
-
return { status: "unreachable" };
|
|
1096
|
-
} catch {
|
|
1097
|
-
return { status: "unreachable" };
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
};
|
|
1101
|
-
}
|
|
1102
|
-
//#endregion
|
|
1103
|
-
//#region src/lib/connections/boot.ts
|
|
1104
|
-
/**
|
|
1105
|
-
* Browser connection boot (Phase 3b — "One UI, delete the split").
|
|
1106
|
-
*
|
|
1107
|
-
* One storage backend + one ConnectionStore + one SecretStore + one direct
|
|
1108
|
-
* transport per browsing session, created lazily on first access. The chat
|
|
1109
|
-
* layer (`$lib/api/chat.ts`, `$lib/chat/session-events.ts`) and the connection
|
|
1110
|
-
* switcher (`$lib/endpoints-state.svelte.ts`) all share these singletons so the
|
|
1111
|
-
* browser owns connections and talks to OpenCode/Guardian DIRECTLY — no host
|
|
1112
|
-
* proxy, no admin cookie.
|
|
1113
|
-
*
|
|
1114
|
-
* The transport reads the active connection SYNCHRONOUSLY from a snapshot the
|
|
1115
|
-
* connection store owner (`endpoints-state`) keeps in sync via
|
|
1116
|
-
* `setActiveConnection()`. The store's own `getActive()` is async (IndexedDB),
|
|
1117
|
-
* so it can't back the transport's synchronous `getConnection` directly.
|
|
1118
|
-
*
|
|
1119
|
-
* IndexedDB is the persistent backend; private-browsing modes that refuse it
|
|
1120
|
-
* degrade to an in-memory backend (session-only) rather than a blank page —
|
|
1121
|
-
* mirroring the client's `pickStorage`.
|
|
1122
|
-
*/
|
|
1123
|
-
var store = null;
|
|
1124
|
-
var secrets = null;
|
|
1125
|
-
var transport = null;
|
|
1126
|
-
/** Synchronous snapshot of the active connection for the transport. */
|
|
1127
|
-
var activeConnection = null;
|
|
1128
|
-
/**
|
|
1129
|
-
* Some private-browsing modes refuse IndexedDB entirely; degrade to a
|
|
1130
|
-
* session-only in-memory backend rather than a blank page (mirrors the
|
|
1131
|
-
* client's pickStorage).
|
|
1132
|
-
*/
|
|
1133
|
-
function pickStorage() {
|
|
1134
|
-
try {
|
|
1135
|
-
if (typeof indexedDB !== "undefined") return createIndexedDbStorage();
|
|
1136
|
-
} catch {}
|
|
1137
|
-
return createMemoryStorage();
|
|
1138
|
-
}
|
|
1139
|
-
function ensure() {
|
|
1140
|
-
if (store && secrets && transport) return;
|
|
1141
|
-
const storage = pickStorage();
|
|
1142
|
-
const connectionStore = createConnectionStore({ storage });
|
|
1143
|
-
const secretStore = createSecretStore(storage);
|
|
1144
|
-
const directTransport = createDirectTransport(() => activeConnection, async (connection) => {
|
|
1145
|
-
return { authorization: authorizationHeader(await secretStore.resolveAuth(connection)) ?? void 0 };
|
|
1146
|
-
});
|
|
1147
|
-
store = connectionStore;
|
|
1148
|
-
secrets = secretStore;
|
|
1149
|
-
transport = directTransport;
|
|
1150
|
-
}
|
|
1151
|
-
function getConnectionStore() {
|
|
1152
|
-
ensure();
|
|
1153
|
-
return store;
|
|
1154
|
-
}
|
|
1155
|
-
function getTransport() {
|
|
1156
|
-
ensure();
|
|
1157
|
-
return transport;
|
|
1158
|
-
}
|
|
1159
|
-
/**
|
|
1160
|
-
* Point the direct transport at `connection` (or clear it). Called by the
|
|
1161
|
-
* connection-store owner (`endpoints-state`) on load/activate — a plain
|
|
1162
|
-
* function, no `$effect`, so the transport's synchronous `getConnection`
|
|
1163
|
-
* always sees the current active connection.
|
|
1164
|
-
*/
|
|
1165
|
-
function setActiveConnection(connection) {
|
|
1166
|
-
activeConnection = connection;
|
|
1167
|
-
}
|
|
1168
|
-
//#endregion
|
|
1169
361
|
//#region src/lib/api/chat.ts
|
|
1170
362
|
/** Create a new session on the active connection's OpenCode instance. */
|
|
1171
363
|
async function createSession() {
|
|
@@ -1231,24 +423,6 @@ async function rejectChatQuestion(requestId) {
|
|
|
1231
423
|
await (await getTransport().request("POST", `/question/${encodeURIComponent(requestId)}/reject`, {})).text().catch(() => "");
|
|
1232
424
|
}
|
|
1233
425
|
//#endregion
|
|
1234
|
-
//#region ../ui-kit/src/lib/components/icons/IconThemeSystem.svelte
|
|
1235
|
-
function IconThemeSystem($$renderer, $$props) {
|
|
1236
|
-
let { size = 20, class: className = "" } = $$props;
|
|
1237
|
-
$$renderer.push(`<svg xmlns="http://www.w3.org/2000/svg"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"${attr_class(`lucide lucide-sun-moon-icon lucide-sun-moon s-icon ${stringify(className)}`)}><path d="M12 2v2"></path><path d="M14.837 16.385a6 6 0 1 1-7.223-7.222c.624-.147.97.66.715 1.248a4 4 0 0 0 5.26 5.259c.589-.255 1.396.09 1.248.715"></path><path d="M16 12a4 4 0 0 0-4-4"></path><path d="m19 5-1.256 1.256"></path><path d="M20 12h2"></path></svg>`);
|
|
1238
|
-
}
|
|
1239
|
-
//#endregion
|
|
1240
|
-
//#region ../ui-kit/src/lib/components/icons/IconThemeLight.svelte
|
|
1241
|
-
function IconThemeLight($$renderer, $$props) {
|
|
1242
|
-
let { size = 20, class: className = "" } = $$props;
|
|
1243
|
-
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"${attr_class(`s-icon ${stringify(className)}`)}><circle cx="12" cy="12" r="4"></circle><path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M19.4 4.6l-1.6 1.6M6.2 17.8l-1.6 1.6"></path></svg>`);
|
|
1244
|
-
}
|
|
1245
|
-
//#endregion
|
|
1246
|
-
//#region ../ui-kit/src/lib/components/icons/IconThemeDark.svelte
|
|
1247
|
-
function IconThemeDark($$renderer, $$props) {
|
|
1248
|
-
let { size = 20, class: className = "" } = $$props;
|
|
1249
|
-
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"${attr_class(`s-icon ${stringify(className)}`)}><path d="M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z"></path></svg>`);
|
|
1250
|
-
}
|
|
1251
|
-
//#endregion
|
|
1252
426
|
//#region src/lib/chat/oc-events.ts
|
|
1253
427
|
function propStr(props, key) {
|
|
1254
428
|
const value = props?.[key];
|
|
@@ -1465,6 +639,76 @@ async function emitConnectionActivated(connectionId) {
|
|
|
1465
639
|
for (const listener of listeners) await listener(connectionId);
|
|
1466
640
|
}
|
|
1467
641
|
//#endregion
|
|
642
|
+
//#region src/lib/connections/discovery.ts
|
|
643
|
+
/** Probed in order; the first reachable candidate is added. Ports are the
|
|
644
|
+
* stack defaults (`STACK_DEFAULTS.ports.assistant`, guardian direct port). */
|
|
645
|
+
var LOCAL_DISCOVERY_CANDIDATES = [{
|
|
646
|
+
baseUrl: "http://127.0.0.1:3800",
|
|
647
|
+
label: "Local assistant"
|
|
648
|
+
}, {
|
|
649
|
+
baseUrl: "http://127.0.0.1:3830/oc",
|
|
650
|
+
label: "Local assistant (guardian)"
|
|
651
|
+
}];
|
|
652
|
+
var DISMISSED_STORAGE_KEY = "openpalm.connections.local-discovery-dismissed";
|
|
653
|
+
var PROBE_TIMEOUT_MS = 1500;
|
|
654
|
+
function safeLocalStorage() {
|
|
655
|
+
try {
|
|
656
|
+
return globalThis.localStorage ?? null;
|
|
657
|
+
} catch {
|
|
658
|
+
return null;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
function isLocalDiscoveryDismissed() {
|
|
662
|
+
return safeLocalStorage()?.getItem(DISMISSED_STORAGE_KEY) === "1";
|
|
663
|
+
}
|
|
664
|
+
async function probe(baseUrl, fetchImpl) {
|
|
665
|
+
try {
|
|
666
|
+
const response = await fetchImpl(`${baseUrl}/`, {
|
|
667
|
+
method: "GET",
|
|
668
|
+
credentials: "omit",
|
|
669
|
+
cache: "no-store",
|
|
670
|
+
signal: AbortSignal.timeout(PROBE_TIMEOUT_MS)
|
|
671
|
+
});
|
|
672
|
+
if (response.status === 401 || response.status === 403) return true;
|
|
673
|
+
return response.ok || response.status >= 300 && response.status < 400;
|
|
674
|
+
} catch {
|
|
675
|
+
return false;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Probe the well-known local endpoints and add the first reachable one to
|
|
680
|
+
* `store` as an unlocked connection — unless the list already contains a
|
|
681
|
+
* local (loopback) connection, or the user previously removed a discovered
|
|
682
|
+
* entry. Returns the added connection, or null when nothing was added.
|
|
683
|
+
* Never throws: discovery is strictly best-effort.
|
|
684
|
+
*/
|
|
685
|
+
async function discoverLocalAssistant(store, fetchImpl = globalThis.fetch) {
|
|
686
|
+
try {
|
|
687
|
+
if (typeof fetchImpl !== "function") return null;
|
|
688
|
+
if (isLocalDiscoveryDismissed()) return null;
|
|
689
|
+
const hasLocal = async () => (await store.list()).some((c) => {
|
|
690
|
+
try {
|
|
691
|
+
return isLoopbackHost(new URL(c.baseUrl).hostname);
|
|
692
|
+
} catch {
|
|
693
|
+
return false;
|
|
694
|
+
}
|
|
695
|
+
});
|
|
696
|
+
if (await hasLocal()) return null;
|
|
697
|
+
for (const candidate of LOCAL_DISCOVERY_CANDIDATES) {
|
|
698
|
+
if (!await probe(candidate.baseUrl, fetchImpl)) continue;
|
|
699
|
+
if (await hasLocal()) return null;
|
|
700
|
+
return await store.add({
|
|
701
|
+
label: candidate.label,
|
|
702
|
+
baseUrl: candidate.baseUrl,
|
|
703
|
+
auth: { mode: "none" }
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
return null;
|
|
707
|
+
} catch {
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
//#endregion
|
|
1468
712
|
//#region src/lib/endpoints-state.svelte.ts
|
|
1469
713
|
function toView(c) {
|
|
1470
714
|
return {
|
|
@@ -1505,6 +749,10 @@ var ConnectionsService = class {
|
|
|
1505
749
|
this.activeId = storedActiveId ?? this.endpoints[0]?.id ?? "";
|
|
1506
750
|
setActiveConnection(connections.find((c) => c.id === this.activeId) ?? null);
|
|
1507
751
|
this.loaded = true;
|
|
752
|
+
if (!this.discoveryStarted) {
|
|
753
|
+
this.discoveryStarted = true;
|
|
754
|
+
this.discoverLocal();
|
|
755
|
+
}
|
|
1508
756
|
} catch (e) {
|
|
1509
757
|
const err = e;
|
|
1510
758
|
this.error = err.message ?? "Failed to load connections";
|
|
@@ -1512,6 +760,25 @@ var ConnectionsService = class {
|
|
|
1512
760
|
this.loading = false;
|
|
1513
761
|
}
|
|
1514
762
|
}
|
|
763
|
+
/** Localhost auto-discovery runs at most once per browsing session. */
|
|
764
|
+
discoveryStarted = false;
|
|
765
|
+
/**
|
|
766
|
+
* Probe the well-known local assistant endpoints and, when one is
|
|
767
|
+
* reachable and not yet listed, add it and refresh the view. Best-effort:
|
|
768
|
+
* failures are swallowed (discovery must never break boot).
|
|
769
|
+
*/
|
|
770
|
+
async discoverLocal() {
|
|
771
|
+
try {
|
|
772
|
+
const store = getConnectionStore();
|
|
773
|
+
const added = await discoverLocalAssistant(store);
|
|
774
|
+
if (!added) return;
|
|
775
|
+
const [connections, storedActiveId] = await Promise.all([store.list(), store.getActiveId()]);
|
|
776
|
+
this.endpoints = connections.map(toView);
|
|
777
|
+
this.activeId = storedActiveId ?? this.endpoints[0]?.id ?? "";
|
|
778
|
+
setActiveConnection(connections.find((c) => c.id === this.activeId) ?? null);
|
|
779
|
+
if (this.activeId === added.id && !activationBlockReason()) await emitConnectionActivated(added.id);
|
|
780
|
+
} catch {}
|
|
781
|
+
}
|
|
1515
782
|
/** Monotonic activation counter: a failed activation may only roll state
|
|
1516
783
|
* back if no NEWER activation has started since (otherwise a slow failure
|
|
1517
784
|
* would clobber the selection a later, successful switch just persisted). */
|
|
@@ -1644,5 +911,5 @@ function IconStop($$renderer, $$props) {
|
|
|
1644
911
|
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><rect fill="currentColor" stroke="none" x="7" y="7" width="10" height="10" rx="1.4"></rect></svg>`);
|
|
1645
912
|
}
|
|
1646
913
|
|
|
1647
|
-
export {
|
|
1648
|
-
//# sourceMappingURL=IconStop-
|
|
914
|
+
export { onConnectionActivated as A, partSnapshotType as B, registerActivationGuard as C, rejectChatQuestion as D, relativeTimeLabel as E, replyChatPermission as F, replyChatQuestion as G, sendChatMessage as H, IconClose as I, startChatMessageTurn as J, timelineTitle as K, toolAriaLabel as L, toolDetailRows as M, toolIconType as N, toolStatusLabel as O, SvelteMap as S, IconStop as a, IconThemeDark as b, IconThemeLight as c, IconThemeSystem as d, SvelteSet as e, abortChatTurn as f, createSession as g, displayTitle as h, endpointsService as i, extractPermissionAsk as j, extractQuestionAsk as k, extractStepUpdate as l, extractTextDelta as m, extractToolUpdate as n, formatBytes as o, formatDate as p, formatDateTime as q, formatRelativeTime as r, formatTime as s, getSessionMessages as t, isSessionError as u, isTurnEnd as v, isUserFacingTool as w, listSessions as x, notifyAssistantError as y, notifyAssistantReply as z };
|
|
915
|
+
//# sourceMappingURL=IconStop-BxUfqTaV.js.map
|