shadow-claw 1.29.0 → 1.30.0
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/.agents/skills/main/skill-creator/SKILL.md +3 -2
- package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/.well-known/agent-skills/index.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/dist/lib/{app-routes-CqBOeA5q.js → app-routes-BAEMLu9g.js} +3 -2
- package/dist/lib/app-routes-BAEMLu9g.js.map +1 -0
- package/dist/lib/{bundler-8JNIKwOs.js → bundler-CsL7hHMq.js} +4 -9
- package/dist/lib/{bundler-8JNIKwOs.js.map → bundler-CsL7hHMq.js.map} +1 -1
- package/dist/lib/components/index.js +26 -26
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw-a2ui.js +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{config--CFrw3J3.js → config-DjZ9QWc4.js} +2 -2
- package/dist/lib/{config--CFrw3J3.js.map → config-DjZ9QWc4.js.map} +1 -1
- package/dist/lib/{configurePeerJs-DG4hliKp.js → configurePeerJs-H0WaoT0w.js} +3 -3
- package/dist/lib/{configurePeerJs-DG4hliKp.js.map → configurePeerJs-H0WaoT0w.js.map} +1 -1
- package/dist/lib/{connections-DwjzwVz0.js → connections-BURqMIUv.js} +2 -2
- package/dist/lib/{connections-DwjzwVz0.js.map → connections-BURqMIUv.js.map} +1 -1
- package/dist/lib/content/markdown-links.d.ts +19 -0
- package/dist/lib/core/app-routes.d.ts +1 -0
- package/dist/lib/{downloadGroupFile-DmcBQU1n.js → downloadGroupFile-B8J4up2a.js} +2 -2
- package/dist/lib/{downloadGroupFile-DmcBQU1n.js.map → downloadGroupFile-B8J4up2a.js.map} +1 -1
- package/dist/lib/{file-viewer-C3YKnq_-.js → file-viewer-CwvhxAAG.js} +5 -5
- package/dist/lib/{file-viewer-C3YKnq_-.js.map → file-viewer-CwvhxAAG.js.map} +1 -1
- package/dist/lib/{getGroupDir-m0f-ekgX.js → getGroupDir-QrN2aTo8.js} +4 -4
- package/dist/lib/{getGroupDir-m0f-ekgX.js.map → getGroupDir-QrN2aTo8.js.map} +1 -1
- package/dist/lib/{git-C-Q6-IVe.js → git-DhZoe1SE.js} +3 -3
- package/dist/lib/{git-C-Q6-IVe.js.map → git-DhZoe1SE.js.map} +1 -1
- package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js → iframe-sanitizer-Bujgq14T.js} +2 -2
- package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js.map → iframe-sanitizer-Bujgq14T.js.map} +1 -1
- package/dist/lib/index.js +27 -27
- package/dist/lib/{initChatSplitResize-yyBTU6h9.js → initChatSplitResize-BjiWoqC_.js} +2 -2
- package/dist/lib/{initChatSplitResize-yyBTU6h9.js.map → initChatSplitResize-BjiWoqC_.js.map} +1 -1
- package/dist/lib/{initControlPlane-DnpAzphg.js → initControlPlane-C9JxQCDh.js} +16 -16
- package/dist/lib/{initControlPlane-DnpAzphg.js.map → initControlPlane-C9JxQCDh.js.map} +1 -1
- package/dist/lib/{markdown-DgdSt2GD.js → markdown-DYHmNjC4.js} +126 -5
- package/dist/lib/markdown-DYHmNjC4.js.map +1 -0
- package/dist/lib/{mcp-reconnect-C86MR3z8.js → mcp-reconnect-BxJ77WSb.js} +2 -2
- package/dist/lib/{mcp-reconnect-C86MR3z8.js.map → mcp-reconnect-BxJ77WSb.js.map} +1 -1
- package/dist/lib/{memoryStorage-UR8E8K-H.js → memoryStorage-D3FBwO9T.js} +2 -2
- package/dist/lib/{memoryStorage-UR8E8K-H.js.map → memoryStorage-D3FBwO9T.js.map} +1 -1
- package/dist/lib/{orchestrator-ClXbJ4Mb.js → orchestrator-C6dc-2OQ.js} +130 -27
- package/dist/lib/{orchestrator-ClXbJ4Mb.js.map → orchestrator-C6dc-2OQ.js.map} +1 -1
- package/dist/lib/{orchestrator-CjEau_RG.js → orchestrator-DVkyd8K9.js} +27 -17
- package/dist/lib/orchestrator-DVkyd8K9.js.map +1 -0
- package/dist/lib/{peerjs-BdfpltIe.js → peerjs-BUS9O04I.js} +274 -60
- package/dist/lib/peerjs-BUS9O04I.js.map +1 -0
- package/dist/lib/{push-client-DjwKknNg.js → push-client-4JsQGmQa.js} +3 -3
- package/dist/lib/{push-client-DjwKknNg.js.map → push-client-4JsQGmQa.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js → readGroupFileBytes-CSA7u-nJ.js} +2 -2
- package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js.map → readGroupFileBytes-CSA7u-nJ.js.map} +1 -1
- package/dist/lib/{shadow-claw-DcPGKenn.js → shadow-claw-BMoF8Auf.js} +11 -11
- package/dist/lib/{shadow-claw-DcPGKenn.js.map → shadow-claw-BMoF8Auf.js.map} +1 -1
- package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js → shadow-claw-a2ui-2I5nffIn.js} +2 -2
- package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js.map → shadow-claw-a2ui-2I5nffIn.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-03oJ__XC.js → shadow-claw-accounts-BCjlgvzy.js} +3 -3
- package/dist/lib/{shadow-claw-accounts-03oJ__XC.js.map → shadow-claw-accounts-BCjlgvzy.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js → shadow-claw-channel-config-CxQAmlDE.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js.map → shadow-claw-channel-config-CxQAmlDE.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-BgaJiPdE.js → shadow-claw-channels-CuYMUVAG.js} +3 -3
- package/dist/lib/{shadow-claw-channels-BgaJiPdE.js.map → shadow-claw-channels-CuYMUVAG.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-mXPQZbwT.js → shadow-claw-chat-RFtPmmyl.js} +13 -12
- package/dist/lib/shadow-claw-chat-RFtPmmyl.js.map +1 -0
- package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js → shadow-claw-control-plane-siqmRzR1.js} +7 -7
- package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js.map → shadow-claw-control-plane-siqmRzR1.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js → shadow-claw-conversations-DygK5y1e.js} +7 -7
- package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js.map → shadow-claw-conversations-DygK5y1e.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-BSbZvSl-.js → shadow-claw-file-viewer-DGMA7d7H.js} +11 -11
- package/dist/lib/shadow-claw-file-viewer-DGMA7d7H.js.map +1 -0
- package/dist/lib/{shadow-claw-files-BLVr9Pua.js → shadow-claw-files-CgD1B9J7.js} +8 -8
- package/dist/lib/{shadow-claw-files-BLVr9Pua.js.map → shadow-claw-files-CgD1B9J7.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-CHC1H86J.js → shadow-claw-git-Bw1jGRrf.js} +6 -6
- package/dist/lib/{shadow-claw-git-CHC1H86J.js.map → shadow-claw-git-Bw1jGRrf.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js → shadow-claw-integrations-ChaXtvsg.js} +4 -4
- package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js.map → shadow-claw-integrations-ChaXtvsg.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-CKXfxd3D.js → shadow-claw-llm-CDM4Akjc.js} +6 -6
- package/dist/lib/{shadow-claw-llm-CKXfxd3D.js.map → shadow-claw-llm-CDM4Akjc.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js → shadow-claw-mcp-remote-BLxs_Z4I.js} +4 -4
- package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js.map → shadow-claw-mcp-remote-BLxs_Z4I.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-dpYvfchh.js → shadow-claw-networking-BYt-kMSI.js} +2 -2
- package/dist/lib/{shadow-claw-networking-dpYvfchh.js.map → shadow-claw-networking-BYt-kMSI.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-_YeAVPga.js → shadow-claw-notifications-Dpe4EtZI.js} +3 -3
- package/dist/lib/{shadow-claw-notifications-_YeAVPga.js.map → shadow-claw-notifications-Dpe4EtZI.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js → shadow-claw-page-header-P4EvWyUr.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js.map → shadow-claw-page-header-P4EvWyUr.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-DVzZriZ7.js → shadow-claw-pages-DWd_c4d6.js} +10 -10
- package/dist/lib/{shadow-claw-pages-DVzZriZ7.js.map → shadow-claw-pages-DWd_c4d6.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js → shadow-claw-peerjs-D928817m.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js.map → shadow-claw-peerjs-D928817m.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js → shadow-claw-settings-C8OPrSqs.js} +8 -8
- package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js.map → shadow-claw-settings-C8OPrSqs.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-Bv__kXG6.js → shadow-claw-storage-CZ2uZJNw.js} +5 -5
- package/dist/lib/{shadow-claw-storage-Bv__kXG6.js.map → shadow-claw-storage-CZ2uZJNw.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js → shadow-claw-task-server-CLT018BX.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js.map → shadow-claw-task-server-CLT018BX.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-qmcDT4PU.js → shadow-claw-tasks-D5h-lGmq.js} +9 -8
- package/dist/lib/shadow-claw-tasks-D5h-lGmq.js.map +1 -0
- package/dist/lib/{shadow-claw-terminal-0QUWP8of.js → shadow-claw-terminal-Cy1O6KVM.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-0QUWP8of.js.map → shadow-claw-terminal-Cy1O6KVM.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js → shadow-claw-tools-CVD06bCR.js} +9 -9
- package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js.map → shadow-claw-tools-CVD06bCR.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js → shadow-claw-webvm-DoGl5ZSJ.js} +3 -3
- package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js.map → shadow-claw-webvm-DoGl5ZSJ.js.map} +1 -1
- package/dist/lib/subsystems/channels/peerjs.d.ts +37 -4
- package/dist/lib/subsystems/channels/room.d.ts +4 -0
- package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js → syncWebMcpRegistration-BeYkQEvj.js} +5 -5
- package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js.map → syncWebMcpRegistration-BeYkQEvj.js.map} +1 -1
- package/dist/lib/tools-C3Kft940.js +1 -0
- package/dist/lib/{tools-DBaMRiEu.js → tools-DKzPWc0q.js} +2 -2
- package/dist/lib/{tools-DBaMRiEu.js.map → tools-DKzPWc0q.js.map} +1 -1
- package/dist/lib/{tools-DwwB9RBa.js → tools-DqcJe8LS.js} +5 -5
- package/dist/lib/{tools-DwwB9RBa.js.map → tools-DqcJe8LS.js.map} +1 -1
- package/dist/lib/{trusted-types-Dx0RZlrd.js → trusted-types-Oz7xXJAY.js} +4 -4
- package/dist/lib/{trusted-types-Dx0RZlrd.js.map → trusted-types-Oz7xXJAY.js.map} +1 -1
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/namespacedStorage.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/{webmcp-j_1_T3wf.js → webmcp-BC8_WafM.js} +4 -4
- package/dist/lib/{webmcp-j_1_T3wf.js.map → webmcp-BC8_WafM.js.map} +1 -1
- package/dist/lib/worker/utils/system-prompt.d.ts +4 -1
- package/dist/public/.agents/skills/main/skill-creator/SKILL.md +3 -2
- package/dist/public/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/dist/public/.well-known/agent-skills/index.json +1 -1
- package/dist/public/.well-known/mcp/server-card.json +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/agent.worker.js +18 -17
- package/dist/public/app-routes-BMQ4HFaM.js +1 -0
- package/dist/public/{bundler-Ca-Xwln8.js → bundler-0if-QelV.js} +4 -4
- package/dist/public/{config-CrHchneq.js → config-Bnwx4EfS.js} +1 -1
- package/dist/public/{configurePeerJs-B470pdeU.js → configurePeerJs-DkyGvwk_.js} +1 -1
- package/dist/public/{connections-DvbgdkaB.js → connections-6575KDGE.js} +1 -1
- package/dist/public/{custom-element-security-FU04Cq05.js → custom-element-security-BQJQ_oKz.js} +1 -1
- package/dist/public/docs/example/article/index.html +2 -2
- package/dist/public/docs/publishing/index.html +2 -2
- package/dist/public/docs/skill-creator/index.html +2 -2
- package/dist/public/docs/subsystems/skills.md +3 -1
- package/dist/public/{downloadGroupFile-D8KRJGGL.js → downloadGroupFile-Wo1Sxdhr.js} +1 -1
- package/dist/public/{e2e-bridge-CSW0S5Yz.js → e2e-bridge-CvLCUU2O.js} +1 -1
- package/dist/public/{file-viewer-Cs-riNvy.js → file-viewer-CIjqAvNF.js} +1 -1
- package/dist/public/{getGroupDir-P1h9wl6S.js → getGroupDir-BwprrdrQ.js} +1 -1
- package/dist/public/{git-7Vq_SJSp.js → git-BSnY2D-A.js} +2 -2
- package/dist/public/{iframe-sanitizer-y2Z1pPwY.js → iframe-sanitizer-viROQkRn.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/public/index.js +1 -1
- package/dist/public/{initChatSplitResize-CzV2E7Ul.js → initChatSplitResize-BA18wLQQ.js} +1 -1
- package/dist/public/{initControlPlane-BqCY0NQy.js → initControlPlane-L96uJkRA.js} +1 -1
- package/dist/public/main/index.html +2 -2
- package/dist/public/main/memory/index.html +2 -2
- package/dist/public/{markdown-Cw7vCtTg.js → markdown-DGjZAm_w.js} +17 -14
- package/dist/public/{mcp-reconnect-9emsqGRe.js → mcp-reconnect-CBHuaYdF.js} +1 -1
- package/dist/public/{memoryStorage-C0KvLNUp.js → memoryStorage-C1llaYus.js} +1 -1
- package/dist/public/orchestrator-C0VOoTiK.js +15 -0
- package/dist/public/{orchestrator-DpkkeD6T.js → orchestrator-DMWi--Dc.js} +20 -19
- package/dist/public/peerjs-Bf6ZxfbA.js +1 -0
- package/dist/public/{push-client-CHjSbrWs.js → push-client-BD4YalBa.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-BBPV_9X8.js → shadow-claw-DRy-D4Qi.js} +2 -2
- package/dist/public/{shadow-claw-accounts-xUOLBsQZ.js → shadow-claw-accounts-DnfmA8cb.js} +1 -1
- package/dist/public/{shadow-claw-channels-BJvrKQjg.js → shadow-claw-channels-8UkycZAa.js} +1 -1
- package/dist/public/{shadow-claw-chat-BG2EaRaw.js → shadow-claw-chat-Cf5LUiul.js} +9 -9
- package/dist/public/{shadow-claw-control-plane-BBa7WbTg.js → shadow-claw-control-plane-UsBF-Nvd.js} +2 -2
- package/dist/public/{shadow-claw-conversations-CFaWFmkm.js → shadow-claw-conversations-Aoe61Y21.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-Z-GIKaE9.js → shadow-claw-file-viewer-D28dSSEn.js} +6 -6
- package/dist/public/{shadow-claw-files-BBx4iMsk.js → shadow-claw-files-CaDUlPEU.js} +1 -1
- package/dist/public/{shadow-claw-git-vTOKatwd.js → shadow-claw-git-DYNcZMWA.js} +2 -2
- package/dist/public/{shadow-claw-integrations-BBVnO0Fc.js → shadow-claw-integrations-BJf_hQVv.js} +1 -1
- package/dist/public/{shadow-claw-llm-Ce1Ax6-x.js → shadow-claw-llm-BqK2SIRf.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-Bkx0gsmF.js → shadow-claw-mcp-remote-B_dDG990.js} +1 -1
- package/dist/public/{shadow-claw-networking-q4XIzdB5.js → shadow-claw-networking-D8LxOofv.js} +1 -1
- package/dist/public/{shadow-claw-notifications-D2cz0gmm.js → shadow-claw-notifications-DpVyiNG_.js} +1 -1
- package/dist/public/{shadow-claw-page-header-BccSHItx.js → shadow-claw-page-header-DdC7bJuW.js} +1 -1
- package/dist/public/{shadow-claw-pages-3335lmSC.js → shadow-claw-pages-CYMl4J-6.js} +3 -3
- package/dist/public/{shadow-claw-settings-4ptYuJwO.js → shadow-claw-settings-Da_8Oy3O.js} +3 -3
- package/dist/public/{shadow-claw-storage-bIrPKFhF.js → shadow-claw-storage-DXIm86_-.js} +1 -1
- package/dist/public/{shadow-claw-task-server-5yqVBxy1.js → shadow-claw-task-server-BCceBD0G.js} +1 -1
- package/dist/public/{shadow-claw-tasks-DcqYHPLZ.js → shadow-claw-tasks-BW1QZ5L3.js} +19 -19
- package/dist/public/{shadow-claw-terminal-fARaDONr.js → shadow-claw-terminal-vqfsxhcK.js} +1 -1
- package/dist/public/{shadow-claw-tools-paEAhcJr.js → shadow-claw-tools-l0Jsa7UJ.js} +1 -1
- package/dist/public/{shadow-claw-webvm-CbzH_vyX.js → shadow-claw-webvm-CDPOWZm7.js} +1 -1
- package/dist/public/skills/main/skill-creator/SKILL.md +3 -2
- package/dist/public/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/dist/public/static-main-manifest.json +2 -2
- package/dist/public/{syncWebMcpRegistration-CWSYaHex.js → syncWebMcpRegistration-5b5FkP9_.js} +1 -1
- package/dist/public/tools-B-PzsLc2.js +1 -0
- package/dist/public/{tools-C8x3nmo4.js → tools-CcgG5XuA.js} +1 -1
- package/dist/public/{tools-DvckJZG2.js → tools-VSOY66vs.js} +1 -1
- package/dist/public/{webmcp-DAjmliCx.js → webmcp-DBONjQWd.js} +1 -1
- package/dist/server.js +2 -2
- package/package.json +2 -2
- package/src/__mocks__/marked.cjs +14 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +17 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.ts +5 -1
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +78 -0
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +6 -2
- package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +56 -0
- package/src/components/shadow-claw-tasks/shadow-claw-tasks.test.ts +22 -0
- package/src/components/shadow-claw-tasks/shadow-claw-tasks.ts +5 -1
- package/src/content/markdown-links.test.ts +109 -0
- package/src/content/markdown-links.ts +187 -0
- package/src/content/markdown.test.ts +33 -0
- package/src/content/markdown.ts +6 -1
- package/src/core/app-routes.test.ts +65 -0
- package/src/core/app-routes.ts +1 -1
- package/src/core/orchestrator/orchestrator.ts +3 -0
- package/src/core/orchestrator/utils/compactContext.ts +2 -0
- package/src/core/orchestrator/utils/invokeAgent.ts +1 -0
- package/src/subsystems/accounts/service-accounts.test.ts +0 -1
- package/src/subsystems/channels/peerjs.test.ts +479 -1
- package/src/subsystems/channels/peerjs.ts +420 -75
- package/src/subsystems/channels/room.test.ts +35 -0
- package/src/subsystems/channels/room.ts +15 -0
- package/src/subsystems/skills/activateSkill.test.ts +38 -5
- package/src/subsystems/skills/activateSkill.ts +25 -3
- package/src/subsystems/skills/parseSkill.test.ts +71 -0
- package/src/subsystems/skills/parseSkill.ts +185 -25
- package/src/subsystems/tools/files.ts +4 -4
- package/src/worker/tools/spawn-subagent/spawn-subagent.test.ts +22 -23
- package/src/worker/tools/workspace/send-file.test.ts +24 -1
- package/src/worker/tools/workspace/send-file.ts +6 -3
- package/src/worker/utils/handleCompact.test.ts +3 -4
- package/src/worker/utils/handleInvoke.test.ts +13 -11
- package/src/worker/utils/handleInvoke.ts +3 -0
- package/src/worker/utils/handleMessage.test.ts +0 -1
- package/src/worker/utils/post.test.ts +3 -4
- package/src/worker/utils/sandboxedEval.test.ts +1 -2
- package/src/worker/utils/system-prompt.test.ts +59 -0
- package/src/worker/utils/system-prompt.ts +21 -1
- package/src/worker/utils/withRetry.test.ts +3 -16
- package/dist/lib/app-routes-CqBOeA5q.js.map +0 -1
- package/dist/lib/markdown-DgdSt2GD.js.map +0 -1
- package/dist/lib/orchestrator-CjEau_RG.js.map +0 -1
- package/dist/lib/peerjs-BdfpltIe.js.map +0 -1
- package/dist/lib/shadow-claw-chat-mXPQZbwT.js.map +0 -1
- package/dist/lib/shadow-claw-file-viewer-BSbZvSl-.js.map +0 -1
- package/dist/lib/shadow-claw-tasks-qmcDT4PU.js.map +0 -1
- package/dist/lib/tools-D4Pp-nUw.js +0 -1
- package/dist/public/app-routes-Bs-riIvr.js +0 -1
- package/dist/public/orchestrator-BWkHHO9Y.js +0 -15
- package/dist/public/peerjs-tf2EmWjB.js +0 -1
- package/dist/public/tools-COduyYJ0.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-conversations-BLwHTwdW.js","names":["shadowClawConversationsStyles","shadowClawConversationsTemplate"],"sources":["../../src/components/shadow-claw-conversations/shadow-claw-conversations.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport {\n getAvailableProviders,\n getProviderRuntimeHeaders,\n} from \"../../core/orchestrator/utils/operations/provider.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { setConfig } from \"../../db/setConfig.js\";\nimport { setSanitizedHtml } from \"../../security/trusted-types.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\nimport { ChannelRegistry } from \"../../subsystems/channels/channel-registry.js\";\nimport { loadDeclarativeTools } from \"../../subsystems/tools/declarative.js\";\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\n\nimport type { LLMProvider } from \"../../subsystems/providers/types.js\";\n\nimport type {\n ProviderModelItem,\n ShadowClawProviderModelPicker,\n} from \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\n\nimport type {\n ProviderRuntimeOverrides,\n ShadowClawProviderModuleSettings,\n} from \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\n\nimport \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\nimport \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawConversationsStyles from \"./shadow-claw-conversations.css\" with { type: \"css\" };\nimport shadowClawConversationsTemplate from \"./shadow-claw-conversations.html\" with { type: \"html\" };\n\nexport class ShadowClawConversations extends ShadowClawElement {\n static styles = shadowClawConversationsStyles;\n static template = shadowClawConversationsTemplate;\n\n public channelRegistry: ChannelRegistry | null = null;\n public db: ShadowClawDatabase | null = null;\n private _autoScrollActive = false;\n private _autoScrollSpeed = 0;\n\n private _draggedGroupId: string | null = null;\n private _effectCleanup: (() => void) | null = null;\n private _keyboardGrabbedId: string | null = null;\n private _pendingCloneGroupId: string | null = null;\n private _pendingDeleteGroupId: string | null = null;\n private _pendingDetailsPinnedMaxTokens: number | null = null;\n private _pendingDetailsPinnedModel: string | null = null;\n private _pendingDetailsPinnedProvider: string | null = null;\n private _pendingDetailsProviderRuntimeOverrides: ProviderRuntimeOverrides =\n {};\n private _pendingDetailsSubagentMaxTokens: number | null = null;\n private _pendingDetailsSubagentMode: \"automatic\" | \"manual\" = \"automatic\";\n private _pendingDetailsSubagentModel: string | null = null;\n private _pendingDetailsSubagentProvider: string | null = null;\n private _pendingDetailsToolTags: string[] | null = null;\n private _pendingRenameGroupId: string | null = null;\n private _pendingRenameName: string | null = null;\n private _touchDraggedGroupId: string | null = null;\n private _touchId: number | null = null;\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n\n // Restore persisted height\n const saved = await getConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT);\n if (saved && typeof saved === \"number\" && saved > 0) {\n this.style.flex = \"none\";\n this.style.height = `${saved}px`;\n }\n\n this.channelRegistry =\n orchestratorStore.orchestrator?.channelRegistry || null;\n\n (this.shadowRoot as ShadowRoot)\n .querySelector(\"[data-action='create']\")\n ?.addEventListener(\"click\", () => this.handleCreate());\n\n // Dialog event listeners\n this._setupDialogListeners();\n\n this._initResizeHandle();\n\n // Global dragover auto-scroll listener on shadowRoot\n root.addEventListener(\"dragover\", (e: any) => {\n if (this._draggedGroupId !== null) {\n this._updateAutoScrollSpeed(e.clientY);\n }\n });\n\n // Ensure we stop scrolling if the drag ends or leaves\n root.addEventListener(\"dragend\", () => {\n this._stopAutoScroll();\n });\n root.addEventListener(\"drop\", () => {\n this._stopAutoScroll();\n });\n\n this.render();\n\n // Re-render when store state changes\n this._effectCleanup = effect(() => {\n // Access signals to establish tracking\n orchestratorStore.groups;\n orchestratorStore.activeGroupId;\n orchestratorStore.unreadGroupIds;\n\n this.render();\n });\n }\n\n disconnectedCallback() {\n if (this._effectCleanup) {\n this._effectCleanup();\n this._effectCleanup = null;\n }\n }\n\n getChannelRegistry(): ChannelRegistry | null {\n const current = orchestratorStore.orchestrator?.channelRegistry || null;\n if (current) {\n this.channelRegistry = current;\n }\n\n return this.channelRegistry;\n }\n\n openCloneDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__clone-name\");\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n }\n\n openCreateDialog() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n if (input) {\n input.value = \"\";\n input.focus();\n }\n }\n\n openDeleteDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__delete-name\");\n const cancelBtn = dialog?.querySelector(\n \".conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n cancelBtn?.focus();\n }\n\n openDetailsDialog(currentName: string, groupId?: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const groupIdInput = root.querySelector(\n \"#conversations-details-group-id\",\n ) as HTMLInputElement | null;\n const copyBtn = root.querySelector(\n \"#conversations-group-id-copy-btn\",\n ) as HTMLButtonElement | null;\n const toolsContainer = root.querySelector(\n \"#conversations-details-tools\",\n ) as HTMLElement | null;\n const toolInput = root.querySelector(\n \"#conversations-tool-input\",\n ) as HTMLInputElement | null;\n const toolAddBtn = root.querySelector(\n \"#conversations-add-tool-btn\",\n ) as HTMLButtonElement | null;\n const datalist = root.querySelector(\n \"#conversations-available-tools\",\n ) as HTMLDataListElement | null;\n const mainPicker = root.querySelector(\n \"#conversations-main-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const mainProviderModuleSettings = root.querySelector(\n \"#conversations-main-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n const agentMaxTokensInput = root.querySelector(\n \"#conversations-agent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentSettingsContainer = root.querySelector(\n \"#conversations-subagent-settings-container\",\n ) as HTMLElement | null;\n const subagentModeSelect = root.querySelector(\n \"#conversations-subagent-mode\",\n ) as HTMLSelectElement | null;\n const subagentMaxTokensInput = root.querySelector(\n \"#conversations-subagent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentManualContainer = root.querySelector(\n \"#conversations-subagent-manual-container\",\n ) as HTMLElement | null;\n const subagentPicker = root.querySelector(\n \"#conversations-subagent-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const subagentProviderModuleSettings = root.querySelector(\n \"#conversations-subagent-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n\n // Populate Group ID field\n if (groupIdInput) {\n groupIdInput.value = groupId?.replace(\":\", \"-\") || \"\";\n }\n\n // Wire up copy button\n if (copyBtn && groupIdInput) {\n // Clone to remove previous listeners\n const freshCopyBtn = copyBtn.cloneNode(true) as HTMLButtonElement;\n copyBtn.replaceWith(freshCopyBtn);\n\n freshCopyBtn.addEventListener(\"click\", async () => {\n const val = groupIdInput.value;\n if (!val) {\n return;\n }\n\n try {\n await navigator.clipboard.writeText(val);\n // Swap to a checkmark briefly\n const originalInner = freshCopyBtn.innerHTML;\n setSanitizedHtml(\n freshCopyBtn,\n `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`,\n );\n freshCopyBtn.classList.add(\n \"conversations__group-id-copy-btn--copied\",\n );\n setTimeout(() => {\n setSanitizedHtml(freshCopyBtn, originalInner);\n freshCopyBtn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n // Fallback: select the text\n groupIdInput.select();\n }\n });\n }\n\n const participantsContainer = root.querySelector(\n \"#conversations-details-participants-container\",\n ) as HTMLElement | null;\n const participantsList = root.querySelector(\n \"#conversations-details-participants-list\",\n ) as HTMLElement | null;\n\n if (participantsContainer && participantsList) {\n if (groupId && groupId.startsWith(\"peer:\")) {\n participantsContainer.style.display = \"block\";\n participantsList.replaceChildren();\n\n const orchestrator = orchestratorStore.orchestrator;\n if (orchestrator) {\n const connectedPeers =\n orchestrator.peerjs?.connectedPeersSignal?.get() || [];\n const targetPeer = groupId.replace(\"peer:\", \"\");\n\n if (connectedPeers.includes(targetPeer)) {\n let alias = \"\";\n if (orchestrator.peerjsPeerAliases) {\n for (const [a, id] of Object.entries(\n orchestrator.peerjsPeerAliases,\n )) {\n if (id === targetPeer) {\n alias = a;\n\n break;\n }\n }\n }\n\n const displayName = alias\n ? `${alias} (${targetPeer.substring(0, 8)})`\n : targetPeer;\n\n const row = document.createElement(\"div\");\n row.className = \"conversations__group-id-row\";\n\n const input = document.createElement(\"input\");\n input.className =\n \"conversations__input conversations__group-id-input\";\n input.type = \"text\";\n input.readOnly = true;\n input.value = displayName;\n input.style.marginBottom = \"0\";\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"conversations__group-id-copy-btn\";\n btn.title = \"Copy Peer ID\";\n btn.setAttribute(\"aria-label\", \"Copy Peer ID to clipboard\");\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/></svg>`;\n\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(targetPeer);\n const originalInner = btn.innerHTML;\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`;\n btn.classList.add(\"conversations__group-id-copy-btn--copied\");\n setTimeout(() => {\n btn.innerHTML = originalInner;\n btn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n input.value = targetPeer;\n input.select();\n }\n });\n\n row.appendChild(input);\n row.appendChild(btn);\n participantsList.appendChild(row);\n } else {\n const noPeers = document.createElement(\"div\");\n noPeers.style.fontSize = \"0.875rem\";\n noPeers.style.color = \"var(--text-secondary)\";\n noPeers.textContent = \"Peer is not currently connected.\";\n participantsList.appendChild(noPeers);\n }\n }\n } else {\n participantsContainer.style.display = \"none\";\n }\n }\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n const candidateToolsMap = new Map<\n string,\n { name: string; description?: string }\n >();\n for (const tool of TOOL_DEFINITIONS) {\n candidateToolsMap.set(tool.name, tool);\n }\n for (const tool of toolsStore.allTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n }\n }\n\n const updateDatalist = () => {\n if (!datalist) {\n return;\n }\n\n const pinned = new Set(this._pendingDetailsToolTags || []);\n datalist.replaceChildren();\n for (const tool of candidateToolsMap.values()) {\n if (pinned.has(tool.name)) {\n continue;\n }\n\n const option = document.createElement(\"option\");\n option.value = tool.name;\n datalist.appendChild(option);\n }\n };\n\n if (this.db && groupId) {\n loadDeclarativeTools(this.db, groupId)\n .then(({ tools: declTools }) => {\n let added = false;\n for (const tool of declTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n added = true;\n }\n }\n if (added) {\n updateDatalist();\n }\n })\n .catch(() => {});\n }\n\n const renderChips = () => {\n if (!toolsContainer) {\n return;\n }\n\n toolsContainer.replaceChildren();\n\n const tags = this._pendingDetailsToolTags || [];\n for (const tagName of tags) {\n const tool = candidateToolsMap.get(tagName);\n const chip = document.createElement(\"span\");\n chip.className = \"conversations__tool-chip\";\n\n const nameSpan = document.createElement(\"span\");\n nameSpan.textContent = tagName;\n if (tool?.description) {\n nameSpan.title = tool.description;\n }\n\n chip.appendChild(nameSpan);\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"conversations__tool-chip-remove\";\n removeBtn.textContent = \"×\";\n removeBtn.setAttribute(\"aria-label\", `Remove tool ${tagName}`);\n\n removeBtn.addEventListener(\"click\", () => {\n if (!this._pendingDetailsToolTags) {\n return;\n }\n\n this._pendingDetailsToolTags = this._pendingDetailsToolTags.filter(\n (t) => t !== tagName,\n );\n renderChips();\n });\n\n chip.appendChild(removeBtn);\n toolsContainer.appendChild(chip);\n }\n\n updateDatalist();\n\n if (subagentSettingsContainer && subagentModeSelect) {\n const showSubagentSettings =\n this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n if (!showSubagentSettings) {\n this._pendingDetailsSubagentMode = \"automatic\";\n }\n\n if (subagentManualContainer) {\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n showSubagentSettings\n ? \"flex\"\n : \"none\";\n }\n\n if (subagentMaxTokensInput) {\n subagentMaxTokensInput.value =\n typeof this._pendingDetailsSubagentMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsSubagentMaxTokens) &&\n this._pendingDetailsSubagentMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsSubagentMaxTokens))\n : \"\";\n }\n }\n };\n\n if (toolAddBtn && toolInput) {\n toolAddBtn.onclick = () => {\n const val = toolInput.value.trim();\n if (!val) {\n return;\n }\n\n const isValidName = /^[a-z][a-z0-9_]{0,63}$/.test(val);\n const tool = candidateToolsMap.get(val);\n if (!tool && !isValidName) {\n toolInput.value = \"\";\n\n return;\n }\n\n if (!this._pendingDetailsToolTags) {\n this._pendingDetailsToolTags = [];\n }\n\n if (!this._pendingDetailsToolTags.includes(val)) {\n this._pendingDetailsToolTags.push(val);\n renderChips();\n }\n\n toolInput.value = \"\";\n };\n\n toolInput.onkeydown = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n toolAddBtn.click();\n }\n };\n }\n\n renderChips();\n\n if (\n mainPicker &&\n mainProviderModuleSettings &&\n subagentModeSelect &&\n subagentSettingsContainer &&\n subagentManualContainer &&\n subagentPicker &&\n subagentProviderModuleSettings\n ) {\n const providers = (getAvailableProviders() as LLMProvider[]) || [];\n\n mainPicker.setLabels({\n providerLabel: \"Pinned Provider\",\n defaultProviderLabel: \"Default (Global)\",\n modelLabel: \"Pinned Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom model id\",\n });\n\n mainPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n mainPicker.setProviders(providers);\n mainPicker.setValue({\n providerId: this._pendingDetailsPinnedProvider,\n modelId: this._pendingDetailsPinnedModel,\n });\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n if (agentMaxTokensInput) {\n agentMaxTokensInput.value =\n typeof this._pendingDetailsPinnedMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsPinnedMaxTokens) &&\n this._pendingDetailsPinnedMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsPinnedMaxTokens))\n : \"\";\n }\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n subagentPicker.setLabels({\n providerLabel: \"Pinned Subagent Provider\",\n defaultProviderLabel: \"Default (Parent Provider)\",\n modelLabel: \"Pinned Subagent Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom subagent model id\",\n });\n\n subagentPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n subagentPicker.setProviders(providers);\n subagentPicker.setValue({\n providerId: this._pendingDetailsSubagentProvider,\n modelId: this._pendingDetailsSubagentModel,\n });\n\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n if (!mainPicker.hasAttribute(\"data-bound\")) {\n mainPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsPinnedProvider = detail.providerId || null;\n this._pendingDetailsPinnedModel = detail.modelId || null;\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n\n mainPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!agentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n agentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(agentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsPinnedMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsPinnedMaxTokens = null;\n }\n });\n\n agentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!mainProviderModuleSettings.hasAttribute(\"data-bound\")) {\n mainProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n mainProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentPicker.hasAttribute(\"data-bound\")) {\n subagentPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsSubagentProvider = detail.providerId || null;\n this._pendingDetailsSubagentModel = detail.modelId || null;\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n subagentPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentProviderModuleSettings.hasAttribute(\"data-bound\")) {\n subagentProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n subagentProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n subagentModeSelect.value = this._pendingDetailsSubagentMode;\n\n const showSubagentSettings = this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n\n mainProviderModuleSettings.style.display = this\n ._pendingDetailsPinnedProvider\n ? \"flex\"\n : \"none\";\n\n subagentManualContainer.style.display =\n showSubagentSettings && this._pendingDetailsSubagentMode === \"manual\"\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n showSubagentSettings &&\n this._pendingDetailsSubagentMode === \"manual\" &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n\n subagentModeSelect.onchange = () => {\n this._pendingDetailsSubagentMode =\n subagentModeSelect.value === \"manual\" ? \"manual\" : \"automatic\";\n\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope()\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope() &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n };\n\n if (!subagentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n subagentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(subagentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsSubagentMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsSubagentMaxTokens = null;\n }\n });\n\n subagentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n }\n\n if (input) {\n input.value = currentName;\n input.select();\n input.focus();\n }\n }\n\n async handleClone(groupId: string) {\n if (!this.db) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n if (!group) {\n return;\n }\n\n this._pendingCloneGroupId = groupId;\n this.openCloneDialog(group.name);\n }\n\n async handleCreate() {\n if (!this.db) {\n return;\n }\n\n this.openCreateDialog();\n }\n\n async handleDelete(groupId: string, name: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingDeleteGroupId = groupId;\n this.openDeleteDialog(name);\n }\n\n async handleDetails(groupId: string, currentName: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingRenameGroupId = groupId;\n this._pendingRenameName = currentName;\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n const currentTags = group?.toolTags || [];\n\n this._pendingDetailsToolTags = [...currentTags];\n this._pendingDetailsPinnedMaxTokens =\n typeof group?.pinnedMaxTokens === \"number\" &&\n Number.isFinite(group.pinnedMaxTokens) &&\n group.pinnedMaxTokens > 0\n ? Math.floor(group.pinnedMaxTokens)\n : null;\n this._pendingDetailsPinnedProvider = group?.pinnedProvider || null;\n this._pendingDetailsPinnedModel = group?.pinnedModel || null;\n this._pendingDetailsProviderRuntimeOverrides = JSON.parse(\n JSON.stringify(group?.providerRuntimeOverrides || {}),\n );\n this._pendingDetailsSubagentMode =\n group?.subagentModelSelectionMode === \"manual\" ? \"manual\" : \"automatic\";\n this._pendingDetailsSubagentMaxTokens =\n typeof group?.subagentMaxTokens === \"number\" &&\n Number.isFinite(group.subagentMaxTokens) &&\n group.subagentMaxTokens > 0\n ? Math.floor(group.subagentMaxTokens)\n : null;\n this._pendingDetailsSubagentProvider =\n group?.subagentPinnedProvider || null;\n this._pendingDetailsSubagentModel = group?.subagentPinnedModel || null;\n this.openDetailsDialog(currentName, groupId);\n }\n\n /**\n * Reorder: move draggedId to the position of targetId,\n * or apply a pre-computed order array.\n */\n async handleReorder(\n draggedId: string,\n targetId: string,\n precomputedIds?: string[],\n ) {\n if (!this.db) {\n return;\n }\n\n if (precomputedIds) {\n await orchestratorStore.reorderConversations(this.db, precomputedIds);\n\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const fromIdx = ids.indexOf(draggedId);\n const toIdx = ids.indexOf(targetId);\n\n if (fromIdx < 0 || toIdx < 0) {\n return;\n }\n\n ids.splice(fromIdx, 1);\n ids.splice(toIdx, 0, draggedId);\n\n await orchestratorStore.reorderConversations(this.db, ids);\n }\n\n async handleSwitch(groupId: string) {\n if (groupId === orchestratorStore.activeGroupId) {\n return;\n }\n\n // Derive the appropriate sidebar page from the current active page.\n // \"pages\" is excluded as a fallback because its route omits groupId\n // when no workspace path is present, so it can't represent a switch.\n const rawPage = orchestratorStore.activePage;\n const fallbackPage = orchestratorStore.sidebarDefaultPage;\n const page =\n rawPage === \"chat\" || rawPage === \"tasks\" || rawPage === \"files\"\n ? rawPage\n : fallbackPage === \"tasks\" || fallbackPage === \"files\"\n ? fallbackPage\n : \"chat\";\n\n // Dispatch a navigate event so the URL updates to /page/groupId and\n // the router calls applyRoute, which handles switchConversation.\n document.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page, groupId },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n async render() {\n const list = (this.shadowRoot as ShadowRoot).querySelector(\n \".conversation-list\",\n );\n\n if (!list) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const activeId = orchestratorStore.activeGroupId;\n const unreadIds = orchestratorStore.unreadGroupIds || new Set();\n const channelRegistry = this.getChannelRegistry();\n\n list.replaceChildren();\n\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i];\n const isActive = group.groupId === activeId;\n const isUnread = !isActive && unreadIds.has(group.groupId);\n const li = document.createElement(\"li\");\n\n li.className = `conversation-item${isActive ? \" active\" : \"\"}${isUnread ? \" unread\" : \"\"}`;\n li.setAttribute(\"data-group-id\", group.groupId);\n li.setAttribute(\"role\", \"listitem\");\n li.setAttribute(\"tabindex\", \"0\");\n li.setAttribute(\"aria-describedby\", \"reorder-instructions\");\n li.setAttribute(\n \"aria-label\",\n `${group.name}, position ${i + 1} of ${groups.length}`,\n );\n\n if (this._keyboardGrabbedId === group.groupId) {\n li.classList.add(\"keyboard-grabbed\");\n\n li.setAttribute(\"aria-grabbed\", \"true\");\n }\n\n const badge = channelRegistry\n ? channelRegistry.getBadge(group.groupId)\n : \"\";\n\n const canDelete = groups.length > 1;\n\n const handle = document.createElement(\"span\");\n handle.className = \"drag-handle\";\n handle.setAttribute(\"draggable\", \"true\");\n handle.setAttribute(\"aria-hidden\", \"true\");\n handle.setAttribute(\"title\", \"Drag to reorder\");\n handle.textContent = \"⠿\";\n\n li.append(handle);\n\n if (badge) {\n const badgeEl = document.createElement(\"span\");\n badgeEl.className = \"channel-badge\";\n badgeEl.textContent = badge;\n li.append(badgeEl);\n }\n\n if (group.toolTags && group.toolTags.length > 0) {\n const toolBadgeEl = document.createElement(\"span\");\n toolBadgeEl.className = \"tool-badge\";\n toolBadgeEl.textContent = \"🔧\";\n toolBadgeEl.title = `Pinned Tools: ${group.toolTags.join(\", \")}`;\n li.append(toolBadgeEl);\n }\n\n const nameEl = document.createElement(\"span\");\n nameEl.className = \"conversation-name\";\n nameEl.textContent = group.name;\n\n const actionsEl = document.createElement(\"span\");\n actionsEl.className = \"conversation-actions\";\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.setAttribute(\"data-action\", \"clone\");\n cloneBtn.setAttribute(\"title\", \"Clone\");\n cloneBtn.setAttribute(\"aria-label\", `Clone ${group.name}`);\n cloneBtn.textContent = \"📋\";\n\n const detailsBtn = document.createElement(\"button\");\n detailsBtn.setAttribute(\"data-action\", \"details\");\n detailsBtn.setAttribute(\"title\", \"Details\");\n detailsBtn.setAttribute(\"aria-label\", `Details for ${group.name}`);\n detailsBtn.textContent = \"⚙️\";\n\n actionsEl.append(cloneBtn, detailsBtn);\n\n if (canDelete) {\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.setAttribute(\"data-action\", \"delete\");\n deleteBtn.setAttribute(\"title\", \"Delete\");\n deleteBtn.setAttribute(\"aria-label\", `Delete ${group.name}`);\n deleteBtn.textContent = \"🗑️\";\n actionsEl.append(deleteBtn);\n }\n\n const actionsToggleBtn = document.createElement(\"button\");\n actionsToggleBtn.className = \"conversation-actions-toggle\";\n actionsToggleBtn.setAttribute(\"title\", \"More actions\");\n actionsToggleBtn.setAttribute(\n \"aria-label\",\n `More actions for ${group.name}`,\n );\n actionsToggleBtn.textContent = \"⋮\";\n\n li.append(nameEl, actionsEl, actionsToggleBtn);\n\n li.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const action = target\n .closest(\"[data-action]\")\n ?.getAttribute(\"data-action\");\n\n if (action === \"clone\") {\n this.handleClone(group.groupId);\n } else if (action === \"details\") {\n this.handleDetails(group.groupId, group.name);\n } else if (action === \"delete\") {\n this.handleDelete(group.groupId, group.name);\n } else if (target.closest(\".conversation-actions-toggle\")) {\n li.classList.toggle(\"show-actions\");\n } else if (!target.closest(\".drag-handle\")) {\n this.handleSwitch(group.groupId);\n li.classList.remove(\"show-actions\");\n }\n });\n\n li.addEventListener(\"keydown\", (e) => {\n this._handleKeyboard(e, group.groupId, group.name);\n });\n\n handle.addEventListener(\"dragstart\", (e) => {\n this._draggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n (e as DragEvent).dataTransfer?.setData(\"text/plain\", group.groupId);\n });\n\n handle.addEventListener(\"dragend\", () => {\n li.classList.remove(\"dragging\");\n\n this._draggedGroupId = null;\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n });\n\n handle.addEventListener(\n \"touchstart\",\n (e) => {\n const touch = (e as TouchEvent).touches[0];\n if (!touch) {\n return;\n }\n\n this._touchId = touch.identifier;\n this._touchDraggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n e.preventDefault();\n },\n { passive: false },\n );\n\n li.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n li.classList.add(\"drag-over\");\n }\n });\n\n li.addEventListener(\"dragleave\", () => {\n li.classList.remove(\"drag-over\");\n });\n\n li.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n\n li.classList.remove(\"drag-over\");\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n this.handleReorder(this._draggedGroupId, group.groupId);\n }\n });\n\n list.appendChild(li);\n }\n\n this._bindTouchListEvents(list);\n }\n\n _announce(message: string) {\n const region = this.shadowRoot?.querySelector(\"#live-region\");\n\n if (region) {\n region.textContent = \"\";\n\n // Force re-announcement by toggling content in the next frame\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n }\n }\n\n /**\n * Bind touch move/end on the list for cross-item dragging.\n */\n _bindTouchListEvents(list: Element) {\n // Remove old listeners by replacing with clone if needed; simpler: use a flag\n if ((list as any)._touchBound) {\n return;\n }\n\n (list as any)._touchBound = true;\n\n list.addEventListener(\n \"touchmove\",\n (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n e.preventDefault();\n\n // Find which item is under the touch point\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (\n target &&\n target.getAttribute(\"data-group-id\") !== this._touchDraggedGroupId\n ) {\n target.classList.add(\"drag-over\");\n }\n\n this._updateAutoScrollSpeed(touch.clientY);\n },\n { passive: false },\n );\n\n list.addEventListener(\"touchend\", (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findChangedTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n const targetId = target?.getAttribute(\"data-group-id\");\n\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (targetId && targetId !== this._touchDraggedGroupId) {\n this.handleReorder(this._touchDraggedGroupId, targetId);\n }\n\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n\n list.addEventListener(\"touchcancel\", () => {\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n }\n\n _findChangedTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.changedTouches.length; i++) {\n const t = e.changedTouches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _findTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.touches.length; i++) {\n const t = e.touches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _focusNext(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx !== -1 && idx < focusables.length - 1) {\n focusables[idx + 1].focus();\n }\n }\n\n _focusNextItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx !== -1 && idx < items.length - 1) {\n items[idx + 1].focus();\n }\n }\n\n _focusPrev(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx > 0) {\n focusables[idx - 1].focus();\n }\n }\n\n _focusPrevItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx > 0) {\n items[idx - 1].focus();\n }\n }\n\n /**\n * Handle keyboard-based navigation, selection, and reordering.\n * Enter/Space = select, Arrow Down/Right = focus next, Arrow Up/Left = focus prev.\n * M = grab/drop for reorder (when grabbed, Arrows move, Space/Enter drop).\n */\n _handleKeyboard(e: KeyboardEvent, groupId: string, name: string) {\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const total = ids.length;\n\n if (this._keyboardGrabbedId === null) {\n // Navigation & Selection\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this._focusNextItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this._focusPrevItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n this._focusNext(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n this._focusPrev(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // If we are on the LI itself, select it\n if ((e.target as HTMLElement).classList.contains(\"conversation-item\")) {\n e.preventDefault();\n this.handleSwitch(groupId);\n }\n\n // If on a button, the default button behavior handles it (click event)\n return;\n }\n\n // Grab for reorder\n if (e.key === \"m\" || e.key === \"M\") {\n e.preventDefault();\n this._keyboardGrabbedId = groupId;\n const pos = ids.indexOf(groupId) + 1;\n this._announce(\n `${name} grabbed. Current position ${pos} of ${total}. Use Arrow Up and Down to move, Space or Enter to drop.`,\n );\n this.render();\n }\n\n return;\n }\n\n // Currently grabbed\n if (e.key === \"Escape\") {\n e.preventDefault();\n this._announce(\n `Reorder cancelled. ${name} returned to original position.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // Drop\n e.preventDefault();\n const pos = ids.indexOf(this._keyboardGrabbedId) + 1;\n const droppedName =\n groups.find((g) => g.groupId === this._keyboardGrabbedId)?.name || \"\";\n this._announce(\n `${droppedName} dropped at position ${pos} of ${total}. Reordering complete.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const currentIdx = ids.indexOf(this._keyboardGrabbedId);\n const newIdx = e.key === \"ArrowUp\" ? currentIdx - 1 : currentIdx + 1;\n if (newIdx < 0 || newIdx >= total) {\n return;\n }\n\n // Swap\n ids.splice(currentIdx, 1);\n ids.splice(newIdx, 0, this._keyboardGrabbedId);\n this._announce(`Moved to position ${newIdx + 1} of ${total}.`);\n this.handleReorder(this._keyboardGrabbedId, ids[currentIdx], ids);\n }\n }\n\n _initResizeHandle() {\n const handle = (this.shadowRoot as ShadowRoot).querySelector(\n \".resize-handle\",\n );\n\n if (!handle) {\n return;\n }\n\n let activePointerId: number | null = null;\n\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n const parentRect = this.parentElement?.getBoundingClientRect();\n if (!parentRect) {\n return;\n }\n\n const rect = this.getBoundingClientRect();\n const newHeight = rect.bottom - e.clientY;\n const minHeight = 80;\n const maxHeight = parentRect.height - 60;\n const clamped = Math.max(minHeight, Math.min(maxHeight, newHeight));\n\n this.style.flex = \"none\";\n this.style.height = `${clamped}px`;\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n\n document.removeEventListener(\n \"pointermove\",\n onPointerMove as EventListener,\n );\n\n this._persistHeight();\n };\n\n const onPointerUp = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (e: Event) => {\n const pointerEvent = e as PointerEvent;\n if (\n pointerEvent.pointerType === \"mouse\" &&\n pointerEvent.button !== 0 &&\n pointerEvent.button !== -1\n ) {\n return;\n }\n\n pointerEvent.preventDefault();\n\n activePointerId = pointerEvent.pointerId;\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(pointerEvent.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove as EventListener);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp as EventListener);\n handle.addEventListener(\"pointercancel\", stopResize);\n\n handle.addEventListener(\"dblclick\", () => {\n this.style.flex = \"\";\n this.style.height = \"\";\n\n this._persistHeight(0);\n });\n }\n\n private _isSpawnSubagentEnabledInCurrentScope(): boolean {\n if (\n Array.isArray(this._pendingDetailsToolTags) &&\n this._pendingDetailsToolTags.length > 0\n ) {\n return this._pendingDetailsToolTags.includes(\"spawn_subagent\");\n }\n\n return toolsStore.enabledToolNames.has(\"spawn_subagent\");\n }\n\n _itemAtPoint(x: number, y: number): Element | null {\n // elementFromPoint on shadowRoot for Shadow DOM\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const el = root.elementFromPoint(x, y);\n\n return el?.closest?.(\".conversation-item\") || null;\n }\n\n _setupDialogListeners() {\n const root = this.shadowRoot as ShadowRoot;\n\n // Create dialog\n const createDialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const createForm = root.querySelector(\n \".conversations__create-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const createCancel = root.querySelector(\n \".conversations__create-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n createCancel?.addEventListener(\"click\", () => {\n createDialog?.close();\n });\n\n createForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCreateDialog();\n });\n\n // Details dialog\n const detailsDialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const detailsForm = root.querySelector(\n \".conversations__details-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const detailsCancel = root.querySelector(\n \".conversations__details-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n detailsCancel?.addEventListener(\"click\", () => {\n detailsDialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n });\n\n detailsForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDetailsDialog();\n });\n\n // Delete dialog\n const deleteDialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const deleteForm = root.querySelector(\n \".conversations__delete-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const deleteCancel = root.querySelector(\n \".conversations__delete-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n deleteCancel?.addEventListener(\"click\", () => {\n deleteDialog?.close();\n this._pendingDeleteGroupId = null;\n });\n\n deleteForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDeleteDialog();\n });\n\n // Clone dialog\n const cloneDialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".conversations__clone-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const cloneCancel = root.querySelector(\n \".conversations__clone-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n cloneCancel?.addEventListener(\"click\", () => {\n cloneDialog?.close();\n this._pendingCloneGroupId = null;\n });\n\n cloneForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCloneDialog();\n });\n }\n\n _startAutoScroll() {\n if (this._autoScrollActive) {\n return;\n }\n this._autoScrollActive = true;\n\n const scrollLoop = () => {\n if (!this._autoScrollActive) {\n return;\n }\n\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (content && this._autoScrollSpeed !== 0) {\n content.scrollTop += this._autoScrollSpeed;\n }\n\n requestAnimationFrame(scrollLoop);\n };\n\n requestAnimationFrame(scrollLoop);\n }\n\n _stopAutoScroll() {\n this._autoScrollActive = false;\n this._autoScrollSpeed = 0;\n }\n\n _updateAutoScrollSpeed(clientY: number) {\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (!content) {\n this._autoScrollSpeed = 0;\n return;\n }\n\n const rect = content.getBoundingClientRect();\n const threshold = 50; // pixels from top/bottom to start scrolling\n\n const distTop = clientY - rect.top;\n const distBottom = rect.bottom - clientY;\n\n if (distTop >= 0 && distTop < threshold) {\n // Near the top: scroll up. Speed is faster the closer to the edge.\n this._autoScrollSpeed = -((threshold - distTop) / threshold) * 8;\n this._startAutoScroll();\n } else if (distBottom >= 0 && distBottom < threshold) {\n // Near the bottom: scroll down.\n this._autoScrollSpeed = ((threshold - distBottom) / threshold) * 8;\n this._startAutoScroll();\n } else {\n this._autoScrollSpeed = 0;\n }\n }\n\n private async _loadProviderModels(\n provider: LLMProvider,\n ): Promise<ProviderModelItem[]> {\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n return provider.models as ProviderModelItem[];\n }\n\n if (!provider.modelsUrl) {\n return [];\n }\n\n const headers: Record<string, string> = {\n ...(provider.headers || {}),\n ...(orchestratorStore.orchestrator\n ? getProviderRuntimeHeaders(\n orchestratorStore.orchestrator,\n provider.id,\n \"\",\n this._pendingDetailsProviderRuntimeOverrides,\n )\n : {}),\n };\n\n if (this.db && provider.apiKeyHeader && orchestratorStore.orchestrator) {\n const apiKey =\n await orchestratorStore.orchestrator.getApiKeyForSpecificProvider(\n this.db,\n provider.id,\n );\n if (apiKey) {\n const format = provider.apiKeyHeaderFormat || \"{key}\";\n headers[provider.apiKeyHeader] = format.replace(\"{key}\", apiKey);\n }\n }\n\n const response = await fetch(provider.modelsUrl, { headers });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json();\n let items: ProviderModelItem[] = [];\n\n if (Array.isArray(data)) {\n items = data as ProviderModelItem[];\n } else if (data && typeof data === \"object\") {\n const dataObject = data as Record<string, unknown>;\n if (Array.isArray(dataObject.models)) {\n items = dataObject.models as ProviderModelItem[];\n } else if (Array.isArray(dataObject.data)) {\n items = dataObject.data as ProviderModelItem[];\n } else {\n for (const value of Object.values(dataObject)) {\n if (Array.isArray(value) && value.length > 0) {\n items = value as ProviderModelItem[];\n\n break;\n }\n }\n\n if (items.length === 0 && (dataObject.id || dataObject.name)) {\n items = [dataObject as ProviderModelItem];\n }\n }\n }\n\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n const dynamicIds = new Set(\n items\n .map((item) =>\n typeof item === \"string\" ? item : item.id || item.name || \"\",\n )\n .filter(Boolean),\n );\n const staticItems = (provider.models as ProviderModelItem[]).filter(\n (item) => {\n const modelId =\n typeof item === \"string\" ? item : item.id || item.name || \"\";\n\n return modelId && !dynamicIds.has(modelId);\n },\n );\n items = [...staticItems, ...items];\n }\n\n return items;\n }\n\n /**\n * Persist the current height to IndexedDB.\n */\n async _persistHeight(height?: number) {\n if (!this.db) {\n return;\n }\n\n const val =\n height !== undefined ? height : this.getBoundingClientRect().height;\n\n await setConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT, val || 0);\n }\n\n async _submitCloneDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingCloneGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.cloneConversation(\n this.db,\n this._pendingCloneGroupId,\n );\n dialog?.close();\n this._pendingCloneGroupId = null;\n }\n\n async _submitCreateDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n if (!name) {\n return;\n }\n\n await orchestratorStore.createConversation(this.db, name);\n dialog?.close();\n }\n\n async _submitDeleteDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingDeleteGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.deleteConversation(\n this.db,\n this._pendingDeleteGroupId,\n );\n dialog?.close();\n this._pendingDeleteGroupId = null;\n }\n\n async _submitDetailsDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (\n !root ||\n !this.db ||\n !this._pendingRenameGroupId ||\n !this._pendingRenameName\n ) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n\n if (name && name !== this._pendingRenameName) {\n await orchestratorStore.renameConversation(\n this.db,\n this._pendingRenameGroupId,\n name,\n );\n }\n\n if (this._pendingDetailsToolTags) {\n await orchestratorStore.updateConversationToolTags(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsToolTags,\n );\n }\n\n await orchestratorStore.updateConversationPinnedProvider(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsPinnedProvider || undefined,\n this._pendingDetailsPinnedModel || undefined,\n this._pendingDetailsPinnedMaxTokens || undefined,\n );\n\n await orchestratorStore.updateConversationProviderRuntimeOverrides(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n await orchestratorStore.updateConversationSubagentSettings(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsSubagentMode,\n this._pendingDetailsSubagentProvider || undefined,\n this._pendingDetailsSubagentModel || undefined,\n this._pendingDetailsSubagentMaxTokens || undefined,\n );\n\n dialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedMaxTokens = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n }\n}\n\ncustomElements.define(\"shadow-claw-conversations\", ShadowClawConversations);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shadow-claw-conversations-DygK5y1e.js","names":["shadowClawConversationsStyles","shadowClawConversationsTemplate"],"sources":["../../src/components/shadow-claw-conversations/shadow-claw-conversations.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport {\n getAvailableProviders,\n getProviderRuntimeHeaders,\n} from \"../../core/orchestrator/utils/operations/provider.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { setConfig } from \"../../db/setConfig.js\";\nimport { setSanitizedHtml } from \"../../security/trusted-types.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\nimport { ChannelRegistry } from \"../../subsystems/channels/channel-registry.js\";\nimport { loadDeclarativeTools } from \"../../subsystems/tools/declarative.js\";\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\n\nimport type { LLMProvider } from \"../../subsystems/providers/types.js\";\n\nimport type {\n ProviderModelItem,\n ShadowClawProviderModelPicker,\n} from \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\n\nimport type {\n ProviderRuntimeOverrides,\n ShadowClawProviderModuleSettings,\n} from \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\n\nimport \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\nimport \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawConversationsStyles from \"./shadow-claw-conversations.css\" with { type: \"css\" };\nimport shadowClawConversationsTemplate from \"./shadow-claw-conversations.html\" with { type: \"html\" };\n\nexport class ShadowClawConversations extends ShadowClawElement {\n static styles = shadowClawConversationsStyles;\n static template = shadowClawConversationsTemplate;\n\n public channelRegistry: ChannelRegistry | null = null;\n public db: ShadowClawDatabase | null = null;\n private _autoScrollActive = false;\n private _autoScrollSpeed = 0;\n\n private _draggedGroupId: string | null = null;\n private _effectCleanup: (() => void) | null = null;\n private _keyboardGrabbedId: string | null = null;\n private _pendingCloneGroupId: string | null = null;\n private _pendingDeleteGroupId: string | null = null;\n private _pendingDetailsPinnedMaxTokens: number | null = null;\n private _pendingDetailsPinnedModel: string | null = null;\n private _pendingDetailsPinnedProvider: string | null = null;\n private _pendingDetailsProviderRuntimeOverrides: ProviderRuntimeOverrides =\n {};\n private _pendingDetailsSubagentMaxTokens: number | null = null;\n private _pendingDetailsSubagentMode: \"automatic\" | \"manual\" = \"automatic\";\n private _pendingDetailsSubagentModel: string | null = null;\n private _pendingDetailsSubagentProvider: string | null = null;\n private _pendingDetailsToolTags: string[] | null = null;\n private _pendingRenameGroupId: string | null = null;\n private _pendingRenameName: string | null = null;\n private _touchDraggedGroupId: string | null = null;\n private _touchId: number | null = null;\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n\n // Restore persisted height\n const saved = await getConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT);\n if (saved && typeof saved === \"number\" && saved > 0) {\n this.style.flex = \"none\";\n this.style.height = `${saved}px`;\n }\n\n this.channelRegistry =\n orchestratorStore.orchestrator?.channelRegistry || null;\n\n (this.shadowRoot as ShadowRoot)\n .querySelector(\"[data-action='create']\")\n ?.addEventListener(\"click\", () => this.handleCreate());\n\n // Dialog event listeners\n this._setupDialogListeners();\n\n this._initResizeHandle();\n\n // Global dragover auto-scroll listener on shadowRoot\n root.addEventListener(\"dragover\", (e: any) => {\n if (this._draggedGroupId !== null) {\n this._updateAutoScrollSpeed(e.clientY);\n }\n });\n\n // Ensure we stop scrolling if the drag ends or leaves\n root.addEventListener(\"dragend\", () => {\n this._stopAutoScroll();\n });\n root.addEventListener(\"drop\", () => {\n this._stopAutoScroll();\n });\n\n this.render();\n\n // Re-render when store state changes\n this._effectCleanup = effect(() => {\n // Access signals to establish tracking\n orchestratorStore.groups;\n orchestratorStore.activeGroupId;\n orchestratorStore.unreadGroupIds;\n\n this.render();\n });\n }\n\n disconnectedCallback() {\n if (this._effectCleanup) {\n this._effectCleanup();\n this._effectCleanup = null;\n }\n }\n\n getChannelRegistry(): ChannelRegistry | null {\n const current = orchestratorStore.orchestrator?.channelRegistry || null;\n if (current) {\n this.channelRegistry = current;\n }\n\n return this.channelRegistry;\n }\n\n openCloneDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__clone-name\");\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n }\n\n openCreateDialog() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n if (input) {\n input.value = \"\";\n input.focus();\n }\n }\n\n openDeleteDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__delete-name\");\n const cancelBtn = dialog?.querySelector(\n \".conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n cancelBtn?.focus();\n }\n\n openDetailsDialog(currentName: string, groupId?: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const groupIdInput = root.querySelector(\n \"#conversations-details-group-id\",\n ) as HTMLInputElement | null;\n const copyBtn = root.querySelector(\n \"#conversations-group-id-copy-btn\",\n ) as HTMLButtonElement | null;\n const toolsContainer = root.querySelector(\n \"#conversations-details-tools\",\n ) as HTMLElement | null;\n const toolInput = root.querySelector(\n \"#conversations-tool-input\",\n ) as HTMLInputElement | null;\n const toolAddBtn = root.querySelector(\n \"#conversations-add-tool-btn\",\n ) as HTMLButtonElement | null;\n const datalist = root.querySelector(\n \"#conversations-available-tools\",\n ) as HTMLDataListElement | null;\n const mainPicker = root.querySelector(\n \"#conversations-main-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const mainProviderModuleSettings = root.querySelector(\n \"#conversations-main-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n const agentMaxTokensInput = root.querySelector(\n \"#conversations-agent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentSettingsContainer = root.querySelector(\n \"#conversations-subagent-settings-container\",\n ) as HTMLElement | null;\n const subagentModeSelect = root.querySelector(\n \"#conversations-subagent-mode\",\n ) as HTMLSelectElement | null;\n const subagentMaxTokensInput = root.querySelector(\n \"#conversations-subagent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentManualContainer = root.querySelector(\n \"#conversations-subagent-manual-container\",\n ) as HTMLElement | null;\n const subagentPicker = root.querySelector(\n \"#conversations-subagent-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const subagentProviderModuleSettings = root.querySelector(\n \"#conversations-subagent-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n\n // Populate Group ID field\n if (groupIdInput) {\n groupIdInput.value = groupId?.replace(\":\", \"-\") || \"\";\n }\n\n // Wire up copy button\n if (copyBtn && groupIdInput) {\n // Clone to remove previous listeners\n const freshCopyBtn = copyBtn.cloneNode(true) as HTMLButtonElement;\n copyBtn.replaceWith(freshCopyBtn);\n\n freshCopyBtn.addEventListener(\"click\", async () => {\n const val = groupIdInput.value;\n if (!val) {\n return;\n }\n\n try {\n await navigator.clipboard.writeText(val);\n // Swap to a checkmark briefly\n const originalInner = freshCopyBtn.innerHTML;\n setSanitizedHtml(\n freshCopyBtn,\n `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`,\n );\n freshCopyBtn.classList.add(\n \"conversations__group-id-copy-btn--copied\",\n );\n setTimeout(() => {\n setSanitizedHtml(freshCopyBtn, originalInner);\n freshCopyBtn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n // Fallback: select the text\n groupIdInput.select();\n }\n });\n }\n\n const participantsContainer = root.querySelector(\n \"#conversations-details-participants-container\",\n ) as HTMLElement | null;\n const participantsList = root.querySelector(\n \"#conversations-details-participants-list\",\n ) as HTMLElement | null;\n\n if (participantsContainer && participantsList) {\n if (groupId && groupId.startsWith(\"peer:\")) {\n participantsContainer.style.display = \"block\";\n participantsList.replaceChildren();\n\n const orchestrator = orchestratorStore.orchestrator;\n if (orchestrator) {\n const connectedPeers =\n orchestrator.peerjs?.connectedPeersSignal?.get() || [];\n const targetPeer = groupId.replace(\"peer:\", \"\");\n\n if (connectedPeers.includes(targetPeer)) {\n let alias = \"\";\n if (orchestrator.peerjsPeerAliases) {\n for (const [a, id] of Object.entries(\n orchestrator.peerjsPeerAliases,\n )) {\n if (id === targetPeer) {\n alias = a;\n\n break;\n }\n }\n }\n\n const displayName = alias\n ? `${alias} (${targetPeer.substring(0, 8)})`\n : targetPeer;\n\n const row = document.createElement(\"div\");\n row.className = \"conversations__group-id-row\";\n\n const input = document.createElement(\"input\");\n input.className =\n \"conversations__input conversations__group-id-input\";\n input.type = \"text\";\n input.readOnly = true;\n input.value = displayName;\n input.style.marginBottom = \"0\";\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"conversations__group-id-copy-btn\";\n btn.title = \"Copy Peer ID\";\n btn.setAttribute(\"aria-label\", \"Copy Peer ID to clipboard\");\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/></svg>`;\n\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(targetPeer);\n const originalInner = btn.innerHTML;\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`;\n btn.classList.add(\"conversations__group-id-copy-btn--copied\");\n setTimeout(() => {\n btn.innerHTML = originalInner;\n btn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n input.value = targetPeer;\n input.select();\n }\n });\n\n row.appendChild(input);\n row.appendChild(btn);\n participantsList.appendChild(row);\n } else {\n const noPeers = document.createElement(\"div\");\n noPeers.style.fontSize = \"0.875rem\";\n noPeers.style.color = \"var(--text-secondary)\";\n noPeers.textContent = \"Peer is not currently connected.\";\n participantsList.appendChild(noPeers);\n }\n }\n } else {\n participantsContainer.style.display = \"none\";\n }\n }\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n const candidateToolsMap = new Map<\n string,\n { name: string; description?: string }\n >();\n for (const tool of TOOL_DEFINITIONS) {\n candidateToolsMap.set(tool.name, tool);\n }\n for (const tool of toolsStore.allTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n }\n }\n\n const updateDatalist = () => {\n if (!datalist) {\n return;\n }\n\n const pinned = new Set(this._pendingDetailsToolTags || []);\n datalist.replaceChildren();\n for (const tool of candidateToolsMap.values()) {\n if (pinned.has(tool.name)) {\n continue;\n }\n\n const option = document.createElement(\"option\");\n option.value = tool.name;\n datalist.appendChild(option);\n }\n };\n\n if (this.db && groupId) {\n loadDeclarativeTools(this.db, groupId)\n .then(({ tools: declTools }) => {\n let added = false;\n for (const tool of declTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n added = true;\n }\n }\n if (added) {\n updateDatalist();\n }\n })\n .catch(() => {});\n }\n\n const renderChips = () => {\n if (!toolsContainer) {\n return;\n }\n\n toolsContainer.replaceChildren();\n\n const tags = this._pendingDetailsToolTags || [];\n for (const tagName of tags) {\n const tool = candidateToolsMap.get(tagName);\n const chip = document.createElement(\"span\");\n chip.className = \"conversations__tool-chip\";\n\n const nameSpan = document.createElement(\"span\");\n nameSpan.textContent = tagName;\n if (tool?.description) {\n nameSpan.title = tool.description;\n }\n\n chip.appendChild(nameSpan);\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"conversations__tool-chip-remove\";\n removeBtn.textContent = \"×\";\n removeBtn.setAttribute(\"aria-label\", `Remove tool ${tagName}`);\n\n removeBtn.addEventListener(\"click\", () => {\n if (!this._pendingDetailsToolTags) {\n return;\n }\n\n this._pendingDetailsToolTags = this._pendingDetailsToolTags.filter(\n (t) => t !== tagName,\n );\n renderChips();\n });\n\n chip.appendChild(removeBtn);\n toolsContainer.appendChild(chip);\n }\n\n updateDatalist();\n\n if (subagentSettingsContainer && subagentModeSelect) {\n const showSubagentSettings =\n this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n if (!showSubagentSettings) {\n this._pendingDetailsSubagentMode = \"automatic\";\n }\n\n if (subagentManualContainer) {\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n showSubagentSettings\n ? \"flex\"\n : \"none\";\n }\n\n if (subagentMaxTokensInput) {\n subagentMaxTokensInput.value =\n typeof this._pendingDetailsSubagentMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsSubagentMaxTokens) &&\n this._pendingDetailsSubagentMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsSubagentMaxTokens))\n : \"\";\n }\n }\n };\n\n if (toolAddBtn && toolInput) {\n toolAddBtn.onclick = () => {\n const val = toolInput.value.trim();\n if (!val) {\n return;\n }\n\n const isValidName = /^[a-z][a-z0-9_]{0,63}$/.test(val);\n const tool = candidateToolsMap.get(val);\n if (!tool && !isValidName) {\n toolInput.value = \"\";\n\n return;\n }\n\n if (!this._pendingDetailsToolTags) {\n this._pendingDetailsToolTags = [];\n }\n\n if (!this._pendingDetailsToolTags.includes(val)) {\n this._pendingDetailsToolTags.push(val);\n renderChips();\n }\n\n toolInput.value = \"\";\n };\n\n toolInput.onkeydown = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n toolAddBtn.click();\n }\n };\n }\n\n renderChips();\n\n if (\n mainPicker &&\n mainProviderModuleSettings &&\n subagentModeSelect &&\n subagentSettingsContainer &&\n subagentManualContainer &&\n subagentPicker &&\n subagentProviderModuleSettings\n ) {\n const providers = (getAvailableProviders() as LLMProvider[]) || [];\n\n mainPicker.setLabels({\n providerLabel: \"Pinned Provider\",\n defaultProviderLabel: \"Default (Global)\",\n modelLabel: \"Pinned Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom model id\",\n });\n\n mainPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n mainPicker.setProviders(providers);\n mainPicker.setValue({\n providerId: this._pendingDetailsPinnedProvider,\n modelId: this._pendingDetailsPinnedModel,\n });\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n if (agentMaxTokensInput) {\n agentMaxTokensInput.value =\n typeof this._pendingDetailsPinnedMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsPinnedMaxTokens) &&\n this._pendingDetailsPinnedMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsPinnedMaxTokens))\n : \"\";\n }\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n subagentPicker.setLabels({\n providerLabel: \"Pinned Subagent Provider\",\n defaultProviderLabel: \"Default (Parent Provider)\",\n modelLabel: \"Pinned Subagent Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom subagent model id\",\n });\n\n subagentPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n subagentPicker.setProviders(providers);\n subagentPicker.setValue({\n providerId: this._pendingDetailsSubagentProvider,\n modelId: this._pendingDetailsSubagentModel,\n });\n\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n if (!mainPicker.hasAttribute(\"data-bound\")) {\n mainPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsPinnedProvider = detail.providerId || null;\n this._pendingDetailsPinnedModel = detail.modelId || null;\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n\n mainPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!agentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n agentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(agentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsPinnedMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsPinnedMaxTokens = null;\n }\n });\n\n agentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!mainProviderModuleSettings.hasAttribute(\"data-bound\")) {\n mainProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n mainProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentPicker.hasAttribute(\"data-bound\")) {\n subagentPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsSubagentProvider = detail.providerId || null;\n this._pendingDetailsSubagentModel = detail.modelId || null;\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n subagentPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentProviderModuleSettings.hasAttribute(\"data-bound\")) {\n subagentProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n subagentProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n subagentModeSelect.value = this._pendingDetailsSubagentMode;\n\n const showSubagentSettings = this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n\n mainProviderModuleSettings.style.display = this\n ._pendingDetailsPinnedProvider\n ? \"flex\"\n : \"none\";\n\n subagentManualContainer.style.display =\n showSubagentSettings && this._pendingDetailsSubagentMode === \"manual\"\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n showSubagentSettings &&\n this._pendingDetailsSubagentMode === \"manual\" &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n\n subagentModeSelect.onchange = () => {\n this._pendingDetailsSubagentMode =\n subagentModeSelect.value === \"manual\" ? \"manual\" : \"automatic\";\n\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope()\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope() &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n };\n\n if (!subagentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n subagentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(subagentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsSubagentMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsSubagentMaxTokens = null;\n }\n });\n\n subagentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n }\n\n if (input) {\n input.value = currentName;\n input.select();\n input.focus();\n }\n }\n\n async handleClone(groupId: string) {\n if (!this.db) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n if (!group) {\n return;\n }\n\n this._pendingCloneGroupId = groupId;\n this.openCloneDialog(group.name);\n }\n\n async handleCreate() {\n if (!this.db) {\n return;\n }\n\n this.openCreateDialog();\n }\n\n async handleDelete(groupId: string, name: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingDeleteGroupId = groupId;\n this.openDeleteDialog(name);\n }\n\n async handleDetails(groupId: string, currentName: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingRenameGroupId = groupId;\n this._pendingRenameName = currentName;\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n const currentTags = group?.toolTags || [];\n\n this._pendingDetailsToolTags = [...currentTags];\n this._pendingDetailsPinnedMaxTokens =\n typeof group?.pinnedMaxTokens === \"number\" &&\n Number.isFinite(group.pinnedMaxTokens) &&\n group.pinnedMaxTokens > 0\n ? Math.floor(group.pinnedMaxTokens)\n : null;\n this._pendingDetailsPinnedProvider = group?.pinnedProvider || null;\n this._pendingDetailsPinnedModel = group?.pinnedModel || null;\n this._pendingDetailsProviderRuntimeOverrides = JSON.parse(\n JSON.stringify(group?.providerRuntimeOverrides || {}),\n );\n this._pendingDetailsSubagentMode =\n group?.subagentModelSelectionMode === \"manual\" ? \"manual\" : \"automatic\";\n this._pendingDetailsSubagentMaxTokens =\n typeof group?.subagentMaxTokens === \"number\" &&\n Number.isFinite(group.subagentMaxTokens) &&\n group.subagentMaxTokens > 0\n ? Math.floor(group.subagentMaxTokens)\n : null;\n this._pendingDetailsSubagentProvider =\n group?.subagentPinnedProvider || null;\n this._pendingDetailsSubagentModel = group?.subagentPinnedModel || null;\n this.openDetailsDialog(currentName, groupId);\n }\n\n /**\n * Reorder: move draggedId to the position of targetId,\n * or apply a pre-computed order array.\n */\n async handleReorder(\n draggedId: string,\n targetId: string,\n precomputedIds?: string[],\n ) {\n if (!this.db) {\n return;\n }\n\n if (precomputedIds) {\n await orchestratorStore.reorderConversations(this.db, precomputedIds);\n\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const fromIdx = ids.indexOf(draggedId);\n const toIdx = ids.indexOf(targetId);\n\n if (fromIdx < 0 || toIdx < 0) {\n return;\n }\n\n ids.splice(fromIdx, 1);\n ids.splice(toIdx, 0, draggedId);\n\n await orchestratorStore.reorderConversations(this.db, ids);\n }\n\n async handleSwitch(groupId: string) {\n if (groupId === orchestratorStore.activeGroupId) {\n return;\n }\n\n // Derive the appropriate sidebar page from the current active page.\n // \"pages\" is excluded as a fallback because its route omits groupId\n // when no workspace path is present, so it can't represent a switch.\n const rawPage = orchestratorStore.activePage;\n const fallbackPage = orchestratorStore.sidebarDefaultPage;\n const page =\n rawPage === \"chat\" || rawPage === \"tasks\" || rawPage === \"files\"\n ? rawPage\n : fallbackPage === \"tasks\" || fallbackPage === \"files\"\n ? fallbackPage\n : \"chat\";\n\n // Dispatch a navigate event so the URL updates to /page/groupId and\n // the router calls applyRoute, which handles switchConversation.\n document.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page, groupId },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n async render() {\n const list = (this.shadowRoot as ShadowRoot).querySelector(\n \".conversation-list\",\n );\n\n if (!list) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const activeId = orchestratorStore.activeGroupId;\n const unreadIds = orchestratorStore.unreadGroupIds || new Set();\n const channelRegistry = this.getChannelRegistry();\n\n list.replaceChildren();\n\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i];\n const isActive = group.groupId === activeId;\n const isUnread = !isActive && unreadIds.has(group.groupId);\n const li = document.createElement(\"li\");\n\n li.className = `conversation-item${isActive ? \" active\" : \"\"}${isUnread ? \" unread\" : \"\"}`;\n li.setAttribute(\"data-group-id\", group.groupId);\n li.setAttribute(\"role\", \"listitem\");\n li.setAttribute(\"tabindex\", \"0\");\n li.setAttribute(\"aria-describedby\", \"reorder-instructions\");\n li.setAttribute(\n \"aria-label\",\n `${group.name}, position ${i + 1} of ${groups.length}`,\n );\n\n if (this._keyboardGrabbedId === group.groupId) {\n li.classList.add(\"keyboard-grabbed\");\n\n li.setAttribute(\"aria-grabbed\", \"true\");\n }\n\n const badge = channelRegistry\n ? channelRegistry.getBadge(group.groupId)\n : \"\";\n\n const canDelete = groups.length > 1;\n\n const handle = document.createElement(\"span\");\n handle.className = \"drag-handle\";\n handle.setAttribute(\"draggable\", \"true\");\n handle.setAttribute(\"aria-hidden\", \"true\");\n handle.setAttribute(\"title\", \"Drag to reorder\");\n handle.textContent = \"⠿\";\n\n li.append(handle);\n\n if (badge) {\n const badgeEl = document.createElement(\"span\");\n badgeEl.className = \"channel-badge\";\n badgeEl.textContent = badge;\n li.append(badgeEl);\n }\n\n if (group.toolTags && group.toolTags.length > 0) {\n const toolBadgeEl = document.createElement(\"span\");\n toolBadgeEl.className = \"tool-badge\";\n toolBadgeEl.textContent = \"🔧\";\n toolBadgeEl.title = `Pinned Tools: ${group.toolTags.join(\", \")}`;\n li.append(toolBadgeEl);\n }\n\n const nameEl = document.createElement(\"span\");\n nameEl.className = \"conversation-name\";\n nameEl.textContent = group.name;\n\n const actionsEl = document.createElement(\"span\");\n actionsEl.className = \"conversation-actions\";\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.setAttribute(\"data-action\", \"clone\");\n cloneBtn.setAttribute(\"title\", \"Clone\");\n cloneBtn.setAttribute(\"aria-label\", `Clone ${group.name}`);\n cloneBtn.textContent = \"📋\";\n\n const detailsBtn = document.createElement(\"button\");\n detailsBtn.setAttribute(\"data-action\", \"details\");\n detailsBtn.setAttribute(\"title\", \"Details\");\n detailsBtn.setAttribute(\"aria-label\", `Details for ${group.name}`);\n detailsBtn.textContent = \"⚙️\";\n\n actionsEl.append(cloneBtn, detailsBtn);\n\n if (canDelete) {\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.setAttribute(\"data-action\", \"delete\");\n deleteBtn.setAttribute(\"title\", \"Delete\");\n deleteBtn.setAttribute(\"aria-label\", `Delete ${group.name}`);\n deleteBtn.textContent = \"🗑️\";\n actionsEl.append(deleteBtn);\n }\n\n const actionsToggleBtn = document.createElement(\"button\");\n actionsToggleBtn.className = \"conversation-actions-toggle\";\n actionsToggleBtn.setAttribute(\"title\", \"More actions\");\n actionsToggleBtn.setAttribute(\n \"aria-label\",\n `More actions for ${group.name}`,\n );\n actionsToggleBtn.textContent = \"⋮\";\n\n li.append(nameEl, actionsEl, actionsToggleBtn);\n\n li.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const action = target\n .closest(\"[data-action]\")\n ?.getAttribute(\"data-action\");\n\n if (action === \"clone\") {\n this.handleClone(group.groupId);\n } else if (action === \"details\") {\n this.handleDetails(group.groupId, group.name);\n } else if (action === \"delete\") {\n this.handleDelete(group.groupId, group.name);\n } else if (target.closest(\".conversation-actions-toggle\")) {\n li.classList.toggle(\"show-actions\");\n } else if (!target.closest(\".drag-handle\")) {\n this.handleSwitch(group.groupId);\n li.classList.remove(\"show-actions\");\n }\n });\n\n li.addEventListener(\"keydown\", (e) => {\n this._handleKeyboard(e, group.groupId, group.name);\n });\n\n handle.addEventListener(\"dragstart\", (e) => {\n this._draggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n (e as DragEvent).dataTransfer?.setData(\"text/plain\", group.groupId);\n });\n\n handle.addEventListener(\"dragend\", () => {\n li.classList.remove(\"dragging\");\n\n this._draggedGroupId = null;\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n });\n\n handle.addEventListener(\n \"touchstart\",\n (e) => {\n const touch = (e as TouchEvent).touches[0];\n if (!touch) {\n return;\n }\n\n this._touchId = touch.identifier;\n this._touchDraggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n e.preventDefault();\n },\n { passive: false },\n );\n\n li.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n li.classList.add(\"drag-over\");\n }\n });\n\n li.addEventListener(\"dragleave\", () => {\n li.classList.remove(\"drag-over\");\n });\n\n li.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n\n li.classList.remove(\"drag-over\");\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n this.handleReorder(this._draggedGroupId, group.groupId);\n }\n });\n\n list.appendChild(li);\n }\n\n this._bindTouchListEvents(list);\n }\n\n _announce(message: string) {\n const region = this.shadowRoot?.querySelector(\"#live-region\");\n\n if (region) {\n region.textContent = \"\";\n\n // Force re-announcement by toggling content in the next frame\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n }\n }\n\n /**\n * Bind touch move/end on the list for cross-item dragging.\n */\n _bindTouchListEvents(list: Element) {\n // Remove old listeners by replacing with clone if needed; simpler: use a flag\n if ((list as any)._touchBound) {\n return;\n }\n\n (list as any)._touchBound = true;\n\n list.addEventListener(\n \"touchmove\",\n (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n e.preventDefault();\n\n // Find which item is under the touch point\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (\n target &&\n target.getAttribute(\"data-group-id\") !== this._touchDraggedGroupId\n ) {\n target.classList.add(\"drag-over\");\n }\n\n this._updateAutoScrollSpeed(touch.clientY);\n },\n { passive: false },\n );\n\n list.addEventListener(\"touchend\", (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findChangedTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n const targetId = target?.getAttribute(\"data-group-id\");\n\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (targetId && targetId !== this._touchDraggedGroupId) {\n this.handleReorder(this._touchDraggedGroupId, targetId);\n }\n\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n\n list.addEventListener(\"touchcancel\", () => {\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n }\n\n _findChangedTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.changedTouches.length; i++) {\n const t = e.changedTouches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _findTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.touches.length; i++) {\n const t = e.touches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _focusNext(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx !== -1 && idx < focusables.length - 1) {\n focusables[idx + 1].focus();\n }\n }\n\n _focusNextItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx !== -1 && idx < items.length - 1) {\n items[idx + 1].focus();\n }\n }\n\n _focusPrev(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx > 0) {\n focusables[idx - 1].focus();\n }\n }\n\n _focusPrevItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx > 0) {\n items[idx - 1].focus();\n }\n }\n\n /**\n * Handle keyboard-based navigation, selection, and reordering.\n * Enter/Space = select, Arrow Down/Right = focus next, Arrow Up/Left = focus prev.\n * M = grab/drop for reorder (when grabbed, Arrows move, Space/Enter drop).\n */\n _handleKeyboard(e: KeyboardEvent, groupId: string, name: string) {\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const total = ids.length;\n\n if (this._keyboardGrabbedId === null) {\n // Navigation & Selection\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this._focusNextItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this._focusPrevItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n this._focusNext(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n this._focusPrev(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // If we are on the LI itself, select it\n if ((e.target as HTMLElement).classList.contains(\"conversation-item\")) {\n e.preventDefault();\n this.handleSwitch(groupId);\n }\n\n // If on a button, the default button behavior handles it (click event)\n return;\n }\n\n // Grab for reorder\n if (e.key === \"m\" || e.key === \"M\") {\n e.preventDefault();\n this._keyboardGrabbedId = groupId;\n const pos = ids.indexOf(groupId) + 1;\n this._announce(\n `${name} grabbed. Current position ${pos} of ${total}. Use Arrow Up and Down to move, Space or Enter to drop.`,\n );\n this.render();\n }\n\n return;\n }\n\n // Currently grabbed\n if (e.key === \"Escape\") {\n e.preventDefault();\n this._announce(\n `Reorder cancelled. ${name} returned to original position.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // Drop\n e.preventDefault();\n const pos = ids.indexOf(this._keyboardGrabbedId) + 1;\n const droppedName =\n groups.find((g) => g.groupId === this._keyboardGrabbedId)?.name || \"\";\n this._announce(\n `${droppedName} dropped at position ${pos} of ${total}. Reordering complete.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const currentIdx = ids.indexOf(this._keyboardGrabbedId);\n const newIdx = e.key === \"ArrowUp\" ? currentIdx - 1 : currentIdx + 1;\n if (newIdx < 0 || newIdx >= total) {\n return;\n }\n\n // Swap\n ids.splice(currentIdx, 1);\n ids.splice(newIdx, 0, this._keyboardGrabbedId);\n this._announce(`Moved to position ${newIdx + 1} of ${total}.`);\n this.handleReorder(this._keyboardGrabbedId, ids[currentIdx], ids);\n }\n }\n\n _initResizeHandle() {\n const handle = (this.shadowRoot as ShadowRoot).querySelector(\n \".resize-handle\",\n );\n\n if (!handle) {\n return;\n }\n\n let activePointerId: number | null = null;\n\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n const parentRect = this.parentElement?.getBoundingClientRect();\n if (!parentRect) {\n return;\n }\n\n const rect = this.getBoundingClientRect();\n const newHeight = rect.bottom - e.clientY;\n const minHeight = 80;\n const maxHeight = parentRect.height - 60;\n const clamped = Math.max(minHeight, Math.min(maxHeight, newHeight));\n\n this.style.flex = \"none\";\n this.style.height = `${clamped}px`;\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n\n document.removeEventListener(\n \"pointermove\",\n onPointerMove as EventListener,\n );\n\n this._persistHeight();\n };\n\n const onPointerUp = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (e: Event) => {\n const pointerEvent = e as PointerEvent;\n if (\n pointerEvent.pointerType === \"mouse\" &&\n pointerEvent.button !== 0 &&\n pointerEvent.button !== -1\n ) {\n return;\n }\n\n pointerEvent.preventDefault();\n\n activePointerId = pointerEvent.pointerId;\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(pointerEvent.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove as EventListener);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp as EventListener);\n handle.addEventListener(\"pointercancel\", stopResize);\n\n handle.addEventListener(\"dblclick\", () => {\n this.style.flex = \"\";\n this.style.height = \"\";\n\n this._persistHeight(0);\n });\n }\n\n private _isSpawnSubagentEnabledInCurrentScope(): boolean {\n if (\n Array.isArray(this._pendingDetailsToolTags) &&\n this._pendingDetailsToolTags.length > 0\n ) {\n return this._pendingDetailsToolTags.includes(\"spawn_subagent\");\n }\n\n return toolsStore.enabledToolNames.has(\"spawn_subagent\");\n }\n\n _itemAtPoint(x: number, y: number): Element | null {\n // elementFromPoint on shadowRoot for Shadow DOM\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const el = root.elementFromPoint(x, y);\n\n return el?.closest?.(\".conversation-item\") || null;\n }\n\n _setupDialogListeners() {\n const root = this.shadowRoot as ShadowRoot;\n\n // Create dialog\n const createDialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const createForm = root.querySelector(\n \".conversations__create-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const createCancel = root.querySelector(\n \".conversations__create-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n createCancel?.addEventListener(\"click\", () => {\n createDialog?.close();\n });\n\n createForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCreateDialog();\n });\n\n // Details dialog\n const detailsDialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const detailsForm = root.querySelector(\n \".conversations__details-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const detailsCancel = root.querySelector(\n \".conversations__details-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n detailsCancel?.addEventListener(\"click\", () => {\n detailsDialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n });\n\n detailsForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDetailsDialog();\n });\n\n // Delete dialog\n const deleteDialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const deleteForm = root.querySelector(\n \".conversations__delete-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const deleteCancel = root.querySelector(\n \".conversations__delete-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n deleteCancel?.addEventListener(\"click\", () => {\n deleteDialog?.close();\n this._pendingDeleteGroupId = null;\n });\n\n deleteForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDeleteDialog();\n });\n\n // Clone dialog\n const cloneDialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".conversations__clone-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const cloneCancel = root.querySelector(\n \".conversations__clone-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n cloneCancel?.addEventListener(\"click\", () => {\n cloneDialog?.close();\n this._pendingCloneGroupId = null;\n });\n\n cloneForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCloneDialog();\n });\n }\n\n _startAutoScroll() {\n if (this._autoScrollActive) {\n return;\n }\n this._autoScrollActive = true;\n\n const scrollLoop = () => {\n if (!this._autoScrollActive) {\n return;\n }\n\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (content && this._autoScrollSpeed !== 0) {\n content.scrollTop += this._autoScrollSpeed;\n }\n\n requestAnimationFrame(scrollLoop);\n };\n\n requestAnimationFrame(scrollLoop);\n }\n\n _stopAutoScroll() {\n this._autoScrollActive = false;\n this._autoScrollSpeed = 0;\n }\n\n _updateAutoScrollSpeed(clientY: number) {\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (!content) {\n this._autoScrollSpeed = 0;\n return;\n }\n\n const rect = content.getBoundingClientRect();\n const threshold = 50; // pixels from top/bottom to start scrolling\n\n const distTop = clientY - rect.top;\n const distBottom = rect.bottom - clientY;\n\n if (distTop >= 0 && distTop < threshold) {\n // Near the top: scroll up. Speed is faster the closer to the edge.\n this._autoScrollSpeed = -((threshold - distTop) / threshold) * 8;\n this._startAutoScroll();\n } else if (distBottom >= 0 && distBottom < threshold) {\n // Near the bottom: scroll down.\n this._autoScrollSpeed = ((threshold - distBottom) / threshold) * 8;\n this._startAutoScroll();\n } else {\n this._autoScrollSpeed = 0;\n }\n }\n\n private async _loadProviderModels(\n provider: LLMProvider,\n ): Promise<ProviderModelItem[]> {\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n return provider.models as ProviderModelItem[];\n }\n\n if (!provider.modelsUrl) {\n return [];\n }\n\n const headers: Record<string, string> = {\n ...(provider.headers || {}),\n ...(orchestratorStore.orchestrator\n ? getProviderRuntimeHeaders(\n orchestratorStore.orchestrator,\n provider.id,\n \"\",\n this._pendingDetailsProviderRuntimeOverrides,\n )\n : {}),\n };\n\n if (this.db && provider.apiKeyHeader && orchestratorStore.orchestrator) {\n const apiKey =\n await orchestratorStore.orchestrator.getApiKeyForSpecificProvider(\n this.db,\n provider.id,\n );\n if (apiKey) {\n const format = provider.apiKeyHeaderFormat || \"{key}\";\n headers[provider.apiKeyHeader] = format.replace(\"{key}\", apiKey);\n }\n }\n\n const response = await fetch(provider.modelsUrl, { headers });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json();\n let items: ProviderModelItem[] = [];\n\n if (Array.isArray(data)) {\n items = data as ProviderModelItem[];\n } else if (data && typeof data === \"object\") {\n const dataObject = data as Record<string, unknown>;\n if (Array.isArray(dataObject.models)) {\n items = dataObject.models as ProviderModelItem[];\n } else if (Array.isArray(dataObject.data)) {\n items = dataObject.data as ProviderModelItem[];\n } else {\n for (const value of Object.values(dataObject)) {\n if (Array.isArray(value) && value.length > 0) {\n items = value as ProviderModelItem[];\n\n break;\n }\n }\n\n if (items.length === 0 && (dataObject.id || dataObject.name)) {\n items = [dataObject as ProviderModelItem];\n }\n }\n }\n\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n const dynamicIds = new Set(\n items\n .map((item) =>\n typeof item === \"string\" ? item : item.id || item.name || \"\",\n )\n .filter(Boolean),\n );\n const staticItems = (provider.models as ProviderModelItem[]).filter(\n (item) => {\n const modelId =\n typeof item === \"string\" ? item : item.id || item.name || \"\";\n\n return modelId && !dynamicIds.has(modelId);\n },\n );\n items = [...staticItems, ...items];\n }\n\n return items;\n }\n\n /**\n * Persist the current height to IndexedDB.\n */\n async _persistHeight(height?: number) {\n if (!this.db) {\n return;\n }\n\n const val =\n height !== undefined ? height : this.getBoundingClientRect().height;\n\n await setConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT, val || 0);\n }\n\n async _submitCloneDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingCloneGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.cloneConversation(\n this.db,\n this._pendingCloneGroupId,\n );\n dialog?.close();\n this._pendingCloneGroupId = null;\n }\n\n async _submitCreateDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n if (!name) {\n return;\n }\n\n await orchestratorStore.createConversation(this.db, name);\n dialog?.close();\n }\n\n async _submitDeleteDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingDeleteGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.deleteConversation(\n this.db,\n this._pendingDeleteGroupId,\n );\n dialog?.close();\n this._pendingDeleteGroupId = null;\n }\n\n async _submitDetailsDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (\n !root ||\n !this.db ||\n !this._pendingRenameGroupId ||\n !this._pendingRenameName\n ) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n\n if (name && name !== this._pendingRenameName) {\n await orchestratorStore.renameConversation(\n this.db,\n this._pendingRenameGroupId,\n name,\n );\n }\n\n if (this._pendingDetailsToolTags) {\n await orchestratorStore.updateConversationToolTags(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsToolTags,\n );\n }\n\n await orchestratorStore.updateConversationPinnedProvider(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsPinnedProvider || undefined,\n this._pendingDetailsPinnedModel || undefined,\n this._pendingDetailsPinnedMaxTokens || undefined,\n );\n\n await orchestratorStore.updateConversationProviderRuntimeOverrides(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n await orchestratorStore.updateConversationSubagentSettings(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsSubagentMode,\n this._pendingDetailsSubagentProvider || undefined,\n this._pendingDetailsSubagentModel || undefined,\n this._pendingDetailsSubagentMaxTokens || undefined,\n );\n\n dialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedMaxTokens = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n }\n}\n\ncustomElements.define(\"shadow-claw-conversations\", ShadowClawConversations);\n"],"mappings":"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"}
|
package/dist/lib/{shadow-claw-file-viewer-BSbZvSl-.js → shadow-claw-file-viewer-DGMA7d7H.js}
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import ShadowClawElement from "./components/shadow-claw-element.js";
|
|
2
2
|
import { n as getDb } from "./txPromise-CuGh-TGK.js";
|
|
3
|
-
import { r as CONFIG_KEYS } from "./config
|
|
4
|
-
import {
|
|
3
|
+
import { r as CONFIG_KEYS } from "./config-DjZ9QWc4.js";
|
|
4
|
+
import { c as isPossibleAppRoute, d as resolveHrefAgainstRoute, i as decodePathSegment, n as applyBasePath, o as getFileRouteDirPath, s as getWorkspaceRouteRequestPath } from "./app-routes-BAEMLu9g.js";
|
|
5
5
|
import { t as getConfig } from "./getConfig-BxxXMyuM.js";
|
|
6
|
-
import { t as toolsStore } from "./tools-
|
|
7
|
-
import { t as readGroupFileBytes } from "./readGroupFileBytes-
|
|
8
|
-
import { t as fileViewerStore } from "./file-viewer-
|
|
9
|
-
import { nn as writeGroupFile, t as orchestratorStore } from "./orchestrator-
|
|
10
|
-
import { _ as getIframeSandboxPolicy, b as isAllowedCustomElement, g as getIframeCsp, h as getApprovedCustomElementScriptDescriptors, i as toTrustedHtmlPresanitized, n as setSanitizedHtml, r as setTrustedSrcdoc, t as sanitizeSrcdocHtml } from "./trusted-types-
|
|
6
|
+
import { t as toolsStore } from "./tools-DqcJe8LS.js";
|
|
7
|
+
import { t as readGroupFileBytes } from "./readGroupFileBytes-CSA7u-nJ.js";
|
|
8
|
+
import { t as fileViewerStore } from "./file-viewer-CwvhxAAG.js";
|
|
9
|
+
import { nn as writeGroupFile, t as orchestratorStore } from "./orchestrator-C6dc-2OQ.js";
|
|
10
|
+
import { _ as getIframeSandboxPolicy, b as isAllowedCustomElement, g as getIframeCsp, h as getApprovedCustomElementScriptDescriptors, i as toTrustedHtmlPresanitized, n as setSanitizedHtml, r as setTrustedSrcdoc, t as sanitizeSrcdocHtml } from "./trusted-types-Oz7xXJAY.js";
|
|
11
11
|
import { a as showSuccess, r as showError } from "./toast-DZ6r7_YI.js";
|
|
12
12
|
import { t as effect } from "./effect-DL6j9HJp.js";
|
|
13
|
-
import { n as splitFrontmatter, r as es_default, t as renderMarkdown } from "./markdown-
|
|
13
|
+
import { n as splitFrontmatter, r as es_default, t as renderMarkdown } from "./markdown-DYHmNjC4.js";
|
|
14
14
|
import { t as isTruthyConfigValue } from "./config-value-Cxggje2K.js";
|
|
15
15
|
import "./components/shadow-claw-dialog.js";
|
|
16
16
|
import { a as iframeStorageSet, c as getIframeThemeStyleHtml, i as iframeStorageGetAll, n as iframeStorageDelete, o as IframeBroadcastProxy, r as iframeStorageGet, s as getIframeHtmlClass, t as iframeStorageClear } from "./iframe-storage-proxy-Bx5GWTs0.js";
|
|
@@ -1185,7 +1185,7 @@ var ShadowClawFileViewer = class extends ShadowClawElement {
|
|
|
1185
1185
|
if (!normalized) return null;
|
|
1186
1186
|
const stack = [];
|
|
1187
1187
|
if (!isAbsolute) {
|
|
1188
|
-
const baseParts = basePath.replace(/\\/g, "/").replace(/^\/+/, "").split("/").filter(Boolean);
|
|
1188
|
+
const baseParts = basePath.replace(/\\/g, "/").replace(/^\/+/, "").split("/").filter(Boolean).map((segment) => decodePathSegment(segment));
|
|
1189
1189
|
baseParts.pop();
|
|
1190
1190
|
stack.push(...baseParts);
|
|
1191
1191
|
}
|
|
@@ -1196,7 +1196,7 @@ var ShadowClawFileViewer = class extends ShadowClawElement {
|
|
|
1196
1196
|
stack.pop();
|
|
1197
1197
|
continue;
|
|
1198
1198
|
}
|
|
1199
|
-
stack.push(part);
|
|
1199
|
+
stack.push(decodePathSegment(part));
|
|
1200
1200
|
}
|
|
1201
1201
|
return stack.length > 0 ? stack.join("/") : null;
|
|
1202
1202
|
}
|
|
@@ -1869,4 +1869,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
|
|
|
1869
1869
|
|
|
1870
1870
|
//#endregion
|
|
1871
1871
|
export { ShadowClawFileViewer as t };
|
|
1872
|
-
//# sourceMappingURL=shadow-claw-file-viewer-
|
|
1872
|
+
//# sourceMappingURL=shadow-claw-file-viewer-DGMA7d7H.js.map
|