shadow-claw 1.29.0 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/main/skill-creator/SKILL.md +3 -2
- package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/.well-known/agent-skills/index.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/dist/lib/{app-routes-CqBOeA5q.js → app-routes-BAEMLu9g.js} +3 -2
- package/dist/lib/app-routes-BAEMLu9g.js.map +1 -0
- package/dist/lib/{bundler-8JNIKwOs.js → bundler-CsL7hHMq.js} +4 -9
- package/dist/lib/{bundler-8JNIKwOs.js.map → bundler-CsL7hHMq.js.map} +1 -1
- package/dist/lib/components/index.js +26 -26
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw-a2ui.js +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{config--CFrw3J3.js → config-DjZ9QWc4.js} +2 -2
- package/dist/lib/{config--CFrw3J3.js.map → config-DjZ9QWc4.js.map} +1 -1
- package/dist/lib/{configurePeerJs-DG4hliKp.js → configurePeerJs-H0WaoT0w.js} +3 -3
- package/dist/lib/{configurePeerJs-DG4hliKp.js.map → configurePeerJs-H0WaoT0w.js.map} +1 -1
- package/dist/lib/{connections-DwjzwVz0.js → connections-BURqMIUv.js} +2 -2
- package/dist/lib/{connections-DwjzwVz0.js.map → connections-BURqMIUv.js.map} +1 -1
- package/dist/lib/content/markdown-links.d.ts +19 -0
- package/dist/lib/core/app-routes.d.ts +1 -0
- package/dist/lib/{downloadGroupFile-DmcBQU1n.js → downloadGroupFile-B8J4up2a.js} +2 -2
- package/dist/lib/{downloadGroupFile-DmcBQU1n.js.map → downloadGroupFile-B8J4up2a.js.map} +1 -1
- package/dist/lib/{file-viewer-C3YKnq_-.js → file-viewer-CwvhxAAG.js} +5 -5
- package/dist/lib/{file-viewer-C3YKnq_-.js.map → file-viewer-CwvhxAAG.js.map} +1 -1
- package/dist/lib/{getGroupDir-m0f-ekgX.js → getGroupDir-QrN2aTo8.js} +4 -4
- package/dist/lib/{getGroupDir-m0f-ekgX.js.map → getGroupDir-QrN2aTo8.js.map} +1 -1
- package/dist/lib/{git-C-Q6-IVe.js → git-DhZoe1SE.js} +3 -3
- package/dist/lib/{git-C-Q6-IVe.js.map → git-DhZoe1SE.js.map} +1 -1
- package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js → iframe-sanitizer-Bujgq14T.js} +2 -2
- package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js.map → iframe-sanitizer-Bujgq14T.js.map} +1 -1
- package/dist/lib/index.js +27 -27
- package/dist/lib/{initChatSplitResize-yyBTU6h9.js → initChatSplitResize-BjiWoqC_.js} +2 -2
- package/dist/lib/{initChatSplitResize-yyBTU6h9.js.map → initChatSplitResize-BjiWoqC_.js.map} +1 -1
- package/dist/lib/{initControlPlane-DnpAzphg.js → initControlPlane-C9JxQCDh.js} +16 -16
- package/dist/lib/{initControlPlane-DnpAzphg.js.map → initControlPlane-C9JxQCDh.js.map} +1 -1
- package/dist/lib/{markdown-DgdSt2GD.js → markdown-DYHmNjC4.js} +126 -5
- package/dist/lib/markdown-DYHmNjC4.js.map +1 -0
- package/dist/lib/{mcp-reconnect-C86MR3z8.js → mcp-reconnect-BxJ77WSb.js} +2 -2
- package/dist/lib/{mcp-reconnect-C86MR3z8.js.map → mcp-reconnect-BxJ77WSb.js.map} +1 -1
- package/dist/lib/{memoryStorage-UR8E8K-H.js → memoryStorage-D3FBwO9T.js} +2 -2
- package/dist/lib/{memoryStorage-UR8E8K-H.js.map → memoryStorage-D3FBwO9T.js.map} +1 -1
- package/dist/lib/{orchestrator-ClXbJ4Mb.js → orchestrator-C6dc-2OQ.js} +130 -27
- package/dist/lib/{orchestrator-ClXbJ4Mb.js.map → orchestrator-C6dc-2OQ.js.map} +1 -1
- package/dist/lib/{orchestrator-CjEau_RG.js → orchestrator-DVkyd8K9.js} +27 -17
- package/dist/lib/orchestrator-DVkyd8K9.js.map +1 -0
- package/dist/lib/{peerjs-BdfpltIe.js → peerjs-BUS9O04I.js} +274 -60
- package/dist/lib/peerjs-BUS9O04I.js.map +1 -0
- package/dist/lib/{push-client-DjwKknNg.js → push-client-4JsQGmQa.js} +3 -3
- package/dist/lib/{push-client-DjwKknNg.js.map → push-client-4JsQGmQa.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js → readGroupFileBytes-CSA7u-nJ.js} +2 -2
- package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js.map → readGroupFileBytes-CSA7u-nJ.js.map} +1 -1
- package/dist/lib/{shadow-claw-DcPGKenn.js → shadow-claw-BMoF8Auf.js} +11 -11
- package/dist/lib/{shadow-claw-DcPGKenn.js.map → shadow-claw-BMoF8Auf.js.map} +1 -1
- package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js → shadow-claw-a2ui-2I5nffIn.js} +2 -2
- package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js.map → shadow-claw-a2ui-2I5nffIn.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-03oJ__XC.js → shadow-claw-accounts-BCjlgvzy.js} +3 -3
- package/dist/lib/{shadow-claw-accounts-03oJ__XC.js.map → shadow-claw-accounts-BCjlgvzy.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js → shadow-claw-channel-config-CxQAmlDE.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js.map → shadow-claw-channel-config-CxQAmlDE.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-BgaJiPdE.js → shadow-claw-channels-CuYMUVAG.js} +3 -3
- package/dist/lib/{shadow-claw-channels-BgaJiPdE.js.map → shadow-claw-channels-CuYMUVAG.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-mXPQZbwT.js → shadow-claw-chat-RFtPmmyl.js} +13 -12
- package/dist/lib/shadow-claw-chat-RFtPmmyl.js.map +1 -0
- package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js → shadow-claw-control-plane-siqmRzR1.js} +7 -7
- package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js.map → shadow-claw-control-plane-siqmRzR1.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js → shadow-claw-conversations-DygK5y1e.js} +7 -7
- package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js.map → shadow-claw-conversations-DygK5y1e.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-BSbZvSl-.js → shadow-claw-file-viewer-DGMA7d7H.js} +11 -11
- package/dist/lib/shadow-claw-file-viewer-DGMA7d7H.js.map +1 -0
- package/dist/lib/{shadow-claw-files-BLVr9Pua.js → shadow-claw-files-CgD1B9J7.js} +8 -8
- package/dist/lib/{shadow-claw-files-BLVr9Pua.js.map → shadow-claw-files-CgD1B9J7.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-CHC1H86J.js → shadow-claw-git-Bw1jGRrf.js} +6 -6
- package/dist/lib/{shadow-claw-git-CHC1H86J.js.map → shadow-claw-git-Bw1jGRrf.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js → shadow-claw-integrations-ChaXtvsg.js} +4 -4
- package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js.map → shadow-claw-integrations-ChaXtvsg.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-CKXfxd3D.js → shadow-claw-llm-CDM4Akjc.js} +6 -6
- package/dist/lib/{shadow-claw-llm-CKXfxd3D.js.map → shadow-claw-llm-CDM4Akjc.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js → shadow-claw-mcp-remote-BLxs_Z4I.js} +4 -4
- package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js.map → shadow-claw-mcp-remote-BLxs_Z4I.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-dpYvfchh.js → shadow-claw-networking-BYt-kMSI.js} +2 -2
- package/dist/lib/{shadow-claw-networking-dpYvfchh.js.map → shadow-claw-networking-BYt-kMSI.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-_YeAVPga.js → shadow-claw-notifications-Dpe4EtZI.js} +3 -3
- package/dist/lib/{shadow-claw-notifications-_YeAVPga.js.map → shadow-claw-notifications-Dpe4EtZI.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js → shadow-claw-page-header-P4EvWyUr.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js.map → shadow-claw-page-header-P4EvWyUr.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-DVzZriZ7.js → shadow-claw-pages-DWd_c4d6.js} +10 -10
- package/dist/lib/{shadow-claw-pages-DVzZriZ7.js.map → shadow-claw-pages-DWd_c4d6.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js → shadow-claw-peerjs-D928817m.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js.map → shadow-claw-peerjs-D928817m.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js → shadow-claw-settings-C8OPrSqs.js} +8 -8
- package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js.map → shadow-claw-settings-C8OPrSqs.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-Bv__kXG6.js → shadow-claw-storage-CZ2uZJNw.js} +5 -5
- package/dist/lib/{shadow-claw-storage-Bv__kXG6.js.map → shadow-claw-storage-CZ2uZJNw.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js → shadow-claw-task-server-CLT018BX.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js.map → shadow-claw-task-server-CLT018BX.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-qmcDT4PU.js → shadow-claw-tasks-D5h-lGmq.js} +9 -8
- package/dist/lib/shadow-claw-tasks-D5h-lGmq.js.map +1 -0
- package/dist/lib/{shadow-claw-terminal-0QUWP8of.js → shadow-claw-terminal-Cy1O6KVM.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-0QUWP8of.js.map → shadow-claw-terminal-Cy1O6KVM.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js → shadow-claw-tools-CVD06bCR.js} +9 -9
- package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js.map → shadow-claw-tools-CVD06bCR.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js → shadow-claw-webvm-DoGl5ZSJ.js} +3 -3
- package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js.map → shadow-claw-webvm-DoGl5ZSJ.js.map} +1 -1
- package/dist/lib/subsystems/channels/peerjs.d.ts +37 -4
- package/dist/lib/subsystems/channels/room.d.ts +4 -0
- package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js → syncWebMcpRegistration-BeYkQEvj.js} +5 -5
- package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js.map → syncWebMcpRegistration-BeYkQEvj.js.map} +1 -1
- package/dist/lib/tools-C3Kft940.js +1 -0
- package/dist/lib/{tools-DBaMRiEu.js → tools-DKzPWc0q.js} +2 -2
- package/dist/lib/{tools-DBaMRiEu.js.map → tools-DKzPWc0q.js.map} +1 -1
- package/dist/lib/{tools-DwwB9RBa.js → tools-DqcJe8LS.js} +5 -5
- package/dist/lib/{tools-DwwB9RBa.js.map → tools-DqcJe8LS.js.map} +1 -1
- package/dist/lib/{trusted-types-Dx0RZlrd.js → trusted-types-Oz7xXJAY.js} +4 -4
- package/dist/lib/{trusted-types-Dx0RZlrd.js.map → trusted-types-Oz7xXJAY.js.map} +1 -1
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/namespacedStorage.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/{webmcp-j_1_T3wf.js → webmcp-BC8_WafM.js} +4 -4
- package/dist/lib/{webmcp-j_1_T3wf.js.map → webmcp-BC8_WafM.js.map} +1 -1
- package/dist/lib/worker/utils/system-prompt.d.ts +4 -1
- package/dist/public/.agents/skills/main/skill-creator/SKILL.md +3 -2
- package/dist/public/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/dist/public/.well-known/agent-skills/index.json +1 -1
- package/dist/public/.well-known/mcp/server-card.json +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/agent.worker.js +18 -17
- package/dist/public/app-routes-BMQ4HFaM.js +1 -0
- package/dist/public/{bundler-Ca-Xwln8.js → bundler-0if-QelV.js} +4 -4
- package/dist/public/{config-CrHchneq.js → config-Bnwx4EfS.js} +1 -1
- package/dist/public/{configurePeerJs-B470pdeU.js → configurePeerJs-DkyGvwk_.js} +1 -1
- package/dist/public/{connections-DvbgdkaB.js → connections-6575KDGE.js} +1 -1
- package/dist/public/{custom-element-security-FU04Cq05.js → custom-element-security-BQJQ_oKz.js} +1 -1
- package/dist/public/docs/example/article/index.html +2 -2
- package/dist/public/docs/publishing/index.html +2 -2
- package/dist/public/docs/skill-creator/index.html +2 -2
- package/dist/public/docs/subsystems/skills.md +3 -1
- package/dist/public/{downloadGroupFile-D8KRJGGL.js → downloadGroupFile-Wo1Sxdhr.js} +1 -1
- package/dist/public/{e2e-bridge-CSW0S5Yz.js → e2e-bridge-CvLCUU2O.js} +1 -1
- package/dist/public/{file-viewer-Cs-riNvy.js → file-viewer-CIjqAvNF.js} +1 -1
- package/dist/public/{getGroupDir-P1h9wl6S.js → getGroupDir-BwprrdrQ.js} +1 -1
- package/dist/public/{git-7Vq_SJSp.js → git-BSnY2D-A.js} +2 -2
- package/dist/public/{iframe-sanitizer-y2Z1pPwY.js → iframe-sanitizer-viROQkRn.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/public/index.js +1 -1
- package/dist/public/{initChatSplitResize-CzV2E7Ul.js → initChatSplitResize-BA18wLQQ.js} +1 -1
- package/dist/public/{initControlPlane-BqCY0NQy.js → initControlPlane-L96uJkRA.js} +1 -1
- package/dist/public/main/index.html +2 -2
- package/dist/public/main/memory/index.html +2 -2
- package/dist/public/{markdown-Cw7vCtTg.js → markdown-DGjZAm_w.js} +17 -14
- package/dist/public/{mcp-reconnect-9emsqGRe.js → mcp-reconnect-CBHuaYdF.js} +1 -1
- package/dist/public/{memoryStorage-C0KvLNUp.js → memoryStorage-C1llaYus.js} +1 -1
- package/dist/public/orchestrator-C0VOoTiK.js +15 -0
- package/dist/public/{orchestrator-DpkkeD6T.js → orchestrator-DMWi--Dc.js} +20 -19
- package/dist/public/peerjs-Bf6ZxfbA.js +1 -0
- package/dist/public/{push-client-CHjSbrWs.js → push-client-BD4YalBa.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-BBPV_9X8.js → shadow-claw-DRy-D4Qi.js} +2 -2
- package/dist/public/{shadow-claw-accounts-xUOLBsQZ.js → shadow-claw-accounts-DnfmA8cb.js} +1 -1
- package/dist/public/{shadow-claw-channels-BJvrKQjg.js → shadow-claw-channels-8UkycZAa.js} +1 -1
- package/dist/public/{shadow-claw-chat-BG2EaRaw.js → shadow-claw-chat-Cf5LUiul.js} +9 -9
- package/dist/public/{shadow-claw-control-plane-BBa7WbTg.js → shadow-claw-control-plane-UsBF-Nvd.js} +2 -2
- package/dist/public/{shadow-claw-conversations-CFaWFmkm.js → shadow-claw-conversations-Aoe61Y21.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-Z-GIKaE9.js → shadow-claw-file-viewer-D28dSSEn.js} +6 -6
- package/dist/public/{shadow-claw-files-BBx4iMsk.js → shadow-claw-files-CaDUlPEU.js} +1 -1
- package/dist/public/{shadow-claw-git-vTOKatwd.js → shadow-claw-git-DYNcZMWA.js} +2 -2
- package/dist/public/{shadow-claw-integrations-BBVnO0Fc.js → shadow-claw-integrations-BJf_hQVv.js} +1 -1
- package/dist/public/{shadow-claw-llm-Ce1Ax6-x.js → shadow-claw-llm-BqK2SIRf.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-Bkx0gsmF.js → shadow-claw-mcp-remote-B_dDG990.js} +1 -1
- package/dist/public/{shadow-claw-networking-q4XIzdB5.js → shadow-claw-networking-D8LxOofv.js} +1 -1
- package/dist/public/{shadow-claw-notifications-D2cz0gmm.js → shadow-claw-notifications-DpVyiNG_.js} +1 -1
- package/dist/public/{shadow-claw-page-header-BccSHItx.js → shadow-claw-page-header-DdC7bJuW.js} +1 -1
- package/dist/public/{shadow-claw-pages-3335lmSC.js → shadow-claw-pages-CYMl4J-6.js} +3 -3
- package/dist/public/{shadow-claw-settings-4ptYuJwO.js → shadow-claw-settings-Da_8Oy3O.js} +3 -3
- package/dist/public/{shadow-claw-storage-bIrPKFhF.js → shadow-claw-storage-DXIm86_-.js} +1 -1
- package/dist/public/{shadow-claw-task-server-5yqVBxy1.js → shadow-claw-task-server-BCceBD0G.js} +1 -1
- package/dist/public/{shadow-claw-tasks-DcqYHPLZ.js → shadow-claw-tasks-BW1QZ5L3.js} +19 -19
- package/dist/public/{shadow-claw-terminal-fARaDONr.js → shadow-claw-terminal-vqfsxhcK.js} +1 -1
- package/dist/public/{shadow-claw-tools-paEAhcJr.js → shadow-claw-tools-l0Jsa7UJ.js} +1 -1
- package/dist/public/{shadow-claw-webvm-CbzH_vyX.js → shadow-claw-webvm-CDPOWZm7.js} +1 -1
- package/dist/public/skills/main/skill-creator/SKILL.md +3 -2
- package/dist/public/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/dist/public/static-main-manifest.json +2 -2
- package/dist/public/{syncWebMcpRegistration-CWSYaHex.js → syncWebMcpRegistration-5b5FkP9_.js} +1 -1
- package/dist/public/tools-B-PzsLc2.js +1 -0
- package/dist/public/{tools-C8x3nmo4.js → tools-CcgG5XuA.js} +1 -1
- package/dist/public/{tools-DvckJZG2.js → tools-VSOY66vs.js} +1 -1
- package/dist/public/{webmcp-DAjmliCx.js → webmcp-DBONjQWd.js} +1 -1
- package/dist/server.js +2 -2
- package/package.json +2 -2
- package/src/__mocks__/marked.cjs +14 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +17 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.ts +5 -1
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +78 -0
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +6 -2
- package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +56 -0
- package/src/components/shadow-claw-tasks/shadow-claw-tasks.test.ts +22 -0
- package/src/components/shadow-claw-tasks/shadow-claw-tasks.ts +5 -1
- package/src/content/markdown-links.test.ts +109 -0
- package/src/content/markdown-links.ts +187 -0
- package/src/content/markdown.test.ts +33 -0
- package/src/content/markdown.ts +6 -1
- package/src/core/app-routes.test.ts +65 -0
- package/src/core/app-routes.ts +1 -1
- package/src/core/orchestrator/orchestrator.ts +3 -0
- package/src/core/orchestrator/utils/compactContext.ts +2 -0
- package/src/core/orchestrator/utils/invokeAgent.ts +1 -0
- package/src/subsystems/accounts/service-accounts.test.ts +0 -1
- package/src/subsystems/channels/peerjs.test.ts +479 -1
- package/src/subsystems/channels/peerjs.ts +420 -75
- package/src/subsystems/channels/room.test.ts +35 -0
- package/src/subsystems/channels/room.ts +15 -0
- package/src/subsystems/skills/activateSkill.test.ts +38 -5
- package/src/subsystems/skills/activateSkill.ts +25 -3
- package/src/subsystems/skills/parseSkill.test.ts +71 -0
- package/src/subsystems/skills/parseSkill.ts +185 -25
- package/src/subsystems/tools/files.ts +4 -4
- package/src/worker/tools/spawn-subagent/spawn-subagent.test.ts +22 -23
- package/src/worker/tools/workspace/send-file.test.ts +24 -1
- package/src/worker/tools/workspace/send-file.ts +6 -3
- package/src/worker/utils/handleCompact.test.ts +3 -4
- package/src/worker/utils/handleInvoke.test.ts +13 -11
- package/src/worker/utils/handleInvoke.ts +3 -0
- package/src/worker/utils/handleMessage.test.ts +0 -1
- package/src/worker/utils/post.test.ts +3 -4
- package/src/worker/utils/sandboxedEval.test.ts +1 -2
- package/src/worker/utils/system-prompt.test.ts +59 -0
- package/src/worker/utils/system-prompt.ts +21 -1
- package/src/worker/utils/withRetry.test.ts +3 -16
- package/dist/lib/app-routes-CqBOeA5q.js.map +0 -1
- package/dist/lib/markdown-DgdSt2GD.js.map +0 -1
- package/dist/lib/orchestrator-CjEau_RG.js.map +0 -1
- package/dist/lib/peerjs-BdfpltIe.js.map +0 -1
- package/dist/lib/shadow-claw-chat-mXPQZbwT.js.map +0 -1
- package/dist/lib/shadow-claw-file-viewer-BSbZvSl-.js.map +0 -1
- package/dist/lib/shadow-claw-tasks-qmcDT4PU.js.map +0 -1
- package/dist/lib/tools-D4Pp-nUw.js +0 -1
- package/dist/public/app-routes-Bs-riIvr.js +0 -1
- package/dist/public/orchestrator-BWkHHO9Y.js +0 -15
- package/dist/public/peerjs-tf2EmWjB.js +0 -1
- package/dist/public/tools-COduyYJ0.js +0 -1
package/dist/public/{shadow-claw-control-plane-BBa7WbTg.js → shadow-claw-control-plane-UsBF-Nvd.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./config-
|
|
1
|
+
import{r as e}from"./config-Bnwx4EfS.js";import{n as t}from"./txPromise-EBECky1b.js";import{t as n}from"./getConfig-D89uJgo5.js";import{t as r}from"./orchestrator-DMWi--Dc.js";import{t as i}from"./setConfig-DFMYnYLE.js";import{a,r as o}from"./toast-BXgUfbyh.js";import{t as s}from"./shadow-claw-element-DIrv3P6A.js";import{t as c}from"./effect-BJCrpFdp.js";const l=new CSSStyleSheet;l.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
font-family: var(--shadow-claw-font-sans);
|
|
@@ -240,4 +240,4 @@ import{r as e}from"./config-CrHchneq.js";import{n as t}from"./txPromise-EBECky1b
|
|
|
240
240
|
</div>
|
|
241
241
|
</div>
|
|
242
242
|
</template>
|
|
243
|
-
`,`text/html`),d=u.querySelector(`template`);let f=[];f=d?Array.from(d.content.children):Array.from(u.head.children).concat(Array.from(u.body.children));var p=f;const m=`shadow-claw-control-plane`;function h(e){try{let t=new URL(e).hostname.toLowerCase();if(t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`)return`loopback`;if(/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(t)||!t.includes(`.`)||t.endsWith(`.local`)||t.endsWith(`.lan`)||t.endsWith(`.home`)||t.endsWith(`.internal`))return`private`}catch{}}var g=class extends s{static styles=l;static template=p;db;orchestrator;constructor(){super(),this.db=null,this.orchestrator=null}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=r.orchestrator,this.bindEventListeners(),this.setupEffects(),await this.render()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="save-control-plane-transport"]`)?.addEventListener(`click`,()=>{this.saveControlPlaneTransport()}),e.querySelector(`[data-action="save-control-plane-url"]`)?.addEventListener(`click`,()=>{this.saveControlPlaneUrl()}),e.querySelector(`[data-action="test-control-plane-connection"]`)?.addEventListener(`click`,()=>{this.testControlPlaneConnection()}),e.querySelector(`[data-setting="control-plane-enabled-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;this.saveControlPlaneEnabled(t.checked)}))}setupEffects(){c(()=>{r.ready&&(this.orchestrator=r.orchestrator,this.render())})}async render(){let t=this.shadowRoot;if(!t)return;let r=t.querySelector(`[data-setting="control-plane-enabled-toggle"]`);if(r&&this.db)try{let{isControlPlaneEnabled:e}=await import(`./initControlPlane-
|
|
243
|
+
`,`text/html`),d=u.querySelector(`template`);let f=[];f=d?Array.from(d.content.children):Array.from(u.head.children).concat(Array.from(u.body.children));var p=f;const m=`shadow-claw-control-plane`;function h(e){try{let t=new URL(e).hostname.toLowerCase();if(t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`)return`loopback`;if(/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(t)||!t.includes(`.`)||t.endsWith(`.local`)||t.endsWith(`.lan`)||t.endsWith(`.home`)||t.endsWith(`.internal`))return`private`}catch{}}var g=class extends s{static styles=l;static template=p;db;orchestrator;constructor(){super(),this.db=null,this.orchestrator=null}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.db=await t(),this.orchestrator=r.orchestrator,this.bindEventListeners(),this.setupEffects(),await this.render()}bindEventListeners(){let e=this.shadowRoot;e&&(e.querySelector(`[data-action="save-control-plane-transport"]`)?.addEventListener(`click`,()=>{this.saveControlPlaneTransport()}),e.querySelector(`[data-action="save-control-plane-url"]`)?.addEventListener(`click`,()=>{this.saveControlPlaneUrl()}),e.querySelector(`[data-action="test-control-plane-connection"]`)?.addEventListener(`click`,()=>{this.testControlPlaneConnection()}),e.querySelector(`[data-setting="control-plane-enabled-toggle"]`)?.addEventListener(`change`,e=>{let t=e.target;this.saveControlPlaneEnabled(t.checked)}))}setupEffects(){c(()=>{r.ready&&(this.orchestrator=r.orchestrator,this.render())})}async render(){let t=this.shadowRoot;if(!t)return;let r=t.querySelector(`[data-setting="control-plane-enabled-toggle"]`);if(r&&this.db)try{let{isControlPlaneEnabled:e}=await import(`./initControlPlane-L96uJkRA.js`);r.checked=await e(this.db)}catch{r.checked=!1}let i=t.querySelector(`[data-setting="control-plane-url-input"]`);if(i&&this.db)try{i.value=await n(this.db,e.CONTROL_PLANE_URL)||``}catch{i.value=``}let a=t.querySelector(`[data-setting="control-plane-transport-select"]`);if(a&&this.db)try{a.value=await n(this.db,e.CONTROL_PLANE_TRANSPORT)||`sse`}catch{a.value=`sse`}}async requestAppDialog(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog(e):!1}async probeControlPlane(e){let t;try{t=new URL(e)}catch{return{success:!1,error:`Invalid URL format: "${e}"`}}let n=h(e),r={method:`GET`,cache:`no-store`,mode:`cors`};n&&(r.targetAddressSpace=n);try{let e=new URL(`/api/control/health`,t).toString(),n=await fetch(e,r);if(n.status===404){let e=new URL(`/api/control/messages`,t).toString();n=await fetch(e,{...r,method:`OPTIONS`})}return n.ok||n.status===204||n.status===401?{success:!0}:{success:!1,error:`Server responded with HTTP ${n.status} (${n.statusText||`Error`})`}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async testControlPlaneConnection(){let e=this.shadowRoot;if(!e)return!1;let t=e.querySelector(`[data-setting="control-plane-url-input"]`),n=e.querySelector(`[data-action="test-control-plane-connection"]`),r=t?.value.trim()||`http://127.0.0.1:8888`;n&&(n.disabled=!0,n.textContent=`⏳ Testing...`);try{let e=await this.probeControlPlane(r);return e.success?(a(`Successfully reached Control Plane at ${r}`,4e3),!0):(o(`Connection test failed: ${e.error||`Unknown connection error`}`,6e3),await this.requestAppDialog({title:`Control Plane Connection Failed`,message:`Unable to connect to "${r}".\n\n• TLS / Certificate: If using HTTPS with a self-signed certificate, ensure the certificate is installed and trusted in Chrome (chrome://certificate-manager/localcerts/usercerts).\n• Chrome Permissions: In Site Settings, ensure "Local network access" is allowed.\n• Server Status: Verify the ShadowClaw dev server is running and listening on this host/port.`,confirmLabel:`OK`}),!1)}finally{n&&(n.disabled=!1,n.textContent=`🔌 Test Connection`)}}async saveControlPlaneTransport(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="control-plane-transport-select"]`);if(!n)return;let r=n.value===`websocket`?`websocket`:`sse`;try{if(await i(this.db,e.CONTROL_PLANE_TRANSPORT,r),typeof localStorage<`u`)try{localStorage.setItem(e.CONTROL_PLANE_TRANSPORT,r)}catch{}let{isControlPlaneEnabled:t,ensureControlPlaneConnected:n,shouldConnectControlPlane:o}=await import(`./initControlPlane-L96uJkRA.js`);await t(this.db)&&o()&&await n({orchestrator:this.orchestrator||void 0,db:this.db,force:!0,transport:r}),a(`Control Plane transport saved: ${r.toUpperCase()}`,3e3)}catch(e){o(`Error saving Control Plane transport: `+(e instanceof Error?e.message:String(e)),6e3)}}async saveControlPlaneUrl(){if(!this.db)return;let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`[data-setting="control-plane-url-input"]`);if(!n)return;let r=n.value.trim();try{if(r&&this.probeControlPlane(r),await i(this.db,e.CONTROL_PLANE_URL,r),typeof localStorage<`u`)try{r?localStorage.setItem(e.CONTROL_PLANE_URL,r):localStorage.removeItem(e.CONTROL_PLANE_URL)}catch{}let{isControlPlaneEnabled:t,ensureControlPlaneConnected:n,shouldConnectControlPlane:o}=await import(`./initControlPlane-L96uJkRA.js`);await t(this.db)&&o()&&await n({orchestrator:this.orchestrator||void 0,db:this.db,force:!0}),a(r?`Control Plane URL saved: ${r}`:`Control Plane URL reset to default`,3e3)}catch(e){o(`Error saving Control Plane URL: `+(e instanceof Error?e.message:String(e)),6e3)}}async saveControlPlaneEnabled(t){if(this.db)try{if(t){let t=await n(this.db,e.CONTROL_PLANE_URL)||`http://127.0.0.1:8888`;this.probeControlPlane(t)}if(await i(this.db,e.CONTROL_PLANE_ENABLED,t?`true`:`false`),typeof localStorage<`u`)try{localStorage.setItem(e.CONTROL_PLANE_ENABLED,t?`true`:`false`)}catch{}let{ensureControlPlaneConnected:r,stopControlPlaneClient:o,shouldConnectControlPlane:s}=await import(`./initControlPlane-L96uJkRA.js`);t?(s()&&await r({orchestrator:this.orchestrator||void 0,db:this.db,force:!0}),a(`Control plane client enabled and connected`,3e3)):(o(),a(`Control plane client disabled`,3e3))}catch(e){o(`Error saving Control Plane setting: `+(e instanceof Error?e.message:String(e)),6e3)}}};customElements.get(m)||customElements.define(m,g);export{g as ShadowClawControlPlane,h as getControlPlaneTargetAddressSpace};
|
package/dist/public/{shadow-claw-conversations-CFaWFmkm.js → shadow-claw-conversations-Aoe61Y21.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./config-
|
|
1
|
+
import{r as e}from"./config-Bnwx4EfS.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-BQJQ_oKz.js";import{K as i,Y as a,t as o}from"./orchestrator-DMWi--Dc.js";import{i as s,t as c}from"./tools-VSOY66vs.js";import{t as l}from"./setConfig-DFMYnYLE.js";import{t as u}from"./tools-CcgG5XuA.js";import"./tools-B-PzsLc2.js";import{t as d}from"./shadow-claw-element-DIrv3P6A.js";import{t as f}from"./effect-BJCrpFdp.js";import{n as p}from"./model-ranking-C60HgQ2c.js";import"./shadow-claw-dialog-BrOwAOdk.js";const m=new CSSStyleSheet;m.replaceSync(`:host {
|
|
2
2
|
display: block;
|
|
3
3
|
}
|
|
4
4
|
|
package/dist/public/{shadow-claw-file-viewer-Z-GIKaE9.js → shadow-claw-file-viewer-D28dSSEn.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./config-
|
|
1
|
+
import{r as e}from"./config-Bnwx4EfS.js";import{c as t,d as n,i as r,n as i,o as a,s as o}from"./app-routes-BMQ4HFaM.js";import{n as s}from"./txPromise-EBECky1b.js";import{t as c}from"./getConfig-D89uJgo5.js";import{d as l,f as u,i as d,l as f,n as p,r as m,s as h,u as g}from"./custom-element-security-BQJQ_oKz.js";import{gn as _,sn as v,t as y}from"./orchestrator-DMWi--Dc.js";import{t as b}from"./tools-VSOY66vs.js";import{a as x,r as S}from"./toast-BXgUfbyh.js";import{t as C}from"./shadow-claw-element-DIrv3P6A.js";import{t as w}from"./effect-BJCrpFdp.js";import{t as T}from"./config-value-oBfKgLT4.js";import{n as E,r as D,t as O}from"./markdown-DGjZAm_w.js";import{t as k}from"./file-viewer-CIjqAvNF.js";import"./shadow-claw-dialog-BrOwAOdk.js";import{a as A,c as j,i as M,n as N,o as P,r as F,s as I,t as L}from"./iframe-storage-proxy-B9Zt-vJ2.js";const R=new CSSStyleSheet;R.replaceSync(`*,
|
|
2
2
|
*::before,
|
|
3
3
|
*::after {
|
|
4
4
|
box-sizing: border-box;
|
|
@@ -488,7 +488,7 @@ pre {
|
|
|
488
488
|
background-color: var(--shadow-claw-bg-tertiary);
|
|
489
489
|
border-left: 0.1875rem solid var(--shadow-claw-accent-primary);
|
|
490
490
|
}
|
|
491
|
-
`);const
|
|
491
|
+
`);const z=new DOMParser().parseFromString(`<template>
|
|
492
492
|
<shadow-claw-dialog dialog-class="file-modal" dialog-aria-label="File viewer">
|
|
493
493
|
<div class="modal-content">
|
|
494
494
|
<div class="modal-header">
|
|
@@ -571,8 +571,8 @@ pre {
|
|
|
571
571
|
</div>
|
|
572
572
|
</shadow-claw-dialog>
|
|
573
573
|
</template>
|
|
574
|
-
`,`text/html`),z=R.querySelector(`template`);let B=[];B=z?Array.from(z.content.children):Array.from(R.head.children).concat(Array.from(R.body.children));var V=B;const H=`shadow-claw-file-viewer`,U=`components/${H}/highlightjs-atom-one-dark.min.css`,W=`pre code.hljs, code.hljs, .hljs { font-family: var(--shadow-claw-font-mono) !important; }`,G={ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|ftp|tel|file|blob|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,ADD_TAGS:[`iframe`,`figure`,`figcaption`],CUSTOM_ELEMENT_HANDLING:{tagNameCheck:e=>m(e),attributeNameCheck:()=>!0,allowCustomizedBuiltInElements:!1},ADD_ATTR:[`allow`,`allowfullscreen`,`frameborder`,`scrolling`,`referrerpolicy`,`loading`]};function K(e,t){return!e||typeof e.transaction!=`function`||s(e,t).then(e=>w(e,!0)).catch(()=>!0)}var q=class extends S{static styles=L;static template=V;broadcastProxy=null;currentImageObjectUrls=[];currentObjectUrl=null;db=null;editorDraftContent=null;isEditorDirty=!1;isFileEditMode=!1;isFilePreviewMode=!1;isFullscreenMode=!1;lastOpenedFileName=``;previewFrameWindow=null;themeObserver=null;viewRenderToken=0;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.setupEffects(),this.bindEventListeners(),this.broadcastProxy=new N(()=>this.previewFrameWindow||this.shadowRoot?.querySelector(`.file-content-iframe`)?.contentWindow||null),window.addEventListener(`message`,this.handleIframeMessage),document.addEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver=new MutationObserver(e=>{for(let t of e)t.type===`attributes`&&t.attributeName===`class`&&this.syncIframeTheme()}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),this.db=await o();try{let e=await fetch(U).then(e=>e.text());this.applyHighlightStyles(e)}catch(e){console.warn(`Failed to load highlight.js styles:`,e)}}disconnectedCallback(){this.broadcastProxy?.dispose(),this.broadcastProxy=null,window.removeEventListener(`message`,this.handleIframeMessage),document.removeEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver&&=(this.themeObserver.disconnect(),null),this.revokeObjectUrl()}applyFullscreenMode(e){let t=e.querySelector(`.modal-content`);t instanceof HTMLElement&&t.classList.toggle(`modal-content--fullscreen`,this.isFullscreenMode);let n=e.querySelector(`.modal-fullscreen-btn`);n instanceof HTMLButtonElement&&(n.setAttribute(`aria-pressed`,String(this.isFullscreenMode)),n.setAttribute(`aria-label`,this.isFullscreenMode?`Exit fullscreen`:`Enter fullscreen`),n.title=this.isFullscreenMode?`Exit fullscreen`:`Fullscreen`)}applyHighlightStyles(e){let t=this.shadowRoot;if(!t)return;if(typeof CSSStyleSheet<`u`&&typeof CSSStyleSheet.prototype.replaceSync==`function`&&`adoptedStyleSheets`in t)try{let n=new CSSStyleSheet;n.replaceSync(e);let r=new CSSStyleSheet;r.replaceSync(W),t.adoptedStyleSheets=[...t.adoptedStyleSheets?Array.from(t.adoptedStyleSheets):[],n,r];return}catch{}let n=document.createElement(`style`);n.setAttribute(`data-shadow-claw-highlight-theme`,`true`),n.textContent=`${e}\n${W}`,t.appendChild(n)}bindEventListeners(){let e=this.shadowRoot;if(!e)return;e.querySelector(`.file-content`)?.addEventListener(`click`,e=>{this.handlePreviewLinkClick(e)});let t=e.querySelector(`.file-modal`);t?.addEventListener(`cancel`,e=>{e.preventDefault(),this.requestCloseViewer()}),t?.addEventListener(`close`,()=>{O.file&&O.closeFile()}),e.querySelector(`.modal-close-btn`)?.addEventListener(`click`,()=>void this.requestCloseViewer()),e.querySelector(`.modal-preview-btn`)?.addEventListener(`click`,async()=>{this.isFilePreviewMode=!this.isFilePreviewMode,this.isFileEditMode=!1,await this.updateView()}),e.querySelector(`.modal-fullscreen-btn`)?.addEventListener(`click`,()=>{t&&this.toggleFullscreenMode(t)}),e.querySelector(`.modal-share-btn`)?.addEventListener(`click`,async()=>{await this.handleShareFile()}),e.querySelector(`.modal-edit-btn`)?.addEventListener(`click`,async()=>{this.isFileEditMode=!this.isFileEditMode,this.isFileEditMode&&(this.isFilePreviewMode=!1),await this.updateView()}),e.querySelector(`.modal-save-btn`)?.addEventListener(`click`,()=>this.handleSave()),e.querySelector(`.modal-cancel-btn`)?.addEventListener(`click`,async()=>{this.isEditorDirty=!1,this.editorDraftContent=null,this.isFileEditMode=!1,await this.updateView()});let n=e.querySelector(`.file-editor`);if(n?.addEventListener(`input`,()=>{n instanceof HTMLTextAreaElement&&(this.editorDraftContent=n.value,this.updateEditorHighlight(n.value)),this.isEditorDirty=!0,this.updateView()}),n instanceof HTMLTextAreaElement){let t=()=>{let t=e.querySelector(`.file-editor-overlay`);t&&(t.scrollTop=n.scrollTop,t.scrollLeft=n.scrollLeft)};n.addEventListener(`scroll`,t),n.addEventListener(`focus`,t),n.addEventListener(`click`,t),n.addEventListener(`keyup`,t),n.addEventListener(`mouseup`,t),e.querySelector(`.modal-body`)?.addEventListener(`scroll`,t)}}buildWebShareFile(e){if(e?.nativeFile instanceof File)return e.nativeFile;let t=e?.binaryContent;if(!(t instanceof Uint8Array)||t.length===0)return null;let n=new Uint8Array(t.byteLength);return n.set(t),new File([n],e.name||`shared-file`,{type:e?.mimeType||`application/octet-stream`})}canShareCurrentFile(e){if(!e||!this.isWebShareAvailable())return!1;if(e.kind===`text`)return!0;let t=this.buildWebShareFile(e);if(!t||typeof navigator.canShare!=`function`)return!1;try{return navigator.canShare({files:[t]})}catch{return!1}}canUseNativeFullscreen(e){return document.fullscreenEnabled===!0&&(typeof e.requestFullscreen==`function`||typeof e.webkitRequestFullscreen==`function`)&&(typeof document.exitFullscreen==`function`||typeof document.webkitExitFullscreen==`function`)}getCurrentFullscreenElement(){return document.fullscreenElement||document.webkitFullscreenElement||null}getFullscreenTarget(e){let t=e.querySelector(`.modal-content`);return t instanceof HTMLElement?t:null}getIframeBridgeScriptUrl(){return n(`/assets/file-viewer-preview-bridge.js`)}getIframeSandboxPermissions(e){return/\.svg$/i.test(e)?`allow-modals allow-popups allow-popups-to-escape-sandbox`:u()}getLanguageFromFilename(e){return{bash:`bash`,cjs:`javascript`,css:`css`,html:`xml`,java:`java`,javascript:`javascript`,js:`javascript`,json:`json`,jsx:`jsx`,markdown:`markdown`,md:`markdown`,mjs:`javascript`,php:`php`,python:`python`,py:`python`,ruby:`ruby`,rb:`ruby`,rust:`rust`,rs:`rust`,sh:`bash`,sql:`sql`,svg:`xml`,ts:`typescript`,tsx:`tsx`,xml:`xml`,yaml:`yaml`,yml:`yaml`}[e.toLowerCase().split(`.`).pop()||``]||``}getPreviewSourceFile(e,t){return this.getWorkingSourceFile(e,t)}getWorkingSourceFile(e,t){if(!this.isEditorDirty||e?.kind!==`text`)return e;if(typeof this.editorDraftContent==`string`)return{...e,content:this.editorDraftContent};let n=t.querySelector(`.file-editor`);return n instanceof HTMLTextAreaElement?{...e,content:n.value}:e}getWorkspaceRouteTarget(e,t={}){let{allowCrossGroup:n=!1}=t,i=e.split(/[?#]/,1)[0].trim();if(!i)return null;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(i)||i.startsWith(`//`)){let e;try{e=new URL(i,window.location.href)}catch{return null}if(e.origin!==window.location.origin)return null;i=e.pathname}let a=i.replace(/^(?:\.\/)+/u,``),o=[];if(a.startsWith(`files/`)&&o.push(`/${a}`),i.startsWith(`/`)){let e=i.lastIndexOf(`/files/`);e>0&&o.push(i.slice(e)),o.push(i)}for(let e of o){let t=r(e);if(!t)continue;let i=this.resolveRouteGroupId(t.groupId);if(i&&!(!n&&i!==v.activeGroupId))return{groupId:i,path:t.path}}return null}handleAnchorNavigation(e){let t=this.shadowRoot;if(!t)return!1;let n=t.querySelector(`.file-content`);if(!n)return!1;n.querySelectorAll(`.code-line.highlighted`).forEach(e=>{e.classList.remove(`highlighted`)});let r=e.match(/^#?L(\d+)(?:-L?(\d+))?$/i);if(r){let e=parseInt(r[1],10),t=r[2]?parseInt(r[2],10):e,i=null;return n.querySelectorAll(`.code-line`).forEach(n=>{let r=parseInt(n.getAttribute(`data-line`)||`0`,10);r>=e&&r<=t&&(n.classList.add(`highlighted`),i||=n)}),i?(i.scrollIntoView({behavior:`smooth`,block:`center`}),!0):!1}else{let t=e.replace(/^#/,``),r=n.querySelector(`[id="${t}"]`)||n.querySelector(`a[name="${t}"]`);return r?(r.scrollIntoView({behavior:`smooth`,block:`start`}),!0):!1}}handleFullscreenChange=()=>{let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);this.isFullscreenMode=this.isTargetInFullscreen(n),this.applyFullscreenMode(t)};handleIframeMessage=e=>{if(!e.data||typeof e.data!=`object`)return;let r=e.data;if(r.type===`shadow-claw-broadcast-result`&&typeof r.channel==`string`){this.broadcastProxy?.handleResultFromIframe(e.source,r.channel,r.payload);return}if(r.type===`shadow-claw-iframe-resize`&&typeof r.height==`number`){let t=this.shadowRoot?.querySelector(`.file-content-iframe`);t instanceof HTMLIFrameElement&&(!this.previewFrameWindow||e.source===this.previewFrameWindow||t.contentWindow&&e.source===t.contentWindow)&&(this.previewFrameWindow=t.contentWindow,t.style.setProperty(`height`,`${r.height}px`,`important`));return}if(r.type===`shadow-claw-storage-proxy`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let t=r;this.handleStorageProxyRequest(e.source,String(t.requestId||``),String(t.method||``),t.args&&typeof t.args==`object`?t.args:{});return}if(!this.db||r.type!==`shadow-claw-file-viewer-link`||typeof r.href!=`string`||this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let o=O.file,s=o?.path||o?.name||``,c=n(t(v.activeGroupId,s)),l=a(r.href,c,window.location.origin);if(!l)return;if(l.searchParams.has(`gameSave`)){this.reloadPreviewWithSearchParams(l.search);return}if(!(l.origin===window.location.origin&&(i(l.pathname)||this.resolveWorkspaceLinkPath(r.href,s)))){window.open(l.href,`_blank`,`noopener,noreferrer`);return}let u=`${l.pathname}${l.search}${l.hash}`,d=window.navigation;if(d&&typeof d.navigate==`function`){d.navigate(u);return}window.history.pushState({},``,u),window.dispatchEvent(new PopStateEvent(`popstate`))};hasUnsavedChanges(){return this.isEditorDirty}isIframePreviewFile(e){return/\.(?:html?|svg)$/i.test(e)}isMarkdownLikeFile(e){return/(?:^readme$|\.mdx?$|\.markdown$|\.mdown$)/i.test(e)}isNodeInComposedTree(e,t){let n=e;for(;n;){if(n===t)return!0;if(n.parentNode){n=n.parentNode;continue}let e=n.getRootNode?.();if(e instanceof ShadowRoot&&e.host){n=e.host;continue}n=null}return!1}isRenderTokenCurrent(e){return this.viewRenderToken===e}isTargetInFullscreen(e){if(!e)return!1;let t=this.getCurrentFullscreenElement();return t?t===e||this.isNodeInComposedTree(e,t)||this.isNodeInComposedTree(t,e):!1}isWebShareAvailable(){return typeof navigator<`u`&&typeof navigator.share==`function`}mimeTypeForImageExt(e){return{apng:`image/apng`,avif:`image/avif`,gif:`image/gif`,jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,webp:`image/webp`}[e]??`image/jpeg`}renderBinaryPreview(e,t){let n=t.mimeType||`application/octet-stream`;if(t.nativeFile instanceof File)this.currentObjectUrl=URL.createObjectURL(t.nativeFile);else{let r=t.binaryContent;if(!(r instanceof Uint8Array)||r.length===0){e.classList.remove(`file-content--raw`,`file-content--iframe`),e.classList.add(`file-content--preview`),e.textContent=`Binary content unavailable.`;return}let i=new Uint8Array(r.byteLength);i.set(r);let a=new Blob([i],{type:n});this.currentObjectUrl=URL.createObjectURL(a)}if(e.classList.remove(`file-content--raw`,`file-content--preview`),e.classList.add(`file-content--iframe`),n.startsWith(`image/`)){let n=document.createElement(`img`);n.className=`file-content-iframe`,n.alt=`Preview: ${t.name}`,n.src=this.currentObjectUrl,n.style.objectFit=`contain`,e.replaceChildren(n);return}if(n.startsWith(`video/`)){let t=document.createElement(`video`);t.className=`file-content-iframe`,t.controls=!0,t.src=this.currentObjectUrl,t.style.backgroundColor=`black`,e.replaceChildren(t);return}if(n.startsWith(`audio/`)){let n=document.createElement(`div`);n.className=`file-content file-content--preview`,n.style.padding=`1rem`;let r=document.createElement(`p`);r.textContent=t.name;let i=document.createElement(`audio`);i.controls=!0,i.src=this.currentObjectUrl,i.style.width=`100%`,n.replaceChildren(r,i),e.replaceChildren(n),e.classList.remove(`file-content--iframe`);return}let r=document.createElement(`iframe`);r.className=`file-content-iframe`,r.setAttribute(`title`,`Preview: ${t.name}`),r.setAttribute(`referrerpolicy`,`no-referrer`),r.src=this.currentObjectUrl,e.replaceChildren(r)}resetContent(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);n&&this.isTargetInFullscreen(n)&&this.exitNativeFullscreen().catch(()=>{}),this.isFullscreenMode=!1,this.applyFullscreenMode(t);let r=t.querySelector(`.file-content`),i=t.querySelector(`.modal-preview-btn`);i instanceof HTMLButtonElement&&(i.setAttribute(`aria-pressed`,`false`),i.setAttribute(`aria-label`,`Switch to preview mode`));let a=t.querySelector(`.modal-edit-btn`);a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,`false`),a.setAttribute(`aria-label`,`Edit file`),a.classList.remove(`hidden`));let o=t.querySelector(`.modal-close-btn`);o instanceof HTMLButtonElement&&(o.disabled=!1,o.setAttribute(`aria-label`,`Close file viewer`),o.title=`Close`),t.querySelector(`.modal-save-btn`)?.classList.add(`hidden`),t.querySelector(`.file-editor-container`)?.classList.remove(`active`),t.querySelector(`.modal-body`)?.classList.remove(`modal-body--editing`);let s=t.querySelector(`.file-editor`);s instanceof HTMLTextAreaElement&&(s.value=``,s.removeAttribute(`language`));let c=t.querySelector(`.file-editor-overlay code`);c&&(c.innerHTML=``,c.className=`hljs`),this.isFileEditMode=!1,this.editorDraftContent=null,r instanceof HTMLElement&&(this.revokeObjectUrl(),r.classList.remove(`hidden`),r.classList.add(`file-content--raw`),r.classList.remove(`file-content--preview`,`file-content--iframe`),r.textContent=``)}resolveRouteGroupId(e){let t=v.activeGroupId;if(e===t||this.routeGroupMatches(e,t))return t;let n=Array.isArray(v.groups)?v.groups:[],r=n.find(t=>t.groupId===e);if(r)return r.groupId;let i=n.find(t=>this.routeGroupMatches(e,t.groupId));return i?i.groupId:e||null}resolveWorkspaceLinkPath(e,t=``){let n=e.trim();if(!n||n.startsWith(`#`))return null;let r=n,i=/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(n);if(i||n.startsWith(`//`)){let e;try{e=new URL(n,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;r=`${e.pathname}${e.search}${e.hash}`}let a=this.getWorkspaceRouteTarget(r);if(a)return a.path;let o=r.split(/[?#]/,1)[0].replace(/\\/g,`/`),s=o.startsWith(`/`);if(i||s||(o=o.replace(/^\/+/,``),!o))return null;let c=[];if(!s){let e=t.replace(/\\/g,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);e.pop(),c.push(...e)}for(let e of o.split(`/`))if(!(!e||e===`.`)){if(e===`..`){if(c.length===0)return null;c.pop();continue}c.push(e)}return c.length>0?c.join(`/`):null}revokeObjectUrl(){this.previewFrameWindow=null,this.currentObjectUrl&&=(URL.revokeObjectURL(this.currentObjectUrl),null);for(let e of this.currentImageObjectUrls)URL.revokeObjectURL(e);this.currentImageObjectUrls=[]}rewriteWorkspacePreviewHtml(e,r){if(!e)return e;let o=n(t(v.activeGroupId,r)),s=new DOMParser().parseFromString(e,`text/html`),c=(e,t)=>{let n=Array.from(s.querySelectorAll(e));for(let e of n){let n=(e.getAttribute(t)||``).trim();if(!n||n.startsWith(`#`)||n.startsWith(`javascript:`))continue;let s=a(n,o,window.location.origin);!s||s.origin!==window.location.origin||t===`href`&&!(i(s.pathname)||this.resolveWorkspaceLinkPath(n,r))||e.setAttribute(t,`${s.pathname}${s.search}${s.hash}`)}};return c(`a[href]`,`href`),c(`img[src]`,`src`),c(`audio[src]`,`src`),c(`video[src]`,`src`),c(`source[src]`,`src`),s.body.innerHTML}routeGroupMatches(e,t){if(e===t||e===`main`&&t===`br:main`||e===`br:main`&&t===`main`)return!0;if(!e.includes(`:`)&&!t.includes(`:`))return!1;let n=e=>e.trim().replace(/:/g,`-`);return n(e)===n(t)}setupEffects(){C(()=>{let e=y.declarativeTools;this.broadcastProxy&&e.length>0&&this.broadcastProxy.registerChannelsFromTools(e)}),C(()=>{let e=O.file,t=++this.viewRenderToken,n=this.shadowRoot;if(!n)return;let r=n.querySelector(`shadow-claw-dialog`);r&&typeof r.ensureDialog==`function`&&r.ensureDialog();let i=n.querySelector(`.file-modal`);if(e){r&&typeof r.showModal==`function`&&!r.open?r.showModal():i instanceof HTMLDialogElement&&!i.open&&i.showModal();let a=n.querySelector(`.modal-title`);a instanceof HTMLElement&&(a.textContent=`File: ${e.name}`),this.lastOpenedFileName!==e.name&&(this.lastOpenedFileName=e.name,this.isFilePreviewMode=this.shouldAutoPreview(e),this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null),this.updateView(t)}else r&&typeof r.close==`function`&&r.open?r.close():i instanceof HTMLDialogElement&&i.open&&i.close(),this.lastOpenedFileName=``,this.isFilePreviewMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,this.resetContent()})}shouldAutoPreview(e){return!e||typeof e!=`object`?!1:e.kind===`pdf`||e.kind===`binary`?!0:e.kind===`text`?this.isIframePreviewFile(e.name)||this.isMarkdownLikeFile(e.name):!1}stripHtmlFrontmatter(e){if(typeof e!=`string`||!e.trimStart().startsWith(`---`))return e;let t=T(e);return Object.keys(t.data||{}).length===0?e:t.content||``}toPreviewMarkdown(e){return this.isMarkdownLikeFile(e.name)?e.content:"```"+this.getLanguageFromFilename(e.name)+`
|
|
575
|
-
`+e.content+"\n```"}updateEditorHighlight(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.file-editor-overlay code`);if(!n)return;let r=
|
|
576
|
-
`))})}async buildIframePreviewSrcdoc(e,
|
|
574
|
+
`,`text/html`),B=z.querySelector(`template`);let V=[];V=B?Array.from(B.content.children):Array.from(z.head.children).concat(Array.from(z.body.children));var H=V;const U=`shadow-claw-file-viewer`,W=`components/${U}/highlightjs-atom-one-dark.min.css`,G=`pre code.hljs, code.hljs, .hljs { font-family: var(--shadow-claw-font-mono) !important; }`,K={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=>h(e),attributeNameCheck:()=>!0,allowCustomizedBuiltInElements:!1},ADD_ATTR:[`allow`,`allowfullscreen`,`frameborder`,`scrolling`,`referrerpolicy`,`loading`]};function q(e,t){return!e||typeof e.transaction!=`function`||c(e,t).then(e=>T(e,!0)).catch(()=>!0)}var J=class extends C{static styles=R;static template=H;broadcastProxy=null;currentImageObjectUrls=[];currentObjectUrl=null;db=null;editorDraftContent=null;isEditorDirty=!1;isFileEditMode=!1;isFilePreviewMode=!1;isFullscreenMode=!1;lastOpenedFileName=``;previewFrameWindow=null;themeObserver=null;viewRenderToken=0;constructor(){super()}async connectedCallback(){if(!this.shadowRoot)throw Error(`shadowRoot not found`);this.setupEffects(),this.bindEventListeners(),this.broadcastProxy=new P(()=>this.previewFrameWindow||this.shadowRoot?.querySelector(`.file-content-iframe`)?.contentWindow||null),window.addEventListener(`message`,this.handleIframeMessage),document.addEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver=new MutationObserver(e=>{for(let t of e)t.type===`attributes`&&t.attributeName===`class`&&this.syncIframeTheme()}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),this.db=await s();try{let e=await fetch(W).then(e=>e.text());this.applyHighlightStyles(e)}catch(e){console.warn(`Failed to load highlight.js styles:`,e)}}disconnectedCallback(){this.broadcastProxy?.dispose(),this.broadcastProxy=null,window.removeEventListener(`message`,this.handleIframeMessage),document.removeEventListener(`fullscreenchange`,this.handleFullscreenChange),this.themeObserver&&=(this.themeObserver.disconnect(),null),this.revokeObjectUrl()}applyFullscreenMode(e){let t=e.querySelector(`.modal-content`);t instanceof HTMLElement&&t.classList.toggle(`modal-content--fullscreen`,this.isFullscreenMode);let n=e.querySelector(`.modal-fullscreen-btn`);n instanceof HTMLButtonElement&&(n.setAttribute(`aria-pressed`,String(this.isFullscreenMode)),n.setAttribute(`aria-label`,this.isFullscreenMode?`Exit fullscreen`:`Enter fullscreen`),n.title=this.isFullscreenMode?`Exit fullscreen`:`Fullscreen`)}applyHighlightStyles(e){let t=this.shadowRoot;if(!t)return;if(typeof CSSStyleSheet<`u`&&typeof CSSStyleSheet.prototype.replaceSync==`function`&&`adoptedStyleSheets`in t)try{let n=new CSSStyleSheet;n.replaceSync(e);let r=new CSSStyleSheet;r.replaceSync(G),t.adoptedStyleSheets=[...t.adoptedStyleSheets?Array.from(t.adoptedStyleSheets):[],n,r];return}catch{}let n=document.createElement(`style`);n.setAttribute(`data-shadow-claw-highlight-theme`,`true`),n.textContent=`${e}\n${G}`,t.appendChild(n)}bindEventListeners(){let e=this.shadowRoot;if(!e)return;e.querySelector(`.file-content`)?.addEventListener(`click`,e=>{this.handlePreviewLinkClick(e)});let t=e.querySelector(`.file-modal`);t?.addEventListener(`cancel`,e=>{e.preventDefault(),this.requestCloseViewer()}),t?.addEventListener(`close`,()=>{k.file&&k.closeFile()}),e.querySelector(`.modal-close-btn`)?.addEventListener(`click`,()=>void this.requestCloseViewer()),e.querySelector(`.modal-preview-btn`)?.addEventListener(`click`,async()=>{this.isFilePreviewMode=!this.isFilePreviewMode,this.isFileEditMode=!1,await this.updateView()}),e.querySelector(`.modal-fullscreen-btn`)?.addEventListener(`click`,()=>{t&&this.toggleFullscreenMode(t)}),e.querySelector(`.modal-share-btn`)?.addEventListener(`click`,async()=>{await this.handleShareFile()}),e.querySelector(`.modal-edit-btn`)?.addEventListener(`click`,async()=>{this.isFileEditMode=!this.isFileEditMode,this.isFileEditMode&&(this.isFilePreviewMode=!1),await this.updateView()}),e.querySelector(`.modal-save-btn`)?.addEventListener(`click`,()=>this.handleSave()),e.querySelector(`.modal-cancel-btn`)?.addEventListener(`click`,async()=>{this.isEditorDirty=!1,this.editorDraftContent=null,this.isFileEditMode=!1,await this.updateView()});let n=e.querySelector(`.file-editor`);if(n?.addEventListener(`input`,()=>{n instanceof HTMLTextAreaElement&&(this.editorDraftContent=n.value,this.updateEditorHighlight(n.value)),this.isEditorDirty=!0,this.updateView()}),n instanceof HTMLTextAreaElement){let t=()=>{let t=e.querySelector(`.file-editor-overlay`);t&&(t.scrollTop=n.scrollTop,t.scrollLeft=n.scrollLeft)};n.addEventListener(`scroll`,t),n.addEventListener(`focus`,t),n.addEventListener(`click`,t),n.addEventListener(`keyup`,t),n.addEventListener(`mouseup`,t),e.querySelector(`.modal-body`)?.addEventListener(`scroll`,t)}}buildWebShareFile(e){if(e?.nativeFile instanceof File)return e.nativeFile;let t=e?.binaryContent;if(!(t instanceof Uint8Array)||t.length===0)return null;let n=new Uint8Array(t.byteLength);return n.set(t),new File([n],e.name||`shared-file`,{type:e?.mimeType||`application/octet-stream`})}canShareCurrentFile(e){if(!e||!this.isWebShareAvailable())return!1;if(e.kind===`text`)return!0;let t=this.buildWebShareFile(e);if(!t||typeof navigator.canShare!=`function`)return!1;try{return navigator.canShare({files:[t]})}catch{return!1}}canUseNativeFullscreen(e){return document.fullscreenEnabled===!0&&(typeof e.requestFullscreen==`function`||typeof e.webkitRequestFullscreen==`function`)&&(typeof document.exitFullscreen==`function`||typeof document.webkitExitFullscreen==`function`)}getCurrentFullscreenElement(){return document.fullscreenElement||document.webkitFullscreenElement||null}getFullscreenTarget(e){let t=e.querySelector(`.modal-content`);return t instanceof HTMLElement?t:null}getIframeBridgeScriptUrl(){return i(`/assets/file-viewer-preview-bridge.js`)}getIframeSandboxPermissions(e){return/\.svg$/i.test(e)?`allow-modals allow-popups allow-popups-to-escape-sandbox`:d()}getLanguageFromFilename(e){return{bash:`bash`,cjs:`javascript`,css:`css`,html:`xml`,java:`java`,javascript:`javascript`,js:`javascript`,json:`json`,jsx:`jsx`,markdown:`markdown`,md:`markdown`,mjs:`javascript`,php:`php`,python:`python`,py:`python`,ruby:`ruby`,rb:`ruby`,rust:`rust`,rs:`rust`,sh:`bash`,sql:`sql`,svg:`xml`,ts:`typescript`,tsx:`tsx`,xml:`xml`,yaml:`yaml`,yml:`yaml`}[e.toLowerCase().split(`.`).pop()||``]||``}getPreviewSourceFile(e,t){return this.getWorkingSourceFile(e,t)}getWorkingSourceFile(e,t){if(!this.isEditorDirty||e?.kind!==`text`)return e;if(typeof this.editorDraftContent==`string`)return{...e,content:this.editorDraftContent};let n=t.querySelector(`.file-editor`);return n instanceof HTMLTextAreaElement?{...e,content:n.value}:e}getWorkspaceRouteTarget(e,t={}){let{allowCrossGroup:n=!1}=t,r=e.split(/[?#]/,1)[0].trim();if(!r)return null;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(r)||r.startsWith(`//`)){let e;try{e=new URL(r,window.location.href)}catch{return null}if(e.origin!==window.location.origin)return null;r=e.pathname}let i=r.replace(/^(?:\.\/)+/u,``),a=[];if(i.startsWith(`files/`)&&a.push(`/${i}`),r.startsWith(`/`)){let e=r.lastIndexOf(`/files/`);e>0&&a.push(r.slice(e)),a.push(r)}for(let e of a){let t=o(e);if(!t)continue;let r=this.resolveRouteGroupId(t.groupId);if(r&&!(!n&&r!==y.activeGroupId))return{groupId:r,path:t.path}}return null}handleAnchorNavigation(e){let t=this.shadowRoot;if(!t)return!1;let n=t.querySelector(`.file-content`);if(!n)return!1;n.querySelectorAll(`.code-line.highlighted`).forEach(e=>{e.classList.remove(`highlighted`)});let r=e.match(/^#?L(\d+)(?:-L?(\d+))?$/i);if(r){let e=parseInt(r[1],10),t=r[2]?parseInt(r[2],10):e,i=null;return n.querySelectorAll(`.code-line`).forEach(n=>{let r=parseInt(n.getAttribute(`data-line`)||`0`,10);r>=e&&r<=t&&(n.classList.add(`highlighted`),i||=n)}),i?(i.scrollIntoView({behavior:`smooth`,block:`center`}),!0):!1}else{let t=e.replace(/^#/,``),r=n.querySelector(`[id="${t}"]`)||n.querySelector(`a[name="${t}"]`);return r?(r.scrollIntoView({behavior:`smooth`,block:`start`}),!0):!1}}handleFullscreenChange=()=>{let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);this.isFullscreenMode=this.isTargetInFullscreen(n),this.applyFullscreenMode(t)};handleIframeMessage=e=>{if(!e.data||typeof e.data!=`object`)return;let r=e.data;if(r.type===`shadow-claw-broadcast-result`&&typeof r.channel==`string`){this.broadcastProxy?.handleResultFromIframe(e.source,r.channel,r.payload);return}if(r.type===`shadow-claw-iframe-resize`&&typeof r.height==`number`){let t=this.shadowRoot?.querySelector(`.file-content-iframe`);t instanceof HTMLIFrameElement&&(!this.previewFrameWindow||e.source===this.previewFrameWindow||t.contentWindow&&e.source===t.contentWindow)&&(this.previewFrameWindow=t.contentWindow,t.style.setProperty(`height`,`${r.height}px`,`important`));return}if(r.type===`shadow-claw-storage-proxy`){if(this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let t=r;this.handleStorageProxyRequest(e.source,String(t.requestId||``),String(t.method||``),t.args&&typeof t.args==`object`?t.args:{});return}if(!this.db||r.type!==`shadow-claw-file-viewer-link`||typeof r.href!=`string`||this.previewFrameWindow&&e.source!==this.previewFrameWindow)return;let o=k.file,s=o?.path||o?.name||``,c=i(a(y.activeGroupId,s)),l=n(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&&(t(l.pathname)||this.resolveWorkspaceLinkPath(r.href,s)))){window.open(l.href,`_blank`,`noopener,noreferrer`);return}let u=`${l.pathname}${l.search}${l.hash}`,d=window.navigation;if(d&&typeof d.navigate==`function`){d.navigate(u);return}window.history.pushState({},``,u),window.dispatchEvent(new PopStateEvent(`popstate`))};hasUnsavedChanges(){return this.isEditorDirty}isIframePreviewFile(e){return/\.(?:html?|svg)$/i.test(e)}isMarkdownLikeFile(e){return/(?:^readme$|\.mdx?$|\.markdown$|\.mdown$)/i.test(e)}isNodeInComposedTree(e,t){let n=e;for(;n;){if(n===t)return!0;if(n.parentNode){n=n.parentNode;continue}let e=n.getRootNode?.();if(e instanceof ShadowRoot&&e.host){n=e.host;continue}n=null}return!1}isRenderTokenCurrent(e){return this.viewRenderToken===e}isTargetInFullscreen(e){if(!e)return!1;let t=this.getCurrentFullscreenElement();return t?t===e||this.isNodeInComposedTree(e,t)||this.isNodeInComposedTree(t,e):!1}isWebShareAvailable(){return typeof navigator<`u`&&typeof navigator.share==`function`}mimeTypeForImageExt(e){return{apng:`image/apng`,avif:`image/avif`,gif:`image/gif`,jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,webp:`image/webp`}[e]??`image/jpeg`}renderBinaryPreview(e,t){let n=t.mimeType||`application/octet-stream`;if(t.nativeFile instanceof File)this.currentObjectUrl=URL.createObjectURL(t.nativeFile);else{let r=t.binaryContent;if(!(r instanceof Uint8Array)||r.length===0){e.classList.remove(`file-content--raw`,`file-content--iframe`),e.classList.add(`file-content--preview`),e.textContent=`Binary content unavailable.`;return}let i=new Uint8Array(r.byteLength);i.set(r);let a=new Blob([i],{type:n});this.currentObjectUrl=URL.createObjectURL(a)}if(e.classList.remove(`file-content--raw`,`file-content--preview`),e.classList.add(`file-content--iframe`),n.startsWith(`image/`)){let n=document.createElement(`img`);n.className=`file-content-iframe`,n.alt=`Preview: ${t.name}`,n.src=this.currentObjectUrl,n.style.objectFit=`contain`,e.replaceChildren(n);return}if(n.startsWith(`video/`)){let t=document.createElement(`video`);t.className=`file-content-iframe`,t.controls=!0,t.src=this.currentObjectUrl,t.style.backgroundColor=`black`,e.replaceChildren(t);return}if(n.startsWith(`audio/`)){let n=document.createElement(`div`);n.className=`file-content file-content--preview`,n.style.padding=`1rem`;let r=document.createElement(`p`);r.textContent=t.name;let i=document.createElement(`audio`);i.controls=!0,i.src=this.currentObjectUrl,i.style.width=`100%`,n.replaceChildren(r,i),e.replaceChildren(n),e.classList.remove(`file-content--iframe`);return}let r=document.createElement(`iframe`);r.className=`file-content-iframe`,r.setAttribute(`title`,`Preview: ${t.name}`),r.setAttribute(`referrerpolicy`,`no-referrer`),r.src=this.currentObjectUrl,e.replaceChildren(r)}resetContent(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.file-modal`);if(!(t instanceof HTMLElement))return;let n=this.getFullscreenTarget(t);n&&this.isTargetInFullscreen(n)&&this.exitNativeFullscreen().catch(()=>{}),this.isFullscreenMode=!1,this.applyFullscreenMode(t);let r=t.querySelector(`.file-content`),i=t.querySelector(`.modal-preview-btn`);i instanceof HTMLButtonElement&&(i.setAttribute(`aria-pressed`,`false`),i.setAttribute(`aria-label`,`Switch to preview mode`));let a=t.querySelector(`.modal-edit-btn`);a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,`false`),a.setAttribute(`aria-label`,`Edit file`),a.classList.remove(`hidden`));let o=t.querySelector(`.modal-close-btn`);o instanceof HTMLButtonElement&&(o.disabled=!1,o.setAttribute(`aria-label`,`Close file viewer`),o.title=`Close`),t.querySelector(`.modal-save-btn`)?.classList.add(`hidden`),t.querySelector(`.file-editor-container`)?.classList.remove(`active`),t.querySelector(`.modal-body`)?.classList.remove(`modal-body--editing`);let s=t.querySelector(`.file-editor`);s instanceof HTMLTextAreaElement&&(s.value=``,s.removeAttribute(`language`));let c=t.querySelector(`.file-editor-overlay code`);c&&(c.innerHTML=``,c.className=`hljs`),this.isFileEditMode=!1,this.editorDraftContent=null,r instanceof HTMLElement&&(this.revokeObjectUrl(),r.classList.remove(`hidden`),r.classList.add(`file-content--raw`),r.classList.remove(`file-content--preview`,`file-content--iframe`),r.textContent=``)}resolveRouteGroupId(e){let t=y.activeGroupId;if(e===t||this.routeGroupMatches(e,t))return t;let n=Array.isArray(y.groups)?y.groups:[],r=n.find(t=>t.groupId===e);if(r)return r.groupId;let i=n.find(t=>this.routeGroupMatches(e,t.groupId));return i?i.groupId:e||null}resolveWorkspaceLinkPath(e,t=``){let n=e.trim();if(!n||n.startsWith(`#`))return null;let i=n,a=/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(n);if(a||n.startsWith(`//`)){let e;try{e=new URL(n,window.location.href)}catch{return null}if(!(e.protocol===`http:`||e.protocol===`https:`)||e.host!==window.location.host)return null;i=`${e.pathname}${e.search}${e.hash}`}let o=this.getWorkspaceRouteTarget(i);if(o)return o.path;let s=i.split(/[?#]/,1)[0].replace(/\\/g,`/`),c=s.startsWith(`/`);if(a||c||(s=s.replace(/^\/+/,``),!s))return null;let l=[];if(!c){let e=t.replace(/\\/g,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean).map(e=>r(e));e.pop(),l.push(...e)}for(let e of s.split(`/`))if(!(!e||e===`.`)){if(e===`..`){if(l.length===0)return null;l.pop();continue}l.push(r(e))}return l.length>0?l.join(`/`):null}revokeObjectUrl(){this.previewFrameWindow=null,this.currentObjectUrl&&=(URL.revokeObjectURL(this.currentObjectUrl),null);for(let e of this.currentImageObjectUrls)URL.revokeObjectURL(e);this.currentImageObjectUrls=[]}rewriteWorkspacePreviewHtml(e,r){if(!e)return e;let o=i(a(y.activeGroupId,r)),s=new DOMParser().parseFromString(e,`text/html`),c=(e,i)=>{let a=Array.from(s.querySelectorAll(e));for(let e of a){let a=(e.getAttribute(i)||``).trim();if(!a||a.startsWith(`#`)||a.startsWith(`javascript:`))continue;let s=n(a,o,window.location.origin);!s||s.origin!==window.location.origin||i===`href`&&!(t(s.pathname)||this.resolveWorkspaceLinkPath(a,r))||e.setAttribute(i,`${s.pathname}${s.search}${s.hash}`)}};return c(`a[href]`,`href`),c(`img[src]`,`src`),c(`audio[src]`,`src`),c(`video[src]`,`src`),c(`source[src]`,`src`),s.body.innerHTML}routeGroupMatches(e,t){if(e===t||e===`main`&&t===`br:main`||e===`br:main`&&t===`main`)return!0;if(!e.includes(`:`)&&!t.includes(`:`))return!1;let n=e=>e.trim().replace(/:/g,`-`);return n(e)===n(t)}setupEffects(){w(()=>{let e=b.declarativeTools;this.broadcastProxy&&e.length>0&&this.broadcastProxy.registerChannelsFromTools(e)}),w(()=>{let e=k.file,t=++this.viewRenderToken,n=this.shadowRoot;if(!n)return;let r=n.querySelector(`shadow-claw-dialog`);r&&typeof r.ensureDialog==`function`&&r.ensureDialog();let i=n.querySelector(`.file-modal`);if(e){r&&typeof r.showModal==`function`&&!r.open?r.showModal():i instanceof HTMLDialogElement&&!i.open&&i.showModal();let a=n.querySelector(`.modal-title`);a instanceof HTMLElement&&(a.textContent=`File: ${e.name}`),this.lastOpenedFileName!==e.name&&(this.lastOpenedFileName=e.name,this.isFilePreviewMode=this.shouldAutoPreview(e),this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null),this.updateView(t)}else r&&typeof r.close==`function`&&r.open?r.close():i instanceof HTMLDialogElement&&i.open&&i.close(),this.lastOpenedFileName=``,this.isFilePreviewMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,this.resetContent()})}shouldAutoPreview(e){return!e||typeof e!=`object`?!1:e.kind===`pdf`||e.kind===`binary`?!0:e.kind===`text`?this.isIframePreviewFile(e.name)||this.isMarkdownLikeFile(e.name):!1}stripHtmlFrontmatter(e){if(typeof e!=`string`||!e.trimStart().startsWith(`---`))return e;let t=E(e);return Object.keys(t.data||{}).length===0?e:t.content||``}toPreviewMarkdown(e){return this.isMarkdownLikeFile(e.name)?e.content:"```"+this.getLanguageFromFilename(e.name)+`
|
|
575
|
+
`+e.content+"\n```"}updateEditorHighlight(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.file-editor-overlay code`);if(!n)return;let r=k.file,i=this.getLanguageFromFilename(r?.name||``),a=``;try{a=i&&D.getLanguage(i)?D.highlight(e,{language:i}).value:D.highlightAuto(e).value}catch{a=e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}n.className=i?`hljs language-${i}`:`hljs`,n.innerHTML=u(a+`<br>`)}wrapCodeLines(e){e.querySelectorAll(`pre code`).forEach(e=>{let t=e.innerHTML.split(/\r?\n/u);t.length>1&&t[t.length-1]===``&&t.pop(),g(e,t.map((e,t)=>`<span class="code-line" data-line="${t+1}">${e||` `}</span>`).join(`
|
|
576
|
+
`))})}async buildIframePreviewSrcdoc(e,t=``){if(/\.svg$/i.test(e.name))return e.content;let n=e.path||e.name||``,r=this.stripHtmlFrontmatter(e.content||``),o=this.rewriteWorkspacePreviewHtml(r,n),s=f(await this.resolveRelativeImagesInHtml(o,n),K),c=crypto.randomUUID().replace(/-/g,``),l=this.getIframeBridgeScriptUrl(),u=i(`/assets/iframe-storage-bridge.js`),d=p(),h=m(c),g=typeof document<`u`?document.getElementById(`shadow-claw-site-config`):null,_=g&&g.textContent?`<script id="shadow-claw-site-config" type="application/json">${g.textContent}<\/script>`:``,v=t?`<script nonce="${c}">(function(){try{Object.defineProperty(globalThis.location,"search",{get:function(){return ${JSON.stringify(t)};},configurable:true});}catch(e){}})();<\/script>`:``,b=d.map(({src:e,hasInit:t})=>{let n=e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`//`)?e:i(e.startsWith(`/`)?e:`/${e.replace(/^pages\/main\//,``)}`),r=[`<script type="module" src="${n}" nonce="${c}"><\/script>`];return t&&r.push(`<script type="module" nonce="${c}">import("${n}").then((m) => { try { if (typeof m?.init === "function") m.init(); } catch (e) { console.error("[ShadowClaw] Error executing init for " + ${JSON.stringify(n)}, e); } }).catch(() => {});<\/script>`),r.join(`
|
|
577
577
|
`)}).join(`
|
|
578
|
-
`),x=`<link rel="stylesheet" href="${n(`/theme.css`)}">`;return[`<!doctype html>`,`<html class="${F()}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">`,`<meta http-equiv="Content-Security-Policy" content="${h}">`,`<base href="${n(t(v.activeGroupId,i))}" target="_blank">`,y,_,`<script src="${u}" nonce="${c}"><\/script>`,`<script src="${l}" nonce="${c}"><\/script>`,A(),x,b,`</head><body>`,s,`</body></html>`].join(``)}async canDismissViewer(){if(!this.hasUnsavedChanges())return!0;let e=await this.requestConfirmation({title:`Discard Unsaved Changes`,message:`You have unsaved changes. Discard them and close?`,confirmLabel:`Discard`,cancelLabel:`Keep Editing`});return e&&(this.isEditorDirty=!1,this.editorDraftContent=null),e}async exitFullscreenIfActive(e){let t=this.shadowRoot,n=e||t?.querySelector(`.file-modal`);if(!n)return;let r=this.getFullscreenTarget(n);if(!(!r||!this.isTargetInFullscreen(r)))try{await this.exitNativeFullscreen()}catch{}}async exitNativeFullscreen(){let e=document.exitFullscreen||document.webkitExitFullscreen;if(typeof e!=`function`)throw Error(`Native fullscreen exit unavailable`);await Promise.resolve(e.call(document))}async handlePreviewLinkClick(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=e.target;if(!(r instanceof Element))return;let o=r.closest(`a`);if(!(o instanceof HTMLAnchorElement)||!this.db)return;let s=O.file,c=s?.path||s?.name||``,l=o.getAttribute(`href`)||``,u=a(l,n(t(v.activeGroupId,c)),window.location.origin);if(u&&u.origin===window.location.origin&&(i(u.pathname)||this.resolveWorkspaceLinkPath(l,c))&&u){e.preventDefault();let t=`${u.pathname}${u.search}${u.hash}`,n=window.navigation;n&&typeof n.navigate==`function`?n.navigate(t):(window.history.pushState({},``,t),window.dispatchEvent(new PopStateEvent(`popstate`)));return}let d=l.trim();if(d&&!d.startsWith(`#`)&&!d.startsWith(`javascript:`)){let t=o.getAttribute(`target`)||`_blank`,n=t===`_self`||t===`_top`||t===`_parent`?`_blank`:t;try{new URL(d,window.location.href).host!==window.location.host&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}catch{/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(d)&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}}}async handleSave(){let e=O.file;if(!e||!this.db)return;let t=this.shadowRoot,n=t?.querySelector(`.modal-save-btn`),r=t?.querySelector(`.file-editor`);if(r instanceof HTMLTextAreaElement)try{n instanceof HTMLButtonElement&&(n.disabled=!0,n.textContent=`⏳ saving...`);let t=r.value,i=e.path||(v.currentPath===`.`?e.name:`${v.currentPath}/${e.name}`),a=e.groupId||v.activeGroupId;await _(this.db,a,i,t),b(`Saved ${e.name}`),document.dispatchEvent(new CustomEvent(`shadow-claw-file-saved`,{detail:{groupId:a,path:i},bubbles:!0,composed:!0})),await v.loadFiles(this.db),e.content=t,this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,await this.updateView()}catch(e){x(`Failed to save file: ${e instanceof Error?e.message:String(e)}`)}finally{n instanceof HTMLButtonElement&&(n.disabled=!1,n.textContent=`💾 Save`)}}async handleShareFile(){let e=O.file;if(!e||!this.canShareCurrentFile(e)){x(`Sharing is not supported for this file on this device.`,4500);return}try{if(e.kind===`text`)await navigator.share({title:e.name,text:e.content||``});else{let t=this.buildWebShareFile(e);if(!t||!navigator.canShare?.({files:[t]})){x(`File sharing is not supported on this device.`,4500);return}await navigator.share({title:e.name,files:[t]})}b(`Shared ${e.name}`)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;x(`Failed to share file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openFolderInFilesView(e){if(!this.db)return;let t=e.replace(/^\/+|\/+$/g,``);if(t)try{await v.setCurrentPath(this.db,t),O.closeFile();let e=window?.shadowclaw?.ui;e&&typeof e.showPage==`function`&&e.showPage(`files`)}catch(e){x(`Failed to open linked folder: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openWorkspaceLink(e,t){if(!this.db)return;let n=this.resolveWorkspaceLinkPath(e,t);if(!n)return;let r=n.split(`/`).filter(Boolean).pop()||``;if(!/\.[^./]+$/u.test(r)){try{await O.openFile(this.db,n,v.activeGroupId);return}catch(e){let t=e instanceof DOMException&&e.name===`NotFoundError`,n=e instanceof DOMException&&e.name===`TypeMismatchError`;if(!t&&!n){x(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3);return}}await this.openFolderInFilesView(n);return}try{await O.openFile(this.db,n,v.activeGroupId)}catch(e){x(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async renderPreview(t,n,r=this.viewRenderToken){if(!this.isRenderTokenCurrent(r))return;if(this.revokeObjectUrl(),this.previewFrameWindow=null,n.kind===`pdf`){t.classList.remove(`file-content--raw`,`file-content--preview`,`file-content--iframe`),import(`./shadow-claw-pdf-viewer-gOiW-_Bh.js`).then(()=>{let e=document.createElement(`shadow-claw-pdf-viewer`);e.file=n,t.replaceChildren(e)}).catch(console.error);return}if(n.kind===`binary`){this.renderBinaryPreview(t,n);return}if(this.isIframePreviewFile(n.name)){t.classList.remove(`file-content--raw`,`file-content--preview`),t.classList.add(`file-content--iframe`);let e=document.createElement(`iframe`);e.className=`file-content-iframe`,e.setAttribute(`title`,`Preview: ${n.name}`),e.setAttribute(`sandbox`,this.getIframeSandboxPermissions(n.name)),e.setAttribute(`allow`,`fullscreen`),e.setAttribute(`referrerpolicy`,`no-referrer`),c(e,await this.buildIframePreviewSrcdoc(n)),e.addEventListener(`load`,()=>{this.previewFrameWindow=e.contentWindow,this.syncIframeTheme()}),t.replaceChildren(e);return}t.classList.remove(`file-content--raw`),t.classList.add(`file-content--preview`);let i=O.file,a=i?.path||i?.name||``,o=this.toPreviewMarkdown(n),s=K(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),l=await D(o,{renderFrontmatter:typeof s==`boolean`?s:await s});if(!this.isRenderTokenCurrent(r))return;let u=this.rewriteWorkspacePreviewHtml(l,a);this.isRenderTokenCurrent(r)&&(h(t,u,G),this.wrapCodeLines(t),await this.resolveMarkdownImages(t,a))}async requestCloseViewer(){return await this.canDismissViewer()?(await this.exitFullscreenIfActive(),O.closeFile(),!0):!1}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):!1}async requestNativeFullscreen(e){let t=e.requestFullscreen||e.webkitRequestFullscreen;if(typeof t!=`function`)throw Error(`Native fullscreen unavailable`);await Promise.resolve(t.call(e))}async resolveMarkdownImages(e,t){if(!this.db)return;let n=Array.from(e.querySelectorAll(`img`));n.length!==0&&await Promise.all(n.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:v.activeGroupId,path:e}:null})();if(r)try{let t=await g(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t),e.src=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))})}catch{}}))}async resolveRelativeImagesInHtml(e,t){if(!this.db||!e)return e;let n=new DOMParser().parseFromString(e,`text/html`),r=Array.from(n.querySelectorAll(`img`));return r.length===0?e:(await Promise.all(r.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:v.activeGroupId,path:e}:null})();if(r)try{let t=await g(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t);let o=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))});e.setAttribute(`src`,o)}catch{}})),n.body.innerHTML)}async toggleFullscreenMode(e){let t=this.getFullscreenTarget(e);if(t){if(this.canUseNativeFullscreen(t)){let n=this.isTargetInFullscreen(t);try{n?(await this.exitNativeFullscreen(),this.isFullscreenMode=!1):(await this.requestNativeFullscreen(t),this.isFullscreenMode=!0)}catch{this.isFullscreenMode=!this.isFullscreenMode}this.applyFullscreenMode(e);return}this.isFullscreenMode=!this.isFullscreenMode,this.applyFullscreenMode(e)}}async updateView(e=this.viewRenderToken){let t=O.file,n=this.shadowRoot;if(!n||!t)return;let r=n.querySelector(`.file-modal`);if(!(r instanceof HTMLElement))return;this.applyFullscreenMode(r);let i=r.querySelector(`.file-content`),a=r.querySelector(`.modal-preview-btn`),o=r.querySelector(`.modal-body`);if(!(i instanceof HTMLElement))return;i.classList.remove(`file-content--iframe`);let s=this.getWorkingSourceFile(t,r),c=t.kind===`text`;a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,String(this.isFilePreviewMode)),a.setAttribute(`aria-label`,this.isFilePreviewMode?`Switch to raw text view`:`Switch to preview mode`));let l=r.querySelector(`.file-editor-container`),u=r.querySelector(`.modal-edit-btn`),d=r.querySelector(`.modal-save-btn`),f=r.querySelector(`.modal-share-btn`),p=r.querySelector(`.modal-close-btn`),m=r.querySelector(`.modal-cancel-btn`);if(f instanceof HTMLButtonElement){let e=this.canShareCurrentFile(t);f.classList.toggle(`hidden`,!e),f.disabled=!e}if(p instanceof HTMLButtonElement){let e=this.hasUnsavedChanges();p.disabled=!1,p.setAttribute(`aria-label`,e?`Close file viewer (unsaved changes)`:`Close file viewer`),p.title=e?`Close (you have unsaved changes)`:`Close`}let h=this.hasUnsavedChanges();if(d instanceof HTMLButtonElement&&d.classList.toggle(`hidden`,!h),m instanceof HTMLButtonElement&&m.classList.toggle(`hidden`,!h),this.isFilePreviewMode){o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),await this.renderPreview(i,s,e);return}if(this.isRenderTokenCurrent(e))if(this.isFileEditMode&&c){o?.classList.add(`modal-body--editing`),i.classList.add(`hidden`),l?.classList.add(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`true`),u.setAttribute(`aria-label`,`Switch to raw text view`),u.classList.remove(`hidden`));let e=l?.querySelector(`.file-editor`);if(e instanceof HTMLTextAreaElement){e.setAttribute(`tab-size`,`2`);let n=this.getLanguageFromFilename(t.name);if(n?e.setAttribute(`language`,n):e.removeAttribute(`language`),this.isEditorDirty)typeof s?.content==`string`&&(e.value!==s.content&&(e.value=s.content),this.updateEditorHighlight(e.value));else{let n=t.content||``;e.value!==n&&(e.value=n),this.updateEditorHighlight(e.value)}e.dispatchEvent(new Event(`scroll`))}}else o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),i.classList.add(`file-content--raw`),i.classList.remove(`file-content--preview`,`file-content--iframe`),t.kind===`binary`?i.textContent=`Binary file (${t.mimeType||`application/octet-stream`}). Switch to Preview to view.`:i.textContent=s.content||``}syncIframeTheme(){if(!this.previewFrameWindow)return;let e=document.documentElement.classList.contains(`dark-mode`),t=getComputedStyle(document.documentElement),n={};for(let e=0;e<t.length;e++){let r=t[e];r.startsWith(`--`)&&(n[r]=t.getPropertyValue(r))}this.previewFrameWindow.postMessage({type:`shadow-claw-theme-update`,theme:e?`dark`:`light`,customProperties:n},`*`)}async handleStorageProxyRequest(e,t,n,r){if(!t)return;let i=O.file,a=i?.path||i?.name||`__default__`;try{let i;switch(n){case`setItem`:await k(a,String(r.key||``),r.value);break;case`removeItem`:await M(a,String(r.key||``));break;case`clear`:await I(a);break;case`getAllItems`:i=await j(a);break;case`idb-get`:i=await P(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-getAll`:i=await j(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-put`:{let e=r.key==null?`__auto_${Date.now()}`:String(r.key);await k(`${a}::idb::${r.dbName}::${r.storeName}`,e,r.value),i=e;break}case`idb-delete`:await M(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-clear`:await I(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-deleteDatabase`:await I(`${a}::idb::${r.dbName}::__default__`);break;default:throw Error(`Unknown storage proxy method: ${n}`)}e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,result:i??null},`*`)}catch(n){e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,error:n instanceof Error?n.message:String(n)},`*`)}}async reloadPreviewWithSearchParams(e){let t=O.file;if(!t)return;let n=this.shadowRoot?.querySelector(`.file-viewer__iframe`);n&&(this.previewFrameWindow=null,c(n,await this.buildIframePreviewSrcdoc(t,e)))}};customElements.get(H)||customElements.define(H,q);export{q as ShadowClawFileViewer};
|
|
578
|
+
`),x=`<link rel="stylesheet" href="${i(`/theme.css`)}">`;return[`<!doctype html>`,`<html class="${I()}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">`,`<meta http-equiv="Content-Security-Policy" content="${h}">`,`<base href="${i(a(y.activeGroupId,n))}" target="_blank">`,v,_,`<script src="${u}" nonce="${c}"><\/script>`,`<script src="${l}" nonce="${c}"><\/script>`,j(),x,b,`</head><body>`,s,`</body></html>`].join(``)}async canDismissViewer(){if(!this.hasUnsavedChanges())return!0;let e=await this.requestConfirmation({title:`Discard Unsaved Changes`,message:`You have unsaved changes. Discard them and close?`,confirmLabel:`Discard`,cancelLabel:`Keep Editing`});return e&&(this.isEditorDirty=!1,this.editorDraftContent=null),e}async exitFullscreenIfActive(e){let t=this.shadowRoot,n=e||t?.querySelector(`.file-modal`);if(!n)return;let r=this.getFullscreenTarget(n);if(!(!r||!this.isTargetInFullscreen(r)))try{await this.exitNativeFullscreen()}catch{}}async exitNativeFullscreen(){let e=document.exitFullscreen||document.webkitExitFullscreen;if(typeof e!=`function`)throw Error(`Native fullscreen exit unavailable`);await Promise.resolve(e.call(document))}async handlePreviewLinkClick(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=e.target;if(!(r instanceof Element))return;let o=r.closest(`a`);if(!(o instanceof HTMLAnchorElement)||!this.db)return;let s=k.file,c=s?.path||s?.name||``,l=o.getAttribute(`href`)||``,u=n(l,i(a(y.activeGroupId,c)),window.location.origin);if(u&&u.origin===window.location.origin&&(t(u.pathname)||this.resolveWorkspaceLinkPath(l,c))&&u){e.preventDefault();let t=`${u.pathname}${u.search}${u.hash}`,n=window.navigation;n&&typeof n.navigate==`function`?n.navigate(t):(window.history.pushState({},``,t),window.dispatchEvent(new PopStateEvent(`popstate`)));return}let d=l.trim();if(d&&!d.startsWith(`#`)&&!d.startsWith(`javascript:`)){let t=o.getAttribute(`target`)||`_blank`,n=t===`_self`||t===`_top`||t===`_parent`?`_blank`:t;try{new URL(d,window.location.href).host!==window.location.host&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}catch{/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(d)&&(e.preventDefault(),window.open(d,n,`noopener,noreferrer`))}}}async handleSave(){let e=k.file;if(!e||!this.db)return;let t=this.shadowRoot,n=t?.querySelector(`.modal-save-btn`),r=t?.querySelector(`.file-editor`);if(r instanceof HTMLTextAreaElement)try{n instanceof HTMLButtonElement&&(n.disabled=!0,n.textContent=`⏳ saving...`);let t=r.value,i=e.path||(y.currentPath===`.`?e.name:`${y.currentPath}/${e.name}`),a=e.groupId||y.activeGroupId;await v(this.db,a,i,t),x(`Saved ${e.name}`),document.dispatchEvent(new CustomEvent(`shadow-claw-file-saved`,{detail:{groupId:a,path:i},bubbles:!0,composed:!0})),await y.loadFiles(this.db),e.content=t,this.isFileEditMode=!1,this.isEditorDirty=!1,this.editorDraftContent=null,await this.updateView()}catch(e){S(`Failed to save file: ${e instanceof Error?e.message:String(e)}`)}finally{n instanceof HTMLButtonElement&&(n.disabled=!1,n.textContent=`💾 Save`)}}async handleShareFile(){let e=k.file;if(!e||!this.canShareCurrentFile(e)){S(`Sharing is not supported for this file on this device.`,4500);return}try{if(e.kind===`text`)await navigator.share({title:e.name,text:e.content||``});else{let t=this.buildWebShareFile(e);if(!t||!navigator.canShare?.({files:[t]})){S(`File sharing is not supported on this device.`,4500);return}await navigator.share({title:e.name,files:[t]})}x(`Shared ${e.name}`)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;S(`Failed to share file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openFolderInFilesView(e){if(!this.db)return;let t=e.replace(/^\/+|\/+$/g,``);if(t)try{await y.setCurrentPath(this.db,t),k.closeFile();let e=window?.shadowclaw?.ui;e&&typeof e.showPage==`function`&&e.showPage(`files`)}catch(e){S(`Failed to open linked folder: ${e instanceof Error?e.message:String(e)}`,5e3)}}async openWorkspaceLink(e,t){if(!this.db)return;let n=this.resolveWorkspaceLinkPath(e,t);if(!n)return;let r=n.split(`/`).filter(Boolean).pop()||``;if(!/\.[^./]+$/u.test(r)){try{await k.openFile(this.db,n,y.activeGroupId);return}catch(e){let t=e instanceof DOMException&&e.name===`NotFoundError`,n=e instanceof DOMException&&e.name===`TypeMismatchError`;if(!t&&!n){S(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3);return}}await this.openFolderInFilesView(n);return}try{await k.openFile(this.db,n,y.activeGroupId)}catch(e){S(`Failed to open linked file: ${e instanceof Error?e.message:String(e)}`,5e3)}}async renderPreview(t,n,r=this.viewRenderToken){if(!this.isRenderTokenCurrent(r))return;if(this.revokeObjectUrl(),this.previewFrameWindow=null,n.kind===`pdf`){t.classList.remove(`file-content--raw`,`file-content--preview`,`file-content--iframe`),import(`./shadow-claw-pdf-viewer-gOiW-_Bh.js`).then(()=>{let e=document.createElement(`shadow-claw-pdf-viewer`);e.file=n,t.replaceChildren(e)}).catch(console.error);return}if(n.kind===`binary`){this.renderBinaryPreview(t,n);return}if(this.isIframePreviewFile(n.name)){t.classList.remove(`file-content--raw`,`file-content--preview`),t.classList.add(`file-content--iframe`);let e=document.createElement(`iframe`);e.className=`file-content-iframe`,e.setAttribute(`title`,`Preview: ${n.name}`),e.setAttribute(`sandbox`,this.getIframeSandboxPermissions(n.name)),e.setAttribute(`allow`,`fullscreen`),e.setAttribute(`referrerpolicy`,`no-referrer`),l(e,await this.buildIframePreviewSrcdoc(n)),e.addEventListener(`load`,()=>{this.previewFrameWindow=e.contentWindow,this.syncIframeTheme()}),t.replaceChildren(e);return}t.classList.remove(`file-content--raw`),t.classList.add(`file-content--preview`);let i=k.file,a=i?.path||i?.name||``,o=this.toPreviewMarkdown(n),s=q(this.db,e.MARKDOWN_FRONTMATTER_FILE_VIEWER),c=await O(o,{renderFrontmatter:typeof s==`boolean`?s:await s});if(!this.isRenderTokenCurrent(r))return;let u=this.rewriteWorkspacePreviewHtml(c,a);this.isRenderTokenCurrent(r)&&(g(t,u,K),this.wrapCodeLines(t),await this.resolveMarkdownImages(t,a))}async requestCloseViewer(){return await this.canDismissViewer()?(await this.exitFullscreenIfActive(),k.closeFile(),!0):!1}async requestConfirmation(e){let t=document.querySelector(`shadow-claw`);return t&&typeof t.requestDialog==`function`?await t.requestDialog({mode:`confirm`,...e}):!1}async requestNativeFullscreen(e){let t=e.requestFullscreen||e.webkitRequestFullscreen;if(typeof t!=`function`)throw Error(`Native fullscreen unavailable`);await Promise.resolve(t.call(e))}async resolveMarkdownImages(e,t){if(!this.db)return;let n=Array.from(e.querySelectorAll(`img`));n.length!==0&&await Promise.all(n.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:y.activeGroupId,path:e}:null})();if(r)try{let t=await _(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t),e.src=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))})}catch{}}))}async resolveRelativeImagesInHtml(e,t){if(!this.db||!e)return e;let n=new DOMParser().parseFromString(e,`text/html`),r=Array.from(n.querySelectorAll(`img`));return r.length===0?e:(await Promise.all(r.map(async e=>{let n=e.getAttribute(`src`)||``;if(!n||/^(?:blob:|data:|#)/u.test(n))return;let r=this.getWorkspaceRouteTarget(n,{allowCrossGroup:!0})||(()=>{let e=this.resolveWorkspaceLinkPath(n,t);return e?{groupId:y.activeGroupId,path:e}:null})();if(r)try{let t=await _(this.db,r.groupId,r.path),n=r.path.split(`.`).pop()?.toLowerCase()||``,i=this.mimeTypeForImageExt(n),a=new Uint8Array(t.byteLength);a.set(t);let o=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(new Blob([a],{type:i}))});e.setAttribute(`src`,o)}catch{}})),n.body.innerHTML)}async toggleFullscreenMode(e){let t=this.getFullscreenTarget(e);if(t){if(this.canUseNativeFullscreen(t)){let n=this.isTargetInFullscreen(t);try{n?(await this.exitNativeFullscreen(),this.isFullscreenMode=!1):(await this.requestNativeFullscreen(t),this.isFullscreenMode=!0)}catch{this.isFullscreenMode=!this.isFullscreenMode}this.applyFullscreenMode(e);return}this.isFullscreenMode=!this.isFullscreenMode,this.applyFullscreenMode(e)}}async updateView(e=this.viewRenderToken){let t=k.file,n=this.shadowRoot;if(!n||!t)return;let r=n.querySelector(`.file-modal`);if(!(r instanceof HTMLElement))return;this.applyFullscreenMode(r);let i=r.querySelector(`.file-content`),a=r.querySelector(`.modal-preview-btn`),o=r.querySelector(`.modal-body`);if(!(i instanceof HTMLElement))return;i.classList.remove(`file-content--iframe`);let s=this.getWorkingSourceFile(t,r),c=t.kind===`text`;a instanceof HTMLButtonElement&&(a.setAttribute(`aria-pressed`,String(this.isFilePreviewMode)),a.setAttribute(`aria-label`,this.isFilePreviewMode?`Switch to raw text view`:`Switch to preview mode`));let l=r.querySelector(`.file-editor-container`),u=r.querySelector(`.modal-edit-btn`),d=r.querySelector(`.modal-save-btn`),f=r.querySelector(`.modal-share-btn`),p=r.querySelector(`.modal-close-btn`),m=r.querySelector(`.modal-cancel-btn`);if(f instanceof HTMLButtonElement){let e=this.canShareCurrentFile(t);f.classList.toggle(`hidden`,!e),f.disabled=!e}if(p instanceof HTMLButtonElement){let e=this.hasUnsavedChanges();p.disabled=!1,p.setAttribute(`aria-label`,e?`Close file viewer (unsaved changes)`:`Close file viewer`),p.title=e?`Close (you have unsaved changes)`:`Close`}let h=this.hasUnsavedChanges();if(d instanceof HTMLButtonElement&&d.classList.toggle(`hidden`,!h),m instanceof HTMLButtonElement&&m.classList.toggle(`hidden`,!h),this.isFilePreviewMode){o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),await this.renderPreview(i,s,e);return}if(this.isRenderTokenCurrent(e))if(this.isFileEditMode&&c){o?.classList.add(`modal-body--editing`),i.classList.add(`hidden`),l?.classList.add(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`true`),u.setAttribute(`aria-label`,`Switch to raw text view`),u.classList.remove(`hidden`));let e=l?.querySelector(`.file-editor`);if(e instanceof HTMLTextAreaElement){e.setAttribute(`tab-size`,`2`);let n=this.getLanguageFromFilename(t.name);if(n?e.setAttribute(`language`,n):e.removeAttribute(`language`),this.isEditorDirty)typeof s?.content==`string`&&(e.value!==s.content&&(e.value=s.content),this.updateEditorHighlight(e.value));else{let n=t.content||``;e.value!==n&&(e.value=n),this.updateEditorHighlight(e.value)}e.dispatchEvent(new Event(`scroll`))}}else o?.classList.remove(`modal-body--editing`),i.classList.remove(`hidden`),l?.classList.remove(`active`),u instanceof HTMLButtonElement&&(u.setAttribute(`aria-pressed`,`false`),u.setAttribute(`aria-label`,`Edit file`),u.classList.toggle(`hidden`,!c)),i.classList.add(`file-content--raw`),i.classList.remove(`file-content--preview`,`file-content--iframe`),t.kind===`binary`?i.textContent=`Binary file (${t.mimeType||`application/octet-stream`}). Switch to Preview to view.`:i.textContent=s.content||``}syncIframeTheme(){if(!this.previewFrameWindow)return;let e=document.documentElement.classList.contains(`dark-mode`),t=getComputedStyle(document.documentElement),n={};for(let e=0;e<t.length;e++){let r=t[e];r.startsWith(`--`)&&(n[r]=t.getPropertyValue(r))}this.previewFrameWindow.postMessage({type:`shadow-claw-theme-update`,theme:e?`dark`:`light`,customProperties:n},`*`)}async handleStorageProxyRequest(e,t,n,r){if(!t)return;let i=k.file,a=i?.path||i?.name||`__default__`;try{let i;switch(n){case`setItem`:await A(a,String(r.key||``),r.value);break;case`removeItem`:await N(a,String(r.key||``));break;case`clear`:await L(a);break;case`getAllItems`:i=await M(a);break;case`idb-get`:i=await F(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-getAll`:i=await M(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-put`:{let e=r.key==null?`__auto_${Date.now()}`:String(r.key);await A(`${a}::idb::${r.dbName}::${r.storeName}`,e,r.value),i=e;break}case`idb-delete`:await N(`${a}::idb::${r.dbName}::${r.storeName}`,String(r.key||``));break;case`idb-clear`:await L(`${a}::idb::${r.dbName}::${r.storeName}`);break;case`idb-deleteDatabase`:await L(`${a}::idb::${r.dbName}::__default__`);break;default:throw Error(`Unknown storage proxy method: ${n}`)}e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,result:i??null},`*`)}catch(n){e.postMessage({type:`shadow-claw-storage-proxy-result`,requestId:t,error:n instanceof Error?n.message:String(n)},`*`)}}async reloadPreviewWithSearchParams(e){let t=k.file;if(!t)return;let n=this.shadowRoot?.querySelector(`.file-viewer__iframe`);n&&(this.previewFrameWindow=null,l(n,await this.buildIframePreviewSrcdoc(t,e)))}};customElements.get(U)||customElements.define(U,J);export{J as ShadowClawFileViewer};
|