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
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import{r as e}from"./config-CrHchneq.js";import{a as t,n,o as r,r as i,s as a,u as o}from"./app-routes-Bs-riIvr.js";import{n as s}from"./txPromise-EBECky1b.js";import{t as c}from"./getConfig-D89uJgo5.js";import{d as l,i as u,l as d,n as f,r as p,s as m,u as h}from"./custom-element-security-
|
|
2
|
-
`),w=`<link rel="stylesheet" href="${n(`/theme.css`)}">`;return[`<!doctype html>`,`<html class="${de()}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">`,`<meta http-equiv="Content-Security-Policy" content="${y}">`,`<base href="${l}" target="_blank">`,S,x,`<script src="${_}" nonce="${h}"><\/script>`,`<script src="${g}" nonce="${h}"><\/script>`,oe(),w,C,`</head><body>`,m,`</body></html>`].join(``)}function ge(e,t){return t===0?{isPrevDisabled:!0,isNextDisabled:!0}:{isPrevDisabled:e<=0,isNextDisabled:e<0||e>=t-1}}async function _e(e,t,n=e=>E.removeAllPages(e)){return!e||!await t({title:`Remove All Pages`,message:`Remove ALL saved pages from Pages? This cannot be undone!`,confirmLabel:`Remove All`,cancelLabel:`Cancel`})?!1:(await n(e),!0)}const P={setItem:A,deleteItem:ce,clear:fe,getAll:se,getItem:ue,putItem:A};async function F(e,t,n,r=P){switch(e){case`setItem`:await r.setItem(n,String(t.key||``),t.value);return;case`removeItem`:await r.deleteItem(n,String(t.key||``));return;case`clear`:await r.clear(n);return;case`getAllItems`:return await r.getAll(n);case`idb-get`:return await r.getItem(`${n}::idb::${t.dbName}::${t.storeName}`,String(t.key||``));case`idb-getAll`:return await r.getAll(`${n}::idb::${t.dbName}::${t.storeName}`);case`idb-put`:{let e=t.key==null?`__auto_${Date.now()}`:String(t.key);return await r.putItem(`${n}::idb::${t.dbName}::${t.storeName}`,e,t.value),e}case`idb-delete`:await r.deleteItem(`${n}::idb::${t.dbName}::${t.storeName}`,String(t.key||``));return;case`idb-clear`:await r.clear(`${n}::idb::${t.dbName}::${t.storeName}`);return;case`idb-deleteDatabase`:await r.clear(`${n}::idb::${t.dbName}::__default__`);return;case`idb-count`:{let e=await r.getAll(`${n}::idb::${t.dbName}::${t.storeName}`);return Object.keys(e).length}default:throw Error(`Unknown storage proxy method: ${e}`)}}async function I(e,t,n,r,i,a=P){if(t)try{let o=await F(n,r,i,a);e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,result:o??null},`*`)}catch(n){e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,error:n instanceof Error?n.message:String(n)},`*`)}}function ve({root:e,rendered:t,selectedPath:n,onIframeLoad:r}){let i=e.querySelector(`[data-pages-iframe]`);if(i instanceof HTMLIFrameElement)return i;let a=document.createElement(`iframe`);return a.className=`pages__iframe`,a.setAttribute(`data-pages-iframe`,``),a.setAttribute(`title`,n?`Preview: ${n}`:`Page preview`),a.setAttribute(`sandbox`,u()),a.setAttribute(`allow`,`fullscreen`),a.hidden=!0,r&&a.addEventListener(`load`,()=>{r(a.contentWindow)}),t.before(a),a}function L(e){if(typeof e==`string`||typeof e==`number`){let t=parseInt(String(e),10);if(!isNaN(t)&&t>=0)return Math.min(t,86400)}return 0}async function ye(t,n=c){if(!t)return 0;try{return L(await n(t,e.PAGES_AUTO_REFRESH_INTERVAL))}catch{return 0}}function R(e){if(!e)return``;let t=e.groupId;return t===`main`&&(t=`br:main`),`${t}\u0000${e.path}`}function z(e,t=[]){if(!e)return-1;let n=R(e);return t.findIndex(e=>R(e)===n)}function be(e=[]){let t=new Map;return e.forEach(e=>{let n=t.get(e.groupId)||[];n.push(e),t.set(e.groupId,n)}),t}function xe(e,t){if(!t||t.hidden)return!1;let n=e.replace(/^#/,``),r=t.querySelector(`[id="${n}"]`)||t.querySelector(`a[name="${n}"]`);return r?(r.scrollIntoView({behavior:`smooth`,block:`start`}),!0):!1}function Se(e){let t=e.detail;return t&&t.interval!==void 0?L(t.interval):null}function Ce(e,t){return!e||!t||!e.groupId||!e.path||e.path!==t.path?!1:e.groupId===t.groupId||j(e.groupId,t.groupId)}function we(e,t){let n=e.detail;return Ce(n,t)}function B(e,t){let n=[`data-no-nav`,`data-no-swipe`,`data-no-page-nav`,`data-prevent-nav`,`data-prevent-page-nav`,`data-isolate-input`,`data-isolate-navigation`,`data-game-controls`],r=e=>{if(!e||!(e instanceof HTMLElement))return!1;let t=e.tagName.toLowerCase();return!!(t===`input`||t===`textarea`||t===`select`||t===`option`||t===`iframe`||e.classList.contains(`pages__preview-frame`)||e.isContentEditable||e.contentEditable===`true`||e.getAttribute(`contenteditable`)===`true`||e.hasAttribute(`contenteditable`)||e.closest(`[data-pages-list]`)||e.closest(`[data-pages-dropdown]`)||e.closest(`.pages__sidebar`)||e.closest(`.pages__preview-frame`)||e.closest(`iframe`)||n.some(t=>e.closest(`[${t}]`)))};if(t&&r(t))return!0;if(e){let t=typeof e.composedPath==`function`?e.composedPath():[];for(let e of t)if(e instanceof HTMLElement){let t=e.tagName.toLowerCase();if(n.some(t=>e.hasAttribute(t))||t===`input`||t===`textarea`||t===`select`||t===`option`||t===`iframe`||e.classList.contains(`pages__preview-frame`)||e.isContentEditable||e.contentEditable===`true`||e.getAttribute(`contenteditable`)===`true`||e.hasAttribute(`contenteditable`))return!0}if(e.target&&r(e.target))return!0}return!1}function Te(e,t){return t||e.key!==`ArrowLeft`&&e.key!==`ArrowRight`||e.ctrlKey||e.altKey||e.metaKey?null:e.key===`ArrowLeft`?`previous`:`next`}function Ee(e,t,n,r){if(!t)return;let i=n?.activeElement||document.activeElement,a=Te(e,B(e,e.target||null)||B(void 0,i));a&&(e.preventDefault(),r(a))}function De(e,t,n=Date.now()){return e.button!==0||t?{mouseStartX:0,mouseStartY:0,mouseStartTime:0,isMouseDown:!1}:{mouseStartX:e.clientX,mouseStartY:e.clientY,mouseStartTime:n,isMouseDown:!0}}function V(e,t,n,r,i,a=Date.now(),o=50,s=600){let c=n-e,l=r-t,u=a-i;return Math.abs(c)>=o&&Math.abs(c)>Math.abs(l)&&u<=s?c<0?`next`:`previous`:null}function Oe(e,t,n,r,i=Date.now()){return!t.isMouseDown||n||r?null:V(t.mouseStartX,t.mouseStartY,e.clientX,e.clientY,t.mouseStartTime,i)}function ke(e,t,n){if(t===n||t<0||t>=e.length||n<0||n>=e.length)return e;let r=[...e],[i]=r.splice(t,1);return r.splice(n,0,i),r}async function Ae({db:e,currentPages:t,fromIndex:n,toIndex:r,reorderStoreFn:i=(e,t)=>E.reorderPages(e,t)}){if(!e||n===r)return{reordered:!1,reorderedPages:t,movedToFirst:null};let a=ke(t,n,r);if(a===t)return{reordered:!1,reorderedPages:t,movedToFirst:null};await i(e,a);let o=a[r]||null;return{reordered:!0,reorderedPages:a,movedToFirst:r===0?o:null}}function je(e,t,n,r=Date.now()){if(!t.touchStartTime||n)return null;if(e.changedTouches&&e.changedTouches.length===1){let n=e.changedTouches[0].clientX,i=e.changedTouches[0].clientY;return V(t.touchStartX,t.touchStartY,n,i,t.touchStartTime,r)}return null}function Me(e,t,n=Date.now()){return t?{touchStartX:0,touchStartY:0,touchStartTime:0}:e.touches&&e.touches.length===1?{touchStartX:e.touches[0].clientX,touchStartY:e.touches[0].clientY,touchStartTime:n}:null}function Ne(e,t,n){return!e&&t?`render-and-timer`:e&&n?`clear-timer`:`noop`}function Pe(e,t){return!e&&t}function Fe(e){return/\.(html?|xhtml)$/iu.test(e)}function Ie(e){return/\.(md|markdown)$/iu.test(e)}function Le(e){if(!e||typeof e!=`object`)return null;let t=e;return t.type===`shadow-claw-broadcast-result`&&typeof t.channel==`string`?{kind:`broadcast-result`,channel:t.channel,payload:t.payload}:t.type===`shadow-claw-storage-proxy`?{kind:`storage-proxy`,requestId:String(t.requestId||``),method:String(t.method||``),args:t.args&&typeof t.args==`object`?t.args:{}}:t.type===`shadow-claw-swipe`&&typeof t.direction==`string`?{kind:`swipe`,direction:t.direction}:t.type===`shadow-claw-iframe-resize`&&typeof t.height==`number`?{kind:`iframe-resize`,height:t.height}:t.type===`shadow-claw-file-viewer-link`&&typeof t.href==`string`?{kind:`file-viewer-link`,href:t.href}:null}var H=te();function U(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`}async function Re({db:e,groupId:t,workspacePath:r,readGroupFileBytesFn:i=D,writeGroupFileFn:a=T,fetchFn:o=typeof fetch<`u`?fetch:void 0}){if(e)try{let n=await i(e,t,r),a=U(r.split(`.`).pop()?.toLowerCase()||``),o=new Uint8Array(n.byteLength);return o.set(new Uint8Array(n)),`data:${a};base64,${H.Buffer.from(o).toString(`base64`)}`}catch{}if(!o)return null;try{let i=r.replace(/^\/+/,``),s=[n(`/files/main/${i}`),n(`/static-main/${i}`),n(`/pages/main/${i}`)];for(let n of s)try{let i=await o(typeof window<`u`&&window.location?.origin?new URL(n,window.location.origin).toString():n);if(i.ok){let n=await i.blob();if(e)try{let i=await n.arrayBuffer();await a(e,t,r,new Uint8Array(i))}catch{}if(typeof FileReader<`u`)return await new Promise((e,t)=>{let r=new FileReader;r.onload=()=>e(r.result),r.onerror=t,r.readAsDataURL(n)});let o=await n.arrayBuffer(),s=H.Buffer.from(o).toString(`base64`);return`data:${n.type||U(r.split(`.`).pop()||``)};base64,${s}`}}catch{}}catch{}return null}function W(e){let t=e.querySelector(`[data-pages-iframe]`);t instanceof HTMLIFrameElement&&(t.removeAttribute(`srcdoc`),t.remove())}async function G(e,t=typeof document<`u`?document.querySelector(`shadow-claw`):null,n=v){return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(n(e.message,4500),!1)}async function ze(e,t,n=c){if(!e||typeof e.transaction!=`function`)return!0;try{return re(await n(e,t),!0)}catch{return!0}}function Be(e,t,n=[]){if(e===t||j(e,t))return t;let r=n.find(t=>t.groupId===e);if(r)return r.groupId;let i=n.find(t=>j(e,t.groupId));return i?i.groupId:e||null}function Ve(e,t,n,i=[],a=typeof window<`u`?window.location.origin:``){let o=e.trim();if(!o||o.startsWith(`#`))return null;let s=[],c=o.split(/[?#]/,1)[0];if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(c)||c.startsWith(`//`)){let e;try{e=new URL(c,a||(typeof window<`u`?window.location.origin:``))}catch{return null}if(a&&e.origin!==a)return null;c=e.pathname}let l=c.replace(/^(?:\.\/)+/u,``);if(l.startsWith(`files/`)&&s.push(`/${l}`),c.startsWith(`/`)){let e=c.lastIndexOf(`/files/`);e>0&&s.push(c.slice(e)),s.push(c)}for(let e of s){let t=r(e);if(!t)continue;let a=Be(t.groupId,n,i);if(a)return{groupId:a,path:t.path}}let u=M(o,t,n,a);return u?{groupId:n,path:u}:null}async function He({container:e,groupId:t,filePath:n,groups:r,readImageAsDataUrlFn:i}){let a=Array.from(e.querySelectorAll(`img[src]`));a.length!==0&&await Promise.all(a.map(async e=>{let a=e.getAttribute(`src`)||``;if(!a||/^(?:blob:|data:|#)/u.test(a))return;let o=Ve(a,n,t,r);if(!o)return;let s=await i(o.groupId,o.path);s&&e.setAttribute(`src`,s)}))}function K(e,t,n){return e>0&&!t&&n}function Ue(e){if(!e)return;let t=typeof document<`u`&&document.documentElement.classList.contains(`dark-mode`),n={};if(typeof document<`u`&&typeof getComputedStyle<`u`){let e=getComputedStyle(document.documentElement);for(let t=0;t<e.length;t++){let r=e[t];r.startsWith(`--`)&&(n[r]=e.getPropertyValue(r))}}e.postMessage({type:`shadow-claw-theme-update`,theme:t?`dark`:`light`,customProperties:n},`*`)}function q({root:e,currentOpen:t,force:n}){if(!e)return t;let r=e.querySelector(`[data-pages-dropdown]`),i=r instanceof HTMLDetailsElement&&r.open,a;a=n===void 0?!(i||t):n;let o=e.querySelector(`.pages__sidebar`),s=e.querySelector(`.pages__content`);return o&&o.classList.toggle(`collapsed`,!a),s&&s.classList.toggle(`pages__content--sidebar-collapsed`,!a),r instanceof HTMLDetailsElement&&(a?r.setAttribute(`open`,``):r.removeAttribute(`open`)),a}const J=new CSSStyleSheet;J.replaceSync(`* {
|
|
1
|
+
import{r as e}from"./config-CrHchneq.js";import{a as t,n,o as r,r as i,s as a,u as o}from"./app-routes-Bs-riIvr.js";import{n as s}from"./txPromise-EBECky1b.js";import{t as c}from"./getConfig-D89uJgo5.js";import{d 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{t as g}from"./dist-B9m1QM9v.js";import{a as _,c as v,gn as y,r as b,s as x,sn as S,t as C}from"./orchestrator-DHjdLtqa.js";import{o as w,t as ee}from"./tools-DvckJZG2.js";import{t as T}from"./buffer-9oRIc-5Z.js";import{a as E,r as D,s as te}from"./toast-BXgUfbyh.js";import{t as ne}from"./shadow-claw-element-DIrv3P6A.js";import{t as O}from"./effect-BJCrpFdp.js";import{t as re}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-BccSHItx.js";import{n as k,t as ie}from"./markdown-C3M4OW_A.js";import{t as ae}from"./file-viewer-C-6Jc_tb.js";import{a as A,c as oe,i as se,n as ce,o as le,r as ue,s as de,t as fe}from"./iframe-storage-proxy-B9Zt-vJ2.js";function pe(e,t,n){n&&(n.textContent=`Navigated to page: ${t||e.path}`)}function j(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)}function M(e,i,a,s=typeof window<`u`?window.location.origin:``){let c=e.trim();if(!c||c.startsWith(`#`))return null;let l=c.split(/[?#]/,1)[0],u=l.replace(/^(?:\.\/)+/u,``),d=[];if(u.startsWith(`files/`)&&d.push(`/${u}`),l.startsWith(`/`)){let e=l.lastIndexOf(`/files/`);e>0&&d.push(l.slice(e)),d.push(l)}for(let e of d){let t=r(e);if(t&&j(t.groupId,a))return t.path}let f=o(c,n(t(a,i)),s||(typeof window<`u`?window.location.origin:``));if(!f||s&&f.origin!==s)return null;let p=r(f.pathname);return!p||!j(p.groupId,a)?null:p.path}function N(e,t,n,r,i=typeof window<`u`?window.location.origin:``){if(!e)return e;let s=i||(typeof window<`u`?window.location.origin:``),c=new DOMParser().parseFromString(e,`text/html`),l=(e,i)=>{let l=Array.from(c.querySelectorAll(e));for(let e of l){let c=(e.getAttribute(i)||``).trim();if(!c||c.startsWith(`#`)||c.startsWith(`javascript:`))continue;let l=o(c,n,s);!l||s&&l.origin!==s||i===`href`&&!(a(l.pathname)||M(c,t,r,s))||e.setAttribute(i,`${l.pathname}${l.search}${l.hash}`)}};return l(`a[href]`,`href`),l(`img[src]`,`src`),l(`audio[src]`,`src`),l(`video[src]`,`src`),l(`source[src]`,`src`),c.body.innerHTML}const me={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`]};async function he({content:e,filePath:r,searchParams:i=``,groupId:a,origin:o=typeof window<`u`?window.location?.origin:``,sanitizeOptions:s=me,resolveRelativeImagesInHtmlFn:c}){let l=n(t(a,r)),u=N(e,r,l,a,o),m=d(c?await c(u,r,a):u,s),h=crypto.randomUUID().replace(/-/g,``),g=n(`/assets/file-viewer-preview-bridge.js`),_=n(`/assets/iframe-storage-bridge.js`),v=f(),y=p(h),b=typeof document<`u`?document.getElementById(`shadow-claw-site-config`):null,x=b&&b.textContent?`<script id="shadow-claw-site-config" type="application/json">${b.textContent}<\/script>`:``,S=i?`<script nonce="${h}">(function(){try{Object.defineProperty(globalThis.location,"search",{get:function(){return ${JSON.stringify(i)};},configurable:true});}catch(e){}})();<\/script>`:``,C=v.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="${h}"><\/script>`];return t&&i.push(`<script type="module" nonce="${h}">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(`
|
|
2
|
+
`)}).join(`
|
|
3
|
+
`),w=`<link rel="stylesheet" href="${n(`/theme.css`)}">`;return[`<!doctype html>`,`<html class="${de()}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">`,`<meta http-equiv="Content-Security-Policy" content="${y}">`,`<base href="${l}" target="_blank">`,S,x,`<script src="${_}" nonce="${h}"><\/script>`,`<script src="${g}" nonce="${h}"><\/script>`,oe(),w,C,`</head><body>`,m,`</body></html>`].join(``)}function ge(e,t){return t===0?{isPrevDisabled:!0,isNextDisabled:!0}:{isPrevDisabled:e<=0,isNextDisabled:e<0||e>=t-1}}async function _e(e,t,n=e=>C.removeAllPages(e)){return!e||!await t({title:`Remove All Pages`,message:`Remove ALL saved pages from Pages? This cannot be undone!`,confirmLabel:`Remove All`,cancelLabel:`Cancel`})?!1:(await n(e),!0)}const P={setItem:A,deleteItem:ce,clear:fe,getAll:se,getItem:ue,putItem:A};async function F(e,t,n,r=P){switch(e){case`setItem`:await r.setItem(n,String(t.key||``),t.value);return;case`removeItem`:await r.deleteItem(n,String(t.key||``));return;case`clear`:await r.clear(n);return;case`getAllItems`:return await r.getAll(n);case`idb-get`:return await r.getItem(`${n}::idb::${t.dbName}::${t.storeName}`,String(t.key||``));case`idb-getAll`:return await r.getAll(`${n}::idb::${t.dbName}::${t.storeName}`);case`idb-put`:{let e=t.key==null?`__auto_${Date.now()}`:String(t.key);return await r.putItem(`${n}::idb::${t.dbName}::${t.storeName}`,e,t.value),e}case`idb-delete`:await r.deleteItem(`${n}::idb::${t.dbName}::${t.storeName}`,String(t.key||``));return;case`idb-clear`:await r.clear(`${n}::idb::${t.dbName}::${t.storeName}`);return;case`idb-deleteDatabase`:await r.clear(`${n}::idb::${t.dbName}::__default__`);return;case`idb-count`:{let e=await r.getAll(`${n}::idb::${t.dbName}::${t.storeName}`);return Object.keys(e).length}default:throw Error(`Unknown storage proxy method: ${e}`)}}async function I(e,t,n,r,i,a=P){if(t)try{let o=await F(n,r,i,a);e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,result:o??null},`*`)}catch(n){e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,error:n instanceof Error?n.message:String(n)},`*`)}}function ve({root:e,rendered:t,selectedPath:n,onIframeLoad:r}){let i=e.querySelector(`[data-pages-iframe]`);if(i instanceof HTMLIFrameElement)return i;let a=document.createElement(`iframe`);return a.className=`pages__iframe`,a.setAttribute(`data-pages-iframe`,``),a.setAttribute(`title`,n?`Preview: ${n}`:`Page preview`),a.setAttribute(`sandbox`,u()),a.setAttribute(`allow`,`fullscreen`),a.hidden=!0,r&&a.addEventListener(`load`,()=>{r(a.contentWindow)}),t.before(a),a}function L(e){if(typeof e==`string`||typeof e==`number`){let t=parseInt(String(e),10);if(!isNaN(t)&&t>=0)return Math.min(t,86400)}return 0}async function ye(t,n=c){if(!t)return 0;try{return L(await n(t,e.PAGES_AUTO_REFRESH_INTERVAL))}catch{return 0}}function R(e){if(!e)return``;let t=e.groupId;return t===`main`&&(t=`br:main`),`${t}\u0000${e.path}`}function z(e,t=[]){if(!e)return-1;let n=R(e);return t.findIndex(e=>R(e)===n)}function be(e=[]){let t=new Map;return e.forEach(e=>{let n=t.get(e.groupId)||[];n.push(e),t.set(e.groupId,n)}),t}function xe(e,t){if(!t||t.hidden)return!1;let n=e.replace(/^#/,``),r=t.querySelector(`[id="${n}"]`)||t.querySelector(`a[name="${n}"]`);return r?(r.scrollIntoView({behavior:`smooth`,block:`start`}),!0):!1}function Se(e){let t=e.detail;return t&&t.interval!==void 0?L(t.interval):null}function Ce(e,t){return!e||!t||!e.groupId||!e.path||e.path!==t.path?!1:e.groupId===t.groupId||j(e.groupId,t.groupId)}function we(e,t){let n=e.detail;return Ce(n,t)}function B(e,t){let n=[`data-no-nav`,`data-no-swipe`,`data-no-page-nav`,`data-prevent-nav`,`data-prevent-page-nav`,`data-isolate-input`,`data-isolate-navigation`,`data-game-controls`],r=e=>{if(!e||!(e instanceof HTMLElement))return!1;let t=e.tagName.toLowerCase();return!!(t===`input`||t===`textarea`||t===`select`||t===`option`||t===`iframe`||e.classList.contains(`pages__preview-frame`)||e.isContentEditable||e.contentEditable===`true`||e.getAttribute(`contenteditable`)===`true`||e.hasAttribute(`contenteditable`)||e.closest(`[data-pages-list]`)||e.closest(`[data-pages-dropdown]`)||e.closest(`.pages__sidebar`)||e.closest(`.pages__preview-frame`)||e.closest(`iframe`)||n.some(t=>e.closest(`[${t}]`)))};if(t&&r(t))return!0;if(e){let t=typeof e.composedPath==`function`?e.composedPath():[];for(let e of t)if(e instanceof HTMLElement){let t=e.tagName.toLowerCase();if(n.some(t=>e.hasAttribute(t))||t===`input`||t===`textarea`||t===`select`||t===`option`||t===`iframe`||e.classList.contains(`pages__preview-frame`)||e.isContentEditable||e.contentEditable===`true`||e.getAttribute(`contenteditable`)===`true`||e.hasAttribute(`contenteditable`))return!0}if(e.target&&r(e.target))return!0}return!1}function Te(e,t){return t||e.key!==`ArrowLeft`&&e.key!==`ArrowRight`||e.ctrlKey||e.altKey||e.metaKey?null:e.key===`ArrowLeft`?`previous`:`next`}function Ee(e,t,n,r){if(!t)return;let i=n?.activeElement||document.activeElement,a=Te(e,B(e,e.target||null)||B(void 0,i));a&&(e.preventDefault(),r(a))}function De(e,t,n=Date.now()){return e.button!==0||t?{mouseStartX:0,mouseStartY:0,mouseStartTime:0,isMouseDown:!1}:{mouseStartX:e.clientX,mouseStartY:e.clientY,mouseStartTime:n,isMouseDown:!0}}function V(e,t,n,r,i,a=Date.now(),o=50,s=600){let c=n-e,l=r-t,u=a-i;return Math.abs(c)>=o&&Math.abs(c)>Math.abs(l)&&u<=s?c<0?`next`:`previous`:null}function Oe(e,t,n,r,i=Date.now()){return!t.isMouseDown||n||r?null:V(t.mouseStartX,t.mouseStartY,e.clientX,e.clientY,t.mouseStartTime,i)}function ke(e,t,n){if(t===n||t<0||t>=e.length||n<0||n>=e.length)return e;let r=[...e],[i]=r.splice(t,1);return r.splice(n,0,i),r}async function Ae({db:e,currentPages:t,fromIndex:n,toIndex:r,reorderStoreFn:i=(e,t)=>C.reorderPages(e,t)}){if(!e||n===r)return{reordered:!1,reorderedPages:t,movedToFirst:null};let a=ke(t,n,r);if(a===t)return{reordered:!1,reorderedPages:t,movedToFirst:null};await i(e,a);let o=a[r]||null;return{reordered:!0,reorderedPages:a,movedToFirst:r===0?o:null}}function je(e,t,n,r=Date.now()){if(!t.touchStartTime||n)return null;if(e.changedTouches&&e.changedTouches.length===1){let n=e.changedTouches[0].clientX,i=e.changedTouches[0].clientY;return V(t.touchStartX,t.touchStartY,n,i,t.touchStartTime,r)}return null}function Me(e,t,n=Date.now()){return t?{touchStartX:0,touchStartY:0,touchStartTime:0}:e.touches&&e.touches.length===1?{touchStartX:e.touches[0].clientX,touchStartY:e.touches[0].clientY,touchStartTime:n}:null}function Ne(e,t,n){return!e&&t?`render-and-timer`:e&&n?`clear-timer`:`noop`}function Pe(e,t){return!e&&t}function Fe(e){return/\.(html?|xhtml)$/iu.test(e)}function Ie(e){return/\.(md|markdown)$/iu.test(e)}function Le(e){if(!e||typeof e!=`object`)return null;let t=e;return t.type===`shadow-claw-broadcast-result`&&typeof t.channel==`string`?{kind:`broadcast-result`,channel:t.channel,payload:t.payload}:t.type===`shadow-claw-storage-proxy`?{kind:`storage-proxy`,requestId:String(t.requestId||``),method:String(t.method||``),args:t.args&&typeof t.args==`object`?t.args:{}}:t.type===`shadow-claw-swipe`&&typeof t.direction==`string`?{kind:`swipe`,direction:t.direction}:t.type===`shadow-claw-iframe-resize`&&typeof t.height==`number`?{kind:`iframe-resize`,height:t.height}:t.type===`shadow-claw-file-viewer-link`&&typeof t.href==`string`?{kind:`file-viewer-link`,href:t.href}:null}var H=T();function U(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`}async function Re({db:e,groupId:t,workspacePath:r,readGroupFileBytesFn:i=y,writeGroupFileFn:a=S,fetchFn:o=typeof fetch<`u`?fetch:void 0}){if(e)try{let n=await i(e,t,r),a=U(r.split(`.`).pop()?.toLowerCase()||``),o=new Uint8Array(n.byteLength);return o.set(new Uint8Array(n)),`data:${a};base64,${H.Buffer.from(o).toString(`base64`)}`}catch{}if(!o)return null;try{let i=r.replace(/^\/+/,``),s=[n(`/files/main/${i}`),n(`/static-main/${i}`),n(`/pages/main/${i}`)];for(let n of s)try{let i=await o(typeof window<`u`&&window.location?.origin?new URL(n,window.location.origin).toString():n);if(i.ok){let n=await i.blob();if(e)try{let i=await n.arrayBuffer();await a(e,t,r,new Uint8Array(i))}catch{}if(typeof FileReader<`u`)return await new Promise((e,t)=>{let r=new FileReader;r.onload=()=>e(r.result),r.onerror=t,r.readAsDataURL(n)});let o=await n.arrayBuffer(),s=H.Buffer.from(o).toString(`base64`);return`data:${n.type||U(r.split(`.`).pop()||``)};base64,${s}`}}catch{}}catch{}return null}function W(e){let t=e.querySelector(`[data-pages-iframe]`);t instanceof HTMLIFrameElement&&(t.removeAttribute(`srcdoc`),t.remove())}async function G(e,t=typeof document<`u`?document.querySelector(`shadow-claw`):null,n=te){return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(n(e.message,4500),!1)}async function ze(e,t,n=c){if(!e||typeof e.transaction!=`function`)return!0;try{return re(await n(e,t),!0)}catch{return!0}}function Be(e,t,n=[]){if(e===t||j(e,t))return t;let r=n.find(t=>t.groupId===e);if(r)return r.groupId;let i=n.find(t=>j(e,t.groupId));return i?i.groupId:e||null}function Ve(e,t,n,i=[],a=typeof window<`u`?window.location.origin:``){let o=e.trim();if(!o||o.startsWith(`#`))return null;let s=[],c=o.split(/[?#]/,1)[0];if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(c)||c.startsWith(`//`)){let e;try{e=new URL(c,a||(typeof window<`u`?window.location.origin:``))}catch{return null}if(a&&e.origin!==a)return null;c=e.pathname}let l=c.replace(/^(?:\.\/)+/u,``);if(l.startsWith(`files/`)&&s.push(`/${l}`),c.startsWith(`/`)){let e=c.lastIndexOf(`/files/`);e>0&&s.push(c.slice(e)),s.push(c)}for(let e of s){let t=r(e);if(!t)continue;let a=Be(t.groupId,n,i);if(a)return{groupId:a,path:t.path}}let u=M(o,t,n,a);return u?{groupId:n,path:u}:null}async function He({container:e,groupId:t,filePath:n,groups:r,readImageAsDataUrlFn:i}){let a=Array.from(e.querySelectorAll(`img[src]`));a.length!==0&&await Promise.all(a.map(async e=>{let a=e.getAttribute(`src`)||``;if(!a||/^(?:blob:|data:|#)/u.test(a))return;let o=Ve(a,n,t,r);if(!o)return;let s=await i(o.groupId,o.path);s&&e.setAttribute(`src`,s)}))}function K(e,t,n){return e>0&&!t&&n}function Ue(e){if(!e)return;let t=typeof document<`u`&&document.documentElement.classList.contains(`dark-mode`),n={};if(typeof document<`u`&&typeof getComputedStyle<`u`){let e=getComputedStyle(document.documentElement);for(let t=0;t<e.length;t++){let r=e[t];r.startsWith(`--`)&&(n[r]=e.getPropertyValue(r))}}e.postMessage({type:`shadow-claw-theme-update`,theme:t?`dark`:`light`,customProperties:n},`*`)}function q({root:e,currentOpen:t,force:n}){if(!e)return t;let r=e.querySelector(`[data-pages-dropdown]`),i=r instanceof HTMLDetailsElement&&r.open,a;a=n===void 0?!(i||t):n;let o=e.querySelector(`.pages__sidebar`),s=e.querySelector(`.pages__content`);return o&&o.classList.toggle(`collapsed`,!a),s&&s.classList.toggle(`pages__content--sidebar-collapsed`,!a),r instanceof HTMLDetailsElement&&(a?r.setAttribute(`open`,``):r.removeAttribute(`open`)),a}const J=new CSSStyleSheet;J.replaceSync(`* {
|
|
3
4
|
box-sizing: border-box;
|
|
4
5
|
}
|
|
5
6
|
|
|
@@ -617,4 +618,4 @@ ul {
|
|
|
617
618
|
</div>
|
|
618
619
|
</section>
|
|
619
620
|
</template>
|
|
620
|
-
`,`text/html`),X=Y.querySelector(`template`);let Z=[];Z=X?Array.from(X.content.children):Array.from(Y.head.children).concat(Array.from(Y.body.children));var We=Z;const Ge={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`]},Q=`shadow-claw-pages`;var $=class extends ne{static styles=J;static template=We;autoRefreshIntervalSec=0;autoRefreshTimer=null;broadcastProxy=null;db=null;draggedPageIndex=null;isMouseDown=!1;mouseStartTime=0;mouseStartX=0;mouseStartY=0;navFadeTimer=null;pageFrontmatter=new y.State(null);previewFrameWindow=null;renderToken=0;sidebarOpen=!1;themeObserver=null;touchStartTime=0;touchStartX=0;touchStartY=0;dsdInitialPath=null;renderedContent=null;renderedFrontmatterToggle=null;renderedKey=null;routingReady=!1;constructor(){super()}async connectedCallback(){let e=this.shadowRoot;if(!e)throw Error(`shadowRoot not found`);let t=this.closest(`shadow-claw`),n=document.documentElement.classList.contains(`sc-prerender-override`),r=t?.getAttribute(`data-prerender-no-seed`)===`true`;if(n||r){let t=e.querySelector(`[data-pages-rendered]`);t instanceof HTMLElement&&(t.hidden=!0,t.textContent=``)}else{let t=e.querySelector(`[data-pages-dropdown-selected]`)?.textContent?.trim();t&&(this.dsdInitialPath=t)}this.db=await s(),await E.whenInitialized,this.broadcastProxy=new le(()=>this.previewFrameWindow||this.shadowRoot?.querySelector(`[data-pages-iframe]`)?.contentWindow||null),window.addEventListener(`message`,this.handleIframeMessage),document.addEventListener(`visibilitychange`,this.handleVisibilityChange),window.addEventListener(`focus`,this.handleWindowFocus),window.addEventListener(`shadow-claw-pages-auto-refresh-change`,this.handleAutoRefreshConfigChange),document.addEventListener(`shadow-claw-file-saved`,this.handleFileSaved),document.addEventListener(`keydown`,this.handleKeyDown),e.addEventListener(`click`,t=>{let n=e.querySelector(`[data-pages-dropdown]`);if(n instanceof HTMLDetailsElement&&n.open){let r=t.target,i=e.querySelector(`[data-pages-sidebar-toggle]`);!n.contains(r)&&(!i||!i.contains(r))&&n.removeAttribute(`open`)}});let i=e.querySelector(`.pages__viewer`),a=e.querySelector(`.pages__viewer-scroll`),o=()=>{this.showNavButtonsTemporarily(2e3)};i instanceof HTMLElement&&(i.addEventListener(`pointermove`,o,{passive:!0}),i.addEventListener(`pointerdown`,o,{passive:!0}),i.addEventListener(`touchstart`,o,{passive:!0}),i.addEventListener(`touchstart`,this.handleTouchStart,{passive:!0}),i.addEventListener(`touchend`,this.handleTouchEnd,{passive:!0}),i.addEventListener(`mousedown`,this.handleMouseDown,{passive:!0}),i.addEventListener(`mouseup`,this.handleMouseUp,{passive:!0}),i.addEventListener(`click`,o,{passive:!0}),i.addEventListener(`focusin`,o,{passive:!0})),a instanceof HTMLElement&&a.addEventListener(`scroll`,o,{passive:!0});let c=e.querySelector(`[data-pages-sidebar-toggle]`);c&&c.addEventListener(`click`,()=>{this.toggleSidebar()});let l=e.querySelector(`.pages__remove-all-btn`);l&&l.addEventListener(`click`,()=>{this.handleRemoveAll()});let u=e.querySelector(`[data-pages-prev]`);u&&u.addEventListener(`click`,()=>{this.goToPreviousPage()});let d=e.querySelector(`[data-pages-next]`);d&&d.addEventListener(`click`,()=>{this.goToNextPage()}),this.toggleSidebar(this.sidebarOpen),this.setupEffects(),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`]}),await E.whenReady,this.routingReady=!0,this.renderSelectedPage(),this.setupAutoRefreshTimer()}disconnectedCallback(){this.renderedKey=null,this.renderedContent=null,this.renderedFrontmatterToggle=null,this.dsdInitialPath=null,this.themeObserver&&=(this.themeObserver.disconnect(),null),this.navFadeTimer!==null&&(clearTimeout(this.navFadeTimer),this.navFadeTimer=null),this.autoRefreshTimer!==null&&(clearInterval(this.autoRefreshTimer),this.autoRefreshTimer=null),window.removeEventListener(`message`,this.handleIframeMessage),document.removeEventListener(`visibilitychange`,this.handleVisibilityChange),window.removeEventListener(`focus`,this.handleWindowFocus),window.removeEventListener(`shadow-claw-pages-auto-refresh-change`,this.handleAutoRefreshConfigChange),document.removeEventListener(`shadow-claw-file-saved`,this.handleFileSaved),document.removeEventListener(`keydown`,this.handleKeyDown),this.broadcastProxy?.dispose(),this.broadcastProxy=null,this.previewFrameWindow=null,super.disconnectedCallback?.()}announcePageChange(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-pages-announcer]`);n instanceof HTMLElement&&pe(e,this.pageFrontmatter.get()?.title,n)}goToNextPage(){let e=E.pages,t=z(this.selectedPage,e);t>=0&&t<e.length-1&&this.navigateToPage(e[t+1])}goToPreviousPage(){let e=E.pages,t=z(this.selectedPage,e);t>0&&this.navigateToPage(e[t-1])}handleAnchorNavigation(e){let t=this.shadowRoot;return t?xe(e,t.querySelector(`[data-pages-rendered]`)):!1}handleAutoRefreshConfigChange=e=>{let t=Se(e);t!==null&&(this.autoRefreshIntervalSec=t),this.setupAutoRefreshTimer()};handleFileSaved=e=>{we(e,this.selectedPage)&&this.renderSelectedPage()};handleIframeMessage=e=>{let r=Le(e.data);if(!r)return;if(r.kind===`broadcast-result`){this.broadcastProxy?.handleResultFromIframe(e.source,r.channel,r.payload);return}if(r.kind===`storage-proxy`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let t=this.selectedPage?.path||`__default__`;I(e.source,r.requestId,r.method,r.args,t);return}if(r.kind===`swipe`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;this.showNavButtonsTemporarily(2e3),r.direction===`left`?this.goToNextPage():r.direction===`right`&&this.goToPreviousPage();return}if(r.kind===`iframe-resize`){let t=this.shadowRoot?.querySelector(`[data-pages-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(!this.db||r.kind!==`file-viewer-link`||this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let i=this.selectedPage?.path||``,s=this.selectedPage?.groupId||E.activeGroupId,c=n(t(s,i)),l=o(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&&(a(l.pathname)||M(r.href,i,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`))};handleKeyDown=e=>{Ee(e,this.isConnected,this.shadowRoot,e=>{this.showNavButtonsTemporarily(2e3),e===`previous`?this.goToPreviousPage():this.goToNextPage()})};handleMouseDown=e=>{let t=De(e,B(e));this.mouseStartX=t.mouseStartX,this.mouseStartY=t.mouseStartY,this.mouseStartTime=t.mouseStartTime,this.isMouseDown=t.isMouseDown};handleMouseUp=e=>{let t=window.getSelection(),n=!!(t&&t.toString().length>0),r=Oe(e,{mouseStartX:this.mouseStartX,mouseStartY:this.mouseStartY,mouseStartTime:this.mouseStartTime,isMouseDown:this.isMouseDown},B(e),n);this.isMouseDown=!1,r&&(this.showNavButtonsTemporarily(2e3),r===`next`?this.goToNextPage():this.goToPreviousPage())};handleTouchEnd=e=>{let t=je(e,{touchStartX:this.touchStartX,touchStartY:this.touchStartY,touchStartTime:this.touchStartTime},B(e));t&&(this.showNavButtonsTemporarily(2e3),t===`next`?this.goToNextPage():this.goToPreviousPage()),this.touchStartTime=0};handleTouchStart=e=>{let t=Me(e,B(e));t&&(this.touchStartX=t.touchStartX,this.touchStartY=t.touchStartY,this.touchStartTime=t.touchStartTime)};handleVisibilityChange=()=>{let e=Ne(document.hidden,this.isConnected,this.autoRefreshTimer!==null);e===`render-and-timer`?(this.renderSelectedPage(),this.setupAutoRefreshTimer()):e===`clear-timer`&&this.autoRefreshTimer!==null&&(clearInterval(this.autoRefreshTimer),this.autoRefreshTimer=null)};handleWindowFocus=()=>{Pe(document.hidden,this.isConnected)&&this.renderSelectedPage()};navigateToPage(e){this.selectedPage=e,this.showNavButtonsTemporarily(2500),this.announcePageChange(e),document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`pages`,groupId:e.groupId,path:e.path},bubbles:!0,composed:!0}))}renderPageList(e,t){let r=this.shadowRoot;if(!r)return;let a=r.querySelector(`[data-pages-status]`);a instanceof HTMLElement&&(a.textContent=e.length===1?`1 saved page`:`${e.length} saved pages`);let o=r.querySelector(`.pages__remove-all-btn`);o&&o.toggleAttribute(`disabled`,e.length===0);let s=r.querySelector(`[data-pages-dropdown-selected]`);s instanceof HTMLElement&&(this.selectedPage?s.textContent=this.selectedPage.path:s.textContent=`Select a page...`);let c=r.querySelectorAll(`[data-pages-list]`);if(c.length===0)return;c.forEach(e=>{e instanceof HTMLElement&&e.replaceChildren()});let l=r.querySelector(`[data-pages-prev]`),u=r.querySelector(`[data-pages-next]`),d=r.querySelector(`shadow-claw-page-header`),f=this.pageFrontmatter.get();if(d)if(f&&f.title)if(this.selectedPage){let e=n(i({page:`pages`,groupId:this.selectedPage.groupId,path:this.selectedPage.path})),t=e;if(typeof window<`u`&&window.location?.origin)try{t=new URL(e,window.location.origin).href}catch{}d.setAttribute(`page-title`,`<a href="${t}">${f.title}</a>`),d.setAttribute(`title`,f.title)}else d.setAttribute(`page-title`,f.title),d.setAttribute(`title`,f.title);else d.setAttribute(`page-title`,`Pages`),d.setAttribute(`title`,`Pages`);if(l instanceof HTMLButtonElement&&u instanceof HTMLButtonElement){let{isPrevDisabled:t,isNextDisabled:n}=ge(z(this.selectedPage,e),e.length);l.disabled=t,l.hidden=t,u.disabled=n,u.hidden=n}if(e.length===0)return;let p=new Map(t.map(e=>[e.groupId,e.name])),m=be(e);c.forEach(t=>{if(t instanceof HTMLElement)for(let[n,r]of m){let i=document.createElement(`details`);i.className=`pages__group-details`;let a=`shadow-claw-pages-group-collapsed-${n}`,o=!1;try{o=b(a)===`true`}catch{}o||(i.open=!0),i.addEventListener(`toggle`,()=>{try{i.open?ee(a):x(a,`true`)}catch{}});let s=document.createElement(`summary`);s.className=`pages__group-label`;let c=document.createElement(`span`);c.textContent=p.get(n)||n;let l=document.createElement(`span`);l.className=`pages__group-icon`,l.textContent=`▼`,s.appendChild(c),s.appendChild(l),i.appendChild(s);let u=document.createElement(`div`);u.className=`pages__group-pages`,r.forEach(r=>{let i=r.path,a=e.findIndex(e=>e.path===r.path&&e.groupId===r.groupId),o=document.createElement(`div`);o.className=`pages__list-item`,this.selectedPage&&R(r)===R(this.selectedPage)&&o.classList.add(`active`);let s=document.createElement(`span`);s.className=`pages__drag-handle`,s.setAttribute(`draggable`,`true`),s.title=`Drag to reorder`,s.textContent=`⠿`,s.addEventListener(`dragstart`,e=>{this.draggedPageIndex=a,o.classList.add(`dragging`),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}),o.addEventListener(`dragend`,()=>{this.draggedPageIndex=null,o.classList.remove(`dragging`)}),o.addEventListener(`dragover`,e=>{e.preventDefault(),this.draggedPageIndex!==null&&this.draggedPageIndex!==a&&o.classList.add(`drag-over`)}),o.addEventListener(`dragleave`,()=>{o.classList.remove(`drag-over`)}),o.addEventListener(`drop`,e=>{e.preventDefault(),o.classList.remove(`drag-over`),this.draggedPageIndex!==null&&this.draggedPageIndex!==a&&this.handleReorder(this.draggedPageIndex,a)});let c=E.effectiveDefaultPage,l=c&&c.path===r.path&&c.groupId===r.groupId,d=document.createElement(`button`);d.type=`button`,d.className=`pages__select`,d.title=`Open ${i}`;let f=document.createElement(`span`);f.className=`pages__list-path`,f.textContent=i,d.appendChild(f),d.addEventListener(`click`,()=>{this.selectedPage=r,this.renderPageList(E.pages,E.groups),this.renderSelectedPage(),this.sidebarOpen=!1;let e=t.closest(`details`);e&&e.removeAttribute(`open`),document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`pages`,groupId:r.groupId,path:r.path},bubbles:!0,composed:!0}))});let m=document.createElement(`button`);m.className=`pages__edit`,m.type=`button`,m.title=`Edit in file editor`,m.setAttribute(`aria-label`,`Edit ${i} in file editor`),m.textContent=`✏️`,m.addEventListener(`click`,async e=>{if(e.stopPropagation(),this.db)try{await ae.openFile(this.db,i,n)}catch(e){_(`Failed to edit file: ${e instanceof Error?e.message:String(e)}`,4500)}});let h=document.createElement(`button`);if(h.className=`pages__remove`,h.type=`button`,h.title=`Remove from Pages`,h.setAttribute(`aria-label`,`Remove ${i} from Pages in ${p.get(n)||n}`),h.textContent=`✕`,h.addEventListener(`click`,async e=>{if(e.stopPropagation(),this.db&&await G({title:`Remove Page`,message:`Are you sure you want to remove this page from Pages?\n\n${i}`,confirmLabel:`Remove`,cancelLabel:`Cancel`}))try{await E.removePage(this.db,i,n),g(`Removed ${i} from Pages`,2400)}catch(e){_(`Failed to remove page: ${e instanceof Error?e.message:String(e)}`,4500)}}),o.appendChild(s),l){let e=document.createElement(`span`);e.className=`pages__default-btn is-default`,e.title=`Default page`,e.textContent=`⭐`,o.appendChild(e)}o.appendChild(d),o.appendChild(m),o.appendChild(h),u.appendChild(o)}),i.appendChild(u),t.appendChild(i)}})}rewriteWorkspacePreviewHtml(e,r){let i=this.selectedPage?.groupId||E.activeGroupId;return N(e,r,n(t(i,r)),i,window.location.origin)}get selectedPage(){return E.activePinnedPage}set selectedPage(e){R(e)!==R(this.selectedPage)&&(this.db?E.setActivePinnedPage(this.db,e):E._activePinnedPage.set(e),e&&this.announcePageChange(e),this.renderPageList(E.pages,E.groups),this.renderSelectedPage())}setupEffects(){this.addCleanup(O(()=>{let e=C.declarativeTools;this.broadcastProxy&&e.length>0&&this.broadcastProxy.registerChannelsFromTools(e)})),this.addCleanup(O(()=>{let e=E.pages,t=E.groups;this.renderPageList(e,t)})),this.addCleanup(O(()=>{let e=E.pages,t=E.activePinnedPage;e.length===0?t!==null&&(this.selectedPage=null):(!t||!e.some(e=>R(e)===R(t)))&&(this.selectedPage=E.effectiveDefaultPage||e[0]),this.routingReady&&this.renderSelectedPage()}))}showNavButtonsTemporarily(e=2500){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.pages__viewer`);n instanceof HTMLElement&&n.classList.add(`pages__viewer--nav-visible`),this.navFadeTimer!==null&&clearTimeout(this.navFadeTimer),this.navFadeTimer=setTimeout(()=>{this.navFadeTimer=null,n instanceof HTMLElement&&n.classList.remove(`pages__viewer--nav-visible`)},e)}toggleSidebar(e){this.sidebarOpen=q({root:this.shadowRoot,currentOpen:this.sidebarOpen,force:e})}async buildHtmlPageSrcdoc(e,t,n=``){return await he({content:e,filePath:t,searchParams:n,groupId:this.selectedPage?.groupId||E.activeGroupId,origin:typeof window<`u`?window.location?.origin:``,resolveRelativeImagesInHtmlFn:(e,t,n)=>this.resolveRelativeImagesInHtml(e,t,n)})}async handleRemoveAll(){let e=this.shadowRoot?.querySelector(`.pages__remove-all-btn`);try{e?.toggleAttribute(`disabled`,!0),e&&(e.textContent=`⏳`),await _e(this.db,e=>G(e))&&g(`Removed all pages from Pages`,2400)}catch(e){_(`Failed to remove all pages: ${e instanceof Error?e.message:String(e)}`,4500),console.error(`Remove all pages error:`,e)}finally{e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`🗑️ Remove All`)}}async handleReorder(e,t){let n=await Ae({db:this.db,currentPages:E.pages,fromIndex:e,toIndex:t});n.movedToFirst&&(this.selectedPage=n.movedToFirst,this.renderSelectedPage(),document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`pages`,groupId:n.movedToFirst.groupId,path:n.movedToFirst.path},bubbles:!0,composed:!0})))}async renderSelectedPage(){let r=this.shadowRoot;if(!r)return;let i=r.querySelector(`[data-pages-empty]`),a=r.querySelector(`[data-pages-rendered]`);if(!(i instanceof HTMLElement)||!(a instanceof HTMLElement))return;let o=this.selectedPage;if(!this.db||!o){this.renderedKey=null,this.renderedContent=null,this.renderedFrontmatterToggle=null,i.hidden=!1,a.hidden=!0,a.textContent=``,this.pageFrontmatter.set(null),W(r);return}let s=++this.renderToken;try{let c;try{c=await S(this.db,o.groupId,o.path)}catch(e){try{let t=await w(o.path);if(typeof t==`string`)c=t,Promise.resolve(T(this.db,o.groupId,o.path,c)).catch(()=>{});else throw e}catch{throw e}}if(s!==this.renderToken)return;i.hidden=!0;let u=`${o.groupId}:${o.path}`;if(Fe(o.path)){let e=k(c),t=Object.keys(e.data).length>0?e.data:null,n=this.pageFrontmatter.get();if(JSON.stringify(n)!==JSON.stringify(t)&&this.pageFrontmatter.set(t),this.renderedKey===u&&this.renderedContent===c&&r.querySelector(`[data-pages-iframe]`)){this.showNavButtonsTemporarily(2500);return}this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=null,a.hidden=!0;let i=this.ensurePreviewIframe(r,a);i.hidden=!1,this.previewFrameWindow=null,l(i,await this.buildHtmlPageSrcdoc(e.content,o.path)),this.showNavButtonsTemporarily(2500);return}if(W(r),Ie(o.path)){let r=k(c),i=Object.keys(r.data).length>0?r.data:null,l=this.pageFrontmatter.get();JSON.stringify(l)!==JSON.stringify(i)&&this.pageFrontmatter.set(i);let d=await ze(this.db,e.MARKDOWN_FRONTMATTER_PAGES);if(this.renderedKey===u&&this.renderedContent===c&&this.renderedFrontmatterToggle===d&&a.children.length>0&&!a.hidden){this.showNavButtonsTemporarily(2500);return}if(!this.renderedKey&&this.dsdInitialPath&&this.dsdInitialPath===o.path&&a.children.length>0&&!a.hidden){this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=d,await this.resolveMarkdownImages(a,o.groupId,o.path),this.showNavButtonsTemporarily(2500);return}this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=d,a.hidden=!1;let f=await ie(c,{renderFrontmatter:d});if(s!==this.renderToken)return;let p=n(t(o.groupId,o.path)),m=N(f,o.path,p,o.groupId,window.location.origin);if(s!==this.renderToken)return;h(a,m,Ge),await this.resolveMarkdownImages(a,o.groupId,o.path),this.showNavButtonsTemporarily(2500);return}if(this.renderedKey===u&&this.renderedContent===c&&!a.hidden){this.showNavButtonsTemporarily(2500);return}this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=null,this.pageFrontmatter.set(null),a.hidden=!1,a.textContent=c,this.showNavButtonsTemporarily(2500)}catch(e){this.renderedKey=null,this.renderedContent=null,this.renderedFrontmatterToggle=null,i.hidden=!1,a.hidden=!0,a.textContent=``,this.pageFrontmatter.set(null),W(r);let t=e instanceof Error?e.message:String(e);_(`Failed to load page ${o.path}: ${t}`,5e3)}}async resolveMarkdownImages(e,t,n){await He({container:e,groupId:t,filePath:n,groups:Array.isArray(E.groups)?E.groups:[],readImageAsDataUrlFn:(e,t)=>Re({db:this.db,groupId:e,workspacePath:t})})}async resolveRelativeImagesInHtml(e,t,n){if(!e)return e;let r=new DOMParser().parseFromString(e,`text/html`);return await this.resolveMarkdownImages(r.body,n,t),r.body.innerHTML}async setupAutoRefreshTimer(){if(this.autoRefreshTimer!==null&&(clearInterval(this.autoRefreshTimer),this.autoRefreshTimer=null),!this.db)return;let e=await ye(this.db,c);this.autoRefreshIntervalSec=e,K(e,document.hidden,this.isConnected)&&(this.autoRefreshTimer=setInterval(()=>{K(e,document.hidden,this.isConnected)&&this.renderSelectedPage()},e*1e3))}ensurePreviewIframe(e,t){return ve({root:e,rendered:t,selectedPath:this.selectedPage?.path,onIframeLoad:e=>{this.previewFrameWindow=e,this.syncIframeTheme()}})}syncIframeTheme(){Ue(this.previewFrameWindow)}async reloadPreviewWithSearchParams(e){if(!this.selectedPage||!this.renderedContent)return;let t=this.shadowRoot,n=t?.querySelector(`#rendered`);if(!t||!n)return;let r=k(this.renderedContent),i=this.ensurePreviewIframe(t,n);i.hidden=!1,this.previewFrameWindow=null,l(i,await this.buildHtmlPageSrcdoc(r.content,this.selectedPage.path,e))}};customElements.get(Q)||customElements.define(Q,$);export{$ as ShadowClawPages};
|
|
621
|
+
`,`text/html`),X=Y.querySelector(`template`);let Z=[];Z=X?Array.from(X.content.children):Array.from(Y.head.children).concat(Array.from(Y.body.children));var We=Z;const Ge={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`]},Q=`shadow-claw-pages`;var $=class extends ne{static styles=J;static template=We;autoRefreshIntervalSec=0;autoRefreshTimer=null;broadcastProxy=null;db=null;draggedPageIndex=null;isMouseDown=!1;mouseStartTime=0;mouseStartX=0;mouseStartY=0;navFadeTimer=null;pageFrontmatter=new g.State(null);previewFrameWindow=null;renderToken=0;sidebarOpen=!1;themeObserver=null;touchStartTime=0;touchStartX=0;touchStartY=0;dsdInitialPath=null;renderedContent=null;renderedFrontmatterToggle=null;renderedKey=null;routingReady=!1;constructor(){super()}async connectedCallback(){let e=this.shadowRoot;if(!e)throw Error(`shadowRoot not found`);let t=this.closest(`shadow-claw`),n=document.documentElement.classList.contains(`sc-prerender-override`),r=t?.getAttribute(`data-prerender-no-seed`)===`true`;if(n||r){let t=e.querySelector(`[data-pages-rendered]`);t instanceof HTMLElement&&(t.hidden=!0,t.textContent=``)}else{let t=e.querySelector(`[data-pages-dropdown-selected]`)?.textContent?.trim();t&&(this.dsdInitialPath=t)}this.db=await s(),await C.whenInitialized,this.broadcastProxy=new le(()=>this.previewFrameWindow||this.shadowRoot?.querySelector(`[data-pages-iframe]`)?.contentWindow||null),window.addEventListener(`message`,this.handleIframeMessage),document.addEventListener(`visibilitychange`,this.handleVisibilityChange),window.addEventListener(`focus`,this.handleWindowFocus),window.addEventListener(`shadow-claw-pages-auto-refresh-change`,this.handleAutoRefreshConfigChange),document.addEventListener(`shadow-claw-file-saved`,this.handleFileSaved),document.addEventListener(`keydown`,this.handleKeyDown),e.addEventListener(`click`,t=>{let n=e.querySelector(`[data-pages-dropdown]`);if(n instanceof HTMLDetailsElement&&n.open){let r=t.target,i=e.querySelector(`[data-pages-sidebar-toggle]`);!n.contains(r)&&(!i||!i.contains(r))&&n.removeAttribute(`open`)}});let i=e.querySelector(`.pages__viewer`),a=e.querySelector(`.pages__viewer-scroll`),o=()=>{this.showNavButtonsTemporarily(2e3)};i instanceof HTMLElement&&(i.addEventListener(`pointermove`,o,{passive:!0}),i.addEventListener(`pointerdown`,o,{passive:!0}),i.addEventListener(`touchstart`,o,{passive:!0}),i.addEventListener(`touchstart`,this.handleTouchStart,{passive:!0}),i.addEventListener(`touchend`,this.handleTouchEnd,{passive:!0}),i.addEventListener(`mousedown`,this.handleMouseDown,{passive:!0}),i.addEventListener(`mouseup`,this.handleMouseUp,{passive:!0}),i.addEventListener(`click`,o,{passive:!0}),i.addEventListener(`focusin`,o,{passive:!0})),a instanceof HTMLElement&&a.addEventListener(`scroll`,o,{passive:!0});let c=e.querySelector(`[data-pages-sidebar-toggle]`);c&&c.addEventListener(`click`,()=>{this.toggleSidebar()});let l=e.querySelector(`.pages__remove-all-btn`);l&&l.addEventListener(`click`,()=>{this.handleRemoveAll()});let u=e.querySelector(`[data-pages-prev]`);u&&u.addEventListener(`click`,()=>{this.goToPreviousPage()});let d=e.querySelector(`[data-pages-next]`);d&&d.addEventListener(`click`,()=>{this.goToNextPage()}),this.toggleSidebar(this.sidebarOpen),this.setupEffects(),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`]}),await C.whenReady,this.routingReady=!0,this.renderSelectedPage(),this.setupAutoRefreshTimer()}disconnectedCallback(){this.renderedKey=null,this.renderedContent=null,this.renderedFrontmatterToggle=null,this.dsdInitialPath=null,this.themeObserver&&=(this.themeObserver.disconnect(),null),this.navFadeTimer!==null&&(clearTimeout(this.navFadeTimer),this.navFadeTimer=null),this.autoRefreshTimer!==null&&(clearInterval(this.autoRefreshTimer),this.autoRefreshTimer=null),window.removeEventListener(`message`,this.handleIframeMessage),document.removeEventListener(`visibilitychange`,this.handleVisibilityChange),window.removeEventListener(`focus`,this.handleWindowFocus),window.removeEventListener(`shadow-claw-pages-auto-refresh-change`,this.handleAutoRefreshConfigChange),document.removeEventListener(`shadow-claw-file-saved`,this.handleFileSaved),document.removeEventListener(`keydown`,this.handleKeyDown),this.broadcastProxy?.dispose(),this.broadcastProxy=null,this.previewFrameWindow=null,super.disconnectedCallback?.()}announcePageChange(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-pages-announcer]`);n instanceof HTMLElement&&pe(e,this.pageFrontmatter.get()?.title,n)}goToNextPage(){let e=C.pages,t=z(this.selectedPage,e);t>=0&&t<e.length-1&&this.navigateToPage(e[t+1])}goToPreviousPage(){let e=C.pages,t=z(this.selectedPage,e);t>0&&this.navigateToPage(e[t-1])}handleAnchorNavigation(e){let t=this.shadowRoot;return t?xe(e,t.querySelector(`[data-pages-rendered]`)):!1}handleAutoRefreshConfigChange=e=>{let t=Se(e);t!==null&&(this.autoRefreshIntervalSec=t),this.setupAutoRefreshTimer()};handleFileSaved=e=>{we(e,this.selectedPage)&&this.renderSelectedPage()};handleIframeMessage=e=>{let r=Le(e.data);if(!r)return;if(r.kind===`broadcast-result`){this.broadcastProxy?.handleResultFromIframe(e.source,r.channel,r.payload);return}if(r.kind===`storage-proxy`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let t=this.selectedPage?.path||`__default__`;I(e.source,r.requestId,r.method,r.args,t);return}if(r.kind===`swipe`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;this.showNavButtonsTemporarily(2e3),r.direction===`left`?this.goToNextPage():r.direction===`right`&&this.goToPreviousPage();return}if(r.kind===`iframe-resize`){let t=this.shadowRoot?.querySelector(`[data-pages-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(!this.db||r.kind!==`file-viewer-link`||this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let i=this.selectedPage?.path||``,s=this.selectedPage?.groupId||C.activeGroupId,c=n(t(s,i)),l=o(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&&(a(l.pathname)||M(r.href,i,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`))};handleKeyDown=e=>{Ee(e,this.isConnected,this.shadowRoot,e=>{this.showNavButtonsTemporarily(2e3),e===`previous`?this.goToPreviousPage():this.goToNextPage()})};handleMouseDown=e=>{let t=De(e,B(e));this.mouseStartX=t.mouseStartX,this.mouseStartY=t.mouseStartY,this.mouseStartTime=t.mouseStartTime,this.isMouseDown=t.isMouseDown};handleMouseUp=e=>{let t=window.getSelection(),n=!!(t&&t.toString().length>0),r=Oe(e,{mouseStartX:this.mouseStartX,mouseStartY:this.mouseStartY,mouseStartTime:this.mouseStartTime,isMouseDown:this.isMouseDown},B(e),n);this.isMouseDown=!1,r&&(this.showNavButtonsTemporarily(2e3),r===`next`?this.goToNextPage():this.goToPreviousPage())};handleTouchEnd=e=>{let t=je(e,{touchStartX:this.touchStartX,touchStartY:this.touchStartY,touchStartTime:this.touchStartTime},B(e));t&&(this.showNavButtonsTemporarily(2e3),t===`next`?this.goToNextPage():this.goToPreviousPage()),this.touchStartTime=0};handleTouchStart=e=>{let t=Me(e,B(e));t&&(this.touchStartX=t.touchStartX,this.touchStartY=t.touchStartY,this.touchStartTime=t.touchStartTime)};handleVisibilityChange=()=>{let e=Ne(document.hidden,this.isConnected,this.autoRefreshTimer!==null);e===`render-and-timer`?(this.renderSelectedPage(),this.setupAutoRefreshTimer()):e===`clear-timer`&&this.autoRefreshTimer!==null&&(clearInterval(this.autoRefreshTimer),this.autoRefreshTimer=null)};handleWindowFocus=()=>{Pe(document.hidden,this.isConnected)&&this.renderSelectedPage()};navigateToPage(e){this.selectedPage=e,this.showNavButtonsTemporarily(2500),this.announcePageChange(e),document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`pages`,groupId:e.groupId,path:e.path},bubbles:!0,composed:!0}))}renderPageList(e,t){let r=this.shadowRoot;if(!r)return;let a=r.querySelector(`[data-pages-status]`);a instanceof HTMLElement&&(a.textContent=e.length===1?`1 saved page`:`${e.length} saved pages`);let o=r.querySelector(`.pages__remove-all-btn`);o&&o.toggleAttribute(`disabled`,e.length===0);let s=r.querySelector(`[data-pages-dropdown-selected]`);s instanceof HTMLElement&&(this.selectedPage?s.textContent=this.selectedPage.path:s.textContent=`Select a page...`);let c=r.querySelectorAll(`[data-pages-list]`);if(c.length===0)return;c.forEach(e=>{e instanceof HTMLElement&&e.replaceChildren()});let l=r.querySelector(`[data-pages-prev]`),u=r.querySelector(`[data-pages-next]`),d=r.querySelector(`shadow-claw-page-header`),f=this.pageFrontmatter.get();if(d)if(f&&f.title)if(this.selectedPage){let e=n(i({page:`pages`,groupId:this.selectedPage.groupId,path:this.selectedPage.path})),t=e;if(typeof window<`u`&&window.location?.origin)try{t=new URL(e,window.location.origin).href}catch{}d.setAttribute(`page-title`,`<a href="${t}">${f.title}</a>`),d.setAttribute(`title`,f.title)}else d.setAttribute(`page-title`,f.title),d.setAttribute(`title`,f.title);else d.setAttribute(`page-title`,`Pages`),d.setAttribute(`title`,`Pages`);if(l instanceof HTMLButtonElement&&u instanceof HTMLButtonElement){let{isPrevDisabled:t,isNextDisabled:n}=ge(z(this.selectedPage,e),e.length);l.disabled=t,l.hidden=t,u.disabled=n,u.hidden=n}if(e.length===0)return;let p=new Map(t.map(e=>[e.groupId,e.name])),m=be(e);c.forEach(t=>{if(t instanceof HTMLElement)for(let[n,r]of m){let i=document.createElement(`details`);i.className=`pages__group-details`;let a=`shadow-claw-pages-group-collapsed-${n}`,o=!1;try{o=_(a)===`true`}catch{}o||(i.open=!0),i.addEventListener(`toggle`,()=>{try{i.open?x(a):v(a,`true`)}catch{}});let s=document.createElement(`summary`);s.className=`pages__group-label`;let c=document.createElement(`span`);c.textContent=p.get(n)||n;let l=document.createElement(`span`);l.className=`pages__group-icon`,l.textContent=`▼`,s.appendChild(c),s.appendChild(l),i.appendChild(s);let u=document.createElement(`div`);u.className=`pages__group-pages`,r.forEach(r=>{let i=r.path,a=e.findIndex(e=>e.path===r.path&&e.groupId===r.groupId),o=document.createElement(`div`);o.className=`pages__list-item`,this.selectedPage&&R(r)===R(this.selectedPage)&&o.classList.add(`active`);let s=document.createElement(`span`);s.className=`pages__drag-handle`,s.setAttribute(`draggable`,`true`),s.title=`Drag to reorder`,s.textContent=`⠿`,s.addEventListener(`dragstart`,e=>{this.draggedPageIndex=a,o.classList.add(`dragging`),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}),o.addEventListener(`dragend`,()=>{this.draggedPageIndex=null,o.classList.remove(`dragging`)}),o.addEventListener(`dragover`,e=>{e.preventDefault(),this.draggedPageIndex!==null&&this.draggedPageIndex!==a&&o.classList.add(`drag-over`)}),o.addEventListener(`dragleave`,()=>{o.classList.remove(`drag-over`)}),o.addEventListener(`drop`,e=>{e.preventDefault(),o.classList.remove(`drag-over`),this.draggedPageIndex!==null&&this.draggedPageIndex!==a&&this.handleReorder(this.draggedPageIndex,a)});let c=C.effectiveDefaultPage,l=c&&c.path===r.path&&c.groupId===r.groupId,d=document.createElement(`button`);d.type=`button`,d.className=`pages__select`,d.title=`Open ${i}`;let f=document.createElement(`span`);f.className=`pages__list-path`,f.textContent=i,d.appendChild(f),d.addEventListener(`click`,()=>{this.selectedPage=r,this.renderPageList(C.pages,C.groups),this.renderSelectedPage(),this.sidebarOpen=!1;let e=t.closest(`details`);e&&e.removeAttribute(`open`),document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`pages`,groupId:r.groupId,path:r.path},bubbles:!0,composed:!0}))});let m=document.createElement(`button`);m.className=`pages__edit`,m.type=`button`,m.title=`Edit in file editor`,m.setAttribute(`aria-label`,`Edit ${i} in file editor`),m.textContent=`✏️`,m.addEventListener(`click`,async e=>{if(e.stopPropagation(),this.db)try{await ae.openFile(this.db,i,n)}catch(e){D(`Failed to edit file: ${e instanceof Error?e.message:String(e)}`,4500)}});let h=document.createElement(`button`);if(h.className=`pages__remove`,h.type=`button`,h.title=`Remove from Pages`,h.setAttribute(`aria-label`,`Remove ${i} from Pages in ${p.get(n)||n}`),h.textContent=`✕`,h.addEventListener(`click`,async e=>{if(e.stopPropagation(),this.db&&await G({title:`Remove Page`,message:`Are you sure you want to remove this page from Pages?\n\n${i}`,confirmLabel:`Remove`,cancelLabel:`Cancel`}))try{await C.removePage(this.db,i,n),E(`Removed ${i} from Pages`,2400)}catch(e){D(`Failed to remove page: ${e instanceof Error?e.message:String(e)}`,4500)}}),o.appendChild(s),l){let e=document.createElement(`span`);e.className=`pages__default-btn is-default`,e.title=`Default page`,e.textContent=`⭐`,o.appendChild(e)}o.appendChild(d),o.appendChild(m),o.appendChild(h),u.appendChild(o)}),i.appendChild(u),t.appendChild(i)}})}rewriteWorkspacePreviewHtml(e,r){let i=this.selectedPage?.groupId||C.activeGroupId;return N(e,r,n(t(i,r)),i,window.location.origin)}get selectedPage(){return C.activePinnedPage}set selectedPage(e){R(e)!==R(this.selectedPage)&&(this.db?C.setActivePinnedPage(this.db,e):C._activePinnedPage.set(e),e&&this.announcePageChange(e),this.renderPageList(C.pages,C.groups),this.renderSelectedPage())}setupEffects(){this.addCleanup(O(()=>{let e=ee.declarativeTools;this.broadcastProxy&&e.length>0&&this.broadcastProxy.registerChannelsFromTools(e)})),this.addCleanup(O(()=>{let e=C.pages,t=C.groups;this.renderPageList(e,t)})),this.addCleanup(O(()=>{let e=C.pages,t=C.activePinnedPage;e.length===0?t!==null&&(this.selectedPage=null):(!t||!e.some(e=>R(e)===R(t)))&&(this.selectedPage=C.effectiveDefaultPage||e[0]),this.routingReady&&this.renderSelectedPage()}))}showNavButtonsTemporarily(e=2500){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.pages__viewer`);n instanceof HTMLElement&&n.classList.add(`pages__viewer--nav-visible`),this.navFadeTimer!==null&&clearTimeout(this.navFadeTimer),this.navFadeTimer=setTimeout(()=>{this.navFadeTimer=null,n instanceof HTMLElement&&n.classList.remove(`pages__viewer--nav-visible`)},e)}toggleSidebar(e){this.sidebarOpen=q({root:this.shadowRoot,currentOpen:this.sidebarOpen,force:e})}async buildHtmlPageSrcdoc(e,t,n=``){return await he({content:e,filePath:t,searchParams:n,groupId:this.selectedPage?.groupId||C.activeGroupId,origin:typeof window<`u`?window.location?.origin:``,resolveRelativeImagesInHtmlFn:(e,t,n)=>this.resolveRelativeImagesInHtml(e,t,n)})}async handleRemoveAll(){let e=this.shadowRoot?.querySelector(`.pages__remove-all-btn`);try{e?.toggleAttribute(`disabled`,!0),e&&(e.textContent=`⏳`),await _e(this.db,e=>G(e))&&E(`Removed all pages from Pages`,2400)}catch(e){D(`Failed to remove all pages: ${e instanceof Error?e.message:String(e)}`,4500),console.error(`Remove all pages error:`,e)}finally{e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`🗑️ Remove All`)}}async handleReorder(e,t){let n=await Ae({db:this.db,currentPages:C.pages,fromIndex:e,toIndex:t});n.movedToFirst&&(this.selectedPage=n.movedToFirst,this.renderSelectedPage(),document.dispatchEvent(new CustomEvent(`shadow-claw-navigate`,{detail:{page:`pages`,groupId:n.movedToFirst.groupId,path:n.movedToFirst.path},bubbles:!0,composed:!0})))}async renderSelectedPage(){let r=this.shadowRoot;if(!r)return;let i=r.querySelector(`[data-pages-empty]`),a=r.querySelector(`[data-pages-rendered]`);if(!(i instanceof HTMLElement)||!(a instanceof HTMLElement))return;let o=this.selectedPage;if(!this.db||!o){this.renderedKey=null,this.renderedContent=null,this.renderedFrontmatterToggle=null,i.hidden=!1,a.hidden=!0,a.textContent=``,this.pageFrontmatter.set(null),W(r);return}let s=++this.renderToken;try{let c;try{c=await w(this.db,o.groupId,o.path)}catch(e){try{let t=await b(o.path);if(typeof t==`string`)c=t,Promise.resolve(S(this.db,o.groupId,o.path,c)).catch(()=>{});else throw e}catch{throw e}}if(s!==this.renderToken)return;i.hidden=!0;let u=`${o.groupId}:${o.path}`;if(Fe(o.path)){let e=k(c),t=Object.keys(e.data).length>0?e.data:null,n=this.pageFrontmatter.get();if(JSON.stringify(n)!==JSON.stringify(t)&&this.pageFrontmatter.set(t),this.renderedKey===u&&this.renderedContent===c&&r.querySelector(`[data-pages-iframe]`)){this.showNavButtonsTemporarily(2500);return}this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=null,a.hidden=!0;let i=this.ensurePreviewIframe(r,a);i.hidden=!1,this.previewFrameWindow=null,l(i,await this.buildHtmlPageSrcdoc(e.content,o.path)),this.showNavButtonsTemporarily(2500);return}if(W(r),Ie(o.path)){let r=k(c),i=Object.keys(r.data).length>0?r.data:null,l=this.pageFrontmatter.get();JSON.stringify(l)!==JSON.stringify(i)&&this.pageFrontmatter.set(i);let d=await ze(this.db,e.MARKDOWN_FRONTMATTER_PAGES);if(this.renderedKey===u&&this.renderedContent===c&&this.renderedFrontmatterToggle===d&&a.children.length>0&&!a.hidden){this.showNavButtonsTemporarily(2500);return}if(!this.renderedKey&&this.dsdInitialPath&&this.dsdInitialPath===o.path&&a.children.length>0&&!a.hidden){this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=d,await this.resolveMarkdownImages(a,o.groupId,o.path),this.showNavButtonsTemporarily(2500);return}this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=d,a.hidden=!1;let f=await ie(c,{renderFrontmatter:d});if(s!==this.renderToken)return;let p=n(t(o.groupId,o.path)),m=N(f,o.path,p,o.groupId,window.location.origin);if(s!==this.renderToken)return;h(a,m,Ge),await this.resolveMarkdownImages(a,o.groupId,o.path),this.showNavButtonsTemporarily(2500);return}if(this.renderedKey===u&&this.renderedContent===c&&!a.hidden){this.showNavButtonsTemporarily(2500);return}this.renderedKey=u,this.renderedContent=c,this.renderedFrontmatterToggle=null,this.pageFrontmatter.set(null),a.hidden=!1,a.textContent=c,this.showNavButtonsTemporarily(2500)}catch(e){this.renderedKey=null,this.renderedContent=null,this.renderedFrontmatterToggle=null,i.hidden=!1,a.hidden=!0,a.textContent=``,this.pageFrontmatter.set(null),W(r);let t=e instanceof Error?e.message:String(e);D(`Failed to load page ${o.path}: ${t}`,5e3)}}async resolveMarkdownImages(e,t,n){await He({container:e,groupId:t,filePath:n,groups:Array.isArray(C.groups)?C.groups:[],readImageAsDataUrlFn:(e,t)=>Re({db:this.db,groupId:e,workspacePath:t})})}async resolveRelativeImagesInHtml(e,t,n){if(!e)return e;let r=new DOMParser().parseFromString(e,`text/html`);return await this.resolveMarkdownImages(r.body,n,t),r.body.innerHTML}async setupAutoRefreshTimer(){if(this.autoRefreshTimer!==null&&(clearInterval(this.autoRefreshTimer),this.autoRefreshTimer=null),!this.db)return;let e=await ye(this.db,c);this.autoRefreshIntervalSec=e,K(e,document.hidden,this.isConnected)&&(this.autoRefreshTimer=setInterval(()=>{K(e,document.hidden,this.isConnected)&&this.renderSelectedPage()},e*1e3))}ensurePreviewIframe(e,t){return ve({root:e,rendered:t,selectedPath:this.selectedPage?.path,onIframeLoad:e=>{this.previewFrameWindow=e,this.syncIframeTheme()}})}syncIframeTheme(){Ue(this.previewFrameWindow)}async reloadPreviewWithSearchParams(e){if(!this.selectedPage||!this.renderedContent)return;let t=this.shadowRoot,n=t?.querySelector(`#rendered`);if(!t||!n)return;let r=k(this.renderedContent),i=this.ensurePreviewIframe(t,n);i.hidden=!1,this.previewFrameWindow=null,l(i,await this.buildHtmlPageSrcdoc(r.content,this.selectedPage.path,e))}};customElements.get(Q)||customElements.define(Q,$);export{$ as ShadowClawPages};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b.js";import{h as n}from"./custom-element-security-
|
|
1
|
+
import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b.js";import{h as n}from"./custom-element-security-FU04Cq05.js";import{Z as r,a as i,c as a,ln as o,t as s}from"./orchestrator-DHjdLtqa.js";import{n as c,r as l}from"./crypto-C8c5wMzN.js";import{a as u,i as d,r as f}from"./toast-BXgUfbyh.js";import{t as p}from"./shadow-claw-element-DIrv3P6A.js";import{t as m}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-BccSHItx.js";import"./shadow-claw-dialog-BrOwAOdk.js";function h(e){try{return JSON.parse(JSON.stringify(e))}catch{return null}}async function g(t,n){let r=[],i=[];for(let a of t){let t=a.key;if(t===e.STORAGE_HANDLE)continue;if(t===e.GIT_PASSWORD||t===e.API_KEY||t.startsWith(`api_key:`)||t===e.IMESSAGE_API_KEY||t===e.TELEGRAM_BOT_TOKEN){if(n&&typeof a.value==`string`){let e=await c(a.value);e&&i.push({key:t,path:[],value:e})}continue}let o=h(a.value);if(t===e.GIT_ACCOUNTS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e];if(!r||typeof r!=`object`)continue;let a=r.password;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`password`],value:n})}delete r.password}}if(t===e.INTEGRATION_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedSecret;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedSecret`],value:n})}delete r.encryptedSecret}}if(t===e.REMOTE_MCP_CONNECTIONS&&Array.isArray(o))for(let e=0;e<o.length;e+=1){let r=o[e]?.credentialRef,a=r?.encryptedValue;if(typeof a==`string`&&a){if(n){let n=await c(a);n&&i.push({key:t,path:[e,`credentialRef`,`encryptedValue`],value:n})}delete r.encryptedValue}}r.push({key:t,value:o})}return{configEntries:r,plaintextPasswords:i}}function _(e,t,n){if(t.length===0)return n;let r=e;for(let n=0;n<t.length-1;n+=1){let i=t[n];if(typeof i==`number`){if(!Array.isArray(r)||!r[i])return e;r=r[i]}else{if(!r||typeof r!=`object`)return e;let t=r[i];if(!t||typeof t!=`object`)return e;r=t}}let i=t[t.length-1];if(typeof i==`number`){if(!Array.isArray(r))return e;r[i]=n}else{if(!r||typeof r!=`object`)return e;r[i]=n}return e}async function v(e,t){let n=await g(e,t);return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:Date.now(),includePlaintextPasswords:t,configEntries:n.configEntries,plaintextPasswords:t?n.plaintextPasswords:void 0}}async function y(e,t){let n=await v(e,t);return new Blob([JSON.stringify(n,null,2)],{type:`application/json`})}async function b(e,t,n){let r=await v(t,n);await o(e,JSON.stringify(r,null,2))}async function x(e,t){if(!t.length)return e;let n=e.map(e=>({key:e.key,value:h(e.value)}));for(let e of t){let t=await l(e.value);if(!t)continue;let r=n.find(t=>t.key===e.key);r?r.value=_(r.value,e.path,t):e.path.length===0&&n.push({key:e.key,value:t})}return n}function S(e){let t=JSON.parse(e);if(t?.kind!==`shadowclaw-settings-backup`||t.version!==1||!Array.isArray(t.configEntries))throw Error(`Invalid settings backup file`);let n=Array.isArray(t.plaintextPasswords)?t.plaintextPasswords.filter(e=>e&&typeof e.key==`string`&&Array.isArray(e.path)&&typeof e.value==`string`):[];return{kind:`shadowclaw-settings-backup`,version:1,exportedAt:typeof t.exportedAt==`number`?t.exportedAt:Date.now(),includePlaintextPasswords:!!t.includePlaintextPasswords,configEntries:t.configEntries.filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})),plaintextPasswords:n}}const C=new CSSStyleSheet;C.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
font-family: var(--shadow-claw-font-sans);
|
|
@@ -885,7 +885,7 @@ import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b
|
|
|
885
885
|
</div>
|
|
886
886
|
</div>
|
|
887
887
|
</template>
|
|
888
|
-
`,`text/html`),T=w.querySelector(`template`);let E=[];E=T?Array.from(T.content.children):Array.from(w.head.children).concat(Array.from(w.body.children));var D=E;const O={ai:[()=>import(`./shadow-claw-llm-R8j0lwPP.js`)],environment:[()=>import(`./shadow-claw-networking-DLEd9cNm.js`),()=>import(`./shadow-claw-webvm-qR9X7fg7.js`),()=>import(`./shadow-claw-storage-C-mWQQML.js`)],integrations:[()=>import(`./shadow-claw-git-MAjhXRLc.js`),()=>import(`./shadow-claw-accounts-CJvYC4li.js`),()=>import(`./shadow-claw-mcp-remote-BzZoz4LX.js`),()=>import(`./shadow-claw-control-plane-D1OwlQI_.js`),()=>import(`./shadow-claw-integrations-82UoFuDR.js`),()=>import(`./shadow-claw-task-server-D3lHp0Nc.js`),()=>import(`./shadow-claw-notifications-1vwR7TbT.js`)]},k=new Set;async function A(e){if(k.has(e))return;let t=O[e];t&&(k.add(e),await Promise.all(t.map(e=>e())))}const j=`shadow-claw-settings`;var M=class extends p{static styles=C;static template=D;activeTab=`ai`;db=null;orchestrator=null;pendingRestoreFile=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=u.orchestrator,await this.render()}activateTab(e){!e||this.activeTab===e||(this.activeTab=e,this.applyTabState())}applyTabState(){A(this.activeTab).catch(console.error);let e=this.shadowRoot;e&&(e.querySelectorAll(`[data-tab-target]`).forEach(e=>{let t=e.dataset.tabTarget===this.activeTab;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1}),e.querySelectorAll(`[data-tab-panel]`).forEach(e=>{e.hidden=e.dataset.tabPanel!==this.activeTab}))}bindSettingsActions(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="backup-settings"]`)?.addEventListener(`click`,()=>this.openBackupDialog());let t=e.querySelector(`.settings__restore-input`);e.querySelector(`[data-action="restore-settings"]`)?.addEventListener(`click`,()=>{t instanceof HTMLInputElement&&(t.value=``,t.click())}),t?.addEventListener(`change`,e=>{let t=e.target;if(!(t instanceof HTMLInputElement))return;let n=t.files?.[0]||null;n&&(this.pendingRestoreFile=n,this.openRestoreDialog(n.name))}),e.querySelector(`[data-action="clear-settings"]`)?.addEventListener(`click`,()=>this.openClearDialog()),e.querySelector(`[data-action="cancel-backup-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__backup-dialog`)),e.querySelector(`[data-action="confirm-backup-settings"]`)?.addEventListener(`click`,()=>{this.confirmBackup()}),e.querySelector(`[data-action="cancel-restore-settings"]`)?.addEventListener(`click`,()=>{this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`)}),e.querySelector(`[data-action="confirm-restore-settings"]`)?.addEventListener(`click`,()=>{this.confirmRestore()}),e.querySelector(`[data-action="cancel-clear-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__clear-dialog`)),e.querySelector(`[data-action="confirm-clear-settings"]`)?.addEventListener(`click`,()=>{this.confirmClear()}),e.querySelector(`[data-action="save-assistant-name"]`)?.addEventListener(`click`,()=>this.saveAssistantName()),e.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onActivityLogDiskLoggingToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHidePagesToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideChatToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideTasksToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-files-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideFilesToggle(t.checked)}),e.querySelector(`[data-setting="chat-split-view-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onChatSplitViewToggle(t.checked)}),e.querySelector(`[data-setting="pages-auto-refresh-input"]`)?.addEventListener(`change`,e=>{let t=e.target;if(t){let e=parseInt(t.value,10);this.onPagesAutoRefreshInputChange(isNaN(e)?0:e)}}),e.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onOverridePrerenderSkeletonToggle(t.checked)}),e.querySelector(`[data-action="save-dom-allowed-iframe-hosts"]`)?.addEventListener(`click`,()=>{this.saveDomAllowedIframeHosts()})}closeDialog(e){this.getDialog(e)?.close()}getDialog(e){let t=this.shadowRoot;if(!t)return null;let n=t.querySelector(e);return n instanceof HTMLDialogElement?n:null}handleTabKeydown(e,t){let n=this.shadowRoot;if(!n)return;let r=Array.from(n.querySelectorAll(`[data-tab-target]`)),i=r.indexOf(t);if(i<0)return;let a=-1;switch(e.key){case`ArrowRight`:case`ArrowDown`:a=(i+1)%r.length;break;case`ArrowLeft`:case`ArrowUp`:a=(i-1+r.length)%r.length;break;case`Home`:a=0;break;case`End`:a=r.length-1;break;default:return}e.preventDefault();let o=r[a];o.focus(),this.activateTab(o.dataset.tabTarget)}openBackupDialog(){let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`);e instanceof HTMLInputElement&&(e.checked=!1),this.showDialog(`.settings__backup-dialog`)}openClearDialog(){this.showDialog(`.settings__clear-dialog`)}openRestoreDialog(e){let t=this.shadowRoot?.querySelector(`[data-info="restore-filename"]`);t instanceof HTMLElement&&(t.textContent=`Selected file: ${e}`),this.showDialog(`.settings__restore-dialog`)}showDialog(e){let t=this.getDialog(e);if(t){if(typeof t.showModal==`function`){t.showModal();return}t.setAttribute(`open`,``)}}async confirmBackup(){if(!this.db){a(`Settings database is unavailable`,5e3);return}let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`),t=e instanceof HTMLInputElement&&e.checked;try{if(t){let e=await this.promptForPlaintextBackupHandle();if(!e)return;await b(e,await this.getAllConfigEntries(),t),this.closeDialog(`.settings__backup-dialog`),r(`Settings backup saved`,3e3);return}let e=await y(await this.getAllConfigEntries(),t),n=URL.createObjectURL(e),i=document.createElement(`a`);i.href=n,i.download=`shadowclaw-settings-backup-${Date.now()}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(n),this.closeDialog(`.settings__backup-dialog`),r(`Settings backup downloaded`,3e3)}catch(e){a(`Failed to backup settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmClear(){if(!this.db){a(`Settings database is unavailable`,5e3);return}try{await this.replaceConfigEntries([]),this.closeDialog(`.settings__clear-dialog`),i(`Settings cleared. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){a(`Failed to clear settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmRestore(){if(!this.db){a(`Settings database is unavailable`,5e3);return}let e=this.pendingRestoreFile;if(!e){a(`No backup file selected`,4e3);return}try{let t=S(await e.text()),n=await x(t.configEntries,t.plaintextPasswords||[]);await this.replaceConfigEntries(n),this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`),r(`Settings restored. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){a(`Failed to restore settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async getAllConfigEntries(){if(!this.db)throw Error(`Database is unavailable`);return await new Promise((e,t)=>{try{let n=this.db?.transaction(`config`,`readonly`);if(!n){t(Error(`Failed to open read transaction`));return}let r=n.objectStore(`config`).getAll();r.onsuccess=()=>{e((Array.isArray(r.result)?r.result:[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})))},r.onerror=()=>{t(r.error||Error(`Failed to read settings config`))}}catch(e){t(e)}})}async onActivityLogDiskLoggingToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED,t?`true`:`false`),r(t?`Activity log disk logging enabled`:`Activity log disk logging disabled`,2500)}catch(e){a(`Error saving activity log disk logging setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onChatSplitViewToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.CHAT_SPLIT_VIEW_ENABLED,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`chat-split-view-change`,{detail:{enabled:t},bubbles:!0,composed:!0})),r(t?`Horizontal Chat split view enabled`:`Horizontal Chat split view disabled`,2500)}catch(e){a(`Error saving Chat split view setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onOverridePrerenderSkeletonToggle(t){try{c(`shadow-claw-override-prerender-skeleton`,t?`true`:`false`)}catch(e){console.warn(`Unable to save setting to localStorage:`,e)}if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.OVERRIDE_PRERENDER_SKELETON,t?`true`:`false`),r(t?`Pre-rendered content override enabled`:`Pre-rendered content override disabled`,2500)}catch(e){a(`Error saving pre-rendered content override setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onPagesAutoRefreshInputChange(t){if(!this.db)return;let n=Math.max(0,Math.min(t,86400));try{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await t(this.db,e.PAGES_AUTO_REFRESH_INTERVAL,String(n)),window.dispatchEvent(new CustomEvent(`shadow-claw-pages-auto-refresh-change`,{detail:{interval:n}})),r(n>0?`Pages auto refresh set to ${n}s`:`Pages auto refresh disabled`,2500)}catch(e){a(`Error saving Pages auto refresh interval: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideChatToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_CHAT_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-chat-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),r(t?`Chat hidden in sidebar`:`Chat shown in sidebar`,2500)}catch(e){a(`Error saving sidebar Chat visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideFilesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_FILES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-files-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),r(t?`Files hidden in sidebar`:`Files shown in sidebar`,2500)}catch(e){a(`Error saving sidebar Files visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHidePagesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_PAGES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-pages-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),r(t?`Pages hidden in sidebar`:`Pages shown in sidebar`,2500)}catch(e){a(`Error saving sidebar Pages visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideTasksToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_TASKS_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-tasks-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),r(t?`Tasks hidden in sidebar`:`Tasks shown in sidebar`,2500)}catch(e){a(`Error saving sidebar Tasks visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async populateAssistantSettings(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(n){let{getConfig:t}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),r=await t(this.db,e.ASSISTANT_NAME),i=this.orchestrator?.assistantName||u.orchestrator?.assistantName;n.value=typeof r==`string`&&r||i||`ShadowClaw`}let{getConfig:r}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),i=await r(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED),a=i===!0||i===`true`||i===1||i===`1`,o=t.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`);o&&(o.checked=a);let l=await r(this.db,e.SIDEBAR_PAGES_HIDDEN),d=l===!0||l===`true`||l===1||l===`1`,f=t.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`);f&&(f.checked=d);let p=await r(this.db,e.SIDEBAR_CHAT_HIDDEN),h=p===!0||p===`true`||p===1||p===`1`,g=t.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`);g&&(g.checked=h);let _=await r(this.db,e.SIDEBAR_TASKS_HIDDEN),v=_===!0||_===`true`||_===1||_===`1`,y=t.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`);y&&(y.checked=v);let b=await r(this.db,e.SIDEBAR_FILES_HIDDEN),x=b===!0||b===`true`||b===1||b===`1`,S=t.querySelector(`[data-setting="sidebar-hide-files-toggle"]`);S&&(S.checked=x);let C=m(await r(this.db,e.CHAT_SPLIT_VIEW_ENABLED),!1),w=t.querySelector(`[data-setting="chat-split-view-toggle"]`);w&&(w.checked=C);let T=t.querySelector(`[data-setting="pages-auto-refresh-input"]`);if(T){let t=await r(this.db,e.PAGES_AUTO_REFRESH_INTERVAL);if(typeof t==`string`||typeof t==`number`){let e=parseInt(String(t),10);T.value=!isNaN(e)&&e>=0?String(e):`0`}else T.value=`0`}let E=await r(this.db,e.OVERRIDE_PRERENDER_SKELETON),D=null;try{D=s(`shadow-claw-override-prerender-skeleton`)}catch{}let O=!0;if(E==null?D!==null&&(O=D===`true`):O=m(E),O)try{c(`shadow-claw-override-prerender-skeleton`,`true`)}catch{}let k=t.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`);k&&(k.checked=O);let A=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(A){let t=await r(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS);if(typeof t==`string`&&t.trim().length>0){A.value=t;let{setAllowedIframeHostPatterns:e}=await import(`./iframe-sanitizer-y2Z1pPwY.js`).then(e=>e.r);e(t)}else{let{DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS:e}=await import(`./iframe-sanitizer-y2Z1pPwY.js`).then(e=>e.r);A.value=e.join(`
|
|
889
|
-
`)}}let j=t.querySelector(`[data-setting="markdown-frontmatter-pages-toggle"]`);j&&(j.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_PAGES),!0));let M=t.querySelector(`[data-setting="markdown-frontmatter-file-viewer-toggle"]`);M&&(M.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),!0));let N=t.querySelector(`[data-setting="markdown-frontmatter-chat-toggle"]`);N&&(N.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_CHAT),!0));let P=t.querySelector(`[data-setting="markdown-frontmatter-tasks-toggle"]`);P&&(P.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_TASKS),!0))}async promptForPlaintextBackupHandle(){let e=Reflect.get(globalThis,`showSaveFilePicker`),t=typeof e==`function`?e.bind(globalThis):null;if(!t)throw Error(`Plaintext settings backup requires the File System Access API.`);try{return await t({id:`shadowclaw-settings-backup`,suggestedName:`shadowclaw-settings-backup-${n()}.json`,types:[{description:`JSON Files`,accept:{"application/json":[`.json`]}}]})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return null;throw e}}async render(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="show-channels-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`channels`},bubbles:!0,composed:!0}))}),e.querySelector(`[data-action="show-tools-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`tools`},bubbles:!0,composed:!0}))}),e.querySelectorAll(`[data-tab-target]`).forEach(e=>{e.addEventListener(`click`,()=>{this.activateTab(e.dataset.tabTarget)}),e.addEventListener(`keydown`,t=>{this.handleTabKeydown(t,e)})}),this.applyTabState(),this.bindSettingsActions();let t=e.querySelector(`[data-info="deployed-revision"]`);t&&(t.textContent=`Deployed revision: ${document.querySelector(`meta[name="revision"]`)?.getAttribute(`content`)?.trim()||`unknown`}`),await this.populateAssistantSettings()}async replaceConfigEntries(e){if(!this.db)throw Error(`Database is unavailable`);await new Promise((t,n)=>{try{let r=this.db?.transaction(`config`,`readwrite`);if(!r){n(Error(`Failed to open write transaction`));return}let i=r.objectStore(`config`);i.clear();for(let t of e)i.put({key:t.key,value:t.value});r.oncomplete=()=>t(),r.onerror=()=>n(r.error||Error(`Failed to update config`)),r.onabort=()=>n(r.error||Error(`Config update aborted`))}catch(e){n(e)}})}async saveAssistantName(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(!n)return;let i=n.value.trim();if(!i){let{showWarning:e}=await import(`./toast-
|
|
890
|
-
`).map(e=>e.trim()).filter(e=>e.length>0),
|
|
891
|
-
`);await t(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS,n),await t(this.db,e.MARKDOWN_FRONTMATTER_PAGES,String(
|
|
888
|
+
`,`text/html`),T=w.querySelector(`template`);let E=[];E=T?Array.from(T.content.children):Array.from(w.head.children).concat(Array.from(w.body.children));var D=E;const O={ai:[()=>import(`./shadow-claw-llm-DMvLgKXo.js`)],environment:[()=>import(`./shadow-claw-networking-Dd8Rw31D.js`),()=>import(`./shadow-claw-webvm-CP6oFjg5.js`),()=>import(`./shadow-claw-storage-CfEXoSIE.js`)],integrations:[()=>import(`./shadow-claw-git-DBRPZNav.js`),()=>import(`./shadow-claw-accounts-xUOLBsQZ.js`),()=>import(`./shadow-claw-mcp-remote-Bkx0gsmF.js`),()=>import(`./shadow-claw-control-plane-DHvN3Ukg.js`),()=>import(`./shadow-claw-integrations-BBVnO0Fc.js`),()=>import(`./shadow-claw-task-server-DxQSsgRZ.js`),()=>import(`./shadow-claw-notifications-Dbevj-lq.js`)]},k=new Set;async function A(e){if(k.has(e))return;let t=O[e];t&&(k.add(e),await Promise.all(t.map(e=>e())))}const j=`shadow-claw-settings`;var M=class extends p{static styles=C;static template=D;activeTab=`ai`;db=null;orchestrator=null;pendingRestoreFile=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=s.orchestrator,await this.render()}activateTab(e){!e||this.activeTab===e||(this.activeTab=e,this.applyTabState())}applyTabState(){A(this.activeTab).catch(console.error);let e=this.shadowRoot;e&&(e.querySelectorAll(`[data-tab-target]`).forEach(e=>{let t=e.dataset.tabTarget===this.activeTab;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1}),e.querySelectorAll(`[data-tab-panel]`).forEach(e=>{e.hidden=e.dataset.tabPanel!==this.activeTab}))}bindSettingsActions(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="backup-settings"]`)?.addEventListener(`click`,()=>this.openBackupDialog());let t=e.querySelector(`.settings__restore-input`);e.querySelector(`[data-action="restore-settings"]`)?.addEventListener(`click`,()=>{t instanceof HTMLInputElement&&(t.value=``,t.click())}),t?.addEventListener(`change`,e=>{let t=e.target;if(!(t instanceof HTMLInputElement))return;let n=t.files?.[0]||null;n&&(this.pendingRestoreFile=n,this.openRestoreDialog(n.name))}),e.querySelector(`[data-action="clear-settings"]`)?.addEventListener(`click`,()=>this.openClearDialog()),e.querySelector(`[data-action="cancel-backup-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__backup-dialog`)),e.querySelector(`[data-action="confirm-backup-settings"]`)?.addEventListener(`click`,()=>{this.confirmBackup()}),e.querySelector(`[data-action="cancel-restore-settings"]`)?.addEventListener(`click`,()=>{this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`)}),e.querySelector(`[data-action="confirm-restore-settings"]`)?.addEventListener(`click`,()=>{this.confirmRestore()}),e.querySelector(`[data-action="cancel-clear-settings"]`)?.addEventListener(`click`,()=>this.closeDialog(`.settings__clear-dialog`)),e.querySelector(`[data-action="confirm-clear-settings"]`)?.addEventListener(`click`,()=>{this.confirmClear()}),e.querySelector(`[data-action="save-assistant-name"]`)?.addEventListener(`click`,()=>this.saveAssistantName()),e.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onActivityLogDiskLoggingToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHidePagesToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideChatToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideTasksToggle(t.checked)}),e.querySelector(`[data-setting="sidebar-hide-files-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onSidebarHideFilesToggle(t.checked)}),e.querySelector(`[data-setting="chat-split-view-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onChatSplitViewToggle(t.checked)}),e.querySelector(`[data-setting="pages-auto-refresh-input"]`)?.addEventListener(`change`,e=>{let t=e.target;if(t){let e=parseInt(t.value,10);this.onPagesAutoRefreshInputChange(isNaN(e)?0:e)}}),e.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onOverridePrerenderSkeletonToggle(t.checked)}),e.querySelector(`[data-action="save-dom-allowed-iframe-hosts"]`)?.addEventListener(`click`,()=>{this.saveDomAllowedIframeHosts()})}closeDialog(e){this.getDialog(e)?.close()}getDialog(e){let t=this.shadowRoot;if(!t)return null;let n=t.querySelector(e);return n instanceof HTMLDialogElement?n:null}handleTabKeydown(e,t){let n=this.shadowRoot;if(!n)return;let r=Array.from(n.querySelectorAll(`[data-tab-target]`)),i=r.indexOf(t);if(i<0)return;let a=-1;switch(e.key){case`ArrowRight`:case`ArrowDown`:a=(i+1)%r.length;break;case`ArrowLeft`:case`ArrowUp`:a=(i-1+r.length)%r.length;break;case`Home`:a=0;break;case`End`:a=r.length-1;break;default:return}e.preventDefault();let o=r[a];o.focus(),this.activateTab(o.dataset.tabTarget)}openBackupDialog(){let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`);e instanceof HTMLInputElement&&(e.checked=!1),this.showDialog(`.settings__backup-dialog`)}openClearDialog(){this.showDialog(`.settings__clear-dialog`)}openRestoreDialog(e){let t=this.shadowRoot?.querySelector(`[data-info="restore-filename"]`);t instanceof HTMLElement&&(t.textContent=`Selected file: ${e}`),this.showDialog(`.settings__restore-dialog`)}showDialog(e){let t=this.getDialog(e);if(t){if(typeof t.showModal==`function`){t.showModal();return}t.setAttribute(`open`,``)}}async confirmBackup(){if(!this.db){f(`Settings database is unavailable`,5e3);return}let e=this.shadowRoot?.querySelector(`[data-setting="include-plaintext-passwords"]`),t=e instanceof HTMLInputElement&&e.checked;try{if(t){let e=await this.promptForPlaintextBackupHandle();if(!e)return;await b(e,await this.getAllConfigEntries(),t),this.closeDialog(`.settings__backup-dialog`),u(`Settings backup saved`,3e3);return}let e=await y(await this.getAllConfigEntries(),t),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`shadowclaw-settings-backup-${Date.now()}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n),this.closeDialog(`.settings__backup-dialog`),u(`Settings backup downloaded`,3e3)}catch(e){f(`Failed to backup settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmClear(){if(!this.db){f(`Settings database is unavailable`,5e3);return}try{await this.replaceConfigEntries([]),this.closeDialog(`.settings__clear-dialog`),d(`Settings cleared. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){f(`Failed to clear settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async confirmRestore(){if(!this.db){f(`Settings database is unavailable`,5e3);return}let e=this.pendingRestoreFile;if(!e){f(`No backup file selected`,4e3);return}try{let t=S(await e.text()),n=await x(t.configEntries,t.plaintextPasswords||[]);await this.replaceConfigEntries(n),this.pendingRestoreFile=null,this.closeDialog(`.settings__restore-dialog`),u(`Settings restored. Reloading app...`,3200),setTimeout(()=>{window.location.reload()},250)}catch(e){f(`Failed to restore settings: ${e instanceof Error?e.message:String(e)}`,6e3)}}async getAllConfigEntries(){if(!this.db)throw Error(`Database is unavailable`);return await new Promise((e,t)=>{try{let n=this.db?.transaction(`config`,`readonly`);if(!n){t(Error(`Failed to open read transaction`));return}let r=n.objectStore(`config`).getAll();r.onsuccess=()=>{e((Array.isArray(r.result)?r.result:[]).filter(e=>e&&typeof e.key==`string`).map(e=>({key:e.key,value:e.value})))},r.onerror=()=>{t(r.error||Error(`Failed to read settings config`))}}catch(e){t(e)}})}async onActivityLogDiskLoggingToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED,t?`true`:`false`),u(t?`Activity log disk logging enabled`:`Activity log disk logging disabled`,2500)}catch(e){f(`Error saving activity log disk logging setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onChatSplitViewToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.CHAT_SPLIT_VIEW_ENABLED,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`chat-split-view-change`,{detail:{enabled:t},bubbles:!0,composed:!0})),u(t?`Horizontal Chat split view enabled`:`Horizontal Chat split view disabled`,2500)}catch(e){f(`Error saving Chat split view setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onOverridePrerenderSkeletonToggle(t){try{a(`shadow-claw-override-prerender-skeleton`,t?`true`:`false`)}catch(e){console.warn(`Unable to save setting to localStorage:`,e)}if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.OVERRIDE_PRERENDER_SKELETON,t?`true`:`false`),u(t?`Pre-rendered content override enabled`:`Pre-rendered content override disabled`,2500)}catch(e){f(`Error saving pre-rendered content override setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async onPagesAutoRefreshInputChange(t){if(!this.db)return;let n=Math.max(0,Math.min(t,86400));try{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await t(this.db,e.PAGES_AUTO_REFRESH_INTERVAL,String(n)),window.dispatchEvent(new CustomEvent(`shadow-claw-pages-auto-refresh-change`,{detail:{interval:n}})),u(n>0?`Pages auto refresh set to ${n}s`:`Pages auto refresh disabled`,2500)}catch(e){f(`Error saving Pages auto refresh interval: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideChatToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_CHAT_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-chat-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),u(t?`Chat hidden in sidebar`:`Chat shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Chat visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideFilesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_FILES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-files-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),u(t?`Files hidden in sidebar`:`Files shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Files visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHidePagesToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_PAGES_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-pages-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),u(t?`Pages hidden in sidebar`:`Pages shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Pages visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async onSidebarHideTasksToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.SIDEBAR_TASKS_HIDDEN,t?`true`:`false`),this.dispatchEvent(new CustomEvent(`sidebar-tasks-visibility-change`,{detail:{hidden:t},bubbles:!0,composed:!0})),u(t?`Tasks hidden in sidebar`:`Tasks shown in sidebar`,2500)}catch(e){f(`Error saving sidebar Tasks visibility: `+(e instanceof Error?e.message:String(e)),6e3)}}async populateAssistantSettings(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(n){let{getConfig:t}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),r=await t(this.db,e.ASSISTANT_NAME),i=this.orchestrator?.assistantName||s.orchestrator?.assistantName;n.value=typeof r==`string`&&r||i||`ShadowClaw`}let{getConfig:r}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),o=await r(this.db,e.ACTIVITY_LOG_DISK_LOGGING_ENABLED),c=o===!0||o===`true`||o===1||o===`1`,l=t.querySelector(`[data-setting="activity-log-disk-logging-toggle"]`);l&&(l.checked=c);let u=await r(this.db,e.SIDEBAR_PAGES_HIDDEN),d=u===!0||u===`true`||u===1||u===`1`,f=t.querySelector(`[data-setting="sidebar-hide-pages-toggle"]`);f&&(f.checked=d);let p=await r(this.db,e.SIDEBAR_CHAT_HIDDEN),h=p===!0||p===`true`||p===1||p===`1`,g=t.querySelector(`[data-setting="sidebar-hide-chat-toggle"]`);g&&(g.checked=h);let _=await r(this.db,e.SIDEBAR_TASKS_HIDDEN),v=_===!0||_===`true`||_===1||_===`1`,y=t.querySelector(`[data-setting="sidebar-hide-tasks-toggle"]`);y&&(y.checked=v);let b=await r(this.db,e.SIDEBAR_FILES_HIDDEN),x=b===!0||b===`true`||b===1||b===`1`,S=t.querySelector(`[data-setting="sidebar-hide-files-toggle"]`);S&&(S.checked=x);let C=m(await r(this.db,e.CHAT_SPLIT_VIEW_ENABLED),!1),w=t.querySelector(`[data-setting="chat-split-view-toggle"]`);w&&(w.checked=C);let T=t.querySelector(`[data-setting="pages-auto-refresh-input"]`);if(T){let t=await r(this.db,e.PAGES_AUTO_REFRESH_INTERVAL);if(typeof t==`string`||typeof t==`number`){let e=parseInt(String(t),10);T.value=!isNaN(e)&&e>=0?String(e):`0`}else T.value=`0`}let E=await r(this.db,e.OVERRIDE_PRERENDER_SKELETON),D=null;try{D=i(`shadow-claw-override-prerender-skeleton`)}catch{}let O=!0;if(E==null?D!==null&&(O=D===`true`):O=m(E),O)try{a(`shadow-claw-override-prerender-skeleton`,`true`)}catch{}let k=t.querySelector(`[data-setting="override-prerender-skeleton-toggle"]`);k&&(k.checked=O);let A=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(A){let t=await r(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS);if(typeof t==`string`&&t.trim().length>0){A.value=t;let{setAllowedIframeHostPatterns:e}=await import(`./iframe-sanitizer-y2Z1pPwY.js`).then(e=>e.r);e(t)}else{let{DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS:e}=await import(`./iframe-sanitizer-y2Z1pPwY.js`).then(e=>e.r);A.value=e.join(`
|
|
889
|
+
`)}}let j=t.querySelector(`[data-setting="markdown-frontmatter-pages-toggle"]`);j&&(j.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_PAGES),!0));let M=t.querySelector(`[data-setting="markdown-frontmatter-file-viewer-toggle"]`);M&&(M.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),!0));let N=t.querySelector(`[data-setting="markdown-frontmatter-chat-toggle"]`);N&&(N.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_CHAT),!0));let P=t.querySelector(`[data-setting="markdown-frontmatter-tasks-toggle"]`);P&&(P.checked=m(await r(this.db,e.MARKDOWN_FRONTMATTER_TASKS),!0))}async promptForPlaintextBackupHandle(){let e=Reflect.get(globalThis,`showSaveFilePicker`),t=typeof e==`function`?e.bind(globalThis):null;if(!t)throw Error(`Plaintext settings backup requires the File System Access API.`);try{return await t({id:`shadowclaw-settings-backup`,suggestedName:`shadowclaw-settings-backup-${n()}.json`,types:[{description:`JSON Files`,accept:{"application/json":[`.json`]}}]})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return null;throw e}}async render(){let e=this.shadowRoot;if(!e)return;e.querySelector(`[data-action="show-channels-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`channels`},bubbles:!0,composed:!0}))}),e.querySelector(`[data-action="show-tools-config"]`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(`navigate`,{detail:{page:`tools`},bubbles:!0,composed:!0}))}),e.querySelectorAll(`[data-tab-target]`).forEach(e=>{e.addEventListener(`click`,()=>{this.activateTab(e.dataset.tabTarget)}),e.addEventListener(`keydown`,t=>{this.handleTabKeydown(t,e)})}),this.applyTabState(),this.bindSettingsActions();let t=e.querySelector(`[data-info="deployed-revision"]`);t&&(t.textContent=`Deployed revision: ${document.querySelector(`meta[name="revision"]`)?.getAttribute(`content`)?.trim()||`unknown`}`),await this.populateAssistantSettings()}async replaceConfigEntries(e){if(!this.db)throw Error(`Database is unavailable`);await new Promise((t,n)=>{try{let r=this.db?.transaction(`config`,`readwrite`);if(!r){n(Error(`Failed to open write transaction`));return}let i=r.objectStore(`config`);i.clear();for(let t of e)i.put({key:t.key,value:t.value});r.oncomplete=()=>t(),r.onerror=()=>n(r.error||Error(`Failed to update config`)),r.onabort=()=>n(r.error||Error(`Config update aborted`))}catch(e){n(e)}})}async saveAssistantName(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="assistant-name-input"]`);if(!n)return;let i=n.value.trim();if(!i){let{showWarning:e}=await import(`./toast-BXgUfbyh.js`).then(e=>e.c);e(`Please enter a name`,3e3);return}a(`assistantName`,i);try{let t=this.orchestrator||s.orchestrator;if(t)this.orchestrator=t,await r(t,this.db,i);else{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await t(this.db,e.ASSISTANT_NAME,i)}}catch(e){console.warn(`Could not update orchestrator:`,e)}u(`Assistant name saved`,3e3)}async saveDomAllowedIframeHosts(){let t=this.shadowRoot;if(!t||!this.db)return;let n=t.querySelector(`[data-setting="dom-allowed-iframe-hosts"]`);if(!n)return;let r=n.value.split(`
|
|
890
|
+
`).map(e=>e.trim()).filter(e=>e.length>0),i=t.querySelector(`[data-setting="markdown-frontmatter-pages-toggle"]`),a=t.querySelector(`[data-setting="markdown-frontmatter-file-viewer-toggle"]`),o=t.querySelector(`[data-setting="markdown-frontmatter-chat-toggle"]`),s=t.querySelector(`[data-setting="markdown-frontmatter-tasks-toggle"]`);try{let{setConfig:t}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n),n=r.join(`
|
|
891
|
+
`);await t(this.db,e.ALLOWED_IFRAME_HOST_PATTERNS,n),await t(this.db,e.MARKDOWN_FRONTMATTER_PAGES,String(i?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER,String(a?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_CHAT,String(o?.checked??!0)),await t(this.db,e.MARKDOWN_FRONTMATTER_TASKS,String(s?.checked??!0));let{setAllowedIframeHostPatterns:c}=await import(`./iframe-sanitizer-y2Z1pPwY.js`).then(e=>e.r);c(r),u(`DOM iframe embed settings saved`,2500)}catch(e){f(`Error saving DOM iframe embed settings: `+(e instanceof Error?e.message:String(e)),6e3)}}};customElements.get(j)||customElements.define(j,M);export{M as ShadowClawSettings};
|
|
@@ -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{en as i,t as a,tn as o}from"./orchestrator-DHjdLtqa.js";import{c as s}from"./getGroupDir-P1h9wl6S.js";import{t as c}from"./setConfig-DFMYnYLE.js";import{a as l,r as u,s as d}from"./toast-BXgUfbyh.js";import{t as f}from"./shadow-claw-element-DIrv3P6A.js";import{t as p}from"./effect-BJCrpFdp.js";import{t as m}from"./config-value-oBfKgLT4.js";async function h(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.estimate){let e=await navigator.storage.estimate();return{usage:e.usage||0,quota:e.quota||0}}}catch(e){console.warn(`Failed to get storage estimate:`,e)}return{usage:0,quota:0}}async function g(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persisted)return await navigator.storage.persisted()}catch(e){console.warn(`Failed to check persistent storage:`,e)}return!1}async function _(){try{if(typeof navigator<`u`&&navigator.storage&&navigator.storage.persist)return await navigator.storage.persist()}catch(e){console.warn(`Failed to request persistent storage:`,e)}return!1}async function v(t){let n=Reflect.get(globalThis,`showDirectoryPicker`),r=typeof n==`function`?n.bind(globalThis):null;if(!r)throw Error(`Local folder picker is unavailable in this browser/context.`);try{let n=await r({mode:`readwrite`,id:`shadowclaw-storage`});return await c(t,e.STORAGE_HANDLE,n),await o(t),await i(t),!0}catch(e){if(e instanceof Error&&e.name===`AbortError`)return!1;throw e}}const y=new CSSStyleSheet;y.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
font-family: var(--shadow-claw-font-sans);
|
|
@@ -212,7 +212,7 @@ import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b
|
|
|
212
212
|
</div>
|
|
213
213
|
</div>
|
|
214
214
|
</template>
|
|
215
|
-
`,`text/html`),x=b.querySelector(`template`);let S=[];S=x?Array.from(x.content.children):Array.from(b.head.children).concat(Array.from(b.body.children));var C=S;const w=`shadow-claw-storage`;var T=class extends f{static styles=y;static template=C;db=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.bindEventListeners(),this.setupEffects(),await this.updateStorageInfo()}disconnectedCallback(){super.disconnectedCallback()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="request-persistent"]`)?.addEventListener(`click`,()=>this.handleRequestPersistent()),e.querySelector(`[data-action="change-storage-dir"]`)?.addEventListener(`click`,()=>this.handleChangeStorageDir()),e.querySelector(`[data-action="reset-storage-dir"]`)?.addEventListener(`click`,()=>this.handleResetStorageDir()),e.querySelector(`[data-action="reset-site-config"]`)?.addEventListener(`click`,()=>this.handleResetSiteConfig()),e.querySelector(`[data-action="grant-storage-permission"]`)?.addEventListener(`click`,()=>{this.db&&
|
|
215
|
+
`,`text/html`),x=b.querySelector(`template`);let S=[];S=x?Array.from(x.content.children):Array.from(b.head.children).concat(Array.from(b.body.children));var C=S;const w=`shadow-claw-storage`;var T=class extends f{static styles=y;static template=C;db=null;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.bindEventListeners(),this.setupEffects(),await this.updateStorageInfo()}disconnectedCallback(){super.disconnectedCallback()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="request-persistent"]`)?.addEventListener(`click`,()=>this.handleRequestPersistent()),e.querySelector(`[data-action="change-storage-dir"]`)?.addEventListener(`click`,()=>this.handleChangeStorageDir()),e.querySelector(`[data-action="reset-storage-dir"]`)?.addEventListener(`click`,()=>this.handleResetStorageDir()),e.querySelector(`[data-action="reset-site-config"]`)?.addEventListener(`click`,()=>this.handleResetSiteConfig()),e.querySelector(`[data-action="grant-storage-permission"]`)?.addEventListener(`click`,()=>{this.db&&a.grantStorageAccess(this.db)}),e.querySelector(`[data-setting="files-upload-append-ulid-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;t&&this.onUploadAppendUlidToggle(t.checked)}))}formatBytes(e){if(e===0)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`,`TB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]}setupEffects(){let e=this.shadowRoot;e&&this.addCleanup(p(()=>{let t=a.storageStatus;if(!t)return;let n=e.querySelector(`[data-info="storage-type"]`),r=e.querySelector(`[data-info="storage-status-badge"]`),i=e.querySelector(`[data-action="grant-storage-permission"]`);n&&(n.textContent=t.type===`local`?`Local Directory`:`Browser Internal (OPFS)`),r&&(r.style.display=t.type===`local`?`inline-block`:`none`,t.type===`local`&&(r.textContent=t.permission===`granted`?`CONNECTED`:`NEEDS PERMISSION`,r.style.backgroundColor=t.permission===`granted`?`var(--shadow-claw-success-color)`:`var(--shadow-claw-error-color)`,r.style.color=`white`)),i&&(i.style.display=t.type===`local`&&t.permission!==`granted`?`inline-block`:`none`)}))}async handleChangeStorageDir(){if(this.db)try{await v(this.db)&&(l(`Storage location changed. Existing OPFS files were not moved.`,4500),await this.updateStorageInfo(),await a.loadFiles(this.db))}catch(e){u(`Failed to change storage location: ${e instanceof Error?e.message:String(e)}`,6e3)}}async handleRequestPersistent(){if(this.db)try{await _()?l(`Persistent storage granted`,3500):d(`Persistent storage was not granted. Browsers may deny this based on site usage.`,5500),await this.updateStorageInfo()}catch(e){u(`Storage request failed: ${e instanceof Error?e.message:String(e)}`,6e3)}}async handleResetSiteConfig(){if(this.db&&await this.requestConfirmation({title:`Reset Site Config`,message:`Allow embedded site-config.json defaults to apply again after the next reload?`,confirmLabel:`Reset`,cancelLabel:`Cancel`}))try{await a.resetSiteConfigSeed(this.db),l(`Site config reset. Reload to apply its defaults again.`,5e3)}catch(e){u(`Failed to reset site config: ${e instanceof Error?e.message:String(e)}`,6e3)}}async onUploadAppendUlidToggle(t){if(this.db)try{let{setConfig:n}=await import(`./setConfig-DFMYnYLE.js`).then(e=>e.n);await n(this.db,e.FILES_UPLOAD_APPEND_ULID,t?`true`:`false`),l(t?`Unique ID prefix on file upload enabled`:`Unique ID prefix on file upload disabled`,2500)}catch(e){u(`Error saving unique ID file upload setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async handleResetStorageDir(){if(this.db&&await this.requestConfirmation({title:`Reset Storage Location`,message:`Revert storage to browser-internal (OPFS)?`,confirmLabel:`Revert`,cancelLabel:`Cancel`}))try{await s(this.db),l(`Reverted to browser-internal storage`,3500),await this.updateStorageInfo(),await a.loadFiles(this.db)}catch(e){u(`Failed to reset storage location: ${e instanceof Error?e.message:String(e)}`,6e3)}}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(d(e.message,4500),!1)}async updateStorageInfo(){if(!this.db)return;let t=this.shadowRoot;if(t)try{let i=await h(),a=this.formatBytes(i.usage),o=this.formatBytes(i.quota),s=i.quota>0?i.usage/i.quota*100:0,c=t.querySelector(`[data-info="storage-usage"]`),l=t.querySelector(`[data-info="storage-quota"]`),u=t.querySelector(`[data-info="storage-progress"]`),d=t.querySelector(`[data-info="storage-type"]`),f=t.querySelector(`[data-info="storage-persistent-badge"]`);c&&(c.textContent=`${a} used`),l&&(l.textContent=`of ${o}`),u&&(u.style.width=`${s}%`);let p=await n(this.db,e.STORAGE_HANDLE);d&&(d.textContent=p?`Local Directory`:`Browser Internal (OPFS)`);let _=await g();f&&(f.style.display=_?`inline-block`:`none`);let v=t.querySelector(`[data-info="storage-help-general"]`),y=t.querySelector(`[data-info="storage-help-local"]`);v&&r(v,p?`Persistent storage protects your <b>chat history, tasks, and settings</b> in the browser database.
|
|
216
216
|
Without it, the browser might clear this data if your disk is almost full.`:`Persistent storage protects your <b>files, chat history, and settings</b> in the browser.
|
|
217
217
|
Without it, the browser might clear your data if your disk is almost full.`),y&&r(y,p?`ShadowClaw is currently <b>connected to a local folder</b>. Your files are safe on your disk,
|
|
218
218
|
but browser persistence is still recommended for your chat history.`:`You can use a local folder on your computer for storage. This makes files directly accessible
|
package/dist/public/{shadow-claw-task-server-D3lHp0Nc.js → shadow-claw-task-server-DxQSsgRZ.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./txPromise-EBECky1b.js";import{
|
|
1
|
+
import{n as e}from"./txPromise-EBECky1b.js";import{b as t,t as n,y as r}from"./orchestrator-DHjdLtqa.js";import{a as i,r as a}from"./toast-BXgUfbyh.js";import{t as o}from"./shadow-claw-element-DIrv3P6A.js";import{t as s}from"./effect-BJCrpFdp.js";const c=new CSSStyleSheet;c.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
font-family: var(--shadow-claw-font-sans);
|
|
@@ -166,4 +166,4 @@ import{n as e}from"./txPromise-EBECky1b.js";import{a as t,r as n}from"./toast-HA
|
|
|
166
166
|
</div>
|
|
167
167
|
</div>
|
|
168
168
|
</template>
|
|
169
|
-
`,`text/html`),u=l.querySelector(`template`);let d=[];d=u?Array.from(u.content.children):Array.from(l.head.children).concat(Array.from(l.body.children));var f=d;const p=`shadow-claw-task-server`;var m=class extends o{static styles=c;static template=f;db;orchestrator;constructor(){super(),this.db=null,this.orchestrator=null}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await e(),this.orchestrator=
|
|
169
|
+
`,`text/html`),u=l.querySelector(`template`);let d=[];d=u?Array.from(u.content.children):Array.from(l.head.children).concat(Array.from(l.body.children));var f=d;const p=`shadow-claw-task-server`;var m=class extends o{static styles=c;static template=f;db;orchestrator;constructor(){super(),this.db=null,this.orchestrator=null}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await e(),this.orchestrator=n.orchestrator,this.bindEventListeners(),this.setupEffects(),await this.render()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="save-task-server-url"]`)?.addEventListener(`click`,()=>{this.saveTaskServerUrl()}),e.querySelector(`[data-setting="task-server-enabled-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;this.saveTaskServerEnabled(t.checked)}))}setupEffects(){s(()=>{n.ready&&(this.orchestrator=n.orchestrator,this.render())})}async render(){if(!this.orchestrator)return;let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`[data-setting="task-server-url-input"]`);t&&(t.value=this.orchestrator.taskServerUrl);let n=e.querySelector(`[data-setting="task-server-enabled-toggle"]`);n&&(n.checked=this.orchestrator.taskServerEnabled)}async saveTaskServerEnabled(e){if(!(!this.orchestrator||!this.db))try{await r(this.orchestrator,this.db,e)}catch(e){a(`Error saving Task Server setting: `+(e instanceof Error?e.message:String(e)),6e3)}}async saveTaskServerUrl(){if(!this.orchestrator||!this.db)return;let e=this.shadowRoot;if(!e)return;let n=e.querySelector(`[data-setting="task-server-url-input"]`);if(!n)return;let r=n.value.trim();try{await t(this.orchestrator,this.db,r||`/schedule`),i(`Task Server URL saved`,3e3)}catch(e){a(`Error saving Task Server URL: `+(e instanceof Error?e.message:String(e)),6e3)}}};customElements.get(p)||customElements.define(p,m);export{m as ShadowClawTaskServer};
|
|
@@ -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{m as r,u as i}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{m as r,u as i}from"./custom-element-security-FU04Cq05.js";import{t as a}from"./orchestrator-DHjdLtqa.js";import{a as o,i as s,r as c}from"./toast-BXgUfbyh.js";import{t as l}from"./shadow-claw-element-DIrv3P6A.js";import"./shadow-claw-empty-state-Bl52dGQ0.js";import{t as u}from"./effect-BJCrpFdp.js";import{t as d}from"./config-value-oBfKgLT4.js";import"./shadow-claw-page-header-action-button-Bmua3mAb.js";import"./shadow-claw-page-header-BccSHItx.js";import{t as f}from"./markdown-C3M4OW_A.js";import{t as p}from"./file-viewer-C-6Jc_tb.js";import"./shadow-claw-dialog-BrOwAOdk.js";const m=new CSSStyleSheet;m.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
font-family: var(--shadow-claw-font-sans);
|
|
@@ -929,7 +929,7 @@ dialog::backdrop {
|
|
|
929
929
|
</div>
|
|
930
930
|
</section>
|
|
931
931
|
</template>
|
|
932
|
-
`,`text/html`),g=h.querySelector(`template`);let _=[];_=g?Array.from(g.content.children):Array.from(h.head.children).concat(Array.from(h.body.children));var v=_;const y=`shadow-claw-tasks`;async function b(e,t){if(!e||typeof e.transaction!=`function`)return!0;try{return d(await n(e,t),!0)}catch{return!0}}var x=class extends l{static styles=m;static template=v;editingTask=null;editingTools=[];renderFrontmatter=!0;tasks=[];_autoScrollActive=!1;_autoScrollSpeed=0;_draggedTaskId=null;_keyboardGrabbedId=null;_touchDraggedTaskId=null;_touchId=null;constructor(){super()}async connectedCallback(){let n=this.shadowRoot;if(!n)throw Error(`shadowRoot not found`);n.addEventListener(`click`,e=>{e instanceof MouseEvent&&t().then(t=>this.handlePreviewLinkClick(e,t)).catch(console.error)}),n.querySelector(`.tasks__backup-btn`)?.addEventListener(`click`,()=>this.handleBackup());let r=n.querySelector(`.tasks__restore-btn`),
|
|
932
|
+
`,`text/html`),g=h.querySelector(`template`);let _=[];_=g?Array.from(g.content.children):Array.from(h.head.children).concat(Array.from(h.body.children));var v=_;const y=`shadow-claw-tasks`;async function b(e,t){if(!e||typeof e.transaction!=`function`)return!0;try{return d(await n(e,t),!0)}catch{return!0}}var x=class extends l{static styles=m;static template=v;editingTask=null;editingTools=[];renderFrontmatter=!0;tasks=[];_autoScrollActive=!1;_autoScrollSpeed=0;_draggedTaskId=null;_keyboardGrabbedId=null;_touchDraggedTaskId=null;_touchId=null;constructor(){super()}async connectedCallback(){let n=this.shadowRoot;if(!n)throw Error(`shadowRoot not found`);n.addEventListener(`click`,e=>{e instanceof MouseEvent&&t().then(t=>this.handlePreviewLinkClick(e,t)).catch(console.error)}),n.querySelector(`.tasks__backup-btn`)?.addEventListener(`click`,()=>this.handleBackup());let r=n.querySelector(`.tasks__restore-btn`),o=n.querySelector(`.tasks__hidden-restore`);r?.addEventListener(`click`,()=>{o instanceof HTMLInputElement&&o.click()}),o?.addEventListener(`change`,e=>{if(e.target instanceof HTMLInputElement){let n=e.target;t().then(e=>this.handleRestore(e,n)).catch(console.error)}}),n.querySelector(`.tasks__clear-btn`)?.addEventListener(`click`,()=>{t().then(e=>this.handleClearAll(e)).catch(console.error)}),n.querySelector(`.tasks__add-btn`)?.addEventListener(`click`,()=>this.handleAdd());let s=n.querySelector(`dialog`),c=n.querySelector(`.tasks__dialog-close`),l=n.querySelector(`.tasks__btn-cancel`),d=n.querySelector(`.tasks__dialog-form`);c?.addEventListener(`click`,()=>{s?.close()}),l?.addEventListener(`click`,()=>{s?.close()}),d?.addEventListener(`submit`,e=>{e.preventDefault(),d&&t().then(e=>this.handleEditSubmit(e,d)).catch(console.error)}),s?.addEventListener(`click`,e=>{e.target===s&&s.close()});let f=n.querySelector(`textarea[name='prompt']`),p=n.querySelector(`.tasks__preview`),m=n.querySelectorAll(`input[name='taskType']`),h=n.querySelector(`.tasks__prompt-group`),g=n.querySelector(`.tasks__tools-group`),_=n.querySelector(`.tasks__add-tool-btn`),v=async()=>{p instanceof HTMLElement&&((Array.from(m).find(e=>e.checked)?.getAttribute(`value`)||`prompt`)===`tools`?i(p,this.renderToolsPreview(this.editingTools)):f instanceof HTMLTextAreaElement&&i(p,await this.renderPreview(f.value)))};f?.addEventListener(`input`,v),m.forEach(e=>{e.addEventListener(`change`,e=>{e.target.value===`tools`?(h?.setAttribute(`style`,`display: none;`),g?.removeAttribute(`style`),f?.removeAttribute(`required`)):(g?.setAttribute(`style`,`display: none;`),h?.removeAttribute(`style`)),v()})}),_?.addEventListener(`click`,()=>{this.editingTools.push({name:``,input:{}}),this.renderToolsEditor(),v()});let y=await t();this.renderFrontmatter=await b(y,e.MARKDOWN_FRONTMATTER_TASKS);try{let e=await(await fetch(`https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/atom-one-dark.min.css`)).text(),t=new CSSStyleSheet;t.replaceSync(e),this.shadowRoot?.adoptedStyleSheets&&this.shadowRoot.adoptedStyleSheets.push(t)}catch(e){console.warn(`Failed to load highlight.js styles:`,e)}n.addEventListener(`dragover`,e=>{this._draggedTaskId!==null&&this._updateAutoScrollSpeed(e.clientY)}),n.addEventListener(`dragend`,()=>{this._stopAutoScroll()}),n.addEventListener(`drop`,()=>{this._stopAutoScroll()}),this.render(),this.dispatchTerminalSlotReady(),this.cleanup=u(()=>{a.tasks,this.updateTaskList(y)})}disconnectedCallback(){this.cleanup()}cleanup=()=>{};dispatchTerminalSlotReady(){this.dispatchEvent(new CustomEvent(`shadow-claw-terminal-slot-ready`,{bubbles:!0,composed:!0}))}escapeHtml(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}handleAdd(){this.editingTask=null,this.editingTools=[];let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`dialog`),n=e.querySelector(`.tasks__dialog-form`),r=e.querySelector(`.tasks__dialog-title`),a=e.querySelector(`.tasks__dialog-submit`);if(!n||!(n instanceof HTMLFormElement))return;r&&(r.textContent=`Add Task`),a&&(a.textContent=`Add Task`),n.reset();let o=n.querySelector(`input[name='name']`);o instanceof HTMLInputElement&&(o.value=``);let s=n.querySelector(`input[name='taskType'][value='prompt']`);s&&(s.checked=!0,s.dispatchEvent(new Event(`change`))),this.renderToolsEditor();let c=e.querySelector(`.tasks__preview`);c instanceof HTMLElement&&this.renderPreview(``,!1).then(e=>{i(c,e)}),t?.showModal()}handleEdit(e){this.editingTask=e,this.editingTools=JSON.parse(JSON.stringify(e.tools||[]));let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`dialog`),r=t.querySelector(`.tasks__dialog-form`),a=t.querySelector(`.tasks__dialog-title`),o=t.querySelector(`.tasks__dialog-submit`);if(!r||!(r instanceof HTMLFormElement))return;a&&(a.textContent=`Edit Task`),o&&(o.textContent=`Save Changes`);let s=r.querySelector(`input[name='name']`);s instanceof HTMLInputElement&&(s.value=e.name||``);let c=r.querySelector(`input[name='schedule']`),l=r.querySelector(`textarea[name='prompt']`);c instanceof HTMLInputElement&&(c.value=e.schedule||``),l instanceof HTMLTextAreaElement&&(l.value=e.prompt||``);let u=r.querySelector(`input[name='freshContext']`);u instanceof HTMLInputElement&&(u.checked=!!e.freshContext);let d=r.querySelector(`input[name='subagent']`);d instanceof HTMLInputElement&&(d.checked=!!e.subagent);let f=r.querySelector(`input[name='taskType'][value='${e.type||`prompt`}']`);f&&(f.checked=!0,f.dispatchEvent(new Event(`change`))),this.renderToolsEditor();let p=t.querySelector(`.tasks__preview`);p instanceof HTMLElement&&(e.type===`tools`?i(p,this.renderToolsPreview(this.editingTools)):this.renderPreview(e.prompt).then(e=>{i(p,e)})),n?.showModal()}handleRun(e){a.runTask(e,!0)}renderToolsEditor(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.tasks__tools-list`);t&&(t.innerHTML=``,this.editingTools.forEach((n,r)=>{let a=document.createElement(`div`);a.className=`tasks__tool-item`;let o=document.createElement(`div`);o.className=`tasks__tool-header`;let s=document.createElement(`div`);s.className=`tasks__tool-title`,s.textContent=`Tool ${r+1}`;let c=document.createElement(`button`);c.type=`button`,c.className=`tasks__tool-remove-btn`,c.textContent=`Remove`,c.addEventListener(`click`,()=>{this.editingTools.splice(r,1),this.renderToolsEditor();let t=e.querySelector(`.tasks__preview`);t&&i(t,this.renderToolsPreview(this.editingTools))}),o.appendChild(s),o.appendChild(c);let l=document.createElement(`input`);l.type=`text`,l.className=`tasks__form-input`,l.placeholder=`Tool Name (e.g. show_toast)`,l.value=n.name||``,l.addEventListener(`input`,t=>{n.name=t.target.value;let r=e.querySelector(`.tasks__preview`);r&&i(r,this.renderToolsPreview(this.editingTools))});let u=document.createElement(`textarea`);u.className=`tasks__form-textarea`,u.placeholder=`{
|
|
933
933
|
"key": "value"
|
|
934
934
|
}`;try{u.value=n.input&&Object.keys(n.input).length?JSON.stringify(n.input,null,2):``}catch{u.value=``}u.addEventListener(`change`,t=>{let r=t.target.value;if(!r.trim())n.input={};else try{n.input=JSON.parse(r),t.target.style.borderColor=``}catch{t.target.style.borderColor=`var(--shadow-claw-error-color)`}let a=e.querySelector(`.tasks__preview`);a&&i(a,this.renderToolsPreview(this.editingTools))});let d=document.createElement(`label`);d.className=`tasks__tool-suppress`;let f=document.createElement(`input`);f.type=`checkbox`,f.checked=!!n.suppressOutput,f.addEventListener(`change`,t=>{n.suppressOutput=t.target.checked;let r=e.querySelector(`.tasks__preview`);r&&i(r,this.renderToolsPreview(this.editingTools))}),d.appendChild(f),d.appendChild(document.createTextNode(` Suppress Output`));let p=document.createElement(`label`);p.className=`tasks__tool-suppress`;let m=document.createElement(`input`);m.type=`checkbox`,m.checked=!!n.suppressToast,m.addEventListener(`change`,t=>{n.suppressToast=t.target.checked;let r=e.querySelector(`.tasks__preview`);r&&i(r,this.renderToolsPreview(this.editingTools))}),p.appendChild(m),p.appendChild(document.createTextNode(` Suppress Toast`)),a.appendChild(o),a.appendChild(l),a.appendChild(u),a.appendChild(d),a.appendChild(p),t.appendChild(a)}))}renderToolsPreview(e,t=!1){if(!e||e.length===0)return`<span class="tasks__preview-empty">No tools configured</span>`;let n=e.map((e,t)=>{let n=`{}`;try{n=JSON.stringify(e.input,null,2)}catch{n=`Invalid JSON`}return`<div><strong>${t+1}. ${r(e.name||`Unnamed Tool`)}</strong><pre><code>${r(n)}</code></pre></div>`}).join(``);return t&&e.length>2?`
|
|
935
935
|
<details class="tasks__content-details">
|
|
@@ -939,7 +939,7 @@ dialog::backdrop {
|
|
|
939
939
|
</summary>
|
|
940
940
|
<div class="tasks__prompt">${n}</div>
|
|
941
941
|
</details>
|
|
942
|
-
`:`<div class="tasks__prompt">${n}</div>`}resolveWorkspaceLinkPath(e){let t=e.trim();if(!t||t.startsWith(`#`))return null;let n=t;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`)){let e;try{e=new URL(t,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;n=`${e.pathname}${e.search}${e.hash}`}let r=n.split(/[?#]/,1)[0].replace(/\\/g,`/`);if(r=r.replace(/^\/+/,``),r=r.replace(/^\.\//,``),!r)return null;let i=r.split(`/`).filter(Boolean);return i.some(e=>e===`..`)?null:i.join(`/`)}async handleBackup(){try{let e=this.shadowRoot?.querySelector(`.tasks__backup-btn`);e?.toggleAttribute(`disabled`,!0),e&&(e.textContent=`⏳`);let t=
|
|
942
|
+
`:`<div class="tasks__prompt">${n}</div>`}resolveWorkspaceLinkPath(e){let t=e.trim();if(!t||t.startsWith(`#`))return null;let n=t;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`)){let e;try{e=new URL(t,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;n=`${e.pathname}${e.search}${e.hash}`}let r=n.split(/[?#]/,1)[0].replace(/\\/g,`/`);if(r=r.replace(/^\/+/,``),r=r.replace(/^\.\//,``),!r)return null;let i=r.split(`/`).filter(Boolean);return i.some(e=>e===`..`)?null:i.join(`/`)}async handleBackup(){try{let e=this.shadowRoot?.querySelector(`.tasks__backup-btn`);e?.toggleAttribute(`disabled`,!0),e&&(e.textContent=`⏳`);let t=a.getTasksForBackup(),n=JSON.stringify(t,null,2),r=new Blob([n],{type:`application/json`}),i=URL.createObjectURL(r),o=document.createElement(`a`);o.href=i,o.download=`shadowclaw-tasks-backup-${Date.now()}.json`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(i)}catch(e){c(`Failed to create backup: ${e instanceof Error?e.message:String(e)}`),console.error(`Backup error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__backup-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`💾 Backup`)}}async handleClearAll(e){if(await this.requestConfirmation({title:`Clear All Tasks`,message:`Delete ALL tasks? This cannot be undone!`,confirmLabel:`Delete All`,cancelLabel:`Cancel`}))try{let t=this.shadowRoot?.querySelector(`.tasks__clear-btn`);t?.toggleAttribute(`disabled`,!0),t&&(t.textContent=`⏳`),await a.clearAllTasks(e)}catch(e){c(`Failed to clear tasks: ${e instanceof Error?e.message:String(e)}`),console.error(`Clear error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__clear-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`🗑️ Clear All`)}}async handleCopyId(e){try{await navigator.clipboard.writeText(e),o(`Task ID copied to clipboard!`)}catch{c(`Failed to copy task ID.`)}}async handleDelete(e,t){if(await this.requestConfirmation({title:`Delete Scheduled Task`,message:`Are you sure you want to delete this scheduled task?`,confirmLabel:`Delete`,cancelLabel:`Cancel`}))try{await a.deleteTask(e,t)}catch(e){console.error(`Failed to delete task:`,e)}}async handleEditSubmit(e,t){let n=new FormData(t),r=n.get(`name`),i=n.get(`schedule`),o=n.get(`prompt`),l=n.get(`taskType`)||`prompt`,u=r?String(r).trim():``,d=i?String(i).trim():``;if(l===`prompt`&&!o){s(`Please provide a task prompt.`);return}let f=!!n.get(`freshContext`),p=!!n.get(`subagent`);try{let t;if(this.editingTask)t={...this.editingTask,name:u||void 0,schedule:d,type:l,prompt:String(o||``),tools:JSON.parse(JSON.stringify(this.editingTools)),freshContext:f,subagent:p};else{let e=a.activeGroupId;t={id:crypto.randomUUID?crypto.randomUUID():`task-${Date.now()}-${Math.random()}`,groupId:e,name:u||void 0,schedule:d,type:l,prompt:String(o||``),tools:JSON.parse(JSON.stringify(this.editingTools)),enabled:!0,lastRun:null,createdAt:Date.now(),freshContext:f,subagent:p}}await a.upsertTask(e,t),(this.shadowRoot?.querySelector(`dialog`))?.close(),this.editingTask=null}catch(e){c(`Failed to save task: ${e instanceof Error?e.message:String(e)}`),console.error(`Save error:`,e)}}async handlePreviewLinkClick(e,t){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let n=e.target;if(!(n instanceof Element))return;let r=n.closest(`a`);if(!(r instanceof HTMLAnchorElement))return;let i=r.getAttribute(`href`)||``,o=this.resolveWorkspaceLinkPath(i);if(!o)return;e.preventDefault();let s=[o],l=o.split(`/`).filter(Boolean).pop()||``;/\.[^./]+$/u.test(l)||s.push(`${o}.md`,`${o}/index.md`);for(let e of s)try{await p.openFile(t,e,a.activeGroupId);return}catch{}c(`Failed to open linked file: ${o}`,5e3)}async handleReorder(e,n,r){let i=await t();if(!i)return;if(r){await a.reorderTasks(i,a.activeGroupId,r);return}let o=(a.tasks||[]).map(e=>e.id),s=o.indexOf(e),c=o.indexOf(n);s<0||c<0||(o.splice(s,1),o.splice(c,0,e),await a.reorderTasks(i,a.activeGroupId,o))}async handleRestore(e,t){let n=t.files;if(!n||n.length===0)return;let r=n[0];if(!r.name.endsWith(`.json`)){s(`Please select a .json file`);return}if(!await this.requestConfirmation({title:`Restore Tasks`,message:`Restore from backup will replace all current tasks. Continue?`,confirmLabel:`Restore`,cancelLabel:`Cancel`})){t.value=``;return}try{let n=this.shadowRoot?.querySelector(`.tasks__restore-btn`);n?.toggleAttribute(`disabled`,!0),n&&(n.textContent=`⏳`);let i=await r.text(),s=JSON.parse(i);if(!Array.isArray(s))throw Error(`Invalid backup file format`);await a.restoreTasksFromBackup(e,s),t.value=``,o(`Tasks restored successfully!`)}catch(e){c(`Failed to restore from backup: ${e instanceof Error?e.message:String(e)}`),console.error(`Restore error:`,e)}finally{let e=this.shadowRoot?.querySelector(`.tasks__restore-btn`);e?.toggleAttribute(`disabled`,!1),e&&(e.textContent=`♻️ Restore`)}}async renderPreview(e,t=!1){if(!e.trim())return`<span class="tasks__preview-empty">No content</span>`;let n=e.split(`
|
|
943
943
|
`),i=e.length>120||n.length>1,a=await f(e,{breaks:!0,renderFrontmatter:this.renderFrontmatter});return t&&i?`
|
|
944
944
|
<details class="tasks__content-details">
|
|
945
945
|
<summary class="tasks__content-summary">
|
|
@@ -948,19 +948,19 @@ dialog::backdrop {
|
|
|
948
948
|
</summary>
|
|
949
949
|
<div class="tasks__prompt">${a}</div>
|
|
950
950
|
</details>
|
|
951
|
-
`:`<div class="tasks__prompt">${a}</div>`}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(
|
|
951
|
+
`:`<div class="tasks__prompt">${a}</div>`}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):(s(e.message,4e3),!1)}async updateTaskList(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.tasks__list`);if(!n)return;let o=a.tasks;if(o.length===0){i(n,`<shadow-claw-empty-state
|
|
952
952
|
class="tasks__empty"
|
|
953
953
|
message="No scheduled tasks for this group."
|
|
954
954
|
hint="Ask the agent to create one using 'create_task'."
|
|
955
|
-
></shadow-claw-empty-state>`);return}let
|
|
955
|
+
></shadow-claw-empty-state>`);return}let s=document.createDocumentFragment();for(let t=0;t<o.length;t++){let c=o[t],l=document.createElement(`div`);l.className=`tasks__item`,l.setAttribute(`role`,`listitem`),l.setAttribute(`tabindex`,`0`),l.setAttribute(`aria-describedby`,`reorder-instructions`),l.setAttribute(`aria-label`,`${c.name||`Task`}, position ${t+1} of ${o.length}`),l.setAttribute(`data-task-id`,c.id),this._keyboardGrabbedId===c.id&&(l.classList.add(`keyboard-grabbed`),l.setAttribute(`aria-grabbed`,`true`));let u=c.lastRun?new Date(c.lastRun).toLocaleString():`Never`,d=c.type===`tools`,f=d?this.renderToolsPreview(c.tools||[],!0):await this.renderPreview(c.prompt,!0),p=c.schedule?`⏰ ${r(c.schedule)}`:`⏸ Unscheduled`,m=c.schedule?`
|
|
956
956
|
<label class="tasks__toggle">
|
|
957
|
-
<input type="checkbox" ${
|
|
958
|
-
${
|
|
959
|
-
</label>`:``,h=[d?`Tools`:`Prompt`];
|
|
957
|
+
<input type="checkbox" ${c.enabled?`checked`:``} data-id="${r(c.id)}" class="tasks__toggle-input" aria-label="${c.enabled?`Disable`:`Enable`} task scheduled ${r(c.schedule)}">
|
|
958
|
+
${c.enabled?`Enabled`:`Disabled`}
|
|
959
|
+
</label>`:``,h=[d?`Tools`:`Prompt`];c.freshContext&&h.push(`Fresh Context`),c.subagent&&h.push(`Subagent`);let g=h.join(` · `);i(l,`<div class="tasks__item-header">
|
|
960
960
|
<div style="display: flex; align-items: flex-start; flex: 1; min-width: 0;">
|
|
961
961
|
<span class="tasks__drag-handle" draggable="true" aria-hidden="true" title="Drag to reorder">⠿</span>
|
|
962
962
|
<div class="tasks__item-info">
|
|
963
|
-
${
|
|
963
|
+
${c.name?`<div class="tasks__name" style="font-weight: 600; font-size: var(--shadow-claw-font-size-md); margin-bottom: 0.25rem;">${r(c.name)}</div>`:``}
|
|
964
964
|
<div class="tasks__schedule-row">
|
|
965
965
|
<div class="tasks__schedule">${p} <span class="tasks__type-badge">(${r(g)})</span></div>
|
|
966
966
|
</div>
|
|
@@ -972,11 +972,11 @@ dialog::backdrop {
|
|
|
972
972
|
</div>
|
|
973
973
|
<div class="tasks__actions">
|
|
974
974
|
${m}
|
|
975
|
-
<button type="button" class="tasks__copy-id-btn" data-id="${r(
|
|
975
|
+
<button type="button" class="tasks__copy-id-btn" data-id="${r(c.id)}" aria-label="Copy task ID" title="Copy task ID">
|
|
976
976
|
<svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 -960 960 960" fill="currentColor" aria-hidden="true" style="vertical-align: middle; margin-right: 0.125rem; margin-top: -0.125rem;"><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> Copy ID
|
|
977
977
|
</button>
|
|
978
|
-
<button type="button" class="tasks__run-btn" data-id="${r(
|
|
979
|
-
<button type="button" class="tasks__edit-btn" data-id="${r(
|
|
980
|
-
<button type="button" class="tasks__delete-btn" data-id="${r(
|
|
978
|
+
<button type="button" class="tasks__run-btn" data-id="${r(c.id)}" aria-label="Run task">Run</button>
|
|
979
|
+
<button type="button" class="tasks__edit-btn" data-id="${r(c.id)}" aria-label="Edit task">✎ Edit</button>
|
|
980
|
+
<button type="button" class="tasks__delete-btn" data-id="${r(c.id)}" aria-label="Delete task">Delete</button>
|
|
981
981
|
</div>
|
|
982
|
-
</div>`),l.querySelector(`.tasks__toggle-input`)?.addEventListener(`change`,t=>{let n=t.target;
|
|
982
|
+
</div>`),l.querySelector(`.tasks__toggle-input`)?.addEventListener(`change`,t=>{let n=t.target;a.toggleTask(e,c,n.checked)}),l.querySelector(`.tasks__copy-id-btn`)?.addEventListener(`click`,()=>this.handleCopyId(c.id)),l.querySelector(`.tasks__run-btn`)?.addEventListener(`click`,()=>this.handleRun(c)),l.querySelector(`.tasks__edit-btn`)?.addEventListener(`click`,()=>this.handleEdit(c)),l.querySelector(`.tasks__delete-btn`)?.addEventListener(`click`,()=>this.handleDelete(e,c.id));let _=l.querySelector(`.tasks__drag-handle`);_?.addEventListener(`dragstart`,e=>{this._draggedTaskId=c.id,l.classList.add(`dragging`),e.dataTransfer?.setData(`text/plain`,c.id)}),_?.addEventListener(`dragend`,()=>{l.classList.remove(`dragging`),this._draggedTaskId=null,n.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`))}),_?.addEventListener(`touchstart`,e=>{let t=e.touches[0];t&&(this._touchId=t.identifier,this._touchDraggedTaskId=c.id,l.classList.add(`dragging`),e.preventDefault())},{passive:!1}),l.addEventListener(`dragover`,e=>{e.preventDefault(),this._draggedTaskId&&this._draggedTaskId!==c.id&&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._draggedTaskId&&this._draggedTaskId!==c.id&&this.handleReorder(this._draggedTaskId,c.id)}),l.addEventListener(`keydown`,e=>{this._handleKeyboard(e,c.id,c.name||`Task`)}),s.appendChild(l)}n.replaceChildren(),n.appendChild(s),this._bindTouchListEvents(n)}_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._touchDraggedTaskId===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-task-id`)!==this._touchDraggedTaskId&&r.classList.add(`drag-over`),this._updateAutoScrollSpeed(n.clientY)},{passive:!1}),e.addEventListener(`touchend`,t=>{if(this._touchDraggedTaskId===null)return;let n=this._findChangedTouch(t);if(!n)return;let r=this._itemAtPoint(n.clientX,n.clientY)?.getAttribute(`data-task-id`);e.querySelectorAll(`.dragging`).forEach(e=>e.classList.remove(`dragging`)),e.querySelectorAll(`.drag-over`).forEach(e=>e.classList.remove(`drag-over`)),r&&r!==this._touchDraggedTaskId&&this.handleReorder(this._touchDraggedTaskId,r),this._stopAutoScroll(),this._touchDraggedTaskId=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._touchDraggedTaskId=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(`.tasks__item[tabindex="0"], button:not([disabled]), input:not([type="hidden"]):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(`.tasks__item`)),r=e.closest(`.tasks__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(`.tasks__item[tabindex="0"], button:not([disabled]), input:not([type="hidden"]):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(`.tasks__item`)),r=e.closest(`.tasks__item`),i=n.indexOf(r);i>0&&n[i-1].focus()}_handleKeyboard(e,n,r){let i=a.tasks||[],o=i.map(e=>e.id),s=o.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===`m`||e.key===`M`){e.preventDefault(),this._keyboardGrabbedId=n;let i=o.indexOf(n)+1;this._announce(`${r} grabbed. Current position ${i} of ${s}. Use Arrow Up and Down to move, Space or Enter to drop.`),t().then(e=>this.updateTaskList(e)).catch(console.error)}return}if(e.key===`Escape`){e.preventDefault(),this._announce(`Reorder cancelled. ${r} returned to original position.`),this._keyboardGrabbedId=null,t().then(e=>this.updateTaskList(e)).catch(console.error);return}if(e.key===` `||e.key===`Spacebar`||e.key===`Enter`){e.preventDefault();let n=o.indexOf(this._keyboardGrabbedId)+1,r=i.find(e=>e.id===this._keyboardGrabbedId)?.name||`Task`;this._announce(`${r} dropped at position ${n} of ${s}. Reordering complete.`),this._keyboardGrabbedId=null,t().then(e=>this.updateTaskList(e)).catch(console.error);return}if(e.key===`ArrowUp`||e.key===`ArrowDown`){e.preventDefault();let t=o.indexOf(this._keyboardGrabbedId),n=e.key===`ArrowUp`?t-1:t+1;if(n<0||n>=s)return;o.splice(t,1),o.splice(n,0,this._keyboardGrabbedId),this._announce(`Moved to position ${n+1} of ${s}.`),this.handleReorder(this._keyboardGrabbedId,o[t],o)}}_itemAtPoint(e,t){let n=this.shadowRoot;return n&&n.elementFromPoint(e,t)?.closest?.(`.tasks__item`)||null}_startAutoScroll(){if(this._autoScrollActive)return;this._autoScrollActive=!0;let e=()=>{if(!this._autoScrollActive)return;let t=this.shadowRoot?.querySelector(`.tasks__content`);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(`.tasks__content`);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}};customElements.get(y)||customElements.define(y,x);export{x as ShadowClawTasks};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{D as e,E as t,T as n,t as r}from"./orchestrator-
|
|
1
|
+
import{D as e,E as t,T as n,t as r}from"./orchestrator-DHjdLtqa.js";import{t as i}from"./shadow-claw-element-DIrv3P6A.js";function a(e){if(!e)return``;let t=e.split(`
|
|
2
2
|
`);for(let e=t.length-1;e>=0;--e){let n=t[e]||``;if(/[#$](?:\s|$)/.test(n))return n}return``}function o(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=12}function s(e,t){let n=e[t+1];if(n===void 0)return{action:`ignore`,nextIndex:t+1,incomplete:!0};if(n===`[`){let n=t+2;for(;n<e.length;){let t=e.charCodeAt(n);if(t>=64&&t<=126){let t=e[n];return t===`J`?{action:`clear-screen`,nextIndex:n+1}:t===`K`?{action:`clear-line`,nextIndex:n+1}:{action:`ignore`,nextIndex:n+1}}n+=1}return{action:`ignore`,nextIndex:e.length,incomplete:!0}}if(n===`]`){let n=t+2;for(;n<e.length;){let t=e[n];if(t===`\x07`)return{action:`ignore`,nextIndex:n+1};if(t===`\x1B`&&e[n+1]===`\\`)return{action:`ignore`,nextIndex:n+2};n+=1}return{action:`ignore`,nextIndex:e.length,incomplete:!0}}return{action:`ignore`,nextIndex:Math.min(t+2,e.length)}}function c(e){return e.replace(/(?:^|\n)[^\n]*mkdir -p \/home\/user 2>&1; echo "?__BCDONE_\d+__\$\?"?[^\n]*(?:\n|$)/g,`
|
|
3
3
|
`).replace(/(?:^|\n)\s*__BCDONE_\d+__(?:\d+|\$\?)?\s*(?:\n|$)/g,`
|
|
4
4
|
`).replace(/^\n+(?=\S)/,``)}function l(e,t,n=``,r){let i=r?.respectEraseSequences??!0,a=n+t,o=e;for(let e=0;e<a.length;e++){let t=a[e];if(t===`\x1B`){let t=s(a,e);if(t.incomplete)return{text:o,pending:a.slice(e)};if(t.action===`clear-screen`&&i&&(o=``),t.action===`clear-line`&&i){let e=o.lastIndexOf(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,i as t,l as n,n as r,o as i,r as a,s as o,t as s}from"./toast-
|
|
1
|
+
import{a as e,i as t,l as n,n as r,o as i,r as a,s as o,t as s}from"./toast-BXgUfbyh.js";import{t as c}from"./shadow-claw-element-DIrv3P6A.js";import{t as l}from"./effect-BJCrpFdp.js";const u=new CSSStyleSheet;u.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
font-family: var(--shadow-claw-font-sans);
|