@openpalm/ui 0.12.52 → 0.13.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/.openpalm-ui-version +1 -1
- package/build/client/_app/immutable/assets/0.CNWpIzQn.css +1 -0
- package/build/client/_app/immutable/assets/0.CNWpIzQn.css.br +0 -0
- package/build/client/_app/immutable/assets/0.CNWpIzQn.css.gz +0 -0
- package/build/client/_app/immutable/assets/10.vLP66eby.css +1 -0
- package/build/client/_app/immutable/assets/10.vLP66eby.css.br +0 -0
- package/build/client/_app/immutable/assets/10.vLP66eby.css.gz +0 -0
- package/build/client/_app/immutable/assets/11.BF9IcRAW.css +1 -0
- package/build/client/_app/immutable/assets/11.BF9IcRAW.css.br +0 -0
- package/build/client/_app/immutable/assets/11.BF9IcRAW.css.gz +0 -0
- package/build/client/_app/immutable/assets/5.CTNuT1CQ.css +1 -0
- package/build/client/_app/immutable/assets/5.CTNuT1CQ.css.br +0 -0
- package/build/client/_app/immutable/assets/5.CTNuT1CQ.css.gz +0 -0
- package/build/client/_app/immutable/assets/6.D_kTgQ70.css +1 -0
- package/build/client/_app/immutable/assets/6.D_kTgQ70.css.br +0 -0
- package/build/client/_app/immutable/assets/6.D_kTgQ70.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.CEu3B1cr.css +1 -0
- package/build/client/_app/immutable/assets/7.CEu3B1cr.css.br +0 -0
- package/build/client/_app/immutable/assets/7.CEu3B1cr.css.gz +0 -0
- package/build/client/_app/immutable/assets/9.vqGkbIg9.css +1 -0
- package/build/client/_app/immutable/assets/9.vqGkbIg9.css.br +0 -0
- package/build/client/_app/immutable/assets/9.vqGkbIg9.css.gz +0 -0
- package/build/client/_app/immutable/assets/ChatNavbar.C7LJB8r7.css +1 -0
- package/build/client/_app/immutable/assets/ChatNavbar.C7LJB8r7.css.br +0 -0
- package/build/client/_app/immutable/assets/ChatNavbar.C7LJB8r7.css.gz +0 -0
- package/build/client/_app/immutable/assets/Drawer.C9zcL24P.css +1 -0
- package/build/client/_app/immutable/assets/Drawer.C9zcL24P.css.br +0 -0
- package/build/client/_app/immutable/assets/Drawer.C9zcL24P.css.gz +0 -0
- package/build/client/_app/immutable/assets/IconActivity.BdXOPwBm.css +1 -0
- package/build/client/_app/immutable/assets/IconActivity.BdXOPwBm.css.br +0 -0
- package/build/client/_app/immutable/assets/IconActivity.BdXOPwBm.css.gz +0 -0
- package/build/client/_app/immutable/assets/Spinner.DfNgj4dl.css +1 -0
- package/build/client/_app/immutable/assets/Spinner.DfNgj4dl.css.br +2 -0
- package/build/client/_app/immutable/assets/Spinner.DfNgj4dl.css.gz +0 -0
- package/build/client/_app/immutable/chunks/9mRSvTWj.js +1 -0
- package/build/client/_app/immutable/chunks/9mRSvTWj.js.br +0 -0
- package/build/client/_app/immutable/chunks/9mRSvTWj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BApqEZP1.js +3 -0
- package/build/client/_app/immutable/chunks/BApqEZP1.js.br +0 -0
- package/build/client/_app/immutable/chunks/BApqEZP1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDK50g8a.js +1 -0
- package/build/client/_app/immutable/chunks/BDK50g8a.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDK50g8a.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B_Sgy7qx.js +1 -0
- package/build/client/_app/immutable/chunks/B_Sgy7qx.js.br +2 -0
- package/build/client/_app/immutable/chunks/B_Sgy7qx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B_jhBV5Z.js +5 -0
- package/build/client/_app/immutable/chunks/B_jhBV5Z.js.br +0 -0
- package/build/client/_app/immutable/chunks/B_jhBV5Z.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Be7qat4r.js +3 -0
- package/build/client/_app/immutable/chunks/Be7qat4r.js.br +0 -0
- package/build/client/_app/immutable/chunks/Be7qat4r.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BoOBAdGl.js +1 -0
- package/build/client/_app/immutable/chunks/BoOBAdGl.js.br +0 -0
- package/build/client/_app/immutable/chunks/BoOBAdGl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BzIvC31O.js +3 -0
- package/build/client/_app/immutable/chunks/BzIvC31O.js.br +0 -0
- package/build/client/_app/immutable/chunks/BzIvC31O.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CUa5ff3d.js +1 -0
- package/build/client/_app/immutable/chunks/CUa5ff3d.js.br +0 -0
- package/build/client/_app/immutable/chunks/CUa5ff3d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D5FtEngX.js +1 -0
- package/build/client/_app/immutable/chunks/D5FtEngX.js.br +0 -0
- package/build/client/_app/immutable/chunks/D5FtEngX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DBHgGGCD.js +1 -0
- package/build/client/_app/immutable/chunks/DBHgGGCD.js.br +0 -0
- package/build/client/_app/immutable/chunks/DBHgGGCD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DSs95sLz.js +1 -0
- package/build/client/_app/immutable/chunks/DSs95sLz.js.br +0 -0
- package/build/client/_app/immutable/chunks/DSs95sLz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DfZbBavE.js +1 -0
- package/build/client/_app/immutable/chunks/DfZbBavE.js.br +1 -0
- package/build/client/_app/immutable/chunks/DfZbBavE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DmFbAjwW.js +1 -0
- package/build/client/_app/immutable/chunks/DmFbAjwW.js.br +3 -0
- package/build/client/_app/immutable/chunks/DmFbAjwW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/NR-JVJz-.js +1 -0
- package/build/client/_app/immutable/chunks/NR-JVJz-.js.br +0 -0
- package/build/client/_app/immutable/chunks/NR-JVJz-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/R6GPcDBF.js +14 -0
- package/build/client/_app/immutable/chunks/R6GPcDBF.js.br +0 -0
- package/build/client/_app/immutable/chunks/R6GPcDBF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/SXdvPq3_.js +1 -0
- package/build/client/_app/immutable/chunks/SXdvPq3_.js.br +0 -0
- package/build/client/_app/immutable/chunks/SXdvPq3_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/c0lkYAgh.js +5 -0
- package/build/client/_app/immutable/chunks/c0lkYAgh.js.br +0 -0
- package/build/client/_app/immutable/chunks/c0lkYAgh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/hSjQday7.js +1 -0
- package/build/client/_app/immutable/chunks/hSjQday7.js.br +0 -0
- package/build/client/_app/immutable/chunks/hSjQday7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/mG6HnNbi.js +1 -0
- package/build/client/_app/immutable/chunks/mG6HnNbi.js.br +0 -0
- package/build/client/_app/immutable/chunks/mG6HnNbi.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DZwy1Y3W.js +2 -0
- package/build/client/_app/immutable/entry/app.DZwy1Y3W.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DZwy1Y3W.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.C0ic7Ewp.js +1 -0
- package/build/client/_app/immutable/entry/start.C0ic7Ewp.js.br +1 -0
- package/build/client/_app/immutable/entry/start.C0ic7Ewp.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.mcDF2Cfv.js +1 -0
- package/build/client/_app/immutable/nodes/0.mcDF2Cfv.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.mcDF2Cfv.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Bxihn5f1.js +1 -0
- package/build/client/_app/immutable/nodes/1.Bxihn5f1.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.Bxihn5f1.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.BZ76_WLP.js +1 -0
- package/build/client/_app/immutable/nodes/10.BZ76_WLP.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.BZ76_WLP.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.Bzf3G5G0.js +6 -0
- package/build/client/_app/immutable/nodes/11.Bzf3G5G0.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.Bzf3G5G0.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.C-PzaHZx.js +1 -0
- package/build/client/_app/immutable/nodes/2.C-PzaHZx.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.C-PzaHZx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.26Z_fr6N.js +1 -0
- package/build/client/_app/immutable/nodes/3.26Z_fr6N.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.26Z_fr6N.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.D-CwW2PH.js +1 -0
- package/build/client/_app/immutable/nodes/4.D-CwW2PH.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.D-CwW2PH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.BbStivMI.js +2 -0
- package/build/client/_app/immutable/nodes/5.BbStivMI.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.BbStivMI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BKVgKxKO.js +2 -0
- package/build/client/_app/immutable/nodes/6.BKVgKxKO.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BKVgKxKO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.DuXt155R.js +4 -0
- package/build/client/_app/immutable/nodes/7.DuXt155R.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.DuXt155R.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.NHp_bSVx.js +1 -0
- package/build/client/_app/immutable/nodes/8.NHp_bSVx.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.NHp_bSVx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.BdeFVi2a.js +126 -0
- package/build/client/_app/immutable/nodes/9.BdeFVi2a.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.BdeFVi2a.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +1 -2
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/0-C7zzjezl.js +43 -0
- package/build/server/chunks/0-C7zzjezl.js.map +1 -0
- package/build/server/chunks/1-Ceq9WsUZ.js +9 -0
- package/build/server/chunks/1-Ceq9WsUZ.js.map +1 -0
- package/build/server/chunks/10-DbLLQ-Uy.js +35 -0
- package/build/server/chunks/10-DbLLQ-Uy.js.map +1 -0
- package/build/server/chunks/11-Dryt5Piv.js +9 -0
- package/build/server/chunks/11-Dryt5Piv.js.map +1 -0
- package/build/server/chunks/2-CQSBaE_w.js +9 -0
- package/build/server/chunks/2-CQSBaE_w.js.map +1 -0
- package/build/server/chunks/3-CAH3EmhU.js +58 -0
- package/build/server/chunks/3-CAH3EmhU.js.map +1 -0
- package/build/server/chunks/4-DxmFWVQJ.js +9 -0
- package/build/server/chunks/4-DxmFWVQJ.js.map +1 -0
- package/build/server/chunks/5-CQ9cELI7.js +9 -0
- package/build/server/chunks/5-CQ9cELI7.js.map +1 -0
- package/build/server/chunks/6-B-hnmc7F.js +9 -0
- package/build/server/chunks/6-B-hnmc7F.js.map +1 -0
- package/build/server/chunks/7-BE6BzHsh.js +9 -0
- package/build/server/chunks/7-BE6BzHsh.js.map +1 -0
- package/build/server/chunks/8-DiHmrGkL.js +30 -0
- package/build/server/chunks/8-DiHmrGkL.js.map +1 -0
- package/build/server/chunks/9-BWzd_hmh.js +42 -0
- package/build/server/chunks/9-BWzd_hmh.js.map +1 -0
- package/build/server/chunks/ChatNavbar-BonHVqfi.js +243 -0
- package/build/server/chunks/ChatNavbar-BonHVqfi.js.map +1 -0
- package/build/server/chunks/IconActivity-BVrMC8FH.js +5486 -0
- package/build/server/chunks/IconActivity-BVrMC8FH.js.map +1 -0
- package/build/server/chunks/IconAgent-DeBWj6Gr.js +16 -0
- package/build/server/chunks/IconAgent-DeBWj6Gr.js.map +1 -0
- package/build/server/chunks/IconDone-CHBJ36xT.js +10 -0
- package/build/server/chunks/IconDone-CHBJ36xT.js.map +1 -0
- package/build/server/chunks/IconInfo-DA5uGQyP.js +10 -0
- package/build/server/chunks/IconInfo-DA5uGQyP.js.map +1 -0
- package/build/server/chunks/IconLock-Bz5zHCBQ.js +10 -0
- package/build/server/chunks/IconLock-Bz5zHCBQ.js.map +1 -0
- package/build/server/chunks/IconLogo-BRmPVDI_.js +10 -0
- package/build/server/chunks/IconLogo-BRmPVDI_.js.map +1 -0
- package/build/server/chunks/IconMic-BbjkE_nG.js +18 -0
- package/build/server/chunks/IconMic-BbjkE_nG.js.map +1 -0
- package/build/server/chunks/IconServer-fOHYHe-O.js +180 -0
- package/build/server/chunks/IconServer-fOHYHe-O.js.map +1 -0
- package/build/server/chunks/IconSoundOn-DHtvjphK.js +1116 -0
- package/build/server/chunks/IconSoundOn-DHtvjphK.js.map +1 -0
- package/build/server/chunks/IconStop-C89_dmt4.js +956 -0
- package/build/server/chunks/IconStop-C89_dmt4.js.map +1 -0
- package/build/server/chunks/_helpers-CafYq-UD.js +74 -0
- package/build/server/chunks/_helpers-CafYq-UD.js.map +1 -0
- package/build/server/chunks/_layout.svelte-BLxvGwKC.js +67 -0
- package/build/server/chunks/_layout.svelte-BLxvGwKC.js.map +1 -0
- package/build/server/chunks/_page.svelte-0Rf024eH.js +530 -0
- package/build/server/chunks/_page.svelte-0Rf024eH.js.map +1 -0
- package/build/server/chunks/_page.svelte-BWNjxN63.js +82 -0
- package/build/server/chunks/_page.svelte-BWNjxN63.js.map +1 -0
- package/build/server/chunks/_page.svelte-BXeh8wzh.js +2425 -0
- package/build/server/chunks/_page.svelte-BXeh8wzh.js.map +1 -0
- package/build/server/chunks/_page.svelte-Bovrn7AQ.js +47 -0
- package/build/server/chunks/_page.svelte-Bovrn7AQ.js.map +1 -0
- package/build/server/chunks/_page.svelte-COf36oAu.js +92 -0
- package/build/server/chunks/_page.svelte-COf36oAu.js.map +1 -0
- package/build/server/chunks/_page.svelte-DkZsmNYc.js +24 -0
- package/build/server/chunks/_page.svelte-DkZsmNYc.js.map +1 -0
- package/build/server/chunks/_page.svelte-Du3fWBth.js +5 -0
- package/build/server/chunks/_page.svelte-Du3fWBth.js.map +1 -0
- package/build/server/chunks/_page.svelte-LsoJ7E5M.js +3516 -0
- package/build/server/chunks/_page.svelte-LsoJ7E5M.js.map +1 -0
- package/build/server/chunks/_server.ts-2-50j5S8.js +93 -0
- package/build/server/chunks/_server.ts-2-50j5S8.js.map +1 -0
- package/build/server/chunks/_server.ts-2Z0JYuCr.js +61 -0
- package/build/server/chunks/_server.ts-2Z0JYuCr.js.map +1 -0
- package/build/server/chunks/_server.ts-42ZGRWhn.js +58 -0
- package/build/server/chunks/_server.ts-42ZGRWhn.js.map +1 -0
- package/build/server/chunks/_server.ts-6EuPIrt7.js +88 -0
- package/build/server/chunks/_server.ts-6EuPIrt7.js.map +1 -0
- package/build/server/chunks/_server.ts-6muCM4Nz.js +44 -0
- package/build/server/chunks/_server.ts-6muCM4Nz.js.map +1 -0
- package/build/server/chunks/_server.ts-B28SfXaZ.js +172 -0
- package/build/server/chunks/_server.ts-B28SfXaZ.js.map +1 -0
- package/build/server/chunks/_server.ts-BA11l9Z1.js +87 -0
- package/build/server/chunks/_server.ts-BA11l9Z1.js.map +1 -0
- package/build/server/chunks/_server.ts-BA7wxHYg.js +61 -0
- package/build/server/chunks/_server.ts-BA7wxHYg.js.map +1 -0
- package/build/server/chunks/_server.ts-BARmSEZ2.js +49 -0
- package/build/server/chunks/_server.ts-BARmSEZ2.js.map +1 -0
- package/build/server/chunks/_server.ts-BBewn2kP.js +106 -0
- package/build/server/chunks/_server.ts-BBewn2kP.js.map +1 -0
- package/build/server/chunks/_server.ts-BEaiuN8Q.js +66 -0
- package/build/server/chunks/_server.ts-BEaiuN8Q.js.map +1 -0
- package/build/server/chunks/_server.ts-BJrYBXpY.js +87 -0
- package/build/server/chunks/_server.ts-BJrYBXpY.js.map +1 -0
- package/build/server/chunks/_server.ts-BJv74_DI.js +52 -0
- package/build/server/chunks/_server.ts-BJv74_DI.js.map +1 -0
- package/build/server/chunks/_server.ts-BKWx8K8U.js +60 -0
- package/build/server/chunks/_server.ts-BKWx8K8U.js.map +1 -0
- package/build/server/chunks/_server.ts-BLn_cTkK.js +58 -0
- package/build/server/chunks/_server.ts-BLn_cTkK.js.map +1 -0
- package/build/server/chunks/_server.ts-BR24J2uB.js +40 -0
- package/build/server/chunks/_server.ts-BR24J2uB.js.map +1 -0
- package/build/server/chunks/_server.ts-BRdjsMSd.js +44 -0
- package/build/server/chunks/_server.ts-BRdjsMSd.js.map +1 -0
- package/build/server/chunks/_server.ts-BTPbwN92.js +92 -0
- package/build/server/chunks/_server.ts-BTPbwN92.js.map +1 -0
- package/build/server/chunks/_server.ts-BUDMOZOz.js +44 -0
- package/build/server/chunks/_server.ts-BUDMOZOz.js.map +1 -0
- package/build/server/chunks/_server.ts-BVMpHE3G.js +38 -0
- package/build/server/chunks/_server.ts-BVMpHE3G.js.map +1 -0
- package/build/server/chunks/_server.ts-BWO1Eoro.js +45 -0
- package/build/server/chunks/_server.ts-BWO1Eoro.js.map +1 -0
- package/build/server/chunks/_server.ts-B_R9VtOW.js +152 -0
- package/build/server/chunks/_server.ts-B_R9VtOW.js.map +1 -0
- package/build/server/chunks/_server.ts-Ba8xSIQn.js +107 -0
- package/build/server/chunks/_server.ts-Ba8xSIQn.js.map +1 -0
- package/build/server/chunks/_server.ts-BeP_sHqj.js +58 -0
- package/build/server/chunks/_server.ts-BeP_sHqj.js.map +1 -0
- package/build/server/chunks/_server.ts-BhAp0vvt.js +171 -0
- package/build/server/chunks/_server.ts-BhAp0vvt.js.map +1 -0
- package/build/server/chunks/_server.ts-Bi0rRbcw.js +166 -0
- package/build/server/chunks/_server.ts-Bi0rRbcw.js.map +1 -0
- package/build/server/chunks/_server.ts-BjD0Uf0U.js +248 -0
- package/build/server/chunks/_server.ts-BjD0Uf0U.js.map +1 -0
- package/build/server/chunks/_server.ts-BjjicBDy.js +173 -0
- package/build/server/chunks/_server.ts-BjjicBDy.js.map +1 -0
- package/build/server/chunks/_server.ts-BsPu8Fny.js +521 -0
- package/build/server/chunks/_server.ts-BsPu8Fny.js.map +1 -0
- package/build/server/chunks/_server.ts-C-tvKaFE.js +68 -0
- package/build/server/chunks/_server.ts-C-tvKaFE.js.map +1 -0
- package/build/server/chunks/_server.ts-C83FzZfP.js +36 -0
- package/build/server/chunks/_server.ts-C83FzZfP.js.map +1 -0
- package/build/server/chunks/_server.ts-C8eCqXP6.js +96 -0
- package/build/server/chunks/_server.ts-C8eCqXP6.js.map +1 -0
- package/build/server/chunks/_server.ts-C9F005zM.js +45 -0
- package/build/server/chunks/_server.ts-C9F005zM.js.map +1 -0
- package/build/server/chunks/_server.ts-CCmsGl_u.js +111 -0
- package/build/server/chunks/_server.ts-CCmsGl_u.js.map +1 -0
- package/build/server/chunks/_server.ts-CG60Cdqf.js +205 -0
- package/build/server/chunks/_server.ts-CG60Cdqf.js.map +1 -0
- package/build/server/chunks/_server.ts-CGZizh2V.js +105 -0
- package/build/server/chunks/_server.ts-CGZizh2V.js.map +1 -0
- package/build/server/chunks/_server.ts-CIv0zM75.js +70 -0
- package/build/server/chunks/_server.ts-CIv0zM75.js.map +1 -0
- package/build/server/chunks/_server.ts-CJVwtNhA.js +34 -0
- package/build/server/chunks/_server.ts-CJVwtNhA.js.map +1 -0
- package/build/server/chunks/_server.ts-CMAepV0J.js +38 -0
- package/build/server/chunks/_server.ts-CMAepV0J.js.map +1 -0
- package/build/server/chunks/_server.ts-COcv1puW.js +57 -0
- package/build/server/chunks/_server.ts-COcv1puW.js.map +1 -0
- package/build/server/chunks/_server.ts-CQHkw9ni.js +94 -0
- package/build/server/chunks/_server.ts-CQHkw9ni.js.map +1 -0
- package/build/server/chunks/_server.ts-CS2LQKMb.js +44 -0
- package/build/server/chunks/_server.ts-CS2LQKMb.js.map +1 -0
- package/build/server/chunks/_server.ts-CX_CwTW0.js +41 -0
- package/build/server/chunks/_server.ts-CX_CwTW0.js.map +1 -0
- package/build/server/chunks/_server.ts-CcoaYeM8.js +50 -0
- package/build/server/chunks/_server.ts-CcoaYeM8.js.map +1 -0
- package/build/server/chunks/_server.ts-CfuLncMW.js +134 -0
- package/build/server/chunks/_server.ts-CfuLncMW.js.map +1 -0
- package/build/server/chunks/_server.ts-CjPhaG_g.js +68 -0
- package/build/server/chunks/_server.ts-CjPhaG_g.js.map +1 -0
- package/build/server/chunks/_server.ts-CmUo0zla.js +112 -0
- package/build/server/chunks/_server.ts-CmUo0zla.js.map +1 -0
- package/build/server/chunks/_server.ts-CnQ4hgIT.js +41 -0
- package/build/server/chunks/_server.ts-CnQ4hgIT.js.map +1 -0
- package/build/server/chunks/_server.ts-CncBUb14.js +64 -0
- package/build/server/chunks/_server.ts-CncBUb14.js.map +1 -0
- package/build/server/chunks/_server.ts-CnrWBkQ7.js +149 -0
- package/build/server/chunks/_server.ts-CnrWBkQ7.js.map +1 -0
- package/build/server/chunks/_server.ts-CspCDw2x.js +49 -0
- package/build/server/chunks/_server.ts-CspCDw2x.js.map +1 -0
- package/build/server/chunks/_server.ts-CtsLQpY2.js +19 -0
- package/build/server/chunks/_server.ts-CtsLQpY2.js.map +1 -0
- package/build/server/chunks/_server.ts-D-6mgHZB.js +72 -0
- package/build/server/chunks/_server.ts-D-6mgHZB.js.map +1 -0
- package/build/server/chunks/_server.ts-D-Rf8If2.js +94 -0
- package/build/server/chunks/_server.ts-D-Rf8If2.js.map +1 -0
- package/build/server/chunks/_server.ts-D5F-pzp2.js +45 -0
- package/build/server/chunks/_server.ts-D5F-pzp2.js.map +1 -0
- package/build/server/chunks/_server.ts-D6wuFDe4.js +77 -0
- package/build/server/chunks/_server.ts-D6wuFDe4.js.map +1 -0
- package/build/server/chunks/_server.ts-D7VWMcNm.js +80 -0
- package/build/server/chunks/_server.ts-D7VWMcNm.js.map +1 -0
- package/build/server/chunks/_server.ts-D7X0LmkL.js +65 -0
- package/build/server/chunks/_server.ts-D7X0LmkL.js.map +1 -0
- package/build/server/chunks/_server.ts-D9yQyMbZ.js +141 -0
- package/build/server/chunks/_server.ts-D9yQyMbZ.js.map +1 -0
- package/build/server/chunks/_server.ts-DE-c3Y5D.js +48 -0
- package/build/server/chunks/_server.ts-DE-c3Y5D.js.map +1 -0
- package/build/server/chunks/_server.ts-DH343hlx.js +57 -0
- package/build/server/chunks/_server.ts-DH343hlx.js.map +1 -0
- package/build/server/chunks/_server.ts-DH3Uc_0m.js +57 -0
- package/build/server/chunks/_server.ts-DH3Uc_0m.js.map +1 -0
- package/build/server/chunks/_server.ts-DHeSwA7p.js +55 -0
- package/build/server/chunks/_server.ts-DHeSwA7p.js.map +1 -0
- package/build/server/chunks/_server.ts-DJCIu42O.js +49 -0
- package/build/server/chunks/_server.ts-DJCIu42O.js.map +1 -0
- package/build/server/chunks/_server.ts-DJqSQny9.js +56 -0
- package/build/server/chunks/_server.ts-DJqSQny9.js.map +1 -0
- package/build/server/chunks/_server.ts-DKYXeaKr.js +88 -0
- package/build/server/chunks/_server.ts-DKYXeaKr.js.map +1 -0
- package/build/server/chunks/_server.ts-DM9EsKQc.js +68 -0
- package/build/server/chunks/_server.ts-DM9EsKQc.js.map +1 -0
- package/build/server/chunks/_server.ts-DQozxLn6.js +58 -0
- package/build/server/chunks/_server.ts-DQozxLn6.js.map +1 -0
- package/build/server/chunks/_server.ts-DTQe-U35.js +80 -0
- package/build/server/chunks/_server.ts-DTQe-U35.js.map +1 -0
- package/build/server/chunks/_server.ts-Dcf84tjG.js +42 -0
- package/build/server/chunks/_server.ts-Dcf84tjG.js.map +1 -0
- package/build/server/chunks/_server.ts-DdHx6Xig.js +88 -0
- package/build/server/chunks/_server.ts-DdHx6Xig.js.map +1 -0
- package/build/server/chunks/_server.ts-DdoJFQaX.js +89 -0
- package/build/server/chunks/_server.ts-DdoJFQaX.js.map +1 -0
- package/build/server/chunks/_server.ts-DdocuErM.js +71 -0
- package/build/server/chunks/_server.ts-DdocuErM.js.map +1 -0
- package/build/server/chunks/_server.ts-Ddqhnr_7.js +58 -0
- package/build/server/chunks/_server.ts-Ddqhnr_7.js.map +1 -0
- package/build/server/chunks/_server.ts-Dj6nwJgl.js +42 -0
- package/build/server/chunks/_server.ts-Dj6nwJgl.js.map +1 -0
- package/build/server/chunks/_server.ts-Dl-Rn5Ku.js +68 -0
- package/build/server/chunks/_server.ts-Dl-Rn5Ku.js.map +1 -0
- package/build/server/chunks/_server.ts-DnczK3Pw.js +49 -0
- package/build/server/chunks/_server.ts-DnczK3Pw.js.map +1 -0
- package/build/server/chunks/_server.ts-Dq4RvC5F.js +69 -0
- package/build/server/chunks/_server.ts-Dq4RvC5F.js.map +1 -0
- package/build/server/chunks/_server.ts-DrGzrygC.js +103 -0
- package/build/server/chunks/_server.ts-DrGzrygC.js.map +1 -0
- package/build/server/chunks/_server.ts-Ds62LEMU.js +162 -0
- package/build/server/chunks/_server.ts-Ds62LEMU.js.map +1 -0
- package/build/server/chunks/_server.ts-DsVbuYhj.js +64 -0
- package/build/server/chunks/_server.ts-DsVbuYhj.js.map +1 -0
- package/build/server/chunks/_server.ts-Dy65kWxL.js +84 -0
- package/build/server/chunks/_server.ts-Dy65kWxL.js.map +1 -0
- package/build/server/chunks/_server.ts-Dy9l5NMO.js +715 -0
- package/build/server/chunks/_server.ts-Dy9l5NMO.js.map +1 -0
- package/build/server/chunks/_server.ts-JO0zy17P.js +60 -0
- package/build/server/chunks/_server.ts-JO0zy17P.js.map +1 -0
- package/build/server/chunks/_server.ts-LokXM9hH.js +51 -0
- package/build/server/chunks/_server.ts-LokXM9hH.js.map +1 -0
- package/build/server/chunks/_server.ts-pRYFJihh.js +72 -0
- package/build/server/chunks/_server.ts-pRYFJihh.js.map +1 -0
- package/build/server/chunks/_server.ts-xPuEhFJO.js +56 -0
- package/build/server/chunks/_server.ts-xPuEhFJO.js.map +1 -0
- package/build/server/chunks/addon-helpers-Cgg8lPxe.js +51 -0
- package/build/server/chunks/addon-helpers-Cgg8lPxe.js.map +1 -0
- package/build/server/chunks/akm-5HN45xWY.js +151 -0
- package/build/server/chunks/akm-5HN45xWY.js.map +1 -0
- package/build/server/chunks/catalog-7z8dgrJF.js +217 -0
- package/build/server/chunks/catalog-7z8dgrJF.js.map +1 -0
- package/build/server/chunks/client-D2lMniPd.js +202 -0
- package/build/server/chunks/client-D2lMniPd.js.map +1 -0
- package/build/server/chunks/compose-args2-BFdWixAZ.js +26 -0
- package/build/server/chunks/compose-args2-BFdWixAZ.js.map +1 -0
- package/build/server/chunks/config-I5hb-W80.js +121 -0
- package/build/server/chunks/config-I5hb-W80.js.map +1 -0
- package/build/server/chunks/connections-api-NkotVLIl.js +34 -0
- package/build/server/chunks/connections-api-NkotVLIl.js.map +1 -0
- package/build/server/chunks/constants-B7J5DDaI.js +298 -0
- package/build/server/chunks/constants-B7J5DDaI.js.map +1 -0
- package/build/server/chunks/docker2-HZnACjh6.js +26 -0
- package/build/server/chunks/docker2-HZnACjh6.js.map +1 -0
- package/build/server/chunks/docker3-Dj9Pc_Pt.js +20 -0
- package/build/server/chunks/docker3-Dj9Pc_Pt.js.map +1 -0
- package/build/server/chunks/endpoints-B9ePqrMw.js +377 -0
- package/build/server/chunks/endpoints-B9ePqrMw.js.map +1 -0
- package/build/server/chunks/environment-BYp8JQYM.js +38 -0
- package/build/server/chunks/environment-BYp8JQYM.js.map +1 -0
- package/build/server/chunks/error.svelte-DGngrZ2V.js +18 -0
- package/build/server/chunks/error.svelte-DGngrZ2V.js.map +1 -0
- package/build/server/chunks/exports-CcmcYU0M.js +124 -0
- package/build/server/chunks/exports-CcmcYU0M.js.map +1 -0
- package/build/server/chunks/exports2-BjzhbhYA.js +691 -0
- package/build/server/chunks/exports2-BjzhbhYA.js.map +1 -0
- package/build/server/chunks/features-0lgyQreD.js +116 -0
- package/build/server/chunks/features-0lgyQreD.js.map +1 -0
- package/build/server/chunks/helpers-q4Ng8QTq.js +320 -0
- package/build/server/chunks/helpers-q4Ng8QTq.js.map +1 -0
- package/build/server/chunks/hooks.server-BTXqUhpH.js +121 -0
- package/build/server/chunks/hooks.server-BTXqUhpH.js.map +1 -0
- package/build/server/chunks/http-jBNJXVHg.js +31 -0
- package/build/server/chunks/http-jBNJXVHg.js.map +1 -0
- package/build/server/chunks/internal-G-Uk-kCA.js +915 -0
- package/build/server/chunks/internal-G-Uk-kCA.js.map +1 -0
- package/build/server/chunks/landing-BR5KUuDz.js +132 -0
- package/build/server/chunks/landing-BR5KUuDz.js.map +1 -0
- package/build/server/chunks/paths-tzRSDsKc.js +17 -0
- package/build/server/chunks/paths-tzRSDsKc.js.map +1 -0
- package/build/server/chunks/provider-constants-1s1k8kbj.js +68 -0
- package/build/server/chunks/provider-constants-1s1k8kbj.js.map +1 -0
- package/build/server/chunks/runtime-context.svelte-C5zNEC6u.js +72 -0
- package/build/server/chunks/runtime-context.svelte-C5zNEC6u.js.map +1 -0
- package/build/server/chunks/session-cookie-qHDuQboc.js +74 -0
- package/build/server/chunks/session-cookie-qHDuQboc.js.map +1 -0
- package/build/server/chunks/setup-deploy-DleJTifu.js +75 -0
- package/build/server/chunks/setup-deploy-DleJTifu.js.map +1 -0
- package/build/server/chunks/speakable-text-BflxDDdY.js +65 -0
- package/build/server/chunks/speakable-text-BflxDDdY.js.map +1 -0
- package/build/server/chunks/src-BwQUi60U.js +17213 -0
- package/build/server/chunks/src-BwQUi60U.js.map +1 -0
- package/build/server/chunks/state-Dm7U51xT.js +24 -0
- package/build/server/chunks/state-Dm7U51xT.js.map +1 -0
- package/build/server/chunks/state2-BhKHITEo.js +62 -0
- package/build/server/chunks/state2-BhKHITEo.js.map +1 -0
- package/build/server/chunks/utils-OXHIhUb5.js +150 -0
- package/build/server/chunks/utils-OXHIhUb5.js.map +1 -0
- package/build/server/chunks/voice-state.svelte-BAiqUOIX.js +1214 -0
- package/build/server/chunks/voice-state.svelte-BAiqUOIX.js.map +1 -0
- package/build/server/index.js +33 -33
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +279 -243
- package/build/server/manifest.js.map +1 -1
- package/package.json +3 -2
- package/build/client/_app/immutable/assets/0.C-UsFwN5.css +0 -1
- package/build/client/_app/immutable/assets/0.C-UsFwN5.css.br +0 -0
- package/build/client/_app/immutable/assets/0.C-UsFwN5.css.gz +0 -0
- package/build/client/_app/immutable/assets/10.p7qpuBHR.css +0 -1
- package/build/client/_app/immutable/assets/10.p7qpuBHR.css.br +0 -2
- package/build/client/_app/immutable/assets/10.p7qpuBHR.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.DKS7ivN-.css +0 -1
- package/build/client/_app/immutable/assets/4.DKS7ivN-.css.br +0 -0
- package/build/client/_app/immutable/assets/4.DKS7ivN-.css.gz +0 -0
- package/build/client/_app/immutable/assets/5.B9kVBENv.css +0 -1
- package/build/client/_app/immutable/assets/5.B9kVBENv.css.br +0 -0
- package/build/client/_app/immutable/assets/5.B9kVBENv.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.CcyzbXoG.css +0 -1
- package/build/client/_app/immutable/assets/7.CcyzbXoG.css.br +0 -0
- package/build/client/_app/immutable/assets/7.CcyzbXoG.css.gz +0 -0
- package/build/client/_app/immutable/assets/8.DdhLOSFx.css +0 -1
- 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/9.4QFZFijM.css +0 -1
- package/build/client/_app/immutable/assets/9.4QFZFijM.css.br +0 -0
- package/build/client/_app/immutable/assets/9.4QFZFijM.css.gz +0 -0
- package/build/client/_app/immutable/assets/IconClock.CudG-UM6.css +0 -1
- package/build/client/_app/immutable/assets/IconClock.CudG-UM6.css.br +0 -0
- package/build/client/_app/immutable/assets/IconClock.CudG-UM6.css.gz +0 -0
- package/build/client/_app/immutable/assets/Navbar.D3rckLpW.css +0 -1
- package/build/client/_app/immutable/assets/Navbar.D3rckLpW.css.br +0 -0
- package/build/client/_app/immutable/assets/Navbar.D3rckLpW.css.gz +0 -0
- package/build/client/_app/immutable/assets/Spinner.CCwieGti.css +0 -1
- package/build/client/_app/immutable/assets/Spinner.CCwieGti.css.br +0 -0
- package/build/client/_app/immutable/assets/Spinner.CCwieGti.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B6a5LPQe.js +0 -3
- package/build/client/_app/immutable/chunks/B6a5LPQe.js.br +0 -0
- package/build/client/_app/immutable/chunks/B6a5LPQe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDvA7M6l.js +0 -1
- package/build/client/_app/immutable/chunks/BDvA7M6l.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDvA7M6l.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BFVV1YJb.js +0 -1
- package/build/client/_app/immutable/chunks/BFVV1YJb.js.br +0 -0
- package/build/client/_app/immutable/chunks/BFVV1YJb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BM4jJmEk.js +0 -1
- package/build/client/_app/immutable/chunks/BM4jJmEk.js.br +0 -0
- package/build/client/_app/immutable/chunks/BM4jJmEk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BeDFZ0w6.js +0 -1
- package/build/client/_app/immutable/chunks/BeDFZ0w6.js.br +0 -0
- package/build/client/_app/immutable/chunks/BeDFZ0w6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BiuKIdz2.js +0 -1
- package/build/client/_app/immutable/chunks/BiuKIdz2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BiuKIdz2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C4c5Y6rY.js +0 -5
- package/build/client/_app/immutable/chunks/C4c5Y6rY.js.br +0 -0
- package/build/client/_app/immutable/chunks/C4c5Y6rY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C4j7gGnm.js +0 -14
- package/build/client/_app/immutable/chunks/C4j7gGnm.js.br +0 -0
- package/build/client/_app/immutable/chunks/C4j7gGnm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C7x_T9zu.js +0 -3
- package/build/client/_app/immutable/chunks/C7x_T9zu.js.br +0 -0
- package/build/client/_app/immutable/chunks/C7x_T9zu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C8Qdq8nY.js +0 -1
- package/build/client/_app/immutable/chunks/C8Qdq8nY.js.br +0 -0
- package/build/client/_app/immutable/chunks/C8Qdq8nY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DI0CI0UJ.js +0 -1
- package/build/client/_app/immutable/chunks/DI0CI0UJ.js.br +0 -2
- package/build/client/_app/immutable/chunks/DI0CI0UJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DWwJdNrB.js +0 -1
- package/build/client/_app/immutable/chunks/DWwJdNrB.js.br +0 -1
- package/build/client/_app/immutable/chunks/DWwJdNrB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DoTCwfyJ.js +0 -1
- package/build/client/_app/immutable/chunks/DoTCwfyJ.js.br +0 -2
- package/build/client/_app/immutable/chunks/DoTCwfyJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DwEShcLP.js +0 -1
- package/build/client/_app/immutable/chunks/DwEShcLP.js.br +0 -0
- package/build/client/_app/immutable/chunks/DwEShcLP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/HbvxHNCX.js +0 -1
- package/build/client/_app/immutable/chunks/HbvxHNCX.js.br +0 -0
- package/build/client/_app/immutable/chunks/HbvxHNCX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/jopA0ZFl.js +0 -1
- package/build/client/_app/immutable/chunks/jopA0ZFl.js.br +0 -0
- package/build/client/_app/immutable/chunks/jopA0ZFl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/mVxTG_mC.js +0 -1
- package/build/client/_app/immutable/chunks/mVxTG_mC.js.br +0 -3
- package/build/client/_app/immutable/chunks/mVxTG_mC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/zMaWNBEE.js +0 -1
- package/build/client/_app/immutable/chunks/zMaWNBEE.js.br +0 -0
- package/build/client/_app/immutable/chunks/zMaWNBEE.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.D5lUGJr1.js +0 -2
- package/build/client/_app/immutable/entry/app.D5lUGJr1.js.br +0 -0
- package/build/client/_app/immutable/entry/app.D5lUGJr1.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CKoCEnYJ.js +0 -1
- package/build/client/_app/immutable/entry/start.CKoCEnYJ.js.br +0 -0
- package/build/client/_app/immutable/entry/start.CKoCEnYJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.anwXhDvm.js +0 -1
- package/build/client/_app/immutable/nodes/0.anwXhDvm.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.anwXhDvm.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.DrRwtvKf.js +0 -1
- package/build/client/_app/immutable/nodes/1.DrRwtvKf.js.br +0 -1
- package/build/client/_app/immutable/nodes/1.DrRwtvKf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.BLqUjjTI.js +0 -1
- package/build/client/_app/immutable/nodes/10.BLqUjjTI.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.BLqUjjTI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Di1bEoG2.js +0 -1
- package/build/client/_app/immutable/nodes/2.Di1bEoG2.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Di1bEoG2.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.DNLsgB0V.js +0 -1
- package/build/client/_app/immutable/nodes/3.DNLsgB0V.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.DNLsgB0V.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.paHt3QH9.js +0 -124
- package/build/client/_app/immutable/nodes/4.paHt3QH9.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.paHt3QH9.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.bKLnh085.js +0 -4
- package/build/client/_app/immutable/nodes/5.bKLnh085.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.bKLnh085.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.DRi42KoD.js +0 -1
- package/build/client/_app/immutable/nodes/6.DRi42KoD.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DRi42KoD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.BvgWYGnm.js +0 -2
- package/build/client/_app/immutable/nodes/7.BvgWYGnm.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BvgWYGnm.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.BKAKOw6V.js +0 -1
- package/build/client/_app/immutable/nodes/8.BKAKOw6V.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BKAKOw6V.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DwWxN6-k.js +0 -6
- package/build/client/_app/immutable/nodes/9.DwWxN6-k.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DwWxN6-k.js.gz +0 -0
- package/build/server/chunks/0-BiE1oF-J.js +0 -22
- package/build/server/chunks/0-BiE1oF-J.js.map +0 -1
- package/build/server/chunks/1-B-LNip7q.js +0 -9
- package/build/server/chunks/1-B-LNip7q.js.map +0 -1
- package/build/server/chunks/10-CS2lFzh1.js +0 -69
- package/build/server/chunks/10-CS2lFzh1.js.map +0 -1
- package/build/server/chunks/2-BcxV9Utx.js +0 -9
- package/build/server/chunks/2-BcxV9Utx.js.map +0 -1
- package/build/server/chunks/3-EodZ49YI.js +0 -23
- package/build/server/chunks/3-EodZ49YI.js.map +0 -1
- package/build/server/chunks/4-CliJOxWK.js +0 -9
- package/build/server/chunks/4-CliJOxWK.js.map +0 -1
- package/build/server/chunks/5-DkkL3QsU.js +0 -9
- package/build/server/chunks/5-DkkL3QsU.js.map +0 -1
- package/build/server/chunks/6-B6ZHxJZG.js +0 -9
- package/build/server/chunks/6-B6ZHxJZG.js.map +0 -1
- package/build/server/chunks/7-CIl66k8R.js +0 -9
- package/build/server/chunks/7-CIl66k8R.js.map +0 -1
- package/build/server/chunks/8-Dbz3fLZs.js +0 -35
- package/build/server/chunks/8-Dbz3fLZs.js.map +0 -1
- package/build/server/chunks/9-CnaXNk2w.js +0 -9
- package/build/server/chunks/9-CnaXNk2w.js.map +0 -1
- package/build/server/chunks/IconAlert-eLDsz7qz.js +0 -5496
- package/build/server/chunks/IconAlert-eLDsz7qz.js.map +0 -1
- package/build/server/chunks/IconDone-YB1DYJFs.js +0 -10
- package/build/server/chunks/IconDone-YB1DYJFs.js.map +0 -1
- package/build/server/chunks/IconInfo-yYiI9uGe.js +0 -10
- package/build/server/chunks/IconInfo-yYiI9uGe.js.map +0 -1
- package/build/server/chunks/IconLock-DHiqGiiZ.js +0 -10
- package/build/server/chunks/IconLock-DHiqGiiZ.js.map +0 -1
- package/build/server/chunks/IconLogo-Iv-7q8aY.js +0 -10
- package/build/server/chunks/IconLogo-Iv-7q8aY.js.map +0 -1
- package/build/server/chunks/IconMic-DMJf4zcn.js +0 -1295
- package/build/server/chunks/IconMic-DMJf4zcn.js.map +0 -1
- package/build/server/chunks/Navbar-CbBudHU6.js +0 -403
- package/build/server/chunks/Navbar-CbBudHU6.js.map +0 -1
- package/build/server/chunks/Spinner-jfNKSy3m.js +0 -12
- package/build/server/chunks/Spinner-jfNKSy3m.js.map +0 -1
- package/build/server/chunks/_helpers-B_lb4-jB.js +0 -74
- package/build/server/chunks/_helpers-B_lb4-jB.js.map +0 -1
- package/build/server/chunks/_layout.svelte-B5opDXuf.js +0 -66
- package/build/server/chunks/_layout.svelte-B5opDXuf.js.map +0 -1
- package/build/server/chunks/_page.svelte-1VhBiAl_.js +0 -385
- package/build/server/chunks/_page.svelte-1VhBiAl_.js.map +0 -1
- package/build/server/chunks/_page.svelte-6gpwjZv0.js +0 -122
- package/build/server/chunks/_page.svelte-6gpwjZv0.js.map +0 -1
- package/build/server/chunks/_page.svelte-Bd16jege.js +0 -47
- package/build/server/chunks/_page.svelte-Bd16jege.js.map +0 -1
- package/build/server/chunks/_page.svelte-Boq5WJfs.js +0 -3289
- package/build/server/chunks/_page.svelte-Boq5WJfs.js.map +0 -1
- package/build/server/chunks/_page.svelte-DM-4V1_g.js +0 -79
- package/build/server/chunks/_page.svelte-DM-4V1_g.js.map +0 -1
- package/build/server/chunks/_page.svelte-jdDbUptn.js +0 -89
- package/build/server/chunks/_page.svelte-jdDbUptn.js.map +0 -1
- package/build/server/chunks/_page.svelte-yAnFAnHi.js +0 -74
- package/build/server/chunks/_page.svelte-yAnFAnHi.js.map +0 -1
- package/build/server/chunks/_server.ts-0x3ZsRoq.js +0 -41
- package/build/server/chunks/_server.ts-0x3ZsRoq.js.map +0 -1
- package/build/server/chunks/_server.ts-1fytrAUC.js +0 -105
- package/build/server/chunks/_server.ts-1fytrAUC.js.map +0 -1
- package/build/server/chunks/_server.ts-2trnHYNR.js +0 -103
- package/build/server/chunks/_server.ts-2trnHYNR.js.map +0 -1
- package/build/server/chunks/_server.ts-33LuQvHu.js +0 -19
- package/build/server/chunks/_server.ts-33LuQvHu.js.map +0 -1
- package/build/server/chunks/_server.ts-3IGr8J7j.js +0 -103
- package/build/server/chunks/_server.ts-3IGr8J7j.js.map +0 -1
- package/build/server/chunks/_server.ts-4HApbECL.js +0 -49
- package/build/server/chunks/_server.ts-4HApbECL.js.map +0 -1
- package/build/server/chunks/_server.ts-4cGCnV5A.js +0 -172
- package/build/server/chunks/_server.ts-4cGCnV5A.js.map +0 -1
- package/build/server/chunks/_server.ts-5mKh6tgD.js +0 -56
- package/build/server/chunks/_server.ts-5mKh6tgD.js.map +0 -1
- package/build/server/chunks/_server.ts-B-gZIXCx.js +0 -120
- package/build/server/chunks/_server.ts-B-gZIXCx.js.map +0 -1
- package/build/server/chunks/_server.ts-B1LApKwc.js +0 -48
- package/build/server/chunks/_server.ts-B1LApKwc.js.map +0 -1
- package/build/server/chunks/_server.ts-B5s8k9IW.js +0 -53
- package/build/server/chunks/_server.ts-B5s8k9IW.js.map +0 -1
- package/build/server/chunks/_server.ts-B7oDgVRm.js +0 -208
- package/build/server/chunks/_server.ts-B7oDgVRm.js.map +0 -1
- package/build/server/chunks/_server.ts-BA7OxoAM.js +0 -69
- package/build/server/chunks/_server.ts-BA7OxoAM.js.map +0 -1
- package/build/server/chunks/_server.ts-BCqZP9mX.js +0 -94
- package/build/server/chunks/_server.ts-BCqZP9mX.js.map +0 -1
- package/build/server/chunks/_server.ts-BE9eO04W.js +0 -100
- package/build/server/chunks/_server.ts-BE9eO04W.js.map +0 -1
- package/build/server/chunks/_server.ts-BL9qmwrJ.js +0 -152
- package/build/server/chunks/_server.ts-BL9qmwrJ.js.map +0 -1
- package/build/server/chunks/_server.ts-BUf-IIIm.js +0 -85
- package/build/server/chunks/_server.ts-BUf-IIIm.js.map +0 -1
- package/build/server/chunks/_server.ts-BW13CurN.js +0 -43
- package/build/server/chunks/_server.ts-BW13CurN.js.map +0 -1
- package/build/server/chunks/_server.ts-BWh3c-xu.js +0 -44
- package/build/server/chunks/_server.ts-BWh3c-xu.js.map +0 -1
- package/build/server/chunks/_server.ts-BYDgL8Wh.js +0 -68
- package/build/server/chunks/_server.ts-BYDgL8Wh.js.map +0 -1
- package/build/server/chunks/_server.ts-B_9-b1wk.js +0 -82
- package/build/server/chunks/_server.ts-B_9-b1wk.js.map +0 -1
- package/build/server/chunks/_server.ts-Bbc4zzJy.js +0 -39
- package/build/server/chunks/_server.ts-Bbc4zzJy.js.map +0 -1
- package/build/server/chunks/_server.ts-BhmHIGs6.js +0 -45
- package/build/server/chunks/_server.ts-BhmHIGs6.js.map +0 -1
- package/build/server/chunks/_server.ts-BhuoSeRy.js +0 -64
- package/build/server/chunks/_server.ts-BhuoSeRy.js.map +0 -1
- package/build/server/chunks/_server.ts-BnL_ReBS.js +0 -50
- package/build/server/chunks/_server.ts-BnL_ReBS.js.map +0 -1
- package/build/server/chunks/_server.ts-BoOQ7F2z.js +0 -40
- package/build/server/chunks/_server.ts-BoOQ7F2z.js.map +0 -1
- package/build/server/chunks/_server.ts-Bry3Z40C.js +0 -160
- package/build/server/chunks/_server.ts-Bry3Z40C.js.map +0 -1
- package/build/server/chunks/_server.ts-BtVLVJf0.js +0 -80
- package/build/server/chunks/_server.ts-BtVLVJf0.js.map +0 -1
- package/build/server/chunks/_server.ts-BzISiSHa.js +0 -57
- package/build/server/chunks/_server.ts-BzISiSHa.js.map +0 -1
- package/build/server/chunks/_server.ts-C7PeR-ll.js +0 -112
- package/build/server/chunks/_server.ts-C7PeR-ll.js.map +0 -1
- package/build/server/chunks/_server.ts-C8NW6VWR.js +0 -55
- package/build/server/chunks/_server.ts-C8NW6VWR.js.map +0 -1
- package/build/server/chunks/_server.ts-CF0aKxAL.js +0 -59
- package/build/server/chunks/_server.ts-CF0aKxAL.js.map +0 -1
- package/build/server/chunks/_server.ts-CH-OPdXJ.js +0 -56
- package/build/server/chunks/_server.ts-CH-OPdXJ.js.map +0 -1
- package/build/server/chunks/_server.ts-CPsQ5aGi.js +0 -79
- package/build/server/chunks/_server.ts-CPsQ5aGi.js.map +0 -1
- package/build/server/chunks/_server.ts-CQ8JX5O7.js +0 -89
- package/build/server/chunks/_server.ts-CQ8JX5O7.js.map +0 -1
- package/build/server/chunks/_server.ts-CQPRTbTX.js +0 -63
- package/build/server/chunks/_server.ts-CQPRTbTX.js.map +0 -1
- package/build/server/chunks/_server.ts-CTVpEmAc.js +0 -517
- package/build/server/chunks/_server.ts-CTVpEmAc.js.map +0 -1
- package/build/server/chunks/_server.ts-CWVi9VhR.js +0 -76
- package/build/server/chunks/_server.ts-CWVi9VhR.js.map +0 -1
- package/build/server/chunks/_server.ts-CXQd0L0u.js +0 -57
- package/build/server/chunks/_server.ts-CXQd0L0u.js.map +0 -1
- package/build/server/chunks/_server.ts-Cgg_3L-k.js +0 -44
- package/build/server/chunks/_server.ts-Cgg_3L-k.js.map +0 -1
- package/build/server/chunks/_server.ts-ChvbGMR6.js +0 -50
- package/build/server/chunks/_server.ts-ChvbGMR6.js.map +0 -1
- package/build/server/chunks/_server.ts-CnByyw9m.js +0 -35
- package/build/server/chunks/_server.ts-CnByyw9m.js.map +0 -1
- package/build/server/chunks/_server.ts-Ct_0qiMK.js +0 -76
- package/build/server/chunks/_server.ts-Ct_0qiMK.js.map +0 -1
- package/build/server/chunks/_server.ts-Cu1u6Fq3.js +0 -244
- package/build/server/chunks/_server.ts-Cu1u6Fq3.js.map +0 -1
- package/build/server/chunks/_server.ts-Cuq4zRUh.js +0 -66
- package/build/server/chunks/_server.ts-Cuq4zRUh.js.map +0 -1
- package/build/server/chunks/_server.ts-Cx8pH99_.js +0 -43
- package/build/server/chunks/_server.ts-Cx8pH99_.js.map +0 -1
- package/build/server/chunks/_server.ts-D-eORdC8.js +0 -57
- package/build/server/chunks/_server.ts-D-eORdC8.js.map +0 -1
- package/build/server/chunks/_server.ts-D1cvo-nO.js +0 -55
- package/build/server/chunks/_server.ts-D1cvo-nO.js.map +0 -1
- package/build/server/chunks/_server.ts-D4nuqQNX.js +0 -85
- package/build/server/chunks/_server.ts-D4nuqQNX.js.map +0 -1
- package/build/server/chunks/_server.ts-D6aAJoCf.js +0 -70
- package/build/server/chunks/_server.ts-D6aAJoCf.js.map +0 -1
- package/build/server/chunks/_server.ts-D9PUEjiN.js +0 -47
- package/build/server/chunks/_server.ts-D9PUEjiN.js.map +0 -1
- package/build/server/chunks/_server.ts-DAiD8z-P.js +0 -47
- package/build/server/chunks/_server.ts-DAiD8z-P.js.map +0 -1
- package/build/server/chunks/_server.ts-DDKL_uuS.js +0 -203
- package/build/server/chunks/_server.ts-DDKL_uuS.js.map +0 -1
- package/build/server/chunks/_server.ts-DGkgd0uc.js +0 -166
- package/build/server/chunks/_server.ts-DGkgd0uc.js.map +0 -1
- package/build/server/chunks/_server.ts-DHig-2Ii.js +0 -58
- package/build/server/chunks/_server.ts-DHig-2Ii.js.map +0 -1
- package/build/server/chunks/_server.ts-DJdHVo2c.js +0 -36
- package/build/server/chunks/_server.ts-DJdHVo2c.js.map +0 -1
- package/build/server/chunks/_server.ts-DLrsnGKc.js +0 -64
- package/build/server/chunks/_server.ts-DLrsnGKc.js.map +0 -1
- package/build/server/chunks/_server.ts-DRYh6JJM.js +0 -36
- package/build/server/chunks/_server.ts-DRYh6JJM.js.map +0 -1
- package/build/server/chunks/_server.ts-DUbqsB2y.js +0 -43
- package/build/server/chunks/_server.ts-DUbqsB2y.js.map +0 -1
- package/build/server/chunks/_server.ts-DVRwJs1D.js +0 -89
- package/build/server/chunks/_server.ts-DVRwJs1D.js.map +0 -1
- package/build/server/chunks/_server.ts-DYZ1SnMq.js +0 -44
- package/build/server/chunks/_server.ts-DYZ1SnMq.js.map +0 -1
- package/build/server/chunks/_server.ts-DdpgDdUI.js +0 -59
- package/build/server/chunks/_server.ts-DdpgDdUI.js.map +0 -1
- package/build/server/chunks/_server.ts-DhVR_dEn.js +0 -67
- package/build/server/chunks/_server.ts-DhVR_dEn.js.map +0 -1
- package/build/server/chunks/_server.ts-DorWUEnZ.js +0 -762
- package/build/server/chunks/_server.ts-DorWUEnZ.js.map +0 -1
- package/build/server/chunks/_server.ts-DptdgCp1.js +0 -92
- package/build/server/chunks/_server.ts-DptdgCp1.js.map +0 -1
- package/build/server/chunks/_server.ts-DyFhMY-d.js +0 -84
- package/build/server/chunks/_server.ts-DyFhMY-d.js.map +0 -1
- package/build/server/chunks/_server.ts-FBHhAciM.js +0 -149
- package/build/server/chunks/_server.ts-FBHhAciM.js.map +0 -1
- package/build/server/chunks/_server.ts-H0_rl9HF.js +0 -66
- package/build/server/chunks/_server.ts-H0_rl9HF.js.map +0 -1
- package/build/server/chunks/_server.ts-MGCXhBlP.js +0 -52
- package/build/server/chunks/_server.ts-MGCXhBlP.js.map +0 -1
- package/build/server/chunks/_server.ts-OXR06_zO.js +0 -167
- package/build/server/chunks/_server.ts-OXR06_zO.js.map +0 -1
- package/build/server/chunks/_server.ts-QbGAW-It.js +0 -58
- package/build/server/chunks/_server.ts-QbGAW-It.js.map +0 -1
- package/build/server/chunks/_server.ts-TAvt1Rlb.js +0 -57
- package/build/server/chunks/_server.ts-TAvt1Rlb.js.map +0 -1
- package/build/server/chunks/_server.ts-VXMfJF_F.js +0 -62
- package/build/server/chunks/_server.ts-VXMfJF_F.js.map +0 -1
- package/build/server/chunks/_server.ts-XiInWDAF.js +0 -82
- package/build/server/chunks/_server.ts-XiInWDAF.js.map +0 -1
- package/build/server/chunks/_server.ts-d08IyVdj.js +0 -54
- package/build/server/chunks/_server.ts-d08IyVdj.js.map +0 -1
- package/build/server/chunks/_server.ts-dtw_InfP.js +0 -36
- package/build/server/chunks/_server.ts-dtw_InfP.js.map +0 -1
- package/build/server/chunks/_server.ts-eTP3NGlu.js +0 -49
- package/build/server/chunks/_server.ts-eTP3NGlu.js.map +0 -1
- package/build/server/chunks/_server.ts-fm-L_1WH.js +0 -56
- package/build/server/chunks/_server.ts-fm-L_1WH.js.map +0 -1
- package/build/server/chunks/_server.ts-g5H0gdQB.js +0 -70
- package/build/server/chunks/_server.ts-g5H0gdQB.js.map +0 -1
- package/build/server/chunks/_server.ts-gBvSTaRH.js +0 -78
- package/build/server/chunks/_server.ts-gBvSTaRH.js.map +0 -1
- package/build/server/chunks/_server.ts-lMB9A2Vx.js +0 -92
- package/build/server/chunks/_server.ts-lMB9A2Vx.js.map +0 -1
- package/build/server/chunks/_server.ts-tww34LXr.js +0 -42
- package/build/server/chunks/_server.ts-tww34LXr.js.map +0 -1
- package/build/server/chunks/_server.ts-xgg0Rj1C.js +0 -129
- package/build/server/chunks/_server.ts-xgg0Rj1C.js.map +0 -1
- package/build/server/chunks/_server.ts-yO3j4YDH.js +0 -169
- package/build/server/chunks/_server.ts-yO3j4YDH.js.map +0 -1
- package/build/server/chunks/addon-helpers-DnZ1IPC7.js +0 -51
- package/build/server/chunks/addon-helpers-DnZ1IPC7.js.map +0 -1
- package/build/server/chunks/akm-BVM3F-FY.js +0 -151
- package/build/server/chunks/akm-BVM3F-FY.js.map +0 -1
- package/build/server/chunks/catalog-B_9Qf_Tj.js +0 -217
- package/build/server/chunks/catalog-B_9Qf_Tj.js.map +0 -1
- package/build/server/chunks/client-CEfPhREO.js +0 -202
- package/build/server/chunks/client-CEfPhREO.js.map +0 -1
- package/build/server/chunks/config-VJ5wAdKd.js +0 -121
- package/build/server/chunks/config-VJ5wAdKd.js.map +0 -1
- package/build/server/chunks/dist-DOFcG0Zp.js +0 -6617
- package/build/server/chunks/dist-DOFcG0Zp.js.map +0 -1
- package/build/server/chunks/docker-7rKo0FDm.js +0 -20
- package/build/server/chunks/docker-7rKo0FDm.js.map +0 -1
- package/build/server/chunks/endpoints-DUs5zmwI.js +0 -358
- package/build/server/chunks/endpoints-DUs5zmwI.js.map +0 -1
- package/build/server/chunks/environment-DqfL567G.js +0 -38
- package/build/server/chunks/environment-DqfL567G.js.map +0 -1
- package/build/server/chunks/error.svelte-DXUxoirZ.js +0 -18
- package/build/server/chunks/error.svelte-DXUxoirZ.js.map +0 -1
- package/build/server/chunks/exports-D1quPX8S.js +0 -124
- package/build/server/chunks/exports-D1quPX8S.js.map +0 -1
- package/build/server/chunks/exports2-DECEtwH0.js +0 -691
- package/build/server/chunks/exports2-DECEtwH0.js.map +0 -1
- package/build/server/chunks/features-h0rPqe2e.js +0 -15
- package/build/server/chunks/features-h0rPqe2e.js.map +0 -1
- package/build/server/chunks/features.svelte-DsfDrPnq.js +0 -11
- package/build/server/chunks/features.svelte-DsfDrPnq.js.map +0 -1
- package/build/server/chunks/helpers-GEmeDI6e.js +0 -293
- package/build/server/chunks/helpers-GEmeDI6e.js.map +0 -1
- package/build/server/chunks/hooks.server-CwgeONEs.js +0 -155
- package/build/server/chunks/hooks.server-CwgeONEs.js.map +0 -1
- package/build/server/chunks/http-BzGcbSMh.js +0 -31
- package/build/server/chunks/http-BzGcbSMh.js.map +0 -1
- package/build/server/chunks/internal-CWT3-fy-.js +0 -915
- package/build/server/chunks/internal-CWT3-fy-.js.map +0 -1
- package/build/server/chunks/paths-D8yGDgAD.js +0 -17
- package/build/server/chunks/paths-D8yGDgAD.js.map +0 -1
- package/build/server/chunks/provider-constants-DPrj3yBX.js +0 -63
- package/build/server/chunks/provider-constants-DPrj3yBX.js.map +0 -1
- package/build/server/chunks/session-cookie-IMj1chTO.js +0 -74
- package/build/server/chunks/session-cookie-IMj1chTO.js.map +0 -1
- package/build/server/chunks/setup-deploy-DhMA_slP.js +0 -75
- package/build/server/chunks/setup-deploy-DhMA_slP.js.map +0 -1
- package/build/server/chunks/src-DBYue8Tb.js +0 -9682
- package/build/server/chunks/src-DBYue8Tb.js.map +0 -1
- package/build/server/chunks/state-Bpt5dC1X.js +0 -24
- package/build/server/chunks/state-Bpt5dC1X.js.map +0 -1
- package/build/server/chunks/state2-D20PkMjF.js +0 -62
- package/build/server/chunks/state2-D20PkMjF.js.map +0 -1
- package/build/server/chunks/theme-state.svelte-DPdcwIRf.js +0 -837
- package/build/server/chunks/theme-state.svelte-DPdcwIRf.js.map +0 -1
- package/build/server/chunks/utils-BSRjJDrZ.js +0 -150
- package/build/server/chunks/utils-BSRjJDrZ.js.map +0 -1
- /package/build/client/_app/immutable/assets/{6.BXlLAfIE.css → 4.BXlLAfIE.css} +0 -0
- /package/build/client/_app/immutable/assets/{6.BXlLAfIE.css.br → 4.BXlLAfIE.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{6.BXlLAfIE.css.gz → 4.BXlLAfIE.css.gz} +0 -0
|
@@ -0,0 +1,3516 @@
|
|
|
1
|
+
import { F as head, q as ensure_array_like, e as attr_class, d as attr, s as escape_html, a9 as stringify, p as derived, g as bind_props } from './dev-D85DamNs.js';
|
|
2
|
+
import { o as onDestroy, g as goto } from './client-D2lMniPd.js';
|
|
3
|
+
import { aQ as require_dist } from './src-BwQUi60U.js';
|
|
4
|
+
import { h as hasCapability } from './runtime-context.svelte-C5zNEC6u.js';
|
|
5
|
+
import { v as voiceState, c as requireOk, a as request, n as notifications } from './voice-state.svelte-BAiqUOIX.js';
|
|
6
|
+
import { I as IconDone } from './IconDone-CHBJ36xT.js';
|
|
7
|
+
import { I as IconInfo } from './IconInfo-DA5uGQyP.js';
|
|
8
|
+
import { S as SvelteMap, a as IconStop, s as formatTime, o as formatBytes, p as formatDate, i as endpointsService, e as SvelteSet, O as toolIconType, M as toolAriaLabel } from './IconStop-C89_dmt4.js';
|
|
9
|
+
import { N as Navbar, a as IconServer, D as Drawer } from './IconServer-fOHYHe-O.js';
|
|
10
|
+
import { I as IconMic, S as Spinner } from './IconMic-BbjkE_nG.js';
|
|
11
|
+
import { I as IconActivity, e as IconLink, b as IconDoneCircle, h as IconTerminal, C as ChatMessage, f as IconRefresh, g as IconSearch, d as IconFile, c as IconEdit, a as IconClock } from './IconActivity-BVrMC8FH.js';
|
|
12
|
+
import { I as IconAgent, a as IconAlert } from './IconAgent-DeBWj6Gr.js';
|
|
13
|
+
import { I as IconLock } from './IconLock-Bz5zHCBQ.js';
|
|
14
|
+
import './exports2-BjzhbhYA.js';
|
|
15
|
+
import './utils-OXHIhUb5.js';
|
|
16
|
+
import 'node:module';
|
|
17
|
+
import './internal-G-Uk-kCA.js';
|
|
18
|
+
import './chunk-CLZ62Ad-.js';
|
|
19
|
+
import './provider-constants-1s1k8kbj.js';
|
|
20
|
+
import 'node:fs';
|
|
21
|
+
import 'node:child_process';
|
|
22
|
+
import 'node:path';
|
|
23
|
+
import 'buffer';
|
|
24
|
+
import 'node:url';
|
|
25
|
+
import 'node:os';
|
|
26
|
+
import 'node:crypto';
|
|
27
|
+
import 'events';
|
|
28
|
+
import 'fs';
|
|
29
|
+
import 'node:events';
|
|
30
|
+
import 'node:stream';
|
|
31
|
+
import 'node:string_decoder';
|
|
32
|
+
import 'path';
|
|
33
|
+
import 'assert';
|
|
34
|
+
import 'zlib';
|
|
35
|
+
import 'node:assert';
|
|
36
|
+
import 'node:fs/promises';
|
|
37
|
+
import './speakable-text-BflxDDdY.js';
|
|
38
|
+
import './state2-BhKHITEo.js';
|
|
39
|
+
import './IconLogo-BRmPVDI_.js';
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/lib/api/containers.ts
|
|
43
|
+
async function fetchContainers() {
|
|
44
|
+
return await (await requireOk(await request("GET", "/api/host/containers/list"))).json();
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/lib/api/backups.ts
|
|
48
|
+
async function fetchBackups() {
|
|
49
|
+
return await (await requireOk(await request("GET", "/api/host/backups"))).json();
|
|
50
|
+
}
|
|
51
|
+
async function fetchSecretStripNotice() {
|
|
52
|
+
return await (await requireOk(await request("GET", "/api/host/secret-notice"))).json();
|
|
53
|
+
}
|
|
54
|
+
async function fetchInstallLockStatus() {
|
|
55
|
+
return await (await requireOk(await request("GET", "/api/host/unlock"))).json();
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/lib/api/automations.ts
|
|
59
|
+
async function fetchAutomations() {
|
|
60
|
+
return await (await requireOk(await request("GET", "/api/host/automations"))).json();
|
|
61
|
+
}
|
|
62
|
+
async function fetchServiceLogs(options) {
|
|
63
|
+
const params = new URLSearchParams();
|
|
64
|
+
params.set("tail", String(options.tail));
|
|
65
|
+
if (options?.since) params.set("since", options.since);
|
|
66
|
+
const qs = params.toString();
|
|
67
|
+
return await (await requireOk(await request("GET", `/api/host/logs${qs ? `?${qs}` : ""}`))).json();
|
|
68
|
+
}
|
|
69
|
+
require_dist();
|
|
70
|
+
async function fetchSecretFiles() {
|
|
71
|
+
return await (await requireOk(await request("GET", "/api/host/secrets"))).json();
|
|
72
|
+
}
|
|
73
|
+
async function detectAkmEmbedding() {
|
|
74
|
+
return await (await requireOk(await request("POST", "/api/host/akm/embedding/detect", {}))).json();
|
|
75
|
+
}
|
|
76
|
+
async function testAkmEmbedding(settings) {
|
|
77
|
+
return await (await requireOk(await request("POST", "/api/host/akm/embedding/test", settings))).json();
|
|
78
|
+
}
|
|
79
|
+
/** POST /api/assistant/model — set the default `model` or `small_model`. */
|
|
80
|
+
async function saveOpencodeModel(target, value) {
|
|
81
|
+
await requireOk(await request("POST", "/api/assistant/model", { [target]: value || null }));
|
|
82
|
+
}
|
|
83
|
+
/** The Error's message, or `fallback` for anything that isn't an Error. */
|
|
84
|
+
function toMessage(e, fallback) {
|
|
85
|
+
return e instanceof Error ? e.message : fallback;
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src/lib/components/chrome/VoiceStopControl.svelte
|
|
89
|
+
function VoiceStopControl($$renderer, $$props) {
|
|
90
|
+
$$renderer.component(($$renderer) => {
|
|
91
|
+
if (derived(() => voiceState.status === "speaking")()) {
|
|
92
|
+
$$renderer.push("<!--[0-->");
|
|
93
|
+
$$renderer.push(`<button type="button" class="voice-stop-btn svelte-1fzuh38" aria-label="Stop assistant speech" title="Assistant is speaking — click to stop">`);
|
|
94
|
+
IconStop($$renderer, { size: 16 });
|
|
95
|
+
$$renderer.push(`<!----> <span class="sr-only svelte-1fzuh38">Stop speaking</span></button>`);
|
|
96
|
+
} else $$renderer.push("<!--[-1-->");
|
|
97
|
+
$$renderer.push(`<!--]-->`);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//#endregion
|
|
101
|
+
//#region ../ui-kit/src/lib/components/icons/IconOverview.svelte
|
|
102
|
+
function IconOverview($$renderer, $$props) {
|
|
103
|
+
let { size = 20, class: className = "" } = $$props;
|
|
104
|
+
$$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="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" x="4" y="4" width="7" height="7" rx="1.4"></rect><rect fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" x="13" y="4" width="7" height="7" rx="1.4"></rect><rect fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" x="4" y="13" width="7" height="7" rx="1.4"></rect><rect fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" x="13" y="13" width="7" height="7" rx="1.4"></rect></svg>`);
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region ../ui-kit/src/lib/components/icons/IconJournal.svelte
|
|
108
|
+
function IconJournal($$renderer, $$props) {
|
|
109
|
+
let { size = 20, class: className = "" } = $$props;
|
|
110
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M6 4.5h10.5a1.8 1.8 0 0 1 1.8 1.8v13.2H7.5a1.5 1.5 0 0 1-1.5-1.5z"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M6 17.5h12.3"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M9.5 8.5h6"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M9.5 12h4"></path></svg>`);
|
|
111
|
+
}
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region ../ui-kit/src/lib/components/icons/IconMemory.svelte
|
|
114
|
+
function IconMemory($$renderer, $$props) {
|
|
115
|
+
let { size = 20, class: className = "" } = $$props;
|
|
116
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M12 7.5a5.5 5.5 0 0 0-9.5 0v10.5a5.5 5.5 0 0 1 9.5 0"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M12 7.5a5.5 5.5 0 0 1 9.5 0v10.5a5.5 5.5 0 0 0-9.5 0"></path></svg>`);
|
|
117
|
+
}
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region ../ui-kit/src/lib/components/icons/IconSharing.svelte
|
|
120
|
+
function IconSharing($$renderer, $$props) {
|
|
121
|
+
let { size = 20, class: className = "" } = $$props;
|
|
122
|
+
$$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="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" x="3" y="9" width="7" height="6" rx="1.5"></rect><rect fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" x="14" y="9" width="7" height="6" rx="1.5"></rect><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M10 12h4"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M12 10l2 2-2 2"></path></svg>`);
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region ../ui-kit/src/lib/components/icons/IconAddons.svelte
|
|
126
|
+
function IconAddons($$renderer, $$props) {
|
|
127
|
+
let { size = 20, class: className = "" } = $$props;
|
|
128
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M12 5L3 9.5l9 4.5 9-4.5z"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 14.5l9 4.5 9-4.5"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 18.5l9 4.5 9-4.5"></path></svg>`);
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region ../ui-kit/src/lib/components/icons/IconAutomations.svelte
|
|
132
|
+
function IconAutomations($$renderer, $$props) {
|
|
133
|
+
let { size = 20, class: className = "" } = $$props;
|
|
134
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><circle fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" cx="12" cy="12" r="8.5"></circle><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M13.5 6.5l-4.5 6h4.5l-4.5 7"></path></svg>`);
|
|
135
|
+
}
|
|
136
|
+
//#endregion
|
|
137
|
+
//#region ../ui-kit/src/lib/components/icons/IconCloudDownload.svelte
|
|
138
|
+
function IconCloudDownload($$renderer, $$props) {
|
|
139
|
+
let { size = 20, class: className = "" } = $$props;
|
|
140
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M6.5 18.5a4.5 4.5 0 0 1 .5-9H8a6 6 0 0 1 11.5 2.5 3.5 3.5 0 0 1-.5 6.5"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M12 11v7"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M9.5 15.5l2.5 2.5 2.5-2.5"></path></svg>`);
|
|
141
|
+
}
|
|
142
|
+
//#endregion
|
|
143
|
+
//#region ../ui-kit/src/lib/components/icons/IconHome.svelte
|
|
144
|
+
function IconHome($$renderer, $$props) {
|
|
145
|
+
let { size = 20, class: className = "" } = $$props;
|
|
146
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 11L12 4l8 7"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M6 10v9.5h12V10"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M10 19.5v-5.5h4v5.5"></path></svg>`);
|
|
147
|
+
}
|
|
148
|
+
//#endregion
|
|
149
|
+
//#region src/lib/components/chrome/TabBar.svelte
|
|
150
|
+
function TabBar($$renderer, $$props) {
|
|
151
|
+
$$renderer.component(($$renderer) => {
|
|
152
|
+
let { active} = $$props;
|
|
153
|
+
const SECTIONS = [
|
|
154
|
+
{
|
|
155
|
+
id: "health",
|
|
156
|
+
label: "Health",
|
|
157
|
+
tabs: [
|
|
158
|
+
{
|
|
159
|
+
id: "overview",
|
|
160
|
+
label: "Overview",
|
|
161
|
+
icon: IconOverview
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: "activity",
|
|
165
|
+
label: "Activity",
|
|
166
|
+
icon: IconActivity
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: "containers",
|
|
170
|
+
label: "Systems",
|
|
171
|
+
icon: IconServer
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "logs",
|
|
175
|
+
label: "Journal",
|
|
176
|
+
icon: IconJournal
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
id: "updates",
|
|
180
|
+
label: "Check-up",
|
|
181
|
+
icon: IconCloudDownload
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
id: "recovery",
|
|
185
|
+
label: "Recovery",
|
|
186
|
+
icon: IconHome
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: "mind",
|
|
192
|
+
label: "Mind",
|
|
193
|
+
tabs: [{
|
|
194
|
+
id: "connections",
|
|
195
|
+
label: "AI Providers",
|
|
196
|
+
icon: IconLink
|
|
197
|
+
}]
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
id: "voice",
|
|
201
|
+
label: "Voice",
|
|
202
|
+
tabs: [{
|
|
203
|
+
id: "voice",
|
|
204
|
+
label: "Voice",
|
|
205
|
+
icon: IconMic
|
|
206
|
+
}]
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: "routines",
|
|
210
|
+
label: "Routines",
|
|
211
|
+
tabs: [{
|
|
212
|
+
id: "automations",
|
|
213
|
+
label: "Automations",
|
|
214
|
+
icon: IconAutomations
|
|
215
|
+
}]
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
id: "capabilities",
|
|
219
|
+
label: "Capabilities",
|
|
220
|
+
tabs: [{
|
|
221
|
+
id: "addons",
|
|
222
|
+
label: "Add-ons",
|
|
223
|
+
icon: IconAddons
|
|
224
|
+
}]
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: "knowledge",
|
|
228
|
+
label: "Knowledge",
|
|
229
|
+
tabs: [
|
|
230
|
+
{
|
|
231
|
+
id: "akm",
|
|
232
|
+
label: "Memory",
|
|
233
|
+
icon: IconMemory
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: "assistant",
|
|
237
|
+
label: "Assistant",
|
|
238
|
+
icon: IconAgent
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: "secrets",
|
|
242
|
+
label: "Secrets",
|
|
243
|
+
icon: IconLock
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: "host-sharing",
|
|
247
|
+
label: "Sharing",
|
|
248
|
+
icon: IconSharing
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
];
|
|
253
|
+
let activeSection = derived(() => SECTIONS.find((s) => s.tabs.some((t) => t.id === active)) ?? SECTIONS[0]);
|
|
254
|
+
$$renderer.push(`<nav class="nav-shell svelte-7673iv" aria-label="Admin sections"><div class="section-strip svelte-7673iv" role="tablist" aria-label="Sections"><!--[-->`);
|
|
255
|
+
const each_array = ensure_array_like(SECTIONS);
|
|
256
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
257
|
+
let section = each_array[$$index];
|
|
258
|
+
$$renderer.push(`<button${attr_class("section-tab svelte-7673iv", void 0, { "section-tab-active": activeSection().id === section.id })} role="tab"${attr("aria-selected", activeSection().id === section.id)}>${escape_html(section.label)}</button>`);
|
|
259
|
+
}
|
|
260
|
+
$$renderer.push(`<!--]--></div> `);
|
|
261
|
+
if (activeSection().tabs.length > 1) {
|
|
262
|
+
$$renderer.push("<!--[0-->");
|
|
263
|
+
$$renderer.push(`<div class="subtab-row svelte-7673iv"><div class="tabs svelte-7673iv" role="tablist"${attr("aria-label", `${stringify(activeSection().label)} tabs`)}><!--[-->`);
|
|
264
|
+
const each_array_1 = ensure_array_like(activeSection().tabs);
|
|
265
|
+
for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
|
|
266
|
+
let tab = each_array_1[$$index_1];
|
|
267
|
+
$$renderer.push(`<button${attr_class("tab svelte-7673iv", void 0, { "tab-active": active === tab.id })} role="tab"${attr("aria-selected", active === tab.id)}>`);
|
|
268
|
+
if (tab.icon) {
|
|
269
|
+
$$renderer.push("<!--[-->");
|
|
270
|
+
tab.icon($$renderer, { size: 13 });
|
|
271
|
+
$$renderer.push("<!--]-->");
|
|
272
|
+
} else {
|
|
273
|
+
$$renderer.push("<!--[!-->");
|
|
274
|
+
$$renderer.push("<!--]-->");
|
|
275
|
+
}
|
|
276
|
+
$$renderer.push(` ${escape_html(tab.label)}</button>`);
|
|
277
|
+
}
|
|
278
|
+
$$renderer.push(`<!--]--></div></div>`);
|
|
279
|
+
} else $$renderer.push("<!--[-1-->");
|
|
280
|
+
$$renderer.push(`<!--]--></nav>`);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
//#endregion
|
|
284
|
+
//#region src/lib/components/admin/overview/StatusHero.svelte
|
|
285
|
+
function StatusHero($$renderer, $$props) {
|
|
286
|
+
$$renderer.component(($$renderer) => {
|
|
287
|
+
let { status, title, detail, healthLoading} = $$props;
|
|
288
|
+
$$renderer.push(`<section${attr_class(`hero hero--${stringify(status)}`, "svelte-10n23hu")} role="status" aria-live="polite"><span class="hero-icon svelte-10n23hu" aria-hidden="true">`);
|
|
289
|
+
if (status === "warning") {
|
|
290
|
+
$$renderer.push("<!--[0-->");
|
|
291
|
+
IconAlert($$renderer, { size: 22 });
|
|
292
|
+
} else if (status === "ok") {
|
|
293
|
+
$$renderer.push("<!--[1-->");
|
|
294
|
+
IconDoneCircle($$renderer, { size: 22 });
|
|
295
|
+
} else {
|
|
296
|
+
$$renderer.push("<!--[-1-->");
|
|
297
|
+
IconInfo($$renderer, { size: 22 });
|
|
298
|
+
}
|
|
299
|
+
$$renderer.push(`<!--]--></span> <div class="hero-text svelte-10n23hu"><h2 class="hero-title svelte-10n23hu">${escape_html(title)}</h2> <p class="hero-detail svelte-10n23hu">${escape_html(detail)}</p></div> <div class="hero-actions svelte-10n23hu"><button class="btn btn-secondary"${attr("disabled", healthLoading, true)}>${escape_html(healthLoading ? "Checking…" : "Re-check")}</button> `);
|
|
300
|
+
if (status === "warning") {
|
|
301
|
+
$$renderer.push("<!--[0-->");
|
|
302
|
+
$$renderer.push(`<button class="btn btn-secondary">View containers</button>`);
|
|
303
|
+
} else $$renderer.push("<!--[-1-->");
|
|
304
|
+
$$renderer.push(`<!--]--> <button class="btn btn-secondary">Check for updates</button></div></section>`);
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
//#endregion
|
|
308
|
+
//#region src/lib/components/admin/overview/MetricTile.svelte
|
|
309
|
+
function MetricTile($$renderer, $$props) {
|
|
310
|
+
/** Primary metric value (rendered when no icon snippet is supplied). */
|
|
311
|
+
/** Secondary "/total" fragment shown next to the value. */
|
|
312
|
+
/** Whether enough data has loaded to show value/sub (else shows an em dash). */
|
|
313
|
+
/** Decorative icon, mutually exclusive with value. */
|
|
314
|
+
/** Status for value and badge color: 'ok' (moss) or 'warn' (seal). */
|
|
315
|
+
/** Optional status badge text (e.g. "configured", "3 active"). */
|
|
316
|
+
let { label, onClick, value = null, sub = null, loaded = true, icon, status, badge } = $$props;
|
|
317
|
+
$$renderer.push(`<button class="tile svelte-19hpfg">`);
|
|
318
|
+
if (icon) {
|
|
319
|
+
$$renderer.push("<!--[0-->");
|
|
320
|
+
$$renderer.push(`<span class="tile-metric tile-metric--icon svelte-19hpfg" aria-hidden="true">`);
|
|
321
|
+
icon($$renderer);
|
|
322
|
+
$$renderer.push(`<!----></span>`);
|
|
323
|
+
} else {
|
|
324
|
+
$$renderer.push("<!--[-1-->");
|
|
325
|
+
$$renderer.push(`<span${attr_class("tile-metric svelte-19hpfg", void 0, {
|
|
326
|
+
"tile-metric--ok": status === "ok",
|
|
327
|
+
"tile-metric--warn": status === "warn"
|
|
328
|
+
})}>`);
|
|
329
|
+
if (loaded) {
|
|
330
|
+
$$renderer.push("<!--[0-->");
|
|
331
|
+
$$renderer.push(`${escape_html(value)}`);
|
|
332
|
+
if (sub) {
|
|
333
|
+
$$renderer.push("<!--[0-->");
|
|
334
|
+
$$renderer.push(`<span class="tile-metric-sub svelte-19hpfg">${escape_html(sub)}</span>`);
|
|
335
|
+
} else $$renderer.push("<!--[-1-->");
|
|
336
|
+
$$renderer.push(`<!--]-->`);
|
|
337
|
+
} else {
|
|
338
|
+
$$renderer.push("<!--[-1-->");
|
|
339
|
+
$$renderer.push(`—`);
|
|
340
|
+
}
|
|
341
|
+
$$renderer.push(`<!--]--></span>`);
|
|
342
|
+
}
|
|
343
|
+
$$renderer.push(`<!--]--> <span class="tile-label svelte-19hpfg">${escape_html(label)}</span> `);
|
|
344
|
+
if (badge) {
|
|
345
|
+
$$renderer.push("<!--[0-->");
|
|
346
|
+
$$renderer.push(`<span${attr_class("s-tile-badge svelte-19hpfg", void 0, {
|
|
347
|
+
"s-tile-badge--ok": status === "ok",
|
|
348
|
+
"s-tile-badge--warn": status === "warn"
|
|
349
|
+
})}>${escape_html(badge)}</span>`);
|
|
350
|
+
} else $$renderer.push("<!--[-1-->");
|
|
351
|
+
$$renderer.push(`<!--]--></button>`);
|
|
352
|
+
}
|
|
353
|
+
//#endregion
|
|
354
|
+
//#region src/lib/components/admin/overview/AkmHealthCard.svelte
|
|
355
|
+
function AkmHealthCard($$renderer, $$props) {
|
|
356
|
+
$$renderer.component(($$renderer) => {
|
|
357
|
+
let { badge} = $$props;
|
|
358
|
+
$$renderer.push(`<button class="akm-card svelte-dcgqe1" aria-label="AKM health — open Knowledge settings"><div class="akm-head svelte-dcgqe1"><span class="akm-title svelte-dcgqe1">AKM runtime health</span> <span${attr_class(`badge ${stringify(badge.cls)}`, "svelte-dcgqe1")}>${escape_html(badge.label)}</span></div> `);
|
|
359
|
+
{
|
|
360
|
+
$$renderer.push("<!--[-1-->");
|
|
361
|
+
$$renderer.push(`<p class="akm-unavailable svelte-dcgqe1">Metrics unavailable — the akm CLI isn't reachable from the admin host.</p>`);
|
|
362
|
+
}
|
|
363
|
+
$$renderer.push(`<!--]--></button>`);
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
//#endregion
|
|
367
|
+
//#region src/lib/components/admin/overview/ConfigureShortcuts.svelte
|
|
368
|
+
function ConfigureShortcuts($$renderer, $$props) {
|
|
369
|
+
$$renderer.component(($$renderer) => {
|
|
370
|
+
$$renderer.push(`<div class="shortcut-grid svelte-8y2vdf"><button class="shortcut svelte-8y2vdf"><span class="shortcut-name svelte-8y2vdf">AI Providers</span> <span class="shortcut-desc svelte-8y2vdf">Models & provider credentials</span></button> <button class="shortcut svelte-8y2vdf"><span class="shortcut-name svelte-8y2vdf">Knowledge</span> <span class="shortcut-desc svelte-8y2vdf">Assistant memory & behavior</span></button> <button class="shortcut svelte-8y2vdf"><span class="shortcut-name svelte-8y2vdf">Voice</span> <span class="shortcut-desc svelte-8y2vdf">Speech-to-text & text-to-speech</span></button> <button class="shortcut svelte-8y2vdf"><span class="shortcut-name svelte-8y2vdf">Portals & add-ons</span> <span class="shortcut-desc svelte-8y2vdf">Discord, Slack, API & more</span></button> <button class="shortcut svelte-8y2vdf"><span class="shortcut-name svelte-8y2vdf">Secrets</span> <span class="shortcut-desc svelte-8y2vdf">Stack & portal credentials</span></button> <a class="shortcut svelte-8y2vdf" href="/setup?rerun=1"><span class="shortcut-name svelte-8y2vdf">Re-run setup</span> <span class="shortcut-desc svelte-8y2vdf">Walk through the setup wizard again</span></a></div>`);
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
//#endregion
|
|
374
|
+
//#region src/lib/components/admin/overview/OverviewTab.svelte
|
|
375
|
+
function OverviewTab($$renderer, $$props) {
|
|
376
|
+
$$renderer.component(($$renderer) => {
|
|
377
|
+
/**
|
|
378
|
+
* Services this stack actually deploys (compose model resolved with active
|
|
379
|
+
* profiles). Health is measured against THIS set so a service the stack
|
|
380
|
+
* never deploys (e.g. guardian on a no-portal install) is never counted as
|
|
381
|
+
* a failed container. Falls back to the merged container keys when empty.
|
|
382
|
+
*/
|
|
383
|
+
let { healthLoading, mergedServices, managedServices, onNavigate } = $$props;
|
|
384
|
+
let akmBadge = derived(() => {
|
|
385
|
+
return {
|
|
386
|
+
label: "Unavailable",
|
|
387
|
+
cls: "badge-neutral"
|
|
388
|
+
};
|
|
389
|
+
});
|
|
390
|
+
let akmCheckTotal = derived(() => 0);
|
|
391
|
+
let healthServices = derived(() => managedServices.length > 0 ? managedServices : [...mergedServices.keys()]);
|
|
392
|
+
let containerCounts = derived(() => {
|
|
393
|
+
if (healthServices().length === 0) return null;
|
|
394
|
+
const running = healthServices().filter((name) => mergedServices.get(name) === "running").length;
|
|
395
|
+
return {
|
|
396
|
+
total: healthServices().length,
|
|
397
|
+
running
|
|
398
|
+
};
|
|
399
|
+
});
|
|
400
|
+
let downServices = derived(() => healthServices().filter((name) => mergedServices.get(name) !== "running"));
|
|
401
|
+
let health = derived(() => {
|
|
402
|
+
if (!containerCounts()) return {
|
|
403
|
+
status: "unknown",
|
|
404
|
+
title: "Checking services…",
|
|
405
|
+
detail: "Fetching the latest status from Docker."
|
|
406
|
+
};
|
|
407
|
+
if (containerCounts().running === containerCounts().total && containerCounts().total > 0) return {
|
|
408
|
+
status: "ok",
|
|
409
|
+
title: "All systems operational",
|
|
410
|
+
detail: `${containerCounts().total} of ${containerCounts().total} services are running normally.`
|
|
411
|
+
};
|
|
412
|
+
const down = containerCounts().total - containerCounts().running;
|
|
413
|
+
const names = downServices().map((n) => n.charAt(0).toUpperCase() + n.slice(1)).join(", ");
|
|
414
|
+
return {
|
|
415
|
+
status: "warning",
|
|
416
|
+
title: `${down} of ${containerCounts().total} services not running`,
|
|
417
|
+
detail: names ? `Not running: ${names}.` : "One or more services need attention."
|
|
418
|
+
};
|
|
419
|
+
});
|
|
420
|
+
StatusHero($$renderer, {
|
|
421
|
+
status: health().status,
|
|
422
|
+
title: health().title,
|
|
423
|
+
detail: health().detail,
|
|
424
|
+
healthLoading});
|
|
425
|
+
$$renderer.push(`<!----> <div class="tile-grid svelte-xz862u">`);
|
|
426
|
+
MetricTile($$renderer, {
|
|
427
|
+
label: "Services running",
|
|
428
|
+
onClick: () => onNavigate("containers"),
|
|
429
|
+
value: containerCounts()?.running,
|
|
430
|
+
sub: containerCounts() ? `/${containerCounts().total}` : null,
|
|
431
|
+
loaded: !!containerCounts(),
|
|
432
|
+
status: containerCounts()?.running === containerCounts()?.total ? "ok" : "warn",
|
|
433
|
+
badge: containerCounts()?.running === containerCounts()?.total ? "operational" : `${(containerCounts()?.total ?? 0) - (containerCounts()?.running ?? 0)} down`
|
|
434
|
+
});
|
|
435
|
+
$$renderer.push(`<!----> `);
|
|
436
|
+
{
|
|
437
|
+
function icon($$renderer) {
|
|
438
|
+
IconTerminal($$renderer, { size: 22 });
|
|
439
|
+
}
|
|
440
|
+
MetricTile($$renderer, {
|
|
441
|
+
label: "View logs",
|
|
442
|
+
onClick: () => onNavigate("logs"),
|
|
443
|
+
icon});
|
|
444
|
+
}
|
|
445
|
+
$$renderer.push(`<!----> `);
|
|
446
|
+
{
|
|
447
|
+
function icon($$renderer) {
|
|
448
|
+
IconCloudDownload($$renderer, { size: 22 });
|
|
449
|
+
}
|
|
450
|
+
MetricTile($$renderer, {
|
|
451
|
+
label: "Check for updates",
|
|
452
|
+
onClick: () => onNavigate("updates"),
|
|
453
|
+
icon});
|
|
454
|
+
}
|
|
455
|
+
$$renderer.push(`<!----></div> <h3 class="section-heading svelte-xz862u">Knowledge base (AKM)</h3> `);
|
|
456
|
+
AkmHealthCard($$renderer, {
|
|
457
|
+
badge: akmBadge(),
|
|
458
|
+
checkTotal: akmCheckTotal()});
|
|
459
|
+
$$renderer.push(`<!----> <h3 class="section-heading svelte-xz862u">Configure</h3> `);
|
|
460
|
+
ConfigureShortcuts($$renderer);
|
|
461
|
+
$$renderer.push(`<!---->`);
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
//#endregion
|
|
465
|
+
//#region src/lib/components/admin/updates/UpdatesTab.svelte
|
|
466
|
+
function UpdatesTab($$renderer, $$props) {
|
|
467
|
+
$$renderer.component(($$renderer) => {
|
|
468
|
+
let rowApplying = {};
|
|
469
|
+
let allApplying = false;
|
|
470
|
+
let uiApplying = false;
|
|
471
|
+
const anyApplying = derived(() => Object.values(rowApplying).some(Boolean));
|
|
472
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header svelte-7mkeya"><div><h2>Updates</h2> <p class="panel-subtitle">Update individual components or everything at once.</p> <p class="control-plane-line svelte-7mkeya">Control plane: <strong class="svelte-7mkeya">${escape_html("—")}</strong></p></div> <div class="header-actions svelte-7mkeya"><button class="btn btn-primary"${attr("disabled", anyApplying(), true)}${attr("aria-busy", allApplying)}>`);
|
|
473
|
+
$$renderer.push("<!--[-1-->");
|
|
474
|
+
$$renderer.push(`Update everything`);
|
|
475
|
+
$$renderer.push(`<!--]--></button> <button class="btn btn-outline"${attr("disabled", anyApplying(), true)}${attr("aria-busy", uiApplying)}>`);
|
|
476
|
+
$$renderer.push("<!--[-1-->");
|
|
477
|
+
$$renderer.push(`Update UI`);
|
|
478
|
+
$$renderer.push(`<!--]--></button></div></div> `);
|
|
479
|
+
$$renderer.push("<!--[-1-->");
|
|
480
|
+
$$renderer.push(`<!--]--> `);
|
|
481
|
+
$$renderer.push("<!--[-1-->");
|
|
482
|
+
$$renderer.push(`<!--]--> `);
|
|
483
|
+
$$renderer.push("<!--[-1-->");
|
|
484
|
+
$$renderer.push(`<!--]--> `);
|
|
485
|
+
$$renderer.push("<!--[-1-->");
|
|
486
|
+
$$renderer.push(`<!--]--> <div class="panel-body">`);
|
|
487
|
+
$$renderer.push("<!--[-1-->");
|
|
488
|
+
$$renderer.push(`<!--]--> `);
|
|
489
|
+
$$renderer.push("<!--[0-->");
|
|
490
|
+
$$renderer.push(`<p class="loading-line svelte-7mkeya">`);
|
|
491
|
+
Spinner($$renderer, {});
|
|
492
|
+
$$renderer.push(`<!----> Loading versions…</p>`);
|
|
493
|
+
$$renderer.push(`<!--]--> `);
|
|
494
|
+
$$renderer.push("<!--[-1-->");
|
|
495
|
+
$$renderer.push(`<!--]--></div></div>`);
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
//#endregion
|
|
499
|
+
//#region src/lib/actions.svelte.ts
|
|
500
|
+
/**
|
|
501
|
+
* A lazily-loaded value plus its request state. `data` is `null` until the
|
|
502
|
+
* first successful `reload()`; a failed load leaves `data` untouched and
|
|
503
|
+
* records `error` (rendered inline by the caller, or toasted with `notify`).
|
|
504
|
+
*/
|
|
505
|
+
var Resource = class {
|
|
506
|
+
data = null;
|
|
507
|
+
loading = false;
|
|
508
|
+
error = "";
|
|
509
|
+
#fetchFn;
|
|
510
|
+
#opts;
|
|
511
|
+
constructor(fetchFn, opts = {}) {
|
|
512
|
+
this.#fetchFn = fetchFn;
|
|
513
|
+
this.#opts = opts;
|
|
514
|
+
}
|
|
515
|
+
async reload() {
|
|
516
|
+
this.loading = true;
|
|
517
|
+
this.error = "";
|
|
518
|
+
try {
|
|
519
|
+
this.data = await this.#fetchFn();
|
|
520
|
+
} catch (e) {
|
|
521
|
+
const message = toMessage(e, this.#opts.fallback ?? "Failed to load.");
|
|
522
|
+
this.error = message;
|
|
523
|
+
if (this.#opts.notify) notifications.push("error", message);
|
|
524
|
+
} finally {
|
|
525
|
+
this.loading = false;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
};
|
|
529
|
+
function resource(fetchFn, opts = {}) {
|
|
530
|
+
return new Resource(fetchFn, opts);
|
|
531
|
+
}
|
|
532
|
+
//#endregion
|
|
533
|
+
//#region src/lib/components/admin/updates/RecoveryTab.svelte
|
|
534
|
+
function RecoveryTab($$renderer, $$props) {
|
|
535
|
+
$$renderer.component(($$renderer) => {
|
|
536
|
+
const backupsRes = resource(fetchBackups, { fallback: "Failed to load backups." });
|
|
537
|
+
let backups = derived(() => backupsRes.data);
|
|
538
|
+
const secretNoticeRes = resource(async () => (await fetchSecretStripNotice()).notice);
|
|
539
|
+
let secretNotice = derived(() => secretNoticeRes.data);
|
|
540
|
+
const installLockRes = resource(fetchInstallLockStatus);
|
|
541
|
+
let installLock = derived(() => installLockRes.data);
|
|
542
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2>Recovery</h2> <p class="panel-subtitle">Backups · recovery · migration</p></div></div> <div class="panel-body">`);
|
|
543
|
+
if (secretNotice()) {
|
|
544
|
+
$$renderer.push("<!--[0-->");
|
|
545
|
+
$$renderer.push(`<div class="secret-notice svelte-54nov7" role="status"><div class="secret-notice-text svelte-54nov7"><p class="secret-notice-title svelte-54nov7">Secret-looking values were moved out of stack.env</p> <p class="svelte-54nov7">${escape_html(secretNotice().keys.join(", "))} ${escape_html(secretNotice().keys.length === 1 ? "was" : "were")} moved
|
|
546
|
+
to <strong>knowledge/secrets/</strong> because secrets don't belong in stack.env — the
|
|
547
|
+
value${escape_html(secretNotice().keys.length === 1 ? "" : "s")} were not deleted. Re-add
|
|
548
|
+
${escape_html(secretNotice().keys.length === 1 ? "it" : "them")} via the <strong>Connections</strong> tab
|
|
549
|
+
if you'd rather manage ${escape_html(secretNotice().keys.length === 1 ? "it" : "them")} there.</p></div> <button class="btn btn-sm btn-secondary">Dismiss</button></div>`);
|
|
550
|
+
} else $$renderer.push("<!--[-1-->");
|
|
551
|
+
$$renderer.push(`<!--]--> `);
|
|
552
|
+
if (installLock()?.present && installLock().stale) {
|
|
553
|
+
$$renderer.push("<!--[0-->");
|
|
554
|
+
$$renderer.push(`<div class="stuck-notice svelte-54nov7" role="status"><div class="stuck-notice-text svelte-54nov7"><p class="stuck-notice-title svelte-54nov7">An operation seems stuck</p> <p class="svelte-54nov7">A previous install or update didn't finish cleanly and left a lock behind. It would
|
|
555
|
+
clear itself automatically after 30 minutes — or you can clear it now to run another
|
|
556
|
+
update. Nothing else is changed.</p></div> <button class="btn btn-sm btn-primary"${attr("disabled", false, true)}${attr("aria-busy", false)}>`);
|
|
557
|
+
$$renderer.push("<!--[-1-->");
|
|
558
|
+
$$renderer.push(`Clear it`);
|
|
559
|
+
$$renderer.push(`<!--]--></button></div>`);
|
|
560
|
+
} else $$renderer.push("<!--[-1-->");
|
|
561
|
+
$$renderer.push(`<!--]--> <section class="backups-section svelte-54nov7" aria-labelledby="backups-title"><div class="backups-header svelte-54nov7"><div><h3 id="backups-title" class="backups-title svelte-54nov7">Backups</h3> `);
|
|
562
|
+
if (backups() && backups().count > 0) {
|
|
563
|
+
$$renderer.push("<!--[0-->");
|
|
564
|
+
$$renderer.push(`<p class="backups-summary svelte-54nov7">${escape_html(backups().count)} ${escape_html(backups().count === 1 ? "backup" : "backups")} ·
|
|
565
|
+
${escape_html(formatBytes(backups().totalBytes))} total · last ${escape_html(formatDate(backups().lastBackupAt))}</p>`);
|
|
566
|
+
} else $$renderer.push("<!--[-1-->");
|
|
567
|
+
$$renderer.push(`<!--]--></div> `);
|
|
568
|
+
if (backups() && backups().count > 0) {
|
|
569
|
+
$$renderer.push("<!--[0-->");
|
|
570
|
+
$$renderer.push(`<button class="btn btn-sm btn-secondary"${attr("disabled", backupsRes.loading, true)}>Prune…</button>`);
|
|
571
|
+
} else $$renderer.push("<!--[-1-->");
|
|
572
|
+
$$renderer.push(`<!--]--></div> <p class="backups-desc svelte-54nov7">Each update copies your settings here first. To restore, run <code>openpalm rollback</code> for the last update, or point OpenPalm at a snapshot directory manually.
|
|
573
|
+
Nothing is ever deleted automatically.</p> `);
|
|
574
|
+
if (backupsRes.loading) {
|
|
575
|
+
$$renderer.push("<!--[0-->");
|
|
576
|
+
$$renderer.push(`<p class="backups-empty svelte-54nov7">`);
|
|
577
|
+
Spinner($$renderer, {});
|
|
578
|
+
$$renderer.push(`<!----> Loading backups…</p>`);
|
|
579
|
+
} else if (backupsRes.error) {
|
|
580
|
+
$$renderer.push("<!--[1-->");
|
|
581
|
+
$$renderer.push(`<p class="backups-error svelte-54nov7" role="alert">Couldn't load backups: ${escape_html(backupsRes.error)}</p>`);
|
|
582
|
+
} else if (!backups() || backups().count === 0) {
|
|
583
|
+
$$renderer.push("<!--[2-->");
|
|
584
|
+
$$renderer.push(`<p class="backups-empty svelte-54nov7">No backups yet — one is created the first time you update.</p>`);
|
|
585
|
+
} else {
|
|
586
|
+
$$renderer.push("<!--[-1-->");
|
|
587
|
+
$$renderer.push(`<table class="backups-table svelte-54nov7"><thead><tr><th class="svelte-54nov7">Name</th><th class="svelte-54nov7">Created</th><th class="svelte-54nov7">Size</th><th class="svelte-54nov7">Restore</th></tr></thead><tbody><!--[-->`);
|
|
588
|
+
const each_array = ensure_array_like(backups().backups);
|
|
589
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
590
|
+
let b = each_array[$$index];
|
|
591
|
+
$$renderer.push(`<tr class="svelte-54nov7"><td class="backups-cell-name svelte-54nov7"${attr("title", b.path)}>${escape_html(b.name)}</td><td class="backups-cell-meta svelte-54nov7">${escape_html(formatDate(b.createdAt))}</td><td class="backups-cell-meta svelte-54nov7">${escape_html(formatBytes(b.sizeBytes))}</td><td class="backups-cell-restore svelte-54nov7"><span class="backups-restore-note svelte-54nov7" title="Run: openpalm rollback"><code>openpalm rollback</code></span></td></tr>`);
|
|
592
|
+
}
|
|
593
|
+
$$renderer.push(`<!--]--></tbody></table>`);
|
|
594
|
+
}
|
|
595
|
+
$$renderer.push(`<!--]--> `);
|
|
596
|
+
$$renderer.push("<!--[-1-->");
|
|
597
|
+
$$renderer.push(`<!--]--></section></div></div>`);
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
//#endregion
|
|
601
|
+
//#region ../ui-kit/src/lib/components/common/EmptyState.svelte
|
|
602
|
+
function EmptyState($$renderer, $$props) {
|
|
603
|
+
/** Icon markup (typically an inline SVG). */
|
|
604
|
+
/** Message body (paragraphs, hints, etc.). */
|
|
605
|
+
/** Optional action(s) — buttons/links shown below the message. */
|
|
606
|
+
let { icon, children, action } = $$props;
|
|
607
|
+
$$renderer.push(`<div class="empty-state svelte-1cb80bq">`);
|
|
608
|
+
if (icon) {
|
|
609
|
+
$$renderer.push("<!--[0-->");
|
|
610
|
+
icon($$renderer);
|
|
611
|
+
$$renderer.push(`<!---->`);
|
|
612
|
+
} else $$renderer.push("<!--[-1-->");
|
|
613
|
+
$$renderer.push(`<!--]--> `);
|
|
614
|
+
children($$renderer);
|
|
615
|
+
$$renderer.push(`<!----> `);
|
|
616
|
+
if (action) {
|
|
617
|
+
$$renderer.push("<!--[0-->");
|
|
618
|
+
action($$renderer);
|
|
619
|
+
$$renderer.push(`<!---->`);
|
|
620
|
+
} else $$renderer.push("<!--[-1-->");
|
|
621
|
+
$$renderer.push(`<!--]--></div>`);
|
|
622
|
+
}
|
|
623
|
+
//#endregion
|
|
624
|
+
//#region src/lib/components/addons/AddonsTab.svelte
|
|
625
|
+
function AddonsTab($$renderer, $$props) {
|
|
626
|
+
$$renderer.component(($$renderer) => {
|
|
627
|
+
const ADDON_ACRONYMS = {
|
|
628
|
+
api: "API",
|
|
629
|
+
ssh: "SSH",
|
|
630
|
+
ui: "UI"
|
|
631
|
+
};
|
|
632
|
+
function formatAddonName(name) {
|
|
633
|
+
return name.split(/[-_]/).filter(Boolean).map((w) => ADDON_ACRONYMS[w.toLowerCase()] ?? w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
|
|
634
|
+
}
|
|
635
|
+
let addons = [];
|
|
636
|
+
let loading = false;
|
|
637
|
+
let actionLoading = null;
|
|
638
|
+
let $$settled = true;
|
|
639
|
+
let $$inner_renderer;
|
|
640
|
+
function $$render_inner($$renderer) {
|
|
641
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2>Addons</h2> <p class="panel-subtitle">Optional features · capabilities</p></div> <button class="btn btn-secondary btn-sm"${attr("disabled", loading, true)}>`);
|
|
642
|
+
$$renderer.push("<!--[-1-->");
|
|
643
|
+
$$renderer.push(`<!--]--> Refresh</button></div> <div class="panel-body panel-body--flush">`);
|
|
644
|
+
if (addons.length === 0) {
|
|
645
|
+
$$renderer.push("<!--[2-->");
|
|
646
|
+
{
|
|
647
|
+
function icon($$renderer) {
|
|
648
|
+
IconAddons($$renderer, { size: 40 });
|
|
649
|
+
}
|
|
650
|
+
EmptyState($$renderer, {
|
|
651
|
+
icon,
|
|
652
|
+
children: ($$renderer) => {
|
|
653
|
+
$$renderer.push(`<p>No addons found in registry/addons/.</p>`);
|
|
654
|
+
}});
|
|
655
|
+
}
|
|
656
|
+
} else {
|
|
657
|
+
$$renderer.push("<!--[-1-->");
|
|
658
|
+
$$renderer.push(`<div class="addon-table svelte-87zh26"><div class="addon-table-header svelte-87zh26"><span class="addon-col addon-col--name svelte-87zh26">Addon</span> <span class="addon-col addon-col--status svelte-87zh26">Status</span> <span class="addon-col addon-col--actions svelte-87zh26"></span></div> <!--[-->`);
|
|
659
|
+
const each_array = ensure_array_like(addons);
|
|
660
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
661
|
+
let addon = each_array[$$index];
|
|
662
|
+
$$renderer.push(`<div class="addon-row svelte-87zh26"><span class="addon-col addon-col--name addon-name svelte-87zh26"${attr("title", addon.name)}>${escape_html(formatAddonName(addon.name))}</span> <span class="addon-col addon-col--status svelte-87zh26"><span${attr_class("badge", void 0, {
|
|
663
|
+
"badge-enabled": addon.enabled,
|
|
664
|
+
"badge-disabled": !addon.enabled
|
|
665
|
+
})}>${escape_html(addon.enabled ? "Enabled" : "Disabled")}</span></span> <span class="addon-col addon-col--actions svelte-87zh26">`);
|
|
666
|
+
if (addon.name === "voice" && addon.enabled) {
|
|
667
|
+
$$renderer.push("<!--[0-->");
|
|
668
|
+
$$renderer.push(`<button class="btn btn-sm btn-secondary" aria-label="Configure Voice addon settings">Configure</button>`);
|
|
669
|
+
} else {
|
|
670
|
+
$$renderer.push("<!--[-1-->");
|
|
671
|
+
$$renderer.push(`<button class="btn btn-sm btn-secondary"${attr("disabled", !addon.available, true)}>Credentials</button>`);
|
|
672
|
+
}
|
|
673
|
+
$$renderer.push(`<!--]--> <button${attr_class("btn btn-sm", void 0, {
|
|
674
|
+
"btn-danger": addon.enabled,
|
|
675
|
+
"btn-outline": !addon.enabled
|
|
676
|
+
})}${attr("disabled", actionLoading === addon.name || !addon.available, true)}>`);
|
|
677
|
+
if (actionLoading === addon.name) {
|
|
678
|
+
$$renderer.push("<!--[0-->");
|
|
679
|
+
Spinner($$renderer, {});
|
|
680
|
+
} else {
|
|
681
|
+
$$renderer.push("<!--[-1-->");
|
|
682
|
+
$$renderer.push(`${escape_html(addon.enabled ? "Disable" : "Enable")}`);
|
|
683
|
+
}
|
|
684
|
+
$$renderer.push(`<!--]--></button></span></div>`);
|
|
685
|
+
}
|
|
686
|
+
$$renderer.push(`<!--]--></div>`);
|
|
687
|
+
}
|
|
688
|
+
$$renderer.push(`<!--]--></div> `);
|
|
689
|
+
$$renderer.push("<!--[-1-->");
|
|
690
|
+
$$renderer.push(`<!--]--></div>`);
|
|
691
|
+
}
|
|
692
|
+
do {
|
|
693
|
+
$$settled = true;
|
|
694
|
+
$$inner_renderer = $$renderer.copy();
|
|
695
|
+
$$render_inner($$inner_renderer);
|
|
696
|
+
} while (!$$settled);
|
|
697
|
+
$$renderer.subsume($$inner_renderer);
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
//#endregion
|
|
701
|
+
//#region ../ui-kit/src/lib/components/common/Panel.svelte
|
|
702
|
+
function Panel($$renderer, $$props) {
|
|
703
|
+
/** Heading text rendered in the panel header. */
|
|
704
|
+
/** Action button(s) shown at the right of the header. */
|
|
705
|
+
/** Panel content below the header (typically a `.panel-body`). */
|
|
706
|
+
/** ARIA role for the panel container (e.g. "tabpanel"). */
|
|
707
|
+
let { title, actions, children, role } = $$props;
|
|
708
|
+
$$renderer.push(`<div class="panel"${attr("role", role)}><div class="panel-header"><h2>${escape_html(title)}</h2> `);
|
|
709
|
+
if (actions) {
|
|
710
|
+
$$renderer.push("<!--[0-->");
|
|
711
|
+
$$renderer.push(`<div class="panel-header-actions">`);
|
|
712
|
+
actions($$renderer);
|
|
713
|
+
$$renderer.push(`<!----></div>`);
|
|
714
|
+
} else $$renderer.push("<!--[-1-->");
|
|
715
|
+
$$renderer.push(`<!--]--></div> `);
|
|
716
|
+
children($$renderer);
|
|
717
|
+
$$renderer.push(`<!----></div>`);
|
|
718
|
+
}
|
|
719
|
+
//#endregion
|
|
720
|
+
//#region src/lib/components/admin/containers/container-format.ts
|
|
721
|
+
function parseImageTag(image) {
|
|
722
|
+
const atIdx = image.indexOf("@");
|
|
723
|
+
const base = atIdx > -1 ? image.slice(0, atIdx) : image;
|
|
724
|
+
const colonIdx = base.lastIndexOf(":");
|
|
725
|
+
if (colonIdx > -1) return {
|
|
726
|
+
name: base.slice(0, colonIdx),
|
|
727
|
+
tag: base.slice(colonIdx + 1)
|
|
728
|
+
};
|
|
729
|
+
return {
|
|
730
|
+
name: base,
|
|
731
|
+
tag: "latest"
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
function containerStatusColor(state) {
|
|
735
|
+
if (state === "running") return "success";
|
|
736
|
+
if (state === "exited" || state === "dead" || state === "stopped") return "danger";
|
|
737
|
+
if (state === "restarting" || state === "paused") return "warning";
|
|
738
|
+
return "idle";
|
|
739
|
+
}
|
|
740
|
+
function fmtState(s) {
|
|
741
|
+
if (!s) return s ?? "";
|
|
742
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
743
|
+
}
|
|
744
|
+
//#endregion
|
|
745
|
+
//#region ../ui-kit/src/lib/components/icons/IconExpand.svelte
|
|
746
|
+
function IconExpand($$renderer, $$props) {
|
|
747
|
+
let { size = 20, class: className = "" } = $$props;
|
|
748
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M5 9l7 7 7-7"></path></svg>`);
|
|
749
|
+
}
|
|
750
|
+
//#endregion
|
|
751
|
+
//#region src/lib/components/admin/containers/ContainerRow.svelte
|
|
752
|
+
function ContainerRow($$renderer, $$props) {
|
|
753
|
+
$$renderer.component(($$renderer) => {
|
|
754
|
+
let { entry, selected} = $$props;
|
|
755
|
+
let img = derived(() => entry.docker ? parseImageTag(entry.docker.Image) : null);
|
|
756
|
+
$$renderer.push(`<button class="container-table-row container-table-row--clickable svelte-1clpuus"${attr("aria-expanded", selected)}><span class="ct-col ct-col--name"><span${attr_class(`ct-indicator ct-indicator--${stringify(containerStatusColor(entry.state))}`, "svelte-1clpuus")}></span> <span class="ct-service-name svelte-1clpuus">${escape_html(entry.service)}</span></span> <span class="ct-col ct-col--image ct-mono svelte-1clpuus">`);
|
|
757
|
+
if (img()) {
|
|
758
|
+
$$renderer.push("<!--[0-->");
|
|
759
|
+
$$renderer.push(`${escape_html(img().name)}`);
|
|
760
|
+
} else {
|
|
761
|
+
$$renderer.push("<!--[-1-->");
|
|
762
|
+
$$renderer.push(`<span class="ct-not-created svelte-1clpuus">--</span>`);
|
|
763
|
+
}
|
|
764
|
+
$$renderer.push(`<!--]--></span> <span class="ct-col ct-col--tag">`);
|
|
765
|
+
if (img()) {
|
|
766
|
+
$$renderer.push("<!--[0-->");
|
|
767
|
+
$$renderer.push(`<span class="tag-badge">${escape_html(img().tag)}</span>`);
|
|
768
|
+
} else {
|
|
769
|
+
$$renderer.push("<!--[-1-->");
|
|
770
|
+
$$renderer.push(`<span class="ct-not-created svelte-1clpuus">--</span>`);
|
|
771
|
+
}
|
|
772
|
+
$$renderer.push(`<!--]--></span> <span class="ct-col ct-col--status"><span${attr_class(`badge badge-${stringify(containerStatusColor(entry.state))}`, "svelte-1clpuus")}>${escape_html(fmtState(entry.state))}</span></span> <span class="ct-col ct-col--actions">`);
|
|
773
|
+
IconExpand($$renderer, {
|
|
774
|
+
size: 14,
|
|
775
|
+
class: selected ? "ct-chevron-open" : ""
|
|
776
|
+
});
|
|
777
|
+
$$renderer.push(`<!----></span></button>`);
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
//#endregion
|
|
781
|
+
//#region src/lib/components/admin/containers/ContainerDetail.svelte
|
|
782
|
+
function ContainerDetail($$renderer, $$props) {
|
|
783
|
+
$$renderer.component(($$renderer) => {
|
|
784
|
+
let { entry, actionInFlight, confirmAction, feedback} = $$props;
|
|
785
|
+
let img = derived(() => entry.docker ? parseImageTag(entry.docker.Image) : null);
|
|
786
|
+
let isAnyActionInFlight = derived(() => actionInFlight !== null);
|
|
787
|
+
let isNotCreated = derived(() => !entry.docker);
|
|
788
|
+
$$renderer.push(`<div class="container-detail svelte-17lh9yz">`);
|
|
789
|
+
if (entry.docker) {
|
|
790
|
+
$$renderer.push("<!--[0-->");
|
|
791
|
+
const container = entry.docker;
|
|
792
|
+
$$renderer.push(`<div class="detail-grid svelte-17lh9yz"><div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Container ID</span> <span class="detail-value detail-mono svelte-17lh9yz">${escape_html(container.ID)}</span></div> <div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Name</span> <span class="detail-value detail-mono svelte-17lh9yz">${escape_html(container.Name || container.Names)}</span></div> <div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Image</span> <span class="detail-value detail-mono svelte-17lh9yz">${escape_html(container.Image)}</span></div> `);
|
|
793
|
+
if (img()) {
|
|
794
|
+
$$renderer.push("<!--[0-->");
|
|
795
|
+
$$renderer.push(`<div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Image Name</span> <span class="detail-value detail-mono svelte-17lh9yz">${escape_html(img().name)}</span></div> <div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Tag / Digest</span> <span class="detail-value svelte-17lh9yz"><span class="tag-badge tag-badge--lg">${escape_html(img().tag)}</span> `);
|
|
796
|
+
if (container.Image.includes("@")) {
|
|
797
|
+
$$renderer.push("<!--[0-->");
|
|
798
|
+
$$renderer.push(`<span class="detail-mono detail-digest svelte-17lh9yz">${escape_html(container.Image.split("@")[1]?.slice(0, 19))}...</span>`);
|
|
799
|
+
} else $$renderer.push("<!--[-1-->");
|
|
800
|
+
$$renderer.push(`<!--]--></span></div>`);
|
|
801
|
+
} else $$renderer.push("<!--[-1-->");
|
|
802
|
+
$$renderer.push(`<!--]--> <div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">State</span> <span class="detail-value svelte-17lh9yz"><span${attr_class(`badge badge-${stringify(containerStatusColor(container.State))}`, "svelte-17lh9yz")}>${escape_html(fmtState(container.State))}</span></span></div> <div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Status</span> <span class="detail-value svelte-17lh9yz">${escape_html(container.Status)}</span></div> `);
|
|
803
|
+
if (container.Health) {
|
|
804
|
+
$$renderer.push("<!--[0-->");
|
|
805
|
+
$$renderer.push(`<div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Health</span> <span class="detail-value svelte-17lh9yz"><span${attr_class("badge", void 0, {
|
|
806
|
+
"badge-success": container.Health === "healthy",
|
|
807
|
+
"badge-warning": container.Health === "starting",
|
|
808
|
+
"badge-danger": container.Health === "unhealthy",
|
|
809
|
+
"badge-idle": ![
|
|
810
|
+
"healthy",
|
|
811
|
+
"starting",
|
|
812
|
+
"unhealthy"
|
|
813
|
+
].includes(container.Health)
|
|
814
|
+
})}>${escape_html(container.Health)}</span></span></div>`);
|
|
815
|
+
} else $$renderer.push("<!--[-1-->");
|
|
816
|
+
$$renderer.push(`<!--]--> `);
|
|
817
|
+
if (container.Ports) {
|
|
818
|
+
$$renderer.push("<!--[0-->");
|
|
819
|
+
$$renderer.push(`<div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Ports</span> <span class="detail-value detail-mono svelte-17lh9yz">${escape_html(container.Ports)}</span></div>`);
|
|
820
|
+
} else $$renderer.push("<!--[-1-->");
|
|
821
|
+
$$renderer.push(`<!--]--> `);
|
|
822
|
+
if (container.RunningFor) {
|
|
823
|
+
$$renderer.push("<!--[0-->");
|
|
824
|
+
$$renderer.push(`<div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Uptime</span> <span class="detail-value svelte-17lh9yz">${escape_html(container.RunningFor)}</span></div>`);
|
|
825
|
+
} else $$renderer.push("<!--[-1-->");
|
|
826
|
+
$$renderer.push(`<!--]--> `);
|
|
827
|
+
if (container.CreatedAt) {
|
|
828
|
+
$$renderer.push("<!--[0-->");
|
|
829
|
+
$$renderer.push(`<div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Created</span> <span class="detail-value svelte-17lh9yz">${escape_html(container.CreatedAt)}</span></div>`);
|
|
830
|
+
} else $$renderer.push("<!--[-1-->");
|
|
831
|
+
$$renderer.push(`<!--]--> `);
|
|
832
|
+
if (container.Project) {
|
|
833
|
+
$$renderer.push("<!--[0-->");
|
|
834
|
+
$$renderer.push(`<div class="detail-item svelte-17lh9yz"><span class="detail-label svelte-17lh9yz">Project</span> <span class="detail-value detail-mono svelte-17lh9yz">${escape_html(container.Project)}</span></div>`);
|
|
835
|
+
} else $$renderer.push("<!--[-1-->");
|
|
836
|
+
$$renderer.push(`<!--]--></div>`);
|
|
837
|
+
} else {
|
|
838
|
+
$$renderer.push("<!--[-1-->");
|
|
839
|
+
$$renderer.push(`<div class="detail-not-created svelte-17lh9yz"><p class="svelte-17lh9yz">Container has not been created yet. Use <strong>Start</strong> to create and start it.</p></div>`);
|
|
840
|
+
}
|
|
841
|
+
$$renderer.push(`<!--]--> `);
|
|
842
|
+
if (feedback) {
|
|
843
|
+
$$renderer.push("<!--[0-->");
|
|
844
|
+
$$renderer.push(`<div${attr_class(`action-feedback action-feedback--${stringify(feedback.type)}`, "svelte-17lh9yz")} role="status">${escape_html(feedback.message)}</div>`);
|
|
845
|
+
} else $$renderer.push("<!--[-1-->");
|
|
846
|
+
$$renderer.push(`<!--]--> `);
|
|
847
|
+
if (confirmAction) {
|
|
848
|
+
$$renderer.push("<!--[0-->");
|
|
849
|
+
$$renderer.push(`<div class="confirm-bar svelte-17lh9yz" role="alert"><span class="confirm-text svelte-17lh9yz">${escape_html(confirmAction.charAt(0).toUpperCase() + confirmAction.slice(1))} <strong>${escape_html(entry.service)}</strong>?</span> <div class="confirm-actions svelte-17lh9yz"><button class="btn btn-danger btn-sm">Confirm</button> <button class="btn btn-secondary btn-sm">Cancel</button></div></div>`);
|
|
850
|
+
} else {
|
|
851
|
+
$$renderer.push("<!--[-1-->");
|
|
852
|
+
$$renderer.push(`<div class="detail-actions svelte-17lh9yz">`);
|
|
853
|
+
if (isNotCreated()) {
|
|
854
|
+
$$renderer.push("<!--[0-->");
|
|
855
|
+
$$renderer.push(`<button class="btn btn-primary btn-sm"${attr("disabled", isAnyActionInFlight(), true)}>`);
|
|
856
|
+
if (actionInFlight === "start") {
|
|
857
|
+
$$renderer.push("<!--[0-->");
|
|
858
|
+
Spinner($$renderer, { size: 12 });
|
|
859
|
+
} else $$renderer.push("<!--[-1-->");
|
|
860
|
+
$$renderer.push(`<!--]--> Start</button>`);
|
|
861
|
+
} else {
|
|
862
|
+
$$renderer.push("<!--[-1-->");
|
|
863
|
+
$$renderer.push(`<button class="btn btn-secondary btn-sm"${attr("disabled", isAnyActionInFlight(), true)}>`);
|
|
864
|
+
if (actionInFlight === "start") {
|
|
865
|
+
$$renderer.push("<!--[0-->");
|
|
866
|
+
Spinner($$renderer, { size: 12 });
|
|
867
|
+
} else $$renderer.push("<!--[-1-->");
|
|
868
|
+
$$renderer.push(`<!--]--> Start</button> <button class="btn btn-danger btn-sm"${attr("disabled", isAnyActionInFlight(), true)}>`);
|
|
869
|
+
if (actionInFlight === "stop") {
|
|
870
|
+
$$renderer.push("<!--[0-->");
|
|
871
|
+
Spinner($$renderer, { size: 12 });
|
|
872
|
+
} else $$renderer.push("<!--[-1-->");
|
|
873
|
+
$$renderer.push(`<!--]--> Stop</button> <button class="btn btn-secondary btn-sm"${attr("disabled", isAnyActionInFlight(), true)}>`);
|
|
874
|
+
if (actionInFlight === "restart") {
|
|
875
|
+
$$renderer.push("<!--[0-->");
|
|
876
|
+
Spinner($$renderer, { size: 12 });
|
|
877
|
+
} else $$renderer.push("<!--[-1-->");
|
|
878
|
+
$$renderer.push(`<!--]--> Restart</button>`);
|
|
879
|
+
}
|
|
880
|
+
$$renderer.push(`<!--]--></div>`);
|
|
881
|
+
}
|
|
882
|
+
$$renderer.push(`<!--]--></div>`);
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
//#endregion
|
|
886
|
+
//#region src/lib/components/admin/containers/ContainersEmptyState.svelte
|
|
887
|
+
function ContainersEmptyState($$renderer, $$props) {
|
|
888
|
+
$$renderer.component(($$renderer) => {
|
|
889
|
+
let { loading, error, containerData} = $$props;
|
|
890
|
+
$$renderer.push(`<div class="empty-state svelte-llpoy7">`);
|
|
891
|
+
IconServer($$renderer, { size: 40 });
|
|
892
|
+
$$renderer.push(`<!----> `);
|
|
893
|
+
if (loading) {
|
|
894
|
+
$$renderer.push("<!--[0-->");
|
|
895
|
+
$$renderer.push(`<p>Loading container status...</p>`);
|
|
896
|
+
} else if (error) {
|
|
897
|
+
$$renderer.push("<!--[1-->");
|
|
898
|
+
$$renderer.push(`<p class="text-danger svelte-llpoy7">${escape_html(error)}</p> <button class="btn btn-secondary btn-sm svelte-llpoy7">Try Again</button>`);
|
|
899
|
+
} else if (containerData && !containerData.dockerAvailable) {
|
|
900
|
+
$$renderer.push("<!--[2-->");
|
|
901
|
+
$$renderer.push(`<p>Docker is not available on this host.</p> <p class="hint svelte-llpoy7">Ensure Docker is running and the admin service has access to the Docker socket.</p>`);
|
|
902
|
+
} else {
|
|
903
|
+
$$renderer.push("<!--[-1-->");
|
|
904
|
+
$$renderer.push(`<p>No containers found. Services may not be installed yet.</p>`);
|
|
905
|
+
}
|
|
906
|
+
$$renderer.push(`<!--]--></div>`);
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
//#endregion
|
|
910
|
+
//#region src/lib/components/admin/containers/ContainersTab.svelte
|
|
911
|
+
function ContainersTab($$renderer, $$props) {
|
|
912
|
+
$$renderer.component(($$renderer) => {
|
|
913
|
+
let { containerData, serviceEntries, loading, error, selectedContainerId, lastUpdated, pullLoading } = $$props;
|
|
914
|
+
let hasEntries = derived(() => serviceEntries.length > 0);
|
|
915
|
+
let rowState = {};
|
|
916
|
+
{
|
|
917
|
+
function actions($$renderer) {
|
|
918
|
+
if (lastUpdated) {
|
|
919
|
+
$$renderer.push("<!--[0-->");
|
|
920
|
+
$$renderer.push(`<span class="last-updated svelte-fnc5b8">Updated ${escape_html(lastUpdated)}</span>`);
|
|
921
|
+
} else $$renderer.push("<!--[-1-->");
|
|
922
|
+
$$renderer.push(`<!--]--> <button class="btn btn-secondary btn-sm"${attr("disabled", pullLoading, true)}>`);
|
|
923
|
+
if (pullLoading) {
|
|
924
|
+
$$renderer.push("<!--[0-->");
|
|
925
|
+
Spinner($$renderer, {});
|
|
926
|
+
} else $$renderer.push("<!--[-1-->");
|
|
927
|
+
$$renderer.push(`<!--]--> Pull Images</button> <button class="btn btn-secondary btn-sm"${attr("disabled", loading, true)}>`);
|
|
928
|
+
if (loading) {
|
|
929
|
+
$$renderer.push("<!--[0-->");
|
|
930
|
+
Spinner($$renderer, {});
|
|
931
|
+
} else $$renderer.push("<!--[-1-->");
|
|
932
|
+
$$renderer.push(`<!--]--> Refresh</button>`);
|
|
933
|
+
}
|
|
934
|
+
Panel($$renderer, {
|
|
935
|
+
title: "Container Status",
|
|
936
|
+
role: "tabpanel",
|
|
937
|
+
actions,
|
|
938
|
+
children: ($$renderer) => {
|
|
939
|
+
$$renderer.push(`<div class="panel-body panel-body--flush">`);
|
|
940
|
+
if (hasEntries()) {
|
|
941
|
+
$$renderer.push("<!--[0-->");
|
|
942
|
+
$$renderer.push(`<div class="container-table svelte-fnc5b8"><div class="container-table-header svelte-fnc5b8"><span class="ct-col ct-col--name">Container</span> <span class="ct-col ct-col--image">Image</span> <span class="ct-col ct-col--tag">Tag</span> <span class="ct-col ct-col--status">Status</span> <span class="ct-col ct-col--actions"></span></div> <!--[-->`);
|
|
943
|
+
const each_array = ensure_array_like(serviceEntries);
|
|
944
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
945
|
+
let entry = each_array[$$index];
|
|
946
|
+
const selected = selectedContainerId === entry.id;
|
|
947
|
+
ContainerRow($$renderer, {
|
|
948
|
+
entry,
|
|
949
|
+
selected});
|
|
950
|
+
$$renderer.push(`<!----> `);
|
|
951
|
+
if (selected) {
|
|
952
|
+
$$renderer.push("<!--[0-->");
|
|
953
|
+
ContainerDetail($$renderer, {
|
|
954
|
+
entry,
|
|
955
|
+
actionInFlight: rowState[entry.id]?.inFlight ?? null,
|
|
956
|
+
confirmAction: rowState[entry.id]?.confirm ?? null,
|
|
957
|
+
feedback: rowState[entry.id]?.feedback ?? null});
|
|
958
|
+
} else $$renderer.push("<!--[-1-->");
|
|
959
|
+
$$renderer.push(`<!--]-->`);
|
|
960
|
+
}
|
|
961
|
+
$$renderer.push(`<!--]--></div>`);
|
|
962
|
+
} else {
|
|
963
|
+
$$renderer.push("<!--[-1-->");
|
|
964
|
+
ContainersEmptyState($$renderer, {
|
|
965
|
+
loading,
|
|
966
|
+
error,
|
|
967
|
+
containerData});
|
|
968
|
+
}
|
|
969
|
+
$$renderer.push(`<!--]--></div>`);
|
|
970
|
+
}});
|
|
971
|
+
}
|
|
972
|
+
});
|
|
973
|
+
}
|
|
974
|
+
//#endregion
|
|
975
|
+
//#region src/lib/components/admin/automations/task-form.ts
|
|
976
|
+
/**
|
|
977
|
+
* Schedule presets and YAML round-trip helpers for the task drawer form.
|
|
978
|
+
*
|
|
979
|
+
* Round-trip contract: unknown YAML keys in a task file are preserved because
|
|
980
|
+
* we parse the full YAML document, update only known fields, and re-stringify
|
|
981
|
+
* the entire document (including unknown keys).
|
|
982
|
+
*/
|
|
983
|
+
var SCHEDULE_PRESETS = [
|
|
984
|
+
{
|
|
985
|
+
id: "every-15-minutes",
|
|
986
|
+
label: "Every 15 minutes",
|
|
987
|
+
cron: "*/15 * * * *"
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
id: "every-hour",
|
|
991
|
+
label: "Every hour",
|
|
992
|
+
cron: "0 * * * *"
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
id: "daily",
|
|
996
|
+
label: "Daily at…",
|
|
997
|
+
cron: null
|
|
998
|
+
},
|
|
999
|
+
{
|
|
1000
|
+
id: "weekly",
|
|
1001
|
+
label: "Weekly on…",
|
|
1002
|
+
cron: null
|
|
1003
|
+
},
|
|
1004
|
+
{
|
|
1005
|
+
id: "monthly",
|
|
1006
|
+
label: "Monthly on day…",
|
|
1007
|
+
cron: null
|
|
1008
|
+
},
|
|
1009
|
+
{
|
|
1010
|
+
id: "advanced",
|
|
1011
|
+
label: "Advanced (cron)",
|
|
1012
|
+
cron: null
|
|
1013
|
+
}
|
|
1014
|
+
];
|
|
1015
|
+
/** Map a cron expression to the best-matching preset id, or 'advanced'. */
|
|
1016
|
+
function cronToPresetId(cron) {
|
|
1017
|
+
const trimmed = cron.trim();
|
|
1018
|
+
if (trimmed === "*/15 * * * *") return "every-15-minutes";
|
|
1019
|
+
if (trimmed === "0 * * * *") return "every-hour";
|
|
1020
|
+
if (/^0 \d{1,2} \* \* \*$/.test(trimmed)) return "daily";
|
|
1021
|
+
if (/^0 \d{1,2} \* \* [0-6]$/.test(trimmed)) return "weekly";
|
|
1022
|
+
if (/^0 \d{1,2} ([1-9]|[12]\d|3[01]) \* \*$/.test(trimmed)) return "monthly";
|
|
1023
|
+
return "advanced";
|
|
1024
|
+
}
|
|
1025
|
+
var DOW_LABELS = [
|
|
1026
|
+
"Sunday",
|
|
1027
|
+
"Monday",
|
|
1028
|
+
"Tuesday",
|
|
1029
|
+
"Wednesday",
|
|
1030
|
+
"Thursday",
|
|
1031
|
+
"Friday",
|
|
1032
|
+
"Saturday"
|
|
1033
|
+
];
|
|
1034
|
+
/** Human-readable summary of the resolved cron expression. */
|
|
1035
|
+
function describeCron(presetId, hour, dow, dom, rawCron) {
|
|
1036
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
1037
|
+
const timeStr = `${pad(hour)}:00`;
|
|
1038
|
+
switch (presetId) {
|
|
1039
|
+
case "every-15-minutes": return "Runs every 15 minutes";
|
|
1040
|
+
case "every-hour": return "Runs at the start of every hour";
|
|
1041
|
+
case "daily": return `Runs daily at ${timeStr}`;
|
|
1042
|
+
case "weekly": return `Runs every ${DOW_LABELS[dow] ?? "Sunday"} at ${timeStr}`;
|
|
1043
|
+
case "monthly": return `Runs on day ${dom} of every month at ${timeStr}`;
|
|
1044
|
+
case "advanced": {
|
|
1045
|
+
if (!rawCron.trim()) return "Enter a valid cron expression";
|
|
1046
|
+
const err = validateCron(rawCron);
|
|
1047
|
+
return err ? err : `Runs on schedule: ${rawCron.trim()}`;
|
|
1048
|
+
}
|
|
1049
|
+
default: return "";
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
/** Returns an error message or null if valid. */
|
|
1053
|
+
function validateCron(cron) {
|
|
1054
|
+
const parts = cron.trim().split(/\s+/);
|
|
1055
|
+
if (parts.length !== 5) return "Must have exactly 5 fields: minute hour day month weekday";
|
|
1056
|
+
const ranges = [
|
|
1057
|
+
[0, 59],
|
|
1058
|
+
[0, 23],
|
|
1059
|
+
[1, 31],
|
|
1060
|
+
[1, 12],
|
|
1061
|
+
[0, 7]
|
|
1062
|
+
];
|
|
1063
|
+
for (const [i, field] of parts.entries()) {
|
|
1064
|
+
if (field === "*" || /^\*\/\d+$/.test(field)) continue;
|
|
1065
|
+
const n = parseInt(field, 10);
|
|
1066
|
+
if (Number.isNaN(n)) return `Field ${i + 1} is not a valid number or wildcard`;
|
|
1067
|
+
const [min, max] = ranges[i];
|
|
1068
|
+
if (n < min || n > max) return `Field ${i + 1} must be ${min}–${max}`;
|
|
1069
|
+
}
|
|
1070
|
+
return null;
|
|
1071
|
+
}
|
|
1072
|
+
/** Returns an error message or null if valid. */
|
|
1073
|
+
function validateTaskFilename(name) {
|
|
1074
|
+
if (!name.trim()) return "File name is required";
|
|
1075
|
+
if (!/^[a-z0-9][a-z0-9_-]*\.(yml|yaml|md)$/.test(name.trim())) return "Use lowercase letters, digits, hyphens, and underscores. Must end in .yml, .yaml, or .md";
|
|
1076
|
+
return null;
|
|
1077
|
+
}
|
|
1078
|
+
//#endregion
|
|
1079
|
+
//#region src/lib/components/admin/automations/TaskDrawer.svelte
|
|
1080
|
+
function TaskDrawer($$renderer, $$props) {
|
|
1081
|
+
$$renderer.component(($$renderer) => {
|
|
1082
|
+
/** null = new task; non-null = editing existing */
|
|
1083
|
+
let { open, draft, saving, saveError, onClose} = $$props;
|
|
1084
|
+
let isNew = derived(() => draft !== null && draft.fileName === "");
|
|
1085
|
+
let newFileName = "";
|
|
1086
|
+
let description = "";
|
|
1087
|
+
let enabled = false;
|
|
1088
|
+
let commandShell = "echo hello";
|
|
1089
|
+
let presetId = "daily";
|
|
1090
|
+
let hour = 9;
|
|
1091
|
+
let dow = 1;
|
|
1092
|
+
let dom = 1;
|
|
1093
|
+
let rawCron = "0 9 * * *";
|
|
1094
|
+
let advancedOpen = false;
|
|
1095
|
+
let fileNameError = derived(() => isNew() ? validateTaskFilename(newFileName) : null);
|
|
1096
|
+
let cronError = derived(() => presetId === "advanced" ? validateCron(rawCron) : null);
|
|
1097
|
+
let cronSummary = derived(() => describeCron(presetId, hour, dow, dom, rawCron));
|
|
1098
|
+
let canSave = derived(() => !saving && (isNew() ? fileNameError() === null && newFileName.trim() !== "" : true) && cronError() === null);
|
|
1099
|
+
function onPresetChange(e) {
|
|
1100
|
+
const val = e.currentTarget.value;
|
|
1101
|
+
presetId = val;
|
|
1102
|
+
advancedOpen = val === "advanced";
|
|
1103
|
+
}
|
|
1104
|
+
{
|
|
1105
|
+
function footer($$renderer) {
|
|
1106
|
+
$$renderer.push(`<button class="btn btn-secondary"${attr("disabled", saving, true)}>Cancel</button> <button class="btn btn-primary"${attr("disabled", !canSave(), true)}>`);
|
|
1107
|
+
if (saving) {
|
|
1108
|
+
$$renderer.push("<!--[0-->");
|
|
1109
|
+
Spinner($$renderer, {});
|
|
1110
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1111
|
+
$$renderer.push(`<!--]--> ${escape_html(isNew() ? "Create" : "Save")}</button>`);
|
|
1112
|
+
}
|
|
1113
|
+
Drawer($$renderer, {
|
|
1114
|
+
open,
|
|
1115
|
+
title: isNew() ? "New automation" : `Edit — ${draft?.fileName ?? ""}`,
|
|
1116
|
+
onClose,
|
|
1117
|
+
width: "36rem",
|
|
1118
|
+
footer,
|
|
1119
|
+
children: ($$renderer) => {
|
|
1120
|
+
if (draft !== null) {
|
|
1121
|
+
$$renderer.push("<!--[0-->");
|
|
1122
|
+
$$renderer.push(`<form class="task-form svelte-m3wayn">`);
|
|
1123
|
+
if (isNew()) {
|
|
1124
|
+
$$renderer.push("<!--[0-->");
|
|
1125
|
+
$$renderer.push(`<div${attr_class("field-group svelte-m3wayn", void 0, { "field-group--error": fileNameError() !== null && false })}><label class="field-label svelte-m3wayn" for="tf-filename">File name</label> <input id="tf-filename" class="field-input svelte-m3wayn" type="text" placeholder="my-task.yml" autocomplete="off" spellcheck="false"${attr("value", newFileName)}${attr("disabled", saving, true)}/> `);
|
|
1126
|
+
if (fileNameError() && false);
|
|
1127
|
+
else {
|
|
1128
|
+
$$renderer.push("<!--[-1-->");
|
|
1129
|
+
$$renderer.push(`<span class="field-hint svelte-m3wayn">Lowercase letters, digits, hyphens. Must end in .yml, .yaml, or .md</span>`);
|
|
1130
|
+
}
|
|
1131
|
+
$$renderer.push(`<!--]--></div>`);
|
|
1132
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1133
|
+
$$renderer.push(`<!--]--> <div class="field-group svelte-m3wayn"><label class="field-label svelte-m3wayn" for="tf-desc">Description</label> <input id="tf-desc" class="field-input svelte-m3wayn" type="text" placeholder="What does this task do?"${attr("value", description)}${attr("disabled", saving, true)}/></div> <label class="toggle-row svelte-m3wayn"><input type="checkbox"${attr("checked", enabled, true)}${attr("disabled", saving, true)} class="svelte-m3wayn"/> <span class="toggle-label svelte-m3wayn">Enabled</span> <span class="toggle-hint svelte-m3wayn">Disabled tasks are saved but not registered with cron</span></label> <fieldset class="schedule-fieldset svelte-m3wayn"${attr("disabled", saving, true)}><legend class="field-label svelte-m3wayn">Schedule</legend> <div class="schedule-row svelte-m3wayn">`);
|
|
1134
|
+
$$renderer.select({
|
|
1135
|
+
class: "field-select",
|
|
1136
|
+
value: presetId,
|
|
1137
|
+
onchange: onPresetChange
|
|
1138
|
+
}, ($$renderer) => {
|
|
1139
|
+
$$renderer.push(`<!--[-->`);
|
|
1140
|
+
const each_array = ensure_array_like(SCHEDULE_PRESETS);
|
|
1141
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
1142
|
+
let p = each_array[$$index];
|
|
1143
|
+
$$renderer.option({ value: p.id }, ($$renderer) => {
|
|
1144
|
+
$$renderer.push(`${escape_html(p.label)}`);
|
|
1145
|
+
});
|
|
1146
|
+
}
|
|
1147
|
+
$$renderer.push(`<!--]-->`);
|
|
1148
|
+
}, "svelte-m3wayn");
|
|
1149
|
+
$$renderer.push(` `);
|
|
1150
|
+
if (presetId === "daily" || presetId === "weekly" || presetId === "monthly") {
|
|
1151
|
+
$$renderer.push("<!--[0-->");
|
|
1152
|
+
$$renderer.push(`<div class="schedule-params svelte-m3wayn">`);
|
|
1153
|
+
if (presetId === "weekly") {
|
|
1154
|
+
$$renderer.push("<!--[0-->");
|
|
1155
|
+
$$renderer.push(`<label class="param-label svelte-m3wayn" for="tf-dow">Day</label> `);
|
|
1156
|
+
$$renderer.select({
|
|
1157
|
+
id: "tf-dow",
|
|
1158
|
+
class: "field-select field-select--narrow",
|
|
1159
|
+
value: dow
|
|
1160
|
+
}, ($$renderer) => {
|
|
1161
|
+
$$renderer.push(`<!--[-->`);
|
|
1162
|
+
const each_array_1 = ensure_array_like(DOW_LABELS);
|
|
1163
|
+
for (let i = 0, $$length = each_array_1.length; i < $$length; i++) {
|
|
1164
|
+
let label = each_array_1[i];
|
|
1165
|
+
$$renderer.option({ value: i }, ($$renderer) => {
|
|
1166
|
+
$$renderer.push(`${escape_html(label)}`);
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
$$renderer.push(`<!--]-->`);
|
|
1170
|
+
}, "svelte-m3wayn");
|
|
1171
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1172
|
+
$$renderer.push(`<!--]--> `);
|
|
1173
|
+
if (presetId === "monthly") {
|
|
1174
|
+
$$renderer.push("<!--[0-->");
|
|
1175
|
+
$$renderer.push(`<label class="param-label svelte-m3wayn" for="tf-dom">Day of month</label> <input id="tf-dom" class="field-input field-input--narrow svelte-m3wayn" type="number" min="1" max="31"${attr("value", dom)}/>`);
|
|
1176
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1177
|
+
$$renderer.push(`<!--]--> <label class="param-label svelte-m3wayn" for="tf-hour">Hour (0–23)</label> <input id="tf-hour" class="field-input field-input--narrow svelte-m3wayn" type="number" min="0" max="23"${attr("value", hour)}/></div>`);
|
|
1178
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1179
|
+
$$renderer.push(`<!--]--></div> <p${attr_class("schedule-summary svelte-m3wayn", void 0, { "schedule-summary--error": cronError() !== null })}>${escape_html(cronSummary())}</p> <details${attr("open", advancedOpen, true)} class="advanced-details svelte-m3wayn"><summary class="advanced-summary svelte-m3wayn">Advanced (raw cron)</summary> <div class="advanced-body svelte-m3wayn"><label class="field-label svelte-m3wayn" for="tf-rawcron">Cron expression</label> <input id="tf-rawcron"${attr_class("field-input field-mono svelte-m3wayn", void 0, { "field-input--error": cronError() !== null })} type="text" placeholder="* * * * *" spellcheck="false"${attr("value", rawCron)}${attr("disabled", saving, true)}/> `);
|
|
1180
|
+
if (cronError()) {
|
|
1181
|
+
$$renderer.push("<!--[0-->");
|
|
1182
|
+
$$renderer.push(`<span class="field-error svelte-m3wayn" role="alert">${escape_html(cronError())}</span>`);
|
|
1183
|
+
} else {
|
|
1184
|
+
$$renderer.push("<!--[-1-->");
|
|
1185
|
+
$$renderer.push(`<span class="field-hint svelte-m3wayn">5 fields: minute hour day-of-month month day-of-week</span>`);
|
|
1186
|
+
}
|
|
1187
|
+
$$renderer.push(`<!--]--></div></details></fieldset> <fieldset class="field-group svelte-m3wayn"${attr("disabled", saving, true)}><legend class="field-label svelte-m3wayn">Action type</legend> <div class="radio-row svelte-m3wayn"><label class="radio-label svelte-m3wayn"><input type="radio" name="tf-kind" value="command"${attr("checked", true, true)}/> Shell command</label> <label class="radio-label svelte-m3wayn"><input type="radio" name="tf-kind" value="prompt"${attr("checked", false, true)}/> Assistant prompt</label> <label class="radio-label svelte-m3wayn"><input type="radio" name="tf-kind" value="workflow"${attr("checked", false, true)}/> Workflow</label></div> `);
|
|
1188
|
+
$$renderer.push("<!--[0-->");
|
|
1189
|
+
$$renderer.push(`<div class="field-group svelte-m3wayn" style="margin-top: var(--s-sp-3)"><label class="field-label svelte-m3wayn" for="tf-cmd">Shell command</label> <input id="tf-cmd" class="field-input field-mono svelte-m3wayn" type="text" placeholder="echo hello" spellcheck="false"${attr("value", commandShell)}/> <span class="field-hint svelte-m3wayn">Runs as: <code class="svelte-m3wayn">sh -c "<command>"</code></span></div>`);
|
|
1190
|
+
$$renderer.push(`<!--]--></fieldset> `);
|
|
1191
|
+
if (Object.keys(draft.unknownKeys).length > 0) {
|
|
1192
|
+
$$renderer.push("<!--[0-->");
|
|
1193
|
+
$$renderer.push(`<p class="unknown-keys-notice svelte-m3wayn">This task file contains additional fields
|
|
1194
|
+
(<code class="svelte-m3wayn">${escape_html(Object.keys(draft.unknownKeys).join(", "))}</code>)
|
|
1195
|
+
that are not editable here but will be preserved when saved.</p>`);
|
|
1196
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1197
|
+
$$renderer.push(`<!--]--> `);
|
|
1198
|
+
if (saveError) {
|
|
1199
|
+
$$renderer.push("<!--[0-->");
|
|
1200
|
+
$$renderer.push(`<p class="save-error svelte-m3wayn" role="alert">${escape_html(saveError)}</p>`);
|
|
1201
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1202
|
+
$$renderer.push(`<!--]--></form>`);
|
|
1203
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1204
|
+
$$renderer.push(`<!--]-->`);
|
|
1205
|
+
}});
|
|
1206
|
+
}
|
|
1207
|
+
});
|
|
1208
|
+
}
|
|
1209
|
+
//#endregion
|
|
1210
|
+
//#region src/lib/components/admin/automations/AutomationsTab.svelte
|
|
1211
|
+
function AutomationsTab($$renderer, $$props) {
|
|
1212
|
+
$$renderer.component(($$renderer) => {
|
|
1213
|
+
let { data, loading, error} = $$props;
|
|
1214
|
+
let hasAutomations = derived(() => data !== null && Array.isArray(data.automations) && data.automations.length > 0);
|
|
1215
|
+
let drawerOpen = false;
|
|
1216
|
+
let drawerDraft = null;
|
|
1217
|
+
let drawerSaving = false;
|
|
1218
|
+
let drawerError = "";
|
|
1219
|
+
let runningTaskName = "";
|
|
1220
|
+
let logDrawerOpen = false;
|
|
1221
|
+
let logTaskName = "";
|
|
1222
|
+
let logLines = [];
|
|
1223
|
+
let logLoading = false;
|
|
1224
|
+
let logError = "";
|
|
1225
|
+
function closeDrawer() {
|
|
1226
|
+
drawerOpen = false;
|
|
1227
|
+
drawerDraft = null;
|
|
1228
|
+
drawerError = "";
|
|
1229
|
+
}
|
|
1230
|
+
function closeLogDrawer() {
|
|
1231
|
+
logDrawerOpen = false;
|
|
1232
|
+
logTaskName = "";
|
|
1233
|
+
logLines = [];
|
|
1234
|
+
logLoading = false;
|
|
1235
|
+
logError = "";
|
|
1236
|
+
}
|
|
1237
|
+
/** Map a cron expression to a friendly display string. */
|
|
1238
|
+
function formatSchedule(cron) {
|
|
1239
|
+
switch (cronToPresetId(cron)) {
|
|
1240
|
+
case "every-15-minutes": return "Every 15 minutes";
|
|
1241
|
+
case "every-hour": return "Every hour";
|
|
1242
|
+
case "daily": {
|
|
1243
|
+
const h = parseInt(cron.split(" ")[1] ?? "0", 10);
|
|
1244
|
+
return `Daily at ${String(h).padStart(2, "0")}:00`;
|
|
1245
|
+
}
|
|
1246
|
+
case "weekly": {
|
|
1247
|
+
const parts = cron.split(" ");
|
|
1248
|
+
const h = parseInt(parts[1] ?? "0", 10);
|
|
1249
|
+
return `Weekly (${[
|
|
1250
|
+
"Sun",
|
|
1251
|
+
"Mon",
|
|
1252
|
+
"Tue",
|
|
1253
|
+
"Wed",
|
|
1254
|
+
"Thu",
|
|
1255
|
+
"Fri",
|
|
1256
|
+
"Sat"
|
|
1257
|
+
][parseInt(parts[4] ?? "0", 10)] ?? "Sun"}) at ${String(h).padStart(2, "0")}:00`;
|
|
1258
|
+
}
|
|
1259
|
+
case "monthly": {
|
|
1260
|
+
const parts = cron.split(" ");
|
|
1261
|
+
const h = parseInt(parts[1] ?? "0", 10);
|
|
1262
|
+
return `Monthly (day ${parseInt(parts[2] ?? "1", 10)}) at ${String(h).padStart(2, "0")}:00`;
|
|
1263
|
+
}
|
|
1264
|
+
default: return cron;
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
function describeAction(automation) {
|
|
1268
|
+
switch (automation.action.type) {
|
|
1269
|
+
case "assistant": return automation.action.content?.trim() ? "Assistant prompt" : "Assistant task";
|
|
1270
|
+
case "shell": return automation.action.content?.trim() ? automation.action.content.trim() : "Shell command";
|
|
1271
|
+
case "api": return automation.action.path ? `${automation.action.method ?? "Call"} ${automation.action.path}` : "API request";
|
|
1272
|
+
case "http": return automation.action.url ? `${automation.action.method ?? "Request"} ${automation.action.url}` : "HTTP request";
|
|
1273
|
+
case "workflow": return "Workflow";
|
|
1274
|
+
default: return automation.action.type;
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="ph svelte-1xltcby"><div><h2 class="ph-title svelte-1xltcby">Routines</h2> <p class="ph-sub svelte-1xltcby">Scheduled tasks from knowledge/tasks/</p></div> <div class="ph-actions svelte-1xltcby"><button class="btn btn-primary btn-outline btn-sm"${attr("disabled", drawerSaving, true)}>New task</button> <button class="btn btn-primary btn-outline btn-sm"${attr("disabled", loading, true)}>`);
|
|
1278
|
+
if (loading) {
|
|
1279
|
+
$$renderer.push("<!--[0-->");
|
|
1280
|
+
Spinner($$renderer, {});
|
|
1281
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1282
|
+
$$renderer.push(`<!--]--> Refresh</button></div></div> <div class="panel-body">`);
|
|
1283
|
+
$$renderer.push("<!--[-1-->");
|
|
1284
|
+
$$renderer.push(`<!--]--> `);
|
|
1285
|
+
if (hasAutomations() && data) {
|
|
1286
|
+
$$renderer.push("<!--[0-->");
|
|
1287
|
+
$$renderer.push(`<div class="automation-list svelte-1xltcby"><!--[-->`);
|
|
1288
|
+
const each_array = ensure_array_like(data.automations);
|
|
1289
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
1290
|
+
let automation = each_array[$$index];
|
|
1291
|
+
$$renderer.push(`<div class="automation-card svelte-1xltcby"><div class="automation-row svelte-1xltcby"><div class="automation-main svelte-1xltcby"><div class="automation-name svelte-1xltcby">${escape_html(automation.name)} <span${attr_class("badge svelte-1xltcby", void 0, {
|
|
1292
|
+
"badge-enabled": automation.enabled,
|
|
1293
|
+
"badge-disabled": !automation.enabled
|
|
1294
|
+
})}>${escape_html(automation.enabled ? "Enabled" : "Disabled")}</span> <span class="badge badge-type svelte-1xltcby">${escape_html(automation.action.type)}</span></div> `);
|
|
1295
|
+
if (automation.description) {
|
|
1296
|
+
$$renderer.push("<!--[0-->");
|
|
1297
|
+
$$renderer.push(`<div class="automation-desc svelte-1xltcby">${escape_html(automation.description)}</div>`);
|
|
1298
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1299
|
+
$$renderer.push(`<!--]--></div> <div class="automation-meta svelte-1xltcby"><span class="meta-item svelte-1xltcby">${escape_html(formatSchedule(automation.schedule))}</span> <span class="meta-item meta-item-action svelte-1xltcby">${escape_html(describeAction(automation))}</span></div></div> <div class="automation-footer svelte-1xltcby"><span class="automation-file svelte-1xltcby">${escape_html(automation.fileName)}</span> <div class="automation-actions svelte-1xltcby"><button class="btn btn-secondary btn-sm"${attr("disabled", drawerSaving, true)}>`);
|
|
1300
|
+
if (runningTaskName === automation.name) {
|
|
1301
|
+
$$renderer.push("<!--[0-->");
|
|
1302
|
+
Spinner($$renderer, {});
|
|
1303
|
+
$$renderer.push(`<!----> Running...`);
|
|
1304
|
+
} else {
|
|
1305
|
+
$$renderer.push("<!--[-1-->");
|
|
1306
|
+
$$renderer.push(`Run now`);
|
|
1307
|
+
}
|
|
1308
|
+
$$renderer.push(`<!--]--></button> <button class="btn btn-ghost btn-sm"${attr("disabled", logLoading, true)}>View latest log</button> <button class="btn btn-ghost btn-sm"${attr("disabled", drawerSaving, true)}>Edit</button> <button class="btn btn-ghost btn-sm"${attr("disabled", drawerSaving, true)}${attr("aria-label", `Delete ${stringify(automation.fileName)}`)}>Delete</button></div></div></div>`);
|
|
1309
|
+
}
|
|
1310
|
+
$$renderer.push(`<!--]--></div>`);
|
|
1311
|
+
} else {
|
|
1312
|
+
$$renderer.push("<!--[-1-->");
|
|
1313
|
+
{
|
|
1314
|
+
function icon($$renderer) {
|
|
1315
|
+
$$renderer.push(`<svg aria-hidden="true" width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>`);
|
|
1316
|
+
}
|
|
1317
|
+
EmptyState($$renderer, {
|
|
1318
|
+
icon,
|
|
1319
|
+
children: ($$renderer) => {
|
|
1320
|
+
if (loading) {
|
|
1321
|
+
$$renderer.push("<!--[0-->");
|
|
1322
|
+
$$renderer.push(`<p>Loading automations...</p>`);
|
|
1323
|
+
} else if (error) {
|
|
1324
|
+
$$renderer.push("<!--[1-->");
|
|
1325
|
+
$$renderer.push(`<p class="text-danger svelte-1xltcby">${escape_html(error)}</p> <button class="btn btn-secondary btn-sm empty-state-btn svelte-1xltcby">Try Again</button>`);
|
|
1326
|
+
} else {
|
|
1327
|
+
$$renderer.push("<!--[-1-->");
|
|
1328
|
+
$$renderer.push(`<p>No automations configured.</p> <button class="btn btn-secondary btn-sm empty-state-btn svelte-1xltcby">Create your first task</button> <p class="empty-state-hint svelte-1xltcby">Or drop <code class="svelte-1xltcby">.md</code>/<code class="svelte-1xltcby">.yml</code> files into <code class="svelte-1xltcby">~/.openpalm/knowledge/tasks/</code>.</p>`);
|
|
1329
|
+
}
|
|
1330
|
+
$$renderer.push(`<!--]-->`);
|
|
1331
|
+
}});
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
$$renderer.push(`<!--]--></div></div> <!---->`);
|
|
1335
|
+
TaskDrawer($$renderer, {
|
|
1336
|
+
open: drawerOpen,
|
|
1337
|
+
draft: drawerDraft,
|
|
1338
|
+
saving: drawerSaving,
|
|
1339
|
+
saveError: drawerError,
|
|
1340
|
+
onClose: closeDrawer});
|
|
1341
|
+
$$renderer.push(`<!----> `);
|
|
1342
|
+
Drawer($$renderer, {
|
|
1343
|
+
open: logDrawerOpen,
|
|
1344
|
+
title: logTaskName ? `Latest log — ${logTaskName}` : "Latest log",
|
|
1345
|
+
onClose: closeLogDrawer,
|
|
1346
|
+
width: "42rem",
|
|
1347
|
+
children: ($$renderer) => {
|
|
1348
|
+
$$renderer.push(`<div class="log-drawer-body svelte-1xltcby"><p class="log-drawer-copy svelte-1xltcby">Showing the most recent routine output available for <strong>${escape_html(logTaskName || "this task")}</strong>.</p> <div class="log-drawer-actions svelte-1xltcby"><button class="btn btn-secondary btn-sm"${attr("disabled", logLoading || !logTaskName, true)}>`);
|
|
1349
|
+
if (logLoading) {
|
|
1350
|
+
$$renderer.push("<!--[0-->");
|
|
1351
|
+
Spinner($$renderer, {});
|
|
1352
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1353
|
+
$$renderer.push(`<!--]--> Refresh log</button> <span class="log-drawer-hint svelte-1xltcby">Up to 200 recent lines</span></div> `);
|
|
1354
|
+
if (logError) {
|
|
1355
|
+
$$renderer.push("<!--[0-->");
|
|
1356
|
+
$$renderer.push(`<div class="feedback feedback--error" role="alert"><span>${escape_html(logError)}</span></div>`);
|
|
1357
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1358
|
+
$$renderer.push(`<!--]--> `);
|
|
1359
|
+
if (logLoading && logLines.length === 0) {
|
|
1360
|
+
$$renderer.push("<!--[0-->");
|
|
1361
|
+
$$renderer.push(`<div class="loading-state">`);
|
|
1362
|
+
Spinner($$renderer, {});
|
|
1363
|
+
$$renderer.push(`<!----> <span>Loading the latest output…</span></div>`);
|
|
1364
|
+
} else if (logLines.length > 0) {
|
|
1365
|
+
$$renderer.push("<!--[1-->");
|
|
1366
|
+
$$renderer.push(`<pre class="log-output svelte-1xltcby">${escape_html(logLines.join("\n"))}</pre>`);
|
|
1367
|
+
} else if (!logError) {
|
|
1368
|
+
$$renderer.push("<!--[2-->");
|
|
1369
|
+
{
|
|
1370
|
+
function icon($$renderer) {
|
|
1371
|
+
$$renderer.push(`<svg aria-hidden="true" width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line></svg>`);
|
|
1372
|
+
}
|
|
1373
|
+
EmptyState($$renderer, {
|
|
1374
|
+
icon,
|
|
1375
|
+
children: ($$renderer) => {
|
|
1376
|
+
$$renderer.push(`<p>No recent output yet.</p> <p class="empty-state-hint svelte-1xltcby">Run the routine first, then open this drawer to see the output.</p>`);
|
|
1377
|
+
}});
|
|
1378
|
+
}
|
|
1379
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1380
|
+
$$renderer.push(`<!--]--></div>`);
|
|
1381
|
+
}});
|
|
1382
|
+
$$renderer.push(`<!---->`);
|
|
1383
|
+
});
|
|
1384
|
+
}
|
|
1385
|
+
//#endregion
|
|
1386
|
+
//#region src/lib/components/providers/ProvidersPanel.svelte
|
|
1387
|
+
function ProvidersPanel($$renderer, $$props) {
|
|
1388
|
+
$$renderer.component(($$renderer) => {
|
|
1389
|
+
let pageState = {
|
|
1390
|
+
providers: []};
|
|
1391
|
+
let loading = true;
|
|
1392
|
+
let activeSubtab = "opencode";
|
|
1393
|
+
const connected = derived(() => pageState.providers.filter((p) => p.connected));
|
|
1394
|
+
let mainModelChoice = "";
|
|
1395
|
+
let smallModelChoice = "";
|
|
1396
|
+
let modelSaveError = null;
|
|
1397
|
+
async function saveModel(target, value) {
|
|
1398
|
+
modelSaveError = null;
|
|
1399
|
+
try {
|
|
1400
|
+
await saveOpencodeModel(target, value);
|
|
1401
|
+
} catch (err) {
|
|
1402
|
+
modelSaveError = toMessage(err, "Request failed.");
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1405
|
+
let disconnectingId = null;
|
|
1406
|
+
const BADGE_LABEL = {
|
|
1407
|
+
env: "env",
|
|
1408
|
+
api: "api key",
|
|
1409
|
+
oauth: "oauth",
|
|
1410
|
+
config: "config",
|
|
1411
|
+
custom: "custom"
|
|
1412
|
+
};
|
|
1413
|
+
function authBadge(p) {
|
|
1414
|
+
return p.credentialType ? BADGE_LABEL[p.credentialType] : "";
|
|
1415
|
+
}
|
|
1416
|
+
const assistantCliTabs = [
|
|
1417
|
+
{
|
|
1418
|
+
id: "codex",
|
|
1419
|
+
label: "Codex"
|
|
1420
|
+
},
|
|
1421
|
+
{
|
|
1422
|
+
id: "claude",
|
|
1423
|
+
label: "Claude Code"
|
|
1424
|
+
},
|
|
1425
|
+
{
|
|
1426
|
+
id: "copilot",
|
|
1427
|
+
label: "Copilot"
|
|
1428
|
+
},
|
|
1429
|
+
{
|
|
1430
|
+
id: "pi",
|
|
1431
|
+
label: "Pi"
|
|
1432
|
+
}
|
|
1433
|
+
];
|
|
1434
|
+
let apiKeyLoading = false;
|
|
1435
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2>Connections</h2> <p class="panel-subtitle">AI providers · model defaults</p></div> <div class="panel-header-actions"><button type="button" class="btn btn-secondary btn-sm"${attr("disabled", true, true)}${attr("title", "No host OpenCode installation detected")}>Import from host</button> <button type="button" class="btn btn-primary btn-sm">Add provider</button> <button class="btn btn-secondary btn-sm"${attr("disabled", loading, true)}>`);
|
|
1436
|
+
{
|
|
1437
|
+
$$renderer.push("<!--[0-->");
|
|
1438
|
+
Spinner($$renderer, {});
|
|
1439
|
+
}
|
|
1440
|
+
$$renderer.push(`<!--]--> Refresh</button></div></div> `);
|
|
1441
|
+
$$renderer.push("<!--[-1-->");
|
|
1442
|
+
$$renderer.push(`<!--]--> <div class="panel-body panel-body--flush"><section class="api-edge svelte-19zt4ct" aria-labelledby="api-edge-title"><div class="api-edge-head svelte-19zt4ct"><div><h3 id="api-edge-title" class="svelte-19zt4ct">OpenAI-compatible API</h3> <p class="svelte-19zt4ct">Point any OpenAI- or Anthropic-compatible client at this host and paste the key below as its API key.</p></div></div> <p class="api-edge-endpoint svelte-19zt4ct">Base URL <code class="svelte-19zt4ct">http://<your-host>:3821/v1</code></p> `);
|
|
1443
|
+
$$renderer.push("<!--[0-->");
|
|
1444
|
+
$$renderer.push(`<button type="button" class="btn btn-secondary btn-sm"${attr("disabled", apiKeyLoading, true)}>`);
|
|
1445
|
+
$$renderer.push("<!--[-1-->");
|
|
1446
|
+
$$renderer.push(`<!--]--> Reveal API key</button>`);
|
|
1447
|
+
$$renderer.push(`<!--]--> `);
|
|
1448
|
+
$$renderer.push("<!--[-1-->");
|
|
1449
|
+
$$renderer.push(`<!--]--></section> <div class="connections-subtabs svelte-19zt4ct"><button type="button"${attr_class("svelte-19zt4ct", void 0, { "active": true })}>OpenCode</button> <!--[-->`);
|
|
1450
|
+
const each_array = ensure_array_like(assistantCliTabs);
|
|
1451
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
1452
|
+
let tab = each_array[$$index];
|
|
1453
|
+
$$renderer.push(`<button type="button"${attr_class("svelte-19zt4ct", void 0, { "active": activeSubtab === tab.id })}>${escape_html(tab.label)}</button>`);
|
|
1454
|
+
}
|
|
1455
|
+
$$renderer.push(`<!--]--></div> `);
|
|
1456
|
+
$$renderer.push("<!--[0-->");
|
|
1457
|
+
if (pageState.providers.length === 0) {
|
|
1458
|
+
$$renderer.push("<!--[1-->");
|
|
1459
|
+
$$renderer.push(`<div class="loading-state">`);
|
|
1460
|
+
Spinner($$renderer, {});
|
|
1461
|
+
$$renderer.push(`<!----> <span>Loading providers…</span></div>`);
|
|
1462
|
+
} else if (connected().length === 0) {
|
|
1463
|
+
$$renderer.push("<!--[2-->");
|
|
1464
|
+
{
|
|
1465
|
+
function icon($$renderer) {
|
|
1466
|
+
IconLock($$renderer, { size: 40 });
|
|
1467
|
+
}
|
|
1468
|
+
EmptyState($$renderer, {
|
|
1469
|
+
icon,
|
|
1470
|
+
children: ($$renderer) => {
|
|
1471
|
+
$$renderer.push(`<p>No providers connected yet.</p> <p class="empty-hint svelte-19zt4ct">Click <strong>Add provider</strong> above to sign in to one.</p>`);
|
|
1472
|
+
}});
|
|
1473
|
+
}
|
|
1474
|
+
} else {
|
|
1475
|
+
$$renderer.push("<!--[-1-->");
|
|
1476
|
+
$$renderer.push(`<div class="model-defaults svelte-19zt4ct"><div class="model-field svelte-19zt4ct"><label class="form-label" for="default-model">Default model</label> `);
|
|
1477
|
+
$$renderer.select({
|
|
1478
|
+
id: "default-model",
|
|
1479
|
+
class: "form-input",
|
|
1480
|
+
value: mainModelChoice,
|
|
1481
|
+
onchange: (e) => void saveModel("model", e.currentTarget.value)
|
|
1482
|
+
}, ($$renderer) => {
|
|
1483
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
1484
|
+
$$renderer.push(`— OpenCode default —`);
|
|
1485
|
+
});
|
|
1486
|
+
$$renderer.push(`<!--[-->`);
|
|
1487
|
+
const each_array_1 = ensure_array_like(connected());
|
|
1488
|
+
for (let $$index_2 = 0, $$length = each_array_1.length; $$index_2 < $$length; $$index_2++) {
|
|
1489
|
+
let p = each_array_1[$$index_2];
|
|
1490
|
+
if (p.models.length > 0) {
|
|
1491
|
+
$$renderer.push("<!--[0-->");
|
|
1492
|
+
$$renderer.push(`<optgroup${attr("label", p.name)}><!--[-->`);
|
|
1493
|
+
const each_array_2 = ensure_array_like(p.models);
|
|
1494
|
+
for (let $$index_1 = 0, $$length = each_array_2.length; $$index_1 < $$length; $$index_1++) {
|
|
1495
|
+
let m = each_array_2[$$index_1];
|
|
1496
|
+
$$renderer.option({ value: `${stringify(p.id)}/${stringify(m.id)}` }, ($$renderer) => {
|
|
1497
|
+
$$renderer.push(`${escape_html(m.name || m.id)}`);
|
|
1498
|
+
});
|
|
1499
|
+
}
|
|
1500
|
+
$$renderer.push(`<!--]--></optgroup>`);
|
|
1501
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1502
|
+
$$renderer.push(`<!--]-->`);
|
|
1503
|
+
}
|
|
1504
|
+
$$renderer.push(`<!--]-->`);
|
|
1505
|
+
});
|
|
1506
|
+
$$renderer.push(`</div> <div class="model-field svelte-19zt4ct"><label class="form-label" for="small-model">Small model</label> `);
|
|
1507
|
+
$$renderer.select({
|
|
1508
|
+
id: "small-model",
|
|
1509
|
+
class: "form-input",
|
|
1510
|
+
value: smallModelChoice,
|
|
1511
|
+
onchange: (e) => void saveModel("small_model", e.currentTarget.value)
|
|
1512
|
+
}, ($$renderer) => {
|
|
1513
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
1514
|
+
$$renderer.push(`— OpenCode default —`);
|
|
1515
|
+
});
|
|
1516
|
+
$$renderer.push(`<!--[-->`);
|
|
1517
|
+
const each_array_3 = ensure_array_like(connected());
|
|
1518
|
+
for (let $$index_4 = 0, $$length = each_array_3.length; $$index_4 < $$length; $$index_4++) {
|
|
1519
|
+
let p = each_array_3[$$index_4];
|
|
1520
|
+
if (p.models.length > 0) {
|
|
1521
|
+
$$renderer.push("<!--[0-->");
|
|
1522
|
+
$$renderer.push(`<optgroup${attr("label", p.name)}><!--[-->`);
|
|
1523
|
+
const each_array_4 = ensure_array_like(p.models);
|
|
1524
|
+
for (let $$index_3 = 0, $$length = each_array_4.length; $$index_3 < $$length; $$index_3++) {
|
|
1525
|
+
let m = each_array_4[$$index_3];
|
|
1526
|
+
$$renderer.option({ value: `${stringify(p.id)}/${stringify(m.id)}` }, ($$renderer) => {
|
|
1527
|
+
$$renderer.push(`${escape_html(m.name || m.id)}`);
|
|
1528
|
+
});
|
|
1529
|
+
}
|
|
1530
|
+
$$renderer.push(`<!--]--></optgroup>`);
|
|
1531
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1532
|
+
$$renderer.push(`<!--]-->`);
|
|
1533
|
+
}
|
|
1534
|
+
$$renderer.push(`<!--]-->`);
|
|
1535
|
+
});
|
|
1536
|
+
$$renderer.push(`</div> `);
|
|
1537
|
+
if (modelSaveError) {
|
|
1538
|
+
$$renderer.push("<!--[0-->");
|
|
1539
|
+
$$renderer.push(`<p class="model-error svelte-19zt4ct">${escape_html(modelSaveError)}</p>`);
|
|
1540
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1541
|
+
$$renderer.push(`<!--]--></div> <div class="providers-container svelte-19zt4ct"><!--[-->`);
|
|
1542
|
+
const each_array_5 = ensure_array_like(connected());
|
|
1543
|
+
for (let $$index_5 = 0, $$length = each_array_5.length; $$index_5 < $$length; $$index_5++) {
|
|
1544
|
+
let p = each_array_5[$$index_5];
|
|
1545
|
+
$$renderer.push(`<div class="provider-row svelte-19zt4ct"><div class="provider-id svelte-19zt4ct"><div class="svelte-19zt4ct"><span class="provider-name svelte-19zt4ct">${escape_html(p.name)}</span> <span class="provider-desc svelte-19zt4ct">${escape_html(authBadge(p))}</span></div></div> <button class="btn btn-outline btn-sm"${attr("disabled", disconnectingId === p.id, true)}>`);
|
|
1546
|
+
if (disconnectingId === p.id) {
|
|
1547
|
+
$$renderer.push("<!--[0-->");
|
|
1548
|
+
Spinner($$renderer, {});
|
|
1549
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1550
|
+
$$renderer.push(`<!--]--> Disconnect</button></div>`);
|
|
1551
|
+
}
|
|
1552
|
+
$$renderer.push(`<!--]--></div>`);
|
|
1553
|
+
}
|
|
1554
|
+
$$renderer.push(`<!--]-->`);
|
|
1555
|
+
$$renderer.push(`<!--]--></div></div> `);
|
|
1556
|
+
$$renderer.push("<!--[-1-->");
|
|
1557
|
+
$$renderer.push(`<!--]--> `);
|
|
1558
|
+
$$renderer.push("<!--[-1-->");
|
|
1559
|
+
$$renderer.push(`<!--]--> `);
|
|
1560
|
+
$$renderer.push("<!--[-1-->");
|
|
1561
|
+
$$renderer.push(`<!--]--> `);
|
|
1562
|
+
$$renderer.push("<!--[-1-->");
|
|
1563
|
+
$$renderer.push(`<!--]--> `);
|
|
1564
|
+
$$renderer.push("<!--[-1-->");
|
|
1565
|
+
$$renderer.push(`<!--]-->`);
|
|
1566
|
+
});
|
|
1567
|
+
}
|
|
1568
|
+
//#endregion
|
|
1569
|
+
//#region src/lib/components/admin/logs/LogsTab.svelte
|
|
1570
|
+
function LogsTab($$renderer, $$props) {
|
|
1571
|
+
$$renderer.component(($$renderer) => {
|
|
1572
|
+
let { services} = $$props;
|
|
1573
|
+
let logs = "";
|
|
1574
|
+
let logsLoaded = false;
|
|
1575
|
+
let loading = false;
|
|
1576
|
+
let error = "";
|
|
1577
|
+
let selectedService = "";
|
|
1578
|
+
let tailLines = 100;
|
|
1579
|
+
let autoScroll = true;
|
|
1580
|
+
async function loadLogs() {
|
|
1581
|
+
loading = true;
|
|
1582
|
+
error = "";
|
|
1583
|
+
try {
|
|
1584
|
+
{
|
|
1585
|
+
const result = await fetchServiceLogs({
|
|
1586
|
+
service: void 0,
|
|
1587
|
+
tail: tailLines
|
|
1588
|
+
});
|
|
1589
|
+
if (result.ok) {
|
|
1590
|
+
logs = result.logs;
|
|
1591
|
+
logsLoaded = true;
|
|
1592
|
+
} else error = result.error ?? "Failed to fetch logs.";
|
|
1593
|
+
}
|
|
1594
|
+
} catch (e) {
|
|
1595
|
+
error = e instanceof Error ? e.message : "Failed to fetch logs.";
|
|
1596
|
+
} finally {
|
|
1597
|
+
loading = false;
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
{
|
|
1601
|
+
function actions($$renderer) {
|
|
1602
|
+
$$renderer.push(`<button class="btn btn-secondary btn-sm"${attr("disabled", !logs, true)}>${escape_html("Copy")}</button> <button class="btn btn-secondary btn-sm"${attr("disabled", loading, true)}>`);
|
|
1603
|
+
if (loading) {
|
|
1604
|
+
$$renderer.push("<!--[0-->");
|
|
1605
|
+
Spinner($$renderer, {});
|
|
1606
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1607
|
+
$$renderer.push(`<!--]--> Refresh</button>`);
|
|
1608
|
+
}
|
|
1609
|
+
Panel($$renderer, {
|
|
1610
|
+
title: "Journal",
|
|
1611
|
+
role: "tabpanel",
|
|
1612
|
+
actions,
|
|
1613
|
+
children: ($$renderer) => {
|
|
1614
|
+
$$renderer.push(`<div class="controls svelte-coqj2u"><div class="control-group control-group--source svelte-coqj2u"><span class="control-label svelte-coqj2u">Source</span> <div class="source-switch svelte-coqj2u" role="tablist" aria-label="Journal source"><button${attr_class("source-pill svelte-coqj2u", void 0, { "source-pill--active": true })} type="button" role="tab"${attr("aria-selected", true)}>Service logs</button> <button${attr_class("source-pill svelte-coqj2u", void 0, { "source-pill--active": false })} type="button" role="tab"${attr("aria-selected", false)}>Routine logs</button></div></div> `);
|
|
1615
|
+
$$renderer.push("<!--[0-->");
|
|
1616
|
+
$$renderer.push(`<div class="control-group svelte-coqj2u"><label for="log-service" class="control-label svelte-coqj2u">Service</label> `);
|
|
1617
|
+
$$renderer.select({
|
|
1618
|
+
id: "log-service",
|
|
1619
|
+
class: "control-input",
|
|
1620
|
+
value: selectedService,
|
|
1621
|
+
onchange: () => void loadLogs()
|
|
1622
|
+
}, ($$renderer) => {
|
|
1623
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
1624
|
+
$$renderer.push(`All services`);
|
|
1625
|
+
});
|
|
1626
|
+
$$renderer.push(`<!--[-->`);
|
|
1627
|
+
const each_array = ensure_array_like(services);
|
|
1628
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
1629
|
+
let svc = each_array[$$index];
|
|
1630
|
+
$$renderer.option({ value: svc }, ($$renderer) => {
|
|
1631
|
+
$$renderer.push(`${escape_html(svc)}`);
|
|
1632
|
+
});
|
|
1633
|
+
}
|
|
1634
|
+
$$renderer.push(`<!--]-->`);
|
|
1635
|
+
}, "svelte-coqj2u");
|
|
1636
|
+
$$renderer.push(`</div>`);
|
|
1637
|
+
$$renderer.push(`<!--]--> <div class="control-group svelte-coqj2u"><label for="log-tail" class="control-label svelte-coqj2u">Recent lines</label> `);
|
|
1638
|
+
$$renderer.select({
|
|
1639
|
+
id: "log-tail",
|
|
1640
|
+
class: "control-input",
|
|
1641
|
+
value: tailLines,
|
|
1642
|
+
onchange: () => void loadLogs()
|
|
1643
|
+
}, ($$renderer) => {
|
|
1644
|
+
$$renderer.option({ value: 50 }, ($$renderer) => {
|
|
1645
|
+
$$renderer.push(`50`);
|
|
1646
|
+
});
|
|
1647
|
+
$$renderer.option({ value: 100 }, ($$renderer) => {
|
|
1648
|
+
$$renderer.push(`100`);
|
|
1649
|
+
});
|
|
1650
|
+
$$renderer.option({ value: 250 }, ($$renderer) => {
|
|
1651
|
+
$$renderer.push(`250`);
|
|
1652
|
+
});
|
|
1653
|
+
$$renderer.option({ value: 500 }, ($$renderer) => {
|
|
1654
|
+
$$renderer.push(`500`);
|
|
1655
|
+
});
|
|
1656
|
+
$$renderer.option({ value: 1e3 }, ($$renderer) => {
|
|
1657
|
+
$$renderer.push(`1000`);
|
|
1658
|
+
});
|
|
1659
|
+
}, "svelte-coqj2u");
|
|
1660
|
+
$$renderer.push(`</div> `);
|
|
1661
|
+
$$renderer.push("<!--[0-->");
|
|
1662
|
+
$$renderer.push(`<div class="control-group control-group--toggle svelte-coqj2u"><label class="toggle-label svelte-coqj2u"><input type="checkbox"${attr("checked", autoScroll, true)}/> <span>Auto-scroll</span></label></div>`);
|
|
1663
|
+
$$renderer.push(`<!--]--> <button class="btn btn-primary btn-sm"${attr("disabled", loading, true)}>`);
|
|
1664
|
+
if (loading) {
|
|
1665
|
+
$$renderer.push("<!--[0-->");
|
|
1666
|
+
Spinner($$renderer, {});
|
|
1667
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1668
|
+
$$renderer.push(`<!--]--> ${escape_html("Load service logs")}</button></div> <div class="panel-body panel-body--flush">`);
|
|
1669
|
+
if (error) {
|
|
1670
|
+
$$renderer.push("<!--[0-->");
|
|
1671
|
+
$$renderer.push(`<div class="error-banner svelte-coqj2u"><span>${escape_html(error)}</span></div>`);
|
|
1672
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1673
|
+
$$renderer.push(`<!--]--> `);
|
|
1674
|
+
if (logs) {
|
|
1675
|
+
$$renderer.push("<!--[0-->");
|
|
1676
|
+
$$renderer.push(`<pre class="log-output svelte-coqj2u">${escape_html(logs)}</pre>`);
|
|
1677
|
+
} else if (!loading) {
|
|
1678
|
+
$$renderer.push("<!--[1-->");
|
|
1679
|
+
{
|
|
1680
|
+
function icon($$renderer) {
|
|
1681
|
+
$$renderer.push(`<svg aria-hidden="true" width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line></svg>`);
|
|
1682
|
+
}
|
|
1683
|
+
EmptyState($$renderer, {
|
|
1684
|
+
icon,
|
|
1685
|
+
children: ($$renderer) => {
|
|
1686
|
+
if (logsLoaded) {
|
|
1687
|
+
$$renderer.push("<!--[0-->");
|
|
1688
|
+
$$renderer.push("<!--[0-->");
|
|
1689
|
+
$$renderer.push(`<p>No log output — the container may not be running or has no recent output.</p>`);
|
|
1690
|
+
$$renderer.push(`<!--]-->`);
|
|
1691
|
+
} else {
|
|
1692
|
+
$$renderer.push("<!--[-1-->");
|
|
1693
|
+
$$renderer.push("<!--[0-->");
|
|
1694
|
+
$$renderer.push(`<p>Select a service and click "Load service logs" to view container output.</p>`);
|
|
1695
|
+
$$renderer.push(`<!--]-->`);
|
|
1696
|
+
}
|
|
1697
|
+
$$renderer.push(`<!--]-->`);
|
|
1698
|
+
}});
|
|
1699
|
+
}
|
|
1700
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1701
|
+
$$renderer.push(`<!--]--></div>`);
|
|
1702
|
+
}});
|
|
1703
|
+
}
|
|
1704
|
+
});
|
|
1705
|
+
}
|
|
1706
|
+
//#endregion
|
|
1707
|
+
//#region src/lib/components/admin/secrets/SecretsTab.svelte
|
|
1708
|
+
function SecretsTab($$renderer, $$props) {
|
|
1709
|
+
$$renderer.component(($$renderer) => {
|
|
1710
|
+
const filesRes = resource(async () => (await fetchSecretFiles()).files, { fallback: "Failed to list secret files." });
|
|
1711
|
+
let files = derived(() => filesRes.data ?? []);
|
|
1712
|
+
let busy = false;
|
|
1713
|
+
let selected = null;
|
|
1714
|
+
let newName = "";
|
|
1715
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2>Secrets</h2> <p class="panel-subtitle">Encrypted key files under knowledge/secrets/</p></div> <div class="panel-header-actions"><button class="btn btn-secondary btn-sm"${attr("disabled", filesRes.loading || busy, true)}>`);
|
|
1716
|
+
if (filesRes.loading) {
|
|
1717
|
+
$$renderer.push("<!--[0-->");
|
|
1718
|
+
Spinner($$renderer, {});
|
|
1719
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1720
|
+
$$renderer.push(`<!--]--> Refresh</button></div></div> `);
|
|
1721
|
+
if (filesRes.error) {
|
|
1722
|
+
$$renderer.push("<!--[0-->");
|
|
1723
|
+
$$renderer.push(`<div class="error-banner svelte-epscb2"><span>${escape_html(filesRes.error)}</span></div>`);
|
|
1724
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1725
|
+
$$renderer.push(`<!--]--> <div class="secrets-layout svelte-epscb2"><div class="secrets-list svelte-epscb2">`);
|
|
1726
|
+
if (files().length === 0 && !filesRes.loading) {
|
|
1727
|
+
$$renderer.push("<!--[0-->");
|
|
1728
|
+
$$renderer.push(`<p class="empty-note svelte-epscb2">No secret files found.</p>`);
|
|
1729
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1730
|
+
$$renderer.push(`<!--]--> <!--[-->`);
|
|
1731
|
+
const each_array = ensure_array_like(files());
|
|
1732
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
1733
|
+
let f = each_array[$$index];
|
|
1734
|
+
$$renderer.push(`<div${attr_class(`secret-row ${selected === f.name ? "active" : ""}`, "svelte-epscb2")}><button class="secret-name svelte-epscb2"${attr("disabled", busy, true)}${attr("aria-label", `Edit ${stringify(f.name)}`)}><span class="mono svelte-epscb2">${escape_html(f.name)}</span> <span class="secret-size svelte-epscb2">${escape_html(formatBytes(f.size))}</span></button> <button class="btn btn-ghost btn-sm"${attr("disabled", busy, true)}${attr("aria-label", `Delete ${stringify(f.name)}`)}>✕</button></div>`);
|
|
1735
|
+
}
|
|
1736
|
+
$$renderer.push(`<!--]--> <div class="new-secret svelte-epscb2"><label class="new-secret-label svelte-epscb2" for="new-secret-name">New secret file</label> <div class="new-secret-row svelte-epscb2"><input id="new-secret-name" class="control-input" type="text" spellcheck="false" placeholder="new-file-name"${attr("value", newName)}${attr("disabled", busy, true)}/> <button class="btn btn-secondary btn-sm"${attr("disabled", !newName.trim(), true)}>Add</button></div></div></div> <div class="secrets-editor svelte-epscb2">`);
|
|
1737
|
+
$$renderer.push("<!--[-1-->");
|
|
1738
|
+
$$renderer.push(`<div class="editor-empty svelte-epscb2">`);
|
|
1739
|
+
IconLock($$renderer, { size: 24 });
|
|
1740
|
+
$$renderer.push(`<!----> <p class="svelte-epscb2">Select a file to view or edit its contents.</p> <button class="btn btn-secondary btn-sm">New secret</button></div>`);
|
|
1741
|
+
$$renderer.push(`<!--]--></div></div></div>`);
|
|
1742
|
+
});
|
|
1743
|
+
}
|
|
1744
|
+
//#endregion
|
|
1745
|
+
//#region src/lib/components/admin/assistant/AssistantTab.svelte
|
|
1746
|
+
function AssistantTab($$renderer, $$props) {
|
|
1747
|
+
$$renderer.component(($$renderer) => {
|
|
1748
|
+
let projectName = "openpalm";
|
|
1749
|
+
let lanExposureEnabled = false;
|
|
1750
|
+
let stackEnvPath = "knowledge/env/stack.env";
|
|
1751
|
+
let personaSaving = false;
|
|
1752
|
+
let personaPath = "config/assistant/persona.md";
|
|
1753
|
+
let personaContent = "";
|
|
1754
|
+
const showStack = hasCapability("host:stack:read");
|
|
1755
|
+
const canEditStack = hasCapability("host:stack:write");
|
|
1756
|
+
const showPersona = hasCapability("assistant-settings:read");
|
|
1757
|
+
const canEditPersona = hasCapability("assistant-settings:write");
|
|
1758
|
+
let saving = derived(() => personaSaving);
|
|
1759
|
+
let personaDirty = derived(() => false);
|
|
1760
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2>Assistant</h2> <p class="panel-subtitle">Persona · stack config</p></div> <div class="panel-header-actions"><button class="btn btn-secondary btn-sm"${attr("disabled", saving(), true)}>`);
|
|
1761
|
+
$$renderer.push("<!--[-1-->");
|
|
1762
|
+
$$renderer.push(`<!--]--> Refresh</button></div></div> `);
|
|
1763
|
+
$$renderer.push("<!--[-1-->");
|
|
1764
|
+
$$renderer.push(`<!--]--> <div class="settings-grid svelte-obkjlq">`);
|
|
1765
|
+
if (showStack) {
|
|
1766
|
+
$$renderer.push("<!--[0-->");
|
|
1767
|
+
$$renderer.push(`<section class="settings-card svelte-obkjlq"><h3 class="svelte-obkjlq">Compose Project Name</h3> <p class="section-note svelte-obkjlq">This writes <code>OP_PROJECT_NAME</code> in <code>${escape_html(stackEnvPath)}</code>. If unset, OpenPalm defaults to <code>openpalm</code>.</p> <label class="field svelte-obkjlq" for="project-name"><span>Project name</span> <input id="project-name" class="control-input mono svelte-obkjlq" type="text" spellcheck="false" placeholder="openpalm"${attr("value", projectName)}${attr("disabled", saving() || !canEditStack, true)}/></label> <p class="field-hint svelte-obkjlq">Lowercase letters, numbers, dashes, and underscores only. This affects Docker Compose naming and collision detection.</p></section> <section class="settings-card svelte-obkjlq"><h3 class="svelte-obkjlq">LAN Exposure</h3> <p class="section-note svelte-obkjlq">This writes <code>OP_ASSISTANT_BIND_ADDRESS</code> in <code>${escape_html(stackEnvPath)}</code>.</p> <label class="field-inline svelte-obkjlq" for="assistant-lan-exposure"><input id="assistant-lan-exposure" type="checkbox"${attr("checked", lanExposureEnabled, true)}${attr("disabled", saving() || !canEditStack, true)} class="svelte-obkjlq"/> <span>Expose the assistant OpenCode server on the host LAN</span></label> <p class="field-hint svelte-obkjlq">Off keeps the host bind on <code>127.0.0.1</code>. On switches it to <code>0.0.0.0</code> so other devices on your LAN can reach the host port.</p> `);
|
|
1768
|
+
if (canEditStack) {
|
|
1769
|
+
$$renderer.push("<!--[0-->");
|
|
1770
|
+
$$renderer.push(`<div class="card-actions svelte-obkjlq"><button class="btn btn-primary btn-sm"${attr("disabled", saving(), true)}>`);
|
|
1771
|
+
$$renderer.push("<!--[-1-->");
|
|
1772
|
+
$$renderer.push(`<!--]--> Save stack settings</button></div>`);
|
|
1773
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1774
|
+
$$renderer.push(`<!--]--></section>`);
|
|
1775
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1776
|
+
$$renderer.push(`<!--]--> `);
|
|
1777
|
+
if (showPersona) {
|
|
1778
|
+
$$renderer.push("<!--[0-->");
|
|
1779
|
+
$$renderer.push(`<section class="settings-card svelte-obkjlq"><h3 class="svelte-obkjlq">Persona</h3> <p class="section-note svelte-obkjlq">Edit the assistant persona markdown mounted into the assistant OpenCode instance.</p> <div class="path-chip svelte-obkjlq">${escape_html(personaPath)}</div> <textarea class="control-input persona-editor mono svelte-obkjlq" rows="20" spellcheck="false"${attr("disabled", saving() || !canEditPersona, true)}>`);
|
|
1780
|
+
const $$body = escape_html(personaContent);
|
|
1781
|
+
if ($$body) $$renderer.push(`${$$body}`);
|
|
1782
|
+
$$renderer.push(`</textarea> `);
|
|
1783
|
+
if (canEditPersona) {
|
|
1784
|
+
$$renderer.push("<!--[0-->");
|
|
1785
|
+
$$renderer.push(`<div class="card-actions svelte-obkjlq">`);
|
|
1786
|
+
if (personaDirty()) {
|
|
1787
|
+
$$renderer.push("<!--[0-->");
|
|
1788
|
+
$$renderer.push(`<span class="unsaved-hint svelte-obkjlq" aria-live="polite">Unsaved changes</span>`);
|
|
1789
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1790
|
+
$$renderer.push(`<!--]--> <button class="btn btn-primary btn-sm"${attr("disabled", saving() || !personaDirty(), true)}>`);
|
|
1791
|
+
$$renderer.push("<!--[-1-->");
|
|
1792
|
+
$$renderer.push(`<!--]--> Save persona</button></div>`);
|
|
1793
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1794
|
+
$$renderer.push(`<!--]--></section>`);
|
|
1795
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1796
|
+
$$renderer.push(`<!--]--></div></div>`);
|
|
1797
|
+
});
|
|
1798
|
+
}
|
|
1799
|
+
//#endregion
|
|
1800
|
+
//#region src/lib/components/chat/ToolStrip.svelte
|
|
1801
|
+
function ToolStrip($$renderer, $$props) {
|
|
1802
|
+
$$renderer.component(($$renderer) => {
|
|
1803
|
+
let { items, muted = false, bordered = false, ariaLabel = "Assistant tool activity" } = $$props;
|
|
1804
|
+
let selectedToolId = null;
|
|
1805
|
+
if (items.length > 0) {
|
|
1806
|
+
$$renderer.push("<!--[0-->");
|
|
1807
|
+
$$renderer.push(`<div${attr_class("tool-strip svelte-icksz3", void 0, {
|
|
1808
|
+
"tool-strip-muted": muted,
|
|
1809
|
+
"tool-strip-bordered": bordered
|
|
1810
|
+
})}${attr("aria-label", ariaLabel)}><!--[-->`);
|
|
1811
|
+
const each_array = ensure_array_like(items);
|
|
1812
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
1813
|
+
let tool = each_array[$$index];
|
|
1814
|
+
const toolType = toolIconType(tool.tool, tool.status);
|
|
1815
|
+
$$renderer.push(`<button${attr_class("tool-icon-btn svelte-icksz3", void 0, { "selected": selectedToolId === tool.id })} type="button"${attr("aria-label", toolAriaLabel(tool))}${attr("title", toolAriaLabel(tool))}>`);
|
|
1816
|
+
if (toolType === "alert") {
|
|
1817
|
+
$$renderer.push("<!--[0-->");
|
|
1818
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1819
|
+
IconAlert($$renderer, { size: 13 });
|
|
1820
|
+
$$renderer.push(`<!----></span>`);
|
|
1821
|
+
} else if (toolType === "done-circle") {
|
|
1822
|
+
$$renderer.push("<!--[1-->");
|
|
1823
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1824
|
+
IconDoneCircle($$renderer, { size: 13 });
|
|
1825
|
+
$$renderer.push(`<!----></span>`);
|
|
1826
|
+
} else if (toolType === "refresh") {
|
|
1827
|
+
$$renderer.push("<!--[2-->");
|
|
1828
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1829
|
+
IconRefresh($$renderer, { size: 13 });
|
|
1830
|
+
$$renderer.push(`<!----></span>`);
|
|
1831
|
+
} else if (toolType === "terminal") {
|
|
1832
|
+
$$renderer.push("<!--[3-->");
|
|
1833
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1834
|
+
IconTerminal($$renderer, { size: 13 });
|
|
1835
|
+
$$renderer.push(`<!----></span>`);
|
|
1836
|
+
} else if (toolType === "search") {
|
|
1837
|
+
$$renderer.push("<!--[4-->");
|
|
1838
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1839
|
+
IconSearch($$renderer, { size: 13 });
|
|
1840
|
+
$$renderer.push(`<!----></span>`);
|
|
1841
|
+
} else if (toolType === "file") {
|
|
1842
|
+
$$renderer.push("<!--[5-->");
|
|
1843
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1844
|
+
IconFile($$renderer, { size: 13 });
|
|
1845
|
+
$$renderer.push(`<!----></span>`);
|
|
1846
|
+
} else if (toolType === "edit") {
|
|
1847
|
+
$$renderer.push("<!--[6-->");
|
|
1848
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1849
|
+
IconEdit($$renderer, { size: 13 });
|
|
1850
|
+
$$renderer.push(`<!----></span>`);
|
|
1851
|
+
} else if (toolType === "link") {
|
|
1852
|
+
$$renderer.push("<!--[7-->");
|
|
1853
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1854
|
+
IconLink($$renderer, { size: 13 });
|
|
1855
|
+
$$renderer.push(`<!----></span>`);
|
|
1856
|
+
} else if (toolType === "agent") {
|
|
1857
|
+
$$renderer.push("<!--[8-->");
|
|
1858
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1859
|
+
IconAgent($$renderer, { size: 13 });
|
|
1860
|
+
$$renderer.push(`<!----></span>`);
|
|
1861
|
+
} else if (toolType === "done") {
|
|
1862
|
+
$$renderer.push("<!--[9-->");
|
|
1863
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1864
|
+
IconDone($$renderer, { size: 13 });
|
|
1865
|
+
$$renderer.push(`<!----></span>`);
|
|
1866
|
+
} else {
|
|
1867
|
+
$$renderer.push("<!--[-1-->");
|
|
1868
|
+
$$renderer.push(`<span class="tool-icon svelte-icksz3" aria-hidden="true">`);
|
|
1869
|
+
IconClock($$renderer, { size: 13 });
|
|
1870
|
+
$$renderer.push(`<!----></span>`);
|
|
1871
|
+
}
|
|
1872
|
+
$$renderer.push(`<!--]--></button>`);
|
|
1873
|
+
}
|
|
1874
|
+
$$renderer.push(`<!--]--></div>`);
|
|
1875
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1876
|
+
$$renderer.push(`<!--]--> `);
|
|
1877
|
+
$$renderer.push("<!--[-1-->");
|
|
1878
|
+
$$renderer.push(`<!--]-->`);
|
|
1879
|
+
});
|
|
1880
|
+
}
|
|
1881
|
+
//#endregion
|
|
1882
|
+
//#region src/lib/components/admin/activity/ActivityTab.svelte
|
|
1883
|
+
function ActivityTab($$renderer, $$props) {
|
|
1884
|
+
$$renderer.component(($$renderer) => {
|
|
1885
|
+
let loading = false;
|
|
1886
|
+
let messagesLoading = false;
|
|
1887
|
+
let streamState = "connecting";
|
|
1888
|
+
let sessions = [];
|
|
1889
|
+
let selectedSessionId = null;
|
|
1890
|
+
let selectedMessages = [];
|
|
1891
|
+
let attentionFeed = [];
|
|
1892
|
+
let eventFeed = [];
|
|
1893
|
+
let eventCounts = {};
|
|
1894
|
+
let sessionEventCounts = {};
|
|
1895
|
+
let minuteTimestamps = [];
|
|
1896
|
+
let lastEventAt = null;
|
|
1897
|
+
let clock = Date.now();
|
|
1898
|
+
function fmtTime(timestamp) {
|
|
1899
|
+
if (!timestamp) return "n/a";
|
|
1900
|
+
const d = new Date(timestamp);
|
|
1901
|
+
const today = /* @__PURE__ */ new Date();
|
|
1902
|
+
if (d.getFullYear() === today.getFullYear() && d.getMonth() === today.getMonth() && d.getDate() === today.getDate()) return d.toLocaleTimeString([], {
|
|
1903
|
+
hour: "2-digit",
|
|
1904
|
+
minute: "2-digit",
|
|
1905
|
+
second: "2-digit"
|
|
1906
|
+
});
|
|
1907
|
+
return d.toLocaleString([], {
|
|
1908
|
+
month: "short",
|
|
1909
|
+
day: "numeric",
|
|
1910
|
+
hour: "2-digit",
|
|
1911
|
+
minute: "2-digit"
|
|
1912
|
+
});
|
|
1913
|
+
}
|
|
1914
|
+
function fmtDateTime(timestamp) {
|
|
1915
|
+
return new Date(timestamp).toLocaleString([], {
|
|
1916
|
+
month: "short",
|
|
1917
|
+
day: "numeric",
|
|
1918
|
+
hour: "2-digit",
|
|
1919
|
+
minute: "2-digit",
|
|
1920
|
+
second: "2-digit"
|
|
1921
|
+
});
|
|
1922
|
+
}
|
|
1923
|
+
let selectedSession = derived(() => sessions.find((session) => session.id === selectedSessionId) ?? null);
|
|
1924
|
+
let waitingItems = derived(() => attentionFeed.filter((item) => item.kind === "permission" || item.kind === "question").length);
|
|
1925
|
+
let failingItems = derived(() => attentionFeed.filter((item) => item.severity === "high").length);
|
|
1926
|
+
let activeSessions = derived(() => sessions.filter((session) => clock - session.updatedAt <= 5 * 6e4).length);
|
|
1927
|
+
let latestAttention = derived(() => attentionFeed.slice(0, 10));
|
|
1928
|
+
let eventsLastMinute = derived(() => minuteTimestamps.filter((timestamp) => clock - timestamp <= 6e4).length);
|
|
1929
|
+
let eventsLastFiveMinutes = derived(() => minuteTimestamps.filter((timestamp) => clock - timestamp <= 5 * 6e4).length);
|
|
1930
|
+
let eventTypeRows = derived(() => Object.entries(eventCounts).sort((left, right) => right[1] - left[1]).slice(0, 8));
|
|
1931
|
+
let hotSessions = derived(() => sessions.map((session) => ({
|
|
1932
|
+
...session,
|
|
1933
|
+
events: sessionEventCounts[session.id] ?? 0
|
|
1934
|
+
})).sort((left, right) => right.events - left.events || right.updatedAt - left.updatedAt).slice(0, 8));
|
|
1935
|
+
onDestroy(() => {});
|
|
1936
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2>Activity</h2> <p class="panel-subtitle">Operator telemetry · live</p></div> <div class="panel-header-actions"><button class="btn btn-secondary btn-sm"${attr("disabled", loading, true)}>`);
|
|
1937
|
+
$$renderer.push("<!--[-1-->");
|
|
1938
|
+
$$renderer.push(`<!--]--> Refresh</button></div></div> `);
|
|
1939
|
+
$$renderer.push("<!--[-1-->");
|
|
1940
|
+
$$renderer.push(`<!--]--> `);
|
|
1941
|
+
$$renderer.push("<!--[-1-->");
|
|
1942
|
+
$$renderer.push(`<!--]--> <div class="endpoint-banner svelte-z6w8je"><div><div class="endpoint-label svelte-z6w8je">Endpoint</div> <div class="endpoint-value svelte-z6w8je">${escape_html(endpointsService.active?.label ?? "Active assistant endpoint")}</div> <div class="endpoint-url mono svelte-z6w8je">${escape_html(endpointsService.active?.url ?? "Loading endpoint URL...")}</div></div> <div${attr_class(`stream-badge stream-badge--${stringify(streamState)}`, "svelte-z6w8je")}>${escape_html(streamState)}</div></div> <div class="summary-grid svelte-z6w8je"><div class="summary-card svelte-z6w8je"><span class="summary-label svelte-z6w8je">Events / minute</span> <strong class="summary-value svelte-z6w8je">${escape_html(eventsLastMinute())}</strong> <small class="svelte-z6w8je">${escape_html(eventsLastFiveMinutes())} events seen in the last 5 minutes</small></div> <div class="summary-card svelte-z6w8je"><span class="summary-label svelte-z6w8je">Sessions</span> <strong class="summary-value svelte-z6w8je">${escape_html(sessions.length)}</strong> <small class="svelte-z6w8je">${escape_html(activeSessions())} active in the last 5 minutes</small></div> <div class="summary-card summary-card--warning svelte-z6w8je"><span class="summary-label svelte-z6w8je">Waiting on people</span> <strong class="summary-value svelte-z6w8je">${escape_html(waitingItems())}</strong> <small class="svelte-z6w8je">Permissions and answers that block the assistant.</small></div> <div${attr_class("summary-card svelte-z6w8je", void 0, { "summary-card--danger": failingItems() > 0 })}><span class="summary-label svelte-z6w8je">Last event</span> <strong class="summary-value summary-value--small svelte-z6w8je">${escape_html(fmtTime(lastEventAt))}</strong> <small class="svelte-z6w8je">${escape_html(failingItems() > 0 ? `${failingItems()} failure${failingItems() === 1 ? "" : "s"} need review.` : "Reconnect needed.")}</small></div> <div class="summary-card svelte-z6w8je"><span class="summary-label svelte-z6w8je">Observed types</span> <strong class="summary-value svelte-z6w8je">${escape_html(Object.keys(eventCounts).length)}</strong> <small class="svelte-z6w8je">${escape_html(eventFeed.length)} recent events buffered</small></div> <div${attr_class("summary-card svelte-z6w8je", void 0, { "summary-card--danger": failingItems() > 0 })}><span class="summary-label svelte-z6w8je">Failures seen</span> <strong class="summary-value svelte-z6w8je">${escape_html(failingItems())}</strong> <small class="svelte-z6w8je">${escape_html(failingItems() > 0 ? "Tool or session failures need review." : "No current failures seen.")}</small></div></div> <div class="activity-layout svelte-z6w8je"><section class="card-section svelte-z6w8je"><div class="card-head svelte-z6w8je"><h3 class="svelte-z6w8je">Needs attention</h3> <span class="svelte-z6w8je">${escape_html(latestAttention().length)}</span></div> <div class="attention-list svelte-z6w8je">`);
|
|
1943
|
+
if (latestAttention().length === 0) {
|
|
1944
|
+
$$renderer.push("<!--[0-->");
|
|
1945
|
+
$$renderer.push(`<div class="empty-card svelte-z6w8je">Nothing urgent has happened yet.</div>`);
|
|
1946
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1947
|
+
$$renderer.push(`<!--]--> <!--[-->`);
|
|
1948
|
+
const each_array = ensure_array_like(latestAttention());
|
|
1949
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
1950
|
+
let item = each_array[$$index];
|
|
1951
|
+
$$renderer.push(`<article${attr_class(`attention-item attention-item--${stringify(item.severity)}`, "svelte-z6w8je")}><div class="attention-top svelte-z6w8je"><strong class="svelte-z6w8je">${escape_html(item.title)}</strong> <span class="svelte-z6w8je">${escape_html(fmtTime(item.timestamp))}</span></div> <p class="svelte-z6w8je">${escape_html(item.detail)}</p> `);
|
|
1952
|
+
if (item.sessionId) {
|
|
1953
|
+
$$renderer.push("<!--[0-->");
|
|
1954
|
+
const sessionTitle = sessions.find((s) => s.id === item.sessionId)?.title;
|
|
1955
|
+
$$renderer.push(`<button class="attention-session mono svelte-z6w8je" type="button"${attr("aria-label", item.sessionId)}>${escape_html(sessionTitle || `Session ${item.sessionId.slice(0, 8)}…`)}</button>`);
|
|
1956
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1957
|
+
$$renderer.push(`<!--]--></article>`);
|
|
1958
|
+
}
|
|
1959
|
+
$$renderer.push(`<!--]--></div> <div class="subsection-head svelte-z6w8je"><h4 class="svelte-z6w8je">Live event feed</h4> <span class="svelte-z6w8je">${escape_html(eventFeed.length)}</span></div> <div class="feed-list svelte-z6w8je">`);
|
|
1960
|
+
if (eventFeed.length === 0) {
|
|
1961
|
+
$$renderer.push("<!--[0-->");
|
|
1962
|
+
$$renderer.push(`<div class="empty-card svelte-z6w8je">Waiting for OpenCode events...</div>`);
|
|
1963
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1964
|
+
$$renderer.push(`<!--]--> <!--[-->`);
|
|
1965
|
+
const each_array_1 = ensure_array_like(eventFeed.slice(0, 12));
|
|
1966
|
+
for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
|
|
1967
|
+
let event = each_array_1[$$index_1];
|
|
1968
|
+
$$renderer.push(`<article class="feed-row svelte-z6w8je"><div class="feed-top svelte-z6w8je"><span class="feed-type mono svelte-z6w8je">${escape_html(event.type)}</span> <span class="svelte-z6w8je">${escape_html(fmtTime(event.timestamp))}</span></div> <strong class="svelte-z6w8je">${escape_html(event.title)}</strong> `);
|
|
1969
|
+
if (event.toolState) {
|
|
1970
|
+
$$renderer.push("<!--[0-->");
|
|
1971
|
+
ToolStrip($$renderer, {
|
|
1972
|
+
items: [event.toolState],
|
|
1973
|
+
ariaLabel: "Activity tool event"
|
|
1974
|
+
});
|
|
1975
|
+
} else if (event.detail) {
|
|
1976
|
+
$$renderer.push("<!--[1-->");
|
|
1977
|
+
$$renderer.push(`<p class="svelte-z6w8je">${escape_html(event.detail)}</p>`);
|
|
1978
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1979
|
+
$$renderer.push(`<!--]--> `);
|
|
1980
|
+
if (event.sessionId) {
|
|
1981
|
+
$$renderer.push("<!--[0-->");
|
|
1982
|
+
const sessionTitle = sessions.find((s) => s.id === event.sessionId)?.title;
|
|
1983
|
+
$$renderer.push(`<button class="attention-session mono svelte-z6w8je" type="button"${attr("aria-label", event.sessionId)}>${escape_html(sessionTitle || `Session ${event.sessionId.slice(0, 8)}…`)}</button>`);
|
|
1984
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1985
|
+
$$renderer.push(`<!--]--></article>`);
|
|
1986
|
+
}
|
|
1987
|
+
$$renderer.push(`<!--]--></div></section> <section class="card-section svelte-z6w8je"><div class="card-head svelte-z6w8je"><h3 class="svelte-z6w8je">Recent sessions</h3> <span class="svelte-z6w8je">${escape_html(sessions.length)}</span></div> <div class="session-list svelte-z6w8je">`);
|
|
1988
|
+
if (sessions.length === 0 && true) {
|
|
1989
|
+
$$renderer.push("<!--[0-->");
|
|
1990
|
+
$$renderer.push(`<div class="empty-card svelte-z6w8je">No sessions found on the active assistant endpoint.</div>`);
|
|
1991
|
+
} else $$renderer.push("<!--[-1-->");
|
|
1992
|
+
$$renderer.push(`<!--]--> <!--[-->`);
|
|
1993
|
+
const each_array_2 = ensure_array_like(sessions.slice(0, 12));
|
|
1994
|
+
for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
|
|
1995
|
+
let session = each_array_2[$$index_2];
|
|
1996
|
+
$$renderer.push(`<button${attr_class("session-row svelte-z6w8je", void 0, { "selected": selectedSessionId === session.id })}><div><div class="session-title svelte-z6w8je">${escape_html(session.title || "Untitled session")}</div> <div class="session-meta svelte-z6w8je">Updated ${escape_html(fmtDateTime(session.updatedAt))}</div></div> <div class="session-stats svelte-z6w8je"><strong>${escape_html(sessionEventCounts[session.id] ?? 0)} evt</strong> <span class="session-id mono svelte-z6w8je">${escape_html(session.id.slice(0, 12))}...</span></div></button>`);
|
|
1997
|
+
}
|
|
1998
|
+
$$renderer.push(`<!--]--></div> <div class="subsection-head svelte-z6w8je"><h4 class="svelte-z6w8je">Event breakdown</h4> <span class="svelte-z6w8je">${escape_html(eventTypeRows().length)}</span></div> <div class="table-scroll svelte-z6w8je"><table class="data-table svelte-z6w8je"><thead><tr><th class="svelte-z6w8je">Type</th><th class="svelte-z6w8je">Total</th></tr></thead><tbody>`);
|
|
1999
|
+
if (eventTypeRows().length === 0) {
|
|
2000
|
+
$$renderer.push("<!--[0-->");
|
|
2001
|
+
$$renderer.push(`<tr class="svelte-z6w8je"><td colspan="2" class="empty-cell svelte-z6w8je">No events observed yet.</td></tr>`);
|
|
2002
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2003
|
+
$$renderer.push(`<!--]--><!--[-->`);
|
|
2004
|
+
const each_array_3 = ensure_array_like(eventTypeRows());
|
|
2005
|
+
for (let $$index_3 = 0, $$length = each_array_3.length; $$index_3 < $$length; $$index_3++) {
|
|
2006
|
+
let [type, count] = each_array_3[$$index_3];
|
|
2007
|
+
$$renderer.push(`<tr class="svelte-z6w8je"><td class="mono svelte-z6w8je">${escape_html(type)}</td><td class="svelte-z6w8je">${escape_html(count)}</td></tr>`);
|
|
2008
|
+
}
|
|
2009
|
+
$$renderer.push(`<!--]--></tbody></table></div> <div class="subsection-head svelte-z6w8je"><h4 class="svelte-z6w8je">Most active sessions</h4> <span class="svelte-z6w8je">${escape_html(hotSessions().length)}</span></div> <div class="hot-session-list svelte-z6w8je">`);
|
|
2010
|
+
if (hotSessions().length === 0) {
|
|
2011
|
+
$$renderer.push("<!--[0-->");
|
|
2012
|
+
$$renderer.push(`<div class="empty-card svelte-z6w8je">No session activity captured yet.</div>`);
|
|
2013
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2014
|
+
$$renderer.push(`<!--]--> <!--[-->`);
|
|
2015
|
+
const each_array_4 = ensure_array_like(hotSessions());
|
|
2016
|
+
for (let $$index_4 = 0, $$length = each_array_4.length; $$index_4 < $$length; $$index_4++) {
|
|
2017
|
+
let session = each_array_4[$$index_4];
|
|
2018
|
+
$$renderer.push(`<div class="hot-session-row svelte-z6w8je"><div><div class="session-title svelte-z6w8je">${escape_html(session.title || "Untitled session")}</div> <div class="session-meta mono svelte-z6w8je">${escape_html(session.id)}</div></div> <strong>${escape_html(session.events)}</strong></div>`);
|
|
2019
|
+
}
|
|
2020
|
+
$$renderer.push(`<!--]--></div></section></div> <section class="card-section session-details svelte-z6w8je"><div class="card-head svelte-z6w8je"><h3 class="svelte-z6w8je">Selected session</h3> `);
|
|
2021
|
+
if (selectedSession()) {
|
|
2022
|
+
$$renderer.push("<!--[0-->");
|
|
2023
|
+
$$renderer.push(`<span class="svelte-z6w8je">${escape_html(selectedSession().title || selectedSession().id)}</span>`);
|
|
2024
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2025
|
+
$$renderer.push(`<!--]--></div> `);
|
|
2026
|
+
if (selectedSession()) {
|
|
2027
|
+
$$renderer.push("<!--[0-->");
|
|
2028
|
+
$$renderer.push(`<div class="selected-meta svelte-z6w8je"><div class="svelte-z6w8je"><span class="svelte-z6w8je">Created</span><strong class="svelte-z6w8je">${escape_html(fmtDateTime(selectedSession().createdAt))}</strong></div> <div class="svelte-z6w8je"><span class="svelte-z6w8je">Updated</span><strong class="svelte-z6w8je">${escape_html(fmtDateTime(selectedSession().updatedAt))}</strong></div> <div class="svelte-z6w8je"><span class="svelte-z6w8je">Session ID</span><strong class="mono svelte-z6w8je">${escape_html(selectedSession().id)}</strong></div> <div class="svelte-z6w8je"><span class="svelte-z6w8je">Events seen</span><strong class="svelte-z6w8je">${escape_html(sessionEventCounts[selectedSession().id] ?? 0)}</strong></div></div> <div class="message-panel-head svelte-z6w8je"><span>Recent activity</span> <button class="btn btn-ghost btn-sm"${attr("disabled", messagesLoading, true)}>`);
|
|
2029
|
+
$$renderer.push("<!--[-1-->");
|
|
2030
|
+
$$renderer.push(`<!--]--> Refresh</button></div> `);
|
|
2031
|
+
if (selectedMessages.length === 0 && true) {
|
|
2032
|
+
$$renderer.push("<!--[0-->");
|
|
2033
|
+
$$renderer.push(`<div class="empty-card svelte-z6w8je">No chat or tool activity available for this session yet.</div>`);
|
|
2034
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2035
|
+
$$renderer.push(`<!--]--> <div class="selected-message-list svelte-z6w8je"><!--[-->`);
|
|
2036
|
+
const each_array_5 = ensure_array_like(selectedMessages.slice(-12));
|
|
2037
|
+
for (let $$index_5 = 0, $$length = each_array_5.length; $$index_5 < $$length; $$index_5++) {
|
|
2038
|
+
let entry = each_array_5[$$index_5];
|
|
2039
|
+
ChatMessage($$renderer, { entry });
|
|
2040
|
+
}
|
|
2041
|
+
$$renderer.push(`<!--]--></div>`);
|
|
2042
|
+
} else {
|
|
2043
|
+
$$renderer.push("<!--[-1-->");
|
|
2044
|
+
$$renderer.push(`<div class="empty-card svelte-z6w8je">Select a session to inspect its recent chat and tool activity.</div>`);
|
|
2045
|
+
}
|
|
2046
|
+
$$renderer.push(`<!--]--></section></div>`);
|
|
2047
|
+
});
|
|
2048
|
+
}
|
|
2049
|
+
//#endregion
|
|
2050
|
+
//#region src/lib/components/akm/AkmKnowledgeStatsSection.svelte
|
|
2051
|
+
function AkmKnowledgeStatsSection($$renderer, $$props) {
|
|
2052
|
+
$$renderer.component(($$renderer) => {
|
|
2053
|
+
let { disabled } = $$props;
|
|
2054
|
+
$$renderer.push(`<section class="stats-section svelte-1jrmvb5"><div class="stats-header svelte-1jrmvb5"><div><h3 class="svelte-1jrmvb5">Knowledge & Learning</h3> <p class="section-note">Read-only AKM health, memory counts, improve activity, and pending proposals from live CLI JSON output.</p></div> <button class="btn btn-secondary btn-sm" type="button"${attr("disabled", disabled, true)}>`);
|
|
2055
|
+
$$renderer.push("<!--[-1-->");
|
|
2056
|
+
$$renderer.push(`<!--]--> Refresh stats</button></div> `);
|
|
2057
|
+
$$renderer.push("<!--[1-->");
|
|
2058
|
+
$$renderer.push(`<div class="stats-loading svelte-1jrmvb5">`);
|
|
2059
|
+
Spinner($$renderer, {});
|
|
2060
|
+
$$renderer.push(`<!----> <span>Loading knowledge stats…</span></div>`);
|
|
2061
|
+
$$renderer.push(`<!--]--></section>`);
|
|
2062
|
+
});
|
|
2063
|
+
}
|
|
2064
|
+
//#endregion
|
|
2065
|
+
//#region ../ui-kit/src/lib/components/common/PasswordInput.svelte
|
|
2066
|
+
function PasswordInput($$renderer, $$props) {
|
|
2067
|
+
$$renderer.component(($$renderer) => {
|
|
2068
|
+
let { value = "", id, placeholder, disabled = false } = $$props;
|
|
2069
|
+
$$renderer.push(`<div class="input-with-toggle svelte-df4dyz"><input${attr("id", id)} class="control-input svelte-df4dyz"${attr("type", "password")} spellcheck="false" autocomplete="new-password"${attr("placeholder", placeholder)}${attr("value", value)}${attr("disabled", disabled, true)}/> <button type="button" class="btn-icon svelte-df4dyz"${attr("aria-label", "Show value")}${attr("disabled", disabled, true)}>${escape_html("Show")}</button></div>`);
|
|
2070
|
+
bind_props($$props, { value });
|
|
2071
|
+
});
|
|
2072
|
+
}
|
|
2073
|
+
//#endregion
|
|
2074
|
+
//#region src/lib/components/akm/EmbeddingSection.svelte
|
|
2075
|
+
function EmbeddingSection($$renderer, $$props) {
|
|
2076
|
+
$$renderer.component(($$renderer) => {
|
|
2077
|
+
let { endpoint = "", model = "", provider = "", apiKey = "", dimension = 1536, localModel = "", batchSize = "", chunkSize = "", contextLength = "", ollamaNumCtx = "", disabled = false, detecting = false, testing = false, ondetect, ontest } = $$props;
|
|
2078
|
+
let $$settled = true;
|
|
2079
|
+
let $$inner_renderer;
|
|
2080
|
+
function $$render_inner($$renderer) {
|
|
2081
|
+
$$renderer.push(`<section class="config-section svelte-y5k1u8"><div class="section-header svelte-y5k1u8"><h3 class="section-title svelte-y5k1u8">Semantic search (embeddings)</h3> <div class="section-actions svelte-y5k1u8"><button class="btn btn-secondary btn-sm" type="button"${attr("disabled", disabled || detecting || testing, true)}>`);
|
|
2082
|
+
if (detecting) {
|
|
2083
|
+
$$renderer.push("<!--[0-->");
|
|
2084
|
+
Spinner($$renderer, {});
|
|
2085
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2086
|
+
$$renderer.push(`<!--]--> Detect</button> <button class="btn btn-secondary btn-sm" type="button"${attr("disabled", disabled || detecting || testing, true)}>`);
|
|
2087
|
+
if (testing) {
|
|
2088
|
+
$$renderer.push("<!--[0-->");
|
|
2089
|
+
Spinner($$renderer, {});
|
|
2090
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2091
|
+
$$renderer.push(`<!--]--> Test</button></div></div> <p class="section-note svelte-y5k1u8">Vector embedding provider for semantic search. Leave Endpoint and Model blank to use built-in local embeddings.</p> <div class="controls--grid svelte-y5k1u8"><div class="control-group control-group--wide svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embEndpoint">Endpoint</label> <input id="embEndpoint" class="control-input svelte-y5k1u8" type="url" spellcheck="false" placeholder="https://api.openai.com/v1/embeddings"${attr("value", endpoint)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embModel">Model</label> <input id="embModel" class="control-input svelte-y5k1u8" type="text" spellcheck="false" placeholder="text-embedding-3-small"${attr("value", model)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embProvider">Provider (label)</label> <input id="embProvider" class="control-input svelte-y5k1u8" type="text" spellcheck="false" placeholder="openai"${attr("value", provider)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embApiKey">API Key</label> `);
|
|
2092
|
+
PasswordInput($$renderer, {
|
|
2093
|
+
id: "embApiKey",
|
|
2094
|
+
placeholder: "${AKM_EMBED_API_KEY}",
|
|
2095
|
+
disabled,
|
|
2096
|
+
get value() {
|
|
2097
|
+
return apiKey;
|
|
2098
|
+
},
|
|
2099
|
+
set value($$value) {
|
|
2100
|
+
apiKey = $$value;
|
|
2101
|
+
$$settled = false;
|
|
2102
|
+
}
|
|
2103
|
+
});
|
|
2104
|
+
$$renderer.push(`<!----></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embDimension">Dimensions</label> <input id="embDimension" class="control-input control-input--narrow svelte-y5k1u8" type="number" min="1"${attr("value", dimension)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embLocalModel">Local model</label> <input id="embLocalModel" class="control-input svelte-y5k1u8" type="text" spellcheck="false" placeholder="Xenova/bge-small-en-v1.5"${attr("value", localModel)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embBatchSize">Batch size</label> <input id="embBatchSize" class="control-input control-input--narrow svelte-y5k1u8" type="number" min="1"${attr("value", batchSize)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embChunkSize">Chunk size (chars)</label> <input id="embChunkSize" class="control-input control-input--narrow svelte-y5k1u8" type="number" min="1"${attr("value", chunkSize)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embContextLength">Context length</label> <input id="embContextLength" class="control-input control-input--narrow svelte-y5k1u8" type="number" min="1"${attr("value", contextLength)}${attr("disabled", disabled, true)}/></div> <div class="control-group svelte-y5k1u8"><label class="control-label svelte-y5k1u8" for="embOllamaNumCtx">Ollama num_ctx</label> <input id="embOllamaNumCtx" class="control-input control-input--narrow svelte-y5k1u8" type="number" min="1"${attr("value", ollamaNumCtx)}${attr("disabled", disabled, true)}/></div></div></section>`);
|
|
2105
|
+
}
|
|
2106
|
+
do {
|
|
2107
|
+
$$settled = true;
|
|
2108
|
+
$$inner_renderer = $$renderer.copy();
|
|
2109
|
+
$$render_inner($$inner_renderer);
|
|
2110
|
+
} while (!$$settled);
|
|
2111
|
+
$$renderer.subsume($$inner_renderer);
|
|
2112
|
+
bind_props($$props, {
|
|
2113
|
+
endpoint,
|
|
2114
|
+
model,
|
|
2115
|
+
provider,
|
|
2116
|
+
apiKey,
|
|
2117
|
+
dimension,
|
|
2118
|
+
localModel,
|
|
2119
|
+
batchSize,
|
|
2120
|
+
chunkSize,
|
|
2121
|
+
contextLength,
|
|
2122
|
+
ollamaNumCtx
|
|
2123
|
+
});
|
|
2124
|
+
});
|
|
2125
|
+
}
|
|
2126
|
+
//#endregion
|
|
2127
|
+
//#region src/lib/components/akm/ProfileRow.svelte
|
|
2128
|
+
function ProfileRow($$renderer, $$props) {
|
|
2129
|
+
/** Optional badges/extras rendered after the name (e.g. platform, description). */
|
|
2130
|
+
let { name, isDefault, disabled = false, extra, onsetdefault, onedit, onremove } = $$props;
|
|
2131
|
+
$$renderer.push(`<div class="profile-row svelte-zzh9mp"><span class="profile-row-name svelte-zzh9mp">${escape_html(name || "(unnamed)")}</span> `);
|
|
2132
|
+
if (extra) {
|
|
2133
|
+
$$renderer.push("<!--[0-->");
|
|
2134
|
+
extra($$renderer);
|
|
2135
|
+
$$renderer.push(`<!---->`);
|
|
2136
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2137
|
+
$$renderer.push(`<!--]--> `);
|
|
2138
|
+
if (isDefault && name) {
|
|
2139
|
+
$$renderer.push("<!--[0-->");
|
|
2140
|
+
$$renderer.push(`<span class="badge badge--default svelte-zzh9mp">Default</span>`);
|
|
2141
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2142
|
+
$$renderer.push(`<!--]--> <div class="profile-row-actions svelte-zzh9mp">`);
|
|
2143
|
+
if (name && !isDefault) {
|
|
2144
|
+
$$renderer.push("<!--[0-->");
|
|
2145
|
+
$$renderer.push(`<button class="btn btn-sm"${attr("disabled", disabled, true)}>Set Default</button>`);
|
|
2146
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2147
|
+
$$renderer.push(`<!--]--> <button class="btn btn-sm"${attr("disabled", disabled, true)}>Edit</button> <button class="btn btn-sm btn-danger"${attr("disabled", disabled, true)}>Remove</button></div></div>`);
|
|
2148
|
+
}
|
|
2149
|
+
//#endregion
|
|
2150
|
+
//#region ../ui-kit/src/lib/components/icons/IconDatabase.svelte
|
|
2151
|
+
function IconDatabase($$renderer, $$props) {
|
|
2152
|
+
let { size = 20, class: className = "" } = $$props;
|
|
2153
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M5 6.5c0-1.4 3.1-2.5 7-2.5s7 1.1 7 2.5-3.1 2.5-7 2.5-7-1.1-7-2.5z"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M5 6.5v11c0 1.4 3.1 2.5 7 2.5s7-1.1 7-2.5v-11"></path><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M5 12c0 1.4 3.1 2.5 7 2.5s7-1.1 7-2.5"></path></svg>`);
|
|
2154
|
+
}
|
|
2155
|
+
//#endregion
|
|
2156
|
+
//#region src/lib/components/akm/LlmProfilesSection.svelte
|
|
2157
|
+
function LlmProfilesSection($$renderer, $$props) {
|
|
2158
|
+
$$renderer.component(($$renderer) => {
|
|
2159
|
+
let { profiles = [], defaultName = "", disabled = false, onedit, onadd, onremove } = $$props;
|
|
2160
|
+
$$renderer.push(`<section class="config-section svelte-zwwvog"><h3 class="section-title svelte-zwwvog">Language models <span class="section-title-aka svelte-zwwvog">akm LLM profiles</span></h3> <p class="section-note svelte-zwwvog">The language models your assistant uses to organize and improve its memory. Add one per LLM service.</p> `);
|
|
2161
|
+
if (profiles.length === 0) {
|
|
2162
|
+
$$renderer.push("<!--[0-->");
|
|
2163
|
+
$$renderer.push(`<div class="profile-empty svelte-zwwvog">`);
|
|
2164
|
+
IconDatabase($$renderer, { size: 24 });
|
|
2165
|
+
$$renderer.push(`<!----> <p class="empty-note svelte-zwwvog">No LLM profiles configured — add one below.</p></div>`);
|
|
2166
|
+
} else {
|
|
2167
|
+
$$renderer.push("<!--[-1-->");
|
|
2168
|
+
$$renderer.push(`<div class="profile-list svelte-zwwvog"><!--[-->`);
|
|
2169
|
+
const each_array = ensure_array_like(profiles);
|
|
2170
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
2171
|
+
let p = each_array[$$index];
|
|
2172
|
+
ProfileRow($$renderer, {
|
|
2173
|
+
name: p.name,
|
|
2174
|
+
isDefault: defaultName === p.name,
|
|
2175
|
+
disabled,
|
|
2176
|
+
onsetdefault: () => {
|
|
2177
|
+
defaultName = p.name;
|
|
2178
|
+
},
|
|
2179
|
+
onedit: () => onedit(p),
|
|
2180
|
+
onremove: () => onremove(p.id)
|
|
2181
|
+
});
|
|
2182
|
+
}
|
|
2183
|
+
$$renderer.push(`<!--]--></div>`);
|
|
2184
|
+
}
|
|
2185
|
+
$$renderer.push(`<!--]--> <button class="btn btn-secondary btn-sm"${attr("disabled", disabled, true)}>+ Add LLM Profile</button></section>`);
|
|
2186
|
+
bind_props($$props, {
|
|
2187
|
+
profiles,
|
|
2188
|
+
defaultName
|
|
2189
|
+
});
|
|
2190
|
+
});
|
|
2191
|
+
}
|
|
2192
|
+
//#endregion
|
|
2193
|
+
//#region src/lib/components/akm/AgentProfilesSection.svelte
|
|
2194
|
+
function AgentProfilesSection($$renderer, $$props) {
|
|
2195
|
+
$$renderer.component(($$renderer) => {
|
|
2196
|
+
let { profiles = [], defaultName = "", disabled = false, onedit, onadd, onremove } = $$props;
|
|
2197
|
+
$$renderer.push(`<section class="config-section svelte-anyxpa"><h3 class="section-title svelte-anyxpa">Agent runners <span class="section-title-aka svelte-anyxpa">akm agent profiles</span></h3> <p class="section-note svelte-anyxpa">Runner configs for maintenance steps that spawn a subprocess (opencode or claude CLI).</p> `);
|
|
2198
|
+
if (profiles.length === 0) {
|
|
2199
|
+
$$renderer.push("<!--[0-->");
|
|
2200
|
+
$$renderer.push(`<div class="profile-empty svelte-anyxpa">`);
|
|
2201
|
+
IconAgent($$renderer, { size: 24 });
|
|
2202
|
+
$$renderer.push(`<!----> <p class="empty-note svelte-anyxpa">No agent profiles defined.</p></div>`);
|
|
2203
|
+
} else {
|
|
2204
|
+
$$renderer.push("<!--[-1-->");
|
|
2205
|
+
$$renderer.push(`<div class="profile-list svelte-anyxpa"><!--[-->`);
|
|
2206
|
+
const each_array = ensure_array_like(profiles);
|
|
2207
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
2208
|
+
let p = each_array[$$index];
|
|
2209
|
+
{
|
|
2210
|
+
function extra($$renderer) {
|
|
2211
|
+
$$renderer.push(`<span class="badge svelte-anyxpa">${escape_html(p.platform)}</span>`);
|
|
2212
|
+
}
|
|
2213
|
+
ProfileRow($$renderer, {
|
|
2214
|
+
name: p.name,
|
|
2215
|
+
isDefault: defaultName === p.name,
|
|
2216
|
+
disabled,
|
|
2217
|
+
onsetdefault: () => {
|
|
2218
|
+
defaultName = p.name;
|
|
2219
|
+
},
|
|
2220
|
+
onedit: () => onedit(p),
|
|
2221
|
+
onremove: () => onremove(p.id),
|
|
2222
|
+
extra});
|
|
2223
|
+
}
|
|
2224
|
+
}
|
|
2225
|
+
$$renderer.push(`<!--]--></div>`);
|
|
2226
|
+
}
|
|
2227
|
+
$$renderer.push(`<!--]--> <button class="btn btn-secondary btn-sm"${attr("disabled", disabled, true)}>+ Add Agent Profile</button></section>`);
|
|
2228
|
+
bind_props($$props, {
|
|
2229
|
+
profiles,
|
|
2230
|
+
defaultName
|
|
2231
|
+
});
|
|
2232
|
+
});
|
|
2233
|
+
}
|
|
2234
|
+
//#endregion
|
|
2235
|
+
//#region ../ui-kit/src/lib/components/icons/IconFlame.svelte
|
|
2236
|
+
function IconFlame($$renderer, $$props) {
|
|
2237
|
+
let { size = 20, class: className = "" } = $$props;
|
|
2238
|
+
$$renderer.push(`<svg aria-hidden="true"${attr("width", size)}${attr("height", size)} viewBox="0 0 24 24"${attr_class(`s-icon ${stringify(className)}`)}><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M12 22c-3.3 0-5.5-2-5.5-4.5 0-3 2.5-5 3.5-7 .5 1.5 1.5 2 2 3 .5-2.5 1-5.5 1.5-8 1.5 2.5 2 5.5 1.5 8.5.5-1.5 1-3 .5-4.5 1 2 1.5 4 0 5.5 0 2.5-1.5 7-3.5 7z"></path></svg>`);
|
|
2239
|
+
}
|
|
2240
|
+
//#endregion
|
|
2241
|
+
//#region src/lib/components/akm/ImproveProfilesSection.svelte
|
|
2242
|
+
function ImproveProfilesSection($$renderer, $$props) {
|
|
2243
|
+
$$renderer.component(($$renderer) => {
|
|
2244
|
+
let { profiles = [], defaultName = "", disabled = false, onedit, onadd, onremove } = $$props;
|
|
2245
|
+
$$renderer.push(`<section class="config-section svelte-1ngozvb"><h3 class="section-title svelte-1ngozvb">Memory maintenance <span class="section-title-aka svelte-1ngozvb">akm improve</span></h3> <p class="section-note svelte-1ngozvb">Scheduled runs that distill, deduplicate, and improve stored memories. Each configuration picks which steps run and which language model they use — add a language model above first.</p> `);
|
|
2246
|
+
if (profiles.length === 0) {
|
|
2247
|
+
$$renderer.push("<!--[0-->");
|
|
2248
|
+
$$renderer.push(`<div class="profile-empty svelte-1ngozvb">`);
|
|
2249
|
+
IconFlame($$renderer, { size: 24 });
|
|
2250
|
+
$$renderer.push(`<!----> <p class="empty-note svelte-1ngozvb">No improve profiles defined — add one below.</p></div>`);
|
|
2251
|
+
} else {
|
|
2252
|
+
$$renderer.push("<!--[-1-->");
|
|
2253
|
+
$$renderer.push(`<div class="profile-list svelte-1ngozvb"><!--[-->`);
|
|
2254
|
+
const each_array = ensure_array_like(profiles);
|
|
2255
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
2256
|
+
let ip = each_array[$$index];
|
|
2257
|
+
{
|
|
2258
|
+
function extra($$renderer) {
|
|
2259
|
+
if (ip.description) {
|
|
2260
|
+
$$renderer.push("<!--[0-->");
|
|
2261
|
+
$$renderer.push(`<span class="profile-row-desc svelte-1ngozvb">${escape_html(ip.description)}</span>`);
|
|
2262
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2263
|
+
$$renderer.push(`<!--]-->`);
|
|
2264
|
+
}
|
|
2265
|
+
ProfileRow($$renderer, {
|
|
2266
|
+
name: ip.name,
|
|
2267
|
+
isDefault: defaultName === ip.name,
|
|
2268
|
+
disabled,
|
|
2269
|
+
onsetdefault: () => {
|
|
2270
|
+
defaultName = ip.name;
|
|
2271
|
+
},
|
|
2272
|
+
onedit: () => onedit(ip),
|
|
2273
|
+
onremove: () => onremove(ip.id),
|
|
2274
|
+
extra});
|
|
2275
|
+
}
|
|
2276
|
+
}
|
|
2277
|
+
$$renderer.push(`<!--]--></div>`);
|
|
2278
|
+
}
|
|
2279
|
+
$$renderer.push(`<!--]--> <button class="btn btn-secondary btn-sm"${attr("disabled", disabled, true)}>+ Add Improve Profile</button></section>`);
|
|
2280
|
+
bind_props($$props, {
|
|
2281
|
+
profiles,
|
|
2282
|
+
defaultName
|
|
2283
|
+
});
|
|
2284
|
+
});
|
|
2285
|
+
}
|
|
2286
|
+
//#endregion
|
|
2287
|
+
//#region src/lib/components/akm/LlmProfileDrawer.svelte
|
|
2288
|
+
function LlmProfileDrawer($$renderer, $$props) {
|
|
2289
|
+
$$renderer.component(($$renderer) => {
|
|
2290
|
+
let { draft = void 0, oncancel, onapply } = $$props;
|
|
2291
|
+
let $$settled = true;
|
|
2292
|
+
let $$inner_renderer;
|
|
2293
|
+
function $$render_inner($$renderer) {
|
|
2294
|
+
$$renderer.push(`<div class="drawer-scrim svelte-1gmn25z" role="presentation"></div> <div class="drawer svelte-1gmn25z" role="dialog" aria-modal="true" aria-label="Edit profile"><div class="drawer-header svelte-1gmn25z"><h3 class="drawer-title svelte-1gmn25z">LLM Profile</h3> <button class="drawer-close svelte-1gmn25z" aria-label="Close">✕</button></div> <div class="drawer-body svelte-1gmn25z"><div class="controls controls--grid svelte-1gmn25z"><div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-name">Profile Name</label> <input id="d-llm-name" class="control-input svelte-1gmn25z" type="text" spellcheck="false" placeholder="e.g. default"${attr("value", draft.name)}/></div> <div class="control-group control-group--wide svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-endpoint">Endpoint</label> <input id="d-llm-endpoint" class="control-input svelte-1gmn25z" type="url" spellcheck="false" placeholder="https://api.openai.com/v1/chat/completions"${attr("value", draft.endpoint)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-model">Model</label> <input id="d-llm-model" class="control-input svelte-1gmn25z" type="text" spellcheck="false" placeholder="gpt-4o-mini"${attr("value", draft.model)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-provider">Provider (label)</label> <input id="d-llm-provider" class="control-input svelte-1gmn25z" type="text" spellcheck="false" placeholder="openai"${attr("value", draft.provider)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-apikey">API Key</label> `);
|
|
2295
|
+
PasswordInput($$renderer, {
|
|
2296
|
+
id: "d-llm-apikey",
|
|
2297
|
+
placeholder: "${AKM_LLM_API_KEY}",
|
|
2298
|
+
get value() {
|
|
2299
|
+
return draft.apiKey;
|
|
2300
|
+
},
|
|
2301
|
+
set value($$value) {
|
|
2302
|
+
draft.apiKey = $$value;
|
|
2303
|
+
$$settled = false;
|
|
2304
|
+
}
|
|
2305
|
+
});
|
|
2306
|
+
$$renderer.push(`<!----></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-temperature">Temperature (0–2)</label> <input id="d-llm-temperature" class="control-input control-input--narrow svelte-1gmn25z" type="number" min="0" max="2" step="0.1"${attr("value", draft.temperature)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-maxtokens">Max tokens</label> <input id="d-llm-maxtokens" class="control-input control-input--narrow svelte-1gmn25z" type="number" min="1"${attr("value", draft.maxTokens)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-timeout">Timeout (ms)</label> <input id="d-llm-timeout" class="control-input control-input--narrow svelte-1gmn25z" type="number" min="1"${attr("value", draft.timeoutMs)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-concurrency">Concurrency</label> <input id="d-llm-concurrency" class="control-input control-input--narrow svelte-1gmn25z" type="number" min="1"${attr("value", draft.concurrency)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-contextlength">Context length</label> <input id="d-llm-contextlength" class="control-input control-input--narrow svelte-1gmn25z" type="number" min="1"${attr("value", draft.contextLength)}/></div> <div class="control-group svelte-1gmn25z"><label class="control-label svelte-1gmn25z" for="d-llm-judgemodel">Judge model</label> <input id="d-llm-judgemodel" class="control-input svelte-1gmn25z" type="text" spellcheck="false" placeholder="gpt-4o"${attr("value", draft.judgeModel)}/></div></div> <label class="toggle-row svelte-1gmn25z" style="margin-top: var(--s-sp-4)"><input type="checkbox"${attr("checked", draft.supportsJsonSchema, true)} class="svelte-1gmn25z"/> <span class="toggle-label svelte-1gmn25z">Supports JSON schema</span> <span class="toggle-hint svelte-1gmn25z">Use response_format: json_schema for structured output</span></label> <label class="toggle-row svelte-1gmn25z"><input type="checkbox"${attr("checked", draft.structuredOutput, true)} class="svelte-1gmn25z"/> <span class="toggle-label svelte-1gmn25z">Structured output capability</span> <span class="toggle-hint svelte-1gmn25z">capabilities.structuredOutput — model reliably returns valid structured JSON</span></label> <label class="toggle-row svelte-1gmn25z"><input type="checkbox"${attr("checked", draft.enableThinking, true)} class="svelte-1gmn25z"/> <span class="toggle-label svelte-1gmn25z">Enable thinking</span> <span class="toggle-hint svelte-1gmn25z">Allow extended/thinking tokens for reasoning models</span></label> <div class="control-group control-group--wide svelte-1gmn25z" style="margin-top: var(--s-sp-4)"><label class="control-label svelte-1gmn25z" for="d-llm-extra">Extra params (JSON)</label> <textarea id="d-llm-extra" class="control-input svelte-1gmn25z" rows="3" spellcheck="false" placeholder="{ "top_p": 0.9 }">`);
|
|
2307
|
+
const $$body = escape_html(draft.extraParams);
|
|
2308
|
+
if ($$body) $$renderer.push(`${$$body}`);
|
|
2309
|
+
$$renderer.push(`</textarea> <span class="feat-hint svelte-1gmn25z">Merged into the provider request body. Must be a JSON object.</span></div></div> <div class="drawer-footer svelte-1gmn25z"><button class="btn btn-secondary">Cancel</button> <button class="btn btn-primary">Apply</button></div></div>`);
|
|
2310
|
+
}
|
|
2311
|
+
do {
|
|
2312
|
+
$$settled = true;
|
|
2313
|
+
$$inner_renderer = $$renderer.copy();
|
|
2314
|
+
$$render_inner($$inner_renderer);
|
|
2315
|
+
} while (!$$settled);
|
|
2316
|
+
$$renderer.subsume($$inner_renderer);
|
|
2317
|
+
bind_props($$props, { draft });
|
|
2318
|
+
});
|
|
2319
|
+
}
|
|
2320
|
+
//#endregion
|
|
2321
|
+
//#region src/lib/components/akm/AgentProfileDrawer.svelte
|
|
2322
|
+
function AgentProfileDrawer($$renderer, $$props) {
|
|
2323
|
+
$$renderer.component(($$renderer) => {
|
|
2324
|
+
let { draft = void 0, oncancel, onapply } = $$props;
|
|
2325
|
+
$$renderer.push(`<div class="drawer-scrim svelte-1evj0pt" role="presentation"></div> <div class="drawer svelte-1evj0pt" role="dialog" aria-modal="true" aria-label="Edit profile"><div class="drawer-header svelte-1evj0pt"><h3 class="drawer-title svelte-1evj0pt">Agent Profile</h3> <button class="drawer-close svelte-1evj0pt" aria-label="Close">✕</button></div> <div class="drawer-body svelte-1evj0pt"><div class="controls controls--grid svelte-1evj0pt"><div class="control-group svelte-1evj0pt"><label class="control-label svelte-1evj0pt" for="d-agent-name">Profile Name</label> <input id="d-agent-name" class="control-input svelte-1evj0pt" type="text" spellcheck="false" placeholder="e.g. opencode"${attr("value", draft.name)}/></div> <div class="control-group svelte-1evj0pt"><label class="control-label svelte-1evj0pt" for="d-agent-platform">Platform</label> `);
|
|
2326
|
+
$$renderer.select({
|
|
2327
|
+
id: "d-agent-platform",
|
|
2328
|
+
class: "control-input",
|
|
2329
|
+
value: draft.platform
|
|
2330
|
+
}, ($$renderer) => {
|
|
2331
|
+
$$renderer.option({ value: "opencode" }, ($$renderer) => {
|
|
2332
|
+
$$renderer.push(`opencode`);
|
|
2333
|
+
});
|
|
2334
|
+
$$renderer.option({ value: "claude" }, ($$renderer) => {
|
|
2335
|
+
$$renderer.push(`claude`);
|
|
2336
|
+
});
|
|
2337
|
+
$$renderer.option({ value: "opencode-sdk" }, ($$renderer) => {
|
|
2338
|
+
$$renderer.push(`opencode-sdk`);
|
|
2339
|
+
});
|
|
2340
|
+
}, "svelte-1evj0pt");
|
|
2341
|
+
$$renderer.push(`</div> `);
|
|
2342
|
+
if (draft.platform !== "opencode-sdk") {
|
|
2343
|
+
$$renderer.push("<!--[0-->");
|
|
2344
|
+
$$renderer.push(`<div class="control-group svelte-1evj0pt"><label class="control-label svelte-1evj0pt" for="d-agent-bin">Binary</label> <input id="d-agent-bin" class="control-input svelte-1evj0pt" type="text" spellcheck="false" placeholder="opencode"${attr("value", draft.bin)}/></div> <div class="control-group control-group--wide svelte-1evj0pt"><label class="control-label svelte-1evj0pt" for="d-agent-args">Extra args (space-separated)</label> <input id="d-agent-args" class="control-input svelte-1evj0pt" type="text" spellcheck="false" placeholder="run --model gpt-4o"${attr("value", draft.args)}/></div>`);
|
|
2345
|
+
} else {
|
|
2346
|
+
$$renderer.push("<!--[-1-->");
|
|
2347
|
+
$$renderer.push(`<div class="control-group svelte-1evj0pt"><label class="control-label svelte-1evj0pt" for="d-agent-model">Model</label> <input id="d-agent-model" class="control-input svelte-1evj0pt" type="text" spellcheck="false" placeholder="anthropic/claude-sonnet-4-5"${attr("value", draft.model)}/></div> <div class="control-group svelte-1evj0pt"><label class="control-label svelte-1evj0pt" for="d-agent-workspace">Workspace</label> <input id="d-agent-workspace" class="control-input svelte-1evj0pt" type="text" spellcheck="false" placeholder="\${PWD}"${attr("value", draft.workspace)}/></div>`);
|
|
2348
|
+
}
|
|
2349
|
+
$$renderer.push(`<!--]--></div></div> <div class="drawer-footer svelte-1evj0pt"><button class="btn btn-secondary">Cancel</button> <button class="btn btn-primary">Apply</button></div></div>`);
|
|
2350
|
+
bind_props($$props, { draft });
|
|
2351
|
+
});
|
|
2352
|
+
}
|
|
2353
|
+
//#endregion
|
|
2354
|
+
//#region src/lib/components/akm/improve-process-helpers.ts
|
|
2355
|
+
var PROCESS_KEYS = [
|
|
2356
|
+
"reflect",
|
|
2357
|
+
"distill",
|
|
2358
|
+
"consolidate",
|
|
2359
|
+
"validation",
|
|
2360
|
+
"memoryInference",
|
|
2361
|
+
"graphExtraction",
|
|
2362
|
+
"extract",
|
|
2363
|
+
"triage"
|
|
2364
|
+
];
|
|
2365
|
+
var PROCESS_HINTS = {
|
|
2366
|
+
reflect: "Propose stash updates via self-reflection",
|
|
2367
|
+
distill: "Quality-judge and distill feedback",
|
|
2368
|
+
consolidate: "Deduplicate and merge overlapping memories",
|
|
2369
|
+
validation: "Third-model confidence and staleness scoring",
|
|
2370
|
+
memoryInference: "Derive structured memories from pending files",
|
|
2371
|
+
graphExtraction: "Extract entities and relations for graph search",
|
|
2372
|
+
extract: "Read session logs and queue insight proposals",
|
|
2373
|
+
triage: "Auto-review and accept/promote queued proposals"
|
|
2374
|
+
};
|
|
2375
|
+
var DEFAULT_ENABLED = {
|
|
2376
|
+
reflect: true,
|
|
2377
|
+
distill: true,
|
|
2378
|
+
consolidate: false,
|
|
2379
|
+
validation: false,
|
|
2380
|
+
memoryInference: true,
|
|
2381
|
+
graphExtraction: true,
|
|
2382
|
+
extract: true,
|
|
2383
|
+
triage: false
|
|
2384
|
+
};
|
|
2385
|
+
function emptyFEntry(enabled) {
|
|
2386
|
+
return {
|
|
2387
|
+
enabled,
|
|
2388
|
+
mode: "",
|
|
2389
|
+
profile: "",
|
|
2390
|
+
timeoutMs: "",
|
|
2391
|
+
allowedTypes: "",
|
|
2392
|
+
qualityGate: "",
|
|
2393
|
+
contradictionDetection: "",
|
|
2394
|
+
defaultSince: "",
|
|
2395
|
+
maxTotalChars: "",
|
|
2396
|
+
maxChunkSize: "",
|
|
2397
|
+
applyMode: "",
|
|
2398
|
+
policy: "",
|
|
2399
|
+
maxAcceptsPerRun: "",
|
|
2400
|
+
maxDiffLines: "",
|
|
2401
|
+
rejectEmpty: false,
|
|
2402
|
+
judgment: {
|
|
2403
|
+
mode: "",
|
|
2404
|
+
profile: "",
|
|
2405
|
+
timeoutMs: ""
|
|
2406
|
+
},
|
|
2407
|
+
rest: {}
|
|
2408
|
+
};
|
|
2409
|
+
}
|
|
2410
|
+
//#endregion
|
|
2411
|
+
//#region src/lib/components/akm/ImproveProfileDrawer.svelte
|
|
2412
|
+
function ImproveProfileDrawer($$renderer, $$props) {
|
|
2413
|
+
$$renderer.component(($$renderer) => {
|
|
2414
|
+
let { draft = void 0, llmProfileNames, oncancel, onapply } = $$props;
|
|
2415
|
+
$$renderer.push(`<datalist id="llm-profiles-list"><!--[-->`);
|
|
2416
|
+
const each_array = ensure_array_like(llmProfileNames);
|
|
2417
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
2418
|
+
let name = each_array[$$index];
|
|
2419
|
+
$$renderer.option({ value: name }, ($$renderer) => {});
|
|
2420
|
+
}
|
|
2421
|
+
$$renderer.push(`<!--]--></datalist> <div class="drawer-scrim svelte-1ndbe78" role="presentation"></div> <div class="drawer svelte-1ndbe78" role="dialog" aria-modal="true" aria-label="Edit profile"><div class="drawer-header svelte-1ndbe78"><h3 class="drawer-title svelte-1ndbe78">Improve Profile</h3> <button class="drawer-close svelte-1ndbe78" aria-label="Close">✕</button></div> <div class="drawer-body svelte-1ndbe78"><div class="controls controls--grid svelte-1ndbe78"><div class="control-group svelte-1ndbe78"><label class="control-label svelte-1ndbe78" for="d-imp-name">Profile Name</label> <input id="d-imp-name" class="control-input svelte-1ndbe78" type="text" spellcheck="false" placeholder="e.g. default"${attr("value", draft.name)}/></div> <div class="control-group control-group--wide svelte-1ndbe78"><label class="control-label svelte-1ndbe78" for="d-imp-desc">Description</label> <input id="d-imp-desc" class="control-input svelte-1ndbe78" type="text" spellcheck="false" placeholder="Optional description"${attr("value", draft.description)}/></div> <div class="control-group svelte-1ndbe78"><label class="control-label svelte-1ndbe78" for="d-imp-limit">Max proposals per run</label> <input id="d-imp-limit" class="control-input control-input--narrow svelte-1ndbe78" type="number" min="1" max="100"${attr("value", draft.limit)}/></div> <div class="control-group svelte-1ndbe78"><label class="control-label svelte-1ndbe78" for="d-imp-autoacc">Auto-accept threshold (0 = manual)</label> <input id="d-imp-autoacc" class="control-input control-input--narrow svelte-1ndbe78" type="number" min="0" max="1" step="0.05"${attr("value", draft.autoAccept)}/></div></div> <div class="proc-list svelte-1ndbe78"><!--[-->`);
|
|
2422
|
+
const each_array_1 = ensure_array_like(PROCESS_KEYS);
|
|
2423
|
+
for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
|
|
2424
|
+
let key = each_array_1[$$index_1];
|
|
2425
|
+
const proc = draft.processes[key];
|
|
2426
|
+
$$renderer.push(`<div class="proc-card svelte-1ndbe78"><div class="proc-head svelte-1ndbe78"><input type="checkbox"${attr("checked", proc.enabled, true)}${attr("aria-label", `${stringify(key)} enabled`)} class="svelte-1ndbe78"/> <div class="proc-name svelte-1ndbe78"><span class="feat-name svelte-1ndbe78">${escape_html(key)}</span><span class="feat-hint svelte-1ndbe78">${escape_html(PROCESS_HINTS[key])}</span></div> `);
|
|
2427
|
+
$$renderer.select({
|
|
2428
|
+
class: "control-input",
|
|
2429
|
+
value: proc.mode,
|
|
2430
|
+
"aria-label": `${stringify(key)} mode`
|
|
2431
|
+
}, ($$renderer) => {
|
|
2432
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
2433
|
+
$$renderer.push(`Default mode`);
|
|
2434
|
+
});
|
|
2435
|
+
$$renderer.option({ value: "llm" }, ($$renderer) => {
|
|
2436
|
+
$$renderer.push(`LLM (direct call)`);
|
|
2437
|
+
});
|
|
2438
|
+
$$renderer.option({ value: "agent" }, ($$renderer) => {
|
|
2439
|
+
$$renderer.push(`Agent (subprocess)`);
|
|
2440
|
+
});
|
|
2441
|
+
$$renderer.option({ value: "sdk" }, ($$renderer) => {
|
|
2442
|
+
$$renderer.push(`SDK (programmatic)`);
|
|
2443
|
+
});
|
|
2444
|
+
}, "svelte-1ndbe78");
|
|
2445
|
+
$$renderer.push(` <input class="control-input svelte-1ndbe78" type="text" spellcheck="false" list="llm-profiles-list" placeholder="— default profile —"${attr("value", proc.profile)}${attr("aria-label", `${stringify(key)} profile`)}/> <input class="control-input control-input--narrow svelte-1ndbe78" type="number" min="1" placeholder="timeout ms"${attr("value", proc.timeoutMs)}${attr("aria-label", `${stringify(key)} timeout`)}/></div> <details class="proc-adv svelte-1ndbe78"><summary class="svelte-1ndbe78">Advanced</summary> <div class="proc-adv-grid svelte-1ndbe78"><label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Allowed types (comma-separated)</span> <input class="control-input svelte-1ndbe78" type="text" spellcheck="false" placeholder="skill, knowledge, …"${attr("value", proc.allowedTypes)}/></label> `);
|
|
2446
|
+
if (key === "reflect" || key === "distill") {
|
|
2447
|
+
$$renderer.push("<!--[0-->");
|
|
2448
|
+
$$renderer.push(`<label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Quality gate</span> `);
|
|
2449
|
+
$$renderer.select({
|
|
2450
|
+
class: "control-input",
|
|
2451
|
+
value: proc.qualityGate
|
|
2452
|
+
}, ($$renderer) => {
|
|
2453
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
2454
|
+
$$renderer.push(`Default`);
|
|
2455
|
+
});
|
|
2456
|
+
$$renderer.option({ value: "on" }, ($$renderer) => {
|
|
2457
|
+
$$renderer.push(`Enabled`);
|
|
2458
|
+
});
|
|
2459
|
+
$$renderer.option({ value: "off" }, ($$renderer) => {
|
|
2460
|
+
$$renderer.push(`Disabled`);
|
|
2461
|
+
});
|
|
2462
|
+
}, "svelte-1ndbe78");
|
|
2463
|
+
$$renderer.push(`</label>`);
|
|
2464
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2465
|
+
$$renderer.push(`<!--]--> `);
|
|
2466
|
+
if (key === "consolidate") {
|
|
2467
|
+
$$renderer.push("<!--[0-->");
|
|
2468
|
+
$$renderer.push(`<label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Contradiction detection</span> `);
|
|
2469
|
+
$$renderer.select({
|
|
2470
|
+
class: "control-input",
|
|
2471
|
+
value: proc.contradictionDetection
|
|
2472
|
+
}, ($$renderer) => {
|
|
2473
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
2474
|
+
$$renderer.push(`Default`);
|
|
2475
|
+
});
|
|
2476
|
+
$$renderer.option({ value: "on" }, ($$renderer) => {
|
|
2477
|
+
$$renderer.push(`Enabled`);
|
|
2478
|
+
});
|
|
2479
|
+
$$renderer.option({ value: "off" }, ($$renderer) => {
|
|
2480
|
+
$$renderer.push(`Disabled`);
|
|
2481
|
+
});
|
|
2482
|
+
}, "svelte-1ndbe78");
|
|
2483
|
+
$$renderer.push(`</label>`);
|
|
2484
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2485
|
+
$$renderer.push(`<!--]--> `);
|
|
2486
|
+
if (key === "extract") {
|
|
2487
|
+
$$renderer.push("<!--[0-->");
|
|
2488
|
+
$$renderer.push(`<label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Default since</span> <input class="control-input svelte-1ndbe78" type="text" spellcheck="false" placeholder="e.g. 7d, 2026-01-01"${attr("value", proc.defaultSince)}/></label> <label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Max total chars</span> <input class="control-input control-input--narrow svelte-1ndbe78" type="number" min="1"${attr("value", proc.maxTotalChars)}/></label> <label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Max chunk size (1–50)</span> <input class="control-input control-input--narrow svelte-1ndbe78" type="number" min="1" max="50"${attr("value", proc.maxChunkSize)}/></label>`);
|
|
2489
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2490
|
+
$$renderer.push(`<!--]--> `);
|
|
2491
|
+
if (key === "triage") {
|
|
2492
|
+
$$renderer.push("<!--[0-->");
|
|
2493
|
+
$$renderer.push(`<label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Apply mode</span> `);
|
|
2494
|
+
$$renderer.select({
|
|
2495
|
+
class: "control-input",
|
|
2496
|
+
value: proc.applyMode
|
|
2497
|
+
}, ($$renderer) => {
|
|
2498
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
2499
|
+
$$renderer.push(`Default`);
|
|
2500
|
+
});
|
|
2501
|
+
$$renderer.option({ value: "queue" }, ($$renderer) => {
|
|
2502
|
+
$$renderer.push(`Queue`);
|
|
2503
|
+
});
|
|
2504
|
+
$$renderer.option({ value: "promote" }, ($$renderer) => {
|
|
2505
|
+
$$renderer.push(`Promote`);
|
|
2506
|
+
});
|
|
2507
|
+
}, "svelte-1ndbe78");
|
|
2508
|
+
$$renderer.push(`</label> <label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Policy</span> <input class="control-input svelte-1ndbe78" type="text" spellcheck="false" placeholder="policy name/ref"${attr("value", proc.policy)}/></label> <label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Max accepts per run</span> <input class="control-input control-input--narrow svelte-1ndbe78" type="number" min="1"${attr("value", proc.maxAcceptsPerRun)}/></label> <label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Max diff lines</span> <input class="control-input control-input--narrow svelte-1ndbe78" type="number" min="1"${attr("value", proc.maxDiffLines)}/></label> <label class="adv-field adv-field--check svelte-1ndbe78"><input type="checkbox"${attr("checked", proc.rejectEmpty, true)} class="svelte-1ndbe78"/> <span class="svelte-1ndbe78">Reject empty diffs</span></label> <div class="adv-field adv-field--wide svelte-1ndbe78"><span class="adv-sublabel svelte-1ndbe78">Judgment (overrides for the accept/reject decision)</span> <div class="proc-adv-grid svelte-1ndbe78"><label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Mode</span> `);
|
|
2509
|
+
$$renderer.select({
|
|
2510
|
+
class: "control-input",
|
|
2511
|
+
value: proc.judgment.mode
|
|
2512
|
+
}, ($$renderer) => {
|
|
2513
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
2514
|
+
$$renderer.push(`Default`);
|
|
2515
|
+
});
|
|
2516
|
+
$$renderer.option({ value: "llm" }, ($$renderer) => {
|
|
2517
|
+
$$renderer.push(`LLM`);
|
|
2518
|
+
});
|
|
2519
|
+
$$renderer.option({ value: "agent" }, ($$renderer) => {
|
|
2520
|
+
$$renderer.push(`Agent`);
|
|
2521
|
+
});
|
|
2522
|
+
$$renderer.option({ value: "sdk" }, ($$renderer) => {
|
|
2523
|
+
$$renderer.push(`SDK`);
|
|
2524
|
+
});
|
|
2525
|
+
}, "svelte-1ndbe78");
|
|
2526
|
+
$$renderer.push(`</label> <label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Profile</span> <input class="control-input svelte-1ndbe78" type="text" spellcheck="false" list="llm-profiles-list"${attr("value", proc.judgment.profile)}/></label> <label class="adv-field svelte-1ndbe78"><span class="svelte-1ndbe78">Timeout (ms)</span> <input class="control-input control-input--narrow svelte-1ndbe78" type="number" min="1"${attr("value", proc.judgment.timeoutMs)}/></label></div></div>`);
|
|
2527
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2528
|
+
$$renderer.push(`<!--]--></div></details></div>`);
|
|
2529
|
+
}
|
|
2530
|
+
$$renderer.push(`<!--]--></div> <div class="controls controls--grid svelte-1ndbe78"><div class="control-group svelte-1ndbe78"><label class="control-label svelte-1ndbe78" for="d-imp-sync">Git sync after run</label> `);
|
|
2531
|
+
$$renderer.select({
|
|
2532
|
+
id: "d-imp-sync",
|
|
2533
|
+
class: "control-input",
|
|
2534
|
+
value: draft.syncEnabled
|
|
2535
|
+
}, ($$renderer) => {
|
|
2536
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
2537
|
+
$$renderer.push(`Default`);
|
|
2538
|
+
});
|
|
2539
|
+
$$renderer.option({ value: "on" }, ($$renderer) => {
|
|
2540
|
+
$$renderer.push(`Enabled`);
|
|
2541
|
+
});
|
|
2542
|
+
$$renderer.option({ value: "off" }, ($$renderer) => {
|
|
2543
|
+
$$renderer.push(`Disabled`);
|
|
2544
|
+
});
|
|
2545
|
+
}, "svelte-1ndbe78");
|
|
2546
|
+
$$renderer.push(`</div> <div class="control-group svelte-1ndbe78"><label class="control-label svelte-1ndbe78" for="d-imp-syncpush">Push to remote</label> `);
|
|
2547
|
+
$$renderer.select({
|
|
2548
|
+
id: "d-imp-syncpush",
|
|
2549
|
+
class: "control-input",
|
|
2550
|
+
value: draft.syncPush
|
|
2551
|
+
}, ($$renderer) => {
|
|
2552
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
2553
|
+
$$renderer.push(`Default`);
|
|
2554
|
+
});
|
|
2555
|
+
$$renderer.option({ value: "on" }, ($$renderer) => {
|
|
2556
|
+
$$renderer.push(`Enabled`);
|
|
2557
|
+
});
|
|
2558
|
+
$$renderer.option({ value: "off" }, ($$renderer) => {
|
|
2559
|
+
$$renderer.push(`Disabled`);
|
|
2560
|
+
});
|
|
2561
|
+
}, "svelte-1ndbe78");
|
|
2562
|
+
$$renderer.push(`</div> <div class="control-group control-group--wide svelte-1ndbe78"><label class="control-label svelte-1ndbe78" for="d-imp-syncmsg">Commit message</label> <input id="d-imp-syncmsg" class="control-input svelte-1ndbe78" type="text" spellcheck="false" placeholder="Optional commit message"${attr("value", draft.syncMessage)}/></div></div></div> <div class="drawer-footer svelte-1ndbe78"><button class="btn btn-secondary">Cancel</button> <button class="btn btn-primary">Apply</button></div></div>`);
|
|
2563
|
+
bind_props($$props, { draft });
|
|
2564
|
+
});
|
|
2565
|
+
}
|
|
2566
|
+
//#endregion
|
|
2567
|
+
//#region src/lib/components/akm/AkmTab.svelte
|
|
2568
|
+
function AkmTab($$renderer, $$props) {
|
|
2569
|
+
$$renderer.component(($$renderer) => {
|
|
2570
|
+
let saving = false;
|
|
2571
|
+
let detectingEmbedding = false;
|
|
2572
|
+
let testingEmbedding = false;
|
|
2573
|
+
let reindexing = false;
|
|
2574
|
+
let error = "";
|
|
2575
|
+
const hostMaintenance = derived(() => hasCapability("host:containers"));
|
|
2576
|
+
let llmProfiles = [];
|
|
2577
|
+
let defaultLlmProfile = "";
|
|
2578
|
+
let agentProfiles = [];
|
|
2579
|
+
let defaultAgentProfile = "";
|
|
2580
|
+
let improveProfiles = [];
|
|
2581
|
+
let defaultImproveProfile = "";
|
|
2582
|
+
let embEndpoint = "";
|
|
2583
|
+
let embModel = "";
|
|
2584
|
+
let embProvider = "";
|
|
2585
|
+
let embApiKey = "";
|
|
2586
|
+
let embDimension = 1536;
|
|
2587
|
+
let embLocalModel = "";
|
|
2588
|
+
let embBatchSize = "";
|
|
2589
|
+
let embChunkSize = "";
|
|
2590
|
+
let embContextLength = "";
|
|
2591
|
+
let embOllamaNumCtx = "";
|
|
2592
|
+
let drawerType = null;
|
|
2593
|
+
let drawerLlm = null;
|
|
2594
|
+
let drawerAgent = null;
|
|
2595
|
+
let drawerImprove = null;
|
|
2596
|
+
let llmProfileNames = derived(() => llmProfiles.map((p) => p.name).filter((n) => n));
|
|
2597
|
+
function newLlmProfile() {
|
|
2598
|
+
return {
|
|
2599
|
+
id: crypto.randomUUID(),
|
|
2600
|
+
name: "",
|
|
2601
|
+
endpoint: "",
|
|
2602
|
+
model: "",
|
|
2603
|
+
provider: "",
|
|
2604
|
+
apiKey: "",
|
|
2605
|
+
showApiKey: false,
|
|
2606
|
+
temperature: "",
|
|
2607
|
+
maxTokens: "",
|
|
2608
|
+
timeoutMs: "",
|
|
2609
|
+
concurrency: "",
|
|
2610
|
+
contextLength: "",
|
|
2611
|
+
judgeModel: "",
|
|
2612
|
+
supportsJsonSchema: false,
|
|
2613
|
+
enableThinking: false,
|
|
2614
|
+
structuredOutput: false,
|
|
2615
|
+
extraParams: ""
|
|
2616
|
+
};
|
|
2617
|
+
}
|
|
2618
|
+
function newAgentProfile() {
|
|
2619
|
+
return {
|
|
2620
|
+
id: crypto.randomUUID(),
|
|
2621
|
+
name: "",
|
|
2622
|
+
platform: "opencode",
|
|
2623
|
+
bin: "",
|
|
2624
|
+
args: "",
|
|
2625
|
+
workspace: "",
|
|
2626
|
+
model: ""
|
|
2627
|
+
};
|
|
2628
|
+
}
|
|
2629
|
+
function newImproveProfile() {
|
|
2630
|
+
const processes = {};
|
|
2631
|
+
for (const k of PROCESS_KEYS) processes[k] = emptyFEntry(DEFAULT_ENABLED[k]);
|
|
2632
|
+
return {
|
|
2633
|
+
id: crypto.randomUUID(),
|
|
2634
|
+
name: "",
|
|
2635
|
+
description: "",
|
|
2636
|
+
limit: 25,
|
|
2637
|
+
autoAccept: 0,
|
|
2638
|
+
processes,
|
|
2639
|
+
syncEnabled: "",
|
|
2640
|
+
syncPush: "",
|
|
2641
|
+
syncMessage: ""
|
|
2642
|
+
};
|
|
2643
|
+
}
|
|
2644
|
+
function openLlmDrawer(p) {
|
|
2645
|
+
drawerLlm = { ...p };
|
|
2646
|
+
drawerType = "llm";
|
|
2647
|
+
}
|
|
2648
|
+
function openAgentDrawer(p) {
|
|
2649
|
+
drawerAgent = { ...p };
|
|
2650
|
+
drawerType = "agent";
|
|
2651
|
+
}
|
|
2652
|
+
function openImproveDrawer(ip) {
|
|
2653
|
+
const processes = {};
|
|
2654
|
+
for (const k of PROCESS_KEYS) {
|
|
2655
|
+
const src = ip.processes[k];
|
|
2656
|
+
processes[k] = {
|
|
2657
|
+
...src,
|
|
2658
|
+
judgment: { ...src.judgment },
|
|
2659
|
+
rest: { ...src.rest }
|
|
2660
|
+
};
|
|
2661
|
+
}
|
|
2662
|
+
drawerImprove = {
|
|
2663
|
+
...ip,
|
|
2664
|
+
processes
|
|
2665
|
+
};
|
|
2666
|
+
drawerType = "improve";
|
|
2667
|
+
}
|
|
2668
|
+
function applyDrawer() {
|
|
2669
|
+
if (drawerType === "llm" && drawerLlm) {
|
|
2670
|
+
const copy = { ...drawerLlm };
|
|
2671
|
+
const idx = llmProfiles.findIndex((p) => p.id === copy.id);
|
|
2672
|
+
const oldName = idx >= 0 ? llmProfiles[idx].name : "";
|
|
2673
|
+
llmProfiles = idx >= 0 ? llmProfiles.map((p, i) => i === idx ? copy : p) : [...llmProfiles, copy];
|
|
2674
|
+
if (defaultLlmProfile === oldName) defaultLlmProfile = copy.name;
|
|
2675
|
+
} else if (drawerType === "agent" && drawerAgent) {
|
|
2676
|
+
const copy = { ...drawerAgent };
|
|
2677
|
+
const idx = agentProfiles.findIndex((p) => p.id === copy.id);
|
|
2678
|
+
const oldName = idx >= 0 ? agentProfiles[idx].name : "";
|
|
2679
|
+
agentProfiles = idx >= 0 ? agentProfiles.map((p, i) => i === idx ? copy : p) : [...agentProfiles, copy];
|
|
2680
|
+
if (defaultAgentProfile === oldName) defaultAgentProfile = copy.name;
|
|
2681
|
+
} else if (drawerType === "improve" && drawerImprove) {
|
|
2682
|
+
const copy = {
|
|
2683
|
+
...drawerImprove,
|
|
2684
|
+
processes: { ...drawerImprove.processes }
|
|
2685
|
+
};
|
|
2686
|
+
const idx = improveProfiles.findIndex((ip) => ip.id === copy.id);
|
|
2687
|
+
const oldName = idx >= 0 ? improveProfiles[idx].name : "";
|
|
2688
|
+
improveProfiles = idx >= 0 ? improveProfiles.map((ip, i) => i === idx ? copy : ip) : [...improveProfiles, copy];
|
|
2689
|
+
if (defaultImproveProfile === oldName) defaultImproveProfile = copy.name;
|
|
2690
|
+
}
|
|
2691
|
+
closeDrawer();
|
|
2692
|
+
}
|
|
2693
|
+
function closeDrawer() {
|
|
2694
|
+
drawerType = null;
|
|
2695
|
+
drawerLlm = null;
|
|
2696
|
+
drawerAgent = null;
|
|
2697
|
+
drawerImprove = null;
|
|
2698
|
+
}
|
|
2699
|
+
function removeProfile(type, id) {
|
|
2700
|
+
if (type === "llm") {
|
|
2701
|
+
const name = llmProfiles.find((p) => p.id === id)?.name ?? "";
|
|
2702
|
+
if (defaultLlmProfile === name) defaultLlmProfile = "";
|
|
2703
|
+
llmProfiles = llmProfiles.filter((p) => p.id !== id);
|
|
2704
|
+
} else if (type === "agent") {
|
|
2705
|
+
const name = agentProfiles.find((p) => p.id === id)?.name ?? "";
|
|
2706
|
+
if (defaultAgentProfile === name) defaultAgentProfile = "";
|
|
2707
|
+
agentProfiles = agentProfiles.filter((p) => p.id !== id);
|
|
2708
|
+
} else {
|
|
2709
|
+
const name = improveProfiles.find((ip) => ip.id === id)?.name ?? "";
|
|
2710
|
+
if (defaultImproveProfile === name) defaultImproveProfile = "";
|
|
2711
|
+
improveProfiles = improveProfiles.filter((ip) => ip.id !== id);
|
|
2712
|
+
}
|
|
2713
|
+
if (drawerType === type) closeDrawer();
|
|
2714
|
+
}
|
|
2715
|
+
async function detectEmbedding() {
|
|
2716
|
+
detectingEmbedding = true;
|
|
2717
|
+
error = "";
|
|
2718
|
+
try {
|
|
2719
|
+
const detected = await detectAkmEmbedding();
|
|
2720
|
+
embEndpoint = detected.endpoint;
|
|
2721
|
+
embModel = detected.model;
|
|
2722
|
+
embProvider = detected.provider;
|
|
2723
|
+
embDimension = detected.dimension;
|
|
2724
|
+
notifications.push("success", detected.message);
|
|
2725
|
+
} catch (e) {
|
|
2726
|
+
const msg = e instanceof Error ? e.message : "Failed to detect embedding settings.";
|
|
2727
|
+
notifications.push("error", msg);
|
|
2728
|
+
} finally {
|
|
2729
|
+
detectingEmbedding = false;
|
|
2730
|
+
}
|
|
2731
|
+
}
|
|
2732
|
+
async function testEmbedding() {
|
|
2733
|
+
testingEmbedding = true;
|
|
2734
|
+
error = "";
|
|
2735
|
+
try {
|
|
2736
|
+
let endpoint = embEndpoint.trim();
|
|
2737
|
+
let model = embModel.trim();
|
|
2738
|
+
let provider = embProvider.trim();
|
|
2739
|
+
if (!endpoint || !model) {
|
|
2740
|
+
const detected = await detectAkmEmbedding();
|
|
2741
|
+
endpoint = detected.endpoint;
|
|
2742
|
+
model = detected.model;
|
|
2743
|
+
provider = detected.provider;
|
|
2744
|
+
embEndpoint = detected.endpoint;
|
|
2745
|
+
embModel = detected.model;
|
|
2746
|
+
embProvider = detected.provider;
|
|
2747
|
+
embDimension = detected.dimension;
|
|
2748
|
+
}
|
|
2749
|
+
const result = await testAkmEmbedding({
|
|
2750
|
+
endpoint,
|
|
2751
|
+
model,
|
|
2752
|
+
provider,
|
|
2753
|
+
apiKey: embApiKey,
|
|
2754
|
+
dimension: embDimension
|
|
2755
|
+
});
|
|
2756
|
+
embDimension = result.dimension;
|
|
2757
|
+
notifications.push("success", result.message);
|
|
2758
|
+
} catch (e) {
|
|
2759
|
+
const msg = e instanceof Error ? e.message : "Failed to test embedding settings.";
|
|
2760
|
+
notifications.push("error", msg);
|
|
2761
|
+
} finally {
|
|
2762
|
+
testingEmbedding = false;
|
|
2763
|
+
}
|
|
2764
|
+
}
|
|
2765
|
+
let $$settled = true;
|
|
2766
|
+
let $$inner_renderer;
|
|
2767
|
+
function $$render_inner($$renderer) {
|
|
2768
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2 class="svelte-19wb2va">Knowledge</h2> <p class="panel-header-sub svelte-19wb2va">Memory · LLM · embedding config</p></div> <div class="panel-header-actions svelte-19wb2va"><button class="btn btn-secondary btn-sm"${attr("disabled", detectingEmbedding || testingEmbedding || reindexing, true)}>`);
|
|
2769
|
+
$$renderer.push("<!--[-1-->");
|
|
2770
|
+
$$renderer.push(`<!--]--> Refresh</button> `);
|
|
2771
|
+
if (hostMaintenance()) {
|
|
2772
|
+
$$renderer.push("<!--[0-->");
|
|
2773
|
+
$$renderer.push(`<button class="btn btn-secondary btn-sm"${attr("disabled", detectingEmbedding || testingEmbedding || reindexing, true)}>`);
|
|
2774
|
+
$$renderer.push("<!--[-1-->");
|
|
2775
|
+
$$renderer.push(`<!--]--> Re-index</button>`);
|
|
2776
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2777
|
+
$$renderer.push(`<!--]--> <button class="btn btn-primary btn-sm"${attr("disabled", detectingEmbedding || testingEmbedding || reindexing, true)}>`);
|
|
2778
|
+
$$renderer.push("<!--[-1-->");
|
|
2779
|
+
$$renderer.push(`<!--]--> Save</button></div></div> `);
|
|
2780
|
+
if (error) {
|
|
2781
|
+
$$renderer.push("<!--[0-->");
|
|
2782
|
+
$$renderer.push(`<div class="error-banner svelte-19wb2va"><span>${escape_html(error)}</span></div>`);
|
|
2783
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2784
|
+
$$renderer.push(`<!--]--> <div class="panel-body svelte-19wb2va"><div class="k-tabs svelte-19wb2va" role="tablist" aria-label="Knowledge sections"><button role="tab"${attr_class("k-tab svelte-19wb2va", void 0, { "k-tab--active": true })}${attr("aria-selected", true)}>AI Services</button> <button role="tab"${attr_class("k-tab svelte-19wb2va", void 0, { "k-tab--active": false })}${attr("aria-selected", false)}>Behavior</button> `);
|
|
2785
|
+
if (hostMaintenance()) {
|
|
2786
|
+
$$renderer.push("<!--[0-->");
|
|
2787
|
+
$$renderer.push(`<button role="tab"${attr_class("k-tab svelte-19wb2va", void 0, { "k-tab--active": false })}${attr("aria-selected", false)}>Health Report</button>`);
|
|
2788
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2789
|
+
$$renderer.push(`<!--]--></div> `);
|
|
2790
|
+
$$renderer.push("<!--[0-->");
|
|
2791
|
+
if (hostMaintenance()) {
|
|
2792
|
+
$$renderer.push("<!--[0-->");
|
|
2793
|
+
AkmKnowledgeStatsSection($$renderer, { disabled: detectingEmbedding || testingEmbedding || reindexing });
|
|
2794
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2795
|
+
$$renderer.push(`<!--]--> <p class="section-note section-note--lead svelte-19wb2va">The AI services your assistant uses to build and search its memory — the language models that organize memories, the embedding provider for semantic search, and the maintenance pipeline.</p> `);
|
|
2796
|
+
LlmProfilesSection($$renderer, {
|
|
2797
|
+
disabled: saving,
|
|
2798
|
+
onedit: (p) => openLlmDrawer(p),
|
|
2799
|
+
onadd: () => {
|
|
2800
|
+
drawerLlm = newLlmProfile();
|
|
2801
|
+
drawerType = "llm";
|
|
2802
|
+
},
|
|
2803
|
+
onremove: (id) => removeProfile("llm", id),
|
|
2804
|
+
get profiles() {
|
|
2805
|
+
return llmProfiles;
|
|
2806
|
+
},
|
|
2807
|
+
set profiles($$value) {
|
|
2808
|
+
llmProfiles = $$value;
|
|
2809
|
+
$$settled = false;
|
|
2810
|
+
},
|
|
2811
|
+
get defaultName() {
|
|
2812
|
+
return defaultLlmProfile;
|
|
2813
|
+
},
|
|
2814
|
+
set defaultName($$value) {
|
|
2815
|
+
defaultLlmProfile = $$value;
|
|
2816
|
+
$$settled = false;
|
|
2817
|
+
}
|
|
2818
|
+
});
|
|
2819
|
+
$$renderer.push(`<!----> `);
|
|
2820
|
+
AgentProfilesSection($$renderer, {
|
|
2821
|
+
disabled: saving,
|
|
2822
|
+
onedit: (p) => openAgentDrawer(p),
|
|
2823
|
+
onadd: () => {
|
|
2824
|
+
drawerAgent = newAgentProfile();
|
|
2825
|
+
drawerType = "agent";
|
|
2826
|
+
},
|
|
2827
|
+
onremove: (id) => removeProfile("agent", id),
|
|
2828
|
+
get profiles() {
|
|
2829
|
+
return agentProfiles;
|
|
2830
|
+
},
|
|
2831
|
+
set profiles($$value) {
|
|
2832
|
+
agentProfiles = $$value;
|
|
2833
|
+
$$settled = false;
|
|
2834
|
+
},
|
|
2835
|
+
get defaultName() {
|
|
2836
|
+
return defaultAgentProfile;
|
|
2837
|
+
},
|
|
2838
|
+
set defaultName($$value) {
|
|
2839
|
+
defaultAgentProfile = $$value;
|
|
2840
|
+
$$settled = false;
|
|
2841
|
+
}
|
|
2842
|
+
});
|
|
2843
|
+
$$renderer.push(`<!----> `);
|
|
2844
|
+
ImproveProfilesSection($$renderer, {
|
|
2845
|
+
disabled: saving,
|
|
2846
|
+
onedit: (ip) => openImproveDrawer(ip),
|
|
2847
|
+
onadd: () => {
|
|
2848
|
+
drawerImprove = newImproveProfile();
|
|
2849
|
+
drawerType = "improve";
|
|
2850
|
+
},
|
|
2851
|
+
onremove: (id) => removeProfile("improve", id),
|
|
2852
|
+
get profiles() {
|
|
2853
|
+
return improveProfiles;
|
|
2854
|
+
},
|
|
2855
|
+
set profiles($$value) {
|
|
2856
|
+
improveProfiles = $$value;
|
|
2857
|
+
$$settled = false;
|
|
2858
|
+
},
|
|
2859
|
+
get defaultName() {
|
|
2860
|
+
return defaultImproveProfile;
|
|
2861
|
+
},
|
|
2862
|
+
set defaultName($$value) {
|
|
2863
|
+
defaultImproveProfile = $$value;
|
|
2864
|
+
$$settled = false;
|
|
2865
|
+
}
|
|
2866
|
+
});
|
|
2867
|
+
$$renderer.push(`<!----> `);
|
|
2868
|
+
EmbeddingSection($$renderer, {
|
|
2869
|
+
detecting: detectingEmbedding,
|
|
2870
|
+
testing: testingEmbedding,
|
|
2871
|
+
ondetect: () => void detectEmbedding(),
|
|
2872
|
+
ontest: () => void testEmbedding(),
|
|
2873
|
+
disabled: detectingEmbedding || testingEmbedding || reindexing,
|
|
2874
|
+
get endpoint() {
|
|
2875
|
+
return embEndpoint;
|
|
2876
|
+
},
|
|
2877
|
+
set endpoint($$value) {
|
|
2878
|
+
embEndpoint = $$value;
|
|
2879
|
+
$$settled = false;
|
|
2880
|
+
},
|
|
2881
|
+
get model() {
|
|
2882
|
+
return embModel;
|
|
2883
|
+
},
|
|
2884
|
+
set model($$value) {
|
|
2885
|
+
embModel = $$value;
|
|
2886
|
+
$$settled = false;
|
|
2887
|
+
},
|
|
2888
|
+
get provider() {
|
|
2889
|
+
return embProvider;
|
|
2890
|
+
},
|
|
2891
|
+
set provider($$value) {
|
|
2892
|
+
embProvider = $$value;
|
|
2893
|
+
$$settled = false;
|
|
2894
|
+
},
|
|
2895
|
+
get apiKey() {
|
|
2896
|
+
return embApiKey;
|
|
2897
|
+
},
|
|
2898
|
+
set apiKey($$value) {
|
|
2899
|
+
embApiKey = $$value;
|
|
2900
|
+
$$settled = false;
|
|
2901
|
+
},
|
|
2902
|
+
get dimension() {
|
|
2903
|
+
return embDimension;
|
|
2904
|
+
},
|
|
2905
|
+
set dimension($$value) {
|
|
2906
|
+
embDimension = $$value;
|
|
2907
|
+
$$settled = false;
|
|
2908
|
+
},
|
|
2909
|
+
get localModel() {
|
|
2910
|
+
return embLocalModel;
|
|
2911
|
+
},
|
|
2912
|
+
set localModel($$value) {
|
|
2913
|
+
embLocalModel = $$value;
|
|
2914
|
+
$$settled = false;
|
|
2915
|
+
},
|
|
2916
|
+
get batchSize() {
|
|
2917
|
+
return embBatchSize;
|
|
2918
|
+
},
|
|
2919
|
+
set batchSize($$value) {
|
|
2920
|
+
embBatchSize = $$value;
|
|
2921
|
+
$$settled = false;
|
|
2922
|
+
},
|
|
2923
|
+
get chunkSize() {
|
|
2924
|
+
return embChunkSize;
|
|
2925
|
+
},
|
|
2926
|
+
set chunkSize($$value) {
|
|
2927
|
+
embChunkSize = $$value;
|
|
2928
|
+
$$settled = false;
|
|
2929
|
+
},
|
|
2930
|
+
get contextLength() {
|
|
2931
|
+
return embContextLength;
|
|
2932
|
+
},
|
|
2933
|
+
set contextLength($$value) {
|
|
2934
|
+
embContextLength = $$value;
|
|
2935
|
+
$$settled = false;
|
|
2936
|
+
},
|
|
2937
|
+
get ollamaNumCtx() {
|
|
2938
|
+
return embOllamaNumCtx;
|
|
2939
|
+
},
|
|
2940
|
+
set ollamaNumCtx($$value) {
|
|
2941
|
+
embOllamaNumCtx = $$value;
|
|
2942
|
+
$$settled = false;
|
|
2943
|
+
}
|
|
2944
|
+
});
|
|
2945
|
+
$$renderer.push(`<!---->`);
|
|
2946
|
+
$$renderer.push(`<!--]--> `);
|
|
2947
|
+
$$renderer.push("<!--[-1-->");
|
|
2948
|
+
$$renderer.push(`<!--]--> `);
|
|
2949
|
+
$$renderer.push("<!--[-1-->");
|
|
2950
|
+
$$renderer.push(`<!--]--></div> `);
|
|
2951
|
+
if (drawerType === "llm" && drawerLlm) {
|
|
2952
|
+
$$renderer.push("<!--[0-->");
|
|
2953
|
+
LlmProfileDrawer($$renderer, {
|
|
2954
|
+
oncancel: closeDrawer,
|
|
2955
|
+
onapply: applyDrawer,
|
|
2956
|
+
get draft() {
|
|
2957
|
+
return drawerLlm;
|
|
2958
|
+
},
|
|
2959
|
+
set draft($$value) {
|
|
2960
|
+
drawerLlm = $$value;
|
|
2961
|
+
$$settled = false;
|
|
2962
|
+
}
|
|
2963
|
+
});
|
|
2964
|
+
} else if (drawerType === "agent" && drawerAgent) {
|
|
2965
|
+
$$renderer.push("<!--[1-->");
|
|
2966
|
+
AgentProfileDrawer($$renderer, {
|
|
2967
|
+
oncancel: closeDrawer,
|
|
2968
|
+
onapply: applyDrawer,
|
|
2969
|
+
get draft() {
|
|
2970
|
+
return drawerAgent;
|
|
2971
|
+
},
|
|
2972
|
+
set draft($$value) {
|
|
2973
|
+
drawerAgent = $$value;
|
|
2974
|
+
$$settled = false;
|
|
2975
|
+
}
|
|
2976
|
+
});
|
|
2977
|
+
} else if (drawerType === "improve" && drawerImprove) {
|
|
2978
|
+
$$renderer.push("<!--[2-->");
|
|
2979
|
+
ImproveProfileDrawer($$renderer, {
|
|
2980
|
+
llmProfileNames: llmProfileNames(),
|
|
2981
|
+
oncancel: closeDrawer,
|
|
2982
|
+
onapply: applyDrawer,
|
|
2983
|
+
get draft() {
|
|
2984
|
+
return drawerImprove;
|
|
2985
|
+
},
|
|
2986
|
+
set draft($$value) {
|
|
2987
|
+
drawerImprove = $$value;
|
|
2988
|
+
$$settled = false;
|
|
2989
|
+
}
|
|
2990
|
+
});
|
|
2991
|
+
} else $$renderer.push("<!--[-1-->");
|
|
2992
|
+
$$renderer.push(`<!--]--></div>`);
|
|
2993
|
+
}
|
|
2994
|
+
do {
|
|
2995
|
+
$$settled = true;
|
|
2996
|
+
$$inner_renderer = $$renderer.copy();
|
|
2997
|
+
$$render_inner($$inner_renderer);
|
|
2998
|
+
} while (!$$settled);
|
|
2999
|
+
$$renderer.subsume($$inner_renderer);
|
|
3000
|
+
});
|
|
3001
|
+
}
|
|
3002
|
+
//#endregion
|
|
3003
|
+
//#region src/lib/components/akm/HostSharingSection.svelte
|
|
3004
|
+
function HostSharingSection($$renderer, $$props) {
|
|
3005
|
+
$$renderer.component(($$renderer) => {
|
|
3006
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header svelte-fv9i73"><h2 class="svelte-fv9i73">Host knowledge sharing</h2></div> <div class="panel-body">`);
|
|
3007
|
+
$$renderer.push("<!--[0-->");
|
|
3008
|
+
$$renderer.push(`<div class="hs-loading svelte-fv9i73">`);
|
|
3009
|
+
Spinner($$renderer, {});
|
|
3010
|
+
$$renderer.push(`<!----> Checking host stash…</div>`);
|
|
3011
|
+
$$renderer.push(`<!--]--></div></div>`);
|
|
3012
|
+
});
|
|
3013
|
+
}
|
|
3014
|
+
//#endregion
|
|
3015
|
+
//#region src/lib/components/voice/VoiceProfileSelector.svelte
|
|
3016
|
+
function VoiceProfileSelector($$renderer, $$props) {
|
|
3017
|
+
$$renderer.component(($$renderer) => {
|
|
3018
|
+
let { profiles, selectedProfile, onchange, showDescription } = $$props;
|
|
3019
|
+
const selectedInfo = derived(() => profiles.find((p) => p.id === selectedProfile) ?? profiles[0]);
|
|
3020
|
+
showDescription ??= true;
|
|
3021
|
+
if (profiles.length === 0) $$renderer.push("<!--[0-->");
|
|
3022
|
+
else if (profiles.length === 1) {
|
|
3023
|
+
$$renderer.push("<!--[1-->");
|
|
3024
|
+
$$renderer.push(`<p class="profile-single svelte-11ub9pr">Using ${escape_html(selectedInfo()?.label ?? selectedInfo()?.id ?? "selected")}.</p>`);
|
|
3025
|
+
} else {
|
|
3026
|
+
$$renderer.push("<!--[-1-->");
|
|
3027
|
+
if (showDescription) {
|
|
3028
|
+
$$renderer.push("<!--[0-->");
|
|
3029
|
+
$$renderer.push(`<p class="profile-desc svelte-11ub9pr">Select the profile that matches your hardware. GPU profiles are auto-selected when available.</p>`);
|
|
3030
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3031
|
+
$$renderer.push(`<!--]--> <div class="form-field"><label class="form-label" for="voice-profile">Profile</label> `);
|
|
3032
|
+
$$renderer.select({
|
|
3033
|
+
id: "voice-profile",
|
|
3034
|
+
class: "form-input",
|
|
3035
|
+
value: selectedProfile,
|
|
3036
|
+
onchange: (e) => onchange(e.currentTarget.value)
|
|
3037
|
+
}, ($$renderer) => {
|
|
3038
|
+
$$renderer.push(`<!--[-->`);
|
|
3039
|
+
const each_array = ensure_array_like(profiles);
|
|
3040
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
3041
|
+
let profile = each_array[$$index];
|
|
3042
|
+
$$renderer.option({
|
|
3043
|
+
value: profile.id,
|
|
3044
|
+
disabled: profile.available === false,
|
|
3045
|
+
title: profile.available === false ? profile.reason ?? "Not available on this host" : void 0
|
|
3046
|
+
}, ($$renderer) => {
|
|
3047
|
+
$$renderer.push(`${escape_html(profile.label ?? profile.id)}${escape_html(profile.available === false ? " — unavailable" : "")}`);
|
|
3048
|
+
});
|
|
3049
|
+
}
|
|
3050
|
+
$$renderer.push(`<!--]-->`);
|
|
3051
|
+
});
|
|
3052
|
+
$$renderer.push(` `);
|
|
3053
|
+
if (selectedInfo()?.requires) {
|
|
3054
|
+
$$renderer.push("<!--[0-->");
|
|
3055
|
+
$$renderer.push(`<span class="field-hint svelte-11ub9pr">Requires: ${escape_html(selectedInfo().requires)}</span>`);
|
|
3056
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3057
|
+
$$renderer.push(`<!--]--> `);
|
|
3058
|
+
if (selectedInfo()?.available === false) {
|
|
3059
|
+
$$renderer.push("<!--[0-->");
|
|
3060
|
+
$$renderer.push(`<span class="field-hint field-hint--warning svelte-11ub9pr">${escape_html(selectedInfo().reason ?? "This profile is not available on the current host.")}</span>`);
|
|
3061
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3062
|
+
$$renderer.push(`<!--]--></div>`);
|
|
3063
|
+
}
|
|
3064
|
+
$$renderer.push(`<!--]-->`);
|
|
3065
|
+
});
|
|
3066
|
+
}
|
|
3067
|
+
//#endregion
|
|
3068
|
+
//#region src/lib/components/voice/VoiceAddonProfileSection.svelte
|
|
3069
|
+
function VoiceAddonProfileSection($$renderer, $$props) {
|
|
3070
|
+
let { profiles, selectedProfile, onchange } = $$props;
|
|
3071
|
+
$$renderer.push(`<section class="engine-section svelte-1r7l91t"><h3 class="engine-heading svelte-1r7l91t">Hardware profile</h3> `);
|
|
3072
|
+
VoiceProfileSelector($$renderer, {
|
|
3073
|
+
profiles,
|
|
3074
|
+
selectedProfile,
|
|
3075
|
+
onchange
|
|
3076
|
+
});
|
|
3077
|
+
$$renderer.push(`<!----></section>`);
|
|
3078
|
+
}
|
|
3079
|
+
//#endregion
|
|
3080
|
+
//#region src/lib/components/voice/voice-mappers.ts
|
|
3081
|
+
var EMPTY_SECTION = () => ({
|
|
3082
|
+
engine: "",
|
|
3083
|
+
baseURL: "",
|
|
3084
|
+
model: "",
|
|
3085
|
+
voice: "",
|
|
3086
|
+
language: ""
|
|
3087
|
+
});
|
|
3088
|
+
//#endregion
|
|
3089
|
+
//#region src/lib/components/voice/VoiceTab.svelte
|
|
3090
|
+
function VoiceTab($$renderer, $$props) {
|
|
3091
|
+
$$renderer.component(($$renderer) => {
|
|
3092
|
+
const ADMIN_TTS_OPTIONS = [
|
|
3093
|
+
{
|
|
3094
|
+
id: "openpalm-voice",
|
|
3095
|
+
name: "OpenPalm Voice",
|
|
3096
|
+
type: "local",
|
|
3097
|
+
recommended: true,
|
|
3098
|
+
desc: "Local Kokoro TTS + Whisper STT bundled together."
|
|
3099
|
+
},
|
|
3100
|
+
{
|
|
3101
|
+
id: "remote",
|
|
3102
|
+
name: "Remote (OpenAI-compatible)",
|
|
3103
|
+
type: "cloud",
|
|
3104
|
+
desc: "Point at any /v1/audio/speech endpoint (OpenAI, Kokoro, Piper, …)."
|
|
3105
|
+
},
|
|
3106
|
+
{
|
|
3107
|
+
id: "browser",
|
|
3108
|
+
name: "Browser",
|
|
3109
|
+
type: "builtin",
|
|
3110
|
+
desc: "Web Speech API on this device. No setup, voice quality varies."
|
|
3111
|
+
}
|
|
3112
|
+
];
|
|
3113
|
+
const ADMIN_STT_OPTIONS = [
|
|
3114
|
+
{
|
|
3115
|
+
id: "openpalm-voice",
|
|
3116
|
+
name: "OpenPalm Voice",
|
|
3117
|
+
type: "local",
|
|
3118
|
+
recommended: true,
|
|
3119
|
+
desc: "Local Kokoro TTS + Whisper STT bundled together."
|
|
3120
|
+
},
|
|
3121
|
+
{
|
|
3122
|
+
id: "remote",
|
|
3123
|
+
name: "Remote (OpenAI-compatible)",
|
|
3124
|
+
type: "cloud",
|
|
3125
|
+
desc: "Point at any /v1/audio/transcriptions endpoint (Whisper, …)."
|
|
3126
|
+
},
|
|
3127
|
+
{
|
|
3128
|
+
id: "browser",
|
|
3129
|
+
name: "Browser",
|
|
3130
|
+
type: "builtin",
|
|
3131
|
+
desc: "Web Speech API on this device. Chrome/Edge only on desktop."
|
|
3132
|
+
}
|
|
3133
|
+
];
|
|
3134
|
+
const ADMIN_TTS_ENGINES = {
|
|
3135
|
+
"openpalm-voice": {
|
|
3136
|
+
id: "openpalm-voice",
|
|
3137
|
+
fields: []
|
|
3138
|
+
},
|
|
3139
|
+
remote: {
|
|
3140
|
+
id: "remote",
|
|
3141
|
+
fields: [
|
|
3142
|
+
{
|
|
3143
|
+
key: "baseURL",
|
|
3144
|
+
label: "Endpoint URL",
|
|
3145
|
+
placeholder: "http://host.docker.internal:8880/v1",
|
|
3146
|
+
hint: "OpenAI-compatible /v1/audio/speech endpoint."
|
|
3147
|
+
},
|
|
3148
|
+
{
|
|
3149
|
+
key: "model",
|
|
3150
|
+
label: "Model",
|
|
3151
|
+
placeholder: "tts-1"
|
|
3152
|
+
},
|
|
3153
|
+
{
|
|
3154
|
+
key: "voice",
|
|
3155
|
+
label: "Voice",
|
|
3156
|
+
placeholder: "alloy"
|
|
3157
|
+
}
|
|
3158
|
+
]
|
|
3159
|
+
},
|
|
3160
|
+
browser: {
|
|
3161
|
+
id: "browser",
|
|
3162
|
+
fields: []
|
|
3163
|
+
}
|
|
3164
|
+
};
|
|
3165
|
+
const ADMIN_STT_ENGINES = {
|
|
3166
|
+
"openpalm-voice": {
|
|
3167
|
+
id: "openpalm-voice",
|
|
3168
|
+
fields: []
|
|
3169
|
+
},
|
|
3170
|
+
remote: {
|
|
3171
|
+
id: "remote",
|
|
3172
|
+
fields: [
|
|
3173
|
+
{
|
|
3174
|
+
key: "baseURL",
|
|
3175
|
+
label: "Endpoint URL",
|
|
3176
|
+
placeholder: "http://host.docker.internal:9000/v1",
|
|
3177
|
+
hint: "OpenAI-compatible /v1/audio/transcriptions endpoint."
|
|
3178
|
+
},
|
|
3179
|
+
{
|
|
3180
|
+
key: "model",
|
|
3181
|
+
label: "Model",
|
|
3182
|
+
placeholder: "whisper-1"
|
|
3183
|
+
},
|
|
3184
|
+
{
|
|
3185
|
+
key: "language",
|
|
3186
|
+
label: "Language",
|
|
3187
|
+
placeholder: "en",
|
|
3188
|
+
hint: "A code like `en` or `fr`, or leave blank to detect."
|
|
3189
|
+
}
|
|
3190
|
+
]
|
|
3191
|
+
},
|
|
3192
|
+
browser: {
|
|
3193
|
+
id: "browser",
|
|
3194
|
+
fields: [{
|
|
3195
|
+
key: "language",
|
|
3196
|
+
label: "Language",
|
|
3197
|
+
placeholder: "en-US"
|
|
3198
|
+
}]
|
|
3199
|
+
}
|
|
3200
|
+
};
|
|
3201
|
+
let saving = false;
|
|
3202
|
+
let tts = EMPTY_SECTION();
|
|
3203
|
+
let stt = EMPTY_SECTION();
|
|
3204
|
+
let addonProfiles = [];
|
|
3205
|
+
let selectedProfile = "";
|
|
3206
|
+
const wantsOpenpalmVoice = derived(() => tts.engine === "openpalm-voice" || stt.engine === "openpalm-voice");
|
|
3207
|
+
let browserSttAvailable = false;
|
|
3208
|
+
const browserSttDisabled = derived(() => browserSttAvailable);
|
|
3209
|
+
const browserSttDisabledReason = derived(() => voiceState.browserSttUnsupportedReason ?? "");
|
|
3210
|
+
$$renderer.push(`<div class="panel" role="tabpanel"><div class="panel-header"><div><h2>Voice</h2> <p class="panel-subtitle">Speech-to-text · text-to-speech</p></div> <div class="panel-header-actions"><button class="btn btn-secondary btn-sm"${attr("disabled", saving, true)}>`);
|
|
3211
|
+
$$renderer.push("<!--[-1-->");
|
|
3212
|
+
$$renderer.push(`<!--]--> Refresh</button> <button class="btn btn-primary btn-sm"${attr("disabled", saving, true)}>`);
|
|
3213
|
+
$$renderer.push("<!--[-1-->");
|
|
3214
|
+
$$renderer.push(`<!--]--> Save</button></div></div> `);
|
|
3215
|
+
$$renderer.push("<!--[-1-->");
|
|
3216
|
+
$$renderer.push(`<!--]--> <div class="panel-body svelte-nokcxu"><div class="voice-grid svelte-nokcxu"><div class="section-card svelte-nokcxu"><div class="sc-title svelte-nokcxu">Speech-to-text (STT)</div> <div class="field svelte-nokcxu"><label class="field-label svelte-nokcxu" for="stt-engine">Engine</label> `);
|
|
3217
|
+
$$renderer.select({
|
|
3218
|
+
id: "stt-engine",
|
|
3219
|
+
class: "field-select",
|
|
3220
|
+
value: stt.engine,
|
|
3221
|
+
onchange: (e) => {
|
|
3222
|
+
stt.engine = e.currentTarget.value;
|
|
3223
|
+
},
|
|
3224
|
+
disabled: saving
|
|
3225
|
+
}, ($$renderer) => {
|
|
3226
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
3227
|
+
$$renderer.push(`— select engine —`);
|
|
3228
|
+
});
|
|
3229
|
+
$$renderer.push(`<!--[-->`);
|
|
3230
|
+
const each_array = ensure_array_like(ADMIN_STT_OPTIONS);
|
|
3231
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
3232
|
+
let o = each_array[$$index];
|
|
3233
|
+
if (o.id !== "browser") {
|
|
3234
|
+
$$renderer.push("<!--[0-->");
|
|
3235
|
+
$$renderer.option({
|
|
3236
|
+
value: o.id,
|
|
3237
|
+
disabled: o.id === "browser" && browserSttDisabled()
|
|
3238
|
+
}, ($$renderer) => {
|
|
3239
|
+
$$renderer.push(`${escape_html(o.name)}`);
|
|
3240
|
+
});
|
|
3241
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3242
|
+
$$renderer.push(`<!--]-->`);
|
|
3243
|
+
}
|
|
3244
|
+
$$renderer.push(`<!--]-->`);
|
|
3245
|
+
}, "svelte-nokcxu");
|
|
3246
|
+
$$renderer.push(` `);
|
|
3247
|
+
$$renderer.push("<!--[-1-->");
|
|
3248
|
+
$$renderer.push(`<!--]--></div> `);
|
|
3249
|
+
if (stt.engine) {
|
|
3250
|
+
$$renderer.push("<!--[0-->");
|
|
3251
|
+
$$renderer.push(`<!--[-->`);
|
|
3252
|
+
const each_array_1 = ensure_array_like(ADMIN_STT_ENGINES[stt.engine]?.fields ?? []);
|
|
3253
|
+
for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
|
|
3254
|
+
let field = each_array_1[$$index_1];
|
|
3255
|
+
$$renderer.push(`<div class="field svelte-nokcxu"><label class="field-label svelte-nokcxu"${attr("for", `stt-${stringify(field.key)}`)}>${escape_html(field.label)}</label> <input${attr("id", `stt-${stringify(field.key)}`)}${attr("type", field.key === "baseURL" ? "url" : "text")} class="field-input svelte-nokcxu"${attr("placeholder", field.placeholder ?? "")}${attr("value", field.key === "baseURL" ? stt.baseURL : field.key === "model" ? stt.model : stt.language)}${attr("disabled", saving, true)} autocomplete="off"/> `);
|
|
3256
|
+
if (field.hint) {
|
|
3257
|
+
$$renderer.push("<!--[0-->");
|
|
3258
|
+
$$renderer.push(`<p class="field-hint svelte-nokcxu">${escape_html(field.hint)}</p>`);
|
|
3259
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3260
|
+
$$renderer.push(`<!--]--></div>`);
|
|
3261
|
+
}
|
|
3262
|
+
$$renderer.push(`<!--]--> `);
|
|
3263
|
+
if (stt.engine === "browser" && browserSttDisabled()) {
|
|
3264
|
+
$$renderer.push("<!--[0-->");
|
|
3265
|
+
$$renderer.push(`<p class="field-hint field-hint--warn svelte-nokcxu">${escape_html(browserSttDisabledReason())}</p>`);
|
|
3266
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3267
|
+
$$renderer.push(`<!--]-->`);
|
|
3268
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3269
|
+
$$renderer.push(`<!--]--></div> <div class="section-card svelte-nokcxu"><div class="sc-title svelte-nokcxu">Text-to-speech (TTS)</div> <div class="field svelte-nokcxu"><label class="field-label svelte-nokcxu" for="tts-engine">Engine</label> `);
|
|
3270
|
+
$$renderer.select({
|
|
3271
|
+
id: "tts-engine",
|
|
3272
|
+
class: "field-select",
|
|
3273
|
+
value: tts.engine,
|
|
3274
|
+
onchange: (e) => {
|
|
3275
|
+
tts.engine = e.currentTarget.value;
|
|
3276
|
+
},
|
|
3277
|
+
disabled: saving
|
|
3278
|
+
}, ($$renderer) => {
|
|
3279
|
+
$$renderer.option({ value: "" }, ($$renderer) => {
|
|
3280
|
+
$$renderer.push(`— select engine —`);
|
|
3281
|
+
});
|
|
3282
|
+
$$renderer.push(`<!--[-->`);
|
|
3283
|
+
const each_array_2 = ensure_array_like(ADMIN_TTS_OPTIONS);
|
|
3284
|
+
for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
|
|
3285
|
+
let o = each_array_2[$$index_2];
|
|
3286
|
+
if (o.id !== "browser") {
|
|
3287
|
+
$$renderer.push("<!--[0-->");
|
|
3288
|
+
$$renderer.option({ value: o.id }, ($$renderer) => {
|
|
3289
|
+
$$renderer.push(`${escape_html(o.name)}`);
|
|
3290
|
+
});
|
|
3291
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3292
|
+
$$renderer.push(`<!--]-->`);
|
|
3293
|
+
}
|
|
3294
|
+
$$renderer.push(`<!--]-->`);
|
|
3295
|
+
}, "svelte-nokcxu");
|
|
3296
|
+
$$renderer.push(` `);
|
|
3297
|
+
$$renderer.push("<!--[-1-->");
|
|
3298
|
+
$$renderer.push(`<!--]--></div> `);
|
|
3299
|
+
if (tts.engine) {
|
|
3300
|
+
$$renderer.push("<!--[0-->");
|
|
3301
|
+
$$renderer.push(`<!--[-->`);
|
|
3302
|
+
const each_array_3 = ensure_array_like(ADMIN_TTS_ENGINES[tts.engine]?.fields ?? []);
|
|
3303
|
+
for (let $$index_3 = 0, $$length = each_array_3.length; $$index_3 < $$length; $$index_3++) {
|
|
3304
|
+
let field = each_array_3[$$index_3];
|
|
3305
|
+
$$renderer.push(`<div class="field svelte-nokcxu"><label class="field-label svelte-nokcxu"${attr("for", `tts-${stringify(field.key)}`)}>${escape_html(field.label)}</label> <input${attr("id", `tts-${stringify(field.key)}`)}${attr("type", field.key === "baseURL" ? "url" : "text")} class="field-input svelte-nokcxu"${attr("placeholder", field.placeholder ?? "")}${attr("value", field.key === "baseURL" ? tts.baseURL : field.key === "model" ? tts.model : tts.voice)}${attr("disabled", saving, true)} autocomplete="off"/> `);
|
|
3306
|
+
if (field.hint) {
|
|
3307
|
+
$$renderer.push("<!--[0-->");
|
|
3308
|
+
$$renderer.push(`<p class="field-hint svelte-nokcxu">${escape_html(field.hint)}</p>`);
|
|
3309
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3310
|
+
$$renderer.push(`<!--]--></div>`);
|
|
3311
|
+
}
|
|
3312
|
+
$$renderer.push(`<!--]-->`);
|
|
3313
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3314
|
+
$$renderer.push(`<!--]--> <div class="sc-foot svelte-nokcxu"><div class="test-row svelte-nokcxu"><button type="button" class="btn btn-secondary btn-sm"${attr("disabled", !tts.engine, true)}>`);
|
|
3315
|
+
$$renderer.push("<!--[-1-->");
|
|
3316
|
+
$$renderer.push(`<!--]--> Test speaker</button> `);
|
|
3317
|
+
$$renderer.push("<!--[-1-->");
|
|
3318
|
+
$$renderer.push(`<!--]--></div> <label class="auto-speak-toggle svelte-nokcxu"><input type="checkbox"${attr("checked", voiceState.ttsAutoEnabled, true)} class="svelte-nokcxu"/> <span>Speak replies automatically</span></label></div></div></div> `);
|
|
3319
|
+
if (wantsOpenpalmVoice() && addonProfiles.length > 0) {
|
|
3320
|
+
$$renderer.push("<!--[0-->");
|
|
3321
|
+
VoiceAddonProfileSection($$renderer, {
|
|
3322
|
+
profiles: addonProfiles,
|
|
3323
|
+
selectedProfile,
|
|
3324
|
+
onchange: (id) => selectedProfile = id
|
|
3325
|
+
});
|
|
3326
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3327
|
+
$$renderer.push(`<!--]--></div></div>`);
|
|
3328
|
+
});
|
|
3329
|
+
}
|
|
3330
|
+
//#endregion
|
|
3331
|
+
//#region src/routes/host/+page.svelte
|
|
3332
|
+
function _page($$renderer, $$props) {
|
|
3333
|
+
$$renderer.component(($$renderer) => {
|
|
3334
|
+
let { data } = $$props;
|
|
3335
|
+
let healthLoading = false;
|
|
3336
|
+
let containersLoading = false;
|
|
3337
|
+
let automationsLoading = false;
|
|
3338
|
+
let containerData = null;
|
|
3339
|
+
let containerError = "";
|
|
3340
|
+
let containersLastUpdated = null;
|
|
3341
|
+
let automationsData = null;
|
|
3342
|
+
let automationsError = "";
|
|
3343
|
+
let selectedContainerId = null;
|
|
3344
|
+
let activeTab = "overview";
|
|
3345
|
+
let pullLoading = false;
|
|
3346
|
+
onDestroy(() => {
|
|
3347
|
+
});
|
|
3348
|
+
/** Merged service → state map (used by OverviewTab for health indicators) */
|
|
3349
|
+
let mergedServices = derived(() => {
|
|
3350
|
+
if (!containerData) return new SvelteMap();
|
|
3351
|
+
const merged = new SvelteMap();
|
|
3352
|
+
if (containerData.containers) for (const [name, state] of Object.entries(containerData.containers)) merged.set(name, state);
|
|
3353
|
+
if (containerData.dockerContainers) for (const c of containerData.dockerContainers) merged.set(c.Service, c.State);
|
|
3354
|
+
return merged;
|
|
3355
|
+
});
|
|
3356
|
+
/** Full merged ServiceEntry list (used by ContainersTab for detail rows) */
|
|
3357
|
+
let serviceEntries = derived(() => {
|
|
3358
|
+
if (!containerData) return [];
|
|
3359
|
+
const byService = new SvelteMap();
|
|
3360
|
+
if (containerData.containers) for (const [name, state] of Object.entries(containerData.containers)) byService.set(name, {
|
|
3361
|
+
id: name,
|
|
3362
|
+
service: name,
|
|
3363
|
+
state,
|
|
3364
|
+
docker: null
|
|
3365
|
+
});
|
|
3366
|
+
if (containerData.dockerContainers) for (const c of containerData.dockerContainers) {
|
|
3367
|
+
const existing = byService.get(c.Service);
|
|
3368
|
+
if (existing) {
|
|
3369
|
+
existing.state = c.State;
|
|
3370
|
+
existing.docker = c;
|
|
3371
|
+
existing.id = c.ID;
|
|
3372
|
+
} else byService.set(c.Service, {
|
|
3373
|
+
id: c.ID,
|
|
3374
|
+
service: c.Service || c.Name,
|
|
3375
|
+
state: c.State,
|
|
3376
|
+
docker: c
|
|
3377
|
+
});
|
|
3378
|
+
}
|
|
3379
|
+
return [...byService.values()].sort((a, b) => {
|
|
3380
|
+
if (a.state === "running" && b.state !== "running") return -1;
|
|
3381
|
+
if (a.state !== "running" && b.state === "running") return 1;
|
|
3382
|
+
return a.service.localeCompare(b.service);
|
|
3383
|
+
});
|
|
3384
|
+
});
|
|
3385
|
+
function applyInvalidTokenState() {
|
|
3386
|
+
goto();
|
|
3387
|
+
}
|
|
3388
|
+
async function loadContainers() {
|
|
3389
|
+
containersLoading = true;
|
|
3390
|
+
containerError = "";
|
|
3391
|
+
try {
|
|
3392
|
+
containerData = await fetchContainers();
|
|
3393
|
+
} catch (e) {
|
|
3394
|
+
containerData = null;
|
|
3395
|
+
const err = e;
|
|
3396
|
+
if (err.status === 401) {
|
|
3397
|
+
containerError = "Invalid password.";
|
|
3398
|
+
applyInvalidTokenState();
|
|
3399
|
+
} else containerError = `Failed to load containers: ${err.message ?? e}`;
|
|
3400
|
+
}
|
|
3401
|
+
containersLoading = false;
|
|
3402
|
+
if (containerData) containersLastUpdated = formatTime(Date.now());
|
|
3403
|
+
}
|
|
3404
|
+
async function loadAutomations() {
|
|
3405
|
+
automationsLoading = true;
|
|
3406
|
+
automationsError = "";
|
|
3407
|
+
try {
|
|
3408
|
+
automationsData = await fetchAutomations();
|
|
3409
|
+
} catch (e) {
|
|
3410
|
+
automationsData = null;
|
|
3411
|
+
const err = e;
|
|
3412
|
+
if (err.status === 401) {
|
|
3413
|
+
automationsError = "Invalid password.";
|
|
3414
|
+
applyInvalidTokenState();
|
|
3415
|
+
} else automationsError = `Failed to load automations: ${err.message ?? e}`;
|
|
3416
|
+
}
|
|
3417
|
+
automationsLoading = false;
|
|
3418
|
+
}
|
|
3419
|
+
/** Derive service names from container data for the logs tab */
|
|
3420
|
+
let serviceNames = derived(() => {
|
|
3421
|
+
if (!containerData) return [];
|
|
3422
|
+
const names = new SvelteSet();
|
|
3423
|
+
if (containerData.containers) for (const name of Object.keys(containerData.containers)) names.add(name);
|
|
3424
|
+
if (containerData.dockerContainers) {
|
|
3425
|
+
for (const c of containerData.dockerContainers) if (c.Service) names.add(c.Service);
|
|
3426
|
+
}
|
|
3427
|
+
return [...names].sort();
|
|
3428
|
+
});
|
|
3429
|
+
function handleTabSelect(tab) {
|
|
3430
|
+
activeTab = tab;
|
|
3431
|
+
if (tab === "containers" && !containerData) loadContainers();
|
|
3432
|
+
if (tab === "automations" && !automationsData) loadAutomations();
|
|
3433
|
+
}
|
|
3434
|
+
head("10vygff", $$renderer, ($$renderer) => {
|
|
3435
|
+
$$renderer.title(($$renderer) => {
|
|
3436
|
+
$$renderer.push(`<title>OpenPalm Console</title>`);
|
|
3437
|
+
});
|
|
3438
|
+
});
|
|
3439
|
+
Navbar($$renderer, {
|
|
3440
|
+
children: ($$renderer) => {
|
|
3441
|
+
VoiceStopControl($$renderer);
|
|
3442
|
+
}});
|
|
3443
|
+
$$renderer.push(`<!----> `);
|
|
3444
|
+
TabBar($$renderer, {
|
|
3445
|
+
active: activeTab});
|
|
3446
|
+
$$renderer.push(`<!----> <main class="svelte-10vygff"><section class="app-install-banner svelte-10vygff" aria-label="Open localhost app"><div><h2 class="svelte-10vygff">Open the localhost app</h2> <p class="svelte-10vygff">Install or open the loopback-only OpenPalm app from its stable localhost origin.</p></div> <button type="button" class="btn btn-primary">Install OpenPalm app</button></section> `);
|
|
3447
|
+
if (activeTab === "overview") {
|
|
3448
|
+
$$renderer.push("<!--[0-->");
|
|
3449
|
+
OverviewTab($$renderer, {
|
|
3450
|
+
healthLoading,
|
|
3451
|
+
mergedServices: mergedServices(),
|
|
3452
|
+
managedServices: containerData?.managedServices ?? [],
|
|
3453
|
+
onNavigate: handleTabSelect
|
|
3454
|
+
});
|
|
3455
|
+
} else if (activeTab === "updates") {
|
|
3456
|
+
$$renderer.push("<!--[1-->");
|
|
3457
|
+
UpdatesTab($$renderer);
|
|
3458
|
+
} else if (activeTab === "recovery") {
|
|
3459
|
+
$$renderer.push("<!--[2-->");
|
|
3460
|
+
RecoveryTab($$renderer);
|
|
3461
|
+
} else if (activeTab === "addons") {
|
|
3462
|
+
$$renderer.push("<!--[3-->");
|
|
3463
|
+
AddonsTab($$renderer);
|
|
3464
|
+
} else if (activeTab === "containers") {
|
|
3465
|
+
$$renderer.push("<!--[4-->");
|
|
3466
|
+
ContainersTab($$renderer, {
|
|
3467
|
+
containerData,
|
|
3468
|
+
serviceEntries: serviceEntries(),
|
|
3469
|
+
loading: containersLoading,
|
|
3470
|
+
error: containerError,
|
|
3471
|
+
selectedContainerId,
|
|
3472
|
+
lastUpdated: containersLastUpdated,
|
|
3473
|
+
pullLoading
|
|
3474
|
+
});
|
|
3475
|
+
} else if (activeTab === "automations") {
|
|
3476
|
+
$$renderer.push("<!--[5-->");
|
|
3477
|
+
AutomationsTab($$renderer, {
|
|
3478
|
+
data: automationsData,
|
|
3479
|
+
loading: automationsLoading,
|
|
3480
|
+
error: automationsError});
|
|
3481
|
+
} else if (activeTab === "activity") {
|
|
3482
|
+
$$renderer.push("<!--[6-->");
|
|
3483
|
+
ActivityTab($$renderer);
|
|
3484
|
+
} else if (activeTab === "connections") {
|
|
3485
|
+
$$renderer.push("<!--[7-->");
|
|
3486
|
+
ProvidersPanel($$renderer);
|
|
3487
|
+
} else if (activeTab === "assistant") {
|
|
3488
|
+
$$renderer.push("<!--[8-->");
|
|
3489
|
+
AssistantTab($$renderer);
|
|
3490
|
+
} else if (activeTab === "secrets") {
|
|
3491
|
+
$$renderer.push("<!--[9-->");
|
|
3492
|
+
SecretsTab($$renderer);
|
|
3493
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3494
|
+
$$renderer.push(`<!--]--> `);
|
|
3495
|
+
if (activeTab === "voice") {
|
|
3496
|
+
$$renderer.push("<!--[0-->");
|
|
3497
|
+
VoiceTab($$renderer);
|
|
3498
|
+
} else if (activeTab === "akm") {
|
|
3499
|
+
$$renderer.push("<!--[1-->");
|
|
3500
|
+
AkmTab($$renderer);
|
|
3501
|
+
} else if (activeTab === "host-sharing") {
|
|
3502
|
+
$$renderer.push("<!--[2-->");
|
|
3503
|
+
HostSharingSection($$renderer);
|
|
3504
|
+
} else if (activeTab === "logs") {
|
|
3505
|
+
$$renderer.push("<!--[3-->");
|
|
3506
|
+
LogsTab($$renderer, {
|
|
3507
|
+
services: serviceNames(),
|
|
3508
|
+
automations: automationsData?.automations.map((automation) => automation.name) ?? []
|
|
3509
|
+
});
|
|
3510
|
+
} else $$renderer.push("<!--[-1-->");
|
|
3511
|
+
$$renderer.push(`<!--]--></main>`);
|
|
3512
|
+
});
|
|
3513
|
+
}
|
|
3514
|
+
|
|
3515
|
+
export { _page as default };
|
|
3516
|
+
//# sourceMappingURL=_page.svelte-LsoJ7E5M.js.map
|