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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools-D7whby3H.js","names":["TOOL_NAME_PATTERN","matter"],"sources":["../../src/storage/read-group-file.ts","../../src/subsystems/tools/builtin-profiles.ts","../../src/subsystems/tools/declarative.ts","../../src/subsystems/tools/remote/discovery.ts","../../src/storage/write-file-handle.ts","../../src/storage/write-group-file.ts","../../src/storage/group-file-exists.ts","../../src/subsystems/skills/parse-skill.ts","../../src/subsystems/tools/remote/import-artifacts.ts","../../src/stores/tools.ts"],"sourcesContent":["import { getGroupDir } from \"./get-group-dir.js\";\nimport { parsePath } from \"./parse-path.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Read a file from a group's workspace.\n */\nexport async function readGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<string> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n // Re-acquire file handle and file object to force filesystem re-stat\n const fileHandle = await dir.getFileHandle(filename);\n\n try {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n const size = syncHandle.getSize();\n const buf = new Uint8Array(size);\n\n syncHandle.read(buf, { at: 0 });\n syncHandle.close();\n\n return new TextDecoder(\"utf-8\").decode(buf);\n } catch {\n // Not OPFS or not in a Worker — use File System Access API path\n const file = await fileHandle.getFile();\n\n return file.text();\n }\n}\n","import { ToolProfile } from \"./types.js\";\n\n/**\n * Built-in profile optimized for Gemini Nano (Prompt API).\n * Minimizes context consumption so Nano has maximum tokens for generation.\n */\nexport const DEFAULT_BUILTIN_PROFILE: ToolProfile = {\n id: \"__builtin_default\",\n name: \"Default\",\n providerId: \"prompt_api\",\n enabledToolNames: [\n \"javascript\",\n \"list_files\",\n \"open_file\",\n \"read_file\",\n \"write_file\",\n ],\n customTools: [],\n systemPromptOverride:\n \"You are a helpful coding assistant.\\n\" +\n \"Content intended to be rendered as a `Page` (HTML or Markdown) SHOULD include frontmatter (title, created, updated, and slug).\\n\" +\n \"HTML content intended to be rendered as a `Page` SHOULD USE `<article><h2>${subTitle}</h2>...</article>` for its main body content.\",\n};\n","import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../../config/config.js\";\nimport { getConfig } from \"../../db/get-config.js\";\nimport { getGroupDir } from \"../../storage/get-group-dir.js\";\nimport { readGroupFile } from \"../../storage/read-group-file.js\";\n\nimport type { ShadowClawDatabase } from \"../../db/types.js\";\nimport type {\n DeclarativeToolDefinition,\n DeclarativeToolExecution,\n ToolDefinition,\n} from \"./types.js\";\n\nexport type { DeclarativeToolDefinition };\n\nconst TOOL_NAME_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;\n\nexport function parseDeclarativeTool(\n path: string,\n value: unknown,\n): DeclarativeToolDefinition {\n if (!value || typeof value !== \"object\") {\n throw new Error(`Tool at ${path} must be a JSON object`);\n }\n\n const candidate = value as Record<string, unknown>;\n const name = typeof candidate.name === \"string\" ? candidate.name.trim() : \"\";\n const description =\n typeof candidate.description === \"string\"\n ? candidate.description.trim()\n : \"\";\n const inputSchema = candidate.input_schema ?? candidate.parameters;\n const execution = candidate.execution ?? candidate.evaluation;\n\n if (!TOOL_NAME_PATTERN.test(name)) {\n throw new Error(`Tool name is invalid: ${name || \"(missing)\"}`);\n }\n if (!description) {\n throw new Error(`Tool ${name} requires a description`);\n }\n if (!inputSchema || typeof inputSchema !== \"object\") {\n throw new Error(`Tool ${name} requires input_schema`);\n }\n if (!execution || typeof execution !== \"object\") {\n throw new Error(`Tool ${name} requires execution`);\n }\n\n const parsedExecution = execution as Record<string, unknown>;\n const type = parsedExecution.type;\n if (type !== \"bash\" && type !== \"javascript\" && type !== \"tool\") {\n throw new Error(\n `Tool ${name} execution type must be bash, javascript, or tool`,\n );\n }\n if (type === \"tool\") {\n if (\n typeof parsedExecution.name !== \"string\" ||\n !TOOL_NAME_PATTERN.test(parsedExecution.name)\n ) {\n throw new Error(`Tool ${name} execution requires a valid tool name`);\n }\n\n return {\n name,\n description,\n input_schema: inputSchema as ToolDefinition[\"input_schema\"],\n execution: {\n type,\n name: parsedExecution.name,\n ...(parsedExecution.input && typeof parsedExecution.input === \"object\"\n ? { input: parsedExecution.input as Record<string, unknown> }\n : {}),\n },\n path,\n };\n }\n const sourceKey = type === \"bash\" ? \"command\" : \"code\";\n const source = parsedExecution[sourceKey] ?? parsedExecution.expression;\n if (typeof source !== \"string\" || source.trim() === \"\") {\n throw new Error(`Tool ${name} execution requires ${sourceKey}`);\n }\n\n return {\n name,\n description,\n input_schema: inputSchema as ToolDefinition[\"input_schema\"],\n execution: {\n type,\n [sourceKey]: source,\n } as DeclarativeToolExecution,\n path,\n };\n}\n\nexport async function loadDeclarativeTools(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n): Promise<{ tools: DeclarativeToolDefinition[]; diagnostics: string[] }> {\n const tools: DeclarativeToolDefinition[] = [];\n const diagnostics: string[] = [];\n\n const groupIdsToScan =\n groupId === DEFAULT_GROUP_ID\n ? [DEFAULT_GROUP_ID]\n : [groupId, DEFAULT_GROUP_ID];\n\n for (const targetGroupId of groupIdsToScan) {\n try {\n const root = await getGroupDir(db, targetGroupId);\n const paths: string[] = [];\n\n async function visit(\n directory: FileSystemDirectoryHandle,\n relativePath: string,\n ) {\n for await (const [name, handle] of (directory as any).entries()) {\n const childPath = `${relativePath}/${name}`;\n if (handle.kind === \"directory\") {\n await visit(handle, childPath);\n } else if (\n name.endsWith(\".json\") &&\n childPath.startsWith(\".agents/tools/\")\n ) {\n paths.push(childPath);\n }\n }\n }\n\n try {\n const agentsDir = await root.getDirectoryHandle(\".agents\");\n const toolsDir = await agentsDir.getDirectoryHandle(\"tools\");\n await visit(toolsDir, \".agents/tools\");\n } catch {\n continue;\n }\n\n for (const path of paths.sort()) {\n try {\n const parsed = JSON.parse(\n await readGroupFile(db, targetGroupId, path),\n );\n const parsedTool = parseDeclarativeTool(path, parsed);\n if (!tools.some((t) => t.name === parsedTool.name)) {\n tools.push(parsedTool);\n }\n } catch (error) {\n diagnostics.push(\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n } catch {\n // Continue to next group directory\n }\n }\n\n return { tools, diagnostics };\n}\n\nexport async function findDeclarativeTool(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n name: string,\n): Promise<DeclarativeToolDefinition | null> {\n try {\n const { tools } = await loadDeclarativeTools(db, groupId);\n const tool = tools.find((t) => t.name === name) || null;\n if (!tool) {\n return null;\n }\n\n const rawEnabled = await getConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n );\n if (Array.isArray(rawEnabled) && !rawEnabled.includes(name)) {\n return null;\n }\n\n return tool;\n } catch {\n return null;\n }\n}\n","import { computeSha256 } from \"../../../utils/crypto.js\";\nimport type { RemoteManifest, ResolvedRemoteManifest } from \"./types.js\";\n\nconst WELL_KNOWN_PATH = \".well-known/agent-skills/index.json\";\n\n/**\n * Resolves an arbitrary site or discovery URL into a normalized base URL and manifest URL.\n */\nexport function resolveDiscoveryUrl(inputUrl: string): {\n baseUrl: string;\n siteUrl: string;\n manifestUrl: string;\n} {\n const trimmed = inputUrl.trim();\n if (!trimmed) {\n throw new Error(\"URL cannot be empty\");\n }\n\n let urlString = trimmed;\n if (!urlString.startsWith(\"http://\") && !urlString.startsWith(\"https://\")) {\n urlString = `https://${urlString}`;\n }\n\n // Remove trailing slashes\n urlString = urlString.replace(/\\/+$/, \"\");\n\n if (urlString.endsWith(WELL_KNOWN_PATH)) {\n const baseUrl = urlString\n .slice(0, -WELL_KNOWN_PATH.length)\n .replace(/\\/+$/, \"\");\n return {\n baseUrl,\n siteUrl: baseUrl,\n manifestUrl: urlString,\n };\n }\n\n return {\n baseUrl: urlString,\n siteUrl: urlString,\n manifestUrl: `${urlString}/${WELL_KNOWN_PATH}`,\n };\n}\n\n/**\n * Resolves an RFC 3986 relative URL found in an agent-skills manifest against the manifest URL.\n */\nexport function resolveManifestRelativeUrl(\n relativeUrl: string,\n manifestUrl: string,\n): string {\n if (!relativeUrl) {\n return \"\";\n }\n try {\n return new URL(relativeUrl, manifestUrl).href;\n } catch {\n return relativeUrl;\n }\n}\n\n/**\n * Resolves all relative URLs in an agent-skills manifest into fully-qualified absolute URLs.\n */\nexport function resolveManifestUrls(\n manifest: RemoteManifest,\n manifestUrl: string,\n): RemoteManifest {\n const cloned: RemoteManifest = JSON.parse(JSON.stringify(manifest));\n\n if (Array.isArray(cloned.tools)) {\n cloned.tools = cloned.tools.map((tool) => ({\n ...tool,\n url: resolveManifestRelativeUrl(tool.url, manifestUrl),\n }));\n }\n\n if (Array.isArray(cloned.scripts)) {\n cloned.scripts = cloned.scripts.map((script) => ({\n ...script,\n url: resolveManifestRelativeUrl(script.url, manifestUrl),\n }));\n }\n\n if (Array.isArray(cloned.skills)) {\n cloned.skills = cloned.skills.map((skill) => ({\n ...skill,\n url: resolveManifestRelativeUrl(skill.url, manifestUrl),\n tools: Array.isArray(skill.tools)\n ? skill.tools.map((st) => ({\n ...st,\n url: st.url\n ? resolveManifestRelativeUrl(st.url, manifestUrl)\n : undefined,\n }))\n : undefined,\n scripts: Array.isArray(skill.scripts)\n ? skill.scripts.map((ss) => ({\n ...ss,\n url: ss.url\n ? resolveManifestRelativeUrl(ss.url, manifestUrl)\n : undefined,\n }))\n : undefined,\n }));\n }\n\n return cloned;\n}\n\n/**\n * Verifies that the given content matches an expected SHA-256 digest (e.g. \"sha256:...\").\n */\nexport async function verifySha256Digest(\n content: string | Uint8Array,\n expectedDigest?: string,\n): Promise<boolean> {\n if (!expectedDigest || !expectedDigest.startsWith(\"sha256:\")) {\n return true;\n }\n\n const expectedHex = expectedDigest.slice(7).trim().toLowerCase();\n if (!expectedHex) {\n return true;\n }\n\n const rawBytes =\n typeof content === \"string\" ? new TextEncoder().encode(content) : content;\n const actualHex = (await computeSha256(rawBytes)).toLowerCase();\n return actualHex === expectedHex;\n}\n\n/**\n * Fetches and parses a remote site's Agent Skills discovery manifest.\n */\nexport async function fetchDiscoveryManifest(\n siteUrl: string,\n customFetch: typeof fetch = globalThis.fetch,\n): Promise<ResolvedRemoteManifest> {\n const { baseUrl, manifestUrl } = resolveDiscoveryUrl(siteUrl);\n\n const response = await customFetch(manifestUrl, {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch discovery manifest: HTTP ${response.status} ${response.statusText}`.trim(),\n );\n }\n\n const rawManifest = (await response.json()) as RemoteManifest;\n if (!rawManifest || typeof rawManifest !== \"object\") {\n throw new Error(\"Invalid discovery manifest: expected a JSON object\");\n }\n\n const resolvedManifest = resolveManifestUrls(rawManifest, manifestUrl);\n\n return {\n manifest: resolvedManifest,\n siteUrl: baseUrl,\n manifestUrl,\n };\n}\n","import { toTrustedScriptUrl } from \"../security/trusted-types.js\";\n\nexport type WriteContent = string | Blob | ArrayBuffer | Uint8Array;\n\n/**\n * Write data to a FileSystemFileHandle across browser implementations.\n */\nexport async function writeFileHandle(\n fileHandle: FileSystemFileHandle,\n content: WriteContent,\n): Promise<void> {\n const createWritable = fileHandle?.createWritable;\n const legacyCreateWriteable = Reflect.get(fileHandle, \"createWriteable\");\n const openWritable =\n typeof createWritable === \"function\"\n ? createWritable.bind(fileHandle)\n : typeof legacyCreateWriteable === \"function\"\n ? legacyCreateWriteable.bind(fileHandle)\n : null;\n\n if (openWritable) {\n const writable = await openWritable();\n await writable.write(toWritableChunk(content));\n await writable.close();\n\n return;\n }\n\n if (typeof (fileHandle as any).createSyncAccessHandle === \"function\") {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n\n try {\n const bytes = await toUint8Array(content);\n\n // Replace file content atomically when using sync handles.\n syncHandle.truncate(0);\n syncHandle.write(bytes, { at: 0 });\n if (typeof syncHandle.flush === \"function\") {\n syncHandle.flush();\n }\n } finally {\n syncHandle.close();\n }\n\n return;\n }\n\n throw new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n );\n}\n\n/**\n * Write a file in the Origin Private File System (OPFS) by navigating to it\n * via path segments inside an inline Web Worker.\n */\nexport async function writeOpfsPathViaWorker(\n pathSegments: string[],\n content: WriteContent,\n): Promise<void> {\n if (typeof globalThis.Worker !== \"function\") {\n throw new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n );\n }\n\n const bytes = await toUint8Array(content);\n\n return new Promise((resolve, reject) => {\n let blobUrl = \"\";\n let worker: Worker | null = null;\n\n try {\n // The worker navigates OPFS by path entirely on its own side —\n // no handle objects are transferred across the boundary.\n const src = [\n \"self.onmessage = async (e) => {\",\n \" try {\",\n \" const { pathSegments, bytes } = e.data;\",\n \" let dir = await navigator.storage.getDirectory();\",\n \" for (let i = 0; i < pathSegments.length - 1; i++) {\",\n \" dir = await dir.getDirectoryHandle(pathSegments[i], { create: true });\",\n \" }\",\n \" const filename = pathSegments[pathSegments.length - 1];\",\n \" const fh = await dir.getFileHandle(filename, { create: true });\",\n \" const h = await fh.createSyncAccessHandle();\",\n \" try {\",\n \" h.truncate(0);\",\n \" h.write(bytes, { at: 0 });\",\n \" if (typeof h.flush === 'function') h.flush();\",\n \" } finally { h.close(); }\",\n \" self.postMessage({ ok: true });\",\n \" } catch (err) {\",\n \" self.postMessage({ error: err.message || String(err) });\",\n \" }\",\n \"};\",\n ].join(\"\\n\");\n\n blobUrl = URL.createObjectURL(\n new Blob([src], { type: \"text/javascript\" }),\n );\n worker = new Worker(toTrustedScriptUrl(blobUrl) as string);\n } catch {\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n }\n\n reject(\n new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n ),\n );\n\n return;\n }\n\n const cleanup = () => {\n if (worker) {\n worker.terminate();\n }\n\n URL.revokeObjectURL(blobUrl);\n };\n\n worker.onmessage = (e) => {\n cleanup();\n if (e.data?.error) {\n reject(new Error(e.data.error));\n } else {\n resolve();\n }\n };\n\n worker.onerror = (e) => {\n cleanup();\n reject(new Error(e.message || \"Worker file write failed\"));\n };\n\n worker.postMessage({ pathSegments, bytes }, [bytes.buffer]);\n });\n}\n\nfunction toWritableChunk(content: WriteContent): string | Blob {\n if (typeof content === \"string\" || content instanceof Blob) {\n return content;\n }\n\n if (content instanceof Uint8Array) {\n const copy = new Uint8Array(content.byteLength);\n copy.set(content);\n\n return new Blob([copy]);\n }\n\n return new Blob([content]);\n}\n\n/**\n * Convert input content to a Uint8Array.\n */\nasync function toUint8Array(content: WriteContent): Promise<Uint8Array> {\n if (content instanceof Uint8Array) {\n return content;\n }\n\n if (typeof content === \"string\") {\n return new TextEncoder().encode(content);\n }\n\n if (content instanceof Blob) {\n return new Uint8Array(await content.arrayBuffer());\n }\n\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n\n return new Uint8Array();\n}\n","import { getGroupDir } from \"./get-group-dir.js\";\nimport { parsePath } from \"./parse-path.js\";\nimport {\n getOpfsRootDirName,\n getStorageStatus,\n invalidateStorageRoot,\n isStaleHandleError,\n} from \"./storage.js\";\nimport {\n writeFileHandle,\n writeOpfsPathViaWorker,\n type WriteContent,\n} from \"./write-file-handle.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Write content to a file in a group's workspace.\n * Creates intermediate directories as needed.\n */\nexport async function writeGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n content: WriteContent,\n): Promise<void> {\n const { dirs, filename } = parsePath(filePath);\n\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n const groupDir = await getGroupDir(db, groupId);\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg, { create: true });\n }\n\n const fileHandle = await dir.getFileHandle(filename, { create: true });\n\n try {\n await writeFileHandle(fileHandle, content);\n\n return;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const needsOpfsWorkerFallback =\n message.includes(\"Writable file streams are not supported\") &&\n (await getStorageStatus(db)).type === \"opfs\";\n\n if (!needsOpfsWorkerFallback) {\n throw err;\n }\n }\n\n const safeId = groupId.replace(/:/g, \"-\");\n await writeOpfsPathViaWorker(\n [getOpfsRootDirName(), \"groups\", safeId, ...dirs, filename],\n content,\n );\n\n return;\n } catch (err) {\n if (attempt === 0 && isStaleHandleError(err)) {\n invalidateStorageRoot();\n\n continue;\n }\n\n throw err;\n }\n }\n}\n","import { readGroupFile } from \"./read-group-file.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Check if a file exists in a group's workspace.\n */\nexport async function groupFileExists(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<boolean> {\n try {\n await readGroupFile(db, groupId, filePath);\n\n return true;\n } catch {\n return false;\n }\n}\n","import matter from \"gray-matter\";\n\nimport type { TaskToolCall } from \"../../db/types.js\";\nimport type { SkillExecution, SkillRecord } from \"./types.js\";\n\nconst NAME_PATTERN = /^[a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]$|^[a-z0-9]$/;\n\ninterface FrontmatterParseResult {\n data: Record<string, unknown>;\n content: string;\n}\n\nfunction parseFrontmatterResiliently(source: string): FrontmatterParseResult {\n try {\n const parsed = matter(source);\n return {\n data: parsed.data && typeof parsed.data === \"object\" ? parsed.data : {},\n content: parsed.content || \"\",\n };\n } catch {\n // Attempt 1: Sanitize unquoted scalar lines in the frontmatter block\n const fmMatch = source.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (fmMatch) {\n const rawFm = fmMatch[1];\n const rest = fmMatch[2] || \"\";\n const lines = rawFm.split(/\\r?\\n/);\n const sanitizedLines = lines.map((line) => {\n const fieldMatch = line.match(/^([a-zA-Z0-9_-]+):\\s*(.+)$/);\n if (fieldMatch) {\n const [, key, val] = fieldMatch;\n const trimmed = val.trim();\n // If value is not already quoted and not a YAML block indicator/collection opening or boolean/number\n if (\n trimmed &&\n trimmed !== \"true\" &&\n trimmed !== \"false\" &&\n trimmed !== \"null\" &&\n !trimmed.startsWith('\"') &&\n !trimmed.startsWith(\"'\") &&\n !trimmed.startsWith(\"[\") &&\n !trimmed.startsWith(\"{\") &&\n trimmed !== \">\" &&\n trimmed !== \"|\" &&\n trimmed !== \">-\" &&\n trimmed !== \"|-\" &&\n !/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)\n ) {\n return `${key}: ${JSON.stringify(trimmed)}`;\n }\n }\n return line;\n });\n\n try {\n const sanitizedSource = `---\\n${sanitizedLines.join(\"\\n\")}\\n---\\n${rest}`;\n const parsed = matter(sanitizedSource);\n return {\n data:\n parsed.data && typeof parsed.data === \"object\" ? parsed.data : {},\n content: parsed.content || \"\",\n };\n } catch {\n // Continue to fallback\n }\n\n // Attempt 2: Line-by-line fallback extraction for essential frontmatter fields\n const fallbackData: Record<string, unknown> = {};\n const nameMatch = rawFm.match(/^name:\\s*[\"']?([^\"'\\r\\n]+)[\"']?/m);\n if (nameMatch) {\n fallbackData.name = nameMatch[1].trim();\n }\n\n const descMatch = rawFm.match(/^description:\\s*(.+)$/m);\n if (descMatch) {\n let desc = descMatch[1].trim();\n if (\n (desc.startsWith('\"') && desc.endsWith('\"')) ||\n (desc.startsWith(\"'\") && desc.endsWith(\"'\"))\n ) {\n desc = desc.slice(1, -1);\n }\n fallbackData.description = desc;\n }\n\n const userInvocableMatch = rawFm.match(\n /^user-invocable:\\s*(true|false)/im,\n );\n if (userInvocableMatch) {\n fallbackData[\"user-invocable\"] =\n userInvocableMatch[1].toLowerCase() === \"true\";\n }\n\n const disableModelMatch = rawFm.match(\n /^disable-model-invocation:\\s*(true|false)/im,\n );\n if (disableModelMatch) {\n fallbackData[\"disable-model-invocation\"] =\n disableModelMatch[1].toLowerCase() === \"true\";\n }\n\n const toolsMatch = rawFm.match(\n /^allowed-tools:\\s*[\"']?([^\"'\\r\\n]+)[\"']?/m,\n );\n if (toolsMatch) {\n fallbackData[\"allowed-tools\"] = toolsMatch[1].trim();\n }\n\n // Check for bullet list allowed-tools\n const toolListMatch = rawFm.match(\n /allowed-tools:\\s*\\n((?:\\s*-\\s*[^\\r\\n]+\\r?\\n?)+)/m,\n );\n if (toolListMatch) {\n const tools = toolListMatch[1]\n .split(/\\r?\\n/)\n .map((l) => l.replace(/^\\s*-\\s*/, \"\").trim())\n .filter(Boolean);\n if (tools.length > 0) {\n fallbackData[\"allowed-tools\"] = tools;\n }\n }\n\n return { data: fallbackData, content: rest };\n }\n\n return { data: {}, content: source };\n }\n}\n\nfunction extractAllowedTools(raw: unknown): string | undefined {\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (Array.isArray(raw)) {\n const tools = raw\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n return tools.length > 0 ? tools.join(\" \") : undefined;\n }\n return undefined;\n}\n\nexport function parseSkill(path: string, source: string): SkillRecord {\n const parsed = parseFrontmatterResiliently(source);\n const data = parsed.data;\n const name = typeof data.name === \"string\" ? data.name.trim() : \"\";\n const description =\n typeof data.description === \"string\" ? data.description.trim() : \"\";\n\n if (!name) {\n throw new Error(`Skill at ${path} requires a name`);\n }\n if (!description) {\n throw new Error(`Skill ${name} requires a description`);\n }\n if (name.length > 64 || !NAME_PATTERN.test(name)) {\n throw new Error(\n `Skill name must be 1-64 lowercase characters and hyphens: ${name}`,\n );\n }\n if (description.length > 1024) {\n throw new Error(\n `Skill ${name} description must be 1024 characters or fewer`,\n );\n }\n\n const basePath = path.replace(/\\/SKILL\\.md$/u, \"\");\n const rawMetadata =\n data.metadata && typeof data.metadata === \"object\"\n ? (data.metadata as Record<string, unknown>)\n : undefined;\n\n const allowedToolsRaw =\n extractAllowedTools(rawMetadata?.[\"allowed-tools\"]) ||\n extractAllowedTools(rawMetadata?.[\"allowedTools\"]) ||\n extractAllowedTools(data[\"allowed-tools\"]) ||\n extractAllowedTools(data[\"allowedTools\"]);\n\n const metadataEntries: [string, string][] = [];\n if (rawMetadata) {\n for (const [key, value] of Object.entries(rawMetadata)) {\n if (key === \"execution\" || value === null || value === undefined) {\n continue;\n }\n if (key === \"allowed-tools\" || key === \"allowedTools\") {\n if (allowedToolsRaw) {\n metadataEntries.push([key, allowedToolsRaw]);\n }\n } else if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n metadataEntries.push([key, String(value)]);\n } else if (Array.isArray(value)) {\n const stringItems = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter(Boolean);\n if (stringItems.length > 0) {\n metadataEntries.push([key, stringItems.join(\" \")]);\n }\n }\n }\n }\n\n const metadata =\n metadataEntries.length > 0\n ? Object.fromEntries(metadataEntries)\n : undefined;\n\n const execution = rawMetadata?.execution;\n\n let parsedExecution;\n if (execution !== undefined) {\n if (\n !execution ||\n typeof execution !== \"object\" ||\n (execution as Record<string, unknown>).type !== \"tools\" ||\n !Array.isArray((execution as Record<string, unknown>).tools)\n ) {\n throw new Error(`Skill ${name} has invalid tools execution`);\n }\n const rawExec = execution as Record<string, unknown>;\n const topSuppressToast =\n typeof rawExec.suppressToast === \"boolean\"\n ? rawExec.suppressToast\n : undefined;\n const topSuppressOutput =\n typeof rawExec.suppressOutput === \"boolean\"\n ? rawExec.suppressOutput\n : undefined;\n\n const rawTools = rawExec.tools as TaskToolCall[];\n const tools = rawTools.map((tool) => ({\n ...tool,\n ...(topSuppressToast !== undefined && tool.suppressToast === undefined\n ? { suppressToast: topSuppressToast }\n : {}),\n ...(topSuppressOutput !== undefined && tool.suppressOutput === undefined\n ? { suppressOutput: topSuppressOutput }\n : {}),\n }));\n\n parsedExecution = {\n type: \"tools\" as const,\n ...(topSuppressToast !== undefined\n ? { suppressToast: topSuppressToast }\n : {}),\n ...(topSuppressOutput !== undefined\n ? { suppressOutput: topSuppressOutput }\n : {}),\n tools,\n } satisfies SkillExecution;\n }\n\n return {\n name,\n description,\n ...(typeof data.license === \"string\" ? { license: data.license } : {}),\n ...(typeof data.compatibility === \"string\"\n ? { compatibility: data.compatibility }\n : {}),\n ...(metadata ? { metadata } : {}),\n ...(typeof allowedToolsRaw === \"string\"\n ? { allowedTools: allowedToolsRaw }\n : {}),\n ...(typeof data[\"user-invocable\"] === \"boolean\"\n ? { userInvocable: data[\"user-invocable\"] }\n : typeof data[\"user-invocable\"] === \"string\" &&\n (data[\"user-invocable\"].toLowerCase() === \"true\" ||\n data[\"user-invocable\"].toLowerCase() === \"false\")\n ? { userInvocable: data[\"user-invocable\"].toLowerCase() === \"true\" }\n : {}),\n ...(typeof data[\"disable-model-invocation\"] === \"boolean\"\n ? { disableModelInvocation: data[\"disable-model-invocation\"] }\n : typeof data[\"disable-model-invocation\"] === \"string\" &&\n (data[\"disable-model-invocation\"].toLowerCase() === \"true\" ||\n data[\"disable-model-invocation\"].toLowerCase() === \"false\")\n ? {\n disableModelInvocation:\n data[\"disable-model-invocation\"].toLowerCase() === \"true\",\n }\n : {}),\n ...(parsedExecution ? { execution: parsedExecution } : {}),\n body: parsed.content.trim(),\n path,\n basePath,\n };\n}\n","import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { setConfig } from \"../../../db/set-config.js\";\nimport { writeGroupFile } from \"../../../storage/write-group-file.js\";\nimport { groupFileExists } from \"../../../storage/group-file-exists.js\";\nimport { parseDeclarativeTool } from \"../declarative.js\";\nimport { TOOL_DEFINITIONS } from \"../tools.js\";\nimport { parseSkill } from \"../../skills/parse-skill.js\";\nimport { verifySha256Digest } from \"./discovery.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type {\n ImportArtifactStatus,\n ImportOptions,\n ImportResult,\n RemoteManifest,\n RemoteScriptItem,\n RemoteSkillItem,\n RemoteToolItem,\n} from \"./types.js\";\n\nconst BUILTIN_TOOL_NAMES = new Set(TOOL_DEFINITIONS.map((t) => t.name));\nconst TOOL_NAME_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;\n\nfunction getSubdir(options?: ImportOptions): string {\n if (options?.targetSubdir) {\n return options.targetSubdir;\n }\n if (options?.siteSlug) {\n return `imported/${options.siteSlug}`;\n }\n return \"main\";\n}\n\n/**\n * Imports a declarative tool definition from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteTool(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n toolItem: RemoteToolItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (toolItem.name || \"\").trim();\n\n if (BUILTIN_TOOL_NAMES.has(name)) {\n return {\n name,\n path: \"\",\n status: \"failed\",\n error: `Cannot shadow built-in tool: ${name}`,\n };\n }\n\n if (!TOOL_NAME_PATTERN.test(name)) {\n return {\n name,\n path: \"\",\n status: \"failed\",\n error: `Invalid tool name: ${name}`,\n };\n }\n\n const subdir = getSubdir(options);\n const targetPath = `.agents/tools/${subdir}/${name}.json`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(toolItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (toolItem.digest) {\n const isValid = await verifySha256Digest(text, toolItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for tool definition\",\n };\n }\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Downloaded tool definition is not valid JSON\",\n };\n }\n\n // Validate schema\n parseDeclarativeTool(targetPath, parsed);\n\n await writeGroupFile(\n db,\n groupId,\n targetPath,\n JSON.stringify(parsed, null, 2),\n );\n\n if (options?.autoEnable) {\n const current = (await getConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n )) as string[] | undefined;\n const set = new Set(Array.isArray(current) ? current : []);\n set.add(name);\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n Array.from(set),\n );\n }\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports a companion script (.js/.mjs) from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteScript(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n scriptItem: RemoteScriptItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (scriptItem.name || \"\").trim();\n const subdir = getSubdir(options);\n const filename =\n name.endsWith(\".js\") || name.endsWith(\".mjs\") ? name : `${name}.js`;\n const targetPath = `.agents/scripts/${subdir}/${filename}`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(scriptItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (scriptItem.digest) {\n const isValid = await verifySha256Digest(text, scriptItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for script\",\n };\n }\n }\n\n await writeGroupFile(db, groupId, targetPath, text);\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports an Agent Skill (SKILL.md) from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteSkill(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n skillItem: RemoteSkillItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (skillItem.name || \"\").trim();\n const subdir = getSubdir(options);\n const targetPath = `.agents/skills/${subdir}/${name}/SKILL.md`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(skillItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (skillItem.digest) {\n const isValid = await verifySha256Digest(text, skillItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for skill\",\n };\n }\n }\n\n // Validate skill frontmatter\n parseSkill(targetPath, text);\n\n await writeGroupFile(db, groupId, targetPath, text);\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports a batch of selected tools, skills, and scripts from a remote site with dependency resolution.\n */\nexport async function importRemoteArtifacts(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n manifest: RemoteManifest,\n selection: {\n toolNames?: string[];\n skillNames?: string[];\n scriptNames?: string[];\n },\n options?: ImportOptions,\n): Promise<ImportResult> {\n const result: ImportResult = {\n tools: [],\n skills: [],\n scripts: [],\n diagnostics: [],\n };\n\n const selectedToolNames = new Set(selection.toolNames || []);\n const selectedSkillNames = new Set(selection.skillNames || []);\n const selectedScriptNames = new Set(selection.scriptNames || []);\n\n const manifestTools = manifest.tools || [];\n const manifestSkills = manifest.skills || [];\n const manifestScripts = manifest.scripts || [];\n\n // Resolve dependencies from selected skills\n for (const skillItem of manifestSkills) {\n if (selectedSkillNames.has(skillItem.name)) {\n if (Array.isArray(skillItem.tools)) {\n for (const t of skillItem.tools) {\n selectedToolNames.add(t.name);\n }\n }\n if (Array.isArray(skillItem.scripts)) {\n for (const s of skillItem.scripts) {\n selectedScriptNames.add(s.name);\n }\n }\n }\n }\n\n // Import Scripts\n for (const scriptItem of manifestScripts) {\n if (selectedScriptNames.has(scriptItem.name)) {\n const status = await importRemoteScript(db, groupId, scriptItem, options);\n result.scripts.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Script ${scriptItem.name}: ${status.error}`);\n }\n }\n }\n\n // Import Tools\n for (const toolItem of manifestTools) {\n if (selectedToolNames.has(toolItem.name)) {\n const status = await importRemoteTool(db, groupId, toolItem, options);\n result.tools.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Tool ${toolItem.name}: ${status.error}`);\n }\n }\n }\n\n // Import Skills\n for (const skillItem of manifestSkills) {\n if (selectedSkillNames.has(skillItem.name)) {\n const status = await importRemoteSkill(db, groupId, skillItem, options);\n result.skills.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Skill ${skillItem.name}: ${status.error}`);\n }\n }\n }\n\n return result;\n}\n","import { Signal } from \"signal-polyfill\";\n\nimport { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { setConfig } from \"../db/set-config.js\";\nimport { TOOL_DEFINITIONS } from \"../subsystems/tools/tools.js\";\nimport { DEFAULT_BUILTIN_PROFILE } from \"../subsystems/tools/builtin-profiles.js\";\nimport { loadDeclarativeTools } from \"../subsystems/tools/declarative.js\";\nimport { fetchDiscoveryManifest } from \"../subsystems/tools/remote/discovery.js\";\nimport { importRemoteArtifacts } from \"../subsystems/tools/remote/import-artifacts.js\";\nimport type { DeclarativeToolDefinition } from \"../subsystems/tools/declarative.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\nimport type { ToolDefinition, ToolProfile } from \"../subsystems/tools/tools.js\";\nimport type {\n ImportOptions,\n ImportResult,\n RemoteManifest,\n ResolvedRemoteManifest,\n} from \"../subsystems/tools/remote/types.js\";\n\nexport class ToolsStore {\n private _activeProfile: Signal.Computed<ToolProfile | null>;\n private _activeProfileId: Signal.State<string | null>;\n private _allTools: Signal.Computed<ToolDefinition[]>;\n private _customTools: Signal.State<ToolDefinition[]>;\n private _declarativeTools: Signal.State<DeclarativeToolDefinition[]>;\n private _declarativeToolNamesEnabled: Signal.State<Set<string> | null>;\n private _enabledDeclarativeTools: Signal.Computed<\n DeclarativeToolDefinition[]\n >;\n private _enabledToolNames: Signal.State<Set<string>>;\n private _enabledTools: Signal.Computed<ToolDefinition[]>;\n private _profiles: Signal.State<ToolProfile[]>;\n private _systemPromptOverride: Signal.State<string>;\n private _webSearchProxyUrl: Signal.State<string>;\n private _webSearchUrl: Signal.State<string>;\n private _webSearchUseProxy: Signal.State<boolean>;\n private _searchFilesMaxFileBytes: Signal.State<number>;\n private _searchFilesMaxFilesVisited: Signal.State<number>;\n private _searchFilesSkipDirs: Signal.State<string>;\n\n constructor() {\n this._enabledToolNames = new Signal.State(\n new Set(DEFAULT_BUILTIN_PROFILE.enabledToolNames),\n );\n this._customTools = new Signal.State([]);\n this._declarativeTools = new Signal.State([]);\n this._declarativeToolNamesEnabled = new Signal.State<Set<string> | null>(\n null,\n );\n this._systemPromptOverride = new Signal.State(\"\");\n this._profiles = new Signal.State([]);\n this._activeProfileId = new Signal.State(DEFAULT_BUILTIN_PROFILE.id);\n this._webSearchUseProxy = new Signal.State(false);\n this._webSearchProxyUrl = new Signal.State(\"/proxy\");\n this._webSearchUrl = new Signal.State(\n \"https://html.duckduckgo.com/html/?q={query}\",\n );\n this._searchFilesMaxFileBytes = new Signal.State(512 * 1024);\n this._searchFilesMaxFilesVisited = new Signal.State(1000);\n this._searchFilesSkipDirs = new Signal.State(\n \".git,node_modules,dist,dist-electron,.cache,.nx,.turbo,__pycache__,.venv,venv\",\n );\n\n // Derived signals using Signal.Computed for proper reactive propagation.\n this._allTools = new Signal.Computed(() => [\n ...TOOL_DEFINITIONS,\n ...this._customTools.get(),\n ]);\n\n this._enabledTools = new Signal.Computed(() => {\n const enabled = this._enabledToolNames.get();\n\n return this._allTools\n .get()\n .filter((t: ToolDefinition) => enabled.has(t.name));\n });\n\n this._enabledDeclarativeTools = new Signal.Computed(() => {\n const tools = this._declarativeTools.get();\n const enabledSet = this._declarativeToolNamesEnabled.get();\n if (enabledSet === null) {\n return tools;\n }\n return tools.filter((t) => enabledSet.has(t.name));\n });\n\n this._activeProfile = new Signal.Computed(() => {\n const id = this._activeProfileId.get();\n if (!id) {\n return null;\n }\n\n if (DEFAULT_BUILTIN_PROFILE.id === id) {\n return DEFAULT_BUILTIN_PROFILE;\n }\n\n return this._profiles.get().find((p: ToolProfile) => p.id === id) || null;\n });\n }\n\n get activeProfile(): ToolProfile | null {\n return this._activeProfile.get();\n }\n\n get activeProfileId(): string | null {\n return this._activeProfileId.get();\n }\n\n get allTools(): ToolDefinition[] {\n return this._allTools.get();\n }\n\n get customTools(): ToolDefinition[] {\n return this._customTools.get();\n }\n\n get declarativeTools(): DeclarativeToolDefinition[] {\n return this._declarativeTools.get();\n }\n\n get declarativeToolNamesEnabled(): Set<string> | null {\n return this._declarativeToolNamesEnabled.get();\n }\n\n get enabledDeclarativeTools(): DeclarativeToolDefinition[] {\n return this._enabledDeclarativeTools.get();\n }\n\n get enabledToolNames(): Set<string> {\n return this._enabledToolNames.get();\n }\n\n get enabledTools(): ToolDefinition[] {\n return this._enabledTools.get();\n }\n\n isDeclarativeToolEnabled(name: string): boolean {\n const enabledSet = this._declarativeToolNamesEnabled.get();\n if (enabledSet === null) {\n return true;\n }\n return enabledSet.has(name);\n }\n\n async refreshDeclarativeTools(\n db: ShadowClawDatabase,\n groupId?: string,\n ): Promise<DeclarativeToolDefinition[]> {\n try {\n const res = await loadDeclarativeTools(db, groupId || \"br:main\");\n const allBuiltInAndCustom = this.allTools;\n const declTools = (res?.tools || []).filter(\n (dt) => !allBuiltInAndCustom.some((bt) => bt.name === dt.name),\n );\n\n const current = this._declarativeTools.get();\n const isSame =\n current.length === declTools.length &&\n current.every(\n (t, i) =>\n t.name === declTools[i].name &&\n t.description === declTools[i].description &&\n JSON.stringify(t.execution) ===\n JSON.stringify(declTools[i].execution),\n );\n\n if (!isSame) {\n this._declarativeTools.set(declTools);\n }\n return declTools;\n } catch {\n if (this._declarativeTools.get().length > 0) {\n this._declarativeTools.set([]);\n }\n return [];\n }\n }\n\n async setDeclarativeToolEnabled(\n db: ShadowClawDatabase,\n toolName: string,\n enabled: boolean,\n ): Promise<void> {\n const currentEnabled = this._declarativeToolNamesEnabled.get();\n const allDeclTools = this._declarativeTools.get();\n const nextSet = new Set(\n currentEnabled === null\n ? allDeclTools.map((t) => t.name)\n : currentEnabled,\n );\n if (enabled) {\n nextSet.add(toolName);\n } else {\n nextSet.delete(toolName);\n }\n this._declarativeToolNamesEnabled.set(nextSet);\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n Array.from(nextSet),\n );\n }\n\n async setAllDeclarativeEnabled(\n db: ShadowClawDatabase,\n toolNames: string[],\n ): Promise<void> {\n const nextSet = new Set(toolNames);\n this._declarativeToolNamesEnabled.set(nextSet);\n await setConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED, toolNames);\n }\n\n /**\n * Fetches remote site discovery manifest.\n */\n async fetchRemoteDiscoveryManifest(\n siteUrl: string,\n ): Promise<ResolvedRemoteManifest> {\n return await fetchDiscoveryManifest(siteUrl);\n }\n\n /**\n * Imports tools, skills, and scripts from a remote site into OPFS and refreshes declarative tools.\n */\n async importFromRemoteSite(\n db: ShadowClawDatabase,\n manifest: RemoteManifest,\n selection: {\n toolNames?: string[];\n skillNames?: string[];\n scriptNames?: string[];\n },\n options?: ImportOptions,\n ): Promise<ImportResult> {\n const groupId = options?.groupId || \"br:main\";\n const result = await importRemoteArtifacts(\n db,\n groupId,\n manifest,\n selection,\n options,\n );\n await this.refreshDeclarativeTools(db, groupId);\n return result;\n }\n\n /**\n * Export tools config as JSON for backup.\n */\n exportBackup(): string {\n return JSON.stringify(\n {\n enabledTools: [...this._enabledToolNames.get()],\n customTools: this._customTools.get(),\n declarativeToolsEnabled: this._declarativeToolNamesEnabled.get()\n ? Array.from(this._declarativeToolNamesEnabled.get()!)\n : null,\n systemPromptOverride: this._systemPromptOverride.get(),\n profiles: this._profiles.get(),\n activeProfileId: this._activeProfileId.get(),\n webSearchUseProxy: this._webSearchUseProxy.get(),\n webSearchProxyUrl: this._webSearchProxyUrl.get(),\n webSearchUrl: this._webSearchUrl.get(),\n searchFilesMaxFileBytes: this._searchFilesMaxFileBytes.get(),\n searchFilesMaxFilesVisited: this._searchFilesMaxFilesVisited.get(),\n searchFilesSkipDirs: this._searchFilesSkipDirs.get(),\n },\n null,\n 2,\n );\n }\n\n findProfilesForProvider(providerId?: string, model?: string): ToolProfile[] {\n return this.profiles.filter((p) => {\n if (p.providerId && p.providerId !== providerId) {\n return false;\n }\n\n if (p.model && p.model !== model) {\n return false;\n }\n\n return true;\n });\n }\n\n get profiles(): ToolProfile[] {\n return [DEFAULT_BUILTIN_PROFILE, ...this._profiles.get()];\n }\n\n get systemPromptOverride(): string {\n return this._systemPromptOverride.get();\n }\n\n get webSearchProxyUrl(): string {\n return this._webSearchProxyUrl.get();\n }\n\n get webSearchUrl(): string {\n return this._webSearchUrl.get();\n }\n\n get webSearchUseProxy(): boolean {\n return this._webSearchUseProxy.get();\n }\n\n get searchFilesMaxFileBytes(): number {\n return this._searchFilesMaxFileBytes.get();\n }\n\n get searchFilesMaxFilesVisited(): number {\n return this._searchFilesMaxFilesVisited.get();\n }\n\n /** Comma-separated list of directory names to skip when walking the workspace. */\n get searchFilesSkipDirs(): string {\n return this._searchFilesSkipDirs.get();\n }\n\n /** Parsed Set of directory names to skip — derived from the comma-separated string. */\n get searchFilesSkipDirsSet(): Set<string> {\n return new Set(\n this._searchFilesSkipDirs\n .get()\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n }\n\n async activateProfile(\n db: ShadowClawDatabase,\n profileId: string,\n ): Promise<void> {\n const profile = this.profiles.find((p) => p.id === profileId);\n if (!profile) {\n return;\n }\n\n this._activeProfileId.set(profileId);\n this._enabledToolNames.set(new Set(profile.enabledToolNames));\n this._customTools.set(profile.customTools);\n this._systemPromptOverride.set(profile.systemPromptOverride || \"\");\n\n await Promise.all([\n setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, profileId),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, profile.enabledToolNames),\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, profile.customTools),\n setConfig(\n db,\n CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE,\n profile.systemPromptOverride || \"\",\n ),\n ]);\n }\n\n async addCustomTool(\n db: ShadowClawDatabase,\n tool: ToolDefinition,\n ): Promise<void> {\n const tools = [...this._customTools.get(), tool];\n this._customTools.set(tools);\n // Auto-enable new tool\n const enabled = new Set(this._enabledToolNames.get());\n enabled.add(tool.name);\n this._enabledToolNames.set(enabled);\n await Promise.all([\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, tools),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...enabled]),\n ]);\n }\n\n // ── Profile Management ───────────────────────────────────────────\n\n async addProfile(\n db: ShadowClawDatabase,\n profile: ToolProfile,\n ): Promise<void> {\n const profiles = [...this._profiles.get(), profile];\n this._profiles.set(profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n\n async cloneTool(\n db: ShadowClawDatabase,\n sourceToolName: string,\n newToolName: string,\n newDescription?: string,\n ): Promise<boolean> {\n const source = this.allTools.find((t) => t.name === sourceToolName);\n if (!source) {\n return false;\n }\n\n if (this.allTools.some((t) => t.name === newToolName)) {\n return false;\n }\n\n const cloned: ToolDefinition = {\n name: newToolName,\n description: newDescription || source.description,\n input_schema: JSON.parse(JSON.stringify(source.input_schema)),\n };\n\n await this.addCustomTool(db, cloned);\n\n return true;\n }\n\n async deactivateProfile(db: ShadowClawDatabase): Promise<void> {\n this._activeProfileId.set(null);\n await setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null);\n }\n\n async deleteProfile(\n db: ShadowClawDatabase,\n profileId: string,\n ): Promise<void> {\n if (profileId === DEFAULT_BUILTIN_PROFILE.id) {\n return;\n }\n\n const profiles = this._profiles.get().filter((p) => p.id !== profileId);\n this._profiles.set(profiles);\n if (this._activeProfileId.get() === profileId) {\n this._activeProfileId.set(null);\n await setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null);\n }\n\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n\n async importBackup(db: ShadowClawDatabase, json: string): Promise<void> {\n const data = JSON.parse(json);\n if (Array.isArray(data.enabledTools)) {\n this._enabledToolNames.set(new Set(data.enabledTools));\n await setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, data.enabledTools);\n }\n\n if (Array.isArray(data.customTools)) {\n this._customTools.set(data.customTools);\n await setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, data.customTools);\n }\n\n if (typeof data.systemPromptOverride === \"string\") {\n this._systemPromptOverride.set(data.systemPromptOverride);\n await setConfig(\n db,\n CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE,\n data.systemPromptOverride,\n );\n }\n\n if (Array.isArray(data.profiles)) {\n this._profiles.set(data.profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, data.profiles);\n }\n\n if (\n typeof data.activeProfileId === \"string\" ||\n data.activeProfileId === null\n ) {\n this._activeProfileId.set(data.activeProfileId);\n await setConfig(\n db,\n CONFIG_KEYS.ACTIVE_TOOL_PROFILE,\n data.activeProfileId,\n );\n }\n\n if (typeof data.webSearchUseProxy === \"boolean\") {\n this._webSearchUseProxy.set(data.webSearchUseProxy);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_USE_PROXY,\n data.webSearchUseProxy ? \"true\" : \"false\",\n );\n }\n\n if (typeof data.webSearchProxyUrl === \"string\") {\n this._webSearchProxyUrl.set(data.webSearchProxyUrl);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_PROXY_URL,\n data.webSearchProxyUrl,\n );\n }\n\n if (typeof data.webSearchUrl === \"string\") {\n this._webSearchUrl.set(data.webSearchUrl);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_URL, data.webSearchUrl);\n }\n\n if (\n typeof data.searchFilesMaxFileBytes === \"number\" &&\n data.searchFilesMaxFileBytes > 0\n ) {\n this._searchFilesMaxFileBytes.set(data.searchFilesMaxFileBytes);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES,\n String(data.searchFilesMaxFileBytes),\n );\n }\n\n if (\n typeof data.searchFilesMaxFilesVisited === \"number\" &&\n data.searchFilesMaxFilesVisited > 0\n ) {\n this._searchFilesMaxFilesVisited.set(data.searchFilesMaxFilesVisited);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED,\n String(data.searchFilesMaxFilesVisited),\n );\n }\n\n if (typeof data.searchFilesSkipDirs === \"string\") {\n this._searchFilesSkipDirs.set(data.searchFilesSkipDirs);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS,\n data.searchFilesSkipDirs,\n );\n }\n\n if (Array.isArray(data.declarativeToolsEnabled)) {\n this._declarativeToolNamesEnabled.set(\n new Set(data.declarativeToolsEnabled),\n );\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n data.declarativeToolsEnabled,\n );\n } else if (data.declarativeToolsEnabled === null) {\n this._declarativeToolNamesEnabled.set(null);\n await setConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED, null);\n }\n }\n\n /**\n * Load persisted tool config from IndexedDB.\n */\n async load(db: ShadowClawDatabase): Promise<void> {\n const [\n enabledRaw,\n customRaw,\n promptOverride,\n profilesRaw,\n activeProfileIdRaw,\n webSearchUseProxyRaw,\n webSearchProxyUrlRaw,\n webSearchUrlRaw,\n searchFilesMaxFileBytesRaw,\n searchFilesMaxFilesVisitedRaw,\n searchFilesSkipDirsRaw,\n declarativeEnabledRaw,\n ] = await Promise.all([\n getConfig(db, CONFIG_KEYS.ENABLED_TOOLS),\n getConfig(db, CONFIG_KEYS.CUSTOM_TOOLS),\n getConfig(db, CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE),\n getConfig(db, CONFIG_KEYS.TOOL_PROFILES),\n getConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_USE_PROXY),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_PROXY_URL),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_URL),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS),\n getConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED),\n ]);\n\n if (Array.isArray(enabledRaw)) {\n this._enabledToolNames.set(new Set(enabledRaw));\n }\n\n if (Array.isArray(customRaw)) {\n this._customTools.set(customRaw);\n }\n\n if (Array.isArray(declarativeEnabledRaw)) {\n this._declarativeToolNamesEnabled.set(new Set(declarativeEnabledRaw));\n }\n\n if (typeof promptOverride === \"string\") {\n this._systemPromptOverride.set(promptOverride);\n }\n\n if (Array.isArray(profilesRaw)) {\n this._profiles.set(profilesRaw);\n }\n\n if (typeof activeProfileIdRaw === \"string\") {\n this._activeProfileId.set(activeProfileIdRaw);\n }\n\n if (webSearchUseProxyRaw !== null && webSearchUseProxyRaw !== undefined) {\n const strVal = String(webSearchUseProxyRaw).toLowerCase();\n this._webSearchUseProxy.set(strVal === \"true\" || strVal === \"1\");\n }\n\n if (\n typeof webSearchProxyUrlRaw === \"string\" &&\n webSearchProxyUrlRaw.trim().length > 0\n ) {\n this._webSearchProxyUrl.set(webSearchProxyUrlRaw.trim());\n }\n\n if (\n typeof webSearchUrlRaw === \"string\" &&\n webSearchUrlRaw.trim().length > 0\n ) {\n this._webSearchUrl.set(webSearchUrlRaw.trim());\n }\n\n if (\n searchFilesMaxFileBytesRaw !== null &&\n searchFilesMaxFileBytesRaw !== undefined\n ) {\n const n = Number(searchFilesMaxFileBytesRaw);\n if (Number.isFinite(n) && n > 0) {\n this._searchFilesMaxFileBytes.set(n);\n }\n }\n\n if (\n searchFilesMaxFilesVisitedRaw !== null &&\n searchFilesMaxFilesVisitedRaw !== undefined\n ) {\n const n = Number(searchFilesMaxFilesVisitedRaw);\n if (Number.isFinite(n) && n > 0) {\n this._searchFilesMaxFilesVisited.set(n);\n }\n }\n\n if (\n typeof searchFilesSkipDirsRaw === \"string\" &&\n searchFilesSkipDirsRaw.trim().length > 0\n ) {\n this._searchFilesSkipDirs.set(searchFilesSkipDirsRaw.trim());\n }\n }\n\n async setWebSearchProxyUrl(\n db: ShadowClawDatabase,\n proxyUrl: string,\n ): Promise<void> {\n const trimmed = proxyUrl.trim() || \"/proxy\";\n this._webSearchProxyUrl.set(trimmed);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_PROXY_URL, trimmed);\n }\n\n async setWebSearchUrl(db: ShadowClawDatabase, url: string): Promise<void> {\n const trimmed = url.trim() || \"https://html.duckduckgo.com/html/?q={query}\";\n this._webSearchUrl.set(trimmed);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_URL, trimmed);\n }\n\n async setWebSearchUseProxy(\n db: ShadowClawDatabase,\n useProxy: boolean,\n ): Promise<void> {\n const enabled = !!useProxy;\n this._webSearchUseProxy.set(enabled);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_USE_PROXY,\n enabled ? \"true\" : \"false\",\n );\n }\n\n async setSearchFilesMaxFileBytes(\n db: ShadowClawDatabase,\n bytes: number,\n ): Promise<void> {\n const clamped = Math.max(1, Math.round(bytes));\n this._searchFilesMaxFileBytes.set(clamped);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES,\n String(clamped),\n );\n }\n\n async setSearchFilesMaxFilesVisited(\n db: ShadowClawDatabase,\n count: number,\n ): Promise<void> {\n const clamped = Math.max(1, Math.round(count));\n this._searchFilesMaxFilesVisited.set(clamped);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED,\n String(clamped),\n );\n }\n\n async setSearchFilesSkipDirs(\n db: ShadowClawDatabase,\n dirs: string,\n ): Promise<void> {\n const trimmed = dirs.trim();\n this._searchFilesSkipDirs.set(trimmed);\n await setConfig(db, CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS, trimmed);\n }\n\n async removeCustomTool(\n db: ShadowClawDatabase,\n toolName: string,\n ): Promise<void> {\n const tools = this._customTools.get().filter((t) => t.name !== toolName);\n this._customTools.set(tools);\n const enabled = new Set(this._enabledToolNames.get());\n enabled.delete(toolName);\n this._enabledToolNames.set(enabled);\n await Promise.all([\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, tools),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...enabled]),\n ]);\n }\n\n async saveToActiveProfile(db: ShadowClawDatabase): Promise<void> {\n const id = this._activeProfileId.get();\n if (!id) {\n return;\n }\n\n const profile = this._profiles.get().find((p) => p.id === id);\n if (!profile) {\n return;\n }\n\n const updated = {\n ...profile,\n enabledToolNames: [...this._enabledToolNames.get()],\n customTools: [...this._customTools.get()],\n systemPromptOverride: this._systemPromptOverride.get(),\n };\n await this.updateProfile(db, updated);\n }\n\n async setAllEnabled(\n db: ShadowClawDatabase,\n toolNames: string[],\n ): Promise<void> {\n this._enabledToolNames.set(new Set(toolNames));\n\n const saves = [setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, toolNames)];\n if (this._activeProfileId.get()) {\n this._activeProfileId.set(null);\n saves.push(setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null));\n }\n\n await Promise.all(saves);\n }\n\n async setSystemPromptOverride(\n db: ShadowClawDatabase,\n override: string,\n ): Promise<void> {\n this._systemPromptOverride.set(override);\n await setConfig(db, CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE, override);\n }\n\n async setToolEnabled(\n db: ShadowClawDatabase,\n toolName: string,\n enabled: boolean,\n ): Promise<void> {\n const current = new Set(this._enabledToolNames.get());\n if (enabled) {\n current.add(toolName);\n } else {\n current.delete(toolName);\n }\n\n this._enabledToolNames.set(current);\n\n const saves = [setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...current])];\n if (this._activeProfileId.get()) {\n this._activeProfileId.set(null);\n saves.push(setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null));\n }\n\n await Promise.all(saves);\n }\n\n async updateProfile(\n db: ShadowClawDatabase,\n profile: ToolProfile,\n ): Promise<void> {\n const profiles = this._profiles\n .get()\n .map((p) => (p.id === profile.id ? profile : p));\n this._profiles.set(profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n}\n\nexport const toolsStore = new ToolsStore();\n"],"mappings":"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"}
|