shadow-claw 1.54.0 → 1.55.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/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/README.md +1 -1
- package/dist/cli/build/build.js +1 -1
- package/dist/cli/{chunk-DO2t9bUI.js → chunk--IuVyWfT.js} +24 -23
- package/dist/cli/{chunk-2ZYd9gYC.js → chunk--JpdI-Ht.js} +1 -1
- package/dist/cli/{chunk-m4Ineemy.js → chunk-4O8yrQuN.js} +1 -1
- package/dist/cli/{chunk-BiH9IXnQ.js → chunk-7S9Ywlfy.js} +1 -1
- package/dist/cli/{chunk-BmMOdYvk.js → chunk-B0SqqDSK.js} +1 -1
- package/dist/cli/chunk-BNaWaEm-.js +1 -0
- package/dist/cli/chunk-BXCsxO9e.js +1 -0
- package/dist/cli/chunk-Bq37qDoZ.js +18 -0
- package/dist/cli/{chunk-C1htf-nO.js → chunk-BrEeCKIo.js} +2 -2
- package/dist/cli/{chunk-BI1SOTM1.js → chunk-Bu3ylrhT.js} +8 -8
- package/dist/cli/{chunk-3smiGQoQ.js → chunk-C1v_s0Kb.js} +1 -1
- package/dist/cli/{chunk-DGeysxz3.js → chunk-C44G533y.js} +1 -1
- package/dist/cli/{chunk-9KiBalKu.js → chunk-C7hJLmsL.js} +1 -1
- package/dist/cli/{chunk-BFv9XSNd.js → chunk-CAaQWd6t.js} +1 -1
- package/dist/cli/chunk-CIkgn5Fh.js +1 -0
- package/dist/cli/chunk-CWEIN2kc.js +1 -0
- package/dist/cli/{chunk-BDeDZ-0L.js → chunk-CYg1lO1a.js} +1 -1
- package/dist/cli/{chunk-DXLmEQ3i.js → chunk-Ce09lwXT.js} +1 -1
- package/dist/cli/{chunk-XsfHeN4m.js → chunk-CpdqRSO-.js} +1 -1
- package/dist/cli/chunk-DB4x5L-B.js +1 -0
- package/dist/cli/{chunk-DaNyMqrk.js → chunk-DBvObsBQ.js} +1 -1
- package/dist/cli/chunk-DGPpt7Ka.js +1 -0
- package/dist/cli/chunk-DGagHluH.js +1 -0
- package/dist/cli/chunk-DUIs23D9.js +1 -0
- package/dist/cli/{chunk-CyvfQV16.js → chunk-DaurYOqg.js} +1 -1
- package/dist/cli/{chunk-DSFrcSyA.js → chunk-DfwRL0Ue.js} +1 -1
- package/dist/cli/{chunk-M2tZrzY5.js → chunk-DudYQk0p.js} +1 -1
- package/dist/cli/chunk-DvKo50Tp.js +2 -0
- package/dist/cli/{chunk-H_Mw5ypp.js → chunk-Dvrqte5Q.js} +2 -2
- package/dist/cli/{chunk-BtNO-m9T.js → chunk-DzhSExU0.js} +1 -1
- package/dist/cli/{chunk-IOMO88kZ.js → chunk-ENKlt3i9.js} +1 -1
- package/dist/cli/{chunk-Bspgzwsm.js → chunk-FWRwAX75.js} +8 -8
- package/dist/cli/chunk-Lf-Z-h48.js +32 -0
- package/dist/cli/{chunk-BucXnZ4Z.js → chunk-VRfkSLrD.js} +1 -1
- package/dist/cli/chunk-uaTxD024.js +1 -0
- package/dist/cli/cli.js +1 -1
- package/dist/cli/prerender/dsd-shell/prerender-dsd-shell.js +1 -1
- package/dist/headless-agent.js +2 -2
- package/dist/lib/components/index.js +25 -25
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-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/utils/get-route.d.ts +3 -0
- package/dist/lib/components/shadow-claw/utils/sync-slotted-sidebar-active-links.d.ts +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/{configure-peer-js-D5jDCtLx.js → configure-peer-js-C9554Slv.js} +2 -2
- package/dist/lib/{configure-peer-js-D5jDCtLx.js.map → configure-peer-js-C9554Slv.js.map} +1 -1
- package/dist/lib/{file-viewer-B4CL4e0i.js → file-viewer-DBc5dxNy.js} +2 -2
- package/dist/lib/{file-viewer-B4CL4e0i.js.map → file-viewer-DBc5dxNy.js.map} +1 -1
- package/dist/lib/index.js +28 -27
- package/dist/lib/{init-control-plane-l2uFnhGV.js → init-control-plane-D-41Fm5q.js} +12 -12
- package/dist/lib/{init-control-plane-l2uFnhGV.js.map → init-control-plane-D-41Fm5q.js.map} +1 -1
- package/dist/lib/{markdown-0_p_zfxL.js → markdown-KnDWzWJJ.js} +2 -2
- package/dist/lib/{markdown-0_p_zfxL.js.map → markdown-KnDWzWJJ.js.map} +1 -1
- package/dist/lib/{orchestrator-D6wm8Sec.js → orchestrator-BEZcqgR5.js} +9 -9
- package/dist/lib/{orchestrator-D6wm8Sec.js.map → orchestrator-BEZcqgR5.js.map} +1 -1
- package/dist/lib/{orchestrator-Dh-hnIpK.js → orchestrator-Cda13e5U.js} +4 -4
- package/dist/lib/{orchestrator-Dh-hnIpK.js.map → orchestrator-Cda13e5U.js.map} +1 -1
- package/dist/lib/{peerjs-BWZnsD0B.js → peerjs-DYkUTcee.js} +5 -5
- package/dist/lib/{peerjs-BWZnsD0B.js.map → peerjs-DYkUTcee.js.map} +1 -1
- package/dist/lib/{push-client-MybDfOdi.js → push-client-CQtCFDaD.js} +3 -3
- package/dist/lib/{push-client-MybDfOdi.js.map → push-client-CQtCFDaD.js.map} +1 -1
- package/dist/lib/security/custom-element-security.d.ts +8 -4
- package/dist/lib/{shadow-claw-PdOpgTxH.js → shadow-claw-DYe9u6Tp.js} +142 -33
- package/dist/lib/shadow-claw-DYe9u6Tp.js.map +1 -0
- package/dist/lib/{shadow-claw-accounts-3bR76EOb.js → shadow-claw-accounts-D2URoHys.js} +2 -2
- package/dist/lib/{shadow-claw-accounts-3bR76EOb.js.map → shadow-claw-accounts-D2URoHys.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js → shadow-claw-channel-config-buXoz2xv.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js.map → shadow-claw-channel-config-buXoz2xv.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-CK9sc7h_.js → shadow-claw-channels-5yVJ1gLk.js} +3 -3
- package/dist/lib/{shadow-claw-channels-CK9sc7h_.js.map → shadow-claw-channels-5yVJ1gLk.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js → shadow-claw-chat-CVc-7ycM.js} +7 -7
- package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js.map → shadow-claw-chat-CVc-7ycM.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-BpRcl312.js → shadow-claw-control-plane-B5vsF91B.js} +6 -6
- package/dist/lib/{shadow-claw-control-plane-BpRcl312.js.map → shadow-claw-control-plane-B5vsF91B.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js → shadow-claw-conversations-PGK5zqn3.js} +54 -12
- package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js.map → shadow-claw-conversations-PGK5zqn3.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js → shadow-claw-file-viewer-DSqn0hgx.js} +6 -6
- package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js.map → shadow-claw-file-viewer-DSqn0hgx.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-DhnHbXKf.js → shadow-claw-files-vOa9ZWbr.js} +6 -6
- package/dist/lib/{shadow-claw-files-DhnHbXKf.js.map → shadow-claw-files-vOa9ZWbr.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-BeQ1ElUd.js → shadow-claw-git-D54Z85Bj.js} +4 -4
- package/dist/lib/{shadow-claw-git-BeQ1ElUd.js.map → shadow-claw-git-D54Z85Bj.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js → shadow-claw-integrations-BTubMH9d.js} +2 -2
- package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js.map → shadow-claw-integrations-BTubMH9d.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-DPda4L3C.js → shadow-claw-llm-8koGTNYs.js} +3 -3
- package/dist/lib/{shadow-claw-llm-DPda4L3C.js.map → shadow-claw-llm-8koGTNYs.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js → shadow-claw-mcp-remote-C2jwBsQt.js} +2 -2
- package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js.map → shadow-claw-mcp-remote-C2jwBsQt.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-zqNuyn3-.js → shadow-claw-networking-BV-rna16.js} +2 -2
- package/dist/lib/{shadow-claw-networking-zqNuyn3-.js.map → shadow-claw-networking-BV-rna16.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-DFgdo33v.js → shadow-claw-notifications-Dku7VBLk.js} +2 -2
- package/dist/lib/{shadow-claw-notifications-DFgdo33v.js.map → shadow-claw-notifications-Dku7VBLk.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js → shadow-claw-page-header-VPjYWfsT.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js.map → shadow-claw-page-header-VPjYWfsT.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-DLspFqdK.js → shadow-claw-pages-DXrM6hgZ.js} +29 -19
- package/dist/lib/shadow-claw-pages-DXrM6hgZ.js.map +1 -0
- package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js → shadow-claw-peerjs-D3xonez5.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js.map → shadow-claw-peerjs-D3xonez5.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-NbvzXASD.js → shadow-claw-settings-DMTx6OS9.js} +5 -5
- package/dist/lib/{shadow-claw-settings-NbvzXASD.js.map → shadow-claw-settings-DMTx6OS9.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-B_NAoZmd.js → shadow-claw-storage-BJLnukxa.js} +3 -3
- package/dist/lib/{shadow-claw-storage-B_NAoZmd.js.map → shadow-claw-storage-BJLnukxa.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js → shadow-claw-task-server-DcMj20hD.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js.map → shadow-claw-task-server-DcMj20hD.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-CAZua0-j.js → shadow-claw-tasks-BQBe4lVi.js} +7 -7
- package/dist/lib/{shadow-claw-tasks-CAZua0-j.js.map → shadow-claw-tasks-BQBe4lVi.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js → shadow-claw-terminal-DPEzTxXv.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js.map → shadow-claw-terminal-DPEzTxXv.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-CkZWxxTm.js → shadow-claw-tools-BCnU8FaK.js} +6 -6
- package/dist/lib/{shadow-claw-tools-CkZWxxTm.js.map → shadow-claw-tools-BCnU8FaK.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js → shadow-claw-webvm-CnW-hoJ8.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js.map → shadow-claw-webvm-CnW-hoJ8.js.map} +1 -1
- package/dist/lib/subsystems/mcp/webmcp.d.ts +15 -2
- package/dist/lib/{sync-web-mcp-registration-dW2MVCj4.js → sync-web-mcp-registration-DwpGjVdo.js} +10 -4
- package/dist/lib/sync-web-mcp-registration-DwpGjVdo.js.map +1 -0
- package/dist/lib/{tools-D7whby3H.js → tools-CP6G0HF7.js} +5 -6
- package/dist/lib/tools-CP6G0HF7.js.map +1 -0
- package/dist/lib/{trusted-types-d0cdkut_.js → trusted-types-0cu5Dm6M.js} +29 -4
- package/dist/lib/{trusted-types-d0cdkut_.js.map → trusted-types-0cu5Dm6M.js.map} +1 -1
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +4 -2
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/resolve-page-script-dependencies.d.ts +19 -0
- package/dist/lib/utils/resolve-page-script-dependencies.js +98 -0
- package/dist/lib/utils/resolve-page-script-dependencies.js.map +1 -0
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/webmcp-Bf9rT7uu.js +2001 -0
- package/dist/lib/webmcp-Bf9rT7uu.js.map +1 -0
- package/dist/public/.well-known/mcp/server-card.json +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/AGENTS.md +3 -3
- package/dist/public/README.md +1 -1
- package/dist/public/agent.worker.js +2 -2
- package/dist/public/components/shadow-claw/shadow-claw.css +1 -1
- package/dist/public/components/shadow-claw/shadow-claw.html +1 -1
- package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.css +1 -1
- package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.html +1 -1
- package/dist/public/{configure-peer-js-WLRM7Qa7.js → configure-peer-js-OYl3V8sW.js} +1 -1
- package/dist/public/{custom-element-security-Cl991z-x.js → custom-element-security-BR4V40j4.js} +1 -1
- package/dist/public/docs/example/article/index.html +3 -3
- package/dist/public/docs/example/article.html +3 -3
- package/dist/public/docs/publishing/index.html +3 -3
- package/dist/public/docs/publishing.html +3 -3
- package/dist/public/docs/skill-creator/index.html +3 -3
- package/dist/public/docs/skill-creator.html +3 -3
- package/dist/public/docs/subsystems/custom-element-security.md +19 -5
- package/dist/public/docs/subsystems/pages.md +10 -2
- package/dist/public/docs/subsystems/tools.md +1 -2
- package/dist/public/docs/subsystems/webmcp.md +41 -6
- package/dist/public/{download-group-file-fFjoIIp4.js → download-group-file-BNmK8wac.js} +1 -1
- package/dist/public/e2e/README.md +2 -2
- package/dist/public/{e2e-bridge-CiSfBRT4.js → e2e-bridge-4phD1JUQ.js} +1 -1
- package/dist/public/{file-viewer-DFC3kfeO.js → file-viewer-Dbh3K9nL.js} +1 -1
- package/dist/public/index.html +3 -3
- package/dist/public/index.js +1 -1
- package/dist/public/{init-control-plane-BEbcwmmv.js → init-control-plane-DGOY_RNS.js} +1 -1
- package/dist/public/llms.txt +1 -1
- package/dist/public/main/index.html +3 -3
- package/dist/public/main/memory/index.html +3 -3
- package/dist/public/main/memory.html +3 -3
- package/dist/public/main.html +3 -3
- package/dist/public/{markdown-BeglYzw9.js → markdown-BPZYpfGm.js} +1 -1
- package/dist/public/{orchestrator-BlvEG3PO.js → orchestrator-OoUK7CF9.js} +1 -1
- package/dist/public/{orchestrator-DTNrntd4.js → orchestrator-a9047bGu.js} +1 -1
- package/dist/public/{peerjs-CnBdK94R.js → peerjs-Cbn310Tz.js} +1 -1
- package/dist/public/{push-client-DOHbdCyj.js → push-client-Dy4LGJy9.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/shadow-claw-B-HWC1uN.js +1180 -0
- package/dist/public/{shadow-claw-accounts-C6FXVw2K.js → shadow-claw-accounts-Di-anCZ1.js} +1 -1
- package/dist/public/{shadow-claw-channels-tr_r60Kq.js → shadow-claw-channels-RVwCE8pE.js} +1 -1
- package/dist/public/{shadow-claw-chat-BAAPhAOs.js → shadow-claw-chat-DI1q8UnX.js} +1 -1
- package/dist/public/{shadow-claw-control-plane-C_5VIx8E.js → shadow-claw-control-plane-KXEdLOGl.js} +2 -2
- package/dist/public/{shadow-claw-conversations-DGYZdDa3.js → shadow-claw-conversations-BCBGtS30.js} +40 -6
- package/dist/public/{shadow-claw-file-viewer-5j2-Z3fN.js → shadow-claw-file-viewer-CW3t6j-w.js} +1 -1
- package/dist/public/{shadow-claw-files-DKF4Yy0m.js → shadow-claw-files-JQ-o0ImX.js} +1 -1
- package/dist/public/{shadow-claw-git-CtUTJXKT.js → shadow-claw-git-D2M8VixW.js} +2 -2
- package/dist/public/{shadow-claw-integrations-CuBy9D3z.js → shadow-claw-integrations-Cgw6v9_1.js} +1 -1
- package/dist/public/{shadow-claw-llm-BIfNNjGL.js → shadow-claw-llm-74ieXp7i.js} +1 -1
- package/dist/public/{shadow-claw-mcp-remote-C17FXvrb.js → shadow-claw-mcp-remote-BX0BkSmy.js} +1 -1
- package/dist/public/{shadow-claw-networking-CjxQ1CLI.js → shadow-claw-networking-DNX8vaIQ.js} +1 -1
- package/dist/public/{shadow-claw-notifications-Brn2O3Ps.js → shadow-claw-notifications-BLTaGAny.js} +1 -1
- package/dist/public/{shadow-claw-page-header-Bn1P7Cxb.js → shadow-claw-page-header-CjFOdo9v.js} +1 -1
- package/dist/public/shadow-claw-pages-DOQqMm0_.js +645 -0
- package/dist/public/{shadow-claw-settings-CfDm0hVA.js → shadow-claw-settings-DFtl0Fy8.js} +2 -2
- package/dist/public/{shadow-claw-storage-DOOesRzw.js → shadow-claw-storage-gQGExZRq.js} +1 -1
- package/dist/public/{shadow-claw-task-server-H36iDDp2.js → shadow-claw-task-server-Ca45uY7S.js} +1 -1
- package/dist/public/{shadow-claw-tasks-4JsjSGkN.js → shadow-claw-tasks-CCTaaSdi.js} +1 -1
- package/dist/public/{shadow-claw-terminal-CTRTcYz-.js → shadow-claw-terminal-BfgulLkl.js} +1 -1
- package/dist/public/{shadow-claw-tools-Dm1LxNf4.js → shadow-claw-tools-V8NA4n18.js} +1 -1
- package/dist/public/{shadow-claw-webvm-JzuPe9Nr.js → shadow-claw-webvm-CxxI2bnC.js} +1 -1
- package/dist/public/sync-web-mcp-registration-CkCA8UFm.js +1 -0
- package/dist/public/{tools-FiTtOlIt.js → tools-CwQq5tJH.js} +2 -2
- package/dist/public/webmcp-CmtWOAFm.js +6 -0
- package/dist/server.js +2 -2
- package/package.json +3 -3
- package/src/cli/prerender/dsd-shell/prerender-dsd-shell.test.ts +16 -0
- package/src/cli/prerender/dsd-shell/prerender-dsd-shell.ts +62 -1
- package/src/cli/prerender/pretty-paths/prerender-pretty-paths.test.ts +277 -0
- package/src/cli/prerender/pretty-paths/prerender-pretty-paths.ts +28 -1
- package/src/cli/site-config/custom-elements/build-custom-element-script-tags.ts +13 -1
- package/src/components/shadow-claw/shadow-claw.css +12 -0
- package/src/components/shadow-claw/shadow-claw.html +12 -2
- package/src/components/shadow-claw/utils/bind-event-listeners.test.ts +18 -0
- package/src/components/shadow-claw/utils/bind-event-listeners.ts +14 -0
- package/src/components/shadow-claw/utils/get-route.test.ts +35 -0
- package/src/components/shadow-claw/utils/get-route.ts +18 -0
- package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.test.ts +152 -1
- package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.ts +139 -8
- package/src/components/shadow-claw-conversations/shadow-claw-conversations.css +11 -0
- package/src/components/shadow-claw-conversations/shadow-claw-conversations.html +27 -4
- package/src/components/shadow-claw-conversations/shadow-claw-conversations.ts +32 -4
- package/src/components/shadow-claw-pages/shadow-claw-pages-scripts.test.ts +266 -0
- package/src/components/shadow-claw-pages/shadow-claw-pages.ts +41 -17
- package/src/core/orchestrator/utils/sync-web-mcp-registration.test.ts +18 -1
- package/src/core/orchestrator/utils/sync-web-mcp-registration.ts +8 -0
- package/src/core/utils/init-control-plane.test.ts +9 -4
- package/src/security/custom-element-security.test.ts +65 -0
- package/src/security/custom-element-security.ts +67 -4
- package/src/stores/tools.test.ts +5 -3
- package/src/stores/tools.ts +5 -10
- package/src/subsystems/mcp/webmcp.test.ts +84 -13
- package/src/subsystems/mcp/webmcp.ts +73 -10
- package/src/utils/index.ts +1 -0
- package/src/utils/resolve-page-script-dependencies.test.ts +245 -0
- package/src/utils/resolve-page-script-dependencies.ts +198 -0
- package/dist/cli/chunk-B1hufJeO.js +0 -1
- package/dist/cli/chunk-BZpn8npn.js +0 -1
- package/dist/cli/chunk-Bw5aOTFr.js +0 -1
- package/dist/cli/chunk-C8nH01Gw.js +0 -32
- package/dist/cli/chunk-CK1ZoyoE.js +0 -17
- package/dist/cli/chunk-CVkhDr-7.js +0 -1
- package/dist/cli/chunk-Cum07Vlh.js +0 -1
- package/dist/cli/chunk-D3UhDDmV.js +0 -2
- package/dist/cli/chunk-D8GI6qj6.js +0 -1
- package/dist/cli/chunk-DEH-FvmP.js +0 -1
- package/dist/cli/chunk-DksvJ_kf.js +0 -1
- package/dist/cli/chunk-RGb9wM4R.js +0 -1
- package/dist/lib/shadow-claw-PdOpgTxH.js.map +0 -1
- package/dist/lib/shadow-claw-pages-DLspFqdK.js.map +0 -1
- package/dist/lib/sync-web-mcp-registration-dW2MVCj4.js.map +0 -1
- package/dist/lib/tools-D7whby3H.js.map +0 -1
- package/dist/lib/webmcp-CYTNZfkn.js +0 -1687
- package/dist/lib/webmcp-CYTNZfkn.js.map +0 -1
- package/dist/public/shadow-claw-CnNX-WCh.js +0 -1158
- package/dist/public/shadow-claw-pages-BwOOqRWW.js +0 -645
- package/dist/public/sync-web-mcp-registration-BnHVUjat.js +0 -1
- package/dist/public/webmcp-_TBqXlVW.js +0 -1
|
@@ -80,7 +80,7 @@ async function subscribeToPush(clientId, deviceLabel, subscriberId) {
|
|
|
80
80
|
let resolvedDeviceLabel = deviceLabel;
|
|
81
81
|
let resolvedSubscriberId = subscriberId;
|
|
82
82
|
if (!resolvedClientId || !resolvedDeviceLabel) try {
|
|
83
|
-
const initCp = await import("./init-control-plane-
|
|
83
|
+
const initCp = await import("./init-control-plane-D-41Fm5q.js");
|
|
84
84
|
if (!resolvedClientId && typeof initCp.getOrCreateControlPlaneClientId === "function") resolvedClientId = initCp.getOrCreateControlPlaneClientId();
|
|
85
85
|
if (!resolvedDeviceLabel && typeof initCp.detectDeviceLabel === "function") resolvedDeviceLabel = initCp.detectDeviceLabel();
|
|
86
86
|
} catch (_) {}
|
|
@@ -116,7 +116,7 @@ async function syncExistingPushSubscription(subscriberId) {
|
|
|
116
116
|
let resolvedSubscriberId = subscriberId;
|
|
117
117
|
if (typeof localStorage !== "undefined") resolvedClientId = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || void 0;
|
|
118
118
|
try {
|
|
119
|
-
const initCp = await import("./init-control-plane-
|
|
119
|
+
const initCp = await import("./init-control-plane-D-41Fm5q.js");
|
|
120
120
|
if (!resolvedClientId && typeof initCp.getOrCreateControlPlaneClientId === "function") resolvedClientId = initCp.getOrCreateControlPlaneClientId();
|
|
121
121
|
if (typeof initCp.detectDeviceLabel === "function") resolvedDeviceLabel = initCp.detectDeviceLabel();
|
|
122
122
|
} catch (_) {}
|
|
@@ -163,4 +163,4 @@ async function getCurrentSubscription() {
|
|
|
163
163
|
|
|
164
164
|
//#endregion
|
|
165
165
|
export { syncExistingPushSubscription as a, subscribeToPush as i, getPushFetchOptions as n, unsubscribeFromPush as o, getPushUrl as r, getOrCreateSubscriberId as s, getCurrentSubscription as t };
|
|
166
|
-
//# sourceMappingURL=push-client-
|
|
166
|
+
//# sourceMappingURL=push-client-CQtCFDaD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-client-MybDfOdi.js","names":[],"sources":["../../src/db/get-or-create-subscriber-id.ts","../../src/subsystems/notifications/push-client.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"./get-config.js\";\nimport { setConfig } from \"./set-config.js\";\n\nimport type { ShadowClawDatabase } from \"./types.js\";\n\nfunction createSubscriberId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n\n return `sub-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * Get the persisted per-browser subscriber ID, creating one on first use.\n */\nexport async function getOrCreateSubscriberId(\n db: ShadowClawDatabase,\n): Promise<string> {\n if (!db) {\n return createSubscriberId();\n }\n\n const existing = await getConfig(db, CONFIG_KEYS.SUBSCRIBER_ID);\n if (typeof existing === \"string\" && existing.trim().length > 0) {\n return existing;\n }\n\n const created = createSubscriberId();\n await setConfig(db, CONFIG_KEYS.SUBSCRIBER_ID, created);\n\n return created;\n}\n","/**\n * Client-side Web Push subscription management.\n * Runs in the browser — communicates with the server's push routes.\n */\n\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/get-config.js\";\nimport { getOrCreateSubscriberId } from \"../../db/get-or-create-subscriber-id.js\";\n\n/**\n * Resolve a push route URL, optionally using a configured proxy.\n */\nexport async function getPushUrl(path: string): Promise<string> {\n const db = await getDb();\n let proxyUrl = await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL);\n\n if (!proxyUrl && typeof localStorage !== \"undefined\") {\n try {\n proxyUrl = localStorage.getItem(CONFIG_KEYS.PUSH_PROXY_URL) || undefined;\n } catch (_) {}\n }\n\n if (!proxyUrl) {\n return path;\n }\n\n // Ensure path starts with /\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n // Ensure proxyUrl doesn't end with /\n const normalizedProxy = proxyUrl.endsWith(\"/\")\n ? proxyUrl.slice(0, -1)\n : proxyUrl;\n\n return `${normalizedProxy}${normalizedPath}`;\n}\n\nexport function getPushFetchOptions(\n url: string,\n baseOptions: RequestInit = {},\n): RequestInit {\n const opts: any = { ...baseOptions };\n try {\n const locOrigin =\n typeof location !== \"undefined\"\n ? location.origin\n : \"http://127.0.0.1:8888\";\n const u = new URL(url, locOrigin);\n const host = u.hostname.toLowerCase();\n if (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\"\n ) {\n opts.targetAddressSpace = \"loopback\";\n } else if (\n /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(host) ||\n !host.includes(\".\") ||\n host.endsWith(\".local\") ||\n host.endsWith(\".lan\") ||\n host.endsWith(\".home\") ||\n host.endsWith(\".internal\")\n ) {\n opts.targetAddressSpace = \"private\";\n }\n } catch (_) {}\n return opts;\n}\n\n/**\n * Convert a URL-safe base64 string to a Uint8Array.\n * Required for PushManager.subscribe() applicationServerKey.\n */\nexport function urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = \"=\".repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const rawData = atob(base64);\n\n return Uint8Array.from([...rawData].map((c) => c.charCodeAt(0)));\n}\n\n/**\n * Fetch the VAPID public key from the server.\n */\nexport async function getVapidPublicKey(): Promise<string> {\n const url = await getPushUrl(\"/push/vapid-public-key\");\n const res = await fetch(url, getPushFetchOptions(url));\n const data = await res.json();\n\n return data.publicKey;\n}\n\n/**\n * Subscribe to push notifications.\n * Requests permission, creates a push subscription, and sends it to the server.\n */\nexport async function subscribeToPush(\n clientId?: string,\n deviceLabel?: string,\n subscriberId?: string,\n): Promise<PushSubscription> {\n const registration = await navigator.serviceWorker.ready;\n const publicKey = await getVapidPublicKey();\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicKey) as any,\n });\n\n let resolvedClientId =\n clientId ||\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined\n : undefined);\n\n let resolvedDeviceLabel = deviceLabel;\n let resolvedSubscriberId = subscriberId;\n\n if (!resolvedClientId || !resolvedDeviceLabel) {\n try {\n const initCp = await import(\"../../core/utils/init-control-plane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (\n !resolvedDeviceLabel &&\n typeof initCp.detectDeviceLabel === \"function\"\n ) {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n }\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof subscription.toJSON === \"function\"\n ? subscription.toJSON()\n : JSON.parse(JSON.stringify(subscription));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId ? { subscriberId: resolvedSubscriberId } : {}),\n }),\n }),\n );\n\n return subscription;\n}\n\n/**\n * Re-register an existing push subscription with the server if one exists,\n * ensuring clientId, deviceLabel, and subscriberId are up-to-date.\n */\nexport async function syncExistingPushSubscription(\n subscriberId?: string,\n): Promise<void> {\n if (typeof navigator === \"undefined\" || !navigator.serviceWorker) {\n return;\n }\n try {\n const reg = await navigator.serviceWorker.ready;\n const sub = await reg.pushManager.getSubscription();\n if (!sub) {\n return;\n }\n\n let resolvedClientId: string | undefined;\n let resolvedDeviceLabel: string | undefined;\n let resolvedSubscriberId = subscriberId;\n\n if (typeof localStorage !== \"undefined\") {\n resolvedClientId =\n localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined;\n }\n\n try {\n const initCp = await import(\"../../core/utils/init-control-plane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (typeof initCp.detectDeviceLabel === \"function\") {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof sub.toJSON === \"function\"\n ? sub.toJSON()\n : JSON.parse(JSON.stringify(sub));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId\n ? { subscriberId: resolvedSubscriberId }\n : {}),\n }),\n }),\n );\n } catch (_) {\n // Non-fatal if server is unreachable\n }\n}\n\n/**\n * Unsubscribe from push notifications.\n * Removes the push subscription locally and notifies the server.\n */\nexport async function unsubscribeFromPush(): Promise<void> {\n const registration = await navigator.serviceWorker.ready;\n const subscription = await registration.pushManager.getSubscription();\n\n if (!subscription) {\n return;\n }\n\n const { endpoint } = subscription;\n await subscription.unsubscribe();\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ endpoint }),\n }),\n );\n}\n\n/**\n * Get the current push subscription (or null if not subscribed).\n */\nexport async function getCurrentSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.ready;\n\n return registration.pushManager.getSubscription();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"push-client-CQtCFDaD.js","names":[],"sources":["../../src/db/get-or-create-subscriber-id.ts","../../src/subsystems/notifications/push-client.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"./get-config.js\";\nimport { setConfig } from \"./set-config.js\";\n\nimport type { ShadowClawDatabase } from \"./types.js\";\n\nfunction createSubscriberId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n\n return `sub-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * Get the persisted per-browser subscriber ID, creating one on first use.\n */\nexport async function getOrCreateSubscriberId(\n db: ShadowClawDatabase,\n): Promise<string> {\n if (!db) {\n return createSubscriberId();\n }\n\n const existing = await getConfig(db, CONFIG_KEYS.SUBSCRIBER_ID);\n if (typeof existing === \"string\" && existing.trim().length > 0) {\n return existing;\n }\n\n const created = createSubscriberId();\n await setConfig(db, CONFIG_KEYS.SUBSCRIBER_ID, created);\n\n return created;\n}\n","/**\n * Client-side Web Push subscription management.\n * Runs in the browser — communicates with the server's push routes.\n */\n\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/get-config.js\";\nimport { getOrCreateSubscriberId } from \"../../db/get-or-create-subscriber-id.js\";\n\n/**\n * Resolve a push route URL, optionally using a configured proxy.\n */\nexport async function getPushUrl(path: string): Promise<string> {\n const db = await getDb();\n let proxyUrl = await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL);\n\n if (!proxyUrl && typeof localStorage !== \"undefined\") {\n try {\n proxyUrl = localStorage.getItem(CONFIG_KEYS.PUSH_PROXY_URL) || undefined;\n } catch (_) {}\n }\n\n if (!proxyUrl) {\n return path;\n }\n\n // Ensure path starts with /\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n // Ensure proxyUrl doesn't end with /\n const normalizedProxy = proxyUrl.endsWith(\"/\")\n ? proxyUrl.slice(0, -1)\n : proxyUrl;\n\n return `${normalizedProxy}${normalizedPath}`;\n}\n\nexport function getPushFetchOptions(\n url: string,\n baseOptions: RequestInit = {},\n): RequestInit {\n const opts: any = { ...baseOptions };\n try {\n const locOrigin =\n typeof location !== \"undefined\"\n ? location.origin\n : \"http://127.0.0.1:8888\";\n const u = new URL(url, locOrigin);\n const host = u.hostname.toLowerCase();\n if (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\"\n ) {\n opts.targetAddressSpace = \"loopback\";\n } else if (\n /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(host) ||\n !host.includes(\".\") ||\n host.endsWith(\".local\") ||\n host.endsWith(\".lan\") ||\n host.endsWith(\".home\") ||\n host.endsWith(\".internal\")\n ) {\n opts.targetAddressSpace = \"private\";\n }\n } catch (_) {}\n return opts;\n}\n\n/**\n * Convert a URL-safe base64 string to a Uint8Array.\n * Required for PushManager.subscribe() applicationServerKey.\n */\nexport function urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = \"=\".repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const rawData = atob(base64);\n\n return Uint8Array.from([...rawData].map((c) => c.charCodeAt(0)));\n}\n\n/**\n * Fetch the VAPID public key from the server.\n */\nexport async function getVapidPublicKey(): Promise<string> {\n const url = await getPushUrl(\"/push/vapid-public-key\");\n const res = await fetch(url, getPushFetchOptions(url));\n const data = await res.json();\n\n return data.publicKey;\n}\n\n/**\n * Subscribe to push notifications.\n * Requests permission, creates a push subscription, and sends it to the server.\n */\nexport async function subscribeToPush(\n clientId?: string,\n deviceLabel?: string,\n subscriberId?: string,\n): Promise<PushSubscription> {\n const registration = await navigator.serviceWorker.ready;\n const publicKey = await getVapidPublicKey();\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicKey) as any,\n });\n\n let resolvedClientId =\n clientId ||\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined\n : undefined);\n\n let resolvedDeviceLabel = deviceLabel;\n let resolvedSubscriberId = subscriberId;\n\n if (!resolvedClientId || !resolvedDeviceLabel) {\n try {\n const initCp = await import(\"../../core/utils/init-control-plane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (\n !resolvedDeviceLabel &&\n typeof initCp.detectDeviceLabel === \"function\"\n ) {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n }\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof subscription.toJSON === \"function\"\n ? subscription.toJSON()\n : JSON.parse(JSON.stringify(subscription));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId ? { subscriberId: resolvedSubscriberId } : {}),\n }),\n }),\n );\n\n return subscription;\n}\n\n/**\n * Re-register an existing push subscription with the server if one exists,\n * ensuring clientId, deviceLabel, and subscriberId are up-to-date.\n */\nexport async function syncExistingPushSubscription(\n subscriberId?: string,\n): Promise<void> {\n if (typeof navigator === \"undefined\" || !navigator.serviceWorker) {\n return;\n }\n try {\n const reg = await navigator.serviceWorker.ready;\n const sub = await reg.pushManager.getSubscription();\n if (!sub) {\n return;\n }\n\n let resolvedClientId: string | undefined;\n let resolvedDeviceLabel: string | undefined;\n let resolvedSubscriberId = subscriberId;\n\n if (typeof localStorage !== \"undefined\") {\n resolvedClientId =\n localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined;\n }\n\n try {\n const initCp = await import(\"../../core/utils/init-control-plane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (typeof initCp.detectDeviceLabel === \"function\") {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof sub.toJSON === \"function\"\n ? sub.toJSON()\n : JSON.parse(JSON.stringify(sub));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId\n ? { subscriberId: resolvedSubscriberId }\n : {}),\n }),\n }),\n );\n } catch (_) {\n // Non-fatal if server is unreachable\n }\n}\n\n/**\n * Unsubscribe from push notifications.\n * Removes the push subscription locally and notifies the server.\n */\nexport async function unsubscribeFromPush(): Promise<void> {\n const registration = await navigator.serviceWorker.ready;\n const subscription = await registration.pushManager.getSubscription();\n\n if (!subscription) {\n return;\n }\n\n const { endpoint } = subscription;\n await subscription.unsubscribe();\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ endpoint }),\n }),\n );\n}\n\n/**\n * Get the current push subscription (or null if not subscribed).\n */\nexport async function getCurrentSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.ready;\n\n return registration.pushManager.getSubscription();\n}\n"],"mappings":";;;;;;AAMA,SAAS,qBAA6B;CACpC,IACE,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,YAE7B,OAAO,OAAO,WAAW;CAG3B,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;AAC7E;;;;AAKA,eAAsB,wBACpB,IACiB;CACjB,IAAI,CAAC,IACH,OAAO,mBAAmB;CAG5B,MAAM,WAAW,MAAM,UAAU,IAAI,YAAY,aAAa;CAC9D,IAAI,OAAO,aAAa,YAAY,SAAS,KAAK,CAAC,CAAC,SAAS,GAC3D,OAAO;CAGT,MAAM,UAAU,mBAAmB;CACnC,MAAM,UAAU,IAAI,YAAY,eAAe,OAAO;CAEtD,OAAO;AACT;;;;;;;;;;;ACvBA,eAAsB,WAAW,MAA+B;CAC9D,MAAM,KAAK,MAAM,MAAM;CACvB,IAAI,WAAW,MAAM,UAAU,IAAI,YAAY,cAAc;CAE7D,IAAI,CAAC,YAAY,OAAO,iBAAiB,aACvC,IAAI;EACF,WAAW,aAAa,QAAQ,YAAY,cAAc,KAAK;CACjE,SAAS,GAAG,CAAC;CAGf,IAAI,CAAC,UACH,OAAO;CAIT,MAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI;CAMzD,OAAO,GAJiB,SAAS,SAAS,GAAG,IACzC,SAAS,MAAM,GAAG,EAAE,IACpB,WAEwB;AAC9B;AAEA,SAAgB,oBACd,KACA,cAA2B,CAAC,GACf;CACb,MAAM,OAAY,EAAE,GAAG,YAAY;CACnC,IAAI;EACF,MAAM,YACJ,OAAO,aAAa,cAChB,SAAS,SACT;EAEN,MAAM,OAAO,IADC,IAAI,KAAK,SACV,CAAC,CAAC,SAAS,YAAY;EACpC,IACE,SAAS,eACT,SAAS,eACT,SAAS,SACT,SAAS,SAET,KAAK,qBAAqB;OACrB,IACL,+CAA+C,KAAK,IAAI,KACxD,CAAC,KAAK,SAAS,GAAG,KAClB,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,MAAM,KACpB,KAAK,SAAS,OAAO,KACrB,KAAK,SAAS,WAAW,GAEzB,KAAK,qBAAqB;CAE9B,SAAS,GAAG,CAAC;CACb,OAAO;AACT;;;;;AAMA,SAAgB,sBAAsB,cAAkC;CAEtE,MAAM,UAAU,eADA,IAAI,QAAQ,IAAK,aAAa,SAAS,KAAM,CACxB,EAAC,CAAE,QAAQ,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,GAAG;CAC5E,MAAM,UAAU,KAAK,MAAM;CAE3B,OAAO,WAAW,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AACjE;;;;AAKA,eAAsB,oBAAqC;CACzD,MAAM,MAAM,MAAM,WAAW,wBAAwB;CAIrD,QAAO,OAFY,MADD,MAAM,KAAK,oBAAoB,GAAG,CAAC,EAC/B,CAAC,KAAK,EAEjB,CAAC;AACd;;;;;AAMA,eAAsB,gBACpB,UACA,aACA,cAC2B;CAC3B,MAAM,eAAe,MAAM,UAAU,cAAc;CACnD,MAAM,YAAY,MAAM,kBAAkB;CAE1C,MAAM,eAAe,MAAM,aAAa,YAAY,UAAU;EAC5D,iBAAiB;EACjB,sBAAsB,sBAAsB,SAAS;CACvD,CAAC;CAED,IAAI,mBACF,aACC,OAAO,iBAAiB,cACrB,aAAa,QAAQ,YAAY,uBAAuB,KAAK,SAC7D;CAEN,IAAI,sBAAsB;CAC1B,IAAI,uBAAuB;CAE3B,IAAI,CAAC,oBAAoB,CAAC,qBACxB,IAAI;EACF,MAAM,SAAS,MAAM,OAAO;EAC5B,IACE,CAAC,oBACD,OAAO,OAAO,oCAAoC,YAElD,mBAAmB,OAAO,gCAAgC;EAE5D,IACE,CAAC,uBACD,OAAO,OAAO,sBAAsB,YAEpC,sBAAsB,OAAO,kBAAkB;CAEnD,SAAS,GAAG,CAAC;CAGf,IAAI,CAAC,sBACH,IAAI;EACF,MAAM,KAAK,MAAM,QAAQ,KAAK,CAC5B,MAAM,GACN,IAAI,SAAe,YAAY,iBAAiB,QAAQ,IAAI,GAAG,GAAG,CAAC,CACrE,CAAC;EACD,IAAI,IACF,uBAAuB,MAAM,wBAAwB,EAAE;CAE3D,SAAS,GAAG,CAAC;CAGf,MAAM,UACJ,OAAO,aAAa,WAAW,aAC3B,aAAa,OAAO,IACpB,KAAK,MAAM,KAAK,UAAU,YAAY,CAAC;CAE7C,MAAM,MAAM,MAAM,WAAW,iBAAiB;CAC9C,MAAM,MACJ,KACA,oBAAoB,KAAK;EACvB,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU;GACnB,GAAG;GACH,GAAI,mBAAmB,EAAE,UAAU,iBAAiB,IAAI,CAAC;GACzD,GAAI,sBAAsB,EAAE,aAAa,oBAAoB,IAAI,CAAC;GAClE,GAAI,uBAAuB,EAAE,cAAc,qBAAqB,IAAI,CAAC;EACvE,CAAC;CACH,CAAC,CACH;CAEA,OAAO;AACT;;;;;AAMA,eAAsB,6BACpB,cACe;CACf,IAAI,OAAO,cAAc,eAAe,CAAC,UAAU,eACjD;CAEF,IAAI;EAEF,MAAM,MAAM,OAAM,MADA,UAAU,cAAc,MACrB,CAAC,YAAY,gBAAgB;EAClD,IAAI,CAAC,KACH;EAGF,IAAI;EACJ,IAAI;EACJ,IAAI,uBAAuB;EAE3B,IAAI,OAAO,iBAAiB,aAC1B,mBACE,aAAa,QAAQ,YAAY,uBAAuB,KAAK;EAGjE,IAAI;GACF,MAAM,SAAS,MAAM,OAAO;GAC5B,IACE,CAAC,oBACD,OAAO,OAAO,oCAAoC,YAElD,mBAAmB,OAAO,gCAAgC;GAE5D,IAAI,OAAO,OAAO,sBAAsB,YACtC,sBAAsB,OAAO,kBAAkB;EAEnD,SAAS,GAAG,CAAC;EAEb,IAAI,CAAC,sBACH,IAAI;GACF,MAAM,KAAK,MAAM,QAAQ,KAAK,CAC5B,MAAM,GACN,IAAI,SAAe,YAAY,iBAAiB,QAAQ,IAAI,GAAG,GAAG,CAAC,CACrE,CAAC;GACD,IAAI,IACF,uBAAuB,MAAM,wBAAwB,EAAE;EAE3D,SAAS,GAAG,CAAC;EAGf,MAAM,UACJ,OAAO,IAAI,WAAW,aAClB,IAAI,OAAO,IACX,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;EAEpC,MAAM,MAAM,MAAM,WAAW,iBAAiB;EAC9C,MAAM,MACJ,KACA,oBAAoB,KAAK;GACvB,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,MAAM,KAAK,UAAU;IACnB,GAAG;IACH,GAAI,mBAAmB,EAAE,UAAU,iBAAiB,IAAI,CAAC;IACzD,GAAI,sBAAsB,EAAE,aAAa,oBAAoB,IAAI,CAAC;IAClE,GAAI,uBACA,EAAE,cAAc,qBAAqB,IACrC,CAAC;GACP,CAAC;EACH,CAAC,CACH;CACF,SAAS,GAAG,CAEZ;AACF;;;;;AAMA,eAAsB,sBAAqC;CAEzD,MAAM,eAAe,OAAM,MADA,UAAU,cAAc,MACZ,CAAC,YAAY,gBAAgB;CAEpE,IAAI,CAAC,cACH;CAGF,MAAM,EAAE,aAAa;CACrB,MAAM,aAAa,YAAY;CAE/B,MAAM,MAAM,MAAM,WAAW,iBAAiB;CAC9C,MAAM,MACJ,KACA,oBAAoB,KAAK;EACvB,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;CACnC,CAAC,CACH;AACF;;;;AAKA,eAAsB,yBAA2D;CAG/E,QAAO,MAFoB,UAAU,cAAc,MAEhC,CAAC,YAAY,gBAAgB;AAClD"}
|
|
@@ -46,15 +46,19 @@ export declare function configureCustomElementSecurity(config: {
|
|
|
46
46
|
}): void;
|
|
47
47
|
export interface CustomElementScriptDescriptor {
|
|
48
48
|
src: string;
|
|
49
|
+
id?: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
global?: boolean;
|
|
52
|
+
autoload?: boolean;
|
|
53
|
+
type?: string;
|
|
54
|
+
async?: boolean;
|
|
55
|
+
defer?: boolean;
|
|
49
56
|
hasInit: boolean;
|
|
50
57
|
}
|
|
51
58
|
/**
|
|
52
59
|
* Set approved custom element scripts in memory.
|
|
53
60
|
*/
|
|
54
|
-
export declare function setApprovedCustomElementScripts(scripts: Array<string |
|
|
55
|
-
src: string;
|
|
56
|
-
hasInit?: boolean;
|
|
57
|
-
}>): void;
|
|
61
|
+
export declare function setApprovedCustomElementScripts(scripts: Array<string | Partial<CustomElementScriptDescriptor> | any>): void;
|
|
58
62
|
/**
|
|
59
63
|
* Retrieve approved custom element script descriptors from memory or embedded site config.
|
|
60
64
|
*/
|
|
@@ -4,10 +4,10 @@ import { t as Signal } from "./dist-Bxg3C_zy.js";
|
|
|
4
4
|
import { o as DEFAULT_GROUP_ID, r as CONFIG_KEYS } from "./config-Dalol4GN.js";
|
|
5
5
|
import { a as getAppBasePath, d as parseRouteFromUrlAsync, h as resolveRouteToPrettyPathAsync, l as isPossibleAppRoute, m as resolveDefaultPinnedPageRef, n as applyBasePath, r as buildRoutePath } from "./app-routes-Br7pz8gL.js";
|
|
6
6
|
import { t as getConfig } from "./get-config-DNjQ4Qoj.js";
|
|
7
|
-
import { a as writeGroupFile } from "./tools-
|
|
8
|
-
import { t as fileViewerStore } from "./file-viewer-
|
|
7
|
+
import { a as writeGroupFile } from "./tools-CP6G0HF7.js";
|
|
8
|
+
import { t as fileViewerStore } from "./file-viewer-DBc5dxNy.js";
|
|
9
9
|
import { yieldToMain } from "./utils/delay.js";
|
|
10
|
-
import { I as joinRoomViaLink, S as answerUserPrompt, Wt as writeGroupFileBytes, at as buildTransformersJsHelpDialogOptions, gt as getPeerJsConfig, r as getSiteConfigDefaultPinnedPage, st as buildLlamafileHelpDialogOptions, t as orchestratorStore, un as buildProviderHelpDialogOptions, yt as setChannelEnabled } from "./orchestrator-
|
|
10
|
+
import { I as joinRoomViaLink, S as answerUserPrompt, Wt as writeGroupFileBytes, at as buildTransformersJsHelpDialogOptions, gt as getPeerJsConfig, r as getSiteConfigDefaultPinnedPage, st as buildLlamafileHelpDialogOptions, t as orchestratorStore, un as buildProviderHelpDialogOptions, yt as setChannelEnabled } from "./orchestrator-Cda13e5U.js";
|
|
11
11
|
import { t as setConfig } from "./set-config-CCrA9aKc.js";
|
|
12
12
|
import { ulid } from "./utils/ulid.js";
|
|
13
13
|
import { isTruthyConfigValue } from "./utils/parse-boolean-config.js";
|
|
@@ -15,7 +15,7 @@ import { a as showSuccess, r as showError } from "./toast-Ck7OIKDf.js";
|
|
|
15
15
|
import { getNamespacedItem, getNamespacedStorageKey, setNamespacedItem } from "./utils/namespaced-storage.js";
|
|
16
16
|
import { n as MAX_SIDEBAR_WIDTH_PX, r as MIN_SIDEBAR_WIDTH_PX, t as DEFAULT_SIDEBAR_WIDTH_PX } from "./constants-BxxDX8j_.js";
|
|
17
17
|
import { t as buildPromptApiHelpDialogOptions } from "./prompt-api-vf351sf2.js";
|
|
18
|
-
import { t as configurePeerJs } from "./configure-peer-js-
|
|
18
|
+
import { t as configurePeerJs } from "./configure-peer-js-C9554Slv.js";
|
|
19
19
|
import { t as effect } from "./effect-DL6j9HJp.js";
|
|
20
20
|
|
|
21
21
|
//#region src/stores/theme.ts
|
|
@@ -436,19 +436,92 @@ function syncSlottedSidebarActiveLinks(host, currentUrl) {
|
|
|
436
436
|
}
|
|
437
437
|
/**
|
|
438
438
|
* Sets up listeners so slotted sidebar active links stay in sync whenever
|
|
439
|
-
* the URL changes (popstate, Navigation API navigate, or
|
|
439
|
+
* the URL changes (popstate, Navigation API navigate, replaceState, or feed scroll events).
|
|
440
440
|
* Returns a cleanup function to remove the listeners.
|
|
441
441
|
*/
|
|
442
442
|
function setupSlottedSidebarActiveLinks(host) {
|
|
443
443
|
if (!host || typeof window === "undefined") return () => {};
|
|
444
|
-
const sync = () => syncSlottedSidebarActiveLinks(host);
|
|
444
|
+
const sync = (targetUrl) => syncSlottedSidebarActiveLinks(host, targetUrl);
|
|
445
445
|
sync();
|
|
446
|
-
|
|
446
|
+
const handlePopstate = () => sync();
|
|
447
|
+
window.addEventListener("popstate", handlePopstate, { passive: true });
|
|
448
|
+
const handleCustomFeedScroll = (ev) => {
|
|
449
|
+
const detailUrl = ev?.detail?.url;
|
|
450
|
+
if (detailUrl) try {
|
|
451
|
+
sync(new URL(detailUrl, window.location.href));
|
|
452
|
+
return;
|
|
453
|
+
} catch {}
|
|
454
|
+
sync();
|
|
455
|
+
};
|
|
456
|
+
window.addEventListener("shadow-claw-feed-scroll", handleCustomFeedScroll);
|
|
457
|
+
window.addEventListener("shadow-claw-url-change", handleCustomFeedScroll);
|
|
447
458
|
const nav = window.navigation;
|
|
448
|
-
|
|
459
|
+
let handleNavigate = null;
|
|
460
|
+
let handleCurrentEntryChange = null;
|
|
461
|
+
let handleNavigateSuccess = null;
|
|
462
|
+
if (nav && typeof nav.addEventListener === "function") {
|
|
463
|
+
handleNavigate = (ev) => {
|
|
464
|
+
const destUrl = ev?.destination?.url;
|
|
465
|
+
if (destUrl) try {
|
|
466
|
+
sync(new URL(destUrl));
|
|
467
|
+
return;
|
|
468
|
+
} catch {}
|
|
469
|
+
sync();
|
|
470
|
+
};
|
|
471
|
+
handleCurrentEntryChange = () => {
|
|
472
|
+
sync();
|
|
473
|
+
};
|
|
474
|
+
handleNavigateSuccess = () => {
|
|
475
|
+
sync();
|
|
476
|
+
};
|
|
477
|
+
nav.addEventListener("navigate", handleNavigate, { passive: true });
|
|
478
|
+
nav.addEventListener("currententrychange", handleCurrentEntryChange, { passive: true });
|
|
479
|
+
nav.addEventListener("navigatesuccess", handleNavigateSuccess, { passive: true });
|
|
480
|
+
}
|
|
481
|
+
let origReplaceState = null;
|
|
482
|
+
let origPushState = null;
|
|
483
|
+
const historyObj = typeof window !== "undefined" ? window.history : null;
|
|
484
|
+
let unhookHistory = null;
|
|
485
|
+
if (historyObj) {
|
|
486
|
+
origReplaceState = historyObj.replaceState;
|
|
487
|
+
origPushState = historyObj.pushState;
|
|
488
|
+
const wrappedReplaceState = function(_data, _unused, url) {
|
|
489
|
+
const res = origReplaceState?.apply(this, arguments);
|
|
490
|
+
try {
|
|
491
|
+
if (url) sync(new URL(url.toString(), window.location.href));
|
|
492
|
+
else sync();
|
|
493
|
+
} catch {
|
|
494
|
+
sync();
|
|
495
|
+
}
|
|
496
|
+
return res;
|
|
497
|
+
};
|
|
498
|
+
const wrappedPushState = function(_data, _unused, url) {
|
|
499
|
+
const res = origPushState?.apply(this, arguments);
|
|
500
|
+
try {
|
|
501
|
+
if (url) sync(new URL(url.toString(), window.location.href));
|
|
502
|
+
else sync();
|
|
503
|
+
} catch {
|
|
504
|
+
sync();
|
|
505
|
+
}
|
|
506
|
+
return res;
|
|
507
|
+
};
|
|
508
|
+
historyObj.replaceState = wrappedReplaceState;
|
|
509
|
+
historyObj.pushState = wrappedPushState;
|
|
510
|
+
unhookHistory = () => {
|
|
511
|
+
if (historyObj.replaceState === wrappedReplaceState && origReplaceState) historyObj.replaceState = origReplaceState;
|
|
512
|
+
if (historyObj.pushState === wrappedPushState && origPushState) historyObj.pushState = origPushState;
|
|
513
|
+
};
|
|
514
|
+
}
|
|
449
515
|
return () => {
|
|
450
|
-
window.removeEventListener("popstate",
|
|
451
|
-
|
|
516
|
+
window.removeEventListener("popstate", handlePopstate);
|
|
517
|
+
window.removeEventListener("shadow-claw-feed-scroll", handleCustomFeedScroll);
|
|
518
|
+
window.removeEventListener("shadow-claw-url-change", handleCustomFeedScroll);
|
|
519
|
+
if (nav && typeof nav.removeEventListener === "function") {
|
|
520
|
+
if (handleNavigate) nav.removeEventListener("navigate", handleNavigate);
|
|
521
|
+
if (handleCurrentEntryChange) nav.removeEventListener("currententrychange", handleCurrentEntryChange);
|
|
522
|
+
if (handleNavigateSuccess) nav.removeEventListener("navigatesuccess", handleNavigateSuccess);
|
|
523
|
+
}
|
|
524
|
+
if (unhookHistory) unhookHistory();
|
|
452
525
|
};
|
|
453
526
|
}
|
|
454
527
|
|
|
@@ -552,6 +625,31 @@ async function applyRouteFromCurrentLocation(shadow, shadowClaw, db, fStore, oSt
|
|
|
552
625
|
await applyRoute(shadow, shadowClaw, db, fStore, oStore, parsed);
|
|
553
626
|
}
|
|
554
627
|
|
|
628
|
+
//#endregion
|
|
629
|
+
//#region src/components/shadow-claw/utils/get-route.ts
|
|
630
|
+
let lastHistoryReplaceState = null;
|
|
631
|
+
function recordHistoryReplaceState(state) {
|
|
632
|
+
lastHistoryReplaceState = state;
|
|
633
|
+
}
|
|
634
|
+
function getRoute(db, ev) {
|
|
635
|
+
if (!db) return;
|
|
636
|
+
const navigateEvent = ev;
|
|
637
|
+
if (navigateEvent.navigationType === "reload") return;
|
|
638
|
+
const destinationState = typeof navigateEvent?.destination?.getState === "function" ? navigateEvent.destination.getState() : null;
|
|
639
|
+
const recordedState = navigateEvent.navigationType === "replace" ? lastHistoryReplaceState : null;
|
|
640
|
+
const navState = destinationState || navigateEvent?.info || recordedState || (navigateEvent.navigationType === "replace" && typeof history !== "undefined" ? history.state : null);
|
|
641
|
+
if (navState?.inFeedScroll || navState?.scrollSpy || navState?.suppressRouter) return;
|
|
642
|
+
const destinationUrl = navigateEvent?.destination?.url;
|
|
643
|
+
if (typeof destinationUrl !== "string") return;
|
|
644
|
+
const parsedUrl = new URL(destinationUrl);
|
|
645
|
+
if (parsedUrl.origin !== window.location.origin) return;
|
|
646
|
+
if (!isPossibleAppRoute(parsedUrl.pathname)) return;
|
|
647
|
+
return {
|
|
648
|
+
parsedUrl,
|
|
649
|
+
navigateEvent
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
|
|
555
653
|
//#endregion
|
|
556
654
|
//#region src/components/shadow-claw/utils/clamp-sidebar-width.ts
|
|
557
655
|
function clampSidebarWidth(shadow, px) {
|
|
@@ -1123,6 +1221,14 @@ function bindEventListeners(win, doc, shadow, shadowClaw, db, oStore, fStore, tS
|
|
|
1123
1221
|
});
|
|
1124
1222
|
doc.addEventListener("shadow-claw-navigate", shadowClaw.shadowClawNav);
|
|
1125
1223
|
if (supportsNavigationApi()) {
|
|
1224
|
+
if (win.history && !win.history.__scReplaceStateTracked) {
|
|
1225
|
+
const origReplaceState = win.history.replaceState;
|
|
1226
|
+
win.history.replaceState = function(data, unused, url) {
|
|
1227
|
+
recordHistoryReplaceState(data);
|
|
1228
|
+
return origReplaceState.call(this, data, unused, url);
|
|
1229
|
+
};
|
|
1230
|
+
win.history.__scReplaceStateTracked = true;
|
|
1231
|
+
}
|
|
1126
1232
|
win.navigation.addEventListener("navigate", shadowClaw.handleNavigationApiNavigate);
|
|
1127
1233
|
shadowClaw.navigationListenerAttached = true;
|
|
1128
1234
|
} else {
|
|
@@ -1181,25 +1287,6 @@ function clearBootPendingClass(doc) {
|
|
|
1181
1287
|
host?.removeAttribute(HYDRATION_PENDING_ATTR);
|
|
1182
1288
|
}
|
|
1183
1289
|
|
|
1184
|
-
//#endregion
|
|
1185
|
-
//#region src/components/shadow-claw/utils/get-route.ts
|
|
1186
|
-
function getRoute(db, ev) {
|
|
1187
|
-
if (!db) return;
|
|
1188
|
-
const navigateEvent = ev;
|
|
1189
|
-
if (navigateEvent.navigationType === "reload") return;
|
|
1190
|
-
const navState = (typeof navigateEvent?.destination?.getState === "function" ? navigateEvent.destination.getState() : null) || (navigateEvent.navigationType === "replace" && typeof history !== "undefined" ? history.state : null);
|
|
1191
|
-
if (navState?.inFeedScroll || navState?.scrollSpy || navState?.suppressRouter) return;
|
|
1192
|
-
const destinationUrl = navigateEvent?.destination?.url;
|
|
1193
|
-
if (typeof destinationUrl !== "string") return;
|
|
1194
|
-
const parsedUrl = new URL(destinationUrl);
|
|
1195
|
-
if (parsedUrl.origin !== window.location.origin) return;
|
|
1196
|
-
if (!isPossibleAppRoute(parsedUrl.pathname)) return;
|
|
1197
|
-
return {
|
|
1198
|
-
parsedUrl,
|
|
1199
|
-
navigateEvent
|
|
1200
|
-
};
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
1290
|
//#endregion
|
|
1204
1291
|
//#region src/components/shadow-claw/utils/get-target-path.ts
|
|
1205
1292
|
function getTargetPath(loc, ev) {
|
|
@@ -2242,6 +2329,18 @@ shadow-claw-conversations {
|
|
|
2242
2329
|
margin-top: 0.5rem;
|
|
2243
2330
|
}
|
|
2244
2331
|
|
|
2332
|
+
form:tool-form-active,
|
|
2333
|
+
.app-confirm-dialog__form:tool-form-active,
|
|
2334
|
+
.app-prompt-dialog__form:tool-form-active {
|
|
2335
|
+
outline: 2px dashed var(--shadow-claw-accent-primary, #3b82f6);
|
|
2336
|
+
outline-offset: 4px;
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2339
|
+
button:tool-submit-active {
|
|
2340
|
+
outline: 2px dashed var(--shadow-claw-warning, #f59e0b);
|
|
2341
|
+
outline-offset: 2px;
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2245
2344
|
.chat-page {
|
|
2246
2345
|
flex-direction: column;
|
|
2247
2346
|
}
|
|
@@ -2709,7 +2808,12 @@ const doc = new DOMParser().parseFromString(`<template>
|
|
|
2709
2808
|
dialog-class="app-dialog"
|
|
2710
2809
|
dialog-aria-labelledby="appDialogTitle"
|
|
2711
2810
|
>
|
|
2712
|
-
<form
|
|
2811
|
+
<form
|
|
2812
|
+
method="dialog"
|
|
2813
|
+
class="app-confirm-dialog__form"
|
|
2814
|
+
toolname="app_dialog_confirm"
|
|
2815
|
+
tooldescription="Confirm or cancel an application modal dialog prompt"
|
|
2816
|
+
>
|
|
2713
2817
|
<h2 id="appDialogTitle" class="app-dialog__title">Confirm</h2>
|
|
2714
2818
|
<p class="app-dialog__message"></p>
|
|
2715
2819
|
<ul class="app-dialog__details" hidden></ul>
|
|
@@ -2744,7 +2848,12 @@ const doc = new DOMParser().parseFromString(`<template>
|
|
|
2744
2848
|
dialog-class="app-dialog app-prompt-dialog"
|
|
2745
2849
|
dialog-aria-labelledby="appPromptTitle"
|
|
2746
2850
|
>
|
|
2747
|
-
<form
|
|
2851
|
+
<form
|
|
2852
|
+
method="dialog"
|
|
2853
|
+
class="app-prompt-dialog__form"
|
|
2854
|
+
toolname="app_dialog_prompt"
|
|
2855
|
+
tooldescription="Submit user response or selection to an interactive dialog prompt"
|
|
2856
|
+
>
|
|
2748
2857
|
<h2 id="appPromptTitle" class="app-prompt-dialog__title">
|
|
2749
2858
|
Agent Question
|
|
2750
2859
|
</h2>
|
|
@@ -2812,7 +2921,7 @@ var ShadowClaw = class extends ShadowClawElement {
|
|
|
2812
2921
|
if (!this.shadowRoot) throw new Error("shadowRoot not found");
|
|
2813
2922
|
await yieldToMain();
|
|
2814
2923
|
try {
|
|
2815
|
-
const { Orchestrator } = await import("./orchestrator-
|
|
2924
|
+
const { Orchestrator } = await import("./orchestrator-BEZcqgR5.js");
|
|
2816
2925
|
await yieldToMain();
|
|
2817
2926
|
const loadDeferredComponents = () => {
|
|
2818
2927
|
Promise.all([
|
|
@@ -2965,4 +3074,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
|
|
|
2965
3074
|
|
|
2966
3075
|
//#endregion
|
|
2967
3076
|
export { ShadowClaw as t };
|
|
2968
|
-
//# sourceMappingURL=shadow-claw-
|
|
3077
|
+
//# sourceMappingURL=shadow-claw-DYe9u6Tp.js.map
|