shadow-claw 1.29.0 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/main/skill-creator/SKILL.md +3 -2
- package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/.well-known/agent-skills/index.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/dist/lib/{app-routes-CqBOeA5q.js → app-routes-BAEMLu9g.js} +3 -2
- package/dist/lib/app-routes-BAEMLu9g.js.map +1 -0
- package/dist/lib/{bundler-8JNIKwOs.js → bundler-CsL7hHMq.js} +4 -9
- package/dist/lib/{bundler-8JNIKwOs.js.map → bundler-CsL7hHMq.js.map} +1 -1
- package/dist/lib/components/index.js +26 -26
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw-a2ui.js +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{config--CFrw3J3.js → config-DjZ9QWc4.js} +2 -2
- package/dist/lib/{config--CFrw3J3.js.map → config-DjZ9QWc4.js.map} +1 -1
- package/dist/lib/{configurePeerJs-DG4hliKp.js → configurePeerJs-H0WaoT0w.js} +3 -3
- package/dist/lib/{configurePeerJs-DG4hliKp.js.map → configurePeerJs-H0WaoT0w.js.map} +1 -1
- package/dist/lib/{connections-DwjzwVz0.js → connections-BURqMIUv.js} +2 -2
- package/dist/lib/{connections-DwjzwVz0.js.map → connections-BURqMIUv.js.map} +1 -1
- package/dist/lib/content/markdown-links.d.ts +19 -0
- package/dist/lib/core/app-routes.d.ts +1 -0
- package/dist/lib/{downloadGroupFile-DmcBQU1n.js → downloadGroupFile-B8J4up2a.js} +2 -2
- package/dist/lib/{downloadGroupFile-DmcBQU1n.js.map → downloadGroupFile-B8J4up2a.js.map} +1 -1
- package/dist/lib/{file-viewer-C3YKnq_-.js → file-viewer-CwvhxAAG.js} +5 -5
- package/dist/lib/{file-viewer-C3YKnq_-.js.map → file-viewer-CwvhxAAG.js.map} +1 -1
- package/dist/lib/{getGroupDir-m0f-ekgX.js → getGroupDir-QrN2aTo8.js} +4 -4
- package/dist/lib/{getGroupDir-m0f-ekgX.js.map → getGroupDir-QrN2aTo8.js.map} +1 -1
- package/dist/lib/{git-C-Q6-IVe.js → git-DhZoe1SE.js} +3 -3
- package/dist/lib/{git-C-Q6-IVe.js.map → git-DhZoe1SE.js.map} +1 -1
- package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js → iframe-sanitizer-Bujgq14T.js} +2 -2
- package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js.map → iframe-sanitizer-Bujgq14T.js.map} +1 -1
- package/dist/lib/index.js +27 -27
- package/dist/lib/{initChatSplitResize-yyBTU6h9.js → initChatSplitResize-BjiWoqC_.js} +2 -2
- package/dist/lib/{initChatSplitResize-yyBTU6h9.js.map → initChatSplitResize-BjiWoqC_.js.map} +1 -1
- package/dist/lib/{initControlPlane-DnpAzphg.js → initControlPlane-C9JxQCDh.js} +16 -16
- package/dist/lib/{initControlPlane-DnpAzphg.js.map → initControlPlane-C9JxQCDh.js.map} +1 -1
- package/dist/lib/{markdown-DgdSt2GD.js → markdown-DYHmNjC4.js} +126 -5
- package/dist/lib/markdown-DYHmNjC4.js.map +1 -0
- package/dist/lib/{mcp-reconnect-C86MR3z8.js → mcp-reconnect-BxJ77WSb.js} +2 -2
- package/dist/lib/{mcp-reconnect-C86MR3z8.js.map → mcp-reconnect-BxJ77WSb.js.map} +1 -1
- package/dist/lib/{memoryStorage-UR8E8K-H.js → memoryStorage-D3FBwO9T.js} +2 -2
- package/dist/lib/{memoryStorage-UR8E8K-H.js.map → memoryStorage-D3FBwO9T.js.map} +1 -1
- package/dist/lib/{orchestrator-ClXbJ4Mb.js → orchestrator-C6dc-2OQ.js} +130 -27
- package/dist/lib/{orchestrator-ClXbJ4Mb.js.map → orchestrator-C6dc-2OQ.js.map} +1 -1
- package/dist/lib/{orchestrator-CjEau_RG.js → orchestrator-DVkyd8K9.js} +27 -17
- package/dist/lib/orchestrator-DVkyd8K9.js.map +1 -0
- package/dist/lib/{peerjs-BdfpltIe.js → peerjs-BUS9O04I.js} +274 -60
- package/dist/lib/peerjs-BUS9O04I.js.map +1 -0
- package/dist/lib/{push-client-DjwKknNg.js → push-client-4JsQGmQa.js} +3 -3
- package/dist/lib/{push-client-DjwKknNg.js.map → push-client-4JsQGmQa.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js → readGroupFileBytes-CSA7u-nJ.js} +2 -2
- package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js.map → readGroupFileBytes-CSA7u-nJ.js.map} +1 -1
- package/dist/lib/{shadow-claw-DcPGKenn.js → shadow-claw-BMoF8Auf.js} +11 -11
- package/dist/lib/{shadow-claw-DcPGKenn.js.map → shadow-claw-BMoF8Auf.js.map} +1 -1
- package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js → shadow-claw-a2ui-2I5nffIn.js} +2 -2
- package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js.map → shadow-claw-a2ui-2I5nffIn.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-03oJ__XC.js → shadow-claw-accounts-BCjlgvzy.js} +3 -3
- package/dist/lib/{shadow-claw-accounts-03oJ__XC.js.map → shadow-claw-accounts-BCjlgvzy.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js → shadow-claw-channel-config-CxQAmlDE.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js.map → shadow-claw-channel-config-CxQAmlDE.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-BgaJiPdE.js → shadow-claw-channels-CuYMUVAG.js} +3 -3
- package/dist/lib/{shadow-claw-channels-BgaJiPdE.js.map → shadow-claw-channels-CuYMUVAG.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-mXPQZbwT.js → shadow-claw-chat-RFtPmmyl.js} +13 -12
- package/dist/lib/shadow-claw-chat-RFtPmmyl.js.map +1 -0
- package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js → shadow-claw-control-plane-siqmRzR1.js} +7 -7
- package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js.map → shadow-claw-control-plane-siqmRzR1.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js → shadow-claw-conversations-DygK5y1e.js} +7 -7
- package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js.map → shadow-claw-conversations-DygK5y1e.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-BSbZvSl-.js → shadow-claw-file-viewer-DGMA7d7H.js} +11 -11
- package/dist/lib/shadow-claw-file-viewer-DGMA7d7H.js.map +1 -0
- package/dist/lib/{shadow-claw-files-BLVr9Pua.js → shadow-claw-files-CgD1B9J7.js} +8 -8
- package/dist/lib/{shadow-claw-files-BLVr9Pua.js.map → shadow-claw-files-CgD1B9J7.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-CHC1H86J.js → shadow-claw-git-Bw1jGRrf.js} +6 -6
- package/dist/lib/{shadow-claw-git-CHC1H86J.js.map → shadow-claw-git-Bw1jGRrf.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js → shadow-claw-integrations-ChaXtvsg.js} +4 -4
- package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js.map → shadow-claw-integrations-ChaXtvsg.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-CKXfxd3D.js → shadow-claw-llm-CDM4Akjc.js} +6 -6
- package/dist/lib/{shadow-claw-llm-CKXfxd3D.js.map → shadow-claw-llm-CDM4Akjc.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js → shadow-claw-mcp-remote-BLxs_Z4I.js} +4 -4
- package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js.map → shadow-claw-mcp-remote-BLxs_Z4I.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-dpYvfchh.js → shadow-claw-networking-BYt-kMSI.js} +2 -2
- package/dist/lib/{shadow-claw-networking-dpYvfchh.js.map → shadow-claw-networking-BYt-kMSI.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-_YeAVPga.js → shadow-claw-notifications-Dpe4EtZI.js} +3 -3
- package/dist/lib/{shadow-claw-notifications-_YeAVPga.js.map → shadow-claw-notifications-Dpe4EtZI.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js → shadow-claw-page-header-P4EvWyUr.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js.map → shadow-claw-page-header-P4EvWyUr.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-DVzZriZ7.js → shadow-claw-pages-DWd_c4d6.js} +10 -10
- package/dist/lib/{shadow-claw-pages-DVzZriZ7.js.map → shadow-claw-pages-DWd_c4d6.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js → shadow-claw-peerjs-D928817m.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js.map → shadow-claw-peerjs-D928817m.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js → shadow-claw-settings-C8OPrSqs.js} +8 -8
- package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js.map → shadow-claw-settings-C8OPrSqs.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-Bv__kXG6.js → shadow-claw-storage-CZ2uZJNw.js} +5 -5
- package/dist/lib/{shadow-claw-storage-Bv__kXG6.js.map → shadow-claw-storage-CZ2uZJNw.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js → shadow-claw-task-server-CLT018BX.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js.map → shadow-claw-task-server-CLT018BX.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-qmcDT4PU.js → shadow-claw-tasks-D5h-lGmq.js} +9 -8
- package/dist/lib/shadow-claw-tasks-D5h-lGmq.js.map +1 -0
- package/dist/lib/{shadow-claw-terminal-0QUWP8of.js → shadow-claw-terminal-Cy1O6KVM.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-0QUWP8of.js.map → shadow-claw-terminal-Cy1O6KVM.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js → shadow-claw-tools-CVD06bCR.js} +9 -9
- package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js.map → shadow-claw-tools-CVD06bCR.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js → shadow-claw-webvm-DoGl5ZSJ.js} +3 -3
- package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js.map → shadow-claw-webvm-DoGl5ZSJ.js.map} +1 -1
- package/dist/lib/subsystems/channels/peerjs.d.ts +37 -4
- package/dist/lib/subsystems/channels/room.d.ts +4 -0
- package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js → syncWebMcpRegistration-BeYkQEvj.js} +5 -5
- package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js.map → syncWebMcpRegistration-BeYkQEvj.js.map} +1 -1
- package/dist/lib/tools-C3Kft940.js +1 -0
- package/dist/lib/{tools-DBaMRiEu.js → tools-DKzPWc0q.js} +2 -2
- package/dist/lib/{tools-DBaMRiEu.js.map → tools-DKzPWc0q.js.map} +1 -1
- package/dist/lib/{tools-DwwB9RBa.js → tools-DqcJe8LS.js} +5 -5
- package/dist/lib/{tools-DwwB9RBa.js.map → tools-DqcJe8LS.js.map} +1 -1
- package/dist/lib/{trusted-types-Dx0RZlrd.js → trusted-types-Oz7xXJAY.js} +4 -4
- package/dist/lib/{trusted-types-Dx0RZlrd.js.map → trusted-types-Oz7xXJAY.js.map} +1 -1
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/namespacedStorage.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/{webmcp-j_1_T3wf.js → webmcp-BC8_WafM.js} +4 -4
- package/dist/lib/{webmcp-j_1_T3wf.js.map → webmcp-BC8_WafM.js.map} +1 -1
- package/dist/lib/worker/utils/system-prompt.d.ts +4 -1
- package/dist/public/.agents/skills/main/skill-creator/SKILL.md +3 -2
- package/dist/public/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/dist/public/.well-known/agent-skills/index.json +1 -1
- package/dist/public/.well-known/mcp/server-card.json +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/agent.worker.js +18 -17
- package/dist/public/app-routes-BMQ4HFaM.js +1 -0
- package/dist/public/{bundler-Ca-Xwln8.js → bundler-0if-QelV.js} +4 -4
- package/dist/public/{config-CrHchneq.js → config-Bnwx4EfS.js} +1 -1
- package/dist/public/{configurePeerJs-B470pdeU.js → configurePeerJs-DkyGvwk_.js} +1 -1
- package/dist/public/{connections-DvbgdkaB.js → connections-6575KDGE.js} +1 -1
- package/dist/public/{custom-element-security-FU04Cq05.js → custom-element-security-BQJQ_oKz.js} +1 -1
- package/dist/public/docs/example/article/index.html +2 -2
- package/dist/public/docs/publishing/index.html +2 -2
- package/dist/public/docs/skill-creator/index.html +2 -2
- package/dist/public/docs/subsystems/skills.md +3 -1
- package/dist/public/{downloadGroupFile-D8KRJGGL.js → downloadGroupFile-Wo1Sxdhr.js} +1 -1
- package/dist/public/{e2e-bridge-CSW0S5Yz.js → e2e-bridge-CvLCUU2O.js} +1 -1
- package/dist/public/{file-viewer-Cs-riNvy.js → file-viewer-CIjqAvNF.js} +1 -1
- package/dist/public/{getGroupDir-P1h9wl6S.js → getGroupDir-BwprrdrQ.js} +1 -1
- package/dist/public/{git-7Vq_SJSp.js → git-BSnY2D-A.js} +2 -2
- package/dist/public/{iframe-sanitizer-y2Z1pPwY.js → iframe-sanitizer-viROQkRn.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/public/index.js +1 -1
- package/dist/public/{initChatSplitResize-CzV2E7Ul.js → initChatSplitResize-BA18wLQQ.js} +1 -1
- package/dist/public/{initControlPlane-BqCY0NQy.js → initControlPlane-L96uJkRA.js} +1 -1
- package/dist/public/main/index.html +2 -2
- package/dist/public/main/memory/index.html +2 -2
- package/dist/public/{markdown-Cw7vCtTg.js → markdown-DGjZAm_w.js} +17 -14
- package/dist/public/{mcp-reconnect-9emsqGRe.js → mcp-reconnect-CBHuaYdF.js} +1 -1
- package/dist/public/{memoryStorage-C0KvLNUp.js → memoryStorage-C1llaYus.js} +1 -1
- package/dist/public/orchestrator-C0VOoTiK.js +15 -0
- package/dist/public/{orchestrator-DpkkeD6T.js → orchestrator-DMWi--Dc.js} +20 -19
- package/dist/public/peerjs-Bf6ZxfbA.js +1 -0
- package/dist/public/{push-client-CHjSbrWs.js → push-client-BD4YalBa.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-BBPV_9X8.js → shadow-claw-DRy-D4Qi.js} +2 -2
- package/dist/public/{shadow-claw-accounts-xUOLBsQZ.js → shadow-claw-accounts-DnfmA8cb.js} +1 -1
- package/dist/public/{shadow-claw-channels-BJvrKQjg.js → shadow-claw-channels-8UkycZAa.js} +1 -1
- package/dist/public/{shadow-claw-chat-BG2EaRaw.js → shadow-claw-chat-Cf5LUiul.js} +9 -9
- package/dist/public/{shadow-claw-control-plane-BBa7WbTg.js → shadow-claw-control-plane-UsBF-Nvd.js} +2 -2
- package/dist/public/{shadow-claw-conversations-CFaWFmkm.js → shadow-claw-conversations-Aoe61Y21.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-Z-GIKaE9.js → shadow-claw-file-viewer-D28dSSEn.js} +6 -6
- package/dist/public/{shadow-claw-files-BBx4iMsk.js → shadow-claw-files-CaDUlPEU.js} +1 -1
- package/dist/public/{shadow-claw-git-vTOKatwd.js → shadow-claw-git-DYNcZMWA.js} +2 -2
- package/dist/public/{shadow-claw-integrations-BBVnO0Fc.js → shadow-claw-integrations-BJf_hQVv.js} +1 -1
- package/dist/public/{shadow-claw-llm-Ce1Ax6-x.js → shadow-claw-llm-BqK2SIRf.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-Bkx0gsmF.js → shadow-claw-mcp-remote-B_dDG990.js} +1 -1
- package/dist/public/{shadow-claw-networking-q4XIzdB5.js → shadow-claw-networking-D8LxOofv.js} +1 -1
- package/dist/public/{shadow-claw-notifications-D2cz0gmm.js → shadow-claw-notifications-DpVyiNG_.js} +1 -1
- package/dist/public/{shadow-claw-page-header-BccSHItx.js → shadow-claw-page-header-DdC7bJuW.js} +1 -1
- package/dist/public/{shadow-claw-pages-3335lmSC.js → shadow-claw-pages-CYMl4J-6.js} +3 -3
- package/dist/public/{shadow-claw-settings-4ptYuJwO.js → shadow-claw-settings-Da_8Oy3O.js} +3 -3
- package/dist/public/{shadow-claw-storage-bIrPKFhF.js → shadow-claw-storage-DXIm86_-.js} +1 -1
- package/dist/public/{shadow-claw-task-server-5yqVBxy1.js → shadow-claw-task-server-BCceBD0G.js} +1 -1
- package/dist/public/{shadow-claw-tasks-DcqYHPLZ.js → shadow-claw-tasks-BW1QZ5L3.js} +19 -19
- package/dist/public/{shadow-claw-terminal-fARaDONr.js → shadow-claw-terminal-vqfsxhcK.js} +1 -1
- package/dist/public/{shadow-claw-tools-paEAhcJr.js → shadow-claw-tools-l0Jsa7UJ.js} +1 -1
- package/dist/public/{shadow-claw-webvm-CbzH_vyX.js → shadow-claw-webvm-CDPOWZm7.js} +1 -1
- package/dist/public/skills/main/skill-creator/SKILL.md +3 -2
- package/dist/public/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
- package/dist/public/static-main-manifest.json +2 -2
- package/dist/public/{syncWebMcpRegistration-CWSYaHex.js → syncWebMcpRegistration-5b5FkP9_.js} +1 -1
- package/dist/public/tools-B-PzsLc2.js +1 -0
- package/dist/public/{tools-C8x3nmo4.js → tools-CcgG5XuA.js} +1 -1
- package/dist/public/{tools-DvckJZG2.js → tools-VSOY66vs.js} +1 -1
- package/dist/public/{webmcp-DAjmliCx.js → webmcp-DBONjQWd.js} +1 -1
- package/dist/server.js +2 -2
- package/package.json +2 -2
- package/src/__mocks__/marked.cjs +14 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +17 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.ts +5 -1
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +78 -0
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +6 -2
- package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +56 -0
- package/src/components/shadow-claw-tasks/shadow-claw-tasks.test.ts +22 -0
- package/src/components/shadow-claw-tasks/shadow-claw-tasks.ts +5 -1
- package/src/content/markdown-links.test.ts +109 -0
- package/src/content/markdown-links.ts +187 -0
- package/src/content/markdown.test.ts +33 -0
- package/src/content/markdown.ts +6 -1
- package/src/core/app-routes.test.ts +65 -0
- package/src/core/app-routes.ts +1 -1
- package/src/core/orchestrator/orchestrator.ts +3 -0
- package/src/core/orchestrator/utils/compactContext.ts +2 -0
- package/src/core/orchestrator/utils/invokeAgent.ts +1 -0
- package/src/subsystems/accounts/service-accounts.test.ts +0 -1
- package/src/subsystems/channels/peerjs.test.ts +479 -1
- package/src/subsystems/channels/peerjs.ts +420 -75
- package/src/subsystems/channels/room.test.ts +35 -0
- package/src/subsystems/channels/room.ts +15 -0
- package/src/subsystems/skills/activateSkill.test.ts +38 -5
- package/src/subsystems/skills/activateSkill.ts +25 -3
- package/src/subsystems/skills/parseSkill.test.ts +71 -0
- package/src/subsystems/skills/parseSkill.ts +185 -25
- package/src/subsystems/tools/files.ts +4 -4
- package/src/worker/tools/spawn-subagent/spawn-subagent.test.ts +22 -23
- package/src/worker/tools/workspace/send-file.test.ts +24 -1
- package/src/worker/tools/workspace/send-file.ts +6 -3
- package/src/worker/utils/handleCompact.test.ts +3 -4
- package/src/worker/utils/handleInvoke.test.ts +13 -11
- package/src/worker/utils/handleInvoke.ts +3 -0
- package/src/worker/utils/handleMessage.test.ts +0 -1
- package/src/worker/utils/post.test.ts +3 -4
- package/src/worker/utils/sandboxedEval.test.ts +1 -2
- package/src/worker/utils/system-prompt.test.ts +59 -0
- package/src/worker/utils/system-prompt.ts +21 -1
- package/src/worker/utils/withRetry.test.ts +3 -16
- package/dist/lib/app-routes-CqBOeA5q.js.map +0 -1
- package/dist/lib/markdown-DgdSt2GD.js.map +0 -1
- package/dist/lib/orchestrator-CjEau_RG.js.map +0 -1
- package/dist/lib/peerjs-BdfpltIe.js.map +0 -1
- package/dist/lib/shadow-claw-chat-mXPQZbwT.js.map +0 -1
- package/dist/lib/shadow-claw-file-viewer-BSbZvSl-.js.map +0 -1
- package/dist/lib/shadow-claw-tasks-qmcDT4PU.js.map +0 -1
- package/dist/lib/tools-D4Pp-nUw.js +0 -1
- package/dist/public/app-routes-Bs-riIvr.js +0 -1
- package/dist/public/orchestrator-BWkHHO9Y.js +0 -15
- package/dist/public/peerjs-tf2EmWjB.js +0 -1
- package/dist/public/tools-COduyYJ0.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-file-viewer-BSbZvSl-.js","names":["shadowClawFileViewerStyles","shadowClawFileViewerTemplate","hljs"],"sources":["../../src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts"],"sourcesContent":["import hljs from \"highlight.js\";\n\nimport { renderMarkdown } from \"../../content/markdown.js\";\nimport { splitFrontmatter } from \"../../common/utils/frontmatter.mjs\";\n\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport {\n applyBasePath,\n getFileRouteDirPath,\n getWorkspaceRouteRequestPath,\n isPossibleAppRoute,\n resolveHrefAgainstRoute,\n} from \"../../core/app-routes.js\";\n\nimport { effect } from \"../../core/effect.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\n\nimport {\n sanitizeSrcdocHtml,\n setSanitizedHtml,\n setTrustedSrcdoc,\n toTrustedHtmlPresanitized,\n} from \"../../security/trusted-types.js\";\n\nimport { readGroupFileBytes } from \"../../storage/readGroupFileBytes.js\";\nimport { writeGroupFile } from \"../../storage/writeGroupFile.js\";\n\nimport { fileViewerStore } from \"../../stores/file-viewer.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\n\nimport { showError, showSuccess } from \"../../ui/toast.js\";\nimport {\n getIframeHtmlClass,\n getIframeThemeStyleHtml,\n} from \"../../ui/iframe-theme.js\";\nimport { isTruthyConfigValue } from \"../../common/utils/config-value.mjs\";\n\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport { IframeBroadcastProxy } from \"../shadow-claw-pages/utils/iframe-broadcast-proxy.js\";\nimport {\n iframeStorageClear,\n iframeStorageDelete,\n iframeStorageGet,\n iframeStorageGetAll,\n iframeStorageSet,\n} from \"../shadow-claw-pages/utils/iframe-storage-proxy.js\";\n\nimport type { Config } from \"dompurify\";\nimport type { ShadowClawDatabase } from \"../../db/types.js\";\n\nimport {\n getApprovedCustomElementScriptDescriptors,\n getIframeCsp,\n getIframeSandboxPolicy,\n isAllowedCustomElement,\n} from \"../../security/custom-element-security.js\";\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawFileViewerStyles from \"./shadow-claw-file-viewer.css\" with { type: \"css\" };\nimport shadowClawFileViewerTemplate from \"./shadow-claw-file-viewer.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-file-viewer\";\nconst highlightThemePath = `components/${elementName}/highlightjs-atom-one-dark.min.css`;\nconst highlightFontOverrideCss =\n \"pre code.hljs, code.hljs, .hljs { font-family: var(--shadow-claw-font-mono) !important; }\";\n\nconst previewSanitizeOptions: Config = {\n // Allow blob URLs for locally resolved OPFS preview assets.\n ALLOWED_URI_REGEXP:\n /^(?:(?:https?|mailto|ftp|tel|file|blob|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i,\n ADD_TAGS: [\"iframe\", \"figure\", \"figcaption\"],\n CUSTOM_ELEMENT_HANDLING: {\n tagNameCheck: (tagName: string) => isAllowedCustomElement(tagName),\n attributeNameCheck: () => true,\n allowCustomizedBuiltInElements: false,\n },\n ADD_ATTR: [\n \"allow\",\n \"allowfullscreen\",\n \"frameborder\",\n \"scrolling\",\n \"referrerpolicy\",\n \"loading\",\n ],\n};\n\nfunction resolveFrontmatterToggle(\n db: ShadowClawDatabase | null,\n key: string,\n): boolean | Promise<boolean> {\n if (!db || typeof (db as any).transaction !== \"function\") {\n return true;\n }\n\n return getConfig(db, key)\n .then((value) => isTruthyConfigValue(value, true))\n .catch(() => true);\n}\n\n/**\n * ShadowClawFileViewer - component for viewing and editing files\n */\nexport class ShadowClawFileViewer extends ShadowClawElement {\n static styles = shadowClawFileViewerStyles;\n static template = shadowClawFileViewerTemplate;\n broadcastProxy: IframeBroadcastProxy | null = null;\n\n currentImageObjectUrls: string[] = [];\n currentObjectUrl: string | null = null;\n\n db: ShadowClawDatabase | null = null;\n editorDraftContent: string | null = null;\n\n isEditorDirty: boolean = false;\n isFileEditMode: boolean = false;\n\n isFilePreviewMode: boolean = false;\n isFullscreenMode: boolean = false;\n\n lastOpenedFileName: string = \"\";\n previewFrameWindow: Window | null = null;\n themeObserver: MutationObserver | null = null;\n viewRenderToken: number = 0;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.setupEffects();\n this.bindEventListeners();\n\n this.broadcastProxy = new IframeBroadcastProxy(\n () =>\n this.previewFrameWindow ||\n (\n this.shadowRoot?.querySelector(\n \".file-content-iframe\",\n ) as HTMLIFrameElement\n )?.contentWindow ||\n null,\n );\n\n window.addEventListener(\"message\", this.handleIframeMessage);\n document.addEventListener(\"fullscreenchange\", this.handleFullscreenChange);\n\n this.themeObserver = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.type === \"attributes\" && m.attributeName === \"class\") {\n this.syncIframeTheme();\n }\n }\n });\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n this.db = await getDb();\n\n // Apply highlight.js theme to markdown preview output in this shadow root.\n try {\n const hjsCss = await fetch(highlightThemePath).then((r) => r.text());\n this.applyHighlightStyles(hjsCss);\n } catch (err) {\n console.warn(\"Failed to load highlight.js styles:\", err);\n }\n }\n\n disconnectedCallback() {\n this.broadcastProxy?.dispose();\n this.broadcastProxy = null;\n window.removeEventListener(\"message\", this.handleIframeMessage);\n document.removeEventListener(\n \"fullscreenchange\",\n this.handleFullscreenChange,\n );\n if (this.themeObserver) {\n this.themeObserver.disconnect();\n this.themeObserver = null;\n }\n this.revokeObjectUrl();\n }\n\n applyFullscreenMode(modal: Element) {\n const modalContent = modal.querySelector(\".modal-content\");\n if (modalContent instanceof HTMLElement) {\n modalContent.classList.toggle(\n \"modal-content--fullscreen\",\n this.isFullscreenMode,\n );\n }\n\n const fullscreenBtn = modal.querySelector(\".modal-fullscreen-btn\");\n if (fullscreenBtn instanceof HTMLButtonElement) {\n fullscreenBtn.setAttribute(\"aria-pressed\", String(this.isFullscreenMode));\n fullscreenBtn.setAttribute(\n \"aria-label\",\n this.isFullscreenMode ? \"Exit fullscreen\" : \"Enter fullscreen\",\n );\n fullscreenBtn.title = this.isFullscreenMode\n ? \"Exit fullscreen\"\n : \"Fullscreen\";\n }\n }\n\n applyHighlightStyles(hjsCss: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const supportsConstructedSheet =\n typeof CSSStyleSheet !== \"undefined\" &&\n typeof CSSStyleSheet.prototype.replaceSync === \"function\";\n\n if (supportsConstructedSheet && \"adoptedStyleSheets\" in root) {\n try {\n const themeSheet = new CSSStyleSheet();\n themeSheet.replaceSync(hjsCss);\n\n const fontSheet = new CSSStyleSheet();\n fontSheet.replaceSync(highlightFontOverrideCss);\n\n const existingSheets = root.adoptedStyleSheets\n ? Array.from(root.adoptedStyleSheets)\n : [];\n root.adoptedStyleSheets = [...existingSheets, themeSheet, fontSheet];\n\n return;\n } catch {\n // Some engines expose pieces of the API but fail at runtime.\n }\n }\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-shadow-claw-highlight-theme\", \"true\");\n style.textContent = `${hjsCss}\\n${highlightFontOverrideCss}`;\n root.appendChild(style);\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const content = root.querySelector(\".file-content\");\n content?.addEventListener(\"click\", (event: Event) => {\n void this.handlePreviewLinkClick(event as MouseEvent);\n });\n\n const modal = root.querySelector(\".file-modal\");\n modal?.addEventListener(\"cancel\", (event: Event) => {\n event.preventDefault();\n void this.requestCloseViewer();\n });\n modal?.addEventListener(\"close\", () => {\n if (fileViewerStore.file) {\n fileViewerStore.closeFile();\n }\n });\n\n const closeBtn = root.querySelector(\".modal-close-btn\");\n closeBtn?.addEventListener(\"click\", () => void this.requestCloseViewer());\n\n const previewBtn = root.querySelector(\".modal-preview-btn\");\n previewBtn?.addEventListener(\"click\", async () => {\n this.isFilePreviewMode = !this.isFilePreviewMode;\n this.isFileEditMode = false;\n await this.updateView();\n });\n\n const fullscreenBtn = root.querySelector(\".modal-fullscreen-btn\");\n fullscreenBtn?.addEventListener(\"click\", () => {\n if (modal) {\n void this.toggleFullscreenMode(modal);\n }\n });\n\n const shareBtn = root.querySelector(\".modal-share-btn\");\n shareBtn?.addEventListener(\"click\", async () => {\n await this.handleShareFile();\n });\n\n const editBtn = root.querySelector(\".modal-edit-btn\");\n editBtn?.addEventListener(\"click\", async () => {\n this.isFileEditMode = !this.isFileEditMode;\n if (this.isFileEditMode) {\n this.isFilePreviewMode = false;\n }\n\n await this.updateView();\n });\n\n const saveBtn = root.querySelector(\".modal-save-btn\");\n saveBtn?.addEventListener(\"click\", () => this.handleSave());\n\n const cancelBtn = root.querySelector(\".modal-cancel-btn\");\n cancelBtn?.addEventListener(\"click\", async () => {\n this.isEditorDirty = false;\n this.editorDraftContent = null;\n this.isFileEditMode = false;\n await this.updateView();\n });\n const editor = root.querySelector(\".file-editor\");\n\n editor?.addEventListener(\"input\", () => {\n if (editor instanceof HTMLTextAreaElement) {\n this.editorDraftContent = editor.value;\n this.updateEditorHighlight(editor.value);\n }\n\n this.isEditorDirty = true;\n void this.updateView();\n });\n\n if (editor instanceof HTMLTextAreaElement) {\n const syncHighlight = () => {\n const highlightPre = root.querySelector(\".file-editor-overlay\");\n if (highlightPre) {\n highlightPre.scrollTop = editor.scrollTop;\n highlightPre.scrollLeft = editor.scrollLeft;\n }\n };\n\n editor.addEventListener(\"scroll\", syncHighlight);\n editor.addEventListener(\"focus\", syncHighlight);\n editor.addEventListener(\"click\", syncHighlight);\n editor.addEventListener(\"keyup\", syncHighlight);\n editor.addEventListener(\"mouseup\", syncHighlight);\n\n const scrollBody = root.querySelector(\".modal-body\");\n scrollBody?.addEventListener(\"scroll\", syncHighlight);\n }\n }\n\n buildWebShareFile(file: any): File | null {\n if (file?.nativeFile instanceof File) {\n return file.nativeFile;\n }\n\n const bytes = file?.binaryContent;\n if (!(bytes instanceof Uint8Array) || bytes.length === 0) {\n return null;\n }\n\n const fileBytes = new Uint8Array(bytes.byteLength);\n fileBytes.set(bytes);\n\n return new File([fileBytes], file.name || \"shared-file\", {\n type: file?.mimeType || \"application/octet-stream\",\n });\n }\n\n canShareCurrentFile(file: any) {\n if (!file || !this.isWebShareAvailable()) {\n return false;\n }\n\n if (file.kind === \"text\") {\n return true;\n }\n\n const shareFile = this.buildWebShareFile(file);\n if (!shareFile || typeof navigator.canShare !== \"function\") {\n return false;\n }\n\n try {\n return navigator.canShare({ files: [shareFile] });\n } catch {\n return false;\n }\n }\n\n canUseNativeFullscreen(target: HTMLElement): target is HTMLElement & {\n requestFullscreen: () => Promise<void>;\n } {\n return (\n document.fullscreenEnabled === true &&\n (typeof (target as any).requestFullscreen === \"function\" ||\n typeof (target as any).webkitRequestFullscreen === \"function\") &&\n (typeof document.exitFullscreen === \"function\" ||\n typeof (document as any).webkitExitFullscreen === \"function\")\n );\n }\n\n getCurrentFullscreenElement(): Element | null {\n return (\n document.fullscreenElement ||\n (document as any).webkitFullscreenElement ||\n null\n );\n }\n\n getFullscreenTarget(modal: Element): HTMLElement | null {\n const modalContent = modal.querySelector(\".modal-content\");\n if (!(modalContent instanceof HTMLElement)) {\n return null;\n }\n\n return modalContent;\n }\n\n getIframeBridgeScriptUrl() {\n return applyBasePath(\"/assets/file-viewer-preview-bridge.js\");\n }\n\n getIframeSandboxPermissions(fileName: string) {\n if (/\\.svg$/i.test(fileName)) {\n return \"allow-modals allow-popups allow-popups-to-escape-sandbox\";\n }\n\n return getIframeSandboxPolicy();\n }\n\n getLanguageFromFilename(fileName: string) {\n const extension = fileName.toLowerCase().split(\".\").pop() || \"\";\n const languageMap: Record<string, string> = {\n bash: \"bash\",\n cjs: \"javascript\",\n css: \"css\",\n html: \"xml\",\n java: \"java\",\n javascript: \"javascript\",\n js: \"javascript\",\n json: \"json\",\n jsx: \"jsx\",\n markdown: \"markdown\",\n md: \"markdown\",\n mjs: \"javascript\",\n php: \"php\",\n python: \"python\",\n py: \"python\",\n ruby: \"ruby\",\n rb: \"ruby\",\n rust: \"rust\",\n rs: \"rust\",\n sh: \"bash\",\n sql: \"sql\",\n svg: \"xml\",\n ts: \"typescript\",\n tsx: \"tsx\",\n xml: \"xml\",\n yaml: \"yaml\",\n yml: \"yaml\",\n };\n\n return languageMap[extension] || \"\";\n }\n\n getPreviewSourceFile(file: any, modal: HTMLElement) {\n return this.getWorkingSourceFile(file, modal);\n }\n\n getWorkingSourceFile(file: any, modal: HTMLElement) {\n if (!this.isEditorDirty || file?.kind !== \"text\") {\n return file;\n }\n\n if (typeof this.editorDraftContent === \"string\") {\n return {\n ...file,\n content: this.editorDraftContent,\n };\n }\n\n const editor = modal.querySelector(\".file-editor\");\n if (!(editor instanceof HTMLTextAreaElement)) {\n return file;\n }\n\n return {\n ...file,\n content: editor.value,\n };\n }\n\n getWorkspaceRouteTarget(\n value: string,\n options: { allowCrossGroup?: boolean } = {},\n ): { groupId: string; path: string } | null {\n const { allowCrossGroup = false } = options;\n\n let pathOnly = value.split(/[?#]/, 1)[0].trim();\n if (!pathOnly) {\n return null;\n }\n\n if (\n /^[a-zA-Z][a-zA-Z\\d+.-]*:/u.test(pathOnly) ||\n pathOnly.startsWith(\"//\")\n ) {\n let parsed: URL;\n try {\n parsed = new URL(pathOnly, window.location.href);\n } catch {\n return null;\n }\n\n if (parsed.origin !== window.location.origin) {\n return null;\n }\n\n pathOnly = parsed.pathname;\n }\n\n const dotPrefixedFilesPath = pathOnly.replace(/^(?:\\.\\/)+/u, \"\");\n const candidates: string[] = [];\n\n if (dotPrefixedFilesPath.startsWith(\"files/\")) {\n candidates.push(`/${dotPrefixedFilesPath}`);\n }\n\n if (pathOnly.startsWith(\"/\")) {\n const nestedFilesIndex = pathOnly.lastIndexOf(\"/files/\");\n if (nestedFilesIndex > 0) {\n candidates.push(pathOnly.slice(nestedFilesIndex));\n }\n\n candidates.push(pathOnly);\n }\n\n for (const candidate of candidates) {\n const route = getWorkspaceRouteRequestPath(candidate);\n if (!route) {\n continue;\n }\n\n const resolvedGroupId = this.resolveRouteGroupId(route.groupId);\n if (!resolvedGroupId) {\n continue;\n }\n\n if (\n !allowCrossGroup &&\n resolvedGroupId !== orchestratorStore.activeGroupId\n ) {\n continue;\n }\n\n return { groupId: resolvedGroupId, path: route.path };\n }\n\n return null;\n }\n\n handleAnchorNavigation(anchor: string): boolean {\n const root = this.shadowRoot;\n if (!root) {\n return false;\n }\n\n const content = root.querySelector(\".file-content\") as HTMLElement;\n if (!content) {\n return false;\n }\n\n // Clear any existing highlighted lines\n content.querySelectorAll(\".code-line.highlighted\").forEach((el) => {\n el.classList.remove(\"highlighted\");\n });\n\n const lineMatch = anchor.match(/^#?L(\\d+)(?:-L?(\\d+))?$/i);\n if (lineMatch) {\n const startLine = parseInt(lineMatch[1], 10);\n const endLine = lineMatch[2] ? parseInt(lineMatch[2], 10) : startLine;\n\n let firstHighlightedEl: HTMLElement | null = null;\n const codeLines = content.querySelectorAll(\".code-line\");\n codeLines.forEach((el) => {\n const lineNum = parseInt(el.getAttribute(\"data-line\") || \"0\", 10);\n if (lineNum >= startLine && lineNum <= endLine) {\n el.classList.add(\"highlighted\");\n if (!firstHighlightedEl) {\n firstHighlightedEl = el as HTMLElement;\n }\n }\n });\n\n if (firstHighlightedEl) {\n (firstHighlightedEl as HTMLElement).scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n });\n\n return true;\n }\n\n return false;\n } else {\n const id = anchor.replace(/^#/, \"\");\n const targetEl =\n content.querySelector(`[id=\"${id}\"]`) ||\n content.querySelector(`a[name=\"${id}\"]`);\n if (targetEl) {\n targetEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n\n return true;\n }\n\n return false;\n }\n }\n\n handleFullscreenChange = () => {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const modal = root.querySelector(\".file-modal\");\n if (!(modal instanceof HTMLElement)) {\n return;\n }\n\n const fullscreenTarget = this.getFullscreenTarget(modal);\n this.isFullscreenMode = this.isTargetInFullscreen(fullscreenTarget);\n this.applyFullscreenMode(modal);\n };\n\n handleIframeMessage = (event: MessageEvent) => {\n if (!event.data || typeof event.data !== \"object\") {\n return;\n }\n\n const payload = event.data as {\n type?: unknown;\n href?: unknown;\n height?: unknown;\n channel?: unknown;\n payload?: unknown;\n };\n\n if (\n payload.type === \"shadow-claw-broadcast-result\" &&\n typeof payload.channel === \"string\"\n ) {\n this.broadcastProxy?.handleResultFromIframe(\n event.source as WindowProxy,\n payload.channel,\n payload.payload,\n );\n return;\n }\n\n if (\n payload.type === \"shadow-claw-iframe-resize\" &&\n typeof payload.height === \"number\"\n ) {\n const root = this.shadowRoot;\n const iframe = root?.querySelector(\".file-content-iframe\");\n if (\n iframe instanceof HTMLIFrameElement &&\n (!this.previewFrameWindow ||\n event.source === this.previewFrameWindow ||\n (iframe.contentWindow && event.source === iframe.contentWindow))\n ) {\n this.previewFrameWindow = iframe.contentWindow;\n iframe.style.setProperty(\"height\", `${payload.height}px`, \"important\");\n }\n\n return;\n }\n\n if (payload.type === \"shadow-claw-storage-proxy\") {\n if (this.previewFrameWindow && event.source !== this.previewFrameWindow) {\n return;\n }\n\n const p = payload as {\n requestId?: unknown;\n method?: unknown;\n args?: unknown;\n };\n\n this.handleStorageProxyRequest(\n event.source as WindowProxy,\n String(p.requestId || \"\"),\n String(p.method || \"\"),\n (p.args && typeof p.args === \"object\" ? p.args : {}) as Record<\n string,\n unknown\n >,\n );\n\n return;\n }\n\n if (!this.db) {\n return;\n }\n\n if (\n payload.type !== \"shadow-claw-file-viewer-link\" ||\n typeof payload.href !== \"string\"\n ) {\n return;\n }\n\n if (this.previewFrameWindow && event.source !== this.previewFrameWindow) {\n return;\n }\n\n const current = fileViewerStore.file;\n const filePath = current?.path || current?.name || \"\";\n const routeDir = applyBasePath(\n getFileRouteDirPath(orchestratorStore.activeGroupId, filePath),\n );\n const resolved = resolveHrefAgainstRoute(\n payload.href,\n routeDir,\n window.location.origin,\n );\n if (!resolved) {\n return;\n }\n\n const hasGameSave = resolved.searchParams.has(\"gameSave\");\n\n if (hasGameSave) {\n this.reloadPreviewWithSearchParams(resolved.search);\n\n return;\n }\n\n const isInternal =\n resolved.origin === window.location.origin &&\n (isPossibleAppRoute(resolved.pathname) ||\n Boolean(this.resolveWorkspaceLinkPath(payload.href, filePath)));\n\n if (!isInternal) {\n window.open(resolved.href, \"_blank\", \"noopener,noreferrer\");\n\n return;\n }\n\n const targetPath = `${resolved.pathname}${resolved.search}${resolved.hash}`;\n const nav = (window as any).navigation;\n if (nav && typeof nav.navigate === \"function\") {\n nav.navigate(targetPath);\n\n return;\n }\n\n window.history.pushState({}, \"\", targetPath);\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n };\n\n hasUnsavedChanges() {\n return this.isEditorDirty;\n }\n\n isIframePreviewFile(fileName: string) {\n return /\\.(?:html?|svg)$/i.test(fileName);\n }\n\n isMarkdownLikeFile(fileName: string) {\n return /(?:^readme$|\\.mdx?$|\\.markdown$|\\.mdown$)/i.test(fileName);\n }\n\n isNodeInComposedTree(node: Node | null, ancestor: Node): boolean {\n let current: Node | null = node;\n\n while (current) {\n if (current === ancestor) {\n return true;\n }\n\n if (current.parentNode) {\n current = current.parentNode;\n\n continue;\n }\n\n const root = current.getRootNode?.();\n if (root instanceof ShadowRoot && root.host) {\n current = root.host;\n\n continue;\n }\n\n current = null;\n }\n\n return false;\n }\n\n isRenderTokenCurrent(renderToken: number) {\n return this.viewRenderToken === renderToken;\n }\n\n isTargetInFullscreen(target: HTMLElement | null): boolean {\n if (!target) {\n return false;\n }\n\n const current = this.getCurrentFullscreenElement();\n if (!current) {\n return false;\n }\n\n return (\n current === target ||\n this.isNodeInComposedTree(target, current) ||\n this.isNodeInComposedTree(current, target)\n );\n }\n\n isWebShareAvailable() {\n return (\n typeof navigator !== \"undefined\" && typeof navigator.share === \"function\"\n );\n }\n\n mimeTypeForImageExt(ext: string): string {\n const map: Record<string, string> = {\n apng: \"image/apng\",\n avif: \"image/avif\",\n gif: \"image/gif\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\",\n };\n\n return map[ext] ?? \"image/jpeg\";\n }\n\n renderBinaryPreview(content: HTMLElement, file: any) {\n const mimeType = file.mimeType || \"application/octet-stream\";\n\n if (file.nativeFile instanceof File) {\n this.currentObjectUrl = URL.createObjectURL(file.nativeFile);\n } else {\n const bytes = file.binaryContent;\n if (!(bytes instanceof Uint8Array) || bytes.length === 0) {\n content.classList.remove(\"file-content--raw\", \"file-content--iframe\");\n content.classList.add(\"file-content--preview\");\n content.textContent = \"Binary content unavailable.\";\n\n return;\n }\n\n // Copy into a plain ArrayBuffer-backed view so BlobPart typing is stable in checkJs.\n const blobBytes = new Uint8Array(bytes.byteLength);\n blobBytes.set(bytes);\n\n const blob = new Blob([blobBytes], { type: mimeType });\n this.currentObjectUrl = URL.createObjectURL(blob);\n }\n\n content.classList.remove(\"file-content--raw\", \"file-content--preview\");\n content.classList.add(\"file-content--iframe\");\n\n if (mimeType.startsWith(\"image/\")) {\n const image = document.createElement(\"img\");\n image.className = \"file-content-iframe\";\n image.alt = `Preview: ${file.name}`;\n image.src = this.currentObjectUrl;\n image.style.objectFit = \"contain\";\n\n content.replaceChildren(image);\n\n return;\n }\n\n if (mimeType.startsWith(\"video/\")) {\n const video = document.createElement(\"video\");\n video.className = \"file-content-iframe\";\n video.controls = true;\n video.src = this.currentObjectUrl;\n video.style.backgroundColor = \"black\";\n\n content.replaceChildren(video);\n\n return;\n }\n\n if (mimeType.startsWith(\"audio/\")) {\n const audioWrap = document.createElement(\"div\");\n audioWrap.className = \"file-content file-content--preview\";\n audioWrap.style.padding = \"1rem\";\n\n const label = document.createElement(\"p\");\n label.textContent = file.name;\n\n const audio = document.createElement(\"audio\");\n audio.controls = true;\n audio.src = this.currentObjectUrl;\n audio.style.width = \"100%\";\n\n audioWrap.replaceChildren(label, audio);\n content.replaceChildren(audioWrap);\n content.classList.remove(\"file-content--iframe\");\n\n return;\n }\n\n const iframe = document.createElement(\"iframe\");\n iframe.className = \"file-content-iframe\";\n iframe.setAttribute(\"title\", `Preview: ${file.name}`);\n iframe.setAttribute(\"referrerpolicy\", \"no-referrer\");\n iframe.src = this.currentObjectUrl;\n\n content.replaceChildren(iframe);\n }\n\n resetContent() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const modal = root.querySelector(\".file-modal\");\n if (!(modal instanceof HTMLElement)) {\n return;\n }\n\n const fullscreenTarget = this.getFullscreenTarget(modal);\n if (fullscreenTarget && this.isTargetInFullscreen(fullscreenTarget)) {\n void this.exitNativeFullscreen().catch(() => {\n // noop\n });\n }\n\n this.isFullscreenMode = false;\n this.applyFullscreenMode(modal);\n\n const content = modal.querySelector(\".file-content\");\n const previewBtn = modal.querySelector(\".modal-preview-btn\");\n\n if (previewBtn instanceof HTMLButtonElement) {\n previewBtn.setAttribute(\"aria-pressed\", \"false\");\n previewBtn.setAttribute(\"aria-label\", \"Switch to preview mode\");\n }\n\n const editBtn = modal.querySelector(\".modal-edit-btn\");\n if (editBtn instanceof HTMLButtonElement) {\n editBtn.setAttribute(\"aria-pressed\", \"false\");\n editBtn.setAttribute(\"aria-label\", \"Edit file\");\n editBtn.classList.remove(\"hidden\");\n }\n\n const closeBtn = modal.querySelector(\".modal-close-btn\");\n if (closeBtn instanceof HTMLButtonElement) {\n closeBtn.disabled = false;\n closeBtn.setAttribute(\"aria-label\", \"Close file viewer\");\n closeBtn.title = \"Close\";\n }\n\n const saveBtn = modal.querySelector(\".modal-save-btn\");\n saveBtn?.classList.add(\"hidden\");\n\n const editorContainer = modal.querySelector(\".file-editor-container\");\n editorContainer?.classList.remove(\"active\");\n\n const modalBody = modal.querySelector(\".modal-body\");\n modalBody?.classList.remove(\"modal-body--editing\");\n\n const editor = modal.querySelector(\".file-editor\");\n if (editor instanceof HTMLTextAreaElement) {\n editor.value = \"\";\n editor.removeAttribute(\"language\");\n }\n\n const highlightCode = modal.querySelector(\".file-editor-overlay code\");\n if (highlightCode) {\n highlightCode.innerHTML = \"\";\n highlightCode.className = \"hljs\";\n }\n\n this.isFileEditMode = false;\n this.editorDraftContent = null;\n\n if (!(content instanceof HTMLElement)) {\n return;\n }\n\n this.revokeObjectUrl();\n\n content.classList.remove(\"hidden\");\n content.classList.add(\"file-content--raw\");\n content.classList.remove(\"file-content--preview\", \"file-content--iframe\");\n content.textContent = \"\";\n }\n\n resolveRouteGroupId(routeGroupId: string): string | null {\n const expectedGroupId = orchestratorStore.activeGroupId;\n if (\n routeGroupId === expectedGroupId ||\n this.routeGroupMatches(routeGroupId, expectedGroupId)\n ) {\n return expectedGroupId;\n }\n\n const groups = Array.isArray(orchestratorStore.groups)\n ? orchestratorStore.groups\n : [];\n const exact = groups.find((group) => group.groupId === routeGroupId);\n if (exact) {\n return exact.groupId;\n }\n\n const alias = groups.find((group) =>\n this.routeGroupMatches(routeGroupId, group.groupId),\n );\n if (alias) {\n return alias.groupId;\n }\n\n return routeGroupId || null;\n }\n\n resolveWorkspaceLinkPath(href: string, basePath: string = \"\"): string | null {\n const trimmed = href.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n return null;\n }\n\n let candidate = trimmed;\n const hasScheme = /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(trimmed);\n\n if (hasScheme || trimmed.startsWith(\"//\")) {\n let parsed: URL;\n try {\n parsed = new URL(trimmed, window.location.href);\n } catch {\n return null;\n }\n\n const isHttp =\n parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n if (!isHttp || parsed.host !== window.location.host) {\n return null;\n }\n\n candidate = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n }\n\n const workspaceRouteTarget = this.getWorkspaceRouteTarget(candidate);\n if (workspaceRouteTarget) {\n return workspaceRouteTarget.path;\n }\n\n let normalized = candidate.split(/[?#]/, 1)[0].replace(/\\\\/g, \"/\");\n const isAbsolute = normalized.startsWith(\"/\");\n\n if (hasScheme || isAbsolute) {\n return null;\n }\n\n normalized = normalized.replace(/^\\/+/, \"\");\n\n if (!normalized) {\n return null;\n }\n\n const stack: string[] = [];\n\n if (!isAbsolute) {\n const baseNormalized = basePath.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n const baseParts = baseNormalized.split(\"/\").filter(Boolean);\n baseParts.pop();\n stack.push(...baseParts);\n }\n\n for (const part of normalized.split(\"/\")) {\n if (!part || part === \".\") {\n continue;\n }\n\n if (part === \"..\") {\n if (stack.length === 0) {\n return null;\n }\n\n stack.pop();\n\n continue;\n }\n\n stack.push(part);\n }\n\n return stack.length > 0 ? stack.join(\"/\") : null;\n }\n\n revokeObjectUrl() {\n this.previewFrameWindow = null;\n\n if (this.currentObjectUrl) {\n URL.revokeObjectURL(this.currentObjectUrl);\n this.currentObjectUrl = null;\n }\n\n for (const url of this.currentImageObjectUrls) {\n URL.revokeObjectURL(url);\n }\n\n this.currentImageObjectUrls = [];\n }\n\n rewriteWorkspacePreviewHtml(html: string, filePath: string): string {\n if (!html) {\n return html;\n }\n\n const routeDir = applyBasePath(\n getFileRouteDirPath(orchestratorStore.activeGroupId, filePath),\n );\n const parsed = new DOMParser().parseFromString(html, \"text/html\");\n\n const rewriteUrlAttribute = (\n selector: string,\n attribute: \"href\" | \"src\",\n ) => {\n const nodes = Array.from(parsed.querySelectorAll(selector));\n for (const node of nodes) {\n const currentValue = node.getAttribute(attribute) || \"\";\n const trimmed = currentValue.trim();\n if (\n !trimmed ||\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"javascript:\")\n ) {\n continue;\n }\n\n const resolved = resolveHrefAgainstRoute(\n trimmed,\n routeDir,\n window.location.origin,\n );\n if (!resolved || resolved.origin !== window.location.origin) {\n continue;\n }\n\n if (attribute === \"href\") {\n const isInternal =\n isPossibleAppRoute(resolved.pathname) ||\n Boolean(this.resolveWorkspaceLinkPath(trimmed, filePath));\n if (!isInternal) {\n continue;\n }\n }\n\n node.setAttribute(\n attribute,\n `${resolved.pathname}${resolved.search}${resolved.hash}`,\n );\n }\n };\n\n rewriteUrlAttribute(\"a[href]\", \"href\");\n rewriteUrlAttribute(\"img[src]\", \"src\");\n rewriteUrlAttribute(\"audio[src]\", \"src\");\n rewriteUrlAttribute(\"video[src]\", \"src\");\n rewriteUrlAttribute(\"source[src]\", \"src\");\n\n return parsed.body.innerHTML;\n }\n\n routeGroupMatches(routeGroupId: string, expectedGroupId: string): boolean {\n if (routeGroupId === expectedGroupId) {\n return true;\n }\n\n if (\n (routeGroupId === \"main\" && expectedGroupId === \"br:main\") ||\n (routeGroupId === \"br:main\" && expectedGroupId === \"main\")\n ) {\n return true;\n }\n\n if (!routeGroupId.includes(\":\") && !expectedGroupId.includes(\":\")) {\n return false;\n }\n\n const normalize = (value: string) => value.trim().replace(/:/g, \"-\");\n\n return normalize(routeGroupId) === normalize(expectedGroupId);\n }\n\n setupEffects() {\n effect(() => {\n const declTools = toolsStore.declarativeTools;\n if (this.broadcastProxy && declTools.length > 0) {\n this.broadcastProxy.registerChannelsFromTools(declTools);\n }\n });\n\n effect(() => {\n const file = fileViewerStore.file;\n const renderToken = ++this.viewRenderToken;\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const shadowDialog = root.querySelector(\"shadow-claw-dialog\") as any;\n if (shadowDialog && typeof shadowDialog.ensureDialog === \"function\") {\n shadowDialog.ensureDialog();\n }\n\n const modal = root.querySelector(\".file-modal\");\n\n if (file) {\n if (\n shadowDialog &&\n typeof shadowDialog.showModal === \"function\" &&\n !shadowDialog.open\n ) {\n shadowDialog.showModal();\n } else if (modal instanceof HTMLDialogElement && !modal.open) {\n modal.showModal();\n }\n\n const title = root.querySelector(\".modal-title\");\n if (title instanceof HTMLElement) {\n title.textContent = `File: ${file.name}`;\n }\n\n if (this.lastOpenedFileName !== file.name) {\n this.lastOpenedFileName = file.name;\n this.isFilePreviewMode = this.shouldAutoPreview(file);\n this.isFileEditMode = false;\n this.isEditorDirty = false;\n this.editorDraftContent = null;\n }\n\n // async / await\n void this.updateView(renderToken);\n } else {\n if (\n shadowDialog &&\n typeof shadowDialog.close === \"function\" &&\n shadowDialog.open\n ) {\n shadowDialog.close();\n } else if (modal instanceof HTMLDialogElement && modal.open) {\n modal.close();\n }\n\n this.lastOpenedFileName = \"\";\n this.isFilePreviewMode = false;\n this.isEditorDirty = false;\n this.editorDraftContent = null;\n\n this.resetContent();\n }\n });\n }\n\n shouldAutoPreview(file: any) {\n if (!file || typeof file !== \"object\") {\n return false;\n }\n\n if (file.kind === \"pdf\" || file.kind === \"binary\") {\n return true;\n }\n\n if (file.kind === \"text\") {\n return (\n this.isIframePreviewFile(file.name) ||\n this.isMarkdownLikeFile(file.name)\n );\n }\n\n return false;\n }\n\n stripHtmlFrontmatter(content: string): string {\n if (typeof content !== \"string\" || !content.trimStart().startsWith(\"---\")) {\n return content;\n }\n\n const parsed = splitFrontmatter(content);\n if (Object.keys(parsed.data || {}).length === 0) {\n return content;\n }\n\n return parsed.content || \"\";\n }\n\n toPreviewMarkdown(file: any) {\n if (this.isMarkdownLikeFile(file.name)) {\n return file.content;\n }\n\n const lang = this.getLanguageFromFilename(file.name);\n\n return \"```\" + lang + \"\\n\" + file.content + \"\\n```\";\n }\n\n updateEditorHighlight(value: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const highlightCode = root.querySelector(\".file-editor-overlay code\");\n if (!highlightCode) {\n return;\n }\n\n const file = fileViewerStore.file;\n const language = this.getLanguageFromFilename(file?.name || \"\");\n let highlighted = \"\";\n\n try {\n if (language && hljs.getLanguage(language)) {\n highlighted = hljs.highlight(value, { language }).value;\n } else {\n highlighted = hljs.highlightAuto(value).value;\n }\n } catch {\n highlighted = value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n }\n\n highlightCode.className = language ? `hljs language-${language}` : \"hljs\";\n // hljs output is pre-sanitized: user content is entity-escaped and\n // only generated <span class=\"hljs-*\"> tags are added. Use\n // toTrustedHtmlPresanitized to satisfy Trusted Types without\n // running DOMPurify (which would strip the hljs span tokens).\n highlightCode.innerHTML = toTrustedHtmlPresanitized(\n highlighted + \"<br>\",\n ) as string;\n }\n\n wrapCodeLines(content: HTMLElement) {\n const codeBlocks = content.querySelectorAll(\"pre code\");\n codeBlocks.forEach((codeEl) => {\n const htmlContent = codeEl.innerHTML;\n const lines = htmlContent.split(/\\r?\\n/u);\n\n if (lines.length > 1 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n const wrappedHtml = lines\n .map((line, idx) => {\n const lineNum = idx + 1;\n\n return `<span class=\"code-line\" data-line=\"${lineNum}\">${line || \" \"}</span>`;\n })\n .join(\"\\n\");\n setSanitizedHtml(codeEl, wrappedHtml);\n });\n }\n\n async buildIframePreviewSrcdoc(file: any, searchParams: string = \"\") {\n if (/\\.svg$/i.test(file.name)) {\n return file.content;\n }\n\n const filePath = file.path || file.name || \"\";\n const sansFrontmatter = this.stripHtmlFrontmatter(file.content || \"\");\n const resolvedHtml = this.rewriteWorkspacePreviewHtml(\n sansFrontmatter,\n filePath,\n );\n const htmlContent = await this.resolveRelativeImagesInHtml(\n resolvedHtml,\n filePath,\n );\n\n const safeContent = sanitizeSrcdocHtml(htmlContent, previewSanitizeOptions);\n\n // Nonce-gated CSP: only the bridge script and approved custom element scripts may run.\n const nonce = crypto.randomUUID().replace(/-/g, \"\");\n const bridgeScriptUrl = this.getIframeBridgeScriptUrl();\n const storageBridgeScriptUrl = applyBasePath(\n \"/assets/iframe-storage-bridge.js\",\n );\n\n const approvedScripts = getApprovedCustomElementScriptDescriptors();\n const cspContent = getIframeCsp(nonce);\n\n const configScript =\n typeof document !== \"undefined\"\n ? document.getElementById(\"shadow-claw-site-config\")\n : null;\n const siteConfigHtml =\n configScript && configScript.textContent\n ? `<script id=\"shadow-claw-site-config\" type=\"application/json\">${configScript.textContent}</script>`\n : \"\";\n\n const searchScriptHtml = searchParams\n ? `<script nonce=\"${nonce}\">(function(){try{Object.defineProperty(globalThis.location,\"search\",{get:function(){return ${JSON.stringify(searchParams)};},configurable:true});}catch(e){}})();</script>`\n : \"\";\n\n const customElementScriptsHtml = approvedScripts\n .map(({ src, hasInit }) => {\n const isExternal =\n src.startsWith(\"http://\") ||\n src.startsWith(\"https://\") ||\n src.startsWith(\"//\");\n const resolvedSrc = isExternal\n ? src\n : applyBasePath(\n src.startsWith(\"/\")\n ? src\n : `/${src.replace(/^pages\\/main\\//, \"\")}`,\n );\n const tags = [\n `<script type=\"module\" src=\"${resolvedSrc}\" nonce=\"${nonce}\"></script>`,\n ];\n if (hasInit) {\n tags.push(\n `<script type=\"module\" nonce=\"${nonce}\">import(\"${resolvedSrc}\").then((m) => { try { if (typeof m?.init === \"function\") m.init(); } catch (e) { console.error(\"[ShadowClaw] Error executing init for \" + ${JSON.stringify(resolvedSrc)}, e); } }).catch(() => {});</script>`,\n );\n }\n return tags.join(\"\\n\");\n })\n .join(\"\\n\");\n\n const themeStylesheetLink = `<link rel=\"stylesheet\" href=\"${applyBasePath(\n \"/theme.css\",\n )}\">`;\n\n return [\n \"<!doctype html>\",\n `<html class=\"${getIframeHtmlClass()}\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">`,\n `<meta http-equiv=\"Content-Security-Policy\" content=\"${cspContent}\">`,\n `<base href=\"${applyBasePath(getFileRouteDirPath(orchestratorStore.activeGroupId, filePath))}\" target=\"_blank\">`,\n searchScriptHtml,\n siteConfigHtml,\n `<script src=\"${storageBridgeScriptUrl}\" nonce=\"${nonce}\"></script>`,\n `<script src=\"${bridgeScriptUrl}\" nonce=\"${nonce}\"></script>`,\n getIframeThemeStyleHtml(),\n themeStylesheetLink,\n customElementScriptsHtml,\n \"</head><body>\",\n safeContent,\n \"</body></html>\",\n ].join(\"\");\n }\n\n async canDismissViewer() {\n if (!this.hasUnsavedChanges()) {\n return true;\n }\n\n const confirmed = await this.requestConfirmation({\n title: \"Discard Unsaved Changes\",\n message: \"You have unsaved changes. Discard them and close?\",\n confirmLabel: \"Discard\",\n cancelLabel: \"Keep Editing\",\n });\n\n if (confirmed) {\n this.isEditorDirty = false;\n this.editorDraftContent = null;\n }\n\n return confirmed;\n }\n\n async exitFullscreenIfActive(modal?: Element): Promise<void> {\n const root = this.shadowRoot;\n const activeModal = modal || root?.querySelector(\".file-modal\");\n if (!activeModal) {\n return;\n }\n\n const fullscreenTarget = this.getFullscreenTarget(activeModal);\n if (!fullscreenTarget || !this.isTargetInFullscreen(fullscreenTarget)) {\n return;\n }\n\n try {\n await this.exitNativeFullscreen();\n } catch {\n // Native fullscreen exit can fail if browser blocks it.\n }\n }\n\n async exitNativeFullscreen(): Promise<void> {\n const exit =\n document.exitFullscreen || (document as any).webkitExitFullscreen;\n if (typeof exit !== \"function\") {\n throw new Error(\"Native fullscreen exit unavailable\");\n }\n\n await Promise.resolve(exit.call(document));\n }\n\n async handlePreviewLinkClick(event: MouseEvent) {\n if (event.defaultPrevented || event.button !== 0) {\n return;\n }\n\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n const link = target.closest(\"a\");\n if (!(link instanceof HTMLAnchorElement) || !this.db) {\n return;\n }\n\n const current = fileViewerStore.file;\n const basePath = current?.path || current?.name || \"\";\n const href = link.getAttribute(\"href\") || \"\";\n const routeDir = applyBasePath(\n getFileRouteDirPath(orchestratorStore.activeGroupId, basePath),\n );\n const resolved = resolveHrefAgainstRoute(\n href,\n routeDir,\n window.location.origin,\n );\n\n const isInternal =\n resolved &&\n resolved.origin === window.location.origin &&\n (isPossibleAppRoute(resolved.pathname) ||\n Boolean(this.resolveWorkspaceLinkPath(href, basePath)));\n\n if (isInternal && resolved) {\n event.preventDefault();\n const targetPath = `${resolved.pathname}${resolved.search}${resolved.hash}`;\n const nav = (window as any).navigation;\n if (nav && typeof nav.navigate === \"function\") {\n nav.navigate(targetPath);\n } else {\n window.history.pushState({}, \"\", targetPath);\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n\n return;\n }\n\n const trimmed = href.trim();\n if (\n trimmed &&\n !trimmed.startsWith(\"#\") &&\n !trimmed.startsWith(\"javascript:\")\n ) {\n const targetAttr = link.getAttribute(\"target\") || \"_blank\";\n const safeTarget =\n targetAttr === \"_self\" ||\n targetAttr === \"_top\" ||\n targetAttr === \"_parent\"\n ? \"_blank\"\n : targetAttr;\n\n try {\n const parsed = new URL(trimmed, window.location.href);\n const isExternal = parsed.host !== window.location.host;\n if (isExternal) {\n event.preventDefault();\n window.open(trimmed, safeTarget, \"noopener,noreferrer\");\n }\n } catch {\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:/u.test(trimmed)) {\n event.preventDefault();\n window.open(trimmed, safeTarget, \"noopener,noreferrer\");\n }\n }\n }\n }\n\n async handleSave() {\n const file = fileViewerStore.file;\n if (!file || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n const saveBtn = root?.querySelector(\".modal-save-btn\");\n const editor = root?.querySelector(\".file-editor\");\n\n if (!(editor instanceof HTMLTextAreaElement)) {\n return;\n }\n\n try {\n if (saveBtn instanceof HTMLButtonElement) {\n saveBtn.disabled = true;\n saveBtn.textContent = \"⏳ saving...\";\n }\n\n const newContent = editor.value;\n const filePath =\n file.path ||\n (orchestratorStore.currentPath === \".\"\n ? file.name\n : `${orchestratorStore.currentPath}/${file.name}`);\n const groupId = file.groupId || orchestratorStore.activeGroupId;\n\n await writeGroupFile(this.db, groupId, filePath, newContent);\n\n showSuccess(`Saved ${file.name}`);\n\n // Notify pages (and other consumers) rendering this path so they refresh\n // without requiring the user to navigate away and back.\n document.dispatchEvent(\n new CustomEvent(\"shadow-claw-file-saved\", {\n detail: { groupId, path: filePath },\n bubbles: true,\n composed: true,\n }),\n );\n\n await orchestratorStore.loadFiles(this.db);\n\n file.content = newContent;\n this.isFileEditMode = false;\n this.isEditorDirty = false;\n this.editorDraftContent = null;\n\n await this.updateView();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n showError(`Failed to save file: ${message}`);\n } finally {\n if (saveBtn instanceof HTMLButtonElement) {\n saveBtn.disabled = false;\n saveBtn.textContent = \"💾 Save\";\n }\n }\n }\n\n async handleShareFile() {\n const file = fileViewerStore.file;\n if (!file || !this.canShareCurrentFile(file)) {\n showError(\"Sharing is not supported for this file on this device.\", 4500);\n\n return;\n }\n\n try {\n if (file.kind === \"text\") {\n await navigator.share({\n title: file.name,\n text: file.content || \"\",\n });\n } else {\n const shareFile = this.buildWebShareFile(file);\n if (!shareFile || !navigator.canShare?.({ files: [shareFile] })) {\n showError(\"File sharing is not supported on this device.\", 4500);\n\n return;\n }\n\n await navigator.share({\n title: file.name,\n files: [shareFile],\n });\n }\n\n showSuccess(`Shared ${file.name}`);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to share file: ${message}`, 5000);\n }\n }\n\n async openFolderInFilesView(path: string) {\n if (!this.db) {\n return;\n }\n\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, \"\");\n if (!normalizedPath) {\n return;\n }\n\n try {\n await orchestratorStore.setCurrentPath(this.db, normalizedPath);\n fileViewerStore.closeFile();\n\n const maybeUi = (window as any)?.shadowclaw?.ui;\n if (maybeUi && typeof maybeUi.showPage === \"function\") {\n maybeUi.showPage(\"files\");\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to open linked folder: ${message}`, 5000);\n }\n }\n\n async openWorkspaceLink(href: string, basePath: string) {\n if (!this.db) {\n return;\n }\n\n const resolved = this.resolveWorkspaceLinkPath(href, basePath);\n if (!resolved) {\n return;\n }\n\n const lastSegment = resolved.split(\"/\").filter(Boolean).pop() || \"\";\n const hasExtension = /\\.[^./]+$/u.test(lastSegment);\n\n if (!hasExtension) {\n // Try opening the exact path first (supports extensionless files).\n try {\n await fileViewerStore.openFile(\n this.db,\n resolved,\n orchestratorStore.activeGroupId,\n );\n\n return;\n } catch (err) {\n const isNotFound =\n err instanceof DOMException && err.name === \"NotFoundError\";\n const isDirectory =\n err instanceof DOMException && err.name === \"TypeMismatchError\";\n if (!isNotFound && !isDirectory) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to open linked file: ${message}`, 5000);\n\n return;\n }\n }\n\n await this.openFolderInFilesView(resolved);\n\n return;\n }\n\n try {\n await fileViewerStore.openFile(\n this.db,\n resolved,\n orchestratorStore.activeGroupId,\n );\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to open linked file: ${message}`, 5000);\n }\n }\n\n async renderPreview(\n content: HTMLElement,\n file: any,\n renderToken: number = this.viewRenderToken,\n ) {\n if (!this.isRenderTokenCurrent(renderToken)) {\n return;\n }\n\n this.revokeObjectUrl();\n this.previewFrameWindow = null;\n\n if (file.kind === \"pdf\") {\n content.classList.remove(\n \"file-content--raw\",\n \"file-content--preview\",\n \"file-content--iframe\",\n );\n\n import(\"../shadow-claw-pdf-viewer/shadow-claw-pdf-viewer.js\")\n .then(() => {\n const pdfViewer = document.createElement(\n \"shadow-claw-pdf-viewer\",\n ) as HTMLElement & {\n file: any;\n };\n pdfViewer.file = file;\n content.replaceChildren(pdfViewer);\n })\n .catch(console.error);\n\n return;\n }\n\n if (file.kind === \"binary\") {\n this.renderBinaryPreview(content, file);\n\n return;\n }\n\n if (this.isIframePreviewFile(file.name)) {\n content.classList.remove(\"file-content--raw\", \"file-content--preview\");\n content.classList.add(\"file-content--iframe\");\n\n const iframe = document.createElement(\"iframe\");\n iframe.className = \"file-content-iframe\";\n iframe.setAttribute(\"title\", `Preview: ${file.name}`);\n iframe.setAttribute(\n \"sandbox\",\n this.getIframeSandboxPermissions(file.name),\n );\n iframe.setAttribute(\"allow\", \"fullscreen\");\n\n iframe.setAttribute(\"referrerpolicy\", \"no-referrer\");\n setTrustedSrcdoc(iframe, await this.buildIframePreviewSrcdoc(file));\n iframe.addEventListener(\"load\", () => {\n this.previewFrameWindow = iframe.contentWindow;\n this.syncIframeTheme();\n });\n\n content.replaceChildren(iframe);\n\n return;\n }\n\n content.classList.remove(\"file-content--raw\");\n content.classList.add(\"file-content--preview\");\n\n const currentFile = fileViewerStore.file;\n const basePath = currentFile?.path || currentFile?.name || \"\";\n const previewMarkdown = this.toPreviewMarkdown(file);\n const renderFrontmatterValue = resolveFrontmatterToggle(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_FILE_VIEWER,\n );\n const renderFrontmatter =\n typeof renderFrontmatterValue === \"boolean\"\n ? renderFrontmatterValue\n : await renderFrontmatterValue;\n const previewMarkdownHtml = await renderMarkdown(previewMarkdown, {\n renderFrontmatter,\n });\n if (!this.isRenderTokenCurrent(renderToken)) {\n return;\n }\n const resolvedPreviewHtml = this.rewriteWorkspacePreviewHtml(\n previewMarkdownHtml,\n basePath,\n );\n\n if (!this.isRenderTokenCurrent(renderToken)) {\n return;\n }\n\n setSanitizedHtml(content, resolvedPreviewHtml, previewSanitizeOptions);\n this.wrapCodeLines(content);\n await this.resolveMarkdownImages(content, basePath);\n }\n\n async requestCloseViewer(): Promise<boolean> {\n if (!(await this.canDismissViewer())) {\n return false;\n }\n\n await this.exitFullscreenIfActive();\n\n fileViewerStore.closeFile();\n\n return true;\n }\n\n async requestConfirmation(options: {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): Promise<boolean> {\n const appShell = document.querySelector(\"shadow-claw\") as any;\n if (appShell && typeof appShell.requestDialog === \"function\") {\n return await appShell.requestDialog({ mode: \"confirm\", ...options });\n }\n\n return false;\n }\n\n async requestNativeFullscreen(target: HTMLElement): Promise<void> {\n const request =\n (target as any).requestFullscreen ||\n (target as any).webkitRequestFullscreen;\n if (typeof request !== \"function\") {\n throw new Error(\"Native fullscreen unavailable\");\n }\n\n await Promise.resolve(request.call(target));\n }\n\n /**\n * Resolves relative image src attributes in rendered markdown by loading the\n * corresponding files from OPFS and replacing the src with an object URL.\n */\n async resolveMarkdownImages(content: HTMLElement, filePath: string) {\n if (!this.db) {\n return;\n }\n\n const images = Array.from(content.querySelectorAll(\"img\"));\n if (images.length === 0) {\n return;\n }\n\n await Promise.all(\n images.map(async (img) => {\n const src = img.getAttribute(\"src\") || \"\";\n if (!src || /^(?:blob:|data:|#)/u.test(src)) {\n return;\n }\n\n const routeTarget = this.getWorkspaceRouteTarget(src, {\n allowCrossGroup: true,\n });\n const target =\n routeTarget ||\n (() => {\n const path = this.resolveWorkspaceLinkPath(src, filePath);\n if (!path) {\n return null;\n }\n\n return {\n groupId: orchestratorStore.activeGroupId,\n path,\n };\n })();\n\n if (!target) {\n return;\n }\n\n try {\n const bytes = await readGroupFileBytes(\n this.db!,\n target.groupId,\n target.path,\n );\n const ext = target.path.split(\".\").pop()?.toLowerCase() || \"\";\n const mimeType = this.mimeTypeForImageExt(ext);\n\n const blobBytes = new Uint8Array(bytes.byteLength);\n blobBytes.set(bytes);\n\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(new Blob([blobBytes], { type: mimeType }));\n });\n\n img.src = dataUrl;\n } catch {\n // File not found or unreadable — leave src as-is.\n }\n }),\n );\n }\n\n async resolveRelativeImagesInHtml(html: string, filePath: string) {\n if (!this.db || !html) {\n return html;\n }\n\n const parsed = new DOMParser().parseFromString(html, \"text/html\");\n const images = Array.from(parsed.querySelectorAll(\"img\"));\n if (images.length === 0) {\n return html;\n }\n\n await Promise.all(\n images.map(async (img) => {\n const src = img.getAttribute(\"src\") || \"\";\n if (!src || /^(?:blob:|data:|#)/u.test(src)) {\n return;\n }\n\n const routeTarget = this.getWorkspaceRouteTarget(src, {\n allowCrossGroup: true,\n });\n const target =\n routeTarget ||\n (() => {\n const path = this.resolveWorkspaceLinkPath(src, filePath);\n if (!path) {\n return null;\n }\n\n return {\n groupId: orchestratorStore.activeGroupId,\n path,\n };\n })();\n\n if (!target) {\n return;\n }\n\n try {\n const bytes = await readGroupFileBytes(\n this.db!,\n target.groupId,\n target.path,\n );\n const ext = target.path.split(\".\").pop()?.toLowerCase() || \"\";\n const mimeType = this.mimeTypeForImageExt(ext);\n\n const blobBytes = new Uint8Array(bytes.byteLength);\n blobBytes.set(bytes);\n\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(new Blob([blobBytes], { type: mimeType }));\n });\n\n img.setAttribute(\"src\", dataUrl);\n } catch {\n // File not found or unreadable — leave src as-is.\n }\n }),\n );\n\n return parsed.body.innerHTML;\n }\n\n async toggleFullscreenMode(modal: Element) {\n const fullscreenTarget = this.getFullscreenTarget(modal);\n if (!fullscreenTarget) {\n return;\n }\n\n if (this.canUseNativeFullscreen(fullscreenTarget)) {\n const isAlreadyFullscreen = this.isTargetInFullscreen(fullscreenTarget);\n\n try {\n if (isAlreadyFullscreen) {\n await this.exitNativeFullscreen();\n this.isFullscreenMode = false;\n } else {\n await this.requestNativeFullscreen(fullscreenTarget);\n this.isFullscreenMode = true;\n }\n } catch {\n // If native fullscreen fails (permission/user gesture), keep fallback UX.\n this.isFullscreenMode = !this.isFullscreenMode;\n }\n\n this.applyFullscreenMode(modal);\n\n return;\n }\n\n this.isFullscreenMode = !this.isFullscreenMode;\n this.applyFullscreenMode(modal);\n }\n\n async updateView(renderToken: number = this.viewRenderToken) {\n const file = fileViewerStore.file;\n const root = this.shadowRoot;\n if (!root || !file) {\n return;\n }\n\n const modal = root.querySelector(\".file-modal\");\n if (!(modal instanceof HTMLElement)) {\n return;\n }\n\n this.applyFullscreenMode(modal);\n\n const content = modal.querySelector(\".file-content\");\n const previewBtn = modal.querySelector(\".modal-preview-btn\");\n const modalBody = modal.querySelector(\".modal-body\");\n\n if (!(content instanceof HTMLElement)) {\n return;\n }\n\n content.classList.remove(\"file-content--iframe\");\n\n const workingFile = this.getWorkingSourceFile(file, modal);\n const canEdit = file.kind === \"text\";\n\n if (previewBtn instanceof HTMLButtonElement) {\n previewBtn.setAttribute(\"aria-pressed\", String(this.isFilePreviewMode));\n previewBtn.setAttribute(\n \"aria-label\",\n this.isFilePreviewMode\n ? \"Switch to raw text view\"\n : \"Switch to preview mode\",\n );\n }\n\n // Get editor elements\n const editorContainer = modal.querySelector(\".file-editor-container\");\n const editBtn = modal.querySelector(\".modal-edit-btn\");\n const saveBtn = modal.querySelector(\".modal-save-btn\");\n const shareBtn = modal.querySelector(\".modal-share-btn\");\n const closeBtn = modal.querySelector(\".modal-close-btn\");\n const cancelBtn = modal.querySelector(\".modal-cancel-btn\");\n\n if (shareBtn instanceof HTMLButtonElement) {\n const canShare = this.canShareCurrentFile(file);\n shareBtn.classList.toggle(\"hidden\", !canShare);\n shareBtn.disabled = !canShare;\n }\n\n if (closeBtn instanceof HTMLButtonElement) {\n const isDirty = this.hasUnsavedChanges();\n closeBtn.disabled = false;\n closeBtn.setAttribute(\n \"aria-label\",\n isDirty ? \"Close file viewer (unsaved changes)\" : \"Close file viewer\",\n );\n closeBtn.title = isDirty ? \"Close (you have unsaved changes)\" : \"Close\";\n }\n\n // Save and Cancel are driven purely by dirty state, independent of view mode.\n const isDirty = this.hasUnsavedChanges();\n if (saveBtn instanceof HTMLButtonElement) {\n saveBtn.classList.toggle(\"hidden\", !isDirty);\n }\n\n if (cancelBtn instanceof HTMLButtonElement) {\n cancelBtn.classList.toggle(\"hidden\", !isDirty);\n }\n\n if (this.isFilePreviewMode) {\n modalBody?.classList.remove(\"modal-body--editing\");\n\n content.classList.remove(\"hidden\");\n editorContainer?.classList.remove(\"active\");\n\n if (editBtn instanceof HTMLButtonElement) {\n editBtn.setAttribute(\"aria-pressed\", \"false\");\n editBtn.setAttribute(\"aria-label\", \"Edit file\");\n editBtn.classList.toggle(\"hidden\", !canEdit);\n }\n\n await this.renderPreview(content, workingFile, renderToken);\n\n return;\n }\n\n if (!this.isRenderTokenCurrent(renderToken)) {\n return;\n }\n\n if (this.isFileEditMode && canEdit) {\n modalBody?.classList.add(\"modal-body--editing\");\n\n content.classList.add(\"hidden\");\n editorContainer?.classList.add(\"active\");\n\n if (editBtn instanceof HTMLButtonElement) {\n editBtn.setAttribute(\"aria-pressed\", \"true\");\n editBtn.setAttribute(\"aria-label\", \"Switch to raw text view\");\n editBtn.classList.remove(\"hidden\");\n }\n\n const editor = editorContainer?.querySelector(\".file-editor\");\n if (editor instanceof HTMLTextAreaElement) {\n editor.setAttribute(\"tab-size\", \"2\");\n\n const language = this.getLanguageFromFilename(file.name);\n if (language) {\n editor.setAttribute(\"language\", language);\n } else {\n editor.removeAttribute(\"language\");\n }\n\n if (!this.isEditorDirty) {\n const targetValue = file.content || \"\";\n if (editor.value !== targetValue) {\n editor.value = targetValue;\n }\n\n this.updateEditorHighlight(editor.value);\n } else if (typeof workingFile?.content === \"string\") {\n if (editor.value !== workingFile.content) {\n editor.value = workingFile.content;\n }\n\n this.updateEditorHighlight(editor.value);\n }\n\n editor.dispatchEvent(new Event(\"scroll\"));\n }\n } else {\n modalBody?.classList.remove(\"modal-body--editing\");\n\n content.classList.remove(\"hidden\");\n editorContainer?.classList.remove(\"active\");\n\n if (editBtn instanceof HTMLButtonElement) {\n editBtn.setAttribute(\"aria-pressed\", \"false\");\n editBtn.setAttribute(\"aria-label\", \"Edit file\");\n editBtn.classList.toggle(\"hidden\", !canEdit);\n }\n\n content.classList.add(\"file-content--raw\");\n content.classList.remove(\"file-content--preview\", \"file-content--iframe\");\n\n if (file.kind === \"binary\") {\n content.textContent = `Binary file (${file.mimeType || \"application/octet-stream\"}). Switch to Preview to view.`;\n } else {\n content.textContent = workingFile.content || \"\";\n }\n }\n }\n\n private syncIframeTheme(): void {\n if (!this.previewFrameWindow) {\n return;\n }\n\n const isDark = document.documentElement.classList.contains(\"dark-mode\");\n const styles = getComputedStyle(document.documentElement);\n const customProperties: Record<string, string> = {};\n\n for (let i = 0; i < styles.length; i++) {\n const prop = styles[i];\n if (prop.startsWith(\"--\")) {\n customProperties[prop] = styles.getPropertyValue(prop);\n }\n }\n\n this.previewFrameWindow.postMessage(\n {\n type: \"shadow-claw-theme-update\",\n theme: isDark ? \"dark\" : \"light\",\n customProperties,\n },\n \"*\",\n );\n }\n\n /**\n * Handle a storage proxy request from a sandboxed iframe.\n * Performs the requested storage operation in the parent's origin context\n * using a namespaced IndexedDB store, then posts the result back.\n */\n private async handleStorageProxyRequest(\n source: WindowProxy,\n requestId: string,\n method: string,\n args: Record<string, unknown>,\n ): Promise<void> {\n if (!requestId) {\n return;\n }\n\n const currentFile = fileViewerStore.file;\n const pageKey = currentFile?.path || currentFile?.name || \"__default__\";\n\n try {\n let result: unknown;\n\n switch (method) {\n // localStorage-style operations\n case \"setItem\":\n await iframeStorageSet(\n pageKey,\n String(args.key || \"\"),\n args.value as string,\n );\n break;\n case \"removeItem\":\n await iframeStorageDelete(pageKey, String(args.key || \"\"));\n break;\n case \"clear\":\n await iframeStorageClear(pageKey);\n break;\n case \"getAllItems\":\n result = await iframeStorageGetAll(pageKey);\n break;\n\n // IndexedDB-style operations\n case \"idb-get\":\n result = await iframeStorageGet(\n `${pageKey}::idb::${args.dbName}::${args.storeName}`,\n String(args.key || \"\"),\n );\n break;\n case \"idb-getAll\":\n result = await iframeStorageGetAll(\n `${pageKey}::idb::${args.dbName}::${args.storeName}`,\n );\n break;\n case \"idb-put\": {\n const idbKey =\n args.key != null ? String(args.key) : `__auto_${Date.now()}`;\n await iframeStorageSet(\n `${pageKey}::idb::${args.dbName}::${args.storeName}`,\n idbKey,\n args.value,\n );\n result = idbKey;\n break;\n }\n case \"idb-delete\":\n await iframeStorageDelete(\n `${pageKey}::idb::${args.dbName}::${args.storeName}`,\n String(args.key || \"\"),\n );\n break;\n case \"idb-clear\":\n await iframeStorageClear(\n `${pageKey}::idb::${args.dbName}::${args.storeName}`,\n );\n break;\n case \"idb-deleteDatabase\":\n await iframeStorageClear(\n `${pageKey}::idb::${args.dbName}::__default__`,\n );\n break;\n default:\n throw new Error(`Unknown storage proxy method: ${method}`);\n }\n\n source.postMessage(\n {\n type: \"shadow-claw-storage-proxy-result\",\n requestId,\n result: result ?? null,\n },\n \"*\",\n );\n } catch (err) {\n source.postMessage(\n {\n type: \"shadow-claw-storage-proxy-result\",\n requestId,\n error: err instanceof Error ? err.message : String(err),\n },\n \"*\",\n );\n }\n }\n\n private async reloadPreviewWithSearchParams(\n searchParams: string,\n ): Promise<void> {\n const file = fileViewerStore.file;\n if (!file) {\n return;\n }\n\n const root = this.shadowRoot;\n const iframe = root?.querySelector(\n \".file-viewer__iframe\",\n ) as HTMLIFrameElement;\n if (!iframe) {\n return;\n }\n\n this.previewFrameWindow = null;\n setTrustedSrcdoc(\n iframe,\n await this.buildIframePreviewSrcdoc(file, searchParams),\n );\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawFileViewer);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-tasks-qmcDT4PU.js","names":["shadowClawTasksStyles","shadowClawTasksTemplate"],"sources":["../../src/components/shadow-claw-tasks/shadow-claw-tasks.ts"],"sourcesContent":["import { renderMarkdown } from \"../../content/markdown.js\";\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { Task } from \"../../db/types.js\";\n\nimport { setSanitizedHtml } from \"../../security/trusted-types.js\";\nimport { fileViewerStore } from \"../../stores/file-viewer.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\n\nimport { showError, showInfo, showSuccess } from \"../../ui/toast.js\";\nimport { isTruthyConfigValue } from \"../../common/utils/config-value.mjs\";\nimport { escapeHtml } from \"../../utils/utils.js\";\n\nimport \"../common/shadow-claw-empty-state/shadow-claw-empty-state.js\";\nimport \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawTasksStyles from \"./shadow-claw-tasks.css\" with { type: \"css\" };\nimport shadowClawTasksTemplate from \"./shadow-claw-tasks.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-tasks\";\n\nasync function resolveFrontmatterToggle(\n db: ShadowClawDatabase | null,\n key: string,\n): Promise<boolean> {\n if (!db || typeof (db as any).transaction !== \"function\") {\n return true;\n }\n\n try {\n return isTruthyConfigValue(await getConfig(db, key), true);\n } catch {\n return true;\n }\n}\n\nexport class ShadowClawTasks extends ShadowClawElement {\n static styles = shadowClawTasksStyles;\n static template = shadowClawTasksTemplate;\n\n editingTask: any | null = null;\n editingTools: any[] = [];\n renderFrontmatter = true;\n tasks: any[] = [];\n private _autoScrollActive = false;\n private _autoScrollSpeed = 0;\n\n private _draggedTaskId: string | null = null;\n private _keyboardGrabbedId: string | null = null;\n private _touchDraggedTaskId: string | null = null;\n private _touchId: number | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n root.addEventListener(\"click\", (event: Event) => {\n if (event instanceof MouseEvent) {\n getDb()\n .then((db) => this.handlePreviewLinkClick(event, db))\n .catch(console.error);\n }\n });\n\n // Backup button\n const backupBtn = root.querySelector(\".tasks__backup-btn\");\n backupBtn?.addEventListener(\"click\", () => this.handleBackup());\n\n // Restore button\n const restoreBtn = root.querySelector(\".tasks__restore-btn\");\n const restoreInput = root.querySelector(\".tasks__hidden-restore\");\n restoreBtn?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.click();\n }\n });\n\n restoreInput?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n const target = e.target;\n getDb()\n .then((db) => this.handleRestore(db, target))\n .catch(console.error);\n }\n });\n\n // Clear all button\n const clearBtn = root.querySelector(\".tasks__clear-btn\");\n clearBtn?.addEventListener(\"click\", () => {\n getDb()\n .then((db) => this.handleClearAll(db))\n .catch(console.error);\n });\n\n // Add task button\n const addBtn = root.querySelector(\".tasks__add-btn\");\n addBtn?.addEventListener(\"click\", () => this.handleAdd());\n\n // Dialog controls\n const dialog = root.querySelector(\"dialog\");\n const closeBtn = root.querySelector(\".tasks__dialog-close\");\n const cancelBtn = root.querySelector(\".tasks__btn-cancel\");\n const form = root.querySelector(\n \".tasks__dialog-form\",\n ) as HTMLFormElement | null;\n\n closeBtn?.addEventListener(\"click\", () => {\n dialog?.close();\n });\n\n cancelBtn?.addEventListener(\"click\", () => {\n dialog?.close();\n });\n\n form?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (form) {\n getDb()\n .then((db) => this.handleEditSubmit(db, form))\n .catch(console.error);\n }\n });\n\n // Close dialog when clicking outside (on backdrop)\n dialog?.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n }\n });\n\n // Preview update logic\n const promptTextarea = root.querySelector(\"textarea[name='prompt']\");\n const previewDiv = root.querySelector(\".tasks__preview\");\n const typeRadios = root.querySelectorAll(\"input[name='taskType']\");\n const promptGroup = root.querySelector(\".tasks__prompt-group\");\n const toolsGroup = root.querySelector(\".tasks__tools-group\");\n const addToolBtn = root.querySelector(\".tasks__add-tool-btn\");\n\n const updatePreview = async () => {\n if (previewDiv instanceof HTMLElement) {\n const type =\n Array.from(typeRadios)\n .find((r: any) => r.checked)\n ?.getAttribute(\"value\") || \"prompt\";\n if (type === \"tools\") {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n } else if (promptTextarea instanceof HTMLTextAreaElement) {\n setSanitizedHtml(\n previewDiv,\n await this.renderPreview(promptTextarea.value),\n );\n }\n }\n };\n\n promptTextarea?.addEventListener(\"input\", updatePreview);\n\n typeRadios.forEach((radio) => {\n radio.addEventListener(\"change\", (e) => {\n const val = (e.target as HTMLInputElement).value;\n if (val === \"tools\") {\n promptGroup?.setAttribute(\"style\", \"display: none;\");\n toolsGroup?.removeAttribute(\"style\");\n promptTextarea?.removeAttribute(\"required\");\n } else {\n toolsGroup?.setAttribute(\"style\", \"display: none;\");\n promptGroup?.removeAttribute(\"style\");\n }\n\n updatePreview();\n });\n });\n\n addToolBtn?.addEventListener(\"click\", () => {\n this.editingTools.push({ name: \"\", input: {} });\n this.renderToolsEditor();\n updatePreview();\n });\n\n const db = await getDb();\n this.renderFrontmatter = await resolveFrontmatterToggle(\n db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_TASKS,\n );\n\n // apply highlight.js atom-one-dark.min.css to shadow dom\n try {\n const cssText = await (\n await fetch(\n \"https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/atom-one-dark.min.css\",\n )\n ).text();\n\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(cssText);\n\n if (this.shadowRoot?.adoptedStyleSheets) {\n this.shadowRoot.adoptedStyleSheets.push(sheet);\n }\n } catch (err) {\n console.warn(\"Failed to load highlight.js styles:\", err);\n }\n\n // Global dragover auto-scroll listener on shadowRoot\n root.addEventListener(\"dragover\", (e: any) => {\n if (this._draggedTaskId !== null) {\n this._updateAutoScrollSpeed(e.clientY);\n }\n });\n\n // Ensure we stop scrolling if the drag ends or leaves\n root.addEventListener(\"dragend\", () => {\n this._stopAutoScroll();\n });\n root.addEventListener(\"drop\", () => {\n this._stopAutoScroll();\n });\n\n this.render();\n this.dispatchTerminalSlotReady();\n\n // Re-render when tasks change\n this.cleanup = effect(() => {\n orchestratorStore.tasks;\n this.updateTaskList(db);\n });\n }\n\n disconnectedCallback() {\n this.cleanup();\n }\n\n cleanup: () => void = () => {};\n\n dispatchTerminalSlotReady() {\n this.dispatchEvent(\n new CustomEvent(\"shadow-claw-terminal-slot-ready\", {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /**\n * Escape HTML special characters\n */\n escapeHtml(text: string) {\n const div = document.createElement(\"div\");\n div.textContent = text;\n\n return div.innerHTML;\n }\n\n /**\n * Open dialog to add a new task\n */\n handleAdd() {\n this.editingTask = null;\n this.editingTools = [];\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\"dialog\");\n const form = root.querySelector(\".tasks__dialog-form\");\n const title = root.querySelector(\".tasks__dialog-title\");\n const submitBtn = root.querySelector(\".tasks__dialog-submit\");\n\n if (!form || !(form instanceof HTMLFormElement)) {\n return;\n }\n\n // Update dialog for add mode\n if (title) {\n title.textContent = \"Add Task\";\n }\n\n if (submitBtn) {\n submitBtn.textContent = \"Add Task\";\n }\n\n // Clear form\n form.reset();\n\n const nameInput = form.querySelector(\"input[name='name']\");\n if (nameInput instanceof HTMLInputElement) {\n nameInput.value = \"\";\n }\n\n // Reset type toggle\n const promptRadio = form.querySelector(\n \"input[name='taskType'][value='prompt']\",\n ) as HTMLInputElement;\n if (promptRadio) {\n promptRadio.checked = true;\n promptRadio.dispatchEvent(new Event(\"change\"));\n }\n\n this.renderToolsEditor();\n\n // Reset preview\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv instanceof HTMLElement) {\n this.renderPreview(\"\", false).then((html) => {\n setSanitizedHtml(previewDiv, html);\n });\n }\n\n // Show dialog\n dialog?.showModal();\n }\n\n /**\n * Open edit dialog for a task\n */\n handleEdit(task: Task) {\n this.editingTask = task;\n this.editingTools = JSON.parse(JSON.stringify(task.tools || []));\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\"dialog\");\n const form = root.querySelector(\".tasks__dialog-form\");\n const title = root.querySelector(\".tasks__dialog-title\");\n const submitBtn = root.querySelector(\".tasks__dialog-submit\");\n\n if (!form || !(form instanceof HTMLFormElement)) {\n return;\n }\n\n // Update dialog for edit mode\n if (title) {\n title.textContent = \"Edit Task\";\n }\n\n if (submitBtn) {\n submitBtn.textContent = \"Save Changes\";\n }\n\n // Set form values\n const nameInput = form.querySelector(\"input[name='name']\");\n if (nameInput instanceof HTMLInputElement) {\n nameInput.value = task.name || \"\";\n }\n\n const scheduleInput = form.querySelector(\"input[name='schedule']\");\n const promptInput = form.querySelector(\"textarea[name='prompt']\");\n if (scheduleInput instanceof HTMLInputElement) {\n scheduleInput.value = task.schedule || \"\";\n }\n\n if (promptInput instanceof HTMLTextAreaElement) {\n promptInput.value = task.prompt || \"\";\n }\n\n const freshContextInput = form.querySelector(\"input[name='freshContext']\");\n if (freshContextInput instanceof HTMLInputElement) {\n freshContextInput.checked = !!task.freshContext;\n }\n\n const subagentInput = form.querySelector(\"input[name='subagent']\");\n if (subagentInput instanceof HTMLInputElement) {\n subagentInput.checked = !!task.subagent;\n }\n\n const typeRadio = form.querySelector(\n `input[name='taskType'][value='${task.type || \"prompt\"}']`,\n ) as HTMLInputElement;\n if (typeRadio) {\n typeRadio.checked = true;\n typeRadio.dispatchEvent(new Event(\"change\"));\n }\n\n this.renderToolsEditor();\n\n // Set initial preview\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv instanceof HTMLElement) {\n if (task.type === \"tools\") {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n } else {\n this.renderPreview(task.prompt).then((html) => {\n setSanitizedHtml(previewDiv, html);\n });\n }\n }\n\n // Show dialog\n dialog?.showModal();\n }\n\n /**\n * Run a task\n */\n handleRun(task: Task) {\n orchestratorStore.runTask(task, true);\n }\n\n renderToolsEditor() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tasks__tools-list\");\n if (!list) {\n return;\n }\n\n list.innerHTML = \"\";\n\n this.editingTools.forEach((tool, index) => {\n const item = document.createElement(\"div\");\n item.className = \"tasks__tool-item\";\n\n const header = document.createElement(\"div\");\n header.className = \"tasks__tool-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"tasks__tool-title\";\n title.textContent = `Tool ${index + 1}`;\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"tasks__tool-remove-btn\";\n removeBtn.textContent = \"Remove\";\n removeBtn.addEventListener(\"click\", () => {\n this.editingTools.splice(index, 1);\n this.renderToolsEditor();\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n header.appendChild(title);\n header.appendChild(removeBtn);\n\n const nameInput = document.createElement(\"input\");\n nameInput.type = \"text\";\n nameInput.className = \"tasks__form-input\";\n nameInput.placeholder = \"Tool Name (e.g. show_toast)\";\n nameInput.value = tool.name || \"\";\n nameInput.addEventListener(\"input\", (e) => {\n tool.name = (e.target as HTMLInputElement).value;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n const paramsInput = document.createElement(\"textarea\");\n paramsInput.className = \"tasks__form-textarea\";\n paramsInput.placeholder = '{\\n \"key\": \"value\"\\n}';\n try {\n paramsInput.value =\n tool.input && Object.keys(tool.input).length\n ? JSON.stringify(tool.input, null, 2)\n : \"\";\n } catch (e) {\n paramsInput.value = \"\";\n }\n\n paramsInput.addEventListener(\"change\", (e) => {\n const val = (e.target as HTMLTextAreaElement).value;\n if (!val.trim()) {\n tool.input = {};\n } else {\n try {\n tool.input = JSON.parse(val);\n (e.target as HTMLTextAreaElement).style.borderColor = \"\";\n } catch (err) {\n (e.target as HTMLTextAreaElement).style.borderColor =\n \"var(--shadow-claw-error-color)\";\n }\n }\n\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n const suppressLabel = document.createElement(\"label\");\n suppressLabel.className = \"tasks__tool-suppress\";\n\n const suppressInput = document.createElement(\"input\");\n suppressInput.type = \"checkbox\";\n suppressInput.checked = !!tool.suppressOutput;\n suppressInput.addEventListener(\"change\", (e) => {\n tool.suppressOutput = (e.target as HTMLInputElement).checked;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n suppressLabel.appendChild(suppressInput);\n suppressLabel.appendChild(document.createTextNode(\" Suppress Output\"));\n\n const suppressToastLabel = document.createElement(\"label\");\n suppressToastLabel.className = \"tasks__tool-suppress\";\n\n const suppressToastInput = document.createElement(\"input\");\n suppressToastInput.type = \"checkbox\";\n suppressToastInput.checked = !!tool.suppressToast;\n suppressToastInput.addEventListener(\"change\", (e) => {\n tool.suppressToast = (e.target as HTMLInputElement).checked;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n suppressToastLabel.appendChild(suppressToastInput);\n suppressToastLabel.appendChild(\n document.createTextNode(\" Suppress Toast\"),\n );\n\n item.appendChild(header);\n item.appendChild(nameInput);\n item.appendChild(paramsInput);\n item.appendChild(suppressLabel);\n item.appendChild(suppressToastLabel);\n list.appendChild(item);\n });\n }\n\n renderToolsPreview(tools: any[], allowCollapse = false) {\n if (!tools || tools.length === 0) {\n return '<span class=\"tasks__preview-empty\">No tools configured</span>';\n }\n\n const html = tools\n .map((t, i) => {\n let params = \"{}\";\n try {\n params = JSON.stringify(t.input, null, 2);\n } catch (e) {\n params = \"Invalid JSON\";\n }\n\n return `<div><strong>${i + 1}. ${escapeHtml(t.name || \"Unnamed Tool\")}</strong><pre><code>${escapeHtml(params)}</code></pre></div>`;\n })\n .join(\"\");\n\n if (allowCollapse && tools.length > 2) {\n return `\n <details class=\"tasks__content-details\">\n <summary class=\"tasks__content-summary\">\n <span class=\"tasks__summary-text\">${tools.length} Tools configured</span>\n <span class=\"tasks__summary-label\">(View more)</span>\n </summary>\n <div class=\"tasks__prompt\">${html}</div>\n </details>\n `;\n }\n\n return `<div class=\"tasks__prompt\">${html}</div>`;\n }\n\n resolveWorkspaceLinkPath(href: string): string | null {\n const trimmed = href.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n return null;\n }\n\n let candidate = trimmed;\n const hasScheme = /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(trimmed);\n\n if (hasScheme || trimmed.startsWith(\"//\")) {\n let parsed: URL;\n try {\n parsed = new URL(trimmed, window.location.href);\n } catch {\n return null;\n }\n\n const isHttp =\n parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n if (!isHttp || parsed.host !== window.location.host) {\n return null;\n }\n\n candidate = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n }\n\n let normalized = candidate.split(/[?#]/, 1)[0].replace(/\\\\/g, \"/\");\n normalized = normalized.replace(/^\\/+/, \"\");\n normalized = normalized.replace(/^\\.\\//, \"\");\n\n if (!normalized) {\n return null;\n }\n\n const parts = normalized.split(\"/\").filter(Boolean);\n if (parts.some((part) => part === \"..\")) {\n return null;\n }\n\n return parts.join(\"/\");\n }\n\n /**\n * Handle backup (download all tasks as JSON)\n */\n async handleBackup() {\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__backup-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n const tasks = orchestratorStore.getTasksForBackup();\n const json = JSON.stringify(tasks, null, 2);\n const blob = new Blob([json], { type: \"application/json\" });\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `shadowclaw-tasks-backup-${Date.now()}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to create backup: ${message}`);\n console.error(\"Backup error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__backup-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"💾 Backup\";\n }\n }\n }\n\n /**\n * Handle clear all (delete all tasks)\n */\n async handleClearAll(db: ShadowClawDatabase) {\n const confirmed = await this.requestConfirmation({\n title: \"Clear All Tasks\",\n message: \"Delete ALL tasks? This cannot be undone!\",\n confirmLabel: \"Delete All\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__clear-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n await orchestratorStore.clearAllTasks(db);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to clear tasks: ${message}`);\n console.error(\"Clear error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__clear-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"🗑️ Clear All\";\n }\n }\n }\n\n /**\n * Copy a task's ID to the clipboard\n */\n async handleCopyId(id: string) {\n try {\n await navigator.clipboard.writeText(id);\n showSuccess(\"Task ID copied to clipboard!\");\n } catch (err) {\n showError(\"Failed to copy task ID.\");\n }\n }\n\n /**\n * Delete a task\n */\n async handleDelete(db: ShadowClawDatabase, id: string) {\n const confirmed = await this.requestConfirmation({\n title: \"Delete Scheduled Task\",\n message: \"Are you sure you want to delete this scheduled task?\",\n confirmLabel: \"Delete\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n await orchestratorStore.deleteTask(db, id);\n } catch (err) {\n console.error(\"Failed to delete task:\", err);\n }\n }\n\n async handleEditSubmit(db: ShadowClawDatabase, form: HTMLFormElement) {\n const formData = new FormData(form);\n const name = formData.get(\"name\");\n const schedule = formData.get(\"schedule\");\n const prompt = formData.get(\"prompt\");\n const type = (formData.get(\"taskType\") as \"prompt\" | \"tools\") || \"prompt\";\n\n const nameStr = name ? String(name).trim() : \"\";\n const scheduleStr = schedule ? String(schedule).trim() : \"\";\n\n if (type === \"prompt\" && !prompt) {\n showInfo(\"Please provide a task prompt.\");\n\n return;\n }\n\n const freshContext = !!formData.get(\"freshContext\");\n const subagent = !!formData.get(\"subagent\");\n\n try {\n let taskToSave;\n\n if (this.editingTask) {\n // Update existing task\n taskToSave = {\n ...this.editingTask,\n name: nameStr || undefined,\n schedule: scheduleStr,\n type,\n prompt: String(prompt || \"\"),\n tools: JSON.parse(JSON.stringify(this.editingTools)),\n freshContext,\n subagent,\n };\n } else {\n // Create new task\n const currentGroupId = orchestratorStore.activeGroupId;\n taskToSave = {\n id: crypto.randomUUID\n ? crypto.randomUUID()\n : `task-${Date.now()}-${Math.random()}`,\n groupId: currentGroupId,\n name: nameStr || undefined,\n schedule: scheduleStr,\n type,\n prompt: String(prompt || \"\"),\n tools: JSON.parse(JSON.stringify(this.editingTools)),\n enabled: true,\n lastRun: null,\n createdAt: Date.now(),\n freshContext,\n subagent,\n };\n }\n\n await orchestratorStore.upsertTask(db, taskToSave);\n\n const root = this.shadowRoot;\n const dialog = root?.querySelector(\"dialog\");\n dialog?.close();\n\n this.editingTask = null;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to save task: ${message}`);\n console.error(\"Save error:\", err);\n }\n }\n\n async handlePreviewLinkClick(event: MouseEvent, db: ShadowClawDatabase) {\n if (event.defaultPrevented || event.button !== 0) {\n return;\n }\n\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n const link = target.closest(\"a\");\n if (!(link instanceof HTMLAnchorElement)) {\n return;\n }\n\n const href = link.getAttribute(\"href\") || \"\";\n const resolved = this.resolveWorkspaceLinkPath(href);\n if (!resolved) {\n return;\n }\n\n event.preventDefault();\n\n const attempts = [resolved];\n const lastSegment = resolved.split(\"/\").filter(Boolean).pop() || \"\";\n const hasExtension = /\\.[^./]+$/u.test(lastSegment);\n\n if (!hasExtension) {\n attempts.push(`${resolved}.md`, `${resolved}/index.md`);\n }\n\n for (const candidate of attempts) {\n try {\n await fileViewerStore.openFile(\n db,\n candidate,\n orchestratorStore.activeGroupId,\n );\n\n return;\n } catch {\n // Try next candidate path.\n }\n }\n\n showError(`Failed to open linked file: ${resolved}`, 5000);\n }\n\n async handleReorder(\n draggedId: string,\n targetId: string,\n precomputedIds?: string[],\n ) {\n const db = await getDb();\n if (!db) {\n return;\n }\n\n if (precomputedIds) {\n await orchestratorStore.reorderTasks(\n db,\n orchestratorStore.activeGroupId,\n precomputedIds,\n );\n return;\n }\n\n const tasks = orchestratorStore.tasks || [];\n const ids = tasks.map((t) => t.id);\n const fromIdx = ids.indexOf(draggedId);\n const toIdx = ids.indexOf(targetId);\n\n if (fromIdx < 0 || toIdx < 0) {\n return;\n }\n\n ids.splice(fromIdx, 1);\n ids.splice(toIdx, 0, draggedId);\n\n await orchestratorStore.reorderTasks(\n db,\n orchestratorStore.activeGroupId,\n ids,\n );\n }\n\n /**\n * Handle restore (upload and import JSON)\n */\n async handleRestore(db: ShadowClawDatabase, input: HTMLInputElement) {\n const files = input.files;\n if (!files || files.length === 0) {\n return;\n }\n\n const jsonFile = files[0];\n if (!jsonFile.name.endsWith(\".json\")) {\n showInfo(\"Please select a .json file\");\n\n return;\n }\n\n const confirmed = await this.requestConfirmation({\n title: \"Restore Tasks\",\n message: \"Restore from backup will replace all current tasks. Continue?\",\n confirmLabel: \"Restore\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n input.value = \"\";\n\n return;\n }\n\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__restore-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n const text = await jsonFile.text();\n const tasks = JSON.parse(text);\n\n if (!Array.isArray(tasks)) {\n throw new Error(\"Invalid backup file format\");\n }\n\n await orchestratorStore.restoreTasksFromBackup(db, tasks);\n input.value = \"\";\n showSuccess(\"Tasks restored successfully!\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to restore from backup: ${message}`);\n console.error(\"Restore error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__restore-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"♻️ Restore\";\n }\n }\n }\n\n async renderPreview(prompt: string, allowCollapse = false) {\n if (!prompt.trim()) {\n return '<span class=\"tasks__preview-empty\">No content</span>';\n }\n\n const lines = prompt.split(\"\\n\");\n const isLong = prompt.length > 120 || lines.length > 1;\n\n const rendered = await renderMarkdown(prompt, {\n breaks: true,\n renderFrontmatter: this.renderFrontmatter,\n });\n\n if (allowCollapse && isLong) {\n const summaryText = prompt.trim();\n\n return `\n <details class=\"tasks__content-details\">\n <summary class=\"tasks__content-summary\">\n <span class=\"tasks__summary-text\">${escapeHtml(summaryText)}</span>\n <span class=\"tasks__summary-label\">(View more)</span>\n </summary>\n <div class=\"tasks__prompt\">${rendered}</div>\n </details>\n `;\n }\n\n return `<div class=\"tasks__prompt\">${rendered}</div>`;\n }\n\n async requestConfirmation(options: {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): Promise<boolean> {\n const appShell = document.querySelector(\"shadow-claw\") as any;\n if (appShell && typeof appShell.requestDialog === \"function\") {\n return await appShell.requestDialog({ mode: \"confirm\", ...options });\n }\n\n showInfo(options.message, 4000);\n\n return false;\n }\n\n async updateTaskList(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tasks__list\");\n if (!list) {\n return;\n }\n\n const tasks = orchestratorStore.tasks;\n\n if (tasks.length === 0) {\n setSanitizedHtml(\n list,\n `<shadow-claw-empty-state\n class=\"tasks__empty\"\n message=\"No scheduled tasks for this group.\"\n hint=\"Ask the agent to create one using 'create_task'.\"\n ></shadow-claw-empty-state>`,\n );\n\n return;\n }\n\n // Capture render content first to avoid partially cleared list while awaiting\n const fragment = document.createDocumentFragment();\n\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n const item = document.createElement(\"div\");\n item.className = \"tasks__item\";\n item.setAttribute(\"role\", \"listitem\");\n item.setAttribute(\"tabindex\", \"0\");\n item.setAttribute(\"aria-describedby\", \"reorder-instructions\");\n item.setAttribute(\n \"aria-label\",\n `${task.name || \"Task\"}, position ${i + 1} of ${tasks.length}`,\n );\n item.setAttribute(\"data-task-id\", task.id);\n\n if (this._keyboardGrabbedId === task.id) {\n item.classList.add(\"keyboard-grabbed\");\n item.setAttribute(\"aria-grabbed\", \"true\");\n }\n\n const lastRunStr = task.lastRun\n ? new Date(task.lastRun).toLocaleString()\n : \"Never\";\n\n const isTools = task.type === \"tools\";\n const previewHtml = isTools\n ? this.renderToolsPreview(task.tools || [], true)\n : await this.renderPreview(task.prompt, true);\n\n const scheduleDisplay = task.schedule\n ? `⏰ ${escapeHtml(task.schedule)}`\n : \"⏸ Unscheduled\";\n const toggleHtml = task.schedule\n ? `\n <label class=\"tasks__toggle\">\n <input type=\"checkbox\" ${task.enabled ? \"checked\" : \"\"} data-id=\"${escapeHtml(task.id)}\" class=\"tasks__toggle-input\" aria-label=\"${task.enabled ? \"Disable\" : \"Enable\"} task scheduled ${escapeHtml(task.schedule)}\">\n ${task.enabled ? \"Enabled\" : \"Disabled\"}\n </label>`\n : \"\";\n\n const badges = [isTools ? \"Tools\" : \"Prompt\"];\n if (task.freshContext) {\n badges.push(\"Fresh Context\");\n }\n if (task.subagent) {\n badges.push(\"Subagent\");\n }\n const badgesDisplay = badges.join(\" · \");\n\n const nameHtml = task.name\n ? `<div class=\"tasks__name\" style=\"font-weight: 600; font-size: var(--shadow-claw-font-size-md); margin-bottom: 0.25rem;\">${escapeHtml(task.name)}</div>`\n : \"\";\n\n const dragHandleHtml = `<span class=\"tasks__drag-handle\" draggable=\"true\" aria-hidden=\"true\" title=\"Drag to reorder\">⠿</span>`;\n\n setSanitizedHtml(\n item,\n `<div class=\"tasks__item-header\">\n <div style=\"display: flex; align-items: flex-start; flex: 1; min-width: 0;\">\n ${dragHandleHtml}\n <div class=\"tasks__item-info\">\n ${nameHtml}\n <div class=\"tasks__schedule-row\">\n <div class=\"tasks__schedule\">${scheduleDisplay} <span class=\"tasks__type-badge\">(${escapeHtml(badgesDisplay)})</span></div>\n </div>\n <div class=\"tasks__prompt-container\">\n ${previewHtml}\n </div>\n <div class=\"tasks__last-run\">Last run: ${escapeHtml(lastRunStr)}</div>\n </div>\n </div>\n <div class=\"tasks__actions\">\n ${toggleHtml}\n <button type=\"button\" class=\"tasks__copy-id-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Copy task ID\" title=\"Copy task ID\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\" style=\"vertical-align: middle; margin-right: 0.125rem; margin-top: -0.125rem;\"><path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/></svg> Copy ID\n </button>\n <button type=\"button\" class=\"tasks__run-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Run task\">Run</button>\n <button type=\"button\" class=\"tasks__edit-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Edit task\">✎ Edit</button>\n <button type=\"button\" class=\"tasks__delete-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Delete task\">Delete</button>\n </div>\n </div>`,\n );\n\n // Bind events\n const toggle = item.querySelector(\n \".tasks__toggle-input\",\n ) as HTMLInputElement | null;\n\n toggle?.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLInputElement;\n orchestratorStore.toggleTask(db, task, target.checked);\n });\n\n const copyIdBtn = item.querySelector(\".tasks__copy-id-btn\");\n copyIdBtn?.addEventListener(\"click\", () => this.handleCopyId(task.id));\n\n const runBtn = item.querySelector(\".tasks__run-btn\");\n runBtn?.addEventListener(\"click\", () => this.handleRun(task));\n\n const editBtn = item.querySelector(\".tasks__edit-btn\");\n editBtn?.addEventListener(\"click\", () => this.handleEdit(task));\n\n const deleteBtn = item.querySelector(\".tasks__delete-btn\");\n deleteBtn?.addEventListener(\"click\", () =>\n this.handleDelete(db, task.id),\n );\n\n const handleEl = item.querySelector(\n \".tasks__drag-handle\",\n ) as HTMLElement | null;\n\n handleEl?.addEventListener(\"dragstart\", (e) => {\n this._draggedTaskId = task.id;\n item.classList.add(\"dragging\");\n e.dataTransfer?.setData(\"text/plain\", task.id);\n });\n\n handleEl?.addEventListener(\"dragend\", () => {\n item.classList.remove(\"dragging\");\n this._draggedTaskId = null;\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n });\n\n handleEl?.addEventListener(\n \"touchstart\",\n (e) => {\n const touch = e.touches[0];\n if (!touch) {\n return;\n }\n this._touchId = touch.identifier;\n this._touchDraggedTaskId = task.id;\n item.classList.add(\"dragging\");\n e.preventDefault();\n },\n { passive: false },\n );\n\n item.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n if (this._draggedTaskId && this._draggedTaskId !== task.id) {\n item.classList.add(\"drag-over\");\n }\n });\n\n item.addEventListener(\"dragleave\", () => {\n item.classList.remove(\"drag-over\");\n });\n\n item.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n item.classList.remove(\"drag-over\");\n if (this._draggedTaskId && this._draggedTaskId !== task.id) {\n this.handleReorder(this._draggedTaskId, task.id);\n }\n });\n\n item.addEventListener(\"keydown\", (e) => {\n this._handleKeyboard(e, task.id, task.name || \"Task\");\n });\n\n fragment.appendChild(item);\n }\n\n list.replaceChildren();\n list.appendChild(fragment);\n\n this._bindTouchListEvents(list);\n }\n\n _announce(message: string) {\n const region = this.shadowRoot?.querySelector(\"#live-region\");\n if (region) {\n region.textContent = \"\";\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n }\n }\n\n _bindTouchListEvents(list: Element) {\n if ((list as any)._touchBound) {\n return;\n }\n (list as any)._touchBound = true;\n\n list.addEventListener(\n \"touchmove\",\n (e) => {\n if (this._touchDraggedTaskId === null) {\n return;\n }\n\n const touch = this._findTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n e.preventDefault();\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (\n target &&\n target.getAttribute(\"data-task-id\") !== this._touchDraggedTaskId\n ) {\n target.classList.add(\"drag-over\");\n }\n\n this._updateAutoScrollSpeed(touch.clientY);\n },\n { passive: false },\n );\n\n list.addEventListener(\"touchend\", (e) => {\n if (this._touchDraggedTaskId === null) {\n return;\n }\n\n const touch = this._findChangedTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n const targetId = target?.getAttribute(\"data-task-id\");\n\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (targetId && targetId !== this._touchDraggedTaskId) {\n this.handleReorder(this._touchDraggedTaskId, targetId);\n }\n\n this._stopAutoScroll();\n this._touchDraggedTaskId = null;\n this._touchId = null;\n });\n\n list.addEventListener(\"touchcancel\", () => {\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n this._stopAutoScroll();\n this._touchDraggedTaskId = null;\n this._touchId = null;\n });\n }\n\n _findChangedTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.changedTouches.length; i++) {\n const t = e.changedTouches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _findTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.touches.length; i++) {\n const t = e.touches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _focusNext(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll(\n '.tasks__item[tabindex=\"0\"], button:not([disabled]), input:not([type=\"hidden\"]):not([disabled])',\n ),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx !== -1 && idx < focusables.length - 1) {\n focusables[idx + 1].focus();\n }\n }\n\n _focusNextItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".tasks__item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".tasks__item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx !== -1 && idx < items.length - 1) {\n items[idx + 1].focus();\n }\n }\n\n _focusPrev(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll(\n '.tasks__item[tabindex=\"0\"], button:not([disabled]), input:not([type=\"hidden\"]):not([disabled])',\n ),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx > 0) {\n focusables[idx - 1].focus();\n }\n }\n\n _focusPrevItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".tasks__item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".tasks__item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx > 0) {\n items[idx - 1].focus();\n }\n }\n\n _handleKeyboard(e: KeyboardEvent, taskId: string, name: string) {\n const tasks = orchestratorStore.tasks || [];\n const ids = tasks.map((t) => t.id);\n const total = ids.length;\n\n if (this._keyboardGrabbedId === null) {\n // Navigation & Selection\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this._focusNextItem(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this._focusPrevItem(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n this._focusNext(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n this._focusPrev(e.target as HTMLElement);\n return;\n }\n\n // Grab for reorder\n if (e.key === \"m\" || e.key === \"M\") {\n e.preventDefault();\n this._keyboardGrabbedId = taskId;\n const pos = ids.indexOf(taskId) + 1;\n this._announce(\n `${name} grabbed. Current position ${pos} of ${total}. Use Arrow Up and Down to move, Space or Enter to drop.`,\n );\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n }\n\n return;\n }\n\n // Currently grabbed\n if (e.key === \"Escape\") {\n e.preventDefault();\n this._announce(\n `Reorder cancelled. ${name} returned to original position.`,\n );\n this._keyboardGrabbedId = null;\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // Drop\n e.preventDefault();\n const pos = ids.indexOf(this._keyboardGrabbedId) + 1;\n const droppedName =\n tasks.find((t) => t.id === this._keyboardGrabbedId)?.name || \"Task\";\n this._announce(\n `${droppedName} dropped at position ${pos} of ${total}. Reordering complete.`,\n );\n this._keyboardGrabbedId = null;\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const currentIdx = ids.indexOf(this._keyboardGrabbedId);\n const newIdx = e.key === \"ArrowUp\" ? currentIdx - 1 : currentIdx + 1;\n if (newIdx < 0 || newIdx >= total) {\n return;\n }\n\n // Swap\n ids.splice(currentIdx, 1);\n ids.splice(newIdx, 0, this._keyboardGrabbedId);\n this._announce(`Moved to position ${newIdx + 1} of ${total}.`);\n this.handleReorder(this._keyboardGrabbedId, ids[currentIdx], ids);\n }\n }\n\n _itemAtPoint(x: number, y: number): Element | null {\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const el = root.elementFromPoint(x, y);\n return el?.closest?.(\".tasks__item\") || null;\n }\n\n _startAutoScroll() {\n if (this._autoScrollActive) {\n return;\n }\n this._autoScrollActive = true;\n\n const scrollLoop = () => {\n if (!this._autoScrollActive) {\n return;\n }\n\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".tasks__content\",\n ) as HTMLElement | null;\n if (content && this._autoScrollSpeed !== 0) {\n content.scrollTop += this._autoScrollSpeed;\n }\n\n requestAnimationFrame(scrollLoop);\n };\n\n requestAnimationFrame(scrollLoop);\n }\n\n _stopAutoScroll() {\n this._autoScrollActive = false;\n this._autoScrollSpeed = 0;\n }\n\n _updateAutoScrollSpeed(clientY: number) {\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".tasks__content\",\n ) as HTMLElement | null;\n if (!content) {\n this._autoScrollSpeed = 0;\n return;\n }\n\n const rect = content.getBoundingClientRect();\n const threshold = 50; // pixels from top/bottom to start scrolling\n\n const distTop = clientY - rect.top;\n const distBottom = rect.bottom - clientY;\n\n if (distTop >= 0 && distTop < threshold) {\n // Near the top: scroll up. Speed is faster the closer to the edge.\n this._autoScrollSpeed = -((threshold - distTop) / threshold) * 8;\n this._startAutoScroll();\n } else if (distBottom >= 0 && distBottom < threshold) {\n // Near the bottom: scroll down.\n this._autoScrollSpeed = ((threshold - distBottom) / threshold) * 8;\n this._startAutoScroll();\n } else {\n this._autoScrollSpeed = 0;\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawTasks);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,cAAc;AAEpB,eAAe,yBACb,IACA,KACkB;CAClB,IAAI,CAAC,MAAM,OAAQ,GAAW,gBAAgB,YAC5C,OAAO;CAGT,IAAI;EACF,OAAO,oBAAoB,MAAM,UAAU,IAAI,GAAG,GAAG,IAAI;CAC3D,QAAQ;EACN,OAAO;CACT;AACF;AAEA,IAAa,kBAAb,cAAqC,kBAAkB;CACrD,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,cAA0B;CAC1B,eAAsB,CAAC;CACvB,oBAAoB;CACpB,QAAe,CAAC;CAChB,AAAQ,oBAAoB;CAC5B,AAAQ,mBAAmB;CAE3B,AAAQ,iBAAgC;CACxC,AAAQ,qBAAoC;CAC5C,AAAQ,sBAAqC;CAC7C,AAAQ,WAA0B;CAElC,cAAc;EACZ,MAAM;CACR;CAEA,MAAM,oBAAoB;EACxB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,sBAAsB;EAGxC,KAAK,iBAAiB,UAAU,UAAiB;GAC/C,IAAI,iBAAiB,YACnB,MAAM,CAAC,CACJ,MAAM,OAAO,KAAK,uBAAuB,OAAO,EAAE,CAAC,CAAC,CACpD,MAAM,QAAQ,KAAK;EAE1B,CAAC;EAID,AADkB,KAAK,cAAc,oBAC7B,CAAC,EAAE,iBAAiB,eAAe,KAAK,aAAa,CAAC;EAG9D,MAAM,aAAa,KAAK,cAAc,qBAAqB;EAC3D,MAAM,eAAe,KAAK,cAAc,wBAAwB;EAChE,YAAY,iBAAiB,eAAe;GAC1C,IAAI,wBAAwB,kBAC1B,aAAa,MAAM;EAEvB,CAAC;EAED,cAAc,iBAAiB,WAAW,MAAM;GAC9C,IAAI,EAAE,kBAAkB,kBAAkB;IACxC,MAAM,SAAS,EAAE;IACjB,MAAM,CAAC,CACJ,MAAM,OAAO,KAAK,cAAc,IAAI,MAAM,CAAC,CAAC,CAC5C,MAAM,QAAQ,KAAK;GACxB;EACF,CAAC;EAID,AADiB,KAAK,cAAc,mBAC7B,CAAC,EAAE,iBAAiB,eAAe;GACxC,MAAM,CAAC,CACJ,MAAM,OAAO,KAAK,eAAe,EAAE,CAAC,CAAC,CACrC,MAAM,QAAQ,KAAK;EACxB,CAAC;EAID,AADe,KAAK,cAAc,iBAC7B,CAAC,EAAE,iBAAiB,eAAe,KAAK,UAAU,CAAC;EAGxD,MAAM,SAAS,KAAK,cAAc,QAAQ;EAC1C,MAAM,WAAW,KAAK,cAAc,sBAAsB;EAC1D,MAAM,YAAY,KAAK,cAAc,oBAAoB;EACzD,MAAM,OAAO,KAAK,cAChB,qBACF;EAEA,UAAU,iBAAiB,eAAe;GACxC,QAAQ,MAAM;EAChB,CAAC;EAED,WAAW,iBAAiB,eAAe;GACzC,QAAQ,MAAM;EAChB,CAAC;EAED,MAAM,iBAAiB,WAAW,MAAM;GACtC,EAAE,eAAe;GACjB,IAAI,MACF,MAAM,CAAC,CACJ,MAAM,OAAO,KAAK,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAC7C,MAAM,QAAQ,KAAK;EAE1B,CAAC;EAGD,QAAQ,iBAAiB,UAAU,MAAM;GACvC,IAAI,EAAE,WAAW,QACf,OAAO,MAAM;EAEjB,CAAC;EAGD,MAAM,iBAAiB,KAAK,cAAc,yBAAyB;EACnE,MAAM,aAAa,KAAK,cAAc,iBAAiB;EACvD,MAAM,aAAa,KAAK,iBAAiB,wBAAwB;EACjE,MAAM,cAAc,KAAK,cAAc,sBAAsB;EAC7D,MAAM,aAAa,KAAK,cAAc,qBAAqB;EAC3D,MAAM,aAAa,KAAK,cAAc,sBAAsB;EAE5D,MAAM,gBAAgB,YAAY;GAChC,IAAI,sBAAsB,aAKxB;SAHE,MAAM,KAAK,UAAU,CAAC,CACnB,MAAM,MAAW,EAAE,OAAO,CAAC,EAC1B,aAAa,OAAO,KAAK,cAClB,SACX,iBACE,YACA,KAAK,mBAAmB,KAAK,YAAY,CAC3C;SACK,IAAI,0BAA0B,qBACnC,iBACE,YACA,MAAM,KAAK,cAAc,eAAe,KAAK,CAC/C;GACF;EAEJ;EAEA,gBAAgB,iBAAiB,SAAS,aAAa;EAEvD,WAAW,SAAS,UAAU;GAC5B,MAAM,iBAAiB,WAAW,MAAM;IAEtC,IADa,EAAE,OAA4B,UAC/B,SAAS;KACnB,aAAa,aAAa,SAAS,gBAAgB;KACnD,YAAY,gBAAgB,OAAO;KACnC,gBAAgB,gBAAgB,UAAU;IAC5C,OAAO;KACL,YAAY,aAAa,SAAS,gBAAgB;KAClD,aAAa,gBAAgB,OAAO;IACtC;IAEA,cAAc;GAChB,CAAC;EACH,CAAC;EAED,YAAY,iBAAiB,eAAe;GAC1C,KAAK,aAAa,KAAK;IAAE,MAAM;IAAI,OAAO,CAAC;GAAE,CAAC;GAC9C,KAAK,kBAAkB;GACvB,cAAc;EAChB,CAAC;EAED,MAAM,KAAK,MAAM,MAAM;EACvB,KAAK,oBAAoB,MAAM,yBAC7B,IACA,YAAY,0BACd;EAGA,IAAI;GACF,MAAM,UAAU,OACd,MAAM,MACJ,+EACF,EAAC,CACD,KAAK;GAEP,MAAM,QAAQ,IAAI,cAAc;GAChC,MAAM,YAAY,OAAO;GAEzB,IAAI,KAAK,YAAY,oBACnB,KAAK,WAAW,mBAAmB,KAAK,KAAK;EAEjD,SAAS,KAAK;GACZ,QAAQ,KAAK,uCAAuC,GAAG;EACzD;EAGA,KAAK,iBAAiB,aAAa,MAAW;GAC5C,IAAI,KAAK,mBAAmB,MAC1B,KAAK,uBAAuB,EAAE,OAAO;EAEzC,CAAC;EAGD,KAAK,iBAAiB,iBAAiB;GACrC,KAAK,gBAAgB;EACvB,CAAC;EACD,KAAK,iBAAiB,cAAc;GAClC,KAAK,gBAAgB;EACvB,CAAC;EAED,KAAK,OAAO;EACZ,KAAK,0BAA0B;EAG/B,KAAK,UAAU,aAAa;GAC1B,kBAAkB;GAClB,KAAK,eAAe,EAAE;EACxB,CAAC;CACH;CAEA,uBAAuB;EACrB,KAAK,QAAQ;CACf;CAEA,gBAA4B,CAAC;CAE7B,4BAA4B;EAC1B,KAAK,cACH,IAAI,YAAY,mCAAmC;GACjD,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;;;;CAKA,WAAW,MAAc;EACvB,MAAM,MAAM,SAAS,cAAc,KAAK;EACxC,IAAI,cAAc;EAElB,OAAO,IAAI;CACb;;;;CAKA,YAAY;EACV,KAAK,cAAc;EACnB,KAAK,eAAe,CAAC;EACrB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,SAAS,KAAK,cAAc,QAAQ;EAC1C,MAAM,OAAO,KAAK,cAAc,qBAAqB;EACrD,MAAM,QAAQ,KAAK,cAAc,sBAAsB;EACvD,MAAM,YAAY,KAAK,cAAc,uBAAuB;EAE5D,IAAI,CAAC,QAAQ,EAAE,gBAAgB,kBAC7B;EAIF,IAAI,OACF,MAAM,cAAc;EAGtB,IAAI,WACF,UAAU,cAAc;EAI1B,KAAK,MAAM;EAEX,MAAM,YAAY,KAAK,cAAc,oBAAoB;EACzD,IAAI,qBAAqB,kBACvB,UAAU,QAAQ;EAIpB,MAAM,cAAc,KAAK,cACvB,wCACF;EACA,IAAI,aAAa;GACf,YAAY,UAAU;GACtB,YAAY,cAAc,IAAI,MAAM,QAAQ,CAAC;EAC/C;EAEA,KAAK,kBAAkB;EAGvB,MAAM,aAAa,KAAK,cAAc,iBAAiB;EACvD,IAAI,sBAAsB,aACxB,KAAK,cAAc,IAAI,KAAK,CAAC,CAAC,MAAM,SAAS;GAC3C,iBAAiB,YAAY,IAAI;EACnC,CAAC;EAIH,QAAQ,UAAU;CACpB;;;;CAKA,WAAW,MAAY;EACrB,KAAK,cAAc;EACnB,KAAK,eAAe,KAAK,MAAM,KAAK,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC;EAC/D,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,SAAS,KAAK,cAAc,QAAQ;EAC1C,MAAM,OAAO,KAAK,cAAc,qBAAqB;EACrD,MAAM,QAAQ,KAAK,cAAc,sBAAsB;EACvD,MAAM,YAAY,KAAK,cAAc,uBAAuB;EAE5D,IAAI,CAAC,QAAQ,EAAE,gBAAgB,kBAC7B;EAIF,IAAI,OACF,MAAM,cAAc;EAGtB,IAAI,WACF,UAAU,cAAc;EAI1B,MAAM,YAAY,KAAK,cAAc,oBAAoB;EACzD,IAAI,qBAAqB,kBACvB,UAAU,QAAQ,KAAK,QAAQ;EAGjC,MAAM,gBAAgB,KAAK,cAAc,wBAAwB;EACjE,MAAM,cAAc,KAAK,cAAc,yBAAyB;EAChE,IAAI,yBAAyB,kBAC3B,cAAc,QAAQ,KAAK,YAAY;EAGzC,IAAI,uBAAuB,qBACzB,YAAY,QAAQ,KAAK,UAAU;EAGrC,MAAM,oBAAoB,KAAK,cAAc,4BAA4B;EACzE,IAAI,6BAA6B,kBAC/B,kBAAkB,UAAU,CAAC,CAAC,KAAK;EAGrC,MAAM,gBAAgB,KAAK,cAAc,wBAAwB;EACjE,IAAI,yBAAyB,kBAC3B,cAAc,UAAU,CAAC,CAAC,KAAK;EAGjC,MAAM,YAAY,KAAK,cACrB,iCAAiC,KAAK,QAAQ,SAAS,GACzD;EACA,IAAI,WAAW;GACb,UAAU,UAAU;GACpB,UAAU,cAAc,IAAI,MAAM,QAAQ,CAAC;EAC7C;EAEA,KAAK,kBAAkB;EAGvB,MAAM,aAAa,KAAK,cAAc,iBAAiB;EACvD,IAAI,sBAAsB,aACxB,IAAI,KAAK,SAAS,SAChB,iBACE,YACA,KAAK,mBAAmB,KAAK,YAAY,CAC3C;OAEA,KAAK,cAAc,KAAK,MAAM,CAAC,CAAC,MAAM,SAAS;GAC7C,iBAAiB,YAAY,IAAI;EACnC,CAAC;EAKL,QAAQ,UAAU;CACpB;;;;CAKA,UAAU,MAAY;EACpB,kBAAkB,QAAQ,MAAM,IAAI;CACtC;CAEA,oBAAoB;EAClB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,OAAO,KAAK,cAAc,oBAAoB;EACpD,IAAI,CAAC,MACH;EAGF,KAAK,YAAY;EAEjB,KAAK,aAAa,SAAS,MAAM,UAAU;GACzC,MAAM,OAAO,SAAS,cAAc,KAAK;GACzC,KAAK,YAAY;GAEjB,MAAM,SAAS,SAAS,cAAc,KAAK;GAC3C,OAAO,YAAY;GAEnB,MAAM,QAAQ,SAAS,cAAc,KAAK;GAC1C,MAAM,YAAY;GAClB,MAAM,cAAc,QAAQ,QAAQ;GAEpC,MAAM,YAAY,SAAS,cAAc,QAAQ;GACjD,UAAU,OAAO;GACjB,UAAU,YAAY;GACtB,UAAU,cAAc;GACxB,UAAU,iBAAiB,eAAe;IACxC,KAAK,aAAa,OAAO,OAAO,CAAC;IACjC,KAAK,kBAAkB;IACvB,MAAM,aAAa,KAAK,cAAc,iBAAiB;IACvD,IAAI,YACF,iBACE,YACA,KAAK,mBAAmB,KAAK,YAAY,CAC3C;GAEJ,CAAC;GAED,OAAO,YAAY,KAAK;GACxB,OAAO,YAAY,SAAS;GAE5B,MAAM,YAAY,SAAS,cAAc,OAAO;GAChD,UAAU,OAAO;GACjB,UAAU,YAAY;GACtB,UAAU,cAAc;GACxB,UAAU,QAAQ,KAAK,QAAQ;GAC/B,UAAU,iBAAiB,UAAU,MAAM;IACzC,KAAK,OAAQ,EAAE,OAA4B;IAC3C,MAAM,aAAa,KAAK,cAAc,iBAAiB;IACvD,IAAI,YACF,iBACE,YACA,KAAK,mBAAmB,KAAK,YAAY,CAC3C;GAEJ,CAAC;GAED,MAAM,cAAc,SAAS,cAAc,UAAU;GACrD,YAAY,YAAY;GACxB,YAAY,cAAc;GAC1B,IAAI;IACF,YAAY,QACV,KAAK,SAAS,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,SAClC,KAAK,UAAU,KAAK,OAAO,MAAM,CAAC,IAClC;GACR,SAAS,GAAG;IACV,YAAY,QAAQ;GACtB;GAEA,YAAY,iBAAiB,WAAW,MAAM;IAC5C,MAAM,MAAO,EAAE,OAA+B;IAC9C,IAAI,CAAC,IAAI,KAAK,GACZ,KAAK,QAAQ,CAAC;SAEd,IAAI;KACF,KAAK,QAAQ,KAAK,MAAM,GAAG;KAC3B,AAAC,EAAE,OAA+B,MAAM,cAAc;IACxD,SAAS,KAAK;KACZ,AAAC,EAAE,OAA+B,MAAM,cACtC;IACJ;IAGF,MAAM,aAAa,KAAK,cAAc,iBAAiB;IACvD,IAAI,YACF,iBACE,YACA,KAAK,mBAAmB,KAAK,YAAY,CAC3C;GAEJ,CAAC;GAED,MAAM,gBAAgB,SAAS,cAAc,OAAO;GACpD,cAAc,YAAY;GAE1B,MAAM,gBAAgB,SAAS,cAAc,OAAO;GACpD,cAAc,OAAO;GACrB,cAAc,UAAU,CAAC,CAAC,KAAK;GAC/B,cAAc,iBAAiB,WAAW,MAAM;IAC9C,KAAK,iBAAkB,EAAE,OAA4B;IACrD,MAAM,aAAa,KAAK,cAAc,iBAAiB;IACvD,IAAI,YACF,iBACE,YACA,KAAK,mBAAmB,KAAK,YAAY,CAC3C;GAEJ,CAAC;GAED,cAAc,YAAY,aAAa;GACvC,cAAc,YAAY,SAAS,eAAe,kBAAkB,CAAC;GAErE,MAAM,qBAAqB,SAAS,cAAc,OAAO;GACzD,mBAAmB,YAAY;GAE/B,MAAM,qBAAqB,SAAS,cAAc,OAAO;GACzD,mBAAmB,OAAO;GAC1B,mBAAmB,UAAU,CAAC,CAAC,KAAK;GACpC,mBAAmB,iBAAiB,WAAW,MAAM;IACnD,KAAK,gBAAiB,EAAE,OAA4B;IACpD,MAAM,aAAa,KAAK,cAAc,iBAAiB;IACvD,IAAI,YACF,iBACE,YACA,KAAK,mBAAmB,KAAK,YAAY,CAC3C;GAEJ,CAAC;GAED,mBAAmB,YAAY,kBAAkB;GACjD,mBAAmB,YACjB,SAAS,eAAe,iBAAiB,CAC3C;GAEA,KAAK,YAAY,MAAM;GACvB,KAAK,YAAY,SAAS;GAC1B,KAAK,YAAY,WAAW;GAC5B,KAAK,YAAY,aAAa;GAC9B,KAAK,YAAY,kBAAkB;GACnC,KAAK,YAAY,IAAI;EACvB,CAAC;CACH;CAEA,mBAAmB,OAAc,gBAAgB,OAAO;EACtD,IAAI,CAAC,SAAS,MAAM,WAAW,GAC7B,OAAO;EAGT,MAAM,OAAO,MACV,KAAK,GAAG,MAAM;GACb,IAAI,SAAS;GACb,IAAI;IACF,SAAS,KAAK,UAAU,EAAE,OAAO,MAAM,CAAC;GAC1C,SAAS,GAAG;IACV,SAAS;GACX;GAEA,OAAO,gBAAgB,IAAI,EAAE,IAAI,WAAW,EAAE,QAAQ,cAAc,EAAE,sBAAsB,WAAW,MAAM,EAAE;EACjH,CAAC,CAAC,CACD,KAAK,EAAE;EAEV,IAAI,iBAAiB,MAAM,SAAS,GAClC,OAAO;;;gDAGmC,MAAM,OAAO;;;uCAGtB,KAAK;;;EAKxC,OAAO,8BAA8B,KAAK;CAC5C;CAEA,yBAAyB,MAA6B;EACpD,MAAM,UAAU,KAAK,KAAK;EAC1B,IAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,GACpC,OAAO;EAGT,IAAI,YAAY;EAGhB,IAFkB,2BAA2B,KAAK,OAEtC,KAAK,QAAQ,WAAW,IAAI,GAAG;GACzC,IAAI;GACJ,IAAI;IACF,SAAS,IAAI,IAAI,SAAS,OAAO,SAAS,IAAI;GAChD,QAAQ;IACN,OAAO;GACT;GAIA,IAAI,EADF,OAAO,aAAa,WAAW,OAAO,aAAa,aACtC,OAAO,SAAS,OAAO,SAAS,MAC7C,OAAO;GAGT,YAAY,GAAG,OAAO,WAAW,OAAO,SAAS,OAAO;EAC1D;EAEA,IAAI,aAAa,UAAU,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,OAAO,GAAG;EACjE,aAAa,WAAW,QAAQ,QAAQ,EAAE;EAC1C,aAAa,WAAW,QAAQ,SAAS,EAAE;EAE3C,IAAI,CAAC,YACH,OAAO;EAGT,MAAM,QAAQ,WAAW,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO;EAClD,IAAI,MAAM,MAAM,SAAS,SAAS,IAAI,GACpC,OAAO;EAGT,OAAO,MAAM,KAAK,GAAG;CACvB;;;;CAKA,MAAM,eAAe;EACnB,IAAI;GACF,MAAM,MAAM,KAAK,YAAY,cAAc,oBAAoB;GAC/D,KAAK,gBAAgB,YAAY,IAAI;GAErC,IAAI,KACF,IAAI,cAAc;GAGpB,MAAM,QAAQ,kBAAkB,kBAAkB;GAClD,MAAM,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;GAC1C,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;GAE1D,MAAM,MAAM,IAAI,gBAAgB,IAAI;GACpC,MAAM,OAAO,SAAS,cAAc,GAAG;GACvC,KAAK,OAAO;GACZ,KAAK,WAAW,2BAA2B,KAAK,IAAI,EAAE;GACtD,SAAS,KAAK,YAAY,IAAI;GAC9B,KAAK,MAAM;GACX,SAAS,KAAK,YAAY,IAAI;GAC9B,IAAI,gBAAgB,GAAG;EACzB,SAAS,KAAK;GAEZ,UAAU,4BADM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAChB;GAC/C,QAAQ,MAAM,iBAAiB,GAAG;EACpC,UAAU;GACR,MAAM,MAAM,KAAK,YAAY,cAAc,oBAAoB;GAC/D,KAAK,gBAAgB,YAAY,KAAK;GAEtC,IAAI,KACF,IAAI,cAAc;EAEtB;CACF;;;;CAKA,MAAM,eAAe,IAAwB;EAQ3C,IAAI,CAAC,MAPmB,KAAK,oBAAoB;GAC/C,OAAO;GACP,SAAS;GACT,cAAc;GACd,aAAa;EACf,CAAC,GAGC;EAGF,IAAI;GACF,MAAM,MAAM,KAAK,YAAY,cAAc,mBAAmB;GAC9D,KAAK,gBAAgB,YAAY,IAAI;GAErC,IAAI,KACF,IAAI,cAAc;GAGpB,MAAM,kBAAkB,cAAc,EAAE;EAC1C,SAAS,KAAK;GAEZ,UAAU,0BADM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAClB;GAC7C,QAAQ,MAAM,gBAAgB,GAAG;EACnC,UAAU;GACR,MAAM,MAAM,KAAK,YAAY,cAAc,mBAAmB;GAC9D,KAAK,gBAAgB,YAAY,KAAK;GAEtC,IAAI,KACF,IAAI,cAAc;EAEtB;CACF;;;;CAKA,MAAM,aAAa,IAAY;EAC7B,IAAI;GACF,MAAM,UAAU,UAAU,UAAU,EAAE;GACtC,YAAY,8BAA8B;EAC5C,SAAS,KAAK;GACZ,UAAU,yBAAyB;EACrC;CACF;;;;CAKA,MAAM,aAAa,IAAwB,IAAY;EAQrD,IAAI,CAAC,MAPmB,KAAK,oBAAoB;GAC/C,OAAO;GACP,SAAS;GACT,cAAc;GACd,aAAa;EACf,CAAC,GAGC;EAGF,IAAI;GACF,MAAM,kBAAkB,WAAW,IAAI,EAAE;EAC3C,SAAS,KAAK;GACZ,QAAQ,MAAM,0BAA0B,GAAG;EAC7C;CACF;CAEA,MAAM,iBAAiB,IAAwB,MAAuB;EACpE,MAAM,WAAW,IAAI,SAAS,IAAI;EAClC,MAAM,OAAO,SAAS,IAAI,MAAM;EAChC,MAAM,WAAW,SAAS,IAAI,UAAU;EACxC,MAAM,SAAS,SAAS,IAAI,QAAQ;EACpC,MAAM,OAAQ,SAAS,IAAI,UAAU,KAA4B;EAEjE,MAAM,UAAU,OAAO,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI;EAC7C,MAAM,cAAc,WAAW,OAAO,QAAQ,CAAC,CAAC,KAAK,IAAI;EAEzD,IAAI,SAAS,YAAY,CAAC,QAAQ;GAChC,SAAS,+BAA+B;GAExC;EACF;EAEA,MAAM,eAAe,CAAC,CAAC,SAAS,IAAI,cAAc;EAClD,MAAM,WAAW,CAAC,CAAC,SAAS,IAAI,UAAU;EAE1C,IAAI;GACF,IAAI;GAEJ,IAAI,KAAK,aAEP,aAAa;IACX,GAAG,KAAK;IACR,MAAM,WAAW;IACjB,UAAU;IACV;IACA,QAAQ,OAAO,UAAU,EAAE;IAC3B,OAAO,KAAK,MAAM,KAAK,UAAU,KAAK,YAAY,CAAC;IACnD;IACA;GACF;QACK;IAEL,MAAM,iBAAiB,kBAAkB;IACzC,aAAa;KACX,IAAI,OAAO,aACP,OAAO,WAAW,IAClB,QAAQ,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO;KACtC,SAAS;KACT,MAAM,WAAW;KACjB,UAAU;KACV;KACA,QAAQ,OAAO,UAAU,EAAE;KAC3B,OAAO,KAAK,MAAM,KAAK,UAAU,KAAK,YAAY,CAAC;KACnD,SAAS;KACT,SAAS;KACT,WAAW,KAAK,IAAI;KACpB;KACA;IACF;GACF;GAEA,MAAM,kBAAkB,WAAW,IAAI,UAAU;GAIjD,CAFa,KAAK,YACG,cAAc,QAAQ,EACrC,EAAE,MAAM;GAEd,KAAK,cAAc;EACrB,SAAS,KAAK;GAEZ,UAAU,wBADM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GACpB;GAC3C,QAAQ,MAAM,eAAe,GAAG;EAClC;CACF;CAEA,MAAM,uBAAuB,OAAmB,IAAwB;EACtE,IAAI,MAAM,oBAAoB,MAAM,WAAW,GAC7C;EAGF,IAAI,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM,QAC5D;EAGF,MAAM,SAAS,MAAM;EACrB,IAAI,EAAE,kBAAkB,UACtB;EAGF,MAAM,OAAO,OAAO,QAAQ,GAAG;EAC/B,IAAI,EAAE,gBAAgB,oBACpB;EAGF,MAAM,OAAO,KAAK,aAAa,MAAM,KAAK;EAC1C,MAAM,WAAW,KAAK,yBAAyB,IAAI;EACnD,IAAI,CAAC,UACH;EAGF,MAAM,eAAe;EAErB,MAAM,WAAW,CAAC,QAAQ;EAC1B,MAAM,cAAc,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK;EAGjE,IAAI,CAFiB,aAAa,KAAK,WAEvB,GACd,SAAS,KAAK,GAAG,SAAS,MAAM,GAAG,SAAS,UAAU;EAGxD,KAAK,MAAM,aAAa,UACtB,IAAI;GACF,MAAM,gBAAgB,SACpB,IACA,WACA,kBAAkB,aACpB;GAEA;EACF,QAAQ,CAER;EAGF,UAAU,+BAA+B,YAAY,GAAI;CAC3D;CAEA,MAAM,cACJ,WACA,UACA,gBACA;EACA,MAAM,KAAK,MAAM,MAAM;EACvB,IAAI,CAAC,IACH;EAGF,IAAI,gBAAgB;GAClB,MAAM,kBAAkB,aACtB,IACA,kBAAkB,eAClB,cACF;GACA;EACF;EAGA,MAAM,OADQ,kBAAkB,SAAS,CAAC,EACzB,CAAC,KAAK,MAAM,EAAE,EAAE;EACjC,MAAM,UAAU,IAAI,QAAQ,SAAS;EACrC,MAAM,QAAQ,IAAI,QAAQ,QAAQ;EAElC,IAAI,UAAU,KAAK,QAAQ,GACzB;EAGF,IAAI,OAAO,SAAS,CAAC;EACrB,IAAI,OAAO,OAAO,GAAG,SAAS;EAE9B,MAAM,kBAAkB,aACtB,IACA,kBAAkB,eAClB,GACF;CACF;;;;CAKA,MAAM,cAAc,IAAwB,OAAyB;EACnE,MAAM,QAAQ,MAAM;EACpB,IAAI,CAAC,SAAS,MAAM,WAAW,GAC7B;EAGF,MAAM,WAAW,MAAM;EACvB,IAAI,CAAC,SAAS,KAAK,SAAS,OAAO,GAAG;GACpC,SAAS,4BAA4B;GAErC;EACF;EASA,IAAI,CAAC,MAPmB,KAAK,oBAAoB;GAC/C,OAAO;GACP,SAAS;GACT,cAAc;GACd,aAAa;EACf,CAAC,GAEe;GACd,MAAM,QAAQ;GAEd;EACF;EAEA,IAAI;GACF,MAAM,MAAM,KAAK,YAAY,cAAc,qBAAqB;GAChE,KAAK,gBAAgB,YAAY,IAAI;GAErC,IAAI,KACF,IAAI,cAAc;GAGpB,MAAM,OAAO,MAAM,SAAS,KAAK;GACjC,MAAM,QAAQ,KAAK,MAAM,IAAI;GAE7B,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,MAAM,IAAI,MAAM,4BAA4B;GAG9C,MAAM,kBAAkB,uBAAuB,IAAI,KAAK;GACxD,MAAM,QAAQ;GACd,YAAY,8BAA8B;EAC5C,SAAS,KAAK;GAEZ,UAAU,kCADM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GACV;GACrD,QAAQ,MAAM,kBAAkB,GAAG;EACrC,UAAU;GACR,MAAM,MAAM,KAAK,YAAY,cAAc,qBAAqB;GAChE,KAAK,gBAAgB,YAAY,KAAK;GAEtC,IAAI,KACF,IAAI,cAAc;EAEtB;CACF;CAEA,MAAM,cAAc,QAAgB,gBAAgB,OAAO;EACzD,IAAI,CAAC,OAAO,KAAK,GACf,OAAO;EAGT,MAAM,QAAQ,OAAO,MAAM,IAAI;EAC/B,MAAM,SAAS,OAAO,SAAS,OAAO,MAAM,SAAS;EAErD,MAAM,WAAW,MAAM,eAAe,QAAQ;GAC5C,QAAQ;GACR,mBAAmB,KAAK;EAC1B,CAAC;EAED,IAAI,iBAAiB,QAGnB,OAAO;;;gDAGmC,WALtB,OAAO,KAKoC,CAAC,EAAE;;;uCAGjC,SAAS;;;EAK5C,OAAO,8BAA8B,SAAS;CAChD;CAEA,MAAM,oBAAoB,SAKL;EACnB,MAAM,WAAW,SAAS,cAAc,aAAa;EACrD,IAAI,YAAY,OAAO,SAAS,kBAAkB,YAChD,OAAO,MAAM,SAAS,cAAc;GAAE,MAAM;GAAW,GAAG;EAAQ,CAAC;EAGrE,SAAS,QAAQ,SAAS,GAAI;EAE9B,OAAO;CACT;CAEA,MAAM,eAAe,IAAwB;EAC3C,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,OAAO,KAAK,cAAc,cAAc;EAC9C,IAAI,CAAC,MACH;EAGF,MAAM,QAAQ,kBAAkB;EAEhC,IAAI,MAAM,WAAW,GAAG;GACtB,iBACE,MACA;;;;oCAKF;GAEA;EACF;EAGA,MAAM,WAAW,SAAS,uBAAuB;EAEjD,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,OAAO,MAAM;GACnB,MAAM,OAAO,SAAS,cAAc,KAAK;GACzC,KAAK,YAAY;GACjB,KAAK,aAAa,QAAQ,UAAU;GACpC,KAAK,aAAa,YAAY,GAAG;GACjC,KAAK,aAAa,oBAAoB,sBAAsB;GAC5D,KAAK,aACH,cACA,GAAG,KAAK,QAAQ,OAAO,aAAa,IAAI,EAAE,MAAM,MAAM,QACxD;GACA,KAAK,aAAa,gBAAgB,KAAK,EAAE;GAEzC,IAAI,KAAK,uBAAuB,KAAK,IAAI;IACvC,KAAK,UAAU,IAAI,kBAAkB;IACrC,KAAK,aAAa,gBAAgB,MAAM;GAC1C;GAEA,MAAM,aAAa,KAAK,UACpB,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,eAAe,IACtC;GAEJ,MAAM,UAAU,KAAK,SAAS;GAC9B,MAAM,cAAc,UAChB,KAAK,mBAAmB,KAAK,SAAS,CAAC,GAAG,IAAI,IAC9C,MAAM,KAAK,cAAc,KAAK,QAAQ,IAAI;GAE9C,MAAM,kBAAkB,KAAK,WACzB,KAAK,WAAW,KAAK,QAAQ,MAC7B;GACJ,MAAM,aAAa,KAAK,WACpB;;uCAE6B,KAAK,UAAU,YAAY,GAAG,YAAY,WAAW,KAAK,EAAE,EAAE,4CAA4C,KAAK,UAAU,YAAY,SAAS,kBAAkB,WAAW,KAAK,QAAQ,EAAE;gBACjN,KAAK,UAAU,YAAY,WAAW;wBAE5C;GAEJ,MAAM,SAAS,CAAC,UAAU,UAAU,QAAQ;GAC5C,IAAI,KAAK,cACP,OAAO,KAAK,eAAe;GAE7B,IAAI,KAAK,UACP,OAAO,KAAK,UAAU;GAExB,MAAM,gBAAgB,OAAO,KAAK,KAAK;GAQvC,iBACE,MACA;;;;gBARe,KAAK,OAClB,0HAA0H,WAAW,KAAK,IAAI,EAAE,UAChJ,GAUe;;+CAEsB,gBAAgB,oCAAoC,WAAW,aAAa,EAAE;;;kBAG3G,YAAY;;uDAEyB,WAAW,UAAU,EAAE;;;;cAIhE,WAAW;wEAC+C,WAAW,KAAK,EAAE,EAAE;;;oEAGxB,WAAW,KAAK,EAAE,EAAE;qEACnB,WAAW,KAAK,EAAE,EAAE;uEAClB,WAAW,KAAK,EAAE,EAAE;;eAGrF;GAOA,AAJe,KAAK,cAClB,sBAGG,CAAC,EAAE,iBAAiB,WAAW,MAAM;IACxC,MAAM,SAAS,EAAE;IACjB,kBAAkB,WAAW,IAAI,MAAM,OAAO,OAAO;GACvD,CAAC;GAGD,AADkB,KAAK,cAAc,qBAC7B,CAAC,EAAE,iBAAiB,eAAe,KAAK,aAAa,KAAK,EAAE,CAAC;GAGrE,AADe,KAAK,cAAc,iBAC7B,CAAC,EAAE,iBAAiB,eAAe,KAAK,UAAU,IAAI,CAAC;GAG5D,AADgB,KAAK,cAAc,kBAC7B,CAAC,EAAE,iBAAiB,eAAe,KAAK,WAAW,IAAI,CAAC;GAG9D,AADkB,KAAK,cAAc,oBAC7B,CAAC,EAAE,iBAAiB,eAC1B,KAAK,aAAa,IAAI,KAAK,EAAE,CAC/B;GAEA,MAAM,WAAW,KAAK,cACpB,qBACF;GAEA,UAAU,iBAAiB,cAAc,MAAM;IAC7C,KAAK,iBAAiB,KAAK;IAC3B,KAAK,UAAU,IAAI,UAAU;IAC7B,EAAE,cAAc,QAAQ,cAAc,KAAK,EAAE;GAC/C,CAAC;GAED,UAAU,iBAAiB,iBAAiB;IAC1C,KAAK,UAAU,OAAO,UAAU;IAChC,KAAK,iBAAiB;IACtB,KACG,iBAAiB,YAAY,CAAC,CAC9B,SAAS,OAAO,GAAG,UAAU,OAAO,WAAW,CAAC;GACrD,CAAC;GAED,UAAU,iBACR,eACC,MAAM;IACL,MAAM,QAAQ,EAAE,QAAQ;IACxB,IAAI,CAAC,OACH;IAEF,KAAK,WAAW,MAAM;IACtB,KAAK,sBAAsB,KAAK;IAChC,KAAK,UAAU,IAAI,UAAU;IAC7B,EAAE,eAAe;GACnB,GACA,EAAE,SAAS,MAAM,CACnB;GAEA,KAAK,iBAAiB,aAAa,MAAM;IACvC,EAAE,eAAe;IACjB,IAAI,KAAK,kBAAkB,KAAK,mBAAmB,KAAK,IACtD,KAAK,UAAU,IAAI,WAAW;GAElC,CAAC;GAED,KAAK,iBAAiB,mBAAmB;IACvC,KAAK,UAAU,OAAO,WAAW;GACnC,CAAC;GAED,KAAK,iBAAiB,SAAS,MAAM;IACnC,EAAE,eAAe;IACjB,KAAK,UAAU,OAAO,WAAW;IACjC,IAAI,KAAK,kBAAkB,KAAK,mBAAmB,KAAK,IACtD,KAAK,cAAc,KAAK,gBAAgB,KAAK,EAAE;GAEnD,CAAC;GAED,KAAK,iBAAiB,YAAY,MAAM;IACtC,KAAK,gBAAgB,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM;GACtD,CAAC;GAED,SAAS,YAAY,IAAI;EAC3B;EAEA,KAAK,gBAAgB;EACrB,KAAK,YAAY,QAAQ;EAEzB,KAAK,qBAAqB,IAAI;CAChC;CAEA,UAAU,SAAiB;EACzB,MAAM,SAAS,KAAK,YAAY,cAAc,cAAc;EAC5D,IAAI,QAAQ;GACV,OAAO,cAAc;GACrB,4BAA4B;IAC1B,OAAO,cAAc;GACvB,CAAC;EACH;CACF;CAEA,qBAAqB,MAAe;EAClC,IAAK,KAAa,aAChB;EAEF,AAAC,KAAa,cAAc;EAE5B,KAAK,iBACH,cACC,MAAM;GACL,IAAI,KAAK,wBAAwB,MAC/B;GAGF,MAAM,QAAQ,KAAK,WAAW,CAAe;GAC7C,IAAI,CAAC,OACH;GAGF,EAAE,eAAe;GAEjB,MAAM,SAAS,KAAK,aAAa,MAAM,SAAS,MAAM,OAAO;GAC7D,KACG,iBAAiB,YAAY,CAAC,CAC9B,SAAS,OAAO,GAAG,UAAU,OAAO,WAAW,CAAC;GAEnD,IACE,UACA,OAAO,aAAa,cAAc,MAAM,KAAK,qBAE7C,OAAO,UAAU,IAAI,WAAW;GAGlC,KAAK,uBAAuB,MAAM,OAAO;EAC3C,GACA,EAAE,SAAS,MAAM,CACnB;EAEA,KAAK,iBAAiB,aAAa,MAAM;GACvC,IAAI,KAAK,wBAAwB,MAC/B;GAGF,MAAM,QAAQ,KAAK,kBAAkB,CAAe;GACpD,IAAI,CAAC,OACH;GAIF,MAAM,WADS,KAAK,aAAa,MAAM,SAAS,MAAM,OAChC,CAAC,EAAE,aAAa,cAAc;GAEpD,KACG,iBAAiB,WAAW,CAAC,CAC7B,SAAS,OAAO,GAAG,UAAU,OAAO,UAAU,CAAC;GAElD,KACG,iBAAiB,YAAY,CAAC,CAC9B,SAAS,OAAO,GAAG,UAAU,OAAO,WAAW,CAAC;GAEnD,IAAI,YAAY,aAAa,KAAK,qBAChC,KAAK,cAAc,KAAK,qBAAqB,QAAQ;GAGvD,KAAK,gBAAgB;GACrB,KAAK,sBAAsB;GAC3B,KAAK,WAAW;EAClB,CAAC;EAED,KAAK,iBAAiB,qBAAqB;GACzC,KACG,iBAAiB,WAAW,CAAC,CAC7B,SAAS,OAAO,GAAG,UAAU,OAAO,UAAU,CAAC;GAElD,KACG,iBAAiB,YAAY,CAAC,CAC9B,SAAS,OAAO,GAAG,UAAU,OAAO,WAAW,CAAC;GACnD,KAAK,gBAAgB;GACrB,KAAK,sBAAsB;GAC3B,KAAK,WAAW;EAClB,CAAC;CACH;CAEA,kBAAkB,GAAkC;EAClD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,eAAe,QAAQ,KAAK;GAChD,MAAM,IAAI,EAAE,eAAe;GAC3B,IAAI,EAAE,eAAe,KAAK,UACxB,OAAO;EAEX;CACF;CAEA,WAAW,GAAkC;EAC3C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;GACzC,MAAM,IAAI,EAAE,QAAQ;GACpB,IAAI,EAAE,eAAe,KAAK,UACxB,OAAO;EAEX;CACF;CAEA,WAAW,SAAsB;EAC/B,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,aAAa,MAAM,KACvB,KAAK,iBACH,oGACF,CACF;EACA,MAAM,MAAM,WAAW,QAAQ,OAAO;EACtC,IAAI,QAAQ,MAAM,MAAM,WAAW,SAAS,GAC1C,WAAW,MAAM,EAAE,CAAC,MAAM;CAE9B;CAEA,eAAe,SAAsB;EACnC,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,QAAQ,MAAM,KAClB,KAAK,iBAAiB,cAAc,CACtC;EACA,MAAM,cAAc,QAAQ,QAAQ,cAAc;EAClD,MAAM,MAAM,MAAM,QAAQ,WAAW;EACrC,IAAI,QAAQ,MAAM,MAAM,MAAM,SAAS,GACrC,MAAM,MAAM,EAAE,CAAC,MAAM;CAEzB;CAEA,WAAW,SAAsB;EAC/B,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,aAAa,MAAM,KACvB,KAAK,iBACH,oGACF,CACF;EACA,MAAM,MAAM,WAAW,QAAQ,OAAO;EACtC,IAAI,MAAM,GACR,WAAW,MAAM,EAAE,CAAC,MAAM;CAE9B;CAEA,eAAe,SAAsB;EACnC,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,QAAQ,MAAM,KAClB,KAAK,iBAAiB,cAAc,CACtC;EACA,MAAM,cAAc,QAAQ,QAAQ,cAAc;EAClD,MAAM,MAAM,MAAM,QAAQ,WAAW;EACrC,IAAI,MAAM,GACR,MAAM,MAAM,EAAE,CAAC,MAAM;CAEzB;CAEA,gBAAgB,GAAkB,QAAgB,MAAc;EAC9D,MAAM,QAAQ,kBAAkB,SAAS,CAAC;EAC1C,MAAM,MAAM,MAAM,KAAK,MAAM,EAAE,EAAE;EACjC,MAAM,QAAQ,IAAI;EAElB,IAAI,KAAK,uBAAuB,MAAM;GAEpC,IAAI,EAAE,QAAQ,aAAa;IACzB,EAAE,eAAe;IACjB,KAAK,eAAe,EAAE,MAAqB;IAC3C;GACF;GAEA,IAAI,EAAE,QAAQ,WAAW;IACvB,EAAE,eAAe;IACjB,KAAK,eAAe,EAAE,MAAqB;IAC3C;GACF;GAEA,IAAI,EAAE,QAAQ,cAAc;IAC1B,EAAE,eAAe;IACjB,KAAK,WAAW,EAAE,MAAqB;IACvC;GACF;GAEA,IAAI,EAAE,QAAQ,aAAa;IACzB,EAAE,eAAe;IACjB,KAAK,WAAW,EAAE,MAAqB;IACvC;GACF;GAGA,IAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,KAAK;IAClC,EAAE,eAAe;IACjB,KAAK,qBAAqB;IAC1B,MAAM,MAAM,IAAI,QAAQ,MAAM,IAAI;IAClC,KAAK,UACH,GAAG,KAAK,6BAA6B,IAAI,MAAM,MAAM,yDACvD;IACA,MAAM,CAAC,CACJ,MAAM,OAAO,KAAK,eAAe,EAAE,CAAC,CAAC,CACrC,MAAM,QAAQ,KAAK;GACxB;GAEA;EACF;EAGA,IAAI,EAAE,QAAQ,UAAU;GACtB,EAAE,eAAe;GACjB,KAAK,UACH,sBAAsB,KAAK,gCAC7B;GACA,KAAK,qBAAqB;GAC1B,MAAM,CAAC,CACJ,MAAM,OAAO,KAAK,eAAe,EAAE,CAAC,CAAC,CACrC,MAAM,QAAQ,KAAK;GACtB;EACF;EAEA,IAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,cAAc,EAAE,QAAQ,SAAS;GAE9D,EAAE,eAAe;GACjB,MAAM,MAAM,IAAI,QAAQ,KAAK,kBAAkB,IAAI;GACnD,MAAM,cACJ,MAAM,MAAM,MAAM,EAAE,OAAO,KAAK,kBAAkB,CAAC,EAAE,QAAQ;GAC/D,KAAK,UACH,GAAG,YAAY,uBAAuB,IAAI,MAAM,MAAM,uBACxD;GACA,KAAK,qBAAqB;GAC1B,MAAM,CAAC,CACJ,MAAM,OAAO,KAAK,eAAe,EAAE,CAAC,CAAC,CACrC,MAAM,QAAQ,KAAK;GACtB;EACF;EAEA,IAAI,EAAE,QAAQ,aAAa,EAAE,QAAQ,aAAa;GAChD,EAAE,eAAe;GACjB,MAAM,aAAa,IAAI,QAAQ,KAAK,kBAAkB;GACtD,MAAM,SAAS,EAAE,QAAQ,YAAY,aAAa,IAAI,aAAa;GACnE,IAAI,SAAS,KAAK,UAAU,OAC1B;GAIF,IAAI,OAAO,YAAY,CAAC;GACxB,IAAI,OAAO,QAAQ,GAAG,KAAK,kBAAkB;GAC7C,KAAK,UAAU,qBAAqB,SAAS,EAAE,MAAM,MAAM,EAAE;GAC7D,KAAK,cAAc,KAAK,oBAAoB,IAAI,aAAa,GAAG;EAClE;CACF;CAEA,aAAa,GAAW,GAA2B;EACjD,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH,OAAO;EAIT,OADW,KAAK,iBAAiB,GAAG,CAC5B,CAAC,EAAE,UAAU,cAAc,KAAK;CAC1C;CAEA,mBAAmB;EACjB,IAAI,KAAK,mBACP;EAEF,KAAK,oBAAoB;EAEzB,MAAM,mBAAmB;GACvB,IAAI,CAAC,KAAK,mBACR;GAIF,MAAM,UADO,KAAK,YACI,cACpB,iBACF;GACA,IAAI,WAAW,KAAK,qBAAqB,GACvC,QAAQ,aAAa,KAAK;GAG5B,sBAAsB,UAAU;EAClC;EAEA,sBAAsB,UAAU;CAClC;CAEA,kBAAkB;EAChB,KAAK,oBAAoB;EACzB,KAAK,mBAAmB;CAC1B;CAEA,uBAAuB,SAAiB;EAEtC,MAAM,UADO,KAAK,YACI,cACpB,iBACF;EACA,IAAI,CAAC,SAAS;GACZ,KAAK,mBAAmB;GACxB;EACF;EAEA,MAAM,OAAO,QAAQ,sBAAsB;EAC3C,MAAM,YAAY;EAElB,MAAM,UAAU,UAAU,KAAK;EAC/B,MAAM,aAAa,KAAK,SAAS;EAEjC,IAAI,WAAW,KAAK,UAAU,WAAW;GAEvC,KAAK,mBAAmB,GAAG,YAAY,WAAW,aAAa;GAC/D,KAAK,iBAAiB;EACxB,OAAO,IAAI,cAAc,KAAK,aAAa,WAAW;GAEpD,KAAK,oBAAqB,YAAY,cAAc,YAAa;GACjE,KAAK,iBAAiB;EACxB,OACE,KAAK,mBAAmB;CAE5B;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,eAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "./tools-DBaMRiEu.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-aKtaBQYM.js";let t=null;function n(){let e=y(`/static-routing.json`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}function r(e){return e.replace(/^\/+|\/+$/g,``)}function i(e){let t=r(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),r(t)}function a(e){let t=r(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let i=n[0].toLowerCase();if(i===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(i===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(i===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(i===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return i===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function o(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}async function s(){if(t)return t;let e=o(),r=n();if(!e&&typeof fetch==`function`)try{let t=await fetch(r);if(t.ok){let n=await t.json();n&&typeof n==`object`&&(e=n)}}catch{}return e?(e.routes||={},t=e,t):{routes:{}}}function c(e,n){let r=n||t||o();if(!r||!r.routes)return null;let s=i(e);if(!s)return null;for(let[e,t]of Object.entries(r.routes))if(!(!t||!t.prettyPath)&&i(t.prettyPath)===s)return a(e);return null}async function l(e){let t=c(e);if(t)return t;let r=await s();if(!r||!r.subRoutes)return null;let a=r,o=n(),l=5;for(;a&&a.subRoutes&&l>0;){let t=null,n=i(e);if(Array.isArray(a.subRoutes))for(let e of a.subRoutes){let r=e.replace(/\/routes\.json$/,``);if(n.startsWith(r)){t=e;break}}else if(typeof a.subRoutes==`object`){let e=``;for(let[r,o]of Object.entries(a.subRoutes)){let a=i(r);n.startsWith(a)&&a.length>e.length&&(e=a,t=o)}}if(!t||typeof fetch!=`function`)break;try{let n=t;try{if(t.startsWith(`http://`)||t.startsWith(`https://`))n=t;else if(t.startsWith(`/`)){let e=y(t);n=typeof window<`u`&&window.location?.origin?new URL(e,window.location.origin).toString():e}else n=new URL(t,o).toString()}catch{}let i=await fetch(n);if(!i.ok)break;let s=await i.json();if(!s||typeof s!=`object`)break;s.routes&&Object.assign(r.routes,s.routes);let u=c(e,r);if(u)return u;a=s,o=n,l--}catch(e){console.warn(`Failed to lazy load subRoute:`,t,e);break}}return null}function u(e,n){let i=n||t||o();if(!i||!i.routes)return null;let{page:a,groupId:s,path:c}=e;if(!a)return null;let l=s===`br:main`||s===`main`?`main`:s?.startsWith(`br:`)?`br-${s.slice(3)}`:s,u=[];if(a===`pages`&&c){let e=r(c);l===`main`?(u.push(`/pages/main/${e}`),u.push(`pages/main/${e}`),u.push(`/pages/br:main/${e}`),u.push(`/pages/br-main/${e}`),u.push(`/main/${e}`),u.push(`main/${e}`),u.push(`/${e}`),u.push(e)):l&&(u.push(`/pages/${l}/${e}`),u.push(`pages/${l}/${e}`),u.push(`/pages/${s}/${e}`))}else if(a===`files`&&c){let e=r(c);l&&(u.push(`/files/${l}/${e}`),u.push(`files/${l}/${e}`),u.push(`/files/${s}/${e}`))}for(let e of u){let t=r(e);for(let[e,n]of Object.entries(i.routes))if(r(e)===t&&n?.prettyPath)return n.prettyPath}return null}var d=e({applyBasePath:()=>y,buildRoutePath:()=>C,getAppBasePath:()=>v,getDeploymentNamespace:()=>_,getFileRouteDirPath:()=>O,getWorkspaceRouteRequestPath:()=>k,isPossibleAppRoute:()=>T,parseRouteFromUrl:()=>w,parseRouteFromUrlAsync:()=>E,resetAppBasePathCache:()=>g,resolveHrefAgainstRoute:()=>D});function f(e){return e===`br:main`?`main`:e.startsWith(`br:`)?`br-${e.slice(3)}`:encodeURIComponent(e)}function p(e){try{return decodeURIComponent(e)}catch{return e}}let m=null;const h=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function g(){m=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=g);function _(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=v();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function v(){if(m!==null)return m;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return m=`/`,m;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return m=`/`,m;if(!n)return m=`/`+e[0]+`/`,m}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),m=t,m}catch{}}}let t=e.pathname||`/`;if(t===`/`)return m=`/`,m;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>h.has(e.toLowerCase()));return r>=0?r===0?(m=`/`,m):(m=`/`+n.slice(0,r).join(`/`)+`/`,m):c(t)?(m=`/`,m):n.length===1&&!t.includes(`.`)?(m=`/`+n[0]+`/`,m):(m=`/`,m)}function y(e){let t=v();if(t===`/`)return e;let[n,...r]=e.split(/(?=[?#])/);if(n===t||n.startsWith(t))return e;let i=t+(n.startsWith(`/`)?n.slice(1):n);return i=i.replace(/\/{2,}/g,`/`),i+r.join(``)}function b(e){return e.replace(/^\/+|\/+$/g,``)}function x(e){return e&&(e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e)}function S(e){if(!e)return;let t=b(e.replace(/\\/g,`/`));if(!t)return;let n=t.split(`/`).filter(Boolean).filter(e=>e!==`.`&&e!==`..`);if(n.length!==0)return n.join(`/`)}function C(e){let t=e.anchor?`#${e.anchor.replace(/^#/,``)}`:``,n=u(e);if(n){let e=n;return e.startsWith(`/`)||(e=`/${e}`),`${e}${t}`}switch(e.page){case`chat`:return`${e.groupId?`/chat/${f(e.groupId)}/`:`/chat`}${t}`;case`tasks`:return`${e.groupId?`/tasks/${f(e.groupId)}/`:`/tasks`}${t}`;case`files`:{let n=S(e.path);return e.groupId?n?`/files/${f(e.groupId)}/${n}${t}`:`/files/${f(e.groupId)}/${t}`:`/files${t}`}case`pages`:{let n=S(e.path);return n?e.groupId?`/pages/${f(e.groupId)}/${n}${t}`:`/pages/${n}${t}`:`/pages${t}`}case`tools`:return`/settings/tool-configuration${t}`;case`channels`:return`/settings/channel-configuration${t}`;default:return`/settings${t}`}}function w(e,t){let n=e.pathname,r=v();r!==`/`&&n.startsWith(r)&&(n=`/`+n.slice(r.length));let i=c(n);if(i){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...i,anchor:t||i.anchor}}let a=n.split(`/`).filter(Boolean).map(e=>p(e)),o=e.hash?e.hash.replace(/^#/,``):void 0;if(a.length===0)return null;let s=a[0].toLowerCase();if(s===`chat`)return{page:`chat`,groupId:x(a[1]||t),anchor:o};if(s===`tasks`)return{page:`tasks`,groupId:x(a[1]||t),anchor:o};if(s===`files`)return{page:`files`,groupId:x(a[1]||t),path:S(a.slice(2).join(`/`)),anchor:o};if(s===`pages`)return a.length>=3?{page:`pages`,groupId:x(a[1]),path:S(a.slice(2).join(`/`)),anchor:o}:{page:`pages`,groupId:x(t),path:S(a.slice(1).join(`/`)),anchor:o};if(s===`settings`){let e=(a[1]||``).toLowerCase();return e===`tool-configuration`?{page:`tools`,anchor:o}:e===`channel-configuration`?{page:`channels`,anchor:o}:{page:`settings`,anchor:o}}return s===`tools`?{page:`tools`,anchor:o}:s===`channels`?{page:`channels`,anchor:o}:null}function T(e){let t=e,n=v();if(n!==`/`&&t.startsWith(n))t=`/`+t.slice(n.length);else if(n!==`/`&&!t.startsWith(n))return!1;let r=t.split(`/`).filter(Boolean);if(r.length===0)return!0;let i=r[0].toLowerCase();return!!(h.has(i)||c(t))}async function E(e,t){let n=w(e,t);if(n)return n;let r=e.pathname,i=v();i!==`/`&&r.startsWith(i)&&(r=`/`+r.slice(i.length));let a=await l(r);if(a){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...a,anchor:t||a.anchor}}return null}function D(e,t,n){let r=e.trim();if(!r||r.startsWith(`javascript:`))return null;if(r.startsWith(`/`))try{let e=y(r);return new URL(e,n)}catch{return null}let i=new URL(t,n);try{return new URL(r,i)}catch{return null}}function O(e,t){let n=S(t);if(!n)return C({page:`files`,groupId:e});let r=n.split(`/`);r.pop();let i=r.length>0?`${r.join(`/`)}/`:``;return`/files/${f(e)}/${i}`}function k(e){let t=e,n=v();n!==`/`&&t.startsWith(n)&&(t=`/`+t.slice(n.length));let r=t.split(`/`).filter(Boolean).map(e=>p(e));if(r.length<3||r[0]!==`files`)return null;let i=x(r[1])||r[1],a=S(r.slice(2).join(`/`));return!i||!a?null:{groupId:i,path:a}}export{O as a,w as c,_ as i,E as l,y as n,k as o,C as r,T as s,d as t,D as u};
|