shadow-claw 1.26.0 → 1.27.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 +39 -0
- package/.agents/skills/main/skill-creator/references/declarative-pipelines.md +44 -0
- package/.agents/skills/main/skill-creator/references/declarative-tools.md +35 -0
- package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +50 -0
- package/.well-known/agent-skills/index.json +14 -0
- package/README.md +5 -3
- package/bin/build/build.mjs +146 -15
- package/bin/build/build.test.mjs +57 -0
- package/bin/cli.mjs +26 -0
- package/bin/commands/mcp.mjs +277 -55
- package/bin/commands/mcp.test.mjs +275 -1
- package/bin/commands/skills-index.mjs +328 -0
- package/bin/commands/skills-index.test.mjs +161 -0
- package/bin/site-config/utils/custom-elements/get-approved-custom-element-scripts.test.mjs +2 -0
- package/bin/site-config/utils/custom-elements/sanitize-embedded-custom-element-scripts.test.mjs +10 -1
- package/dist/lib/components/index.js +25 -25
- 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-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-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/{configurePeerJs-CrlGan0m.js → configurePeerJs-oODzltaC.js} +2 -2
- package/dist/lib/{configurePeerJs-CrlGan0m.js.map → configurePeerJs-oODzltaC.js.map} +1 -1
- package/dist/lib/core/control-plane-client.d.ts +1 -0
- package/dist/lib/{downloadGroupFile-DboUjmp2.js → downloadGroupFile-DmcBQU1n.js} +2 -2
- package/dist/lib/{downloadGroupFile-DboUjmp2.js.map → downloadGroupFile-DmcBQU1n.js.map} +1 -1
- package/dist/lib/{file-viewer-BrK2Wxgh.js → file-viewer-C3YKnq_-.js} +4 -3
- package/dist/lib/{file-viewer-BrK2Wxgh.js.map → file-viewer-C3YKnq_-.js.map} +1 -1
- package/dist/lib/index.js +26 -26
- package/dist/lib/{initControlPlane-CsO4UR6_.js → initControlPlane-C2zURVIS.js} +86 -13
- package/dist/lib/initControlPlane-C2zURVIS.js.map +1 -0
- package/dist/lib/{markdown-eeSTFnMA.js → markdown-C6EHl9zs.js} +3 -3
- package/dist/lib/{markdown-eeSTFnMA.js.map → markdown-C6EHl9zs.js.map} +1 -1
- package/dist/lib/{orchestrator-CJvoC2Uu.js → orchestrator-CACLa_Ro.js} +7 -6
- package/dist/lib/{orchestrator-CJvoC2Uu.js.map → orchestrator-CACLa_Ro.js.map} +1 -1
- package/dist/lib/{orchestrator-DCfomsn9.js → orchestrator-KRjx0eba.js} +6 -534
- package/dist/lib/{orchestrator-DCfomsn9.js.map → orchestrator-KRjx0eba.js.map} +1 -1
- package/dist/lib/parsePath-DwC_YZjw.js +16 -0
- package/dist/lib/parsePath-DwC_YZjw.js.map +1 -0
- package/dist/lib/{peerjs-Dp02bXcG.js → peerjs-DFWOBcXf.js} +4 -4
- package/dist/lib/{peerjs-Dp02bXcG.js.map → peerjs-DFWOBcXf.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-Bve-e5e_.js → readGroupFileBytes-C8oOe8Iu.js} +3 -16
- package/dist/lib/readGroupFileBytes-C8oOe8Iu.js.map +1 -0
- package/dist/lib/security/custom-element-security.d.ts +8 -0
- package/dist/lib/server/control-plane-types.d.ts +1 -1
- package/dist/lib/{shadow-claw-D8xINM3c.js → shadow-claw-6UHdiy4a.js} +5 -5
- package/dist/lib/{shadow-claw-D8xINM3c.js.map → shadow-claw-6UHdiy4a.js.map} +1 -1
- package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js → shadow-claw-a2ui-CpZUTzlh.js} +5 -4
- package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js.map → shadow-claw-a2ui-CpZUTzlh.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-CdruwN8A.js → shadow-claw-accounts-03oJ__XC.js} +2 -2
- package/dist/lib/{shadow-claw-accounts-CdruwN8A.js.map → shadow-claw-accounts-03oJ__XC.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js → shadow-claw-channel-config-DmfwJc6G.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js.map → shadow-claw-channel-config-DmfwJc6G.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-C_jI4KhP.js → shadow-claw-channels-1N6Jl-By.js} +3 -3
- package/dist/lib/{shadow-claw-channels-C_jI4KhP.js.map → shadow-claw-channels-1N6Jl-By.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-B16MspoP.js → shadow-claw-chat-BMoqQJRK.js} +10 -10
- package/dist/lib/{shadow-claw-chat-B16MspoP.js.map → shadow-claw-chat-BMoqQJRK.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js → shadow-claw-control-plane-UG0o7pCz.js} +6 -6
- package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js.map → shadow-claw-control-plane-UG0o7pCz.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js → shadow-claw-conversations-BwXep3iu.js} +4 -3
- package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js.map → shadow-claw-conversations-BwXep3iu.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-BfDHHgpA.js → shadow-claw-file-viewer-DUxzVxDT.js} +14 -10
- package/dist/lib/shadow-claw-file-viewer-DUxzVxDT.js.map +1 -0
- package/dist/lib/{shadow-claw-files-EYhOPYIH.js → shadow-claw-files-DIREEnT2.js} +7 -7
- package/dist/lib/{shadow-claw-files-EYhOPYIH.js.map → shadow-claw-files-DIREEnT2.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-tcSpT-P0.js → shadow-claw-git-Bg1SWgsF.js} +4 -4
- package/dist/lib/{shadow-claw-git-tcSpT-P0.js.map → shadow-claw-git-Bg1SWgsF.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js → shadow-claw-integrations-Ds-CLPhj.js} +2 -2
- package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js.map → shadow-claw-integrations-Ds-CLPhj.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-BazJdD5f.js → shadow-claw-llm-CazBrVpM.js} +3 -3
- package/dist/lib/{shadow-claw-llm-BazJdD5f.js.map → shadow-claw-llm-CazBrVpM.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js → shadow-claw-mcp-remote-CT5Q-54E.js} +2 -2
- package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js.map → shadow-claw-mcp-remote-CT5Q-54E.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-DImPxe0H.js → shadow-claw-networking-Df85tCbO.js} +2 -2
- package/dist/lib/{shadow-claw-networking-DImPxe0H.js.map → shadow-claw-networking-Df85tCbO.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js → shadow-claw-page-header-Cti2fzf-.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js.map → shadow-claw-page-header-Cti2fzf-.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-D54jF1Qq.js → shadow-claw-pages-BgPyIEZO.js} +15 -11
- package/dist/lib/shadow-claw-pages-BgPyIEZO.js.map +1 -0
- package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js → shadow-claw-peerjs-xkBXILed.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js.map → shadow-claw-peerjs-xkBXILed.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js → shadow-claw-settings-CN89xRVU.js} +4 -4
- package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js.map → shadow-claw-settings-CN89xRVU.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-CFOjGf1d.js → shadow-claw-storage-VnhcObCe.js} +3 -3
- package/dist/lib/{shadow-claw-storage-CFOjGf1d.js.map → shadow-claw-storage-VnhcObCe.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js → shadow-claw-task-server-jgEC2hHB.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js.map → shadow-claw-task-server-jgEC2hHB.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js → shadow-claw-tasks-i_evIufy.js} +6 -6
- package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js.map → shadow-claw-tasks-i_evIufy.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js → shadow-claw-terminal-CwScROlu.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js.map → shadow-claw-terminal-CwScROlu.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-DxXIm0ku.js → shadow-claw-tools-DD3fyXP4.js} +5 -4
- package/dist/lib/{shadow-claw-tools-DxXIm0ku.js.map → shadow-claw-tools-DD3fyXP4.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js → shadow-claw-webvm-DbJq4I3-.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js.map → shadow-claw-webvm-DbJq4I3-.js.map} +1 -1
- package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js → syncWebMcpRegistration-DNLnQ-jz.js} +3 -2
- package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js.map → syncWebMcpRegistration-DNLnQ-jz.js.map} +1 -1
- package/dist/lib/tools-DwwB9RBa.js +546 -0
- package/dist/lib/tools-DwwB9RBa.js.map +1 -0
- package/dist/lib/{trusted-types-CkLDpLiZ.js → trusted-types-Dx0RZlrd.js} +19 -8
- package/dist/lib/trusted-types-Dx0RZlrd.js.map +1 -0
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/public/.well-known/agent-skills/index.json +14 -0
- package/dist/public/AGENTS.md +5 -3
- package/dist/public/README.md +5 -3
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/{configurePeerJs-COcwE0E7.js → configurePeerJs-BqgeBjP7.js} +1 -1
- package/dist/public/custom-element-security-FU04Cq05.js +1 -0
- package/dist/public/dist-B9m1QM9v.js +58 -0
- package/dist/public/docs/README.md +31 -31
- package/dist/public/docs/example/article/index.html +1 -1
- package/dist/public/docs/publishing/index.html +1 -1
- package/dist/public/docs/skill-creator/index.html +1 -1
- package/dist/public/docs/subsystems/a2ui.md +11 -1
- package/dist/public/docs/subsystems/cli.md +29 -0
- package/dist/public/docs/subsystems/control-plane.md +8 -2
- package/dist/public/docs/subsystems/custom-element-security.md +19 -9
- package/dist/public/docs/subsystems/mcp-server.md +39 -15
- package/dist/public/docs/subsystems/skills.md +30 -0
- package/dist/public/docs/subsystems/webmcp.md +9 -0
- package/dist/public/downloadGroupFile-D8KRJGGL.js +1 -0
- package/dist/public/e2e/README.md +7 -4
- package/dist/public/{e2e-bridge-CHARpbpW.js → e2e-bridge-Ceqr5kGc.js} +1 -1
- package/dist/public/effect-BJCrpFdp.js +1 -0
- package/dist/public/file-viewer-C-6Jc_tb.js +1 -0
- package/dist/public/index.html +1 -1
- package/dist/public/index.js +1 -1
- package/dist/public/initControlPlane-BN9cWyO0.js +1 -0
- package/dist/public/main/index.html +1 -1
- package/dist/public/main/memory/index.html +1 -1
- package/dist/public/{markdown-1I3O6Mmd.js → markdown-C3M4OW_A.js} +1 -1
- package/dist/public/{orchestrator-Cl95w2vb.js → orchestrator-CMbCTjBf.js} +7 -7
- package/dist/public/{orchestrator-D-xlXG92.js → orchestrator-DHjdLtqa.js} +663 -663
- package/dist/public/peerjs-DUCKH-m9.js +1 -0
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-CaoKmIIB.js → shadow-claw-EAt2ml5Y.js} +3 -3
- package/dist/public/{shadow-claw-accounts-CJvYC4li.js → shadow-claw-accounts-xUOLBsQZ.js} +1 -1
- package/dist/public/{shadow-claw-channels-3K62sU5f.js → shadow-claw-channels-XsfuWFF8.js} +4 -4
- package/dist/public/{shadow-claw-chat-Cu2keU2I.js → shadow-claw-chat-CbSaOZ4q.js} +7 -7
- package/dist/public/{shadow-claw-control-plane-D1OwlQI_.js → shadow-claw-control-plane-DHvN3Ukg.js} +2 -2
- package/dist/public/{shadow-claw-conversations-DDtg3BEZ.js → shadow-claw-conversations-BWs5VVfs.js} +2 -2
- package/dist/public/{shadow-claw-file-viewer-BR__1z9S.js → shadow-claw-file-viewer-BWsoW5QS.js} +5 -4
- package/dist/public/{shadow-claw-files-BJSyZ-Bl.js → shadow-claw-files-CG7MqWiV.js} +8 -8
- package/dist/public/{shadow-claw-git-MAjhXRLc.js → shadow-claw-git-DBRPZNav.js} +6 -6
- package/dist/public/{shadow-claw-integrations-82UoFuDR.js → shadow-claw-integrations-BBVnO0Fc.js} +8 -8
- package/dist/public/{shadow-claw-llm-R8j0lwPP.js → shadow-claw-llm-DMvLgKXo.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-BzZoz4LX.js → shadow-claw-mcp-remote-Bkx0gsmF.js} +2 -2
- package/dist/public/{shadow-claw-networking-DLEd9cNm.js → shadow-claw-networking-Dd8Rw31D.js} +2 -2
- package/dist/public/{shadow-claw-notifications-1vwR7TbT.js → shadow-claw-notifications-Dbevj-lq.js} +2 -2
- package/dist/public/{shadow-claw-page-header-DMKbkv3s.js → shadow-claw-page-header-BccSHItx.js} +1 -1
- package/dist/public/{shadow-claw-pages-CjyeIV__.js → shadow-claw-pages-3_lQAv0t.js} +4 -3
- package/dist/public/{shadow-claw-settings-BfbT4dBU.js → shadow-claw-settings-t8TIlgrM.js} +5 -5
- package/dist/public/{shadow-claw-storage-C-mWQQML.js → shadow-claw-storage-CfEXoSIE.js} +2 -2
- package/dist/public/{shadow-claw-task-server-D3lHp0Nc.js → shadow-claw-task-server-DxQSsgRZ.js} +2 -2
- package/dist/public/{shadow-claw-tasks-DVVWEm-c.js → shadow-claw-tasks-DNpicQwz.js} +14 -14
- package/dist/public/{shadow-claw-terminal-BwuTRp-O.js → shadow-claw-terminal-DpY6zU_r.js} +1 -1
- package/dist/public/{shadow-claw-toast-ClCwgzFG.js → shadow-claw-toast-BkrQIP-3.js} +1 -1
- package/dist/public/{shadow-claw-tools-zFLk2nbV.js → shadow-claw-tools-WSwWohnk.js} +2 -2
- package/dist/public/{shadow-claw-webvm-qR9X7fg7.js → shadow-claw-webvm-CP6oFjg5.js} +2 -2
- package/dist/public/syncWebMcpRegistration-DOn9gLnD.js +1 -0
- package/dist/public/toast-BXgUfbyh.js +1 -0
- package/dist/public/tools-DvckJZG2.js +1 -0
- package/dist/server.js +188 -188
- package/package.json +3 -1
- package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.stories.ts +1380 -93
- package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.ts +11 -6
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +8 -1
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +13 -5
- package/src/components/shadow-claw-pages/utils/buildHtmlPageSrcdoc.ts +13 -5
- package/src/core/control-plane-client.ts +15 -0
- package/src/core/utils/initControlPlane.test.ts +187 -0
- package/src/core/utils/initControlPlane.ts +194 -20
- package/src/security/custom-element-security.test.ts +51 -0
- package/src/security/custom-element-security.ts +33 -15
- package/src/server/control-plane-types.ts +1 -0
- package/src/server/control-plane.test.ts +69 -0
- package/src/server/control-plane.ts +45 -3
- package/src/server/mcp/tools/built-in-tools.ts +80 -5
- package/src/server/mcp/tools/client-tool-relay.ts +183 -26
- package/src/server/mcp/tools/mcp-tools.test.ts +140 -0
- package/src/server/middleware/static-files.test.ts +142 -0
- package/src/server/middleware/static-files.ts +66 -8
- package/src/testing/jest-setup.ts +1 -0
- package/src/worker/utils/handleMessage.ts +4 -1
- package/dist/lib/initControlPlane-CsO4UR6_.js.map +0 -1
- package/dist/lib/readGroupFileBytes-Bve-e5e_.js.map +0 -1
- package/dist/lib/shadow-claw-file-viewer-BfDHHgpA.js.map +0 -1
- package/dist/lib/shadow-claw-pages-D54jF1Qq.js.map +0 -1
- package/dist/lib/trusted-types-CkLDpLiZ.js.map +0 -1
- package/dist/public/custom-element-security-NCqQ5lmC.js +0 -1
- package/dist/public/downloadGroupFile-G0BZQgQg.js +0 -1
- package/dist/public/effect-rHYr4nfu.js +0 -1
- package/dist/public/file-viewer-8PdCURDD.js +0 -1
- package/dist/public/initControlPlane-CcGXax0A.js +0 -1
- package/dist/public/peerjs-BZdxWQFv.js +0 -1
- package/dist/public/syncWebMcpRegistration-DD42YsYV.js +0 -1
- package/dist/public/toast-HAq8XWFj.js +0 -58
package/dist/public/{shadow-claw-control-plane-D1OwlQI_.js → shadow-claw-control-plane-DHvN3Ukg.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{
|
|
1
|
+
import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{t as r}from"./orchestrator-DHjdLtqa.js";import{t as i}from"./setConfig-DFMYnYLE.js";import{a,r as o}from"./toast-BXgUfbyh.js";import{t as s}from"./shadow-claw-element-DIrv3P6A.js";import{t as c}from"./effect-BJCrpFdp.js";const l=new CSSStyleSheet;l.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
font-family: var(--shadow-claw-font-sans);
|
|
@@ -240,4 +240,4 @@ import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b
|
|
|
240
240
|
</div>
|
|
241
241
|
</div>
|
|
242
242
|
</template>
|
|
243
|
-
`,`text/html`),d=u.querySelector(`template`);let f=[];f=d?Array.from(d.content.children):Array.from(u.head.children).concat(Array.from(u.body.children));var p=f;const m=`shadow-claw-control-plane`;function h(e){try{let t=new URL(e).hostname.toLowerCase();if(t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`)return`loopback`;if(/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(t))return`private`}catch{}}var g=class extends s{static styles=l;static template=p;db;orchestrator;constructor(){super(),this.db=null,this.orchestrator=null}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=
|
|
243
|
+
`,`text/html`),d=u.querySelector(`template`);let f=[];f=d?Array.from(d.content.children):Array.from(u.head.children).concat(Array.from(u.body.children));var p=f;const m=`shadow-claw-control-plane`;function h(e){try{let t=new URL(e).hostname.toLowerCase();if(t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`)return`loopback`;if(/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(t))return`private`}catch{}}var g=class extends s{static styles=l;static template=p;db;orchestrator;constructor(){super(),this.db=null,this.orchestrator=null}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=r.orchestrator,this.bindEventListeners(),this.setupEffects(),await this.render()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="save-control-plane-transport"]`)?.addEventListener(`click`,()=>{this.saveControlPlaneTransport()}),e.querySelector(`[data-action="save-control-plane-url"]`)?.addEventListener(`click`,()=>{this.saveControlPlaneUrl()}),e.querySelector(`[data-action="test-control-plane-connection"]`)?.addEventListener(`click`,()=>{this.testControlPlaneConnection()}),e.querySelector(`[data-setting="control-plane-enabled-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;this.saveControlPlaneEnabled(t.checked)}))}setupEffects(){c(()=>{r.ready&&(this.orchestrator=r.orchestrator,this.render())})}async render(){let t=this.shadowRoot;if(!t)return;let r=t.querySelector(`[data-setting="control-plane-enabled-toggle"]`);if(r&&this.db)try{let{isControlPlaneEnabled:e}=await import(`./initControlPlane-BN9cWyO0.js`);r.checked=await e(this.db)}catch{r.checked=!1}let i=t.querySelector(`[data-setting="control-plane-url-input"]`);if(i&&this.db)try{i.value=await n(this.db,e.CONTROL_PLANE_URL)||``}catch{i.value=``}let a=t.querySelector(`[data-setting="control-plane-transport-select"]`);if(a&&this.db)try{a.value=await n(this.db,e.CONTROL_PLANE_TRANSPORT)||`sse`}catch{a.value=`sse`}}async requestAppDialog(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog(e):!1}async probeControlPlane(e){let t;try{t=new URL(e)}catch{return{success:!1,error:`Invalid URL format: "${e}"`}}let n=h(e),r={method:`GET`,cache:`no-store`,mode:`cors`};n&&(r.targetAddressSpace=n);try{let e=new URL(`/api/control/health`,t).toString(),n=await fetch(e,r);if(n.status===404){let e=new URL(`/api/control/messages`,t).toString();n=await fetch(e,{...r,method:`OPTIONS`})}return n.ok||n.status===204||n.status===401?{success:!0}:{success:!1,error:`Server responded with HTTP ${n.status} (${n.statusText||`Error`})`}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async testControlPlaneConnection(){let e=this.shadowRoot;if(!e)return!1;let t=e.querySelector(`[data-setting="control-plane-url-input"]`),n=e.querySelector(`[data-action="test-control-plane-connection"]`),r=t?.value.trim()||`http://127.0.0.1:8888`;n&&(n.disabled=!0,n.textContent=`⏳ Testing...`);try{let e=await this.probeControlPlane(r);return e.success?(a(`Successfully reached Control Plane at ${r}`,4e3),!0):(o(`Connection test failed: ${e.error||`Unknown connection error`}`,6e3),await this.requestAppDialog({title:`Control Plane Connection Failed`,message:`Unable to connect to "${r}".\n\n• TLS / Certificate: If using HTTPS with a self-signed certificate, ensure the certificate is installed and trusted in Chrome (chrome://certificate-manager/localcerts/usercerts).\n• Chrome Permissions: In Site Settings, ensure "Local network access" is allowed.\n• Server Status: Verify the ShadowClaw dev server is running and listening on this host/port.`,confirmLabel:`OK`}),!1)}finally{n&&(n.disabled=!1,n.textContent=`🔌 Test Connection`)}}async saveControlPlaneTransport(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="control-plane-transport-select"]`);if(!n)return;let r=n.value===`websocket`?`websocket`:`sse`;try{if(await i(this.db,e.CONTROL_PLANE_TRANSPORT,r),typeof localStorage<`u`)try{localStorage.setItem(e.CONTROL_PLANE_TRANSPORT,r)}catch{}let{isControlPlaneEnabled:t,createDefaultControlPlaneClient:n,shouldConnectControlPlane:o}=await import(`./initControlPlane-BN9cWyO0.js`);await t(this.db)&&o()&&n({orchestrator:this.orchestrator||void 0,transport:r}),a(`Control Plane transport saved: ${r.toUpperCase()}`,3e3)}catch(e){o(`Error saving Control Plane transport: `+(e instanceof Error?e.message:String(e)),6e3)}}async saveControlPlaneUrl(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="control-plane-url-input"]`);if(!n)return;let r=n.value.trim();try{if(r&&this.probeControlPlane(r),await i(this.db,e.CONTROL_PLANE_URL,r),typeof localStorage<`u`)try{r?localStorage.setItem(e.CONTROL_PLANE_URL,r):localStorage.removeItem(e.CONTROL_PLANE_URL)}catch{}let{isControlPlaneEnabled:t,createDefaultControlPlaneClient:n,shouldConnectControlPlane:o}=await import(`./initControlPlane-BN9cWyO0.js`);await t(this.db)&&o()&&n({orchestrator:this.orchestrator||void 0}),a(r?`Control Plane URL saved: ${r}`:`Control Plane URL reset to default`,3e3)}catch(e){o(`Error saving Control Plane URL: `+(e instanceof Error?e.message:String(e)),6e3)}}async saveControlPlaneEnabled(t){if(this.db)try{if(t){let t=await n(this.db,e.CONTROL_PLANE_URL)||`http://127.0.0.1:8888`;this.probeControlPlane(t)}if(await i(this.db,e.CONTROL_PLANE_ENABLED,t?`true`:`false`),typeof localStorage<`u`)try{localStorage.setItem(e.CONTROL_PLANE_ENABLED,t?`true`:`false`)}catch{}let{createDefaultControlPlaneClient:r,stopControlPlaneClient:o,shouldConnectControlPlane:s}=await import(`./initControlPlane-BN9cWyO0.js`);t?(s()&&r({orchestrator:this.orchestrator||void 0}),a(`Control plane client enabled and connected`,3e3)):(o(),a(`Control plane client disabled`,3e3))}catch(e){o(`Error saving Control Plane setting: `+(e instanceof Error?e.message:String(e)),6e3)}}};customElements.get(m)||customElements.define(m,g);export{g as ShadowClawControlPlane,h as getControlPlaneTargetAddressSpace};
|
package/dist/public/{shadow-claw-conversations-DDtg3BEZ.js → shadow-claw-conversations-BWs5VVfs.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{u as r}from"./custom-element-security-
|
|
1
|
+
import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{u as r}from"./custom-element-security-FU04Cq05.js";import{K as i,Y as a,t as o}from"./orchestrator-DHjdLtqa.js";import{i as s,t as c}from"./tools-DvckJZG2.js";import{t as l}from"./setConfig-DFMYnYLE.js";import{t as u}from"./tools-C8x3nmo4.js";import"./tools-COduyYJ0.js";import{t as d}from"./shadow-claw-element-DIrv3P6A.js";import{t as f}from"./effect-BJCrpFdp.js";import{n as p}from"./model-ranking-C60HgQ2c.js";import"./shadow-claw-dialog-BrOwAOdk.js";const m=new CSSStyleSheet;m.replaceSync(`:host {
|
|
2
2
|
display: block;
|
|
3
3
|
}
|
|
4
4
|
|
|
@@ -1046,4 +1046,4 @@ import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b
|
|
|
1046
1046
|
</form>
|
|
1047
1047
|
</shadow-claw-dialog>
|
|
1048
1048
|
</template>
|
|
1049
|
-
`,`text/html`),j=A.querySelector(`template`);let M=[];M=j?Array.from(j.content.children):Array.from(A.head.children).concat(Array.from(A.body.children));var N=M,P=class extends d{static styles=k;static template=N;channelRegistry=null;db=null;_autoScrollActive=!1;_autoScrollSpeed=0;_draggedGroupId=null;_effectCleanup=null;_keyboardGrabbedId=null;_pendingCloneGroupId=null;_pendingDeleteGroupId=null;_pendingDetailsPinnedMaxTokens=null;_pendingDetailsPinnedModel=null;_pendingDetailsPinnedProvider=null;_pendingDetailsProviderRuntimeOverrides={};_pendingDetailsSubagentMaxTokens=null;_pendingDetailsSubagentMode=`automatic`;_pendingDetailsSubagentModel=null;_pendingDetailsSubagentProvider=null;_pendingDetailsToolTags=null;_pendingRenameGroupId=null;_pendingRenameName=null;_touchDraggedGroupId=null;_touchId=null;async connectedCallback(){let r=this.shadowRoot;if(!r)throw Error(`shadowRoot not found`);this.db=await t();let i=await n(this.db,e.CONVERSATIONS_HEIGHT);i&&typeof i==`number`&&i>0&&(this.style.flex=`none`,this.style.height=`${i}px`),this.channelRegistry=c.orchestrator?.channelRegistry||null,this.shadowRoot.querySelector(`[data-action='create']`)?.addEventListener(`click`,()=>this.handleCreate()),this._setupDialogListeners(),this._initResizeHandle(),r.addEventListener(`dragover`,e=>{this._draggedGroupId!==null&&this._updateAutoScrollSpeed(e.clientY)}),r.addEventListener(`dragend`,()=>{this._stopAutoScroll()}),r.addEventListener(`drop`,()=>{this._stopAutoScroll()}),this.render(),this._effectCleanup=f(()=>{c.groups,c.activeGroupId,c.unreadGroupIds,this.render()})}disconnectedCallback(){this._effectCleanup&&=(this._effectCleanup(),null)}getChannelRegistry(){let e=c.orchestrator?.channelRegistry||null;return e&&(this.channelRegistry=e),this.channelRegistry}openCloneDialog(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.conversations__clone-dialog`),r=n?.querySelector(`.conversations__clone-name`);n&&(r&&(r.textContent=e),n.showModal())}openCreateDialog(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.conversations__create-dialog`),n=e.querySelector(`.conversations__create-dialog .conversations__input`);t&&(t.showModal(),n&&(n.value=``,n.focus()))}openDeleteDialog(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.conversations__delete-dialog`),r=n?.querySelector(`.conversations__delete-name`),i=n?.querySelector(`.conversations__cancel`);n&&(r&&(r.textContent=e),n.showModal(),i?.focus())}openDetailsDialog(e,t){let n=this.shadowRoot;if(!n)return;let a=n.querySelector(`.conversations__details-dialog`),l=n.querySelector(`.conversations__details-dialog .conversations__input`),d=n.querySelector(`#conversations-details-group-id`),f=n.querySelector(`#conversations-group-id-copy-btn`),p=n.querySelector(`#conversations-details-tools`),m=n.querySelector(`#conversations-tool-input`),h=n.querySelector(`#conversations-add-tool-btn`),g=n.querySelector(`#conversations-available-tools`),_=n.querySelector(`#conversations-main-picker`),v=n.querySelector(`#conversations-main-provider-module-settings`),y=n.querySelector(`#conversations-agent-max-tokens`),b=n.querySelector(`#conversations-subagent-settings-container`),x=n.querySelector(`#conversations-subagent-mode`),S=n.querySelector(`#conversations-subagent-max-tokens`),C=n.querySelector(`#conversations-subagent-manual-container`),w=n.querySelector(`#conversations-subagent-picker`),T=n.querySelector(`#conversations-subagent-provider-module-settings`);if(d&&(d.value=t?.replace(`:`,`-`)||``),f&&d){let e=f.cloneNode(!0);f.replaceWith(e),e.addEventListener(`click`,async()=>{let t=d.value;if(t)try{await navigator.clipboard.writeText(t);let n=e.innerHTML;r(e,`<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>`),e.classList.add(`conversations__group-id-copy-btn--copied`),setTimeout(()=>{r(e,n),e.classList.remove(`conversations__group-id-copy-btn--copied`)},1500)}catch{d.select()}})}let E=n.querySelector(`#conversations-details-participants-container`),D=n.querySelector(`#conversations-details-participants-list`);if(E&&D)if(t&&t.startsWith(`peer:`)){E.style.display=`block`,D.replaceChildren();let e=c.orchestrator;if(e){let n=e.peerjs?.connectedPeersSignal?.get()||[],r=t.replace(`peer:`,``);if(n.includes(r)){let t=``;if(e.peerjsPeerAliases){for(let[n,i]of Object.entries(e.peerjsPeerAliases))if(i===r){t=n;break}}let n=t?`${t} (${r.substring(0,8)})`:r,i=document.createElement(`div`);i.className=`conversations__group-id-row`;let a=document.createElement(`input`);a.className=`conversations__input conversations__group-id-input`,a.type=`text`,a.readOnly=!0,a.value=n,a.style.marginBottom=`0`;let o=document.createElement(`button`);o.type=`button`,o.className=`conversations__group-id-copy-btn`,o.title=`Copy Peer ID`,o.setAttribute(`aria-label`,`Copy Peer ID to clipboard`),o.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>`,o.addEventListener(`click`,async()=>{try{await navigator.clipboard.writeText(r);let e=o.innerHTML;o.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>`,o.classList.add(`conversations__group-id-copy-btn--copied`),setTimeout(()=>{o.innerHTML=e,o.classList.remove(`conversations__group-id-copy-btn--copied`)},1500)}catch{a.value=r,a.select()}}),i.appendChild(a),i.appendChild(o),D.appendChild(i)}else{let e=document.createElement(`div`);e.style.fontSize=`0.875rem`,e.style.color=`var(--text-secondary)`,e.textContent=`Peer is not currently connected.`,D.appendChild(e)}}}else E.style.display=`none`;if(!a)return;a.showModal();let O=new Map;for(let e of u)O.set(e.name,e);for(let e of s.allTools)O.has(e.name)||O.set(e.name,e);let k=()=>{if(!g)return;let e=new Set(this._pendingDetailsToolTags||[]);g.replaceChildren();for(let t of O.values()){if(e.has(t.name))continue;let n=document.createElement(`option`);n.value=t.name,g.appendChild(n)}};this.db&&t&&o(this.db,t).then(({tools:e})=>{let t=!1;for(let n of e)O.has(n.name)||(O.set(n.name,n),t=!0);t&&k()}).catch(()=>{});let A=()=>{if(!p)return;p.replaceChildren();let e=this._pendingDetailsToolTags||[];for(let t of e){let e=O.get(t),n=document.createElement(`span`);n.className=`conversations__tool-chip`;let r=document.createElement(`span`);r.textContent=t,e?.description&&(r.title=e.description),n.appendChild(r);let i=document.createElement(`button`);i.type=`button`,i.className=`conversations__tool-chip-remove`,i.textContent=`×`,i.setAttribute(`aria-label`,`Remove tool ${t}`),i.addEventListener(`click`,()=>{this._pendingDetailsToolTags&&(this._pendingDetailsToolTags=this._pendingDetailsToolTags.filter(e=>e!==t),A())}),n.appendChild(i),p.appendChild(n)}if(k(),b&&x){let e=this._isSpawnSubagentEnabledInCurrentScope();b.style.display=e?`flex`:`none`,e||(this._pendingDetailsSubagentMode=`automatic`),C&&(C.style.display=this._pendingDetailsSubagentMode===`manual`&&e?`flex`:`none`),S&&(S.value=typeof this._pendingDetailsSubagentMaxTokens==`number`&&Number.isFinite(this._pendingDetailsSubagentMaxTokens)&&this._pendingDetailsSubagentMaxTokens>0?String(Math.floor(this._pendingDetailsSubagentMaxTokens)):``)}};if(h&&m&&(h.onclick=()=>{let e=m.value.trim();if(!e)return;let t=/^[a-z][a-z0-9_]{0,63}$/.test(e);if(!O.get(e)&&!t){m.value=``;return}this._pendingDetailsToolTags||=[],this._pendingDetailsToolTags.includes(e)||(this._pendingDetailsToolTags.push(e),A()),m.value=``},m.onkeydown=e=>{e.key===`Enter`&&(e.preventDefault(),h.click())}),A(),_&&v&&x&&b&&C&&w&&T){let e=i()||[];_.setLabels({providerLabel:`Pinned Provider`,defaultProviderLabel:`Default (Global)`,modelLabel:`Pinned Model`,defaultModelLabel:`Default Model`,customModelPlaceholder:`Custom model id`}),_.setModelLoader(e=>this._loadProviderModels(e)),_.setProviders(e),_.setValue({providerId:this._pendingDetailsPinnedProvider,modelId:this._pendingDetailsPinnedModel}),v.setProvider(this._pendingDetailsPinnedProvider),y&&(y.value=typeof this._pendingDetailsPinnedMaxTokens==`number`&&Number.isFinite(this._pendingDetailsPinnedMaxTokens)&&this._pendingDetailsPinnedMaxTokens>0?String(Math.floor(this._pendingDetailsPinnedMaxTokens)):``),v.setOverrides(this._pendingDetailsProviderRuntimeOverrides),w.setLabels({providerLabel:`Pinned Subagent Provider`,defaultProviderLabel:`Default (Parent Provider)`,modelLabel:`Pinned Subagent Model`,defaultModelLabel:`Default Model`,customModelPlaceholder:`Custom subagent model id`}),w.setModelLoader(e=>this._loadProviderModels(e)),w.setProviders(e),w.setValue({providerId:this._pendingDetailsSubagentProvider,modelId:this._pendingDetailsSubagentModel}),T.setProvider(this._pendingDetailsSubagentProvider),T.setOverrides(this._pendingDetailsProviderRuntimeOverrides),_.hasAttribute(`data-bound`)||(_.addEventListener(`provider-model-change`,e=>{let t=e.detail||{};this._pendingDetailsPinnedProvider=t.providerId||null,this._pendingDetailsPinnedModel=t.modelId||null,v.setProvider(this._pendingDetailsPinnedProvider),v.setOverrides(this._pendingDetailsProviderRuntimeOverrides)}),_.setAttribute(`data-bound`,`true`)),y?.hasAttribute(`data-bound`)||(y?.addEventListener(`input`,()=>{let e=Number(y.value);Number.isFinite(e)&&e>0?this._pendingDetailsPinnedMaxTokens=Math.floor(e):this._pendingDetailsPinnedMaxTokens=null}),y?.setAttribute(`data-bound`,`true`)),v.hasAttribute(`data-bound`)||(v.addEventListener(`provider-module-settings-change`,e=>{let t=e.detail||{},n=t.providerId,r=t.overrides;if(!n)return;let i=JSON.parse(JSON.stringify(this._pendingDetailsProviderRuntimeOverrides||{}));n===`llamafile`?i.llamafile=r.llamafile:n===`bedrock_proxy`&&(i.bedrock_proxy=r.bedrock_proxy),this._pendingDetailsProviderRuntimeOverrides=i,_.invalidateProviderModels(n),w.invalidateProviderModels(n)}),v.setAttribute(`data-bound`,`true`)),w.hasAttribute(`data-bound`)||(w.addEventListener(`provider-model-change`,e=>{let t=e.detail||{};this._pendingDetailsSubagentProvider=t.providerId||null,this._pendingDetailsSubagentModel=t.modelId||null,T.setProvider(this._pendingDetailsSubagentProvider),T.setOverrides(this._pendingDetailsProviderRuntimeOverrides)}),w.setAttribute(`data-bound`,`true`)),T.hasAttribute(`data-bound`)||(T.addEventListener(`provider-module-settings-change`,e=>{let t=e.detail||{},n=t.providerId,r=t.overrides;if(!n)return;let i=JSON.parse(JSON.stringify(this._pendingDetailsProviderRuntimeOverrides||{}));n===`llamafile`?i.llamafile=r.llamafile:n===`bedrock_proxy`&&(i.bedrock_proxy=r.bedrock_proxy),this._pendingDetailsProviderRuntimeOverrides=i,_.invalidateProviderModels(n),w.invalidateProviderModels(n)}),T.setAttribute(`data-bound`,`true`)),x.value=this._pendingDetailsSubagentMode;let t=this._isSpawnSubagentEnabledInCurrentScope();b.style.display=t?`flex`:`none`,v.style.display=this._pendingDetailsPinnedProvider?`flex`:`none`,C.style.display=t&&this._pendingDetailsSubagentMode===`manual`?`flex`:`none`,T.style.display=t&&this._pendingDetailsSubagentMode===`manual`&&this._pendingDetailsSubagentProvider?`flex`:`none`,x.onchange=()=>{this._pendingDetailsSubagentMode=x.value===`manual`?`manual`:`automatic`,C.style.display=this._pendingDetailsSubagentMode===`manual`&&this._isSpawnSubagentEnabledInCurrentScope()?`flex`:`none`,T.style.display=this._pendingDetailsSubagentMode===`manual`&&this._isSpawnSubagentEnabledInCurrentScope()&&this._pendingDetailsSubagentProvider?`flex`:`none`},S?.hasAttribute(`data-bound`)||(S?.addEventListener(`input`,()=>{let e=Number(S.value);Number.isFinite(e)&&e>0?this._pendingDetailsSubagentMaxTokens=Math.floor(e):this._pendingDetailsSubagentMaxTokens=null}),S?.setAttribute(`data-bound`,`true`))}l&&(l.value=e,l.select(),l.focus())}async handleClone(e){if(!this.db)return;let t=(c.groups||[]).find(t=>t.groupId===e);t&&(this._pendingCloneGroupId=e,this.openCloneDialog(t.name))}async handleCreate(){this.db&&this.openCreateDialog()}async handleDelete(e,t){this.db&&(this._pendingDeleteGroupId=e,this.openDeleteDialog(t))}async handleDetails(e,t){if(!this.db)return;this._pendingRenameGroupId=e,this._pendingRenameName=t;let n=(c.groups||[]).find(t=>t.groupId===e),r=n?.toolTags||[];this._pendingDetailsToolTags=[...r],this._pendingDetailsPinnedMaxTokens=typeof n?.pinnedMaxTokens==`number`&&Number.isFinite(n.pinnedMaxTokens)&&n.pinnedMaxTokens>0?Math.floor(n.pinnedMaxTokens):null,this._pendingDetailsPinnedProvider=n?.pinnedProvider||null,this._pendingDetailsPinnedModel=n?.pinnedModel||null,this._pendingDetailsProviderRuntimeOverrides=JSON.parse(JSON.stringify(n?.providerRuntimeOverrides||{})),this._pendingDetailsSubagentMode=n?.subagentModelSelectionMode===`manual`?`manual`:`automatic`,this._pendingDetailsSubagentMaxTokens=typeof n?.subagentMaxTokens==`number`&&Number.isFinite(n.subagentMaxTokens)&&n.subagentMaxTokens>0?Math.floor(n.subagentMaxTokens):null,this._pendingDetailsSubagentProvider=n?.subagentPinnedProvider||null,this._pendingDetailsSubagentModel=n?.subagentPinnedModel||null,this.openDetailsDialog(t,e)}async handleReorder(e,t,n){if(!this.db)return;if(n){await c.reorderConversations(this.db,n);return}let r=(c.groups||[]).map(e=>e.groupId),i=r.indexOf(e),a=r.indexOf(t);i<0||a<0||(r.splice(i,1),r.splice(a,0,e),await c.reorderConversations(this.db,r))}async handleSwitch(e){if(e===c.activeGroupId)return;let t=c.activePage,n=c.sidebarDefaultPage,r=t===`chat`||t===`tasks`||t===`files`?t:n===`tasks`||n===`files`?n:`chat`;document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:r,groupId:e},bubbles:!0,composed:!0}))}async render(){let e=this.shadowRoot.querySelector(`.conversation-list`);if(!e)return;let t=c.groups||[],n=c.activeGroupId,r=c.unreadGroupIds||new Set,i=this.getChannelRegistry();e.replaceChildren();for(let a=0;a<t.length;a++){let o=t[a],s=o.groupId===n,c=!s&&r.has(o.groupId),l=document.createElement(`li`);l.className=`conversation-item${s?` active`:``}${c?` unread`:``}`,l.setAttribute(`data-group-id`,o.groupId),l.setAttribute(`role`,`listitem`),l.setAttribute(`tabindex`,`0`),l.setAttribute(`aria-describedby`,`reorder-instructions`),l.setAttribute(`aria-label`,`${o.name}, position ${a+1} of ${t.length}`),this._keyboardGrabbedId===o.groupId&&(l.classList.add(`keyboard-grabbed`),l.setAttribute(`aria-grabbed`,`true`));let u=i?i.getBadge(o.groupId):``,d=t.length>1,f=document.createElement(`span`);if(f.className=`drag-handle`,f.setAttribute(`draggable`,`true`),f.setAttribute(`aria-hidden`,`true`),f.setAttribute(`title`,`Drag to reorder`),f.textContent=`⠿`,l.append(f),u){let e=document.createElement(`span`);e.className=`channel-badge`,e.textContent=u,l.append(e)}if(o.toolTags&&o.toolTags.length>0){let e=document.createElement(`span`);e.className=`tool-badge`,e.textContent=`🔧`,e.title=`Pinned Tools: ${o.toolTags.join(`, `)}`,l.append(e)}let p=document.createElement(`span`);p.className=`conversation-name`,p.textContent=o.name;let m=document.createElement(`span`);m.className=`conversation-actions`;let h=document.createElement(`button`);h.setAttribute(`data-action`,`clone`),h.setAttribute(`title`,`Clone`),h.setAttribute(`aria-label`,`Clone ${o.name}`),h.textContent=`📋`;let g=document.createElement(`button`);if(g.setAttribute(`data-action`,`details`),g.setAttribute(`title`,`Details`),g.setAttribute(`aria-label`,`Details for ${o.name}`),g.textContent=`⚙️`,m.append(h,g),d){let e=document.createElement(`button`);e.setAttribute(`data-action`,`delete`),e.setAttribute(`title`,`Delete`),e.setAttribute(`aria-label`,`Delete ${o.name}`),e.textContent=`🗑️`,m.append(e)}let _=document.createElement(`button`);_.className=`conversation-actions-toggle`,_.setAttribute(`title`,`More actions`),_.setAttribute(`aria-label`,`More actions for ${o.name}`),_.textContent=`⋮`,l.append(p,m,_),l.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-action]`)?.getAttribute(`data-action`);n===`clone`?this.handleClone(o.groupId):n===`details`?this.handleDetails(o.groupId,o.name):n===`delete`?this.handleDelete(o.groupId,o.name):t.closest(`.conversation-actions-toggle`)?l.classList.toggle(`show-actions`):t.closest(`.drag-handle`)||(this.handleSwitch(o.groupId),l.classList.remove(`show-actions`))}),l.addEventListener(`keydown`,e=>{this._handleKeyboard(e,o.groupId,o.name)}),f.addEventListener(`dragstart`,e=>{this._draggedGroupId=o.groupId,l.classList.add(`dragging`),e.dataTransfer?.setData(`text/plain`,o.groupId)}),f.addEventListener(`dragend`,()=>{l.classList.remove(`dragging`),this._draggedGroupId=null,e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`))}),f.addEventListener(`touchstart`,e=>{let t=e.touches[0];t&&(this._touchId=t.identifier,this._touchDraggedGroupId=o.groupId,l.classList.add(`dragging`),e.preventDefault())},{passive:!1}),l.addEventListener(`dragover`,e=>{e.preventDefault(),this._draggedGroupId&&this._draggedGroupId!==o.groupId&&l.classList.add(`drag-over`)}),l.addEventListener(`dragleave`,()=>{l.classList.remove(`drag-over`)}),l.addEventListener(`drop`,e=>{e.preventDefault(),l.classList.remove(`drag-over`),this._draggedGroupId&&this._draggedGroupId!==o.groupId&&this.handleReorder(this._draggedGroupId,o.groupId)}),e.appendChild(l)}this._bindTouchListEvents(e)}_announce(e){let t=this.shadowRoot?.querySelector(`#live-region`);t&&(t.textContent=``,requestAnimationFrame(()=>{t.textContent=e}))}_bindTouchListEvents(e){e._touchBound||(e._touchBound=!0,e.addEventListener(`touchmove`,t=>{if(this._touchDraggedGroupId===null)return;let n=this._findTouch(t);if(!n)return;t.preventDefault();let r=this._itemAtPoint(n.clientX,n.clientY);e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`)),r&&r.getAttribute(`data-group-id`)!==this._touchDraggedGroupId&&r.classList.add(`drag-over`),this._updateAutoScrollSpeed(n.clientY)},{passive:!1}),e.addEventListener(`touchend`,t=>{if(this._touchDraggedGroupId===null)return;let n=this._findChangedTouch(t);if(!n)return;let r=this._itemAtPoint(n.clientX,n.clientY)?.getAttribute(`data-group-id`);e.querySelectorAll(`.dragging`).forEach(e=>e.classList.remove(`dragging`)),e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`)),r&&r!==this._touchDraggedGroupId&&this.handleReorder(this._touchDraggedGroupId,r),this._stopAutoScroll(),this._touchDraggedGroupId=null,this._touchId=null}),e.addEventListener(`touchcancel`,()=>{e.querySelectorAll(`.dragging`).forEach(e=>e.classList.remove(`dragging`)),e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`)),this._stopAutoScroll(),this._touchDraggedGroupId=null,this._touchId=null}))}_findChangedTouch(e){for(let t=0;t<e.changedTouches.length;t++){let n=e.changedTouches[t];if(n.identifier===this._touchId)return n}}_findTouch(e){for(let t=0;t<e.touches.length;t++){let n=e.touches[t];if(n.identifier===this._touchId)return n}}_focusNext(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`li[tabindex="0"], button:not([disabled])`)),r=n.indexOf(e);r!==-1&&r<n.length-1&&n[r+1].focus()}_focusNextItem(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`.conversation-item`)),r=e.closest(`.conversation-item`),i=n.indexOf(r);i!==-1&&i<n.length-1&&n[i+1].focus()}_focusPrev(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`li[tabindex="0"], button:not([disabled])`)),r=n.indexOf(e);r>0&&n[r-1].focus()}_focusPrevItem(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`.conversation-item`)),r=e.closest(`.conversation-item`),i=n.indexOf(r);i>0&&n[i-1].focus()}_handleKeyboard(e,t,n){let r=c.groups||[],i=r.map(e=>e.groupId),a=i.length;if(this._keyboardGrabbedId===null){if(e.key===`ArrowDown`){e.preventDefault(),this._focusNextItem(e.target);return}if(e.key===`ArrowUp`){e.preventDefault(),this._focusPrevItem(e.target);return}if(e.key===`ArrowRight`){e.preventDefault(),this._focusNext(e.target);return}if(e.key===`ArrowLeft`){e.preventDefault(),this._focusPrev(e.target);return}if(e.key===` `||e.key===`Spacebar`||e.key===`Enter`){e.target.classList.contains(`conversation-item`)&&(e.preventDefault(),this.handleSwitch(t));return}if(e.key===`m`||e.key===`M`){e.preventDefault(),this._keyboardGrabbedId=t;let r=i.indexOf(t)+1;this._announce(`${n} grabbed. Current position ${r} of ${a}. Use Arrow Up and Down to move, Space or Enter to drop.`),this.render()}return}if(e.key===`Escape`){e.preventDefault(),this._announce(`Reorder cancelled. ${n} returned to original position.`),this._keyboardGrabbedId=null,this.render();return}if(e.key===` `||e.key===`Spacebar`||e.key===`Enter`){e.preventDefault();let t=i.indexOf(this._keyboardGrabbedId)+1,n=r.find(e=>e.groupId===this._keyboardGrabbedId)?.name||``;this._announce(`${n} dropped at position ${t} of ${a}. Reordering complete.`),this._keyboardGrabbedId=null,this.render();return}if(e.key===`ArrowUp`||e.key===`ArrowDown`){e.preventDefault();let t=i.indexOf(this._keyboardGrabbedId),n=e.key===`ArrowUp`?t-1:t+1;if(n<0||n>=a)return;i.splice(t,1),i.splice(n,0,this._keyboardGrabbedId),this._announce(`Moved to position ${n+1} of ${a}.`),this.handleReorder(this._keyboardGrabbedId,i[t],i)}}_initResizeHandle(){let e=this.shadowRoot.querySelector(`.resize-handle`);if(!e)return;let t=null,n=e=>{if(e.pointerId!==t)return;let n=this.parentElement?.getBoundingClientRect();if(!n)return;let r=this.getBoundingClientRect().bottom-e.clientY,i=n.height-60,a=Math.max(80,Math.min(i,r));this.style.flex=`none`,this.style.height=`${a}px`},r=()=>{t!==null&&(t=null,e.classList.remove(`active`),document.removeEventListener(`pointermove`,n),this._persistHeight())};e.addEventListener(`pointerdown`,r=>{let i=r;i.pointerType===`mouse`&&i.button!==0&&i.button!==-1||(i.preventDefault(),t=i.pointerId,e.classList.add(`active`),e.setPointerCapture(i.pointerId),document.addEventListener(`pointermove`,n))}),e.addEventListener(`pointerup`,e=>{e.pointerId===t&&r()}),e.addEventListener(`pointercancel`,r),e.addEventListener(`dblclick`,()=>{this.style.flex=``,this.style.height=``,this._persistHeight(0)})}_isSpawnSubagentEnabledInCurrentScope(){return Array.isArray(this._pendingDetailsToolTags)&&this._pendingDetailsToolTags.length>0?this._pendingDetailsToolTags.includes(`spawn_subagent`):s.enabledToolNames.has(`spawn_subagent`)}_itemAtPoint(e,t){let n=this.shadowRoot;return n&&n.elementFromPoint(e,t)?.closest?.(`.conversation-item`)||null}_setupDialogListeners(){let e=this.shadowRoot,t=e.querySelector(`.conversations__create-dialog`),n=e.querySelector(`.conversations__create-dialog .conversations__form`);e.querySelector(`.conversations__create-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{t?.close()}),n?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitCreateDialog()});let r=e.querySelector(`.conversations__details-dialog`),i=e.querySelector(`.conversations__details-dialog .conversations__form`);e.querySelector(`.conversations__details-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{r?.close(),this._pendingRenameGroupId=null,this._pendingRenameName=null,this._pendingDetailsToolTags=null,this._pendingDetailsPinnedProvider=null,this._pendingDetailsPinnedModel=null,this._pendingDetailsProviderRuntimeOverrides={},this._pendingDetailsSubagentMode=`automatic`,this._pendingDetailsSubagentMaxTokens=null,this._pendingDetailsSubagentProvider=null,this._pendingDetailsSubagentModel=null}),i?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitDetailsDialog()});let a=e.querySelector(`.conversations__delete-dialog`),o=e.querySelector(`.conversations__delete-dialog .conversations__form`);e.querySelector(`.conversations__delete-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{a?.close(),this._pendingDeleteGroupId=null}),o?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitDeleteDialog()});let s=e.querySelector(`.conversations__clone-dialog`),c=e.querySelector(`.conversations__clone-dialog .conversations__form`);e.querySelector(`.conversations__clone-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{s?.close(),this._pendingCloneGroupId=null}),c?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitCloneDialog()})}_startAutoScroll(){if(this._autoScrollActive)return;this._autoScrollActive=!0;let e=()=>{if(!this._autoScrollActive)return;let t=this.shadowRoot?.querySelector(`.conversation-list`);t&&this._autoScrollSpeed!==0&&(t.scrollTop+=this._autoScrollSpeed),requestAnimationFrame(e)};requestAnimationFrame(e)}_stopAutoScroll(){this._autoScrollActive=!1,this._autoScrollSpeed=0}_updateAutoScrollSpeed(e){let t=this.shadowRoot?.querySelector(`.conversation-list`);if(!t){this._autoScrollSpeed=0;return}let n=t.getBoundingClientRect(),r=e-n.top,i=n.bottom-e;r>=0&&r<50?(this._autoScrollSpeed=-((50-r)/50)*8,this._startAutoScroll()):i>=0&&i<50?(this._autoScrollSpeed=(50-i)/50*8,this._startAutoScroll()):this._autoScrollSpeed=0}async _loadProviderModels(e){if(Array.isArray(e.models)&&e.models.length>0)return e.models;if(!e.modelsUrl)return[];let t={...e.headers||{},...c.orchestrator?a(c.orchestrator,e.id,``,this._pendingDetailsProviderRuntimeOverrides):{}};if(this.db&&e.apiKeyHeader&&c.orchestrator){let n=await c.orchestrator.getApiKeyForSpecificProvider(this.db,e.id);if(n){let r=e.apiKeyHeaderFormat||`{key}`;t[e.apiKeyHeader]=r.replace(`{key}`,n)}}let n=await fetch(e.modelsUrl,{headers:t});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=[];if(Array.isArray(r))i=r;else if(r&&typeof r==`object`){let e=r;if(Array.isArray(e.models))i=e.models;else if(Array.isArray(e.data))i=e.data;else{for(let t of Object.values(e))if(Array.isArray(t)&&t.length>0){i=t;break}i.length===0&&(e.id||e.name)&&(i=[e])}}if(Array.isArray(e.models)&&e.models.length>0){let t=new Set(i.map(e=>typeof e==`string`?e:e.id||e.name||``).filter(Boolean));i=[...e.models.filter(e=>{let n=typeof e==`string`?e:e.id||e.name||``;return n&&!t.has(n)}),...i]}return i}async _persistHeight(t){if(!this.db)return;let n=t===void 0?this.getBoundingClientRect().height:t;await l(this.db,e.CONVERSATIONS_HEIGHT,n||0)}async _submitCloneDialog(){let e=this.shadowRoot;if(!e||!this.db||!this._pendingCloneGroupId)return;let t=e.querySelector(`.conversations__clone-dialog`);await c.cloneConversation(this.db,this._pendingCloneGroupId),t?.close(),this._pendingCloneGroupId=null}async _submitCreateDialog(){let e=this.shadowRoot;if(!e||!this.db)return;let t=e.querySelector(`.conversations__create-dialog .conversations__input`),n=e.querySelector(`.conversations__create-dialog`),r=t?.value.trim();r&&(await c.createConversation(this.db,r),n?.close())}async _submitDeleteDialog(){let e=this.shadowRoot;if(!e||!this.db||!this._pendingDeleteGroupId)return;let t=e.querySelector(`.conversations__delete-dialog`);await c.deleteConversation(this.db,this._pendingDeleteGroupId),t?.close(),this._pendingDeleteGroupId=null}async _submitDetailsDialog(){let e=this.shadowRoot;if(!e||!this.db||!this._pendingRenameGroupId||!this._pendingRenameName)return;let t=e.querySelector(`.conversations__details-dialog .conversations__input`),n=e.querySelector(`.conversations__details-dialog`),r=t?.value.trim();r&&r!==this._pendingRenameName&&await c.renameConversation(this.db,this._pendingRenameGroupId,r),this._pendingDetailsToolTags&&await c.updateConversationToolTags(this.db,this._pendingRenameGroupId,this._pendingDetailsToolTags),await c.updateConversationPinnedProvider(this.db,this._pendingRenameGroupId,this._pendingDetailsPinnedProvider||void 0,this._pendingDetailsPinnedModel||void 0,this._pendingDetailsPinnedMaxTokens||void 0),await c.updateConversationProviderRuntimeOverrides(this.db,this._pendingRenameGroupId,this._pendingDetailsProviderRuntimeOverrides),await c.updateConversationSubagentSettings(this.db,this._pendingRenameGroupId,this._pendingDetailsSubagentMode,this._pendingDetailsSubagentProvider||void 0,this._pendingDetailsSubagentModel||void 0,this._pendingDetailsSubagentMaxTokens||void 0),n?.close(),this._pendingRenameGroupId=null,this._pendingRenameName=null,this._pendingDetailsToolTags=null,this._pendingDetailsPinnedMaxTokens=null,this._pendingDetailsPinnedProvider=null,this._pendingDetailsPinnedModel=null,this._pendingDetailsProviderRuntimeOverrides={},this._pendingDetailsSubagentMode=`automatic`,this._pendingDetailsSubagentMaxTokens=null,this._pendingDetailsSubagentProvider=null,this._pendingDetailsSubagentModel=null}};customElements.define(`shadow-claw-conversations`,P);export{P as ShadowClawConversations};
|
|
1049
|
+
`,`text/html`),j=A.querySelector(`template`);let M=[];M=j?Array.from(j.content.children):Array.from(A.head.children).concat(Array.from(A.body.children));var N=M,P=class extends d{static styles=k;static template=N;channelRegistry=null;db=null;_autoScrollActive=!1;_autoScrollSpeed=0;_draggedGroupId=null;_effectCleanup=null;_keyboardGrabbedId=null;_pendingCloneGroupId=null;_pendingDeleteGroupId=null;_pendingDetailsPinnedMaxTokens=null;_pendingDetailsPinnedModel=null;_pendingDetailsPinnedProvider=null;_pendingDetailsProviderRuntimeOverrides={};_pendingDetailsSubagentMaxTokens=null;_pendingDetailsSubagentMode=`automatic`;_pendingDetailsSubagentModel=null;_pendingDetailsSubagentProvider=null;_pendingDetailsToolTags=null;_pendingRenameGroupId=null;_pendingRenameName=null;_touchDraggedGroupId=null;_touchId=null;async connectedCallback(){let r=this.shadowRoot;if(!r)throw Error(`shadowRoot not found`);this.db=await t();let i=await n(this.db,e.CONVERSATIONS_HEIGHT);i&&typeof i==`number`&&i>0&&(this.style.flex=`none`,this.style.height=`${i}px`),this.channelRegistry=o.orchestrator?.channelRegistry||null,this.shadowRoot.querySelector(`[data-action='create']`)?.addEventListener(`click`,()=>this.handleCreate()),this._setupDialogListeners(),this._initResizeHandle(),r.addEventListener(`dragover`,e=>{this._draggedGroupId!==null&&this._updateAutoScrollSpeed(e.clientY)}),r.addEventListener(`dragend`,()=>{this._stopAutoScroll()}),r.addEventListener(`drop`,()=>{this._stopAutoScroll()}),this.render(),this._effectCleanup=f(()=>{o.groups,o.activeGroupId,o.unreadGroupIds,this.render()})}disconnectedCallback(){this._effectCleanup&&=(this._effectCleanup(),null)}getChannelRegistry(){let e=o.orchestrator?.channelRegistry||null;return e&&(this.channelRegistry=e),this.channelRegistry}openCloneDialog(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.conversations__clone-dialog`),r=n?.querySelector(`.conversations__clone-name`);n&&(r&&(r.textContent=e),n.showModal())}openCreateDialog(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.conversations__create-dialog`),n=e.querySelector(`.conversations__create-dialog .conversations__input`);t&&(t.showModal(),n&&(n.value=``,n.focus()))}openDeleteDialog(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.conversations__delete-dialog`),r=n?.querySelector(`.conversations__delete-name`),i=n?.querySelector(`.conversations__cancel`);n&&(r&&(r.textContent=e),n.showModal(),i?.focus())}openDetailsDialog(e,t){let n=this.shadowRoot;if(!n)return;let a=n.querySelector(`.conversations__details-dialog`),l=n.querySelector(`.conversations__details-dialog .conversations__input`),d=n.querySelector(`#conversations-details-group-id`),f=n.querySelector(`#conversations-group-id-copy-btn`),p=n.querySelector(`#conversations-details-tools`),m=n.querySelector(`#conversations-tool-input`),h=n.querySelector(`#conversations-add-tool-btn`),g=n.querySelector(`#conversations-available-tools`),_=n.querySelector(`#conversations-main-picker`),v=n.querySelector(`#conversations-main-provider-module-settings`),y=n.querySelector(`#conversations-agent-max-tokens`),b=n.querySelector(`#conversations-subagent-settings-container`),x=n.querySelector(`#conversations-subagent-mode`),S=n.querySelector(`#conversations-subagent-max-tokens`),C=n.querySelector(`#conversations-subagent-manual-container`),w=n.querySelector(`#conversations-subagent-picker`),T=n.querySelector(`#conversations-subagent-provider-module-settings`);if(d&&(d.value=t?.replace(`:`,`-`)||``),f&&d){let e=f.cloneNode(!0);f.replaceWith(e),e.addEventListener(`click`,async()=>{let t=d.value;if(t)try{await navigator.clipboard.writeText(t);let n=e.innerHTML;r(e,`<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>`),e.classList.add(`conversations__group-id-copy-btn--copied`),setTimeout(()=>{r(e,n),e.classList.remove(`conversations__group-id-copy-btn--copied`)},1500)}catch{d.select()}})}let E=n.querySelector(`#conversations-details-participants-container`),D=n.querySelector(`#conversations-details-participants-list`);if(E&&D)if(t&&t.startsWith(`peer:`)){E.style.display=`block`,D.replaceChildren();let e=o.orchestrator;if(e){let n=e.peerjs?.connectedPeersSignal?.get()||[],r=t.replace(`peer:`,``);if(n.includes(r)){let t=``;if(e.peerjsPeerAliases){for(let[n,i]of Object.entries(e.peerjsPeerAliases))if(i===r){t=n;break}}let n=t?`${t} (${r.substring(0,8)})`:r,i=document.createElement(`div`);i.className=`conversations__group-id-row`;let a=document.createElement(`input`);a.className=`conversations__input conversations__group-id-input`,a.type=`text`,a.readOnly=!0,a.value=n,a.style.marginBottom=`0`;let o=document.createElement(`button`);o.type=`button`,o.className=`conversations__group-id-copy-btn`,o.title=`Copy Peer ID`,o.setAttribute(`aria-label`,`Copy Peer ID to clipboard`),o.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>`,o.addEventListener(`click`,async()=>{try{await navigator.clipboard.writeText(r);let e=o.innerHTML;o.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>`,o.classList.add(`conversations__group-id-copy-btn--copied`),setTimeout(()=>{o.innerHTML=e,o.classList.remove(`conversations__group-id-copy-btn--copied`)},1500)}catch{a.value=r,a.select()}}),i.appendChild(a),i.appendChild(o),D.appendChild(i)}else{let e=document.createElement(`div`);e.style.fontSize=`0.875rem`,e.style.color=`var(--text-secondary)`,e.textContent=`Peer is not currently connected.`,D.appendChild(e)}}}else E.style.display=`none`;if(!a)return;a.showModal();let O=new Map;for(let e of u)O.set(e.name,e);for(let e of c.allTools)O.has(e.name)||O.set(e.name,e);let k=()=>{if(!g)return;let e=new Set(this._pendingDetailsToolTags||[]);g.replaceChildren();for(let t of O.values()){if(e.has(t.name))continue;let n=document.createElement(`option`);n.value=t.name,g.appendChild(n)}};this.db&&t&&s(this.db,t).then(({tools:e})=>{let t=!1;for(let n of e)O.has(n.name)||(O.set(n.name,n),t=!0);t&&k()}).catch(()=>{});let A=()=>{if(!p)return;p.replaceChildren();let e=this._pendingDetailsToolTags||[];for(let t of e){let e=O.get(t),n=document.createElement(`span`);n.className=`conversations__tool-chip`;let r=document.createElement(`span`);r.textContent=t,e?.description&&(r.title=e.description),n.appendChild(r);let i=document.createElement(`button`);i.type=`button`,i.className=`conversations__tool-chip-remove`,i.textContent=`×`,i.setAttribute(`aria-label`,`Remove tool ${t}`),i.addEventListener(`click`,()=>{this._pendingDetailsToolTags&&(this._pendingDetailsToolTags=this._pendingDetailsToolTags.filter(e=>e!==t),A())}),n.appendChild(i),p.appendChild(n)}if(k(),b&&x){let e=this._isSpawnSubagentEnabledInCurrentScope();b.style.display=e?`flex`:`none`,e||(this._pendingDetailsSubagentMode=`automatic`),C&&(C.style.display=this._pendingDetailsSubagentMode===`manual`&&e?`flex`:`none`),S&&(S.value=typeof this._pendingDetailsSubagentMaxTokens==`number`&&Number.isFinite(this._pendingDetailsSubagentMaxTokens)&&this._pendingDetailsSubagentMaxTokens>0?String(Math.floor(this._pendingDetailsSubagentMaxTokens)):``)}};if(h&&m&&(h.onclick=()=>{let e=m.value.trim();if(!e)return;let t=/^[a-z][a-z0-9_]{0,63}$/.test(e);if(!O.get(e)&&!t){m.value=``;return}this._pendingDetailsToolTags||=[],this._pendingDetailsToolTags.includes(e)||(this._pendingDetailsToolTags.push(e),A()),m.value=``},m.onkeydown=e=>{e.key===`Enter`&&(e.preventDefault(),h.click())}),A(),_&&v&&x&&b&&C&&w&&T){let e=i()||[];_.setLabels({providerLabel:`Pinned Provider`,defaultProviderLabel:`Default (Global)`,modelLabel:`Pinned Model`,defaultModelLabel:`Default Model`,customModelPlaceholder:`Custom model id`}),_.setModelLoader(e=>this._loadProviderModels(e)),_.setProviders(e),_.setValue({providerId:this._pendingDetailsPinnedProvider,modelId:this._pendingDetailsPinnedModel}),v.setProvider(this._pendingDetailsPinnedProvider),y&&(y.value=typeof this._pendingDetailsPinnedMaxTokens==`number`&&Number.isFinite(this._pendingDetailsPinnedMaxTokens)&&this._pendingDetailsPinnedMaxTokens>0?String(Math.floor(this._pendingDetailsPinnedMaxTokens)):``),v.setOverrides(this._pendingDetailsProviderRuntimeOverrides),w.setLabels({providerLabel:`Pinned Subagent Provider`,defaultProviderLabel:`Default (Parent Provider)`,modelLabel:`Pinned Subagent Model`,defaultModelLabel:`Default Model`,customModelPlaceholder:`Custom subagent model id`}),w.setModelLoader(e=>this._loadProviderModels(e)),w.setProviders(e),w.setValue({providerId:this._pendingDetailsSubagentProvider,modelId:this._pendingDetailsSubagentModel}),T.setProvider(this._pendingDetailsSubagentProvider),T.setOverrides(this._pendingDetailsProviderRuntimeOverrides),_.hasAttribute(`data-bound`)||(_.addEventListener(`provider-model-change`,e=>{let t=e.detail||{};this._pendingDetailsPinnedProvider=t.providerId||null,this._pendingDetailsPinnedModel=t.modelId||null,v.setProvider(this._pendingDetailsPinnedProvider),v.setOverrides(this._pendingDetailsProviderRuntimeOverrides)}),_.setAttribute(`data-bound`,`true`)),y?.hasAttribute(`data-bound`)||(y?.addEventListener(`input`,()=>{let e=Number(y.value);Number.isFinite(e)&&e>0?this._pendingDetailsPinnedMaxTokens=Math.floor(e):this._pendingDetailsPinnedMaxTokens=null}),y?.setAttribute(`data-bound`,`true`)),v.hasAttribute(`data-bound`)||(v.addEventListener(`provider-module-settings-change`,e=>{let t=e.detail||{},n=t.providerId,r=t.overrides;if(!n)return;let i=JSON.parse(JSON.stringify(this._pendingDetailsProviderRuntimeOverrides||{}));n===`llamafile`?i.llamafile=r.llamafile:n===`bedrock_proxy`&&(i.bedrock_proxy=r.bedrock_proxy),this._pendingDetailsProviderRuntimeOverrides=i,_.invalidateProviderModels(n),w.invalidateProviderModels(n)}),v.setAttribute(`data-bound`,`true`)),w.hasAttribute(`data-bound`)||(w.addEventListener(`provider-model-change`,e=>{let t=e.detail||{};this._pendingDetailsSubagentProvider=t.providerId||null,this._pendingDetailsSubagentModel=t.modelId||null,T.setProvider(this._pendingDetailsSubagentProvider),T.setOverrides(this._pendingDetailsProviderRuntimeOverrides)}),w.setAttribute(`data-bound`,`true`)),T.hasAttribute(`data-bound`)||(T.addEventListener(`provider-module-settings-change`,e=>{let t=e.detail||{},n=t.providerId,r=t.overrides;if(!n)return;let i=JSON.parse(JSON.stringify(this._pendingDetailsProviderRuntimeOverrides||{}));n===`llamafile`?i.llamafile=r.llamafile:n===`bedrock_proxy`&&(i.bedrock_proxy=r.bedrock_proxy),this._pendingDetailsProviderRuntimeOverrides=i,_.invalidateProviderModels(n),w.invalidateProviderModels(n)}),T.setAttribute(`data-bound`,`true`)),x.value=this._pendingDetailsSubagentMode;let t=this._isSpawnSubagentEnabledInCurrentScope();b.style.display=t?`flex`:`none`,v.style.display=this._pendingDetailsPinnedProvider?`flex`:`none`,C.style.display=t&&this._pendingDetailsSubagentMode===`manual`?`flex`:`none`,T.style.display=t&&this._pendingDetailsSubagentMode===`manual`&&this._pendingDetailsSubagentProvider?`flex`:`none`,x.onchange=()=>{this._pendingDetailsSubagentMode=x.value===`manual`?`manual`:`automatic`,C.style.display=this._pendingDetailsSubagentMode===`manual`&&this._isSpawnSubagentEnabledInCurrentScope()?`flex`:`none`,T.style.display=this._pendingDetailsSubagentMode===`manual`&&this._isSpawnSubagentEnabledInCurrentScope()&&this._pendingDetailsSubagentProvider?`flex`:`none`},S?.hasAttribute(`data-bound`)||(S?.addEventListener(`input`,()=>{let e=Number(S.value);Number.isFinite(e)&&e>0?this._pendingDetailsSubagentMaxTokens=Math.floor(e):this._pendingDetailsSubagentMaxTokens=null}),S?.setAttribute(`data-bound`,`true`))}l&&(l.value=e,l.select(),l.focus())}async handleClone(e){if(!this.db)return;let t=(o.groups||[]).find(t=>t.groupId===e);t&&(this._pendingCloneGroupId=e,this.openCloneDialog(t.name))}async handleCreate(){this.db&&this.openCreateDialog()}async handleDelete(e,t){this.db&&(this._pendingDeleteGroupId=e,this.openDeleteDialog(t))}async handleDetails(e,t){if(!this.db)return;this._pendingRenameGroupId=e,this._pendingRenameName=t;let n=(o.groups||[]).find(t=>t.groupId===e),r=n?.toolTags||[];this._pendingDetailsToolTags=[...r],this._pendingDetailsPinnedMaxTokens=typeof n?.pinnedMaxTokens==`number`&&Number.isFinite(n.pinnedMaxTokens)&&n.pinnedMaxTokens>0?Math.floor(n.pinnedMaxTokens):null,this._pendingDetailsPinnedProvider=n?.pinnedProvider||null,this._pendingDetailsPinnedModel=n?.pinnedModel||null,this._pendingDetailsProviderRuntimeOverrides=JSON.parse(JSON.stringify(n?.providerRuntimeOverrides||{})),this._pendingDetailsSubagentMode=n?.subagentModelSelectionMode===`manual`?`manual`:`automatic`,this._pendingDetailsSubagentMaxTokens=typeof n?.subagentMaxTokens==`number`&&Number.isFinite(n.subagentMaxTokens)&&n.subagentMaxTokens>0?Math.floor(n.subagentMaxTokens):null,this._pendingDetailsSubagentProvider=n?.subagentPinnedProvider||null,this._pendingDetailsSubagentModel=n?.subagentPinnedModel||null,this.openDetailsDialog(t,e)}async handleReorder(e,t,n){if(!this.db)return;if(n){await o.reorderConversations(this.db,n);return}let r=(o.groups||[]).map(e=>e.groupId),i=r.indexOf(e),a=r.indexOf(t);i<0||a<0||(r.splice(i,1),r.splice(a,0,e),await o.reorderConversations(this.db,r))}async handleSwitch(e){if(e===o.activeGroupId)return;let t=o.activePage,n=o.sidebarDefaultPage,r=t===`chat`||t===`tasks`||t===`files`?t:n===`tasks`||n===`files`?n:`chat`;document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:r,groupId:e},bubbles:!0,composed:!0}))}async render(){let e=this.shadowRoot.querySelector(`.conversation-list`);if(!e)return;let t=o.groups||[],n=o.activeGroupId,r=o.unreadGroupIds||new Set,i=this.getChannelRegistry();e.replaceChildren();for(let a=0;a<t.length;a++){let o=t[a],s=o.groupId===n,c=!s&&r.has(o.groupId),l=document.createElement(`li`);l.className=`conversation-item${s?` active`:``}${c?` unread`:``}`,l.setAttribute(`data-group-id`,o.groupId),l.setAttribute(`role`,`listitem`),l.setAttribute(`tabindex`,`0`),l.setAttribute(`aria-describedby`,`reorder-instructions`),l.setAttribute(`aria-label`,`${o.name}, position ${a+1} of ${t.length}`),this._keyboardGrabbedId===o.groupId&&(l.classList.add(`keyboard-grabbed`),l.setAttribute(`aria-grabbed`,`true`));let u=i?i.getBadge(o.groupId):``,d=t.length>1,f=document.createElement(`span`);if(f.className=`drag-handle`,f.setAttribute(`draggable`,`true`),f.setAttribute(`aria-hidden`,`true`),f.setAttribute(`title`,`Drag to reorder`),f.textContent=`⠿`,l.append(f),u){let e=document.createElement(`span`);e.className=`channel-badge`,e.textContent=u,l.append(e)}if(o.toolTags&&o.toolTags.length>0){let e=document.createElement(`span`);e.className=`tool-badge`,e.textContent=`🔧`,e.title=`Pinned Tools: ${o.toolTags.join(`, `)}`,l.append(e)}let p=document.createElement(`span`);p.className=`conversation-name`,p.textContent=o.name;let m=document.createElement(`span`);m.className=`conversation-actions`;let h=document.createElement(`button`);h.setAttribute(`data-action`,`clone`),h.setAttribute(`title`,`Clone`),h.setAttribute(`aria-label`,`Clone ${o.name}`),h.textContent=`📋`;let g=document.createElement(`button`);if(g.setAttribute(`data-action`,`details`),g.setAttribute(`title`,`Details`),g.setAttribute(`aria-label`,`Details for ${o.name}`),g.textContent=`⚙️`,m.append(h,g),d){let e=document.createElement(`button`);e.setAttribute(`data-action`,`delete`),e.setAttribute(`title`,`Delete`),e.setAttribute(`aria-label`,`Delete ${o.name}`),e.textContent=`🗑️`,m.append(e)}let _=document.createElement(`button`);_.className=`conversation-actions-toggle`,_.setAttribute(`title`,`More actions`),_.setAttribute(`aria-label`,`More actions for ${o.name}`),_.textContent=`⋮`,l.append(p,m,_),l.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-action]`)?.getAttribute(`data-action`);n===`clone`?this.handleClone(o.groupId):n===`details`?this.handleDetails(o.groupId,o.name):n===`delete`?this.handleDelete(o.groupId,o.name):t.closest(`.conversation-actions-toggle`)?l.classList.toggle(`show-actions`):t.closest(`.drag-handle`)||(this.handleSwitch(o.groupId),l.classList.remove(`show-actions`))}),l.addEventListener(`keydown`,e=>{this._handleKeyboard(e,o.groupId,o.name)}),f.addEventListener(`dragstart`,e=>{this._draggedGroupId=o.groupId,l.classList.add(`dragging`),e.dataTransfer?.setData(`text/plain`,o.groupId)}),f.addEventListener(`dragend`,()=>{l.classList.remove(`dragging`),this._draggedGroupId=null,e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`))}),f.addEventListener(`touchstart`,e=>{let t=e.touches[0];t&&(this._touchId=t.identifier,this._touchDraggedGroupId=o.groupId,l.classList.add(`dragging`),e.preventDefault())},{passive:!1}),l.addEventListener(`dragover`,e=>{e.preventDefault(),this._draggedGroupId&&this._draggedGroupId!==o.groupId&&l.classList.add(`drag-over`)}),l.addEventListener(`dragleave`,()=>{l.classList.remove(`drag-over`)}),l.addEventListener(`drop`,e=>{e.preventDefault(),l.classList.remove(`drag-over`),this._draggedGroupId&&this._draggedGroupId!==o.groupId&&this.handleReorder(this._draggedGroupId,o.groupId)}),e.appendChild(l)}this._bindTouchListEvents(e)}_announce(e){let t=this.shadowRoot?.querySelector(`#live-region`);t&&(t.textContent=``,requestAnimationFrame(()=>{t.textContent=e}))}_bindTouchListEvents(e){e._touchBound||(e._touchBound=!0,e.addEventListener(`touchmove`,t=>{if(this._touchDraggedGroupId===null)return;let n=this._findTouch(t);if(!n)return;t.preventDefault();let r=this._itemAtPoint(n.clientX,n.clientY);e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`)),r&&r.getAttribute(`data-group-id`)!==this._touchDraggedGroupId&&r.classList.add(`drag-over`),this._updateAutoScrollSpeed(n.clientY)},{passive:!1}),e.addEventListener(`touchend`,t=>{if(this._touchDraggedGroupId===null)return;let n=this._findChangedTouch(t);if(!n)return;let r=this._itemAtPoint(n.clientX,n.clientY)?.getAttribute(`data-group-id`);e.querySelectorAll(`.dragging`).forEach(e=>e.classList.remove(`dragging`)),e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`)),r&&r!==this._touchDraggedGroupId&&this.handleReorder(this._touchDraggedGroupId,r),this._stopAutoScroll(),this._touchDraggedGroupId=null,this._touchId=null}),e.addEventListener(`touchcancel`,()=>{e.querySelectorAll(`.dragging`).forEach(e=>e.classList.remove(`dragging`)),e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`)),this._stopAutoScroll(),this._touchDraggedGroupId=null,this._touchId=null}))}_findChangedTouch(e){for(let t=0;t<e.changedTouches.length;t++){let n=e.changedTouches[t];if(n.identifier===this._touchId)return n}}_findTouch(e){for(let t=0;t<e.touches.length;t++){let n=e.touches[t];if(n.identifier===this._touchId)return n}}_focusNext(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`li[tabindex="0"], button:not([disabled])`)),r=n.indexOf(e);r!==-1&&r<n.length-1&&n[r+1].focus()}_focusNextItem(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`.conversation-item`)),r=e.closest(`.conversation-item`),i=n.indexOf(r);i!==-1&&i<n.length-1&&n[i+1].focus()}_focusPrev(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`li[tabindex="0"], button:not([disabled])`)),r=n.indexOf(e);r>0&&n[r-1].focus()}_focusPrevItem(e){let t=this.shadowRoot;if(!t)return;let n=Array.from(t.querySelectorAll(`.conversation-item`)),r=e.closest(`.conversation-item`),i=n.indexOf(r);i>0&&n[i-1].focus()}_handleKeyboard(e,t,n){let r=o.groups||[],i=r.map(e=>e.groupId),a=i.length;if(this._keyboardGrabbedId===null){if(e.key===`ArrowDown`){e.preventDefault(),this._focusNextItem(e.target);return}if(e.key===`ArrowUp`){e.preventDefault(),this._focusPrevItem(e.target);return}if(e.key===`ArrowRight`){e.preventDefault(),this._focusNext(e.target);return}if(e.key===`ArrowLeft`){e.preventDefault(),this._focusPrev(e.target);return}if(e.key===` `||e.key===`Spacebar`||e.key===`Enter`){e.target.classList.contains(`conversation-item`)&&(e.preventDefault(),this.handleSwitch(t));return}if(e.key===`m`||e.key===`M`){e.preventDefault(),this._keyboardGrabbedId=t;let r=i.indexOf(t)+1;this._announce(`${n} grabbed. Current position ${r} of ${a}. Use Arrow Up and Down to move, Space or Enter to drop.`),this.render()}return}if(e.key===`Escape`){e.preventDefault(),this._announce(`Reorder cancelled. ${n} returned to original position.`),this._keyboardGrabbedId=null,this.render();return}if(e.key===` `||e.key===`Spacebar`||e.key===`Enter`){e.preventDefault();let t=i.indexOf(this._keyboardGrabbedId)+1,n=r.find(e=>e.groupId===this._keyboardGrabbedId)?.name||``;this._announce(`${n} dropped at position ${t} of ${a}. Reordering complete.`),this._keyboardGrabbedId=null,this.render();return}if(e.key===`ArrowUp`||e.key===`ArrowDown`){e.preventDefault();let t=i.indexOf(this._keyboardGrabbedId),n=e.key===`ArrowUp`?t-1:t+1;if(n<0||n>=a)return;i.splice(t,1),i.splice(n,0,this._keyboardGrabbedId),this._announce(`Moved to position ${n+1} of ${a}.`),this.handleReorder(this._keyboardGrabbedId,i[t],i)}}_initResizeHandle(){let e=this.shadowRoot.querySelector(`.resize-handle`);if(!e)return;let t=null,n=e=>{if(e.pointerId!==t)return;let n=this.parentElement?.getBoundingClientRect();if(!n)return;let r=this.getBoundingClientRect().bottom-e.clientY,i=n.height-60,a=Math.max(80,Math.min(i,r));this.style.flex=`none`,this.style.height=`${a}px`},r=()=>{t!==null&&(t=null,e.classList.remove(`active`),document.removeEventListener(`pointermove`,n),this._persistHeight())};e.addEventListener(`pointerdown`,r=>{let i=r;i.pointerType===`mouse`&&i.button!==0&&i.button!==-1||(i.preventDefault(),t=i.pointerId,e.classList.add(`active`),e.setPointerCapture(i.pointerId),document.addEventListener(`pointermove`,n))}),e.addEventListener(`pointerup`,e=>{e.pointerId===t&&r()}),e.addEventListener(`pointercancel`,r),e.addEventListener(`dblclick`,()=>{this.style.flex=``,this.style.height=``,this._persistHeight(0)})}_isSpawnSubagentEnabledInCurrentScope(){return Array.isArray(this._pendingDetailsToolTags)&&this._pendingDetailsToolTags.length>0?this._pendingDetailsToolTags.includes(`spawn_subagent`):c.enabledToolNames.has(`spawn_subagent`)}_itemAtPoint(e,t){let n=this.shadowRoot;return n&&n.elementFromPoint(e,t)?.closest?.(`.conversation-item`)||null}_setupDialogListeners(){let e=this.shadowRoot,t=e.querySelector(`.conversations__create-dialog`),n=e.querySelector(`.conversations__create-dialog .conversations__form`);e.querySelector(`.conversations__create-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{t?.close()}),n?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitCreateDialog()});let r=e.querySelector(`.conversations__details-dialog`),i=e.querySelector(`.conversations__details-dialog .conversations__form`);e.querySelector(`.conversations__details-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{r?.close(),this._pendingRenameGroupId=null,this._pendingRenameName=null,this._pendingDetailsToolTags=null,this._pendingDetailsPinnedProvider=null,this._pendingDetailsPinnedModel=null,this._pendingDetailsProviderRuntimeOverrides={},this._pendingDetailsSubagentMode=`automatic`,this._pendingDetailsSubagentMaxTokens=null,this._pendingDetailsSubagentProvider=null,this._pendingDetailsSubagentModel=null}),i?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitDetailsDialog()});let a=e.querySelector(`.conversations__delete-dialog`),o=e.querySelector(`.conversations__delete-dialog .conversations__form`);e.querySelector(`.conversations__delete-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{a?.close(),this._pendingDeleteGroupId=null}),o?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitDeleteDialog()});let s=e.querySelector(`.conversations__clone-dialog`),c=e.querySelector(`.conversations__clone-dialog .conversations__form`);e.querySelector(`.conversations__clone-dialog .conversations__cancel`)?.addEventListener(`click`,()=>{s?.close(),this._pendingCloneGroupId=null}),c?.addEventListener(`submit`,async e=>{e.preventDefault(),await this._submitCloneDialog()})}_startAutoScroll(){if(this._autoScrollActive)return;this._autoScrollActive=!0;let e=()=>{if(!this._autoScrollActive)return;let t=this.shadowRoot?.querySelector(`.conversation-list`);t&&this._autoScrollSpeed!==0&&(t.scrollTop+=this._autoScrollSpeed),requestAnimationFrame(e)};requestAnimationFrame(e)}_stopAutoScroll(){this._autoScrollActive=!1,this._autoScrollSpeed=0}_updateAutoScrollSpeed(e){let t=this.shadowRoot?.querySelector(`.conversation-list`);if(!t){this._autoScrollSpeed=0;return}let n=t.getBoundingClientRect(),r=e-n.top,i=n.bottom-e;r>=0&&r<50?(this._autoScrollSpeed=-((50-r)/50)*8,this._startAutoScroll()):i>=0&&i<50?(this._autoScrollSpeed=(50-i)/50*8,this._startAutoScroll()):this._autoScrollSpeed=0}async _loadProviderModels(e){if(Array.isArray(e.models)&&e.models.length>0)return e.models;if(!e.modelsUrl)return[];let t={...e.headers||{},...o.orchestrator?a(o.orchestrator,e.id,``,this._pendingDetailsProviderRuntimeOverrides):{}};if(this.db&&e.apiKeyHeader&&o.orchestrator){let n=await o.orchestrator.getApiKeyForSpecificProvider(this.db,e.id);if(n){let r=e.apiKeyHeaderFormat||`{key}`;t[e.apiKeyHeader]=r.replace(`{key}`,n)}}let n=await fetch(e.modelsUrl,{headers:t});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=[];if(Array.isArray(r))i=r;else if(r&&typeof r==`object`){let e=r;if(Array.isArray(e.models))i=e.models;else if(Array.isArray(e.data))i=e.data;else{for(let t of Object.values(e))if(Array.isArray(t)&&t.length>0){i=t;break}i.length===0&&(e.id||e.name)&&(i=[e])}}if(Array.isArray(e.models)&&e.models.length>0){let t=new Set(i.map(e=>typeof e==`string`?e:e.id||e.name||``).filter(Boolean));i=[...e.models.filter(e=>{let n=typeof e==`string`?e:e.id||e.name||``;return n&&!t.has(n)}),...i]}return i}async _persistHeight(t){if(!this.db)return;let n=t===void 0?this.getBoundingClientRect().height:t;await l(this.db,e.CONVERSATIONS_HEIGHT,n||0)}async _submitCloneDialog(){let e=this.shadowRoot;if(!e||!this.db||!this._pendingCloneGroupId)return;let t=e.querySelector(`.conversations__clone-dialog`);await o.cloneConversation(this.db,this._pendingCloneGroupId),t?.close(),this._pendingCloneGroupId=null}async _submitCreateDialog(){let e=this.shadowRoot;if(!e||!this.db)return;let t=e.querySelector(`.conversations__create-dialog .conversations__input`),n=e.querySelector(`.conversations__create-dialog`),r=t?.value.trim();r&&(await o.createConversation(this.db,r),n?.close())}async _submitDeleteDialog(){let e=this.shadowRoot;if(!e||!this.db||!this._pendingDeleteGroupId)return;let t=e.querySelector(`.conversations__delete-dialog`);await o.deleteConversation(this.db,this._pendingDeleteGroupId),t?.close(),this._pendingDeleteGroupId=null}async _submitDetailsDialog(){let e=this.shadowRoot;if(!e||!this.db||!this._pendingRenameGroupId||!this._pendingRenameName)return;let t=e.querySelector(`.conversations__details-dialog .conversations__input`),n=e.querySelector(`.conversations__details-dialog`),r=t?.value.trim();r&&r!==this._pendingRenameName&&await o.renameConversation(this.db,this._pendingRenameGroupId,r),this._pendingDetailsToolTags&&await o.updateConversationToolTags(this.db,this._pendingRenameGroupId,this._pendingDetailsToolTags),await o.updateConversationPinnedProvider(this.db,this._pendingRenameGroupId,this._pendingDetailsPinnedProvider||void 0,this._pendingDetailsPinnedModel||void 0,this._pendingDetailsPinnedMaxTokens||void 0),await o.updateConversationProviderRuntimeOverrides(this.db,this._pendingRenameGroupId,this._pendingDetailsProviderRuntimeOverrides),await o.updateConversationSubagentSettings(this.db,this._pendingRenameGroupId,this._pendingDetailsSubagentMode,this._pendingDetailsSubagentProvider||void 0,this._pendingDetailsSubagentModel||void 0,this._pendingDetailsSubagentMaxTokens||void 0),n?.close(),this._pendingRenameGroupId=null,this._pendingRenameName=null,this._pendingDetailsToolTags=null,this._pendingDetailsPinnedMaxTokens=null,this._pendingDetailsPinnedProvider=null,this._pendingDetailsPinnedModel=null,this._pendingDetailsProviderRuntimeOverrides={},this._pendingDetailsSubagentMode=`automatic`,this._pendingDetailsSubagentMaxTokens=null,this._pendingDetailsSubagentProvider=null,this._pendingDetailsSubagentModel=null}};customElements.define(`shadow-claw-conversations`,P);export{P as ShadowClawConversations};
|
package/dist/public/{shadow-claw-file-viewer-BR__1z9S.js → shadow-claw-file-viewer-BWsoW5QS.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./config-CrHchneq.js";import{a as t,n,o as r,s as i,u as a}from"./app-routes-Bs-riIvr.js";import{n as o}from"./txPromise-EBECky1b.js";import{t as s}from"./getConfig-D89uJgo5.js";import{d as c,f as l,i as u,l as d,n as f,r as p,s as m,u as h}from"./custom-element-security-
|
|
1
|
+
import{r as e}from"./config-CrHchneq.js";import{a as t,n,o as r,s as i,u as a}from"./app-routes-Bs-riIvr.js";import{n as o}from"./txPromise-EBECky1b.js";import{t as s}from"./getConfig-D89uJgo5.js";import{d as c,f as l,i as u,l as d,n as f,r as p,s as m,u as h}from"./custom-element-security-FU04Cq05.js";import{gn as g,sn as _,t as v}from"./orchestrator-DHjdLtqa.js";import{t as y}from"./tools-DvckJZG2.js";import{a as b,r as x}from"./toast-BXgUfbyh.js";import{t as S}from"./shadow-claw-element-DIrv3P6A.js";import{t as C}from"./effect-BJCrpFdp.js";import{t as w}from"./config-value-oBfKgLT4.js";import{n as T,r as E,t as D}from"./markdown-C3M4OW_A.js";import{t as O}from"./file-viewer-C-6Jc_tb.js";import"./shadow-claw-dialog-BrOwAOdk.js";import{a as k,c as A,i as j,n as M,o as N,r as P,s as F,t as I}from"./iframe-storage-proxy-B9Zt-vJ2.js";const L=new CSSStyleSheet;L.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
box-sizing: border-box;
|
|
@@ -571,7 +571,8 @@ pre {
|
|
|
571
571
|
</div>
|
|
572
572
|
</shadow-claw-dialog>
|
|
573
573
|
</template>
|
|
574
|
-
`,`text/html`),z=R.querySelector(`template`);let B=[];B=z?Array.from(z.content.children):Array.from(R.head.children).concat(Array.from(R.body.children));var V=B;const H=`shadow-claw-file-viewer`,U=`components/${H}/highlightjs-atom-one-dark.min.css`,W=`pre code.hljs, code.hljs, .hljs { font-family: var(--shadow-claw-font-mono) !important; }`,G={ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|ftp|tel|file|blob|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,ADD_TAGS:[`iframe`,`figure`,`figcaption`],CUSTOM_ELEMENT_HANDLING:{tagNameCheck:e=>m(e),attributeNameCheck:()=>!0,allowCustomizedBuiltInElements:!1},ADD_ATTR:[`allow`,`allowfullscreen`,`frameborder`,`scrolling`,`referrerpolicy`,`loading`]};function K(e,t){return!e||typeof e.transaction!=`function`||s(e,t).then(e=>w(e,!0)).catch(()=>!0)}var q=class extends S{static styles=L;static template=V;broadcastProxy=null;currentImageObjectUrls=[];currentObjectUrl=null;db=null;editorDraftContent=null;isEditorDirty=!1;isFileEditMode=!1;isFilePreviewMode=!1;isFullscreenMode=!1;lastOpenedFileName=``;previewFrameWindow=null;themeObserver=null;viewRenderToken=0;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.setupEffects(),this.bindEventListeners(),this.broadcastProxy=new N(()=>this.previewFrameWindow||this.shadowRoot?.querySelector(`.file-content-iframe`)?.contentWindow||null),window.addEventListener(`message`,this.handleIframeMessage),document.addEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver=new MutationObserver(e=>{for(let t of e)t.type===`attributes`&&t.attributeName===`class`&&this.syncIframeTheme()}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),this.db=await o();try{let e=await fetch(U).then(e=>e.text());this.applyHighlightStyles(e)}catch(e){console.warn(`Failed to load highlight.js styles:`,e)}}disconnectedCallback(){this.broadcastProxy?.dispose(),this.broadcastProxy=null,window.removeEventListener(`message`,this.handleIframeMessage),document.removeEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver&&=(this.themeObserver.disconnect(),null),this.revokeObjectUrl()}applyFullscreenMode(e){let t=e.querySelector(`.modal-content`);t instanceof HTMLElement&&t.classList.toggle(`modal-content--fullscreen`,this.isFullscreenMode);let n=e.querySelector(`.modal-fullscreen-btn`);n instanceof HTMLButtonElement&&(n.setAttribute(`aria-pressed`,String(this.isFullscreenMode)),n.setAttribute(`aria-label`,this.isFullscreenMode?`Exit fullscreen`:`Enter fullscreen`),n.title=this.isFullscreenMode?`Exit fullscreen`:`Fullscreen`)}applyHighlightStyles(e){let t=this.shadowRoot;if(!t)return;if(typeof CSSStyleSheet<`u`&&typeof CSSStyleSheet.prototype.replaceSync==`function`&&`adoptedStyleSheets`in t)try{let n=new CSSStyleSheet;n.replaceSync(e);let r=new CSSStyleSheet;r.replaceSync(W),t.adoptedStyleSheets=[...t.adoptedStyleSheets?Array.from(t.adoptedStyleSheets):[],n,r];return}catch{}let n=document.createElement(`style`);n.setAttribute(`data-shadow-claw-highlight-theme`,`true`),n.textContent=`${e}\n${W}`,t.appendChild(n)}bindEventListeners(){let e=this.shadowRoot;if(!e)return;e.querySelector(`.file-content`)?.addEventListener(`click`,e=>{this.handlePreviewLinkClick(e)});let t=e.querySelector(`.file-modal`);t?.addEventListener(`cancel`,e=>{e.preventDefault(),this.requestCloseViewer()}),t?.addEventListener(`close`,()=>{O.file&&O.closeFile()}),e.querySelector(`.modal-close-btn`)?.addEventListener(`click`,()=>void this.requestCloseViewer()),e.querySelector(`.modal-preview-btn`)?.addEventListener(`click`,async()=>{this.isFilePreviewMode=!this.isFilePreviewMode,this.isFileEditMode=!1,await this.updateView()}),e.querySelector(`.modal-fullscreen-btn`)?.addEventListener(`click`,()=>{t&&this.toggleFullscreenMode(t)}),e.querySelector(`.modal-share-btn`)?.addEventListener(`click`,async()=>{await this.handleShareFile()}),e.querySelector(`.modal-edit-btn`)?.addEventListener(`click`,async()=>{this.isFileEditMode=!this.isFileEditMode,this.isFileEditMode&&(this.isFilePreviewMode=!1),await this.updateView()}),e.querySelector(`.modal-save-btn`)?.addEventListener(`click`,()=>this.handleSave()),e.querySelector(`.modal-cancel-btn`)?.addEventListener(`click`,async()=>{this.isEditorDirty=!1,this.editorDraftContent=null,this.isFileEditMode=!1,await this.updateView()});let n=e.querySelector(`.file-editor`);if(n?.addEventListener(`input`,()=>{n instanceof HTMLTextAreaElement&&(this.editorDraftContent=n.value,this.updateEditorHighlight(n.value)),this.isEditorDirty=!0,this.updateView()}),n instanceof HTMLTextAreaElement){let t=()=>{let t=e.querySelector(`.file-editor-overlay`);t&&(t.scrollTop=n.scrollTop,t.scrollLeft=n.scrollLeft)};n.addEventListener(`scroll`,t),n.addEventListener(`focus`,t),n.addEventListener(`click`,t),n.addEventListener(`keyup`,t),n.addEventListener(`mouseup`,t),e.querySelector(`.modal-body`)?.addEventListener(`scroll`,t)}}buildWebShareFile(e){if(e?.nativeFile instanceof File)return e.nativeFile;let t=e?.binaryContent;if(!(t instanceof Uint8Array)||t.length===0)return null;let n=new Uint8Array(t.byteLength);return n.set(t),new File([n],e.name||`shared-file`,{type:e?.mimeType||`application/octet-stream`})}canShareCurrentFile(e){if(!e||!this.isWebShareAvailable())return!1;if(e.kind===`text`)return!0;let t=this.buildWebShareFile(e);if(!t||typeof navigator.canShare!=`function`)return!1;try{return navigator.canShare({files:[t]})}catch{return!1}}canUseNativeFullscreen(e){return document.fullscreenEnabled===!0&&(typeof e.requestFullscreen==`function`||typeof e.webkitRequestFullscreen==`function`)&&(typeof document.exitFullscreen==`function`||typeof document.webkitExitFullscreen==`function`)}getCurrentFullscreenElement(){return document.fullscreenElement||document.webkitFullscreenElement||null}getFullscreenTarget(e){let t=e.querySelector(`.modal-content`);return t instanceof HTMLElement?t:null}getIframeBridgeScriptUrl(){return n(`/assets/file-viewer-preview-bridge.js`)}getIframeSandboxPermissions(e){return/\.svg$/i.test(e)?`allow-modals allow-popups allow-popups-to-escape-sandbox`:u()}getLanguageFromFilename(e){return{bash:`bash`,cjs:`javascript`,css:`css`,html:`xml`,java:`java`,javascript:`javascript`,js:`javascript`,json:`json`,jsx:`jsx`,markdown:`markdown`,md:`markdown`,mjs:`javascript`,php:`php`,python:`python`,py:`python`,ruby:`ruby`,rb:`ruby`,rust:`rust`,rs:`rust`,sh:`bash`,sql:`sql`,svg:`xml`,ts:`typescript`,tsx:`tsx`,xml:`xml`,yaml:`yaml`,yml:`yaml`}[e.toLowerCase().split(`.`).pop()||``]||``}getPreviewSourceFile(e,t){return this.getWorkingSourceFile(e,t)}getWorkingSourceFile(e,t){if(!this.isEditorDirty||e?.kind!==`text`)return e;if(typeof this.editorDraftContent==`string`)return{...e,content:this.editorDraftContent};let n=t.querySelector(`.file-editor`);return n instanceof HTMLTextAreaElement?{...e,content:n.value}:e}getWorkspaceRouteTarget(e,t={}){let{allowCrossGroup:n=!1}=t,i=e.split(/[?#]/,1)[0].trim();if(!i)return null;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(i)||i.startsWith(`//`)){let e;try{e=new URL(i,window.location.href)}catch{return null}if(e.origin!==window.location.origin)return null;i=e.pathname}let a=i.replace(/^(?:\.\/)+/u,``),o=[];if(a.startsWith(`files/`)&&o.push(`/${a}`),i.startsWith(`/`)){let e=i.lastIndexOf(`/files/`);e>0&&o.push(i.slice(e)),o.push(i)}for(let e of o){let t=r(e);if(!t)continue;let i=this.resolveRouteGroupId(t.groupId);if(i&&!(!n&&i!==b.activeGroupId))return{groupId:i,path:t.path}}return null}handleAnchorNavigation(e){let t=this.shadowRoot;if(!t)return!1;let n=t.querySelector(`.file-content`);if(!n)return!1;n.querySelectorAll(`.code-line.highlighted`).forEach(e=>{e.classList.remove(`highlighted`)});let r=e.match(/^#?L(\d+)(?:-L?(\d+))?$/i);if(r){let e=parseInt(r[1],10),t=r[2]?parseInt(r[2],10):e,i=null;return n.querySelectorAll(`.code-line`).forEach(n=>{let r=parseInt(n.getAttribute(`data-line`)||`0`,10);r>=e&&r<=t&&(n.classList.add(`highlighted`),i||=n)}),i?(i.scrollIntoView({behavior:`smooth`,block:`center`}),!0):!1}else{let t=e.replace(/^#/,``),r=n.querySelector(`[id="${t}"]`)||n.querySelector(`a[name="${t}"]`);return r?(r.scrollIntoView({behavior:`smooth`,block:`start`}),!0):!1}}handleFullscreenChange=()=>{let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);this.isFullscreenMode=this.isTargetInFullscreen(n),this.applyFullscreenMode(t)};handleIframeMessage=e=>{if(!e.data||typeof e.data!=`object`)return;let r=e.data;if(r.type===`shadow-claw-broadcast-result`&&typeof r.channel==`string`){this.broadcastProxy?.handleResultFromIframe(e.source,r.channel,r.payload);return}if(r.type===`shadow-claw-iframe-resize`&&typeof r.height==`number`){let t=this.shadowRoot?.querySelector(`.file-content-iframe`);t instanceof HTMLIFrameElement&&(!this.previewFrameWindow||e.source===this.previewFrameWindow||t.contentWindow&&e.source===t.contentWindow)&&(this.previewFrameWindow=t.contentWindow,t.style.setProperty(`height`,`${r.height}px`,`important`));return}if(r.type===`shadow-claw-storage-proxy`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let t=r;this.handleStorageProxyRequest(e.source,String(t.requestId||``),String(t.method||``),t.args&&typeof t.args==`object`?t.args:{});return}if(!this.db||r.type!==`shadow-claw-file-viewer-link`||typeof r.href!=`string`||this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let o=O.file,s=o?.path||o?.name||``,c=n(t(b.activeGroupId,s)),l=a(r.href,c,window.location.origin);if(!l)return;if(l.searchParams.has(`gameSave`)){this.reloadPreviewWithSearchParams(l.search);return}if(!(l.origin===window.location.origin&&(i(l.pathname)||this.resolveWorkspaceLinkPath(r.href,s)))){window.open(l.href,`_blank`,`noopener,noreferrer`);return}let u=`${l.pathname}${l.search}${l.hash}`,d=window.navigation;if(d&&typeof d.navigate==`function`){d.navigate(u);return}window.history.pushState({},``,u),window.dispatchEvent(new PopStateEvent(`popstate`))};hasUnsavedChanges(){return this.isEditorDirty}isIframePreviewFile(e){return/\.(?:html?|svg)$/i.test(e)}isMarkdownLikeFile(e){return/(?:^readme$|\.mdx?$|\.markdown$|\.mdown$)/i.test(e)}isNodeInComposedTree(e,t){let n=e;for(;n;){if(n===t)return!0;if(n.parentNode){n=n.parentNode;continue}let e=n.getRootNode?.();if(e instanceof ShadowRoot&&e.host){n=e.host;continue}n=null}return!1}isRenderTokenCurrent(e){return this.viewRenderToken===e}isTargetInFullscreen(e){if(!e)return!1;let t=this.getCurrentFullscreenElement();return t?t===e||this.isNodeInComposedTree(e,t)||this.isNodeInComposedTree(t,e):!1}isWebShareAvailable(){return typeof navigator<`u`&&typeof navigator.share==`function`}mimeTypeForImageExt(e){return{apng:`image/apng`,avif:`image/avif`,gif:`image/gif`,jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,webp:`image/webp`}[e]??`image/jpeg`}renderBinaryPreview(e,t){let n=t.mimeType||`application/octet-stream`;if(t.nativeFile instanceof File)this.currentObjectUrl=URL.createObjectURL(t.nativeFile);else{let r=t.binaryContent;if(!(r instanceof Uint8Array)||r.length===0){e.classList.remove(`file-content--raw`,`file-content--iframe`),e.classList.add(`file-content--preview`),e.textContent=`Binary content unavailable.`;return}let i=new Uint8Array(r.byteLength);i.set(r);let a=new Blob([i],{type:n});this.currentObjectUrl=URL.createObjectURL(a)}if(e.classList.remove(`file-content--raw`,`file-content--preview`),e.classList.add(`file-content--iframe`),n.startsWith(`image/`)){let n=document.createElement(`img`);n.className=`file-content-iframe`,n.alt=`Preview: ${t.name}`,n.src=this.currentObjectUrl,n.style.objectFit=`contain`,e.replaceChildren(n);return}if(n.startsWith(`video/`)){let t=document.createElement(`video`);t.className=`file-content-iframe`,t.controls=!0,t.src=this.currentObjectUrl,t.style.backgroundColor=`black`,e.replaceChildren(t);return}if(n.startsWith(`audio/`)){let n=document.createElement(`div`);n.className=`file-content file-content--preview`,n.style.padding=`1rem`;let r=document.createElement(`p`);r.textContent=t.name;let i=document.createElement(`audio`);i.controls=!0,i.src=this.currentObjectUrl,i.style.width=`100%`,n.replaceChildren(r,i),e.replaceChildren(n),e.classList.remove(`file-content--iframe`);return}let r=document.createElement(`iframe`);r.className=`file-content-iframe`,r.setAttribute(`title`,`Preview: ${t.name}`),r.setAttribute(`referrerpolicy`,`no-referrer`),r.src=this.currentObjectUrl,e.replaceChildren(r)}resetContent(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);n&&this.isTargetInFullscreen(n)&&this.exitNativeFullscreen().catch(()=>{}),this.isFullscreenMode=!1,this.applyFullscreenMode(t);let r=t.querySelector(`.file-content`),i=t.querySelector(`.modal-preview-btn`);i instanceof HTMLButtonElement&&(i.setAttribute(`aria-pressed`,`false`),i.setAttribute(`aria-label`,`Switch to preview mode`));let a=t.querySelector(`.modal-edit-btn`);a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,`false`),a.setAttribute(`aria-label`,`Edit file`),a.classList.remove(`hidden`));let o=t.querySelector(`.modal-close-btn`);o instanceof HTMLButtonElement&&(o.disabled=!1,o.setAttribute(`aria-label`,`Close file viewer`),o.title=`Close`),t.querySelector(`.modal-save-btn`)?.classList.add(`hidden`),t.querySelector(`.file-editor-container`)?.classList.remove(`active`),t.querySelector(`.modal-body`)?.classList.remove(`modal-body--editing`);let s=t.querySelector(`.file-editor`);s instanceof HTMLTextAreaElement&&(s.value=``,s.removeAttribute(`language`));let c=t.querySelector(`.file-editor-overlay code`);c&&(c.innerHTML=``,c.className=`hljs`),this.isFileEditMode=!1,this.editorDraftContent=null,r instanceof HTMLElement&&(this.revokeObjectUrl(),r.classList.remove(`hidden`),r.classList.add(`file-content--raw`),r.classList.remove(`file-content--preview`,`file-content--iframe`),r.textContent=``)}resolveRouteGroupId(e){let t=b.activeGroupId;if(e===t||this.routeGroupMatches(e,t))return t;let n=Array.isArray(b.groups)?b.groups:[],r=n.find(t=>t.groupId===e);if(r)return r.groupId;let i=n.find(t=>this.routeGroupMatches(e,t.groupId));return i?i.groupId:e||null}resolveWorkspaceLinkPath(e,t=``){let n=e.trim();if(!n||n.startsWith(`#`))return null;let r=n,i=/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(n);if(i||n.startsWith(`//`)){let e;try{e=new URL(n,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;r=`${e.pathname}${e.search}${e.hash}`}let a=this.getWorkspaceRouteTarget(r);if(a)return a.path;let o=r.split(/[?#]/,1)[0].replace(/\\/g,`/`),s=o.startsWith(`/`);if(i||s||(o=o.replace(/^\/+/,``),!o))return null;let c=[];if(!s){let e=t.replace(/\\/g,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);e.pop(),c.push(...e)}for(let e of o.split(`/`))if(!(!e||e===`.`)){if(e===`..`){if(c.length===0)return null;c.pop();continue}c.push(e)}return c.length>0?c.join(`/`):null}revokeObjectUrl(){this.previewFrameWindow=null,this.currentObjectUrl&&=(URL.revokeObjectURL(this.currentObjectUrl),null);for(let e of this.currentImageObjectUrls)URL.revokeObjectURL(e);this.currentImageObjectUrls=[]}rewriteWorkspacePreviewHtml(e,r){if(!e)return e;let o=n(t(b.activeGroupId,r)),s=new DOMParser().parseFromString(e,`text/html`),c=(e,t)=>{let n=Array.from(s.querySelectorAll(e));for(let e of n){let n=(e.getAttribute(t)||``).trim();if(!n||n.startsWith(`#`)||n.startsWith(`javascript:`))continue;let s=a(n,o,window.location.origin);!s||s.origin!==window.location.origin||t===`href`&&!(i(s.pathname)||this.resolveWorkspaceLinkPath(n,r))||e.setAttribute(t,`${s.pathname}${s.search}${s.hash}`)}};return c(`a[href]`,`href`),c(`img[src]`,`src`),c(`audio[src]`,`src`),c(`video[src]`,`src`),c(`source[src]`,`src`),s.body.innerHTML}routeGroupMatches(e,t){if(e===t||e===`main`&&t===`br:main`||e===`br:main`&&t===`main`)return!0;if(!e.includes(`:`)&&!t.includes(`:`))return!1;let n=e=>e.trim().replace(/:/g,`-`);return n(e)===n(t)}setupEffects(){C(()=>{let e=v.declarativeTools;this.broadcastProxy&&e.length>0&&this.broadcastProxy.registerChannelsFromTools(e)}),C(()=>{let e=O.file,t=++this.viewRenderToken,n=this.shadowRoot;if(!n)return;let r=n.querySelector(`shadow-claw-dialog`);r&&typeof r.ensureDialog==`function`&&r.ensureDialog();let i=n.querySelector(`.file-modal`);if(e){r&&typeof r.showModal==`function`&&!r.open?r.showModal():i instanceof HTMLDialogElement&&!i.open&&i.showModal();let a=n.querySelector(`.modal-title`);a instanceof HTMLElement&&(a.textContent=`File: ${e.name}`),this.lastOpenedFileName!==e.name&&(this.lastOpenedFileName=e.name,this.isFilePreviewMode=this.shouldAutoPreview(e),this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null),this.updateView(t)}else r&&typeof r.close==`function`&&r.open?r.close():i instanceof HTMLDialogElement&&i.open&&i.close(),this.lastOpenedFileName=``,this.isFilePreviewMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,this.resetContent()})}shouldAutoPreview(e){return!e||typeof e!=`object`?!1:e.kind===`pdf`||e.kind===`binary`?!0:e.kind===`text`?this.isIframePreviewFile(e.name)||this.isMarkdownLikeFile(e.name):!1}stripHtmlFrontmatter(e){if(typeof e!=`string`||!e.trimStart().startsWith(`---`))return e;let t=T(e);return Object.keys(t.data||{}).length===0?e:t.content||``}toPreviewMarkdown(e){return this.isMarkdownLikeFile(e.name)?e.content:"```"+this.getLanguageFromFilename(e.name)+`
|
|
574
|
+
`,`text/html`),z=R.querySelector(`template`);let B=[];B=z?Array.from(z.content.children):Array.from(R.head.children).concat(Array.from(R.body.children));var V=B;const H=`shadow-claw-file-viewer`,U=`components/${H}/highlightjs-atom-one-dark.min.css`,W=`pre code.hljs, code.hljs, .hljs { font-family: var(--shadow-claw-font-mono) !important; }`,G={ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|ftp|tel|file|blob|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,ADD_TAGS:[`iframe`,`figure`,`figcaption`],CUSTOM_ELEMENT_HANDLING:{tagNameCheck:e=>m(e),attributeNameCheck:()=>!0,allowCustomizedBuiltInElements:!1},ADD_ATTR:[`allow`,`allowfullscreen`,`frameborder`,`scrolling`,`referrerpolicy`,`loading`]};function K(e,t){return!e||typeof e.transaction!=`function`||s(e,t).then(e=>w(e,!0)).catch(()=>!0)}var q=class extends S{static styles=L;static template=V;broadcastProxy=null;currentImageObjectUrls=[];currentObjectUrl=null;db=null;editorDraftContent=null;isEditorDirty=!1;isFileEditMode=!1;isFilePreviewMode=!1;isFullscreenMode=!1;lastOpenedFileName=``;previewFrameWindow=null;themeObserver=null;viewRenderToken=0;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.setupEffects(),this.bindEventListeners(),this.broadcastProxy=new N(()=>this.previewFrameWindow||this.shadowRoot?.querySelector(`.file-content-iframe`)?.contentWindow||null),window.addEventListener(`message`,this.handleIframeMessage),document.addEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver=new MutationObserver(e=>{for(let t of e)t.type===`attributes`&&t.attributeName===`class`&&this.syncIframeTheme()}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),this.db=await o();try{let e=await fetch(U).then(e=>e.text());this.applyHighlightStyles(e)}catch(e){console.warn(`Failed to load highlight.js styles:`,e)}}disconnectedCallback(){this.broadcastProxy?.dispose(),this.broadcastProxy=null,window.removeEventListener(`message`,this.handleIframeMessage),document.removeEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver&&=(this.themeObserver.disconnect(),null),this.revokeObjectUrl()}applyFullscreenMode(e){let t=e.querySelector(`.modal-content`);t instanceof HTMLElement&&t.classList.toggle(`modal-content--fullscreen`,this.isFullscreenMode);let n=e.querySelector(`.modal-fullscreen-btn`);n instanceof HTMLButtonElement&&(n.setAttribute(`aria-pressed`,String(this.isFullscreenMode)),n.setAttribute(`aria-label`,this.isFullscreenMode?`Exit fullscreen`:`Enter fullscreen`),n.title=this.isFullscreenMode?`Exit fullscreen`:`Fullscreen`)}applyHighlightStyles(e){let t=this.shadowRoot;if(!t)return;if(typeof CSSStyleSheet<`u`&&typeof CSSStyleSheet.prototype.replaceSync==`function`&&`adoptedStyleSheets`in t)try{let n=new CSSStyleSheet;n.replaceSync(e);let r=new CSSStyleSheet;r.replaceSync(W),t.adoptedStyleSheets=[...t.adoptedStyleSheets?Array.from(t.adoptedStyleSheets):[],n,r];return}catch{}let n=document.createElement(`style`);n.setAttribute(`data-shadow-claw-highlight-theme`,`true`),n.textContent=`${e}\n${W}`,t.appendChild(n)}bindEventListeners(){let e=this.shadowRoot;if(!e)return;e.querySelector(`.file-content`)?.addEventListener(`click`,e=>{this.handlePreviewLinkClick(e)});let t=e.querySelector(`.file-modal`);t?.addEventListener(`cancel`,e=>{e.preventDefault(),this.requestCloseViewer()}),t?.addEventListener(`close`,()=>{O.file&&O.closeFile()}),e.querySelector(`.modal-close-btn`)?.addEventListener(`click`,()=>void this.requestCloseViewer()),e.querySelector(`.modal-preview-btn`)?.addEventListener(`click`,async()=>{this.isFilePreviewMode=!this.isFilePreviewMode,this.isFileEditMode=!1,await this.updateView()}),e.querySelector(`.modal-fullscreen-btn`)?.addEventListener(`click`,()=>{t&&this.toggleFullscreenMode(t)}),e.querySelector(`.modal-share-btn`)?.addEventListener(`click`,async()=>{await this.handleShareFile()}),e.querySelector(`.modal-edit-btn`)?.addEventListener(`click`,async()=>{this.isFileEditMode=!this.isFileEditMode,this.isFileEditMode&&(this.isFilePreviewMode=!1),await this.updateView()}),e.querySelector(`.modal-save-btn`)?.addEventListener(`click`,()=>this.handleSave()),e.querySelector(`.modal-cancel-btn`)?.addEventListener(`click`,async()=>{this.isEditorDirty=!1,this.editorDraftContent=null,this.isFileEditMode=!1,await this.updateView()});let n=e.querySelector(`.file-editor`);if(n?.addEventListener(`input`,()=>{n instanceof HTMLTextAreaElement&&(this.editorDraftContent=n.value,this.updateEditorHighlight(n.value)),this.isEditorDirty=!0,this.updateView()}),n instanceof HTMLTextAreaElement){let t=()=>{let t=e.querySelector(`.file-editor-overlay`);t&&(t.scrollTop=n.scrollTop,t.scrollLeft=n.scrollLeft)};n.addEventListener(`scroll`,t),n.addEventListener(`focus`,t),n.addEventListener(`click`,t),n.addEventListener(`keyup`,t),n.addEventListener(`mouseup`,t),e.querySelector(`.modal-body`)?.addEventListener(`scroll`,t)}}buildWebShareFile(e){if(e?.nativeFile instanceof File)return e.nativeFile;let t=e?.binaryContent;if(!(t instanceof Uint8Array)||t.length===0)return null;let n=new Uint8Array(t.byteLength);return n.set(t),new File([n],e.name||`shared-file`,{type:e?.mimeType||`application/octet-stream`})}canShareCurrentFile(e){if(!e||!this.isWebShareAvailable())return!1;if(e.kind===`text`)return!0;let t=this.buildWebShareFile(e);if(!t||typeof navigator.canShare!=`function`)return!1;try{return navigator.canShare({files:[t]})}catch{return!1}}canUseNativeFullscreen(e){return document.fullscreenEnabled===!0&&(typeof e.requestFullscreen==`function`||typeof e.webkitRequestFullscreen==`function`)&&(typeof document.exitFullscreen==`function`||typeof document.webkitExitFullscreen==`function`)}getCurrentFullscreenElement(){return document.fullscreenElement||document.webkitFullscreenElement||null}getFullscreenTarget(e){let t=e.querySelector(`.modal-content`);return t instanceof HTMLElement?t:null}getIframeBridgeScriptUrl(){return n(`/assets/file-viewer-preview-bridge.js`)}getIframeSandboxPermissions(e){return/\.svg$/i.test(e)?`allow-modals allow-popups allow-popups-to-escape-sandbox`:u()}getLanguageFromFilename(e){return{bash:`bash`,cjs:`javascript`,css:`css`,html:`xml`,java:`java`,javascript:`javascript`,js:`javascript`,json:`json`,jsx:`jsx`,markdown:`markdown`,md:`markdown`,mjs:`javascript`,php:`php`,python:`python`,py:`python`,ruby:`ruby`,rb:`ruby`,rust:`rust`,rs:`rust`,sh:`bash`,sql:`sql`,svg:`xml`,ts:`typescript`,tsx:`tsx`,xml:`xml`,yaml:`yaml`,yml:`yaml`}[e.toLowerCase().split(`.`).pop()||``]||``}getPreviewSourceFile(e,t){return this.getWorkingSourceFile(e,t)}getWorkingSourceFile(e,t){if(!this.isEditorDirty||e?.kind!==`text`)return e;if(typeof this.editorDraftContent==`string`)return{...e,content:this.editorDraftContent};let n=t.querySelector(`.file-editor`);return n instanceof HTMLTextAreaElement?{...e,content:n.value}:e}getWorkspaceRouteTarget(e,t={}){let{allowCrossGroup:n=!1}=t,i=e.split(/[?#]/,1)[0].trim();if(!i)return null;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(i)||i.startsWith(`//`)){let e;try{e=new URL(i,window.location.href)}catch{return null}if(e.origin!==window.location.origin)return null;i=e.pathname}let a=i.replace(/^(?:\.\/)+/u,``),o=[];if(a.startsWith(`files/`)&&o.push(`/${a}`),i.startsWith(`/`)){let e=i.lastIndexOf(`/files/`);e>0&&o.push(i.slice(e)),o.push(i)}for(let e of o){let t=r(e);if(!t)continue;let i=this.resolveRouteGroupId(t.groupId);if(i&&!(!n&&i!==v.activeGroupId))return{groupId:i,path:t.path}}return null}handleAnchorNavigation(e){let t=this.shadowRoot;if(!t)return!1;let n=t.querySelector(`.file-content`);if(!n)return!1;n.querySelectorAll(`.code-line.highlighted`).forEach(e=>{e.classList.remove(`highlighted`)});let r=e.match(/^#?L(\d+)(?:-L?(\d+))?$/i);if(r){let e=parseInt(r[1],10),t=r[2]?parseInt(r[2],10):e,i=null;return n.querySelectorAll(`.code-line`).forEach(n=>{let r=parseInt(n.getAttribute(`data-line`)||`0`,10);r>=e&&r<=t&&(n.classList.add(`highlighted`),i||=n)}),i?(i.scrollIntoView({behavior:`smooth`,block:`center`}),!0):!1}else{let t=e.replace(/^#/,``),r=n.querySelector(`[id="${t}"]`)||n.querySelector(`a[name="${t}"]`);return r?(r.scrollIntoView({behavior:`smooth`,block:`start`}),!0):!1}}handleFullscreenChange=()=>{let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);this.isFullscreenMode=this.isTargetInFullscreen(n),this.applyFullscreenMode(t)};handleIframeMessage=e=>{if(!e.data||typeof e.data!=`object`)return;let r=e.data;if(r.type===`shadow-claw-broadcast-result`&&typeof r.channel==`string`){this.broadcastProxy?.handleResultFromIframe(e.source,r.channel,r.payload);return}if(r.type===`shadow-claw-iframe-resize`&&typeof r.height==`number`){let t=this.shadowRoot?.querySelector(`.file-content-iframe`);t instanceof HTMLIFrameElement&&(!this.previewFrameWindow||e.source===this.previewFrameWindow||t.contentWindow&&e.source===t.contentWindow)&&(this.previewFrameWindow=t.contentWindow,t.style.setProperty(`height`,`${r.height}px`,`important`));return}if(r.type===`shadow-claw-storage-proxy`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let t=r;this.handleStorageProxyRequest(e.source,String(t.requestId||``),String(t.method||``),t.args&&typeof t.args==`object`?t.args:{});return}if(!this.db||r.type!==`shadow-claw-file-viewer-link`||typeof r.href!=`string`||this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let o=O.file,s=o?.path||o?.name||``,c=n(t(v.activeGroupId,s)),l=a(r.href,c,window.location.origin);if(!l)return;if(l.searchParams.has(`gameSave`)){this.reloadPreviewWithSearchParams(l.search);return}if(!(l.origin===window.location.origin&&(i(l.pathname)||this.resolveWorkspaceLinkPath(r.href,s)))){window.open(l.href,`_blank`,`noopener,noreferrer`);return}let u=`${l.pathname}${l.search}${l.hash}`,d=window.navigation;if(d&&typeof d.navigate==`function`){d.navigate(u);return}window.history.pushState({},``,u),window.dispatchEvent(new PopStateEvent(`popstate`))};hasUnsavedChanges(){return this.isEditorDirty}isIframePreviewFile(e){return/\.(?:html?|svg)$/i.test(e)}isMarkdownLikeFile(e){return/(?:^readme$|\.mdx?$|\.markdown$|\.mdown$)/i.test(e)}isNodeInComposedTree(e,t){let n=e;for(;n;){if(n===t)return!0;if(n.parentNode){n=n.parentNode;continue}let e=n.getRootNode?.();if(e instanceof ShadowRoot&&e.host){n=e.host;continue}n=null}return!1}isRenderTokenCurrent(e){return this.viewRenderToken===e}isTargetInFullscreen(e){if(!e)return!1;let t=this.getCurrentFullscreenElement();return t?t===e||this.isNodeInComposedTree(e,t)||this.isNodeInComposedTree(t,e):!1}isWebShareAvailable(){return typeof navigator<`u`&&typeof navigator.share==`function`}mimeTypeForImageExt(e){return{apng:`image/apng`,avif:`image/avif`,gif:`image/gif`,jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,webp:`image/webp`}[e]??`image/jpeg`}renderBinaryPreview(e,t){let n=t.mimeType||`application/octet-stream`;if(t.nativeFile instanceof File)this.currentObjectUrl=URL.createObjectURL(t.nativeFile);else{let r=t.binaryContent;if(!(r instanceof Uint8Array)||r.length===0){e.classList.remove(`file-content--raw`,`file-content--iframe`),e.classList.add(`file-content--preview`),e.textContent=`Binary content unavailable.`;return}let i=new Uint8Array(r.byteLength);i.set(r);let a=new Blob([i],{type:n});this.currentObjectUrl=URL.createObjectURL(a)}if(e.classList.remove(`file-content--raw`,`file-content--preview`),e.classList.add(`file-content--iframe`),n.startsWith(`image/`)){let n=document.createElement(`img`);n.className=`file-content-iframe`,n.alt=`Preview: ${t.name}`,n.src=this.currentObjectUrl,n.style.objectFit=`contain`,e.replaceChildren(n);return}if(n.startsWith(`video/`)){let t=document.createElement(`video`);t.className=`file-content-iframe`,t.controls=!0,t.src=this.currentObjectUrl,t.style.backgroundColor=`black`,e.replaceChildren(t);return}if(n.startsWith(`audio/`)){let n=document.createElement(`div`);n.className=`file-content file-content--preview`,n.style.padding=`1rem`;let r=document.createElement(`p`);r.textContent=t.name;let i=document.createElement(`audio`);i.controls=!0,i.src=this.currentObjectUrl,i.style.width=`100%`,n.replaceChildren(r,i),e.replaceChildren(n),e.classList.remove(`file-content--iframe`);return}let r=document.createElement(`iframe`);r.className=`file-content-iframe`,r.setAttribute(`title`,`Preview: ${t.name}`),r.setAttribute(`referrerpolicy`,`no-referrer`),r.src=this.currentObjectUrl,e.replaceChildren(r)}resetContent(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);n&&this.isTargetInFullscreen(n)&&this.exitNativeFullscreen().catch(()=>{}),this.isFullscreenMode=!1,this.applyFullscreenMode(t);let r=t.querySelector(`.file-content`),i=t.querySelector(`.modal-preview-btn`);i instanceof HTMLButtonElement&&(i.setAttribute(`aria-pressed`,`false`),i.setAttribute(`aria-label`,`Switch to preview mode`));let a=t.querySelector(`.modal-edit-btn`);a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,`false`),a.setAttribute(`aria-label`,`Edit file`),a.classList.remove(`hidden`));let o=t.querySelector(`.modal-close-btn`);o instanceof HTMLButtonElement&&(o.disabled=!1,o.setAttribute(`aria-label`,`Close file viewer`),o.title=`Close`),t.querySelector(`.modal-save-btn`)?.classList.add(`hidden`),t.querySelector(`.file-editor-container`)?.classList.remove(`active`),t.querySelector(`.modal-body`)?.classList.remove(`modal-body--editing`);let s=t.querySelector(`.file-editor`);s instanceof HTMLTextAreaElement&&(s.value=``,s.removeAttribute(`language`));let c=t.querySelector(`.file-editor-overlay code`);c&&(c.innerHTML=``,c.className=`hljs`),this.isFileEditMode=!1,this.editorDraftContent=null,r instanceof HTMLElement&&(this.revokeObjectUrl(),r.classList.remove(`hidden`),r.classList.add(`file-content--raw`),r.classList.remove(`file-content--preview`,`file-content--iframe`),r.textContent=``)}resolveRouteGroupId(e){let t=v.activeGroupId;if(e===t||this.routeGroupMatches(e,t))return t;let n=Array.isArray(v.groups)?v.groups:[],r=n.find(t=>t.groupId===e);if(r)return r.groupId;let i=n.find(t=>this.routeGroupMatches(e,t.groupId));return i?i.groupId:e||null}resolveWorkspaceLinkPath(e,t=``){let n=e.trim();if(!n||n.startsWith(`#`))return null;let r=n,i=/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(n);if(i||n.startsWith(`//`)){let e;try{e=new URL(n,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;r=`${e.pathname}${e.search}${e.hash}`}let a=this.getWorkspaceRouteTarget(r);if(a)return a.path;let o=r.split(/[?#]/,1)[0].replace(/\\/g,`/`),s=o.startsWith(`/`);if(i||s||(o=o.replace(/^\/+/,``),!o))return null;let c=[];if(!s){let e=t.replace(/\\/g,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);e.pop(),c.push(...e)}for(let e of o.split(`/`))if(!(!e||e===`.`)){if(e===`..`){if(c.length===0)return null;c.pop();continue}c.push(e)}return c.length>0?c.join(`/`):null}revokeObjectUrl(){this.previewFrameWindow=null,this.currentObjectUrl&&=(URL.revokeObjectURL(this.currentObjectUrl),null);for(let e of this.currentImageObjectUrls)URL.revokeObjectURL(e);this.currentImageObjectUrls=[]}rewriteWorkspacePreviewHtml(e,r){if(!e)return e;let o=n(t(v.activeGroupId,r)),s=new DOMParser().parseFromString(e,`text/html`),c=(e,t)=>{let n=Array.from(s.querySelectorAll(e));for(let e of n){let n=(e.getAttribute(t)||``).trim();if(!n||n.startsWith(`#`)||n.startsWith(`javascript:`))continue;let s=a(n,o,window.location.origin);!s||s.origin!==window.location.origin||t===`href`&&!(i(s.pathname)||this.resolveWorkspaceLinkPath(n,r))||e.setAttribute(t,`${s.pathname}${s.search}${s.hash}`)}};return c(`a[href]`,`href`),c(`img[src]`,`src`),c(`audio[src]`,`src`),c(`video[src]`,`src`),c(`source[src]`,`src`),s.body.innerHTML}routeGroupMatches(e,t){if(e===t||e===`main`&&t===`br:main`||e===`br:main`&&t===`main`)return!0;if(!e.includes(`:`)&&!t.includes(`:`))return!1;let n=e=>e.trim().replace(/:/g,`-`);return n(e)===n(t)}setupEffects(){C(()=>{let e=y.declarativeTools;this.broadcastProxy&&e.length>0&&this.broadcastProxy.registerChannelsFromTools(e)}),C(()=>{let e=O.file,t=++this.viewRenderToken,n=this.shadowRoot;if(!n)return;let r=n.querySelector(`shadow-claw-dialog`);r&&typeof r.ensureDialog==`function`&&r.ensureDialog();let i=n.querySelector(`.file-modal`);if(e){r&&typeof r.showModal==`function`&&!r.open?r.showModal():i instanceof HTMLDialogElement&&!i.open&&i.showModal();let a=n.querySelector(`.modal-title`);a instanceof HTMLElement&&(a.textContent=`File: ${e.name}`),this.lastOpenedFileName!==e.name&&(this.lastOpenedFileName=e.name,this.isFilePreviewMode=this.shouldAutoPreview(e),this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null),this.updateView(t)}else r&&typeof r.close==`function`&&r.open?r.close():i instanceof HTMLDialogElement&&i.open&&i.close(),this.lastOpenedFileName=``,this.isFilePreviewMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,this.resetContent()})}shouldAutoPreview(e){return!e||typeof e!=`object`?!1:e.kind===`pdf`||e.kind===`binary`?!0:e.kind===`text`?this.isIframePreviewFile(e.name)||this.isMarkdownLikeFile(e.name):!1}stripHtmlFrontmatter(e){if(typeof e!=`string`||!e.trimStart().startsWith(`---`))return e;let t=T(e);return Object.keys(t.data||{}).length===0?e:t.content||``}toPreviewMarkdown(e){return this.isMarkdownLikeFile(e.name)?e.content:"```"+this.getLanguageFromFilename(e.name)+`
|
|
575
575
|
`+e.content+"\n```"}updateEditorHighlight(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.file-editor-overlay code`);if(!n)return;let r=O.file,i=this.getLanguageFromFilename(r?.name||``),a=``;try{a=i&&E.getLanguage(i)?E.highlight(e,{language:i}).value:E.highlightAuto(e).value}catch{a=e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}n.className=i?`hljs language-${i}`:`hljs`,n.innerHTML=l(a+`<br>`)}wrapCodeLines(e){e.querySelectorAll(`pre code`).forEach(e=>{let t=e.innerHTML.split(/\r?\n/u);t.length>1&&t[t.length-1]===``&&t.pop(),h(e,t.map((e,t)=>`<span class="code-line" data-line="${t+1}">${e||` `}</span>`).join(`
|
|
576
|
-
`))})}async buildIframePreviewSrcdoc(e,r=``){if(/\.svg$/i.test(e.name))return e.content;let i=e.path||e.name||``,a=this.stripHtmlFrontmatter(e.content||``),o=this.rewriteWorkspacePreviewHtml(a,i),s=d(await this.resolveRelativeImagesInHtml(o,i),G),c=crypto.randomUUID().replace(/-/g,``),l=this.getIframeBridgeScriptUrl(),u=n(`/assets/iframe-storage-bridge.js`),m=f(),h=p(c),g=typeof document<`u`?document.getElementById(`shadow-claw-site-config`):null,_=g&&g.textContent?`<script id="shadow-claw-site-config" type="application/json">${g.textContent}<\/script>`:``,
|
|
577
|
-
`),x=`<link rel="stylesheet" href="${n(`/theme.css`)}">`;return[`<!doctype html>`,`<html class="${F()}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">`,`<meta http-equiv="Content-Security-Policy" content="${h}">`,`<base href="${n(t(b.activeGroupId,i))}" target="_blank">`,v,_,`<script src="${u}" nonce="${c}"><\/script>`,`<script src="${l}" nonce="${c}"><\/script>`,A(),x,y,`</head><body>`,s,`</body></html>`].join(``)}async canDismissViewer(){if(!this.hasUnsavedChanges())return!0;let e=await this.requestConfirmation({title:`Discard Unsaved Changes`,message:`You have unsaved changes. Discard them and close?`,confirmLabel:`Discard`,cancelLabel:`Keep Editing`});return e&&(this.isEditorDirty=!1,this.editorDraftContent=null),e}async exitFullscreenIfActive(e){let t=this.shadowRoot,n=e||t?.querySelector(`.file-modal`);if(!n)return;let r=this.getFullscreenTarget(n);if(!(!r||!this.isTargetInFullscreen(r)))try{await this.exitNativeFullscreen()}catch{}}async exitNativeFullscreen(){let e=document.exitFullscreen||document.webkitExitFullscreen;if(typeof e!=`function`)throw Error(`Native fullscreen exit unavailable`);await Promise.resolve(e.call(document))}async handlePreviewLinkClick(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=e.target;if(!(r instanceof Element))return;let o=r.closest(`a`);if(!(o instanceof HTMLAnchorElement)||!this.db)return;let s=O.file,c=s?.path||s?.name||``,l=o.getAttribute(`href`)||``,u=a(l,n(t(b.activeGroupId,c)),window.location.origin);if(u&&u.origin===window.location.origin&&(i(u.pathname)||this.resolveWorkspaceLinkPath(l,c))&&u){e.preventDefault();let t=`${u.pathname}${u.search}${u.hash}`,n=window.navigation;n&&typeof n.navigate==`function`?n.navigate(t):(window.history.pushState({},``,t),window.dispatchEvent(new PopStateEvent(`popstate`)));return}let d=l.trim();if(d&&!d.startsWith(`#`)&&!d.startsWith(`javascript:`)){let t=o.getAttribute(`target`)||`_blank`,n=t===`_self`||t===`_top`||t===`_parent`?`_blank`:t;try{new URL(d,window.location.href).host!==window.location.host&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}catch{/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(d)&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}}}async handleSave(){let e=O.file;if(!e||!this.db)return;let t=this.shadowRoot,n=t?.querySelector(`.modal-save-btn`),r=t?.querySelector(`.file-editor`);if(r instanceof HTMLTextAreaElement)try{n instanceof HTMLButtonElement&&(n.disabled=!0,n.textContent=`⏳ saving...`);let t=r.value,i=e.path||(b.currentPath===`.`?e.name:`${b.currentPath}/${e.name}`),a=e.groupId||b.activeGroupId;await y(this.db,a,i,t),g(`Saved ${e.name}`),document.dispatchEvent(new CustomEvent(`shadow-claw-file-saved`,{detail:{groupId:a,path:i},bubbles:!0,composed:!0})),await b.loadFiles(this.db),e.content=t,this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,await this.updateView()}catch(e){_(`Failed to save file: ${e instanceof Error?e.message:String(e)}`)}finally{n instanceof HTMLButtonElement&&(n.disabled=!1,n.textContent=`💾 Save`)}}async handleShareFile(){let e=O.file;if(!e||!this.canShareCurrentFile(e)){_(`Sharing is not supported for this file on this device.`,4500);return}try{if(e.kind===`text`)await navigator.share({title:e.name,text:e.content||``});else{let t=this.buildWebShareFile(e);if(!t||!navigator.canShare?.({files:[t]})){_(`File sharing is not supported on this device.`,4500);return}await navigator.share({title:e.name,files:[t]})}g(`Shared ${e.name}`)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;_(`Failed to share file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openFolderInFilesView(e){if(!this.db)return;let t=e.replace(/^\/+|\/+$/g,``);if(t)try{await b.setCurrentPath(this.db,t),O.closeFile();let e=window?.shadowclaw?.ui;e&&typeof e.showPage==`function`&&e.showPage(`files`)}catch(e){_(`Failed to open linked folder: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openWorkspaceLink(e,t){if(!this.db)return;let n=this.resolveWorkspaceLinkPath(e,t);if(!n)return;let r=n.split(`/`).filter(Boolean).pop()||``;if(!/\.[^./]+$/u.test(r)){try{await O.openFile(this.db,n,b.activeGroupId);return}catch(e){let t=e instanceof DOMException&&e.name===`NotFoundError`,n=e instanceof DOMException&&e.name===`TypeMismatchError`;if(!t&&!n){_(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3);return}}await this.openFolderInFilesView(n);return}try{await O.openFile(this.db,n,b.activeGroupId)}catch(e){_(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async renderPreview(t,n,r=this.viewRenderToken){if(!this.isRenderTokenCurrent(r))return;if(this.revokeObjectUrl(),this.previewFrameWindow=null,n.kind===`pdf`){t.classList.remove(`file-content--raw`,`file-content--preview`,`file-content--iframe`),import(`./shadow-claw-pdf-viewer-gOiW-_Bh.js`).then(()=>{let e=document.createElement(`shadow-claw-pdf-viewer`);e.file=n,t.replaceChildren(e)}).catch(console.error);return}if(n.kind===`binary`){this.renderBinaryPreview(t,n);return}if(this.isIframePreviewFile(n.name)){t.classList.remove(`file-content--raw`,`file-content--preview`),t.classList.add(`file-content--iframe`);let e=document.createElement(`iframe`);e.className=`file-content-iframe`,e.setAttribute(`title`,`Preview: ${n.name}`),e.setAttribute(`sandbox`,this.getIframeSandboxPermissions(n.name)),e.setAttribute(`allow`,`fullscreen`),e.setAttribute(`referrerpolicy`,`no-referrer`),c(e,await this.buildIframePreviewSrcdoc(n)),e.addEventListener(`load`,()=>{this.previewFrameWindow=e.contentWindow,this.syncIframeTheme()}),t.replaceChildren(e);return}t.classList.remove(`file-content--raw`),t.classList.add(`file-content--preview`);let i=O.file,a=i?.path||i?.name||``,o=this.toPreviewMarkdown(n),s=K(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),l=await D(o,{renderFrontmatter:typeof s==`boolean`?s:await s});if(!this.isRenderTokenCurrent(r))return;let u=this.rewriteWorkspacePreviewHtml(l,a);this.isRenderTokenCurrent(r)&&(h(t,u,G),this.wrapCodeLines(t),await this.resolveMarkdownImages(t,a))}async requestCloseViewer(){return await this.canDismissViewer()?(await this.exitFullscreenIfActive(),O.closeFile(),!0):!1}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):!1}async requestNativeFullscreen(e){let t=e.requestFullscreen||e.webkitRequestFullscreen;if(typeof t!=`function`)throw Error(`Native fullscreen unavailable`);await Promise.resolve(t.call(e))}async resolveMarkdownImages(e,t){if(!this.db)return;let n=Array.from(e.querySelectorAll(`img`));n.length!==0&&await Promise.all(n.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:b.activeGroupId,path:e}:null})();if(r)try{let t=await x(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t),e.src=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))})}catch{}}))}async resolveRelativeImagesInHtml(e,t){if(!this.db||!e)return e;let n=new DOMParser().parseFromString(e,`text/html`),r=Array.from(n.querySelectorAll(`img`));return r.length===0?e:(await Promise.all(r.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:b.activeGroupId,path:e}:null})();if(r)try{let t=await x(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t);let o=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))});e.setAttribute(`src`,o)}catch{}})),n.body.innerHTML)}async toggleFullscreenMode(e){let t=this.getFullscreenTarget(e);if(t){if(this.canUseNativeFullscreen(t)){let n=this.isTargetInFullscreen(t);try{n?(await this.exitNativeFullscreen(),this.isFullscreenMode=!1):(await this.requestNativeFullscreen(t),this.isFullscreenMode=!0)}catch{this.isFullscreenMode=!this.isFullscreenMode}this.applyFullscreenMode(e);return}this.isFullscreenMode=!this.isFullscreenMode,this.applyFullscreenMode(e)}}async updateView(e=this.viewRenderToken){let t=O.file,n=this.shadowRoot;if(!n||!t)return;let r=n.querySelector(`.file-modal`);if(!(r instanceof HTMLElement))return;this.applyFullscreenMode(r);let i=r.querySelector(`.file-content`),a=r.querySelector(`.modal-preview-btn`),o=r.querySelector(`.modal-body`);if(!(i instanceof HTMLElement))return;i.classList.remove(`file-content--iframe`);let s=this.getWorkingSourceFile(t,r),c=t.kind===`text`;a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,String(this.isFilePreviewMode)),a.setAttribute(`aria-label`,this.isFilePreviewMode?`Switch to raw text view`:`Switch to preview mode`));let l=r.querySelector(`.file-editor-container`),u=r.querySelector(`.modal-edit-btn`),d=r.querySelector(`.modal-save-btn`),f=r.querySelector(`.modal-share-btn`),p=r.querySelector(`.modal-close-btn`),m=r.querySelector(`.modal-cancel-btn`);if(f instanceof HTMLButtonElement){let e=this.canShareCurrentFile(t);f.classList.toggle(`hidden`,!e),f.disabled=!e}if(p instanceof HTMLButtonElement){let e=this.hasUnsavedChanges();p.disabled=!1,p.setAttribute(`aria-label`,e?`Close file viewer (unsaved changes)`:`Close file viewer`),p.title=e?`Close (you have unsaved changes)`:`Close`}let h=this.hasUnsavedChanges();if(d instanceof HTMLButtonElement&&d.classList.toggle(`hidden`,!h),m instanceof HTMLButtonElement&&m.classList.toggle(`hidden`,!h),this.isFilePreviewMode){o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),await this.renderPreview(i,s,e);return}if(this.isRenderTokenCurrent(e))if(this.isFileEditMode&&c){o?.classList.add(`modal-body--editing`),i.classList.add(`hidden`),l?.classList.add(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`true`),u.setAttribute(`aria-label`,`Switch to raw text view`),u.classList.remove(`hidden`));let e=l?.querySelector(`.file-editor`);if(e instanceof HTMLTextAreaElement){e.setAttribute(`tab-size`,`2`);let n=this.getLanguageFromFilename(t.name);if(n?e.setAttribute(`language`,n):e.removeAttribute(`language`),this.isEditorDirty)typeof s?.content==`string`&&(e.value!==s.content&&(e.value=s.content),this.updateEditorHighlight(e.value));else{let n=t.content||``;e.value!==n&&(e.value=n),this.updateEditorHighlight(e.value)}e.dispatchEvent(new Event(`scroll`))}}else o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),i.classList.add(`file-content--raw`),i.classList.remove(`file-content--preview`,`file-content--iframe`),t.kind===`binary`?i.textContent=`Binary file (${t.mimeType||`application/octet-stream`}). Switch to Preview to view.`:i.textContent=s.content||``}syncIframeTheme(){if(!this.previewFrameWindow)return;let e=document.documentElement.classList.contains(`dark-mode`),t=getComputedStyle(document.documentElement),n={};for(let e=0;e<t.length;e++){let r=t[e];r.startsWith(`--`)&&(n[r]=t.getPropertyValue(r))}this.previewFrameWindow.postMessage({type:`shadow-claw-theme-update`,theme:e?`dark`:`light`,customProperties:n},`*`)}async handleStorageProxyRequest(e,t,n,r){if(!t)return;let i=O.file,a=i?.path||i?.name||`__default__`;try{let i;switch(n){case`setItem`:await k(a,String(r.key||``),r.value);break;case`removeItem`:await M(a,String(r.key||``));break;case`clear`:await I(a);break;case`getAllItems`:i=await j(a);break;case`idb-get`:i=await P(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-getAll`:i=await j(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-put`:{let e=r.key==null?`__auto_${Date.now()}`:String(r.key);await k(`${a}::idb::${r.dbName}::${r.storeName}`,e,r.value),i=e;break}case`idb-delete`:await M(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-clear`:await I(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-deleteDatabase`:await I(`${a}::idb::${r.dbName}::__default__`);break;default:throw Error(`Unknown storage proxy method: ${n}`)}e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,result:i??null},`*`)}catch(n){e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,error:n instanceof Error?n.message:String(n)},`*`)}}async reloadPreviewWithSearchParams(e){let t=O.file;if(!t)return;let n=this.shadowRoot?.querySelector(`.file-viewer__iframe`);n&&(this.previewFrameWindow=null,c(n,await this.buildIframePreviewSrcdoc(t,e)))}};customElements.get(H)||customElements.define(H,q);export{q as ShadowClawFileViewer};
|
|
576
|
+
`))})}async buildIframePreviewSrcdoc(e,r=``){if(/\.svg$/i.test(e.name))return e.content;let i=e.path||e.name||``,a=this.stripHtmlFrontmatter(e.content||``),o=this.rewriteWorkspacePreviewHtml(a,i),s=d(await this.resolveRelativeImagesInHtml(o,i),G),c=crypto.randomUUID().replace(/-/g,``),l=this.getIframeBridgeScriptUrl(),u=n(`/assets/iframe-storage-bridge.js`),m=f(),h=p(c),g=typeof document<`u`?document.getElementById(`shadow-claw-site-config`):null,_=g&&g.textContent?`<script id="shadow-claw-site-config" type="application/json">${g.textContent}<\/script>`:``,y=r?`<script nonce="${c}">(function(){try{Object.defineProperty(globalThis.location,"search",{get:function(){return ${JSON.stringify(r)};},configurable:true});}catch(e){}})();<\/script>`:``,b=m.map(({src:e,hasInit:t})=>{let r=e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`//`)?e:n(e.startsWith(`/`)?e:`/${e.replace(/^pages\/main\//,``)}`),i=[`<script type="module" src="${r}" nonce="${c}"><\/script>`];return t&&i.push(`<script type="module" nonce="${c}">import("${r}").then((m) => { try { if (typeof m?.init === "function") m.init(); } catch (e) { console.error("[ShadowClaw] Error executing init for " + ${JSON.stringify(r)}, e); } }).catch(() => {});<\/script>`),i.join(`
|
|
577
|
+
`)}).join(`
|
|
578
|
+
`),x=`<link rel="stylesheet" href="${n(`/theme.css`)}">`;return[`<!doctype html>`,`<html class="${F()}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">`,`<meta http-equiv="Content-Security-Policy" content="${h}">`,`<base href="${n(t(v.activeGroupId,i))}" target="_blank">`,y,_,`<script src="${u}" nonce="${c}"><\/script>`,`<script src="${l}" nonce="${c}"><\/script>`,A(),x,b,`</head><body>`,s,`</body></html>`].join(``)}async canDismissViewer(){if(!this.hasUnsavedChanges())return!0;let e=await this.requestConfirmation({title:`Discard Unsaved Changes`,message:`You have unsaved changes. Discard them and close?`,confirmLabel:`Discard`,cancelLabel:`Keep Editing`});return e&&(this.isEditorDirty=!1,this.editorDraftContent=null),e}async exitFullscreenIfActive(e){let t=this.shadowRoot,n=e||t?.querySelector(`.file-modal`);if(!n)return;let r=this.getFullscreenTarget(n);if(!(!r||!this.isTargetInFullscreen(r)))try{await this.exitNativeFullscreen()}catch{}}async exitNativeFullscreen(){let e=document.exitFullscreen||document.webkitExitFullscreen;if(typeof e!=`function`)throw Error(`Native fullscreen exit unavailable`);await Promise.resolve(e.call(document))}async handlePreviewLinkClick(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=e.target;if(!(r instanceof Element))return;let o=r.closest(`a`);if(!(o instanceof HTMLAnchorElement)||!this.db)return;let s=O.file,c=s?.path||s?.name||``,l=o.getAttribute(`href`)||``,u=a(l,n(t(v.activeGroupId,c)),window.location.origin);if(u&&u.origin===window.location.origin&&(i(u.pathname)||this.resolveWorkspaceLinkPath(l,c))&&u){e.preventDefault();let t=`${u.pathname}${u.search}${u.hash}`,n=window.navigation;n&&typeof n.navigate==`function`?n.navigate(t):(window.history.pushState({},``,t),window.dispatchEvent(new PopStateEvent(`popstate`)));return}let d=l.trim();if(d&&!d.startsWith(`#`)&&!d.startsWith(`javascript:`)){let t=o.getAttribute(`target`)||`_blank`,n=t===`_self`||t===`_top`||t===`_parent`?`_blank`:t;try{new URL(d,window.location.href).host!==window.location.host&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}catch{/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(d)&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}}}async handleSave(){let e=O.file;if(!e||!this.db)return;let t=this.shadowRoot,n=t?.querySelector(`.modal-save-btn`),r=t?.querySelector(`.file-editor`);if(r instanceof HTMLTextAreaElement)try{n instanceof HTMLButtonElement&&(n.disabled=!0,n.textContent=`⏳ saving...`);let t=r.value,i=e.path||(v.currentPath===`.`?e.name:`${v.currentPath}/${e.name}`),a=e.groupId||v.activeGroupId;await _(this.db,a,i,t),b(`Saved ${e.name}`),document.dispatchEvent(new CustomEvent(`shadow-claw-file-saved`,{detail:{groupId:a,path:i},bubbles:!0,composed:!0})),await v.loadFiles(this.db),e.content=t,this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,await this.updateView()}catch(e){x(`Failed to save file: ${e instanceof Error?e.message:String(e)}`)}finally{n instanceof HTMLButtonElement&&(n.disabled=!1,n.textContent=`💾 Save`)}}async handleShareFile(){let e=O.file;if(!e||!this.canShareCurrentFile(e)){x(`Sharing is not supported for this file on this device.`,4500);return}try{if(e.kind===`text`)await navigator.share({title:e.name,text:e.content||``});else{let t=this.buildWebShareFile(e);if(!t||!navigator.canShare?.({files:[t]})){x(`File sharing is not supported on this device.`,4500);return}await navigator.share({title:e.name,files:[t]})}b(`Shared ${e.name}`)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;x(`Failed to share file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openFolderInFilesView(e){if(!this.db)return;let t=e.replace(/^\/+|\/+$/g,``);if(t)try{await v.setCurrentPath(this.db,t),O.closeFile();let e=window?.shadowclaw?.ui;e&&typeof e.showPage==`function`&&e.showPage(`files`)}catch(e){x(`Failed to open linked folder: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openWorkspaceLink(e,t){if(!this.db)return;let n=this.resolveWorkspaceLinkPath(e,t);if(!n)return;let r=n.split(`/`).filter(Boolean).pop()||``;if(!/\.[^./]+$/u.test(r)){try{await O.openFile(this.db,n,v.activeGroupId);return}catch(e){let t=e instanceof DOMException&&e.name===`NotFoundError`,n=e instanceof DOMException&&e.name===`TypeMismatchError`;if(!t&&!n){x(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3);return}}await this.openFolderInFilesView(n);return}try{await O.openFile(this.db,n,v.activeGroupId)}catch(e){x(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async renderPreview(t,n,r=this.viewRenderToken){if(!this.isRenderTokenCurrent(r))return;if(this.revokeObjectUrl(),this.previewFrameWindow=null,n.kind===`pdf`){t.classList.remove(`file-content--raw`,`file-content--preview`,`file-content--iframe`),import(`./shadow-claw-pdf-viewer-gOiW-_Bh.js`).then(()=>{let e=document.createElement(`shadow-claw-pdf-viewer`);e.file=n,t.replaceChildren(e)}).catch(console.error);return}if(n.kind===`binary`){this.renderBinaryPreview(t,n);return}if(this.isIframePreviewFile(n.name)){t.classList.remove(`file-content--raw`,`file-content--preview`),t.classList.add(`file-content--iframe`);let e=document.createElement(`iframe`);e.className=`file-content-iframe`,e.setAttribute(`title`,`Preview: ${n.name}`),e.setAttribute(`sandbox`,this.getIframeSandboxPermissions(n.name)),e.setAttribute(`allow`,`fullscreen`),e.setAttribute(`referrerpolicy`,`no-referrer`),c(e,await this.buildIframePreviewSrcdoc(n)),e.addEventListener(`load`,()=>{this.previewFrameWindow=e.contentWindow,this.syncIframeTheme()}),t.replaceChildren(e);return}t.classList.remove(`file-content--raw`),t.classList.add(`file-content--preview`);let i=O.file,a=i?.path||i?.name||``,o=this.toPreviewMarkdown(n),s=K(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),l=await D(o,{renderFrontmatter:typeof s==`boolean`?s:await s});if(!this.isRenderTokenCurrent(r))return;let u=this.rewriteWorkspacePreviewHtml(l,a);this.isRenderTokenCurrent(r)&&(h(t,u,G),this.wrapCodeLines(t),await this.resolveMarkdownImages(t,a))}async requestCloseViewer(){return await this.canDismissViewer()?(await this.exitFullscreenIfActive(),O.closeFile(),!0):!1}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):!1}async requestNativeFullscreen(e){let t=e.requestFullscreen||e.webkitRequestFullscreen;if(typeof t!=`function`)throw Error(`Native fullscreen unavailable`);await Promise.resolve(t.call(e))}async resolveMarkdownImages(e,t){if(!this.db)return;let n=Array.from(e.querySelectorAll(`img`));n.length!==0&&await Promise.all(n.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:v.activeGroupId,path:e}:null})();if(r)try{let t=await g(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t),e.src=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))})}catch{}}))}async resolveRelativeImagesInHtml(e,t){if(!this.db||!e)return e;let n=new DOMParser().parseFromString(e,`text/html`),r=Array.from(n.querySelectorAll(`img`));return r.length===0?e:(await Promise.all(r.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:v.activeGroupId,path:e}:null})();if(r)try{let t=await g(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t);let o=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))});e.setAttribute(`src`,o)}catch{}})),n.body.innerHTML)}async toggleFullscreenMode(e){let t=this.getFullscreenTarget(e);if(t){if(this.canUseNativeFullscreen(t)){let n=this.isTargetInFullscreen(t);try{n?(await this.exitNativeFullscreen(),this.isFullscreenMode=!1):(await this.requestNativeFullscreen(t),this.isFullscreenMode=!0)}catch{this.isFullscreenMode=!this.isFullscreenMode}this.applyFullscreenMode(e);return}this.isFullscreenMode=!this.isFullscreenMode,this.applyFullscreenMode(e)}}async updateView(e=this.viewRenderToken){let t=O.file,n=this.shadowRoot;if(!n||!t)return;let r=n.querySelector(`.file-modal`);if(!(r instanceof HTMLElement))return;this.applyFullscreenMode(r);let i=r.querySelector(`.file-content`),a=r.querySelector(`.modal-preview-btn`),o=r.querySelector(`.modal-body`);if(!(i instanceof HTMLElement))return;i.classList.remove(`file-content--iframe`);let s=this.getWorkingSourceFile(t,r),c=t.kind===`text`;a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,String(this.isFilePreviewMode)),a.setAttribute(`aria-label`,this.isFilePreviewMode?`Switch to raw text view`:`Switch to preview mode`));let l=r.querySelector(`.file-editor-container`),u=r.querySelector(`.modal-edit-btn`),d=r.querySelector(`.modal-save-btn`),f=r.querySelector(`.modal-share-btn`),p=r.querySelector(`.modal-close-btn`),m=r.querySelector(`.modal-cancel-btn`);if(f instanceof HTMLButtonElement){let e=this.canShareCurrentFile(t);f.classList.toggle(`hidden`,!e),f.disabled=!e}if(p instanceof HTMLButtonElement){let e=this.hasUnsavedChanges();p.disabled=!1,p.setAttribute(`aria-label`,e?`Close file viewer (unsaved changes)`:`Close file viewer`),p.title=e?`Close (you have unsaved changes)`:`Close`}let h=this.hasUnsavedChanges();if(d instanceof HTMLButtonElement&&d.classList.toggle(`hidden`,!h),m instanceof HTMLButtonElement&&m.classList.toggle(`hidden`,!h),this.isFilePreviewMode){o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),await this.renderPreview(i,s,e);return}if(this.isRenderTokenCurrent(e))if(this.isFileEditMode&&c){o?.classList.add(`modal-body--editing`),i.classList.add(`hidden`),l?.classList.add(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`true`),u.setAttribute(`aria-label`,`Switch to raw text view`),u.classList.remove(`hidden`));let e=l?.querySelector(`.file-editor`);if(e instanceof HTMLTextAreaElement){e.setAttribute(`tab-size`,`2`);let n=this.getLanguageFromFilename(t.name);if(n?e.setAttribute(`language`,n):e.removeAttribute(`language`),this.isEditorDirty)typeof s?.content==`string`&&(e.value!==s.content&&(e.value=s.content),this.updateEditorHighlight(e.value));else{let n=t.content||``;e.value!==n&&(e.value=n),this.updateEditorHighlight(e.value)}e.dispatchEvent(new Event(`scroll`))}}else o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),i.classList.add(`file-content--raw`),i.classList.remove(`file-content--preview`,`file-content--iframe`),t.kind===`binary`?i.textContent=`Binary file (${t.mimeType||`application/octet-stream`}). Switch to Preview to view.`:i.textContent=s.content||``}syncIframeTheme(){if(!this.previewFrameWindow)return;let e=document.documentElement.classList.contains(`dark-mode`),t=getComputedStyle(document.documentElement),n={};for(let e=0;e<t.length;e++){let r=t[e];r.startsWith(`--`)&&(n[r]=t.getPropertyValue(r))}this.previewFrameWindow.postMessage({type:`shadow-claw-theme-update`,theme:e?`dark`:`light`,customProperties:n},`*`)}async handleStorageProxyRequest(e,t,n,r){if(!t)return;let i=O.file,a=i?.path||i?.name||`__default__`;try{let i;switch(n){case`setItem`:await k(a,String(r.key||``),r.value);break;case`removeItem`:await M(a,String(r.key||``));break;case`clear`:await I(a);break;case`getAllItems`:i=await j(a);break;case`idb-get`:i=await P(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-getAll`:i=await j(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-put`:{let e=r.key==null?`__auto_${Date.now()}`:String(r.key);await k(`${a}::idb::${r.dbName}::${r.storeName}`,e,r.value),i=e;break}case`idb-delete`:await M(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-clear`:await I(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-deleteDatabase`:await I(`${a}::idb::${r.dbName}::__default__`);break;default:throw Error(`Unknown storage proxy method: ${n}`)}e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,result:i??null},`*`)}catch(n){e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,error:n instanceof Error?n.message:String(n)},`*`)}}async reloadPreviewWithSearchParams(e){let t=O.file;if(!t)return;let n=this.shadowRoot?.querySelector(`.file-viewer__iframe`);n&&(this.previewFrameWindow=null,c(n,await this.buildIframePreviewSrcdoc(t,e)))}};customElements.get(H)||customElements.define(H,q);export{q as ShadowClawFileViewer};
|