shadow-claw 1.40.0 → 1.41.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 +2 -2
- package/.well-known/mcp/servers.json +1 -1
- package/.well-known/mcp.json +2 -2
- package/README.md +1 -0
- package/dist/cli/build/build.js +1 -1
- package/dist/cli/{chunk-Bfz2NYgD.js → chunk-0IeC97mU.js} +7 -7
- package/dist/cli/chunk-3oLxlxPn.js +1 -0
- package/dist/cli/{chunk-BXg4-9Rq2.js → chunk-8CrZyP1b2.js} +1 -1
- package/dist/cli/{chunk-BP5Hg6CM.js → chunk-B--ueArB.js} +1 -1
- package/dist/cli/chunk-BIh7rXlJ2.js +1 -0
- package/dist/cli/{chunk-Drr0VSGA2.js → chunk-BKnTOLLS2.js} +1 -1
- package/dist/cli/{chunk-C5PuRV08.js → chunk-BLMC1Bxv.js} +1 -1
- package/dist/cli/{chunk-B2tNSlFy2.js → chunk-BOigzz2U2.js} +1 -1
- package/dist/cli/{chunk-DOf3DZdR.js → chunk-BOzn335y.js} +1 -1
- package/dist/cli/chunk-BjOeVLb42.js +1 -0
- package/dist/cli/{chunk-DqTx0rRp2.js → chunk-Bjqh5_SU2.js} +1 -1
- package/dist/cli/chunk-BqWBd_jF2.js +1 -0
- package/dist/cli/{chunk-Bc9nRNyN.js → chunk-BvVUnHTq.js} +12 -9
- package/dist/cli/{chunk-DIbSoQmd2.js → chunk-C6FFByBU2.js} +2 -2
- package/dist/cli/{chunk-Drq18VZe.js → chunk-C9-aL3rF.js} +1 -1
- package/dist/cli/{chunk-BUhqHeEA2.js → chunk-C9czddEh2.js} +2 -2
- package/dist/cli/chunk-CCx8WOwz2.js +1 -0
- package/dist/cli/{chunk-BkMSjVJb.js → chunk-CK6ejMig.js} +1 -1
- package/dist/cli/chunk-CUUERioR2.js +1 -0
- package/dist/cli/chunk-CXAobnJd.js +1 -0
- package/dist/cli/chunk-CY1X0pOF2.js +1 -0
- package/dist/cli/chunk-CZvvgLVv.js +1 -0
- package/dist/cli/chunk-CbcwbfJB.js +1 -0
- package/dist/cli/{chunk-quilB3TV2.js → chunk-Ci9OJGcd2.js} +1 -1
- package/dist/cli/chunk-Cj9wl0qx.js +1 -0
- package/dist/cli/{chunk-3gRhOmGo2.js → chunk-CjJsVrKI2.js} +1 -1
- package/dist/cli/{chunk-CmEfzm-_.js → chunk-ClPZ4Rea.js} +1 -1
- package/dist/cli/{chunk-WMPAfIvV2.js → chunk-DHJCGRuG2.js} +1 -1
- package/dist/cli/{chunk-C7Y2xIk4.js → chunk-DKVkYTV9.js} +1 -1
- package/dist/cli/chunk-DR2XtWRo.js +1 -0
- package/dist/cli/{chunk-DID5VvOG.js → chunk-DTES-dE6.js} +3 -3
- package/dist/cli/{chunk-BiVJVh_S.js → chunk-DUlIqkaX.js} +7 -7
- package/dist/cli/{chunk-CkpueGaZ2.js → chunk-DjWle8FF2.js} +1 -1
- package/dist/cli/{chunk-CSvHmNOk.js → chunk-DmRXVLfy.js} +1 -1
- package/dist/cli/{chunk-BT1xXZn72.js → chunk-HlSiTC-u2.js} +1 -1
- package/dist/cli/{chunk-da0bsiOn.js → chunk-P4JSeFBI.js} +1 -1
- package/dist/cli/chunk-UcNbHaRQ.js +1 -0
- package/dist/cli/{chunk-BXFHFbEd.js → chunk-UweLmfQS.js} +1 -1
- package/dist/cli/chunk-bQQkVCw-.js +94 -0
- package/dist/cli/{chunk-CGiXWHTi2.js → chunk-gwpxl-0W2.js} +1 -1
- package/dist/cli/{chunk-NH8koEis2.js → chunk-nmDhxXH_2.js} +1 -1
- package/dist/cli/chunk-p0n_c-I2.js +1 -0
- package/dist/cli/{chunk-D7xP72La.js → chunk-q7r4FosZ.js} +1 -1
- package/dist/cli/cli.js +3 -3
- package/dist/cli/prerender/dsd-shell/prerender-dsd-shell.js +1 -1
- package/dist/electron/main.cjs +1 -1
- package/dist/headless-agent.js +1 -1
- package/dist/lib/{app-routes-BAEMLu9g.js → app-routes-CKkiX12g.js} +7 -2
- package/dist/lib/app-routes-CKkiX12g.js.map +1 -0
- package/dist/lib/components/index.js +26 -26
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.d.ts +10 -0
- package/dist/lib/components/shadow-claw-a2ui.js +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer/shadow-claw-file-viewer.d.ts +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{config-CPHDmyTx.js → config-DZkF9LiO.js} +2 -2
- package/dist/lib/{config-CPHDmyTx.js.map → config-DZkF9LiO.js.map} +1 -1
- package/dist/lib/{configurePeerJs-BsJoycQd.js → configurePeerJs-B3IE9BY2.js} +3 -3
- package/dist/lib/{configurePeerJs-BsJoycQd.js.map → configurePeerJs-B3IE9BY2.js.map} +1 -1
- package/dist/lib/{connections-BdIru7bF.js → connections-CalJGWvZ.js} +2 -2
- package/dist/lib/{connections-BdIru7bF.js.map → connections-CalJGWvZ.js.map} +1 -1
- package/dist/lib/core/orchestrator/orchestrator-state.d.ts +2 -1
- package/dist/lib/core/orchestrator/orchestrator.d.ts +2 -1
- package/dist/lib/core/orchestrator/utils/operations/task.d.ts +1 -0
- package/dist/lib/{downloadGroupFile-Dn0KsMlV.js → downloadGroupFile-DDE1fIhJ.js} +2 -2
- package/dist/lib/{downloadGroupFile-Dn0KsMlV.js.map → downloadGroupFile-DDE1fIhJ.js.map} +1 -1
- package/dist/lib/{file-viewer-BYrXXu-X.js → file-viewer-Bll2EoGc.js} +5 -5
- package/dist/lib/{file-viewer-BYrXXu-X.js.map → file-viewer-Bll2EoGc.js.map} +1 -1
- package/dist/lib/{getGroupDir-DF-RZO8X.js → getGroupDir-MHv7Lvmp.js} +4 -4
- package/dist/lib/{getGroupDir-DF-RZO8X.js.map → getGroupDir-MHv7Lvmp.js.map} +1 -1
- package/dist/lib/{git-s_0cgKm1.js → git-Bv_M3dgw.js} +3 -3
- package/dist/lib/{git-s_0cgKm1.js.map → git-Bv_M3dgw.js.map} +1 -1
- package/dist/lib/{iframe-sanitizer-DFdda1jJ.js → iframe-sanitizer-C7ZGDjEI.js} +2 -2
- package/dist/lib/{iframe-sanitizer-DFdda1jJ.js.map → iframe-sanitizer-C7ZGDjEI.js.map} +1 -1
- package/dist/lib/{iframe-storage-proxy-qrhZmQyO.js → iframe-storage-proxy-CR8ZYHPd.js} +2 -2
- package/dist/lib/{iframe-storage-proxy-qrhZmQyO.js.map → iframe-storage-proxy-CR8ZYHPd.js.map} +1 -1
- package/dist/lib/index.js +27 -27
- package/dist/lib/{initChatSplitResize-DuNlwCuI.js → initChatSplitResize-DiKTI-wk.js} +2 -2
- package/dist/lib/{initChatSplitResize-DuNlwCuI.js.map → initChatSplitResize-DiKTI-wk.js.map} +1 -1
- package/dist/lib/{initControlPlane-D4UZ4EhV.js → initControlPlane-CzjtQ4aM.js} +15 -15
- package/dist/lib/{initControlPlane-D4UZ4EhV.js.map → initControlPlane-CzjtQ4aM.js.map} +1 -1
- package/dist/lib/{markdown-CRRwbN9h.js → markdown-k8wA9LKy.js} +4 -4
- package/dist/lib/{markdown-CRRwbN9h.js.map → markdown-k8wA9LKy.js.map} +1 -1
- package/dist/lib/{mcp-reconnect-COdZ-cea.js → mcp-reconnect-CGIdfZnS.js} +2 -2
- package/dist/lib/{mcp-reconnect-COdZ-cea.js.map → mcp-reconnect-CGIdfZnS.js.map} +1 -1
- package/dist/lib/{memoryStorage-BsMe2FOQ.js → memoryStorage-DL-Bo3dh.js} +2 -2
- package/dist/lib/{memoryStorage-BsMe2FOQ.js.map → memoryStorage-DL-Bo3dh.js.map} +1 -1
- package/dist/lib/{orchestrator-D9f5fDCb.js → orchestrator-DKHCoikY.js} +11 -11
- package/dist/lib/{orchestrator-D9f5fDCb.js.map → orchestrator-DKHCoikY.js.map} +1 -1
- package/dist/lib/{orchestrator-Bq9ft3uG.js → orchestrator-Dn1ZOz9B.js} +20 -24
- package/dist/lib/orchestrator-Dn1ZOz9B.js.map +1 -0
- package/dist/lib/{peerjs-6u8KtenE.js → peerjs-BK41iBvP.js} +7 -7
- package/dist/lib/{peerjs-6u8KtenE.js.map → peerjs-BK41iBvP.js.map} +1 -1
- package/dist/lib/{push-client-DCnB2-OU.js → push-client-DKgVFD2Z.js} +3 -3
- package/dist/lib/{push-client-DCnB2-OU.js.map → push-client-DKgVFD2Z.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-nKNJ6sbl.js → readGroupFileBytes-CgU_UfGv.js} +2 -2
- package/dist/lib/{readGroupFileBytes-nKNJ6sbl.js.map → readGroupFileBytes-CgU_UfGv.js.map} +1 -1
- package/dist/lib/{shadow-claw-MumteAJy.js → shadow-claw-CtCj5Rn_.js} +121 -16
- package/dist/lib/shadow-claw-CtCj5Rn_.js.map +1 -0
- package/dist/lib/{shadow-claw-a2ui-Dipe8nY2.js → shadow-claw-a2ui-CvK5w940.js} +2 -2
- package/dist/lib/{shadow-claw-a2ui-Dipe8nY2.js.map → shadow-claw-a2ui-CvK5w940.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-BgCkz3Zv.js → shadow-claw-accounts-Br3XdHro.js} +3 -3
- package/dist/lib/{shadow-claw-accounts-BgCkz3Zv.js.map → shadow-claw-accounts-Br3XdHro.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-CIm_Bxd2.js → shadow-claw-channel-config-Da2dN19M.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-CIm_Bxd2.js.map → shadow-claw-channel-config-Da2dN19M.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-CaceK52s.js → shadow-claw-channels-BofYHgz8.js} +3 -3
- package/dist/lib/{shadow-claw-channels-CaceK52s.js.map → shadow-claw-channels-BofYHgz8.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-BD18-mAR.js → shadow-claw-chat-Dw32DPV2.js} +12 -12
- package/dist/lib/{shadow-claw-chat-BD18-mAR.js.map → shadow-claw-chat-Dw32DPV2.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-U6LsfRPm.js → shadow-claw-control-plane-CwFotFDh.js} +7 -7
- package/dist/lib/{shadow-claw-control-plane-U6LsfRPm.js.map → shadow-claw-control-plane-CwFotFDh.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-CDsza_oB.js → shadow-claw-conversations-0UXge23k.js} +5 -5
- package/dist/lib/{shadow-claw-conversations-CDsza_oB.js.map → shadow-claw-conversations-0UXge23k.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-CMOnFmcP.js → shadow-claw-file-viewer-CAsn9NxH.js} +30 -30
- package/dist/lib/{shadow-claw-file-viewer-CMOnFmcP.js.map → shadow-claw-file-viewer-CAsn9NxH.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-BI0P3m8a.js → shadow-claw-files-xGGhsHNH.js} +9 -9
- package/dist/lib/{shadow-claw-files-BI0P3m8a.js.map → shadow-claw-files-xGGhsHNH.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-xRApLEMN.js → shadow-claw-git-B606hcMU.js} +6 -6
- package/dist/lib/{shadow-claw-git-xRApLEMN.js.map → shadow-claw-git-B606hcMU.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-B2e1Nfg1.js → shadow-claw-integrations-Bwq5cba1.js} +4 -4
- package/dist/lib/{shadow-claw-integrations-B2e1Nfg1.js.map → shadow-claw-integrations-Bwq5cba1.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-Bc2mWuGb.js → shadow-claw-llm-BgpcMBIy.js} +6 -6
- package/dist/lib/{shadow-claw-llm-Bc2mWuGb.js.map → shadow-claw-llm-BgpcMBIy.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-D_Bh3aeC.js → shadow-claw-mcp-remote-DvQCA-Bk.js} +4 -4
- package/dist/lib/{shadow-claw-mcp-remote-D_Bh3aeC.js.map → shadow-claw-mcp-remote-DvQCA-Bk.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-F5W3n5ci.js → shadow-claw-networking-Cxvf9c7E.js} +2 -2
- package/dist/lib/{shadow-claw-networking-F5W3n5ci.js.map → shadow-claw-networking-Cxvf9c7E.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-lvMt9WJ1.js → shadow-claw-notifications-CGVcFYBy.js} +3 -3
- package/dist/lib/{shadow-claw-notifications-lvMt9WJ1.js.map → shadow-claw-notifications-CGVcFYBy.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-6gq6EMqX.js → shadow-claw-page-header-DAYz3I_o.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-6gq6EMqX.js.map → shadow-claw-page-header-DAYz3I_o.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-Bo8_z2S-.js → shadow-claw-pages-BLeEZb9k.js} +24 -12
- package/dist/lib/shadow-claw-pages-BLeEZb9k.js.map +1 -0
- package/dist/lib/{shadow-claw-peerjs-DRTLCVDQ.js → shadow-claw-peerjs-BcFnbK74.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-DRTLCVDQ.js.map → shadow-claw-peerjs-BcFnbK74.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-D00B4p4L.js → shadow-claw-settings-B7o0Z4hu.js} +9 -9
- package/dist/lib/{shadow-claw-settings-D00B4p4L.js.map → shadow-claw-settings-B7o0Z4hu.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-DgMe7-Zo.js → shadow-claw-storage-afMVqB7E.js} +5 -5
- package/dist/lib/{shadow-claw-storage-DgMe7-Zo.js.map → shadow-claw-storage-afMVqB7E.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-D103YOuI.js → shadow-claw-task-server-B9-MQjl6.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-D103YOuI.js.map → shadow-claw-task-server-B9-MQjl6.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-6OhALkq1.js → shadow-claw-tasks-Dc4BC-t-.js} +8 -8
- package/dist/lib/{shadow-claw-tasks-6OhALkq1.js.map → shadow-claw-tasks-Dc4BC-t-.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-BGtxA1qD.js → shadow-claw-terminal-BINcTdsk.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-BGtxA1qD.js.map → shadow-claw-terminal-BINcTdsk.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-OeIwAnnd.js → shadow-claw-tools-BjFgXNLR.js} +7 -7
- package/dist/lib/{shadow-claw-tools-OeIwAnnd.js.map → shadow-claw-tools-BjFgXNLR.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-gVFZ197u.js → shadow-claw-webvm-Xe3ByMDw.js} +3 -3
- package/dist/lib/{shadow-claw-webvm-gVFZ197u.js.map → shadow-claw-webvm-Xe3ByMDw.js.map} +1 -1
- package/dist/lib/subsystems/mcp/webmcp.d.ts +64 -0
- package/dist/lib/{syncWebMcpRegistration-Bbph0XZl.js → syncWebMcpRegistration-D7alChz0.js} +21 -6
- package/dist/lib/syncWebMcpRegistration-D7alChz0.js.map +1 -0
- package/dist/lib/{tools-D0OlSzMD.js → tools-Cmhpk3X8.js} +4 -4
- package/dist/lib/{tools-D0OlSzMD.js.map → tools-Cmhpk3X8.js.map} +1 -1
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/namespacedStorage.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/{utils-DYdrO2KI.js → utils-CzgKe_XZ.js} +4 -4
- package/dist/lib/{utils-DYdrO2KI.js.map → utils-CzgKe_XZ.js.map} +1 -1
- package/dist/lib/{webmcp-D2bocsgh.js → webmcp-oEP9YpR2.js} +119 -3
- package/dist/lib/{webmcp-D2bocsgh.js.map → webmcp-oEP9YpR2.js.map} +1 -1
- package/dist/public/.well-known/mcp/server-card.json +2 -2
- package/dist/public/.well-known/mcp/servers.json +1 -1
- package/dist/public/.well-known/mcp.json +2 -2
- package/dist/public/AGENTS.md +2 -1
- package/dist/public/README.md +1 -0
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/app-routes-C6-H2zPH.js +1 -0
- 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-pages/shadow-claw-pages.css +1 -1
- package/dist/public/{config-D4lVqMs8.js → config-Dewnqegf.js} +1 -1
- package/dist/public/{configurePeerJs-DDOAVSaH.js → configurePeerJs-CaPU2sN5.js} +1 -1
- package/dist/public/{connections-CiukjGiH.js → connections-CwE7jE9l.js} +1 -1
- package/dist/public/{custom-element-security-piU2U-Ec.js → custom-element-security-DLgHMf5R.js} +1 -1
- package/dist/public/docs/decisions/native-web-components-and-signals.md +1 -1
- package/dist/public/docs/example/article/index.html +5 -5
- package/dist/public/docs/guides/publishing-to-github-pages.md +49 -6
- package/dist/public/docs/publishing/index.html +5 -5
- package/dist/public/docs/skill-creator/index.html +5 -5
- package/dist/public/docs/subsystems/pages.md +10 -3
- package/dist/public/docs/subsystems/webmcp.md +89 -1
- package/dist/public/{downloadGroupFile-BiZQYY-O.js → downloadGroupFile-ChWHuap_.js} +1 -1
- package/dist/public/e2e/README.md +2 -2
- package/dist/public/{e2e-bridge-CybB810Q.js → e2e-bridge-BkaldjV2.js} +1 -1
- package/dist/public/{file-viewer-DLUBvOVD.js → file-viewer-Df4qUJCn.js} +1 -1
- package/dist/public/{getGroupDir-CLz5c8cg.js → getGroupDir-CeSr4fzS.js} +1 -1
- package/dist/public/{git-Ba8AeviI.js → git-Bscc1tK-.js} +2 -2
- package/dist/public/{iframe-sanitizer-CKOO7cxp.js → iframe-sanitizer-BVdkQsor.js} +1 -1
- package/dist/public/{iframe-storage-proxy-BvRiccH0.js → iframe-storage-proxy-Cg8aFw7o.js} +1 -1
- package/dist/public/index.css +1 -1
- package/dist/public/index.html +5 -5
- package/dist/public/index.js +1 -1
- package/dist/public/{initChatSplitResize-osJXM2gu.js → initChatSplitResize-C3Rp1LeZ.js} +1 -1
- package/dist/public/{initControlPlane-CNggzsRw.js → initControlPlane-C1pnzG16.js} +1 -1
- package/dist/public/llms.txt +1 -1
- package/dist/public/main/index.html +5 -5
- package/dist/public/main/memory/index.html +5 -5
- package/dist/public/{markdown-CZA-Ye2Q.js → markdown-D3A902nT.js} +1 -1
- package/dist/public/{mcp-reconnect-BK1bYBdC.js → mcp-reconnect-BJWxQBm_.js} +1 -1
- package/dist/public/{memoryStorage-Bew1X8Uy.js → memoryStorage-ykv-Ri-y.js} +1 -1
- package/dist/public/{orchestrator-D6tel2Zp.js → orchestrator-BVnC4Vtt.js} +2 -2
- package/dist/public/{orchestrator-BLkS_jpm.js → orchestrator-CQcc7OFA.js} +2 -2
- package/dist/public/{peerjs-CYs1F7sq.js → peerjs-CYC2cI1Y.js} +1 -1
- package/dist/public/{push-client-_HUyJlFJ.js → push-client-BJrnOULM.js} +1 -1
- package/dist/public/service-worker/fetch-proxy.js +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-DmrxnX3Q.js → shadow-claw-WwfOu-tu.js} +33 -3
- package/dist/public/{shadow-claw-accounts-BqGrm47Z.js → shadow-claw-accounts-BFZxrPsH.js} +1 -1
- package/dist/public/{shadow-claw-channels-Ci2UPaaA.js → shadow-claw-channels-C0w0c1EF.js} +1 -1
- package/dist/public/{shadow-claw-chat-BxR6cBYQ.js → shadow-claw-chat-DIJ0A-QN.js} +1 -1
- package/dist/public/{shadow-claw-control-plane-C1A-CZ9H.js → shadow-claw-control-plane-DZoxUd-1.js} +2 -2
- package/dist/public/{shadow-claw-conversations-DcwG05-H.js → shadow-claw-conversations-DMyG_5zj.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-a_uRA30F.js → shadow-claw-file-viewer-DYgZjZb9.js} +2 -2
- package/dist/public/{shadow-claw-files-B774Xz1d.js → shadow-claw-files-DIOUdKJr.js} +1 -1
- package/dist/public/{shadow-claw-git-CTIPP0vs.js → shadow-claw-git-if5S0QJr.js} +2 -2
- package/dist/public/{shadow-claw-integrations-CjtkA6l0.js → shadow-claw-integrations-BQt4hcWe.js} +1 -1
- package/dist/public/{shadow-claw-llm-DfmITHde.js → shadow-claw-llm-9uf1KFA0.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-BPuV22So.js → shadow-claw-mcp-remote-COpNIzJd.js} +1 -1
- package/dist/public/{shadow-claw-networking-DEMMygy0.js → shadow-claw-networking-AOVRUn6B.js} +1 -1
- package/dist/public/{shadow-claw-notifications-B9Xhcj1P.js → shadow-claw-notifications-CKB-W1TA.js} +1 -1
- package/dist/public/{shadow-claw-page-header-CAXokjQy.js → shadow-claw-page-header-D4LmUigA.js} +1 -1
- package/dist/public/{shadow-claw-pages-BRQw8bTm.js → shadow-claw-pages-BpHRY4vH.js} +12 -3
- package/dist/public/{shadow-claw-settings-BGrDNyqh.js → shadow-claw-settings-CE-aUo_J.js} +3 -3
- package/dist/public/{shadow-claw-storage-DK3pf11w.js → shadow-claw-storage-CFKC-Y3V.js} +1 -1
- package/dist/public/{shadow-claw-task-server-CMp5Vjza.js → shadow-claw-task-server-B_ZjqK4B.js} +1 -1
- package/dist/public/{shadow-claw-tasks-BO8aXM2B.js → shadow-claw-tasks-CGsEv48K.js} +1 -1
- package/dist/public/{shadow-claw-terminal-BSeTuyDa.js → shadow-claw-terminal-DcaS7cPH.js} +1 -1
- package/dist/public/{shadow-claw-tools-Bj6DLZ-2.js → shadow-claw-tools-Cnu9hKy0.js} +1 -1
- package/dist/public/{shadow-claw-webvm-M7d5RH8H.js → shadow-claw-webvm-BB8SFvJ8.js} +1 -1
- package/dist/public/syncWebMcpRegistration-D2Zx4oA1.js +1 -0
- package/dist/public/theme-init.js +1 -1
- package/dist/public/{tools-nysPKnGT.js → tools-sOLCHTj8.js} +1 -1
- package/dist/public/{webmcp-Bo3KTgRb.js → webmcp-YFt6vM1_.js} +1 -1
- package/dist/server.js +189 -189
- package/package.json +1 -1
- package/src/cli/cli.ts +2 -2
- package/src/cli/prerender/dsd-shell/prerender-dsd-shell.test.ts +4 -1
- package/src/cli/prerender/dsd-shell/prerender-dsd-shell.ts +7 -1
- package/src/cli/prerender/utils/insert-before-closing-head.test.ts +12 -0
- package/src/cli/prerender/utils/insert-before-closing-head.ts +4 -6
- package/src/cli/site-config/apply.test.ts +90 -0
- package/src/cli/site-config/apply.ts +181 -13
- package/src/components/shadow-claw/shadow-claw.css +26 -0
- package/src/components/shadow-claw/shadow-claw.html +4 -0
- package/src/components/shadow-claw/utils/applyRoute.ts +3 -0
- package/src/components/shadow-claw/utils/bindEventListeners.test.ts +6 -0
- package/src/components/shadow-claw/utils/bindEventListeners.ts +30 -1
- package/src/components/shadow-claw/utils/getRoute.test.ts +52 -0
- package/src/components/shadow-claw/utils/getRoute.ts +18 -0
- package/src/components/shadow-claw/utils/navigateToRoute.test.ts +21 -0
- package/src/components/shadow-claw/utils/navigateToRoute.ts +10 -0
- package/src/components/shadow-claw/utils/sidebarVisibility.ts +12 -4
- package/src/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.test.ts +93 -0
- package/src/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.ts +100 -0
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +31 -31
- package/src/components/shadow-claw-pages/shadow-claw-pages.css +10 -1
- package/src/components/shadow-claw-pages/utils/removePreviewIframe.ts +3 -0
- package/src/core/effect.test.ts +19 -0
- package/src/core/orchestrator/orchestrator-state.ts +2 -1
- package/src/core/orchestrator/orchestrator.test.ts +686 -5
- package/src/core/orchestrator/orchestrator.ts +3 -10
- package/src/core/orchestrator/utils/compactContext.test.ts +423 -121
- package/src/core/orchestrator/utils/configurePeerJs.test.ts +27 -0
- package/src/core/orchestrator/utils/deliverResponse.test.ts +127 -0
- package/src/core/orchestrator/utils/dispatchSubagentInvoke.test.ts +23 -0
- package/src/core/orchestrator/utils/enqueue.test.ts +520 -86
- package/src/core/orchestrator/utils/handleWorkerMessage.test.ts +664 -144
- package/src/core/orchestrator/utils/initTasks.node.test.ts +147 -0
- package/src/core/orchestrator/utils/initTasks.test.ts +926 -191
- package/src/core/orchestrator/utils/initTasks.ts +5 -4
- package/src/core/orchestrator/utils/invokeAgent.test.ts +563 -110
- package/src/core/orchestrator/utils/invokeAgent.ts +8 -10
- package/src/core/orchestrator/utils/loadChannelConfigurations.test.ts +50 -0
- package/src/core/orchestrator/utils/operations/channel.test.ts +377 -170
- package/src/core/orchestrator/utils/operations/provider.test.ts +663 -85
- package/src/core/orchestrator/utils/operations/room.test.ts +74 -11
- package/src/core/orchestrator/utils/operations/task.test.ts +452 -56
- package/src/core/orchestrator/utils/operations/task.ts +1 -1
- package/src/core/orchestrator/utils/operations/vm.test.ts +66 -7
- package/src/core/orchestrator/utils/parseDirectToolCommand.test.ts +6 -0
- package/src/core/orchestrator/utils/settings.test.ts +248 -81
- package/src/core/orchestrator/utils/setupPushTaskListener.test.ts +58 -0
- package/src/core/orchestrator/utils/syncWebMcpRegistration.test.ts +392 -64
- package/src/core/orchestrator/utils/syncWebMcpRegistration.ts +32 -3
- package/src/server/middleware/static-files.test.ts +36 -0
- package/src/server/middleware/static-files.ts +14 -6
- package/src/server/routes/mcp.ts +2 -2
- package/src/storage/staticRouting.test.ts +36 -0
- package/src/storage/staticRouting.ts +31 -3
- package/src/stores/file-viewer.test.ts +11 -0
- package/src/stores/theme.test.ts +41 -2
- package/src/stores/toast.test.ts +25 -0
- package/src/subsystems/mcp/webmcp.test.ts +255 -0
- package/src/subsystems/mcp/webmcp.ts +253 -0
- package/src/worker/tools/bash/native-bash-executor.test.ts +31 -1
- package/src/worker/tools/git/utils/extractConflictPaths.test.ts +24 -0
- package/src/worker/tools/git/utils/parseConflictRegions.test.ts +46 -0
- package/src/worker/tools/git/utils/resolveCorsProxy.test.ts +26 -5
- package/src/worker/tools/git/utils/truncateSnippet.test.ts +16 -0
- package/src/worker/tools/node-transformers-executor.test.ts +105 -6
- package/src/worker/tools/remote-mcp/remote-mcp.test.ts +172 -47
- package/src/worker/tools/remote-mcp/utils/formatListToolsOutput.test.ts +19 -0
- package/src/worker/tools/remote-mcp/utils/isMcpReauthError.test.ts +45 -0
- package/src/worker/tools/remote-mcp/utils/resolveMcpReauth.test.ts +48 -0
- package/src/worker/tools/rooms/list-room-members.test.ts +24 -10
- package/src/worker/tools/tasks/list-tasks.test.ts +39 -8
- package/src/worker/tools/tasks/update-task.test.ts +78 -14
- package/src/worker/tools/ui/javascript.test.ts +70 -17
- package/src/worker/tools/ui/list-tool-profiles.test.ts +31 -9
- package/dist/cli/chunk-00GAzVPl2.js +0 -1
- package/dist/cli/chunk-2hnFoNNC.js +0 -1
- package/dist/cli/chunk-BKQL4nzF2.js +0 -1
- package/dist/cli/chunk-BQ4K3fqj2.js +0 -1
- package/dist/cli/chunk-BVCGo6uf2.js +0 -1
- package/dist/cli/chunk-BcTH_-FL.js +0 -1
- package/dist/cli/chunk-BmD_sPRt.js +0 -1
- package/dist/cli/chunk-BsxNqqer.js +0 -1
- package/dist/cli/chunk-CCcF5T-c.js +0 -1
- package/dist/cli/chunk-CFhvwUeL.js +0 -91
- package/dist/cli/chunk-CwWtvULn.js +0 -1
- package/dist/cli/chunk-Drf-hXIR2.js +0 -1
- package/dist/cli/chunk-Dt5HNYVi.js +0 -1
- package/dist/cli/chunk-DwZQi9Ax.js +0 -1
- package/dist/cli/chunk-m9ZX7TyF2.js +0 -1
- package/dist/lib/app-routes-BAEMLu9g.js.map +0 -1
- package/dist/lib/orchestrator-Bq9ft3uG.js.map +0 -1
- package/dist/lib/shadow-claw-MumteAJy.js.map +0 -1
- package/dist/lib/shadow-claw-pages-Bo8_z2S-.js.map +0 -1
- package/dist/lib/syncWebMcpRegistration-Bbph0XZl.js.map +0 -1
- package/dist/public/app-routes-BMQ4HFaM.js +0 -1
- package/dist/public/syncWebMcpRegistration-4bT0YUyZ.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as applyBasePath } from "./app-routes-
|
|
1
|
+
import { n as applyBasePath } from "./app-routes-CKkiX12g.js";
|
|
2
2
|
|
|
3
3
|
//#region src/ui/iframe-theme.ts
|
|
4
4
|
/**
|
|
@@ -342,4 +342,4 @@ async function iframeStorageClear(namespace) {
|
|
|
342
342
|
|
|
343
343
|
//#endregion
|
|
344
344
|
export { iframeStorageSet as a, getIframeThemeStyleHtml as c, iframeStorageGetAll as i, getIframeThemeStylesheetLink as l, iframeStorageDelete as n, IframeBroadcastProxy as o, iframeStorageGet as r, getIframeHtmlClass as s, iframeStorageClear as t };
|
|
345
|
-
//# sourceMappingURL=iframe-storage-proxy-
|
|
345
|
+
//# sourceMappingURL=iframe-storage-proxy-CR8ZYHPd.js.map
|
package/dist/lib/{iframe-storage-proxy-qrhZmQyO.js.map → iframe-storage-proxy-CR8ZYHPd.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iframe-storage-proxy-qrhZmQyO.js","names":[],"sources":["../../src/ui/iframe-theme.ts","../../src/components/shadow-claw-pages/utils/iframe-broadcast-proxy.ts","../../src/components/shadow-claw-pages/utils/iframe-storage-proxy.ts"],"sourcesContent":["import { applyBasePath } from \"../core/app-routes.js\";\n\n/**\n * Prefixes whose contents are flattened into the distribution root.\n */\nconst FLATTENED_STYLESHEET_PREFIXES = [\n \"pages/resources/\",\n \"pages/deps/\",\n \"resources/\",\n \"deps/\",\n \"pages/assets/\",\n \"pages/main/assets/\",\n];\n\n/**\n * Resolves a configured theme.stylesheet path to its actual distribution path.\n */\nexport function resolveThemeStylesheetHref(stylesheet: string): string {\n for (const prefix of FLATTENED_STYLESHEET_PREFIXES) {\n if (stylesheet.startsWith(prefix)) {\n return stylesheet.slice(prefix.length);\n }\n }\n return stylesheet;\n}\n\n/**\n * Generates an optional `<link rel=\"stylesheet\">` tag for the preview iframe\n * only when a theme stylesheet is explicitly configured in site configuration.\n * When not configured, returns an empty string to avoid 404 requests.\n */\nexport function getIframeThemeStylesheetLink(siteConfig?: unknown): string {\n let stylesheet: string | undefined;\n\n if (siteConfig && typeof siteConfig === \"object\") {\n const rawTheme = (siteConfig as { theme?: { stylesheet?: unknown } }).theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } else if (typeof document !== \"undefined\") {\n const configScript = document.getElementById(\"shadow-claw-site-config\");\n if (configScript?.textContent) {\n try {\n const config = JSON.parse(configScript.textContent);\n const rawTheme = config?.theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } catch {}\n }\n }\n\n if (!stylesheet) {\n return \"\";\n }\n\n const isExternal =\n stylesheet.startsWith(\"http://\") ||\n stylesheet.startsWith(\"https://\") ||\n stylesheet.startsWith(\"//\");\n\n if (isExternal) {\n return `<link rel=\"stylesheet\" href=\"${stylesheet}\">`;\n }\n\n const resolvedHref = resolveThemeStylesheetHref(stylesheet);\n const normalizedPath = resolvedHref.startsWith(\"/\")\n ? resolvedHref\n : `/${resolvedHref}`;\n\n return `<link rel=\"stylesheet\" href=\"${applyBasePath(normalizedPath)}\">`;\n}\n\n/**\n * Generates the CSS style block and html root class for sandboxed preview iframes\n * (file viewer and pages HTML preview) to synchronize theme CSS variables,\n * fonts, link styling, and dark/light mode color-scheme without FOUC.\n */\nexport function getIframeThemeStyleHtml(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n const customProperties: string[] = [];\n\n if (typeof document !== \"undefined\") {\n const styles = getComputedStyle(document.documentElement);\n for (let i = 0; i < styles.length; i++) {\n const prop = styles[i];\n if (prop.startsWith(\"--\")) {\n customProperties.push(`${prop}: ${styles.getPropertyValue(prop)};`);\n }\n }\n }\n\n return [\n \"<style>\",\n \" :root {\",\n ` color-scheme: ${isDark ? \"dark\" : \"light\"};`,\n ` overflow: hidden;`,\n ` line-height: 1.5;`,\n ` ${customProperties.join(\"\\n \")}`,\n \" }\",\n \" * {\",\n \" scrollbar-width: thin;\",\n \" scrollbar-color: var(--shadow-claw-border-color) transparent;\",\n \" }\",\n \" ::-webkit-scrollbar {\",\n \" height: 0.5rem;\",\n \" width: 0.5rem;\",\n \" }\",\n \" ::-webkit-scrollbar-track {\",\n \" background: transparent;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb {\",\n \" background: var(--shadow-claw-border-color);\",\n \" border-radius: 0.25rem;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb:hover {\",\n \" background: var(--shadow-claw-text-tertiary);\",\n \" }\",\n \" body {\",\n \" color: var(--shadow-claw-text-primary);\",\n \" background-color: var(--shadow-claw-bg-primary);\",\n \" font-family: var(--shadow-claw-font-sans);\",\n \" margin: 0;\",\n \" }\",\n \" pre, code, kbd, samp {\",\n \" font-family: var(--shadow-claw-font-mono);\",\n \" }\",\n \" a {\",\n \" color: var(--shadow-claw-link);\",\n \" text-decoration: underline;\",\n \" text-underline-offset: 0.125rem;\",\n \" }\",\n \" a:hover {\",\n \" color: var(--shadow-claw-link-hover);\",\n \" }\",\n \" img {\",\n \" max-width: 100%;\",\n \" height: auto;\",\n \" }\",\n \" ul {\",\n \" line-height: 1.5;\",\n \" }\",\n \" article {\",\n \" padding: 1rem 1.5rem 1rem 1rem;\",\n \" }\",\n \" article > h1, article > h2 {\",\n \" margin-top: 0;\",\n \" }\",\n \"</style>\",\n ].join(\"\\n\");\n}\n\nexport function getIframeHtmlClass(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n\n return isDark ? \"dark-mode\" : \"light-mode\";\n}\n","/**\n * iframe-broadcast-proxy.ts\n *\n * Parent-side BroadcastChannel proxy for sandboxed iframes.\n * When allow-same-origin is omitted from preview iframes, the iframe operates\n * under an opaque (null) origin. Browser BroadcastChannel instances are partitioned\n * by origin, preventing direct communication between parent/worker tools and the iframe.\n *\n * This proxy is completely AGNOSTIC and generic. It dynamically tracks BroadcastChannels\n * instantiated on the parent origin and extracts channel names declaratively from tool\n * definitions registered via site-config/toolsStore.\n */\n\nexport class IframeBroadcastProxy {\n private commandChannels: Map<string, BroadcastChannel> = new Map();\n private originalBroadcastChannel: typeof BroadcastChannel | null = null;\n\n constructor(private getTargetWindow: () => WindowProxy | null) {\n if (typeof BroadcastChannel !== \"undefined\") {\n this.patchParentBroadcastChannel();\n }\n }\n\n /**\n * Automatically intercept BroadcastChannel creation on parent window to\n * dynamically track and forward any channel used by tools or parent scripts.\n */\n private patchParentBroadcastChannel(): void {\n if ((globalThis as any)._shadowClawParentBcPatched) {\n return;\n }\n (globalThis as any)._shadowClawParentBcPatched = true;\n\n const self = this;\n const NativeBc = globalThis.BroadcastChannel;\n this.originalBroadcastChannel = NativeBc;\n\n const WrappedBc = function (this: BroadcastChannel, channelName: string) {\n const instance = new NativeBc(channelName);\n self.registerChannel(channelName);\n return instance;\n } as any;\n\n WrappedBc.prototype = NativeBc.prototype;\n globalThis.BroadcastChannel = WrappedBc;\n }\n\n /**\n * Declaratively scan tool execution code definitions for BroadcastChannel names\n * and register them automatically.\n */\n public registerChannelsFromTools(\n tools: Array<{ execution?: { code?: string }; code?: string }>,\n ): void {\n if (!Array.isArray(tools)) return;\n\n const bcRegex = /new\\s+BroadcastChannel\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*\\)/g;\n for (const tool of tools) {\n const code = tool.execution?.code || tool.code || \"\";\n if (!code) continue;\n\n let match: RegExpExecArray | null;\n bcRegex.lastIndex = 0;\n while ((match = bcRegex.exec(code)) !== null) {\n if (match[1]) {\n this.registerChannel(match[1]);\n }\n }\n }\n }\n\n /**\n * Register a channel name to forward parent messages to the sandboxed iframe.\n */\n public registerChannel(channelName: string): void {\n if (\n typeof BroadcastChannel === \"undefined\" ||\n !channelName ||\n channelName.endsWith(\"-results\") ||\n this.commandChannels.has(channelName)\n ) {\n return;\n }\n this.listenOnCommandChannel(channelName);\n }\n\n private listenOnCommandChannel(channelName: string): void {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const bc = new NativeBc(channelName);\n bc.onmessage = (evt) => {\n const target = this.getTargetWindow();\n if (target) {\n target.postMessage(\n {\n type: \"shadow-claw-broadcast-command\",\n channel: channelName,\n payload: evt.data,\n },\n \"*\",\n );\n }\n };\n this.commandChannels.set(channelName, bc);\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to listen on channel ${channelName}:`,\n e,\n );\n }\n }\n\n /**\n * Handle incoming broadcast result/message from the sandboxed iframe and relay it\n * to the parent-origin BroadcastChannel.\n */\n public handleResultFromIframe(\n sourceWindow: WindowProxy,\n channelName: string,\n payload: unknown,\n ): boolean {\n const target = this.getTargetWindow();\n if (target && sourceWindow !== target) {\n return false;\n }\n\n if (channelName) {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const resBc = new NativeBc(channelName);\n resBc.postMessage(payload);\n resBc.close();\n return true;\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to relay result for channel ${channelName}:`,\n e,\n );\n }\n }\n return false;\n }\n\n public dispose(): void {\n for (const bc of this.commandChannels.values()) {\n try {\n bc.close();\n } catch (e) {}\n }\n this.commandChannels.clear();\n }\n}\n","/**\n * iframe-storage-proxy.ts\n *\n * Parent-side storage implementation for the iframe storage bridge.\n * Provides a namespaced IndexedDB key-value store that the parent frame\n * uses to proxy storage operations on behalf of sandboxed iframes that\n * lack direct storage access due to opaque-origin isolation.\n *\n * Each page gets its own namespace to prevent cross-page data leakage.\n */\n\nconst DB_NAME = \"shadow-claw-iframe-storage\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"kv\";\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDb(): Promise<IDBDatabase> {\n if (dbPromise) {\n return dbPromise;\n }\n\n dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n dbPromise = null;\n reject(request.error);\n };\n });\n\n return dbPromise;\n}\n\n/**\n * Build a composite key from a namespace and item key.\n */\nfunction compositeKey(namespace: string, key: string): string {\n return `${namespace}\\0${key}`;\n}\n\n/**\n * Set a value in the namespaced store.\n */\nexport async function iframeStorageSet(\n namespace: string,\n key: string,\n value: unknown,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).put(value, compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Get a single value from the namespaced store.\n */\nexport async function iframeStorageGet(\n namespace: string,\n key: string,\n): Promise<unknown> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const req = tx.objectStore(STORE_NAME).get(compositeKey(namespace, key));\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\n/**\n * Get all values for a namespace as a key-value object.\n */\nexport async function iframeStorageGetAll(\n namespace: string,\n): Promise<Record<string, unknown>> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const store = tx.objectStore(STORE_NAME);\n const result: Record<string, unknown> = {};\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve(result);\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n result[cursorKey.slice(prefix.length)] = cursor.value;\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n\n/**\n * Delete a single value from the namespaced store.\n */\nexport async function iframeStorageDelete(\n namespace: string,\n key: string,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).delete(compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all values for a namespace.\n */\nexport async function iframeStorageClear(namespace: string): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n const store = tx.objectStore(STORE_NAME);\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve();\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n cursor.delete();\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"iframe-storage-proxy-CR8ZYHPd.js","names":[],"sources":["../../src/ui/iframe-theme.ts","../../src/components/shadow-claw-pages/utils/iframe-broadcast-proxy.ts","../../src/components/shadow-claw-pages/utils/iframe-storage-proxy.ts"],"sourcesContent":["import { applyBasePath } from \"../core/app-routes.js\";\n\n/**\n * Prefixes whose contents are flattened into the distribution root.\n */\nconst FLATTENED_STYLESHEET_PREFIXES = [\n \"pages/resources/\",\n \"pages/deps/\",\n \"resources/\",\n \"deps/\",\n \"pages/assets/\",\n \"pages/main/assets/\",\n];\n\n/**\n * Resolves a configured theme.stylesheet path to its actual distribution path.\n */\nexport function resolveThemeStylesheetHref(stylesheet: string): string {\n for (const prefix of FLATTENED_STYLESHEET_PREFIXES) {\n if (stylesheet.startsWith(prefix)) {\n return stylesheet.slice(prefix.length);\n }\n }\n return stylesheet;\n}\n\n/**\n * Generates an optional `<link rel=\"stylesheet\">` tag for the preview iframe\n * only when a theme stylesheet is explicitly configured in site configuration.\n * When not configured, returns an empty string to avoid 404 requests.\n */\nexport function getIframeThemeStylesheetLink(siteConfig?: unknown): string {\n let stylesheet: string | undefined;\n\n if (siteConfig && typeof siteConfig === \"object\") {\n const rawTheme = (siteConfig as { theme?: { stylesheet?: unknown } }).theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } else if (typeof document !== \"undefined\") {\n const configScript = document.getElementById(\"shadow-claw-site-config\");\n if (configScript?.textContent) {\n try {\n const config = JSON.parse(configScript.textContent);\n const rawTheme = config?.theme;\n if (\n typeof rawTheme?.stylesheet === \"string\" &&\n rawTheme.stylesheet.trim()\n ) {\n stylesheet = rawTheme.stylesheet.trim();\n }\n } catch {}\n }\n }\n\n if (!stylesheet) {\n return \"\";\n }\n\n const isExternal =\n stylesheet.startsWith(\"http://\") ||\n stylesheet.startsWith(\"https://\") ||\n stylesheet.startsWith(\"//\");\n\n if (isExternal) {\n return `<link rel=\"stylesheet\" href=\"${stylesheet}\">`;\n }\n\n const resolvedHref = resolveThemeStylesheetHref(stylesheet);\n const normalizedPath = resolvedHref.startsWith(\"/\")\n ? resolvedHref\n : `/${resolvedHref}`;\n\n return `<link rel=\"stylesheet\" href=\"${applyBasePath(normalizedPath)}\">`;\n}\n\n/**\n * Generates the CSS style block and html root class for sandboxed preview iframes\n * (file viewer and pages HTML preview) to synchronize theme CSS variables,\n * fonts, link styling, and dark/light mode color-scheme without FOUC.\n */\nexport function getIframeThemeStyleHtml(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n const customProperties: string[] = [];\n\n if (typeof document !== \"undefined\") {\n const styles = getComputedStyle(document.documentElement);\n for (let i = 0; i < styles.length; i++) {\n const prop = styles[i];\n if (prop.startsWith(\"--\")) {\n customProperties.push(`${prop}: ${styles.getPropertyValue(prop)};`);\n }\n }\n }\n\n return [\n \"<style>\",\n \" :root {\",\n ` color-scheme: ${isDark ? \"dark\" : \"light\"};`,\n ` overflow: hidden;`,\n ` line-height: 1.5;`,\n ` ${customProperties.join(\"\\n \")}`,\n \" }\",\n \" * {\",\n \" scrollbar-width: thin;\",\n \" scrollbar-color: var(--shadow-claw-border-color) transparent;\",\n \" }\",\n \" ::-webkit-scrollbar {\",\n \" height: 0.5rem;\",\n \" width: 0.5rem;\",\n \" }\",\n \" ::-webkit-scrollbar-track {\",\n \" background: transparent;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb {\",\n \" background: var(--shadow-claw-border-color);\",\n \" border-radius: 0.25rem;\",\n \" }\",\n \" ::-webkit-scrollbar-thumb:hover {\",\n \" background: var(--shadow-claw-text-tertiary);\",\n \" }\",\n \" body {\",\n \" color: var(--shadow-claw-text-primary);\",\n \" background-color: var(--shadow-claw-bg-primary);\",\n \" font-family: var(--shadow-claw-font-sans);\",\n \" margin: 0;\",\n \" }\",\n \" pre, code, kbd, samp {\",\n \" font-family: var(--shadow-claw-font-mono);\",\n \" }\",\n \" a {\",\n \" color: var(--shadow-claw-link);\",\n \" text-decoration: underline;\",\n \" text-underline-offset: 0.125rem;\",\n \" }\",\n \" a:hover {\",\n \" color: var(--shadow-claw-link-hover);\",\n \" }\",\n \" img {\",\n \" max-width: 100%;\",\n \" height: auto;\",\n \" }\",\n \" ul {\",\n \" line-height: 1.5;\",\n \" }\",\n \" article {\",\n \" padding: 1rem 1.5rem 1rem 1rem;\",\n \" }\",\n \" article > h1, article > h2 {\",\n \" margin-top: 0;\",\n \" }\",\n \"</style>\",\n ].join(\"\\n\");\n}\n\nexport function getIframeHtmlClass(): string {\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark-mode\");\n\n return isDark ? \"dark-mode\" : \"light-mode\";\n}\n","/**\n * iframe-broadcast-proxy.ts\n *\n * Parent-side BroadcastChannel proxy for sandboxed iframes.\n * When allow-same-origin is omitted from preview iframes, the iframe operates\n * under an opaque (null) origin. Browser BroadcastChannel instances are partitioned\n * by origin, preventing direct communication between parent/worker tools and the iframe.\n *\n * This proxy is completely AGNOSTIC and generic. It dynamically tracks BroadcastChannels\n * instantiated on the parent origin and extracts channel names declaratively from tool\n * definitions registered via site-config/toolsStore.\n */\n\nexport class IframeBroadcastProxy {\n private commandChannels: Map<string, BroadcastChannel> = new Map();\n private originalBroadcastChannel: typeof BroadcastChannel | null = null;\n\n constructor(private getTargetWindow: () => WindowProxy | null) {\n if (typeof BroadcastChannel !== \"undefined\") {\n this.patchParentBroadcastChannel();\n }\n }\n\n /**\n * Automatically intercept BroadcastChannel creation on parent window to\n * dynamically track and forward any channel used by tools or parent scripts.\n */\n private patchParentBroadcastChannel(): void {\n if ((globalThis as any)._shadowClawParentBcPatched) {\n return;\n }\n (globalThis as any)._shadowClawParentBcPatched = true;\n\n const self = this;\n const NativeBc = globalThis.BroadcastChannel;\n this.originalBroadcastChannel = NativeBc;\n\n const WrappedBc = function (this: BroadcastChannel, channelName: string) {\n const instance = new NativeBc(channelName);\n self.registerChannel(channelName);\n return instance;\n } as any;\n\n WrappedBc.prototype = NativeBc.prototype;\n globalThis.BroadcastChannel = WrappedBc;\n }\n\n /**\n * Declaratively scan tool execution code definitions for BroadcastChannel names\n * and register them automatically.\n */\n public registerChannelsFromTools(\n tools: Array<{ execution?: { code?: string }; code?: string }>,\n ): void {\n if (!Array.isArray(tools)) return;\n\n const bcRegex = /new\\s+BroadcastChannel\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*\\)/g;\n for (const tool of tools) {\n const code = tool.execution?.code || tool.code || \"\";\n if (!code) continue;\n\n let match: RegExpExecArray | null;\n bcRegex.lastIndex = 0;\n while ((match = bcRegex.exec(code)) !== null) {\n if (match[1]) {\n this.registerChannel(match[1]);\n }\n }\n }\n }\n\n /**\n * Register a channel name to forward parent messages to the sandboxed iframe.\n */\n public registerChannel(channelName: string): void {\n if (\n typeof BroadcastChannel === \"undefined\" ||\n !channelName ||\n channelName.endsWith(\"-results\") ||\n this.commandChannels.has(channelName)\n ) {\n return;\n }\n this.listenOnCommandChannel(channelName);\n }\n\n private listenOnCommandChannel(channelName: string): void {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const bc = new NativeBc(channelName);\n bc.onmessage = (evt) => {\n const target = this.getTargetWindow();\n if (target) {\n target.postMessage(\n {\n type: \"shadow-claw-broadcast-command\",\n channel: channelName,\n payload: evt.data,\n },\n \"*\",\n );\n }\n };\n this.commandChannels.set(channelName, bc);\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to listen on channel ${channelName}:`,\n e,\n );\n }\n }\n\n /**\n * Handle incoming broadcast result/message from the sandboxed iframe and relay it\n * to the parent-origin BroadcastChannel.\n */\n public handleResultFromIframe(\n sourceWindow: WindowProxy,\n channelName: string,\n payload: unknown,\n ): boolean {\n const target = this.getTargetWindow();\n if (target && sourceWindow !== target) {\n return false;\n }\n\n if (channelName) {\n try {\n const NativeBc =\n this.originalBroadcastChannel || globalThis.BroadcastChannel;\n const resBc = new NativeBc(channelName);\n resBc.postMessage(payload);\n resBc.close();\n return true;\n } catch (e) {\n console.warn(\n `[IframeBroadcastProxy] Failed to relay result for channel ${channelName}:`,\n e,\n );\n }\n }\n return false;\n }\n\n public dispose(): void {\n for (const bc of this.commandChannels.values()) {\n try {\n bc.close();\n } catch (e) {}\n }\n this.commandChannels.clear();\n }\n}\n","/**\n * iframe-storage-proxy.ts\n *\n * Parent-side storage implementation for the iframe storage bridge.\n * Provides a namespaced IndexedDB key-value store that the parent frame\n * uses to proxy storage operations on behalf of sandboxed iframes that\n * lack direct storage access due to opaque-origin isolation.\n *\n * Each page gets its own namespace to prevent cross-page data leakage.\n */\n\nconst DB_NAME = \"shadow-claw-iframe-storage\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"kv\";\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDb(): Promise<IDBDatabase> {\n if (dbPromise) {\n return dbPromise;\n }\n\n dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n dbPromise = null;\n reject(request.error);\n };\n });\n\n return dbPromise;\n}\n\n/**\n * Build a composite key from a namespace and item key.\n */\nfunction compositeKey(namespace: string, key: string): string {\n return `${namespace}\\0${key}`;\n}\n\n/**\n * Set a value in the namespaced store.\n */\nexport async function iframeStorageSet(\n namespace: string,\n key: string,\n value: unknown,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).put(value, compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Get a single value from the namespaced store.\n */\nexport async function iframeStorageGet(\n namespace: string,\n key: string,\n): Promise<unknown> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const req = tx.objectStore(STORE_NAME).get(compositeKey(namespace, key));\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\n/**\n * Get all values for a namespace as a key-value object.\n */\nexport async function iframeStorageGetAll(\n namespace: string,\n): Promise<Record<string, unknown>> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const store = tx.objectStore(STORE_NAME);\n const result: Record<string, unknown> = {};\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve(result);\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n result[cursorKey.slice(prefix.length)] = cursor.value;\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n\n/**\n * Delete a single value from the namespaced store.\n */\nexport async function iframeStorageDelete(\n namespace: string,\n key: string,\n): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n tx.objectStore(STORE_NAME).delete(compositeKey(namespace, key));\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all values for a namespace.\n */\nexport async function iframeStorageClear(namespace: string): Promise<void> {\n const db = await openDb();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n const store = tx.objectStore(STORE_NAME);\n const prefix = `${namespace}\\0`;\n const cursorReq = store.openCursor();\n\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) {\n resolve();\n return;\n }\n const cursorKey =\n typeof cursor.key === \"string\" ? cursor.key : String(cursor.key);\n if (cursorKey.startsWith(prefix)) {\n cursor.delete();\n }\n cursor.continue();\n };\n\n cursorReq.onerror = () => reject(cursorReq.error);\n });\n}\n"],"mappings":"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"}
|
package/dist/lib/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import ShadowClawElement from "./components/shadow-claw-element.js";
|
|
2
2
|
import { IMAGE_MIME_TYPES, MIME_TYPES, getImageMimeType, getMimeType, guessMimeTypeFromFilename, inferAttachmentMimeType, isImagePath, isMimeType, mime } from "./utils/mime.js";
|
|
3
3
|
import { ulid } from "./utils/ulid.js";
|
|
4
|
-
import { a as formatTimestamp, c as toArrayBuffer, i as formatDateForFilename, n as computeSha256, o as handleSpecialLinkNavigation, r as escapeHtml, s as sanitizeHtml, t as bufferToHex } from "./utils-
|
|
4
|
+
import { a as formatTimestamp, c as toArrayBuffer, i as formatDateForFilename, n as computeSha256, o as handleSpecialLinkNavigation, r as escapeHtml, s as sanitizeHtml, t as bufferToHex } from "./utils-CzgKe_XZ.js";
|
|
5
5
|
import { isTruthyConfigValue, parseBooleanConfig } from "./utils/parseBooleanConfig.js";
|
|
6
6
|
import { asNumber, asStringArray, asUidArray, coerce, coerceArray, coerceNumber, coerceStringArray, coerceUidArray } from "./utils/coerce.js";
|
|
7
7
|
import { base64, base64ToBytes, bytesToBase64 } from "./utils/base64.js";
|
|
@@ -13,42 +13,42 @@ import { normalizeStringList } from "./utils/normalizeStringList.js";
|
|
|
13
13
|
import { a as showSuccess, i as showInfo, l as toastStore, o as showToast, r as showError, s as showWarning } from "./toast-DZ6r7_YI.js";
|
|
14
14
|
import { getNamespacedItem, getNamespacedStorageKey, removeNamespacedItem, setNamespacedItem } from "./utils/namespacedStorage.js";
|
|
15
15
|
import { applyJsonPatch } from "./utils/jsonPatch.js";
|
|
16
|
-
import { t as ShadowClaw } from "./shadow-claw-
|
|
17
|
-
import { t as ShadowClawChat } from "./shadow-claw-chat-
|
|
18
|
-
import { t as ShadowClawA2UI } from "./shadow-claw-a2ui-
|
|
16
|
+
import { t as ShadowClaw } from "./shadow-claw-CtCj5Rn_.js";
|
|
17
|
+
import { t as ShadowClawChat } from "./shadow-claw-chat-Dw32DPV2.js";
|
|
18
|
+
import { t as ShadowClawA2UI } from "./shadow-claw-a2ui-CvK5w940.js";
|
|
19
19
|
import { t as ShadowClawPageHeaderActionButton } from "./shadow-claw-page-header-action-button-BXXm5b5N.js";
|
|
20
20
|
import { ShadowClawA2UIInterceptor } from "./components/shadow-claw-a2ui-interceptor.js";
|
|
21
21
|
import { ShadowClawDialog } from "./components/shadow-claw-dialog.js";
|
|
22
|
-
import { t as ShadowClawPageHeader } from "./shadow-claw-page-header-
|
|
23
|
-
import { t as ShadowClawFiles } from "./shadow-claw-files-
|
|
22
|
+
import { t as ShadowClawPageHeader } from "./shadow-claw-page-header-DAYz3I_o.js";
|
|
23
|
+
import { t as ShadowClawFiles } from "./shadow-claw-files-xGGhsHNH.js";
|
|
24
24
|
import { t as ShadowClawEmptyState } from "./shadow-claw-empty-state-D9bnqWMF.js";
|
|
25
|
-
import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-
|
|
25
|
+
import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-CAsn9NxH.js";
|
|
26
26
|
import { t as ShadowClawPdfViewer } from "./shadow-claw-pdf-viewer-D3leDhRq.js";
|
|
27
|
-
import { t as ShadowClawTasks } from "./shadow-claw-tasks-
|
|
28
|
-
import { n as ShadowClawTerminal } from "./shadow-claw-terminal-
|
|
29
|
-
import { t as ShadowClawPages } from "./shadow-claw-pages-
|
|
30
|
-
import { t as ShadowClawSettings } from "./shadow-claw-settings-
|
|
31
|
-
import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-
|
|
32
|
-
import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-
|
|
33
|
-
import { t as ShadowClawChannels } from "./shadow-claw-channels-
|
|
27
|
+
import { t as ShadowClawTasks } from "./shadow-claw-tasks-Dc4BC-t-.js";
|
|
28
|
+
import { n as ShadowClawTerminal } from "./shadow-claw-terminal-BINcTdsk.js";
|
|
29
|
+
import { t as ShadowClawPages } from "./shadow-claw-pages-BLeEZb9k.js";
|
|
30
|
+
import { t as ShadowClawSettings } from "./shadow-claw-settings-B7o0Z4hu.js";
|
|
31
|
+
import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-BcFnbK74.js";
|
|
32
|
+
import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-Da2dN19M.js";
|
|
33
|
+
import { t as ShadowClawChannels } from "./shadow-claw-channels-BofYHgz8.js";
|
|
34
34
|
import { t as ShadowClawProviderModelPicker } from "./shadow-claw-provider-model-picker-CsA-507a.js";
|
|
35
35
|
import { t as ShadowClawProviderModuleSettings } from "./shadow-claw-provider-module-settings-3sCTnCSp.js";
|
|
36
|
-
import { t as ShadowClawConversations } from "./shadow-claw-conversations-
|
|
36
|
+
import { t as ShadowClawConversations } from "./shadow-claw-conversations-0UXge23k.js";
|
|
37
37
|
import { t as ShadowClawToast } from "./shadow-claw-toast-aRLHKnSl.js";
|
|
38
|
-
import { t as ShadowClawTools } from "./shadow-claw-tools-
|
|
38
|
+
import { t as ShadowClawTools } from "./shadow-claw-tools-BjFgXNLR.js";
|
|
39
39
|
import { t as ShadowClawActions } from "./shadow-claw-actions-G99P9oxr.js";
|
|
40
40
|
import { t as ShadowClawCard } from "./shadow-claw-card-D9azfSMu.js";
|
|
41
|
-
import { t as ShadowClawAccounts } from "./shadow-claw-accounts-
|
|
42
|
-
import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-
|
|
43
|
-
import { t as ShadowClawGit } from "./shadow-claw-git-
|
|
44
|
-
import { t as ShadowClawIntegrations } from "./shadow-claw-integrations-
|
|
45
|
-
import { t as ShadowClawLlm } from "./shadow-claw-llm-
|
|
46
|
-
import { t as ShadowClawMcpRemote } from "./shadow-claw-mcp-remote-
|
|
47
|
-
import { t as ShadowClawNetworking } from "./shadow-claw-networking-
|
|
48
|
-
import { t as ShadowClawNotifications } from "./shadow-claw-notifications-
|
|
49
|
-
import { t as ShadowClawStorage } from "./shadow-claw-storage-
|
|
50
|
-
import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-
|
|
51
|
-
import { t as ShadowClawWebvm } from "./shadow-claw-webvm-
|
|
41
|
+
import { t as ShadowClawAccounts } from "./shadow-claw-accounts-Br3XdHro.js";
|
|
42
|
+
import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-CwFotFDh.js";
|
|
43
|
+
import { t as ShadowClawGit } from "./shadow-claw-git-B606hcMU.js";
|
|
44
|
+
import { t as ShadowClawIntegrations } from "./shadow-claw-integrations-Bwq5cba1.js";
|
|
45
|
+
import { t as ShadowClawLlm } from "./shadow-claw-llm-BgpcMBIy.js";
|
|
46
|
+
import { t as ShadowClawMcpRemote } from "./shadow-claw-mcp-remote-DvQCA-Bk.js";
|
|
47
|
+
import { t as ShadowClawNetworking } from "./shadow-claw-networking-Cxvf9c7E.js";
|
|
48
|
+
import { t as ShadowClawNotifications } from "./shadow-claw-notifications-CGVcFYBy.js";
|
|
49
|
+
import { t as ShadowClawStorage } from "./shadow-claw-storage-afMVqB7E.js";
|
|
50
|
+
import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-B9-MQjl6.js";
|
|
51
|
+
import { t as ShadowClawWebvm } from "./shadow-claw-webvm-Xe3ByMDw.js";
|
|
52
52
|
import "./components/index.js";
|
|
53
53
|
import { parseStoredStringList } from "./utils/parseStoredStringList.js";
|
|
54
54
|
import { t as utils_exports } from "./utils/index.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as CONFIG_KEYS } from "./config-
|
|
1
|
+
import { r as CONFIG_KEYS } from "./config-DZkF9LiO.js";
|
|
2
2
|
import { t as getConfig } from "./getConfig-B7JdRqIY.js";
|
|
3
3
|
import { t as setConfig } from "./setConfig-CmvLryM3.js";
|
|
4
4
|
|
|
@@ -128,4 +128,4 @@ async function initChatSplitResize(shadow, shadowClaw, handle, db) {
|
|
|
128
128
|
|
|
129
129
|
//#endregion
|
|
130
130
|
export { initChatSplitResize };
|
|
131
|
-
//# sourceMappingURL=initChatSplitResize-
|
|
131
|
+
//# sourceMappingURL=initChatSplitResize-DiKTI-wk.js.map
|
package/dist/lib/{initChatSplitResize-DuNlwCuI.js.map → initChatSplitResize-DiKTI-wk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initChatSplitResize-DuNlwCuI.js","names":[],"sources":["../../src/components/shadow-claw/utils/clampChatSplitHeight.ts","../../src/components/shadow-claw/utils/persistChatSplitHeight.ts","../../src/components/shadow-claw/utils/setChatSplitHeight.ts","../../src/components/shadow-claw/utils/initChatSplitResize.ts"],"sourcesContent":["import { MIN_CHAT_SPLIT_HEIGHT_PX } from \"../constants.js\";\n\nexport function clampChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): number {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, px);\n }\n\n const containerHeight =\n mainContent.getBoundingClientRect().height || window.innerHeight || 600;\n const maxByContainer = Math.max(\n MIN_CHAT_SPLIT_HEIGHT_PX,\n containerHeight - 100,\n );\n\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, Math.min(maxByContainer, px));\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nexport async function persistChatSplitHeight(\n db: ShadowClawDatabase,\n px: number,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n try {\n await setConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT, px);\n } catch {\n // Ignore persistence failures so resize remains usable in degraded test/runtime states.\n }\n}\n","import { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\n\nexport function setChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): void {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return;\n }\n\n const clamped = clampChatSplitHeight(shadow, px);\n mainContent.style.setProperty(\"--chat-split-height\", `${clamped}px`);\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\n\nimport {\n DEFAULT_CHAT_SPLIT_HEIGHT_PX,\n MIN_CHAT_SPLIT_HEIGHT_PX,\n} from \"../constants.js\";\n\nimport { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\nimport { persistChatSplitHeight } from \"./persistChatSplitHeight.js\";\nimport { setChatSplitHeight } from \"./setChatSplitHeight.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\ninterface ChatSplitResizeHost {\n addCleanup: (fn: () => void) => void;\n}\n\nexport async function initChatSplitResize(\n shadow: ShadowRoot | null,\n shadowClaw: ChatSplitResizeHost,\n handle: HTMLElement,\n db: ShadowClawDatabase | undefined,\n): Promise<void> {\n if (!shadow || !handle) {\n return;\n }\n\n handle.setAttribute(\"tabindex\", \"0\");\n handle.setAttribute(\"role\", \"separator\");\n handle.setAttribute(\"aria-orientation\", \"horizontal\");\n handle.setAttribute(\"aria-label\", \"Resize chat panel height\");\n\n const getCurrentHeight = () => {\n const mainContent = shadow.querySelector(\".main-content\");\n if (!(mainContent instanceof HTMLElement)) {\n return DEFAULT_CHAT_SPLIT_HEIGHT_PX;\n }\n\n const stored = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(stored) && stored > 0) {\n return stored;\n }\n\n const chatPage = shadow.querySelector(\".chat-page\");\n return (\n (chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height) ||\n DEFAULT_CHAT_SPLIT_HEIGHT_PX\n );\n };\n\n const updateAria = () => {\n const current = Math.round(\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n const max = Math.round(\n clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER),\n );\n handle.setAttribute(\"aria-valuemin\", String(MIN_CHAT_SPLIT_HEIGHT_PX));\n handle.setAttribute(\"aria-valuemax\", String(max));\n handle.setAttribute(\"aria-valuenow\", String(current));\n };\n\n try {\n const saved = db\n ? await getConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT)\n : undefined;\n\n if (typeof saved === \"number\" && Number.isFinite(saved) && saved > 0) {\n setChatSplitHeight(shadow, saved);\n } else if (typeof saved === \"string\" && !isNaN(parseFloat(saved))) {\n setChatSplitHeight(shadow, parseFloat(saved));\n } else {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n } catch {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n let activePointerId: number | null = null;\n let startY = 0;\n let startHeight = 0;\n\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n // Dragging handle UP (delta > 0) increases height of bottom chat panel\n const delta = startY - event.clientY;\n const nextHeight = startHeight + delta;\n setChatSplitHeight(shadow, nextHeight);\n updateAria();\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n document.removeEventListener(\"pointermove\", onPointerMove);\n\n const mainContent = shadow.querySelector(\".main-content\");\n if (mainContent instanceof HTMLElement) {\n const value = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(value) && value > 0 && db) {\n void persistChatSplitHeight(db, value);\n }\n }\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (event: PointerEvent) => {\n if (\n event.pointerType === \"mouse\" &&\n event.button !== 0 &&\n event.button !== -1\n ) {\n return;\n }\n\n if (window.innerWidth < 896) {\n return;\n }\n\n event.preventDefault();\n activePointerId = event.pointerId;\n startY = event.clientY;\n const chatPage = shadow.querySelector(\".chat-page\");\n startHeight =\n chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height > 0\n ? chatPage.getBoundingClientRect().height\n : getCurrentHeight();\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(event.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp);\n handle.addEventListener(\"pointercancel\", stopResize);\n handle.addEventListener(\"dblclick\", () => {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n if (db) {\n void persistChatSplitHeight(db, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n updateAria();\n });\n\n handle.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n if (window.innerWidth < 896) {\n return;\n }\n\n const step = event.shiftKey ? 32 : 12;\n const current = getCurrentHeight();\n let next: number | null = null;\n\n if (event.key === \"ArrowUp\") {\n next = current + step;\n } else if (event.key === \"ArrowDown\") {\n next = current - step;\n } else if (event.key === \"Home\") {\n next = MIN_CHAT_SPLIT_HEIGHT_PX;\n } else if (event.key === \"End\") {\n next = clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER);\n }\n\n if (next === null) {\n return;\n }\n\n event.preventDefault();\n setChatSplitHeight(shadow, next);\n updateAria();\n if (db) {\n void persistChatSplitHeight(\n db,\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n }\n });\n\n updateAria();\n\n shadowClaw.addCleanup(() => {\n stopResize();\n handle.removeEventListener(\"pointerup\", onPointerUp);\n handle.removeEventListener(\"pointercancel\", stopResize);\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"initChatSplitResize-DiKTI-wk.js","names":[],"sources":["../../src/components/shadow-claw/utils/clampChatSplitHeight.ts","../../src/components/shadow-claw/utils/persistChatSplitHeight.ts","../../src/components/shadow-claw/utils/setChatSplitHeight.ts","../../src/components/shadow-claw/utils/initChatSplitResize.ts"],"sourcesContent":["import { MIN_CHAT_SPLIT_HEIGHT_PX } from \"../constants.js\";\n\nexport function clampChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): number {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, px);\n }\n\n const containerHeight =\n mainContent.getBoundingClientRect().height || window.innerHeight || 600;\n const maxByContainer = Math.max(\n MIN_CHAT_SPLIT_HEIGHT_PX,\n containerHeight - 100,\n );\n\n return Math.max(MIN_CHAT_SPLIT_HEIGHT_PX, Math.min(maxByContainer, px));\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nexport async function persistChatSplitHeight(\n db: ShadowClawDatabase,\n px: number,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n try {\n await setConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT, px);\n } catch {\n // Ignore persistence failures so resize remains usable in degraded test/runtime states.\n }\n}\n","import { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\n\nexport function setChatSplitHeight(\n shadow: ShadowRoot | null,\n px: number,\n): void {\n const mainContent = shadow?.querySelector(\".main-content\");\n\n if (!(mainContent instanceof HTMLElement)) {\n return;\n }\n\n const clamped = clampChatSplitHeight(shadow, px);\n mainContent.style.setProperty(\"--chat-split-height\", `${clamped}px`);\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\n\nimport {\n DEFAULT_CHAT_SPLIT_HEIGHT_PX,\n MIN_CHAT_SPLIT_HEIGHT_PX,\n} from \"../constants.js\";\n\nimport { clampChatSplitHeight } from \"./clampChatSplitHeight.js\";\nimport { persistChatSplitHeight } from \"./persistChatSplitHeight.js\";\nimport { setChatSplitHeight } from \"./setChatSplitHeight.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\ninterface ChatSplitResizeHost {\n addCleanup: (fn: () => void) => void;\n}\n\nexport async function initChatSplitResize(\n shadow: ShadowRoot | null,\n shadowClaw: ChatSplitResizeHost,\n handle: HTMLElement,\n db: ShadowClawDatabase | undefined,\n): Promise<void> {\n if (!shadow || !handle) {\n return;\n }\n\n handle.setAttribute(\"tabindex\", \"0\");\n handle.setAttribute(\"role\", \"separator\");\n handle.setAttribute(\"aria-orientation\", \"horizontal\");\n handle.setAttribute(\"aria-label\", \"Resize chat panel height\");\n\n const getCurrentHeight = () => {\n const mainContent = shadow.querySelector(\".main-content\");\n if (!(mainContent instanceof HTMLElement)) {\n return DEFAULT_CHAT_SPLIT_HEIGHT_PX;\n }\n\n const stored = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(stored) && stored > 0) {\n return stored;\n }\n\n const chatPage = shadow.querySelector(\".chat-page\");\n return (\n (chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height) ||\n DEFAULT_CHAT_SPLIT_HEIGHT_PX\n );\n };\n\n const updateAria = () => {\n const current = Math.round(\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n const max = Math.round(\n clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER),\n );\n handle.setAttribute(\"aria-valuemin\", String(MIN_CHAT_SPLIT_HEIGHT_PX));\n handle.setAttribute(\"aria-valuemax\", String(max));\n handle.setAttribute(\"aria-valuenow\", String(current));\n };\n\n try {\n const saved = db\n ? await getConfig(db, CONFIG_KEYS.CHAT_SPLIT_VIEW_HEIGHT)\n : undefined;\n\n if (typeof saved === \"number\" && Number.isFinite(saved) && saved > 0) {\n setChatSplitHeight(shadow, saved);\n } else if (typeof saved === \"string\" && !isNaN(parseFloat(saved))) {\n setChatSplitHeight(shadow, parseFloat(saved));\n } else {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n } catch {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n let activePointerId: number | null = null;\n let startY = 0;\n let startHeight = 0;\n\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n // Dragging handle UP (delta > 0) increases height of bottom chat panel\n const delta = startY - event.clientY;\n const nextHeight = startHeight + delta;\n setChatSplitHeight(shadow, nextHeight);\n updateAria();\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n document.removeEventListener(\"pointermove\", onPointerMove);\n\n const mainContent = shadow.querySelector(\".main-content\");\n if (mainContent instanceof HTMLElement) {\n const value = parseFloat(\n mainContent.style.getPropertyValue(\"--chat-split-height\"),\n );\n if (Number.isFinite(value) && value > 0 && db) {\n void persistChatSplitHeight(db, value);\n }\n }\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (event: PointerEvent) => {\n if (\n event.pointerType === \"mouse\" &&\n event.button !== 0 &&\n event.button !== -1\n ) {\n return;\n }\n\n if (window.innerWidth < 896) {\n return;\n }\n\n event.preventDefault();\n activePointerId = event.pointerId;\n startY = event.clientY;\n const chatPage = shadow.querySelector(\".chat-page\");\n startHeight =\n chatPage instanceof HTMLElement &&\n chatPage.getBoundingClientRect().height > 0\n ? chatPage.getBoundingClientRect().height\n : getCurrentHeight();\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(event.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp);\n handle.addEventListener(\"pointercancel\", stopResize);\n handle.addEventListener(\"dblclick\", () => {\n setChatSplitHeight(shadow, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n if (db) {\n void persistChatSplitHeight(db, DEFAULT_CHAT_SPLIT_HEIGHT_PX);\n }\n\n updateAria();\n });\n\n handle.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n if (window.innerWidth < 896) {\n return;\n }\n\n const step = event.shiftKey ? 32 : 12;\n const current = getCurrentHeight();\n let next: number | null = null;\n\n if (event.key === \"ArrowUp\") {\n next = current + step;\n } else if (event.key === \"ArrowDown\") {\n next = current - step;\n } else if (event.key === \"Home\") {\n next = MIN_CHAT_SPLIT_HEIGHT_PX;\n } else if (event.key === \"End\") {\n next = clampChatSplitHeight(shadow, Number.MAX_SAFE_INTEGER);\n }\n\n if (next === null) {\n return;\n }\n\n event.preventDefault();\n setChatSplitHeight(shadow, next);\n updateAria();\n if (db) {\n void persistChatSplitHeight(\n db,\n clampChatSplitHeight(shadow, getCurrentHeight()),\n );\n }\n });\n\n updateAria();\n\n shadowClaw.addCleanup(() => {\n stopResize();\n handle.removeEventListener(\"pointerup\", onPointerUp);\n handle.removeEventListener(\"pointercancel\", stopResize);\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { i as __toESM } from "./rolldown-runtime-DZ8SGSJo.js";
|
|
2
2
|
import { r as getDb } from "./txPromise-DdeRXi7G.js";
|
|
3
|
-
import { r as CONFIG_KEYS } from "./config-
|
|
4
|
-
import { a as getDeploymentNamespace } from "./app-routes-
|
|
3
|
+
import { r as CONFIG_KEYS } from "./config-DZkF9LiO.js";
|
|
4
|
+
import { a as getDeploymentNamespace } from "./app-routes-CKkiX12g.js";
|
|
5
5
|
import { ulid } from "./utils/ulid.js";
|
|
6
6
|
import { t as require_browser } from "./browser-FvTfy_Ym.js";
|
|
7
7
|
import { t as getAllTasks } from "./getAllTasks-DEko4xIn.js";
|
|
@@ -430,7 +430,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
430
430
|
switch (action) {
|
|
431
431
|
case "send-message": {
|
|
432
432
|
if (!args.text) throw new Error("Missing text parameter");
|
|
433
|
-
const { orchestratorStore } = await import("./orchestrator-
|
|
433
|
+
const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
|
|
434
434
|
const orch = options.orchestrator || orchestratorStore.orchestrator;
|
|
435
435
|
const targetGroupId = args.groupId || orchestratorStore.activeGroupId || "br:main";
|
|
436
436
|
if (orch?.browserChat?.submit) {
|
|
@@ -465,7 +465,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
465
465
|
return { tasks };
|
|
466
466
|
}
|
|
467
467
|
case "read-state": {
|
|
468
|
-
const { orchestratorStore } = await import("./orchestrator-
|
|
468
|
+
const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
|
|
469
469
|
const orch = options.orchestrator || orchestratorStore.orchestrator;
|
|
470
470
|
return {
|
|
471
471
|
clientId,
|
|
@@ -478,7 +478,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
478
478
|
}
|
|
479
479
|
case "list-tools": {
|
|
480
480
|
try {
|
|
481
|
-
const { getWebMcpTools } = await import("./webmcp-
|
|
481
|
+
const { getWebMcpTools } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
|
|
482
482
|
const webMcpTools = await getWebMcpTools();
|
|
483
483
|
if (webMcpTools && webMcpTools.length > 0) return { tools: webMcpTools.map((t) => ({
|
|
484
484
|
name: t.name,
|
|
@@ -488,13 +488,13 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
488
488
|
})) };
|
|
489
489
|
} catch (_) {}
|
|
490
490
|
try {
|
|
491
|
-
const { orchestratorStore } = await import("./orchestrator-
|
|
491
|
+
const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
|
|
492
492
|
const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
|
|
493
493
|
const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
|
|
494
494
|
const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
|
|
495
495
|
if (group?.toolTags && group.toolTags.length > 0) {
|
|
496
496
|
const { TOOL_DEFINITIONS } = await import("./tools-BQpz4Hkp.js").then((n) => n.n);
|
|
497
|
-
const { parseWebMcpInputSchema } = await import("./webmcp-
|
|
497
|
+
const { parseWebMcpInputSchema } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
|
|
498
498
|
return { tools: TOOL_DEFINITIONS.filter((t) => group.toolTags.includes(t.name)).map((t) => ({
|
|
499
499
|
name: t.name,
|
|
500
500
|
description: t.description,
|
|
@@ -503,7 +503,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
503
503
|
}
|
|
504
504
|
} catch (_) {}
|
|
505
505
|
const { TOOL_DEFINITIONS } = await import("./tools-BQpz4Hkp.js").then((n) => n.n);
|
|
506
|
-
const { parseWebMcpInputSchema } = await import("./webmcp-
|
|
506
|
+
const { parseWebMcpInputSchema } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
|
|
507
507
|
return { tools: TOOL_DEFINITIONS.map((t) => ({
|
|
508
508
|
name: t.name,
|
|
509
509
|
description: t.description,
|
|
@@ -513,8 +513,8 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
513
513
|
case "invoke-tool": {
|
|
514
514
|
if (!args.toolName) throw new Error("Missing toolName parameter");
|
|
515
515
|
try {
|
|
516
|
-
const { orchestratorStore } = await import("./orchestrator-
|
|
517
|
-
const { toolsStore } = await import("./tools-
|
|
516
|
+
const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
|
|
517
|
+
const { toolsStore } = await import("./tools-Cmhpk3X8.js").then((n) => n.n);
|
|
518
518
|
const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
|
|
519
519
|
const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
|
|
520
520
|
const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
|
|
@@ -541,7 +541,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
541
541
|
} catch (err) {
|
|
542
542
|
if (err.message && err.message.includes("is not enabled")) throw err;
|
|
543
543
|
}
|
|
544
|
-
const { executeWebMcpTool } = await import("./webmcp-
|
|
544
|
+
const { executeWebMcpTool } = await import("./webmcp-oEP9YpR2.js").then((n) => n.s);
|
|
545
545
|
if (typeof ctx.executeTool === "function") {
|
|
546
546
|
if (matchedTool) try {
|
|
547
547
|
return { result: await executeWebMcpTool(ctx, matchedTool, args.input) };
|
|
@@ -567,7 +567,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
567
567
|
return { result: await ctx.invoke(args.toolName, typeof args.input === "string" ? JSON.parse(args.input) : args.input || {}) };
|
|
568
568
|
} catch (_) {}
|
|
569
569
|
}
|
|
570
|
-
const { orchestratorStore } = await import("./orchestrator-
|
|
570
|
+
const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
|
|
571
571
|
const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
|
|
572
572
|
const worker = orch?.agentWorker;
|
|
573
573
|
if (worker && typeof worker.postMessage === "function") {
|
|
@@ -603,10 +603,10 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
|
|
|
603
603
|
throw new Error(`Tool ${args.toolName} could not be executed (no context or worker available)`);
|
|
604
604
|
}
|
|
605
605
|
case "trigger-backup": {
|
|
606
|
-
const { orchestratorStore } = await import("./orchestrator-
|
|
606
|
+
const { orchestratorStore } = await import("./orchestrator-DKHCoikY.js").then((n) => n.n);
|
|
607
607
|
const targetGroupId = args.groupId || options.orchestrator?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
|
|
608
608
|
const db = await getDb();
|
|
609
|
-
const { getGroupDir } = await import("./getGroupDir-
|
|
609
|
+
const { getGroupDir } = await import("./getGroupDir-MHv7Lvmp.js").then((n) => n.n);
|
|
610
610
|
const groupDir = await getGroupDir(db, targetGroupId);
|
|
611
611
|
async function collectFiles(dir, prefix = "") {
|
|
612
612
|
const result = [];
|
|
@@ -724,4 +724,4 @@ async function ensureControlPlaneConnected(options = {}) {
|
|
|
724
724
|
|
|
725
725
|
//#endregion
|
|
726
726
|
export { detectDeviceLabel, ensureControlPlaneConnected, executeClientControlCommand, getOrCreateControlPlaneClientId, isControlPlaneEnabled, shouldConnectControlPlane, stopControlPlaneClient };
|
|
727
|
-
//# sourceMappingURL=initControlPlane-
|
|
727
|
+
//# sourceMappingURL=initControlPlane-CzjtQ4aM.js.map
|